12#include "llvm/Config/llvm-config.h" 
   19#include <condition_variable> 
   23#define DEBUG_TYPE "orc" 
   41void MaterializationUnit::anchor() {}
 
   44  assert((
reinterpret_cast<uintptr_t
>(JD.get()) & 0x1) == 0 &&
 
   45         "JITDylib must be two byte aligned");
 
   47  JDAndFlag.store(
reinterpret_cast<uintptr_t
>(JD.get()));
 
   63void ResourceTracker::makeDefunct() {
 
   64  uintptr_t Val = JDAndFlag.load();
 
   79  OS << 
"Resource tracker " << (
void *)RT.get() << 
" became defunct";
 
 
   83    std::shared_ptr<SymbolStringPool> SSP,
 
   84    std::shared_ptr<SymbolDependenceMap> Symbols)
 
   86  assert(this->SSP && 
"String pool cannot be null");
 
   87  assert(!this->Symbols->empty() && 
"Can not fail to resolve an empty set");
 
   91  for (
auto &[JD, Syms] : *this->Symbols)
 
 
   96  for (
auto &[JD, Syms] : *Symbols)
 
 
  105  OS << 
"Failed to materialize symbols: " << *Symbols;
 
 
  109    std::shared_ptr<SymbolStringPool> SSP, 
JITDylibSP JD,
 
  111    std::string Explanation)
 
  113      FailedSymbols(
std::
move(FailedSymbols)), BadDeps(
std::
move(BadDeps)),
 
  114      Explanation(
std::
move(Explanation)) {}
 
 
  121  OS << 
"In " << JD->getName() << 
", failed to materialize " << FailedSymbols
 
  122     << 
", due to unsatisfied dependencies " << BadDeps;
 
  123  if (!Explanation.empty())
 
  124    OS << 
" (" << Explanation << 
")";
 
 
  131  assert(!this->Symbols.
empty() && 
"Can not fail to resolve an empty set");
 
 
  137  assert(!this->Symbols.empty() && 
"Can not fail to resolve an empty set");
 
 
  145  OS << 
"Symbols not found: " << Symbols;
 
 
  149    std::shared_ptr<SymbolStringPool> SSP, 
SymbolNameSet Symbols)
 
  151  assert(!this->Symbols.
empty() && 
"Can not fail to resolve an empty set");
 
 
  159  OS << 
"Symbols could not be removed: " << Symbols;
 
 
  167  OS << 
"Missing definitions in module " << ModuleName
 
 
  176  OS << 
