Movatterモバイル変換


[0]ホーム

URL:


LLVM 20.0.0git
ObjectFileInterface.cpp
Go to the documentation of this file.
1//===------ ObjectFileInterface.cpp - MU interface utils for objects ------===//
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#include "llvm/ExecutionEngine/Orc/ObjectFileInterface.h"
10#include "llvm/ExecutionEngine/Orc/Shared/ObjectFormats.h"
11#include "llvm/Object/COFF.h"
12#include "llvm/Object/ELFObjectFile.h"
13#include "llvm/Object/MachO.h"
14#include "llvm/Object/ObjectFile.h"
15#include <optional>
16
17#define DEBUG_TYPE "orc"
18
19namespacellvm {
20namespaceorc {
21
22voidaddInitSymbol(MaterializationUnit::Interface &I,ExecutionSession &ES,
23StringRef ObjFileName) {
24assert(!I.InitSymbol &&"I already has an init symbol");
25size_t Counter = 0;
26
27do {
28 std::string InitSymString;
29raw_string_ostream(InitSymString)
30 <<"$." << ObjFileName <<".__inits." << Counter++;
31I.InitSymbol = ES.intern(InitSymString);
32 }while (I.SymbolFlags.count(I.InitSymbol));
33
34I.SymbolFlags[I.InitSymbol] =JITSymbolFlags::MaterializationSideEffectsOnly;
35}
36
37staticExpected<MaterializationUnit::Interface>
38getMachOObjectFileSymbolInfo(ExecutionSession &ES,
39constobject::MachOObjectFile &Obj) {
40MaterializationUnit::InterfaceI;
41
42for (auto &Sym : Obj.symbols()) {
43Expected<uint32_t> SymFlagsOrErr =Sym.getFlags();
44if (!SymFlagsOrErr)
45// TODO: Test this error.
46return SymFlagsOrErr.takeError();
47
48// Skip symbols not defined in this object file.
49if (*SymFlagsOrErr &object::BasicSymbolRef::SF_Undefined)
50continue;
51
52// Skip symbols that are not global.
53if (!(*SymFlagsOrErr &object::BasicSymbolRef::SF_Global))
54continue;
55
56// Skip symbols that have type SF_File.
57if (auto SymType =Sym.getType()) {
58if (*SymType ==object::SymbolRef::ST_File)
59continue;
60 }else
61return SymType.takeError();
62
63autoName =Sym.getName();
64if (!Name)
65returnName.takeError();
66auto SymFlags =JITSymbolFlags::fromObjectSymbol(Sym);
67if (!SymFlags)
68return SymFlags.takeError();
69
70// Strip the 'exported' flag from MachO linker-private symbols.
71if (Name->starts_with("l"))
72 *SymFlags &=~JITSymbolFlags::Exported;
73
74I.SymbolFlags[ES.intern(*Name)] = std::move(*SymFlags);
75 }
76
77for (auto &Sec : Obj.sections()) {
78autoSecType = Obj.getSectionType(Sec);
79if ((SecType &MachO::SECTION_TYPE) ==MachO::S_MOD_INIT_FUNC_POINTERS) {
80addInitSymbol(I, ES, Obj.getFileName());
81break;
82 }
83auto SegName = Obj.getSectionFinalSegmentName(Sec.getRawDataRefImpl());
84auto SecName =cantFail(Obj.getSectionName(Sec.getRawDataRefImpl()));
85if (isMachOInitializerSection(SegName, SecName)) {
86addInitSymbol(I, ES, Obj.getFileName());
87break;
88 }
89 }
90
91returnI;
92}
93
94staticExpected<MaterializationUnit::Interface>
95getELFObjectFileSymbolInfo(ExecutionSession &ES,
96constobject::ELFObjectFileBase &Obj) {
97MaterializationUnit::InterfaceI;
98
99for (auto &Sym : Obj.symbols()) {
100Expected<uint32_t> SymFlagsOrErr =Sym.getFlags();
101if (!SymFlagsOrErr)
102// TODO: Test this error.
103return SymFlagsOrErr.takeError();
104
105// Skip symbols not defined in this object file.
106if (*SymFlagsOrErr &object::BasicSymbolRef::SF_Undefined)
107continue;
108
109// Skip symbols that are not global.
110if (!(*SymFlagsOrErr &object::BasicSymbolRef::SF_Global))
111continue;
112
113// Skip symbols that have type SF_File.
114if (auto SymType =Sym.getType()) {
115if (*SymType ==object::SymbolRef::ST_File)
116continue;
117 }else
118return SymType.takeError();
119
120autoName =Sym.getName();
121if (!Name)
122returnName.takeError();
123
124auto SymFlags =JITSymbolFlags::fromObjectSymbol(Sym);
125if (!SymFlags)
126return SymFlags.takeError();
127
128// ELF STB_GNU_UNIQUE should map to Weak for ORC.
129if (Sym.getBinding() ==ELF::STB_GNU_UNIQUE)
130 *SymFlags |=JITSymbolFlags::Weak;
131
132I.SymbolFlags[ES.intern(std::move(*Name))] = std::move(*SymFlags);
133 }
134
135SymbolStringPtr InitSymbol;
136for (auto &Sec : Obj.sections()) {
137if (auto SecName = Sec.getName()) {
138if (isELFInitializerSection(*SecName)) {
139addInitSymbol(I, ES, Obj.getFileName());
140break;
141 }
142 }
143 }
144
145returnI;
146}
147
148staticExpected<MaterializationUnit::Interface>
149getCOFFObjectFileSymbolInfo(ExecutionSession &ES,
150constobject::COFFObjectFile &Obj) {
151MaterializationUnit::InterfaceI;
152 std::vector<std::optional<object::coff_aux_section_definition>> ComdatDefs(
153 Obj.getNumberOfSections() + 1);
154for (auto &Sym : Obj.symbols()) {
155Expected<uint32_t> SymFlagsOrErr =Sym.getFlags();
156if (!SymFlagsOrErr)
157// TODO: Test this error.
158return SymFlagsOrErr.takeError();
159
160// Handle comdat symbols
161auto COFFSym = Obj.getCOFFSymbol(Sym);
162bool IsWeak =false;
163if (auto *Def = COFFSym.getSectionDefinition()) {
164auto Sec = Obj.getSection(COFFSym.getSectionNumber());
165if (!Sec)
166return Sec.takeError();
167if (((*Sec)->Characteristics &COFF::IMAGE_SCN_LNK_COMDAT) &&
168 Def->Selection !=COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE) {
169 ComdatDefs[COFFSym.getSectionNumber()] = *Def;
170continue;
171 }
172 }
173if (!COFF::isReservedSectionNumber(COFFSym.getSectionNumber()) &&
174 ComdatDefs[COFFSym.getSectionNumber()]) {
175auto Def = ComdatDefs[COFFSym.getSectionNumber()];
176if (Def->Selection !=COFF::IMAGE_COMDAT_SELECT_NODUPLICATES) {
177 IsWeak =true;
178 }
179 ComdatDefs[COFFSym.getSectionNumber()] = std::nullopt;
180 }else {
181// Skip symbols not defined in this object file.
182if (*SymFlagsOrErr &object::BasicSymbolRef::SF_Undefined)
183continue;
184 }
185
186// Skip symbols that are not global.
187if (!(*SymFlagsOrErr &object::BasicSymbolRef::SF_Global))
188continue;
189
190// Skip symbols that have type SF_File.
191if (auto SymType =Sym.getType()) {
192if (*SymType ==object::SymbolRef::ST_File)
193continue;
194 }else
195return SymType.takeError();
196
197autoName =Sym.getName();
198if (!Name)
199returnName.takeError();
200
201auto SymFlags =JITSymbolFlags::fromObjectSymbol(Sym);
202if (!SymFlags)
203return SymFlags.takeError();
204 *SymFlags |=JITSymbolFlags::Exported;
205
206// Weak external is always a function
207if (COFFSym.isWeakExternal())
208 *SymFlags |=JITSymbolFlags::Callable;
209
210if (IsWeak)
211 *SymFlags |=JITSymbolFlags::Weak;
212
213I.SymbolFlags[ES.intern(*Name)] = std::move(*SymFlags);
214 }
215
216SymbolStringPtr InitSymbol;
217for (auto &Sec : Obj.sections()) {
218if (auto SecName = Sec.getName()) {
219if (isCOFFInitializerSection(*SecName)) {
220addInitSymbol(I, ES, Obj.getFileName());
221break;
222 }
223 }else
224return SecName.takeError();
225 }
226
227returnI;
228}
229
230Expected<MaterializationUnit::Interface>
231getGenericObjectFileSymbolInfo(ExecutionSession &ES,
232constobject::ObjectFile &Obj) {
233MaterializationUnit::InterfaceI;
234
235for (auto &Sym : Obj.symbols()) {
236Expected<uint32_t> SymFlagsOrErr =Sym.getFlags();
237if (!SymFlagsOrErr)
238// TODO: Test this error.
239return SymFlagsOrErr.takeError();
240
241// Skip symbols not defined in this object file.
242if (*SymFlagsOrErr &object::BasicSymbolRef::SF_Undefined)
243continue;
244
245// Skip symbols that are not global.
246if (!(*SymFlagsOrErr &object::BasicSymbolRef::SF_Global))
247continue;
248
249// Skip symbols that have type SF_File.
250if (auto SymType =Sym.getType()) {
251if (*SymType ==object::SymbolRef::ST_File)
252continue;
253 }else
254return SymType.takeError();
255
256autoName =Sym.getName();
257if (!Name)
258returnName.takeError();
259
260auto SymFlags =JITSymbolFlags::fromObjectSymbol(Sym);
261if (!SymFlags)
262return SymFlags.takeError();
263
264I.SymbolFlags[ES.intern(*Name)] = std::move(*SymFlags);
265 }
266
267returnI;
268}
269
270Expected<MaterializationUnit::Interface>
271getObjectFileInterface(ExecutionSession &ES,MemoryBufferRef ObjBuffer) {
272auto Obj =object::ObjectFile::createObjectFile(ObjBuffer);
273
274if (!Obj)
275return Obj.takeError();
276
277if (auto *MachOObj = dyn_cast<object::MachOObjectFile>(Obj->get()))
278returngetMachOObjectFileSymbolInfo(ES, *MachOObj);
279elseif (auto *ELFObj = dyn_cast<object::ELFObjectFileBase>(Obj->get()))
280returngetELFObjectFileSymbolInfo(ES, *ELFObj);
281elseif (auto *COFFObj = dyn_cast<object::COFFObjectFile>(Obj->get()))
282returngetCOFFObjectFileSymbolInfo(ES, *COFFObj);
283
284returngetGenericObjectFileSymbolInfo(ES, **Obj);
285}
286
287}// End namespace orc.
288}// End namespace llvm.
Name
std::string Name
Definition:ELFObjHandler.cpp:77
ELFObjectFile.h
Sym
Symbol * Sym
Definition:ELF_riscv.cpp:479
I
#define I(x, y, z)
Definition:MD5.cpp:58
ObjectFileInterface.h
ObjectFile.h
ObjectFormats.h
COFF.h
MachO.h
assert
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
llvm::Expected
Tagged union holding either a T or a Error.
Definition:Error.h:481
llvm::Expected::takeError
Error takeError()
Take ownership of the stored error.
Definition:Error.h:608
llvm::JITSymbolFlags
Flags for symbols in the JIT.
Definition:JITSymbol.h:74
llvm::JITSymbolFlags::fromObjectSymbol
static Expected< JITSymbolFlags > fromObjectSymbol(const object::SymbolRef &Symbol)
Construct a JITSymbolFlags value based on the flags of the given libobject symbol.
Definition:JITSymbol.cpp:69
llvm::JITSymbolFlags::Callable
@ Callable
Definition:JITSymbol.h:86
llvm::JITSymbolFlags::MaterializationSideEffectsOnly
@ MaterializationSideEffectsOnly
Definition:JITSymbol.h:87
llvm::JITSymbolFlags::Weak
@ Weak
Definition:JITSymbol.h:82
llvm::JITSymbolFlags::Exported
@ Exported
Definition:JITSymbol.h:85
llvm::MemoryBufferRef
Definition:MemoryBufferRef.h:22
llvm::StringRef
StringRef - Represent a constant reference to a string, i.e.
Definition:StringRef.h:51
llvm::object::BasicSymbolRef::SF_Global
@ SF_Global
Definition:SymbolicFile.h:111
llvm::object::BasicSymbolRef::SF_Undefined
@ SF_Undefined
Definition:SymbolicFile.h:110
llvm::object::Binary::getFileName
StringRef getFileName() const
Definition:Binary.cpp:41
llvm::object::COFFObjectFile
Definition:COFF.h:879
llvm::object::COFFObjectFile::getNumberOfSections
uint32_t getNumberOfSections() const
Definition:COFF.h:987
llvm::object::COFFObjectFile::getSection
Expected< const coff_section * > getSection(int32_t index) const
Definition:COFFObjectFile.cpp:1187
llvm::object::COFFObjectFile::getCOFFSymbol
COFFSymbolRef getCOFFSymbol(const DataRefImpl &Ref) const
Definition:COFFObjectFile.cpp:1354
llvm::object::ELFObjectFileBase
Definition:ELFObjectFile.h:57
llvm::object::ELFObjectFileBase::symbols
elf_symbol_iterator_range symbols() const
Definition:ELFObjectFile.h:261
llvm::object::MachOObjectFile
Definition:MachO.h:406
llvm::object::MachOObjectFile::getSectionType
unsigned getSectionType(SectionRef Sec) const
Definition:MachOObjectFile.cpp:1789
llvm::object::MachOObjectFile::getSectionFinalSegmentName
StringRef getSectionFinalSegmentName(DataRefImpl Sec) const
Definition:MachOObjectFile.cpp:4519
llvm::object::MachOObjectFile::getSectionName
Expected< StringRef > getSectionName(DataRefImpl Sec) const override
Definition:MachOObjectFile.cpp:1936
llvm::object::ObjectFile
This class is the base class for all object file types.
Definition:ObjectFile.h:229
llvm::object::ObjectFile::sections
section_iterator_range sections() const
Definition:ObjectFile.h:329
llvm::object::ObjectFile::createObjectFile
static Expected< OwningBinary< ObjectFile > > createObjectFile(StringRef ObjectPath)
Definition:ObjectFile.cpp:209
llvm::object::ObjectFile::symbols
symbol_iterator_range symbols() const
Definition:ObjectFile.h:321
llvm::object::SymbolRef::ST_File
@ ST_File
Definition:ObjectFile.h:177
llvm::orc::ExecutionSession
An ExecutionSession represents a running JIT program.
Definition:Core.h:1340
llvm::orc::ExecutionSession::intern
SymbolStringPtr intern(StringRef SymName)
Add a symbol name to the SymbolStringPool and return a pointer to it.
Definition:Core.h:1394
llvm::orc::SymbolStringPtr
Pointer to a pooled string representing a symbol name.
Definition:SymbolStringPool.h:140
llvm::raw_string_ostream
A raw_ostream that writes to an std::string.
Definition:raw_ostream.h:661
llvm::COFF::IMAGE_SCN_LNK_COMDAT
@ IMAGE_SCN_LNK_COMDAT
Definition:COFF.h:308
llvm::COFF::IMAGE_COMDAT_SELECT_NODUPLICATES
@ IMAGE_COMDAT_SELECT_NODUPLICATES
Definition:COFF.h:454
llvm::COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE
@ IMAGE_COMDAT_SELECT_ASSOCIATIVE
Definition:COFF.h:458
llvm::COFF::isReservedSectionNumber
bool isReservedSectionNumber(int32_t SectionNumber)
Definition:COFF.h:848
llvm::ELF::STB_GNU_UNIQUE
@ STB_GNU_UNIQUE
Definition:ELF.h:1354
llvm::MachO::SECTION_TYPE
@ SECTION_TYPE
Definition:MachO.h:114
llvm::MachO::S_MOD_INIT_FUNC_POINTERS
@ S_MOD_INIT_FUNC_POINTERS
S_MOD_INIT_FUNC_POINTERS - Section with only function pointers for initialization.
Definition:MachO.h:147
llvm::orc::addInitSymbol
void addInitSymbol(MaterializationUnit::Interface &I, ExecutionSession &ES, StringRef ObjFileName)
Adds an initializer symbol to the given MU interface.
Definition:ObjectFileInterface.cpp:22
llvm::orc::getMachOObjectFileSymbolInfo
static Expected< MaterializationUnit::Interface > getMachOObjectFileSymbolInfo(ExecutionSession &ES, const object::MachOObjectFile &Obj)
Definition:ObjectFileInterface.cpp:38
llvm::orc::getGenericObjectFileSymbolInfo
Expected< MaterializationUnit::Interface > getGenericObjectFileSymbolInfo(ExecutionSession &ES, const object::ObjectFile &Obj)
Definition:ObjectFileInterface.cpp:231
llvm::orc::getELFObjectFileSymbolInfo
static Expected< MaterializationUnit::Interface > getELFObjectFileSymbolInfo(ExecutionSession &ES, const object::ELFObjectFileBase &Obj)
Definition:ObjectFileInterface.cpp:95
llvm::orc::isMachOInitializerSection
bool isMachOInitializerSection(StringRef SegName, StringRef SecName)
Definition:MachOObjectFormat.cpp:64
llvm::orc::getObjectFileInterface
Expected< MaterializationUnit::Interface > getObjectFileInterface(ExecutionSession &ES, MemoryBufferRef ObjBuffer)
Returns a MaterializationUnit::Interface for the object file contained in the given buffer,...
Definition:ObjectFileInterface.cpp:271
llvm::orc::isCOFFInitializerSection
bool isCOFFInitializerSection(StringRef Name)
Definition:ObjectFormats.cpp:52
llvm::orc::getCOFFObjectFileSymbolInfo
static Expected< MaterializationUnit::Interface > getCOFFObjectFileSymbolInfo(ExecutionSession &ES, const object::COFFObjectFile &Obj)
Definition:ObjectFileInterface.cpp:149
llvm::orc::isELFInitializerSection
bool isELFInitializerSection(StringRef SecName)
Definition:ObjectFormats.cpp:43
llvm::sampleprof::SecType
SecType
Definition:SampleProf.h:118
llvm
This is an optimization pass for GlobalISel generic memory operations.
Definition:AddressRanges.h:18
llvm::cantFail
void cantFail(Error Err, const char *Msg=nullptr)
Report a fatal error if Err is a failure value.
Definition:Error.h:756
llvm::orc::MaterializationUnit::Interface
Definition:MaterializationUnit.h:39

Generated on Fri Jul 18 2025 11:27:52 for LLVM by doxygen 1.9.6
[8]ページ先頭

©2009-2025 Movatter.jp