OSDN Git Service

While mapping llvm.dbg.declare intrinsic manually map its operand, if possible,
authorDevang Patel <dpatel@apple.com>
Mon, 18 Jan 2010 19:52:14 +0000 (19:52 +0000)
committerDevang Patel <dpatel@apple.com>
Mon, 18 Jan 2010 19:52:14 +0000 (19:52 +0000)
because it points to an alloca instruction through metadata.

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

lib/Transforms/Utils/ValueMapper.cpp
test/FrontendC/2010-01-18-Inlined-Debug.c [new file with mode: 0644]

index 39331d7..b5b0d2e 100644 (file)
@@ -16,6 +16,7 @@
 #include "llvm/DerivedTypes.h"  // For getNullValue(Type::Int32Ty)
 #include "llvm/Constants.h"
 #include "llvm/Function.h"
+#include "llvm/IntrinsicInst.h"
 #include "llvm/Metadata.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/Support/ErrorHandling.h"
@@ -130,4 +131,21 @@ void llvm::RemapInstruction(Instruction *I, ValueMapTy &ValueMap) {
     assert(V && "Referenced value not in value map!");
     *op = V;
   }
+
+  // Map llvm.dbg.declare instruction's first operand, which points to
+  // alloca instruction through MDNode. Since MDNodes are not counted as normal
+  // uses, this will fall through cracks otherwise.
+  const DbgDeclareInst *DDI = dyn_cast<DbgDeclareInst>(I);
+  if (!DDI) return;
+  
+  Value *AddrInsn = DDI->getAddress();
+  if (!AddrInsn) return;
+  
+  ValueMapTy::iterator VMI = ValueMap.find(AddrInsn);
+  if (VMI == ValueMap.end()) return;
+  
+  Value *Elts[] =  { VMI->second };
+  MDNode *NewAddr = MDNode::get(AddrInsn->getContext(), Elts, 1);
+  I->setOperand(1, NewAddr);
 }
+
diff --git a/test/FrontendC/2010-01-18-Inlined-Debug.c b/test/FrontendC/2010-01-18-Inlined-Debug.c
new file mode 100644 (file)
index 0000000..4aec7b2
--- /dev/null
@@ -0,0 +1,12 @@
+// PR: 6058
+// RUN: %llvmgcc -g -S %s -o - | llc -O0 -o /dev/null
+
+static inline int foo(double) __attribute__ ((always_inline));
+static inline int foo(double __x) { return __x; }
+
+void bar(double x) {
+  foo(x);
+}
+
+
+