Path: blob/main/contrib/llvm-project/llvm/lib/Object/Binary.cpp
35232 views
//===- Binary.cpp - A generic binary file ---------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file defines the Binary class.9//10//===----------------------------------------------------------------------===//1112#include "llvm/Object/Binary.h"13#include "llvm/ADT/StringRef.h"14#include "llvm/BinaryFormat/Magic.h"15#include "llvm/Object/Archive.h"16#include "llvm/Object/Error.h"17#include "llvm/Object/MachOUniversal.h"18#include "llvm/Object/Minidump.h"19#include "llvm/Object/ObjectFile.h"20#include "llvm/Object/OffloadBinary.h"21#include "llvm/Object/TapiUniversal.h"22#include "llvm/Object/WindowsResource.h"23#include "llvm/Support/Error.h"24#include "llvm/Support/ErrorHandling.h"25#include "llvm/Support/ErrorOr.h"26#include "llvm/Support/MemoryBuffer.h"27#include <memory>28#include <system_error>2930using namespace llvm;31using namespace object;3233Binary::~Binary() = default;3435Binary::Binary(unsigned int Type, MemoryBufferRef Source)36: TypeID(Type), Data(Source) {}3738StringRef Binary::getData() const { return Data.getBuffer(); }3940StringRef Binary::getFileName() const { return Data.getBufferIdentifier(); }4142MemoryBufferRef Binary::getMemoryBufferRef() const { return Data; }4344Expected<std::unique_ptr<Binary>> object::createBinary(MemoryBufferRef Buffer,45LLVMContext *Context,46bool InitContent) {47file_magic Type = identify_magic(Buffer.getBuffer());4849switch (Type) {50case file_magic::archive:51return Archive::create(Buffer);52case file_magic::elf:53case file_magic::elf_relocatable:54case file_magic::elf_executable:55case file_magic::elf_shared_object:56case file_magic::elf_core:57case file_magic::goff_object:58case file_magic::macho_object:59case file_magic::macho_executable:60case file_magic::macho_fixed_virtual_memory_shared_lib:61case file_magic::macho_core:62case file_magic::macho_preload_executable:63case file_magic::macho_dynamically_linked_shared_lib:64case file_magic::macho_dynamic_linker:65case file_magic::macho_bundle:66case file_magic::macho_dynamically_linked_shared_lib_stub:67case file_magic::macho_dsym_companion:68case file_magic::macho_kext_bundle:69case file_magic::macho_file_set:70case file_magic::coff_object:71case file_magic::coff_import_library:72case file_magic::pecoff_executable:73case file_magic::bitcode:74case file_magic::xcoff_object_32:75case file_magic::xcoff_object_64:76case file_magic::wasm_object:77return ObjectFile::createSymbolicFile(Buffer, Type, Context, InitContent);78case file_magic::macho_universal_binary:79return MachOUniversalBinary::create(Buffer);80case file_magic::windows_resource:81return WindowsResource::createWindowsResource(Buffer);82case file_magic::pdb:83// PDB does not support the Binary interface.84return errorCodeToError(object_error::invalid_file_type);85case file_magic::unknown:86case file_magic::clang_ast:87case file_magic::cuda_fatbinary:88case file_magic::coff_cl_gl_object:89case file_magic::dxcontainer_object:90case file_magic::offload_bundle:91case file_magic::offload_bundle_compressed:92case file_magic::spirv_object:93// Unrecognized object file format.94return errorCodeToError(object_error::invalid_file_type);95case file_magic::offload_binary:96return OffloadBinary::create(Buffer);97case file_magic::minidump:98return MinidumpFile::create(Buffer);99case file_magic::tapi_file:100return TapiUniversal::create(Buffer);101}102llvm_unreachable("Unexpected Binary File Type");103}104105Expected<OwningBinary<Binary>>106object::createBinary(StringRef Path, LLVMContext *Context, bool InitContent) {107ErrorOr<std::unique_ptr<MemoryBuffer>> FileOrErr =108MemoryBuffer::getFileOrSTDIN(Path, /*IsText=*/false,109/*RequiresNullTerminator=*/false);110if (std::error_code EC = FileOrErr.getError())111return errorCodeToError(EC);112std::unique_ptr<MemoryBuffer> &Buffer = FileOrErr.get();113114Expected<std::unique_ptr<Binary>> BinOrErr =115createBinary(Buffer->getMemBufferRef(), Context, InitContent);116if (!BinOrErr)117return BinOrErr.takeError();118std::unique_ptr<Binary> &Bin = BinOrErr.get();119120return OwningBinary<Binary>(std::move(Bin), std::move(Buffer));121}122123124