[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
This commit is contained in:
Lang Hames 2019-08-23 20:37:32 +00:00
parent e00585c77c
commit 7371fb4229
2 changed files with 26 additions and 1 deletions

View 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));
}

View 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}}),