[llvm] [llvm-debuginfo-analyzer] Fixed some DWARF related bugs (PR #153318)

Adam Yang via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 13 16:43:33 PDT 2025


https://github.com/adam-yang updated https://github.com/llvm/llvm-project/pull/153318

>From b4d54b76d009da58bc15fa5ddcb63f24c1871a4a Mon Sep 17 00:00:00 2001
From: Adam Yang <hanbyang at microsoft.com>
Date: Tue, 12 Aug 2025 15:38:12 -0700
Subject: [PATCH 1/2] Fixed some bugs in LogicalView.

---
 .../LogicalView/Readers/LVDWARFReader.cpp     | 10 +++++++---
 .../DWARF/01-dwarf-print-basic-details.test   |  6 +++---
 .../01-dwarf-select-logical-elements.test     |  2 +-
 .../DWARF/02-dwarf-logical-lines.test         |  4 ++--
 ...dwarf-incorrect-lexical-scope-typedef.test |  6 +++---
 .../DWARF/06-dwarf-full-logical-view.test     |  6 +++---
 .../pr-incorrect-logical-instructions.test    | 11 +++++-----
 .../01-wasm-print-basic-details.test          |  8 ++++----
 .../WebAssembly/02-wasm-logical-lines.test    |  4 ++--
 ...-wasm-incorrect-lexical-scope-typedef.test |  8 ++++----
 .../06-wasm-full-logical-view.test            |  8 ++++----
 .../DebugInfo/LogicalView/DWARFReaderTest.cpp | 20 +++++--------------
 12 files changed, 43 insertions(+), 50 deletions(-)

diff --git a/llvm/lib/DebugInfo/LogicalView/Readers/LVDWARFReader.cpp b/llvm/lib/DebugInfo/LogicalView/Readers/LVDWARFReader.cpp
index 62134dfdadf46..3ba5061718144 100644
--- a/llvm/lib/DebugInfo/LogicalView/Readers/LVDWARFReader.cpp
+++ b/llvm/lib/DebugInfo/LogicalView/Readers/LVDWARFReader.cpp
@@ -274,7 +274,7 @@ void LVDWARFReader::processOneAttribute(const DWARFDie &Die,
       for (DWARFAddressRange &Range : Ranges) {
         // This seems to be a tombstone for empty ranges.
         if ((Range.LowPC == Range.HighPC) ||
-            (Range.LowPC = getTombstoneAddress()))
+            (Range.LowPC == getTombstoneAddress()))
           continue;
         // Store the real upper limit for the address range.
         if (UpdateHighAddress && Range.HighPC > 0)
@@ -461,13 +461,17 @@ LVScope *LVDWARFReader::processOneDie(const DWARFDie &InputDIE, LVScope *Parent,
         if (!CurrentRanges.empty()) {
           for (LVAddressRange &Range : CurrentRanges)
             addSectionRange(SectionIndex, CurrentScope, Range.first,
-                            Range.second);
+                            Range.second > Range.first
+                                ? Range.second - 1 // Make hi-pc exclusive
+                                : Range.second);
           CurrentRanges.clear();
         }
         // If the scope is the CU, do not update the ranges set.
         if (FoundLowPC && FoundHighPC && !IsCompileUnit) {
           addSectionRange(SectionIndex, CurrentScope, CurrentLowPC,
-                          CurrentHighPC);
+                          CurrentHighPC > CurrentLowPC
+                              ? CurrentHighPC - 1 // Make hi-pc exclusive
+                              : CurrentHighPC);
         }
       }
     }
diff --git a/llvm/test/tools/llvm-debuginfo-analyzer/DWARF/01-dwarf-print-basic-details.test b/llvm/test/tools/llvm-debuginfo-analyzer/DWARF/01-dwarf-print-basic-details.test
index 54dbd7466e4f6..6d767eb9e883a 100644
--- a/llvm/test/tools/llvm-debuginfo-analyzer/DWARF/01-dwarf-print-basic-details.test
+++ b/llvm/test/tools/llvm-debuginfo-analyzer/DWARF/01-dwarf-print-basic-details.test
@@ -45,8 +45,6 @@
 ; ONE-NEXT: [004]     6             {Line}
 ; ONE-NEXT: [004]                   {Code} 'movl	$0x7, -0x4(%rbp)'
 ; ONE-NEXT: [004]                   {Code} 'jmp	0x6'
-; ONE-NEXT: [004]     8             {Line}
-; ONE-NEXT: [004]                   {Code} 'movl	-0x14(%rbp), %eax'
 ; ONE-NEXT: [003]     4           {TypeAlias} 'INTEGER' -> 'int'
 ; ONE-NEXT: [003]     2           {Line}
 ; ONE-NEXT: [003]                 {Code} 'pushq	%rbp'
@@ -60,10 +58,12 @@
 ; ONE-NEXT: [003]                 {Code} 'testb	$0x1, -0x15(%rbp)'
 ; ONE-NEXT: [003]                 {Code} 'je	0x13'
 ; ONE-NEXT: [003]     8           {Line}
+; ONE-NEXT: [003]                 {Code} 'movl	-0x14(%rbp), %eax'
+; ONE-NEXT: [003]     8           {Line}
 ; ONE-NEXT: [003]                 {Code} 'movl	%eax, -0x4(%rbp)'
 ; ONE-NEXT: [003]     9           {Line}
 ; ONE-NEXT: [003]                 {Code} 'movl	-0x4(%rbp), %eax'
 ; ONE-NEXT: [003]                 {Code} 'popq	%rbp'
 ; ONE-NEXT: [003]                 {Code} 'retq'
