mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-21 18:24:23 +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:
@ -115,6 +115,9 @@ class MetadataAsValue : public Value {
|
|||||||
MetadataAsValue(Type *Ty, Metadata *MD);
|
MetadataAsValue(Type *Ty, Metadata *MD);
|
||||||
~MetadataAsValue();
|
~MetadataAsValue();
|
||||||
|
|
||||||
|
/// \brief Drop use of metadata (during teardown).
|
||||||
|
void dropUse() { MD = nullptr; }
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static MetadataAsValue *get(LLVMContext &Context, Metadata *MD);
|
static MetadataAsValue *get(LLVMContext &Context, Metadata *MD);
|
||||||
static MetadataAsValue *getIfExists(LLVMContext &Context, Metadata *MD);
|
static MetadataAsValue *getIfExists(LLVMContext &Context, Metadata *MD);
|
||||||
@ -185,6 +188,11 @@ class ValueAsMetadata : public Metadata, ReplaceableMetadataImpl {
|
|||||||
|
|
||||||
Value *V;
|
Value *V;
|
||||||
|
|
||||||
|
/// \brief Drop users without RAUW (during teardown).
|
||||||
|
void dropUsers() {
|
||||||
|
ReplaceableMetadataImpl::resolveAllUses(/* ResolveUsers */ false);
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
ValueAsMetadata(unsigned ID, Value *V)
|
ValueAsMetadata(unsigned ID, Value *V)
|
||||||
: Metadata(ID), V(V) {
|
: Metadata(ID), V(V) {
|
||||||
|
@ -72,7 +72,30 @@ LLVMContextImpl::~LLVMContextImpl() {
|
|||||||
// the container. Avoid iterators during this operation:
|
// the container. Avoid iterators during this operation:
|
||||||
while (!OwnedModules.empty())
|
while (!OwnedModules.empty())
|
||||||
delete *OwnedModules.begin();
|
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
|
// Free the constants. This is important to do here to ensure that they are
|
||||||
// freed before the LeakDetector is torn down.
|
// freed before the LeakDetector is torn down.
|
||||||
std::for_each(ExprConstants.map_begin(), ExprConstants.map_end(),
|
std::for_each(ExprConstants.map_begin(), ExprConstants.map_end(),
|
||||||
@ -135,21 +158,6 @@ LLVMContextImpl::~LLVMContextImpl() {
|
|||||||
for (auto &Pair : ValuesAsMetadata)
|
for (auto &Pair : ValuesAsMetadata)
|
||||||
delete Pair.second;
|
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.
|
// Destroy MDStrings.
|
||||||
MDStringCache.clear();
|
MDStringCache.clear();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user