From patchwork Fri Nov 1 01:27:51 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: 35558 Received: (qmail 49523 invoked by alias); 1 Nov 2019 01:28:10 -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 49470 invoked by uid 89); 1 Nov 2019 01:28:09 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-20.4 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_STOCKGEN autolearn=ham version=3.3.1 spammy= 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; Fri, 01 Nov 2019 01:28:04 +0000 Received: by mx1.osci.io (Postfix, from userid 994) id 087E8204A8; Thu, 31 Oct 2019 21:28:02 -0400 (EDT) Received: from gnutoolchain-gerrit.osci.io (gnutoolchain-gerrit.osci.io [8.43.85.239]) by mx1.osci.io (Postfix) with ESMTP id 1D9AA20300 for ; Thu, 31 Oct 2019 21:27:58 -0400 (EDT) Received: from localhost (localhost [127.0.0.1]) by gnutoolchain-gerrit.osci.io (Postfix) with ESMTP id 944AD20AF6 for ; Thu, 31 Oct 2019 21:27:57 -0400 (EDT) X-Gerrit-PatchSet: 2 Date: Thu, 31 Oct 2019 21:27:51 -0400 From: "Andrew Burgess (Code Review)" To: gdb-patches@sourceware.org Auto-Submitted: auto-generated X-Gerrit-MessageType: newpatchset Subject: [review v2] gdb/mi: Add -symbol-info-module-{variables,functions} X-Gerrit-Change-Id: Ic96f12dd14bd7e34774c3cde008fec30a4055bfe X-Gerrit-Change-Number: 268 X-Gerrit-ChangeURL: X-Gerrit-Commit: fa141de65445cbea0e7d466c07e4632274631f3d In-Reply-To: References: Reply-To: 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: <20191101012757.944AD20AF6@gnutoolchain-gerrit.osci.io> Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/268 ...................................................................... gdb/mi: Add -symbol-info-module-{variables,functions} Two new MI command -symbol-info-module-variables and -symbol-info-module-functions, which are the equivalent of the CLI command 'info module variables' and 'info module functions'. These return information about functions and variables within Fortran modules. gdb/ChangeLog: * mi/mi-cmds.c (mi_cmds): Add -symbol-info-module-functions and -symbol-info-module-variables entries. * mi/mi-cmds.h (mi_cmd_symbol_info_module_functions): Declare. (mi_cmd_symbol_info_module_variables): Declare. * mi/mi-symbol-cmds.c (mi_info_module_functions_or_variables): New function. (mi_cmd_symbol_info_module_functions): New function. (mi_cmd_symbol_info_module_variables): New function. * NEWS: Mention new MI command. gdb/doc/ChangeLog: * doc/gdb.texinfo (GDB/MI Symbol Query): Document new MI command -symbol-info-module-functions and -symbol-info-module-variables. gdb/testsuite/ChangeLog: * gdb.mi/mi-fortran-modules.exp: Add additional tests for -symbol-info-module-functions and -symbol-info-module-variables. Change-Id: Ic96f12dd14bd7e34774c3cde008fec30a4055bfe --- M gdb/ChangeLog M gdb/NEWS M gdb/doc/ChangeLog M gdb/doc/gdb.texinfo M gdb/mi/mi-cmds.c M gdb/mi/mi-cmds.h M gdb/mi/mi-symbol-cmds.c M gdb/testsuite/ChangeLog M gdb/testsuite/gdb.mi/mi-fortran-modules.exp 9 files changed, 315 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 11820e7..b11ceda 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,17 @@ 2019-11-01 Andrew Burgess + * mi/mi-cmds.c (mi_cmds): Add -symbol-info-module-functions and + -symbol-info-module-variables entries. + * mi/mi-cmds.h (mi_cmd_symbol_info_module_functions): Declare. + (mi_cmd_symbol_info_module_variables): Declare. + * mi/mi-symbol-cmds.c (mi_info_module_functions_or_variables): New + function. + (mi_cmd_symbol_info_module_functions): New function. + (mi_cmd_symbol_info_module_variables): New function. + * NEWS: Mention new MI command. + +2019-11-01 Andrew Burgess + * mi/mi-cmds.c (mi_cmds): Add 'symbol-info-modules' entry. * mi/mi-cmds.h (mi_cmd_symbol_info_modules): Declare. * mi/mi-symbol-cmds.c (mi_cmd_symbol_info_modules): New function. diff --git a/gdb/NEWS b/gdb/NEWS index 986d73b..5ce5a34 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -351,6 +351,10 @@ -symbol-info-modules, this is the MI equivalent of the CLI 'info modules' command. +-symbol-info-module-functions and -symbol-info-module-variables. + These commands are the MI equivalent of the CLI commands 'info + module functions' and 'info module variables'. + * Other MI changes ** The default version of the MI interpreter is now 3 (-i=mi3). diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index c5d9e08..2901705 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,6 +1,11 @@ 2019-11-01 Andrew Burgess * doc/gdb.texinfo (GDB/MI Symbol Query): Document new MI command + -symbol-info-module-functions and -symbol-info-module-variables. + +2019-11-01 Andrew Burgess + + * doc/gdb.texinfo (GDB/MI Symbol Query): Document new MI command -symbol-info-modules. 2019-11-01 Andrew Burgess diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 7444f90..6219699 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -33960,6 +33960,148 @@ @end group @end smallexample +@subheading The @code{-symbol-info-module-functions} Command +@findex -symbol-info-module-functions +@anchor{-symbol-info-module-functions} + +@subsubheading Synopsis + +@smallexample + -symbol-info-module-functions [--module @var{module_regexp}] + [--name @var{name_regexp}] + [--type @var{type_regexp}] +@end smallexample + +@noindent +Return a list containing the names of all known functions within all +know Fortran modules. The functions are grouped by source file and +containing module, and shown with the line number on which each +function is defined. + +The option @code{--module} only returns results for modules matching +@var{module_regexp}. The option @code{--name} only returns functions +whose name matches @var{name_regexp}, and @code{--type} only returns +functions whose type matches @var{type_regexp}. + +@subsubheading @value{GDBN} Command + +The corresponding @value{GDBN} command is @samp{info module functions}. + +@subsubheading Example + +@smallexample +@group +(gdb) +-symbol-info-module-functions +^done,symbols= + [@{module="mod1", + files=[@{filename="/project/gdb/testsuite/gdb.mi/mi-fortran-modules-2.f90", + fullname="/project/gdb/testsuite/gdb.mi/mi-fortran-modules-2.f90", + symbols=[@{line="21",name="mod1::check_all",type="void (void)", + description="void mod1::check_all(void);"@}]@}]@}, + @{module="mod2", + files=[@{filename="/project/gdb/testsuite/gdb.mi/mi-fortran-modules-2.f90", + fullname="/project/gdb/testsuite/gdb.mi/mi-fortran-modules-2.f90", + symbols=[@{line="30",name="mod2::check_var_i",type="void (void)", + description="void mod2::check_var_i(void);"@}]@}]@}, + @{module="mod3", + files=[@{filename="/projec/gdb/testsuite/gdb.mi/mi-fortran-modules.f90", + fullname="/projec/gdb/testsuite/gdb.mi/mi-fortran-modules.f90", + symbols=[@{line="21",name="mod3::check_all",type="void (void)", + description="void mod3::check_all(void);"@}, + @{line="27",name="mod3::check_mod2",type="void (void)", + description="void mod3::check_mod2(void);"@}]@}]@}, + @{module="modmany", + files=[@{filename="/project/gdb/testsuite/gdb.mi/mi-fortran-modules.f90", + fullname="/project/gdb/testsuite/gdb.mi/mi-fortran-modules.f90", + symbols=[@{line="35",name="modmany::check_some",type="void (void)", + description="void modmany::check_some(void);"@}]@}]@}, + @{module="moduse", + files=[@{filename="/project/gdb/testsuite/gdb.mi/mi-fortran-modules.f90", + fullname="/project/gdb/testsuite/gdb.mi/mi-fortran-modules.f90", + symbols=[@{line="44",name="moduse::check_all",type="void (void)", + description="void moduse::check_all(void);"@}, + @{line="49",name="moduse::check_var_x",type="void (void)", + description="void moduse::check_var_x(void);"@}]@}]@}] +@end group +@end smallexample + +@subheading The @code{-symbol-info-module-variables} Command +@findex -symbol-info-module-variables +@anchor{-symbol-info-module-variables} + +@subsubheading Synopsis + +@smallexample + -symbol-info-module-variables [--module @var{module_regexp}] + [--name @var{name_regexp}] + [--type @var{type_regexp}] +@end smallexample + +@noindent +Return a list containing the names of all known variables within all +know Fortran modules. The variables are grouped by source file and +containing module, and shown with the line number on which each +variable is defined. + +The option @code{--module} only returns results for modules matching +@var{module_regexp}. The option @code{--name} only returns variables +whose name matches @var{name_regexp}, and @code{--type} only returns +variables whose type matches @var{type_regexp}. + +@subsubheading @value{GDBN} Command + +The corresponding @value{GDBN} command is @samp{info module variables}. + +@subsubheading Example + +@smallexample +@group +(gdb) +-symbol-info-module-variables +^done,symbols= + [@{module="mod1", + files=[@{filename="/project/gdb/testsuite/gdb.mi/mi-fortran-modules-2.f90", + fullname="/project/gdb/testsuite/gdb.mi/mi-fortran-modules-2.f90", + symbols=[@{line="18",name="mod1::var_const",type="integer(kind=4)", + description="integer(kind=4) mod1::var_const;"@}, + @{line="17",name="mod1::var_i",type="integer(kind=4)", + description="integer(kind=4) mod1::var_i;"@}]@}]@}, + @{module="mod2", + files=[@{filename="/project/gdb/testsuite/gdb.mi/mi-fortran-modules-2.f90", + fullname="/project/gdb/testsuite/gdb.mi/mi-fortran-modules-2.f90", + symbols=[@{line="28",name="mod2::var_i",type="integer(kind=4)", + description="integer(kind=4) mod2::var_i;"@}]@}]@}, + @{module="mod3", + files=[@{filename="/project/gdb/testsuite/gdb.mi/mi-fortran-modules.f90", + fullname="/project/gdb/testsuite/gdb.mi/mi-fortran-modules.f90", + symbols=[@{line="18",name="mod3::mod1",type="integer(kind=4)", + description="integer(kind=4) mod3::mod1;"@}, + @{line="17",name="mod3::mod2",type="integer(kind=4)", + description="integer(kind=4) mod3::mod2;"@}, + @{line="19",name="mod3::var_i",type="integer(kind=4)", + description="integer(kind=4) mod3::var_i;"@}]@}]@}, + @{module="modmany", + files=[@{filename="/project/gdb/testsuite/gdb.mi/mi-fortran-modules.f90", + fullname="/project/gdb/testsuite/gdb.mi/mi-fortran-modules.f90", + symbols=[@{line="33",name="modmany::var_a",type="integer(kind=4)", + description="integer(kind=4) modmany::var_a;"@}, + @{line="33",name="modmany::var_b",type="integer(kind=4)", + description="integer(kind=4) modmany::var_b;"@}, + @{line="33",name="modmany::var_c",type="integer(kind=4)", + description="integer(kind=4) modmany::var_c;"@}, + @{line="33",name="modmany::var_i",type="integer(kind=4)", + description="integer(kind=4) modmany::var_i;"@}]@}]@}, + @{module="moduse", + files=[@{filename="/project/gdb/testsuite/gdb.mi/mi-fortran-modules.f90", + fullname="/project/gdb/testsuite/gdb.mi/mi-fortran-modules.f90", + symbols=[@{line="42",name="moduse::var_x",type="integer(kind=4)", + description="integer(kind=4) moduse::var_x;"@}, + @{line="42",name="moduse::var_y",type="integer(kind=4)", + description="integer(kind=4) moduse::var_y;"@}]@}]@}] +@end group +@end smallexample + @subheading The @code{-symbol-info-modules} Command @findex -symbol-info-modules @anchor{-symbol-info-modules} diff --git a/gdb/mi/mi-cmds.c b/gdb/mi/mi-cmds.c index 85c15ec..991fb4b 100644 --- a/gdb/mi/mi-cmds.c +++ b/gdb/mi/mi-cmds.c @@ -155,6 +155,10 @@ DEF_MI_CMD_MI ("symbol-info-variables", mi_cmd_symbol_info_variables), DEF_MI_CMD_MI ("symbol-info-types", mi_cmd_symbol_info_types), DEF_MI_CMD_MI ("symbol-info-modules", mi_cmd_symbol_info_modules), + DEF_MI_CMD_MI ("symbol-info-module-functions", + mi_cmd_symbol_info_module_functions), + DEF_MI_CMD_MI ("symbol-info-module-variables", + mi_cmd_symbol_info_module_variables), DEF_MI_CMD_CLI ("target-attach", "attach", 1), DEF_MI_CMD_MI ("target-detach", mi_cmd_target_detach), DEF_MI_CMD_CLI ("target-disconnect", "disconnect", 0), diff --git a/gdb/mi/mi-cmds.h b/gdb/mi/mi-cmds.h index 30de780..faeb36b 100644 --- a/gdb/mi/mi-cmds.h +++ b/gdb/mi/mi-cmds.h @@ -95,6 +95,8 @@ extern mi_cmd_argv_ftype mi_cmd_stack_select_frame; extern mi_cmd_argv_ftype mi_cmd_symbol_list_lines; extern mi_cmd_argv_ftype mi_cmd_symbol_info_functions; +extern mi_cmd_argv_ftype mi_cmd_symbol_info_module_functions; +extern mi_cmd_argv_ftype mi_cmd_symbol_info_module_variables; extern mi_cmd_argv_ftype mi_cmd_symbol_info_modules; extern mi_cmd_argv_ftype mi_cmd_symbol_info_types; extern mi_cmd_argv_ftype mi_cmd_symbol_info_variables; diff --git a/gdb/mi/mi-symbol-cmds.c b/gdb/mi/mi-symbol-cmds.c index 0cf2613..0b14cb2 100644 --- a/gdb/mi/mi-symbol-cmds.c +++ b/gdb/mi/mi-symbol-cmds.c @@ -312,6 +312,106 @@ mi_symbol_info (kind, regexp, t_regexp, exclude_minsyms); } +/* Core of -symbol-info-module-functions and -symbol-info-module-variables. + KIND indicates what we are searching for, and ARGV and ARGC are the + command line options passed to the MI command. */ + +static void +mi_info_module_functions_or_variables (enum search_domain kind, + char **argv, int argc) +{ + const char *module_regexp = nullptr; + const char *regexp = nullptr; + const char *type_regexp = nullptr; + + /* Process the command line options. */ + + enum opt + { + MODULE_REGEXP_OPT, TYPE_REGEXP_OPT, NAME_REGEXP_OPT + }; + static const struct mi_opt opts[] = + { + {"-module", MODULE_REGEXP_OPT, 1}, + {"-type", TYPE_REGEXP_OPT, 1}, + {"-name", NAME_REGEXP_OPT, 1}, + { 0, 0, 0 } + }; + + int oind = 0; + char *oarg = nullptr; + + while (1) + { + const char *cmd_string + = ((kind == FUNCTIONS_DOMAIN) + ? "-symbol-info-module-functions" + : "-symbol-info-module-variables"); + int opt = mi_getopt (cmd_string, argc, argv, opts, &oind, &oarg); + if (opt < 0) + break; + switch ((enum opt) opt) + { + case MODULE_REGEXP_OPT: + module_regexp = oarg; + break; + case TYPE_REGEXP_OPT: + type_regexp = oarg; + break; + case NAME_REGEXP_OPT: + regexp = oarg; + break; + } + } + + std::vector module_symbols + = search_module_symbols (module_regexp, regexp, type_regexp, kind); + + struct ui_out *uiout = current_uiout; + ui_out_emit_list all_matching_symbols (uiout, "symbols"); + gdb::optional module_tuple; + gdb::optional files_list; + gdb::optional current_file; + gdb::optional item_list; + + const symtab *last_symtab = nullptr; + const symbol *last_module_symbol = nullptr; + for (const module_symbol_search &ms : module_symbols) + { + const symbol_search &p = ms.first; + const symbol_search &q = ms.second; + + gdb_assert (q.symbol != nullptr); + + if (last_module_symbol != p.symbol) + { + item_list.reset (); + current_file.reset (); + files_list.reset (); + + module_tuple.emplace (uiout, nullptr); + uiout->field_string ("module", SYMBOL_PRINT_NAME (p.symbol)); + last_module_symbol = p.symbol; + last_symtab = nullptr; + files_list.emplace (uiout, "files"); + } + + struct symtab *s = symbol_symtab (q.symbol); + if (last_symtab != s) + { + item_list.reset (); + current_file.emplace (uiout, nullptr); + uiout->field_string ("filename", + symtab_to_filename_for_display (s)); + uiout->field_string ("fullname", symtab_to_fullname (s)); + item_list.emplace (uiout, "symbols"); + last_symtab = s; + } + + mi_info_one_symbol_details (kind, q.symbol, q.block); + } +} + /* Implement -symbol-info-functions command. */ void @@ -320,6 +420,24 @@ mi_info_functions_or_variables (FUNCTIONS_DOMAIN, argv, argc); } +/* Implement -symbol-info-module-functions command. */ + +void +mi_cmd_symbol_info_module_functions (const char *command, char **argv, + int argc) +{ + mi_info_module_functions_or_variables (FUNCTIONS_DOMAIN, argv, argc); +} + +/* Implement -symbol-info-module-variables command. */ + +void +mi_cmd_symbol_info_module_variables (const char *command, char **argv, + int argc) +{ + mi_info_module_functions_or_variables (VARIABLES_DOMAIN, argv, argc); +} + /* Implement -symbol-inf-modules command. */ void @@ -401,4 +519,3 @@ { mi_info_functions_or_variables (VARIABLES_DOMAIN, argv, argc); } - diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 72b6aee..47445ea 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2019-11-01 Andrew Burgess + * gdb.mi/mi-fortran-modules.exp: Add additional tests for + -symbol-info-module-functions and -symbol-info-module-variables. + +2019-11-01 Andrew Burgess + * gdb.mi/mi-fortran-modules-2.f90: New file. * gdb.mi/mi-fortran-modules.exp: New file. * gdb.mi/mi-fortran-modules.f90: New file. diff --git a/gdb/testsuite/gdb.mi/mi-fortran-modules.exp b/gdb/testsuite/gdb.mi/mi-fortran-modules.exp index 640bb12..12a81a6 100644 --- a/gdb/testsuite/gdb.mi/mi-fortran-modules.exp +++ b/gdb/testsuite/gdb.mi/mi-fortran-modules.exp @@ -45,7 +45,30 @@ "103\\^done,symbols=\{debug=\\\[\{filename=\"\[^\"\]+$srcfile\",fullname=\"\[^\"\]+$srcfile\",symbols=\\\[\{line=\"41\",name=\"moduse\"\}\\\]\}\\\]\}" \ "-symbol-info-modules --name moduse" +mi_gdb_test "104-symbol-info-module-functions" \ + [join \ + [list \ + "104\\^done,symbols=\\\[\{module=\"mod1\",files=\\\[\{filename=\"\[^\"\]+$srcfile2\",fullname=\"\[^\"\]+$srcfile2\",symbols=\\\[\{line=\"21\",name=\"mod1::check_all\",type=\"void \\(void\\)\",description=\"void mod1::check_all\\(void\\);\"\}\\\]\}\\\]\},\{module=\"mod2\",files=\\\[\{filename=\"\[^\"\]+$srcfile2\",fullname=\"\[^\"\]+$srcfile2\",symbols=\\\[\{line=\"30\",name=\"mod2::check_var_i\",type=\"void \\(void\\)\",description=\"void mod2::check_var_i\\(void\\);\"\}\\\]\}\\\]\},\{module=\"mod3\",files=\\\[\{filename=\"\[^\"\]+$srcfile\",fullname=\"\[^\"\]+$srcfile\",symbols=\\\[\{line=\"21\",name=\"mod3::check_all\",type=\"void \\(void\\)\",description=\"void mod3::check_all\\(void\\);\"\},\{line=\"27\",name=\"mod3::check_mod2\",type=\"void \\(void\\)\",description=\"void mod3::check_mod2\\(void\\);\"\}\\\]\}\\\]\}," \ + "\{module=\"modmany\",files=\\\[\{filename=\"\[^\"\]+$srcfile\",fullname=\"\[^\"\]+$srcfile\",symbols=\\\[\{line=\"35\",name=\"modmany::check_some\",type=\"void \\(void\\)\",description=\"void modmany::check_some\\(void\\);\"\}\\\]\}\\\]\},\{module=\"moduse\",files=\\\[\{filename=\"\[^\"\]+$srcfile\",fullname=\"\[^\"\]+$srcfile\",symbols=\\\[\{line=\"44\",name=\"moduse::check_all\",type=\"void \\(void\\)\",description=\"void moduse::check_all\\(void\\);\"\},\{line=\"49\",name=\"moduse::check_var_x\",type=\"void \\(void\\)\",description=\"void moduse::check_var_x\\(void\\);\"\}\\\]\}\\\]\}\\\]" ] "" ] \ + "-symbol-info-module-functions" +mi_gdb_test "105-symbol-info-module-functions --name _all" \ + "105\\^done,symbols=\\\[\{module=\"mod1\",files=\\\[\{filename=\"\[^\"\]+$srcfile2\",fullname=\"\[^\"\]+$srcfile2\",symbols=\\\[\{line=\"21\",name=\"mod1::check_all\",type=\"void \\(void\\)\",description=\"void mod1::check_all\\(void\\);\"\}\\\]\}\\\]\},\{module=\"mod3\",files=\\\[\{filename=\"\[^\"\]+$srcfile\",fullname=\"\[^\"\]+$srcfile\",symbols=\\\[\{line=\"21\",name=\"mod3::check_all\",type=\"void \\(void\\)\",description=\"void mod3::check_all\\(void\\);\"\}\\\]\}\\\]\},\{module=\"moduse\",files=\\\[\{filename=\"\[^\"\]+$srcfile\",fullname=\"\[^\"\]+$srcfile\",symbols=\\\[\{line=\"44\",name=\"moduse::check_all\",type=\"void \\(void\\)\",description=\"void moduse::check_all\\(void\\);\"\}\\\]\}\\\]\}\\\]" \ + "-symbol-info-module-functions --name _all" + +mi_gdb_test "106-symbol-info-module-functions --module mod\[123\]" \ + "106\\^done,symbols=\\\[\{module=\"mod1\",files=\\\[\{filename=\"\[^\"\]+$srcfile2\",fullname=\"\[^\"\]+$srcfile2\",symbols=\\\[\{line=\"21\",name=\"mod1::check_all\",type=\"void \\(void\\)\",description=\"void mod1::check_all\\(void\\);\"\}\\\]\}\\\]\},\{module=\"mod2\",files=\\\[\{filename=\"\[^\"\]+$srcfile2\",fullname=\"\[^\"\]+$srcfile2\",symbols=\\\[\{line=\"30\",name=\"mod2::check_var_i\",type=\"void \\(void\\)\",description=\"void mod2::check_var_i\\(void\\);\"\}\\\]\}\\\]\},\{module=\"mod3\",files=\\\[\{filename=\"\[^\"\]+$srcfile\",fullname=\"\[^\"\]+$srcfile\",symbols=\\\[\{line=\"21\",name=\"mod3::check_all\",type=\"void \\(void\\)\",description=\"void mod3::check_all\\(void\\);\"\},\{line=\"27\",name=\"mod3::check_mod2\",type=\"void \\(void\\)\",description=\"void mod3::check_mod2\\(void\\);\"\}\\\]\}\\\]\}\\\]" \ + "-symbol-info-module-functions --module mod\[123\]" + +set int4 [fortran_int4] + +mi_gdb_test "107-symbol-info-module-variables" \ + [join \ + [list \ + "107\\^done,symbols=\\\[\{module=\"mod1\",files=\\\[\{filename=\"\[^\"\]+$srcfile2\",fullname=\"\[^\"\]+$srcfile2\",symbols=\\\[\{line=\"18\",name=\"mod1::var_const\",type=\"$int4\",description=\"$int4 mod1::var_const;\"\},\{line=\"17\",name=\"mod1::var_i\",type=\"$int4\",description=\"$int4 mod1::var_i;\"\}\\\]\}\\\]\},\{module=\"mod2\",files=\\\[\{filename=\"\[^\"\]+$srcfile2\",fullname=\"\[^\"\]+$srcfile2\",symbols=\\\[\{line=\"28\",name=\"mod2::var_i\",type=\"$int4\",description=\"$int4 mod2::var_i;\"\}\\\]\}\\\]\}," \ + "\{module=\"mod3\",files=\\\[\{filename=\"\[^\"\]+$srcfile\",fullname=\"\[^\"\]+$srcfile\",symbols=\\\[\{line=\"18\",name=\"mod3::mod1\",type=\"$int4\",description=\"$int4 mod3::mod1;\"\},\{line=\"17\",name=\"mod3::mod2\",type=\"$int4\",description=\"$int4 mod3::mod2;\"\},\{line=\"19\",name=\"mod3::var_i\",type=\"$int4\",description=\"$int4 mod3::var_i;\"\}\\\]\}\\\]\},\{module=\"modmany\",files=\\\[\{filename=\"\[^\"\]+$srcfile\",fullname=\"\[^\"\]+$srcfile\",symbols=\\\[\{line=\"33\",name=\"modmany::var_a\",type=\"$int4\",description=\"$int4 modmany::var_a;\"\}," \ + "\{line=\"33\",name=\"modmany::var_b\",type=\"$int4\",description=\"$int4 modmany::var_b;\"\},\{line=\"33\",name=\"modmany::var_c\",type=\"$int4\",description=\"$int4 modmany::var_c;\"\},\{line=\"33\",name=\"modmany::var_i\",type=\"$int4\",description=\"$int4 modmany::var_i;\"\}\\\]\}\\\]\},\{module=\"moduse\",files=\\\[\{filename=\"\[^\"\]+$srcfile\",fullname=\"\[^\"\]+$srcfile\",symbols=\\\[\{line=\"42\",name=\"moduse::var_x\",type=\"$int4\",description=\"$int4 moduse::var_x;\"\},\{line=\"42\",name=\"moduse::var_y\",type=\"$int4\",description=\"$int4 moduse::var_y;\"\}\\\]\}\\\]\}\\\]" ] "" ] \ + "-symbol-info-module-variables"