"Unexpected definitions in module " << ModuleName
 
 
  181  JD->getExecutionSession().lookup(
 
  184      [OnComplete = std::move(OnComplete)
 
  191          assert(
Result->size() == 1 && 
"Unexpected number of results");
 
  193                 "Result does not contain expected symbol");
 
  194          OnComplete(
Result->begin()->second);
 
  196          OnComplete(
Result.takeError());
 
 
  204    : NotifyComplete(
std::
move(NotifyComplete)), RequiredState(RequiredState) {
 
  206         "Cannot query for a symbols that have not reached the resolve state " 
  209  OutstandingSymbolsCount = Symbols.size();
 
  211  for (
auto &[Name, Flags] : Symbols)
 
 
  217  auto I = ResolvedSymbols.find(Name);
 
  218  assert(
I != ResolvedSymbols.end() &&
 
  219         "Resolving symbol outside the requested set");
 
  221         "Redundantly resolving symbol Name");
 
  226    ResolvedSymbols.erase(
I);
 
  228    I->second = std::move(Sym);
 
  229  --OutstandingSymbolsCount;
 
 
  233  assert(OutstandingSymbolsCount == 0 &&
 
  234         "Symbols remain, handleComplete called prematurely");
 
  236  class RunQueryCompleteTask : 
public Task {
 
  238    RunQueryCompleteTask(
SymbolMap ResolvedSymbols,
 
  240        : ResolvedSymbols(
std::
move(ResolvedSymbols)),
 
  241          NotifyComplete(
std::
move(NotifyComplete)) {}
 
  243      OS << 
"Execute query complete callback for " << ResolvedSymbols;
 
  245    void run()
 override { NotifyComplete(std::move(ResolvedSymbols)); }
 
  252  auto T = std::make_unique<RunQueryCompleteTask>(std::move(ResolvedSymbols),
 
  253                                                  std::move(NotifyComplete));
 
  258void AsynchronousSymbolQuery::handleFailed(
Error Err) {
 
  259  assert(QueryRegistrations.empty() && ResolvedSymbols.empty() &&
 
  260         OutstandingSymbolsCount == 0 &&
 
  261         "Query should already have been abandoned");
 
  262  NotifyComplete(std::move(Err));
 
  266void AsynchronousSymbolQuery::addQueryDependence(
JITDylib &JD,
 
  268  bool Added = QueryRegistrations[&JD].insert(std::move(Name)).second;
 
  270  assert(Added && 
"Duplicate dependence notification?");
 
  273void AsynchronousSymbolQuery::removeQueryDependence(
 
  275  auto QRI = QueryRegistrations.find(&JD);
 
  276  assert(QRI != QueryRegistrations.end() &&
 
  277         "No dependencies registered for JD");
 
  278  assert(QRI->second.count(Name) && 
"No dependency on Name in JD");
 
  279  QRI->second.erase(Name);
 
  280  if (QRI->second.empty())
 
  281    QueryRegistrations.erase(QRI);
 
  285  auto I = ResolvedSymbols.find(Name);
 
  286  assert(
I != ResolvedSymbols.end() &&
 
  287         "Redundant removal of weakly-referenced symbol");
 
  288  ResolvedSymbols.erase(
I);
 
  289  --OutstandingSymbolsCount;
 
  292void AsynchronousSymbolQuery::detach() {
 
  293  ResolvedSymbols.clear();
 
  294  OutstandingSymbolsCount = 0;
 
  295  for (
auto &[JD, Syms] : QueryRegistrations)
 
  296    JD->detachQueryHelper(*
this, Syms);
 
  297  QueryRegistrations.clear();
 
  304      SourceJDLookupFlags(SourceJDLookupFlags), Aliases(
std::
move(Aliases)) {}
 
 
  307  return "<Reexports>";
 
 
  310void ReExportsMaterializationUnit::materialize(
 
  311    std::unique_ptr<MaterializationResponsibility> R) {
 
  313  auto &ES = R->getTargetJITDylib().getExecutionSession();
 
  314  JITDylib &TgtJD = R->getTargetJITDylib();
 
  315  JITDylib &SrcJD = SourceJD ? *SourceJD : TgtJD;
 
  320  auto RequestedSymbols = R->getRequestedSymbols();
 
  323  for (
auto &Name : RequestedSymbols) {
 
  324    auto I = Aliases.
find(Name);
 
  325    assert(
I != Aliases.
end() && 
"Symbol not found in aliases map?");
 
  326    RequestedAliases[Name] = std::move(
I->second);
 
  332      dbgs() << 
"materializing reexports: target = " << TgtJD.
getName()
 
  333             << 
", source = " << SrcJD.
getName() << 
" " << RequestedAliases
 
  338  if (!Aliases.empty()) {
 
  339    auto Err = SourceJD ? 
R->replace(
reexports(*SourceJD, std::move(Aliases),
 
  340                                               SourceJDLookupFlags))
 
  347      R->failMaterialization();
 
  354  struct OnResolveInfo {
 
  355    OnResolveInfo(std::unique_ptr<MaterializationResponsibility> R,
 
  356                  SymbolAliasMap Aliases)
 
  357        : 
R(std::
move(
R)), Aliases(std::
move(Aliases)) {}
 
  359    std::unique_ptr<MaterializationResponsibility> 
R;
 
  361    std::vector<SymbolDependenceGroup> SDGs;
 
  372  std::vector<std::pair<SymbolLookupSet, std::shared_ptr<OnResolveInfo>>>
 
  374  while (!RequestedAliases.
empty()) {
 
  375    SymbolNameSet ResponsibilitySymbols;
 
  376    SymbolLookupSet QuerySymbols;
 
  377    SymbolAliasMap QueryAliases;
 
  380    for (auto &KV : RequestedAliases) {
 
  382      if (&SrcJD == &TgtJD && (QueryAliases.count(KV.second.Aliasee) ||
 
  383                               RequestedAliases.count(KV.second.Aliasee)))
 
  386      ResponsibilitySymbols.insert(KV.first);
 
  387      QuerySymbols.add(KV.second.Aliasee,
 
  388                       KV.second.AliasFlags.hasMaterializationSideEffectsOnly()
 
  389                           ? SymbolLookupFlags::WeaklyReferencedSymbol
 
  390                           : SymbolLookupFlags::RequiredSymbol);
 
  391      QueryAliases[KV.first] = std::move(KV.second);
 
  395    for (
auto &KV : QueryAliases)
 
  396      RequestedAliases.
erase(KV.first);
 
  398    assert(!QuerySymbols.empty() && 
"Alias cycle detected!");
 
  400    auto NewR = 
R->delegate(ResponsibilitySymbols);
 
  403      R->failMaterialization();
 
  407    auto QueryInfo = std::make_shared<OnResolveInfo>(std::move(*NewR),
 
  408                                                     std::move(QueryAliases));
 
  409    QueryInfos.push_back(
 
  410        make_pair(std::move(QuerySymbols), std::move(QueryInfo)));
 
  414  while (!QueryInfos.empty()) {
 
  415    auto QuerySymbols = std::move(QueryInfos.back().first);
 
  416    auto QueryInfo = std::move(QueryInfos.back().second);
 
  418    QueryInfos.pop_back();
 
  420    auto RegisterDependencies = [QueryInfo,
 
  427      assert(Deps.size() == 1 && Deps.count(&SrcJD) &&
 
  428             "Unexpected dependencies for reexports");
 
  430      auto &SrcJDDeps = Deps.find(&SrcJD)->second;
 
  432      for (
auto &[Alias, AliasInfo] : QueryInfo->Aliases)
 
  433        if (SrcJDDeps.count(AliasInfo.Aliasee))
 
  434          QueryInfo->SDGs.push_back({{Alias}, {{&SrcJD, {AliasInfo.Aliasee}}}});
 
  437    auto OnComplete = [QueryInfo](Expected<SymbolMap> 
Result) {
 
  438      auto &ES = QueryInfo->R->getTargetJITDylib().getExecutionSession();
 
  441        for (
auto &KV : QueryInfo->Aliases) {
 
  442          assert((KV.second.AliasFlags.hasMaterializationSideEffectsOnly() ||
 
  443                  Result->count(KV.second.Aliasee)) &&
 
  444                 "Result map missing entry?");
 
  446          if (KV.second.AliasFlags.hasMaterializationSideEffectsOnly())
 
  449          ResolutionMap[KV.first] = {(*Result)[KV.second.Aliasee].getAddress(),
 
  450                                     KV.second.AliasFlags};
 
  452        if (
auto Err = QueryInfo->R->notifyResolved(ResolutionMap)) {
 
  454          QueryInfo->R->failMaterialization();
 
  457        if (
auto Err = QueryInfo->R->notifyEmitted(QueryInfo->SDGs)) {
 
  459          QueryInfo->R->failMaterialization();
 
  464        QueryInfo->R->failMaterialization();
 
  471              std::move(RegisterDependencies));
 
  475void ReExportsMaterializationUnit::discard(
const JITDylib &JD,
 
  476                                           const SymbolStringPtr &Name) {
 
  477  assert(Aliases.count(Name) &&
 
  478         "Symbol not covered by this MaterializationUnit");
 
  482MaterializationUnit::Interface
 
  483ReExportsMaterializationUnit::extractFlags(
const SymbolAliasMap &Aliases) {
 
  485  for (
auto &KV : Aliases)
 
  488  return MaterializationUnit::Interface(std::move(SymbolFlags), 
nullptr);
 
  499    return Flags.takeError();
 
  502  for (
auto &Name : Symbols) {
 
  503    assert(Flags->count(Name) && 
"Missing entry in flags map");
 
 
  522  virtual void complete(std::unique_ptr<InProgressLookupState> IPLS) = 0;
 
  539  } GenState = NotInGenerator;
 
 
  550        OnComplete(
std::
move(OnComplete)) {}
 
 
  552  void complete(std::unique_ptr<InProgressLookupState> IPLS)
 override {
 
  553    auto &ES = 
SearchOrder.front().first->getExecutionSession();
 
  554    ES.OL_completeLookupFlags(std::move(IPLS), std::move(OnComplete));
 
 
  557  void fail(
Error Err)
 override { OnComplete(std::move(Err)); }
 
 
  568                            std::shared_ptr<AsynchronousSymbolQuery> Q,
 
  572        Q(
std::
move(Q)), RegisterDependencies(
std::
move(RegisterDependencies)) {
 
 
  575  void complete(std::unique_ptr<InProgressLookupState> IPLS)
 override {
 
  576    auto &ES = 
SearchOrder.front().first->getExecutionSession();
 
  577    ES.OL_completeLookup(std::move(IPLS), std::move(Q),
 
  578                         std::move(RegisterDependencies));
 
 
  583    Q->handleFailed(std::move(Err));
 
 
  587  std::shared_ptr<AsynchronousSymbolQuery> Q;
 
 
  594    : SourceJD(SourceJD), SourceJDLookupFlags(SourceJDLookupFlags),
 
 
  601  assert(&JD != &SourceJD && 
"Cannot re-export from the same dylib");
 
  605      K, {{&SourceJD, JDLookupFlags}}, LookupSet);
 
  607    return Flags.takeError();
 
  611  for (
auto &KV : *Flags)
 
  612    if (!Allow || Allow(KV.first))
 
  615  if (AliasMap.empty())
 
 
  625void LookupState::reset(InProgressLookupState *IPLS) { this->IPLS.reset(IPLS); }
 
  633  assert(IPLS && 
"Cannot call continueLookup on empty LookupState");
 
  634  auto &ES = IPLS->SearchOrder.begin()->first->getExecutionSession();
 
  635  ES.OL_applyQueryPhase1(std::move(IPLS), std::move(Err));
 
 
  639  std::deque<LookupState> LookupsToFail;
 
  641    std::lock_guard<std::mutex> Lock(M);
 
  642    std::swap(PendingLookups, LookupsToFail);
 
  646  for (
auto &LS : LookupsToFail)
 
  648        "Query waiting on DefinitionGenerator that was destroyed",
 
 
  657  std::vector<ResourceTrackerSP> TrackersToRemove;
 
  658  ES.runSessionLocked([&]() {
 
  659    assert(State != Closed && 
"JD is defunct");
 
  660    for (
auto &KV : TrackerSymbols)
 
  661      TrackersToRemove.push_back(KV.first);
 
  666  for (
auto &RT : TrackersToRemove)
 
  667    Err = 
joinErrors(std::move(Err), RT->remove());
 
 
  672  return ES.runSessionLocked([
this] {
 
  673    assert(State != Closed && 
"JD is defunct");
 
  676    return DefaultTracker;
 
 
  681  return ES.runSessionLocked([
this] {
 
  682    assert(State == Open && 
"JD is defunct");
 
 
  691  std::shared_ptr<DefinitionGenerator> TmpDG;
 
  693  ES.runSessionLocked([&] {
 
  694    assert(State == Open && 
"JD is defunct");
 
  696                           [&](
const std::shared_ptr<DefinitionGenerator> &
H) {
 
  697                             return H.get() == &
G;
 
  699    assert(
I != DefGenerators.end() && 
"Generator not found");
 
  700    TmpDG = std::move(*
I);
 
  701    DefGenerators.erase(
I);
 
 
  710    if (FromMR.RT->isDefunct())
 
  713    std::vector<NonOwningSymbolStringPtr> AddedSyms;
 
  714    std::vector<NonOwningSymbolStringPtr> RejectedWeakDefs;
 
  716    for (
auto SFItr = SymbolFlags.begin(), SFEnd = SymbolFlags.end();
 
  717         SFItr != SFEnd; ++SFItr) {
 
  719      auto &Name = SFItr->first;
 
  720      auto &Flags = SFItr->second;
 
  722      auto EntryItr = Symbols.
find(Name);
 
  725      if (EntryItr != Symbols.
end()) {
 
  728        if (!Flags.isWeak()) {
 
  730          for (
auto &S : AddedSyms)
 
  735              std::string(*Name), 
"defineMaterializing operation");
 
  739        RejectedWeakDefs.push_back(NonOwningSymbolStringPtr(Name));
 
  743          Symbols.
insert(std::make_pair(Name, SymbolTableEntry(Flags))).first;
 
  745      AddedSyms.push_back(NonOwningSymbolStringPtr(Name));
 
  750    while (!RejectedWeakDefs.empty()) {
 
  752      RejectedWeakDefs.pop_back();
 
  760                        std::unique_ptr<MaterializationUnit> MU) {
 
  761  assert(MU != 
nullptr && 
"Can not replace with a null MaterializationUnit");
 
  762  std::unique_ptr<MaterializationUnit> MustRunMU;
 
  763  std::unique_ptr<MaterializationResponsibility> MustRunMR;
 
  766      ES.runSessionLocked([&, 
this]() -> 
Error {
 
  767        if (FromMR.RT->isDefunct())
 
  771        for (
auto &KV : MU->getSymbols()) {
 
  772          auto SymI = Symbols.find(KV.first);
 
  773          assert(SymI != Symbols.end() && 
"Replacing unknown symbol");
 
  775                 "Can not replace a symbol that ha is not materializing");
 
  776          assert(!SymI->second.hasMaterializerAttached() &&
 
  777                 "Symbol should not have materializer attached already");
 
  778          assert(UnmaterializedInfos.count(KV.first) == 0 &&
 
  779                 "Symbol being replaced should have no UnmaterializedInfo");
 
  787        for (
auto &KV : MU->getSymbols()) {
 
  788          auto MII = MaterializingInfos.find(KV.first);
 
  789          if (MII != MaterializingInfos.end()) {
 
  790            if (MII->second.hasQueriesPending()) {
 
  791              MustRunMR = ES.createMaterializationResponsibility(
 
  792                  *FromMR.RT, std::move(MU->SymbolFlags),
 
  793                  std::move(MU->InitSymbol));
 
  794              MustRunMU = std::move(MU);
 
  801        auto UMI = std::make_shared<UnmaterializedInfo>(std::move(MU),
 
  803        for (
auto &KV : UMI->MU->getSymbols()) {
 
  804          auto SymI = Symbols.find(KV.first);
 
  806                 "Can not replace a symbol that is not materializing");
 
  807          assert(!SymI->second.hasMaterializerAttached() &&
 
  808                 "Can not replace a symbol that has a materializer attached");
 
  809          assert(UnmaterializedInfos.count(KV.first) == 0 &&
 
  810                 "Unexpected materializer entry in map");
 
  811          SymI->second.setAddress(SymI->second.getAddress());
 
  812          SymI->second.setMaterializerAttached(
true);
 
  814          auto &UMIEntry = UnmaterializedInfos[KV.first];
 
  815          assert((!UMIEntry || !UMIEntry->MU) &&
 
  816                 "Replacing symbol with materializer still attached");
 
  827    assert(MustRunMR && 
"MustRunMU set implies MustRunMR set");
 
  828    ES.dispatchTask(std::make_unique<MaterializationTask>(
 
  829        std::move(MustRunMU), std::move(MustRunMR)));
 
  831    assert(!MustRunMR && 
"MustRunMU unset implies MustRunMR unset");
 
  837Expected<std::unique_ptr<MaterializationResponsibility>>
 
  841  return ES.runSessionLocked(
 
  842      [&]() -> Expected<std::unique_ptr<MaterializationResponsibility>> {
 
  843        if (FromMR.RT->isDefunct())
 
  846        return ES.createMaterializationResponsibility(
 
  847            *FromMR.RT, std::move(SymbolFlags), std::move(InitSymbol));
 
  852JITDylib::getRequestedSymbols(
const SymbolFlagsMap &SymbolFlags)
 const {
 
  853  return ES.runSessionLocked([&]() {
 
  856    for (
auto &KV : SymbolFlags) {
 
  857      assert(Symbols.count(KV.first) && 
"JITDylib does not cover this symbol?");
 
  858      assert(Symbols.find(KV.first)->second.getState() !=
 
  861             "getRequestedSymbols can only be called for symbols that have " 
  862             "started materializing");
 
  863      auto I = MaterializingInfos.find(KV.first);
 
  864      if (
I == MaterializingInfos.end())
 
  867      if (
I->second.hasQueriesPending())
 
  868        RequestedSymbols.insert(KV.first);
 
  871    return RequestedSymbols;
 
  877  AsynchronousSymbolQuerySet CompletedQueries;
 
  879  if (
auto Err = ES.runSessionLocked([&, 
this]() -> 
Error {
 
  880        if (MR.RT->isDefunct())
 
  881          return make_error<ResourceTrackerDefunct>(MR.RT);
 
  884          return make_error<StringError>(
"JITDylib " + getName() +
 
  886                                         inconvertibleErrorCode());
 
  888        struct WorklistEntry {
 
  889          SymbolTable::iterator SymI;
 
  890          ExecutorSymbolDef ResolvedSym;
 
  894        std::vector<WorklistEntry> Worklist;
 
  900          assert(!KV.second.getFlags().hasError() &&
 
  901                 "Resolution result can not have error flag set");
 
  903          auto SymI = Symbols.find(KV.first);
 
  905          assert(SymI != Symbols.end() && 
"Symbol not found");
 
  906          assert(!SymI->second.hasMaterializerAttached() &&
 
  907                 "Resolving symbol with materializer attached?");
 
  909                 "Symbol should be materializing");
 
  910          assert(SymI->second.getAddress() == ExecutorAddr() &&
 
  911                 "Symbol has already been resolved");
 
  913          if (SymI->second.getFlags().hasError())
 
  914            SymbolsInErrorState.insert(KV.first);
 
  917              [[maybe_unused]] 
auto WeakOrCommon =
 
  919              assert((KV.second.getFlags() & WeakOrCommon) &&
 
  920                     "Common symbols must be resolved as common or weak");
 
  921              assert((KV.second.getFlags() & ~WeakOrCommon) ==
 
  923                     "Resolving symbol with incorrect flags");
 
  926              assert(KV.second.getFlags() == SymI->second.getFlags() &&
 
  927                     "Resolved flags should match the declared flags");
 
  930                {SymI, {KV.second.getAddress(), SymI->second.getFlags()}});
 
  935        if (!SymbolsInErrorState.empty()) {
 
  936          auto FailedSymbolsDepMap = std::make_shared<SymbolDependenceMap>();
 
  937          (*FailedSymbolsDepMap)[this] = std::move(SymbolsInErrorState);
 
  938          return make_error<FailedToMaterialize>(
 
  939              getExecutionSession().getSymbolStringPool(),
 
  940              std::move(FailedSymbolsDepMap));
 
  943        while (!Worklist.empty()) {
 
  944          auto SymI = Worklist.back().SymI;
 
  945          auto ResolvedSym = Worklist.back().ResolvedSym;
 
  948          auto &Name = SymI->first;
 
  951          JITSymbolFlags ResolvedFlags = ResolvedSym.getFlags();
 
  952          SymI->second.setAddress(ResolvedSym.getAddress());
 
  953          SymI->second.setFlags(ResolvedFlags);
 
  954          SymI->second.setState(SymbolState::Resolved);
 
  956          auto MII = MaterializingInfos.find(Name);
 
  957          if (MII == MaterializingInfos.end())
 
  960          auto &MI = MII->second;
 
  961          for (auto &Q : MI.takeQueriesMeeting(SymbolState::Resolved)) {
 
  962            Q->notifySymbolMetRequiredState(Name, ResolvedSym);
 
  964              CompletedQueries.insert(std::move(Q));
 
  973  for (
auto &Q : CompletedQueries) {
 
  974    assert(Q->isComplete() && 
"Q not completed");
 
  975    Q->handleComplete(ES);
 
  981void JITDylib::unlinkMaterializationResponsibility(
 
  982    MaterializationResponsibility &MR) {
 
  984    auto I = TrackerMRs.find(MR.RT.get());
 
  985    assert(
I != TrackerMRs.end() && 
"No MRs in TrackerMRs list for RT");
 
  986    assert(
I->second.count(&MR) && 
"MR not in TrackerMRs list for RT");
 
  987    I->second.erase(&MR);
 
  988    if (
I->second.empty())
 
  989      TrackerMRs.erase(MR.RT.get());
 
  993void JITDylib::shrinkMaterializationInfoMemory() {
 
  997  if (UnmaterializedInfos.empty())
 
  998    UnmaterializedInfos.clear();
 
 1000  if (MaterializingInfos.empty())
 
 1001    MaterializingInfos.clear();
 
 1005                            bool LinkAgainstThisJITDylibFirst) {
 
 1006  ES.runSessionLocked([&]() {
 
 1007    assert(State == Open && 
"JD is defunct");
 
 1008    if (LinkAgainstThisJITDylibFirst) {
 
 1010      if (NewLinkOrder.empty() || NewLinkOrder.front().first != 
this)
 
 1011        LinkOrder.push_back(
 
 1015      LinkOrder = std::move(NewLinkOrder);
 
 
 1020  ES.runSessionLocked([&]() {
 
 1021    for (
auto &KV : NewLinks) {
 
 1026      LinkOrder.push_back(std::move(KV));
 
 
 1032  ES.runSessionLocked([&]() { LinkOrder.push_back({&JD, JDLookupFlags}); });
 
 
 1037  ES.runSessionLocked([&]() {
 
 1038    assert(State == Open && 
"JD is defunct");
 
 1039    for (
auto &KV : LinkOrder)
 
 1040      if (KV.first == &OldJD) {
 
 1041        KV = {&NewJD, JDLookupFlags};
 
 
 1048  ES.runSessionLocked([&]() {
 
 1049    assert(State == Open && 
"JD is defunct");
 
 1051                           [&](
const JITDylibSearchOrder::value_type &KV) {
 
 1052                             return KV.first == &JD;
 
 1054    if (
I != LinkOrder.end())
 
 
 1060  return ES.runSessionLocked([&]() -> 
Error {
 
 1061    assert(State == Open && 
"JD is defunct");
 
 1062    using SymbolMaterializerItrPair =
 
 1063        std::pair<SymbolTable::iterator, UnmaterializedInfosMap::iterator>;
 
 1064    std::vector<SymbolMaterializerItrPair> SymbolsToRemove;
 
 1068    for (
auto &Name : Names) {
 
 1069      auto I = Symbols.find(Name);
 
 1072      if (
I == Symbols.end()) {
 
 1073        Missing.insert(Name);
 
 1084      auto UMII = 
I->second.hasMaterializerAttached()
 
 1085                      ? UnmaterializedInfos.find(Name)
 
 1086                      : UnmaterializedInfos.end();
 
 1087      SymbolsToRemove.push_back(std::make_pair(
I, UMII));
 
 1091    if (!Missing.empty())
 
 1093                                         std::move(Missing));
 
 1101    for (
auto &SymbolMaterializerItrPair : SymbolsToRemove) {
 
 1102      auto UMII = SymbolMaterializerItrPair.second;
 
 1105      if (UMII != UnmaterializedInfos.end()) {
 
 1106        UMII->second->MU->doDiscard(*
this, UMII->first);
 
 1107        UnmaterializedInfos.erase(UMII);
 
 1110      auto SymI = SymbolMaterializerItrPair.first;
 
 1111      Symbols.erase(SymI);
 
 1114    shrinkMaterializationInfoMemory();
 
 
 1121  ES.runSessionLocked([&, 
this]() {
 
 1122    OS << 
"JITDylib \"" << 
getName() << 
"\" (ES: " 
 1123       << 
format(
"0x%016" PRIx64, 
reinterpret_cast<uintptr_t
>(&ES))
 
 1137    if (State == Closed)
 
 1139    OS << 
"Link order: " << LinkOrder << 
"\n" 
 1140       << 
"Symbol table:\n";
 
 1143    std::vector<std::pair<SymbolStringPtr, SymbolTableEntry *>> SymbolsSorted;
 
 1144    for (
auto &KV : Symbols)
 
 1145      SymbolsSorted.emplace_back(KV.first, &KV.second);
 
 1146    std::sort(SymbolsSorted.begin(), SymbolsSorted.end(),
 
 1147              [](
const auto &L, 
const auto &R) { return *L.first < *R.first; });
 
 1149    for (
auto &KV : SymbolsSorted) {
 
 1150      OS << 
"    \"" << *KV.first << 
"\": ";
 
 1151      if (
auto Addr = KV.second->getAddress())
 
 1154        OS << 
"<not resolved> ";
 
 1156      OS << 
" " << KV.second->getFlags() << 
" " << KV.second->getState();
 
 1158      if (KV.second->hasMaterializerAttached()) {
 
 1159        OS << 
" (Materializer ";
 
 1160        auto I = UnmaterializedInfos.find(KV.first);
 
 1161        assert(
I != UnmaterializedInfos.end() &&
 
 1162               "Lazy symbol should have UnmaterializedInfo");
 
 1163        OS << 
I->second->MU.get() << 
", " << 
I->second->MU->getName() << 
")\n";
 
 1168    if (!MaterializingInfos.empty())
 
 1169      OS << 
"  MaterializingInfos entries:\n";
 
 1170    for (
auto &KV : MaterializingInfos) {
 
 1171      OS << 
"    \"" << *KV.first << 
"\":\n" 
 1172         << 
"      " << KV.second.pendingQueries().size()
 
 1173         << 
" pending queries: { ";
 
 1174      for (
const auto &Q : KV.second.pendingQueries())
 
 1175        OS << Q.get() << 
" (" << Q->getRequiredState() << 
") ";
 
 
 1181void JITDylib::MaterializingInfo::addQuery(
 
 1182    std::shared_ptr<AsynchronousSymbolQuery> Q) {
 
 1186      [](
const std::shared_ptr<AsynchronousSymbolQuery> &V, 
SymbolState S) {
 
 1187        return V->getRequiredState() <= S;
 
 1189  PendingQueries.insert(
I.base(), std::move(Q));
 
 1192void JITDylib::MaterializingInfo::removeQuery(
 
 1193    const AsynchronousSymbolQuery &Q) {
 
 1196      PendingQueries, [&Q](
const std::shared_ptr<AsynchronousSymbolQuery> &V) {
 
 1197        return V.get() == &Q;
 
 1199  if (
I != PendingQueries.end())
 
 1200    PendingQueries.erase(
I);
 
 1203JITDylib::AsynchronousSymbolQueryList
 
 1204JITDylib::MaterializingInfo::takeQueriesMeeting(SymbolState RequiredState) {
 
 1205  AsynchronousSymbolQueryList 
Result;
 
 1206  while (!PendingQueries.empty()) {
 
 1207    if (PendingQueries.back()->getRequiredState() > RequiredState)
 
 1210    Result.push_back(std::move(PendingQueries.back()));
 
 1211    PendingQueries.pop_back();
 
 1217JITDylib::JITDylib(ExecutionSession &ES, std::string Name)
 
 1218    : JITLinkDylib(std::
move(
Name)), ES(ES) {
 
 1222JITDylib::RemoveTrackerResult JITDylib::IL_removeTracker(
ResourceTracker &RT) {
 
 1224  assert(State != Closed && 
"JD is defunct");
 
 1229  if (&RT == DefaultTracker.get()) {
 
 1231    for (
auto &KV : TrackerSymbols)
 
 1234    for (
auto &KV : Symbols) {
 
 1235      auto &Sym = KV.first;
 
 1236      if (!TrackedSymbols.count(Sym))
 
 1237        SymbolsToRemove.push_back(Sym);
 
 1240    DefaultTracker.reset();
 
 1243    auto I = TrackerSymbols.find(&RT);
 
 1244    if (
I != TrackerSymbols.end()) {
 
 1245      SymbolsToRemove = std::move(
I->second);
 
 1246      TrackerSymbols.erase(
I);
 
 1251  for (
auto &Sym : SymbolsToRemove) {
 
 1252    assert(Symbols.count(Sym) && 
"Symbol not in symbol table");
 
 1255    auto MII = MaterializingInfos.find(Sym);
 
 1256    if (MII != MaterializingInfos.end())
 
 1257      SymbolsToFail.push_back(Sym);
 
 1260  auto [QueriesToFail, FailedSymbols] =
 
 1261      ES.IL_failSymbols(*
this, std::move(SymbolsToFail));
 
 1263  std::vector<std::unique_ptr<MaterializationUnit>> DefunctMUs;
 
 1266  for (
auto &Sym : SymbolsToRemove) {
 
 1267    auto I = Symbols.find(Sym);
 
 1268    assert(
I != Symbols.end() && 
"Symbol not present in table");
 
 1271    if (
I->second.hasMaterializerAttached()) {
 
 1273      auto J = UnmaterializedInfos.find(Sym);
 
 1274      assert(J != UnmaterializedInfos.end() &&
 
 1275             "Symbol table indicates MU present, but no UMI record");
 
 1277        DefunctMUs.push_back(std::move(J->second->MU));
 
 1278      UnmaterializedInfos.erase(J);
 
 1280      assert(!UnmaterializedInfos.count(Sym) &&
 
 1281             "Symbol has materializer attached");
 
 1287  shrinkMaterializationInfoMemory();
 
 1289  return {std::move(QueriesToFail), std::move(FailedSymbols),
 
 1290          std::move(DefunctMUs)};
 
 1294  assert(State != Closed && 
"JD is defunct");
 
 1295  assert(&DstRT != &SrcRT && 
"No-op transfers shouldn't call transferTracker");
 
 1296  assert(&DstRT.getJITDylib() == 
this && 
"DstRT is not for this JITDylib");
 
 1297  assert(&SrcRT.getJITDylib() == 
this && 
"SrcRT is not for this JITDylib");
 
 1300  for (
auto &KV : UnmaterializedInfos) {
 
 1301    if (KV.second->RT == &SrcRT)
 
 1302      KV.second->RT = &DstRT;
 
 1307    auto I = TrackerMRs.find(&SrcRT);
 
 1308    if (
I != TrackerMRs.end()) {
 
 1309      auto &SrcMRs = 
I->second;
 
 1310      auto &DstMRs = TrackerMRs[&DstRT];
 
 1311      for (
auto *MR : SrcMRs)
 
 1314        DstMRs = std::move(SrcMRs);
 
 1316        DstMRs.insert_range(SrcMRs);
 
 1319      TrackerMRs.erase(&SrcRT);
 
 1325  if (&DstRT == DefaultTracker.get()) {
 
 1326    TrackerSymbols.erase(&SrcRT);
 
 1332  if (&SrcRT == DefaultTracker.get()) {
 
 1333    assert(!TrackerSymbols.count(&SrcRT) &&
 
 1334           "Default tracker should not appear in TrackerSymbols");
 
 1339    for (
auto &KV : TrackerSymbols)
 
 1342    for (
auto &KV : Symbols) {
 
 1343      auto &Sym = KV.first;
 
 1344      if (!CurrentlyTrackedSymbols.count(Sym))
 
 1345        SymbolsToTrack.push_back(Sym);
 
 1348    TrackerSymbols[&DstRT] = std::move(SymbolsToTrack);
 
 1352  auto &DstTrackedSymbols = TrackerSymbols[&DstRT];
 
 1356  auto SI = TrackerSymbols.find(&SrcRT);
 
 1357  if (SI == TrackerSymbols.end())
 
 1360  DstTrackedSymbols.reserve(DstTrackedSymbols.size() + 
SI->second.size());
 
 1361  for (
auto &Sym : 
SI->second)
 
 1362    DstTrackedSymbols.push_back(std::move(Sym));
 
 1363  TrackerSymbols.erase(SI);
 
 1370  std::vector<SymbolStringPtr> ExistingDefsOverridden;
 
 1371  std::vector<SymbolStringPtr> MUDefsOverridden;
 
 1373  for (
const auto &KV : MU.getSymbols()) {
 
 1374    auto I = Symbols.find(KV.first);
 
 1376    if (
I != Symbols.end()) {
 
 1377      if (KV.second.isStrong()) {
 
 1378        if (
I->second.getFlags().isStrong() ||
 
 1380          Duplicates.insert(KV.first);
 
 1383                 "Overridden existing def should be in the never-searched " 
 1385          ExistingDefsOverridden.push_back(KV.first);
 
 1388        MUDefsOverridden.push_back(KV.first);
 
 1393  if (!Duplicates.empty()) {
 
 1395        { 
dbgs() << 
"  Error: Duplicate symbols " << Duplicates << 
"\n"; });
 
 1397                                           MU.getName().str());
 
 1402    if (!MUDefsOverridden.empty())
 
 1403      dbgs() << 
"  Defs in this MU overridden: " << MUDefsOverridden << 
"\n";
 
 1405  for (
auto &S : MUDefsOverridden)
 
 1406    MU.doDiscard(*
this, S);
 
 1410    if (!ExistingDefsOverridden.empty())
 
 1411      dbgs() << 
"  Existing defs overridden by this MU: " << MUDefsOverridden
 
 1414  for (
auto &S : ExistingDefsOverridden) {
 
 1416    auto UMII = UnmaterializedInfos.find(S);
 
 1417    assert(UMII != UnmaterializedInfos.end() &&
 
 1418           "Overridden existing def should have an UnmaterializedInfo");
 
 1419    UMII->second->MU->doDiscard(*
this, S);
 
 1423  for (
auto &KV : MU.getSymbols()) {
 
 1424    auto &SymEntry = Symbols[KV.first];
 
 1425    SymEntry.setFlags(KV.second);
 
 1427    SymEntry.setMaterializerAttached(
true);
 
 1433void JITDylib::installMaterializationUnit(
 
 1437  if (&RT != DefaultTracker.get()) {
 
 1438    auto &TS = TrackerSymbols[&RT];
 
 1439    TS.reserve(TS.size() + MU->getSymbols().size());
 
 1440    for (
auto &KV : MU->getSymbols())
 
 1441      TS.push_back(KV.first);
 
 1444  auto UMI = std::make_shared<UnmaterializedInfo>(std::move(MU), &RT);
 
 1445  for (
auto &KV : UMI->MU->getSymbols())
 
 1446    UnmaterializedInfos[KV.first] = UMI;
 
 1451  for (
auto &QuerySymbol : QuerySymbols) {
 
 1452    auto MII = MaterializingInfos.find(QuerySymbol);
 
 1453    if (MII != MaterializingInfos.end())
 
 1454      MII->second.removeQuery(Q);
 
 1466  std::mutex LookupMutex;
 
 1467  std::condition_variable CV;
 
 1471    dbgs() << 
"Issuing init-symbol lookup:\n";
 
 1472    for (
auto &KV : InitSyms)
 
 1473      dbgs() << 
"  " << KV.first->getName() << 
": " << KV.second << 
"\n";
 
 1476  for (
auto &KV : InitSyms) {
 
 1477    auto *JD = KV.first;
 
 1478    auto Names = std::move(KV.second);
 
 1485            std::lock_guard<std::mutex> Lock(LookupMutex);
 
 1489                     "Duplicate JITDylib in lookup?");
 
 1490              CompoundResult[JD] = std::move(*
Result);
 
 1500  std::unique_lock<std::mutex> Lock(LookupMutex);
 
 1501  CV.wait(Lock, [&] { 
return Count == 0; });
 
 1504    return std::move(CompoundErr);
 
 1506  return std::move(CompoundResult);
 
 
 1513  class TriggerOnComplete {
 
 1516    TriggerOnComplete(OnCompleteFn OnComplete)
 
 1517        : OnComplete(std::move(OnComplete)) {}
 
 1518    ~TriggerOnComplete() { OnComplete(std::move(LookupResult)); }
 
 1519    void reportResult(
Error Err) {
 
 1520      std::lock_guard<std::mutex> Lock(ResultMutex);
 
 1521      LookupResult = 
joinErrors(std::move(LookupResult), std::move(Err));
 
 1525    std::mutex ResultMutex;
 
 1527    OnCompleteFn OnComplete;
 
 1531    dbgs() << 
"Issuing init-symbol lookup:\n";
 
 1532    for (
auto &KV : InitSyms)
 
 1533      dbgs() << 
"  " << KV.first->getName() << 
": " << KV.second << 
"\n";
 
 1536  auto TOC = std::make_shared<TriggerOnComplete>(std::move(OnComplete));
 
 1538  for (
auto &KV : InitSyms) {
 
 1539    auto *JD = KV.first;
 
 1540    auto Names = std::move(KV.second);
 
 1546          TOC->reportResult(
Result.takeError());
 
 
 1555    MR->failMaterialization();
 
 
 1559  OS << 
"Materialization task: " << MU->getName() << 
" in " 
 1560     << MR->getTargetJITDylib().getName();
 
 
 1564  assert(MU && 
"MU should not be null");
 
 1565  assert(MR && 
"MR should not be null");
 
 1566  MU->materialize(std::move(MR));
 
 
 1576  this->EPC->ES = 
this;
 
 
 1582         "Session still open. Did you forget to call endSession?");
 
 
 1586  LLVM_DEBUG(
dbgs() << 
"Ending ExecutionSession " << 
this << 
"\n");
 
 1590#ifdef EXPENSIVE_CHECKS 
 1591    verifySessionState(
"Entering ExecutionSession::endSession");
 
 1594    SessionOpen = 
false;
 
 1598  std::reverse(JDsToRemove.begin(), JDsToRemove.end());
 
 1602  Err = 
joinErrors(std::move(Err), EPC->disconnect());
 
 
 1613    assert(!ResourceManagers.empty() && 
"No managers registered");
 
 1614    if (ResourceManagers.back() == &RM)
 
 1615      ResourceManagers.pop_back();
 
 1618      assert(
I != ResourceManagers.end() && 
"RM not registered");
 
 1619      ResourceManagers.erase(
I);
 
 
 1626    for (
auto &JD : JDs)
 
 1627      if (JD->getName() == Name)
 
 
 1636    assert(SessionOpen && 
"Cannot create JITDylib after session is closed");
 
 1637    JDs.push_back(
new JITDylib(*
this, std::move(Name)));
 
 
 1645    if (
auto Err = P->setupJITDylib(JD))
 
 1646      return std::move(Err);
 
 
 1653    for (
auto &JD : JDsToRemove) {
 
 1654      assert(JD->State == JITDylib::Open && 
"JD already closed");
 
 1655      JD->State = JITDylib::Closing;
 
 1657      assert(
I != JDs.end() && 
"JD does not appear in session JDs");
 
 1664  for (
auto JD : JDsToRemove) {
 
 1665    Err = 
joinErrors(std::move(Err), JD->clear());
 
 1667      Err = 
joinErrors(std::move(Err), P->teardownJITDylib(*JD));
 
 1672    for (
auto &JD : JDsToRemove) {
 
 1673      assert(JD->State == JITDylib::Closing && 
"JD should be closing");
 
 1674      JD->State = JITDylib::Closed;
 
 1675      assert(JD->Symbols.empty() && 
"JD.Symbols is not empty after clear");
 
 1676      assert(JD->UnmaterializedInfos.empty() &&
 
 1677             "JD.UnmaterializedInfos is not empty after clear");
 
 1678      assert(JD->MaterializingInfos.empty() &&
 
 1679             "JD.MaterializingInfos is not empty after clear");
 
 1680      assert(JD->TrackerSymbols.empty() &&
 
 1681             "TrackerSymbols is not empty after clear");
 
 1682      JD->DefGenerators.clear();
 
 1683      JD->LinkOrder.clear();
 
 
 1693    return std::vector<JITDylibSP>();
 
 1695  auto &ES = JDs.
front()->getExecutionSession();
 
 1696  return ES.runSessionLocked([&]() -> 
Expected<std::vector<JITDylibSP>> {
 
 1698    std::vector<JITDylibSP> 
Result;
 
 1700    for (
auto &JD : JDs) {
 
 1702      if (JD->State != Open)
 
 1704            "Error building link order: " + JD->getName() + 
" is defunct",
 
 1706      if (Visited.
count(JD.get()))
 
 1711      Visited.
insert(JD.get());
 
 1713      while (!WorkStack.
empty()) {
 
 1714        Result.push_back(std::move(WorkStack.
back()));
 
 1718          auto &JD = *KV.first;
 
 1719          if (!Visited.
insert(&JD).second)
 
 
 1749  OL_applyQueryPhase1(std::make_unique<InProgressLookupFlagsState>(
 
 1750                          K, std::move(SearchOrder), std::move(LookupSet),
 
 1751                          std::move(OnComplete)),
 
 
 1759  std::promise<MSVCPExpected<SymbolFlagsMap>> ResultP;
 
 1760  OL_applyQueryPhase1(std::make_unique<InProgressLookupFlagsState>(
 
 1761                          K, std::move(SearchOrder), std::move(LookupSet),
 
 1763                            ResultP.set_value(std::move(
Result));
 
 1767  auto ResultF = ResultP.get_future();
 
 1768  return ResultF.
get();
 
 
 1779      dbgs() << 
"Looking up " << Symbols << 
" in " << SearchOrder
 
 1780             << 
" (required state: " << RequiredState << 
")\n";
 
 1787  dispatchOutstandingMUs();
 
 1789  auto Unresolved = std::move(Symbols);
 
 1790  auto Q = std::make_shared<AsynchronousSymbolQuery>(Unresolved, RequiredState,
 
 1791                                                     std::move(NotifyComplete));
 
 1793  auto IPLS = std::make_unique<InProgressFullLookupState>(
 
 1794      K, SearchOrder, std::move(Unresolved), RequiredState, std::move(Q),
 
 1795      std::move(RegisterDependencies));
 
 
 1805#if LLVM_ENABLE_THREADS 
 1807  std::promise<MSVCPExpected<SymbolMap>> PromisedResult;
 
 1810    PromisedResult.set_value(std::move(R));
 
 1822      ResolutionError = R.takeError();
 
 1827  lookup(K, SearchOrder, std::move(Symbols), RequiredState,
 
 1828         std::move(NotifyComplete), RegisterDependencies);
 
 1830#if LLVM_ENABLE_THREADS 
 1831  return PromisedResult.get_future().get();
 
 1833  if (ResolutionError)
 
 1834    return std::move(ResolutionError);
 
 
 1847    assert(ResultMap->size() == 1 && 
"Unexpected number of results");
 
 1848    assert(ResultMap->count(Name) && 
"Missing result for symbol");
 
 1849    return std::move(ResultMap->begin()->second);
 
 1851    return ResultMap.takeError();
 
 
 1863  return lookup(SearchOrder, 
intern(Name), RequiredState);
 
 
 1873    return TagSyms.takeError();
 
 1876  std::lock_guard<std::mutex> Lock(JITDispatchHandlersMutex);
 
 1879  for (
auto &[TagName, TagSym] : *TagSyms) {
 
 1880    auto TagAddr = TagSym.getAddress();
 
 1881    if (JITDispatchHandlers.count(TagAddr))
 
 1883                                         " (for " + *TagName +
 
 1884                                         ") already registered",
 
 1889  for (
auto &[TagName, TagSym] : *TagSyms) {
 
 1890    auto TagAddr = TagSym.getAddress();
 
 1891    auto I = WFs.
find(TagName);
 
 1893           "JITDispatchHandler implementation missing");
 
 1894    JITDispatchHandlers[TagAddr] =
 
 1895        std::make_shared<JITDispatchHandlerFunction>(std::move(
I->second));
 
 1897      dbgs() << 
"Associated function tag \"" << *TagName << 
"\" (" 
 1898             << 
formatv(
"{0:x}", TagAddr) << 
") with handler\n";
 
 
 1909  std::shared_ptr<JITDispatchHandlerFunction> 
F;
 
 1911    std::lock_guard<std::mutex> Lock(JITDispatchHandlersMutex);
 
 1912    auto I = JITDispatchHandlers.find(HandlerFnTagAddr);
 
 1913    if (
I != JITDispatchHandlers.end())
 
 1918    (*F)(std::move(SendResult), ArgBuffer.
data(), ArgBuffer.
size());
 
 1921        (
"No function registered for tag " +
 
 1922         formatv(
"{0:x16}", HandlerFnTagAddr))
 
 
 1928    for (
auto &JD : JDs)
 
 
 1933#ifdef EXPENSIVE_CHECKS 
 1934bool ExecutionSession::verifySessionState(
Twine Phase) {
 
 1938    for (
auto &JD : JDs) {
 
 1941        auto &Stream = 
errs();
 
 1943          Stream << 
"ERROR: Bad ExecutionSession state detected " << 
Phase 
 1945        Stream << 
"  In JITDylib " << JD->getName() << 
", ";
 
 1950      if (JD->State != JITDylib::Open) {
 
 1952            << 
"state is not Open, but JD is in ExecutionSession list.";
 
 1960      for (
auto &[Sym, Entry] : JD->Symbols) {
 
 1963          if (Entry.getAddress()) {
 
 1964            LogFailure() << 
"symbol " << Sym << 
" has state " 
 1966                         << 
" (not-yet-resolved) but non-null address " 
 1967                         << Entry.getAddress() << 
".\n";
 
 1972        auto UMIItr = JD->UnmaterializedInfos.find(Sym);
 
 1973        if (
Entry.hasMaterializerAttached()) {
 
 1974          if (UMIItr == JD->UnmaterializedInfos.end()) {
 
 1975            LogFailure() << 
"symbol " << Sym
 
 1976                         << 
" entry claims materializer attached, but " 
 1977                            "UnmaterializedInfos has no corresponding entry.\n";
 
 1979        } 
else if (UMIItr != JD->UnmaterializedInfos.end()) {
 
 1982              << 
" entry claims no materializer attached, but " 
 1983                 "UnmaterializedInfos has an unexpected entry for it.\n";
 
 1989      for (
auto &[Sym, UMI] : JD->UnmaterializedInfos) {
 
 1990        auto SymItr = JD->Symbols.find(Sym);
 
 1991        if (SymItr == JD->Symbols.end()) {
 
 1994              << 
" has UnmaterializedInfos entry, but no Symbols entry.\n";
 
 1999      for (
auto &[Sym, MII] : JD->MaterializingInfos) {
 
 2001        auto SymItr = JD->Symbols.find(Sym);
 
 2002        if (SymItr == JD->Symbols.end()) {
 
 2007              << 
" has MaterializingInfos entry, but no Symbols entry.\n";
 
 2015                << 
" is in Ready state, should not have MaterializingInfo.\n";
 
 2020              static_cast<std::underlying_type_t<SymbolState>
>(
 
 2021                  SymItr->second.getState()) + 1);
 
 2022          for (
auto &Q : MII.PendingQueries) {
 
 2023            if (Q->getRequiredState() != CurState) {
 
 2024              if (Q->getRequiredState() > CurState)
 
 2025                CurState = Q->getRequiredState();
 
 2027                LogFailure() << 
"symbol " << Sym
 
 2028                             << 
" has stale or misordered queries.\n";
 
 2040void ExecutionSession::dispatchOutstandingMUs() {
 
 2043    std::optional<std::pair<std::unique_ptr<MaterializationUnit>,
 
 2044                            std::unique_ptr<MaterializationResponsibility>>>
 
 2048      std::lock_guard<std::recursive_mutex> Lock(OutstandingMUsMutex);
 
 2049      if (!OutstandingMUs.empty()) {
 
 2050        JMU.emplace(std::move(OutstandingMUs.back()));
 
 2051        OutstandingMUs.pop_back();
 
 2058    assert(JMU->first && 
"No MU?");
 
 2059    LLVM_DEBUG(
dbgs() << 
"  Dispatching \"" << JMU->first->getName() << 
"\"\n");
 
 2060    dispatchTask(std::make_unique<MaterializationTask>(std::move(JMU->first),
 
 2061                                                       std::move(JMU->second)));
 
 2063  LLVM_DEBUG(
dbgs() << 
"Done dispatching MaterializationUnits.\n");
 
 2068    dbgs() << 
"In " << RT.getJITDylib().getName() << 
" removing tracker " 
 2069           << 
formatv(
"{0:x}", RT.getKeyUnsafe()) << 
"\n";
 
 2071  std::vector<ResourceManager *> CurrentResourceManagers;
 
 2073  JITDylib::RemoveTrackerResult 
R;
 
 2076    CurrentResourceManagers = ResourceManagers;
 
 2078    R = RT.getJITDylib().IL_removeTracker(RT);
 
 2082  R.DefunctMUs.clear();
 
 2086  auto &JD = RT.getJITDylib();
 
 2087  for (
auto *L : 
reverse(CurrentResourceManagers))
 
 2089                     L->handleRemoveResources(JD, RT.getKeyUnsafe()));
 
 2091  for (
auto &Q : 
R.QueriesToFail)
 
 2101    dbgs() << 
"In " << SrcRT.getJITDylib().getName()
 
 2102           << 
" transfering resources from tracker " 
 2103           << 
formatv(
"{0:x}", SrcRT.getKeyUnsafe()) << 
" to tracker " 
 2104           << 
formatv(
"{0:x}", DstRT.getKeyUnsafe()) << 
"\n";
 
 2108  if (&DstRT == &SrcRT)
 
 2111  assert(&DstRT.getJITDylib() == &SrcRT.getJITDylib() &&
 
 2112         "Can't transfer resources between JITDylibs");
 
 2114    SrcRT.makeDefunct();
 
 2115    auto &JD = DstRT.getJITDylib();
 
 2116    JD.transferTracker(DstRT, SrcRT);
 
 2117    for (
auto *L : 
reverse(ResourceManagers))
 
 2118      L->handleTransferResources(JD, DstRT.getKeyUnsafe(),
 
 2119                                 SrcRT.getKeyUnsafe());
 
 2126      dbgs() << 
"In " << RT.getJITDylib().getName() << 
" destroying tracker " 
 2127             << 
formatv(
"{0:x}", RT.getKeyUnsafe()) << 
"\n";
 
 2129    if (!RT.isDefunct())
 
 2130      transferResourceTracker(*RT.getJITDylib().getDefaultResourceTracker(),
 
 2135Error ExecutionSession::IL_updateCandidatesFor(
 
 2138  return Candidates.forEachWithRemoval(
 
 2139      [&](
const SymbolStringPtr &Name,
 
 2143        auto SymI = JD.Symbols.find(Name);
 
 2144        if (SymI == JD.Symbols.end())
 
 2152        if (!SymI->second.getFlags().isExported() &&
 
 2155            NonCandidates->add(Name, SymLookupFlags);
 
 2164        if (SymI->second.getFlags().hasMaterializationSideEffectsOnly() &&
 
 2171        if (SymI->second.getFlags().hasError()) {
 
 2172          auto FailedSymbolsMap = std::make_shared<SymbolDependenceMap>();
 
 2173          (*FailedSymbolsMap)[&JD] = {
Name};
 
 2175                                                 std::move(FailedSymbolsMap));
 
 2183void ExecutionSession::OL_resumeLookupAfterGeneration(
 
 2187         "Should not be called for not-in-generator lookups");
 
 2192  if (
auto DG = IPLS.CurDefGeneratorStack.back().lock()) {
 
 2193    IPLS.CurDefGeneratorStack.pop_back();
 
 2194    std::lock_guard<std::mutex> Lock(DG->M);
 
 2198    if (DG->PendingLookups.empty()) {
 
 2204    LS = std::move(DG->PendingLookups.front());
 
 2205    DG->PendingLookups.pop_front();
 
 2210    dispatchTask(std::make_unique<LookupTask>(std::move(LS)));
 
 2214void ExecutionSession::OL_applyQueryPhase1(
 
 2215    std::unique_ptr<InProgressLookupState> IPLS, 
Error Err) {
 
 2218    dbgs() << 
"Entering OL_applyQueryPhase1:\n" 
 2219           << 
"  Lookup kind: " << IPLS->K << 
"\n" 
 2220           << 
"  Search order: " << IPLS->SearchOrder
 
 2221           << 
", Current index = " << IPLS->CurSearchOrderIndex
 
 2222           << (IPLS->NewJITDylib ? 
" (entering new JITDylib)" : 
"") << 
"\n" 
 2223           << 
"  Lookup set: " << IPLS->LookupSet << 
"\n" 
 2224           << 
"  Definition generator candidates: " 
 2225           << IPLS->DefGeneratorCandidates << 
"\n" 
 2226           << 
"  Definition generator non-candidates: " 
 2227           << IPLS->DefGeneratorNonCandidates << 
"\n";
 
 2231    OL_resumeLookupAfterGeneration(*IPLS);
 
 2234         "Lookup should not be in InGenerator state here");
 
 2241  while (IPLS->CurSearchOrderIndex != IPLS->SearchOrder.size()) {
 
 2247      return IPLS->fail(std::move(Err));
 
 2250    auto &KV = IPLS->SearchOrder[IPLS->CurSearchOrderIndex];
 
 2251    auto &JD = *KV.first;
 
 2252    auto JDLookupFlags = KV.second;
 
 2255      dbgs() << 
"Visiting \"" << JD.getName() << 
"\" (" << JDLookupFlags
 
 2256             << 
") with lookup set " << IPLS->LookupSet << 
":\n";
 
 2260    if (IPLS->NewJITDylib) {
 
 2264      SymbolLookupSet Tmp;
 
 2265      std::swap(IPLS->DefGeneratorNonCandidates, Tmp);
 
 2266      IPLS->DefGeneratorCandidates.append(std::move(Tmp));
 
 2269        dbgs() << 
"  First time visiting " << JD.getName()
 
 2270               << 
", resetting candidate sets and building generator stack\n";
 
 2275        IPLS->CurDefGeneratorStack.reserve(JD.DefGenerators.size());
 
 2281      IPLS->NewJITDylib = 
false;
 
 2290      Err = IL_updateCandidatesFor(
 
 2291          JD, JDLookupFlags, IPLS->DefGeneratorCandidates,
 
 2292          JD.DefGenerators.empty() ? 
nullptr 
 2293                                   : &IPLS->DefGeneratorNonCandidates);
 
 2295        dbgs() << 
"    Remaining candidates = " << IPLS->DefGeneratorCandidates
 
 2303          IPLS->DefGeneratorCandidates.empty())
 
 2304        OL_resumeLookupAfterGeneration(*IPLS);
 
 2310      return IPLS->fail(std::move(Err));
 
 2314      if (IPLS->CurDefGeneratorStack.empty())
 
 2315        LLVM_DEBUG(
dbgs() << 
"  No generators to run for this JITDylib.\n");
 
 2316      else if (IPLS->DefGeneratorCandidates.empty())
 
 2319        dbgs() << 
"  Running " << IPLS->CurDefGeneratorStack.size()
 
 2320               << 
" remaining generators for " 
 2321               << IPLS->DefGeneratorCandidates.size() << 
" candidates\n";
 
 2323    while (!IPLS->CurDefGeneratorStack.empty() &&
 
 2324           !IPLS->DefGeneratorCandidates.empty()) {
 
 2325      auto DG = IPLS->CurDefGeneratorStack.back().lock();
 
 2329            "DefinitionGenerator removed while lookup in progress",
 
 2342        std::lock_guard<std::mutex> Lock(DG->M);
 
 2344          DG->PendingLookups.push_back(std::move(IPLS));
 
 2353      auto &LookupSet = IPLS->DefGeneratorCandidates;
 
 2358        LLVM_DEBUG(
dbgs() << 
"  Attempting to generate " << LookupSet << 
"\n");
 
 2360        Err = DG->tryToGenerate(LS, K, JD, JDLookupFlags, LookupSet);
 
 2361        IPLS = std::move(
LS.IPLS);
 
 2367        OL_resumeLookupAfterGeneration(*IPLS);
 
 2372          dbgs() << 
"  Error attempting to generate " << LookupSet << 
"\n";
 
 2374        assert(IPLS && 
"LS cannot be retained if error is returned");
 
 2375        return IPLS->fail(std::move(Err));
 
 2381            { 
dbgs() << 
"  LookupState captured. Exiting phase1 for now.\n"; });
 
 2388        LLVM_DEBUG(
dbgs() << 
"  Updating candidate set post-generation\n");
 
 2389        Err = IL_updateCandidatesFor(
 
 2390            JD, JDLookupFlags, IPLS->DefGeneratorCandidates,
 
 2391            JD.DefGenerators.empty() ? 
nullptr 
 2392                                     : &IPLS->DefGeneratorNonCandidates);
 
 2397        LLVM_DEBUG(
dbgs() << 
"  Error encountered while updating candidates\n");
 
 2398        return IPLS->fail(std::move(Err));
 
 2402    if (IPLS->DefGeneratorCandidates.empty() &&
 
 2403        IPLS->DefGeneratorNonCandidates.empty()) {
 
 2406      IPLS->CurSearchOrderIndex = IPLS->SearchOrder.size();
 
 2412      ++IPLS->CurSearchOrderIndex;
 
 2413      IPLS->NewJITDylib = 
true;
 
 2418  IPLS->DefGeneratorCandidates.remove_if(
 
 2426  if (IPLS->DefGeneratorCandidates.empty()) {
 
 2428    IPLS->complete(std::move(IPLS));
 
 2430    LLVM_DEBUG(
dbgs() << 
"Phase 1 failed with unresolved symbols.\n");
 
 2436void ExecutionSession::OL_completeLookup(
 
 2437    std::unique_ptr<InProgressLookupState> IPLS,
 
 2438    std::shared_ptr<AsynchronousSymbolQuery> Q,
 
 2442    dbgs() << 
"Entering OL_completeLookup:\n" 
 2443           << 
"  Lookup kind: " << IPLS->K << 
"\n" 
 2444           << 
"  Search order: " << IPLS->SearchOrder
 
 2445           << 
", Current index = " << IPLS->CurSearchOrderIndex
 
 2446           << (IPLS->NewJITDylib ? 
" (entering new JITDylib)" : 
"") << 
"\n" 
 2447           << 
"  Lookup set: " << IPLS->LookupSet << 
"\n" 
 2448           << 
"  Definition generator candidates: " 
 2449           << IPLS->DefGeneratorCandidates << 
"\n" 
 2450           << 
"  Definition generator non-candidates: " 
 2451           << IPLS->DefGeneratorNonCandidates << 
"\n";
 
 2454  bool QueryComplete = 
false;
 
 2455  DenseMap<JITDylib *, JITDylib::UnmaterializedInfosList> CollectedUMIs;
 
 2458    for (
auto &KV : IPLS->SearchOrder) {
 
 2459      auto &JD = *KV.first;
 
 2460      auto JDLookupFlags = KV.second;
 
 2462        dbgs() << 
"Visiting \"" << JD.getName() << 
"\" (" << JDLookupFlags
 
 2463               << 
") with lookup set " << IPLS->LookupSet << 
":\n";
 
 2466      auto Err = IPLS->LookupSet.forEachWithRemoval(
 
 2467          [&](
const SymbolStringPtr &Name,
 
 2470              dbgs() << 
"  Attempting to match \"" << 
Name << 
"\" (" 
 2471                     << SymLookupFlags << 
")... ";
 
 2476            auto SymI = JD.Symbols.find(Name);
 
 2477            if (SymI == JD.Symbols.end()) {
 
 2484            if (!SymI->second.getFlags().isExported() &&
 
 2496            if (SymI->second.getFlags().hasMaterializationSideEffectsOnly() &&
 
 2500                          "required, but symbol is has-side-effects-only\n";
 
 2508            if (SymI->second.getFlags().hasError()) {
 
 2510              auto FailedSymbolsMap = std::make_shared<SymbolDependenceMap>();
 
 2511              (*FailedSymbolsMap)[&JD] = {
Name};
 
 2520            if (SymI->second.getState() >= Q->getRequiredState()) {
 
 2522                         << 
"matched, symbol already in required state\n");
 
 2523              Q->notifySymbolMetRequiredState(Name, SymI->second.getSymbol());
 
 2528                Q->addQueryDependence(JD, Name);
 
 2536            if (SymI->second.hasMaterializerAttached()) {
 
 2537              assert(SymI->second.getAddress() == ExecutorAddr() &&
 
 2538                     "Symbol not resolved but already has address?");
 
 2539              auto UMII = JD.UnmaterializedInfos.find(Name);
 
 2540              assert(UMII != JD.UnmaterializedInfos.end() &&
 
 2541                     "Lazy symbol should have UnmaterializedInfo");
 
 2543              auto UMI = UMII->second;
 
 2544              assert(UMI->MU && 
"Materializer should not be null");
 
 2545              assert(UMI->RT && 
"Tracker should not be null");
 
 2547                dbgs() << 
"matched, preparing to dispatch MU@" << UMI->MU.get()
 
 2548                       << 
" (" << UMI->MU->getName() << 
")\n";
 
 2553              for (
auto &KV : UMI->MU->getSymbols()) {
 
 2554                auto SymK = JD.Symbols.find(KV.first);
 
 2555                assert(SymK != JD.Symbols.end() &&
 
 2556                       "No entry for symbol covered by MaterializationUnit");
 
 2557                SymK->second.setMaterializerAttached(
false);
 
 2559                JD.UnmaterializedInfos.erase(KV.first);
 
 2563              CollectedUMIs[&JD].push_back(std::move(UMI));
 
 2571                   "By this line the symbol should be materializing");
 
 2572            auto &
MI = JD.MaterializingInfos[
Name];
 
 2574            Q->addQueryDependence(JD, Name);
 
 2579      JD.shrinkMaterializationInfoMemory();
 
 2585          dbgs() << 
"Lookup failed. Detaching query and replacing MUs.\n";
 
 2592        for (
auto &KV : CollectedUMIs) {
 
 2593          auto &JD = *KV.first;
 
 2594          for (
auto &UMI : KV.second)
 
 2595            for (
auto &KV2 : UMI->MU->getSymbols()) {
 
 2596              assert(!JD.UnmaterializedInfos.count(KV2.first) &&
 
 2597                     "Unexpected materializer in map");
 
 2598              auto SymI = JD.Symbols.find(KV2.first);
 
 2599              assert(SymI != JD.Symbols.end() && 
"Missing symbol entry");
 
 2601                     "Can not replace symbol that is not materializing");
 
 2602              assert(!SymI->second.hasMaterializerAttached() &&
 
 2603                     "MaterializerAttached flag should not be set");
 
 2604              SymI->second.setMaterializerAttached(
true);
 
 2605              JD.UnmaterializedInfos[KV2.first] = UMI;
 
 2613    LLVM_DEBUG(
dbgs() << 
"Stripping unmatched weakly-referenced symbols\n");
 
 2614    IPLS->LookupSet.forEachWithRemoval(
 
 2617            Q->dropSymbol(Name);
 
 2623    if (!IPLS->LookupSet.empty()) {
 
 2626                                         IPLS->LookupSet.getSymbolNames());
 
 2630    QueryComplete = Q->isComplete();
 
 2633      dbgs() << 
"Query successfully " 
 2634             << (QueryComplete ? 
"completed" : 
"lodged") << 
"\n";
 
 2638    if (!CollectedUMIs.empty()) {
 
 2639      std::lock_guard<std::recursive_mutex> Lock(OutstandingMUsMutex);
 
 2642      for (
auto &KV : CollectedUMIs) {
 
 2644          auto &JD = *KV.first;
 
 2645          dbgs() << 
"  For " << JD.getName() << 
": Adding " << KV.second.size()
 
 2648        for (
auto &UMI : KV.second) {
 
 2649          auto MR = createMaterializationResponsibility(
 
 2650              *UMI->RT, std::move(UMI->MU->SymbolFlags),
 
 2651              std::move(UMI->MU->InitSymbol));
 
 2652          OutstandingMUs.push_back(
 
 2653              std::make_pair(std::move(UMI->MU), std::move(MR)));
 
 2659    if (RegisterDependencies && !Q->QueryRegistrations.empty()) {
 
 2661      RegisterDependencies(Q->QueryRegistrations);
 
 2671    Q->handleFailed(std::move(LodgingErr));
 
 2675  if (QueryComplete) {
 
 2677    Q->handleComplete(*
this);
 
 2680  dispatchOutstandingMUs();
 
 2683void ExecutionSession::OL_completeLookupFlags(
 
 2684    std::unique_ptr<InProgressLookupState> IPLS,
 
 2685    unique_function<
void(Expected<SymbolFlagsMap>)> OnComplete) {
 
 2689      dbgs() << 
"Entering OL_completeLookupFlags:\n" 
 2690             << 
"  Lookup kind: " << IPLS->K << 
"\n" 
 2691             << 
"  Search order: " << IPLS->SearchOrder
 
 2692             << 
", Current index = " << IPLS->CurSearchOrderIndex
 
 2693             << (IPLS->NewJITDylib ? 
" (entering new JITDylib)" : 
"") << 
"\n" 
 2694             << 
"  Lookup set: " << IPLS->LookupSet << 
"\n" 
 2695             << 
"  Definition generator candidates: " 
 2696             << IPLS->DefGeneratorCandidates << 
"\n" 
 2697             << 
"  Definition generator non-candidates: " 
 2698             << IPLS->DefGeneratorNonCandidates << 
"\n";
 
 2704    for (
auto &KV : IPLS->SearchOrder) {
 
 2705      auto &JD = *KV.first;
 
 2706      auto JDLookupFlags = KV.second;
 
 2708        dbgs() << 
"Visiting \"" << JD.getName() << 
"\" (" << JDLookupFlags
 
 2709               << 
") with lookup set " << IPLS->LookupSet << 
":\n";
 
 2712      IPLS->LookupSet.forEachWithRemoval([&](
const SymbolStringPtr &Name,
 
 2715          dbgs() << 
"  Attempting to match \"" << 
Name << 
"\" (" 
 2716                 << SymLookupFlags << 
")... ";
 
 2721        auto SymI = JD.Symbols.find(Name);
 
 2722        if (SymI == JD.Symbols.end()) {
 
 2728        if (!SymI->second.getFlags().isExported() &&
 
 2735          dbgs() << 
"matched, \"" << 
Name << 
"\" -> " << SymI->second.getFlags()
 
 2744    IPLS->LookupSet.remove_if(
 
 2749    if (!IPLS->LookupSet.empty()) {
 
 2752                                         IPLS->LookupSet.getSymbolNames());
 
 2761  OnComplete(std::move(
Result));
 
 2764void ExecutionSession::OL_destroyMaterializationResponsibility(
 
 2767  assert(MR.SymbolFlags.empty() &&
 
 2768         "All symbols should have been explicitly materialized or failed");
 
 2769  MR.JD.unlinkMaterializationResponsibility(MR);
 
 2774  return MR.JD.getRequestedSymbols(MR.SymbolFlags);
 
 2780    dbgs() << 
"In " << MR.JD.getName() << 
" resolving " << 
Symbols << 
"\n";
 
 2783  for (
auto &KV : Symbols) {
 
 2784    auto I = MR.SymbolFlags.find(KV.first);
 
 2785    assert(
I != MR.SymbolFlags.end() &&
 
 2786           "Resolving symbol outside this responsibility set");
 
 2787    assert(!
I->second.hasMaterializationSideEffectsOnly() &&
 
 2788           "Can't resolve materialization-side-effects-only symbol");
 
 2791      assert((KV.second.getFlags() & WeakOrCommon) &&
 
 2792             "Common symbols must be resolved as common or weak");
 
 2793      assert((KV.second.getFlags() & ~WeakOrCommon) ==
 
 2795             "Resolving symbol with incorrect flags");
 
 2797      assert(KV.second.getFlags() == 
I->second &&
 
 2798             "Resolving symbol with incorrect flags");
 
 2802  return MR.JD.resolve(MR, Symbols);
 
 2806ExecutionSession::IL_getSymbolState(
JITDylib *JD,
 
 2808  if (JD->State != JITDylib::Open)
 
 2809    return WaitingOnGraph::ExternalState::Failed;
 
 2811  auto I = JD->Symbols.find_as(Name);
 
 2814  if (
I == JD->Symbols.end())
 
 2815    return WaitingOnGraph::ExternalState::Failed;
 
 2817  if (
I->second.getFlags().hasError())
 
 2818    return WaitingOnGraph::ExternalState::Failed;
 
 2821    return WaitingOnGraph::ExternalState::Ready;
 
 2823  return WaitingOnGraph::ExternalState::None;
 
 2826template <
typename UpdateSymbolFn, 
typename UpdateQueryFn>
 
 2827void ExecutionSession::IL_collectQueries(
 
 2828    JITDylib::AsynchronousSymbolQuerySet &Qs,
 
 2830    UpdateSymbolFn &&UpdateSymbol, UpdateQueryFn &&UpdateQuery) {
 
 2832  for (
auto &[JD, Symbols] : QualifiedSymbols) {
 
 2837    assert(JD->State == JITDylib::Open &&
 
 2838           "WaitingOnGraph includes definition in defunct JITDylib");
 
 2839    for (
auto &Symbol : Symbols) {
 
 2841      auto I = JD->Symbols.find_as(Symbol);
 
 2842      assert(
I != JD->Symbols.end() &&
 
 2843             "Failed Symbol missing from JD symbol table");
 
 2845      UpdateSymbol(Entry);
 
 2848      auto J = JD->MaterializingInfos.find_as(Symbol);
 
 2849      if (J != JD->MaterializingInfos.end()) {
 
 2850        for (
auto &Q : J->second.takeAllPendingQueries()) {
 
 2851          UpdateQuery(*Q, *JD, Symbol, Entry);
 
 2852          Qs.insert(std::move(Q));
 
 2854        JD->MaterializingInfos.erase(J);
 
 2860Expected<ExecutionSession::EmitQueries>
 
 2862                          WaitingOnGraph::SimplifyResult SR) {
 
 2864  if (MR.RT->isDefunct())
 
 2867  auto &TargetJD = MR.getTargetJITDylib();
 
 2868  if (TargetJD.State != JITDylib::Open)
 
 2873#ifdef EXPENSIVE_CHECKS 
 2874  verifySessionState(
"entering ExecutionSession::IL_emit");
 
 2877  auto ER = G.emit(std::move(SR),
 
 2878                   [
this](
JITDylib *JD, NonOwningSymbolStringPtr Name) {
 
 2879                     return IL_getSymbolState(JD, Name);
 
 2885  for (
auto &SN : ER.Failed)
 
 2887        EQ.Failed, SN->defs(),
 
 2888        [](JITDylib::SymbolTableEntry &
E) {
 
 2889          E.setFlags(E.getFlags() = JITSymbolFlags::HasError);
 
 2891        [&](AsynchronousSymbolQuery &Q, 
JITDylib &JD,
 
 2892            NonOwningSymbolStringPtr Name, JITDylib::SymbolTableEntry &
E) {
 
 2893          auto &FS = EQ.FailedSymsForQuery[&Q];
 
 2895            FS = std::make_shared<SymbolDependenceMap>();
 
 2896          (*FS)[&JD].insert(SymbolStringPtr(Name));
 
 2899  for (
auto &FQ : 
EQ.Failed)
 
 2902  for (
auto &SN : ER.Ready)
 
 2904        EQ.Completed, SN->defs(),
 
 2905        [](JITDylib::SymbolTableEntry &
E) { E.setState(SymbolState::Ready); },
 
 2906        [](AsynchronousSymbolQuery &Q, 
JITDylib &JD,
 
 2907           NonOwningSymbolStringPtr Name, JITDylib::SymbolTableEntry &
E) {
 
 2908          Q.notifySymbolMetRequiredState(SymbolStringPtr(Name), E.getSymbol());
 
 2913  for (
auto it = 
EQ.Completed.begin(), end = 
EQ.Completed.end(); it != end;) {
 
 2914    if ((*it)->isComplete()) {
 
 2917      it = 
EQ.Completed.erase(it);
 
 2921#ifdef EXPENSIVE_CHECKS 
 2922  verifySessionState(
"exiting ExecutionSession::IL_emit");
 
 2925  return std::move(
EQ);
 
 2928Error ExecutionSession::OL_notifyEmitted(
 
 2932    dbgs() << 
"In " << MR.JD.getName() << 
" emitting " << MR.SymbolFlags
 
 2934    if (!DepGroups.empty()) {
 
 2935      dbgs() << 
"  Initial dependencies:\n";
 
 2936      for (
auto &SDG : DepGroups) {
 
 2937        dbgs() << 
"    Symbols: " << SDG.Symbols
 
 2938               << 
", Dependencies: " << SDG.Dependencies << 
"\n";
 
 2945  for (
auto &DG : DepGroups) {
 
 2946    for (
auto &Sym : DG.Symbols) {
 
 2947      assert(MR.SymbolFlags.count(Sym) &&
 
 2948             "DG contains dependence for symbol outside this MR");
 
 2949      assert(Visited.insert(Sym).second &&
 
 2950             "DG contains duplicate entries for Name");
 
 2955  std::vector<std::unique_ptr<WaitingOnGraph::SuperNode>> SNs;
 
 2958    auto &JDResidual = Residual[&MR.getTargetJITDylib()];
 
 2959    for (
auto &[Name, Flags] : MR.getSymbols())
 
 2960      JDResidual.insert(NonOwningSymbolStringPtr(Name));
 
 2962    for (
auto &SDG : DepGroups) {
 
 2964      assert(!SDG.Symbols.empty());
 
 2965      auto &JDDefs = Defs[&MR.getTargetJITDylib()];
 
 2966      for (
auto &Def : SDG.Symbols) {
 
 2967        JDDefs.insert(NonOwningSymbolStringPtr(Def));
 
 2968        JDResidual.erase(NonOwningSymbolStringPtr(Def));
 
 2971      if (!SDG.Dependencies.empty()) {
 
 2972        for (
auto &[JD, Syms] : SDG.Dependencies) {
 
 2973          auto &JDDeps = Deps[JD];
 
 2974          for (
auto &Dep : Syms)
 
 2975            JDDeps.insert(NonOwningSymbolStringPtr(Dep));
 
 2978      SNs.push_back(std::make_unique<WaitingOnGraph::SuperNode>(
 
 2979          std::move(Defs), std::move(Deps)));
 
 2981    if (!JDResidual.empty())
 
 2982      SNs.push_back(std::make_unique<WaitingOnGraph::SuperNode>(
 
 2989    dbgs() << 
"  Simplified dependencies:\n";
 
 2990    for (
auto &SN : SR.superNodes()) {
 
 2993        std::vector<JITDylib *> JDs;
 
 2994        for (
auto &[JD, 
_] : 
C)
 
 2997          return LHS->getName() < 
RHS->getName();
 
 3003        std::vector<NonOwningSymbolStringPtr> Names(Elems.begin(), Elems.end());
 
 3005                             const NonOwningSymbolStringPtr &
RHS) {
 
 3011      dbgs() << 
"    Defs: {";
 
 3012      for (
auto *JD : SortedLibs(SN->defs())) {
 
 3013        dbgs() << 
" (" << JD->getName() << 
", [";
 
 3014        for (
auto &Sym : SortedNames(SN->defs()[JD]))
 
 3015          dbgs() << 
" " << Sym;
 
 3018      dbgs() << 
" }, Deps: {";
 
 3019      for (
auto *JD : SortedLibs(SN->deps())) {
 
 3020        dbgs() << 
" (" << JD->getName() << 
", [";
 
 3021        for (
auto &Sym : SortedNames(SN->deps()[JD]))
 
 3022          dbgs() << 
" " << Sym;
 
 3033    return EmitQueries.takeError();
 
 3041    for (
auto &FQ : EmitQueries->Failed) {
 
 3043      assert(EmitQueries->FailedSymsForQuery.count(FQ.get()) &&
 
 3044             "Missing failed symbols for query");
 
 3045      auto FailedSyms = std::move(EmitQueries->FailedSymsForQuery[FQ.get()]);
 
 3046      for (
auto &[JD, Syms] : *FailedSyms) {
 
 3047        auto &BadDepsForJD = BadDeps[JD];
 
 3048        for (
auto &Sym : Syms)
 
 3049          BadDepsForJD.insert(Sym);
 
 3052                                                       std::move(FailedSyms)));
 
 3056  for (
auto &UQ : EmitQueries->Completed)
 
 3057    UQ->handleComplete(*
this);
 
 3060  if (!BadDeps.empty()) {
 
 3066    for (
auto &[Name, Flags] : MR.getSymbols())
 
 3068    MR.SymbolFlags.clear();
 
 3071        std::move(BadDeps), 
"dependencies removed or in error state");
 
 3074  MR.SymbolFlags.
clear();
 
 3078Error ExecutionSession::OL_defineMaterializing(
 
 3082    dbgs() << 
"In " << MR.JD.getName() << 
" defining materializing symbols " 
 3083           << NewSymbolFlags << 
"\n";
 
 3085  if (
auto AcceptedDefs =
 
 3086          MR.JD.defineMaterializing(MR, std::move(NewSymbolFlags))) {
 
 3088    for (
auto &KV : *AcceptedDefs)
 
 3089      MR.SymbolFlags.insert(KV);
 
 3092    return AcceptedDefs.takeError();
 
 3095std::pair<JITDylib::AsynchronousSymbolQuerySet,
 
 3096          std::shared_ptr<SymbolDependenceMap>>
 
 3097ExecutionSession::IL_failSymbols(
JITDylib &JD,
 
 3100#ifdef EXPENSIVE_CHECKS 
 3101  verifySessionState(
"entering ExecutionSession::IL_failSymbols");
 
 3104  JITDylib::AsynchronousSymbolQuerySet FailedQueries;
 
 3105  auto Fail = [&](
JITDylib *FailJD, NonOwningSymbolStringPtr FailSym) {
 
 3106    auto I = FailJD->Symbols.find_as(FailSym);
 
 3107    assert(
I != FailJD->Symbols.end());
 
 3109    auto J = FailJD->MaterializingInfos.find_as(FailSym);
 
 3110    if (J != FailJD->MaterializingInfos.end()) {
 
 3111      for (
auto &Q : J->second.takeAllPendingQueries())
 
 3112        FailedQueries.insert(std::move(Q));
 
 3113      FailJD->MaterializingInfos.erase(J);
 
 3117  auto FailedSymbolsMap = std::make_shared<SymbolDependenceMap>();
 
 3120    auto &FailedSymsForJD = (*FailedSymbolsMap)[&JD];
 
 3121    for (
auto &Sym : SymbolsToFail) {
 
 3122      FailedSymsForJD.insert(Sym);
 
 3123      Fail(&JD, NonOwningSymbolStringPtr(Sym));
 
 3128  auto &JDToFail = ToFail[&JD];
 
 3129  for (
auto &Sym : SymbolsToFail)
 
 3130    JDToFail.insert(NonOwningSymbolStringPtr(Sym));
 
 3132  auto FailedSNs = G.fail(ToFail);
 
 3134  for (
auto &SN : FailedSNs) {
 
 3135    for (
auto &[FailJD, Defs] : SN->defs()) {
 
 3136      auto &FailedSymsForFailJD = (*FailedSymbolsMap)[FailJD];
 
 3137      for (
auto &Def : Defs) {
 
 3138        FailedSymsForFailJD.insert(SymbolStringPtr(Def));
 
 3145  for (
auto &Q : FailedQueries)
 
 3148#ifdef EXPENSIVE_CHECKS 
 3149  verifySessionState(
"exiting ExecutionSession::IL_failSymbols");
 
 3152  return std::make_pair(std::move(FailedQueries), std::move(FailedSymbolsMap));
 
 3158    dbgs() << 
"In " << MR.JD.getName() << 
" failing materialization for " 
 3159           << MR.SymbolFlags << 
"\n";
 
 3162  if (MR.SymbolFlags.empty())
 
 3166  for (
auto &[Name, Flags] : MR.SymbolFlags)
 
 3167    SymbolsToFail.push_back(Name);
 
 3168  MR.SymbolFlags.clear();
 
 3170  JITDylib::AsynchronousSymbolQuerySet FailedQueries;
 
 3171  std::shared_ptr<SymbolDependenceMap> FailedSymbols;
 
 3175    if (MR.RT->isDefunct())
 
 3176      return std::pair<JITDylib::AsynchronousSymbolQuerySet,
 
 3177                       std::shared_ptr<SymbolDependenceMap>>();
 
 3178    return IL_failSymbols(MR.getTargetJITDylib(), SymbolsToFail);
 
 3181  for (
auto &Q : FailedQueries) {
 
 3189                                   std::unique_ptr<MaterializationUnit> MU) {
 
 3190  for (
auto &KV : MU->getSymbols()) {
 
 3191    assert(MR.SymbolFlags.count(KV.first) &&
 
 3192           "Replacing definition outside this responsibility set");
 
 3193    MR.SymbolFlags.erase(KV.first);
 
 3196  if (MU->getInitializerSymbol() == MR.InitSymbol)
 
 3197    MR.InitSymbol = 
nullptr;
 
 3199  LLVM_DEBUG(MR.JD.getExecutionSession().runSessionLocked([&]() {
 
 3200    dbgs() << 
"In " << MR.JD.getName() << 
" replacing symbols with " << *MU
 
 3204  return MR.JD.replace(MR, std::move(MU));
 
 3207Expected<std::unique_ptr<MaterializationResponsibility>>
 
 3211  SymbolStringPtr DelegatedInitSymbol;
 
 3214  for (
auto &Name : Symbols) {
 
 3215    auto I = MR.SymbolFlags.find(Name);
 
 3216    assert(
I != MR.SymbolFlags.end() &&
 
 3217           "Symbol is not tracked by this MaterializationResponsibility " 
 3220    DelegatedFlags[
Name] = std::move(
I->second);
 
 3221    if (Name == MR.InitSymbol)
 
 3222      std::swap(MR.InitSymbol, DelegatedInitSymbol);
 
 3224    MR.SymbolFlags.erase(
I);
 
 3227  return MR.JD.delegate(MR, std::move(DelegatedFlags),
 
 3228                        std::move(DelegatedInitSymbol));
 
 3232void ExecutionSession::dumpDispatchInfo(
Task &
T) {
 
 3234    dbgs() << 
"Dispatching: ";
 
 3235    T.printDescription(
dbgs());
 
for(const MachineOperand &MO :llvm::drop_begin(OldMI.operands(), Desc.getNumOperands()))
 
aarch64 falkor hwpf fix Falkor HW Prefetch Fix Late Phase
 
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
 
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
 
static StringRef getName(Value *V)
 
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
 
const T & front() const
front - Get the first element.
 
size_t size() const
size - Get the array size.
 
bool empty() const
empty - Check if the array is empty.
 
iterator find(const_arg_type_t< KeyT > Val)
 
bool erase(const KeyT &Val)
 
iterator find_as(const LookupKeyT &Val)
Alternate version of find() which allows a different, and possibly less expensive,...
 
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
 
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
 
Implements a dense probed hash-table based set.
 
Helper for Errors used as out-parameters.
 
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.
 
reference get()
Returns a reference to the stored T value.
 
bool hasMaterializationSideEffectsOnly() const
Returns true if this symbol is a materialization-side-effects-only symbol.
 
void push_back(const T &Elt)
 
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
 
StringRef - Represent a constant reference to a string, i.e.
 
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
 
std::pair< iterator, bool > insert(const ValueT &V)
 
void reserve(size_t Size)
Grow the DenseSet so that it can contain at least NumEntries items before resizing again.
 
void insert_range(Range &&R)
 
size_type count(const_arg_type_t< ValueT > V) const
Return 1 if the specified key is in the set, 0 otherwise.
 
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.
 
LLVM_ABI void notifySymbolMetRequiredState(const SymbolStringPtr &Name, ExecutorSymbolDef Sym)
Notify the query that a requested symbol has reached the required state.
 
Definition generators can be attached to JITDylibs to generate new definitions for otherwise unresolv...
 
virtual ~DefinitionGenerator()
 
An ExecutionSession represents a running JIT program.
 
LLVM_ABI Error endSession()
End the session.
 
unique_function< void(shared::WrapperFunctionResult)> SendResultFunction
Send a result to the remote.
 
void reportError(Error Err)
Report a error for this execution session.
 
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.
 
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.
 
LLVM_ABI JITDylib & createBareJITDylib(std::string Name)
Add a new bare JITDylib to this ExecutionSession.
 
std::shared_ptr< SymbolStringPool > getSymbolStringPool()
Get the SymbolStringPool for this instance.
 
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...
 
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.
 
LLVM_ABI void dump(raw_ostream &OS)
Dump the state of all the JITDylibs in this session.
 
LLVM_ABI Error removeJITDylibs(std::vector< JITDylibSP > JDsToRemove)
Removes the given JITDylibs from the ExecutionSession.
 
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.
 
DenseMap< SymbolStringPtr, JITDispatchHandlerFunction > JITDispatchHandlerAssociationMap
A map associating tag names with asynchronous wrapper function implementations in the JIT.
 
Represents an address in the executor process.
 
Represents a defining location for a JIT symbol.
 
const JITSymbolFlags & getFlags() const
 
FailedToMaterialize(std::shared_ptr< SymbolStringPool > SSP, std::shared_ptr< SymbolDependenceMap > Symbols)
 
std::error_code convertToErrorCode() const override
Convert this error to a std::error_code.
 
~FailedToMaterialize() override
 
void log(raw_ostream &OS) const override
Print an error message to an output stream.
 
InProgressFullLookupState(LookupKind K, JITDylibSearchOrder SearchOrder, SymbolLookupSet LookupSet, SymbolState RequiredState, std::shared_ptr< AsynchronousSymbolQuery > Q, RegisterDependenciesFunction RegisterDependencies)
 
void complete(std::unique_ptr< InProgressLookupState > IPLS) override
 
void fail(Error Err) override
 
void complete(std::unique_ptr< InProgressLookupState > IPLS) override
 
void fail(Error Err) override
 
InProgressLookupFlagsState(LookupKind K, JITDylibSearchOrder SearchOrder, SymbolLookupSet LookupSet, unique_function< void(Expected< SymbolFlagsMap >)> OnComplete)
 
virtual ~InProgressLookupState()=default
 
SymbolLookupSet DefGeneratorCandidates
 
JITDylibSearchOrder SearchOrder
 
std::vector< std::weak_ptr< DefinitionGenerator > > CurDefGeneratorStack
 
size_t CurSearchOrderIndex
 
SymbolLookupSet LookupSet
 
virtual void complete(std::unique_ptr< InProgressLookupState > IPLS)=0
 
InProgressLookupState(LookupKind K, JITDylibSearchOrder SearchOrder, SymbolLookupSet LookupSet, SymbolState RequiredState)
 
SymbolState RequiredState
 
SymbolLookupSet DefGeneratorNonCandidates
 
virtual void fail(Error Err)=0
 
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.
 
LLVM_ABI void dump(raw_ostream &OS)
Dump current JITDylib state to OS.
 
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.
 
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...
 
LLVM_ABI ResourceTrackerSP getDefaultResourceTracker()
Get the default resource tracker for this JITDylib.
 
JITDylib(const 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 &&)
 
void printDescription(raw_ostream &OS) override
 
Tracks responsibility for materialization, and mediates interactions between MaterializationUnits and...
 
void printDescription(raw_ostream &OS) override
 
~MaterializationTask() override
 
A MaterializationUnit represents a set of symbol definitions that can be materialized as a group,...
 
MaterializationUnit(Interface I)
 
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.
 
Non-owning SymbolStringPool entry pointer.
 
StringRef getName() const override
Return the name of this materialization unit.
 
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 ~ResourceManager()
 
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.
 
LLVM_ABI void transferTo(ResourceTracker &DstRT)
Transfer all resources associated with this key to the given tracker, which must target the same JITD...
 
LLVM_ABI ~ResourceTracker()
 
ResourceTracker(const ResourceTracker &)=delete
 
LLVM_ABI Error remove()
Remove all resources associated with this key.
 
LLVM_ABI void lookupAsync(LookupAsyncOnCompleteFn OnComplete) const
 
unique_function< void(Expected< ExecutorSymbolDef >)> LookupAsyncOnCompleteFn
 
A set of symbols to look up, each associated with a SymbolLookupFlags value.
 
static SymbolLookupSet fromMapKeys(const DenseMap< SymbolStringPtr, ValT > &M, SymbolLookupFlags Flags=SymbolLookupFlags::RequiredSymbol)
Construct a SymbolLookupSet from DenseMap keys.
 
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.
 
SymbolsCouldNotBeRemoved(std::shared_ptr< SymbolStringPool > SSP, SymbolNameSet Symbols)
 
void log(raw_ostream &OS) const override
Print an error message to an output stream.
 
SymbolsNotFound(std::shared_ptr< SymbolStringPool > SSP, SymbolNameSet Symbols)
 
std::error_code convertToErrorCode() const override
Convert this error to a std::error_code.
 
Represents an abstract task for ORC to run.
 
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.
 
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)
 
DenseSet< ElementId > ElementSet
 
DenseMap< ContainerId, ElementSet > ContainerElementsMap
 
static SimplifyResult simplify(std::vector< std::unique_ptr< SuperNode > > SNs)
 
static WrapperFunctionResult createOutOfBandError(const char *Msg)
Create an out-of-band error by copying the given string.
 
A raw_ostream that writes to a file descriptor.
 
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.
 
@ C
The default llvm calling convention, compatible with C.
 
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
 
@ MissingSymbolDefinitions
 
@ UnexpectedSymbolDefinitions
 
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
 
DenseMap< SymbolStringPtr, ExecutorSymbolDef > SymbolMap
A map from symbol names (as SymbolStringPtrs) to JITSymbols (address/flags pairs).
 
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.
 
@ Resolved
Queried, materialization begun.
 
DenseMap< SymbolStringPtr, SymbolAliasMapEntry > SymbolAliasMap
A map of Symbols to (Symbol, Flags) pairs.
 
LLVM_ABI std::error_code orcError(OrcErrorCode ErrCode)
 
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.
 
auto find(R &&Range, const T &Val)
Provide wrappers to std::find which take ranges instead of having to pass begin/end explicitly.
 
LLVM_ABI std::error_code inconvertibleErrorCode()
The value returned by this function can be returned from convertToErrorCode for Error values where no...
 
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
 
auto formatv(bool Validate, const char *Fmt, Ts &&...Vals)
 
auto reverse(ContainerTy &&C)
 
Error joinErrors(Error E1, Error E2)
Concatenate errors.
 
void sort(IteratorTy Start, IteratorTy End)
 
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
 
FunctionAddr VTableAddr Count
 
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
 
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.
 
auto lower_bound(R &&Range, T &&Value)
Provide wrappers to std::lower_bound which take ranges instead of having to pass begin/end explicitly...
 
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.
 
auto find_if(R &&Range, UnaryPredicate P)
Provide wrappers to std::find_if which take ranges instead of having to pass begin/end explicitly.
 
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
 
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.