This is the mail archive of the mailing list for the GDB project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[RFA 1/2] New GDB/MI command "-info-gdb-mi-command"


This is mostly a re-based version of:
    [RFC] New GDB/MI command "-info-gdb-mi-command"

I made the documentation fixes mentioned by Eli, although I wonder
if the corrections were done well enough:
  - Added the @cindex entry for the new command;
  - Fixed the markup for the command's argument.
I think it's worth a second review - I am not sure I did enough.

Regarding some questions Eli had:

  | > +(the leading dash (@code{-}) in the command name should be omitted).
  | Is this wise?  How about if we support both with and without the dash?

I now think that it was indeed the correct choice.  Not only does it
facilitate implementation (but only marginally), it also is consistent
with the current output.  For instance, notice how GDB names the command
in the following error message:

    ^error,msg="Undefined MI command: unsupported"
                                    (no leading dash)

Also, looking at the grammar, the leading dash isn't listed
as part of what they call the "operation"

    mi-command ==>
    [ token ] "-" operation ( " " option )* [ " --" ] ( " " parameter )* nl

The other question was:

  | > +-info-gdb-mi-command symbol-list-lines
  | > +^done,command=@{exists="true"@}
  | > +@end smallexample
  | Btw, why "command="?  Perhaps "result="?

I only have a mild opinion. But the choice I made seems consistent
with other commands. Eg:
  + -list-features => features=
  + -thread-info => threads=
  + -list-thread-groups => groups=

~~~ Actual Commit's Revision Log ~~~

This patch adds a new GDB/MI command meant for graphical frontends
trying to determine whether a given GDB/MI command exists or not.


    -info-gdb-mi-command unsupported-command
    -info-gdb-mi-command symbol-list-lines

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
    -info-gdb-mi-command catch-assert

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


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


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

Tested on x86_64-linux.  OK to commit?

Thank you,

 gdb/NEWS                          |  3 +++
 gdb/doc/gdb.texinfo               | 47 +++++++++++++++++++++++++++++++++++++++
 gdb/mi/mi-cmd-info.c              | 21 +++++++++++++++++
 gdb/mi/mi-cmds.c                  |  1 +
 gdb/mi/mi-cmds.h                  |  1 +
 gdb/mi/mi-main.c                  |  1 +
 gdb/testsuite/gdb.mi/mi-i-cmd.exp | 37 ++++++++++++++++++++++++++++++
 7 files changed, 111 insertions(+)
 create mode 100644 gdb/testsuite/gdb.mi/mi-i-cmd.exp

diff --git a/gdb/NEWS b/gdb/NEWS
index 9fc3638..e61c79f 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -153,6 +153,9 @@ show startup-with-shell
   ** 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/gdb.texinfo b/gdb/doc/gdb.texinfo
index 19e9aa5..e85b5b6 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -35069,6 +35069,51 @@ default shows this information when you start an interactive session.
 @end smallexample
+@subheading The @code{-info-gdb-mi-command} Command
+@cindex @code{-info-gdb-mi-command}
+@findex -info-gdb-mi-command
+@subsubheading Synopsis
+ -info-gdb-mi-command @var{cmd_name}
+@end smallexample
+Query support for the @sc{gdb/mi} command named @var{cmd_name}
+(the leading dash (@code{-}) in the command name should be omitted).
+@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:
+-info-gdb-mi-command unsupported-command
+@end smallexample
+And here is an example where the @sc{gdb/mi} command is known
+to the debugger:
+-info-gdb-mi-command symbol-list-lines
+@end smallexample
 @subheading The @code{-list-features} Command
 @findex -list-features
@@ -35122,6 +35167,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 aa4d210..18f4927 100644
--- a/gdb/mi/mi-cmd-info.c
+++ b/gdb/mi/mi-cmd-info.c
@@ -71,6 +71,27 @@ mi_cmd_info_ada_exceptions (char *command, char **argv, int argc)
   do_cleanups (old_chain);
+/* Implement the "-info-gdb-mi-command" GDB/MI command.  */
+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];
+  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);
 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 496a8aa..aed62b2 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 cb8aac1..4ea95fa 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 83d524a..e4251c9 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 (gdb_python_initialized)
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 0000000..5285d31
--- /dev/null
+++ b/gdb/testsuite/gdb.mi/mi-i-cmd.exp
@@ -0,0 +1,37 @@
+# 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
+# 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"
+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 should include \"info-gdb-mi-command\""
+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"

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]