41 std::vector<std::pair<ExecutorAddr, MachOJITDylibDepInfo>>;
72 LLVM_ABI static std::optional<BuildVersionOpts>
102 static inline std::unique_ptr<MaterializationUnit>
145 std::unique_ptr<DefinitionGenerator> OrcRuntime,
147 MachOHeaderMUBuilder BuildMachOHeaderMU = buildSimpleMachOHeaderMU,
148 std::optional<SymbolAliasMap> RuntimeAliases = std::nullopt);
153 const char *OrcRuntimePath, HeaderOptions PlatformJDOpts = {},
154 MachOHeaderMUBuilder BuildMachOHeaderMU = buildSimpleMachOHeaderMU,
155 std::optional<SymbolAliasMap> RuntimeAliases = std::nullopt);
185 standardRuntimeUtilityAliases();
190 standardLazyCompilationAliases();
194 std::tuple<ExecutorAddr, ExecutorAddr, MachOExecutorSymbolFlags>>;
197 struct BootstrapInfo {
198 std::condition_variable CV;
199 size_t ActiveGraphs = 0;
202 SymbolTableVector SymTab;
208 class LLVM_ABI MachOPlatformPlugin :
public ObjectLinkingLayer::Plugin {
210 MachOPlatformPlugin(MachOPlatform &MP) : MP(MP) {}
212 void modifyPassConfig(MaterializationResponsibility &MR,
213 jitlink::LinkGraph &
G,
214 jitlink::PassConfiguration &Config)
override;
218 Error notifyFailed(MaterializationResponsibility &MR)
override {
219 return Error::success();
222 Error notifyRemovingResources(JITDylib &JD, ResourceKey K)
override {
223 return Error::success();
226 void notifyTransferringResources(JITDylib &JD, ResourceKey DstKey,
227 ResourceKey SrcKey)
override {}
230 struct UnwindSections {
231 SmallVector<ExecutorAddrRange> CodeRanges;
232 ExecutorAddrRange DwarfSection;
233 ExecutorAddrRange CompactUnwindSection;
236 struct ObjCImageInfo {
241 bool Finalized =
false;
244 struct SymbolTablePair {
245 jitlink::Symbol *OriginalSym =
nullptr;
246 jitlink::Symbol *NameSym =
nullptr;
248 using JITSymTabVector = SmallVector<SymbolTablePair>;
250 Error bootstrapPipelineRecordRuntimeFunctions(jitlink::LinkGraph &
G);
251 Error bootstrapPipelineEnd(jitlink::LinkGraph &
G);
253 Error associateJITDylibHeaderSymbol(jitlink::LinkGraph &
G,
254 MaterializationResponsibility &MR);
256 Error preserveImportantSections(jitlink::LinkGraph &
G,
257 MaterializationResponsibility &MR);
259 Error processObjCImageInfo(jitlink::LinkGraph &
G,
260 MaterializationResponsibility &MR);
261 Error mergeImageInfoFlags(jitlink::LinkGraph &
G,
262 MaterializationResponsibility &MR,
263 ObjCImageInfo &
Info, uint32_t NewFlags);
265 Error fixTLVSectionsAndEdges(jitlink::LinkGraph &
G, JITDylib &JD);
267 std::optional<UnwindSections> findUnwindSectionInfo(jitlink::LinkGraph &
G);
268 Error registerObjectPlatformSections(jitlink::LinkGraph &
G, JITDylib &JD,
269 ExecutorAddr HeaderAddr,
270 bool InBootstrapPhase);
272 Error createObjCRuntimeObject(jitlink::LinkGraph &
G);
273 Error populateObjCRuntimeObject(jitlink::LinkGraph &
G,
274 MaterializationResponsibility &MR);
276 Error prepareSymbolTableRegistration(jitlink::LinkGraph &
G,
277 JITSymTabVector &JITSymTabInfo);
278 Error addSymbolTableRegistration(jitlink::LinkGraph &
G,
279 MaterializationResponsibility &MR,
280 JITSymTabVector &JITSymTabInfo,
281 bool InBootstrapPhase);
283 std::mutex PluginMutex;
288 DenseMap<JITDylib *, ObjCImageInfo> ObjCImageInfos;
291 using GetJITDylibHeaderSendResultFn =
292 unique_function<void(Expected<ExecutorAddr>)>;
293 using GetJITDylibNameSendResultFn =
294 unique_function<void(Expected<StringRef>)>;
295 using PushInitializersSendResultFn =
296 unique_function<void(Expected<MachOJITDylibDepInfoMap>)>;
297 using SendSymbolAddressFn = unique_function<void(Expected<ExecutorAddr>)>;
298 using PushSymbolsInSendResultFn = unique_function<void(Error)>;
300 static bool supportedTarget(
const Triple &TT);
302 static jitlink::Edge::Kind getPointerEdgeKind(jitlink::LinkGraph &
G);
304 static MachOExecutorSymbolFlags flagsForSymbol(jitlink::Symbol &Sym);
306 MachOPlatform(ObjectLinkingLayer &ObjLinkingLayer, JITDylib &PlatformJD,
307 std::unique_ptr<DefinitionGenerator> OrcRuntimeGenerator,
308 HeaderOptions PlatformJDOpts,
309 MachOHeaderMUBuilder BuildMachOHeaderMU, Error &Err);
312 Error associateRuntimeSupportFunctions();
317 void pushInitializersLoop(PushInitializersSendResultFn SendResult,
321 void rt_pushInitializers(PushInitializersSendResultFn SendResult,
322 ExecutorAddr JDHeaderAddr);
328 void rt_pushSymbols(PushSymbolsInSendResultFn SendResult, ExecutorAddr Handle,
329 const std::vector<std::pair<StringRef, bool>> &Symbols);
332 Expected<uint64_t> createPThreadKey();
334 ExecutionSession &ES;
335 JITDylib &PlatformJD;
336 ObjectLinkingLayer &ObjLinkingLayer;
337 MachOHeaderMUBuilder BuildMachOHeaderMU;
339 SymbolStringPtr MachOHeaderStartSymbol = ES.intern(
"___dso_handle");
343 SymbolStringPtr
Name;
348 ES.intern(
"___orc_rt_macho_platform_bootstrap")};
350 ES.intern(
"___orc_rt_macho_platform_shutdown")};
352 ES.intern(
"___orc_rt_macho_register_ehframe_section")};
354 ES.intern(
"___orc_rt_macho_deregister_ehframe_section")};
356 ES.intern(
"___orc_rt_macho_register_jitdylib")};
358 ES.intern(
"___orc_rt_macho_deregister_jitdylib")};
360 ES.intern(
"___orc_rt_macho_register_object_symbol_table")};
362 ES.intern(
"___orc_rt_macho_deregister_object_symbol_table")};
364 ES.intern(
"___orc_rt_macho_register_object_platform_sections")};
366 ES.intern(
"___orc_rt_macho_deregister_object_platform_sections")};
368 ES.intern(
"___orc_rt_macho_create_pthread_key")};
370 ES.intern(
"___orc_rt_macho_register_objc_runtime_object")};
372 ES.intern(
"___orc_rt_macho_deregister_objc_runtime_object")};
374 DenseMap<JITDylib *, SymbolLookupSet> RegisteredInitSymbols;
376 std::mutex PlatformMutex;
377 bool ForceEHFrames =
false;
378 BootstrapInfo *Bootstrap =
nullptr;
379 DenseMap<JITDylib *, ExecutorAddr> JITDylibToHeaderAddr;
380 DenseMap<ExecutorAddr, JITDylib *> HeaderAddrToJITDylib;
381 DenseMap<JITDylib *, uint64_t> JITDylibToPThreadKey;