]> granicus.if.org Git - llvm/commitdiff
[ORC] Remove query dependencies when symbols are resolved.
authorLang Hames <lhames@gmail.com>
Fri, 23 Aug 2019 20:37:32 +0000 (20:37 +0000)
committerLang Hames <lhames@gmail.com>
Fri, 23 Aug 2019 20:37:32 +0000 (20:37 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@369809 91177308-0d34-0410-b5e6-96231b3b80d8

lib/ExecutionEngine/Orc/Core.cpp
unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp

index ecfa116a64635d17db2b05db567cb0827c316d12..15c9578e6910ea4df1bc19e675f2a131c36927cc 100644 (file)
@@ -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));
       }
index 729dad9c29a3608631d84980eec8142bbf082dd7..60612f6c6a7663ae8f6c66072b3234f461785733 100644 (file)
@@ -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}}),