mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-24 22:24:54 +00:00
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:
@@ -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);
|
||||
|
Reference in New Issue
Block a user