when we tear down a module, we need to be careful to
authorChris Lattner <sabre@nondot.org>
Wed, 28 Oct 2009 03:37:35 +0000 (03:37 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 28 Oct 2009 03:37:35 +0000 (03:37 +0000)
zap BlockAddress values.

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

lib/VMCore/Function.cpp

index 8ad885c4c23d14a062b12059338de0f7d4e04114..6cf2c8186f9be09ecdf602ea85edad745d00a0c7 100644 (file)
@@ -217,7 +217,20 @@ void Function::setParent(Module *parent) {
 void Function::dropAllReferences() {
   for (iterator I = begin(), E = end(); I != E; ++I)
     I->dropAllReferences();
-  BasicBlocks.clear();    // Delete all basic blocks...
+  
+  // Delete all basic blocks.
+  while (!BasicBlocks.empty()) {
+    // If there is still a reference to the block, it must be a 'blockaddress'
+    // constant pointing to it.  Just replace the BlockAddress with undef.
+    BasicBlock *BB = BasicBlocks.begin();
+    if (!BB->use_empty()) {
+      BlockAddress *BA = cast<BlockAddress>(BB->use_back());
+      BA->replaceAllUsesWith(UndefValue::get(BA->getType()));
+      BA->destroyConstant();
+    }
+    
+    BB->eraseFromParent();
+  }
 }
 
 void Function::addAttribute(unsigned i, Attributes attr) {