Skip to content

Commit c230160

Browse files
authored
[llvm-debuginfo-analyzer] Fixed some DWARF related bugs (#153318)
This PR fixes two bugs in LogicalView: - `DW_AT_ranges` are not being read correctly - `DW_AT_high_pc` for scopes are treated as inclusive The test changes for llvm-debug-analyzer are mostly to address the DW_AT_high_pc change. There is a new test that further verifies the fixes.
1 parent 8b25e72 commit c230160

15 files changed

+1581
-50
lines changed

llvm/lib/DebugInfo/LogicalView/Readers/LVDWARFReader.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ void LVDWARFReader::processOneAttribute(const DWARFDie &Die,
274274
for (DWARFAddressRange &Range : Ranges) {
275275
// This seems to be a tombstone for empty ranges.
276276
if ((Range.LowPC == Range.HighPC) ||
277-
(Range.LowPC = getTombstoneAddress()))
277+
(Range.LowPC == getTombstoneAddress()))
278278
continue;
279279
// Store the real upper limit for the address range.
280280
if (UpdateHighAddress && Range.HighPC > 0)
@@ -461,13 +461,17 @@ LVScope *LVDWARFReader::processOneDie(const DWARFDie &InputDIE, LVScope *Parent,
461461
if (!CurrentRanges.empty()) {
462462
for (LVAddressRange &Range : CurrentRanges)
463463
addSectionRange(SectionIndex, CurrentScope, Range.first,
464-
Range.second);
464+
Range.second > Range.first
465+
? Range.second - 1 // Make hi-pc exclusive
466+
: Range.second);
465467
CurrentRanges.clear();
466468
}
467469
// If the scope is the CU, do not update the ranges set.
468470
if (FoundLowPC && FoundHighPC && !IsCompileUnit) {
469471
addSectionRange(SectionIndex, CurrentScope, CurrentLowPC,
470-
CurrentHighPC);
472+
CurrentHighPC > CurrentLowPC
473+
? CurrentHighPC - 1 // Make hi-pc exclusive
474+
: CurrentHighPC);
471475
}
472476
}
473477
}

llvm/test/tools/llvm-debuginfo-analyzer/DWARF/01-dwarf-print-basic-details.test

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,6 @@
4545
; ONE-NEXT: [004] 6 {Line}
4646
; ONE-NEXT: [004] {Code} 'movl $0x7, -0x4(%rbp)'
4747
; ONE-NEXT: [004] {Code} 'jmp 0x6'
48-
; ONE-NEXT: [004] 8 {Line}
49-
; ONE-NEXT: [004] {Code} 'movl -0x14(%rbp), %eax'
5048
; ONE-NEXT: [003] 4 {TypeAlias} 'INTEGER' -> 'int'
5149
; ONE-NEXT: [003] 2 {Line}
5250
; ONE-NEXT: [003] {Code} 'pushq %rbp'
@@ -60,10 +58,12 @@
6058
; ONE-NEXT: [003] {Code} 'testb $0x1, -0x15(%rbp)'
6159
; ONE-NEXT: [003] {Code} 'je 0x13'
6260
; ONE-NEXT: [003] 8 {Line}
61+
; ONE-NEXT: [003] {Code} 'movl -0x14(%rbp), %eax'
62+
; ONE-NEXT: [003] 8 {Line}
6363
; ONE-NEXT: [003] {Code} 'movl %eax, -0x4(%rbp)'
6464
; ONE-NEXT: [003] 9 {Line}
6565
; ONE-NEXT: [003] {Code} 'movl -0x4(%rbp), %eax'
6666
; ONE-NEXT: [003] {Code} 'popq %rbp'
6767
; ONE-NEXT: [003] {Code} 'retq'
68-
; ONE-NEXT: [003] 9 {Line}
6968
; ONE-NEXT: [002] 1 {TypeAlias} 'INTPTR' -> '* const int'
69+
; ONE-NEXT: [002] 9 {Line}

llvm/test/tools/llvm-debuginfo-analyzer/DWARF/01-dwarf-select-logical-elements.test

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
; ONE-NEXT: [004] {Code} 'movl $0x7, -0x4(%rbp)'
3535
; ONE-NEXT: [003] {Code} 'movl %eax, -0x4(%rbp)'
3636
; ONE-NEXT: [003] {Code} 'movl %esi, -0x14(%rbp)'
37-
; ONE-NEXT: [004] {Code} 'movl -0x14(%rbp), %eax'
37+
; ONE-NEXT: [003] {Code} 'movl -0x14(%rbp), %eax'
3838
; ONE-NEXT: [003] {Code} 'movl -0x4(%rbp), %eax'
3939
; ONE-NEXT: [003] 4 {TypeAlias} 'INTEGER' -> 'int'
4040
; ONE-NEXT: [004] 5 {Variable} 'CONSTANT' -> 'const INTEGER'

llvm/test/tools/llvm-debuginfo-analyzer/DWARF/02-dwarf-logical-lines.test

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
; ONE-NEXT: [003] {Code} 'addq $0x10, %rsp'
4343
; ONE-NEXT: [003] {Code} 'popq %rbp'
4444
; ONE-NEXT: [003] {Code} 'retq'
45-
; ONE-NEXT: [003] 6 {Line}
45+
; ONE-NEXT: [002] 6 {Line}
4646
; ONE-EMPTY:
4747
; ONE-NEXT: Logical View:
4848
; ONE-NEXT: [000] {File} 'hello-world-dwarf-gcc.o' -> elf64-x86-64
@@ -64,4 +64,4 @@
6464
; ONE-NEXT: [003] 7 {Line}
6565
; ONE-NEXT: [003] {Code} 'popq %rbp'
6666
; ONE-NEXT: [003] {Code} 'retq'
67-
; ONE-NEXT: [003] 7 {Line}
67+
; ONE-NEXT: [002] 7 {Line}

