Re: [PATCH 1/2] gdb: introduce new 'maint flush ' prefix command

Luis Machado via Gdb-patches
2020-11-23T16:24:34Z

On 11/23/20 7:39 AM, Andrew Burgess wrote:
> We currently have two flushing commands 'flushregs' and 'maint
> flush-symbol-cache'. I'm planning to add at least one more so I
> thought it might be nice if we bundled these together into one place.
>
> And so I created the 'maint flush ' command prefix. Currently there
> are two commands:
>
> (gdb) maint flush symbol-cache
> (gdb) maint flush register-cache
>
> Unfortunately, even though both of the existing flush commands are
> maintenance commands, I don't know how keen we about deleting existing
> commands for fear of breaking things in the wild. So, both of the
> existing flush commands 'maint flush-symbol-cache' and 'flushregs' are
> still around as aliases to the new commands.
>
> I've updated the testsuite to use the new command syntax, and updated
> the documentation too.

Should we keep testing the alias in some way though? I see the testcases
have been updated to only use the new command. We should certify that
the old ones still exist and work?

If we plan to drop the old commands at some point (I think it makes
sense), we should probably mark them as deprecated with a set removal date.

>
> gdb/ChangeLog:
>
> * NEWS: Mention new commands.
> * cli/cli-cmds.c (maintenanceflushlist): Define.
> * cli/cli-cmds.h (maintenanceflushlist): Declare.
> * maint.c (_initialize_maint_cmds): Initialise
> maintenanceflushlist.
> * regcache.c: Add 'cli/cli-cmds.h' include.
> (reg_flush_command): Add header comment.
> (_initialize_regcache): Create new 'maint flush register-cache'
> command, make 'flushregs' an alias.
> * symtab.c: Add 'cli/cli-cmds.h' include.
> (_initialize_symtab): Create new 'maint flush symbol-cache'
> command, make old command an alias.
>
> gdb/doc/ChangeLog:
>
> * gdb.texinfo (Symbols): Document 'maint flush symbol-cache'.
> (Maintenance Commands): Document 'maint flush register-cache'.
>
> gdb/testsuite/ChangeLog:
>
> * gdb.base/c-linkage-name.exp: Update to use new 'maint flush ...'
> commands.
> * gdb.base/killed-outside.exp: Likewise.
> * gdb.opt/inline-bt.exp: Likewise.
> * gdb.perf/gmonster-null-lookup.py: Likewise.
> * gdb.perf/gmonster-print-cerr.py: Likewise.
> * gdb.perf/gmonster-ptype-string.py: Likewise.
> * gdb.python/py-unwind.exp: Likewise.
> ---
> gdb/ChangeLog | 15 ++++++++++++++
> gdb/NEWS | 5 +++++
> gdb/cli/cli-cmds.c | 4 ++++
> gdb/cli/cli-cmds.h | 4 ++++
> gdb/doc/ChangeLog | 5 +++++
> gdb/doc/gdb.texinfo | 20 +++++++++++++++----
> gdb/maint.c | 5 +++++
> gdb/regcache.c | 11 ++++++++--
> gdb/symtab.c | 8 ++++++--
> gdb/testsuite/ChangeLog | 11 ++++++++++
> gdb/testsuite/gdb.base/c-linkage-name.exp | 2 +-
> gdb/testsuite/gdb.base/killed-outside.exp | 2 +-
> gdb/testsuite/gdb.opt/inline-bt.exp | 2 +-
> .../gdb.perf/gmonster-null-lookup.py | 2 +-
> gdb/testsuite/gdb.perf/gmonster-print-cerr.py | 2 +-
> .../gdb.perf/gmonster-ptype-string.py | 2 +-
> gdb/testsuite/gdb.python/py-unwind.exp | 2 +-
> 17 files changed, 87 insertions(+), 15 deletions(-)
>
> diff --git a/gdb/NEWS b/gdb/NEWS
> index d1f721c3953..b07b054223f 100644
> --- a/gdb/NEWS
> +++ b/gdb/NEWS
> @@ -27,6 +27,11 @@ set debug event-loop
> show debug event-loop
> Control the display of debug output about GDB's event loop.
>
> +maintenance flush symbol-cache
> +maintenance flush register-cache
> + These new commands are equivalent to the already existing command > + 'maintenance flush-symbol-cache' and 'flushregs' respectively.
> +

