Re: GDB version as convenience variable

Eli Zaretskii
2019-03-20T19:35:50Z

Ping!

> Date: Wed, 06 Mar 2019 18:02:00 +0200
> From: Eli Zaretskii <eliz@gnu.org>
> CC: gdb-patches@sourceware.org
>
> > From: Tom Tromey <tom@tromey.com>
> > Cc: Tom Tromey <tom@tromey.com>, gdb-patches@sourceware.org
> > Date: Mon, 04 Mar 2019 10:40:46 -0700
> >
> > >>>>> "Eli" == Eli Zaretskii <eliz@gnu.org> writes:
> >
> > Eli> What do you think about the idea to add a convenience variable that
> > Eli> would provide the GDB version?
> >
> > Seems reasonable to me.
>
> How about the patch below? Is it okay to go in? (Note that I took
> this opportunity to clean up whitespace in top.c, I hope it's OK to do
> that as part of unrelated code changes.)
>
> diff --git a/gdb/ChangeLog b/gdb/ChangeLog
> index ac61e65..f2915d0 100644
> --- a/gdb/ChangeLog
> +++ b/gdb/ChangeLog
> @@ -1,3 +1,10 @@
> +2019-03-06 Eli Zaretskii <eliz@gnu.org>
> +
> + * NEWS: Announce $_gdb_version.
> +
> + * top.c (init_gdb_version_var): New function.
> + (gdb_init): Call init_gdb_version_var.
> +
> 2019-03-06 Tom Tromey <tromey@adacore.com>
>
> * remote-sim.c (gdbsim_target_open): Use result of
> diff --git a/gdb/NEWS b/gdb/NEWS
> index cc7c35c..260e6cc 100644
> --- a/gdb/NEWS
> +++ b/gdb/NEWS
> @@ -3,6 +3,12 @@
>
> *** Changes since GDB 8.3
>
> +* New built-in convenience variable $_gdb_version provides the GDB
> + version. It is handy for conditionally using features available
> + only in or since specific GDB versions, in scripts that should work
> + error-free with many different versions, such as in system-wide init
> + files.
> +
> *** Changes in GDB 8.3
>
> * GDB and GDBserver now support access to additional registers on
> diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog
> index 0380322..313a061 100644
> --- a/gdb/doc/ChangeLog
> +++ b/gdb/doc/ChangeLog
> @@ -1,3 +1,7 @@
> +2019-03-06 Eli Zaretskii <eliz@gnu.org>
> +
> + * gdb.texinfo (Convenience Vars): Document $_gdb_version.
> +
> 2019-03-05 Simon Marchi <simon.marchi@efficios.com>
>
> * python.texi (Values From Inferior): Change synopsys of the
> diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
> index f2028f8..9d15337 100644
> --- a/gdb/doc/gdb.texinfo
> +++ b/gdb/doc/gdb.texinfo
> @@ -11197,7 +11197,7 @@
> @vindex $_tlb@r{, convenience variable}
> The variable @code{$_tlb} is automatically set when debugging
> applications running on MS-Windows in native mode or connected to
> -gdbserver that supports the @code{qGetTIBAddr} request.
> +gdbserver that supports the @code{qGetTIBAddr} request.
> @xref{General Query Packets}.
> This variable contains the address of the thread information block.
>
> @@ -11211,6 +11211,17 @@
> @item $_gthread
> The global number of the current thread. @xref{global thread numbers}.
>
> +@item $_gdb_version
> +@vindex $_gdb_version@r{, convenience variable}
> +The version of the running @value{GDBN}. The value is an integer
> +number that encodes the major and minor @value{GDBN} versions as
> +@w{@code{@var{major}*100 + @var{minor}}}, so, e.g., @value{GDBN}
> +version 9.10 will produce the value @code{910}. Development snapshots
> +and pretest versions have their minor version incremented by one;
> +thus, @value{GDBN} pretest 9.11.90 will produce the value 912. This
> +variable allows you to write scripts that work with different versions
> +of @value{GDBN} without errors caused by features unavailable in some
> +of those versions.
> @end table
>
> @node Convenience Funs
> diff --git a/gdb/top.c b/gdb/top.c
> index 22e6f7e..97b349a 100644
> --- a/gdb/top.c
> +++ b/gdb/top.c
> @@ -147,22 +147,22 @@ int server_command;
>
> /* Timeout limit for response from target. */
>
> -/* The default value has been changed many times over the years. It
> - was originally 5 seconds. But that was thought to be a long time
> +/* The default value has been changed many times over the years. It
> + was originally 5 seconds. But that was thought to be a long time
> to sit and wait, so it was changed to 2 seconds. That was thought
> - to be plenty unless the connection was going through some terminal
> + to be plenty unless the connection was going through some terminal
> server or multiplexer or other form of hairy serial connection.
>
> - In mid-1996, remote_timeout was moved from remote.c to top.c and
> + In mid-1996, remote_timeout was moved from remote.c to top.c and
> it began being used in other remote-* targets. It appears that the
> default was changed to 20 seconds at that time, perhaps because the
> Renesas E7000 ICE didn't always respond in a timely manner.
>
> But if 5 seconds is a long time to sit and wait for retransmissions,
> - 20 seconds is far worse. This demonstrates the difficulty of using
> + 20 seconds is far worse. This demonstrates the difficulty of using
> a single variable for all protocol timeouts.
>
> - As remote.c is used much more than remote-e7000.c, it was changed
> + As remote.c is used much more than remote-e7000.c, it was changed
> back to 2 seconds in 1999. */
>
> int remote_timeout = 2;
> @@ -188,9 +188,9 @@ int (*deprecated_ui_loop_hook) (int);
>
> /* Called from print_frame_info to list the line we stopped in. */
>
> -void (*deprecated_print_frame_info_listing_hook) (struct symtab * s,
> +void (*deprecated_print_frame_info_listing_hook) (struct symtab * s,
> int line,
> - int stopline,
> + int stopline,
> int noerror);
> /* Replaces most of query. */
>
> @@ -237,7 +237,7 @@ ptid_t (*deprecated_target_wait_hook) (ptid_t ptid,
> /* Used by UI as a wrapper around command execution. May do various
> things like enabling/disabling buttons, etc... */
>
> -void (*deprecated_call_command_hook) (struct cmd_list_element * c,
> +void (*deprecated_call_command_hook) (struct cmd_list_element * c,
> const char *cmd, int from_tty);
>
> /* Called when the current thread changes. Argument is thread id. */
> @@ -1339,8 +1339,9 @@ There is NO WARRANTY, to the extent permitted by law.");
> resources online at:\n <http://www.gnu.org/software/gdb/documentation/>."));
> fprintf_filtered (stream, "\n\n");
> fprintf_filtered (stream, _("For help, type \"help\".\n"));
> - fprintf_filtered (stream, _("Type \"apropos word\" to search for \
> -commands related to \"word\"."));
> + fprintf_filtered (stream,
> + _("Type \"apropos word\" to search for commands \
> +related to \"word\"."));
> }
>
> /* Print the details of GDB build-time configuration. */
> @@ -1608,7 +1609,7 @@ quit_force (int *exit_arg, int from_tty)
>
> undo_terminal_modifications_before_exit ();
>
> - /* An optional expression may be used to cause gdb to terminate with the
> + /* An optional expression may be used to cause gdb to terminate with the
> value of that expression. */
> if (exit_arg)
> exit_code = *exit_arg;
> @@ -1998,11 +1999,21 @@ set_history_filename (const char *args,
> directories the file written will be the same as the one
> that was read. */
> if (!IS_ABSOLUTE_PATH (history_filename))
> - history_filename = reconcat (history_filename, current_directory, "/",
> + history_filename = reconcat (history_filename, current_directory, "/",
> history_filename, (char *) NULL);
> }
>
> static void
> +init_gdb_version_var (void)
> +{
> + struct internalvar *version_var = create_internalvar ("_gdb_version");
> + int vmajor = 0, vminor = 0, vrevision = 0;
> + sscanf (version, "%d.%d.%d", &vmajor, &vminor, &vrevision);
> + set_internalvar_integer (version_var,
> + vmajor * 100 + vminor + (vrevision > 0));
> +}
> +
> +static void
> init_main (void)
> {
> struct cmd_list_element *c;
> @@ -2206,4 +2217,7 @@ gdb_init (char *argv0)
> prefix to be installed. Keep things simple and just do final
> script initialization here. */
> finish_ext_lang_initialization ();
> +
> + /* Create $_gdb_version convenience variable. */
> + init_gdb_version_var ();
> }
>