Another attempt at fixing PR2975.

Types can have references to eachother, so we can't just call destroy on them.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@68523 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Torok Edwin
2009-04-07 17:23:02 +00:00
parent ce8f9fe3c9
commit eb55f3ea3c
3 changed files with 32 additions and 1 deletions

View File

@@ -388,6 +388,10 @@ OpaqueType::OpaqueType() : DerivedType(OpaqueTyID) {
#endif
}
void PATypeHolder::destroy() {
Ty = 0;
}
// dropAllTypeUses - When this (abstract) type is resolved to be equal to
// another (more concrete) type, we must eliminate all references to other
// types, to avoid some circular reference problems.
@@ -666,6 +670,27 @@ protected:
std::multimap<unsigned, PATypeHolder> TypesByHash;
public:
~TypeMapBase()
{
//PATypeHolder won't destroy non-abstract types.
//We can't destroy them by simply iterating, because
//they may contain references to each-other
for (std::multimap<unsigned, PATypeHolder>::iterator I
= TypesByHash.begin(), E = TypesByHash.end(); I != E; ++I) {
Type *Ty = const_cast<Type*>(I->second.Ty);
I->second.destroy();
// We can't invoke destroy or delete, because the type may
// contain references to already freed types.
// So we have to destruct the object the ugly way.
if (Ty) {
Ty->AbstractTypeUsers.clear();
static_cast<const Type*>(Ty)->Type::~Type();
operator delete(Ty);
}
}
}
void RemoveFromTypesByHash(unsigned Hash, const Type *Ty) {
std::multimap<unsigned, PATypeHolder>::iterator I =
TypesByHash.lower_bound(Hash);