13#ifndef LLVM_EXECUTIONENGINE_ORC_MACHOPLATFORM_H
14#define LLVM_EXECUTIONENGINE_ORC_MACHOPLATFORM_H
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,
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;
289 DenseMap<JITDylib *, ExecutorAddr> HeaderAddrs;
292 using GetJITDylibHeaderSendResultFn =
293 unique_function<void(Expected<ExecutorAddr>)>;
294 using GetJITDylibNameSendResultFn =
295 unique_function<void(Expected<StringRef>)>;
296 using PushInitializersSendResultFn =
297 unique_function<void(Expected<MachOJITDylibDepInfoMap>)>;
298 using SendSymbolAddressFn = unique_function<void(Expected<ExecutorAddr>)>;
299 using PushSymbolsInSendResultFn = unique_function<void(Error)>;
301 static bool supportedTarget(
const Triple &TT);
303 static jitlink::Edge::Kind getPointerEdgeKind(jitlink::LinkGraph &
G);
305 static MachOExecutorSymbolFlags flagsForSymbol(jitlink::Symbol &
Sym);
307 MachOPlatform(ObjectLinkingLayer &ObjLinkingLayer, JITDylib &PlatformJD,
308 std::unique_ptr<DefinitionGenerator> OrcRuntimeGenerator,
309 HeaderOptions PlatformJDOpts,
310 MachOHeaderMUBuilder BuildMachOHeaderMU, Error &Err);
313 Error associateRuntimeSupportFunctions();
318 void pushInitializersLoop(PushInitializersSendResultFn SendResult,
322 void rt_pushInitializers(PushInitializersSendResultFn SendResult,
323 ExecutorAddr JDHeaderAddr);
329 void rt_pushSymbols(PushSymbolsInSendResultFn SendResult, ExecutorAddr Handle,
330 const std::vector<std::pair<StringRef, bool>> &Symbols);
333 Expected<uint64_t> createPThreadKey();
335 ExecutionSession &ES;
336 JITDylib &PlatformJD;
337 ObjectLinkingLayer &ObjLinkingLayer;
338 MachOHeaderMUBuilder BuildMachOHeaderMU;
340 SymbolStringPtr MachOHeaderStartSymbol = ES.intern(
"___dso_handle");
344 SymbolStringPtr
Name;
349 ES.intern(
"___orc_rt_macho_platform_bootstrap")};
351 ES.intern(
"___orc_rt_macho_platform_shutdown")};
353 ES.intern(
"___orc_rt_macho_register_ehframe_section")};
355 ES.intern(
"___orc_rt_macho_deregister_ehframe_section")};
357 ES.intern(
"___orc_rt_macho_register_jitdylib")};
359 ES.intern(
"___orc_rt_macho_deregister_jitdylib")};
361 ES.intern(
"___orc_rt_macho_register_object_symbol_table")};
363 ES.intern(
"___orc_rt_macho_deregister_object_symbol_table")};
365 ES.intern(
"___orc_rt_macho_register_object_platform_sections")};
367 ES.intern(
"___orc_rt_macho_deregister_object_platform_sections")};
369 ES.intern(
"___orc_rt_macho_create_pthread_key")};
371 ES.intern(
"___orc_rt_macho_register_objc_runtime_object")};
373 ES.intern(
"___orc_rt_macho_deregister_objc_runtime_object")};
375 DenseMap<JITDylib *, SymbolLookupSet> RegisteredInitSymbols;
377 std::mutex PlatformMutex;
378 bool ForceEHFrames =
false;
379 BootstrapInfo *Bootstrap =
nullptr;
380 DenseMap<JITDylib *, ExecutorAddr> JITDylibToHeaderAddr;
381 DenseMap<ExecutorAddr, JITDylib *> HeaderAddrToJITDylib;
382 DenseMap<JITDylib *, uint64_t> JITDylibToPThreadKey;
391 void materialize(std::unique_ptr<MaterializationResponsibility> R)
override;
402 struct HeaderSymbol {
407 static constexpr HeaderSymbol AdditionalHeaderSymbols[] = {
408 {
"___mh_executable_header", 0}};
410 void addMachOHeader(JITDylib &JD, jitlink::LinkGraph &
G,
411 const SymbolStringPtr &InitializerSymbol);
412 static MaterializationUnit::Interface
413 createHeaderInterface(MachOPlatform &MOP,
414 const SymbolStringPtr &HeaderStartSymbol);
418inline std::unique_ptr<MaterializationUnit>
421 return std::make_unique<SimpleMachOHeaderMU>(MOP, MOP.MachOHeaderStartSymbol,
#define LLVM_MARK_AS_BITMASK_ENUM(LargestValue)
LLVM_MARK_AS_BITMASK_ENUM lets you opt in an individual enum type so you can perform bitwise operatio...
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
Analysis containing CSE Info
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Lightweight error class with error context and mandatory checking.
Tagged union holding either a T or a Error.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
Triple - Helper class for working with autoconf configuration names.
An Addressable with content and edges.
Represents an object file section.
An ExecutionSession represents a running JIT program.
Represents an address in the executor process.
Represents a JIT'd dynamic library.
A MaterializationUnit represents a set of symbol definitions that can be materialized as a group,...
Non-owning SymbolStringPool entry pointer.
An ObjectLayer implementation built on JITLink.
API to remove / transfer ownership of JIT resources.
Pointer to a pooled string representing a symbol name.
RuntimeFunction
IDs for all omp runtime library (RTL) functions.
std::vector< AllocActionCallPair > AllocActions
A vector of allocation actions to be run for this allocation.
jitlink::Block & createHeaderBlock(MachOPlatform &MOP, const MachOPlatform::HeaderOptions &Opts, JITDylib &JD, jitlink::LinkGraph &G, jitlink::Section &HeaderSection)
LLVM_ABI MachOHeaderInfo getMachOHeaderInfoFromTriple(const Triple &TT)
This is an optimization pass for GlobalISel generic memory operations.
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Implement std::hash so that hash_code can be used in STL containers.