File indexing completed on 2026-05-10 08:43:52
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef LLVM_EXECUTIONENGINE_ORC_CORE_H
0014 #define LLVM_EXECUTIONENGINE_ORC_CORE_H
0015
0016 #include "llvm/ADT/BitmaskEnum.h"
0017 #include "llvm/ADT/DenseSet.h"
0018 #include "llvm/ADT/FunctionExtras.h"
0019 #include "llvm/ADT/IntrusiveRefCntPtr.h"
0020 #include "llvm/ExecutionEngine/JITLink/JITLinkDylib.h"
0021 #include "llvm/ExecutionEngine/JITSymbol.h"
0022 #include "llvm/ExecutionEngine/Orc/CoreContainers.h"
0023 #include "llvm/ExecutionEngine/Orc/ExecutorProcessControl.h"
0024 #include "llvm/ExecutionEngine/Orc/MaterializationUnit.h"
0025 #include "llvm/ExecutionEngine/Orc/Shared/ExecutorAddress.h"
0026 #include "llvm/ExecutionEngine/Orc/Shared/ExecutorSymbolDef.h"
0027 #include "llvm/ExecutionEngine/Orc/Shared/WrapperFunctionUtils.h"
0028 #include "llvm/ExecutionEngine/Orc/TaskDispatch.h"
0029 #include "llvm/Support/Debug.h"
0030 #include "llvm/Support/ExtensibleRTTI.h"
0031
0032 #include <atomic>
0033 #include <deque>
0034 #include <future>
0035 #include <memory>
0036 #include <vector>
0037
0038 namespace llvm {
0039 namespace orc {
0040
0041
0042 class AsynchronousSymbolQuery;
0043 class ExecutionSession;
0044 class MaterializationResponsibility;
0045 class JITDylib;
0046 class ResourceTracker;
0047 class InProgressLookupState;
0048
0049 enum class SymbolState : uint8_t;
0050
0051 using ResourceTrackerSP = IntrusiveRefCntPtr<ResourceTracker>;
0052 using JITDylibSP = IntrusiveRefCntPtr<JITDylib>;
0053
0054
0055 class SymbolInstance {
0056 public:
0057 using LookupAsyncOnCompleteFn =
0058 unique_function<void(Expected<ExecutorSymbolDef>)>;
0059
0060 SymbolInstance(JITDylibSP JD, SymbolStringPtr Name)
0061 : JD(std::move(JD)), Name(std::move(Name)) {}
0062
0063 const JITDylib &getJITDylib() const { return *JD; }
0064 const SymbolStringPtr &getName() const { return Name; }
0065
0066 Expected<ExecutorSymbolDef> lookup() const;
0067 void lookupAsync(LookupAsyncOnCompleteFn OnComplete) const;
0068
0069 private:
0070 JITDylibSP JD;
0071 SymbolStringPtr Name;
0072 };
0073
0074 using ResourceKey = uintptr_t;
0075
0076
0077 class ResourceTracker : public ThreadSafeRefCountedBase<ResourceTracker> {
0078 private:
0079 friend class ExecutionSession;
0080 friend class JITDylib;
0081 friend class MaterializationResponsibility;
0082
0083 public:
0084 ResourceTracker(const ResourceTracker &) = delete;
0085 ResourceTracker &operator=(const ResourceTracker &) = delete;
0086 ResourceTracker(ResourceTracker &&) = delete;
0087 ResourceTracker &operator=(ResourceTracker &&) = delete;
0088
0089 ~ResourceTracker();
0090
0091
0092 JITDylib &getJITDylib() const {
0093 return *reinterpret_cast<JITDylib *>(JDAndFlag.load() &
0094 ~static_cast<uintptr_t>(1));
0095 }
0096
0097
0098
0099 template <typename Func> Error withResourceKeyDo(Func &&F);
0100
0101
0102 Error remove();
0103
0104
0105
0106 void transferTo(ResourceTracker &DstRT);
0107
0108
0109 bool isDefunct() const { return JDAndFlag.load() & 0x1; }
0110
0111
0112
0113
0114 ResourceKey getKeyUnsafe() const { return reinterpret_cast<uintptr_t>(this); }
0115
0116 private:
0117 ResourceTracker(JITDylibSP JD);
0118
0119 void makeDefunct();
0120
0121 std::atomic_uintptr_t JDAndFlag;
0122 };
0123
0124
0125 class ResourceManager {
0126 public:
0127 virtual ~ResourceManager();
0128
0129
0130
0131
0132 virtual Error handleRemoveResources(JITDylib &JD, ResourceKey K) = 0;
0133
0134
0135
0136 virtual void handleTransferResources(JITDylib &JD, ResourceKey DstK,
0137 ResourceKey SrcK) = 0;
0138 };
0139
0140
0141
0142
0143
0144
0145
0146 enum class JITDylibLookupFlags { MatchExportedSymbolsOnly, MatchAllSymbols };
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156 enum class SymbolLookupFlags { RequiredSymbol, WeaklyReferencedSymbol };
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168 enum class LookupKind { Static, DLSym };
0169
0170
0171
0172 using JITDylibSearchOrder =
0173 std::vector<std::pair<JITDylib *, JITDylibLookupFlags>>;
0174
0175
0176
0177 inline JITDylibSearchOrder makeJITDylibSearchOrder(
0178 ArrayRef<JITDylib *> JDs,
0179 JITDylibLookupFlags Flags = JITDylibLookupFlags::MatchExportedSymbolsOnly) {
0180 JITDylibSearchOrder O;
0181 O.reserve(JDs.size());
0182 for (auto *JD : JDs)
0183 O.push_back(std::make_pair(JD, Flags));
0184 return O;
0185 }
0186
0187
0188
0189
0190
0191
0192
0193
0194 class SymbolLookupSet {
0195 public:
0196 using value_type = std::pair<SymbolStringPtr, SymbolLookupFlags>;
0197 using UnderlyingVector = std::vector<value_type>;
0198 using iterator = UnderlyingVector::iterator;
0199 using const_iterator = UnderlyingVector::const_iterator;
0200
0201 SymbolLookupSet() = default;
0202
0203 SymbolLookupSet(std::initializer_list<value_type> Elems) {
0204 for (auto &E : Elems)
0205 Symbols.push_back(std::move(E));
0206 }
0207
0208 explicit SymbolLookupSet(
0209 SymbolStringPtr Name,
0210 SymbolLookupFlags Flags = SymbolLookupFlags::RequiredSymbol) {
0211 add(std::move(Name), Flags);
0212 }
0213
0214
0215 explicit SymbolLookupSet(
0216 std::initializer_list<SymbolStringPtr> Names,
0217 SymbolLookupFlags Flags = SymbolLookupFlags::RequiredSymbol) {
0218 Symbols.reserve(Names.size());
0219 for (const auto &Name : Names)
0220 add(std::move(Name), Flags);
0221 }
0222
0223
0224
0225 explicit SymbolLookupSet(
0226 const SymbolNameSet &Names,
0227 SymbolLookupFlags Flags = SymbolLookupFlags::RequiredSymbol) {
0228 Symbols.reserve(Names.size());
0229 for (const auto &Name : Names)
0230 add(Name, Flags);
0231 }
0232
0233
0234
0235
0236
0237 explicit SymbolLookupSet(
0238 ArrayRef<SymbolStringPtr> Names,
0239 SymbolLookupFlags Flags = SymbolLookupFlags::RequiredSymbol) {
0240 Symbols.reserve(Names.size());
0241 for (const auto &Name : Names)
0242 add(Name, Flags);
0243 }
0244
0245
0246 template <typename ValT>
0247 static SymbolLookupSet
0248 fromMapKeys(const DenseMap<SymbolStringPtr, ValT> &M,
0249 SymbolLookupFlags Flags = SymbolLookupFlags::RequiredSymbol) {
0250 SymbolLookupSet Result;
0251 Result.Symbols.reserve(M.size());
0252 for (const auto &[Name, Val] : M)
0253 Result.add(Name, Flags);
0254 return Result;
0255 }
0256
0257
0258
0259 SymbolLookupSet &
0260 add(SymbolStringPtr Name,
0261 SymbolLookupFlags Flags = SymbolLookupFlags::RequiredSymbol) {
0262 Symbols.push_back(std::make_pair(std::move(Name), Flags));
0263 return *this;
0264 }
0265
0266
0267 SymbolLookupSet &append(SymbolLookupSet Other) {
0268 Symbols.reserve(Symbols.size() + Other.size());
0269 for (auto &KV : Other)
0270 Symbols.push_back(std::move(KV));
0271 return *this;
0272 }
0273
0274 bool empty() const { return Symbols.empty(); }
0275 UnderlyingVector::size_type size() const { return Symbols.size(); }
0276 iterator begin() { return Symbols.begin(); }
0277 iterator end() { return Symbols.end(); }
0278 const_iterator begin() const { return Symbols.begin(); }
0279 const_iterator end() const { return Symbols.end(); }
0280
0281
0282 void remove(UnderlyingVector::size_type I) {
0283 std::swap(Symbols[I], Symbols.back());
0284 Symbols.pop_back();
0285 }
0286
0287
0288
0289 void remove(iterator I) { remove(I - begin()); }
0290
0291
0292
0293 template <typename PredFn> void remove_if(PredFn &&Pred) {
0294 UnderlyingVector::size_type I = 0;
0295 while (I != Symbols.size()) {
0296 const auto &Name = Symbols[I].first;
0297 auto Flags = Symbols[I].second;
0298 if (Pred(Name, Flags))
0299 remove(I);
0300 else
0301 ++I;
0302 }
0303 }
0304
0305
0306
0307
0308
0309
0310 template <typename BodyFn>
0311 auto forEachWithRemoval(BodyFn &&Body) -> std::enable_if_t<
0312 std::is_same<decltype(Body(std::declval<const SymbolStringPtr &>(),
0313 std::declval<SymbolLookupFlags>())),
0314 bool>::value> {
0315 UnderlyingVector::size_type I = 0;
0316 while (I != Symbols.size()) {
0317 const auto &Name = Symbols[I].first;
0318 auto Flags = Symbols[I].second;
0319 if (Body(Name, Flags))
0320 remove(I);
0321 else
0322 ++I;
0323 }
0324 }
0325
0326
0327
0328
0329
0330
0331
0332 template <typename BodyFn>
0333 auto forEachWithRemoval(BodyFn &&Body) -> std::enable_if_t<
0334 std::is_same<decltype(Body(std::declval<const SymbolStringPtr &>(),
0335 std::declval<SymbolLookupFlags>())),
0336 Expected<bool>>::value,
0337 Error> {
0338 UnderlyingVector::size_type I = 0;
0339 while (I != Symbols.size()) {
0340 const auto &Name = Symbols[I].first;
0341 auto Flags = Symbols[I].second;
0342 auto Remove = Body(Name, Flags);
0343 if (!Remove)
0344 return Remove.takeError();
0345 if (*Remove)
0346 remove(I);
0347 else
0348 ++I;
0349 }
0350 return Error::success();
0351 }
0352
0353
0354
0355 SymbolNameVector getSymbolNames() const {
0356 SymbolNameVector Names;
0357 Names.reserve(Symbols.size());
0358 for (const auto &KV : Symbols)
0359 Names.push_back(KV.first);
0360 return Names;
0361 }
0362
0363
0364
0365
0366 void sortByAddress() { llvm::sort(Symbols, llvm::less_first()); }
0367
0368
0369
0370 void sortByName() {
0371 llvm::sort(Symbols, [](const value_type &LHS, const value_type &RHS) {
0372 return *LHS.first < *RHS.first;
0373 });
0374 }
0375
0376
0377
0378 void removeDuplicates() {
0379 sortByAddress();
0380 auto LastI = llvm::unique(Symbols);
0381 Symbols.erase(LastI, Symbols.end());
0382 }
0383
0384 #ifndef NDEBUG
0385
0386
0387 bool containsDuplicates() {
0388 if (Symbols.size() < 2)
0389 return false;
0390 sortByAddress();
0391 for (UnderlyingVector::size_type I = 1; I != Symbols.size(); ++I)
0392 if (Symbols[I].first == Symbols[I - 1].first)
0393 return true;
0394 return false;
0395 }
0396 #endif
0397
0398 private:
0399 UnderlyingVector Symbols;
0400 };
0401
0402 struct SymbolAliasMapEntry {
0403 SymbolAliasMapEntry() = default;
0404 SymbolAliasMapEntry(SymbolStringPtr Aliasee, JITSymbolFlags AliasFlags)
0405 : Aliasee(std::move(Aliasee)), AliasFlags(AliasFlags) {}
0406
0407 SymbolStringPtr Aliasee;
0408 JITSymbolFlags AliasFlags;
0409 };
0410
0411
0412 using SymbolAliasMap = DenseMap<SymbolStringPtr, SymbolAliasMapEntry>;
0413
0414
0415 using SymbolsResolvedCallback = unique_function<void(Expected<SymbolMap>)>;
0416
0417
0418 using RegisterDependenciesFunction =
0419 std::function<void(const SymbolDependenceMap &)>;
0420
0421
0422
0423 extern RegisterDependenciesFunction NoDependenciesToRegister;
0424
0425 class ResourceTrackerDefunct : public ErrorInfo<ResourceTrackerDefunct> {
0426 public:
0427 static char ID;
0428
0429 ResourceTrackerDefunct(ResourceTrackerSP RT);
0430 std::error_code convertToErrorCode() const override;
0431 void log(raw_ostream &OS) const override;
0432
0433 private:
0434 ResourceTrackerSP RT;
0435 };
0436
0437
0438
0439 class FailedToMaterialize : public ErrorInfo<FailedToMaterialize> {
0440 public:
0441 static char ID;
0442
0443 FailedToMaterialize(std::shared_ptr<SymbolStringPool> SSP,
0444 std::shared_ptr<SymbolDependenceMap> Symbols);
0445 ~FailedToMaterialize();
0446 std::error_code convertToErrorCode() const override;
0447 void log(raw_ostream &OS) const override;
0448 const SymbolDependenceMap &getSymbols() const { return *Symbols; }
0449
0450 private:
0451 std::shared_ptr<SymbolStringPool> SSP;
0452 std::shared_ptr<SymbolDependenceMap> Symbols;
0453 };
0454
0455
0456 class UnsatisfiedSymbolDependencies
0457 : public ErrorInfo<UnsatisfiedSymbolDependencies> {
0458 public:
0459 static char ID;
0460
0461 UnsatisfiedSymbolDependencies(std::shared_ptr<SymbolStringPool> SSP,
0462 JITDylibSP JD, SymbolNameSet FailedSymbols,
0463 SymbolDependenceMap BadDeps,
0464 std::string Explanation);
0465 std::error_code convertToErrorCode() const override;
0466 void log(raw_ostream &OS) const override;
0467
0468 private:
0469 std::shared_ptr<SymbolStringPool> SSP;
0470 JITDylibSP JD;
0471 SymbolNameSet FailedSymbols;
0472 SymbolDependenceMap BadDeps;
0473 std::string Explanation;
0474 };
0475
0476
0477 class SymbolsNotFound : public ErrorInfo<SymbolsNotFound> {
0478 public:
0479 static char ID;
0480
0481 SymbolsNotFound(std::shared_ptr<SymbolStringPool> SSP, SymbolNameSet Symbols);
0482 SymbolsNotFound(std::shared_ptr<SymbolStringPool> SSP,
0483 SymbolNameVector Symbols);
0484 std::error_code convertToErrorCode() const override;
0485 void log(raw_ostream &OS) const override;
0486 std::shared_ptr<SymbolStringPool> getSymbolStringPool() { return SSP; }
0487 const SymbolNameVector &getSymbols() const { return Symbols; }
0488
0489 private:
0490 std::shared_ptr<SymbolStringPool> SSP;
0491 SymbolNameVector Symbols;
0492 };
0493
0494
0495 class SymbolsCouldNotBeRemoved : public ErrorInfo<SymbolsCouldNotBeRemoved> {
0496 public:
0497 static char ID;
0498
0499 SymbolsCouldNotBeRemoved(std::shared_ptr<SymbolStringPool> SSP,
0500 SymbolNameSet Symbols);
0501 std::error_code convertToErrorCode() const override;
0502 void log(raw_ostream &OS) const override;
0503 std::shared_ptr<SymbolStringPool> getSymbolStringPool() { return SSP; }
0504 const SymbolNameSet &getSymbols() const { return Symbols; }
0505
0506 private:
0507 std::shared_ptr<SymbolStringPool> SSP;
0508 SymbolNameSet Symbols;
0509 };
0510
0511
0512
0513
0514
0515 class MissingSymbolDefinitions : public ErrorInfo<MissingSymbolDefinitions> {
0516 public:
0517 static char ID;
0518
0519 MissingSymbolDefinitions(std::shared_ptr<SymbolStringPool> SSP,
0520 std::string ModuleName, SymbolNameVector Symbols)
0521 : SSP(std::move(SSP)), ModuleName(std::move(ModuleName)),
0522 Symbols(std::move(Symbols)) {}
0523 std::error_code convertToErrorCode() const override;
0524 void log(raw_ostream &OS) const override;
0525 std::shared_ptr<SymbolStringPool> getSymbolStringPool() { return SSP; }
0526 const std::string &getModuleName() const { return ModuleName; }
0527 const SymbolNameVector &getSymbols() const { return Symbols; }
0528 private:
0529 std::shared_ptr<SymbolStringPool> SSP;
0530 std::string ModuleName;
0531 SymbolNameVector Symbols;
0532 };
0533
0534
0535
0536
0537
0538 class UnexpectedSymbolDefinitions : public ErrorInfo<UnexpectedSymbolDefinitions> {
0539 public:
0540 static char ID;
0541
0542 UnexpectedSymbolDefinitions(std::shared_ptr<SymbolStringPool> SSP,
0543 std::string ModuleName, SymbolNameVector Symbols)
0544 : SSP(std::move(SSP)), ModuleName(std::move(ModuleName)),
0545 Symbols(std::move(Symbols)) {}
0546 std::error_code convertToErrorCode() const override;
0547 void log(raw_ostream &OS) const override;
0548 std::shared_ptr<SymbolStringPool> getSymbolStringPool() { return SSP; }
0549 const std::string &getModuleName() const { return ModuleName; }
0550 const SymbolNameVector &getSymbols() const { return Symbols; }
0551 private:
0552 std::shared_ptr<SymbolStringPool> SSP;
0553 std::string ModuleName;
0554 SymbolNameVector Symbols;
0555 };
0556
0557
0558
0559 struct SymbolDependenceGroup {
0560 SymbolNameSet Symbols;
0561 SymbolDependenceMap Dependencies;
0562 };
0563
0564
0565
0566
0567
0568
0569
0570
0571 class MaterializationResponsibility {
0572 friend class ExecutionSession;
0573 friend class JITDylib;
0574
0575 public:
0576 MaterializationResponsibility(MaterializationResponsibility &&) = delete;
0577 MaterializationResponsibility &
0578 operator=(MaterializationResponsibility &&) = delete;
0579
0580
0581
0582
0583 ~MaterializationResponsibility();
0584
0585
0586 const ResourceTrackerSP &getResourceTracker() const { return RT; }
0587
0588
0589
0590 template <typename Func> Error withResourceKeyDo(Func &&F) const {
0591 return RT->withResourceKeyDo(std::forward<Func>(F));
0592 }
0593
0594
0595
0596 JITDylib &getTargetJITDylib() const { return JD; }
0597
0598
0599 ExecutionSession &getExecutionSession() const;
0600
0601
0602
0603
0604
0605 const SymbolFlagsMap &getSymbols() const { return SymbolFlags; }
0606
0607
0608
0609
0610 const SymbolStringPtr &getInitializerSymbol() const { return InitSymbol; }
0611
0612
0613
0614
0615
0616 SymbolNameSet getRequestedSymbols() const;
0617
0618
0619
0620
0621
0622
0623
0624
0625
0626
0627
0628
0629
0630
0631 Error notifyResolved(const SymbolMap &Symbols);
0632
0633
0634
0635
0636
0637
0638
0639
0640
0641
0642
0643
0644
0645
0646
0647
0648
0649
0650
0651
0652 Error notifyEmitted(ArrayRef<SymbolDependenceGroup> DepGroups);
0653
0654
0655
0656
0657
0658
0659
0660
0661
0662
0663
0664
0665 Error defineMaterializing(SymbolFlagsMap SymbolFlags);
0666
0667
0668
0669
0670
0671
0672 void failMaterialization();
0673
0674
0675
0676
0677
0678
0679 Error replace(std::unique_ptr<MaterializationUnit> MU);
0680
0681
0682
0683
0684 Expected<std::unique_ptr<MaterializationResponsibility>>
0685 delegate(const SymbolNameSet &Symbols);
0686
0687 private:
0688
0689
0690 MaterializationResponsibility(ResourceTrackerSP RT,
0691 SymbolFlagsMap SymbolFlags,
0692 SymbolStringPtr InitSymbol)
0693 : JD(RT->getJITDylib()), RT(std::move(RT)),
0694 SymbolFlags(std::move(SymbolFlags)), InitSymbol(std::move(InitSymbol)) {
0695 assert(!this->SymbolFlags.empty() && "Materializing nothing?");
0696 }
0697
0698 JITDylib &JD;
0699 ResourceTrackerSP RT;
0700 SymbolFlagsMap SymbolFlags;
0701 SymbolStringPtr InitSymbol;
0702 };
0703
0704
0705
0706 class ReExportsMaterializationUnit : public MaterializationUnit {
0707 public:
0708
0709
0710
0711
0712
0713
0714
0715
0716 ReExportsMaterializationUnit(JITDylib *SourceJD,
0717 JITDylibLookupFlags SourceJDLookupFlags,
0718 SymbolAliasMap Aliases);
0719
0720 StringRef getName() const override;
0721
0722 private:
0723 void materialize(std::unique_ptr<MaterializationResponsibility> R) override;
0724 void discard(const JITDylib &JD, const SymbolStringPtr &Name) override;
0725 static MaterializationUnit::Interface
0726 extractFlags(const SymbolAliasMap &Aliases);
0727
0728 JITDylib *SourceJD = nullptr;
0729 JITDylibLookupFlags SourceJDLookupFlags;
0730 SymbolAliasMap Aliases;
0731 };
0732
0733
0734
0735
0736
0737
0738
0739
0740
0741
0742
0743
0744 inline std::unique_ptr<ReExportsMaterializationUnit>
0745 symbolAliases(SymbolAliasMap Aliases) {
0746 return std::make_unique<ReExportsMaterializationUnit>(
0747 nullptr, JITDylibLookupFlags::MatchAllSymbols, std::move(Aliases));
0748 }
0749
0750
0751
0752
0753 inline std::unique_ptr<ReExportsMaterializationUnit>
0754 reexports(JITDylib &SourceJD, SymbolAliasMap Aliases,
0755 JITDylibLookupFlags SourceJDLookupFlags =
0756 JITDylibLookupFlags::MatchExportedSymbolsOnly) {
0757 return std::make_unique<ReExportsMaterializationUnit>(
0758 &SourceJD, SourceJDLookupFlags, std::move(Aliases));
0759 }
0760
0761
0762
0763 Expected<SymbolAliasMap>
0764 buildSimpleReexportsAliasMap(JITDylib &SourceJD, const SymbolNameSet &Symbols);
0765
0766
0767 enum class SymbolState : uint8_t {
0768 Invalid,
0769 NeverSearched,
0770 Materializing,
0771 Resolved,
0772 Emitted,
0773 Ready = 0x3f
0774 };
0775
0776
0777
0778
0779
0780 class AsynchronousSymbolQuery {
0781 friend class ExecutionSession;
0782 friend class InProgressFullLookupState;
0783 friend class JITDylib;
0784 friend class JITSymbolResolverAdapter;
0785 friend class MaterializationResponsibility;
0786
0787 public:
0788
0789
0790
0791 AsynchronousSymbolQuery(const SymbolLookupSet &Symbols,
0792 SymbolState RequiredState,
0793 SymbolsResolvedCallback NotifyComplete);
0794
0795
0796 void notifySymbolMetRequiredState(const SymbolStringPtr &Name,
0797 ExecutorSymbolDef Sym);
0798
0799
0800
0801 bool isComplete() const { return OutstandingSymbolsCount == 0; }
0802
0803
0804 private:
0805 void handleComplete(ExecutionSession &ES);
0806
0807 SymbolState getRequiredState() { return RequiredState; }
0808
0809 void addQueryDependence(JITDylib &JD, SymbolStringPtr Name);
0810
0811 void removeQueryDependence(JITDylib &JD, const SymbolStringPtr &Name);
0812
0813 void dropSymbol(const SymbolStringPtr &Name);
0814
0815 void handleFailed(Error Err);
0816
0817 void detach();
0818
0819 SymbolsResolvedCallback NotifyComplete;
0820 SymbolDependenceMap QueryRegistrations;
0821 SymbolMap ResolvedSymbols;
0822 size_t OutstandingSymbolsCount;
0823 SymbolState RequiredState;
0824 };
0825
0826
0827
0828
0829 class LookupState {
0830 friend class OrcV2CAPIHelper;
0831 friend class ExecutionSession;
0832
0833 public:
0834 LookupState();
0835 LookupState(LookupState &&);
0836 LookupState &operator=(LookupState &&);
0837 ~LookupState();
0838
0839
0840
0841 void continueLookup(Error Err);
0842
0843 private:
0844 LookupState(std::unique_ptr<InProgressLookupState> IPLS);
0845
0846
0847 void reset(InProgressLookupState *IPLS);
0848
0849 std::unique_ptr<InProgressLookupState> IPLS;
0850 };
0851
0852
0853
0854 class DefinitionGenerator {
0855 friend class ExecutionSession;
0856
0857 public:
0858 virtual ~DefinitionGenerator();
0859
0860
0861
0862
0863
0864
0865
0866 virtual Error tryToGenerate(LookupState &LS, LookupKind K, JITDylib &JD,
0867 JITDylibLookupFlags JDLookupFlags,
0868 const SymbolLookupSet &LookupSet) = 0;
0869
0870 private:
0871 std::mutex M;
0872 bool InUse = false;
0873 std::deque<LookupState> PendingLookups;
0874 };
0875
0876
0877
0878
0879
0880
0881
0882
0883
0884
0885
0886
0887
0888
0889
0890
0891
0892
0893
0894
0895
0896 class JITDylib : public ThreadSafeRefCountedBase<JITDylib>,
0897 public jitlink::JITLinkDylib {
0898 friend class AsynchronousSymbolQuery;
0899 friend class ExecutionSession;
0900 friend class Platform;
0901 friend class MaterializationResponsibility;
0902 public:
0903
0904 JITDylib(const JITDylib &) = delete;
0905 JITDylib &operator=(const JITDylib &) = delete;
0906 JITDylib(JITDylib &&) = delete;
0907 JITDylib &operator=(JITDylib &&) = delete;
0908 ~JITDylib();
0909
0910
0911
0912
0913
0914
0915
0916 ExecutionSession &getExecutionSession() const { return ES; }
0917
0918
0919
0920
0921 void dump(raw_ostream &OS);
0922
0923
0924
0925
0926
0927
0928
0929
0930
0931
0932
0933 Error clear();
0934
0935
0936
0937
0938
0939 ResourceTrackerSP getDefaultResourceTracker();
0940
0941
0942
0943
0944
0945 ResourceTrackerSP createResourceTracker();
0946
0947
0948
0949
0950
0951
0952
0953
0954
0955
0956 template <typename GeneratorT>
0957 GeneratorT &addGenerator(std::unique_ptr<GeneratorT> DefGenerator);
0958
0959
0960
0961
0962
0963
0964
0965
0966 void removeGenerator(DefinitionGenerator &G);
0967
0968
0969
0970
0971
0972
0973
0974
0975
0976
0977
0978
0979
0980
0981
0982
0983
0984
0985
0986
0987
0988
0989 void setLinkOrder(JITDylibSearchOrder NewSearchOrder,
0990 bool LinkAgainstThisJITDylibFirst = true);
0991
0992
0993
0994
0995 void addToLinkOrder(const JITDylibSearchOrder &NewLinks);
0996
0997
0998
0999
1000
1001
1002 void addToLinkOrder(JITDylib &JD,
1003 JITDylibLookupFlags JDLookupFlags =
1004 JITDylibLookupFlags::MatchExportedSymbolsOnly);
1005
1006
1007
1008
1009
1010
1011 void replaceInLinkOrder(JITDylib &OldJD, JITDylib &NewJD,
1012 JITDylibLookupFlags JDLookupFlags =
1013 JITDylibLookupFlags::MatchExportedSymbolsOnly);
1014
1015
1016
1017
1018
1019
1020 void removeFromLinkOrder(JITDylib &JD);
1021
1022
1023
1024
1025
1026 template <typename Func>
1027 auto withLinkOrderDo(Func &&F)
1028 -> decltype(F(std::declval<const JITDylibSearchOrder &>()));
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040 template <typename MaterializationUnitType>
1041 Error define(std::unique_ptr<MaterializationUnitType> &&MU,
1042 ResourceTrackerSP RT = nullptr);
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054 template <typename MaterializationUnitType>
1055 Error define(std::unique_ptr<MaterializationUnitType> &MU,
1056 ResourceTrackerSP RT = nullptr);
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071 Error remove(const SymbolNameSet &Names);
1072
1073
1074
1075
1076
1077
1078
1079 static Expected<std::vector<JITDylibSP>>
1080 getDFSLinkOrder(ArrayRef<JITDylibSP> JDs);
1081
1082
1083
1084
1085
1086
1087
1088 static Expected<std::vector<JITDylibSP>>
1089 getReverseDFSLinkOrder(ArrayRef<JITDylibSP> JDs);
1090
1091
1092
1093
1094
1095
1096 Expected<std::vector<JITDylibSP>> getDFSLinkOrder();
1097
1098
1099
1100
1101
1102
1103 Expected<std::vector<JITDylibSP>> getReverseDFSLinkOrder();
1104
1105 private:
1106 using AsynchronousSymbolQuerySet =
1107 std::set<std::shared_ptr<AsynchronousSymbolQuery>>;
1108
1109 using AsynchronousSymbolQueryList =
1110 std::vector<std::shared_ptr<AsynchronousSymbolQuery>>;
1111
1112 struct UnmaterializedInfo {
1113 UnmaterializedInfo(std::unique_ptr<MaterializationUnit> MU,
1114 ResourceTracker *RT)
1115 : MU(std::move(MU)), RT(RT) {}
1116
1117 std::unique_ptr<MaterializationUnit> MU;
1118 ResourceTracker *RT;
1119 };
1120
1121 using UnmaterializedInfosMap =
1122 DenseMap<SymbolStringPtr, std::shared_ptr<UnmaterializedInfo>>;
1123
1124 using UnmaterializedInfosList =
1125 std::vector<std::shared_ptr<UnmaterializedInfo>>;
1126
1127 struct EmissionDepUnit {
1128 EmissionDepUnit(JITDylib &JD) : JD(&JD) {}
1129
1130 JITDylib *JD = nullptr;
1131 DenseMap<NonOwningSymbolStringPtr, JITSymbolFlags> Symbols;
1132 DenseMap<JITDylib *, DenseSet<NonOwningSymbolStringPtr>> Dependencies;
1133 };
1134
1135 struct EmissionDepUnitInfo {
1136 std::shared_ptr<EmissionDepUnit> EDU;
1137 DenseSet<EmissionDepUnit *> IntraEmitUsers;
1138 DenseMap<JITDylib *, DenseSet<NonOwningSymbolStringPtr>> NewDeps;
1139 };
1140
1141
1142
1143
1144
1145
1146
1147 struct MaterializingInfo {
1148 friend class ExecutionSession;
1149
1150 std::shared_ptr<EmissionDepUnit> DefiningEDU;
1151 DenseSet<EmissionDepUnit *> DependantEDUs;
1152
1153 void addQuery(std::shared_ptr<AsynchronousSymbolQuery> Q);
1154 void removeQuery(const AsynchronousSymbolQuery &Q);
1155 AsynchronousSymbolQueryList takeQueriesMeeting(SymbolState RequiredState);
1156 AsynchronousSymbolQueryList takeAllPendingQueries() {
1157 return std::move(PendingQueries);
1158 }
1159 bool hasQueriesPending() const { return !PendingQueries.empty(); }
1160 const AsynchronousSymbolQueryList &pendingQueries() const {
1161 return PendingQueries;
1162 }
1163 private:
1164 AsynchronousSymbolQueryList PendingQueries;
1165 };
1166
1167 using MaterializingInfosMap = DenseMap<SymbolStringPtr, MaterializingInfo>;
1168
1169 class SymbolTableEntry {
1170 public:
1171 SymbolTableEntry() = default;
1172 SymbolTableEntry(JITSymbolFlags Flags)
1173 : Flags(Flags), State(static_cast<uint8_t>(SymbolState::NeverSearched)),
1174 MaterializerAttached(false) {}
1175
1176 ExecutorAddr getAddress() const { return Addr; }
1177 JITSymbolFlags getFlags() const { return Flags; }
1178 SymbolState getState() const { return static_cast<SymbolState>(State); }
1179
1180 bool hasMaterializerAttached() const { return MaterializerAttached; }
1181
1182 void setAddress(ExecutorAddr Addr) { this->Addr = Addr; }
1183 void setFlags(JITSymbolFlags Flags) { this->Flags = Flags; }
1184 void setState(SymbolState State) {
1185 assert(static_cast<uint8_t>(State) < (1 << 6) &&
1186 "State does not fit in bitfield");
1187 this->State = static_cast<uint8_t>(State);
1188 }
1189
1190 void setMaterializerAttached(bool MaterializerAttached) {
1191 this->MaterializerAttached = MaterializerAttached;
1192 }
1193
1194 ExecutorSymbolDef getSymbol() const { return {Addr, Flags}; }
1195
1196 private:
1197 ExecutorAddr Addr;
1198 JITSymbolFlags Flags;
1199 uint8_t State : 7;
1200 uint8_t MaterializerAttached : 1;
1201 };
1202
1203 using SymbolTable = DenseMap<SymbolStringPtr, SymbolTableEntry>;
1204
1205 JITDylib(ExecutionSession &ES, std::string Name);
1206
1207 struct RemoveTrackerResult {
1208 AsynchronousSymbolQuerySet QueriesToFail;
1209 std::shared_ptr<SymbolDependenceMap> FailedSymbols;
1210 std::vector<std::unique_ptr<MaterializationUnit>> DefunctMUs;
1211 };
1212
1213 RemoveTrackerResult IL_removeTracker(ResourceTracker &RT);
1214
1215 void transferTracker(ResourceTracker &DstRT, ResourceTracker &SrcRT);
1216
1217 Error defineImpl(MaterializationUnit &MU);
1218
1219 void installMaterializationUnit(std::unique_ptr<MaterializationUnit> MU,
1220 ResourceTracker &RT);
1221
1222 void detachQueryHelper(AsynchronousSymbolQuery &Q,
1223 const SymbolNameSet &QuerySymbols);
1224
1225 void transferEmittedNodeDependencies(MaterializingInfo &DependantMI,
1226 const SymbolStringPtr &DependantName,
1227 MaterializingInfo &EmittedMI);
1228
1229 Expected<SymbolFlagsMap>
1230 defineMaterializing(MaterializationResponsibility &FromMR,
1231 SymbolFlagsMap SymbolFlags);
1232
1233 Error replace(MaterializationResponsibility &FromMR,
1234 std::unique_ptr<MaterializationUnit> MU);
1235
1236 Expected<std::unique_ptr<MaterializationResponsibility>>
1237 delegate(MaterializationResponsibility &FromMR, SymbolFlagsMap SymbolFlags,
1238 SymbolStringPtr InitSymbol);
1239
1240 SymbolNameSet getRequestedSymbols(const SymbolFlagsMap &SymbolFlags) const;
1241
1242 void addDependencies(const SymbolStringPtr &Name,
1243 const SymbolDependenceMap &Dependants);
1244
1245 Error resolve(MaterializationResponsibility &MR, const SymbolMap &Resolved);
1246
1247 void unlinkMaterializationResponsibility(MaterializationResponsibility &MR);
1248
1249
1250
1251 void shrinkMaterializationInfoMemory();
1252
1253 ExecutionSession &ES;
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;
1260 JITDylibSearchOrder LinkOrder;
1261 ResourceTrackerSP DefaultTracker;
1262
1263
1264 DenseMap<ResourceTracker *, SymbolNameVector> TrackerSymbols;
1265 DenseMap<ResourceTracker *, DenseSet<MaterializationResponsibility *>>
1266 TrackerMRs;
1267 };
1268
1269
1270
1271
1272
1273 class Platform {
1274 public:
1275 virtual ~Platform();
1276
1277
1278
1279
1280
1281 virtual Error setupJITDylib(JITDylib &JD) = 0;
1282
1283
1284
1285 virtual Error teardownJITDylib(JITDylib &JD) = 0;
1286
1287
1288
1289 virtual Error notifyAdding(ResourceTracker &RT,
1290 const MaterializationUnit &MU) = 0;
1291
1292
1293
1294 virtual Error notifyRemoving(ResourceTracker &RT) = 0;
1295
1296
1297
1298
1299
1300 static Expected<DenseMap<JITDylib *, SymbolMap>>
1301 lookupInitSymbols(ExecutionSession &ES,
1302 const DenseMap<JITDylib *, SymbolLookupSet> &InitSyms);
1303
1304
1305
1306 static void
1307 lookupInitSymbolsAsync(unique_function<void(Error)> OnComplete,
1308 ExecutionSession &ES,
1309 const DenseMap<JITDylib *, SymbolLookupSet> &InitSyms);
1310 };
1311
1312
1313 class MaterializationTask : public RTTIExtends<MaterializationTask, Task> {
1314 public:
1315 static char ID;
1316
1317 MaterializationTask(std::unique_ptr<MaterializationUnit> MU,
1318 std::unique_ptr<MaterializationResponsibility> MR)
1319 : MU(std::move(MU)), MR(std::move(MR)) {}
1320 ~MaterializationTask() override;
1321 void printDescription(raw_ostream &OS) override;
1322 void run() override;
1323
1324 private:
1325 std::unique_ptr<MaterializationUnit> MU;
1326 std::unique_ptr<MaterializationResponsibility> MR;
1327 };
1328
1329
1330
1331
1332 class LookupTask : public RTTIExtends<LookupTask, Task> {
1333 public:
1334 static char ID;
1335
1336 LookupTask(LookupState LS) : LS(std::move(LS)) {}
1337 void printDescription(raw_ostream &OS) override;
1338 void run() override;
1339
1340 private:
1341 LookupState LS;
1342 };
1343
1344
1345 class ExecutionSession {
1346 friend class InProgressLookupFlagsState;
1347 friend class InProgressFullLookupState;
1348 friend class JITDylib;
1349 friend class LookupState;
1350 friend class MaterializationResponsibility;
1351 friend class ResourceTracker;
1352
1353 public:
1354
1355 using ErrorReporter = unique_function<void(Error)>;
1356
1357
1358 using SendResultFunction = unique_function<void(shared::WrapperFunctionResult)>;
1359
1360
1361
1362 using JITDispatchHandlerFunction = unique_function<void(
1363 SendResultFunction SendResult,
1364 const char *ArgData, size_t ArgSize)>;
1365
1366
1367
1368 using JITDispatchHandlerAssociationMap =
1369 DenseMap<SymbolStringPtr, JITDispatchHandlerFunction>;
1370
1371
1372
1373 ExecutionSession(std::unique_ptr<ExecutorProcessControl> EPC);
1374
1375
1376
1377 ~ExecutionSession();
1378
1379
1380
1381 Error endSession();
1382
1383
1384
1385 ExecutorProcessControl &getExecutorProcessControl() { return *EPC; }
1386
1387
1388 const Triple &getTargetTriple() const { return EPC->getTargetTriple(); }
1389
1390
1391 size_t getPageSize() const { return EPC->getPageSize(); }
1392
1393
1394 std::shared_ptr<SymbolStringPool> getSymbolStringPool() {
1395 return EPC->getSymbolStringPool();
1396 }
1397
1398
1399 SymbolStringPtr intern(StringRef SymName) { return EPC->intern(SymName); }
1400
1401
1402 void setPlatform(std::unique_ptr<Platform> P) { this->P = std::move(P); }
1403
1404
1405
1406 Platform *getPlatform() { return P.get(); }
1407
1408
1409 template <typename Func> decltype(auto) runSessionLocked(Func &&F) {
1410 std::lock_guard<std::recursive_mutex> Lock(SessionMutex);
1411 return F();
1412 }
1413
1414
1415
1416 void registerResourceManager(ResourceManager &RM);
1417
1418
1419
1420 void deregisterResourceManager(ResourceManager &RM);
1421
1422
1423
1424 JITDylib *getJITDylibByName(StringRef Name);
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434 JITDylib &createBareJITDylib(std::string Name);
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445 Expected<JITDylib &> createJITDylib(std::string Name);
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464 Error removeJITDylibs(std::vector<JITDylibSP> JDsToRemove);
1465
1466
1467 Error removeJITDylib(JITDylib &JD) {
1468 return removeJITDylibs(std::vector<JITDylibSP>({&JD}));
1469 }
1470
1471
1472 ExecutionSession &setErrorReporter(ErrorReporter ReportError) {
1473 this->ReportError = std::move(ReportError);
1474 return *this;
1475 }
1476
1477
1478
1479
1480 void reportError(Error Err) { ReportError(std::move(Err)); }
1481
1482
1483
1484 void lookupFlags(LookupKind K, JITDylibSearchOrder SearchOrder,
1485 SymbolLookupSet Symbols,
1486 unique_function<void(Expected<SymbolFlagsMap>)> OnComplete);
1487
1488
1489 Expected<SymbolFlagsMap> lookupFlags(LookupKind K,
1490 JITDylibSearchOrder SearchOrder,
1491 SymbolLookupSet Symbols);
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512 void lookup(LookupKind K, const JITDylibSearchOrder &SearchOrder,
1513 SymbolLookupSet Symbols, SymbolState RequiredState,
1514 SymbolsResolvedCallback NotifyComplete,
1515 RegisterDependenciesFunction RegisterDependencies);
1516
1517
1518
1519
1520
1521
1522
1523
1524 Expected<SymbolMap> lookup(const JITDylibSearchOrder &SearchOrder,
1525 SymbolLookupSet Symbols,
1526 LookupKind K = LookupKind::Static,
1527 SymbolState RequiredState = SymbolState::Ready,
1528 RegisterDependenciesFunction RegisterDependencies =
1529 NoDependenciesToRegister);
1530
1531
1532
1533
1534 Expected<ExecutorSymbolDef>
1535 lookup(const JITDylibSearchOrder &SearchOrder, SymbolStringPtr Symbol,
1536 SymbolState RequiredState = SymbolState::Ready);
1537
1538
1539
1540
1541 Expected<ExecutorSymbolDef>
1542 lookup(ArrayRef<JITDylib *> SearchOrder, SymbolStringPtr Symbol,
1543 SymbolState RequiredState = SymbolState::Ready);
1544
1545
1546
1547
1548 Expected<ExecutorSymbolDef>
1549 lookup(ArrayRef<JITDylib *> SearchOrder, StringRef Symbol,
1550 SymbolState RequiredState = SymbolState::Ready);
1551
1552
1553 void dispatchTask(std::unique_ptr<Task> T) {
1554 assert(T && "T must be non-null");
1555 DEBUG_WITH_TYPE("orc", dumpDispatchInfo(*T));
1556 EPC->getDispatcher().dispatch(std::move(T));
1557 }
1558
1559
1560 const StringMap<std::vector<char>> &getBootstrapMap() const {
1561 return EPC->getBootstrapMap();
1562 }
1563
1564
1565 template <typename T, typename SPSTagT>
1566 Error getBootstrapMapValue(StringRef Key, std::optional<T> &Val) const {
1567 return EPC->getBootstrapMapValue<T, SPSTagT>(Key, Val);
1568 }
1569
1570
1571 const StringMap<ExecutorAddr> &getBootstrapSymbolsMap() const {
1572 return EPC->getBootstrapSymbolsMap();
1573 }
1574
1575
1576
1577
1578 Error getBootstrapSymbols(
1579 ArrayRef<std::pair<ExecutorAddr &, StringRef>> Pairs) const {
1580 return EPC->getBootstrapSymbols(Pairs);
1581 }
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592 template <typename... ArgTs>
1593 void callWrapperAsync(ArgTs &&... Args) {
1594 EPC->callWrapperAsync(std::forward<ArgTs>(Args)...);
1595 }
1596
1597
1598
1599
1600
1601
1602
1603 shared::WrapperFunctionResult callWrapper(ExecutorAddr WrapperFnAddr,
1604 ArrayRef<char> ArgBuffer) {
1605 return EPC->callWrapper(WrapperFnAddr, ArgBuffer);
1606 }
1607
1608
1609
1610 template <typename SPSSignature, typename SendResultT, typename... ArgTs>
1611 void callSPSWrapperAsync(ExecutorAddr WrapperFnAddr, SendResultT &&SendResult,
1612 const ArgTs &...Args) {
1613 EPC->callSPSWrapperAsync<SPSSignature, SendResultT, ArgTs...>(
1614 WrapperFnAddr, std::forward<SendResultT>(SendResult), Args...);
1615 }
1616
1617
1618
1619
1620
1621
1622 template <typename SPSSignature, typename... WrapperCallArgTs>
1623 Error callSPSWrapper(ExecutorAddr WrapperFnAddr,
1624 WrapperCallArgTs &&...WrapperCallArgs) {
1625 return EPC->callSPSWrapper<SPSSignature, WrapperCallArgTs...>(
1626 WrapperFnAddr, std::forward<WrapperCallArgTs>(WrapperCallArgs)...);
1627 }
1628
1629
1630
1631
1632
1633
1634
1635
1636 template <typename SPSSignature, typename HandlerT>
1637 static JITDispatchHandlerFunction wrapAsyncWithSPS(HandlerT &&H) {
1638 return [H = std::forward<HandlerT>(H)](
1639 SendResultFunction SendResult,
1640 const char *ArgData, size_t ArgSize) mutable {
1641 shared::WrapperFunction<SPSSignature>::handleAsync(ArgData, ArgSize, H,
1642 std::move(SendResult));
1643 };
1644 }
1645
1646
1647
1648
1649
1650
1651
1652
1653 template <typename SPSSignature, typename ClassT, typename... MethodArgTs>
1654 static JITDispatchHandlerFunction
1655 wrapAsyncWithSPS(ClassT *Instance, void (ClassT::*Method)(MethodArgTs...)) {
1656 return wrapAsyncWithSPS<SPSSignature>(
1657 [Instance, Method](MethodArgTs &&...MethodArgs) {
1658 (Instance->*Method)(std::forward<MethodArgTs>(MethodArgs)...);
1659 });
1660 }
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671 Error registerJITDispatchHandlers(JITDylib &JD,
1672 JITDispatchHandlerAssociationMap WFs);
1673
1674
1675
1676
1677 void runJITDispatchHandler(SendResultFunction SendResult,
1678 ExecutorAddr HandlerFnTagAddr,
1679 ArrayRef<char> ArgBuffer);
1680
1681
1682 void dump(raw_ostream &OS);
1683
1684
1685 #ifdef EXPENSIVE_CHECKS
1686 bool verifySessionState(Twine Phase);
1687 #endif
1688
1689 private:
1690 static void logErrorsToStdErr(Error Err) {
1691 logAllUnhandledErrors(std::move(Err), errs(), "JIT session error: ");
1692 }
1693
1694 void dispatchOutstandingMUs();
1695
1696 static std::unique_ptr<MaterializationResponsibility>
1697 createMaterializationResponsibility(ResourceTracker &RT,
1698 SymbolFlagsMap Symbols,
1699 SymbolStringPtr InitSymbol) {
1700 auto &JD = RT.getJITDylib();
1701 std::unique_ptr<MaterializationResponsibility> MR(
1702 new MaterializationResponsibility(&RT, std::move(Symbols),
1703 std::move(InitSymbol)));
1704 JD.TrackerMRs[&RT].insert(MR.get());
1705 return MR;
1706 }
1707
1708 Error removeResourceTracker(ResourceTracker &RT);
1709 void transferResourceTracker(ResourceTracker &DstRT, ResourceTracker &SrcRT);
1710 void destroyResourceTracker(ResourceTracker &RT);
1711
1712
1713
1714
1715
1716
1717 Error IL_updateCandidatesFor(JITDylib &JD, JITDylibLookupFlags JDLookupFlags,
1718 SymbolLookupSet &Candidates,
1719 SymbolLookupSet *NonCandidates);
1720
1721
1722 void OL_resumeLookupAfterGeneration(InProgressLookupState &IPLS);
1723
1724
1725
1726
1727 void OL_applyQueryPhase1(std::unique_ptr<InProgressLookupState> IPLS,
1728 Error Err);
1729
1730
1731
1732
1733
1734 void OL_completeLookup(std::unique_ptr<InProgressLookupState> IPLS,
1735 std::shared_ptr<AsynchronousSymbolQuery> Q,
1736 RegisterDependenciesFunction RegisterDependencies);
1737
1738
1739
1740 void OL_completeLookupFlags(
1741 std::unique_ptr<InProgressLookupState> IPLS,
1742 unique_function<void(Expected<SymbolFlagsMap>)> OnComplete);
1743
1744
1745 void OL_destroyMaterializationResponsibility(
1746 MaterializationResponsibility &MR);
1747 SymbolNameSet OL_getRequestedSymbols(const MaterializationResponsibility &MR);
1748 Error OL_notifyResolved(MaterializationResponsibility &MR,
1749 const SymbolMap &Symbols);
1750
1751 using EDUInfosMap =
1752 DenseMap<JITDylib::EmissionDepUnit *, JITDylib::EmissionDepUnitInfo>;
1753
1754 template <typename HandleNewDepFn>
1755 void propagateExtraEmitDeps(std::deque<JITDylib::EmissionDepUnit *> Worklist,
1756 EDUInfosMap &EDUInfos,
1757 HandleNewDepFn HandleNewDep);
1758 EDUInfosMap simplifyDepGroups(MaterializationResponsibility &MR,
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);
1767
1768 static Error makeJDClosedError(JITDylib::EmissionDepUnit &EDU,
1769 JITDylib &ClosedJD);
1770 static Error makeUnsatisfiedDepsError(JITDylib::EmissionDepUnit &EDU,
1771 JITDylib &BadJD, SymbolNameSet BadDeps);
1772
1773 Expected<JITDylib::AsynchronousSymbolQuerySet>
1774 IL_emit(MaterializationResponsibility &MR, EDUInfosMap EDUInfos);
1775 Error OL_notifyEmitted(MaterializationResponsibility &MR,
1776 ArrayRef<SymbolDependenceGroup> EmittedDeps);
1777
1778 Error OL_defineMaterializing(MaterializationResponsibility &MR,
1779 SymbolFlagsMap SymbolFlags);
1780
1781 std::pair<JITDylib::AsynchronousSymbolQuerySet,
1782 std::shared_ptr<SymbolDependenceMap>>
1783 IL_failSymbols(JITDylib &JD, const SymbolNameVector &SymbolsToFail);
1784 void OL_notifyFailed(MaterializationResponsibility &MR);
1785 Error OL_replace(MaterializationResponsibility &MR,
1786 std::unique_ptr<MaterializationUnit> MU);
1787 Expected<std::unique_ptr<MaterializationResponsibility>>
1788 OL_delegate(MaterializationResponsibility &MR, const SymbolNameSet &Symbols);
1789
1790 #ifndef NDEBUG
1791 void dumpDispatchInfo(Task &T);
1792 #endif
1793
1794 mutable std::recursive_mutex SessionMutex;
1795 bool SessionOpen = true;
1796 std::unique_ptr<ExecutorProcessControl> EPC;
1797 std::unique_ptr<Platform> P;
1798 ErrorReporter ReportError = logErrorsToStdErr;
1799
1800 std::vector<ResourceManager *> ResourceManagers;
1801
1802 std::vector<JITDylibSP> JDs;
1803
1804
1805
1806 mutable std::recursive_mutex OutstandingMUsMutex;
1807 std::vector<std::pair<std::unique_ptr<MaterializationUnit>,
1808 std::unique_ptr<MaterializationResponsibility>>>
1809 OutstandingMUs;
1810
1811 mutable std::mutex JITDispatchHandlersMutex;
1812 DenseMap<ExecutorAddr, std::shared_ptr<JITDispatchHandlerFunction>>
1813 JITDispatchHandlers;
1814 };
1815
1816 inline Expected<ExecutorSymbolDef> SymbolInstance::lookup() const {
1817 return JD->getExecutionSession().lookup({JD.get()}, Name);
1818 }
1819
1820 template <typename Func> Error ResourceTracker::withResourceKeyDo(Func &&F) {
1821 return getJITDylib().getExecutionSession().runSessionLocked([&]() -> Error {
1822 if (isDefunct())
1823 return make_error<ResourceTrackerDefunct>(this);
1824 F(getKeyUnsafe());
1825 return Error::success();
1826 });
1827 }
1828
1829 inline ExecutionSession &
1830 MaterializationResponsibility::getExecutionSession() const {
1831 return JD.getExecutionSession();
1832 }
1833
1834 template <typename GeneratorT>
1835 GeneratorT &JITDylib::addGenerator(std::unique_ptr<GeneratorT> DefGenerator) {
1836 auto &G = *DefGenerator;
1837 ES.runSessionLocked([&] {
1838 assert(State == Open && "Cannot add generator to closed JITDylib");
1839 DefGenerators.push_back(std::move(DefGenerator));
1840 });
1841 return G;
1842 }
1843
1844 template <typename Func>
1845 auto JITDylib::withLinkOrderDo(Func &&F)
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); });
1849 }
1850
1851 template <typename MaterializationUnitType>
1852 Error JITDylib::define(std::unique_ptr<MaterializationUnitType> &&MU,
1853 ResourceTrackerSP RT) {
1854 assert(MU && "Can not define with a null MU");
1855
1856 if (MU->getSymbols().empty()) {
1857
1858 DEBUG_WITH_TYPE("orc", {
1859 dbgs() << "Warning: Discarding empty MU " << MU->getName() << " for "
1860 << getName() << "\n";
1861 });
1862 return Error::success();
1863 } else
1864 DEBUG_WITH_TYPE("orc", {
1865 dbgs() << "Defining MU " << MU->getName() << " for " << getName()
1866 << " (tracker: ";
1867 if (RT == getDefaultResourceTracker())
1868 dbgs() << "default)";
1869 else if (RT)
1870 dbgs() << RT.get() << ")\n";
1871 else
1872 dbgs() << "0x0, default will be used)\n";
1873 });
1874
1875 return ES.runSessionLocked([&, this]() -> Error {
1876 assert(State == Open && "JD is defunct");
1877
1878 if (auto Err = defineImpl(*MU))
1879 return Err;
1880
1881 if (!RT)
1882 RT = getDefaultResourceTracker();
1883
1884 if (auto *P = ES.getPlatform()) {
1885 if (auto Err = P->notifyAdding(*RT, *MU))
1886 return Err;
1887 }
1888
1889 installMaterializationUnit(std::move(MU), *RT);
1890 return Error::success();
1891 });
1892 }
1893
1894 template <typename MaterializationUnitType>
1895 Error JITDylib::define(std::unique_ptr<MaterializationUnitType> &MU,
1896 ResourceTrackerSP RT) {
1897 assert(MU && "Can not define with a null MU");
1898
1899 if (MU->getSymbols().empty()) {
1900
1901 DEBUG_WITH_TYPE("orc", {
1902 dbgs() << "Warning: Discarding empty MU " << MU->getName() << getName()
1903 << "\n";
1904 });
1905 return Error::success();
1906 } else
1907 DEBUG_WITH_TYPE("orc", {
1908 dbgs() << "Defining MU " << MU->getName() << " for " << getName()
1909 << " (tracker: ";
1910 if (RT == getDefaultResourceTracker())
1911 dbgs() << "default)";
1912 else if (RT)
1913 dbgs() << RT.get() << ")\n";
1914 else
1915 dbgs() << "0x0, default will be used)\n";
1916 });
1917
1918 return ES.runSessionLocked([&, this]() -> Error {
1919 assert(State == Open && "JD is defunct");
1920
1921 if (auto Err = defineImpl(*MU))
1922 return Err;
1923
1924 if (!RT)
1925 RT = getDefaultResourceTracker();
1926
1927 if (auto *P = ES.getPlatform()) {
1928 if (auto Err = P->notifyAdding(*RT, *MU))
1929 return Err;
1930 }
1931
1932 installMaterializationUnit(std::move(MU), *RT);
1933 return Error::success();
1934 });
1935 }
1936
1937
1938
1939 class ReexportsGenerator : public DefinitionGenerator {
1940 public:
1941 using SymbolPredicate = std::function<bool(SymbolStringPtr)>;
1942
1943
1944
1945
1946 ReexportsGenerator(JITDylib &SourceJD,
1947 JITDylibLookupFlags SourceJDLookupFlags,
1948 SymbolPredicate Allow = SymbolPredicate());
1949
1950 Error tryToGenerate(LookupState &LS, LookupKind K, JITDylib &JD,
1951 JITDylibLookupFlags JDLookupFlags,
1952 const SymbolLookupSet &LookupSet) override;
1953
1954 private:
1955 JITDylib &SourceJD;
1956 JITDylibLookupFlags SourceJDLookupFlags;
1957 SymbolPredicate Allow;
1958 };
1959
1960
1961
1962
1963
1964 inline MaterializationResponsibility::~MaterializationResponsibility() {
1965 getExecutionSession().OL_destroyMaterializationResponsibility(*this);
1966 }
1967
1968 inline SymbolNameSet MaterializationResponsibility::getRequestedSymbols() const {
1969 return getExecutionSession().OL_getRequestedSymbols(*this);
1970 }
1971
1972 inline Error MaterializationResponsibility::notifyResolved(
1973 const SymbolMap &Symbols) {
1974 return getExecutionSession().OL_notifyResolved(*this, Symbols);
1975 }
1976
1977 inline Error MaterializationResponsibility::notifyEmitted(
1978 ArrayRef<SymbolDependenceGroup> EmittedDeps) {
1979 return getExecutionSession().OL_notifyEmitted(*this, EmittedDeps);
1980 }
1981
1982 inline Error MaterializationResponsibility::defineMaterializing(
1983 SymbolFlagsMap SymbolFlags) {
1984 return getExecutionSession().OL_defineMaterializing(*this,
1985 std::move(SymbolFlags));
1986 }
1987
1988 inline void MaterializationResponsibility::failMaterialization() {
1989 getExecutionSession().OL_notifyFailed(*this);
1990 }
1991
1992 inline Error MaterializationResponsibility::replace(
1993 std::unique_ptr<MaterializationUnit> MU) {
1994 return getExecutionSession().OL_replace(*this, std::move(MU));
1995 }
1996
1997 inline Expected<std::unique_ptr<MaterializationResponsibility>>
1998 MaterializationResponsibility::delegate(const SymbolNameSet &Symbols) {
1999 return getExecutionSession().OL_delegate(*this, Symbols);
2000 }
2001
2002 }
2003 }
2004
2005 #endif