From ffeacb7b1aeb8f013a3137915ee5558dcaad4967 Mon Sep 17 00:00:00 2001 From: Lang Hames Date: Mon, 16 Apr 2018 18:05:22 +0000 Subject: [ORC] Merge VSO notifyResolutionFailed and notifyFinalizationFailed in to notifyMaterializationFailed. The notifyMaterializationFailed method can determine which error to raise by looking at which queue the pending queries are in (resolution or finalization). llvm-svn: 330141 --- llvm/lib/ExecutionEngine/Orc/Core.cpp | 51 +++++++++++------------------------ 1 file changed, 16 insertions(+), 35 deletions(-) (limited to 'llvm/lib/ExecutionEngine/Orc/Core.cpp') 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, SymbolNameSet> - QueriesToFail; + ResolutionFailures; + std::map, 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(std::move(KV.second))); + + for (auto &KV : FinalizationFailures) + KV.first->notifyFailed(make_error(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, 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(std::move(KV.second))); -} - SymbolNameSet VSO::lookupFlags(SymbolFlagsMap &Flags, SymbolNameSet Names) { for (SymbolNameSet::iterator I = Names.begin(), E = Names.end(); I != E;) { -- cgit v1.2.3