diff options
author | Jeffrey Yasskin <jyasskin@google.com> | 2010-03-22 05:23:37 +0000 |
---|---|---|
committer | Jeffrey Yasskin <jyasskin@google.com> | 2010-03-22 05:23:37 +0000 |
commit | ce5d1b7e0ac2f1ac16bcbc558fcbdb294e3ed68e (patch) | |
tree | 815521d8e780e580649eadf2a1d71bdaeac048e8 /lib/VMCore/LLVMContextImpl.cpp | |
parent | 08fdf6b18b4afabb7ce3f034ed5537c5d3173f8a (diff) | |
download | external_llvm-ce5d1b7e0ac2f1ac16bcbc558fcbdb294e3ed68e.zip external_llvm-ce5d1b7e0ac2f1ac16bcbc558fcbdb294e3ed68e.tar.gz external_llvm-ce5d1b7e0ac2f1ac16bcbc558fcbdb294e3ed68e.tar.bz2 |
Free all Constants in ~LLVMConstantImpl. We avoid assertion failures
by dropping all references from all constants that can use other
constants before trying to destroy any of them.
I also had to free bugpoint's Module in ~BugDriver().
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@99160 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore/LLVMContextImpl.cpp')
-rw-r--r-- | lib/VMCore/LLVMContextImpl.cpp | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/lib/VMCore/LLVMContextImpl.cpp b/lib/VMCore/LLVMContextImpl.cpp index 176ccf1..b4553dd 100644 --- a/lib/VMCore/LLVMContextImpl.cpp +++ b/lib/VMCore/LLVMContextImpl.cpp @@ -12,6 +12,7 @@ //===----------------------------------------------------------------------===// #include "LLVMContextImpl.h" +#include <algorithm> LLVMContextImpl::LLVMContextImpl(LLVMContext &C) : TheTrueVal(0), TheFalseVal(0), @@ -34,10 +35,32 @@ LLVMContextImpl::LLVMContextImpl(LLVMContext &C) OpaqueTypes.insert(AlwaysOpaqueTy); } +namespace { +struct DropReferences { + // Takes the value_type of a ConstantUniqueMap's internal map, whose 'second' + // is a Constant*. + template<typename PairT> + void operator()(const PairT &P) { + P.second->dropAllReferences(); + } +}; +} + LLVMContextImpl::~LLVMContextImpl() { + std::for_each(ExprConstants.map_begin(), ExprConstants.map_end(), + DropReferences()); + std::for_each(ArrayConstants.map_begin(), ArrayConstants.map_end(), + DropReferences()); + std::for_each(StructConstants.map_begin(), StructConstants.map_end(), + DropReferences()); + std::for_each(UnionConstants.map_begin(), UnionConstants.map_end(), + DropReferences()); + std::for_each(VectorConstants.map_begin(), VectorConstants.map_end(), + DropReferences()); ExprConstants.freeConstants(); ArrayConstants.freeConstants(); StructConstants.freeConstants(); + UnionConstants.freeConstants(); VectorConstants.freeConstants(); AggZeroConstants.freeConstants(); NullPtrConstants.freeConstants(); @@ -45,13 +68,11 @@ LLVMContextImpl::~LLVMContextImpl() { InlineAsms.freeConstants(); for (IntMapTy::iterator I = IntConstants.begin(), E = IntConstants.end(); I != E; ++I) { - if (I->second->use_empty()) - delete I->second; + delete I->second; } for (FPMapTy::iterator I = FPConstants.begin(), E = FPConstants.end(); I != E; ++I) { - if (I->second->use_empty()) - delete I->second; + delete I->second; } AlwaysOpaqueTy->dropRef(); for (OpaqueTypesTy::iterator I = OpaqueTypes.begin(), E = OpaqueTypes.end(); |