diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 7124ba5526..3e904693c0 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2013-12-03 Joel Brobecker + + * mi/mi-cmds.h (mi_cmd_info_gdb_mi_command): Declare. + * mi/mi-cmd-info.c (mi_cmd_info_gdb_mi_command): New function. + * mi/mi-cmds.c (mi_cmds): Add -info-gdb-mi-command command. + * mi/mi-main.c (mi_cmd_list_features): Add "info-gdb-mi-command" + field to output of "-list-features". + + * NEWS: Add entry for new -info-gdb-mi-command. + 2013-12-02 Doug Evans Jan Kratochvil diff --git a/gdb/NEWS b/gdb/NEWS index 5110b273f5..5cc4862617 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -158,6 +158,9 @@ show code-cache ** All MI commands now accept an optional "--language" option. + ** The new command -info-gdb-mi-command allows the user to determine + whether a GDB/MI command is supported or not. + ** The -trace-save MI command can optionally save trace buffer in Common Trace Format now. diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 87d28c0a91..329c2930fa 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,10 @@ +2013-12-03 Joel Brobecker + + * gdb.texinfo (GDB/MI Miscellaneous Commands): Document + the new -info-gdb-mi-command GDB/MI command. Document + the meaning of "-info-gdb-mi-command" in the output of + -list-features. + 2013-11-29 Pedro Alves * gdb.texinfo (Frames In Python) : diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index ddb4b38b75..5b1021b297 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -35098,6 +35098,57 @@ default shows this information when you start an interactive session. (gdb) @end smallexample +@subheading The @code{-info-gdb-mi-command} Command +@cindex @code{-info-gdb-mi-command} +@findex -info-gdb-mi-command + +@subsubheading Synopsis + +@smallexample + -info-gdb-mi-command @var{cmd_name} +@end smallexample + +Query support for the @sc{gdb/mi} command named @var{cmd_name}. + +Note that the dash (@code{-}) starting all @sc{gdb/mi} commands +is technically not part of the command name (@pxref{GDB/MI Input +Syntax}), and thus should be omitted in @var{cmd_name}. However, +for ease of use, this command also accepts the form with the leading +dash. + +@subsubheading @value{GDBN} Command + +There is no corresponding @value{GDBN} command. + +@subsubheading Result + +The result is a tuple. There is currently only one field: + +@table @samp +@item exists +This field is equal to @code{"true"} if the @sc{gdb/mi} command exists, +@code{"false"} otherwise. + +@end table + +@subsubheading Example + +Here is an example where the @sc{gdb/mi} command does not exist: + +@smallexample +-info-gdb-mi-command unsupported-command +^done,command=@{exists="false"@} +@end smallexample + +@noindent +And here is an example where the @sc{gdb/mi} command is known +to the debugger: + +@smallexample +-info-gdb-mi-command symbol-list-lines +^done,command=@{exists="true"@} +@end smallexample + @subheading The @code{-list-features} Command @findex -list-features @@ -35151,6 +35202,8 @@ exceptions: @code{-info-ada-exceptions}, @code{-catch-assert} and @item language-option Indicates that all @sc{gdb/mi} commands accept the @option{--language} option (@pxref{Context management}). +@item info-gdb-mi-command +Indicates support for the @code{-info-gdb-mi-command} command. @end table @subheading The @code{-list-target-features} Command diff --git a/gdb/mi/mi-cmd-info.c b/gdb/mi/mi-cmd-info.c index aa4d210ed7..0fce25a718 100644 --- a/gdb/mi/mi-cmd-info.c +++ b/gdb/mi/mi-cmd-info.c @@ -71,6 +71,35 @@ mi_cmd_info_ada_exceptions (char *command, char **argv, int argc) do_cleanups (old_chain); } +/* Implement the "-info-gdb-mi-command" GDB/MI command. */ + +void +mi_cmd_info_gdb_mi_command (char *command, char **argv, int argc) +{ + const char *cmd_name; + struct mi_cmd *cmd; + struct ui_out *uiout = current_uiout; + struct cleanup *old_chain; + + /* This command takes exactly one argument. */ + if (argc != 1) + error (_("Usage: -info-gdb-mi-command MI_COMMAND_NAME")); + cmd_name = argv[0]; + + /* Normally, the command name (aka the "operation" in the GDB/MI + grammar), does not include the leading '-' (dash). But for + the user's convenience, allow the user to specify the command + name to be with or without that leading dash. */ + if (cmd_name[0] == '-') + cmd_name++; + + cmd = mi_lookup (cmd_name); + + old_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "command"); + ui_out_field_string (uiout, "exists", cmd != NULL ? "true" : "false"); + do_cleanups (old_chain); +} + void mi_cmd_info_os (char *command, char **argv, int argc) { diff --git a/gdb/mi/mi-cmds.c b/gdb/mi/mi-cmds.c index c536d8a64e..58a8b894d9 100644 --- a/gdb/mi/mi-cmds.c +++ b/gdb/mi/mi-cmds.c @@ -125,6 +125,7 @@ static struct mi_cmd mi_cmds[] = DEF_MI_CMD_MI ("inferior-tty-set", mi_cmd_inferior_tty_set), DEF_MI_CMD_MI ("inferior-tty-show", mi_cmd_inferior_tty_show), DEF_MI_CMD_MI ("info-ada-exceptions", mi_cmd_info_ada_exceptions), + DEF_MI_CMD_MI ("info-gdb-mi-command", mi_cmd_info_gdb_mi_command), DEF_MI_CMD_MI ("info-os", mi_cmd_info_os), DEF_MI_CMD_MI ("interpreter-exec", mi_cmd_interpreter_exec), DEF_MI_CMD_MI ("list-features", mi_cmd_list_features), diff --git a/gdb/mi/mi-cmds.h b/gdb/mi/mi-cmds.h index cb8aac1077..4ea95fa301 100644 --- a/gdb/mi/mi-cmds.h +++ b/gdb/mi/mi-cmds.h @@ -74,6 +74,7 @@ extern mi_cmd_argv_ftype mi_cmd_gdb_exit; extern mi_cmd_argv_ftype mi_cmd_inferior_tty_set; extern mi_cmd_argv_ftype mi_cmd_inferior_tty_show; extern mi_cmd_argv_ftype mi_cmd_info_ada_exceptions; +extern mi_cmd_argv_ftype mi_cmd_info_gdb_mi_command; extern mi_cmd_argv_ftype mi_cmd_info_os; extern mi_cmd_argv_ftype mi_cmd_interpreter_exec; extern mi_cmd_argv_ftype mi_cmd_list_features; diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c index 793204ddb3..48c8d09817 100644 --- a/gdb/mi/mi-main.c +++ b/gdb/mi/mi-main.c @@ -1817,6 +1817,7 @@ mi_cmd_list_features (char *command, char **argv, int argc) ui_out_field_string (uiout, NULL, "ada-task-info"); ui_out_field_string (uiout, NULL, "ada-exceptions"); ui_out_field_string (uiout, NULL, "language-option"); + ui_out_field_string (uiout, NULL, "info-gdb-mi-command"); #if HAVE_PYTHON if (gdb_python_initialized) diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 8be246d9c5..43a7c67578 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2013-12-03 Joel Brobecker + + * gdb.mi/mi-i-cmd.exp: New file. + 2013-12-02 Doug Evans * gdb.dwarf/dwp-symlink.c: Fake out gdb to not load debug info diff --git a/gdb/testsuite/gdb.mi/mi-i-cmd.exp b/gdb/testsuite/gdb.mi/mi-i-cmd.exp new file mode 100644 index 0000000000..802f1ab9cb --- /dev/null +++ b/gdb/testsuite/gdb.mi/mi-i-cmd.exp @@ -0,0 +1,46 @@ +# Copyright 2013 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 . + +load_lib mi-support.exp +set MIFLAGS "-i=mi" + +gdb_exit +if [mi_gdb_start] { + continue +} + +# First, verify that the debugger correctly advertises support +# for the -info-gdb-mi-command command. +mi_gdb_test "-list-features" \ + "\\^done,features=\\\[.*\"info-gdb-mi-command\".*\\\]" \ + "-list-features includes \"info-gdb-mi-command\"" + +mi_gdb_test "-info-gdb-mi-command unsupported-command" \ + "\\^done,command=\\\{exists=\"false\"\\\}" \ + "-info-gdb-mi-command unsupported-command" + +# Same test as above, but including the leading '-' in the command name. +mi_gdb_test "-info-gdb-mi-command -unsupported-command" \ + "\\^done,command=\\\{exists=\"false\"\\\}" \ + "-info-gdb-mi-command -unsupported-command" + +mi_gdb_test "-info-gdb-mi-command symbol-list-lines" \ + "\\^done,command=\\\{exists=\"true\"\\\}" \ + "-info-gdb-mi-command symbol-list-lines" + +# Same test as above, but including the leading '-' in the command name. +mi_gdb_test "-info-gdb-mi-command -symbol-list-lines" \ + "\\^done,command=\\\{exists=\"true\"\\\}" \ + "-info-gdb-mi-command -symbol-list-lines"