-; ONE-NEXT: [003]     9           {Line}
 ; ONE-NEXT: [002]     1         {TypeAlias} 'INTPTR' -> '* const int'
+; ONE-NEXT: [002]     9         {Line}
diff --git a/llvm/test/tools/llvm-debuginfo-analyzer/DWARF/01-dwarf-select-logical-elements.test b/llvm/test/tools/llvm-debuginfo-analyzer/DWARF/01-dwarf-select-logical-elements.test
index f84e9201d3044..5690cf585c379 100644
--- a/llvm/test/tools/llvm-debuginfo-analyzer/DWARF/01-dwarf-select-logical-elements.test
+++ b/llvm/test/tools/llvm-debuginfo-analyzer/DWARF/01-dwarf-select-logical-elements.test
@@ -34,7 +34,7 @@
 ; ONE-NEXT: [004]           {Code} 'movl	$0x7, -0x4(%rbp)'
 ; ONE-NEXT: [003]           {Code} 'movl	%eax, -0x4(%rbp)'
 ; ONE-NEXT: [003]           {Code} 'movl	%esi, -0x14(%rbp)'
-; ONE-NEXT: [004]           {Code} 'movl	-0x14(%rbp), %eax'
+; ONE-NEXT: [003]           {Code} 'movl	-0x14(%rbp), %eax'
 ; ONE-NEXT: [003]           {Code} 'movl	-0x4(%rbp), %eax'
 ; ONE-NEXT: [003]     4     {TypeAlias} 'INTEGER' -> 'int'
 ; ONE-NEXT: [004]     5     {Variable} 'CONSTANT' -> 'const INTEGER'
diff --git a/llvm/test/tools/llvm-debuginfo-analyzer/DWARF/02-dwarf-logical-lines.test b/llvm/test/tools/llvm-debuginfo-analyzer/DWARF/02-dwarf-logical-lines.test
index 533914f002827..bff7c945b6eac 100644
--- a/llvm/test/tools/llvm-debuginfo-analyzer/DWARF/02-dwarf-logical-lines.test
+++ b/llvm/test/tools/llvm-debuginfo-analyzer/DWARF/02-dwarf-logical-lines.test
@@ -42,7 +42,7 @@
 ; ONE-NEXT: [003]                 {Code} 'addq	$0x10, %rsp'
 ; ONE-NEXT: [003]                 {Code} 'popq	%rbp'
 ; ONE-NEXT: [003]                 {Code} 'retq'
-; ONE-NEXT: [003]     6           {Line}
+; ONE-NEXT: [002]     6         {Line}
 ; ONE-EMPTY:
 ; ONE-NEXT: Logical View:
 ; ONE-NEXT: [000]           {File} 'hello-world-dwarf-gcc.o' -> elf64-x86-64
@@ -64,4 +64,4 @@
 ; ONE-NEXT: [003]     7           {Line}
 ; ONE-NEXT: [003]                 {Code} 'popq	%rbp'
 ; ONE-NEXT: [003]                 {Code} 'retq'
-; ONE-NEXT: [003]     7           {Line}
+; ONE-NEXT: [002]     7         {Line}
diff --git a/llvm/test/tools/llvm-debuginfo-analyzer/DWARF/03-dwarf-incorrect-lexical-scope-typedef.test b/llvm/test/tools/llvm-debuginfo-analyzer/DWARF/03-dwarf-incorrect-lexical-scope-typedef.test
index dc57d01f3b8bb..69b65148361d7 100644
--- a/llvm/test/tools/llvm-debuginfo-analyzer/DWARF/03-dwarf-incorrect-lexical-scope-typedef.test
+++ b/llvm/test/tools/llvm-debuginfo-analyzer/DWARF/03-dwarf-incorrect-lexical-scope-typedef.test
@@ -59,7 +59,6 @@
 ; ONE-NEXT: [004]    10             {Line}
 ; ONE-NEXT: [004]    10             {Line}
 ; ONE-NEXT: [004]    10             {Line}
-; ONE-NEXT: [004]    13             {Line}
 ; ONE-NEXT: [003]     3           {Parameter} 'Param' -> 'char'
 ; ONE-NEXT: [003]     7           {TypeAlias} 'FLOAT' -> 'float'
 ; ONE-NEXT: [003]     4           {TypeAlias} 'INT' -> 'int'
@@ -71,6 +70,7 @@
 ; ONE-NEXT: [003]    13           {Line}
 ; ONE-NEXT: [003]    13           {Line}
 ; ONE-NEXT: [003]    13           {Line}
+; ONE-NEXT: [002]    13         {Line}
 ; ONE-EMPTY:
 ; ONE-NEXT: Logical View:
 ; ONE-NEXT: [000]           {File} 'pr-44884-dwarf-gcc.o' -> elf64-x86-64
@@ -91,7 +91,6 @@
 ; ONE-NEXT: [005]     9               {Line}
 ; ONE-NEXT: [005]     9               {Line}
 ; ONE-NEXT: [005]    10               {Line}
-; ONE-NEXT: [005]    13               {Line}
 ; ONE-NEXT: [004]     7             {TypeAlias} 'FLOAT' -> 'float'
 ; ONE-NEXT: [003]     3           {Parameter} 'Param' -> 'char'
 ; ONE-NEXT: [003]     4           {TypeAlias} 'INT' -> 'int'
@@ -99,8 +98,9 @@
 ; ONE-NEXT: [003]     3           {Line}
 ; ONE-NEXT: [003]     5           {Line}
 ; ONE-NEXT: [003]    13           {Line}
