43 std::vector<std::pair<ExecutorAddr, MachOJITDylibDepInfo>>;
74 LLVM_ABI static std::optional<BuildVersionOpts>
94 std::optional<std::array<uint8_t, 16>>
UUID;
110 static inline std::unique_ptr<MaterializationUnit>
153 std::unique_ptr<DefinitionGenerator> OrcRuntime,
156 MachOHeaderMUBuilder BuildMachOHeaderMU = buildSimpleMachOHeaderMU,
157 std::optional<SymbolAliasMap> RuntimeAliases = std::nullopt);
162 const char *OrcRuntimePath,
163 HeaderOptionsBuilder BuildHeaderOpts = defaultHeaderOpts,
164 HeaderOptions PlatformJDOpts = {},
165 MachOHeaderMUBuilder BuildMachOHeaderMU = buildSimpleMachOHeaderMU,
166 std::optional<SymbolAliasMap> RuntimeAliases = std::nullopt);
196 standardRuntimeUtilityAliases();
201 standardLazyCompilationAliases();
203 static HeaderOptions defaultHeaderOpts(
JITDylib &JD);
207 std::tuple<ExecutorAddr, ExecutorAddr, MachOExecutorSymbolFlags>>;
210 struct BootstrapInfo {
211 std::condition_variable CV;
212 size_t ActiveGraphs = 0;
215 SymbolTableVector SymTab;
221 class LLVM_ABI MachOPlatformPlugin :
public ObjectLinkingLayer::Plugin {
223 MachOPlatformPlugin(MachOPlatform &MP) : MP(MP) {}
225 void modifyPassConfig(MaterializationResponsibility &MR,
226 jitlink::LinkGraph &
G,
227 jitlink::PassConfiguration &Config)
override;
231 Error notifyFailed(MaterializationResponsibility &MR)
override {
232 return Error::success();
235 Error notifyRemovingResources(JITDylib &JD, ResourceKey K)
override {
236 return Error::success();
239 void notifyTransferringResources(JITDylib &JD, ResourceKey DstKey,
240 ResourceKey SrcKey)
override {}
243 struct UnwindSections {
244 SmallVector<ExecutorAddrRange> CodeRanges;
245 ExecutorAddrRange DwarfSection;
246 ExecutorAddrRange CompactUnwindSection;
249 struct ObjCImageInfo {
254 bool Finalized =
false;
257 struct SymbolTablePair {
258 jitlink::Symbol *OriginalSym =
nullptr;
259 jitlink::Symbol *NameSym =
nullptr;
261 using JITSymTabVector = SmallVector<SymbolTablePair>;
263 Error bootstrapPipelineRecordRuntimeFunctions(jitlink::LinkGraph &
G);
264 Error bootstrapPipelineEnd(jitlink::LinkGraph &
G);
266 Error associateJITDylibHeaderSymbol(jitlink::LinkGraph &
G,
267 MaterializationResponsibility &MR);
269 Error preserveImportantSections(jitlink::LinkGraph &
G,
270 MaterializationResponsibility &MR);
272 Error processObjCImageInfo(jitlink::LinkGraph &
G,
273 MaterializationResponsibility &MR);
274 Error mergeImageInfoFlags(jitlink::LinkGraph &
G,
275 MaterializationResponsibility &MR,
276 ObjCImageInfo &Info, uint32_t NewFlags);
278 Error fixTLVSectionsAndEdges(jitlink::LinkGraph &
G, JITDylib &JD);
280 std::optional<UnwindSections> findUnwindSectionInfo(jitlink::LinkGraph &
G);
281 Error registerObjectPlatformSections(jitlink::LinkGraph &
G, JITDylib &JD,
282 ExecutorAddr HeaderAddr,
283 bool InBootstrapPhase);
285 Error createObjCRuntimeObject(jitlink::LinkGraph &
G);
286 Error populateObjCRuntimeObject(jitlink::LinkGraph &
G,
287 MaterializationResponsibility &MR);
289 Error prepareSymbolTableRegistration(jitlink::LinkGraph &
G,
290 JITSymTabVector &JITSymTabInfo);
291 Error addSymbolTableRegistration(jitlink::LinkGraph &
G,
292 MaterializationResponsibility &MR,
293 JITSymTabVector &JITSymTabInfo,
294 bool InBootstrapPhase);
296 std::mutex PluginMutex;
301 DenseMap<JITDylib *, ObjCImageInfo> ObjCImageInfos;
304 using GetJITDylibHeaderSendResultFn =
305 unique_function<void(Expected<ExecutorAddr>)>;
306 using GetJITDylibNameSendResultFn =
307 unique_function<void(Expected<StringRef>)>;
308 using PushInitializersSendResultFn =
309 unique_function<void(Expected<MachOJITDylibDepInfoMap>)>;
310 using SendSymbolAddressFn = unique_function<void(Expected<ExecutorAddr>)>;
311 using PushSymbolsInSendResultFn = unique_function<void(Error)>;
313 static bool supportedTarget(
const Triple &TT);
315 static jitlink::Edge::Kind getPointerEdgeKind(jitlink::LinkGraph &
G);
317 static MachOExecutorSymbolFlags flagsForSymbol(jitlink::Symbol &Sym);
319 MachOPlatform(ObjectLinkingLayer &ObjLinkingLayer, JITDylib &PlatformJD,
320 std::unique_ptr<DefinitionGenerator> OrcRuntimeGenerator,
321 HeaderOptionsBuilder BuildHeaderOpts,
322 HeaderOptions PlatformJDOpts,
323 MachOHeaderMUBuilder BuildMachOHeaderMU, Error &Err);
326 Error associateRuntimeSupportFunctions();
331 void pushInitializersLoop(PushInitializersSendResultFn SendResult,
335 void rt_pushInitializers(PushInitializersSendResultFn SendResult,
336 ExecutorAddr JDHeaderAddr);
342 void rt_pushSymbols(PushSymbolsInSendResultFn SendResult, ExecutorAddr Handle,
343 const std::vector<std::pair<StringRef, bool>> &Symbols);
346 Expected<uint64_t> createPThreadKey();
348 ExecutionSession &ES;
349 JITDylib &PlatformJD;
350 ObjectLinkingLayer &ObjLinkingLayer;
351 HeaderOptionsBuilder BuildHeaderOpts;
352 MachOHeaderMUBuilder BuildMachOHeaderMU;
354 SymbolStringPtr MachOHeaderStartSymbol = ES.intern(
"___dso_handle");
358 SymbolStringPtr
Name;
363 ES.intern(
"___orc_rt_macho_platform_bootstrap")};
365 ES.intern(
"___orc_rt_macho_platform_shutdown")};
367 ES.intern(
"___orc_rt_macho_register_ehframe_section")};
369 ES.intern(
"___orc_rt_macho_deregister_ehframe_section")};
371 ES.intern(
"___orc_rt_macho_register_jitdylib")};
373 ES.intern(
"___orc_rt_macho_deregister_jitdylib")};
375 ES.intern(
"___orc_rt_macho_register_object_symbol_table")};
377 ES.intern(
"___orc_rt_macho_deregister_object_symbol_table")};
379 ES.intern(
"___orc_rt_macho_register_object_platform_sections")};
381 ES.intern(
"___orc_rt_macho_deregister_object_platform_sections")};
383 ES.intern(
"___orc_rt_macho_create_pthread_key")};
385 ES.intern(
"___orc_rt_macho_register_objc_runtime_object")};
387 ES.intern(
"___orc_rt_macho_deregister_objc_runtime_object")};
389 DenseMap<JITDylib *, SymbolLookupSet> RegisteredInitSymbols;
391 std::mutex PlatformMutex;
392 bool ForceEHFrames =
false;
393 BootstrapInfo *Bootstrap =
nullptr;
394 DenseMap<JITDylib *, ExecutorAddr> JITDylibToHeaderAddr;
395 DenseMap<ExecutorAddr, JITDylib *> HeaderAddrToJITDylib;
396 DenseMap<JITDylib *, uint64_t> JITDylibToPThreadKey;