Skip to content

Commit ae73f3f

Browse files
committed
[ORC] Add a MaterializationUnit::Interface struct.
MaterializationUnit::Interface holds the values that make up the interface (for ORC's purposes) of a materialization unit: the symbol flags map and initializer symbol. Having a type for this will make functions that build materializer interfaces more readable and maintainable.
1 parent c16c99a commit ae73f3f

File tree

17 files changed

+102
-104
lines changed

17 files changed

+102
-104
lines changed

llvm/examples/Kaleidoscope/BuildingAJIT/Chapter4/KaleidoscopeJIT.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -102,12 +102,12 @@ class KaleidoscopeASTLayer {
102102
BaseLayer.emit(std::move(MR), irgenAndTakeOwnership(*F, ""));
103103
}
104104

105-
SymbolFlagsMap getInterface(FunctionAST &F) {
105+
MaterializationUnit::Interface getInterface(FunctionAST &F) {
106106
MangleAndInterner Mangle(BaseLayer.getExecutionSession(), DL);
107107
SymbolFlagsMap Symbols;
108108
Symbols[Mangle(F.getName())] =
109109
JITSymbolFlags(JITSymbolFlags::Exported | JITSymbolFlags::Callable);
110-
return Symbols;
110+
return MaterializationUnit::Interface(std::move(Symbols), nullptr);
111111
}
112112

113113
private:
@@ -117,7 +117,7 @@ class KaleidoscopeASTLayer {
117117

118118
KaleidoscopeASTMaterializationUnit::KaleidoscopeASTMaterializationUnit(
119119
KaleidoscopeASTLayer &L, std::unique_ptr<FunctionAST> F)
120-
: MaterializationUnit(L.getInterface(*F), nullptr), L(L), F(std::move(F)) {}
120+
: MaterializationUnit(L.getInterface(*F)), L(L), F(std::move(F)) {}
121121

122122
void KaleidoscopeASTMaterializationUnit::materialize(
123123
std::unique_ptr<MaterializationResponsibility> R) {

llvm/include/llvm/ExecutionEngine/Orc/Core.h

+18-9
Original file line numberDiff line numberDiff line change
@@ -670,14 +670,22 @@ class MaterializationUnit {
670670
public:
671671
static char ID;
672672

673-
MaterializationUnit(SymbolFlagsMap InitalSymbolFlags,
674-
SymbolStringPtr InitSymbol)
675-
: SymbolFlags(std::move(InitalSymbolFlags)),
676-
InitSymbol(std::move(InitSymbol)) {
677-
assert((!this->InitSymbol || this->SymbolFlags.count(this->InitSymbol)) &&
678-
"If set, InitSymbol should appear in InitialSymbolFlags map");
679-
}
673+
struct Interface {
674+
Interface() = default;
675+
Interface(SymbolFlagsMap InitalSymbolFlags, SymbolStringPtr InitSymbol)
676+
: SymbolFlags(std::move(InitalSymbolFlags)),
677+
InitSymbol(std::move(InitSymbol)) {
678+
assert((!this->InitSymbol || this->SymbolFlags.count(this->InitSymbol)) &&
679+
"If set, InitSymbol should appear in InitialSymbolFlags map");
680+
}
681+
682+
SymbolFlagsMap SymbolFlags;
683+
SymbolStringPtr InitSymbol;
684+
};
680685

686+
MaterializationUnit(Interface I)
687+
: SymbolFlags(std::move(I.SymbolFlags)),
688+
InitSymbol(std::move(I.InitSymbol)) {}
681689
virtual ~MaterializationUnit() {}
682690

683691
/// Return the name of this materialization unit. Useful for debugging
@@ -730,7 +738,7 @@ class AbsoluteSymbolsMaterializationUnit : public MaterializationUnit {
730738
private:
731739
void materialize(std::unique_ptr<MaterializationResponsibility> R) override;
732740
void discard(const JITDylib &JD, const SymbolStringPtr &Name) override;
733-
static SymbolFlagsMap extractFlags(const SymbolMap &Symbols);
741+
static MaterializationUnit::Interface extractFlags(const SymbolMap &Symbols);
734742

735743
SymbolMap Symbols;
736744
};
@@ -772,7 +780,8 @@ class ReExportsMaterializationUnit : public MaterializationUnit {
772780
private:
773781
void materialize(std::unique_ptr<MaterializationResponsibility> R) override;
774782
void discard(const JITDylib &JD, const SymbolStringPtr &Name) override;
775-
static SymbolFlagsMap extractFlags(const SymbolAliasMap &Aliases);
783+
static MaterializationUnit::Interface
784+
extractFlags(const SymbolAliasMap &Aliases);
776785

777786
JITDylib *SourceJD = nullptr;
778787
JITDylibLookupFlags SourceJDLookupFlags;

llvm/include/llvm/ExecutionEngine/Orc/Layer.h

+2-4
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,7 @@ class IRMaterializationUnit : public MaterializationUnit {
4343
/// entries for each definition in M.
4444
/// This constructor is useful for delegating work from one
4545
/// IRMaterializationUnit to another.
46-
IRMaterializationUnit(ThreadSafeModule TSM, SymbolFlagsMap SymbolFlags,
47-
SymbolStringPtr InitSymbol,
46+
IRMaterializationUnit(ThreadSafeModule TSM, Interface I,
4847
SymbolNameToDefinitionMap SymbolToDefinition);
4948

5049
/// Return the ModuleIdentifier as the name for this MaterializationUnit.
@@ -166,8 +165,7 @@ class BasicObjectLayerMaterializationUnit : public MaterializationUnit {
166165

167166
BasicObjectLayerMaterializationUnit(ObjectLayer &L,
168167
std::unique_ptr<MemoryBuffer> O,
169-
SymbolFlagsMap SymbolFlags,
170-
SymbolStringPtr InitSymbol);
168+
Interface I);
171169

172170
/// Return the buffer's identifier as the name for this MaterializationUnit.
173171
StringRef getName() const override;

llvm/include/llvm/ExecutionEngine/Orc/LazyReexports.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,8 @@ class LazyReexportsMaterializationUnit : public MaterializationUnit {
151151
private:
152152
void materialize(std::unique_ptr<MaterializationResponsibility> R) override;
153153
void discard(const JITDylib &JD, const SymbolStringPtr &Name) override;
154-
static SymbolFlagsMap extractFlags(const SymbolAliasMap &Aliases);
154+
static MaterializationUnit::Interface
155+
extractFlags(const SymbolAliasMap &Aliases);
155156

156157
LazyCallThroughManager &LCTManager;
157158
IndirectStubsManager &ISManager;

llvm/include/llvm/ExecutionEngine/Orc/Mangling.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ class IRSymbolMapper {
5757

5858
/// Returns a SymbolFlagsMap for the object file represented by the given
5959
/// buffer, or an error if the buffer does not contain a valid object file.
60-
Expected<std::pair<SymbolFlagsMap, SymbolStringPtr>>
61-
getObjectSymbolInfo(ExecutionSession &ES, MemoryBufferRef ObjBuffer);
60+
Expected<MaterializationUnit::Interface>
61+
getObjectInterface(ExecutionSession &ES, MemoryBufferRef ObjBuffer);
6262

6363
} // End namespace orc
6464
} // End namespace llvm

llvm/lib/ExecutionEngine/Orc/CompileOnDemandLayer.cpp

+6-5
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,10 @@ class PartitioningIRMaterializationUnit : public IRMaterializationUnit {
7878
: IRMaterializationUnit(ES, MO, std::move(TSM)), Parent(Parent) {}
7979

8080
PartitioningIRMaterializationUnit(
81-
ThreadSafeModule TSM, SymbolFlagsMap SymbolFlags,
82-
SymbolStringPtr InitSymbol, SymbolNameToDefinitionMap SymbolToDefinition,
81+
ThreadSafeModule TSM, Interface I,
82+
SymbolNameToDefinitionMap SymbolToDefinition,
8383
CompileOnDemandLayer &Parent)
84-
: IRMaterializationUnit(std::move(TSM), std::move(SymbolFlags),
85-
std::move(InitSymbol),
84+
: IRMaterializationUnit(std::move(TSM), std::move(I),
8685
std::move(SymbolToDefinition)),
8786
Parent(Parent) {}
8887

@@ -298,7 +297,9 @@ void CompileOnDemandLayer::emitPartition(
298297
if (GVsToExtract->empty()) {
299298
if (auto Err =
300299
R->replace(std::make_unique<PartitioningIRMaterializationUnit>(
301-
std::move(TSM), R->getSymbols(), R->getInitializerSymbol(),
300+
std::move(TSM),
301+
MaterializationUnit::Interface(R->getSymbols(),
302+
R->getInitializerSymbol()),
302303
std::move(Defs), *this))) {
303304
getExecutionSession().reportError(std::move(Err));
304305
R->failMaterialization();

llvm/lib/ExecutionEngine/Orc/Core.cpp

+6-7
Original file line numberDiff line numberDiff line change
@@ -243,8 +243,7 @@ void AsynchronousSymbolQuery::detach() {
243243

244244
AbsoluteSymbolsMaterializationUnit::AbsoluteSymbolsMaterializationUnit(
245245
SymbolMap Symbols)
246-
: MaterializationUnit(extractFlags(Symbols), nullptr),
247-
Symbols(std::move(Symbols)) {}
246+
: MaterializationUnit(extractFlags(Symbols)), Symbols(std::move(Symbols)) {}
248247

249248
StringRef AbsoluteSymbolsMaterializationUnit::getName() const {
250249
return "<Absolute Symbols>";
@@ -263,18 +262,18 @@ void AbsoluteSymbolsMaterializationUnit::discard(const JITDylib &JD,
263262
Symbols.erase(Name);
264263
}
265264

266-
SymbolFlagsMap
265+
MaterializationUnit::Interface
267266
AbsoluteSymbolsMaterializationUnit::extractFlags(const SymbolMap &Symbols) {
268267
SymbolFlagsMap Flags;
269268
for (const auto &KV : Symbols)
270269
Flags[KV.first] = KV.second.getFlags();
271-
return Flags;
270+
return MaterializationUnit::Interface(std::move(Flags), nullptr);
272271
}
273272

274273
ReExportsMaterializationUnit::ReExportsMaterializationUnit(
275274
JITDylib *SourceJD, JITDylibLookupFlags SourceJDLookupFlags,
276275
SymbolAliasMap Aliases)
277-
: MaterializationUnit(extractFlags(Aliases), nullptr), SourceJD(SourceJD),
276+
: MaterializationUnit(extractFlags(Aliases)), SourceJD(SourceJD),
278277
SourceJDLookupFlags(SourceJDLookupFlags), Aliases(std::move(Aliases)) {}
279278

280279
StringRef ReExportsMaterializationUnit::getName() const {
@@ -456,13 +455,13 @@ void ReExportsMaterializationUnit::discard(const JITDylib &JD,
456455
Aliases.erase(Name);
457456
}
458457

459-
SymbolFlagsMap
458+
MaterializationUnit::Interface
460459
ReExportsMaterializationUnit::extractFlags(const SymbolAliasMap &Aliases) {
461460
SymbolFlagsMap SymbolFlags;
462461
for (auto &KV : Aliases)
463462
SymbolFlags[KV.first] = KV.second.AliasFlags;
464463

465-
return SymbolFlags;
464+
return MaterializationUnit::Interface(std::move(SymbolFlags), nullptr);
466465
}
467466

468467
Expected<SymbolAliasMap> buildSimpleReexportsAliasMap(JITDylib &SourceJD,

llvm/lib/ExecutionEngine/Orc/ELFNixPlatform.cpp

+7-6
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ class DSOHandleMaterializationUnit : public MaterializationUnit {
2828
public:
2929
DSOHandleMaterializationUnit(ELFNixPlatform &ENP,
3030
const SymbolStringPtr &DSOHandleSymbol)
31-
: MaterializationUnit(createDSOHandleSectionSymbols(ENP, DSOHandleSymbol),
32-
DSOHandleSymbol),
31+
: MaterializationUnit(
32+
createDSOHandleSectionInterface(ENP, DSOHandleSymbol)),
3333
ENP(ENP) {}
3434

3535
StringRef getName() const override { return "DSOHandleMU"; }
@@ -70,12 +70,13 @@ class DSOHandleMaterializationUnit : public MaterializationUnit {
7070
void discard(const JITDylib &JD, const SymbolStringPtr &Sym) override {}
7171

7272
private:
73-
static SymbolFlagsMap
74-
createDSOHandleSectionSymbols(ELFNixPlatform &ENP,
75-
const SymbolStringPtr &DSOHandleSymbol) {
73+
static MaterializationUnit::Interface
74+
createDSOHandleSectionInterface(ELFNixPlatform &ENP,
75+
const SymbolStringPtr &DSOHandleSymbol) {
7676
SymbolFlagsMap SymbolFlags;
7777
SymbolFlags[DSOHandleSymbol] = JITSymbolFlags::Exported;
78-
return SymbolFlags;
78+
return MaterializationUnit::Interface(std::move(SymbolFlags),
79+
DSOHandleSymbol);
7980
}
8081

8182
ArrayRef<char> getDSOHandleContent(size_t PointerSize) {

llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ class CompileCallbackMaterializationUnit : public orc::MaterializationUnit {
3131

3232
CompileCallbackMaterializationUnit(SymbolStringPtr Name,
3333
CompileFunction Compile)
34-
: MaterializationUnit(SymbolFlagsMap({{Name, JITSymbolFlags::Exported}}),
35-
nullptr),
34+
: MaterializationUnit(Interface(
35+
SymbolFlagsMap({{Name, JITSymbolFlags::Exported}}), nullptr)),
3636
Name(std::move(Name)), Compile(std::move(Compile)) {}
3737

3838
StringRef getName() const override { return "<Compile Callbacks>"; }

llvm/lib/ExecutionEngine/Orc/Layer.cpp

+13-18
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ Error IRLayer::add(ResourceTrackerSP RT, ThreadSafeModule TSM) {
3333
IRMaterializationUnit::IRMaterializationUnit(
3434
ExecutionSession &ES, const IRSymbolMapper::ManglingOptions &MO,
3535
ThreadSafeModule TSM)
36-
: MaterializationUnit(SymbolFlagsMap(), nullptr), TSM(std::move(TSM)) {
36+
: MaterializationUnit(Interface()), TSM(std::move(TSM)) {
3737

3838
assert(this->TSM && "Module must not be null");
3939

@@ -98,10 +98,10 @@ IRMaterializationUnit::IRMaterializationUnit(
9898
}
9999

100100
IRMaterializationUnit::IRMaterializationUnit(
101-
ThreadSafeModule TSM, SymbolFlagsMap SymbolFlags,
102-
SymbolStringPtr InitSymbol, SymbolNameToDefinitionMap SymbolToDefinition)
103-
: MaterializationUnit(std::move(SymbolFlags), std::move(InitSymbol)),
104-
TSM(std::move(TSM)), SymbolToDefinition(std::move(SymbolToDefinition)) {}
101+
ThreadSafeModule TSM, Interface I,
102+
SymbolNameToDefinitionMap SymbolToDefinition)
103+
: MaterializationUnit(std::move(I)), TSM(std::move(TSM)),
104+
SymbolToDefinition(std::move(SymbolToDefinition)) {}
105105

106106
StringRef IRMaterializationUnit::getName() const {
107107
if (TSM)
@@ -173,25 +173,20 @@ Error ObjectLayer::add(ResourceTrackerSP RT, std::unique_ptr<MemoryBuffer> O) {
173173
Expected<std::unique_ptr<BasicObjectLayerMaterializationUnit>>
174174
BasicObjectLayerMaterializationUnit::Create(ObjectLayer &L,
175175
std::unique_ptr<MemoryBuffer> O) {
176-
auto ObjSymInfo =
177-
getObjectSymbolInfo(L.getExecutionSession(), O->getMemBufferRef());
176+
auto ObjInterface =
177+
getObjectInterface(L.getExecutionSession(), O->getMemBufferRef());
178178

179-
if (!ObjSymInfo)
180-
return ObjSymInfo.takeError();
181-
182-
auto &SymbolFlags = ObjSymInfo->first;
183-
auto &InitSymbol = ObjSymInfo->second;
179+
if (!ObjInterface)
180+
return ObjInterface.takeError();
184181

185182
return std::unique_ptr<BasicObjectLayerMaterializationUnit>(
186-
new BasicObjectLayerMaterializationUnit(
187-
L, std::move(O), std::move(SymbolFlags), std::move(InitSymbol)));
183+
new BasicObjectLayerMaterializationUnit(L, std::move(O),
184+
std::move(*ObjInterface)));
188185
}
189186

190187
BasicObjectLayerMaterializationUnit::BasicObjectLayerMaterializationUnit(
191-
ObjectLayer &L, std::unique_ptr<MemoryBuffer> O, SymbolFlagsMap SymbolFlags,
192-
SymbolStringPtr InitSymbol)
193-
: MaterializationUnit(std::move(SymbolFlags), std::move(InitSymbol)), L(L),
194-
O(std::move(O)) {}
188+
ObjectLayer &L, std::unique_ptr<MemoryBuffer> O, Interface I)
189+
: MaterializationUnit(std::move(I)), L(L), O(std::move(O)) {}
195190

196191
StringRef BasicObjectLayerMaterializationUnit::getName() const {
197192
if (O)

llvm/lib/ExecutionEngine/Orc/LazyReexports.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ createLocalLazyCallThroughManager(const Triple &T, ExecutionSession &ES,
144144
LazyReexportsMaterializationUnit::LazyReexportsMaterializationUnit(
145145
LazyCallThroughManager &LCTManager, IndirectStubsManager &ISManager,
146146
JITDylib &SourceJD, SymbolAliasMap CallableAliases, ImplSymbolMap *SrcJDLoc)
147-
: MaterializationUnit(extractFlags(CallableAliases), nullptr),
147+
: MaterializationUnit(extractFlags(CallableAliases)),
148148
LCTManager(LCTManager), ISManager(ISManager), SourceJD(SourceJD),
149149
CallableAliases(std::move(CallableAliases)), AliaseeTable(SrcJDLoc) {}
150150

@@ -219,15 +219,15 @@ void LazyReexportsMaterializationUnit::discard(const JITDylib &JD,
219219
CallableAliases.erase(Name);
220220
}
221221

222-
SymbolFlagsMap
222+
MaterializationUnit::Interface
223223
LazyReexportsMaterializationUnit::extractFlags(const SymbolAliasMap &Aliases) {
224224
SymbolFlagsMap SymbolFlags;
225225
for (auto &KV : Aliases) {
226226
assert(KV.second.AliasFlags.isCallable() &&
227227
"Lazy re-exports must be callable symbols");
228228
SymbolFlags[KV.first] = KV.second.AliasFlags;
229229
}
230-
return SymbolFlags;
230+
return MaterializationUnit::Interface(std::move(SymbolFlags), nullptr);
231231
}
232232

233233
} // End namespace orc.

llvm/lib/ExecutionEngine/Orc/MachOPlatform.cpp

+6-6
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,7 @@ class MachOHeaderMaterializationUnit : public MaterializationUnit {
2828
public:
2929
MachOHeaderMaterializationUnit(MachOPlatform &MOP,
3030
const SymbolStringPtr &HeaderStartSymbol)
31-
: MaterializationUnit(createHeaderSymbols(MOP, HeaderStartSymbol),
32-
HeaderStartSymbol),
31+
: MaterializationUnit(createHeaderInterface(MOP, HeaderStartSymbol)),
3332
MOP(MOP) {}
3433

3534
StringRef getName() const override { return "MachOHeaderMU"; }
@@ -110,17 +109,18 @@ class MachOHeaderMaterializationUnit : public MaterializationUnit {
110109
return G.createContentBlock(HeaderSection, HeaderContent, 0, 8, 0);
111110
}
112111

113-
static SymbolFlagsMap
114-
createHeaderSymbols(MachOPlatform &MOP,
115-
const SymbolStringPtr &HeaderStartSymbol) {
112+
static MaterializationUnit::Interface
113+
createHeaderInterface(MachOPlatform &MOP,
114+
const SymbolStringPtr &HeaderStartSymbol) {
116115
SymbolFlagsMap HeaderSymbolFlags;
117116

118117
HeaderSymbolFlags[HeaderStartSymbol] = JITSymbolFlags::Exported;
119118
for (auto &HS : AdditionalHeaderSymbols)
120119
HeaderSymbolFlags[MOP.getExecutionSession().intern(HS.Name)] =
121120
JITSymbolFlags::Exported;
122121

123-
return HeaderSymbolFlags;
122+
return MaterializationUnit::Interface(std::move(HeaderSymbolFlags),
123+
HeaderStartSymbol);
124124
}
125125

126126
MachOPlatform &MOP;

llvm/lib/ExecutionEngine/Orc/Mangling.cpp

+10-8
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ static SymbolStringPtr addInitSymbol(SymbolFlagsMap &SymbolFlags,
102102
return InitSymbol;
103103
}
104104

105-
static Expected<std::pair<SymbolFlagsMap, SymbolStringPtr>>
105+
static Expected<MaterializationUnit::Interface>
106106
getMachOObjectFileSymbolInfo(ExecutionSession &ES,
107107
const object::MachOObjectFile &Obj) {
108108
SymbolFlagsMap SymbolFlags;
@@ -158,10 +158,11 @@ getMachOObjectFileSymbolInfo(ExecutionSession &ES,
158158
}
159159
}
160160

161-
return std::make_pair(std::move(SymbolFlags), std::move(InitSymbol));
161+
return MaterializationUnit::Interface(std::move(SymbolFlags),
162+
std::move(InitSymbol));
162163
}
163164

164-
static Expected<std::pair<SymbolFlagsMap, SymbolStringPtr>>
165+
static Expected<MaterializationUnit::Interface>
165166
getELFObjectFileSymbolInfo(ExecutionSession &ES,
166167
const object::ELFObjectFileBase &Obj) {
167168
SymbolFlagsMap SymbolFlags;
@@ -211,10 +212,11 @@ getELFObjectFileSymbolInfo(ExecutionSession &ES,
211212
}
212213
}
213214

214-
return std::make_pair(std::move(SymbolFlags), InitSymbol);
215+
return MaterializationUnit::Interface(std::move(SymbolFlags),
216+
std::move(InitSymbol));
215217
}
216218

217-
Expected<std::pair<SymbolFlagsMap, SymbolStringPtr>>
219+
Expected<MaterializationUnit::Interface>
218220
getGenericObjectFileSymbolInfo(ExecutionSession &ES,
219221
const object::ObjectFile &Obj) {
220222
SymbolFlagsMap SymbolFlags;
@@ -250,11 +252,11 @@ getGenericObjectFileSymbolInfo(ExecutionSession &ES,
250252
SymbolFlags[InternedName] = std::move(*SymFlags);
251253
}
252254

253-
return std::make_pair(std::move(SymbolFlags), nullptr);
255+
return MaterializationUnit::Interface(std::move(SymbolFlags), nullptr);
254256
}
255257

256-
Expected<std::pair<SymbolFlagsMap, SymbolStringPtr>>
257-
getObjectSymbolInfo(ExecutionSession &ES, MemoryBufferRef ObjBuffer) {
258+
Expected<MaterializationUnit::Interface>
259+
getObjectInterface(ExecutionSession &ES, MemoryBufferRef ObjBuffer) {
258260
auto Obj = object::ObjectFile::createObjectFile(ObjBuffer);
259261

260262
if (!Obj)

0 commit comments

Comments
 (0)