Summary: Teach MachineDebugify how to insert DBG_VALUE instructions. This can help find bugs causing CodeGen differences when debug info is present. DBG_VALUE instructions are only emitted when -debugify-level is set to locations+variables. There is essentially no attempt made to match up DBG_VALUE register operands with the local variables they ought to correspond to. I'm not sure how to improve the situation. In some cases (MachineMemOperand?) it's possible to find the IR instruction a MachineInstr corresponds to, but in general this seems to call for "undoing" the work done by ISel. Reviewers: dsanders, aprantl Subscribers: hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D78135
52 lines
2.5 KiB
YAML
52 lines
2.5 KiB
YAML
# RUN: llc -run-pass=mir-debugify -o - %s | FileCheck --check-prefixes=ALL,VALUE %s
|
|
# RUN: llc -run-pass=mir-debugify -debugify-level=locations -o - %s | FileCheck --check-prefixes=ALL --implicit-check-not=dbg.value %s
|
|
# RUN: llc -run-pass=mir-debugify,mir-strip-debug,mir-debugify -o - %s | FileCheck --check-prefixes=ALL,VALUE %s
|
|
--- |
|
|
; ModuleID = 'loc-only.ll'
|
|
source_filename = "loc-only.ll"
|
|
|
|
; ALL-LABEL: @test
|
|
define i32 @test(i32 %a, i32 %b) {
|
|
%add = add i32 %a, 2
|
|
; ALL-NEXT: %add = add i32 %a, 2, !dbg [[L1:![0-9]+]]
|
|
; VALUE-NEXT: call void @llvm.dbg.value(metadata i32 %add, metadata [[add:![0-9]+]], metadata !DIExpression()), !dbg [[L1]]
|
|
%sub = sub i32 %add, %b
|
|
; ALL-NEXT: %sub = sub i32 %add, %b, !dbg [[L2:![0-9]+]]
|
|
; VALUE-NEXT: call void @llvm.dbg.value(metadata i32 %sub, metadata [[sub:![0-9]+]], metadata !DIExpression()), !dbg [[L2]]
|
|
; ALL-NEXT: ret i32 %sub, !dbg [[L3:![0-9]+]]
|
|
ret i32 %sub
|
|
}
|
|
|
|
; ALL: !llvm.dbg.cu = !{!0}
|
|
; ALL: !llvm.debugify =
|
|
; ALL: !llvm.module.flags = !{![[VERSION:[0-9]+]]}
|
|
; ALL: !0 = distinct !DICompileUnit(
|
|
; ALL: ![[VERSION]] = !{i32 2, !"Debug Info Version", i32 3}
|
|
; VALUE: [[VAR1:![0-9]+]] = !DILocalVariable(name: "1"
|
|
; VALUE: [[VAR2:![0-9]+]] = !DILocalVariable(name: "2"
|
|
|
|
...
|
|
---
|
|
name: test
|
|
body: |
|
|
bb.1 (%ir-block.0):
|
|
%0:_(s32) = IMPLICIT_DEF
|
|
%1:_(s32) = IMPLICIT_DEF
|
|
%2:_(s32) = G_CONSTANT i32 2
|
|
%3:_(s32) = G_ADD %0, %2
|
|
%4:_(s32) = G_SUB %3, %1
|
|
; There's no attempt to have the locations make sense as it's an imaginary
|
|
; source file anyway. These first three coincide with IR-level information
|
|
; and therefore use metadata references.
|
|
; ALL: %0:_(s32) = IMPLICIT_DEF debug-location [[L1]]
|
|
; VALUE: DBG_VALUE %0(s32), $noreg, [[VAR1]], !DIExpression(), debug-location [[L1]]
|
|
; ALL: %1:_(s32) = IMPLICIT_DEF debug-location [[L2]]
|
|
; VALUE: DBG_VALUE %1(s32), $noreg, [[VAR2]], !DIExpression(), debug-location [[L2]]
|
|
; ALL: %2:_(s32) = G_CONSTANT i32 2, debug-location [[L3]]
|
|
; VALUE: DBG_VALUE %2(s32), $noreg, [[VAR1]], !DIExpression(), debug-location [[L3]]
|
|
; ALL: %3:_(s32) = G_ADD %0, %2, debug-location !DILocation(line: 4, column: 1, scope: !6)
|
|
; VALUE: DBG_VALUE %3(s32), $noreg, [[VAR1]], !DIExpression(), debug-location !DILocation(line: 4
|
|
; ALL: %4:_(s32) = G_SUB %3, %1, debug-location !DILocation(line: 5, column: 1, scope: !6)
|
|
; VALUE: DBG_VALUE %4(s32), $noreg, [[VAR1]], !DIExpression(), debug-location !DILocation(line: 5
|
|
...
|