TypeMap had a destructor that destroyed the types it held. DenseMap did not, so
authorNick Lewycky <nicholas@mxc.ca>
Tue, 12 Jul 2011 00:26:08 +0000 (00:26 +0000)
committerNick Lewycky <nicholas@mxc.ca>
Tue, 12 Jul 2011 00:26:08 +0000 (00:26 +0000)
destroy those types in ~LLVMContext.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@134945 91177308-0d34-0410-b5e6-96231b3b80d8

lib/VMCore/LLVMContextImpl.cpp

index 0b7ae6c9272e45c7e335254fc78c41f2406855d4..12cb2464b53b2f48c2b9ea1dbe1949bd8d16f0b8 100644 (file)
@@ -13,6 +13,7 @@
 
 #include "LLVMContextImpl.h"
 #include "llvm/Module.h"
+#include "llvm/ADT/STLExtras.h"
 #include <algorithm>
 using namespace llvm;
 
@@ -54,9 +55,7 @@ LLVMContextImpl::~LLVMContextImpl() {
   // will try to remove itself from OwnedModules set.  This would cause
   // iterator invalidation if we iterated on the set directly.
   std::vector<Module*> Modules(OwnedModules.begin(), OwnedModules.end());
-  for (std::vector<Module*>::iterator I = Modules.begin(), E = Modules.end();
-       I != E; ++I)
-    delete *I;
+  DeleteContainerPointers(Modules);
   
   std::for_each(ExprConstants.map_begin(), ExprConstants.map_end(),
                 DropReferences());
@@ -74,14 +73,8 @@ LLVMContextImpl::~LLVMContextImpl() {
   NullPtrConstants.freeConstants();
   UndefValueConstants.freeConstants();
   InlineAsms.freeConstants();
-  for (IntMapTy::iterator I = IntConstants.begin(), E = IntConstants.end(); 
-       I != E; ++I) {
-    delete I->second;
-  }
-  for (FPMapTy::iterator I = FPConstants.begin(), E = FPConstants.end(); 
-       I != E; ++I) {
-    delete I->second;
-  }
+  DeleteContainerSeconds(IntConstants);
+  DeleteContainerSeconds(FPConstants);
   
   // Destroy MDNodes.  ~MDNode can move and remove nodes between the MDNodeSet
   // and the NonUniquedMDNodes sets, so copy the values out first.
@@ -99,7 +92,18 @@ LLVMContextImpl::~LLVMContextImpl() {
   assert(MDNodeSet.empty() && NonUniquedMDNodes.empty() &&
          "Destroying all MDNodes didn't empty the Context's sets.");
   // Destroy MDStrings.
-  for (StringMap<MDString*>::iterator I = MDStringCache.begin(),
-         E = MDStringCache.end(); I != E; ++I)
-    delete I->second;
+  DeleteContainerSeconds(MDStringCache);
+
+  // Destroy types.
+  DeleteContainerSeconds(IntegerTypes);
+  DeleteContainerSeconds(FunctionTypes);
+  DeleteContainerSeconds(AnonStructTypes);
+  DeleteContainerSeconds(ArrayTypes);
+  DeleteContainerSeconds(VectorTypes);
+  DeleteContainerSeconds(PointerTypes);
+  DeleteContainerSeconds(ASPointerTypes);
+
+  for (StringMap<StructType *>::iterator I = NamedStructTypes.begin(), E = NamedStructTypes.end(); I != E; ++I) {
+    delete I->getValue();
+  }
 }