43 std::vector<std::pair<ExecutorAddr, MachOJITDylibDepInfo>>;
74 LLVM_ABI static std::optional<BuildVersionOpts>
96 std::optional<std::array<uint8_t, 16>>
UUID;
112 static inline std::unique_ptr<MaterializationUnit>
155 std::unique_ptr<DefinitionGenerator> OrcRuntime,
158 MachOHeaderMUBuilder BuildMachOHeaderMU = buildSimpleMachOHeaderMU,
159 std::optional<SymbolAliasMap> RuntimeAliases = std::nullopt);
164 const char *OrcRuntimePath,
165 HeaderOptionsBuilder BuildHeaderOpts = defaultHeaderOpts,
166 HeaderOptions PlatformJDOpts = {},
167 MachOHeaderMUBuilder BuildMachOHeaderMU = buildSimpleMachOHeaderMU,
168 std::optional<SymbolAliasMap> RuntimeAliases = std::nullopt);
198 standardRuntimeUtilityAliases();
203 standardLazyCompilationAliases();
205 static HeaderOptions defaultHeaderOpts(
JITDylib &JD);
209 std::tuple<ExecutorAddr, ExecutorAddr, MachOExecutorSymbolFlags>>;
212 struct BootstrapInfo {
213 std::condition_variable CV;
214 size_t ActiveGraphs = 0;
217 SymbolTableVector SymTab;
223 class LLVM_ABI MachOPlatformPlugin :
public ObjectLinkingLayer::Plugin {
225 MachOPlatformPlugin(MachOPlatform &MP) : MP(MP) {}
227 void modifyPassConfig(MaterializationResponsibility &MR,
228 jitlink::LinkGraph &
G,
229 jitlink::PassConfiguration &Config)
override;
233 Error notifyFailed(MaterializationResponsibility &MR)
override {
234 return Error::success();
237 Error notifyRemovingResources(JITDylib &JD, ResourceKey K)
override {
238 return Error::success();
241 void notifyTransferringResources(JITDylib &JD, ResourceKey DstKey,
242 ResourceKey SrcKey)
override {}
245 struct UnwindSections {
246 SmallVector<ExecutorAddrRange> CodeRanges;
247 ExecutorAddrRange DwarfSection;
248 ExecutorAddrRange CompactUnwindSection;
251 struct ObjCImageInfo {
256 bool Finalized =
false;
259 struct SymbolTablePair {
260 jitlink::Symbol *OriginalSym =
nullptr;
261 jitlink::Symbol *NameSym =
nullptr;
263 using JITSymTabVector = SmallVector<SymbolTablePair>;
265 Error bootstrapPipelineRecordRuntimeFunctions(jitlink::LinkGraph &
G);
266 Error bootstrapPipelineEnd(jitlink::LinkGraph &
G);
268 Error associateJITDylibHeaderSymbol(jitlink::LinkGraph &
G,
269 MaterializationResponsibility &MR);
271 Error preserveImportantSections(jitlink::LinkGraph &
G,
272 MaterializationResponsibility &MR);
274 Error processObjCImageInfo(jitlink::LinkGraph &
G,
275 MaterializationResponsibility &MR);
276 Error mergeImageInfoFlags(jitlink::LinkGraph &
G,
277 MaterializationResponsibility &MR,
278 ObjCImageInfo &Info, uint32_t NewFlags);
280 Error fixTLVSectionsAndEdges(jitlink::LinkGraph &
G, JITDylib &JD);
282 std::optional<UnwindSections> findUnwindSectionInfo(jitlink::LinkGraph &
G);
283 Error registerObjectPlatformSections(jitlink::LinkGraph &
G, JITDylib &JD,
284 ExecutorAddr HeaderAddr,
285 bool InBootstrapPhase);
287 Error createObjCRuntimeObject(jitlink::LinkGraph &
G);
288 Error populateObjCRuntimeObject(jitlink::LinkGraph &
G,
289 MaterializationResponsibility &MR);
291 Error prepareSymbolTableRegistration(jitlink::LinkGraph &
G,
292 JITSymTabVector &JITSymTabInfo);
293 Error addSymbolTableRegistration(jitlink::LinkGraph &
G,
294 MaterializationResponsibility &MR,
295 JITSymTabVector &JITSymTabInfo,
296 bool InBootstrapPhase);
298 std::mutex PluginMutex;
303 DenseMap<JITDylib *, ObjCImageInfo> ObjCImageInfos;
306 using GetJITDylibHeaderSendResultFn =
307 unique_function<void(Expected<ExecutorAddr>)>;
308 using GetJITDylibNameSendResultFn =
309 unique_function<void(Expected<StringRef>)>;
310 using PushInitializersSendResultFn =
311 unique_function<void(Expected<MachOJITDylibDepInfoMap>)>;
312 using SendSymbolAddressFn = unique_function<void(Expected<ExecutorAddr>)>;
313 using PushSymbolsInSendResultFn = unique_function<void(Error)>;
315 static bool supportedTarget(
const Triple &TT);
317 static jitlink::Edge::Kind getPointerEdgeKind(jitlink::LinkGraph &
G);
319 static MachOExecutorSymbolFlags flagsForSymbol(jitlink::Symbol &Sym);
321 MachOPlatform(ObjectLinkingLayer &ObjLinkingLayer, JITDylib &PlatformJD,
322 std::unique_ptr<DefinitionGenerator> OrcRuntimeGenerator,
323 HeaderOptionsBuilder BuildHeaderOpts,
324 HeaderOptions PlatformJDOpts,
325 MachOHeaderMUBuilder BuildMachOHeaderMU, Error &Err);
328 Error associateRuntimeSupportFunctions();
333 void pushInitializersLoop(PushInitializersSendResultFn SendResult,
337 void rt_pushInitializers(PushInitializersSendResultFn SendResult,
338 ExecutorAddr JDHeaderAddr);
344 void rt_pushSymbols(PushSymbolsInSendResultFn SendResult, ExecutorAddr Handle,
345 const std::vector<std::pair<StringRef, bool>> &Symbols);
348 Expected<uint64_t> createPThreadKey();
350 ExecutionSession &ES;
351 JITDylib &PlatformJD;
352 ObjectLinkingLayer &ObjLinkingLayer;
353 HeaderOptionsBuilder BuildHeaderOpts;
354 MachOHeaderMUBuilder BuildMachOHeaderMU;
356 SymbolStringPtr MachOHeaderStartSymbol = ES.intern(
"___dso_handle");
360 SymbolStringPtr
Name;
365 ES.intern(
"___orc_rt_macho_platform_bootstrap")};
367 ES.intern(
"___orc_rt_macho_platform_shutdown")};
369 ES.intern(
"___orc_rt_macho_register_ehframe_section")};
371 ES.intern(
"___orc_rt_macho_deregister_ehframe_section")};
373 ES.intern(
"___orc_rt_macho_register_jitdylib")};
375 ES.intern(
"___orc_rt_macho_deregister_jitdylib")};
377 ES.intern(
"___orc_rt_macho_register_object_symbol_table")};
379 ES.intern(
"___orc_rt_macho_deregister_object_symbol_table")};
381 ES.intern(
"___orc_rt_macho_register_object_platform_sections")};
383 ES.intern(
"___orc_rt_macho_deregister_object_platform_sections")};
385 ES.intern(
"___orc_rt_macho_create_pthread_key")};
387 ES.intern(
"___orc_rt_macho_register_objc_runtime_object")};
389 ES.intern(
"___orc_rt_macho_deregister_objc_runtime_object")};
391 DenseMap<JITDylib *, SymbolLookupSet> RegisteredInitSymbols;
393 std::mutex PlatformMutex;
394 bool ForceEHFrames =
false;
395 BootstrapInfo *Bootstrap =
nullptr;
396 DenseMap<JITDylib *, ExecutorAddr> JITDylibToHeaderAddr;
397 DenseMap<ExecutorAddr, JITDylib *> HeaderAddrToJITDylib;
398 DenseMap<JITDylib *, uint64_t> JITDylibToPThreadKey;