13#ifndef LLVM_EXECUTIONENGINE_ORC_CORE_H
14#define LLVM_EXECUTIONENGINE_ORC_CORE_H
42class AsynchronousSymbolQuery;
43class ExecutionSession;
44class MaterializationResponsibility;
47class InProgressLookupState;
93 return *
reinterpret_cast<JITDylib *
>(JDAndFlag.load() &
94 ~static_cast<uintptr_t>(1));
109 bool isDefunct()
const {
return JDAndFlag.load() & 0x1; }
121 std::atomic_uintptr_t JDAndFlag;
173 std::vector<std::pair<JITDylib *, JITDylibLookupFlags>>;
181 O.reserve(JDs.
size());
183 O.push_back(std::make_pair(JD, Flags));
196 using value_type = std::pair<SymbolStringPtr, SymbolLookupFlags>;
204 for (
auto &
E : Elems)
205 Symbols.push_back(std::move(
E));
216 std::initializer_list<SymbolStringPtr> Names,
218 Symbols.reserve(Names.size());
219 for (
const auto &
Name : Names)
228 Symbols.reserve(Names.
size());
229 for (
const auto &
Name : Names)
240 Symbols.reserve(Names.
size());
241 for (
const auto &
Name : Names)
246 template <
typename ValT>
251 Result.Symbols.reserve(M.size());
252 for (
const auto &[
Name, Val] : M)
262 Symbols.push_back(std::make_pair(std::move(
Name), Flags));
268 Symbols.reserve(Symbols.size() +
Other.size());
269 for (
auto &KV :
Other)
270 Symbols.push_back(std::move(KV));
274 bool empty()
const {
return Symbols.empty(); }
275 UnderlyingVector::size_type
size()
const {
return Symbols.size(); }
293 template <
typename PredFn>
void remove_if(PredFn &&Pred) {
294 UnderlyingVector::size_type
I = 0;
295 while (
I != Symbols.size()) {
296 const auto &
Name = Symbols[
I].first;
297 auto Flags = Symbols[
I].second;
298 if (Pred(
Name, Flags))
310 template <
typename BodyFn>
312 std::is_same<decltype(Body(std::declval<const SymbolStringPtr &>(),
313 std::declval<SymbolLookupFlags>())),
315 UnderlyingVector::size_type
I = 0;
316 while (
I != Symbols.size()) {
317 const auto &
Name = Symbols[
I].first;
318 auto Flags = Symbols[
I].second;
319 if (Body(
Name, Flags))
332 template <
typename BodyFn>
334 std::is_same<decltype(Body(std::declval<const SymbolStringPtr &>(),
335 std::declval<SymbolLookupFlags>())),
338 UnderlyingVector::size_type
I = 0;
339 while (
I != Symbols.size()) {
340 const auto &
Name = Symbols[
I].first;
341 auto Flags = Symbols[
I].second;
342 auto Remove = Body(
Name, Flags);
344 return Remove.takeError();
357 Names.reserve(Symbols.size());
358 for (
const auto &KV : Symbols)
359 Names.push_back(KV.first);
372 return *
LHS.first < *
RHS.first;
381 Symbols.erase(LastI, Symbols.end());
388 if (Symbols.size() < 2)
391 for (UnderlyingVector::size_type
I = 1;
I != Symbols.size(); ++
I)
392 if (Symbols[
I].first == Symbols[
I - 1].first)
444 std::shared_ptr<SymbolDependenceMap> Symbols);
451 std::shared_ptr<SymbolStringPool> SSP;
452 std::shared_ptr<SymbolDependenceMap> Symbols;
457 :
public ErrorInfo<UnsatisfiedSymbolDependencies> {
464 std::string Explanation);
469 std::shared_ptr<SymbolStringPool> SSP;
473 std::string Explanation;
490 std::shared_ptr<SymbolStringPool> SSP;
507 std::shared_ptr<SymbolStringPool> SSP;
529 std::shared_ptr<SymbolStringPool> SSP;
552 std::shared_ptr<SymbolStringPool> SSP;
591 return RT->withResourceKeyDo(std::forward<Func>(
F));
693 : JD(RT->getJITDylib()), RT(
std::
move(RT)),
694 SymbolFlags(
std::
move(SymbolFlags)), InitSymbol(
std::
move(InitSymbol)) {
695 assert(!this->SymbolFlags.
empty() &&
"Materializing nothing?");
701 SymbolStringPtr InitSymbol;
723 void materialize(std::unique_ptr<MaterializationResponsibility> R)
override;
744inline std::unique_ptr<ReExportsMaterializationUnit>
746 return std::make_unique<ReExportsMaterializationUnit>(
753inline std::unique_ptr<ReExportsMaterializationUnit>
757 return std::make_unique<ReExportsMaterializationUnit>(
758 &SourceJD, SourceJDLookupFlags, std::move(Aliases));
801 bool isComplete()
const {
return OutstandingSymbolsCount == 0; }
807 SymbolState getRequiredState() {
return RequiredState; }
809 void addQueryDependence(
JITDylib &JD, SymbolStringPtr
Name);
811 void removeQueryDependence(
JITDylib &JD,
const SymbolStringPtr &
Name);
813 void dropSymbol(
const SymbolStringPtr &
Name);
815 void handleFailed(
Error Err);
822 size_t OutstandingSymbolsCount;
844 LookupState(std::unique_ptr<InProgressLookupState> IPLS);
849 std::unique_ptr<InProgressLookupState> IPLS;
873 std::deque<LookupState> PendingLookups;
956 template <
typename GeneratorT>
957 GeneratorT &
addGenerator(std::unique_ptr<GeneratorT> DefGenerator);
990 bool LinkAgainstThisJITDylibFirst =
true);
1026 template <
typename Func>
1028 ->
decltype(
F(std::declval<const JITDylibSearchOrder &>()));
1040 template <
typename MaterializationUnitType>
1041 Error define(std::unique_ptr<MaterializationUnitType> &&MU,
1054 template <
typename MaterializationUnitType>
1055 Error define(std::unique_ptr<MaterializationUnitType> &MU,
1106 using AsynchronousSymbolQuerySet =
1107 std::set<std::shared_ptr<AsynchronousSymbolQuery>>;
1109 using AsynchronousSymbolQueryList =
1110 std::vector<std::shared_ptr<AsynchronousSymbolQuery>>;
1112 struct UnmaterializedInfo {
1113 UnmaterializedInfo(std::unique_ptr<MaterializationUnit> MU,
1115 : MU(
std::
move(MU)), RT(RT) {}
1117 std::unique_ptr<MaterializationUnit> MU;
1118 ResourceTracker *RT;
1121 using UnmaterializedInfosMap =
1122 DenseMap<SymbolStringPtr, std::shared_ptr<UnmaterializedInfo>>;
1124 using UnmaterializedInfosList =
1125 std::vector<std::shared_ptr<UnmaterializedInfo>>;
1127 struct EmissionDepUnit {
1128 EmissionDepUnit(JITDylib &JD) : JD(&JD) {}
1130 JITDylib *JD =
nullptr;
1131 DenseMap<NonOwningSymbolStringPtr, JITSymbolFlags> Symbols;
1132 DenseMap<JITDylib *, DenseSet<NonOwningSymbolStringPtr>> Dependencies;
1135 struct EmissionDepUnitInfo {
1136 std::shared_ptr<EmissionDepUnit> EDU;
1137 DenseSet<EmissionDepUnit *> IntraEmitUsers;
1138 DenseMap<JITDylib *, DenseSet<NonOwningSymbolStringPtr>> NewDeps;
1147 struct MaterializingInfo {
1148 friend class ExecutionSession;
1150 std::shared_ptr<EmissionDepUnit> DefiningEDU;
1151 DenseSet<EmissionDepUnit *> DependantEDUs;
1153 void addQuery(std::shared_ptr<AsynchronousSymbolQuery> Q);
1155 AsynchronousSymbolQueryList takeQueriesMeeting(
SymbolState RequiredState);
1156 AsynchronousSymbolQueryList takeAllPendingQueries() {
1157 return std::move(PendingQueries);
1159 bool hasQueriesPending()
const {
return !PendingQueries.empty(); }
1160 const AsynchronousSymbolQueryList &pendingQueries()
const {
1161 return PendingQueries;
1164 AsynchronousSymbolQueryList PendingQueries;
1167 using MaterializingInfosMap = DenseMap<SymbolStringPtr, MaterializingInfo>;
1169 class SymbolTableEntry {
1171 SymbolTableEntry() =
default;
1172 SymbolTableEntry(JITSymbolFlags Flags)
1174 MaterializerAttached(
false) {}
1177 JITSymbolFlags getFlags()
const {
return Flags; }
1180 bool hasMaterializerAttached()
const {
return MaterializerAttached; }
1182 void setAddress(ExecutorAddr Addr) { this->Addr =
Addr; }
1183 void setFlags(JITSymbolFlags Flags) { this->Flags =
Flags; }
1186 "State does not fit in bitfield");
1187 this->State =
static_cast<uint8_t>(State);
1190 void setMaterializerAttached(
bool MaterializerAttached) {
1191 this->MaterializerAttached = MaterializerAttached;
1194 ExecutorSymbolDef getSymbol()
const {
return {
Addr,
Flags}; }
1198 JITSymbolFlags
Flags;
1200 uint8_t MaterializerAttached : 1;
1203 using SymbolTable = DenseMap<SymbolStringPtr, SymbolTableEntry>;
1207 struct RemoveTrackerResult {
1208 AsynchronousSymbolQuerySet QueriesToFail;
1209 std::shared_ptr<SymbolDependenceMap> FailedSymbols;
1210 std::vector<std::unique_ptr<MaterializationUnit>> DefunctMUs;
1213 RemoveTrackerResult IL_removeTracker(ResourceTracker &RT);
1215 void transferTracker(ResourceTracker &DstRT, ResourceTracker &SrcRT);
1217 Error defineImpl(MaterializationUnit &MU);
1219 void installMaterializationUnit(std::unique_ptr<MaterializationUnit> MU,
1220 ResourceTracker &RT);
1225 void transferEmittedNodeDependencies(MaterializingInfo &DependantMI,
1226 const SymbolStringPtr &DependantName,
1227 MaterializingInfo &EmittedMI);
1229 Expected<SymbolFlagsMap>
1234 std::unique_ptr<MaterializationUnit> MU);
1236 Expected<std::unique_ptr<MaterializationResponsibility>>
1238 SymbolStringPtr InitSymbol);
1242 void addDependencies(
const SymbolStringPtr &Name,
1251 void shrinkMaterializationInfoMemory();
1254 enum { Open, Closing, Closed } State = Open;
1255 std::mutex GeneratorsMutex;
1256 SymbolTable Symbols;
1257 UnmaterializedInfosMap UnmaterializedInfos;
1258 MaterializingInfosMap MaterializingInfos;
1259 std::vector<std::shared_ptr<DefinitionGenerator>> DefGenerators;
1264 DenseMap<ResourceTracker *, SymbolNameVector> TrackerSymbols;
1265 DenseMap<ResourceTracker *, DenseSet<MaterializationResponsibility *>>
1318 std::unique_ptr<MaterializationResponsibility> MR)
1322 void run()
override;
1325 std::unique_ptr<MaterializationUnit> MU;
1326 std::unique_ptr<MaterializationResponsibility> MR;
1338 void run()
override;
1364 const char *ArgData,
size_t ArgSize)>;
1395 return EPC->getSymbolStringPool();
1410 std::lock_guard<std::recursive_mutex> Lock(SessionMutex);
1473 this->ReportError = std::move(ReportError);
1554 assert(
T &&
"T must be non-null");
1556 EPC->getDispatcher().dispatch(std::move(
T));
1561 return EPC->getBootstrapMap();
1565 template <
typename T,
typename SPSTagT>
1567 return EPC->getBootstrapMapValue<
T, SPSTagT>(Key, Val);
1572 return EPC->getBootstrapSymbolsMap();
1579 ArrayRef<std::pair<ExecutorAddr &, StringRef>> Pairs)
const {
1580 return EPC->getBootstrapSymbols(Pairs);
1592 template <
typename... ArgTs>
1594 EPC->callWrapperAsync(std::forward<ArgTs>(Args)...);
1605 return EPC->callWrapper(WrapperFnAddr, ArgBuffer);
1610 template <
typename SPSSignature,
typename SendResultT,
typename... ArgTs>
1612 const ArgTs &...Args) {
1613 EPC->callSPSWrapperAsync<SPSSignature, SendResultT, ArgTs...>(
1614 WrapperFnAddr, std::forward<SendResultT>(SendResult), Args...);
1622 template <
typename SPSSignature,
typename... WrapperCallArgTs>
1624 WrapperCallArgTs &&...WrapperCallArgs) {
1625 return EPC->callSPSWrapper<SPSSignature, WrapperCallArgTs...>(
1626 WrapperFnAddr, std::forward<WrapperCallArgTs>(WrapperCallArgs)...);
1636 template <
typename SPSSignature,
typename HandlerT>
1638 return [
H = std::forward<HandlerT>(
H)](
1640 const char *ArgData,
size_t ArgSize)
mutable {
1642 std::move(SendResult));
1653 template <
typename SPSSignature,
typename ClassT,
typename... MethodArgTs>
1656 return wrapAsyncWithSPS<SPSSignature>(
1657 [
Instance, Method](MethodArgTs &&...MethodArgs) {
1658 (
Instance->*Method)(std::forward<MethodArgTs>(MethodArgs)...);
1685#ifdef EXPENSIVE_CHECKS
1690 static void logErrorsToStdErr(
Error Err) {
1694 void dispatchOutstandingMUs();
1696 static std::unique_ptr<MaterializationResponsibility>
1699 SymbolStringPtr InitSymbol) {
1700 auto &JD = RT.getJITDylib();
1701 std::unique_ptr<MaterializationResponsibility> MR(
1703 std::move(InitSymbol)));
1704 JD.TrackerMRs[&RT].insert(MR.get());
1718 SymbolLookupSet &Candidates,
1719 SymbolLookupSet *NonCandidates);
1722 void OL_resumeLookupAfterGeneration(InProgressLookupState &IPLS);
1727 void OL_applyQueryPhase1(std::unique_ptr<InProgressLookupState> IPLS,
1734 void OL_completeLookup(std::unique_ptr<InProgressLookupState> IPLS,
1735 std::shared_ptr<AsynchronousSymbolQuery> Q,
1740 void OL_completeLookupFlags(
1741 std::unique_ptr<InProgressLookupState> IPLS,
1742 unique_function<
void(Expected<SymbolFlagsMap>)> OnComplete);
1745 void OL_destroyMaterializationResponsibility(
1752 DenseMap<JITDylib::EmissionDepUnit *, JITDylib::EmissionDepUnitInfo>;
1754 template <
typename HandleNewDepFn>
1755 void propagateExtraEmitDeps(std::deque<JITDylib::EmissionDepUnit *> Worklist,
1756 EDUInfosMap &EDUInfos,
1757 HandleNewDepFn HandleNewDep);
1759 ArrayRef<SymbolDependenceGroup> EmittedDeps);
1760 void IL_makeEDUReady(std::shared_ptr<JITDylib::EmissionDepUnit> EDU,
1761 JITDylib::AsynchronousSymbolQuerySet &Queries);
1762 void IL_makeEDUEmitted(std::shared_ptr<JITDylib::EmissionDepUnit> EDU,
1763 JITDylib::AsynchronousSymbolQuerySet &Queries);
1764 bool IL_removeEDUDependence(JITDylib::EmissionDepUnit &EDU,
JITDylib &DepJD,
1765 NonOwningSymbolStringPtr DepSym,
1766 EDUInfosMap &EDUInfos);
1768 static Error makeJDClosedError(JITDylib::EmissionDepUnit &EDU,
1770 static Error makeUnsatisfiedDepsError(JITDylib::EmissionDepUnit &EDU,
1773 Expected<JITDylib::AsynchronousSymbolQuerySet>
1776 ArrayRef<SymbolDependenceGroup> EmittedDeps);
1781 std::pair<JITDylib::AsynchronousSymbolQuerySet,
1782 std::shared_ptr<SymbolDependenceMap>>
1786 std::unique_ptr<MaterializationUnit> MU);
1787 Expected<std::unique_ptr<MaterializationResponsibility>>
1791 void dumpDispatchInfo(Task &
T);
1794 mutable std::recursive_mutex SessionMutex;
1795 bool SessionOpen =
true;
1796 std::unique_ptr<ExecutorProcessControl> EPC;
1797 std::unique_ptr<Platform>
P;
1800 std::vector<ResourceManager *> ResourceManagers;
1802 std::vector<JITDylibSP> JDs;
1806 mutable std::recursive_mutex OutstandingMUsMutex;
1807 std::vector<std::pair<std::unique_ptr<MaterializationUnit>,
1808 std::unique_ptr<MaterializationResponsibility>>>
1811 mutable std::mutex JITDispatchHandlersMutex;
1812 DenseMap<ExecutorAddr, std::shared_ptr<JITDispatchHandlerFunction>>
1813 JITDispatchHandlers;
1817 return JD->getExecutionSession().lookup({JD.
get()},
Name);
1823 return make_error<ResourceTrackerDefunct>(
this);
1834template <
typename GeneratorT>
1836 auto &
G = *DefGenerator;
1838 assert(State == Open &&
"Cannot add generator to closed JITDylib");
1839 DefGenerators.push_back(std::move(DefGenerator));
1844template <
typename Func>
1846 ->
decltype(
F(std::declval<const JITDylibSearchOrder &>())) {
1847 assert(State == Open &&
"Cannot use link order of closed JITDylib");
1848 return ES.runSessionLocked([&]() {
return F(LinkOrder); });
1851template <
typename MaterializationUnitType>
1854 assert(MU &&
"Can not define with a null MU");
1856 if (MU->getSymbols().empty()) {
1859 dbgs() <<
"Warning: Discarding empty MU " << MU->getName() <<
" for "
1865 dbgs() <<
"Defining MU " << MU->getName() <<
" for " <<
getName()
1868 dbgs() <<
"default)";
1872 dbgs() <<
"0x0, default will be used)\n";
1876 assert(State == Open &&
"JD is defunct");
1878 if (
auto Err = defineImpl(*MU))
1885 if (
auto Err =
P->notifyAdding(*RT, *MU))
1889 installMaterializationUnit(std::move(MU), *RT);
1894template <
typename MaterializationUnitType>
1897 assert(MU &&
"Can not define with a null MU");
1899 if (MU->getSymbols().empty()) {
1902 dbgs() <<
"Warning: Discarding empty MU " << MU->getName() <<
getName()
1908 dbgs() <<
"Defining MU " << MU->getName() <<
" for " <<
getName()
1911 dbgs() <<
"default)";
1915 dbgs() <<
"0x0, default will be used)\n";
1919 assert(State == Open &&
"JD is defunct");
1921 if (
auto Err = defineImpl(*MU))
1928 if (
auto Err =
P->notifyAdding(*RT, *MU))
1932 installMaterializationUnit(std::move(MU), *RT);
1985 std::move(SymbolFlags));
1993 std::unique_ptr<MaterializationUnit> MU) {
aarch64 falkor hwpf fix Falkor HW Prefetch Fix Late Phase
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
Given that RA is a live value
#define DEBUG_WITH_TYPE(TYPE,...)
DEBUG_WITH_TYPE macro - This macro should be used by passes to emit debug information.
This file defines the DenseSet and SmallDenseSet classes.
This file defines the RefCountedBase, ThreadSafeRefCountedBase, and IntrusiveRefCntPtr classes.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
const Value * getAddress(const DbgVariableIntrinsic *DVI)
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.
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.
A thread-safe version of RefCountedBase.
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.
bool isComplete() const
Returns true if all symbols covered by this query have been resolved.
void notifySymbolMetRequiredState(const SymbolStringPtr &Name, ExecutorSymbolDef Sym)
Notify the query that a requested symbol has reached the required state.
friend class JITSymbolResolverAdapter
Definition generators can be attached to JITDylibs to generate new definitions for otherwise unresolv...
virtual ~DefinitionGenerator()
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.
An ExecutionSession represents a running JIT program.
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.
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.
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.
JITDylib * getJITDylibByName(StringRef Name)
Return a pointer to the "name" JITDylib.
void callWrapperAsync(ArgTs &&... Args)
Run a wrapper function in the executor.
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...
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.
DenseMap< SymbolStringPtr, JITDispatchHandlerFunction > JITDispatchHandlerAssociationMap
A map associating tag names with asynchronous wrapper function implementations in the JIT.
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.
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.
void lookup(LookupKind K, const JITDylibSearchOrder &SearchOrder, SymbolLookupSet Symbols, SymbolState RequiredState, SymbolsResolvedCallback NotifyComplete, RegisterDependenciesFunction RegisterDependencies)
Search the given JITDylibs for the given symbols.
Error registerJITDispatchHandlers(JITDylib &JD, JITDispatchHandlerAssociationMap WFs)
For each tag symbol name, associate the corresponding AsyncHandlerWrapperFunction with the address of...
friend class MaterializationResponsibility
void registerResourceManager(ResourceManager &RM)
Register the given ResourceManager with this ExecutionSession.
~ExecutionSession()
Destroy an ExecutionSession.
void runJITDispatchHandler(SendResultFunction SendResult, ExecutorAddr HandlerFnTagAddr, ArrayRef< char > ArgBuffer)
Run a registered jit-side wrapper function.
unique_function< void(SendResultFunction SendResult, const char *ArgData, size_t ArgSize)> JITDispatchHandlerFunction
An asynchronous wrapper-function callable from the executor via jit-dispatch.
void deregisterResourceManager(ResourceManager &RM)
Deregister the given ResourceManager with this ExecutionSession.
decltype(auto) runSessionLocked(Func &&F)
Run the given lambda with the session mutex locked.
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.
Error removeJITDylibs(std::vector< JITDylibSP > JDsToRemove)
Removes the given JITDylibs from the ExecutionSession.
size_t getPageSize() const
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.
Represents an address in the executor process.
ExecutorProcessControl supports interaction with a JIT target process.
Represents a defining location for a JIT symbol.
Used to notify a JITDylib that the given set of symbols failed to materialize.
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.
Error remove(const SymbolNameSet &Names)
Tries to remove the given symbols.
Error clear()
Calls remove on all trackers currently associated with this JITDylib.
JITDylib & operator=(JITDylib &&)=delete
void dump(raw_ostream &OS)
Dump current JITDylib state to OS.
friend class AsynchronousSymbolQuery
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.
void addToLinkOrder(const JITDylibSearchOrder &NewLinks)
Append the given JITDylibSearchOrder to the link order for this JITDylib (discarding any elements alr...
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
void removeFromLinkOrder(JITDylib &JD)
Remove the given JITDylib from the link order for this JITDylib if it is present.
void setLinkOrder(JITDylibSearchOrder NewSearchOrder, bool LinkAgainstThisJITDylibFirst=true)
Set the link order to be used when fixing up definitions in JITDylib.
Expected< std::vector< JITDylibSP > > getReverseDFSLinkOrder()
Rteurn this JITDylib and its transitive dependencies in reverse DFS order based on linkage relationsh...
friend class ExecutionSession
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
void removeGenerator(DefinitionGenerator &G)
Remove a definition generator from this JITDylib.
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.
void continueLookup(Error Err)
Continue the lookup.
LookupState & operator=(LookupState &&)
LookupState(LookupState &&)
Lookups are usually run on the current thread, but in some cases they may be run as tasks,...
LookupTask(LookupState LS)
void printDescription(raw_ostream &OS) override
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
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.
void printDescription(raw_ostream &OS) override
MaterializationTask(std::unique_ptr< MaterializationUnit > MU, std::unique_ptr< MaterializationResponsibility > MR)
~MaterializationTask() override
A MaterializationUnit represents a set of symbol definitions that can be materialized as a group,...
Errors of this type should be returned if a module fails to include definitions that are claimed by t...
const SymbolNameVector & getSymbols() const
std::shared_ptr< SymbolStringPool > getSymbolStringPool()
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.
MissingSymbolDefinitions(std::shared_ptr< SymbolStringPool > SSP, std::string ModuleName, SymbolNameVector Symbols)
const std::string & getModuleName() const
A materialization unit for symbol aliases.
StringRef getName() const override
Return the name of this materialization unit.
ReexportsGenerator can be used with JITDylib::addGenerator to automatically re-export a subset of the...
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.
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.
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.
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
ResourceTracker(const ResourceTracker &)=delete
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.
Error remove()
Remove all resources associated with this key.
A definition of a Symbol within a JITDylib.
Expected< ExecutorSymbolDef > lookup() const
SymbolInstance(JITDylibSP JD, SymbolStringPtr Name)
void lookupAsync(LookupAsyncOnCompleteFn OnComplete) const
const JITDylib & getJITDylib() const
const SymbolStringPtr & getName() const
unique_function< void(Expected< ExecutorSymbolDef >)> LookupAsyncOnCompleteFn
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.
Used to notify clients that a set of symbols could not be removed.
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
std::shared_ptr< SymbolStringPool > getSymbolStringPool()
Used to notify clients when symbols can not be found during a lookup.
void log(raw_ostream &OS) const override
Print an error message to an output stream.
const SymbolNameVector & getSymbols() const
std::error_code convertToErrorCode() const override
Convert this error to a std::error_code.
std::shared_ptr< SymbolStringPool > getSymbolStringPool()
Errors of this type should be returned if a module contains definitions for symbols that are not clai...
UnexpectedSymbolDefinitions(std::shared_ptr< SymbolStringPool > SSP, std::string ModuleName, SymbolNameVector Symbols)
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.
std::shared_ptr< SymbolStringPool > getSymbolStringPool()
const std::string & getModuleName() const
const SymbolNameVector & getSymbols() const
Used to report failure due to unsatisfiable symbol dependencies.
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.
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.
std::function< void(const SymbolDependenceMap &)> RegisterDependenciesFunction
Callback to register the dependencies for a given query.
std::unique_ptr< ReExportsMaterializationUnit > symbolAliases(SymbolAliasMap Aliases)
Create a ReExportsMaterializationUnit with the given aliases.
IntrusiveRefCntPtr< ResourceTracker > ResourceTrackerSP
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...
JITDylibLookupFlags
Lookup flags that apply to each dylib in the search order for a lookup.
@ MatchExportedSymbolsOnly
DenseMap< SymbolStringPtr, ExecutorSymbolDef > SymbolMap
A map from symbol names (as SymbolStringPtrs) to JITSymbols (address/flags pairs).
DenseMap< SymbolStringPtr, JITSymbolFlags > SymbolFlagsMap
A map from symbol names (as SymbolStringPtrs) to JITSymbolFlags.
static std::unique_ptr< UnwindInfoManager > Instance
unique_function< void(Expected< SymbolMap >)> SymbolsResolvedCallback
Callback to notify client that symbols have been resolved.
DenseSet< SymbolStringPtr > SymbolNameSet
A set of symbol names (represented by SymbolStringPtrs for.
LookupKind
Describes the kind of lookup being performed.
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.
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< JITDylib *, SymbolNameSet > SymbolDependenceMap
A map from JITDylibs to sets of symbols.
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 ...
This is an optimization pass for GlobalISel generic memory operations.
void logAllUnhandledErrors(Error E, raw_ostream &OS, Twine ErrorBanner={})
Log all errors (if any) in E to OS.
auto unique(Range &&R, Predicate P)
void sort(IteratorTy Start, IteratorTy End)
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
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