diff options
author | Pedro Alves <palves@redhat.com> | 2019-06-18 01:20:45 +0100 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2019-06-18 01:20:45 +0100 |
commit | 9507d5238bda0fb34ea35a71f81f6622314d3993 (patch) | |
tree | 93a46339081fae6c219206f3e427a8a2edbe99f8 | |
parent | 5bb4fed3d48e4637015a89e40672c938c7f61e72 (diff) | |
download | fsf-binutils-gdb-9507d5238bda0fb34ea35a71f81f6622314d3993.zip fsf-binutils-gdb-9507d5238bda0fb34ea35a71f81f6622314d3993.tar.gz fsf-binutils-gdb-9507d5238bda0fb34ea35a71f81f6622314d3993.tar.bz2 |
Make "info threads" use the gdb::option framework
I had this in my local "print -OPT" branch, but had decided not to
include in the original series, because it's not as useful as the
others. I'm sending it now, since I had it written anyway.
This makes "info threads" use the gdb::option framework to process
options. There's only one option today (-gid), and it isn't used much
frequently unless you're looking at matching MI output. Still, this
was in the neighborhood of "thread apply" so I had converted it.
The main advantage is that TAB completion now shows you the available
options, and gives you a hint to what the command accepts as operand
argument, including showing a metasyntactic variable:
(gdb) info threads [TAB]
-gid ID
(gdb) help info threads
Display currently known threads.
Usage: info threads [OPTION]... [ID]...
Options:
-gid
Show global thread IDs.
If ID is given, it is a space-separated list of IDs of threads to display.
Otherwise, all threads are displayed.
(gdb)
gdb/ChangeLog:
2019-06-13 Pedro Alves <palves@redhat.com>
* NEWS (Completion improvements): Mention "info threads".
* thread.c (struct info_threads_opts, info_threads_option_defs)
(make_info_threads_options_def_group): New.
(info_threads_command): Use gdb::option::process_options.
(info_threads_command_completer): New.
(_initialize_thread): Use gdb::option::build_help to build the
help text for "info threads".
gdb/testsuite/ChangeLog:
2019-06-13 Pedro Alves <palves@redhat.com>
* gdb.base/options.exp (test-info-threads): New procedure.
(top level): Call it.
-rw-r--r-- | gdb/NEWS | 2 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/options.exp | 18 | ||||
-rw-r--r-- | gdb/thread.c | 82 |
3 files changed, 90 insertions, 12 deletions
@@ -194,6 +194,8 @@ maint show test-options-completion-result "taas" commands, and their "-ascending" option can now be abbreviated. + ** GDB can now complete the options of the "info threads" command. + ** GDB can now complete the options of the "compile file" and "compile code" commands. The "compile file" command now completes on filenames. diff --git a/gdb/testsuite/gdb.base/options.exp b/gdb/testsuite/gdb.base/options.exp index 4570c2a..f88e6a8 100644 --- a/gdb/testsuite/gdb.base/options.exp +++ b/gdb/testsuite/gdb.base/options.exp @@ -454,6 +454,21 @@ proc_with_prefix test-thread-apply {} { } } +# Basic option-machinery + "info threads" command integration tests. +proc_with_prefix test-info-threads {} { + test_gdb_complete_multiple "info threads " "" "" { + "-gid" + "ID" + } + + test_gdb_complete_unique \ + "info threads -" \ + "info threads -gid" + + # "ID" isn't really something the user can type. + test_gdb_complete_none "info threads I" +} + # Miscellaneous tests. proc_with_prefix test-misc {variant} { global all_options @@ -921,3 +936,6 @@ test-frame-apply # Basic "thread apply" integration tests. test-thread-apply + +# Basic "info threads" integration tests. +test-info-threads diff --git a/gdb/thread.c b/gdb/thread.c index 695572f..d13298f 100644 --- a/gdb/thread.c +++ b/gdb/thread.c @@ -1199,6 +1199,33 @@ print_thread_info (struct ui_out *uiout, const char *requested_threads, print_thread_info_1 (uiout, requested_threads, 1, pid, 0); } +/* The options for the "info threads" command. */ + +struct info_threads_opts +{ + /* For "-gid". */ + int show_global_ids = 0; +}; + +static const gdb::option::option_def info_threads_option_defs[] = { + + gdb::option::flag_option_def<info_threads_opts> { + "gid", + [] (info_threads_opts *opts) { return &opts->show_global_ids; }, + N_("Show global thread IDs."), + }, + +}; + +/* Create an option_def_group for the "info threads" options, with + IT_OPTS as context. */ + +static inline gdb::option::option_def_group +make_info_threads_options_def_group (info_threads_opts *it_opts) +{ + return {{info_threads_option_defs}, it_opts}; +} + /* Implementation of the "info threads" command. Note: this has the drawback that it _really_ switches @@ -1208,16 +1235,36 @@ print_thread_info (struct ui_out *uiout, const char *requested_threads, static void info_threads_command (const char *arg, int from_tty) { - int show_global_ids = 0; + info_threads_opts it_opts; - if (arg != NULL - && check_for_argument (&arg, "-gid", sizeof ("-gid") - 1)) + auto grp = make_info_threads_options_def_group (&it_opts); + gdb::option::process_options + (&arg, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_ERROR, grp); + + print_thread_info_1 (current_uiout, arg, 0, -1, it_opts.show_global_ids); +} + +/* Completer for the "info threads" command. */ + +static void +info_threads_command_completer (struct cmd_list_element *ignore, + completion_tracker &tracker, + const char *text, const char *word_ignored) +{ + const auto grp = make_info_threads_options_def_group (nullptr); + + if (gdb::option::complete_options + (tracker, &text, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_ERROR, grp)) + return; + + /* Convenience to let the user know what the option can accept. */ + if (*text == '\0') { - arg = skip_spaces (arg); - show_global_ids = 1; + gdb::option::complete_on_all_options (tracker, grp); + /* Keep this "ID" in sync with what "help info threads" + says. */ + tracker.add_completion (make_unique_xstrdup ("ID")); } - - print_thread_info_1 (current_uiout, arg, 0, -1, show_global_ids); } /* See gdbthread.h. */ @@ -2068,12 +2115,23 @@ _initialize_thread (void) static struct cmd_list_element *thread_apply_list = NULL; cmd_list_element *c; - add_info ("threads", info_threads_command, - _("Display currently known threads.\n\ -Usage: info threads [-gid] [ID]...\n\ --gid: Show global thread IDs.\n\ + const auto info_threads_opts = make_info_threads_options_def_group (nullptr); + + /* Note: keep this "ID" in sync with what "info threads [TAB]" + suggests. */ + static std::string info_threads_help + = gdb::option::build_help (_("\ +Display currently known threads.\n\ +Usage: info threads [OPTION]... [ID]...\n\ +\n\ +Options:\n\ +%OPTIONS%\ If ID is given, it is a space-separated list of IDs of threads to display.\n\ -Otherwise, all threads are displayed.")); +Otherwise, all threads are displayed."), + info_threads_opts); + + c = add_info ("threads", info_threads_command, info_threads_help.c_str ()); + set_cmd_completer_handle_brkchars (c, info_threads_command_completer); add_prefix_cmd ("thread", class_run, thread_command, _("\ Use this command to switch between threads.\n\ |