diff options
Diffstat (limited to 'llvm/lib/ExecutionEngine/Orc')
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/Legacy.cpp | 40 | ||||
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp | 40 |
2 files changed, 34 insertions, 46 deletions
diff --git a/llvm/lib/ExecutionEngine/Orc/Legacy.cpp b/llvm/lib/ExecutionEngine/Orc/Legacy.cpp index f61376a909d..925729e0eee 100644 --- a/llvm/lib/ExecutionEngine/Orc/Legacy.cpp +++ b/llvm/lib/ExecutionEngine/Orc/Legacy.cpp @@ -18,34 +18,34 @@ JITSymbolResolverAdapter::JITSymbolResolverAdapter( ExecutionSession &ES, SymbolResolver &R, MaterializationResponsibility *MR) : ES(ES), R(R), MR(MR) {} -void JITSymbolResolverAdapter::lookup(const LookupSet &Symbols, - OnResolvedFunction OnResolved) { +Expected<JITSymbolResolverAdapter::LookupResult> +JITSymbolResolverAdapter::lookup(const LookupSet &Symbols) { SymbolNameSet InternedSymbols; for (auto &S : Symbols) InternedSymbols.insert(ES.getSymbolStringPool().intern(S)); - auto OnResolvedWithUnwrap = [OnResolved](Expected<SymbolMap> InternedResult) { - if (!InternedResult) { - OnResolved(InternedResult.takeError()); - return; - } + auto LookupFn = [&, this](std::shared_ptr<AsynchronousSymbolQuery> Q, + SymbolNameSet Unresolved) { + return R.lookup(std::move(Q), std::move(Unresolved)); + }; - LookupResult Result; - for (auto &KV : *InternedResult) - Result[*KV.first] = std::move(KV.second); - OnResolved(Result); + auto RegisterDependencies = [&](const SymbolDependenceMap &Deps) { + if (MR) + MR->addDependenciesForAll(Deps); }; - auto Q = std::make_shared<AsynchronousSymbolQuery>( - InternedSymbols, OnResolvedWithUnwrap, - [this](Error Err) { ES.reportError(std::move(Err)); }); + auto InternedResult = + ES.legacyLookup(std::move(LookupFn), std::move(InternedSymbols), + false, RegisterDependencies); - auto Unresolved = R.lookup(Q, InternedSymbols); - if (Unresolved.empty()) { - if (MR) - MR->addDependenciesForAll(Q->QueryRegistrations); - } else - ES.legacyFailQuery(*Q, make_error<SymbolsNotFound>(std::move(Unresolved))); + if (!InternedResult) + return InternedResult.takeError(); + + JITSymbolResolver::LookupResult Result; + for (auto &KV : *InternedResult) + Result[*KV.first] = KV.second; + + return Result; } Expected<JITSymbolResolverAdapter::LookupSet> diff --git a/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp b/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp index d87078f2e94..31568977c33 100644 --- a/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp +++ b/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp @@ -18,42 +18,30 @@ class JITDylibSearchOrderResolver : public JITSymbolResolver { public: JITDylibSearchOrderResolver(MaterializationResponsibility &MR) : MR(MR) {} - void lookup(const LookupSet &Symbols, OnResolvedFunction OnResolved) { + Expected<LookupResult> lookup(const LookupSet &Symbols) { auto &ES = MR.getTargetJITDylib().getExecutionSession(); SymbolNameSet InternedSymbols; - // Intern the requested symbols: lookup takes interned strings. for (auto &S : Symbols) InternedSymbols.insert(ES.getSymbolStringPool().intern(S)); - // Build an OnResolve callback to unwrap the interned strings and pass them - // to the OnResolved callback. - // FIXME: Switch to move capture of OnResolved once we have c++14. - auto OnResolvedWithUnwrap = - [OnResolved](Expected<SymbolMap> InternedResult) { - if (!InternedResult) { - OnResolved(InternedResult.takeError()); - return; - } - - LookupResult Result; - for (auto &KV : *InternedResult) - Result[*KV.first] = std::move(KV.second); - OnResolved(Result); - }; - - // We're not waiting for symbols to be ready. Just log any errors. - auto OnReady = [&ES](Error Err) { ES.reportError(std::move(Err)); }; - - // Register dependencies for all symbols contained in this set. auto RegisterDependencies = [&](const SymbolDependenceMap &Deps) { MR.addDependenciesForAll(Deps); }; - MR.getTargetJITDylib().withSearchOrderDo([&](const JITDylibList &JDs) { - ES.lookup(JDs, InternedSymbols, OnResolvedWithUnwrap, OnReady, - RegisterDependencies); - }); + auto InternedResult = + MR.getTargetJITDylib().withSearchOrderDo([&](const JITDylibList &JDs) { + return ES.lookup(JDs, InternedSymbols, RegisterDependencies, false); + }); + + if (!InternedResult) + return InternedResult.takeError(); + + LookupResult Result; + for (auto &KV : *InternedResult) + Result[*KV.first] = std::move(KV.second); + + return Result; } Expected<LookupSet> getResponsibilitySet(const LookupSet &Symbols) { |