[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