Skip to content

Commit a001cc0

Browse files
committed
[ORC] Destroy defunct MaterializationUnits outside the session lock.
MaterializationUnits may contain arbitrary resources that need cleanup. We want to do this outside the JIT's session lock. This should fix a lock-order-inversion warning in clang-repl (for details see #124215).
1 parent 9fecb4f commit a001cc0

File tree

2 files changed

+28
-15
lines changed
  • llvm

2 files changed

+28
-15
lines changed

llvm/include/llvm/ExecutionEngine/Orc/Core.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1204,8 +1204,13 @@ class JITDylib : public ThreadSafeRefCountedBase<JITDylib>,
12041204

12051205
JITDylib(ExecutionSession &ES, std::string Name);
12061206

1207-
std::pair<AsynchronousSymbolQuerySet, std::shared_ptr<SymbolDependenceMap>>
1208-
IL_removeTracker(ResourceTracker &RT);
1207+
struct RemoveTrackerResult {
1208+
AsynchronousSymbolQuerySet QueriesToFail;
1209+
std::shared_ptr<SymbolDependenceMap> FailedSymbols;
1210+
std::vector<std::unique_ptr<MaterializationUnit>> DefunctMUs;
1211+
};
1212+
1213+
RemoveTrackerResult IL_removeTracker(ResourceTracker &RT);
12091214

12101215
void transferTracker(ResourceTracker &DstRT, ResourceTracker &SrcRT);
12111216

llvm/lib/ExecutionEngine/Orc/Core.cpp

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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

13191326
void 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

Comments
 (0)