[llvm] 971d982 - Do not optimize debug locations across section boundaries
David Blaikie via llvm-commits
llvm-commits at lists.llvm.org
Mon May 8 17:13:28 PDT 2023
Author: Pierre Calixte
Date: 2023-05-09T00:12:59Z
New Revision: 971d982bd45c3c3544dcf8d1e67df39e8c063877
URL: https://github.com/llvm/llvm-project/commit/971d982bd45c3c3544dcf8d1e67df39e8c063877
DIFF: https://github.com/llvm/llvm-project/commit/971d982bd45c3c3544dcf8d1e67df39e8c063877.diff
LOG: Do not optimize debug locations across section boundaries
Prevent optimization of DebugLoc across section boundaries, such optimization will yield incorrect source location if memory layout of sections does not strictly match the Asm file.
Reviewed By: #debug-info, dblaikie, MaskRay
Differential Revision: https://reviews.llvm.org/D149294
Added:
llvm/test/DebugInfo/X86/basic-block-sections-debug-lineinfo-at-section-boundary.ll
Modified:
llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
index 98f24599970da..1bbe7ecc9ff89 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
@@ -2039,7 +2039,10 @@ void DwarfDebug::beginInstruction(const MachineInstr *MI) {
unsigned LastAsmLine =
Asm->OutStreamer->getContext().getCurrentDwarfLoc().getLine();
- if (DL == PrevInstLoc) {
+ bool PrevInstInSameSection =
+ (!PrevInstBB ||
+ PrevInstBB->getSectionIDNum() == MI->getParent()->getSectionIDNum());
+ if (DL == PrevInstLoc && PrevInstInSameSection) {
// If we have an ongoing unspecified location, nothing to do here.
if (!DL)
return;
diff --git a/llvm/test/DebugInfo/X86/basic-block-sections-debug-lineinfo-at-section-boundary.ll b/llvm/test/DebugInfo/X86/basic-block-sections-debug-lineinfo-at-section-boundary.ll
new file mode 100644
index 0000000000000..63eadef089507
--- /dev/null
+++ b/llvm/test/DebugInfo/X86/basic-block-sections-debug-lineinfo-at-section-boundary.ll
@@ -0,0 +1,45 @@
+; RUN: llc -mtriple=x86_64-unknown-linux-gnu --basic-block-sections=all < %s | FileCheck %s
+;
+; Verify that AsmPrinter does not optimize debug line directives
+; across two distinct sections. Such optimization will lead
+; to incorrect debug line number if the memory layout of those
+; sections does not strictly mirror the order in the Asm file.
+;
+; int G;
+; void func(int x) {
+; if (x) G=0;
+; }
+;
+; Reduced from the above example, the IR has been modified so that
+; the store and return instructions have the same DebugLoc; in this
+; context, we should see 2
diff erent directives for line #4
+;
+; CHECK-COUNT-2: .loc 0 4 1
+
+define void @func(i1 %0) !dbg !8 {
+ br i1 %0, label %3, label %2
+
+2: ; preds = %1
+ store i32 0, ptr null, align 4, !dbg !12
+ br label %3
+
+3: ; preds = %2, %1
+ ret void, !dbg !12
+}
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!6, !7}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C11, file: !1, producer: "clang version 16.0.2", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, globals: !2, splitDebugInlining: false, nameTableKind: None)
+!1 = !DIFile(filename: "test.c", directory: "/tmp", checksumkind: CSK_MD5, checksum: "fd2935e6157b382ad81da17a61f24bb1")
+!2 = !{!3}
+!3 = !DIGlobalVariableExpression(var: !4, expr: !DIExpression())
+!4 = distinct !DIGlobalVariable(name: "G", scope: !0, file: !1, line: 1, type: !5, isLocal: false, isDefinition: true)
+!5 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
+!6 = !{i32 7, !"Dwarf Version", i32 5}
+!7 = !{i32 2, !"Debug Info Version", i32 3}
+!8 = distinct !DISubprogram(name: "func", scope: !1, file: !1, line: 2, type: !9, scopeLine: 2, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !11)
+!9 = !DISubroutineType(types: !10)
+!10 = !{null}
+!11 = !{}
+!12 = !DILocation(line: 4, column: 1, scope: !8)
More information about the llvm-commits
mailing list