1*9880d681SAndroid Build Coastguard Worker //===- Binary.cpp - A generic binary file -----------------------*- C++ -*-===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker // 10*9880d681SAndroid Build Coastguard Worker // This file defines the Binary class. 11*9880d681SAndroid Build Coastguard Worker // 12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker #include "llvm/Object/Binary.h" 15*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/StringRef.h" 16*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/FileSystem.h" 17*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/MemoryBuffer.h" 18*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Path.h" 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker // Include headers for createBinary. 21*9880d681SAndroid Build Coastguard Worker #include "llvm/Object/Archive.h" 22*9880d681SAndroid Build Coastguard Worker #include "llvm/Object/MachOUniversal.h" 23*9880d681SAndroid Build Coastguard Worker #include "llvm/Object/ObjectFile.h" 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker using namespace llvm; 26*9880d681SAndroid Build Coastguard Worker using namespace object; 27*9880d681SAndroid Build Coastguard Worker ~Binary()28*9880d681SAndroid Build Coastguard WorkerBinary::~Binary() {} 29*9880d681SAndroid Build Coastguard Worker Binary(unsigned int Type,MemoryBufferRef Source)30*9880d681SAndroid Build Coastguard WorkerBinary::Binary(unsigned int Type, MemoryBufferRef Source) 31*9880d681SAndroid Build Coastguard Worker : TypeID(Type), Data(Source) {} 32*9880d681SAndroid Build Coastguard Worker getData() const33*9880d681SAndroid Build Coastguard WorkerStringRef Binary::getData() const { return Data.getBuffer(); } 34*9880d681SAndroid Build Coastguard Worker getFileName() const35*9880d681SAndroid Build Coastguard WorkerStringRef Binary::getFileName() const { return Data.getBufferIdentifier(); } 36*9880d681SAndroid Build Coastguard Worker getMemoryBufferRef() const37*9880d681SAndroid Build Coastguard WorkerMemoryBufferRef Binary::getMemoryBufferRef() const { return Data; } 38*9880d681SAndroid Build Coastguard Worker createBinary(MemoryBufferRef Buffer,LLVMContext * Context)39*9880d681SAndroid Build Coastguard WorkerExpected<std::unique_ptr<Binary>> object::createBinary(MemoryBufferRef Buffer, 40*9880d681SAndroid Build Coastguard Worker LLVMContext *Context) { 41*9880d681SAndroid Build Coastguard Worker sys::fs::file_magic Type = sys::fs::identify_magic(Buffer.getBuffer()); 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker switch (Type) { 44*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::archive: 45*9880d681SAndroid Build Coastguard Worker return Archive::create(Buffer); 46*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::elf: 47*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::elf_relocatable: 48*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::elf_executable: 49*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::elf_shared_object: 50*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::elf_core: 51*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::macho_object: 52*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::macho_executable: 53*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::macho_fixed_virtual_memory_shared_lib: 54*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::macho_core: 55*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::macho_preload_executable: 56*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::macho_dynamically_linked_shared_lib: 57*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::macho_dynamic_linker: 58*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::macho_bundle: 59*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::macho_dynamically_linked_shared_lib_stub: 60*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::macho_dsym_companion: 61*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::macho_kext_bundle: 62*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::coff_object: 63*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::coff_import_library: 64*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::pecoff_executable: 65*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::bitcode: 66*9880d681SAndroid Build Coastguard Worker return ObjectFile::createSymbolicFile(Buffer, Type, Context); 67*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::macho_universal_binary: 68*9880d681SAndroid Build Coastguard Worker return MachOUniversalBinary::create(Buffer); 69*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::unknown: 70*9880d681SAndroid Build Coastguard Worker case sys::fs::file_magic::windows_resource: 71*9880d681SAndroid Build Coastguard Worker // Unrecognized object file format. 72*9880d681SAndroid Build Coastguard Worker return errorCodeToError(object_error::invalid_file_type); 73*9880d681SAndroid Build Coastguard Worker } 74*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Unexpected Binary File Type"); 75*9880d681SAndroid Build Coastguard Worker } 76*9880d681SAndroid Build Coastguard Worker createBinary(StringRef Path)77*9880d681SAndroid Build Coastguard WorkerExpected<OwningBinary<Binary>> object::createBinary(StringRef Path) { 78*9880d681SAndroid Build Coastguard Worker ErrorOr<std::unique_ptr<MemoryBuffer>> FileOrErr = 79*9880d681SAndroid Build Coastguard Worker MemoryBuffer::getFileOrSTDIN(Path); 80*9880d681SAndroid Build Coastguard Worker if (std::error_code EC = FileOrErr.getError()) 81*9880d681SAndroid Build Coastguard Worker return errorCodeToError(EC); 82*9880d681SAndroid Build Coastguard Worker std::unique_ptr<MemoryBuffer> &Buffer = FileOrErr.get(); 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker Expected<std::unique_ptr<Binary>> BinOrErr = 85*9880d681SAndroid Build Coastguard Worker createBinary(Buffer->getMemBufferRef()); 86*9880d681SAndroid Build Coastguard Worker if (!BinOrErr) 87*9880d681SAndroid Build Coastguard Worker return BinOrErr.takeError(); 88*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Binary> &Bin = BinOrErr.get(); 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Worker return OwningBinary<Binary>(std::move(Bin), std::move(Buffer)); 91*9880d681SAndroid Build Coastguard Worker } 92