Skip to content

Commit aacb898

Browse files
authored
[orc] Reduce memory usage from empty materialization info DenseMaps (#88167)
Saves several MB of memory in larger applications after linking finishes by clearing DenseMap storage that is empty. This does not attempt to shrink partially full materialization infos. The assumption is that adding more after linking finishes is rare. rdar://126145336
1 parent 9d9560f commit aacb898

File tree

2 files changed

+27
-0
lines changed
  • llvm

2 files changed

+27
-0
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1333,6 +1333,10 @@ class JITDylib : public ThreadSafeRefCountedBase<JITDylib>,
13331333

13341334
void unlinkMaterializationResponsibility(MaterializationResponsibility &MR);
13351335

1336+
/// Attempt to reduce memory usage from empty \c UnmaterializedInfos and
1337+
/// \c MaterializingInfos tables.
1338+
void shrinkMaterializationInfoMemory();
1339+
13361340
ExecutionSession &ES;
13371341
enum { Open, Closing, Closed } State = Open;
13381342
std::mutex GeneratorsMutex;

llvm/lib/ExecutionEngine/Orc/Core.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1002,6 +1002,17 @@ void JITDylib::unlinkMaterializationResponsibility(
10021002
});
10031003
}
10041004

1005+
void JITDylib::shrinkMaterializationInfoMemory() {
1006+
// DenseMap::erase never shrinks its storage; use clear to heuristically free
1007+
// memory since we may have long-lived JDs after linking is done.
1008+
1009+
if (UnmaterializedInfos.empty())
1010+
UnmaterializedInfos.clear();
1011+
1012+
if (MaterializingInfos.empty())
1013+
MaterializingInfos.clear();
1014+
}
1015+
10051016
void JITDylib::setLinkOrder(JITDylibSearchOrder NewLinkOrder,
10061017
bool LinkAgainstThisJITDylibFirst) {
10071018
ES.runSessionLocked([&]() {
@@ -1112,6 +1123,8 @@ Error JITDylib::remove(const SymbolNameSet &Names) {
11121123
Symbols.erase(SymI);
11131124
}
11141125

1126+
shrinkMaterializationInfoMemory();
1127+
11151128
return Error::success();
11161129
});
11171130
}
@@ -1313,6 +1326,8 @@ JITDylib::removeTracker(ResourceTracker &RT) {
13131326
Symbols.erase(I);
13141327
}
13151328

1329+
shrinkMaterializationInfoMemory();
1330+
13161331
return Result;
13171332
}
13181333

@@ -2675,6 +2690,8 @@ void ExecutionSession::OL_completeLookup(
26752690
return true;
26762691
});
26772692

2693+
JD.shrinkMaterializationInfoMemory();
2694+
26782695
// Handle failure.
26792696
if (Err) {
26802697

@@ -3118,6 +3135,8 @@ void ExecutionSession::IL_makeEDUReady(
31183135

31193136
JD.MaterializingInfos.erase(MII);
31203137
}
3138+
3139+
JD.shrinkMaterializationInfoMemory();
31213140
}
31223141

31233142
void ExecutionSession::IL_makeEDUEmitted(
@@ -3632,6 +3651,8 @@ ExecutionSession::IL_failSymbols(JITDylib &JD,
36323651
ExtractFailedQueries(DepMI);
36333652
DepJD.MaterializingInfos.erase(SymbolStringPtr(DepName));
36343653
}
3654+
3655+
DepJD.shrinkMaterializationInfoMemory();
36353656
}
36363657

36373658
MI.DependantEDUs.clear();
@@ -3645,6 +3666,8 @@ ExecutionSession::IL_failSymbols(JITDylib &JD,
36453666
JD.MaterializingInfos.erase(Name);
36463667
}
36473668

3669+
JD.shrinkMaterializationInfoMemory();
3670+
36483671
#ifdef EXPENSIVE_CHECKS
36493672
verifySessionState("exiting ExecutionSession::IL_failSymbols");
36503673
#endif

0 commit comments

Comments
 (0)