New GDB/MI command "-info-gdb-mi-command"
authorJoel Brobecker <brobecker@adacore.com>
Tue, 12 Nov 2013 10:51:30 +0000 (14:51 +0400)
committerJoel Brobecker <brobecker@adacore.com>
Tue, 3 Dec 2013 03:57:24 +0000 (07:57 +0400)
This patch adds a new GDB/MI command meant for graphical frontends
trying to determine whether a given GDB/MI command exists or not.

Examples:

    -info-gdb-mi-command unsupported-command
    ^done,command={exists="false"}
    (gdb)
    -info-gdb-mi-command symbol-list-lines
    ^done,command={exists="true"}
    (gdb)

At the moment, this is the only piece of information that this
command returns.

Eventually, and if needed, we can extend it to provide
command-specific pieces of information, such as updates to
the command's syntax since inception.  This could become,
for instance:

    -info-gdb-mi-command symbol-list-lines
    ^done,command={exists="true",features=[]}
    (gdb)
    -info-gdb-mi-command catch-assert
    ^done,command={exists="true",features=["conditions"]}

In the first case, it would mean that no extra features,
while in the second, it announces that the -catch-assert
command in this version of the debugger supports a feature
called "condition" - exact semantics to be documented with
combined with the rest of the queried command's documentation.

But for now, we start small, and only worry about existance.
And to bootstrap the process, I have added an entry in the
output of the -list-features command as well ("info-gdb-mi-command"),
allowing the graphical frontends to go through the following process:

  1. Send -list-features, collect info from there as before;
  2. Check if the output contains "info-gdb-mi-command".
     If it does, then support for various commands can be
     queried though -info-gdb-mi-command. Newer commands
     will be expected to always be checked via this new
     -info-gdb-mi-command.

gdb/ChangeLog:

        * 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.

gdb/doc/ChangeLog:

        * 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.

gdb/testsuite/ChangeLog:

        * gdb.mi/mi-i-cmd.exp: New file.

gdb/ChangeLog
gdb/NEWS
gdb/doc/ChangeLog
gdb/doc/gdb.texinfo
gdb/mi/mi-cmd-info.c
gdb/mi/mi-cmds.c
gdb/mi/mi-cmds.h
gdb/mi/mi-main.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.mi/mi-i-cmd.exp [new file with mode: 0644]

index 7124ba55269ab67407eb763230c1cbc0bf0c7d1b..3e904693c05a45dbcd751d8e12b2b554f2a37600 100644 (file)
@@ -1,3 +1,13 @@
+2013-12-03  Joel Brobecker  <brobecker@adacore.com>
+
+       * 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  <dje@google.com>
            Jan Kratochvil  <jan.kratochvil@redhat.com>
 
index 5110b273f52bfc6407d6af5ccacc9471790ce7b7..5cc48626172966703c5c42f7141a234a0de9ab7a 100644 (file)
--- 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.
 
index 87d28c0a91e78f154f1b07743b069f903b7e9ca1..329c2930fad698e4d28fa639e2c392a0f3099364 100644 (file)
@@ -1,3 +1,10 @@
+2013-12-03  Joel Brobecker  <brobecker@adacore.com>
+
+       * 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  <palves@redhat.com>
 
        * gdb.texinfo (Frames In Python) <gdb.FRAME_UNWIND_NULL_ID>:
index ddb4b38b75cd2fb0859ab29f212837f5b70b40e5..5b1021b297054e6cc9e651799d1ba00aa1cca615 100644 (file)
@@ -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
index aa4d210ed7672557e266226d5da9105812a6a31f..0fce25a718d360fbbe672904385bb021cb66c878 100644 (file)
@@ -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)
 {
index c536d8a64ef540755f40a35812b21d69b843b44c..58a8b894d97fcc798455b732218fbcf262b5ffcc 100644 (file)
@@ -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),
index cb8aac107705c5af1fdda6d0ed89e35dc5ed96df..4ea95fa301f63deea0cb0b67ffca4f4daaa7a41f 100644 (file)
@@ -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;
index 793204ddb36c07942a28691a91cce234221b1c60..48c8d0981753659c2e032984160e7c570e56ce36 100644 (file)
@@ -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)
index 8be246d9c58297ca62102deda8989dc83718795f..43a7c675783a5e0322dd0a0c47d3c0e721c6873d 100644 (file)
@@ -1,3 +1,7 @@
+2013-12-03  Joel Brobecker  <brobecker@adacore.com>
+
+       * gdb.mi/mi-i-cmd.exp: New file.
+
 2013-12-02  Doug Evans  <dje@google.com>
 
        * 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 (file)
index 0000000..802f1ab
--- /dev/null
@@ -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 <http://www.gnu.org/licenses/>.
+
+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"