summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLang Hames <lhames@gmail.com>2019-08-23 20:37:32 +0000
committerLang Hames <lhames@gmail.com>2019-08-23 20:37:32 +0000
commit7371fb422900fc5abf9671f9954b460ac94bc80e (patch)
treeb26c51462bde75af4c8d686002f457862058a62b
parente00585c77ca63928794e730ac38194c659819db4 (diff)
downloadbcm5719-llvm-7371fb422900fc5abf9671f9954b460ac94bc80e.tar.gz
bcm5719-llvm-7371fb422900fc5abf9671f9954b460ac94bc80e.zip
[ORC] Remove query dependencies when symbols are resolved.
If the dependencies are not removed then a late failure (one symbol covered by the query failing after others have already been resolved) can result in an attempt to detach the query from already finalized symbol, resulting in an assert/crash. This patch fixes the issue by removing query dependencies in JITDylib::resolve for symbols that meet the required state. llvm-svn: 369809
-rw-r--r--llvm/lib/ExecutionEngine/Orc/Core.cpp1
-rw-r--r--llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp26
2 files changed, 26 insertions, 1 deletions
diff --git a/llvm/lib/ExecutionEngine/Orc/Core.cpp b/llvm/lib/ExecutionEngine/Orc/Core.cpp
index ecfa116a646..15c9578e691 100644
--- a/llvm/lib/ExecutionEngine/Orc/Core.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/Core.cpp
@@ -1031,6 +1031,7 @@ Error JITDylib::resolve(const SymbolMap &Resolved) {
auto &MI = MaterializingInfos[Name];
for (auto &Q : MI.takeQueriesMeeting(SymbolState::Resolved)) {
Q->notifySymbolMetRequiredState(Name, ResolvedSym);
+ Q->removeQueryDependence(*this, Name);
if (Q->isComplete())
CompletedQueries.insert(std::move(Q));
}
diff --git a/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp b/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp
index 729dad9c29a..60612f6c6a7 100644
--- a/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp
+++ b/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp
@@ -935,7 +935,7 @@ TEST_F(CoreAPIsStandardTest, FailResolution) {
}
}
-TEST_F(CoreAPIsStandardTest, FailEmissionEarly) {
+TEST_F(CoreAPIsStandardTest, FailEmissionAfterResolution) {
cantFail(JD.define(absoluteSymbols({{Baz, BazSym}})));
@@ -970,6 +970,30 @@ TEST_F(CoreAPIsStandardTest, FailEmissionEarly) {
<< "Unexpected success while trying to test error propagation";
}
+TEST_F(CoreAPIsStandardTest, FailAfterPartialResolution) {
+
+ cantFail(JD.define(absoluteSymbols({{Foo, FooSym}})));
+
+ // Fail materialization of bar.
+ auto BarMU = std::make_unique<SimpleMaterializationUnit>(
+ SymbolFlagsMap({{Bar, BarSym.getFlags()}}),
+ [&](MaterializationResponsibility R) { R.failMaterialization(); });
+
+ cantFail(JD.define(std::move(BarMU)));
+
+ bool QueryHandlerRun = false;
+ ES.lookup(
+ JITDylibSearchList({{&JD, false}}), SymbolNameSet({Foo, Bar}),
+ SymbolState::Resolved,
+ [&](Expected<SymbolMap> Result) {
+ EXPECT_THAT_EXPECTED(std::move(Result), Failed())
+ << "Expected query to fail";
+ QueryHandlerRun = true;
+ },
+ NoDependenciesToRegister);
+ EXPECT_TRUE(QueryHandlerRun) << "Query handler never ran";
+}
+
TEST_F(CoreAPIsStandardTest, TestLookupWithUnthreadedMaterialization) {
auto MU = std::make_unique<SimpleMaterializationUnit>(
SymbolFlagsMap({{Foo, JITSymbolFlags::Exported}}),
OpenPOWER on IntegriCloud