+; ONE-NEXT: [003]    13           {Line}
 ; ONE-NEXT: [003]    14           {Line}
-; ONE-NEXT: [003]    14           {Line}
+; ONE-NEXT: [002]    14         {Line}
 
 ; Using the selection facilities, we can produce a simple tabular
 ; output showing just the logical types that are 'Typedef'.
diff --git a/llvm/test/tools/llvm-debuginfo-analyzer/DWARF/06-dwarf-full-logical-view.test b/llvm/test/tools/llvm-debuginfo-analyzer/DWARF/06-dwarf-full-logical-view.test
index 6616710a10045..a2f05ddb3e6ec 100644
--- a/llvm/test/tools/llvm-debuginfo-analyzer/DWARF/06-dwarf-full-logical-view.test
+++ b/llvm/test/tools/llvm-debuginfo-analyzer/DWARF/06-dwarf-full-logical-view.test
@@ -53,8 +53,6 @@
 ; ONE-NEXT: [0x0000000023][004]      6             {Line} {NewStatement} '/data/projects/tests/input/general/test.cpp'
 ; ONE-NEXT: [0x0000000023][004]                    {Code} 'movl	$0x7, -0x4(%rbp)'
 ; ONE-NEXT: [0x000000002a][004]                    {Code} 'jmp	0x6'
-; ONE-NEXT: [0x000000002f][004]      8             {Line} {NewStatement} '/data/projects/tests/input/general/test.cpp'
-; ONE-NEXT: [0x000000002f][004]                    {Code} 'movl	-0x14(%rbp), %eax'
 ; ONE-NEXT: [0x0000000063][003]      2           {Parameter} 'ParamBool' -> [0x00000000bc]'bool'
 ; ONE-NEXT: [0x0000000063][004]                    {Coverage} 100.00%
 ; ONE-NEXT: [0x0000000064][004]                    {Location}
@@ -79,13 +77,15 @@
 ; ONE-NEXT: [0x0000000012][003]      3           {Line} {NewStatement} {PrologueEnd} '/data/projects/tests/input/general/test.cpp'
 ; ONE-NEXT: [0x0000000012][003]                  {Code} 'testb	$0x1, -0x15(%rbp)'
 ; ONE-NEXT: [0x0000000016][003]                  {Code} 'je	0x13'
+; ONE-NEXT: [0x000000002f][003]      8           {Line} {NewStatement} '/data/projects/tests/input/general/test.cpp'
+; ONE-NEXT: [0x000000002f][003]                  {Code} 'movl	-0x14(%rbp), %eax'
 ; ONE-NEXT: [0x0000000032][003]      8           {Line} '/data/projects/tests/input/general/test.cpp'
 ; ONE-NEXT: [0x0000000032][003]                  {Code} 'movl	%eax, -0x4(%rbp)'
 ; ONE-NEXT: [0x0000000035][003]      9           {Line} {NewStatement} '/data/projects/tests/input/general/test.cpp'
 ; ONE-NEXT: [0x0000000035][003]                  {Code} 'movl	-0x4(%rbp), %eax'
 ; ONE-NEXT: [0x0000000038][003]                  {Code} 'popq	%rbp'
 ; ONE-NEXT: [0x0000000039][003]                  {Code} 'retq'
-; ONE-NEXT: [0x000000003a][003]      9           {Line} {NewStatement} {EndSequence} '/data/projects/tests/input/general/test.cpp'
+; ONE-NEXT: [0x000000003a][002]      9         {Line} {NewStatement} {EndSequence} '/data/projects/tests/input/general/test.cpp'
 ; ONE-EMPTY:
 ; ONE-NEXT: -----------------------------
 ; ONE-NEXT: Element      Total    Printed
diff --git a/llvm/test/tools/llvm-debuginfo-analyzer/DWARF/pr-incorrect-logical-instructions.test b/llvm/test/tools/llvm-debuginfo-analyzer/DWARF/pr-incorrect-logical-instructions.test
index a99eae2aa2933..b38db28085b3e 100644
--- a/llvm/test/tools/llvm-debuginfo-analyzer/DWARF/pr-incorrect-logical-instructions.test
+++ b/llvm/test/tools/llvm-debuginfo-analyzer/DWARF/pr-incorrect-logical-instructions.test
@@ -84,7 +84,6 @@
 ; ONE-NEXT: [003]                 {Code} 'addq	$0x10, %rsp'
 ; ONE-NEXT: [003]                 {Code} 'popq	%rbp'
 ; ONE-NEXT: [003]                 {Code} 'retq'
-; ONE-NEXT: [003]                 {Code} 'data16'
 ; ONE-NEXT: [002]    10         {Function} extern not_inlined 'test' -> 'int'
 ; ONE-NEXT: [003]                 {Block}
 ; ONE-NEXT: [004]    13             {Line}
@@ -106,8 +105,6 @@
 ; ONE-NEXT: [004]                   {Code} 'movl	-0x8(%rbp), %eax'
 ; ONE-NEXT: [004]                   {Code} 'addl	$0x1, %eax'
 ; ONE-NEXT: [004]                   {Code} 'movl	%eax, -0x8(%rbp)'
-; ONE-NEXT: [004]    17             {Line}
-; ONE-NEXT: [004]                   {Code} 'movl	-0x8(%rbp), %eax'
 ; ONE-NEXT: [003]    10           {Line}
 ; ONE-NEXT: [003]                 {Code} 'pushq	%rbp'
 ; ONE-NEXT: [003]                 {Code} 'movq	%rsp, %rbp'
