Path: blob/main/contrib/llvm-project/llvm/lib/Object/SymbolicFile.cpp
35232 views
//===- SymbolicFile.cpp - Interface that only provides symbols ------------===//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 a file format independent SymbolicFile class.9//10//===----------------------------------------------------------------------===//1112#include "llvm/Object/SymbolicFile.h"13#include "llvm/ADT/StringRef.h"14#include "llvm/BinaryFormat/Magic.h"15#include "llvm/Object/COFFImportFile.h"16#include "llvm/Object/Error.h"17#include "llvm/Object/IRObjectFile.h"18#include "llvm/Object/ObjectFile.h"19#include "llvm/Support/Error.h"20#include "llvm/Support/ErrorHandling.h"21#include <memory>2223using namespace llvm;24using namespace object;2526namespace llvm {27class LLVMContext;28}2930SymbolicFile::SymbolicFile(unsigned int Type, MemoryBufferRef Source)31: Binary(Type, Source) {}3233SymbolicFile::~SymbolicFile() = default;3435Expected<std::unique_ptr<SymbolicFile>>36SymbolicFile::createSymbolicFile(MemoryBufferRef Object, file_magic Type,37LLVMContext *Context, bool InitContent) {38StringRef Data = Object.getBuffer();39if (Type == file_magic::unknown)40Type = identify_magic(Data);4142if (!isSymbolicFile(Type, Context))43return errorCodeToError(object_error::invalid_file_type);4445switch (Type) {46case file_magic::bitcode:47// Context is guaranteed to be non-null here, because bitcode magic only48// indicates a symbolic file when Context is non-null.49return IRObjectFile::create(Object, *Context);50case file_magic::elf:51case file_magic::elf_executable:52case file_magic::elf_shared_object:53case file_magic::elf_core:54case file_magic::goff_object:55case file_magic::macho_executable:56case file_magic::macho_fixed_virtual_memory_shared_lib:57case file_magic::macho_core:58case file_magic::macho_preload_executable:59case file_magic::macho_dynamically_linked_shared_lib:60case file_magic::macho_dynamic_linker:61case file_magic::macho_bundle:62case file_magic::macho_dynamically_linked_shared_lib_stub:63case file_magic::macho_dsym_companion:64case file_magic::macho_kext_bundle:65case file_magic::macho_file_set:66case file_magic::pecoff_executable:67case file_magic::xcoff_object_32:68case file_magic::xcoff_object_64:69case file_magic::wasm_object:70return ObjectFile::createObjectFile(Object, Type, InitContent);71case file_magic::coff_import_library:72return std::unique_ptr<SymbolicFile>(new COFFImportFile(Object));73case file_magic::elf_relocatable:74case file_magic::macho_object:75case file_magic::coff_object: {76Expected<std::unique_ptr<ObjectFile>> Obj =77ObjectFile::createObjectFile(Object, Type, InitContent);78if (!Obj || !Context)79return std::move(Obj);8081Expected<MemoryBufferRef> BCData =82IRObjectFile::findBitcodeInObject(*Obj->get());83if (!BCData) {84consumeError(BCData.takeError());85return std::move(Obj);86}8788return IRObjectFile::create(89MemoryBufferRef(BCData->getBuffer(), Object.getBufferIdentifier()),90*Context);91}92default:93llvm_unreachable("Unexpected Binary File Type");94}95}9697bool SymbolicFile::isSymbolicFile(file_magic Type, const LLVMContext *Context) {98switch (Type) {99case file_magic::bitcode:100return Context != nullptr;101case file_magic::elf:102case file_magic::elf_executable:103case file_magic::elf_shared_object:104case file_magic::elf_core:105case file_magic::goff_object:106case file_magic::macho_executable:107case file_magic::macho_fixed_virtual_memory_shared_lib:108case file_magic::macho_core:109case file_magic::macho_preload_executable:110case file_magic::macho_dynamically_linked_shared_lib:111case file_magic::macho_dynamic_linker:112case file_magic::macho_bundle:113case file_magic::macho_dynamically_linked_shared_lib_stub:114case file_magic::macho_dsym_companion:115case file_magic::macho_kext_bundle:116case file_magic::macho_file_set:117case file_magic::pecoff_executable:118case file_magic::xcoff_object_32:119case file_magic::xcoff_object_64:120case file_magic::wasm_object:121case file_magic::coff_import_library:122case file_magic::elf_relocatable:123case file_magic::macho_object:124case file_magic::coff_object:125return true;126default:127return false;128}129}130131132