summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/ExecutionEngine/Orc/Core.h7
-rw-r--r--llvm/lib/ExecutionEngine/Orc/Core.cpp51
-rw-r--r--llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp4
3 files changed, 20 insertions, 42 deletions
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/Core.h b/llvm/include/llvm/ExecutionEngine/Orc/Core.h
index 6d58d10a3d1..774084e841d 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/Core.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/Core.h
@@ -291,14 +291,11 @@ public:
/// mark the symbols as finalized yet.
void resolve(const SymbolMap &SymbolValues);
- /// @brief Notify the VSO that the given symbols failed to finalize.
- void notifyResolutionFailed(const SymbolNameSet &Names);
-
/// @brief Finalize the given symbols.
void finalize(const SymbolNameSet &SymbolsToFinalize);
- /// @brief Notify the VSO that the given symbols failed to finalize.
- void notifyFinalizationFailed(const SymbolNameSet &Names);
+ /// @brief Notify the VSO that the given symbols failed to materialized.
+ void notifyMaterializationFailed(const SymbolNameSet &Names);
/// @brief Look up the flags for the given symbols.
///
diff --git a/llvm/lib/ExecutionEngine/Orc/Core.cpp b/llvm/lib/ExecutionEngine/Orc/Core.cpp
index c9f0a14abe5..3d7ef7d7c4e 100644
--- a/llvm/lib/ExecutionEngine/Orc/Core.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/Core.cpp
@@ -390,11 +390,13 @@ void VSO::resolve(const SymbolMap &SymbolValues) {
}
}
-void VSO::notifyResolutionFailed(const SymbolNameSet &Names) {
- assert(!Names.empty() && "Failed to resolve empty set?");
+void VSO::notifyMaterializationFailed(const SymbolNameSet &Names) {
+ assert(!Names.empty() && "Failed to materialize empty set?");
std::map<std::shared_ptr<AsynchronousSymbolQuery>, SymbolNameSet>
- QueriesToFail;
+ ResolutionFailures;
+ std::map<std::shared_ptr<AsynchronousSymbolQuery>, SymbolNameSet>
+ FinalizationFailures;
for (auto &S : Names) {
auto I = Symbols.find(S);
@@ -402,17 +404,23 @@ void VSO::notifyResolutionFailed(const SymbolNameSet &Names) {
auto J = MaterializingInfos.find(S);
if (J != MaterializingInfos.end()) {
- assert(J->second.PendingFinalization.empty() &&
- "Failed during resolution, but queries pending finalization?");
- for (auto &Q : J->second.PendingResolution)
- QueriesToFail[Q].insert(S);
+ if (J->second.PendingFinalization.empty()) {
+ for (auto &Q : J->second.PendingResolution)
+ ResolutionFailures[Q].insert(S);
+ } else {
+ for (auto &Q : J->second.PendingFinalization)
+ FinalizationFailures[Q].insert(S);
+ }
MaterializingInfos.erase(J);
}
Symbols.erase(I);
}
- for (auto &KV : QueriesToFail)
+ for (auto &KV : ResolutionFailures)
KV.first->notifyFailed(make_error<FailedToResolve>(std::move(KV.second)));
+
+ for (auto &KV : FinalizationFailures)
+ KV.first->notifyFailed(make_error<FailedToFinalize>(std::move(KV.second)));
}
void VSO::finalize(const SymbolNameSet &SymbolsToFinalize) {
@@ -432,33 +440,6 @@ void VSO::finalize(const SymbolNameSet &SymbolsToFinalize) {
}
}
-void VSO::notifyFinalizationFailed(const SymbolNameSet &Names) {
- assert(!Names.empty() && "Failed to finalize empty set?");
-
- std::map<std::shared_ptr<AsynchronousSymbolQuery>, SymbolNameSet>
- QueriesToFail;
-
- for (auto &S : Names) {
- auto I = Symbols.find(S);
- assert(I != Symbols.end() && "Symbol not present in this VSO");
- assert((I->second.Flags & JITSymbolFlags::Materializing) &&
- "Failed to finalize symbol that was not materializing");
-
- auto J = MaterializingInfos.find(S);
- if (J != MaterializingInfos.end()) {
- assert(J->second.PendingResolution.empty() &&
- "Failed during finalization, but queries pending resolution?");
- for (auto &Q : J->second.PendingFinalization)
- QueriesToFail[Q].insert(S);
- MaterializingInfos.erase(J);
- }
- Symbols.erase(I);
- }
-
- for (auto &KV : QueriesToFail)
- KV.first->notifyFailed(make_error<FailedToFinalize>(std::move(KV.second)));
-}
-
SymbolNameSet VSO::lookupFlags(SymbolFlagsMap &Flags, SymbolNameSet Names) {
for (SymbolNameSet::iterator I = Names.begin(), E = Names.end(); I != E;) {
diff --git a/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp b/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp
index 0a87ed08edf..a2d815a53e3 100644
--- a/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp
+++ b/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp
@@ -323,7 +323,7 @@ TEST(CoreAPIsTest, FailResolution) {
{{Foo, JITSymbolFlags::Weak}, {Bar, JITSymbolFlags::Weak}});
},
[&](VSO &V) -> Error {
- V.notifyResolutionFailed(Names);
+ V.notifyMaterializationFailed(Names);
return Error::success();
},
[&](VSO &V, SymbolStringPtr Name) {
@@ -384,7 +384,7 @@ TEST(CoreAPIsTest, FailFinalization) {
auto FooSym = JITEvaluatedSymbol(FakeFooAddr, JITSymbolFlags::Exported);
auto BarSym = JITEvaluatedSymbol(FakeBarAddr, JITSymbolFlags::Exported);
V.resolve(SymbolMap({{Foo, FooSym}, {Bar, BarSym}}));
- V.notifyFinalizationFailed(Names);
+ V.notifyMaterializationFailed(Names);
return Error::success();
},
[&](VSO &V, SymbolStringPtr Name) {
OpenPOWER on IntegriCloud