1*fe5ee802SMichael J. Spencer //===- ObjectFile.cpp - File format independent object file -----*- C++ -*-===// 2*fe5ee802SMichael J. Spencer // 3*fe5ee802SMichael J. Spencer // The LLVM Compiler Infrastructure 4*fe5ee802SMichael J. Spencer // 5*fe5ee802SMichael J. Spencer // This file is distributed under the University of Illinois Open Source 6*fe5ee802SMichael J. Spencer // License. See LICENSE.TXT for details. 7*fe5ee802SMichael J. Spencer // 8*fe5ee802SMichael J. Spencer //===----------------------------------------------------------------------===// 9*fe5ee802SMichael J. Spencer // 10*fe5ee802SMichael J. Spencer // This file defines a file format independent ObjectFile class. 11*fe5ee802SMichael J. Spencer // 12*fe5ee802SMichael J. Spencer //===----------------------------------------------------------------------===// 13*fe5ee802SMichael J. Spencer 14*fe5ee802SMichael J. Spencer #include "llvm/Object/ObjectFile.h" 15*fe5ee802SMichael J. Spencer #include "llvm/Support/ErrorHandling.h" 16*fe5ee802SMichael J. Spencer #include "llvm/Support/MemoryBuffer.h" 17*fe5ee802SMichael J. Spencer 18*fe5ee802SMichael J. Spencer namespace llvm { 19*fe5ee802SMichael J. Spencer namespace object { 20*fe5ee802SMichael J. Spencer 21*fe5ee802SMichael J. Spencer ObjectFile::ObjectFile(MemoryBuffer *Object) 22*fe5ee802SMichael J. Spencer : MapFile(Object) { 23*fe5ee802SMichael J. Spencer assert(MapFile && "Must be a valid MemoryBuffer!"); 24*fe5ee802SMichael J. Spencer base = reinterpret_cast<const uint8_t *>(MapFile->getBufferStart()); 25*fe5ee802SMichael J. Spencer } 26*fe5ee802SMichael J. Spencer 27*fe5ee802SMichael J. Spencer ObjectFile::~ObjectFile() { 28*fe5ee802SMichael J. Spencer delete MapFile; 29*fe5ee802SMichael J. Spencer } 30*fe5ee802SMichael J. Spencer 31*fe5ee802SMichael J. Spencer StringRef ObjectFile::getFilename() const { 32*fe5ee802SMichael J. Spencer return MapFile->getBufferIdentifier(); 33*fe5ee802SMichael J. Spencer } 34*fe5ee802SMichael J. Spencer 35*fe5ee802SMichael J. Spencer ObjectFile *ObjectFile::createObjectFile(MemoryBuffer *Object) { 36*fe5ee802SMichael J. Spencer if (!Object || Object->getBufferSize() < 64) 37*fe5ee802SMichael J. Spencer return 0; 38*fe5ee802SMichael J. Spencer sys::LLVMFileType type = sys::IdentifyFileType(Object->getBufferStart(), 39*fe5ee802SMichael J. Spencer static_cast<unsigned>(Object->getBufferSize())); 40*fe5ee802SMichael J. Spencer switch (type) { 41*fe5ee802SMichael J. Spencer case sys::ELF_Relocatable_FileType: 42*fe5ee802SMichael J. Spencer case sys::ELF_Executable_FileType: 43*fe5ee802SMichael J. Spencer case sys::ELF_SharedObject_FileType: 44*fe5ee802SMichael J. Spencer case sys::ELF_Core_FileType: 45*fe5ee802SMichael J. Spencer return 0; 46*fe5ee802SMichael J. Spencer case sys::Mach_O_Object_FileType: 47*fe5ee802SMichael J. Spencer case sys::Mach_O_Executable_FileType: 48*fe5ee802SMichael J. Spencer case sys::Mach_O_FixedVirtualMemorySharedLib_FileType: 49*fe5ee802SMichael J. Spencer case sys::Mach_O_Core_FileType: 50*fe5ee802SMichael J. Spencer case sys::Mach_O_PreloadExectuable_FileType: 51*fe5ee802SMichael J. Spencer case sys::Mach_O_DynamicallyLinkedSharedLib_FileType: 52*fe5ee802SMichael J. Spencer case sys::Mach_O_DynamicLinker_FileType: 53*fe5ee802SMichael J. Spencer case sys::Mach_O_Bundle_FileType: 54*fe5ee802SMichael J. Spencer case sys::Mach_O_DynamicallyLinkedSharedLibStub_FileType: 55*fe5ee802SMichael J. Spencer return 0; 56*fe5ee802SMichael J. Spencer case sys::COFF_FileType: 57*fe5ee802SMichael J. Spencer return 0; 58*fe5ee802SMichael J. Spencer default: 59*fe5ee802SMichael J. Spencer llvm_unreachable("Unknown Object File Type"); 60*fe5ee802SMichael J. Spencer } 61*fe5ee802SMichael J. Spencer } 62*fe5ee802SMichael J. Spencer 63*fe5ee802SMichael J. Spencer ObjectFile *ObjectFile::createObjectFile(const sys::Path &ObjectPath) { 64*fe5ee802SMichael J. Spencer return createObjectFile(MemoryBuffer::getFile(ObjectPath.c_str())); 65*fe5ee802SMichael J. Spencer } 66*fe5ee802SMichael J. Spencer 67*fe5ee802SMichael J. Spencer } // end namespace object 68*fe5ee802SMichael J. Spencer } // end namespace llvm 69