13#ifndef LLVM_EXECUTIONENGINE_ORC_ELFNIXPLATFORM_H
14#define LLVM_EXECUTIONENGINE_ORC_ELFNIXPLATFORM_H
49 std::vector<ELFNixJITDylibInitializers>;
52 std::vector<ELFNixJITDylibDeinitializers>;
97 JITDylib &PlatformJD,
const char *OrcRuntimePath,
98 std::optional<SymbolAliasMap> RuntimeAliases = std::nullopt);
133 void modifyPassConfig(MaterializationResponsibility &MR,
138 getSyntheticSymbolDependencies(MaterializationResponsibility &MR)
override;
142 Error notifyFailed(MaterializationResponsibility &MR)
override {
146 Error notifyRemovingResources(JITDylib &JD,
ResourceKey K)
override {
150 void notifyTransferringResources(JITDylib &JD,
ResourceKey DstKey,
154 using InitSymbolDepMap =
155 DenseMap<MaterializationResponsibility *, JITLinkSymbolSet>;
157 void addInitializerSupportPasses(MaterializationResponsibility &MR,
158 jitlink::PassConfiguration &Config);
160 void addDSOHandleSupportPasses(MaterializationResponsibility &MR,
161 jitlink::PassConfiguration &Config);
163 void addEHAndTLVSupportPasses(MaterializationResponsibility &MR,
164 jitlink::PassConfiguration &Config);
166 Error preserveInitSections(jitlink::LinkGraph &
G,
167 MaterializationResponsibility &MR);
169 Error registerInitSections(jitlink::LinkGraph &
G, JITDylib &JD);
171 Error fixTLVSectionsAndEdges(jitlink::LinkGraph &
G, JITDylib &JD);
173 std::mutex PluginMutex;
175 InitSymbolDepMap InitSymbolDeps;
178 using SendInitializerSequenceFn =
179 unique_function<void(Expected<ELFNixJITDylibInitializerSequence>)>;
181 using SendDeinitializerSequenceFn =
182 unique_function<void(Expected<ELFNixJITDylibDeinitializerSequence>)>;
184 using SendSymbolAddressFn = unique_function<void(Expected<ExecutorAddr>)>;
186 static bool supportedTarget(
const Triple &TT);
188 ELFNixPlatform(ExecutionSession &ES, ObjectLinkingLayer &ObjLinkingLayer,
189 JITDylib &PlatformJD,
190 std::unique_ptr<DefinitionGenerator> OrcRuntimeGenerator,
194 Error associateRuntimeSupportFunctions(JITDylib &PlatformJD);
196 void getInitializersBuildSequencePhase(SendInitializerSequenceFn SendResult,
198 std::vector<JITDylibSP> DFSLinkOrder);
200 void getInitializersLookupPhase(SendInitializerSequenceFn SendResult,
203 void rt_getInitializers(SendInitializerSequenceFn SendResult,
206 void rt_getDeinitializers(SendDeinitializerSequenceFn SendResult,
207 ExecutorAddr Handle);
209 void rt_lookupSymbol(SendSymbolAddressFn SendResult, ExecutorAddr Handle,
210 StringRef SymbolName);
213 Error bootstrapELFNixRuntime(JITDylib &PlatformJD);
215 Error registerInitInfo(JITDylib &JD,
216 ArrayRef<jitlink::Section *> InitSections);
218 Error registerPerObjectSections(
const ELFPerObjectSectionsToRegister &POSR);
220 Expected<uint64_t> createPThreadKey();
222 ExecutionSession &ES;
223 ObjectLinkingLayer &ObjLinkingLayer;
225 SymbolStringPtr DSOHandleSymbol;
226 std::atomic<bool> RuntimeBootstrapped{
false};
228 ExecutorAddr orc_rt_elfnix_platform_bootstrap;
229 ExecutorAddr orc_rt_elfnix_platform_shutdown;
230 ExecutorAddr orc_rt_elfnix_register_object_sections;
231 ExecutorAddr orc_rt_elfnix_create_pthread_key;
233 DenseMap<JITDylib *, SymbolLookupSet> RegisteredInitSymbols;
237 std::mutex PlatformMutex;
238 DenseMap<JITDylib *, ELFNixJITDylibInitializers> InitSeqs;
239 std::vector<ELFPerObjectSectionsToRegister> BootstrapPOSRs;
241 DenseMap<ExecutorAddr, JITDylib *> HandleAddrToJITDylib;
242 DenseMap<JITDylib *, uint64_t> JITDylibToPThreadKey;
256 return SPSELFPerObjectSectionsToRegister::AsArgList::size(
262 return SPSELFPerObjectSectionsToRegister::AsArgList::serialize(
268 return SPSELFPerObjectSectionsToRegister::AsArgList::deserialize(
288 return SPSELFNixJITDylibInitializers::AsArgList::size(
294 return SPSELFNixJITDylibInitializers::AsArgList::serialize(
300 return SPSELFNixJITDylibInitializers::AsArgList::deserialize(
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Tagged union holding either a T or a Error.
StringMap - This is an unconventional map that is specialized for handling keys that are "strings",...
StringRef - Represent a constant reference to a string, i.e.
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,...
Plugin instances can be added to the ObjectLinkingLayer to receive callbacks when code is loaded or e...
DenseMap< SymbolStringPtr, JITLinkSymbolSet > SyntheticSymbolDependenciesMap
An ObjectLayer implementation built on JITLink.
API to remove / transfer ownership of JIT resources.
Output char buffer with overflow check.
SPS tag type for sequences.
static size_t size(const ELFNixJITDylibDeinitializers &MOJDDs)
static bool serialize(SPSOutputBuffer &OB, const ELFNixJITDylibDeinitializers &MOJDDs)
static bool deserialize(SPSInputBuffer &IB, ELFNixJITDylibDeinitializers &MOJDDs)
static bool deserialize(SPSInputBuffer &IB, ELFNixJITDylibInitializers &MOJDIs)
static size_t size(const ELFNixJITDylibInitializers &MOJDIs)
static bool serialize(SPSOutputBuffer &OB, const ELFNixJITDylibInitializers &MOJDIs)
static bool serialize(SPSOutputBuffer &OB, const ELFPerObjectSectionsToRegister &MOPOSR)
static size_t size(const ELFPerObjectSectionsToRegister &MOPOSR)
static bool deserialize(SPSInputBuffer &IB, ELFPerObjectSectionsToRegister &MOPOSR)
Specialize to describe how to serialize/deserialize to/from the given concrete type.
std::vector< ELFNixJITDylibDeinitializers > ELFNixJITDylibDeinitializerSequence
std::vector< ELFNixJITDylibInitializers > ELFNixJITDylibInitializerSequence
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.
An LinkGraph pass configuration, consisting of a list of pre-prune, post-prune, and post-fixup passes...
ExecutorAddr DSOHandleAddress
StringMap< SectionList > InitSections
ELFNixJITDylibInitializers(std::string Name, ExecutorAddr DSOHandleAddress)
std::vector< ExecutorAddrRange > SectionList
ExecutorAddrRange EHFrameSection
ExecutorAddrRange ThreadDataSection
Represents an address range in the exceutor process.