Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/llvm/lib/Object/SymbolicFile.cpp
35232 views
1
//===- SymbolicFile.cpp - Interface that only provides symbols ------------===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
//
9
// This file defines a file format independent SymbolicFile class.
10
//
11
//===----------------------------------------------------------------------===//
12
13
#include "llvm/Object/SymbolicFile.h"
14
#include "llvm/ADT/StringRef.h"
15
#include "llvm/BinaryFormat/Magic.h"
16
#include "llvm/Object/COFFImportFile.h"
17
#include "llvm/Object/Error.h"
18
#include "llvm/Object/IRObjectFile.h"
19
#include "llvm/Object/ObjectFile.h"
20
#include "llvm/Support/Error.h"
21
#include "llvm/Support/ErrorHandling.h"
22
#include <memory>
23
24
using namespace llvm;
25
using namespace object;
26
27
namespace llvm {
28
class LLVMContext;
29
}
30
31
SymbolicFile::SymbolicFile(unsigned int Type, MemoryBufferRef Source)
32
: Binary(Type, Source) {}
33
34
SymbolicFile::~SymbolicFile() = default;
35
36
Expected<std::unique_ptr<SymbolicFile>>
37
SymbolicFile::createSymbolicFile(MemoryBufferRef Object, file_magic Type,
38
LLVMContext *Context, bool InitContent) {
39
StringRef Data = Object.getBuffer();
40
if (Type == file_magic::unknown)
41
Type = identify_magic(Data);
42
43
if (!isSymbolicFile(Type, Context))
44
return errorCodeToError(object_error::invalid_file_type);
45
46
switch (Type) {
47
case file_magic::bitcode:
48
// Context is guaranteed to be non-null here, because bitcode magic only
49
// indicates a symbolic file when Context is non-null.
50
return IRObjectFile::create(Object, *Context);
51
case file_magic::elf:
52
case file_magic::elf_executable:
53
case file_magic::elf_shared_object:
54
case file_magic::elf_core:
55
case file_magic::goff_object:
56
case file_magic::macho_executable:
57
case file_magic::macho_fixed_virtual_memory_shared_lib:
58
case file_magic::macho_core:
59
case file_magic::macho_preload_executable:
60
case file_magic::macho_dynamically_linked_shared_lib:
61
case file_magic::macho_dynamic_linker:
62
case file_magic::macho_bundle:
63
case file_magic::macho_dynamically_linked_shared_lib_stub:
64
case file_magic::macho_dsym_companion:
65
case file_magic::macho_kext_bundle:
66
case file_magic::macho_file_set:
67
case file_magic::pecoff_executable:
68
case file_magic::xcoff_object_32:
69
case file_magic::xcoff_object_64:
70
case file_magic::wasm_object:
71
return ObjectFile::createObjectFile(Object, Type, InitContent);
72
case file_magic::coff_import_library:
73
return std::unique_ptr<SymbolicFile>(new COFFImportFile(Object));
74
case file_magic::elf_relocatable:
75
case file_magic::macho_object:
76
case file_magic::coff_object: {
77
Expected<std::unique_ptr<ObjectFile>> Obj =
78
ObjectFile::createObjectFile(Object, Type, InitContent);
79
if (!Obj || !Context)
80
return std::move(Obj);
81
82
Expected<MemoryBufferRef> BCData =
83
IRObjectFile::findBitcodeInObject(*Obj->get());
84
if (!BCData) {
85
consumeError(BCData.takeError());
86
return std::move(Obj);
87
}
88
89
return IRObjectFile::create(
90
MemoryBufferRef(BCData->getBuffer(), Object.getBufferIdentifier()),
91
*Context);
92
}
93
default:
94
llvm_unreachable("Unexpected Binary File Type");
95
}
96
}
97
98
bool SymbolicFile::isSymbolicFile(file_magic Type, const LLVMContext *Context) {
99
switch (Type) {
100
case file_magic::bitcode:
101
return Context != nullptr;
102
case file_magic::elf:
103
case file_magic::elf_executable:
104
case file_magic::elf_shared_object:
105
case file_magic::elf_core:
106
case file_magic::goff_object:
107
case file_magic::macho_executable:
108
case file_magic::macho_fixed_virtual_memory_shared_lib:
109
case file_magic::macho_core:
110
case file_magic::macho_preload_executable:
111
case file_magic::macho_dynamically_linked_shared_lib:
112
case file_magic::macho_dynamic_linker:
113
case file_magic::macho_bundle:
114
case file_magic::macho_dynamically_linked_shared_lib_stub:
115
case file_magic::macho_dsym_companion:
116
case file_magic::macho_kext_bundle:
117
case file_magic::macho_file_set:
118
case file_magic::pecoff_executable:
119
case file_magic::xcoff_object_32:
120
case file_magic::xcoff_object_64:
121
case file_magic::wasm_object:
122
case file_magic::coff_import_library:
123
case file_magic::elf_relocatable:
124
case file_magic::macho_object:
125
case file_magic::coff_object:
126
return true;
127
default:
128
return false;
129
}
130
}
131
132