diff options
Diffstat (limited to 'llvm/lib/ExecutionEngine/Orc/Core.cpp')
| -rw-r--r-- | llvm/lib/ExecutionEngine/Orc/Core.cpp | 36 |
1 files changed, 16 insertions, 20 deletions
diff --git a/llvm/lib/ExecutionEngine/Orc/Core.cpp b/llvm/lib/ExecutionEngine/Orc/Core.cpp index 6a9ebb41e79f..d47eb4416d3c 100644 --- a/llvm/lib/ExecutionEngine/Orc/Core.cpp +++ b/llvm/lib/ExecutionEngine/Orc/Core.cpp @@ -1576,12 +1576,22 @@ void Platform::lookupInitSymbolsAsync( } } +MaterializationTask::~MaterializationTask() { + // If this task wasn't run then fail materialization. + if (MR) + MR->failMaterialization(); +} + void MaterializationTask::printDescription(raw_ostream &OS) { OS << "Materialization task: " << MU->getName() << " in " << MR->getTargetJITDylib().getName(); } -void MaterializationTask::run() { MU->materialize(std::move(MR)); } +void MaterializationTask::run() { + assert(MU && "MU should not be null"); + assert(MR && "MR should not be null"); + MU->materialize(std::move(MR)); +} void LookupTask::printDescription(raw_ostream &OS) { OS << "Lookup task"; } @@ -1821,17 +1831,10 @@ ExecutionSession::lookup(const JITDylibSearchOrder &SearchOrder, RegisterDependenciesFunction RegisterDependencies) { #if LLVM_ENABLE_THREADS // In the threaded case we use promises to return the results. - std::promise<SymbolMap> PromisedResult; - Error ResolutionError = Error::success(); + std::promise<MSVCPExpected<SymbolMap>> PromisedResult; auto NotifyComplete = [&](Expected<SymbolMap> R) { - if (R) - PromisedResult.set_value(std::move(*R)); - else { - ErrorAsOutParameter _(ResolutionError); - ResolutionError = R.takeError(); - PromisedResult.set_value(SymbolMap()); - } + PromisedResult.set_value(std::move(R)); }; #else @@ -1848,18 +1851,11 @@ ExecutionSession::lookup(const JITDylibSearchOrder &SearchOrder, #endif // Perform the asynchronous lookup. - lookup(K, SearchOrder, std::move(Symbols), RequiredState, NotifyComplete, - RegisterDependencies); + lookup(K, SearchOrder, std::move(Symbols), RequiredState, + std::move(NotifyComplete), RegisterDependencies); #if LLVM_ENABLE_THREADS - auto ResultFuture = PromisedResult.get_future(); - auto Result = ResultFuture.get(); - - if (ResolutionError) - return std::move(ResolutionError); - - return std::move(Result); - + return PromisedResult.get_future().get(); #else if (ResolutionError) return std::move(ResolutionError); |
