summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/ExecutionEngine/Orc/Core.h2
-rw-r--r--llvm/lib/ExecutionEngine/Orc/Core.cpp64
-rw-r--r--llvm/lib/ExecutionEngine/Orc/Legacy.cpp4
3 files changed, 45 insertions, 25 deletions
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/Core.h b/llvm/include/llvm/ExecutionEngine/Orc/Core.h
index 7d294afca45..b4450b1eb17 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/Core.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/Core.h
@@ -639,7 +639,7 @@ using AsynchronousLookupFunction = std::function<SymbolNameSet(
/// Perform a blocking lookup on the given symbols.
Expected<SymbolMap> blockingLookup(ExecutionSessionBase &ES,
AsynchronousLookupFunction AsyncLookup,
- SymbolNameSet Names,
+ SymbolNameSet Names, bool WaiUntilReady,
MaterializationResponsibility *MR = nullptr);
/// Look up the given names in the given VSOs.
diff --git a/llvm/lib/ExecutionEngine/Orc/Core.cpp b/llvm/lib/ExecutionEngine/Orc/Core.cpp
index 5ae65ab2f66..74cb3834b79 100644
--- a/llvm/lib/ExecutionEngine/Orc/Core.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/Core.cpp
@@ -937,7 +937,7 @@ VSO &ExecutionSession::createVSO(std::string Name) {
Expected<SymbolMap> blockingLookup(ExecutionSessionBase &ES,
AsynchronousLookupFunction AsyncLookup,
- SymbolNameSet Names,
+ SymbolNameSet Names, bool WaitUntilReady,
MaterializationResponsibility *MR) {
#if LLVM_ENABLE_THREADS
@@ -963,14 +963,23 @@ Expected<SymbolMap> blockingLookup(ExecutionSessionBase &ES,
}
};
- auto OnReady = [&](Error Err) {
- if (Err) {
- ErrorAsOutParameter _(&ReadyError);
- std::lock_guard<std::mutex> Lock(ErrMutex);
- ReadyError = std::move(Err);
- }
- PromisedReady.set_value();
- };
+ std::function<void(Error)> OnReady;
+ if (WaitUntilReady) {
+ OnReady = [&](Error Err) {
+ if (Err) {
+ ErrorAsOutParameter _(&ReadyError);
+ std::lock_guard<std::mutex> Lock(ErrMutex);
+ ReadyError = std::move(Err);
+ }
+ PromisedReady.set_value();
+ };
+ } else {
+ OnReady = [&](Error Err) {
+ if (Err)
+ ES.reportError(std::move(Err));
+ };
+ }
+
#else
SymbolMap Result;
Error ResolutionError = Error::success();
@@ -986,11 +995,19 @@ Expected<SymbolMap> blockingLookup(ExecutionSessionBase &ES,
ResolutionError = R.takeError();
};
- auto OnReady = [&](Error Err) {
- ErrorAsOutParameter _(&ReadyError);
- if (Err)
- ReadyError = std::move(Err);
- };
+ std::function<void(Error)> OnReady;
+ if (WaitUntilReady) {
+ OnReady = [&](Error Err) {
+ ErrorAsOutParameter _(&ReadyError);
+ if (Err)
+ ReadyError = std::move(Err);
+ };
+ } else {
+ OnReady = [&](Error Err) {
+ if (Err)
+ ES.reportError(std::move(Err));
+ };
+ }
#endif
auto Query = std::make_shared<AsynchronousSymbolQuery>(
@@ -1017,14 +1034,17 @@ Expected<SymbolMap> blockingLookup(ExecutionSessionBase &ES,
}
}
- auto ReadyFuture = PromisedReady.get_future();
- ReadyFuture.get();
+ if (WaitUntilReady) {
+ auto ReadyFuture = PromisedReady.get_future();
+ ReadyFuture.get();
- {
- std::lock_guard<std::mutex> Lock(ErrMutex);
- if (ReadyError)
- return std::move(ReadyError);
- }
+ {
+ std::lock_guard<std::mutex> Lock(ErrMutex);
+ if (ReadyError)
+ return std::move(ReadyError);
+ }
+ } else
+ cantFail(std::move(ReadyError));
return std::move(Result);
@@ -1060,7 +1080,7 @@ Expected<SymbolMap> lookup(const VSO::VSOList &VSOs, SymbolNameSet Names) {
return Unresolved;
};
- return blockingLookup(ES, std::move(LookupFn), Names);
+ return blockingLookup(ES, std::move(LookupFn), Names, true);
}
/// Look up a symbol by searching a list of VSOs.
diff --git a/llvm/lib/ExecutionEngine/Orc/Legacy.cpp b/llvm/lib/ExecutionEngine/Orc/Legacy.cpp
index 3fd53a00a79..795ddd582d8 100644
--- a/llvm/lib/ExecutionEngine/Orc/Legacy.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/Legacy.cpp
@@ -27,8 +27,8 @@ JITSymbolResolverAdapter::lookup(const LookupSet &Symbols) {
return R.lookup(std::move(Q), std::move(Unresolved));
};
- auto InternedResult =
- blockingLookup(ES, std::move(LookupFn), std::move(InternedSymbols), MR);
+ auto InternedResult = blockingLookup(ES, std::move(LookupFn),
+ std::move(InternedSymbols), false, MR);
if (!InternedResult)
return InternedResult.takeError();
OpenPOWER on IntegriCloud