13#ifndef LLVM_EXECUTIONENGINE_ORC_CORE_H
14#define LLVM_EXECUTIONENGINE_ORC_CORE_H
98 return *
reinterpret_cast<JITDylib *
>(JDAndFlag.load() &
99 ~
static_cast<uintptr_t
>(1));
114 bool isDefunct()
const {
return JDAndFlag.load() & 0x1; }
126 std::atomic_uintptr_t JDAndFlag;
178 std::vector<std::pair<JITDylib *, JITDylibLookupFlags>>;
186 O.reserve(JDs.
size());
188 O.push_back(std::make_pair(JD, Flags));
201 using value_type = std::pair<SymbolStringPtr, SymbolLookupFlags>;
209 for (
auto &
E : Elems)
210 Symbols.push_back(std::move(
E));
216 add(std::move(Name), Flags);
221 std::initializer_list<SymbolStringPtr> Names,
223 Symbols.reserve(Names.size());
224 for (
const auto &Name : Names)
225 add(std::move(Name), Flags);
233 Symbols.reserve(Names.
size());
234 for (
const auto &Name : Names)
245 Symbols.reserve(Names.
size());
246 for (
const auto &Name : Names)
251 template <
typename ValT>
256 Result.Symbols.reserve(M.size());
257 for (
const auto &[Name, Val] : M)
267 Symbols.push_back(std::make_pair(std::move(Name), Flags));
273 Symbols.reserve(Symbols.size() +
Other.size());
274 for (
auto &KV :
Other)
275 Symbols.push_back(std::move(KV));
279 bool empty()
const {
return Symbols.empty(); }
280 UnderlyingVector::size_type
size()
const {
return Symbols.size(); }
298 template <
typename PredFn>
void remove_if(PredFn &&Pred) {
299 UnderlyingVector::size_type
I = 0;
300 while (
I != Symbols.size()) {
301 const auto &Name = Symbols[
I].first;
302 auto Flags = Symbols[
I].second;
303 if (Pred(Name, Flags))
315 template <
typename BodyFn>
317 std::is_same<decltype(Body(std::declval<const SymbolStringPtr &>(),
318 std::declval<SymbolLookupFlags>())),
320 UnderlyingVector::size_type
I = 0;
321 while (
I != Symbols.size()) {
322 const auto &Name = Symbols[
I].first;
323 auto Flags = Symbols[
I].second;
324 if (Body(Name, Flags))
337 template <
typename BodyFn>
339 std::is_same<decltype(Body(std::declval<const SymbolStringPtr &>(),
340 std::declval<SymbolLookupFlags>())),
343 UnderlyingVector::size_type
I = 0;
344 while (
I != Symbols.size()) {
345 const auto &Name = Symbols[
I].first;
346 auto Flags = Symbols[
I].second;
347 auto Remove = Body(Name, Flags);
349 return Remove.takeError();
362 Names.reserve(Symbols.size());
363 for (
const auto &KV : Symbols)
364 Names.push_back(KV.first);
377 return *
LHS.first < *
RHS.first;
386 Symbols.erase(LastI, Symbols.end());
393 if (Symbols.size() < 2)
396 for (UnderlyingVector::size_type
I = 1;
I != Symbols.size(); ++
I)
397 if (Symbols[
I].first == Symbols[
I - 1].first)
431 :
public ErrorInfo<ResourceTrackerDefunct> {
450 std::shared_ptr<SymbolDependenceMap> Symbols);
457 std::shared_ptr<SymbolStringPool> SSP;
458 std::shared_ptr<SymbolDependenceMap> Symbols;
463 :
public ErrorInfo<UnsatisfiedSymbolDependencies> {
470 std::string Explanation);
475 std::shared_ptr<SymbolStringPool> SSP;
479 std::string Explanation;
496 std::shared_ptr<SymbolStringPool> SSP;
502 :
public ErrorInfo<SymbolsCouldNotBeRemoved> {
514 std::shared_ptr<SymbolStringPool> SSP;
523 :
public ErrorInfo<MissingSymbolDefinitions> {
531 std::error_code convertToErrorCode()
const override;
537 std::shared_ptr<SymbolStringPool> SSP;
547 :
public ErrorInfo<UnexpectedSymbolDefinitions> {
555 std::error_code convertToErrorCode()
const override;
561 std::shared_ptr<SymbolStringPool> SSP;
600 return RT->withResourceKeyDo(std::forward<Func>(
F));
702 : JD(RT->getJITDylib()), RT(
std::
move(RT)),
703 SymbolFlags(
std::
move(SymbolFlags)), InitSymbol(
std::
move(InitSymbol)) {
704 assert(!this->SymbolFlags.
empty() &&
"Materializing nothing?");
710 SymbolStringPtr InitSymbol;
732 void materialize(std::unique_ptr<MaterializationResponsibility> R)
override;
753inline std::unique_ptr<ReExportsMaterializationUnit>
755 return std::make_unique<ReExportsMaterializationUnit>(
762inline std::unique_ptr<ReExportsMaterializationUnit>
766 return std::make_unique<ReExportsMaterializationUnit>(
767 &SourceJD, SourceJDLookupFlags, std::move(Aliases));
810 bool isComplete()
const {
return OutstandingSymbolsCount == 0; }
816 SymbolState getRequiredState() {
return RequiredState; }
818 void addQueryDependence(
JITDylib &JD, SymbolStringPtr Name);
820 void removeQueryDependence(
JITDylib &JD,
const SymbolStringPtr &Name);
822 void dropSymbol(
const SymbolStringPtr &Name);
824 void handleFailed(
Error Err);
831 size_t OutstandingSymbolsCount;
832 SymbolState RequiredState;
853 LookupState(std::unique_ptr<InProgressLookupState> IPLS);
858 std::unique_ptr<InProgressLookupState> IPLS;
882 std::deque<LookupState> PendingLookups;
965 template <
typename GeneratorT>
966 GeneratorT &
addGenerator(std::unique_ptr<GeneratorT> DefGenerator);
999 bool LinkAgainstThisJITDylibFirst =
true);
1037 template <
typename Func>
1039 ->
decltype(
F(std::declval<const JITDylibSearchOrder &>()));
1051 template <
typename MaterializationUnitType>
1052 Error define(std::unique_ptr<MaterializationUnitType> &&MU,
1065 template <
typename MaterializationUnitType>
1066 Error define(std::unique_ptr<MaterializationUnitType> &MU,
1117 using AsynchronousSymbolQuerySet =
1118 std::set<std::shared_ptr<AsynchronousSymbolQuery>>;
1120 using AsynchronousSymbolQueryList =
1121 std::vector<std::shared_ptr<AsynchronousSymbolQuery>>;
1123 struct UnmaterializedInfo {
1124 UnmaterializedInfo(std::unique_ptr<MaterializationUnit> MU,
1126 : MU(
std::
move(MU)), RT(RT) {}
1128 std::unique_ptr<MaterializationUnit> MU;
1129 ResourceTracker *RT;
1132 using UnmaterializedInfosMap =
1133 DenseMap<SymbolStringPtr, std::shared_ptr<UnmaterializedInfo>>;
1135 using UnmaterializedInfosList =
1136 std::vector<std::shared_ptr<UnmaterializedInfo>>;
1144 struct MaterializingInfo {
1147 LLVM_ABI void addQuery(std::shared_ptr<AsynchronousSymbolQuery> Q);
1149 LLVM_ABI AsynchronousSymbolQueryList
1150 takeQueriesMeeting(SymbolState RequiredState);
1151 AsynchronousSymbolQueryList takeAllPendingQueries() {
1152 return std::move(PendingQueries);
1154 bool hasQueriesPending()
const {
return !PendingQueries.empty(); }
1155 const AsynchronousSymbolQueryList &pendingQueries()
const {
1156 return PendingQueries;
1159 AsynchronousSymbolQueryList PendingQueries;
1162 using MaterializingInfosMap = DenseMap<SymbolStringPtr, MaterializingInfo>;
1164 class SymbolTableEntry {
1166 SymbolTableEntry() =
default;
1167 SymbolTableEntry(JITSymbolFlags Flags)
1169 MaterializerAttached(
false) {}
1171 ExecutorAddr getAddress()
const {
return Addr; }
1172 JITSymbolFlags getFlags()
const {
return Flags; }
1175 bool hasMaterializerAttached()
const {
return MaterializerAttached; }
1177 void setAddress(ExecutorAddr Addr) { this->Addr = Addr; }
1178 void setFlags(JITSymbolFlags Flags) { this->Flags = Flags; }
1180 assert(
static_cast<uint8_t
>(State) < (1 << 6) &&
1181 "State does not fit in bitfield");
1182 this->State =
static_cast<uint8_t
>(State);
1185 void setMaterializerAttached(
bool MaterializerAttached) {
1186 this->MaterializerAttached = MaterializerAttached;
1189 ExecutorSymbolDef getSymbol()
const {
return {Addr, Flags}; }
1193 JITSymbolFlags Flags;
1195 uint8_t MaterializerAttached : 1;
1198 using SymbolTable = DenseMap<SymbolStringPtr, SymbolTableEntry>;
1202 struct RemoveTrackerResult {
1203 AsynchronousSymbolQuerySet QueriesToFail;
1204 std::shared_ptr<SymbolDependenceMap> FailedSymbols;
1205 std::vector<std::unique_ptr<MaterializationUnit>> DefunctMUs;
1208 RemoveTrackerResult IL_removeTracker(ResourceTracker &RT);
1210 void transferTracker(ResourceTracker &DstRT, ResourceTracker &SrcRT);
1215 installMaterializationUnit(std::unique_ptr<MaterializationUnit> MU,
1216 ResourceTracker &RT);
1221 void transferEmittedNodeDependencies(MaterializingInfo &DependantMI,
1222 const SymbolStringPtr &DependantName,
1223 MaterializingInfo &EmittedMI);
1225 Expected<SymbolFlagsMap>
1230 std::unique_ptr<MaterializationUnit> MU);
1232 Expected<std::unique_ptr<MaterializationResponsibility>>
1234 SymbolStringPtr InitSymbol);
1238 void addDependencies(
const SymbolStringPtr &Name,
1247 void shrinkMaterializationInfoMemory();
1250 enum { Open, Closing, Closed } State = Open;
1251 std::mutex GeneratorsMutex;
1252 SymbolTable Symbols;
1253 UnmaterializedInfosMap UnmaterializedInfos;
1254 MaterializingInfosMap MaterializingInfos;
1255 std::vector<std::shared_ptr<DefinitionGenerator>> DefGenerators;
1260 DenseMap<ResourceTracker *, SymbolNameVector> TrackerSymbols;
1261 DenseMap<ResourceTracker *, DenseSet<MaterializationResponsibility *>>
1315 std::unique_ptr<MaterializationResponsibility> MR)
1319 void run()
override;
1322 std::unique_ptr<MaterializationUnit> MU;
1323 std::unique_ptr<MaterializationResponsibility> MR;
1335 void run()
override;
1361 const char *ArgData,
size_t ArgSize)>;
1392 return EPC->getSymbolStringPool();
1399 void setPlatform(std::unique_ptr<Platform> P) { this->P = std::move(P); }
1407 std::lock_guard<std::recursive_mutex> Lock(SessionMutex);
1470 this->ReportError = std::move(ReportError);
1552 assert(
T &&
"T must be non-null");
1554 EPC->getDispatcher().dispatch(std::move(
T));
1559 return EPC->getBootstrapMap();
1563 template <
typename T,
typename SPSTagT>
1565 return EPC->getBootstrapMapValue<
T, SPSTagT>(
Key, Val);
1570 return EPC->getBootstrapSymbolsMap();
1577 ArrayRef<std::pair<ExecutorAddr &, StringRef>> Pairs)
const {
1578 return EPC->getBootstrapSymbols(Pairs);
1592 EPC->callWrapperAsync(WrapperFnAddr, std::move(OnComplete), ArgBuffer);
1597 template <
typename RunPolicyT,
typename FnT>
1600 EPC->callWrapperAsync(std::forward<RunPolicyT>(Runner), WrapperFnAddr,
1601 std::forward<FnT>(OnComplete), ArgBuffer);
1606 template <
typename FnT>
1609 EPC->callWrapperAsync(WrapperFnAddr, std::forward<FnT>(OnComplete),
1621 return EPC->callWrapper(WrapperFnAddr, ArgBuffer);
1626 template <
typename SPSSignature,
typename SendResultT,
typename... ArgTs>
1628 const ArgTs &...Args) {
1629 EPC->callSPSWrapperAsync<SPSSignature, SendResultT, ArgTs...>(
1630 WrapperFnAddr, std::forward<SendResultT>(SendResult), Args...);
1638 template <
typename SPSSignature,
typename... WrapperCallArgTs>
1640 WrapperCallArgTs &&...WrapperCallArgs) {
1641 return EPC->callSPSWrapper<SPSSignature, WrapperCallArgTs...>(
1642 WrapperFnAddr, std::forward<WrapperCallArgTs>(WrapperCallArgs)...);
1652 template <
typename SPSSignature,
typename HandlerT>
1655 const char *ArgData,
1656 size_t ArgSize)
mutable {
1658 ArgData, ArgSize, std::move(SendResult),
H);
1669 template <
typename SPSSignature,
typename ClassT,
typename... MethodArgTs>
1673 [
Instance, Method](MethodArgTs &&...MethodArgs) {
1674 (
Instance->*Method)(std::forward<MethodArgTs>(MethodArgs)...);
1701#ifdef EXPENSIVE_CHECKS
1706 static void logErrorsToStdErr(
Error Err) {
1710 void dispatchOutstandingMUs();
1712 static std::unique_ptr<MaterializationResponsibility>
1715 SymbolStringPtr InitSymbol) {
1716 auto &JD = RT.getJITDylib();
1717 std::unique_ptr<MaterializationResponsibility> MR(
1719 std::move(InitSymbol)));
1720 JD.TrackerMRs[&RT].insert(MR.get());
1733 Error IL_updateCandidatesFor(
JITDylib &JD, JITDylibLookupFlags JDLookupFlags,
1734 SymbolLookupSet &Candidates,
1735 SymbolLookupSet *NonCandidates);
1738 void OL_resumeLookupAfterGeneration(InProgressLookupState &IPLS);
1743 void OL_applyQueryPhase1(std::unique_ptr<InProgressLookupState> IPLS,
1750 void OL_completeLookup(std::unique_ptr<InProgressLookupState> IPLS,
1751 std::shared_ptr<AsynchronousSymbolQuery> Q,
1756 void OL_completeLookupFlags(
1757 std::unique_ptr<InProgressLookupState> IPLS,
1758 unique_function<
void(Expected<SymbolFlagsMap>)> OnComplete);
1770 struct EmitQueries {
1771 JITDylib::AsynchronousSymbolQuerySet Completed;
1772 JITDylib::AsynchronousSymbolQuerySet
Failed;
1773 DenseMap<AsynchronousSymbolQuery *, std::shared_ptr<SymbolDependenceMap>>
1778 IL_getSymbolState(
JITDylib *JD, NonOwningSymbolStringPtr Name);
1780 template <
typename UpdateSymbolFn,
typename UpdateQueryFn>
1781 void IL_collectQueries(JITDylib::AsynchronousSymbolQuerySet &Qs,
1783 UpdateSymbolFn &&UpdateSymbol,
1784 UpdateQueryFn &&UpdateQuery);
1787 WaitingOnGraph::SimplifyResult SR);
1794 std::pair<JITDylib::AsynchronousSymbolQuerySet,
1795 std::shared_ptr<SymbolDependenceMap>>
1799 std::unique_ptr<MaterializationUnit> MU);
1800 LLVM_ABI Expected<std::unique_ptr<MaterializationResponsibility>>
1804 void dumpDispatchInfo(Task &
T);
1807 mutable std::recursive_mutex SessionMutex;
1808 bool SessionOpen =
true;
1809 std::unique_ptr<ExecutorProcessControl> EPC;
1810 std::unique_ptr<Platform> P;
1813 std::vector<ResourceManager *> ResourceManagers;
1815 std::vector<JITDylibSP> JDs;
1820 mutable std::recursive_mutex OutstandingMUsMutex;
1821 std::vector<std::pair<std::unique_ptr<MaterializationUnit>,
1822 std::unique_ptr<MaterializationResponsibility>>>
1825 mutable std::mutex JITDispatchHandlersMutex;
1826 DenseMap<ExecutorAddr, std::shared_ptr<JITDispatchHandlerFunction>>
1827 JITDispatchHandlers;
1831 return JD->getExecutionSession().lookup({JD.get()}, Name);
1845 return JD.getExecutionSession();
1848template <
typename GeneratorT>
1850 auto &
G = *DefGenerator;
1851 ES.runSessionLocked([&] {
1852 assert(State == Open &&
"Cannot add generator to closed JITDylib");
1853 DefGenerators.push_back(std::move(DefGenerator));
1858template <
typename Func>
1860 ->
decltype(
F(std::declval<const JITDylibSearchOrder &>())) {
1861 assert(State == Open &&
"Cannot use link order of closed JITDylib");
1862 return ES.runSessionLocked([&]() {
return F(LinkOrder); });
1865template <
typename MaterializationUnitType>
1868 assert(MU &&
"Can not define with a null MU");
1870 if (MU->getSymbols().empty()) {
1873 dbgs() <<
"Warning: Discarding empty MU " << MU->getName() <<
" for "
1879 dbgs() <<
"Defining MU " << MU->getName() <<
" for " <<
getName()
1882 dbgs() <<
"default)";
1886 dbgs() <<
"0x0, default will be used)\n";
1889 return ES.runSessionLocked([&,
this]() ->
Error {
1890 assert(State == Open &&
"JD is defunct");
1892 if (
auto Err = defineImpl(*MU))
1898 if (
auto *
P = ES.getPlatform()) {
1899 if (
auto Err =
P->notifyAdding(*RT, *MU))
1903 installMaterializationUnit(std::move(MU), *RT);
1908template <
typename MaterializationUnitType>
1911 assert(MU &&
"Can not define with a null MU");
1913 if (MU->getSymbols().empty()) {
1916 dbgs() <<
"Warning: Discarding empty MU " << MU->getName() <<
getName()
1922 dbgs() <<
"Defining MU " << MU->getName() <<
" for " <<
getName()
1925 dbgs() <<
"default)";
1929 dbgs() <<
"0x0, default will be used)\n";
1932 return ES.runSessionLocked([&,
this]() ->
Error {
1933 assert(State == Open &&
"JD is defunct");
1935 if (
auto Err = defineImpl(*MU))
1941 if (
auto *
P = ES.getPlatform()) {
1942 if (
auto Err =
P->notifyAdding(*RT, *MU))
1946 installMaterializationUnit(std::move(MU), *RT);
1999 std::move(SymbolFlags));
2007 std::unique_ptr<MaterializationUnit> MU) {
aarch64 falkor hwpf fix Falkor HW Prefetch Fix Late Phase
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
Function Alias Analysis false
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file defines the DenseSet and SmallDenseSet classes.
This file defines the RefCountedBase, ThreadSafeRefCountedBase, and IntrusiveRefCntPtr classes.
static StringRef getName(Value *V)
#define DEBUG_WITH_TYPE(TYPE,...)
DEBUG_WITH_TYPE macro - This macro should be used by passes to emit debug information.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
Base class for user error types.
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.
A smart pointer to a reference-counted object that inherits from RefCountedBase or ThreadSafeRefCount...
Flags for symbols in the JIT.
Inheritance utility for extensible RTTI.
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.
ThreadSafeRefCountedBase()=default
Triple - Helper class for working with autoconf configuration names.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
const std::string & getName() const
Get the name for this JITLinkDylib.
A symbol query that returns results via a callback when results are ready.
LLVM_ABI AsynchronousSymbolQuery(const SymbolLookupSet &Symbols, SymbolState RequiredState, SymbolsResolvedCallback NotifyComplete)
Create a query for the given symbols.
bool isComplete() const
Returns true if all symbols covered by this query have been resolved.
friend class InProgressFullLookupState
LLVM_ABI void notifySymbolMetRequiredState(const SymbolStringPtr &Name, ExecutorSymbolDef Sym)
Notify the query that a requested symbol has reached the required state.
friend class JITSymbolResolverAdapter
friend class MaterializationResponsibility
friend class ExecutionSession
Definition generators can be attached to JITDylibs to generate new definitions for otherwise unresolv...
virtual Error tryToGenerate(LookupState &LS, LookupKind K, JITDylib &JD, JITDylibLookupFlags JDLookupFlags, const SymbolLookupSet &LookupSet)=0
DefinitionGenerators should override this method to insert new definitions into the parent JITDylib.
friend class ExecutionSession
An ExecutionSession represents a running JIT program.
LLVM_ABI Error endSession()
End the session.
ExecutorProcessControl & getExecutorProcessControl()
Get the ExecutorProcessControl object associated with this ExecutionSession.
unique_function< void(shared::WrapperFunctionResult)> SendResultFunction
Send a result to the remote.
void reportError(Error Err)
Report a error for this execution session.
void callWrapperAsync(ExecutorAddr WrapperFnAddr, ExecutorProcessControl::IncomingWFRHandler OnComplete, ArrayRef< char > ArgBuffer)
Run a wrapper function in the executor.
friend class InProgressLookupFlagsState
const StringMap< ExecutorAddr > & getBootstrapSymbolsMap() const
Returns the bootstrap symbol map.
void setPlatform(std::unique_ptr< Platform > P)
Set the Platform for this ExecutionSession.
const Triple & getTargetTriple() const
Return the triple for the executor.
Platform * getPlatform()
Get the Platform for this session.
Error callSPSWrapper(ExecutorAddr WrapperFnAddr, WrapperCallArgTs &&...WrapperCallArgs)
Run a wrapper function using SPS to serialize the arguments and deserialize the results.
LLVM_ABI void lookupFlags(LookupKind K, JITDylibSearchOrder SearchOrder, SymbolLookupSet Symbols, unique_function< void(Expected< SymbolFlagsMap >)> OnComplete)
Search the given JITDylibs to find the flags associated with each of the given symbols.
shared::WrapperFunctionResult callWrapper(ExecutorAddr WrapperFnAddr, ArrayRef< char > ArgBuffer)
Run a wrapper function in the executor.
SymbolStringPtr intern(StringRef SymName)
Add a symbol name to the SymbolStringPool and return a pointer to it.
LLVM_ABI JITDylib * getJITDylibByName(StringRef Name)
Return a pointer to the "name" JITDylib.
static JITDispatchHandlerFunction wrapAsyncWithSPS(ClassT *Instance, void(ClassT::*Method)(MethodArgTs...))
Wrap a class method that takes concrete argument types (and a sender for a concrete return type) to p...
void callWrapperAsync(RunPolicyT &&Runner, ExecutorAddr WrapperFnAddr, FnT &&OnComplete, ArrayRef< char > ArgBuffer)
Run a wrapper function in the executor using the given Runner to dispatch OnComplete when the result ...
LLVM_ABI JITDylib & createBareJITDylib(std::string Name)
Add a new bare JITDylib to this ExecutionSession.
static JITDispatchHandlerFunction wrapAsyncWithSPS(HandlerT &&H)
Wrap a handler that takes concrete argument types (and a sender for a concrete return type) to produc...
void callSPSWrapperAsync(ExecutorAddr WrapperFnAddr, SendResultT &&SendResult, const ArgTs &...Args)
Run a wrapper function using SPS to serialize the arguments and deserialize the results.
std::shared_ptr< SymbolStringPool > getSymbolStringPool()
Get the SymbolStringPool for this instance.
Error getBootstrapMapValue(StringRef Key, std::optional< T > &Val) const
Look up and SPS-deserialize a bootstrap map value.
friend class InProgressFullLookupState
Error getBootstrapSymbols(ArrayRef< std::pair< ExecutorAddr &, StringRef > > Pairs) const
For each (ExecutorAddr&, StringRef) pair, looks up the string in the bootstrap symbols map and writes...
const StringMap< std::vector< char > > & getBootstrapMap() const
Returns the bootstrap map.
LLVM_ABI void lookup(LookupKind K, const JITDylibSearchOrder &SearchOrder, SymbolLookupSet Symbols, SymbolState RequiredState, SymbolsResolvedCallback NotifyComplete, RegisterDependenciesFunction RegisterDependencies)
Search the given JITDylibs for the given symbols.
LLVM_ABI Error registerJITDispatchHandlers(JITDylib &JD, JITDispatchHandlerAssociationMap WFs)
For each tag symbol name, associate the corresponding AsyncHandlerWrapperFunction with the address of...
friend class MaterializationResponsibility
LLVM_ABI void registerResourceManager(ResourceManager &RM)
Register the given ResourceManager with this ExecutionSession.
LLVM_ABI ~ExecutionSession()
Destroy an ExecutionSession.
LLVM_ABI void runJITDispatchHandler(SendResultFunction SendResult, ExecutorAddr HandlerFnTagAddr, ArrayRef< char > ArgBuffer)
Run a registered jit-side wrapper function.
LLVM_ABI void deregisterResourceManager(ResourceManager &RM)
Deregister the given ResourceManager with this ExecutionSession.
LLVM_ABI ExecutionSession(std::unique_ptr< ExecutorProcessControl > EPC)
Construct an ExecutionSession with the given ExecutorProcessControl object.
decltype(auto) runSessionLocked(Func &&F)
Run the given lambda with the session mutex locked.
unique_function< void( SendResultFunction SendResult, const char *ArgData, size_t ArgSize)> JITDispatchHandlerFunction
An asynchronous wrapper-function callable from the executor via jit-dispatch.
LLVM_ABI void dump(raw_ostream &OS)
Dump the state of all the JITDylibs in this session.
friend class ResourceTracker
ExecutionSession & setErrorReporter(ErrorReporter ReportError)
Set the error reporter function.
LLVM_ABI Error removeJITDylibs(std::vector< JITDylibSP > JDsToRemove)
Removes the given JITDylibs from the ExecutionSession.
size_t getPageSize() const
LLVM_ABI Expected< JITDylib & > createJITDylib(std::string Name)
Add a new JITDylib to this ExecutionSession.
void dispatchTask(std::unique_ptr< Task > T)
Materialize the given unit.
unique_function< void(Error)> ErrorReporter
For reporting errors.
Error removeJITDylib(JITDylib &JD)
Calls removeJTIDylibs on the gives JITDylib.
void callWrapperAsync(ExecutorAddr WrapperFnAddr, FnT &&OnComplete, ArrayRef< char > ArgBuffer)
Run a wrapper function in the executor.
DenseMap< SymbolStringPtr, JITDispatchHandlerFunction > JITDispatchHandlerAssociationMap
A map associating tag names with asynchronous wrapper function implementations in the JIT.
Represents an address in the executor process.
A handler or incoming WrapperFunctionResults – either return values from callWrapper* calls,...
ExecutorProcessControl supports interaction with a JIT target process.
Represents a defining location for a JIT symbol.
FailedToMaterialize(std::shared_ptr< SymbolStringPool > SSP, std::shared_ptr< SymbolDependenceMap > Symbols)
const SymbolDependenceMap & getSymbols() const
std::error_code convertToErrorCode() const override
Convert this error to a std::error_code.
void log(raw_ostream &OS) const override
Print an error message to an output stream.
Represents a JIT'd dynamic library.
LLVM_ABI Error remove(const SymbolNameSet &Names)
Tries to remove the given symbols.
LLVM_ABI Error clear()
Calls remove on all trackers currently associated with this JITDylib.
JITDylib & operator=(JITDylib &&)=delete
LLVM_ABI void dump(raw_ostream &OS)
Dump current JITDylib state to OS.
friend class AsynchronousSymbolQuery
LLVM_ABI void replaceInLinkOrder(JITDylib &OldJD, JITDylib &NewJD, JITDylibLookupFlags JDLookupFlags=JITDylibLookupFlags::MatchExportedSymbolsOnly)
Replace OldJD with NewJD in the link order if OldJD is present.
Error define(std::unique_ptr< MaterializationUnitType > &&MU, ResourceTrackerSP RT=nullptr)
Define all symbols provided by the materialization unit to be part of this JITDylib.
ExecutionSession & getExecutionSession() const
Get a reference to the ExecutionSession for this JITDylib.
LLVM_ABI void addToLinkOrder(const JITDylibSearchOrder &NewLinks)
Append the given JITDylibSearchOrder to the link order for this JITDylib (discarding any elements alr...
LLVM_ABI ResourceTrackerSP createResourceTracker()
Create a resource tracker for this JITDylib.
auto withLinkOrderDo(Func &&F) -> decltype(F(std::declval< const JITDylibSearchOrder & >()))
Do something with the link order (run under the session lock).
friend class MaterializationResponsibility
LLVM_ABI void removeFromLinkOrder(JITDylib &JD)
Remove the given JITDylib from the link order for this JITDylib if it is present.
LLVM_ABI void setLinkOrder(JITDylibSearchOrder NewSearchOrder, bool LinkAgainstThisJITDylibFirst=true)
Set the link order to be used when fixing up definitions in JITDylib.
LLVM_ABI Expected< std::vector< JITDylibSP > > getReverseDFSLinkOrder()
Rteurn this JITDylib and its transitive dependencies in reverse DFS order based on linkage relationsh...
friend class ExecutionSession
LLVM_ABI ResourceTrackerSP getDefaultResourceTracker()
Get the default resource tracker for this JITDylib.
GeneratorT & addGenerator(std::unique_ptr< GeneratorT > DefGenerator)
Adds a definition generator to this JITDylib and returns a referenece to it.
JITDylib(const JITDylib &)=delete
JITDylib & operator=(const JITDylib &)=delete
JITDylib(JITDylib &&)=delete
LLVM_ABI void removeGenerator(DefinitionGenerator &G)
Remove a definition generator from this JITDylib.
LLVM_ABI Expected< std::vector< JITDylibSP > > getDFSLinkOrder()
Return this JITDylib and its transitive dependencies in DFS order based on linkage relationships.
Wraps state for a lookup-in-progress.
LLVM_ABI void continueLookup(Error Err)
Continue the lookup.
LLVM_ABI LookupState & operator=(LookupState &&)
friend class ExecutionSession
friend class OrcV2CAPIHelper
LLVM_ABI LookupState(LookupState &&)
LookupTask(LookupState LS)
Tracks responsibility for materialization, and mediates interactions between MaterializationUnits and...
MaterializationResponsibility & operator=(MaterializationResponsibility &&)=delete
ExecutionSession & getExecutionSession() const
Returns the ExecutionSession for this instance.
Error notifyResolved(const SymbolMap &Symbols)
Notifies the target JITDylib that the given symbols have been resolved.
~MaterializationResponsibility()
Destruct a MaterializationResponsibility instance.
Error replace(std::unique_ptr< MaterializationUnit > MU)
Transfers responsibility to the given MaterializationUnit for all symbols defined by that Materializa...
Error withResourceKeyDo(Func &&F) const
Runs the given callback under the session lock, passing in the associated ResourceKey.
Error defineMaterializing(SymbolFlagsMap SymbolFlags)
Attempt to claim responsibility for new definitions.
SymbolNameSet getRequestedSymbols() const
Returns the names of any symbols covered by this MaterializationResponsibility object that have queri...
Expected< std::unique_ptr< MaterializationResponsibility > > delegate(const SymbolNameSet &Symbols)
Delegates responsibility for the given symbols to the returned materialization responsibility.
const ResourceTrackerSP & getResourceTracker() const
Return the ResourceTracker associated with this instance.
const SymbolStringPtr & getInitializerSymbol() const
Returns the initialization pseudo-symbol, if any.
MaterializationResponsibility(MaterializationResponsibility &&)=delete
friend class ExecutionSession
Error notifyEmitted(ArrayRef< SymbolDependenceGroup > DepGroups)
Notifies the target JITDylib (and any pending queries on that JITDylib) that all symbols covered by t...
void failMaterialization()
Notify all not-yet-emitted covered by this MaterializationResponsibility instance that an error has o...
JITDylib & getTargetJITDylib() const
Returns the target JITDylib that these symbols are being materialized into.
const SymbolFlagsMap & getSymbols() const
Returns the symbol flags map for this responsibility instance.
MaterializationTask(std::unique_ptr< MaterializationUnit > MU, std::unique_ptr< MaterializationResponsibility > MR)
A MaterializationUnit represents a set of symbol definitions that can be materialized as a group,...
MaterializationUnit(Interface I)
const SymbolNameVector & getSymbols() const
std::shared_ptr< SymbolStringPool > getSymbolStringPool()
MissingSymbolDefinitions(std::shared_ptr< SymbolStringPool > SSP, std::string ModuleName, SymbolNameVector Symbols)
const std::string & getModuleName() const
ReExportsMaterializationUnit(JITDylib *SourceJD, JITDylibLookupFlags SourceJDLookupFlags, SymbolAliasMap Aliases)
SourceJD is allowed to be nullptr, in which case the source JITDylib is taken to be whatever JITDylib...
std::function< bool(SymbolStringPtr)> SymbolPredicate
Error tryToGenerate(LookupState &LS, LookupKind K, JITDylib &JD, JITDylibLookupFlags JDLookupFlags, const SymbolLookupSet &LookupSet) override
DefinitionGenerators should override this method to insert new definitions into the parent JITDylib.
ReexportsGenerator(JITDylib &SourceJD, JITDylibLookupFlags SourceJDLookupFlags, SymbolPredicate Allow=SymbolPredicate())
Create a reexports generator.
Listens for ResourceTracker operations.
virtual Error handleRemoveResources(JITDylib &JD, ResourceKey K)=0
This function will be called outside the session lock.
virtual ~ResourceManager()
virtual void handleTransferResources(JITDylib &JD, ResourceKey DstK, ResourceKey SrcK)=0
This function will be called inside the session lock.
ResourceTrackerDefunct(ResourceTrackerSP RT)
void log(raw_ostream &OS) const override
Print an error message to an output stream.
std::error_code convertToErrorCode() const override
Convert this error to a std::error_code.
API to remove / transfer ownership of JIT resources.
JITDylib & getJITDylib() const
Return the JITDylib targeted by this tracker.
ResourceTracker & operator=(const ResourceTracker &)=delete
ResourceKey getKeyUnsafe() const
Returns the key associated with this tracker.
LLVM_ABI void transferTo(ResourceTracker &DstRT)
Transfer all resources associated with this key to the given tracker, which must target the same JITD...
ResourceTracker & operator=(ResourceTracker &&)=delete
LLVM_ABI ~ResourceTracker()
ResourceTracker(const ResourceTracker &)=delete
friend class MaterializationResponsibility
bool isDefunct() const
Return true if this tracker has become defunct.
ResourceTracker(ResourceTracker &&)=delete
Error withResourceKeyDo(Func &&F)
Runs the given callback under the session lock, passing in the associated ResourceKey.
friend class ExecutionSession
LLVM_ABI Error remove()
Remove all resources associated with this key.
Expected< ExecutorSymbolDef > lookup() const
SymbolInstance(JITDylibSP JD, SymbolStringPtr Name)
LLVM_ABI void lookupAsync(LookupAsyncOnCompleteFn OnComplete) const
unique_function< void(Expected< ExecutorSymbolDef >)> LookupAsyncOnCompleteFn
const JITDylib & getJITDylib() const
const SymbolStringPtr & getName() const
A set of symbols to look up, each associated with a SymbolLookupFlags value.
std::pair< SymbolStringPtr, SymbolLookupFlags > value_type
const_iterator begin() const
void removeDuplicates()
Remove any duplicate elements.
UnderlyingVector::const_iterator const_iterator
void sortByAddress()
Sort the lookup set by pointer value.
SymbolLookupSet(std::initializer_list< SymbolStringPtr > Names, SymbolLookupFlags Flags=SymbolLookupFlags::RequiredSymbol)
Construct a SymbolLookupSet from an initializer list of SymbolStringPtrs.
UnderlyingVector::size_type size() const
SymbolLookupSet & add(SymbolStringPtr Name, SymbolLookupFlags Flags=SymbolLookupFlags::RequiredSymbol)
Add an element to the set.
static SymbolLookupSet fromMapKeys(const DenseMap< SymbolStringPtr, ValT > &M, SymbolLookupFlags Flags=SymbolLookupFlags::RequiredSymbol)
Construct a SymbolLookupSet from DenseMap keys.
SymbolLookupSet & append(SymbolLookupSet Other)
Quickly append one lookup set to another.
SymbolLookupSet(ArrayRef< SymbolStringPtr > Names, SymbolLookupFlags Flags=SymbolLookupFlags::RequiredSymbol)
Construct a SymbolLookupSet from a vector of symbols with the given Flags used for each value.
SymbolLookupSet(std::initializer_list< value_type > Elems)
void sortByName()
Sort the lookup set lexicographically.
void remove(iterator I)
Removes the element pointed to by the given iterator.
auto forEachWithRemoval(BodyFn &&Body) -> std::enable_if_t< std::is_same< decltype(Body(std::declval< const SymbolStringPtr & >(), std::declval< SymbolLookupFlags >())), bool >::value >
Loop over the elements of this SymbolLookupSet, applying the Body function to each one.
bool containsDuplicates()
Returns true if this set contains any duplicates.
UnderlyingVector::iterator iterator
void remove_if(PredFn &&Pred)
Removes all elements matching the given predicate, which must be callable as bool(const SymbolStringP...
SymbolLookupSet(const SymbolNameSet &Names, SymbolLookupFlags Flags=SymbolLookupFlags::RequiredSymbol)
Construct a SymbolLookupSet from a SymbolNameSet with the given Flags used for each value.
SymbolLookupSet(SymbolStringPtr Name, SymbolLookupFlags Flags=SymbolLookupFlags::RequiredSymbol)
SymbolNameVector getSymbolNames() const
Construct a SymbolNameVector from this instance by dropping the Flags values.
const_iterator end() const
SymbolLookupSet()=default
auto forEachWithRemoval(BodyFn &&Body) -> std::enable_if_t< std::is_same< decltype(Body(std::declval< const SymbolStringPtr & >(), std::declval< SymbolLookupFlags >())), Expected< bool > >::value, Error >
Loop over the elements of this SymbolLookupSet, applying the Body function to each one.
void remove(UnderlyingVector::size_type I)
Removes the Ith element of the vector, replacing it with the last element.
std::vector< value_type > UnderlyingVector
Pointer to a pooled string representing a symbol name.
std::error_code convertToErrorCode() const override
Convert this error to a std::error_code.
void log(raw_ostream &OS) const override
Print an error message to an output stream.
const SymbolNameSet & getSymbols() const
SymbolsCouldNotBeRemoved(std::shared_ptr< SymbolStringPool > SSP, SymbolNameSet Symbols)
std::shared_ptr< SymbolStringPool > getSymbolStringPool()
void log(raw_ostream &OS) const override
Print an error message to an output stream.
SymbolsNotFound(std::shared_ptr< SymbolStringPool > SSP, SymbolNameSet Symbols)
const SymbolNameVector & getSymbols() const
std::error_code convertToErrorCode() const override
Convert this error to a std::error_code.
std::shared_ptr< SymbolStringPool > getSymbolStringPool()
UnexpectedSymbolDefinitions(std::shared_ptr< SymbolStringPool > SSP, std::string ModuleName, SymbolNameVector Symbols)
std::shared_ptr< SymbolStringPool > getSymbolStringPool()
const std::string & getModuleName() const
const SymbolNameVector & getSymbols() const
void log(raw_ostream &OS) const override
Print an error message to an output stream.
std::error_code convertToErrorCode() const override
Convert this error to a std::error_code.
UnsatisfiedSymbolDependencies(std::shared_ptr< SymbolStringPool > SSP, JITDylibSP JD, SymbolNameSet FailedSymbols, SymbolDependenceMap BadDeps, std::string Explanation)
WaitingOnGraph class template.
DenseMap< ContainerId, ElementSet > ContainerElementsMap
C++ wrapper function result: Same as CWrapperFunctionResult but auto-releases memory.
This class implements an extremely fast bulk output stream that can only output to a stream.
unique_function is a type-erasing functor similar to std::function.
JITDylibSearchOrder makeJITDylibSearchOrder(ArrayRef< JITDylib * > JDs, JITDylibLookupFlags Flags=JITDylibLookupFlags::MatchExportedSymbolsOnly)
Convenience function for creating a search order from an ArrayRef of JITDylib*, all with the same fla...
std::vector< std::pair< JITDylib *, JITDylibLookupFlags > > JITDylibSearchOrder
A list of (JITDylib*, JITDylibLookupFlags) pairs to be used as a search order during symbol lookup.
IntrusiveRefCntPtr< JITDylib > JITDylibSP
IntrusiveRefCntPtr< ResourceTracker > ResourceTrackerSP
std::unique_ptr< ReExportsMaterializationUnit > symbolAliases(SymbolAliasMap Aliases)
Create a ReExportsMaterializationUnit with the given aliases.
std::function< void(const SymbolDependenceMap &)> RegisterDependenciesFunction
Callback to register the dependencies for a given query.
SymbolLookupFlags
Lookup flags that apply to each symbol in a lookup.
std::unique_ptr< ReExportsMaterializationUnit > reexports(JITDylib &SourceJD, SymbolAliasMap Aliases, JITDylibLookupFlags SourceJDLookupFlags=JITDylibLookupFlags::MatchExportedSymbolsOnly)
Create a materialization unit for re-exporting symbols from another JITDylib with alternative names/f...
LLVM_ABI Expected< SymbolAliasMap > buildSimpleReexportsAliasMap(JITDylib &SourceJD, const SymbolNameSet &Symbols)
Build a SymbolAliasMap for the common case where you want to re-export symbols from another JITDylib ...
JITDylibLookupFlags
Lookup flags that apply to each dylib in the search order for a lookup.
@ MatchExportedSymbolsOnly
detail::WaitingOnGraph< JITDylib *, NonOwningSymbolStringPtr > WaitingOnGraph
DenseMap< SymbolStringPtr, ExecutorSymbolDef > SymbolMap
A map from symbol names (as SymbolStringPtrs) to JITSymbols (address/flags pairs).
static std::unique_ptr< UnwindInfoManager > Instance
LookupKind
Describes the kind of lookup being performed.
LLVM_ABI RegisterDependenciesFunction NoDependenciesToRegister
This can be used as the value for a RegisterDependenciesFunction if there are no dependants to regist...
std::vector< SymbolStringPtr > SymbolNameVector
A vector of symbol names.
DenseMap< JITDylib *, SymbolNameSet > SymbolDependenceMap
A map from JITDylibs to sets of symbols.
DenseSet< SymbolStringPtr > SymbolNameSet
A set of symbol names (represented by SymbolStringPtrs for.
SymbolState
Represents the state that a symbol has reached during materialization.
@ Materializing
Added to the symbol table, never queried.
@ NeverSearched
No symbol should be in this state.
@ Ready
Emitted to memory, but waiting on transitive dependencies.
@ Emitted
Assigned address, still materializing.
@ Resolved
Queried, materialization begun.
DenseMap< SymbolStringPtr, SymbolAliasMapEntry > SymbolAliasMap
A map of Symbols to (Symbol, Flags) pairs.
unique_function< void(Expected< SymbolMap >)> SymbolsResolvedCallback
Callback to notify client that symbols have been resolved.
DenseMap< SymbolStringPtr, JITSymbolFlags > SymbolFlagsMap
A map from symbol names (as SymbolStringPtrs) to JITSymbolFlags.
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI void logAllUnhandledErrors(Error E, raw_ostream &OS, Twine ErrorBanner={})
Log all errors (if any) in E to OS.
testing::Matcher< const detail::ErrorHolder & > Failed()
auto unique(Range &&R, Predicate P)
void sort(IteratorTy Start, IteratorTy End)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
ArrayRef(const T &OneElt) -> ArrayRef< T >
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.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Function object to check whether the first component of a container supported by std::get (like std::...
SymbolAliasMapEntry()=default
JITSymbolFlags AliasFlags
SymbolAliasMapEntry(SymbolStringPtr Aliasee, JITSymbolFlags AliasFlags)
A set of symbols and the their dependencies.
SymbolDependenceMap Dependencies