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/Support/ErrorHandling.h" 16f785676fSDimitry Andric #include "llvm/Support/FileSystem.h" 172754fe60SDimitry Andric #include "llvm/Support/MemoryBuffer.h" 1891bc56edSDimitry Andric #include "llvm/Support/raw_ostream.h" 1991bc56edSDimitry Andric #include <system_error> 202754fe60SDimitry Andric 212754fe60SDimitry Andric using namespace llvm; 222754fe60SDimitry Andric using namespace object; 232754fe60SDimitry Andric 24dff0c46cSDimitry Andric void ObjectFile::anchor() { } 25dff0c46cSDimitry Andric 2691bc56edSDimitry Andric ObjectFile::ObjectFile(unsigned int Type, std::unique_ptr<MemoryBuffer> Source) 2791bc56edSDimitry Andric : SymbolicFile(Type, std::move(Source)) {} 2891bc56edSDimitry Andric 2991bc56edSDimitry Andric std::error_code ObjectFile::printSymbolName(raw_ostream &OS, 3091bc56edSDimitry Andric DataRefImpl Symb) const { 3191bc56edSDimitry Andric StringRef Name; 3291bc56edSDimitry Andric if (std::error_code EC = getSymbolName(Symb, Name)) 3391bc56edSDimitry Andric return EC; 3491bc56edSDimitry Andric OS << Name; 3591bc56edSDimitry Andric return object_error::success; 362754fe60SDimitry Andric } 372754fe60SDimitry Andric 3891bc56edSDimitry Andric std::error_code ObjectFile::getSymbolAlignment(DataRefImpl DRI, 39284c1978SDimitry Andric uint32_t &Result) const { 40284c1978SDimitry Andric Result = 0; 41284c1978SDimitry Andric return object_error::success; 42284c1978SDimitry Andric } 43284c1978SDimitry Andric 44f785676fSDimitry Andric section_iterator ObjectFile::getRelocatedSection(DataRefImpl Sec) const { 45f785676fSDimitry Andric return section_iterator(SectionRef(Sec, this)); 462754fe60SDimitry Andric } 47f785676fSDimitry Andric 4891bc56edSDimitry Andric ErrorOr<ObjectFile *> 4991bc56edSDimitry Andric ObjectFile::createObjectFile(std::unique_ptr<MemoryBuffer> &Object, 5091bc56edSDimitry Andric sys::fs::file_magic Type) { 5191bc56edSDimitry Andric if (Type == sys::fs::file_magic::unknown) 5291bc56edSDimitry Andric Type = sys::fs::identify_magic(Object->getBuffer()); 53f785676fSDimitry Andric 54f785676fSDimitry Andric switch (Type) { 55f785676fSDimitry Andric case sys::fs::file_magic::unknown: 56f785676fSDimitry Andric case sys::fs::file_magic::bitcode: 57f785676fSDimitry Andric case sys::fs::file_magic::archive: 58f785676fSDimitry Andric case sys::fs::file_magic::macho_universal_binary: 59f785676fSDimitry Andric case sys::fs::file_magic::windows_resource: 6091bc56edSDimitry Andric return object_error::invalid_file_type; 61f785676fSDimitry Andric case sys::fs::file_magic::elf_relocatable: 62f785676fSDimitry Andric case sys::fs::file_magic::elf_executable: 63f785676fSDimitry Andric case sys::fs::file_magic::elf_shared_object: 64f785676fSDimitry Andric case sys::fs::file_magic::elf_core: 65f785676fSDimitry Andric return createELFObjectFile(Object); 66f785676fSDimitry Andric case sys::fs::file_magic::macho_object: 67f785676fSDimitry Andric case sys::fs::file_magic::macho_executable: 68f785676fSDimitry Andric case sys::fs::file_magic::macho_fixed_virtual_memory_shared_lib: 69f785676fSDimitry Andric case sys::fs::file_magic::macho_core: 70f785676fSDimitry Andric case sys::fs::file_magic::macho_preload_executable: 71f785676fSDimitry Andric case sys::fs::file_magic::macho_dynamically_linked_shared_lib: 72f785676fSDimitry Andric case sys::fs::file_magic::macho_dynamic_linker: 73f785676fSDimitry Andric case sys::fs::file_magic::macho_bundle: 74f785676fSDimitry Andric case sys::fs::file_magic::macho_dynamically_linked_shared_lib_stub: 75f785676fSDimitry Andric case sys::fs::file_magic::macho_dsym_companion: 76f785676fSDimitry Andric return createMachOObjectFile(Object); 77f785676fSDimitry Andric case sys::fs::file_magic::coff_object: 78f785676fSDimitry Andric case sys::fs::file_magic::coff_import_library: 79f785676fSDimitry Andric case sys::fs::file_magic::pecoff_executable: 8091bc56edSDimitry Andric return createCOFFObjectFile(std::move(Object)); 81f785676fSDimitry Andric } 82f785676fSDimitry Andric llvm_unreachable("Unexpected Object File Type"); 832754fe60SDimitry Andric } 842754fe60SDimitry Andric 8591bc56edSDimitry Andric ErrorOr<ObjectFile *> ObjectFile::createObjectFile(StringRef ObjectPath) { 8691bc56edSDimitry Andric ErrorOr<std::unique_ptr<MemoryBuffer>> FileOrErr = 8791bc56edSDimitry Andric MemoryBuffer::getFile(ObjectPath); 8891bc56edSDimitry Andric if (std::error_code EC = FileOrErr.getError()) 8991bc56edSDimitry Andric return EC; 9091bc56edSDimitry Andric return createObjectFile(FileOrErr.get()); 912754fe60SDimitry Andric } 92