@@ -89,6 +89,11 @@ class SPSSerializationTraits<SPSMachOExecutorSymbolFlags,
89
89
90
90
namespace {
91
91
92
+ using SPSRegisterSymbolsArgs =
93
+ SPSArgList<SPSExecutorAddr,
94
+ SPSSequence<SPSTuple<SPSExecutorAddr, SPSExecutorAddr,
95
+ SPSMachOExecutorSymbolFlags>>>;
96
+
92
97
std::unique_ptr<jitlink::LinkGraph> createPlatformGraph (MachOPlatform &MOP,
93
98
std::string Name) {
94
99
unsigned PointerSize;
@@ -208,24 +213,28 @@ constexpr MachOHeaderMaterializationUnit::HeaderSymbol
208
213
class MachOPlatformCompleteBootstrapMaterializationUnit
209
214
: public MaterializationUnit {
210
215
public:
216
+ using SymbolTableVector =
217
+ SmallVector<std::tuple<ExecutorAddr, ExecutorAddr,
218
+ MachOPlatform::MachOExecutorSymbolFlags>>;
219
+
211
220
MachOPlatformCompleteBootstrapMaterializationUnit (
212
221
MachOPlatform &MOP, StringRef PlatformJDName,
213
- SymbolStringPtr CompleteBootstrapSymbol, shared::AllocActions DeferredAAs,
222
+ SymbolStringPtr CompleteBootstrapSymbol, SymbolTableVector SymTab,
223
+ shared::AllocActions DeferredAAs, ExecutorAddr MachOHeaderAddr,
214
224
ExecutorAddr PlatformBootstrap, ExecutorAddr PlatformShutdown,
215
225
ExecutorAddr RegisterJITDylib, ExecutorAddr DeregisterJITDylib,
216
226
ExecutorAddr RegisterObjectSymbolTable,
217
- ExecutorAddr DeregisterObjectSymbolTable, ExecutorAddr MachOHeaderAddr )
227
+ ExecutorAddr DeregisterObjectSymbolTable)
218
228
: MaterializationUnit(
219
229
{{{CompleteBootstrapSymbol, JITSymbolFlags::None}}, nullptr }),
220
230
MOP (MOP), PlatformJDName(PlatformJDName),
221
231
CompleteBootstrapSymbol (std::move(CompleteBootstrapSymbol)),
222
- DeferredAAs (std::move(DeferredAAs)),
223
- PlatformBootstrap (PlatformBootstrap),
232
+ SymTab (std::move(SymTab)), DeferredAAs(std::move(DeferredAAs)),
233
+ MachOHeaderAddr (MachOHeaderAddr), PlatformBootstrap(PlatformBootstrap),
224
234
PlatformShutdown(PlatformShutdown), RegisterJITDylib(RegisterJITDylib),
225
235
DeregisterJITDylib(DeregisterJITDylib),
226
236
RegisterObjectSymbolTable(RegisterObjectSymbolTable),
227
- DeregisterObjectSymbolTable (DeregisterObjectSymbolTable),
228
- MachOHeaderAddr (MachOHeaderAddr) {}
237
+ DeregisterObjectSymbolTable(DeregisterObjectSymbolTable) {}
229
238
230
239
StringRef getName () const override {
231
240
return " MachOPlatformCompleteBootstrap" ;
@@ -242,7 +251,7 @@ class MachOPlatformCompleteBootstrapMaterializationUnit
242
251
Linkage::Strong, Scope::Hidden, false , true );
243
252
244
253
// Reserve space for the stolen actions, plus two extras.
245
- G->allocActions ().reserve (DeferredAAs.size () + 2 );
254
+ G->allocActions ().reserve (DeferredAAs.size () + 3 );
246
255
247
256
// 1. Bootstrap the platform support code.
248
257
G->allocActions ().push_back (
@@ -258,7 +267,14 @@ class MachOPlatformCompleteBootstrapMaterializationUnit
258
267
cantFail (WrapperFunctionCall::Create<SPSArgList<SPSExecutorAddr>>(
259
268
DeregisterJITDylib, MachOHeaderAddr))});
260
269
261
- // 3. Add the deferred actions to the graph.
270
+ // 3. Register deferred symbols.
271
+ G->allocActions ().push_back (
272
+ {cantFail (WrapperFunctionCall::Create<SPSRegisterSymbolsArgs>(
273
+ RegisterObjectSymbolTable, MachOHeaderAddr, SymTab)),
274
+ cantFail (WrapperFunctionCall::Create<SPSRegisterSymbolsArgs>(
275
+ DeregisterObjectSymbolTable, MachOHeaderAddr, SymTab))});
276
+
277
+ // 4. Add the deferred actions to the graph.
262
278
std::move (DeferredAAs.begin (), DeferredAAs.end (),
263
279
std::back_inserter (G->allocActions ()));
264
280
@@ -271,14 +287,15 @@ class MachOPlatformCompleteBootstrapMaterializationUnit
271
287
MachOPlatform &MOP;
272
288
StringRef PlatformJDName;
273
289
SymbolStringPtr CompleteBootstrapSymbol;
290
+ SymbolTableVector SymTab;
274
291
shared::AllocActions DeferredAAs;
292
+ ExecutorAddr MachOHeaderAddr;
275
293
ExecutorAddr PlatformBootstrap;
276
294
ExecutorAddr PlatformShutdown;
277
295
ExecutorAddr RegisterJITDylib;
278
296
ExecutorAddr DeregisterJITDylib;
279
297
ExecutorAddr RegisterObjectSymbolTable;
280
298
ExecutorAddr DeregisterObjectSymbolTable;
281
- ExecutorAddr MachOHeaderAddr;
282
299
};
283
300
284
301
static StringRef ObjCRuntimeObjectSectionsData[] = {
@@ -601,10 +618,11 @@ MachOPlatform::MachOPlatform(
601
618
if ((Err = PlatformJD.define (
602
619
std::make_unique<MachOPlatformCompleteBootstrapMaterializationUnit>(
603
620
*this , PlatformJD.getName (), BootstrapCompleteSymbol,
604
- std::move (BI.DeferredAAs ), PlatformBootstrap.Addr ,
621
+ std::move (BI.SymTab ), std::move (BI.DeferredAAs ),
622
+ BI.MachOHeaderAddr , PlatformBootstrap.Addr ,
605
623
PlatformShutdown.Addr , RegisterJITDylib.Addr ,
606
624
DeregisterJITDylib.Addr , RegisterObjectSymbolTable.Addr ,
607
- DeregisterObjectSymbolTable.Addr , BI. MachOHeaderAddr ))))
625
+ DeregisterObjectSymbolTable.Addr ))))
608
626
return ;
609
627
if ((Err = ES.lookup (makeJITDylibSearchOrder (
610
628
&PlatformJD, JITDylibLookupFlags::MatchAllSymbols),
@@ -1714,16 +1732,17 @@ Error MachOPlatform::MachOPlatformPlugin::addSymbolTableRegistration(
1714
1732
HeaderAddr = I->second ;
1715
1733
}
1716
1734
1717
- SmallVector<std::tuple<ExecutorAddr, ExecutorAddr, MachOExecutorSymbolFlags>>
1718
- SymTab;
1735
+ SymbolTableVector LocalSymTab;
1736
+ auto &SymTab = LLVM_LIKELY (!InBootstrapPhase) ? LocalSymTab
1737
+ : MP.Bootstrap .load ()->SymTab ;
1719
1738
for (auto &[OriginalSymbol, NameSym] : JITSymTabInfo)
1720
1739
SymTab.push_back ({NameSym->getAddress (), OriginalSymbol->getAddress (),
1721
1740
flagsForSymbol (*OriginalSymbol)});
1722
1741
1723
- using SPSRegisterSymbolsArgs =
1724
- SPSArgList<SPSExecutorAddr,
1725
- SPSSequence<SPSTuple<SPSExecutorAddr, SPSExecutorAddr,
1726
- SPSMachOExecutorSymbolFlags>>> ;
1742
+ // Bail out if we're in the bootstrap phase -- registration of thees symbols
1743
+ // will be attached to the bootstrap graph.
1744
+ if ( LLVM_UNLIKELY (InBootstrapPhase))
1745
+ return Error::success () ;
1727
1746
1728
1747
shared::AllocActions &allocActions = LLVM_LIKELY (!InBootstrapPhase)
1729
1748
? G.allocActions ()
0 commit comments