@@ -1251,9 +1251,7 @@ JITDylib::JITDylib(ExecutionSession &ES, std::string Name)
12511251 LinkOrder.push_back ({this , JITDylibLookupFlags::MatchAllSymbols});
12521252}
12531253
1254- std::pair<JITDylib::AsynchronousSymbolQuerySet,
1255- std::shared_ptr<SymbolDependenceMap>>
1256- JITDylib::IL_removeTracker (ResourceTracker &RT) {
1254+ JITDylib::RemoveTrackerResult JITDylib::IL_removeTracker (ResourceTracker &RT) {
12571255 // Note: Should be called under the session lock.
12581256 assert (State != Closed && " JD is defunct" );
12591257
@@ -1292,7 +1290,10 @@ JITDylib::IL_removeTracker(ResourceTracker &RT) {
12921290 SymbolsToFail.push_back (Sym);
12931291 }
12941292
1295- auto Result = ES.IL_failSymbols (*this , std::move (SymbolsToFail));
1293+ auto [QueriesToFail, FailedSymbols] =
1294+ ES.IL_failSymbols (*this , std::move (SymbolsToFail));
1295+
1296+ std::vector<std::unique_ptr<MaterializationUnit>> DefunctMUs;
12961297
12971298 // Removed symbols should be taken out of the table altogether.
12981299 for (auto &Sym : SymbolsToRemove) {
@@ -1302,7 +1303,12 @@ JITDylib::IL_removeTracker(ResourceTracker &RT) {
13021303 // Remove Materializer if present.
13031304 if (I->second .hasMaterializerAttached ()) {
13041305 // FIXME: Should this discard the symbols?
1305- UnmaterializedInfos.erase (Sym);
1306+ auto J = UnmaterializedInfos.find (Sym);
1307+ assert (J != UnmaterializedInfos.end () &&
1308+ " Symbol table indicates MU present, but no UMI record" );
1309+ if (J->second ->MU )
1310+ DefunctMUs.push_back (std::move (J->second ->MU ));
1311+ UnmaterializedInfos.erase (J);
13061312 } else {
13071313 assert (!UnmaterializedInfos.count (Sym) &&
13081314 " Symbol has materializer attached" );
@@ -1313,7 +1319,8 @@ JITDylib::IL_removeTracker(ResourceTracker &RT) {
13131319
13141320 shrinkMaterializationInfoMemory ();
13151321
1316- return Result;
1322+ return {std::move (QueriesToFail), std::move (FailedSymbols),
1323+ std::move (DefunctMUs)};
13171324}
13181325
13191326void JITDylib::transferTracker (ResourceTracker &DstRT, ResourceTracker &SrcRT) {
@@ -2180,26 +2187,27 @@ Error ExecutionSession::removeResourceTracker(ResourceTracker &RT) {
21802187 });
21812188 std::vector<ResourceManager *> CurrentResourceManagers;
21822189
2183- JITDylib::AsynchronousSymbolQuerySet QueriesToFail;
2184- std::shared_ptr<SymbolDependenceMap> FailedSymbols;
2190+ JITDylib::RemoveTrackerResult R;
21852191
21862192 runSessionLocked ([&] {
21872193 CurrentResourceManagers = ResourceManagers;
21882194 RT.makeDefunct ();
2189- std::tie (QueriesToFail, FailedSymbols) =
2190- RT.getJITDylib ().IL_removeTracker (RT);
2195+ R = RT.getJITDylib ().IL_removeTracker (RT);
21912196 });
21922197
2198+ // Release any defunct MaterializationUnits.
2199+ R.DefunctMUs .clear ();
2200+
21932201 Error Err = Error::success ();
21942202
21952203 auto &JD = RT.getJITDylib ();
21962204 for (auto *L : reverse (CurrentResourceManagers))
21972205 Err = joinErrors (std::move (Err),
21982206 L->handleRemoveResources (JD, RT.getKeyUnsafe ()));
21992207
2200- for (auto &Q : QueriesToFail)
2201- Q->handleFailed (
2202- make_error<FailedToMaterialize>( getSymbolStringPool (), FailedSymbols));
2208+ for (auto &Q : R. QueriesToFail )
2209+ Q->handleFailed (make_error<FailedToMaterialize>( getSymbolStringPool (),
2210+ R. FailedSymbols ));
22032211
22042212 return Err;
22052213}
0 commit comments