94 std::unique_ptr<DefinitionGenerator> OrcRuntime,
95 std::optional<SymbolAliasMap> RuntimeAliases = std::nullopt);
100 const char *OrcRuntimePath,
101 std::optional<SymbolAliasMap> RuntimeAliases = std::nullopt);
123 standardRuntimeUtilityAliases();
128 standardLazyCompilationAliases();
132 struct BootstrapInfo {
134 std::condition_variable CV;
135 size_t ActiveGraphs = 0;
139 void addArgumentsToRTFnMap(
143 std::lock_guard<std::mutex> Lock(
Mutex);
144 auto &argList = DeferredRTFnMap[std::make_pair(func1, func2)];
145 argList.emplace_back(arg1, arg2);
152 class LLVM_ABI ELFNixPlatformPlugin :
public ObjectLinkingLayer::Plugin {
154 ELFNixPlatformPlugin(ELFNixPlatform &MP) : MP(MP) {}
156 void modifyPassConfig(MaterializationResponsibility &MR,
157 jitlink::LinkGraph &
G,
158 jitlink::PassConfiguration &Config)
override;
162 Error notifyFailed(MaterializationResponsibility &MR)
override {
163 return Error::success();
166 Error notifyRemovingResources(JITDylib &JD, ResourceKey K)
override {
167 return Error::success();
170 void notifyTransferringResources(JITDylib &JD, ResourceKey DstKey,
171 ResourceKey SrcKey)
override {}
174 Error bootstrapPipelineStart(jitlink::LinkGraph &
G);
175 Error bootstrapPipelineRecordRuntimeFunctions(jitlink::LinkGraph &
G);
176 Error bootstrapPipelineEnd(jitlink::LinkGraph &
G);
178 void addDSOHandleSupportPasses(MaterializationResponsibility &MR,
179 jitlink::PassConfiguration &Config);
181 void addEHAndTLVSupportPasses(MaterializationResponsibility &MR,
182 jitlink::PassConfiguration &Config,
183 bool IsBootstrapping);
185 Error preserveInitSections(jitlink::LinkGraph &
G,
186 MaterializationResponsibility &MR);
188 Error registerInitSections(jitlink::LinkGraph &
G, JITDylib &JD,
189 bool IsBootstrapping);
191 Error registerFiniSections(jitlink::LinkGraph &
G, JITDylib &JD,
192 bool IsBootstrapping);
194 Error fixTLVSectionsAndEdges(jitlink::LinkGraph &
G, JITDylib &JD);
196 std::mutex PluginMutex;
200 using PushInitializersSendResultFn =
201 unique_function<void(Expected<ELFNixJITDylibDepInfoMap>)>;
203 using SendSymbolAddressFn = unique_function<void(Expected<ExecutorAddr>)>;
205 static bool supportedTarget(
const Triple &TT);
207 ELFNixPlatform(ObjectLinkingLayer &ObjLinkingLayer, JITDylib &PlatformJD,
208 std::unique_ptr<DefinitionGenerator> OrcRuntimeGenerator,
212 Error associateRuntimeSupportFunctions(JITDylib &PlatformJD);
214 void pushInitializersLoop(PushInitializersSendResultFn SendResult,
217 void rt_recordInitializers(PushInitializersSendResultFn SendResult,
218 ExecutorAddr JDHeader);
220 void rt_lookupSymbol(SendSymbolAddressFn SendResult, ExecutorAddr Handle,
221 StringRef SymbolName);
223 Error registerPerObjectSections(jitlink::LinkGraph &
G,
224 const ELFPerObjectSectionsToRegister &POSR,
225 bool IsBootstrapping);
227 Expected<uint64_t> createPThreadKey();
229 ExecutionSession &ES;
230 JITDylib &PlatformJD;
231 ObjectLinkingLayer &ObjLinkingLayer;
233 SymbolStringPtr DSOHandleSymbol;
236 ES.intern(
"__orc_rt_elfnix_platform_bootstrap")};
238 ES.intern(
"__orc_rt_elfnix_platform_shutdown")};
240 ES.intern(
"__orc_rt_elfnix_register_jitdylib")};
242 ES.intern(
"__orc_rt_elfnix_deregister_jitdylib")};
244 ES.intern(
"__orc_rt_elfnix_register_object_sections")};
246 ES.intern(
"__orc_rt_elfnix_deregister_object_sections")};
248 ES.intern(
"__orc_rt_elfnix_register_init_sections")};
250 ES.intern(
"__orc_rt_elfnix_deregister_init_sections")};
252 ES.intern(
"__orc_rt_elfnix_register_fini_sections")};
254 ES.intern(
"__orc_rt_elfnix_deregister_fini_sections")};
256 ES.intern(
"__orc_rt_elfnix_create_pthread_key")};
258 DenseMap<JITDylib *, SymbolLookupSet> RegisteredInitSymbols;
262 std::mutex PlatformMutex;
263 std::vector<ELFPerObjectSectionsToRegister> BootstrapPOSRs;
265 DenseMap<ExecutorAddr, JITDylib *> HandleAddrToJITDylib;
266 DenseMap<JITDylib *, ExecutorAddr> JITDylibToHandleAddr;
267 DenseMap<JITDylib *, uint64_t> JITDylibToPThreadKey;
269 std::atomic<BootstrapInfo *> Bootstrap;