@@ -1,3 +1,9 @@
+2016-02-06 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * symmisc.c (maintenance_info_line_tables): New function.
+ (_initialize_symmisc): Register 'maint info line-table' command.
+ * NEWS: Mention new command.
+
2016-02-04 Yao Qi <yao.qi@linaro.org>
* remote.c (remote_wait_as): Set rs->waiting_for_stop_reply to
@@ -98,6 +98,9 @@ maint set bfd-sharing
maint show bfd-sharing
Control the reuse of bfd objects.
+maint info line-table FILENAME
+ Display the contents of GDB's internal line table data struture.
+
set debug bfd-cache
show debug bfd-cache
Control display of debugging info regarding bfd caching.
@@ -1,3 +1,8 @@
+2016-02-06 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * gdb.texinfo (Symbols): Document new 'maint info line-table'
+ command.
+
2016-02-01 Doug Evans <dje@google.com>
* gdb.texinfo (Value Sizes): Fix typo.
@@ -17066,6 +17066,15 @@ line 1574.
(@value{GDBP})
@end smallexample
+@kindex maint info line-table
+@cindex listing @value{GDBN}'s internal line tables
+@cindex line tables, listing @value{GDBN}'s internal
+@item maint info line-table @var{filename}
+
+List the @code{struct linetable} for the symtab with @var{filename}.
+If @var{filename} is not given then the the @code{struct linetable}
+that contains the current @var{pc} is given.
+
@kindex maint set symbol-cache-size
@cindex symbol cache size
@item maint set symbol-cache-size @var{size}
@@ -949,6 +949,84 @@ block_depth (struct block *block)
}
+/* Implement the 'maint info line-table' command. */
+
+static void
+maintenance_info_line_tables (char *arg, int from_tty)
+{
+ struct ui_out *uiout = current_uiout;
+ struct symtab *symtab = NULL;
+ struct linetable *linetable;
+ struct cleanup *table_cleanup;
+ int i;
+
+ if (arg != NULL)
+ symtab = lookup_symtab (arg);
+ else
+ {
+ struct frame_info *frame;
+ CORE_ADDR pc;
+
+ frame = get_selected_frame (_("No frame selected."));
+ pc = get_frame_address_in_block (frame);
+ symtab = find_pc_line_symtab (pc);
+ }
+
+ if (symtab == NULL)
+ {
+ if (arg)
+ error (_("No matching symbol table found for `%s'."), arg);
+ else
+ error (_("No matching symbol table found."));
+ }
+
+ linetable = SYMTAB_LINETABLE (symtab);
+ if (linetable == NULL)
+ error (_("Symbol table for `%s' has no line table."),
+ symtab_to_filename_for_display (symtab));
+ if (linetable->nitems <= 0)
+ error (_("Line table for symbol table `%s' has no lines"),
+ symtab_to_filename_for_display (symtab));
+
+ ui_out_text (uiout, "Line table for `");
+ ui_out_text (uiout, symtab_to_filename_for_display (symtab));
+ ui_out_text (uiout, "':\n");
+
+ table_cleanup
+ = make_cleanup_ui_out_table_begin_end (uiout, 3,
+ linetable->nitems,
+ "line-table");
+
+ /* Leave space for 6 digits of index and line number. After that the
+ tables will just not format as well. */
+ ui_out_table_header (uiout, 6, ui_left, "index", "INDEX");
+ ui_out_table_header (uiout, 6, ui_right, "line", "LINE");
+ ui_out_table_header (uiout, (sizeof (CORE_ADDR) * 2 + 2)
+ , ui_left, "address", "ADDRESS");
+ ui_out_table_body (uiout);
+
+ for (i = 0; i < linetable->nitems; ++i)
+ {
+ struct linetable_entry *item;
+ struct cleanup *row_cleanup;
+
+ item = &linetable->item [i];
+
+ row_cleanup
+ = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
+
+ ui_out_field_int (uiout, "index", i);
+ ui_out_field_int (uiout, "line", item->line);
+ ui_out_field_string (uiout, "address", core_addr_to_string (item->pc));
+
+ ui_out_text (uiout, "\n");
+ do_cleanups (row_cleanup);
+ }
+
+ do_cleanups (table_cleanup);
+}
+
+
/* Do early runtime initializations. */
void
@@ -982,6 +1060,12 @@ linetables --- just the symbol table structures themselves.\n\
With an argument REGEXP, list the symbol tables with matching names."),
&maintenanceinfolist);
+ add_cmd ("line-table", class_maintenance, maintenance_info_line_tables, _("\
+List line tables contents for specified symtab.\n\
+Given the filename of a symtab, list the contents of the\n\
+associated line table."),
+ &maintenanceinfolist);
+
add_cmd ("check-symtabs", class_maintenance, maintenance_check_symtabs,
_("\
Check consistency of currently expanded symtabs."),
@@ -1,3 +1,7 @@
+2016-02-06 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * gdb.base/maint.exp: New tests for 'maint info line-table'.
+
2016-02-04 Yao Qi <yao.qi@linaro.org>
* gdb.base/foll-exec-mode.c: Include limits.h.
@@ -471,6 +471,22 @@ gdb_test "maint" \
"\"maintenance\" must be followed by the name of a maintenance command\\.\r\nList.*unambiguous\\..*" \
"maint w/o args"
+gdb_test "maint info line-table" \
+ "Line table for `\[^\n\r\]+${srcfile}':.*INDEX.*LINE.*ADDRESS.*" \
+ "maint info line-table w/o a file name"
+
+gdb_test "maint info line-table ${srcfile}" \
+ "Line table for `\[^\n\r\]+${srcfile}':.*INDEX.*LINE.*ADDRESS.*" \
+ "maint info line-table with filename of current symtab"
+
+gdb_test "maint info line-table ${srcfile2}" \
+ "Line table for `\[^\n\r\]+${srcfile2}':.*INDEX.*LINE.*ADDRESS.*" \
+ "maint info line-table with filename of symtab that is not current"
+
+gdb_test "maint info line-table xxx.c" \
+ "No matching symbol table found for `.*'." \
+ "maint info line-table with invalid filename"
+
set timeout $oldtimeout
#============test help on maint commands