[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:
Evgeny Leviant 2021-09-08 14:06:08 +03:00
parent 98380762c3
commit 93b09a2a5d
2 changed files with 5 additions and 4 deletions

View File

@ -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;

View File

@ -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