diff options
author | Torok Edwin <edwintorok@gmail.com> | 2009-04-07 17:23:02 +0000 |
---|---|---|
committer | Torok Edwin <edwintorok@gmail.com> | 2009-04-07 17:23:02 +0000 |
commit | eb55f3ea3c6a12e5d098f72f3f9a16d4b7e77645 (patch) | |
tree | b793da35332f1226c35e906bebdd064a19c92915 /lib/VMCore | |
parent | ce8f9fe3c9ea50127eab28930506fc3b93390553 (diff) | |
download | external_llvm-eb55f3ea3c6a12e5d098f72f3f9a16d4b7e77645.zip external_llvm-eb55f3ea3c6a12e5d098f72f3f9a16d4b7e77645.tar.gz external_llvm-eb55f3ea3c6a12e5d098f72f3f9a16d4b7e77645.tar.bz2 |
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
Diffstat (limited to 'lib/VMCore')
-rw-r--r-- | lib/VMCore/Type.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/lib/VMCore/Type.cpp b/lib/VMCore/Type.cpp index c14d511..9f93d17 100644 --- a/lib/VMCore/Type.cpp +++ b/lib/VMCore/Type.cpp @@ -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); |