From 8818c8771eacaad7e6f5fcf2437f3541501e8378 Mon Sep 17 00:00:00 2001 From: Felipe de Azevedo Piovezan Date: Thu, 8 Feb 2024 16:48:04 -0800 Subject: [PATCH] [DWARFVerifier] Fix verification of empty line tables (#81162) A line table whose sole entry is an end sequence should not have the entry's file index verified, as that value corresponds to the initial value of the state machine, not to a real file index. In DWARF 5, this is particularly problematic as it uses 0-based indexing, and the state machine specifies a starting index of 1; in other words, you'd need to have _two_ files before such index became legal "by default". A previous attempt to fix this problem was done [1], but it was too specific in its condition, and did not capture all possible cases where this issue can happen. [1]: https://github.com/llvm/llvm-project/pull/77004 (cherry picked from commit 1d4fc381d3da4317cc2cfa59b2d59d53decddf71) --- llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp | 13 ++--- .../X86/verify_empty_debug_line_sequence.yaml | 55 +++++++++++++++++++ 2 files changed, 61 insertions(+), 7 deletions(-) create mode 100644 llvm/test/tools/llvm-dwarfdump/X86/verify_empty_debug_line_sequence.yaml diff --git a/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp b/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp index c4c14f5e2c9d3..5587e3725dec9 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp @@ -921,6 +921,11 @@ void DWARFVerifier::verifyDebugLineRows() { FileIndex++; } + // Nothing to verify in a line table with a single row containing the end + // sequence. + if (LineTable->Rows.size() == 1 && LineTable->Rows.front().EndSequence) + continue; + // Verify rows. uint64_t PrevAddress = 0; uint32_t RowIndex = 0; @@ -941,13 +946,7 @@ void DWARFVerifier::verifyDebugLineRows() { OS << '\n'; } - // If the prologue contains no file names and the line table has only one - // row, do not verify the file index, this is a line table of an empty - // file with an end_sequence, but the DWARF standard sets the file number - // to 1 by default, otherwise verify file index. - if ((LineTable->Prologue.FileNames.size() || - LineTable->Rows.size() != 1) && - !LineTable->hasFileAtIndex(Row.File)) { + if (!LineTable->hasFileAtIndex(Row.File)) { ++NumDebugLineErrors; error() << ".debug_line[" << format("0x%08" PRIx64, diff --git a/llvm/test/tools/llvm-dwarfdump/X86/verify_empty_debug_line_sequence.yaml b/llvm/test/tools/llvm-dwarfdump/X86/verify_empty_debug_line_sequence.yaml new file mode 100644 index 0000000000000..1bab2c205cd55 --- /dev/null +++ b/llvm/test/tools/llvm-dwarfdump/X86/verify_empty_debug_line_sequence.yaml @@ -0,0 +1,55 @@ +# RUN: yaml2obj %s -o %t.o +# RUN: llvm-dwarfdump -debug-line -verify %t.o | FileCheck %s + +# CHECK: Verifying .debug_line... +# CHECK: No errors + +# In a line table like the one below, with no rows (other than the +# end_sequence), we should never verify the file index because the state +# machine initializes the file index to 1, which is invalid in DWARF 5 due to +# its 0-based indexing. + +# file_names[ 0]: +# name: "/home/umb/tests_2018/106_rnglists2" +# dir_index: 0 +# Address Line Column File ISA Discriminator OpIndex Flags +# ------------------ ------ ------ ------ --- ------------- ------- ------------- +# 0x0000000000000000 1 0 1 0 0 0 is_stmt end_sequence + + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC +DWARF: + debug_abbrev: + - ID: 0 + Table: + - Code: 0x1 + Tag: DW_TAG_compile_unit + Children: DW_CHILDREN_no + Attributes: + - Attribute: DW_AT_stmt_list + Form: DW_FORM_sec_offset + debug_info: + - Length: 0xd + Version: 5 + UnitType: DW_UT_compile + AbbrevTableID: 0 + AbbrOffset: 0x0 + AddrSize: 8 + Entries: + - AbbrCode: 0x1 + Values: + - Value: 0x0 +Sections: + - Name: .debug_line + Type: SHT_PROGBITS + AddressAlign: 0x1 + Content: 300000000500080025000000010101fb0e0d00010101010000000100000101011f010000000002011f020b010000000000000101 + - Name: .debug_line_str + Type: SHT_PROGBITS + Flags: [ SHF_MERGE, SHF_STRINGS ] + AddressAlign: 0x1 + Content: 2F686F6D652F756D622F74657374735F323031382F3130365F726E676C697374733200746573742E63707000