Binary.cpp revision f12745f7a7e68c05c89ebd515b9b4faedce37dd0
1//===- Binary.cpp - A generic binary file -----------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file defines the Binary class. 11// 12//===----------------------------------------------------------------------===// 13 14#include "llvm/Object/Binary.h" 15#include "llvm/ADT/StringRef.h" 16#include "llvm/Support/MemoryBuffer.h" 17#include "llvm/Support/Path.h" 18 19// Include headers for createBinary. 20#include "llvm/Object/Archive.h" 21#include "llvm/Object/COFF.h" 22#include "llvm/Object/ObjectFile.h" 23 24using namespace llvm; 25using namespace object; 26 27Binary::~Binary() { 28 delete Data; 29} 30 31Binary::Binary(unsigned int Type, MemoryBuffer *Source) 32 : TypeID(Type) 33 , Data(Source) {} 34 35StringRef Binary::getData() const { 36 return Data->getBuffer(); 37} 38 39StringRef Binary::getFileName() const { 40 return Data->getBufferIdentifier(); 41} 42 43error_code object::createBinary(MemoryBuffer *Source, 44 OwningPtr<Binary> &Result) { 45 OwningPtr<MemoryBuffer> scopedSource(Source); 46 if (!Source) 47 return make_error_code(errc::invalid_argument); 48 sys::LLVMFileType type = sys::identifyFileType(Source->getBuffer()); 49 error_code ec; 50 switch (type) { 51 case sys::Archive_FileType: { 52 OwningPtr<Binary> ret(new Archive(scopedSource.take(), ec)); 53 if (ec) return ec; 54 Result.swap(ret); 55 return object_error::success; 56 } 57 case sys::ELF_Relocatable_FileType: 58 case sys::ELF_Executable_FileType: 59 case sys::ELF_SharedObject_FileType: 60 case sys::ELF_Core_FileType: { 61 OwningPtr<Binary> ret( 62 ObjectFile::createELFObjectFile(scopedSource.take())); 63 if (!ret) 64 return object_error::invalid_file_type; 65 Result.swap(ret); 66 return object_error::success; 67 } 68 case sys::Mach_O_Object_FileType: 69 case sys::Mach_O_Executable_FileType: 70 case sys::Mach_O_FixedVirtualMemorySharedLib_FileType: 71 case sys::Mach_O_Core_FileType: 72 case sys::Mach_O_PreloadExecutable_FileType: 73 case sys::Mach_O_DynamicallyLinkedSharedLib_FileType: 74 case sys::Mach_O_DynamicLinker_FileType: 75 case sys::Mach_O_Bundle_FileType: 76 case sys::Mach_O_DynamicallyLinkedSharedLibStub_FileType: { 77 OwningPtr<Binary> ret( 78 ObjectFile::createMachOObjectFile(scopedSource.take())); 79 if (!ret) 80 return object_error::invalid_file_type; 81 Result.swap(ret); 82 return object_error::success; 83 } 84 case sys::COFF_FileType: { 85 OwningPtr<Binary> ret(new COFFObjectFile(scopedSource.take(), ec)); 86 if (ec) return ec; 87 Result.swap(ret); 88 return object_error::success; 89 } 90 default: // Unrecognized object file format. 91 return object_error::invalid_file_type; 92 } 93} 94 95error_code object::createBinary(StringRef Path, OwningPtr<Binary> &Result) { 96 OwningPtr<MemoryBuffer> File; 97 if (error_code ec = MemoryBuffer::getFileOrSTDIN(Path, File)) 98 return ec; 99 return createBinary(File.take(), Result); 100} 101