@@ -120,6 +117,8 @@
 ; ONE-NEXT: [003]    11           {Line}
 ; ONE-NEXT: [003]                 {Code} 'movl	%eax, -0x8(%rbp)'
 ; ONE-NEXT: [003]    17           {Line}
+; ONE-NEXT: [003]                 {Code} 'movl	-0x8(%rbp), %eax'
+; ONE-NEXT: [003]    17           {Line}
 ; ONE-NEXT: [003]                 {Code} 'addq	$0x10, %rsp'
 ; ONE-NEXT: [003]                 {Code} 'popq	%rbp'
 ; ONE-NEXT: [003]                 {Code} 'retq'
@@ -132,7 +131,8 @@
 ; ONE-NEXT: [003]                 {Code} 'xorl	%eax, %eax'
 ; ONE-NEXT: [003]                 {Code} 'popq	%rbp'
 ; ONE-NEXT: [003]                 {Code} 'retq'
-; ONE-NEXT: [003]    21           {Line}
+; ONE-NEXT: [002]               {Code} 'data16'
+; ONE-NEXT: [002]    21         {Line}
 
 ; RUN: llvm-debuginfo-analyzer --attribute=level \
 ; RUN:                         --print=instructions \
@@ -172,7 +172,6 @@
 ; TWO-NEXT: [003]                 {Code} 'addq	$0x10, %rsp'
 ; TWO-NEXT: [003]                 {Code} 'popq	%rbp'
 ; TWO-NEXT: [003]                 {Code} 'retq'
-; TWO-NEXT: [003]                 {Code} 'data16'
 ; TWO-NEXT: [002]    10         {Function} extern not_inlined 'test' -> 'int'
 ; TWO-NEXT: [003]                 {Block}
 ; TWO-NEXT: [004]                   {Code} 'movl	$0x0, -0xc(%rbp)'
@@ -187,7 +186,6 @@
 ; TWO-NEXT: [004]                   {Code} 'movl	-0x8(%rbp), %eax'
 ; TWO-NEXT: [004]                   {Code} 'addl	$0x1, %eax'
 ; TWO-NEXT: [004]                   {Code} 'movl	%eax, -0x8(%rbp)'
-; TWO-NEXT: [004]                   {Code} 'movl	-0x8(%rbp), %eax'
 ; TWO-NEXT: [003]                 {Code} 'pushq	%rbp'
 ; TWO-NEXT: [003]                 {Code} 'movq	%rsp, %rbp'
 ; TWO-NEXT: [003]                 {Code} 'subq	$0x10, %rsp'
@@ -195,6 +193,7 @@
 ; TWO-NEXT: [003]                 {Code} 'movl	-0x4(%rbp), %eax'
 ; TWO-NEXT: [003]                 {Code} 'subl	(%rip), %eax'
 ; TWO-NEXT: [003]                 {Code} 'movl	%eax, -0x8(%rbp)'
+; TWO-NEXT: [003]                 {Code} 'movl	-0x8(%rbp), %eax'
 ; TWO-NEXT: [003]                 {Code} 'addq	$0x10, %rsp'
 ; TWO-NEXT: [003]                 {Code} 'popq	%rbp'
 ; TWO-NEXT: [003]                 {Code} 'retq'
diff --git a/llvm/test/tools/llvm-debuginfo-analyzer/WebAssembly/01-wasm-print-basic-details.test b/llvm/test/tools/llvm-debuginfo-analyzer/WebAssembly/01-wasm-print-basic-details.test
index 4927086563330..183e3ddc75ca1 100644
--- a/llvm/test/tools/llvm-debuginfo-analyzer/WebAssembly/01-wasm-print-basic-details.test
+++ b/llvm/test/tools/llvm-debuginfo-analyzer/WebAssembly/01-wasm-print-basic-details.test
@@ -56,8 +56,6 @@
 ; ONE-NEXT: [004]                   {Code} 'local.get	11'
 ; ONE-NEXT: [004]                   {Code} 'i32.store	28'
 ; ONE-NEXT: [004]                   {Code} 'br      	1'
-; ONE-NEXT: [004]     -             {Line}
-; ONE-NEXT: [004]                   {Code} 'end'
 ; ONE-NEXT: [003]     4           {TypeAlias} 'INTEGER' -> 'int'
 ; ONE-NEXT: [003]     2           {Line}
 ; ONE-NEXT: [003]                 {Code} 'nop'
@@ -98,6 +96,8 @@
 ; ONE-NEXT: [003]                 {Code} 'local.get	9'
 ; ONE-NEXT: [003]                 {Code} 'i32.eqz'
 ; ONE-NEXT: [003]                 {Code} 'br_if   	0'
+; ONE-NEXT: [003]     -           {Line}
+; ONE-NEXT: [003]                 {Code} 'end'
 ; ONE-NEXT: [003]     8           {Line}
 ; ONE-NEXT: [003]                 {Code} 'local.get	5'
 ; ONE-NEXT: [003]                 {Code} 'i32.load	20'
@@ -115,6 +115,6 @@
 ; ONE-NEXT: [003]                 {Code} 'local.get	13'
 ; ONE-NEXT: [003]                 {Code} 'return'
 ; ONE-NEXT: [003]                 {Code} 'end'
-; ONE-NEXT: [003]     9           {Line}
-; ONE-NEXT: [003]                 {Code} 'unreachable'
 ; ONE-NEXT: [002]     1         {TypeAlias} 'INTPTR' -> '* const int'
