Skip to content

Commit

Permalink
[dwarfdump] Fix .debug_line verification for DWARF 5
Browse files Browse the repository at this point in the history
DWARF 5 uses a 0-based index while previous versions use a 1-based
index. Fix the verifier and add a test.

Differential revision: https://reviews.llvm.org/D147202
  • Loading branch information
JDevlieghere committed Mar 31, 2023
1 parent f080f11 commit 031e4e5
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 3 deletions.
7 changes: 4 additions & 3 deletions llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -868,8 +868,10 @@ void DWARFVerifier::verifyDebugLineRows() {
continue;

// Verify prologue.
bool isDWARF5 = LineTable->Prologue.getVersion() >= 5;
uint32_t MaxDirIndex = LineTable->Prologue.IncludeDirectories.size();
uint32_t FileIndex = 1;
uint32_t MinFileIndex = isDWARF5 ? 0 : 1;
uint32_t FileIndex = MinFileIndex;
StringMap<uint16_t> FullPathMap;
for (const auto &FileName : LineTable->Prologue.FileNames) {
// Verify directory index.
Expand Down Expand Up @@ -927,12 +929,11 @@ void DWARFVerifier::verifyDebugLineRows() {
// Verify file index.
if (!LineTable->hasFileAtIndex(Row.File)) {
++NumDebugLineErrors;
bool isDWARF5 = LineTable->Prologue.getVersion() >= 5;
error() << ".debug_line["
<< format("0x%08" PRIx64,
*toSectionOffset(Die.find(DW_AT_stmt_list)))
<< "][" << RowIndex << "] has invalid file index " << Row.File
<< " (valid values are [" << (isDWARF5 ? "0," : "1,")
<< " (valid values are [" << MinFileIndex << ','
<< LineTable->Prologue.FileNames.size()
<< (isDWARF5 ? ")" : "]") << "):\n";
DWARFDebugLine::Row::dumpTableHeader(OS, 0);
Expand Down
48 changes: 48 additions & 0 deletions llvm/test/tools/llvm-dwarfdump/X86/verify_dwarf5_debug_line.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# RUN: llvm-mc %s -filetype obj -triple x86_64-unknown-linux-gnu -o %t.out
# RUN: llvm-dwarfdump --verbose -verify %t.out | FileCheck %s

# CHECK: Verifying .debug_line...

.text
.file "dwarf5.c"
.globl main # -- Begin function main
.p2align 4, 0x90
.type main,@function
main: # @main
.Lfunc_begin0:
.file 0 "/tmp" "dwarf5.c" md5 0xa6f6c381b31c93c579beac58181f5d01
.loc 0 1 0 # dwarf5.c:1:0
.cfi_startproc
# %bb.0: # %entry
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset %rbp, -16
movq %rsp, %rbp
.cfi_def_cfa_register %rbp
movl $0, -4(%rbp)
movl %edi, -8(%rbp)
movq %rsi, -16(%rbp)
.Ltmp0:
.loc 0 2 3 prologue_end # dwarf5.c:2:3
xorl %eax, %eax
.loc 0 2 3 epilogue_begin is_stmt 0 # dwarf5.c:2:3
popq %rbp
.cfi_def_cfa %rsp, 8
retq
.Ltmp1:
.Lfunc_end0:
.size main, .Lfunc_end0-main
.cfi_endproc
# -- End function
.Linfo_string0:
.asciz "clang version 17.0.0" # string offset=0
.Linfo_string1:
.asciz "dwarf5.c" # string offset=101
.Linfo_string2:
.asciz "/tmp" # string offset=110
.section .debug_str_offsets,"",@progbits
.long .Linfo_string0
.long .Linfo_string1
.long .Linfo_string2
.ident "clang version 17.0.0"
.Lline_table_start0:

0 comments on commit 031e4e5

Please sign in to comment.