Do not forget llvm.dbg.declare's first argument while removing debugging information.
authorDevang Patel <dpatel@apple.com>
Thu, 20 Nov 2008 01:20:42 +0000 (01:20 +0000)
committerDevang Patel <dpatel@apple.com>
Thu, 20 Nov 2008 01:20:42 +0000 (01:20 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@59688 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/IPO/StripSymbols.cpp

index 6a0458c512865eac4669d44e12e7fd74805c45de..7e225e2bd555f33e74d53ac786af5d33ae715dc7 100644 (file)
@@ -99,7 +99,8 @@ static void RemoveDeadConstant(Constant *C) {
     GV->eraseFromParent();
   }
   else if (!isa<Function>(C))
-    C->destroyConstant();
+    if (isa<CompositeType>(C->getType()))
+      C->destroyConstant();
 
   // If the constant referenced anything, see if we can delete it as well.
   for (SmallPtrSet<Constant *, 4>::iterator OI = Operands.begin(),
@@ -245,11 +246,18 @@ bool StripDebugInfo(Module &M) {
   if (Declare) {
     while (!Declare->use_empty()) {
       CallInst *CI = cast<CallInst>(Declare->use_back());
-      Value *Arg = CI->getOperand(2);
+      Value *Arg1 = CI->getOperand(1);
+      Value *Arg2 = CI->getOperand(2);
       assert(CI->use_empty() && "llvm.dbg intrinsic should have void result");
       CI->eraseFromParent();
-      if (Arg->use_empty())
-        if (Constant *C = dyn_cast<Constant>(Arg)) 
+      if (Arg1->use_empty()) {
+        if (Constant *C = dyn_cast<Constant>(Arg1)) 
+          DeadConstants.push_back(C);
+        if (Instruction *I = dyn_cast<Instruction>(Arg1))
+          I->eraseFromParent();
+      }
+      if (Arg2->use_empty())
+        if (Constant *C = dyn_cast<Constant>(Arg2)) 
           DeadConstants.push_back(C);
     }
     Declare->eraseFromParent();