+; ONE-NEXT: [002]     9         {Line}
+; ONE-NEXT: [002]               {Code} 'unreachable'
diff --git a/llvm/test/tools/llvm-debuginfo-analyzer/WebAssembly/02-wasm-logical-lines.test b/llvm/test/tools/llvm-debuginfo-analyzer/WebAssembly/02-wasm-logical-lines.test
index 50a531ad7d823..8d764648bdd5a 100644
--- a/llvm/test/tools/llvm-debuginfo-analyzer/WebAssembly/02-wasm-logical-lines.test
+++ b/llvm/test/tools/llvm-debuginfo-analyzer/WebAssembly/02-wasm-logical-lines.test
@@ -71,5 +71,5 @@
 ; ONE-NEXT: [003]                 {Code} 'local.get	6'
 ; ONE-NEXT: [003]                 {Code} 'return'
 ; ONE-NEXT: [003]                 {Code} 'end'
-; ONE-NEXT: [003]     6           {Line}
-; ONE-NEXT: [003]                 {Code} 'return'
+; ONE-NEXT: [002]     6         {Line}
+; ONE-NEXT: [002]               {Code} 'return'
diff --git a/llvm/test/tools/llvm-debuginfo-analyzer/WebAssembly/03-wasm-incorrect-lexical-scope-typedef.test b/llvm/test/tools/llvm-debuginfo-analyzer/WebAssembly/03-wasm-incorrect-lexical-scope-typedef.test
index 1192a0cb7ca5a..a89d49abd6280 100644
--- a/llvm/test/tools/llvm-debuginfo-analyzer/WebAssembly/03-wasm-incorrect-lexical-scope-typedef.test
+++ b/llvm/test/tools/llvm-debuginfo-analyzer/WebAssembly/03-wasm-incorrect-lexical-scope-typedef.test
@@ -55,7 +55,6 @@
 ; ONE-NEXT: [003]     -           {Line}
 ; ONE-NEXT: [003]     1           {Line}
 ; ONE-NEXT: [003]     1           {Line}
-; ONE-NEXT: [003]     1           {Line}
 ; ONE-NEXT: [002]     3         {Function} extern not_inlined 'foo' -> 'unsigned int'
 ; ONE-NEXT: [003]                 {Block}
 ; ONE-NEXT: [004]     9             {Variable} 'Added' -> 'FLOAT'
@@ -67,7 +66,6 @@
 ; ONE-NEXT: [004]    10             {Line}
 ; ONE-NEXT: [004]    10             {Line}
 ; ONE-NEXT: [004]    10             {Line}
-; ONE-NEXT: [004]    13             {Line}
 ; ONE-NEXT: [003]     3           {Parameter} 'Param' -> 'char'
 ; ONE-NEXT: [003]     7           {TypeAlias} 'FLOAT' -> 'float'
 ; ONE-NEXT: [003]     4           {TypeAlias} 'INT' -> 'int'
@@ -79,6 +77,8 @@
 ; ONE-NEXT: [003]    13           {Line}
 ; ONE-NEXT: [003]    13           {Line}
 ; ONE-NEXT: [003]    13           {Line}
+; ONE-NEXT: [002]     1         {Line}
+; ONE-NEXT: [002]    13         {Line}
 ; ONE-EMPTY:
 ; ONE-NEXT: Logical View:
 ; ONE-NEXT: [000]           {File} 'pr-44884-dwarf-gcc.o' -> elf64-x86-64
@@ -99,7 +99,6 @@
 ; ONE-NEXT: [005]     9               {Line}
 ; ONE-NEXT: [005]     9               {Line}
 ; ONE-NEXT: [005]    10               {Line}
-; ONE-NEXT: [005]    13               {Line}
 ; ONE-NEXT: [004]     7             {TypeAlias} 'FLOAT' -> 'float'
 ; ONE-NEXT: [003]     3           {Parameter} 'Param' -> 'char'
 ; ONE-NEXT: [003]     4           {TypeAlias} 'INT' -> 'int'
@@ -107,8 +106,9 @@
 ; ONE-NEXT: [003]     3           {Line}
 ; ONE-NEXT: [003]     5           {Line}
 ; ONE-NEXT: [003]    13           {Line}
+; ONE-NEXT: [003]    13           {Line}
 ; ONE-NEXT: [003]    14           {Line}
-; ONE-NEXT: [003]    14           {Line}
+; ONE-NEXT: [002]    14         {Line}
 
 ; Using the selection facilities, we can produce a simple tabular
 ; output showing just the logical types that are 'Typedef'.
diff --git a/llvm/test/tools/llvm-debuginfo-analyzer/WebAssembly/06-wasm-full-logical-view.test b/llvm/test/tools/llvm-debuginfo-analyzer/WebAssembly/06-wasm-full-logical-view.test
index ac4873f0a4d34..e152f40d99213 100644
--- a/llvm/test/tools/llvm-debuginfo-analyzer/WebAssembly/06-wasm-full-logical-view.test
+++ b/llvm/test/tools/llvm-debuginfo-analyzer/WebAssembly/06-wasm-full-logical-view.test
@@ -64,8 +64,6 @@
 ; ONE-NEXT: [0x000000005d][004]                    {Code} 'local.get	11'
 ; ONE-NEXT: [0x000000005f][004]                    {Code} 'i32.store	28'
 ; ONE-NEXT: [0x0000000062][004]                    {Code} 'br      	1'
-; ONE-NEXT: [0x0000000064][004]      0             {Line} '{{.*}}/general/test.cpp'
-; ONE-NEXT: [0x0000000064][004]                    {Code} 'end'
 ; ONE-NEXT: [0x000000005e][003]      2           {Parameter} 'ParamBool' -> [0x00000000b3]'bool'
 ; ONE-NEXT: [0x000000005e][004]                    {Coverage} 100.00%
 ; ONE-NEXT: [0x000000005f][004]                    {Location}
