+2019-10-31 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * 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 <philippe.waroquiers@skynet.be>
* NEWS: Mention $_gdb_setting, $_gdb_setting_str, $_gdb_maint_setting
'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
+2019-10-31 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * gdb.texinfo (Symbols): Document new 'info modules' command.
+
2019-10-31 Philippe Waroquiers <philippe.waroquiers@skynet.be>
* gdb.texinfo (Convenience Funs): Document the new
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
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;
}
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;
}
goto again;
}
break;
+ case MODULE_DOMAIN:
+ switch (indexval.dwarf_tag)
+ {
+ case DW_TAG_module:
+ break;
+ default:
+ goto again;
+ }
+ break;
default:
break;
}
goto again;
}
break;
+ case MODULES_DOMAIN:
+ switch (indexval.dwarf_tag)
+ {
+ case DW_TAG_module:
+ break;
+ default:
+ goto again;
+ }
default:
break;
}
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:
{
QUIT;
if ((domain == ALL_DOMAIN
+ || (domain == MODULES_DOMAIN
+ && (*psym)->domain == MODULE_DOMAIN)
|| (domain == VARIABLES_DOMAIN
&& (*psym)->aclass != LOC_TYPEDEF
&& (*psym)->aclass != LOC_BLOCK)
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");
}
gdb::optional<compiled_regex> preg;
gdb::optional<compiled_regex> treg;
- gdb_assert (kind <= TYPES_DOMAIN);
+ gdb_assert (kind != ALL_DOMAIN);
ourtype = types[kind];
ourtype2 = types2[kind];
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);
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
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;
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
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."));
/* 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);
+2019-10-31 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * 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 <philippe.waroquiers@skynet.be>
* gdb.base/setshow.exp: Test $_gdb_setting and $_gdb_setting_str.
--- /dev/null
+# 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 <http://www.gnu.org/licenses/>.
+
+# 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" ]
--- /dev/null
+! 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 <http://www.gnu.org/licenses/>.
+
+! Comment just to change the line number on which
+! mod2 is defined.
+module mod2
+ integer :: mod2_var_1 = 123
+end module mod2
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
}
program info_types_test
use mod1
+ use mod2
type :: s1
integer :: a
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