mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-01 15:40:46 +00:00
IR: Drop metadata references more aggressively during teardown
Sometimes teardown happens before the debug info graph is complete (e.g., when clang throws an error). In that case, `MDNode`s will still have RAUW, so deleting constants that the `MDNode`s point at will be relatively expensive -- it'll cause re-uniquing all up the chain (what I've been referring to as "teardown madness"). So, drop references *before* deleting constants. We need to drop a few more references now: the metadata side of the metadata/value bridges needs to be dropped off the cliff along with the rest of it (previously, the bridges were cleaned before we did anything with the `MDNode`s). There's no real functionality change here -- state before and after `LLVMContextImpl::~LLVMContextImpl()` is unchanged -- so no testcase. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@226044 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
33f5127540
commit
0294f639d2
@ -115,6 +115,9 @@ class MetadataAsValue : public Value {
|
||||
MetadataAsValue(Type *Ty, Metadata *MD);
|
||||
~MetadataAsValue();
|
||||
|
||||
/// \brief Drop use of metadata (during teardown).
|
||||
void dropUse() { MD = nullptr; }
|
||||
|
||||
public:
|
||||
static MetadataAsValue *get(LLVMContext &Context, Metadata *MD);
|
||||
static MetadataAsValue *getIfExists(LLVMContext &Context, Metadata *MD);
|
||||
@ -185,6 +188,11 @@ class ValueAsMetadata : public Metadata, ReplaceableMetadataImpl {
|
||||
|
||||
Value *V;
|
||||
|
||||
/// \brief Drop users without RAUW (during teardown).
|
||||
void dropUsers() {
|
||||
ReplaceableMetadataImpl::resolveAllUses(/* ResolveUsers */ false);
|
||||
}
|
||||
|
||||
protected:
|
||||
ValueAsMetadata(unsigned ID, Value *V)
|
||||
: Metadata(ID), V(V) {
|
||||
|
@ -72,7 +72,30 @@ LLVMContextImpl::~LLVMContextImpl() {
|
||||
// the container. Avoid iterators during this operation:
|
||||
while (!OwnedModules.empty())
|
||||
delete *OwnedModules.begin();
|
||||
|
||||
|
||||
// Drop references for MDNodes. Do this before Values get deleted to avoid
|
||||
// unnecessary RAUW when nodes are still unresolved.
|
||||
for (auto *I : DistinctMDNodes)
|
||||
I->dropAllReferences();
|
||||
for (auto *I : MDTuples)
|
||||
I->dropAllReferences();
|
||||
for (auto *I : MDLocations)
|
||||
I->dropAllReferences();
|
||||
|
||||
// Also drop references that come from the Value bridges.
|
||||
for (auto &Pair : ValuesAsMetadata)
|
||||
Pair.second->dropUsers();
|
||||
for (auto &Pair : MetadataAsValues)
|
||||
Pair.second->dropUse();
|
||||
|
||||
// Destroy MDNodes.
|
||||
for (UniquableMDNode *I : DistinctMDNodes)
|
||||
I->deleteAsSubclass();
|
||||
for (MDTuple *I : MDTuples)
|
||||
delete I;
|
||||
for (MDLocation *I : MDLocations)
|
||||
delete I;
|
||||
|
||||
// Free the constants. This is important to do here to ensure that they are
|
||||
// freed before the LeakDetector is torn down.
|
||||
std::for_each(ExprConstants.map_begin(), ExprConstants.map_end(),
|
||||
@ -135,21 +158,6 @@ LLVMContextImpl::~LLVMContextImpl() {
|
||||
for (auto &Pair : ValuesAsMetadata)
|
||||
delete Pair.second;
|
||||
|
||||
// Destroy MDNodes.
|
||||
for (auto *I : DistinctMDNodes)
|
||||
I->dropAllReferences();
|
||||
for (auto *I : MDTuples)
|
||||
I->dropAllReferences();
|
||||
for (auto *I : MDLocations)
|
||||
I->dropAllReferences();
|
||||
|
||||
for (UniquableMDNode *I : DistinctMDNodes)
|
||||
I->deleteAsSubclass();
|
||||
for (MDTuple *I : MDTuples)
|
||||
delete I;
|
||||
for (MDLocation *I : MDLocations)
|
||||
delete I;
|
||||
|
||||
// Destroy MDStrings.
|
||||
MDStringCache.clear();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user