gdb: add "maint set/show selftest verbose" commands and use process_options
authorSimon Marchi <simon.marchi@polymtl.ca>
Wed, 22 Sep 2021 14:38:16 +0000 (10:38 -0400)
committerSimon Marchi <simon.marchi@efficios.com>
Thu, 28 Oct 2021 14:48:16 +0000 (10:48 -0400)
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
gdb/maint.c

index 4fda34e1ab813dd067776ed7f6c5a9297a781d1a..d52cec0e5bef83342908a2067c423ed87f117ffb 100644 (file)
@@ -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
index 8aae53bdd657a0f01a606832bb791a61c9d5eb40..4e75e47c6a75a3d7fc1efba8364de7163c1ca76d 100644 (file)
@@ -1119,7 +1119,34 @@ set_per_command_cmd (const char *args, int from_tty)
       }
 }
 
-\f
+/* 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 ();
 }