ObjectFile.cpp revision 263508
11539Srgrimes//===- ObjectFile.cpp - File format independent object file -----*- C++ -*-===// 21539Srgrimes// 31539Srgrimes// The LLVM Compiler Infrastructure 41539Srgrimes// 51539Srgrimes// This file is distributed under the University of Illinois Open Source 61539Srgrimes// License. See LICENSE.TXT for details. 71539Srgrimes// 81539Srgrimes//===----------------------------------------------------------------------===// 91539Srgrimes// 101539Srgrimes// This file defines a file format independent ObjectFile class. 111539Srgrimes// 121539Srgrimes//===----------------------------------------------------------------------===// 13203964Simp 141539Srgrimes#include "llvm/Object/ObjectFile.h" 151539Srgrimes#include "llvm/ADT/OwningPtr.h" 161539Srgrimes#include "llvm/Support/ErrorHandling.h" 171539Srgrimes#include "llvm/Support/FileSystem.h" 181539Srgrimes#include "llvm/Support/MemoryBuffer.h" 191539Srgrimes#include "llvm/Support/system_error.h" 201539Srgrimes 211539Srgrimesusing namespace llvm; 221539Srgrimesusing namespace object; 231539Srgrimes 241539Srgrimesvoid ObjectFile::anchor() { } 251539Srgrimes 261539SrgrimesObjectFile::ObjectFile(unsigned int Type, MemoryBuffer *source) 271539Srgrimes : Binary(Type, source) { 281539Srgrimes} 2923657Speter 3055031Sbdeerror_code ObjectFile::getSymbolAlignment(DataRefImpl DRI, 311539Srgrimes uint32_t &Result) const { 321539Srgrimes Result = 0; 331539Srgrimes return object_error::success; 347865Sbde} 351539Srgrimes 3633861Sbdesection_iterator ObjectFile::getRelocatedSection(DataRefImpl Sec) const { 37123257Smarcel return section_iterator(SectionRef(Sec, this)); 38102227Smike} 3933861Sbde 40103728SwollmanObjectFile *ObjectFile::createObjectFile(MemoryBuffer *Object) { 41102227Smike if (Object->getBufferSize() < 64) { 42102227Smike delete Object; 43102227Smike return 0; 4415483Sbde } 4515483Sbde 4615483Sbde sys::fs::file_magic Type = sys::fs::identify_magic(Object->getBuffer()); 47102227Smike switch (Type) { 48102227Smike case sys::fs::file_magic::unknown: 49102227Smike case sys::fs::file_magic::bitcode: 501539Srgrimes case sys::fs::file_magic::archive: 511539Srgrimes case sys::fs::file_magic::macho_universal_binary: 5299640Sobrien case sys::fs::file_magic::windows_resource: 53102227Smike delete Object; 54102227Smike return 0; 55102227Smike case sys::fs::file_magic::elf_relocatable: 561539Srgrimes case sys::fs::file_magic::elf_executable: 5799640Sobrien case sys::fs::file_magic::elf_shared_object: 581539Srgrimes case sys::fs::file_magic::elf_core: 591539Srgrimes return createELFObjectFile(Object); 60103766Sbde case sys::fs::file_magic::macho_object: 61103766Sbde case sys::fs::file_magic::macho_executable: 621539Srgrimes case sys::fs::file_magic::macho_fixed_virtual_memory_shared_lib: 631539Srgrimes case sys::fs::file_magic::macho_core: 641539Srgrimes case sys::fs::file_magic::macho_preload_executable: 65103766Sbde case sys::fs::file_magic::macho_dynamically_linked_shared_lib: 66103766Sbde case sys::fs::file_magic::macho_dynamic_linker: 671539Srgrimes case sys::fs::file_magic::macho_bundle: 681539Srgrimes case sys::fs::file_magic::macho_dynamically_linked_shared_lib_stub: 691539Srgrimes case sys::fs::file_magic::macho_dsym_companion: 701539Srgrimes return createMachOObjectFile(Object); 711539Srgrimes case sys::fs::file_magic::coff_object: 721539Srgrimes case sys::fs::file_magic::coff_import_library: 731539Srgrimes case sys::fs::file_magic::pecoff_executable: 74227753Stheraven return createCOFFObjectFile(Object); 751539Srgrimes } 76227753Stheraven llvm_unreachable("Unexpected Object File Type"); 77227753Stheraven} 781539Srgrimes 79228330StheravenObjectFile *ObjectFile::createObjectFile(StringRef ObjectPath) { 8093032Simp OwningPtr<MemoryBuffer> File; 8193032Simp if (MemoryBuffer::getFile(ObjectPath, File)) 8293032Simp return NULL; 8393032Simp return createObjectFile(File.take()); 8493032Simp} 8593032Simp