mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 20:23:11 +01:00
[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:
parent
8902cdbc44
commit
4a793e369c
@ -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));
|
||||
}
|
||||
|
@ -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}}),
|
||||
|
Loading…
Reference in New Issue
Block a user