111 std::unique_ptr<DefinitionGenerator> OrcRuntime,
112 std::optional<SymbolAliasMap> RuntimeAliases = std::nullopt);
117 const char *OrcRuntimePath,
118 std::optional<SymbolAliasMap> RuntimeAliases = std::nullopt);
140 standardRuntimeUtilityAliases();
145 standardLazyCompilationAliases();
149 struct BootstrapInfo {
151 std::condition_variable CV;
152 size_t ActiveGraphs = 0;
156 void addArgumentsToRTFnMap(
160 std::lock_guard<std::mutex> Lock(
Mutex);
161 auto &argList = DeferredRTFnMap[std::make_pair(func1, func2)];
162 argList.emplace_back(arg1, arg2);
169 class LLVM_ABI ELFNixPlatformPlugin :
public ObjectLinkingLayer::Plugin {
171 ELFNixPlatformPlugin(ELFNixPlatform &MP) : MP(MP) {}
173 void modifyPassConfig(MaterializationResponsibility &MR,
174 jitlink::LinkGraph &
G,
175 jitlink::PassConfiguration &Config)
override;
179 Error notifyFailed(MaterializationResponsibility &MR)
override {
180 return Error::success();
183 Error notifyRemovingResources(JITDylib &JD, ResourceKey K)
override {
184 return Error::success();
187 void notifyTransferringResources(JITDylib &JD, ResourceKey DstKey,
188 ResourceKey SrcKey)
override {}
191 Error bootstrapPipelineStart(jitlink::LinkGraph &
G);
192 Error bootstrapPipelineRecordRuntimeFunctions(jitlink::LinkGraph &
G);
193 Error bootstrapPipelineEnd(jitlink::LinkGraph &
G);
195 void addDSOHandleSupportPasses(MaterializationResponsibility &MR,
196 jitlink::PassConfiguration &Config);
198 void addEHAndTLVSupportPasses(MaterializationResponsibility &MR,
199 jitlink::PassConfiguration &Config,
200 bool IsBootstrapping);
202 Error preserveInitSections(jitlink::LinkGraph &
G,
203 MaterializationResponsibility &MR);
205 Error registerInitSections(jitlink::LinkGraph &
G, JITDylib &JD,
206 bool IsBootstrapping);
208 Error fixTLVSectionsAndEdges(jitlink::LinkGraph &
G, JITDylib &JD);
210 std::mutex PluginMutex;
214 using PushInitializersSendResultFn =
215 unique_function<void(Expected<ELFNixJITDylibDepInfoMap>)>;
217 using SendSymbolAddressFn = unique_function<void(Expected<ExecutorAddr>)>;
219 static bool supportedTarget(
const Triple &TT);
221 ELFNixPlatform(ObjectLinkingLayer &ObjLinkingLayer, JITDylib &PlatformJD,
222 std::unique_ptr<DefinitionGenerator> OrcRuntimeGenerator,
226 Error associateRuntimeSupportFunctions(JITDylib &PlatformJD);
228 void pushInitializersLoop(PushInitializersSendResultFn SendResult,
231 void rt_recordInitializers(PushInitializersSendResultFn SendResult,
232 ExecutorAddr JDHeader);
234 void rt_lookupSymbol(SendSymbolAddressFn SendResult, ExecutorAddr Handle,
235 StringRef SymbolName);
237 Error registerPerObjectSections(jitlink::LinkGraph &
G,
238 const ELFPerObjectSectionsToRegister &POSR,
239 bool IsBootstrapping);
241 Expected<uint64_t> createPThreadKey();
243 ExecutionSession &ES;
244 JITDylib &PlatformJD;
245 ObjectLinkingLayer &ObjLinkingLayer;
247 SymbolStringPtr DSOHandleSymbol;
250 ES.intern(
"__orc_rt_elfnix_platform_bootstrap")};
252 ES.intern(
"__orc_rt_elfnix_platform_shutdown")};
254 ES.intern(
"__orc_rt_elfnix_register_jitdylib")};
256 ES.intern(
"__orc_rt_elfnix_deregister_jitdylib")};
258 ES.intern(
"__orc_rt_elfnix_register_object_sections")};
260 ES.intern(
"__orc_rt_elfnix_deregister_object_sections")};
262 ES.intern(
"__orc_rt_elfnix_register_init_sections")};
264 ES.intern(
"__orc_rt_elfnix_deregister_init_sections")};
266 ES.intern(
"__orc_rt_elfnix_create_pthread_key")};
268 DenseMap<JITDylib *, SymbolLookupSet> RegisteredInitSymbols;
272 std::mutex PlatformMutex;
273 std::vector<ELFPerObjectSectionsToRegister> BootstrapPOSRs;
275 DenseMap<ExecutorAddr, JITDylib *> HandleAddrToJITDylib;
276 DenseMap<JITDylib *, ExecutorAddr> JITDylibToHandleAddr;
277 DenseMap<JITDylib *, uint64_t> JITDylibToPThreadKey;
279 std::atomic<BootstrapInfo *> Bootstrap;