[dwarfdump] Fix .debug_line verification for DWARF 5
authorJonas Devlieghere <jonas@devlieghere.com>
Fri, 31 Mar 2023 00:43:18 +0000 (17:43 -0700)
committerJonas Devlieghere <jonas@devlieghere.com>
Fri, 31 Mar 2023 16:29:35 +0000 (09:29 -0700)
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

llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp
llvm/test/tools/llvm-dwarfdump/X86/verify_dwarf5_debug_line.yaml [new file with mode: 0644]

index 1682e9a..797ae54 100644 (file)
@@ -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.
@@ -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);
diff --git a/llvm/test/tools/llvm-dwarfdump/X86/verify_dwarf5_debug_line.yaml b/llvm/test/tools/llvm-dwarfdump/X86/verify_dwarf5_debug_line.yaml
new file mode 100644 (file)
index 0000000..fc8771d
--- /dev/null
@@ -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: