mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
While mapping llvm.dbg.declare intrinsic manually map its operand, if possible,
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
This commit is contained in:
parent
b905b09f21
commit
f9d5c5cf9f
@ -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);
|
||||
}
|
||||
|
||||
|
12
test/FrontendC/2010-01-18-Inlined-Debug.c
Normal file
12
test/FrontendC/2010-01-18-Inlined-Debug.c
Normal file
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user