From a1ff87d77ca7fa851170702fd972ae3d31f2e378 Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Wed, 22 Sep 2021 10:38:16 -0400 Subject: [PATCH] gdb: add "maint set/show selftest verbose" commands and use process_options I saw the new -verbose switch to "maint selftests" and thought it would be nice for it to use the option framework. For example, that makes having completion easy. It's not that high value, given this is a maintenance command, but I had never used the framework myself, so it was a good way to practice. This patch also adds the "maint set/show selftest verbose" setting. It would be possible to use option framework without adding the setting, but using the framework makes adding the option almost trivial, so I thought why not. Change-Id: I6687faa0713ff3da60b398253211777100094144 --- gdb/doc/gdb.texinfo | 7 +++++ gdb/maint.c | 74 ++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 76 insertions(+), 5 deletions(-) diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 4fda34e1ab8..d52cec0e5be 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -39478,6 +39478,13 @@ If a @var{filter} is passed, only the tests with @var{filter} in their name will be ran. If @code{-verbose} is passed, the self tests can be more verbose. +@kindex maint set selftest verbose +@kindex maint show selftest verbose +@cindex self tests +@item maint set selftest verbose +@item maint show selftest verbose +Control whether self tests are run verbosely or not. + @kindex maint info selftests @cindex self tests @item maint info selftests diff --git a/gdb/maint.c b/gdb/maint.c index 8aae53bdd65..4e75e47c6a7 100644 --- a/gdb/maint.c +++ b/gdb/maint.c @@ -1119,7 +1119,34 @@ set_per_command_cmd (const char *args, int from_tty) } } - +/* Options affecting the "maintenance selftest" command. */ + +struct maintenance_selftest_options +{ + bool verbose = false; +} user_maintenance_selftest_options; + +static const gdb::option::option_def maintenance_selftest_option_defs[] = { + gdb::option::boolean_option_def { + "verbose", + [] (maintenance_selftest_options *opt) { return &opt->verbose; }, + nullptr, + N_("Set whether selftests run in verbose mode."), + N_("Show whether selftests run in verbose mode."), + N_("\ +When on, selftests may print verbose information."), + }, +}; + +/* Make option groups for the "maintenance selftest" command. */ + +static std::array +make_maintenance_selftest_option_group (maintenance_selftest_options *opts) +{ + return {{ + {{maintenance_selftest_option_defs}, opts}, + }}; +} /* The "maintenance selftest" command. */ @@ -1127,15 +1154,32 @@ static void maintenance_selftest (const char *args, int from_tty) { #if GDB_SELF_TEST - bool verbose = args != nullptr && check_for_argument (&args, "-verbose"); + maintenance_selftest_options opts = user_maintenance_selftest_options; + auto grp = make_maintenance_selftest_option_group (&opts); + gdb::option::process_options + (&args, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_ERROR, grp); gdb_argv argv (args); - selftests::run_tests (argv.as_array_view (), verbose); + selftests::run_tests (argv.as_array_view (), opts.verbose); #else printf_filtered (_("\ Selftests have been disabled for this build.\n")); #endif } +/* Completer for the "maintenance selftest" command. */ + +static void +maintenance_selftest_completer (cmd_list_element *cmd, + completion_tracker &tracker, + const char *text, + const char *word) +{ + auto grp = make_maintenance_selftest_option_group (nullptr); + + gdb::option::complete_options + (tracker, &text, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_ERROR, grp); +} + static void maintenance_info_selftests (const char *arg, int from_tty) { @@ -1369,12 +1413,15 @@ This is used by the testsuite to check the command deprecator.\n\ You probably shouldn't use this."), &maintenancelist); - add_cmd ("selftest", class_maintenance, maintenance_selftest, _("\ + cmd_list_element *maintenance_selftest_cmd + = add_cmd ("selftest", class_maintenance, maintenance_selftest, _("\ Run gdb's unit tests.\n\ Usage: maintenance selftest [FILTER]\n\ This will run any unit tests that were built in to gdb.\n\ If a filter is given, only the tests with that value in their name will ran."), - &maintenancelist); + &maintenancelist); + set_cmd_completer_handle_brkchars (maintenance_selftest_cmd, + maintenance_selftest_completer); add_cmd ("selftests", class_maintenance, maintenance_info_selftests, _("List the registered selftests."), &maintenanceinfolist); @@ -1401,5 +1448,22 @@ such as demangling symbol names."), &maintenance_set_cmdlist, &maintenance_show_cmdlist); + /* Add the "maint set/show selftest" commands. */ + static cmd_list_element *set_selftest_cmdlist = nullptr; + static cmd_list_element *show_selftest_cmdlist = nullptr; + + add_setshow_prefix_cmd ("selftest", class_maintenance, + _("Self tests-related settings."), + _("Self tests-related settings."), + &set_selftest_cmdlist, &show_selftest_cmdlist, + &maintenance_set_cmdlist, &maintenance_show_cmdlist); + + /* Add setting commands matching "maintenance selftest" options. */ + gdb::option::add_setshow_cmds_for_options (class_maintenance, + &user_maintenance_selftest_options, + maintenance_selftest_option_defs, + &set_selftest_cmdlist, + &show_selftest_cmdlist); + update_thread_pool_size (); } -- 2.30.2