aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Marchi <simon.marchi@polymtl.ca>2021-09-22 10:38:16 -0400
committerSimon Marchi <simon.marchi@efficios.com>2021-10-28 10:48:16 -0400
commita1ff87d77ca7fa851170702fd972ae3d31f2e378 (patch)
tree796e94e5e02072e993e0e6569e302b76d31d4116
parent2e466f72c43a515f4dac5c65cca5cdf3f24dad21 (diff)
downloadbinutils-a1ff87d77ca7fa851170702fd972ae3d31f2e378.zip
binutils-a1ff87d77ca7fa851170702fd972ae3d31f2e378.tar.gz
binutils-a1ff87d77ca7fa851170702fd972ae3d31f2e378.tar.bz2
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
-rw-r--r--gdb/doc/gdb.texinfo7
-rw-r--r--gdb/maint.c74
2 files changed, 76 insertions, 5 deletions
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 4fda34e..d52cec0 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 8aae53b..4e75e47 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<maintenance_selftest_options> {
+ "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<gdb::option::option_def_group, 1>
+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 ();
}