[ORC] Don't create MaterializingInfo entries unnecessarily.

This commit is contained in:
Lang Hames 2020-03-26 13:06:13 -07:00
parent 49764dc30c
commit d38d06e649
2 changed files with 32 additions and 5 deletions

View File

@ -759,8 +759,6 @@ void JITDylib::addDependencies(const SymbolStringPtr &Name,
// If the dependency was not in the error state then add it to // If the dependency was not in the error state then add it to
// our list of dependencies. // our list of dependencies.
assert(OtherJITDylib.MaterializingInfos.count(OtherSymbol) &&
"No MaterializingInfo for dependency");
auto &OtherMI = OtherJITDylib.MaterializingInfos[OtherSymbol]; auto &OtherMI = OtherJITDylib.MaterializingInfos[OtherSymbol];
if (OtherSymEntry.getState() == SymbolState::Emitted) if (OtherSymEntry.getState() == SymbolState::Emitted)
@ -841,7 +839,11 @@ Error JITDylib::resolve(const SymbolMap &Resolved) {
SymI->second.setFlags(ResolvedFlags); SymI->second.setFlags(ResolvedFlags);
SymI->second.setState(SymbolState::Resolved); SymI->second.setState(SymbolState::Resolved);
auto &MI = MaterializingInfos[Name]; auto MII = MaterializingInfos.find(Name);
if (MII == MaterializingInfos.end())
continue;
auto &MI = MII->second;
for (auto &Q : MI.takeQueriesMeeting(SymbolState::Resolved)) { for (auto &Q : MI.takeQueriesMeeting(SymbolState::Resolved)) {
Q->notifySymbolMetRequiredState(Name, ResolvedSym); Q->notifySymbolMetRequiredState(Name, ResolvedSym);
Q->removeQueryDependence(*this, Name); Q->removeQueryDependence(*this, Name);
@ -909,8 +911,14 @@ Error JITDylib::emit(const SymbolFlagsMap &Emitted) {
SymEntry.setState(SymbolState::Emitted); SymEntry.setState(SymbolState::Emitted);
auto MII = MaterializingInfos.find(Name); auto MII = MaterializingInfos.find(Name);
assert(MII != MaterializingInfos.end() &&
"Missing MaterializingInfo entry"); // If this symbol has no MaterializingInfo then it's trivially ready.
// Update its state and continue.
if (MII == MaterializingInfos.end()) {
SymEntry.setState(SymbolState::Ready);
continue;
}
auto &MI = MII->second; auto &MI = MII->second;
// For each dependant, transfer this node's emitted dependencies to // For each dependant, transfer this node's emitted dependencies to

View File

@ -91,6 +91,25 @@ TEST_F(CoreAPIsStandardTest, EmptyLookup) {
EXPECT_TRUE(OnCompletionRun) << "OnCompletion was not run for empty query"; EXPECT_TRUE(OnCompletionRun) << "OnCompletion was not run for empty query";
} }
TEST_F(CoreAPIsStandardTest, ResolveUnrequestedSymbol) {
// Test that all symbols in a MaterializationUnit materialize corretly when
// only a subset of symbols is looked up.
// The aim here is to ensure that we're not relying on the query to set up
// state needed to materialize the unrequested symbols.
cantFail(JD.define(std::make_unique<SimpleMaterializationUnit>(
SymbolFlagsMap({{Foo, FooSym.getFlags()}, {Bar, BarSym.getFlags()}}),
[this](MaterializationResponsibility R) {
cantFail(R.notifyResolved({{Foo, FooSym}, {Bar, BarSym}}));
cantFail(R.notifyEmitted());
})));
auto Result =
cantFail(ES.lookup(makeJITDylibSearchOrder(&JD), SymbolLookupSet({Foo})));
EXPECT_EQ(Result.size(), 1U) << "Unexpected number of results";
EXPECT_TRUE(Result.count(Foo)) << "Expected result for \"Foo\"";
}
TEST_F(CoreAPIsStandardTest, RemoveSymbolsTest) { TEST_F(CoreAPIsStandardTest, RemoveSymbolsTest) {
// Test that: // Test that:
// (1) Missing symbols generate a SymbolsNotFound error. // (1) Missing symbols generate a SymbolsNotFound error.