summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/ExecutionEngine/Orc/Core.cpp3
-rw-r--r--llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp38
2 files changed, 41 insertions, 0 deletions
diff --git a/llvm/lib/ExecutionEngine/Orc/Core.cpp b/llvm/lib/ExecutionEngine/Orc/Core.cpp
index 96baf624caa..c5730378fa6 100644
--- a/llvm/lib/ExecutionEngine/Orc/Core.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/Core.cpp
@@ -467,6 +467,9 @@ void VSO::addDependencies(const SymbolFlagsMap &Dependants,
DepsOnOtherVSO.insert(OtherSymbol);
}
}
+
+ if (DepsOnOtherVSO.empty())
+ MI.UnfinalizedDependencies.erase(&OtherVSO);
}
}
});
diff --git a/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp b/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp
index 589cdb4d745..b809f34a37f 100644
--- a/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp
+++ b/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp
@@ -205,6 +205,44 @@ TEST(CoreAPIsTest, LookupFlagsTest) {
EXPECT_EQ(SymbolFlags[Bar], BarFlags) << "Incorrect flags returned for Bar";
}
+TEST(CoreAPIsTest, TestTrivialCircularDependency) {
+ ExecutionSession ES;
+
+ auto &V = ES.createVSO("V");
+
+ auto Foo = ES.getSymbolStringPool().intern("foo");
+ auto FooFlags = JITSymbolFlags::Exported;
+ auto FooSym = JITEvaluatedSymbol(1U, FooFlags);
+
+ Optional<MaterializationResponsibility> FooR;
+ auto FooMU = llvm::make_unique<SimpleMaterializationUnit>(
+ SymbolFlagsMap({{Foo, FooFlags}}),
+ [&](MaterializationResponsibility R) { FooR.emplace(std::move(R)); });
+
+ cantFail(V.define(FooMU));
+
+ bool FooReady = false;
+ auto Q =
+ std::make_shared<AsynchronousSymbolQuery>(
+ SymbolNameSet({ Foo }),
+ [](Expected<AsynchronousSymbolQuery::ResolutionResult> R) {
+ cantFail(std::move(R));
+ },
+ [&](Error Err) {
+ cantFail(std::move(Err));
+ FooReady = true;
+ });
+
+ V.lookup(std::move(Q), { Foo });
+
+ FooR->addDependencies({{&V, {Foo}}});
+ FooR->resolve({{Foo, FooSym}});
+ FooR->finalize();
+
+ EXPECT_TRUE(FooReady)
+ << "Self-dependency prevented symbol from being marked ready";
+}
+
TEST(CoreAPIsTest, TestCircularDependenceInOneVSO) {
ExecutionSession ES;
OpenPOWER on IntegriCloud