aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog7
-rw-r--r--gdb/NEWS3
-rw-r--r--gdb/doc/ChangeLog5
-rw-r--r--gdb/doc/gdb.texinfo9
-rw-r--r--gdb/symmisc.c90
-rw-r--r--gdb/testsuite/ChangeLog4
-rw-r--r--gdb/testsuite/gdb.base/maint.exp20
7 files changed, 138 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index febe960..6eeb1e2 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,10 @@
+2016-03-11 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * symmisc.c (maintenance_info_line_tables): New function.
+ (maintenance_print_one_line_table): New function.
+ (_initialize_symmisc): Register 'maint info line-table' command.
+ * NEWS: Mention new command.
+
2016-03-11 Marcin Koƛcielnicki <koriakin@0x04.net>
* s390-linux-tdep.c (s390_ax_pseudo_register_collect): New function.
diff --git a/gdb/NEWS b/gdb/NEWS
index 55b56b0..928f70c 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -31,6 +31,9 @@ skip -rfunction regular-expression
glob-style file names and regular expressions for function names.
Additionally, a file spec and a function spec may now be combined.
+maint info line-table REGEXP
+ Display the contents of GDB's internal line table data struture.
+
*** Changes in GDB 7.11
* GDB now supports debugging kernel-based threads on FreeBSD.
diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog
index 3a98647..3d49085 100644
--- a/gdb/doc/ChangeLog
+++ b/gdb/doc/ChangeLog
@@ -1,3 +1,8 @@
+2016-03-11 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * gdb.texinfo (Symbols): Document new 'maint info line-table'
+ command.
+
2016-03-10 Simon Marchi <simon.marchi@polymtl.ca>
* gdb.texinfo (Convenience Functions): Document $_as_string.
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 0b249f4..bf7df35 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -17175,6 +17175,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 @r{[} @var{regexp} @r{]}
+
+List the @code{struct linetable} from all @code{struct symtab}
+instances whose name matches @var{regexp}. If @var{regexp} is not
+given, list the @code{struct linetable} from all @code{struct symtab}.
+
@kindex maint set symbol-cache-size
@cindex symbol cache size
@item maint set symbol-cache-size @var{size}
diff --git a/gdb/symmisc.c b/gdb/symmisc.c
index 69b7e8e..88daf09 100644
--- a/gdb/symmisc.c
+++ b/gdb/symmisc.c
@@ -949,6 +949,90 @@ block_depth (struct block *block)
}
+/* Used by MAINTENANCE_INFO_LINE_TABLES to print the information about a
+ single line table. */
+
+static int
+maintenance_print_one_line_table (struct symtab *symtab, void *data)
+{
+ struct linetable *linetable;
+ struct objfile *objfile;
+
+ objfile = symtab->compunit_symtab->objfile;
+ printf_filtered (_("objfile: %s ((struct objfile *) %s)\n"),
+ objfile_name (objfile),
+ host_address_to_string (objfile));
+ printf_filtered (_("compunit_symtab: ((struct compunit_symtab *) %s)\n"),
+ host_address_to_string (symtab->compunit_symtab));
+ printf_filtered (_("symtab: %s ((struct symtab *) %s)\n"),
+ symtab_to_fullname (symtab),
+ host_address_to_string (symtab));
+ linetable = SYMTAB_LINETABLE (symtab);
+ printf_filtered (_("linetable: ((struct linetable *) %s):\n"),
+ host_address_to_string (linetable));
+
+ if (linetable == NULL)
+ printf_filtered (_("No line table.\n"));
+ else if (linetable->nitems <= 0)
+ printf_filtered (_("Line table has no lines.\n"));
+ else
+ {
+ int i;
+
+ /* Leave space for 6 digits of index and line number. After that the
+ tables will just not format as well. */
+ printf_filtered (_("%-6s %6s %s\n"),
+ _("INDEX"), _("LINE"), _("ADDRESS"));
+
+ for (i = 0; i < linetable->nitems; ++i)
+ {
+ struct linetable_entry *item;
+ struct cleanup *row_cleanup;
+
+ item = &linetable->item [i];
+ printf_filtered (_("%-6d %6d %s\n"), i, item->line,
+ core_addr_to_string (item->pc));
+ }
+ }
+
+ return 0;
+}
+
+/* Implement the 'maint info line-table' command. */
+
+static void
+maintenance_info_line_tables (char *regexp, int from_tty)
+{
+ struct program_space *pspace;
+ struct objfile *objfile;
+
+ dont_repeat ();
+
+ if (regexp != NULL)
+ re_comp (regexp);
+
+ ALL_PSPACES (pspace)
+ ALL_PSPACE_OBJFILES (pspace, objfile)
+ {
+ struct compunit_symtab *cust;
+ struct symtab *symtab;
+
+ ALL_OBJFILE_COMPUNITS (objfile, cust)
+ {
+ ALL_COMPUNIT_FILETABS (cust, symtab)
+ {
+ QUIT;
+
+ if (regexp == NULL
+ || re_exec (symtab_to_filename_for_display (symtab)))
+ maintenance_print_one_line_table (symtab, NULL);
+ }
+ }
+ }
+}
+
+
+
/* Do early runtime initializations. */
void
@@ -982,6 +1066,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 the contents of all line tables, from all symbol tables.\n\
+With an argument REGEXP, list just the line tables for the symbol\n\
+tables with matching names."),
+ &maintenanceinfolist);
+
add_cmd ("check-symtabs", class_maintenance, maintenance_check_symtabs,
_("\
Check consistency of currently expanded symtabs."),
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 411081c..625359f 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2016-03-11 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * gdb.base/maint.exp: New tests for 'maint info line-table'.
+
2016-03-10 Simon Marchi <simon.marchi@polymtl.ca>
* gdb.python/py-as-string.exp: New file.
diff --git a/gdb/testsuite/gdb.base/maint.exp b/gdb/testsuite/gdb.base/maint.exp
index 79924a7..f926c8b 100644
--- a/gdb/testsuite/gdb.base/maint.exp
+++ b/gdb/testsuite/gdb.base/maint.exp
@@ -471,6 +471,26 @@ 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" \
+ "symtab: \[^\n\r\]+${srcfile}.*\\(\\(struct symtab \\*\\) $hex\\)\r\nlinetable: \\(\\(struct linetable \\*\\) $hex\\):\r\nINDEX.*LINE.*ADDRESS.*" \
+ "maint info line-table w/o a file name"
+
+gdb_test "maint info line-table ${srcfile}" \
+ "symtab: \[^\n\r\]+${srcfile}.*INDEX.*LINE.*ADDRESS.*" \
+ "maint info line-table with filename of current symtab"
+
+gdb_test_no_output "maint info line-table ${srcfile2}" \
+ "maint info line-table with filename of symtab that is not currently expanded"
+
+gdb_test_no_output "maint expand-symtabs"
+
+gdb_test "maint info line-table ${srcfile2}" \
+ "symtab: \[^\n\r\]+${srcfile2}.*INDEX.*LINE.*ADDRESS.*" \
+ "maint info line-table with filename of symtab that is not current"
+
+gdb_test_no_output "maint info line-table xxx.c" \
+ "maint info line-table with invalid filename"
+
set timeout $oldtimeout
#============test help on maint commands