From patchwork Thu Oct 31 23:06:07 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Simon Marchi (Code Review)" X-Patchwork-Id: 35548 Received: (qmail 91338 invoked by alias); 31 Oct 2019 23:06:17 -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 91325 invoked by uid 89); 31 Oct 2019 23:06:17 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.4 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, KAM_STOCKGEN autolearn=ham version=3.3.1 spammy=U*q, type_regexp, ALL_DOMAIN, search_domain X-HELO: mx1.osci.io Received: from polly.osci.io (HELO mx1.osci.io) (8.43.85.229) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 31 Oct 2019 23:06:14 +0000 Received: by mx1.osci.io (Postfix, from userid 994) id 4F3FD21063; Thu, 31 Oct 2019 19:06:12 -0400 (EDT) Received: from gnutoolchain-gerrit.osci.io (gnutoolchain-gerrit.osci.io [IPv6:2620:52:3:1:5054:ff:fe06:16ca]) by mx1.osci.io (Postfix) with ESMTP id B411320468; Thu, 31 Oct 2019 19:06:09 -0400 (EDT) Received: from localhost (localhost [127.0.0.1]) by gnutoolchain-gerrit.osci.io (Postfix) with ESMTP id 8993720AF6; Thu, 31 Oct 2019 19:06:09 -0400 (EDT) X-Gerrit-PatchSet: 2 Date: Thu, 31 Oct 2019 19:06:07 -0400 From: "Sourceware to Gerrit sync (Code Review)" To: Andrew Burgess , Tom Tromey , gdb-patches@sourceware.org Auto-Submitted: auto-generated X-Gerrit-MessageType: newpatchset Subject: [pushed] gdb/fortran: Add new 'info modules' command X-Gerrit-Change-Id: I2b781dd5a06bcad04620ccdc45f01a0f711adfad X-Gerrit-Change-Number: 261 X-Gerrit-ChangeURL: X-Gerrit-Commit: 59c35742fb785b1e454f45c2ace663000bf34f4c In-Reply-To: References: Reply-To: noreply@gnutoolchain-gerrit.osci.io, tromey@sourceware.org, andrew.burgess@embecosm.com, gdb-patches@sourceware.org MIME-Version: 1.0 Content-Disposition: inline User-Agent: Gerrit/3.0.3-75-g9005159e5d Message-Id: <20191031230609.8993720AF6@gnutoolchain-gerrit.osci.io> The original change was created by Andrew Burgess. Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/261 ...................................................................... gdb/fortran: Add new 'info modules' command Add a new command 'info modules' that lists all of the modules GDB knows about from the debug information. A module is a debugging entity in the DWARF defined with DW_TAG_module, currently Fortran is known to use this tag for its modules. I'm not aware of any other language that currently makes use of DW_TAG_module. The output style is similar to the 'info type' output: (gdb) info modules All defined modules: File info-types.f90: 16: mod1 24: mod2 (gdb) Where the user is told the file the module is defined in and, on the left hand side, the line number at which the module is defined along with the name of the module. This patch is a new implementation of an idea originally worked on by Mark O'Connor, Chris January, David Lecomber, and Xavier Oro from ARM. gdb/ChangeLog: * dwarf2read.c (dw2_symtab_iter_next): Handle MODULE_DOMAIN. (dw2_expand_marked_cus): Handle MODULES_DOMAIN. (dw2_debug_names_iterator::next): Handle MODULE_DOMAIN and MODULES_DOMAIN. (scan_partial_symbols): Only create partial module symbols for non declarations. * psymtab.c (recursively_search_psymtabs): Handle MODULE_DOMAIN and MODULES_DOMAIN. * symtab.c (search_domain_name): Likewise. (search_symbols): Likewise. (print_symbol_info): Likewise. (symtab_symbol_info): Likewise. (info_modules_command): New function. (_initialize_symtab): Register 'info modules' command. * symtab.h (enum search_domain): Add MODULES_DOMAIN. * NEWS: Mention new 'info modules' command. gdb/doc/ChangeLog: * gdb.texinfo (Symbols): Document new 'info modules' command. gdb/testsuite/ChangeLog: * gdb.fortran/info-modules.exp: New file. * gdb.fortran/info-types.exp: Build with new file. * gdb.fortran/info-types.f90: Include and use new module. * gdb.fortran/info-types-2.f90: New file. Change-Id: I2b781dd5a06bcad04620ccdc45f01a0f711adfad --- M gdb/ChangeLog M gdb/NEWS M gdb/doc/ChangeLog M gdb/doc/gdb.texinfo M gdb/dwarf2read.c M gdb/psymtab.c M gdb/symtab.c M gdb/symtab.h M gdb/testsuite/ChangeLog A gdb/testsuite/gdb.fortran/info-modules.exp A gdb/testsuite/gdb.fortran/info-types-2.f90 M gdb/testsuite/gdb.fortran/info-types.exp M gdb/testsuite/gdb.fortran/info-types.f90 13 files changed, 201 insertions(+), 9 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 9c97b82..6dca965 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,22 @@ +2019-10-31 Andrew Burgess + + * dwarf2read.c (dw2_symtab_iter_next): Handle MODULE_DOMAIN. + (dw2_expand_marked_cus): Handle MODULES_DOMAIN. + (dw2_debug_names_iterator::next): Handle MODULE_DOMAIN and + MODULES_DOMAIN. + (scan_partial_symbols): Only create partial module symbols for non + declarations. + * psymtab.c (recursively_search_psymtabs): Handle MODULE_DOMAIN + and MODULES_DOMAIN. + * symtab.c (search_domain_name): Likewise. + (search_symbols): Likewise. + (print_symbol_info): Likewise. + (symtab_symbol_info): Likewise. + (info_modules_command): New function. + (_initialize_symtab): Register 'info modules' command. + * symtab.h (enum search_domain): Add MODULES_DOMAIN. + * NEWS: Mention new 'info modules' command. + 2019-10-31 Philippe Waroquiers * NEWS: Mention $_gdb_setting, $_gdb_setting_str, $_gdb_maint_setting diff --git a/gdb/NEWS b/gdb/NEWS index ef21b5d..d46f709 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -159,6 +159,10 @@ 'frame', 'stepi'. The python frame filtering also respect this setting. The 'backtrace' '-frame-info' option can override this global setting. +info modules [-q] [REGEXP] + Return a list of Fortran modules matching REGEXP, or all modules if + no REGEXP is given. + * Changed commands help diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 4d3f755..52497a1 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,7 @@ +2019-10-31 Andrew Burgess + + * gdb.texinfo (Symbols): Document new 'info modules' command. + 2019-10-31 Philippe Waroquiers * gdb.texinfo (Convenience Funs): Document the new diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 7cf4141..ee06df2 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -18886,6 +18886,16 @@ is printed only if its name matches @var{regexp} and its type matches @var{type_regexp}. +@kindex info modules +@cindex modules +@item info modules @r{[}-q@r{]} @r{[}@var{regexp}@r{]} +List all Fortran modules in the program, or all modules matching the +optional regular expression @var{regexp}. + +The optional flag @samp{-q}, which stands for @samp{quiet}, disables +printing header information and messages explaining why no modules +have been printed. + @kindex info classes @cindex Objective-C, classes and selectors @item info classes diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index cac719a..0a7a033 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -4042,6 +4042,10 @@ if (symbol_kind != GDB_INDEX_SYMBOL_KIND_OTHER) continue; break; + case MODULE_DOMAIN: + if (symbol_kind != GDB_INDEX_SYMBOL_KIND_OTHER) + continue; + break; default: break; } @@ -5064,6 +5068,10 @@ if (symbol_kind != GDB_INDEX_SYMBOL_KIND_TYPE) continue; break; + case MODULES_DOMAIN: + if (symbol_kind != GDB_INDEX_SYMBOL_KIND_OTHER) + continue; + break; default: break; } @@ -5970,6 +5978,15 @@ goto again; } break; + case MODULE_DOMAIN: + switch (indexval.dwarf_tag) + { + case DW_TAG_module: + break; + default: + goto again; + } + break; default: break; } @@ -6006,6 +6023,14 @@ goto again; } break; + case MODULES_DOMAIN: + switch (indexval.dwarf_tag) + { + case DW_TAG_module: + break; + default: + goto again; + } default: break; } @@ -8733,7 +8758,8 @@ add_partial_namespace (pdi, lowpc, highpc, set_addrmap, cu); break; case DW_TAG_module: - add_partial_module (pdi, lowpc, highpc, set_addrmap, cu); + if (!pdi->is_declaration) + add_partial_module (pdi, lowpc, highpc, set_addrmap, cu); break; case DW_TAG_imported_unit: { diff --git a/gdb/psymtab.c b/gdb/psymtab.c index b30d29e..df10a75 100644 --- a/gdb/psymtab.c +++ b/gdb/psymtab.c @@ -1272,6 +1272,8 @@ QUIT; if ((domain == ALL_DOMAIN + || (domain == MODULES_DOMAIN + && (*psym)->domain == MODULE_DOMAIN) || (domain == VARIABLES_DOMAIN && (*psym)->aclass != LOC_TYPEDEF && (*psym)->aclass != LOC_BLOCK) diff --git a/gdb/symtab.c b/gdb/symtab.c index 060e676..4c14eda 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -299,6 +299,7 @@ case VARIABLES_DOMAIN: return "VARIABLES_DOMAIN"; case FUNCTIONS_DOMAIN: return "FUNCTIONS_DOMAIN"; case TYPES_DOMAIN: return "TYPES_DOMAIN"; + case MODULES_DOMAIN: return "MODULES_DOMAIN"; case ALL_DOMAIN: return "ALL_DOMAIN"; default: gdb_assert_not_reached ("bad search_domain"); } @@ -4482,7 +4483,7 @@ gdb::optional preg; gdb::optional treg; - gdb_assert (kind <= TYPES_DOMAIN); + gdb_assert (kind != ALL_DOMAIN); ourtype = types[kind]; ourtype2 = types2[kind]; @@ -4656,7 +4657,10 @@ sym))) || (kind == TYPES_DOMAIN && SYMBOL_CLASS (sym) == LOC_TYPEDEF - && SYMBOL_DOMAIN (sym) != MODULE_DOMAIN)))) + && SYMBOL_DOMAIN (sym) != MODULE_DOMAIN) + || (kind == MODULES_DOMAIN + && SYMBOL_DOMAIN (sym) == MODULE_DOMAIN + && SYMBOL_LINE (sym) != 0)))) { /* match */ result.emplace_back (i, sym); @@ -4787,6 +4791,11 @@ printf_filtered (";\n"); } + /* Printing of modules is currently done here, maybe at some future + point we might want a language specific method to print the module + symbol so that we can customise the output more. */ + else if (kind == MODULES_DOMAIN) + printf_filtered ("%s\n", SYMBOL_PRINT_NAME (sym)); } /* This help function for symtab_symbol_info() prints information @@ -4827,11 +4836,11 @@ const char *t_regexp, int from_tty) { static const char * const classnames[] = - {"variable", "function", "type"}; + {"variable", "function", "type", "module"}; const char *last_filename = ""; int first = 1; - gdb_assert (kind <= TYPES_DOMAIN); + gdb_assert (kind != ALL_DOMAIN); if (regexp != nullptr && *regexp == '\0') regexp = nullptr; @@ -5050,6 +5059,22 @@ symbol_completer (ignore, tracker, text, word); } +/* Implement the 'info modules' command. */ + +static void +info_modules_command (const char *args, int from_tty) +{ + info_types_options opts; + + auto grp = make_info_types_options_def_group (&opts); + gdb::option::process_options + (&args, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_OPERAND, grp); + if (args != nullptr && *args == '\0') + args = nullptr; + symtab_symbol_info (opts.quiet, true, args, MODULES_DOMAIN, NULL, + from_tty); +} + /* Breakpoint all functions matching regular expression. */ void @@ -6373,6 +6398,10 @@ c = add_info ("sources", info_sources_command, info_sources_help.c_str ()); set_cmd_completer_handle_brkchars (c, info_sources_command_completer); + c = add_info ("modules", info_modules_command, + _("All module names, or those matching REGEXP.")); + set_cmd_completer_handle_brkchars (c, info_types_command_completer); + add_com ("rbreak", class_breakpoint, rbreak_command, _("Set a breakpoint for all functions matching REGEXP.")); diff --git a/gdb/symtab.h b/gdb/symtab.h index 20c11d1..72d1c7f 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -831,8 +831,11 @@ /* All defined types */ TYPES_DOMAIN = 2, + /* All modules. */ + MODULES_DOMAIN = 3, + /* Any type. */ - ALL_DOMAIN = 3 + ALL_DOMAIN = 4 }; extern const char *search_domain_name (enum search_domain); diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 510a1e0..6514c07 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2019-10-31 Andrew Burgess + + * gdb.fortran/info-modules.exp: New file. + * gdb.fortran/info-types.exp: Build with new file. + * gdb.fortran/info-types.f90: Include and use new module. + * gdb.fortran/info-types-2.f90: New file. + 2019-10-31 Philippe Waroquiers * gdb.base/setshow.exp: Test $_gdb_setting and $_gdb_setting_str. diff --git a/gdb/testsuite/gdb.fortran/info-modules.exp b/gdb/testsuite/gdb.fortran/info-modules.exp new file mode 100644 index 0000000..f961d28 --- /dev/null +++ b/gdb/testsuite/gdb.fortran/info-modules.exp @@ -0,0 +1,66 @@ +# Copyright 2019 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# This file tests 'info modules'. + +load_lib "fortran.exp" + +if { [skip_fortran_tests] } { continue } + +standard_testfile info-types.f90 info-types-2.f90 + +if { [prepare_for_testing "failed to prepare" $testfile \ + [list $srcfile $srcfile2] {debug f90}] } { + return -1 +} + +if { ![runto MAIN__] } { + perror "Could not run to breakpoint `MAIN__'." + continue +} + +gdb_test "info modules" \ + [multi_line \ + "All defined modules:" \ + "" \ + "File .*${srcfile2}:" \ + "18:\[\t \]+mod2" \ + "" \ + "File .*${srcfile}:" \ + "16:\[\t \]+mod1" ] + +gdb_test "info modules 1" \ + [multi_line \ + "All modules matching regular expression \"1\":" \ + "" \ + "File .*${srcfile}:" \ + "16:\[\t \]+mod1" ] + +gdb_test "info modules 2" \ + [multi_line \ + "All modules matching regular expression \"2\":" \ + "" \ + "File .*${srcfile2}:" \ + "18:\[\t \]+mod2" ] + +gdb_test "info modules mod" \ + [multi_line \ + "All modules matching regular expression \"mod\":" \ + "" \ + "File .*${srcfile2}:" \ + "18:\[\t \]+mod2" \ + "" \ + "File .*${srcfile}:" \ + "16:\[\t \]+mod1" ] diff --git a/gdb/testsuite/gdb.fortran/info-types-2.f90 b/gdb/testsuite/gdb.fortran/info-types-2.f90 new file mode 100644 index 0000000..a404418 --- /dev/null +++ b/gdb/testsuite/gdb.fortran/info-types-2.f90 @@ -0,0 +1,20 @@ +! Copyright 2019 Free Software Foundation, Inc. +! +! This program is free software; you can redistribute it and/or modify +! it under the terms of the GNU General Public License as published by +! the Free Software Foundation; either version 2 of the License, or +! (at your option) any later version. +! +! This program is distributed in the hope that it will be useful, +! but WITHOUT ANY WARRANTY; without even the implied warranty of +! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +! GNU General Public License for more details. +! +! You should have received a copy of the GNU General Public License +! along with this program. If not, see . + +! Comment just to change the line number on which +! mod2 is defined. +module mod2 + integer :: mod2_var_1 = 123 +end module mod2 diff --git a/gdb/testsuite/gdb.fortran/info-types.exp b/gdb/testsuite/gdb.fortran/info-types.exp index 3064628..954e083 100644 --- a/gdb/testsuite/gdb.fortran/info-types.exp +++ b/gdb/testsuite/gdb.fortran/info-types.exp @@ -19,9 +19,10 @@ if { [skip_fortran_tests] } { continue } -standard_testfile .f90 +standard_testfile info-types.f90 info-types-2.f90 -if { [prepare_for_testing "failed to prepare" $testfile $srcfile {debug f90}] } { +if { [prepare_for_testing "failed to prepare" $testfile \ + [list $srcfile2 $srcfile] {debug f90}] } { return -1 } diff --git a/gdb/testsuite/gdb.fortran/info-types.f90 b/gdb/testsuite/gdb.fortran/info-types.f90 index 0e27e1d..ec52ef9 100644 --- a/gdb/testsuite/gdb.fortran/info-types.f90 +++ b/gdb/testsuite/gdb.fortran/info-types.f90 @@ -21,6 +21,7 @@ program info_types_test use mod1 + use mod2 type :: s1 integer :: a @@ -30,7 +31,7 @@ type (s1) :: var_a type (m1t1) :: var_b - var_a%a = 1 + var_a%a = 1 + mod2_var_1 var_b%b = 2 l = .FALSE. end program info_types_test