[llvm] [DebugInfo][DWARF] Set is_stmt on first non-line-0 instruction in BB (PR #105524)
Stephen Tozer via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 28 09:42:09 PDT 2024
https://github.com/SLTozer updated https://github.com/llvm/llvm-project/pull/105524
>From cf8ef907bde71a8ac9f374a6590deaaa326b3359 Mon Sep 17 00:00:00 2001
From: Stephen Tozer <stephen.tozer at sony.com>
Date: Wed, 21 Aug 2024 14:12:08 +0100
Subject: [PATCH 1/4] [DebugInfo][DWARF] Set is_stmt on first non-line-0
instruction in BB
Fixes: https://github.com/llvm/llvm-project/issues/104695
This patch adds the is_stmt flag to line table entries for the first
instruction with a non-0 line location in each basic block, to ensure
that it will be used for stepping even if the last instruction in the
previous basic block had the same line number; this is important for cases
where the new BB is reachable from BBs other than the preceding block.
---
llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 7 +++-
.../Generic/is_stmt-at-block-start.ll | 38 +++++++++++++++++++
2 files changed, 43 insertions(+), 2 deletions(-)
create mode 100644 llvm/test/DebugInfo/Generic/is_stmt-at-block-start.ll
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
index f111b4aea06f1b..aa11200731e1b3 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
@@ -2119,9 +2119,12 @@ void DwarfDebug::beginInstruction(const MachineInstr *MI) {
PrologEndLoc = DebugLoc();
}
// If the line changed, we call that a new statement; unless we went to
- // line 0 and came back, in which case it is not a new statement.
+ // line 0 and came back, in which case it is not a new statement. We also
+ // mark is_stmt for the first non-0 line in each BB, in case a predecessor BB
+ // ends with a different line.
unsigned OldLine = PrevInstLoc ? PrevInstLoc.getLine() : LastAsmLine;
- if (DL.getLine() && DL.getLine() != OldLine)
+ if (DL.getLine() &&
+ (DL.getLine() != OldLine || PrevInstBB != MI->getParent()))
Flags |= DWARF2_FLAG_IS_STMT;
const MDNode *Scope = DL.getScope();
diff --git a/llvm/test/DebugInfo/Generic/is_stmt-at-block-start.ll b/llvm/test/DebugInfo/Generic/is_stmt-at-block-start.ll
new file mode 100644
index 00000000000000..21efceab38eca0
--- /dev/null
+++ b/llvm/test/DebugInfo/Generic/is_stmt-at-block-start.ll
@@ -0,0 +1,38 @@
+;; Checks that when an instruction at the start of a BasicBlock has the same
+;; DebugLoc as the instruction at the end of the previous BasicBlock, we add
+;; is_stmt to the new line, to ensure that we still step on it if we arrive from
+;; a BasicBlock other than the immediately preceding one.
+
+; RUN: %llc_dwarf -O0 -filetype=obj < %s | llvm-dwarfdump --debug-line - | FileCheck %s
+
+; CHECK: {{0x[0-9a-f]+}} 13 5 {{.+}} is_stmt
+; CHECK-NEXT: {{0x[0-9a-f]+}} 13 25 {{.+}} is_stmt
+
+define void @_Z1fi(i1 %cond) !dbg !21 {
+entry:
+ br i1 %cond, label %if.then2, label %if.else4
+
+if.then2: ; preds = %entry
+ br label %if.end8, !dbg !24
+
+if.else4: ; preds = %entry
+ %0 = load i32, ptr null, align 4, !dbg !28
+ %call5 = call i1 null(i32 %0)
+ ret void
+
+if.end8: ; preds = %if.then2
+ ret void
+}
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!20}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang version 20.0.0", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None)
+!1 = !DIFile(filename: "test.cpp", directory: "/home/gbtozers/dev/upstream-llvm")
+!20 = !{i32 2, !"Debug Info Version", i32 3}
+!21 = distinct !DISubprogram(name: "f", linkageName: "_Z1fi", scope: !1, file: !1, line: 7, type: !22, scopeLine: 7, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0)
+!22 = distinct !DISubroutineType(types: !23)
+!23 = !{null}
+!24 = !DILocation(line: 13, column: 5, scope: !25)
+!25 = distinct !DILexicalBlock(scope: !21, file: !1, line: 11, column: 27)
+!28 = !DILocation(line: 13, column: 25, scope: !25)
>From 32ee26976e9a381904d8554ae69c9fcb84d8a899 Mon Sep 17 00:00:00 2001
From: Stephen Tozer <stephen.tozer at sony.com>
Date: Wed, 21 Aug 2024 14:30:16 +0100
Subject: [PATCH 2/4] Update existing tests with newly generated is_stmt flags
---
llvm/test/CodeGen/X86/fsafdo_test1.ll | 4 ++--
llvm/test/DebugInfo/X86/discriminator.ll | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/llvm/test/CodeGen/X86/fsafdo_test1.ll b/llvm/test/CodeGen/X86/fsafdo_test1.ll
index e80a7f2f354f2d..043d47e18e96df 100644
--- a/llvm/test/CodeGen/X86/fsafdo_test1.ll
+++ b/llvm/test/CodeGen/X86/fsafdo_test1.ll
@@ -4,9 +4,9 @@
; Check that fs-afdo discriminators are generated.
; V01: .loc 1 7 3 is_stmt 0 discriminator 2 # foo.c:7:3
; V01: .loc 1 9 5 is_stmt 1 discriminator 2 # foo.c:9:5
-; V0: .loc 1 9 5 discriminator 11266 # foo.c:9:5
+; V0: .loc 1 9 5 is_stmt 1 discriminator 11266 # foo.c:9:5
; V0: .loc 1 7 3 is_stmt 1 discriminator 11266 # foo.c:7:3
-; V1: .loc 1 9 5 discriminator 514 # foo.c:9:5
+; V1: .loc 1 9 5 is_stmt 1 discriminator 514 # foo.c:9:5
; V1: .loc 1 7 3 is_stmt 1 discriminator 258 # foo.c:7:3
; Check that variable __llvm_fs_discriminator__ is generated.
; V01: .type __llvm_fs_discriminator__, at object # @__llvm_fs_discriminator__
diff --git a/llvm/test/DebugInfo/X86/discriminator.ll b/llvm/test/DebugInfo/X86/discriminator.ll
index ef89838acf0324..120d928b5676b0 100644
--- a/llvm/test/DebugInfo/X86/discriminator.ll
+++ b/llvm/test/DebugInfo/X86/discriminator.ll
@@ -59,4 +59,4 @@ attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "frame-pointer"=
; CHECK: Address Line Column File ISA Discriminator OpIndex Flags
; CHECK: ------------------ ------ ------ ------ --- ------------- ------- -------------
-; CHECK: 0x000000000000000a 2 0 1 0 42 0 {{$}}
+; CHECK: 0x000000000000000a 2 0 1 0 42 0 is_stmt{{$}}
>From bb4f00fb1cf75c68ca73b534e9ac538a42f6e9f4 Mon Sep 17 00:00:00 2001
From: Stephen Tozer <stephen.tozer at sony.com>
Date: Wed, 28 Aug 2024 11:44:18 +0100
Subject: [PATCH 3/4] Update to not merge identical DLs across BB boundaries
---
llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 12 ++++--------
.../test/DebugInfo/Generic/is_stmt-at-block-start.ll | 5 ++---
2 files changed, 6 insertions(+), 11 deletions(-)
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
index aa11200731e1b3..77e304383fb5c7 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
@@ -2061,10 +2061,8 @@ void DwarfDebug::beginInstruction(const MachineInstr *MI) {
unsigned LastAsmLine =
Asm->OutStreamer->getContext().getCurrentDwarfLoc().getLine();
- bool PrevInstInSameSection =
- (!PrevInstBB ||
- PrevInstBB->getSectionID() == MI->getParent()->getSectionID());
- if (DL == PrevInstLoc && PrevInstInSameSection) {
+ bool PrevInstInDiffBB = PrevInstBB && PrevInstBB != MI->getParent();
+ if (DL == PrevInstLoc && !PrevInstInDiffBB) {
// If we have an ongoing unspecified location, nothing to do here.
if (!DL)
return;
@@ -2093,8 +2091,7 @@ void DwarfDebug::beginInstruction(const MachineInstr *MI) {
// possibly debug information; we want it to have a source location.
// - Instruction is at the top of a block; we don't want to inherit the
// location from the physically previous (maybe unrelated) block.
- if (UnknownLocations == Enable || PrevLabel ||
- (PrevInstBB && PrevInstBB != MI->getParent())) {
+ if (UnknownLocations == Enable || PrevLabel || PrevInstInDiffBB) {
// Preserve the file and column numbers, if we can, to save space in
// the encoded line table.
// Do not update PrevInstLoc, it remembers the last non-0 line.
@@ -2123,8 +2120,7 @@ void DwarfDebug::beginInstruction(const MachineInstr *MI) {
// mark is_stmt for the first non-0 line in each BB, in case a predecessor BB
// ends with a different line.
unsigned OldLine = PrevInstLoc ? PrevInstLoc.getLine() : LastAsmLine;
- if (DL.getLine() &&
- (DL.getLine() != OldLine || PrevInstBB != MI->getParent()))
+ if (DL.getLine() && (DL.getLine() != OldLine || PrevInstInDiffBB))
Flags |= DWARF2_FLAG_IS_STMT;
const MDNode *Scope = DL.getScope();
diff --git a/llvm/test/DebugInfo/Generic/is_stmt-at-block-start.ll b/llvm/test/DebugInfo/Generic/is_stmt-at-block-start.ll
index 21efceab38eca0..efee32a1f68280 100644
--- a/llvm/test/DebugInfo/Generic/is_stmt-at-block-start.ll
+++ b/llvm/test/DebugInfo/Generic/is_stmt-at-block-start.ll
@@ -6,7 +6,7 @@
; RUN: %llc_dwarf -O0 -filetype=obj < %s | llvm-dwarfdump --debug-line - | FileCheck %s
; CHECK: {{0x[0-9a-f]+}} 13 5 {{.+}} is_stmt
-; CHECK-NEXT: {{0x[0-9a-f]+}} 13 25 {{.+}} is_stmt
+; CHECK-NEXT: {{0x[0-9a-f]+}} 13 5 {{.+}} is_stmt
define void @_Z1fi(i1 %cond) !dbg !21 {
entry:
@@ -16,7 +16,7 @@ if.then2: ; preds = %entry
br label %if.end8, !dbg !24
if.else4: ; preds = %entry
- %0 = load i32, ptr null, align 4, !dbg !28
+ %0 = load i32, ptr null, align 4, !dbg !24
%call5 = call i1 null(i32 %0)
ret void
@@ -35,4 +35,3 @@ if.end8: ; preds = %if.then2
!23 = !{null}
!24 = !DILocation(line: 13, column: 5, scope: !25)
!25 = distinct !DILexicalBlock(scope: !21, file: !1, line: 11, column: 27)
-!28 = !DILocation(line: 13, column: 25, scope: !25)
>From 949ac833013f10ff558572738719520b6a0d9f09 Mon Sep 17 00:00:00 2001
From: Stephen Tozer <stephen.tozer at sony.com>
Date: Wed, 28 Aug 2024 17:41:39 +0100
Subject: [PATCH 4/4] Update other tests for new line output
---
llvm/test/CodeGen/Thumb2/pr52817.ll | 3 ++-
llvm/test/CodeGen/X86/fsafdo_test4.ll | 4 ++--
llvm/test/DebugInfo/MIR/X86/empty-inline.mir | 2 ++
3 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/llvm/test/CodeGen/Thumb2/pr52817.ll b/llvm/test/CodeGen/Thumb2/pr52817.ll
index 87615f0a1f7ef4..12daeedf43d818 100644
--- a/llvm/test/CodeGen/Thumb2/pr52817.ll
+++ b/llvm/test/CodeGen/Thumb2/pr52817.ll
@@ -24,6 +24,7 @@ define i32 @test(ptr %arg, ptr %arg1, ptr %arg2) #0 !dbg !6 {
; CHECK-NEXT: movs r3, #0
; CHECK-NEXT: LBB0_1: @ %bb3
; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1
+; CHECK-NEXT: .loc 1 0 0 is_stmt 0 @ :0:0
; CHECK-NEXT: adds r5, r3, #1
; CHECK-NEXT: str.w lr, [r2]
; CHECK-NEXT: cmp.w lr, #0
@@ -36,7 +37,7 @@ define i32 @test(ptr %arg, ptr %arg1, ptr %arg2) #0 !dbg !6 {
; CHECK-NEXT: movne r6, #0
; CHECK-NEXT: Ltmp0:
; CHECK-NEXT: @DEBUG_VALUE: test:this <- [DW_OP_LLVM_arg 0, DW_OP_plus_uconst 135168, DW_OP_LLVM_arg 1, DW_OP_constu 4, DW_OP_mul, DW_OP_plus, DW_OP_plus_uconst 4, DW_OP_stack_value] $r0, $r5
-; CHECK-NEXT: .loc 1 28 24 prologue_end @ test.cpp:28:24
+; CHECK-NEXT: .loc 1 28 24 prologue_end is_stmt 1 @ test.cpp:28:24
; CHECK-NEXT: strne.w r6, [r8]
; CHECK-NEXT: moveq r6, #1
; CHECK-NEXT: ldr r4, [r4, #4]
diff --git a/llvm/test/CodeGen/X86/fsafdo_test4.ll b/llvm/test/CodeGen/X86/fsafdo_test4.ll
index effc72b44ade80..c9b9ed5b9c919e 100644
--- a/llvm/test/CodeGen/X86/fsafdo_test4.ll
+++ b/llvm/test/CodeGen/X86/fsafdo_test4.ll
@@ -7,8 +7,8 @@
; CHECK: .loc 1 0 3 # foo.c:0:3
; CHECK: .loc 1 9 5 is_stmt 1 discriminator 2 # foo.c:9:5
; CHECK: .loc 1 0 5 is_stmt 0 # :0:5
-; CHECK: .loc 1 9 5 discriminator 2 # foo.c:9:5
-; CHECK: .loc 1 0 5 # :0:5
+; CHECK: .loc 1 9 5 is_stmt 1 discriminator 2 # foo.c:9:5
+; CHECK: .loc 1 0 5 is_stmt 0 # :0:5
; CHECK: .loc 1 7 3 is_stmt 1 discriminator 2 # foo.c:7:3
; CHECK: .loc 1 14 3 # foo.c:14:3
; Check that variable __llvm_fs_discriminator__ is NOT generated.
diff --git a/llvm/test/DebugInfo/MIR/X86/empty-inline.mir b/llvm/test/DebugInfo/MIR/X86/empty-inline.mir
index 695b7c60365b1d..58775e8cd852fb 100644
--- a/llvm/test/DebugInfo/MIR/X86/empty-inline.mir
+++ b/llvm/test/DebugInfo/MIR/X86/empty-inline.mir
@@ -14,7 +14,9 @@
# CHECK: Address Line Column File ISA Discriminator OpIndex Flags
# CHECK-NEXT: ---
# CHECK-NEXT: 25 0 1 0 0 0 is_stmt
+# CHECK-NEXT: 0 0 1 0 0 0
# CHECK-NEXT: 29 28 1 0 0 0 is_stmt prologue_end
+# CHECK-NEXT: 29 28 1 0 0 0 is_stmt
# CHECK-NEXT: 29 28 1 0 0 0 is_stmt end_sequence
--- |
source_filename = "t.ll"
More information about the llvm-commits
mailing list