@@ -118,6 +116,8 @@
 ; ONE-NEXT: [0x0000000047][003]                  {Code} 'local.get	9'
 ; ONE-NEXT: [0x0000000049][003]                  {Code} 'i32.eqz'
 ; ONE-NEXT: [0x000000004a][003]                  {Code} 'br_if   	0'
+; ONE-NEXT: [0x0000000064][003]      0           {Line} '{{.*}}/general/test.cpp'
+; ONE-NEXT: [0x0000000064][003]                  {Code} 'end'
 ; ONE-NEXT: [0x0000000065][003]      8           {Line} {NewStatement} '{{.*}}/general/test.cpp'
 ; ONE-NEXT: [0x0000000065][003]                  {Code} 'local.get	5'
 ; ONE-NEXT: [0x0000000067][003]                  {Code} 'i32.load	20'
@@ -135,8 +135,8 @@
 ; ONE-NEXT: [0x000000007b][003]                  {Code} 'local.get	13'
 ; ONE-NEXT: [0x000000007d][003]                  {Code} 'return'
 ; ONE-NEXT: [0x000000007e][003]                  {Code} 'end'
-; ONE-NEXT: [0x000000007f][003]      9           {Line} {NewStatement} {EndSequence} '{{.*}}/general/test.cpp'
-; ONE-NEXT: [0x000000007f][003]                  {Code} 'unreachable'
+; ONE-NEXT: [0x000000007f][002]      9         {Line} {NewStatement} {EndSequence} '{{.*}}/general/test.cpp'
+; ONE-NEXT: [0x000000007f][002]                {Code} 'unreachable'
 ; ONE-EMPTY:
 ; ONE-NEXT: -----------------------------
 ; ONE-NEXT: Element      Total    Printed