Not a native speaker, but "already existing" sounds a bit verbose. Would
existing suffice? Also, probably "existing commands" rather than
"existing command"?

> * Changed commands
>
> break [PROBE_MODIFIER] [LOCATION] [thread THREADNUM]
> diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c
> index 54822fad481..88c83cd6319 100644
> --- a/gdb/cli/cli-cmds.c
> +++ b/gdb/cli/cli-cmds.c
> @@ -151,6 +151,10 @@ struct cmd_list_element *maintenanceprintlist;
>
> struct cmd_list_element *maintenancechecklist;
>
> +/* Chain containing all defined "maintenance flush" subcommands. */
> +
> +struct cmd_list_element *maintenanceflushlist;
> +
> struct cmd_list_element *setprintlist;
>
> struct cmd_list_element *showprintlist;
> diff --git a/gdb/cli/cli-cmds.h b/gdb/cli/cli-cmds.h
> index 1d641520bf5..976cea07806 100644
> --- a/gdb/cli/cli-cmds.h
> +++ b/gdb/cli/cli-cmds.h
> @@ -89,6 +89,10 @@ extern struct cmd_list_element *maintenanceinfolist;
>
> extern struct cmd_list_element *maintenanceprintlist;
>
> +/* Chain containing all defined "maintenance flush" subcommands. */
> +
> +extern struct cmd_list_element *maintenanceflushlist;
> +
> extern struct cmd_list_element *setprintlist;
>
> extern struct cmd_list_element *showprintlist;
> diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
> index 01dcac941c2..3745aa52973 100644
> --- a/gdb/doc/gdb.texinfo
> +++ b/gdb/doc/gdb.texinfo
> @@ -19503,12 +19503,17 @@
> Print symbol cache usage statistics.
> This helps determine how well the cache is being utilized.
>
> +@kindex maint flush symbol-cache
> @kindex maint flush-symbol-cache
> @cindex symbol cache, flushing
> +@item maint flush symbol-cache
> @item maint flush-symbol-cache
> -Flush the contents of the symbol cache, all entries are removed.
> -This command is useful when debugging the symbol cache.
> -It is also useful when collecting performance data.
> +Flush the contents of the symbol cache, all entries are removed. This
> +command is useful when debugging the symbol cache. It is also useful
> +when collecting performance data. The command @code{maint
> +flush-symbol-cache} is an alias for @code{maint flush symbol-cache}
> +that exists for backward compatibility with older versions of
> +@value{GDBN}.
>
> @end table
>
> @@ -38859,9 +38864,16 @@
> restore internal
> @end smallexample
>
> +@kindex maint flush register-cache
> @kindex flushregs
> +@cindex register cache, flushing
> +@item maint flush register-cache
> @item flushregs
> -This command forces @value{GDBN} to flush its internal register cache.
> +Flush the contents of the register cache and as a consequence the
> +frame cache. This command is useful when debugging issues related to
> +register fetching, or frame unwinding. The command @code{flushregs}
> +is an alias for @code{maint flush register-cache} that exists for
> +backward compatibility with older versions of @value{GDBN}.
>
> @kindex maint print objfiles
> @cindex info for known object files
> diff --git a/gdb/maint.c b/gdb/maint.c
> index e8cdda3da0e..5b83cf2ae72 100644
> --- a/gdb/maint.c
> +++ b/gdb/maint.c
> @@ -1083,6 +1083,11 @@ lists all sections from all object files, including shared libraries."),
> &maintenanceprintlist, "maintenance print ", 0,
> &maintenancelist);
>
> + add_basic_prefix_cmd ("flush", class_maintenance,
> + _("Maintenance command for flushing GDB internal caches."),
> + &maintenanceflushlist, "maintenance flush ", 0,
> + &maintenancelist);
> +
> add_basic_prefix_cmd ("set", class_maintenance, _("\
> Set GDB internal variables used by the GDB maintainer.\n\
> Configure variables internal to GDB that aid in GDB's maintenance"),
> diff --git a/gdb/regcache.c b/gdb/regcache.c
> index 91d3202b94b..7985df0a776 100644
> --- a/gdb/regcache.c
> +++ b/gdb/regcache.c
> @@ -30,6 +30,7 @@
> #include "observable.h"
> #include "regset.h"
> #include <unordered_map>
> +#include "cli/cli-cmds.h"
>
> /*
> * DATA STRUCTURE
> @@ -1382,6 +1383,8 @@ regcache::debug_print_register (const char *func, int regno)
> fprintf_unfiltered (gdb_stdlog, "\n");
> }
>
> +/* Implement 'maint flush register-cache' command. */
> +

Implement "the ... command"?

> static void
> reg_flush_command (const char *command, int from_tty)
> {
> @@ -2082,8 +2085,12 @@ _initialize_regcache ()
> gdb::observers::target_changed.attach (regcache_observer_target_changed);
> gdb::observers::thread_ptid_changed.attach (regcache_thread_ptid_changed);
>
> - add_com ("flushregs", class_maintenance, reg_flush_command,
> - _("Force gdb to flush its register cache (maintainer command)."));
> + add_cmd ("register-cache", class_maintenance, reg_flush_command,
> + _("Force gdb to flush its register and frame cache."),
> + &maintenanceflushlist);
> + /* This alias exists for backwards compatibility. */
> + add_com_alias ("flushregs", "maintenance flush register-cache",
> + class_maintenance, 0);
>
> #if GDB_SELF_TEST
> selftests::register_test ("get_thread_arch_aspace_regcache",
> diff --git a/gdb/symtab.c b/gdb/symtab.c
> index dccc3d1e237..b7d0e70f4a7 100644
> --- a/gdb/symtab.c
> +++ b/gdb/symtab.c
> @@ -42,6 +42,7 @@
> #include "addrmap.h"
> #include "cli/cli-utils.h"
> #include "cli/cli-style.h"
> +#include "cli/cli-cmds.h"
> #include "fnmatch.h"
> #include "hashtab.h"
> #include "typeprint.h"
> @@ -6929,10 +6930,13 @@ If zero then the symbol cache is disabled."),
> _("Print symbol cache statistics for each program space."),
> &maintenanceprintlist);
>
> - add_cmd ("flush-symbol-cache", class_maintenance,
> + add_cmd ("symbol-cache", class_maintenance,
> maintenance_flush_symbol_cache,
> _("Flush the symbol cache for each program space."),
> - &maintenancelist);
> + &maintenanceflushlist);
> + /* This alias exists for backwards compatibility. */
> + add_alias_cmd ("flush-symbol-cache", "flush symbol-cache", class_maintenance, 0,
> + &maintenancelist);
>
> gdb::observers::executable_changed.attach (symtab_observer_executable_changed);
> gdb::observers::new_objfile.attach (symtab_new_objfile_observer);
> diff --git a/gdb/testsuite/gdb.base/c-linkage-name.exp b/gdb/testsuite/gdb.base/c-linkage-name.exp
> index 6b0a014949e..c6b3b509df6 100644
> --- a/gdb/testsuite/gdb.base/c-linkage-name.exp
> +++ b/gdb/testsuite/gdb.base/c-linkage-name.exp
> @@ -64,7 +64,7 @@ gdb_test "maint info symtabs" "\{ symtab \[^\r\n\]*c-linkage-name-2.c.*"
>
> # Flush the symbol cache to prevent the lookup to return the same as before.
>
> -gdb_test "maint flush-symbol-cache"
> +gdb_test "maint flush symbol-cache"
>
> # Try to print MUNDANE using its linkage name again, after partial
> # symtab expansion.
> diff --git a/gdb/testsuite/gdb.base/killed-outside.exp b/gdb/testsuite/gdb.base/killed-outside.exp
> index 3e20ad67cee..645b41f4867 100644
> --- a/gdb/testsuite/gdb.base/killed-outside.exp
> +++ b/gdb/testsuite/gdb.base/killed-outside.exp
> @@ -115,7 +115,7 @@ with_test_prefix "stepi" {
> # other commands would trigger.
> with_test_prefix "registers" {
> test {
> - gdb_test "flushregs" ".*"
> + gdb_test "maint flush register-cache" ".*"
> gdb_test "info threads" ".*"
> }
> }
> diff --git a/gdb/testsuite/gdb.opt/inline-bt.exp b/gdb/testsuite/gdb.opt/inline-bt.exp
> index d428c396359..109627c2306 100644
> --- a/gdb/testsuite/gdb.opt/inline-bt.exp
> +++ b/gdb/testsuite/gdb.opt/inline-bt.exp
> @@ -61,7 +61,7 @@ gdb_test "info frame" ".*inlined into frame.*" "func2 inlined (3)"
> # function.
> gdb_test_no_output "set backtrace limit 2"
> # Force flushing the frame cache.
> -gdb_test "flushregs" "Register cache flushed."
> +gdb_test "maint flush register-cache" "Register cache flushed."
> gdb_test "up" "#1 .*func1.*" "up from bar (4)"
> gdb_test "info frame" ".*in func1.*" "info frame still works"
> # Verify the user visible limit works as expected.
> diff --git a/gdb/testsuite/gdb.perf/gmonster-null-lookup.py b/gdb/testsuite/gdb.perf/gmonster-null-lookup.py
> index eaf4b11c9f8..f4ce1ea55e9 100644
> --- a/gdb/testsuite/gdb.perf/gmonster-null-lookup.py
> +++ b/gdb/testsuite/gdb.perf/gmonster-null-lookup.py
> @@ -40,7 +40,7 @@ class NullLookup(perftest.TestCaseWithBasicMeasurements):
> utils.safe_execute("mt expand-symtabs")
> iteration = 5
> while iteration > 0:
> - utils.safe_execute("mt flush-symbol-cache")
> + utils.safe_execute("mt flush symbol-cache")
> func = lambda: utils.safe_execute("p symbol_not_found")
> self.measure.measure(func, run)
> iteration -= 1
> diff --git a/gdb/testsuite/gdb.perf/gmonster-print-cerr.py b/gdb/testsuite/gdb.perf/gmonster-print-cerr.py
> index 796380dcacd..adee2e601aa 100644
> --- a/gdb/testsuite/gdb.perf/gmonster-print-cerr.py
> +++ b/gdb/testsuite/gdb.perf/gmonster-print-cerr.py
> @@ -46,7 +46,7 @@ class PrintCerr(perftest.TestCaseWithBasicMeasurements):
> utils.runto_main()
> iteration = 5
> while iteration > 0:
> - utils.safe_execute("mt flush-symbol-cache")
> + utils.safe_execute("mt flush symbol-cache")
> func = lambda: utils.safe_execute("print gm_std::cerr")
> self.measure.measure(func, run)
> iteration -= 1
> diff --git a/gdb/testsuite/gdb.perf/gmonster-ptype-string.py b/gdb/testsuite/gdb.perf/gmonster-ptype-string.py
> index 78fa3dfd432..aa5513547e5 100644
> --- a/gdb/testsuite/gdb.perf/gmonster-ptype-string.py
> +++ b/gdb/testsuite/gdb.perf/gmonster-ptype-string.py
> @@ -41,7 +41,7 @@ class GmonsterPtypeString(perftest.TestCaseWithBasicMeasurements):
> utils.safe_execute("mt expand-symtabs")
> iteration = 5
> while iteration > 0:
> - utils.safe_execute("mt flush-symbol-cache")
> + utils.safe_execute("mt flush symbol-cache")
> func1 = lambda: utils.safe_execute("ptype hello")
> func = lambda: utils.run_n_times(2, func1)
> self.measure.measure(func, run)
> diff --git a/gdb/testsuite/gdb.python/py-unwind.exp b/gdb/testsuite/gdb.python/py-unwind.exp
> index 4ef63bf965c..e8ae8632a8e 100644
> --- a/gdb/testsuite/gdb.python/py-unwind.exp
> +++ b/gdb/testsuite/gdb.python/py-unwind.exp
> @@ -57,4 +57,4 @@ gdb_test_sequence "where" "Backtrace restored by unwinder" {
> }
>
> # Check that the Python unwinder frames can be flushed / released.
> -gdb_test "flushregs" "Register cache flushed\\." "flush frames"
> +gdb_test "maint flush register-cache" "Register cache flushed\\." "flush frames"
>

Otherwise LGTM.