/* Support for GDB maintenance commands.
- Copyright (C) 1992-2021 Free Software Foundation, Inc.
+ Copyright (C) 1992-2022 Free Software Foundation, Inc.
Written by Fred Fish at Cygnus Support.
maintenance_time_display (const char *args, int from_tty)
{
if (args == NULL || *args == '\0')
- printf_unfiltered (_("\"maintenance time\" takes a numeric argument.\n"));
+ printf_filtered (_("\"maintenance time\" takes a numeric argument.\n"));
else
set_per_command_time (strtol (args, NULL, 10));
}
maintenance_space_display (const char *args, int from_tty)
{
if (args == NULL || *args == '\0')
- printf_unfiltered ("\"maintenance space\" takes a numeric argument.\n");
+ printf_filtered ("\"maintenance space\" takes a numeric argument.\n");
else
set_per_command_space (strtol (args, NULL, 10));
}
from ABFD. It might be that no such wrapper exists (for example debug
sections don't have such wrappers) in which case nullptr is returned. */
-static obj_section *
+obj_section *
maint_obj_section_from_bfd_section (bfd *abfd,
asection *asection,
objfile *ofile)
{
if (args == NULL || *args == '\0')
{
- printf_unfiltered (_("\"maintenance deprecate\" takes an argument,\n\
+ printf_filtered (_("\"maintenance deprecate\" takes an argument,\n\
the command you want to deprecate, and optionally the replacement command\n\
enclosed in quotes.\n"));
}
{
if (args == NULL || *args == '\0')
{
- printf_unfiltered (_("\"maintenance undeprecate\" takes an argument, \n\
+ printf_filtered (_("\"maintenance undeprecate\" takes an argument, \n\
the command you want to undeprecate.\n"));
}
error (_("Bad value for 'mt set per-command no'."));
for (list = per_command_setlist; list != NULL; list = list->next)
- if (list->var_type == var_boolean)
+ if (list->var->type () == var_boolean)
{
gdb_assert (list->type == set_cmd);
do_set_command (args, from_tty, list);
}
}
-\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. */
maintenance_selftest (const char *args, int from_tty)
{
#if GDB_SELF_TEST
- bool verbose = args != nullptr && check_for_argument (&args, "-verbose");
- gdb_argv argv (args);
- selftests::run_tests (argv.as_array_view (), 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);
+ const gdb_argv argv (args);
+ 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);
+
+ if (gdb::option::complete_options
+ (tracker, &text, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_ERROR, grp))
+ return;
+
+#if GDB_SELF_TEST
+ selftests::for_each_selftest ([&tracker, text] (const std::string &name)
+ {
+ if (startswith (name.c_str (), text))
+ tracker.add_completion (make_unique_xstrdup (name.c_str ()));
+ });
+#endif
+}
+
static void
maintenance_info_selftests (const char *arg, int from_tty)
{
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);
&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 ();
}