diff --git a/lib/Transforms/Utils/ValueMapper.cpp b/lib/Transforms/Utils/ValueMapper.cpp index 39331d78169..b5b0d2e2de7 100644 --- a/lib/Transforms/Utils/ValueMapper.cpp +++ b/lib/Transforms/Utils/ValueMapper.cpp @@ -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(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 index 00000000000..4aec7b26476 --- /dev/null +++ b/test/FrontendC/2010-01-18-Inlined-Debug.c @@ -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); +} + + +