summaryrefslogtreecommitdiffstats
path: root/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp')
-rw-r--r--llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp40
1 files changed, 26 insertions, 14 deletions
diff --git a/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp b/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp
index 31568977c33..d87078f2e94 100644
--- a/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp
@@ -18,30 +18,42 @@ class JITDylibSearchOrderResolver : public JITSymbolResolver {
public:
JITDylibSearchOrderResolver(MaterializationResponsibility &MR) : MR(MR) {}
- Expected<LookupResult> lookup(const LookupSet &Symbols) {
+ void lookup(const LookupSet &Symbols, OnResolvedFunction OnResolved) {
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);
};
- 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;
+ MR.getTargetJITDylib().withSearchOrderDo([&](const JITDylibList &JDs) {
+ ES.lookup(JDs, InternedSymbols, OnResolvedWithUnwrap, OnReady,
+ RegisterDependencies);
+ });
}
Expected<LookupSet> getResponsibilitySet(const LookupSet &Symbols) {
OpenPOWER on IntegriCloud