diff --git a/llvm/unittests/DebugInfo/LogicalView/DWARFReaderTest.cpp b/llvm/unittests/DebugInfo/LogicalView/DWARFReaderTest.cpp
index 544c39a3c7b2e..78dc8502e9676 100644
--- a/llvm/unittests/DebugInfo/LogicalView/DWARFReaderTest.cpp
+++ b/llvm/unittests/DebugInfo/LogicalView/DWARFReaderTest.cpp
@@ -81,7 +81,7 @@ void checkElementProperties(LVReader *Reader) {
   EXPECT_EQ(Language, LVSourceLanguage::DW_LANG_C_plus_plus_14);
   EXPECT_EQ(Language.getName(), "DW_LANG_C_plus_plus_14");
 
-  EXPECT_EQ(CompileUnit->lineCount(), 0u);
+  EXPECT_EQ(CompileUnit->lineCount(), 1u);
   EXPECT_EQ(CompileUnit->scopeCount(), 1u);
   EXPECT_EQ(CompileUnit->symbolCount(), 0u);
   EXPECT_EQ(CompileUnit->typeCount(), 7u);
@@ -129,7 +129,7 @@ void checkElementProperties(LVReader *Reader) {
   // Lines (debug and assembler) for 'foo'.
   const LVLines *Lines = Function->getLines();
   ASSERT_NE(Lines, nullptr);
-  ASSERT_EQ(Lines->size(), 0x12u);
+  ASSERT_EQ(Lines->size(), 19u);
 
   // Check size of types in CompileUnit.
   const LVTypes *Types = CompileUnit->getTypes();
@@ -252,7 +252,7 @@ void checkElementComparison(LVReader *Reference, LVReader *Target) {
 
   // Get comparison table.
   LVPassTable PassTable = Compare.getPassTable();
-  ASSERT_EQ(PassTable.size(), 5u);
+  ASSERT_EQ(PassTable.size(), 4u);
 
   LVReader *Reader;
   LVElement *Element;
@@ -278,18 +278,8 @@ void checkElementComparison(LVReader *Reference, LVReader *Target) {
   EXPECT_EQ(Element->getName(), "INTEGER");
   EXPECT_EQ(Pass, LVComparePass::Missing);
 
-  // Reference: Missing DebugLine
-  std::tie(Reader, Element, Pass) = PassTable[2];
-  ASSERT_NE(Reader, nullptr);
-  ASSERT_NE(Element, nullptr);
-  EXPECT_EQ(Reader, Reference);
-  EXPECT_EQ(Element->getLevel(), 3u);
-  EXPECT_EQ(Element->getLineNumber(), 8u);
-  EXPECT_EQ(Element->getName(), "");
-  EXPECT_EQ(Pass, LVComparePass::Missing);
-
   // Target: Added Variable 'CONSTANT'
-  std::tie(Reader, Element, Pass) = PassTable[3];
+  std::tie(Reader, Element, Pass) = PassTable[2];
   ASSERT_NE(Reader, nullptr);
   ASSERT_NE(Element, nullptr);
   EXPECT_EQ(Reader, Target);
@@ -299,7 +289,7 @@ void checkElementComparison(LVReader *Reference, LVReader *Target) {
   EXPECT_EQ(Pass, LVComparePass::Added);
 
   // Target: Added TypeDefinition 'INTEGER'
-  std::tie(Reader, Element, Pass) = PassTable[4];
+  std::tie(Reader, Element, Pass) = PassTable[3];
   ASSERT_NE(Reader, nullptr);
   ASSERT_NE(Element, nullptr);
   EXPECT_EQ(Reader, Target);

>From 19c2a1db50a2652693afd37e561fbacfcf3ba42e Mon Sep 17 00:00:00 2001
From: Adam Yang <hanbyang at microsoft.com>
Date: Wed, 13 Aug 2025 16:43:19 -0700
Subject: [PATCH 2/2] Added test

---
 .../DWARF/Inputs/amdgpu-ranges.o              | Bin 0 -> 6440 bytes
 .../DWARF/amdgpu-ranges.test                  |  36 ++++++++++++++++++
 2 files changed, 36 insertions(+)
 create mode 100644 llvm/test/tools/llvm-debuginfo-analyzer/DWARF/Inputs/amdgpu-ranges.o
 create mode 100644 llvm/test/tools/llvm-debuginfo-analyzer/DWARF/amdgpu-ranges.test

diff --git a/llvm/test/tools/llvm-debuginfo-analyzer/DWARF/Inputs/amdgpu-ranges.o b/llvm/test/tools/llvm-debuginfo-analyzer/DWARF/Inputs/amdgpu-ranges.o
new file mode 100644
index 0000000000000000000000000000000000000000..168724b217b0328b527f8bc3dc1f8a5c7387cba4
GIT binary patch
literal 6440
zcmeHLYm8M_6<+&1?%bI>FarY&1hlu5X~tMiXLuEnz{MgD1EwX?q8T|obMKiuhu)Xx
zoI4LfWo87NTB5WNe at J5qwhA2{Q#7ef>QJaL^#P+Ml$v0r at dpjTL=%jyHjZnZv-jo9
zo~!YPCN^;;`>wsd{q42(W1YSC%-&CL*`P4C4!AJ54onyk-P#lyL`((M6wIy440#`x
zUk27y4d<c2z!-ylSRT8|7_GqY7;GFGn}ETw36*9u{|cZ!fHuH}H?f1JfpZOD4_rWO
z0Q+Mr_W$ab5*vDI05Jyp#}sYoAjMD=hEc4ms)m}yZ==KaYCd at KJnHKJgYXxX>Y+d4
zL5#+LW2qtia1dvZVl!o*0tc=rh=zUCE1;vrVDM`}d(C-JwJ!(0ls!RA@)hU4Z%!P?
zIOtcU at u1cjXxx81)G_iKLmx3Uh9!=r4*kV%CvnUJxJKc)7hDHrKm!;>f6x8Dd`Q>e
z3z$bbW(RI0G-8>L<pC_4uxRUtnSN+s)?p2_VRnS6Sl3RmKZcbf%8wQG(1BT?`Oh+S
z20VvNA28)m60}#@TgVxj1#AXuX=&2c7Pq;vdB*&iF|XNgKFFE at lx3i{Y;IaRZ&l)x
zi9!p2sxY-Bksx!JHDK`jVRMs;4f-Nvu1O>k05OA+6Saj{Yv%#f=%6eN&CPf~#g|Po
zYZCz-pf16--vf}C!(G;gv4S|$+5&LFG=S;Tf-xbyGO+~1!H=-$z~ZRzW1(Y0$of0g
z08*5tq*+YWk)~-WG&ImvO;c)u79}17>QoD{8mNQVek8<M6Vwp1mK`KhnFY14Vx<n^
z>TIZ^7L>$O_%pM9M!lx}5Np~rqD)h#PY*0$(;I?{#-=w0l{f=EQKRYgI1*gwV0US>
zw8PpcdxL4W*%1Xgf+qa=FG;2^T`YDc+l`gRlI3m7jipPHt)1;{E38kfXwQ5MHmvG!
z3Z2Eij$E#kHZz^s4&U~C&n(!z9bHA&=+1dLD7V43M?Y2W>ayL{UAdy=uYo{;owM_H
z!H2cwwp42ABWo84T54-5wGPVd*wS9DC2u(e$oNhM%1*&w3O#n(FS at JC1<%PA>`W5D
z`;tr7KokH3MMN`QETh#2{jeMI{brBlf<u*DF>U1na~3WreNj{8-Jpe1>5kN3mCD^%
zsLz%yk8Evwpsfw7fe0?0_d3UjfApO%HM9*3CwA at q)}EC&3j5zXxwr9^(@(s4>G0}v
zoc2#u3|s24%)~Mm%SW*+!on7*O&WexiV<p63AHvS)WA~60!9f4%2xVSgXGpIn?a>S
z1x862W*cQ6eMalHt_Lfh$)*d77o#p&xy6gKU48BCI8B<%F1%NhA#dYD+X03~LzYo;
zN_NgE*xu7mK5tkh=lS(J+LxR&(#3qK?AxYmXC2SCU2p%0;b%?H*=?J4;q at 2Ma583J
zq~0H?@22`$19QO1;&$dsW*T>N)abU{Ot0nIrsrE(+Z+6jk at nt(IcJS at x1E06E9Y@{
zb7lMTvp2qXe8kAuo#m{VFJ|nErwmL*x8E!kF;UK%G}BVqOnW9J+xMf5rq`eEEaqg+
z3B&G7mvC4xVg&ge`2EFeFB*<*+hLHChLgu(nZ?q at lSVG%1+#@yM&8bwMK@!+cINdF
z!%MrCpYEm^{-9zYrHI3$<!MApw&aFcoZv>z$vgh8mkqz$wXICnEtX4W#=-B)bBYD;
zaEh_hhVNP>v*g+yPW9qBqwLwPnX!C}_5kNux(3P1bbV--Cs6+9en!F()7(8}#OSH4
zK at B&8HMqp!tkG-r*j;Y1;0FtqI%)J~OW_v0Y~cRdZUMh at k(g$;<#j(Ze)fq!EgS#(
zpU;dpoa+6JyKU$0GX^eIvFxVpfHA&*-OV=|Zq5Da3B&8QaI?I at 6C#U;Mk%w+5a<4G
z^!)wfD~|kR?Re|eqYd`2wO3xclbyKOC8v;mn$mOB at JdcDXVT7j-Njty(!|6IhTmVZ
zk3WcwcXlb5o_>aZRy{ZX+}daGvkT4v+A at va09qr^=@k`m(d|W$PPG=)8e at OMyAq$t
zbUI<d%3Z-hrLen{hM-2*O)VW-fi&xL>-?Cy``h}w*u#3=&thut4t*iMD|hI3$C7$e
z?0)^8RR|{a1!`?l?KSi|we~ZJuhD1k)8nV<@y!0cJ41y07h1)~do at vmJ927^S~+<q
zx2ZrU=~Pjxp8j}1;_Y8e)Zmny+M))#Qw^t+d#b2Yb}!_pFlP$+B}8UM)<NvExVLC#
zlpjK7 at CxBn1aEc(uj6%6bf=IAuHY{W;Q*)mjP4<ldqWlAv^xS9{m2j96+%S2!0+M>
zbO at 0Me0^wERz~2Da-8lz5`lj)G+_bP0^i8(q=ehtru&mb at b`o!v~n$Q`i at BM3sr^x
zO>T>eU+|A|e3`@_<Mv7k|2el;OZYgqQxg7LZi{siaev40O%nedZf}wB?{fPg2|vc|
z&q?_2xxGWeZ*sds!f$a~<OAhqc+i9mV&4Tm%=yuE#v`dB-Ml8|EAk;H;bJ{Y5-#@3
zmvE6MeG-0*+afPST(NEg5?}1EIFE at RJv~I;iuv;H5dFUB?Ik3-4up%fTfqskAK)(>
ztFzO!d%*DRK3`yNA)CX8mnUp|`*Pd0a~ALD`L0>)>hf&j;R_I7b_QL$d8^OKm-7fl
z$OS8JSKMLGif4TM;d>122-(VHCIe2Ps|eD&3yeb1w~dXT-M$##bLq!Jdy*e|Sxy4F
zTpR`%7|*vlQTOLb|7YZ{=!Vu<mbv^WuM-=>36cr;7jdv>ln0YU5M}2A=VW at VOHkMn
z{U{=iWiH+OG8WKz|DBP(RF%18%NX%?^8V+^h=|O60o!DZ=pUg=1m!}gD!(%K7`9NT
z6qcwoP7kd^9HhTlXpO}=Bfc}b=VYJM<!v6H{%;Z$nY#)bWsLam^Zt*K5fPcY9NVgm
z{}>;CBVC#(G=4fK<nhxvMLyfGMCJ25q27;zSQqhyJ`%yA)NTAy7V9M1L_cAF11r_W
zKgthoF)kW^Jr;TVS;S<Y2tkg=zePqwcv at 8u`i`r`zs}>o#+ekKmQ;>^0kLZFcL*Zy
zFO<yv6*lmp3QC|w{}a;pE06yV$d-Ku4rsAZT0>R&m522%wp5${G5)ZNu0I_~qQBVJ
zYlu~g-^$~Er4l);$lR+4SBw8k9)A<>PwP*2o*bXvP2^LI6RUxY at c8!%fNK$7X#5Kz
T^4h&aev9{C$%&*0lH>macHtHu

literal 0
HcmV?d00001

diff --git a/llvm/test/tools/llvm-debuginfo-analyzer/DWARF/amdgpu-ranges.test b/llvm/test/tools/llvm-debuginfo-analyzer/DWARF/amdgpu-ranges.test
new file mode 100644
index 0000000000000..6d55236636710
--- /dev/null
+++ b/llvm/test/tools/llvm-debuginfo-analyzer/DWARF/amdgpu-ranges.test
@@ -0,0 +1,36 @@
+; REUIRES: amdgpu-registered-target
+
+; Regression test for:
+;  - DW_AT_ranges not being read properly
+;  - Instructions at DW_AT_high_pc of a scope incorrectly included in the scope
+
+; test.hlsl
+; 01 RWBuffer<float> u0 : register(u0);
+; 02 RWBuffer<float> u1 : register(u1);
+; 03 
+; 04 [RootSignature("DescriptorTable(UAV(u0,numDescriptors=2))")]
+; 05 [numthreads(64,1,1)]
+; 06 void main(uint3 dtid : SV_DispatchThreadID) {
+; 07   float my_var = u0[dtid.x];
+; 08   [loop]
+; 09   for (int i = 0; i < 10; i++) {
+; 10     float my_local_var = i*2;
+; 11     my_var += my_local_var;
+; 12   }
+; 13   u1[dtid.x] = my_var;
+; 14 }
+
+; RUN: llvm-debuginfo-analyzer --attribute=all \
+; RUN:                         --print=all \
+; RUN:                         --output-sort=offset \
+; RUN:                         %p/Inputs/amdgpu-ranges.o 2>&1 | \
+; RUN: FileCheck %s
+
+; Make sure these two ranges are present and point to the correct offsets
+; CHECK: [005] {Range} Lines 10:9 [0x00000000b0:0x00000000c8]
+; CHECK: [005] {Range} Lines 11:13 [0x00000000f4:0x0000000114]
+
+; Make sure the offset 0x114 does not show up at the scope level 005 and 004
+; CHECK-NOT: [0x0000000114][005]
+; CHECK-NOT: [0x0000000114][004]
+



More information about the llvm-commits mailing list