From patchwork Sun Feb 21 00:06:52 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Andrew Burgess X-Patchwork-Id: 10972 Received: (qmail 63766 invoked by alias); 21 Feb 2016 00:07:11 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 63742 invoked by uid 89); 21 Feb 2016 00:07:09 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.6 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_LOW autolearn=ham version=3.3.2 spammy=sk:symbol, structured, Symbol, reworked X-HELO: mail-wm0-f53.google.com Received: from mail-wm0-f53.google.com (HELO mail-wm0-f53.google.com) (74.125.82.53) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Sun, 21 Feb 2016 00:07:07 +0000 Received: by mail-wm0-f53.google.com with SMTP id g62so117645396wme.0 for ; Sat, 20 Feb 2016 16:07:06 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-type:content-disposition :content-transfer-encoding:in-reply-to:user-agent; bh=VS3p9mwU9a7BOIKE2Wb7tF28z6oZOVRXKot9rDYjcx8=; b=Unve7996nUd1lvDwXXY3F2Aa3yjWZGR6y9v+MbMX1mLMQrLW4TrXfB7q+b47VD4L4K KM4Qu+fQVSpulFR9OYAtZXJ3QTmV3PW6qgatHlm1DjWAS15qLP0yEgcFC5GKMcAAYKHV +0bI+k6zzzVORPtx9HzPoQIASex4Kq6rw9FREeBJRYEtRWf1P5Slj48rPXXungFO4yqc JcXfcR8waoMpgPnIORLjM/PD/v9P2W8Zefa++E+plP2l8uK70i4tXs7mfH66PuufTugL jZVM3ftc1lVSAi2EOg5F7sm28JAKzvgH45Asb9hTAQ/LD3jeoNojwTXyMhNcXGf6Zy9X 8+NA== X-Gm-Message-State: AG10YOSqZZHX7mNNdg6pQpY9xhnyYWv6oT8TL0Q/lCD5U63UALUGt4YaGxfXwO/gEn6LDQ== X-Received: by 10.194.83.134 with SMTP id q6mr6920145wjy.131.1456013224358; Sat, 20 Feb 2016 16:07:04 -0800 (PST) Received: from localhost (host86-138-93-46.range86-138.btcentralplus.com. [86.138.93.46]) by smtp.gmail.com with ESMTPSA id j18sm14195017wmd.2.2016.02.20.16.07.02 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 20 Feb 2016 16:07:03 -0800 (PST) Date: Sun, 21 Feb 2016 00:06:52 +0000 From: Andrew Burgess To: Pedro Alves Cc: gdb-patches@sourceware.org Subject: Re: [PATCH] gdb: New maint info line-table command. Message-ID: <20160221000652.GA15799@embecosm.com> References: <56C4572A.9090300@redhat.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <56C4572A.9090300@redhat.com> X-Editor: GNU Emacs [ http://www.gnu.org/software/emacs ] User-Agent: Mutt/1.5.24 (2015-08-30) X-IsSubscribed: yes * Pedro Alves [2016-02-17 11:19:06 +0000]: > Given this is a maint command, I'm fine with it as is. > > I have a few suggestions below though. > > On 02/06/2016 10:16 PM, Andrew Burgess wrote: > > > +/* 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); > > Given there may be multiple symtabs with the same file name, I'd think it > better if this printed information on all symtabs that matched. > > Basically, move the line table printing to a helper function, and then > use iterate_over_symtabs instead of lookup_symtab. > > > + 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)); > > Seems odd for these to be errors. Consider a gdb script or user-command > that does: > > maint info line-table > maint info symtabs > > If there's no line table, should the whole script error out, or just > print that as info? I think the latter. > > > + > > + ui_out_text (uiout, "Line table for `"); > > + ui_out_text (uiout, symtab_to_filename_for_display (symtab)); > > + ui_out_text (uiout, "':\n"); > > (It'd probably be useful to also show the full name, to be sure you're > looking at the symtab you think you're looking at.) I've reworked the patch to, I hope, follow your suggestions. I now follow the same pattern as for 'maint info symtabs', so I take a regexp, and list line tables for symtabs matching the regexp, or all symtabs if not regexp is given. This does mean, that like 'maint info symtabs' you need to use 'maint expand-symtabs' if you want to see all line tables, but that seems acceptable. I've dropped the use of ui_out_* style functions in favour of just printf_filtered, this is inline with the other maintenance function. I don't know if that's OK, or if you'd rather that maintenance commands switch to the more structured output. The only downside to this change that I miss is the feature of being able to quickly display the information for the current symtab; this is probably how I use this sort of information the most, gdb does something strange and I want to figure out what the internal state is for where I am in the program right now. I might add some short-cut mechanism (a special regexp pattern maybe) that does this.... but if I do, that will come later. How's this version? Thanks, Andrew --- Add a new command 'maint info line-table' to display the contents of GDB's internal line table structure. Useful when trying to understand problems (within gdb) relating to line tables. gdb/ChangeLog: * 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. gdb/doc/ChangeLog: * gdb.texinfo (Symbols): Document new 'maint info line-table' command. gdb/testsuite/ChangeLog: * gdb.base/maint.exp: New tests for 'maint info line-table'. --- gdb/ChangeLog | 7 ++++ gdb/NEWS | 3 ++ gdb/doc/ChangeLog | 5 +++ gdb/doc/gdb.texinfo | 9 ++++ gdb/symmisc.c | 90 ++++++++++++++++++++++++++++++++++++++++ gdb/testsuite/ChangeLog | 4 ++ gdb/testsuite/gdb.base/maint.exp | 20 +++++++++ 7 files changed, 138 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 274d98b..9e7f6d5 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2016-02-06 Andrew Burgess + + * 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-02-18 Marcin Kościelnicki * s390-linux-tdep.c (s390_guess_tracepoint_registers): New function. diff --git a/gdb/NEWS b/gdb/NEWS index 64c4869..22cd771 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -114,6 +114,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. diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 189dfdc..5b33e75 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,8 @@ +2016-02-06 Andrew Burgess + + * gdb.texinfo (Symbols): Document new 'maint info line-table' + command. + 2016-02-18 Walfred Tedeschi * gdb.texinfo (Signals): Add bound violation display hints for diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 5db7cf2..e36f73b 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -17093,6 +17093,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 each @code{struct symtab} 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..255c799 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) + 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 + || 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 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."), diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 5676cac..77cce58 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2016-02-06 Andrew Burgess + + * gdb.base/maint.exp: New tests for 'maint info line-table'. + 2016-02-18 Iain Buclaw * lib/future.exp: Add D support. 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