aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog9
-rw-r--r--gdb/dwarf2read.c8
-rw-r--r--gdb/symmisc.c8
-rw-r--r--gdb/testsuite/ChangeLog5
-rw-r--r--gdb/testsuite/gdb.base/maint.exp20
-rw-r--r--gdb/testsuite/gdb.dwarf2/dw2-ranges-base.exp22
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
+ }
+ }