ObjectFile.cpp revision 251662
1218885Sdim//===- ObjectFile.cpp - File format independent object file -----*- C++ -*-===// 2218885Sdim// 3218885Sdim// The LLVM Compiler Infrastructure 4218885Sdim// 5218885Sdim// This file is distributed under the University of Illinois Open Source 6218885Sdim// License. See LICENSE.TXT for details. 7218885Sdim// 8218885Sdim//===----------------------------------------------------------------------===// 9218885Sdim// 10218885Sdim// This file defines a file format independent ObjectFile class. 11218885Sdim// 12218885Sdim//===----------------------------------------------------------------------===// 13218885Sdim 14218885Sdim#include "llvm/Object/ObjectFile.h" 15218885Sdim#include "llvm/ADT/OwningPtr.h" 16218885Sdim#include "llvm/Support/ErrorHandling.h" 17218885Sdim#include "llvm/Support/MemoryBuffer.h" 18218885Sdim#include "llvm/Support/Path.h" 19218885Sdim#include "llvm/Support/system_error.h" 20218885Sdim 21218885Sdimusing namespace llvm; 22218885Sdimusing namespace object; 23218885Sdim 24234353Sdimvoid ObjectFile::anchor() { } 25234353Sdim 26251662SdimObjectFile::ObjectFile(unsigned int Type, MemoryBuffer *source) 27224145Sdim : Binary(Type, source) { 28218885Sdim} 29218885Sdim 30251662Sdimerror_code ObjectFile::getSymbolAlignment(DataRefImpl DRI, 31251662Sdim uint32_t &Result) const { 32251662Sdim Result = 0; 33251662Sdim return object_error::success; 34251662Sdim} 35251662Sdim 36218885SdimObjectFile *ObjectFile::createObjectFile(MemoryBuffer *Object) { 37218885Sdim if (!Object || Object->getBufferSize() < 64) 38218885Sdim return 0; 39218885Sdim sys::LLVMFileType type = sys::IdentifyFileType(Object->getBufferStart(), 40218885Sdim static_cast<unsigned>(Object->getBufferSize())); 41218885Sdim switch (type) { 42249423Sdim case sys::Unknown_FileType: 43249423Sdim return 0; 44218885Sdim case sys::ELF_Relocatable_FileType: 45218885Sdim case sys::ELF_Executable_FileType: 46218885Sdim case sys::ELF_SharedObject_FileType: 47218885Sdim case sys::ELF_Core_FileType: 48218885Sdim return createELFObjectFile(Object); 49218885Sdim case sys::Mach_O_Object_FileType: 50218885Sdim case sys::Mach_O_Executable_FileType: 51218885Sdim case sys::Mach_O_FixedVirtualMemorySharedLib_FileType: 52218885Sdim case sys::Mach_O_Core_FileType: 53218885Sdim case sys::Mach_O_PreloadExecutable_FileType: 54218885Sdim case sys::Mach_O_DynamicallyLinkedSharedLib_FileType: 55218885Sdim case sys::Mach_O_DynamicLinker_FileType: 56218885Sdim case sys::Mach_O_Bundle_FileType: 57218885Sdim case sys::Mach_O_DynamicallyLinkedSharedLibStub_FileType: 58226633Sdim case sys::Mach_O_DSYMCompanion_FileType: 59221345Sdim return createMachOObjectFile(Object); 60218885Sdim case sys::COFF_FileType: 61218885Sdim return createCOFFObjectFile(Object); 62218885Sdim default: 63249423Sdim llvm_unreachable("Unexpected Object File Type"); 64218885Sdim } 65218885Sdim} 66218885Sdim 67218885SdimObjectFile *ObjectFile::createObjectFile(StringRef ObjectPath) { 68218885Sdim OwningPtr<MemoryBuffer> File; 69234353Sdim if (MemoryBuffer::getFile(ObjectPath, File)) 70218885Sdim return NULL; 71218885Sdim return createObjectFile(File.take()); 72218885Sdim} 73