@@ -1251,9 +1251,7 @@ JITDylib::JITDylib(ExecutionSession &ES, std::string Name)
1251
1251
LinkOrder.push_back ({this , JITDylibLookupFlags::MatchAllSymbols});
1252
1252
}
1253
1253
1254
- std::pair<JITDylib::AsynchronousSymbolQuerySet,
1255
- std::shared_ptr<SymbolDependenceMap>>
1256
- JITDylib::IL_removeTracker (ResourceTracker &RT) {
1254
+ JITDylib::RemoveTrackerResult JITDylib::IL_removeTracker (ResourceTracker &RT) {
1257
1255
// Note: Should be called under the session lock.
1258
1256
assert (State != Closed && " JD is defunct" );
1259
1257
@@ -1292,7 +1290,10 @@ JITDylib::IL_removeTracker(ResourceTracker &RT) {
1292
1290
SymbolsToFail.push_back (Sym);
1293
1291
}
1294
1292
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;
1296
1297
1297
1298
// Removed symbols should be taken out of the table altogether.
1298
1299
for (auto &Sym : SymbolsToRemove) {
@@ -1302,7 +1303,12 @@ JITDylib::IL_removeTracker(ResourceTracker &RT) {
1302
1303
// Remove Materializer if present.
1303
1304
if (I->second .hasMaterializerAttached ()) {
1304
1305
// 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);
1306
1312
} else {
1307
1313
assert (!UnmaterializedInfos.count (Sym) &&
1308
1314
" Symbol has materializer attached" );
@@ -1313,7 +1319,8 @@ JITDylib::IL_removeTracker(ResourceTracker &RT) {
1313
1319
1314
1320
shrinkMaterializationInfoMemory ();
1315
1321
1316
- return Result;
1322
+ return {std::move (QueriesToFail), std::move (FailedSymbols),
1323
+ std::move (DefunctMUs)};
1317
1324
}
1318
1325
1319
1326
void JITDylib::transferTracker (ResourceTracker &DstRT, ResourceTracker &SrcRT) {
@@ -2180,26 +2187,27 @@ Error ExecutionSession::removeResourceTracker(ResourceTracker &RT) {
2180
2187
});
2181
2188
std::vector<ResourceManager *> CurrentResourceManagers;
2182
2189
2183
- JITDylib::AsynchronousSymbolQuerySet QueriesToFail;
2184
- std::shared_ptr<SymbolDependenceMap> FailedSymbols;
2190
+ JITDylib::RemoveTrackerResult R;
2185
2191
2186
2192
runSessionLocked ([&] {
2187
2193
CurrentResourceManagers = ResourceManagers;
2188
2194
RT.makeDefunct ();
2189
- std::tie (QueriesToFail, FailedSymbols) =
2190
- RT.getJITDylib ().IL_removeTracker (RT);
2195
+ R = RT.getJITDylib ().IL_removeTracker (RT);
2191
2196
});
2192
2197
2198
+ // Release any defunct MaterializationUnits.
2199
+ R.DefunctMUs .clear ();
2200
+
2193
2201
Error Err = Error::success ();
2194
2202
2195
2203
auto &JD = RT.getJITDylib ();
2196
2204
for (auto *L : reverse (CurrentResourceManagers))
2197
2205
Err = joinErrors (std::move (Err),
2198
2206
L->handleRemoveResources (JD, RT.getKeyUnsafe ()));
2199
2207
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 ));
2203
2211
2204
2212
return Err;
2205
2213
}
0 commit comments