From ae328c30c0fc7c75aabae7a28cb59b1a0b8a660e Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Thu, 11 Apr 2019 02:02:44 +0000 Subject: [PATCH] [DWARF] Set discriminator to 0 for DW_LNS_copy Summary: Make DW_LNS_copy set the discriminator register to 0, to conform to DWARF 4 & 5: "Then it sets the discriminator register to 0, and sets the basic_block, prologue_end and epilogue_begin registers to false." Because all of DW_LNE_end_sequence, DN_LNS_copy, and special opcodes reset discriminator to 0, we can move discriminator=0 to appendRowToMatrix. Also, make DW_LNS_copy print before appending the row, as it is similar to a address+=0,line+=0 special opcode, which prints before appending the row. Reviewers: dblaikie, probinson, aprantl Reviewed By: dblaikie Subscribers: danielcdh, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D60364 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@358148 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/DebugInfo/DWARF/DWARFDebugLine.cpp | 8 ++-- .../X86/debug-line-dw-lns-copy.s | 47 +++++++++++++++++++ 2 files changed, 50 insertions(+), 5 deletions(-) create mode 100644 test/tools/llvm-dwarfdump/X86/debug-line-dw-lns-copy.s diff --git a/lib/DebugInfo/DWARF/DWARFDebugLine.cpp b/lib/DebugInfo/DWARF/DWARFDebugLine.cpp index 9a720651ebb..8299be38ac6 100644 --- a/lib/DebugInfo/DWARF/DWARFDebugLine.cpp +++ b/lib/DebugInfo/DWARF/DWARFDebugLine.cpp @@ -347,6 +347,7 @@ Error DWARFDebugLine::Prologue::parse(const DWARFDataExtractor &DebugLineData, DWARFDebugLine::Row::Row(bool DefaultIsStmt) { reset(DefaultIsStmt); } void DWARFDebugLine::Row::postAppend() { + Discriminator = 0; BasicBlock = false; PrologueEnd = false; EpilogueBegin = false; @@ -640,15 +641,14 @@ Error DWARFDebugLine::LineTable::parse( // Standard Opcodes case DW_LNS_copy: // Takes no arguments. Append a row to the matrix using the - // current values of the state-machine registers. Then set - // the basic_block register to false. - State.appendRowToMatrix(); + // current values of the state-machine registers. if (OS) { *OS << "\n"; OS->indent(12); State.Row.dump(*OS); *OS << "\n"; } + State.appendRowToMatrix(); break; case DW_LNS_advance_pc: @@ -828,8 +828,6 @@ Error DWARFDebugLine::LineTable::parse( } State.appendRowToMatrix(); - // Reset discriminator to 0. - State.Row.Discriminator = 0; } if(OS) *OS << "\n"; diff --git a/test/tools/llvm-dwarfdump/X86/debug-line-dw-lns-copy.s b/test/tools/llvm-dwarfdump/X86/debug-line-dw-lns-copy.s new file mode 100644 index 00000000000..c1c4f1a7787 --- /dev/null +++ b/test/tools/llvm-dwarfdump/X86/debug-line-dw-lns-copy.s @@ -0,0 +1,47 @@ +# RUN: llvm-mc -filetype obj -triple x86_64-pc-linux %s -o %t.o +# RUN: llvm-dwarfdump -debug-line %t.o | FileCheck %s + +# CHECK: Address Line Column File ISA Discriminator Flags +# CHECK-NEXT: ------------------ ------ ------ ------ --- ------------- ------------- +# CHECK-NEXT: 0x0000000000000000 1 0 1 0 1 is_stmt +# CHECK-NEXT: 0x0000000000000001 2 0 1 0 0 is_stmt +# CHECK-NEXT: 0x0000000000000001 2 0 1 0 0 is_stmt end_sequence + +.section .debug_line,"",@progbits +.Line_table_start0: + .long .Line_table_end0-.Line_table_start0-4 # Length of Unit + .short 5 # DWARF version number + .byte 8 # Address Size + .byte 0 # Segment Selector Size + .long .Line_table_header_end0-.Line_table_params0 # Length of Prologue +.Line_table_params0: + .byte 1 # Minimum Instruction Length + .byte 1 # Maximum Operations per Instruction + .byte 1 # Default is_stmt + .byte -5 # Line Base + .byte 14 # Line Range + .byte 13 # Opcode Base + .byte 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1 # Standard Opcode Lengths + # Directory table format + .byte 1 # One element per directory entry + .byte 1 # DW_LNCT_path + .byte 0x08 # DW_FORM_string + # Directory table entries + .byte 1 # 1 directory + .asciz "/tmp" + # File table format + .byte 2 # 2 elements per file entry + .byte 1 # DW_LNCT_path + .byte 0x08 # DW_FORM_string + .byte 2 # DW_LNCT_directory_index + .byte 0x0b # DW_FORM_data1 + # File table entries + .byte 1 # 1 file + .asciz "a.c" + .byte 0 +.Line_table_header_end0: + .byte 0,2,4,1 # DW_LNE_set_discriminator 1 + .byte 1 # DW_LNS_copy + .byte 33 # address += 1, line += 1 + .byte 0,1,1 # DW_LNE_end_sequence +.Line_table_end0: -- 2.50.1