LLVM: include/llvm/ExecutionEngine/Orc/ELFNixPlatform.h Source File (original) (raw)
47 std::size_t
48 operator()(const std::pair<RuntimeFunction *, RuntimeFunction *> &key) const {
49 return std::hash<void *>()(key.first->Addr.toPtr<void *>()) ^
50 std::hash<void *>()(key.second->Addr.toPtr<void *>());
51 }
52};
55 std::size_t
56 operator()(const std::pair<RuntimeFunction *, RuntimeFunction *> &lhs,
57 const std::pair<RuntimeFunction *, RuntimeFunction *> &rhs) const {
58 return lhs.first == rhs.first && lhs.second == rhs.second;
59 }
60};
70public:
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
111 std::unique_ptr OrcRuntime,
112 std::optional RuntimeAliases = std::nullopt);
113
114
117 const char *OrcRuntimePath,
118 std::optional RuntimeAliases = std::nullopt);
119
122
128
129
130
131
134
135
137
138
140 standardRuntimeUtilityAliases();
141
142
143
145 standardLazyCompilationAliases();
146
147private:
148
149 struct BootstrapInfo {
150 std::mutex Mutex;
151 std::condition_variable CV;
152 size_t ActiveGraphs = 0;
155
156 void addArgumentsToRTFnMap(
160 std::lock_guardstd::mutex Lock(Mutex);
161 auto &argList = DeferredRTFnMap[std::make_pair(func1, func2)];
162 argList.emplace_back(arg1, arg2);
163 }
164 };
165
166
167
168
169 class LLVM_ABI ELFNixPlatformPlugin : public ObjectLinkingLayer::Plugin {
170 public:
171 ELFNixPlatformPlugin(ELFNixPlatform &MP) : MP(MP) {}
172
173 void modifyPassConfig(MaterializationResponsibility &MR,
174 jitlink::LinkGraph &G,
175 jitlink::PassConfiguration &Config) override;
176
177
178
179 Error notifyFailed(MaterializationResponsibility &MR) override {
180 return Error::success();
181 }
182
183 Error notifyRemovingResources(JITDylib &JD, ResourceKey K) override {
184 return Error::success();
185 }
186
187 void notifyTransferringResources(JITDylib &JD, ResourceKey DstKey,
188 ResourceKey SrcKey) override {}
189
190 private:
191 Error bootstrapPipelineStart(jitlink::LinkGraph &G);
192 Error bootstrapPipelineRecordRuntimeFunctions(jitlink::LinkGraph &G);
193 Error bootstrapPipelineEnd(jitlink::LinkGraph &G);
194
195 void addDSOHandleSupportPasses(MaterializationResponsibility &MR,
196 jitlink::PassConfiguration &Config);
197
198 void addEHAndTLVSupportPasses(MaterializationResponsibility &MR,
199 jitlink::PassConfiguration &Config,
200 bool IsBootstrapping);
201
202 Error preserveInitSections(jitlink::LinkGraph &G,
203 MaterializationResponsibility &MR);
204
205 Error registerInitSections(jitlink::LinkGraph &G, JITDylib &JD,
206 bool IsBootstrapping);
207
208 Error fixTLVSectionsAndEdges(jitlink::LinkGraph &G, JITDylib &JD);
209
210 std::mutex PluginMutex;
211 ELFNixPlatform &MP;
212 };
213
214 using PushInitializersSendResultFn =
215 unique_function<void(Expected)>;
216
217 using SendSymbolAddressFn = unique_function<void(Expected)>;
218
219 static bool supportedTarget(const Triple &TT);
220
221 ELFNixPlatform(ObjectLinkingLayer &ObjLinkingLayer, JITDylib &PlatformJD,
222 std::unique_ptr OrcRuntimeGenerator,
223 Error &Err);
224
225
226 Error associateRuntimeSupportFunctions(JITDylib &PlatformJD);
227
228 void pushInitializersLoop(PushInitializersSendResultFn SendResult,
229 JITDylibSP JD);
230
231 void rt_recordInitializers(PushInitializersSendResultFn SendResult,
232 ExecutorAddr JDHeader);
233
234 void rt_lookupSymbol(SendSymbolAddressFn SendResult, ExecutorAddr Handle,
235 StringRef SymbolName);
236
237 Error registerPerObjectSections(jitlink::LinkGraph &G,
238 const ELFPerObjectSectionsToRegister &POSR,
239 bool IsBootstrapping);
240
241 Expected<uint64_t> createPThreadKey();
242
243 ExecutionSession &ES;
244 JITDylib &PlatformJD;
245 ObjectLinkingLayer &ObjLinkingLayer;
246
247 SymbolStringPtr DSOHandleSymbol;
248
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")};
267
268 DenseMap<JITDylib *, SymbolLookupSet> RegisteredInitSymbols;
269
270
271
272 std::mutex PlatformMutex;
273 std::vector BootstrapPOSRs;
274
275 DenseMap<ExecutorAddr, JITDylib *> HandleAddrToJITDylib;
276 DenseMap<JITDylib *, ExecutorAddr> JITDylibToHandleAddr;
277 DenseMap<JITDylib *, uint64_t> JITDylibToPThreadKey;
278
279 std::atomic<BootstrapInfo *> Bootstrap;
280};
283
286
287template <>
290
291public:
293 return SPSELFPerObjectSectionsToRegister::AsArgList::size(
295 }
296
299 return SPSELFPerObjectSectionsToRegister::AsArgList::serialize(
301 }
302
305 return SPSELFPerObjectSectionsToRegister::AsArgList::deserialize(
307 }
308};
309
312
313}