llvm/test/tools/llvm-debuginfo-analyzer/DWARF/03-dwarf-incorrect-lexical-scope-typedef.test

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@
5959
; ONE-NEXT: [004] 10 {Line}
6060
; ONE-NEXT: [004] 10 {Line}
6161
; ONE-NEXT: [004] 10 {Line}
62-
; ONE-NEXT: [004] 13 {Line}
6362
; ONE-NEXT: [003] 3 {Parameter} 'Param' -> 'char'
6463
; ONE-NEXT: [003] 7 {TypeAlias} 'FLOAT' -> 'float'
6564
; ONE-NEXT: [003] 4 {TypeAlias} 'INT' -> 'int'
@@ -71,6 +70,7 @@
7170
; ONE-NEXT: [003] 13 {Line}
7271
; ONE-NEXT: [003] 13 {Line}
7372
; ONE-NEXT: [003] 13 {Line}
73+
; ONE-NEXT: [002] 13 {Line}
7474
; ONE-EMPTY:
7575
; ONE-NEXT: Logical View:
7676
; ONE-NEXT: [000] {File} 'pr-44884-dwarf-gcc.o' -> elf64-x86-64
@@ -91,16 +91,16 @@
9191
; ONE-NEXT: [005] 9 {Line}
9292
; ONE-NEXT: [005] 9 {Line}
9393
; ONE-NEXT: [005] 10 {Line}
94-
; ONE-NEXT: [005] 13 {Line}
9594
; ONE-NEXT: [004] 7 {TypeAlias} 'FLOAT' -> 'float'
9695
; ONE-NEXT: [003] 3 {Parameter} 'Param' -> 'char'
9796
; ONE-NEXT: [003] 4 {TypeAlias} 'INT' -> 'int'
9897
; ONE-NEXT: [003] 5 {Variable} 'Value' -> 'INT'
9998
; ONE-NEXT: [003] 3 {Line}
10099
; ONE-NEXT: [003] 5 {Line}
101100
; ONE-NEXT: [003] 13 {Line}
101+
; ONE-NEXT: [003] 13 {Line}
102102
; ONE-NEXT: [003] 14 {Line}
103-
; ONE-NEXT: [003] 14 {Line}
103+
; ONE-NEXT: [002] 14 {Line}
104104

105105
; Using the selection facilities, we can produce a simple tabular
106106
; output showing just the logical types that are 'Typedef'.

llvm/test/tools/llvm-debuginfo-analyzer/DWARF/06-dwarf-full-logical-view.test

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,6 @@
5353
; ONE-NEXT: [0x0000000023][004] 6 {Line} {NewStatement} '/data/projects/tests/input/general/test.cpp'
5454
; ONE-NEXT: [0x0000000023][004] {Code} 'movl $0x7, -0x4(%rbp)'
5555
; ONE-NEXT: [0x000000002a][004] {Code} 'jmp 0x6'
56-
; ONE-NEXT: [0x000000002f][004] 8 {Line} {NewStatement} '/data/projects/tests/input/general/test.cpp'
57-
; ONE-NEXT: [0x000000002f][004] {Code} 'movl -0x14(%rbp), %eax'
5856
; ONE-NEXT: [0x0000000063][003] 2 {Parameter} 'ParamBool' -> [0x00000000bc]'bool'
5957
; ONE-NEXT: [0x0000000063][004] {Coverage} 100.00%
6058
; ONE-NEXT: [0x0000000064][004] {Location}
@@ -79,13 +77,15 @@
7977
; ONE-NEXT: [0x0000000012][003] 3 {Line} {NewStatement} {PrologueEnd} '/data/projects/tests/input/general/test.cpp'
8078
; ONE-NEXT: [0x0000000012][003] {Code} 'testb $0x1, -0x15(%rbp)'
8179
; ONE-NEXT: [0x0000000016][003] {Code} 'je 0x13'
80+
; ONE-NEXT: [0x000000002f][003] 8 {Line} {NewStatement} '/data/projects/tests/input/general/test.cpp'
81+
; ONE-NEXT: [0x000000002f][003] {Code} 'movl -0x14(%rbp), %eax'
8282
; ONE-NEXT: [0x0000000032][003] 8 {Line} '/data/projects/tests/input/general/test.cpp'
8383
; ONE-NEXT: [0x0000000032][003] {Code} 'movl %eax, -0x4(%rbp)'
8484
; ONE-NEXT: [0x0000000035][003] 9 {Line} {NewStatement} '/data/projects/tests/input/general/test.cpp'
8585
; ONE-NEXT: [0x0000000035][003] {Code} 'movl -0x4(%rbp), %eax'
8686
; ONE-NEXT: [0x0000000038][003] {Code} 'popq %rbp'
8787
; ONE-NEXT: [0x0000000039][003] {Code} 'retq'
88-
; ONE-NEXT: [0x000000003a][003] 9 {Line} {NewStatement} {EndSequence} '/data/projects/tests/input/general/test.cpp'
88+
; ONE-NEXT: [0x000000003a][002] 9 {Line} {NewStatement} {EndSequence} '/data/projects/tests/input/general/test.cpp'
8989
; ONE-EMPTY:
9090
; ONE-NEXT: -----------------------------
9191
; ONE-NEXT: Element Total Printed

0 commit comments

Comments
 (0)