forked from OSchip/llvm-project
[LiveDebugValues] Handle spills of indirect debug values correctly
When handling register spill for indirect debug value LiveDebugValues pass doesn't add DW_OP_deref operator which may in some cases cause debugger to return value address, instead of value while machine register holding that address is spilled. Differential revision: https://reviews.llvm.org/D109142
This commit is contained in:
parent
98380762c3
commit
93b09a2a5d
|
@ -556,9 +556,10 @@ private:
|
|||
unsigned Base = Loc.SpillLocation.SpillBase;
|
||||
auto *TRI = MF.getSubtarget().getRegisterInfo();
|
||||
if (MI.isNonListDebugValue()) {
|
||||
DIExpr =
|
||||
TRI->prependOffsetExpression(DIExpr, DIExpression::ApplyOffset,
|
||||
Loc.SpillLocation.SpillOffset);
|
||||
auto Deref = Indirect ? DIExpression::DerefAfter : 0;
|
||||
DIExpr = TRI->prependOffsetExpression(
|
||||
DIExpr, DIExpression::ApplyOffset | Deref,
|
||||
Loc.SpillLocation.SpillOffset);
|
||||
Indirect = true;
|
||||
} else {
|
||||
SmallVector<uint64_t, 4> Ops;
|
||||
|
|
|
@ -641,7 +641,7 @@ body: |
|
|||
# CHECK-LABEL: bb.0.entry:
|
||||
# CHECK: DBG_VALUE $rdi, 0, ![[TVAR]], !DIExpression()
|
||||
# CHECK-LABEL: bb.1.if.then:
|
||||
# CHECK: DBG_VALUE $rsp, 0, ![[TVAR]], !DIExpression(DW_OP_constu, 8, DW_OP_minus)
|
||||
# CHECK: DBG_VALUE $rsp, 0, ![[TVAR]], !DIExpression(DW_OP_constu, 8, DW_OP_minus, DW_OP_deref)
|
||||
# CHECK: INLINEASM
|
||||
# CHECK: DBG_VALUE ${{[a-zA-Z0-9]+}}, 0, ![[TVAR]], !DIExpression()
|
||||
# CHECK-LABEL: bb.2.if.end
|
||||
|
|
Loading…
Reference in New Issue