mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-03-06 01:19:28 +00:00
[DebugInfo] Don't drop dbg.value's of nullptr
Currently, dbg.value's of "nullptr" are dropped when entering a SelectionDAG -- apparently just because of an oversight when recognising Values that are constant (see PR39787). This patch adds ConstantPointerNull to the list of constants that can be turned into DBG_VALUEs. The matter of what bit-value a null pointer constant in LLVM has was raised in this mailing list thread: http://lists.llvm.org/pipermail/llvm-dev/2018-December/128234.html Where it transpires LLVM relies on (IR) null pointers being zero valued, thus I've baked this assumption into the patch. Differential Revision: https://reviews.llvm.org/D55227 llvm-svn: 348753
This commit is contained in:
parent
1bf1a156d6
commit
a06b163d5c
@ -749,6 +749,9 @@ InstrEmitter::EmitDbgValue(SDDbgValue *SD,
|
||||
MIB.addImm(CI->getSExtValue());
|
||||
} else if (const ConstantFP *CF = dyn_cast<ConstantFP>(V)) {
|
||||
MIB.addFPImm(CF);
|
||||
} else if (isa<ConstantPointerNull>(V)) {
|
||||
// Note: This assumes that all nullptr constants are zero-valued.
|
||||
MIB.addImm(0);
|
||||
} else {
|
||||
// Could be an Undef. In any case insert an Undef so we can see what we
|
||||
// dropped.
|
||||
|
@ -5312,7 +5312,8 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
return nullptr;
|
||||
|
||||
SDDbgValue *SDV;
|
||||
if (isa<ConstantInt>(V) || isa<ConstantFP>(V) || isa<UndefValue>(V)) {
|
||||
if (isa<ConstantInt>(V) || isa<ConstantFP>(V) || isa<UndefValue>(V) ||
|
||||
isa<ConstantPointerNull>(V)) {
|
||||
SDV = DAG.getConstantDbgValue(Variable, Expression, V, dl, SDNodeOrder);
|
||||
DAG.AddDbgValue(SDV, nullptr, false);
|
||||
return nullptr;
|
||||
|
@ -63,9 +63,9 @@ target triple = "x86_64-apple-macosx10.4.0"
|
||||
@S = global %struct.SS { i32 23, i32 -17 }, align 4, !dbg !0
|
||||
|
||||
; Verify that the def comes before the for foo1.
|
||||
; TODO: Currently dbg.value for bar1 is dropped(?), is that expected?
|
||||
define i32 @test1() local_unnamed_addr #0 !dbg !17 {
|
||||
; CHECK-LABEL: bb.0.entry1
|
||||
; CHECK-NEXT: DBG_VALUE 0, $noreg, ![[BAR1]], !DIExpression()
|
||||
; CHECK-NEXT: [[REG1:%[0-9]+]]:gr64 =
|
||||
; CHECK-NEXT: DBG_VALUE [[REG1]], $noreg, ![[FOO1]], !DIExpression()
|
||||
entry1:
|
||||
@ -99,11 +99,9 @@ entry3:
|
||||
}
|
||||
|
||||
; Verify that the def comes before the for bar4.
|
||||
; TODO: Currently dbg.value for foo4 is dropped. It is set to null and not
|
||||
; used. Just like in test1 it can be discussed if there should be a
|
||||
; DBG_VALUE for foo4 here.
|
||||
define i32 @test4() local_unnamed_addr #0 !dbg !40 {
|
||||
; CHECK-LABEL: bb.0.entry4
|
||||
; CHECK-NEXT: DBG_VALUE 0, $noreg, ![[FOO4]], !DIExpression()
|
||||
; CHECK-NEXT: [[REG4:%[0-9]+]]:gr64 =
|
||||
; CHECK-NEXT: DBG_VALUE [[REG4]], $noreg, ![[BAR4]], !DIExpression()
|
||||
entry4:
|
||||
@ -114,10 +112,9 @@ entry4:
|
||||
}
|
||||
|
||||
; Verify that we do not get a DBG_VALUE that maps foo5 to @S here.
|
||||
; TODO: foo5 is set to null, and it is not really used. Just like in test1 it
|
||||
; can be discussed if there should be a DBG_VALUE for foo5 here.
|
||||
define i32 @test5() local_unnamed_addr #0 !dbg !47 {
|
||||
; CHECK-LABEL: bb.0.entry5:
|
||||
; CHECK-NEXT: DBG_VALUE 0, $noreg, ![[FOO5]], !DIExpression()
|
||||
; CHECK-NEXT: [[REG5:%[0-9]+]]:gr64 =
|
||||
; CHECK-NEXT: DBG_VALUE [[REG5]], $noreg, ![[BAR5]], !DIExpression()
|
||||
; CHECK-NOT: DBG_VALUE [[REG5]], $noreg, ![[FOO5]], !DIExpression()
|
||||
|
Loading…
x
Reference in New Issue
Block a user