12754fe60SDimitry Andric //===- ObjectFile.cpp - File format independent object file -----*- C++ -*-===// 22754fe60SDimitry Andric // 32754fe60SDimitry Andric // The LLVM Compiler Infrastructure 42754fe60SDimitry Andric // 52754fe60SDimitry Andric // This file is distributed under the University of Illinois Open Source 62754fe60SDimitry Andric // License. See LICENSE.TXT for details. 72754fe60SDimitry Andric // 82754fe60SDimitry Andric //===----------------------------------------------------------------------===// 92754fe60SDimitry Andric // 102754fe60SDimitry Andric // This file defines a file format independent ObjectFile class. 112754fe60SDimitry Andric // 122754fe60SDimitry Andric //===----------------------------------------------------------------------===// 132754fe60SDimitry Andric 142754fe60SDimitry Andric #include "llvm/Object/ObjectFile.h" 152754fe60SDimitry Andric #include "llvm/ADT/OwningPtr.h" 162754fe60SDimitry Andric #include "llvm/Support/ErrorHandling.h" 172754fe60SDimitry Andric #include "llvm/Support/MemoryBuffer.h" 182754fe60SDimitry Andric #include "llvm/Support/Path.h" 192754fe60SDimitry Andric #include "llvm/Support/system_error.h" 202754fe60SDimitry Andric 212754fe60SDimitry Andric using namespace llvm; 222754fe60SDimitry Andric using namespace object; 232754fe60SDimitry Andric 242754fe60SDimitry Andric ObjectFile::ObjectFile(MemoryBuffer *Object) 252754fe60SDimitry Andric : MapFile(Object) { 262754fe60SDimitry Andric assert(MapFile && "Must be a valid MemoryBuffer!"); 272754fe60SDimitry Andric base = reinterpret_cast<const uint8_t *>(MapFile->getBufferStart()); 282754fe60SDimitry Andric } 292754fe60SDimitry Andric 302754fe60SDimitry Andric ObjectFile::~ObjectFile() { 312754fe60SDimitry Andric delete MapFile; 322754fe60SDimitry Andric } 332754fe60SDimitry Andric 342754fe60SDimitry Andric StringRef ObjectFile::getFilename() const { 352754fe60SDimitry Andric return MapFile->getBufferIdentifier(); 362754fe60SDimitry Andric } 372754fe60SDimitry Andric 382754fe60SDimitry Andric ObjectFile *ObjectFile::createObjectFile(MemoryBuffer *Object) { 392754fe60SDimitry Andric if (!Object || Object->getBufferSize() < 64) 402754fe60SDimitry Andric return 0; 412754fe60SDimitry Andric sys::LLVMFileType type = sys::IdentifyFileType(Object->getBufferStart(), 422754fe60SDimitry Andric static_cast<unsigned>(Object->getBufferSize())); 432754fe60SDimitry Andric switch (type) { 442754fe60SDimitry Andric case sys::ELF_Relocatable_FileType: 452754fe60SDimitry Andric case sys::ELF_Executable_FileType: 462754fe60SDimitry Andric case sys::ELF_SharedObject_FileType: 472754fe60SDimitry Andric case sys::ELF_Core_FileType: 482754fe60SDimitry Andric return createELFObjectFile(Object); 492754fe60SDimitry Andric case sys::Mach_O_Object_FileType: 502754fe60SDimitry Andric case sys::Mach_O_Executable_FileType: 512754fe60SDimitry Andric case sys::Mach_O_FixedVirtualMemorySharedLib_FileType: 522754fe60SDimitry Andric case sys::Mach_O_Core_FileType: 532754fe60SDimitry Andric case sys::Mach_O_PreloadExecutable_FileType: 542754fe60SDimitry Andric case sys::Mach_O_DynamicallyLinkedSharedLib_FileType: 552754fe60SDimitry Andric case sys::Mach_O_DynamicLinker_FileType: 562754fe60SDimitry Andric case sys::Mach_O_Bundle_FileType: 572754fe60SDimitry Andric case sys::Mach_O_DynamicallyLinkedSharedLibStub_FileType: 583b0f4066SDimitry Andric return createMachOObjectFile(Object); 592754fe60SDimitry Andric case sys::COFF_FileType: 602754fe60SDimitry Andric return createCOFFObjectFile(Object); 612754fe60SDimitry Andric default: 622754fe60SDimitry Andric llvm_unreachable("Unknown Object File Type"); 632754fe60SDimitry Andric } 642754fe60SDimitry Andric } 652754fe60SDimitry Andric 662754fe60SDimitry Andric ObjectFile *ObjectFile::createObjectFile(StringRef ObjectPath) { 672754fe60SDimitry Andric OwningPtr<MemoryBuffer> File; 682754fe60SDimitry Andric if (error_code ec = MemoryBuffer::getFile(ObjectPath, File)) 692754fe60SDimitry Andric return NULL; 702754fe60SDimitry Andric return createObjectFile(File.take()); 712754fe60SDimitry Andric } 72