diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugLine.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugLine.h --- a/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugLine.h +++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugLine.h @@ -143,7 +143,7 @@ void reset(bool DefaultIsStmt); void dump(raw_ostream &OS) const; - static void dumpTableHeader(raw_ostream &OS); + static void dumpTableHeader(raw_ostream &OS, unsigned Indent); static bool orderByAddress(const Row &LHS, const Row &RHS) { return std::tie(LHS.Address.SectionIndex, LHS.Address.Address) < diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp --- a/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp @@ -460,10 +460,12 @@ EpilogueBegin = false; } -void DWARFDebugLine::Row::dumpTableHeader(raw_ostream &OS) { - OS << "Address Line Column File ISA Discriminator Flags\n" - << "------------------ ------ ------ ------ --- ------------- " - "-------------\n"; +void DWARFDebugLine::Row::dumpTableHeader(raw_ostream &OS, unsigned Indent) { + OS.indent(Indent) + << "Address Line Column File ISA Discriminator Flags\n"; + OS.indent(Indent) + << "------------------ ------ ------ ------ --- ------------- " + "-------------\n"; } void DWARFDebugLine::Row::dump(raw_ostream &OS) const { @@ -494,7 +496,7 @@ if (!Rows.empty()) { OS << '\n'; - Row::dumpTableHeader(OS); + Row::dumpTableHeader(OS, 0); for (const Row &R : Rows) { R.dump(OS); } @@ -735,9 +737,14 @@ Prologue.getAddressSize() == TableData.getAddressSize()); ParsingState State(this, DebugLineOffset, RecoverableErrorHandler); + bool HeaderPrinted = false; *OffsetPtr = DebugLineOffset + Prologue.getLength(); while (*OffsetPtr < EndOffset) { + if (OS && !HeaderPrinted) { + Row::dumpTableHeader(*OS, 12); + HeaderPrinted = true; + } if (OS) *OS << format("0x%08.08" PRIx64 ": ", *OffsetPtr); diff --git a/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp b/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp --- a/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp @@ -763,7 +763,7 @@ << "] row[" << RowIndex << "] decreases in address from previous row:\n"; - DWARFDebugLine::Row::dumpTableHeader(OS); + DWARFDebugLine::Row::dumpTableHeader(OS, 0); if (RowIndex > 0) LineTable->Rows[RowIndex - 1].dump(OS); Row.dump(OS); @@ -781,7 +781,7 @@ << " (valid values are [" << (isDWARF5 ? "0," : "1,") << LineTable->Prologue.FileNames.size() << (isDWARF5 ? ")" : "]") << "):\n"; - DWARFDebugLine::Row::dumpTableHeader(OS); + DWARFDebugLine::Row::dumpTableHeader(OS, 0); Row.dump(OS); OS << '\n'; } diff --git a/llvm/test/tools/llvm-dwarfdump/X86/debug_line_invalid.test b/llvm/test/tools/llvm-dwarfdump/X86/debug_line_invalid.test --- a/llvm/test/tools/llvm-dwarfdump/X86/debug_line_invalid.test +++ b/llvm/test/tools/llvm-dwarfdump/X86/debug_line_invalid.test @@ -38,7 +38,9 @@ # RUN: FileCheck %s --input-file=%t-malformed-off-last.err --check-prefix=ALL # FIRST: debug_line[0x00000000] -# VERBOSE: DW_LNE_set_address (0x000000000badbeef) +# VERBOSE: Address Line Column File ISA Discriminator Flags +# VERBOSE-NEXT: ------------------ ------ ------ ------ --- ------------- ------------- +# VERBOSE-NEXT: DW_LNE_set_address (0x000000000badbeef) # VERBOSE-NEXT: DW_LNE_end_sequence # FIRST: 0x000000000badbeef {{.*}} end_sequence # NOFIRST-NOT: debug_line[0x00000000] @@ -51,6 +53,7 @@ # RESERVED-NOT: prologue # RESERVED: warning: parsing line table prologue at offset 0x00000048: unsupported reserved unit length of value 0xfffffffe # RESERVED-NOT: prologue +# RESERVED-NOT: Address # FATAL-NOT: debug_line ## For non-fatal issues, the table data should be dumped: diff --git a/llvm/test/tools/llvm-dwarfdump/X86/verbose.test b/llvm/test/tools/llvm-dwarfdump/X86/verbose.test --- a/llvm/test/tools/llvm-dwarfdump/X86/verbose.test +++ b/llvm/test/tools/llvm-dwarfdump/X86/verbose.test @@ -1,25 +1,34 @@ -# RUN: llvm-mc %S/brief.s -filetype obj -triple x86_64-apple-darwin -o - \ -# RUN: | llvm-dwarfdump -v --debug-info --debug-line - \ -# RUN: | FileCheck %s +# RUN: llvm-mc %S/brief.s -filetype obj -triple x86_64-apple-darwin -o %t.o +# RUN: llvm-dwarfdump -v --debug-info --debug-line %t.o | \ +# RUN: FileCheck %s --match-full-lines --strict-whitespace -# CHECK-NOT: .debug_abbrev contents: +# CHECK-NOT:{{.*}} contents: -# CHECK: .debug_info contents: -# CHECK: DW_TAG_compile_unit [1] -# CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{.*}}] = "brief.c") -# CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{.*}}] = "main") -# CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{.*}}] = "int") +# CHECK:.debug_info contents: +# CHECK:0x0000000b: DW_TAG_compile_unit [1] * +# CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{.*}}] = "brief.c") +# CHECK:0x0000002a: DW_TAG_subprogram [2] +# CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{.*}}] = "main") +# CHECK:0x00000043: DW_TAG_base_type [3] +# CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{.*}}] = "int") -# CHECK: .debug_line contents: -# CHECK: 00 DW_LNE_set_address (0x0000000000000000) -# CHECK: 01 DW_LNS_copy -# CHECK: 0x0000000000000000 1 0 1 0 0 is_stmt -# CHECK: 05 DW_LNS_set_column (12) -# CHECK: 0a DW_LNS_set_prologue_end -# CHECK: 66 address += 6, line += 0 -# CHECK: 0x0000000000000006 1 12 1 0 0 is_stmt prologue_end -# CHECK: 02 DW_LNS_advance_pc (2) -# CHECK: 00 DW_LNE_end_sequence -# CHECK: 0x0000000000000008 1 12 1 0 0 is_stmt end_sequence -# -# CHECK-NOT: {{.*}} contents: +# CHECK:.debug_line contents: +# CHECK: length: 0x00000000 +# CHECK-NEXT: Address Line Column File ISA Discriminator Flags +# CHECK-NEXT: ------------------ ------ ------ ------ --- ------------- ------------- +# CHECK-NEXT:0x00000029: 00 DW_LNE_set_address (0x0000000000000000) +# CHECK-NEXT:0x00000034: 01 DW_LNS_copy +# CHECK-NEXT: 0x0000000000000000 1 0 1 0 0 is_stmt +# CHECK-EMPTY: +# CHECK-EMPTY: +# CHECK:0x00000035: 05 DW_LNS_set_column (12) +# CHECK-NEXT:0x00000037: 0a DW_LNS_set_prologue_end +# CHECK-NEXT:0x00000038: 66 address += 6, line += 0 +# CHECK-NEXT: 0x0000000000000006 1 12 1 0 0 is_stmt prologue_end +# CHECK-EMPTY: +# CHECK-NEXT:0x00000039: 02 DW_LNS_advance_pc (2) +# CHECK-NEXT:0x0000003b: 00 DW_LNE_end_sequence +# CHECK-NEXT: 0x0000000000000008 1 12 1 0 0 is_stmt end_sequence +# CHECK-EMPTY: + +# CHECK-NOT:{{.*}} contents: