labath created this revision. labath added reviewers: JDevlieghere, MaskRay, clayborg. Herald added a subscriber: aprantl. Herald added a project: LLDB.
The intention here is to prune out line sequences addresses referring outside any known sections. Such line sequences are typically produced by dead-stripped code, which leaves behind some debug info. These line sequences were pretty much ignored already -- they would fail at the LineTable::ConvertEntryAtIndexToLineEntry stage. However, they still made it into the line table and into the "image dump line-table" output, which was printing random nonsense as a result. This avoids putting these sequences into the line table in the first place, which makes them smaller (some files have a lot of dead line sequences) and hopefully slightly speeds up code which iterates through the line table linearly. It also makes the "image dump line-table" output sane, which means I can write my test for handling of different linker tombstoning behaviors. Depends on D84401 <https://reviews.llvm.org/D84401>. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D84402 Files: lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp lldb/test/Shell/SymbolFile/DWARF/debug_line-tombstone.s
Index: lldb/test/Shell/SymbolFile/DWARF/debug_line-tombstone.s =================================================================== --- lldb/test/Shell/SymbolFile/DWARF/debug_line-tombstone.s +++ lldb/test/Shell/SymbolFile/DWARF/debug_line-tombstone.s @@ -1,27 +1,48 @@ -# This test that we don't get confused by line tables containing a tombstone -# (-1) value, as produced by recent lld's. Line sequences with the tombstone -# value should be completely ignored. The tombstone sequence is deliberately -# longer so that any attempt at an address binary search will likely land inside -# the sequence. +# Test handling of line table tombstone strategies by various linkers. When a +# section not added to the final binary (either due to --gc-sections or comdats) +# (elf) linkers still need to resolve debug info relocations to it. This test +# simulates tombstoning behavior of bfd gold and lld linkers. +# - ld.bfd will resolve all relocations to zero +# - ld.gold (and lld before D81784) could also resolve the relocations to a +# small value (zero+relocation addend), although this is not likely to happen +# in line tables. +# - ld.lld since D81784, resolves the relocations to -1 +# These line tables should be ignored. bfd and gold tombstones can be ambiguous +# if the binary has sections in the low addresses, but we should definitely +# ignore them if they fall outside of any section. -# RUN: llvm-mc --filetype=obj --triple=x86_64-pc-linux %s -o %t -# RUN: %lldb -o "image lookup -n main -v" -o "image dump line-table main.cpp" \ -# RUN: -o exit %t | FileCheck %s +# REQUIRES: x86, lld -# CHECK-LABEL: image lookup -n main -v -# CHECK: LineEntry: [0x0000000000001000-0x0000000000001001): main.cpp:1 +# RUN: llvm-mc --filetype=obj --triple=x86_64-pc-linux %s -o %t.lld.o --defsym TOMBSTONE=-1 +# RUN: ld.lld -o %t.lld %t.lld.o --image-base=0x10000 +# RUN: %lldb -o "image lookup -n _start -v" -o "image dump line-table main.cpp" \ +# RUN: -o exit %t.lld | FileCheck %s + +# RUN: llvm-mc --filetype=obj --triple=x86_64-pc-linux %s -o %t.bfd.o --defsym TOMBSTONE=0 +# RUN: ld.lld -o %t.bfd %t.bfd.o --image-base=0x10000 +# RUN: %lldb -o "image lookup -n _start -v" -o "image dump line-table main.cpp" \ +# RUN: -o exit %t.bfd | FileCheck %s + +# RUN: llvm-mc --filetype=obj --triple=x86_64-pc-linux %s -o %t.gold.o --defsym TOMBSTONE=47 +# RUN: ld.lld -o %t.gold %t.gold.o --image-base=0x10000 +# RUN: %lldb -o "image lookup -n _start -v" -o "image dump line-table main.cpp" \ +# RUN: -o exit %t.gold | FileCheck %s + +# CHECK-LABEL: image lookup -n _start -v +# CHECK: LineEntry: [0x0000000000020000-0x0000000000020001): main.cpp:1 # CHECK-LABEL: image dump line-table main.cpp # CHECK-NEXT: Line table for main.cpp -# CHECK-NEXT: 0x0000000000001000: main.cpp:1 -# CHECK-NEXT: 0x0000000000001001: main.cpp:1 +# CHECK-NEXT: 0x0000000000020000: main.cpp:1 +# CHECK-NEXT: 0x0000000000020001: main.cpp:1 # CHECK-EMPTY: # CHECK-NEXT: exit + .globl _start .text -.space 0x1000 -main: + .p2align 16 +_start: nop -.Lmain_end: +.L_start_end: .section .debug_abbrev,"",@progbits .byte 1 # Abbreviation Code @@ -52,8 +73,8 @@ .asciz "Hand-written DWARF" # DW_AT_producer .asciz "main.cpp" # DW_AT_name .long 0 # DW_AT_stmt_list - .quad main-.text # DW_AT_low_pc - .long .Lmain_end-main # DW_AT_high_pc + .quad _start # DW_AT_low_pc + .long .L_start_end-_start # DW_AT_high_pc .Ldebug_info_end0: .section .debug_line,"",@progbits @@ -75,7 +96,7 @@ .byte 0 .Lprologue1_end: .byte 0, 9, 2 # DW_LNE_set_address - .quad -1 + .quad TOMBSTONE .byte 1 # DW_LNS_copy .byte 33 # address += 1, line += 1 .byte 33 # address += 1, line += 1 @@ -97,7 +118,7 @@ .byte 0, 1, 1 # DW_LNE_end_sequence .byte 0, 9, 2 # DW_LNE_set_address - .quad main-.text + .quad _start .byte 18 # address += 0, line += 0 .byte 2 # DW_LNS_advance_pc .uleb128 1 Index: lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp =================================================================== --- lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -1039,7 +1039,10 @@ std::vector<std::unique_ptr<LineSequence>> sequences; // The Sequences view contains only valid line sequences. Don't iterate over // the Rows directly. + SectionList &list = *GetObjectFile()->GetModule()->GetSectionList(); for (const llvm::DWARFDebugLine::Sequence &seq : line_table->Sequences) { + if (!list.ContainsFileAddressRange(seq.LowPC, seq.HighPC - seq.LowPC)) + continue; std::unique_ptr<LineSequence> sequence = LineTable::CreateLineSequenceContainer(); for (unsigned idx = seq.FirstRowIndex; idx < seq.LastRowIndex; ++idx) {
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits