diff options
-rw-r--r-- | gdb/ChangeLog | 9 | ||||
-rw-r--r-- | gdb/dwarf2read.c | 8 | ||||
-rw-r--r-- | gdb/symmisc.c | 8 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/maint.exp | 20 | ||||
-rw-r--r-- | gdb/testsuite/gdb.dwarf2/dw2-ranges-base.exp | 22 |
6 files changed, 61 insertions, 11 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 16d16ef..82eea32 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2020-01-24 Andrew Burgess <andrew.burgess@embecosm.com> + + * dwarf2read.c (lnp_state_machine::record_line): Include + end_sequence parameter in debug print out. Record the line if we + are at an end_sequence marker even if it's not the start of a + statement. + * symmisc.c (maintenance_print_one_line_table): Print end of + sequence markers with 'END' not '0'. + 2020-01-24 Pedro Alves <palves@redhat.com> PR gdb/25410 diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index a494db7..a81a77a 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -21314,10 +21314,11 @@ lnp_state_machine::record_line (bool end_sequence) { fprintf_unfiltered (gdb_stdlog, "Processing actual line %u: file %u," - " address %s, is_stmt %u, discrim %u\n", + " address %s, is_stmt %u, discrim %u%s\n", m_line, m_file, paddress (m_gdbarch, m_address), - m_is_stmt, m_discriminator); + m_is_stmt, m_discriminator, + (end_sequence ? "\t(end sequence)" : "")); } file_entry *fe = current_file (); @@ -21330,7 +21331,8 @@ lnp_state_machine::record_line (bool end_sequence) else if (m_op_index == 0 || end_sequence) { fe->included_p = 1; - if (m_record_lines_p && (producer_is_codewarrior (m_cu) || m_is_stmt)) + if (m_record_lines_p + && (producer_is_codewarrior (m_cu) || m_is_stmt || end_sequence)) { if (m_last_subfile != m_cu->get_builder ()->get_current_subfile () || end_sequence) diff --git a/gdb/symmisc.c b/gdb/symmisc.c index 393a034..a6a7e72 100644 --- a/gdb/symmisc.c +++ b/gdb/symmisc.c @@ -999,8 +999,12 @@ maintenance_print_one_line_table (struct symtab *symtab, void *data) struct linetable_entry *item; item = &linetable->item [i]; - printf_filtered (_("%-6d %6d %s\n"), i, item->line, - core_addr_to_string (item->pc)); + printf_filtered ("%-6d ", i); + if (item->line > 0) + printf_filtered ("%6d ", item->line); + else + printf_filtered ("%6s ", _("END")); + printf_filtered ("%s\n", core_addr_to_string (item->pc)); } } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 81500c2..1a1bc44 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-01-24 Andrew Burgess <andrew.burgess@embecosm.com> + + * gdb.base/maint.exp: Update line table parsing test. + * gdb.dwarf2/dw2-ranges-base.exp: Add new line table parsing test. + 2020-01-24 Pedro Alves <palves@redhat.com> PR gdb/25410 diff --git a/gdb/testsuite/gdb.base/maint.exp b/gdb/testsuite/gdb.base/maint.exp index f389b6a..fe25e0f 100644 --- a/gdb/testsuite/gdb.base/maint.exp +++ b/gdb/testsuite/gdb.base/maint.exp @@ -508,8 +508,8 @@ gdb_test "maint" \ # Test that "main info line-table" w/o a file name shows the symtab for # $srcfile. set saw_srcfile 0 -set test "maint info line-table w/o a file name" -gdb_test_multiple "maint info line-table" $test { +gdb_test_multiple "maint info line-table" \ + "maint info line-table w/o a file name" { -re "symtab: \[^\n\r\]+${srcfile} \\(\\(struct symtab \\*\\) $hex\\)\r\nlinetable: \\(\\(struct linetable \\*\\) $hex\\):\r\nINDEX\[ \t\]+LINE\[ \t\]+ADDRESS" { set saw_srcfile 1 exp_continue @@ -518,7 +518,11 @@ gdb_test_multiple "maint info line-table" $test { # Match each symtab to avoid overflowing expect's buffer. exp_continue } - -re "$decimal\[ \t\]+$decimal\[ \t\]+$hex\r\n" { + -re "symtab: \[^\n\r\]+ \\(\\(struct symtab \\*\\) $hex\\)\r\nlinetable: \\(\\(struct linetable \\*\\) 0x0\\):\r\nNo line table.\r\n" { + # For symtabs with no linetable. + exp_continue + } + -re "^$decimal\[ \t\]+$decimal\[ \t\]+$hex\r\n" { # Line table entries can be long too: # # INDEX LINE ADDRESS @@ -531,13 +535,17 @@ gdb_test_multiple "maint info line-table" $test { # 6 45 0x0000000000400740 # (...) # 454 129 0x00007ffff7df1d28 - # 455 0 0x00007ffff7df1d3f + # 455 END 0x00007ffff7df1d3f # # Match each line to avoid overflowing expect's buffer. exp_continue } - -re "$gdb_prompt $" { - gdb_assert $saw_srcfile $test + -re "^$decimal\[ \t\]+END\[ \t\]+$hex\r\n" { + # Matches an end marker in the above. + exp_continue + } + -re "^$gdb_prompt $" { + gdb_assert $saw_srcfile $gdb_test_name } } diff --git a/gdb/testsuite/gdb.dwarf2/dw2-ranges-base.exp b/gdb/testsuite/gdb.dwarf2/dw2-ranges-base.exp index f46edf0..3317733 100644 --- a/gdb/testsuite/gdb.dwarf2/dw2-ranges-base.exp +++ b/gdb/testsuite/gdb.dwarf2/dw2-ranges-base.exp @@ -141,3 +141,25 @@ gdb_test "info line frame2" \ "Line 21 of .* starts at address .* and ends at .*" gdb_test "info line frame3" \ "Line 31 of .* starts at address .* and ends at .*" + +# Ensure that the line table correctly tracks the end of sequence markers. +set end_seq_count 0 +gdb_test_multiple "maint info line-table" \ + "count END markers in line table" { + -re "^$decimal\[ \t\]+$decimal\[ \t\]+$hex\r\n" { + exp_continue + } + -re "^$decimal\[ \t\]+END\[ \t\]+$hex\r\n" { + incr end_seq_count + exp_continue + } + -re "^$gdb_prompt $" { + gdb_assert [expr $end_seq_count == 3] $gdb_test_name + } + -re ".*linetable: \\(\\(struct linetable \\*\\) 0x0\\):\r\nNo line table.\r\n" { + exp_continue + } + -re ".*linetable: \\(\\(struct linetable \\*\\) $hex\\):\r\nINDEX\[ \t\]+LINE\[ \t\]+ADDRESS\r\n" { + exp_continue + } + } |