From patchwork Thu May 21 22:17:12 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Burgess X-Patchwork-Id: 6859 Received: (qmail 37660 invoked by alias); 21 May 2015 22:17:43 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 37650 invoked by uid 89); 21 May 2015 22:17:43 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=1.9 required=5.0 tests=AWL, BAYES_50, KAM_LAZY_DOMAIN_SECURITY, RCVD_IN_DNSWL_NONE, UNSUBSCRIBE_BODY autolearn=no version=3.3.2 X-HELO: mail-wg0-f45.google.com Received: from mail-wg0-f45.google.com (HELO mail-wg0-f45.google.com) (74.125.82.45) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Thu, 21 May 2015 22:17:41 +0000 Received: by wghq2 with SMTP id q2so1109171wgh.1 for ; Thu, 21 May 2015 15:17:37 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:in-reply-to:references; bh=JwfSN1XrVjqhdM1vIOm4QlHF85JNe2Obh0NWqM7imig=; b=Qm8TTRL5eJRCIF6G3TDDB+xKwkJLE/+pv8GZM95O9OvccFC3lDQVU6CyoDy4xYShnC P8YZ74/0ar8sN1SohnJhkpzcnPGJBQt3iriIspLahwkdRIbx5I6ksO/sF1W/9O/czuDc 2ApGrW+4vbAibyOOtlHLTdkxbNSpugiuhZbaHi6Of47ryLGAex/9GV9ksbN1kgDIC2xP AuK4NkiiZqZM3/zVFi36OQz3ug4LtWrJaXrXo4P37NikVU59MC3xeNIOtnN/5QWk2Hxf FN46RlHDY1GWOtsfD0+6Cn2FEmrcCsO1+6E1GHS/s2FVKoYE50YDoyNk2NVCPRe7Tx15 DlMw== X-Gm-Message-State: ALoCoQlG9kRcvsXk8RTb80P8hq1tvGEkQvscXuFyNcSSuWSm9frXakmwX4GqXzuixcNtgFMb+ikY X-Received: by 10.194.172.130 with SMTP id bc2mr1692157wjc.85.1432246657536; Thu, 21 May 2015 15:17:37 -0700 (PDT) Received: from localhost ([46.189.28.226]) by mx.google.com with ESMTPSA id g8sm259137wjn.18.2015.05.21.15.17.36 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 21 May 2015 15:17:36 -0700 (PDT) From: Andrew Burgess To: gdb-patches@sourceware.org Cc: Andrew Burgess Subject: [PATCH 2/2] gdb: Rework command completion on 'tui reg'. Date: Fri, 22 May 2015 00:17:12 +0200 Message-Id: <58e17eaffc56924038a839aa42e00a96dc1832b5.1432246159.git.andrew.burgess@embecosm.com> In-Reply-To: References: In-Reply-To: References: X-IsSubscribed: yes We previously specified a few known register groups for the 'tui reg' command. Other register groups could be accessed, but only by using the 'tui reg next' command and cycling through all the groups. This commit removes the hard coded sub-commands of 'tui reg' and instead adds dynamic completion of sub-commands based on the architecturally defined register groups, giving immediate access to all available register groups. There is still the 'next' and 'prev' commands for cycling through the register groups if that's wanted. gdb/ChangeLog: * completer.c (reg_or_group_completer_1): New function containing old reg_or_group_completer. (reg_or_group_completer): Call new reg_or_group_completer_1. (reggroup_completer): Call new reg_or_group_completer_1. * completer.h (reggroup_completer): Add declaration. * tui/tui-regs.c: Add 'completer.h' include. (tui_reg_next_command): Renamed to... (tui_reg_name): ...this. Adjust parameters. (tui_reg_prev_command): Renamed to... (tui_reg_prev): ...this. Adjust parameters. (tui_reg_float_command): Delete. (tui_reg_general_command): Delete. (tui_reg_system_command): Delete. (tui_reg_command): Rewrite to perform switching of register group. (tuireglist): Remove. (tui_reggroup_completer): New function. (_initialize_tui_regs): Remove 'tui reg' sub-commands, update creation of 'tui reg' command. --- gdb/ChangeLog | 21 +++++++++ gdb/completer.c | 57 ++++++++++++++++--------- gdb/completer.h | 3 ++ gdb/tui/tui-regs.c | 123 +++++++++++++++++++++++++++++++++-------------------- 4 files changed, 140 insertions(+), 64 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b19e3ca..5ee18d0 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,26 @@ 2015-05-21 Andrew Burgess + * completer.c (reg_or_group_completer_1): New function containing + old reg_or_group_completer. + (reg_or_group_completer): Call new reg_or_group_completer_1. + (reggroup_completer): Call new reg_or_group_completer_1. + * completer.h (reggroup_completer): Add declaration. + * tui/tui-regs.c: Add 'completer.h' include. + (tui_reg_next_command): Renamed to... + (tui_reg_name): ...this. Adjust parameters. + (tui_reg_prev_command): Renamed to... + (tui_reg_prev): ...this. Adjust parameters. + (tui_reg_float_command): Delete. + (tui_reg_general_command): Delete. + (tui_reg_system_command): Delete. + (tui_reg_command): Rewrite to perform switching of register group. + (tuireglist): Remove. + (tui_reggroup_completer): New function. + (_initialize_tui_regs): Remove 'tui reg' sub-commands, update + creation of 'tui reg' command. + +2015-05-21 Andrew Burgess + * tui/tui-regs.c (tui_reg_prev_command): New function. (_initialize_tui_regs): Add 'prev' command for 'tui reg'. * reggroups.c (reggroup_prev): New function. diff --git a/gdb/completer.c b/gdb/completer.c index c8c0e4c..73f734e 100644 --- a/gdb/completer.c +++ b/gdb/completer.c @@ -971,9 +971,10 @@ signal_completer (struct cmd_list_element *ignore, /* Complete on a register or reggroup. */ -VEC (char_ptr) * -reg_or_group_completer (struct cmd_list_element *ignore, - const char *text, const char *word) +static VEC (char_ptr) * +reg_or_group_completer_1 (struct cmd_list_element *ignore, + const char *text, const char *word, + int add_registers, int add_reggroups) { VEC (char_ptr) *result = NULL; size_t len = strlen (word); @@ -985,28 +986,46 @@ reg_or_group_completer (struct cmd_list_element *ignore, if (!target_has_registers) return result; + gdb_assert (add_registers || add_reggroups); gdbarch = get_frame_arch (get_selected_frame (NULL)); - for (i = 0; - (name = user_reg_map_regnum_to_name (gdbarch, i)) != NULL; - i++) - { - if (*name != '\0' && strncmp (word, name, len) == 0) - VEC_safe_push (char_ptr, result, xstrdup (name)); - } - - for (group = reggroup_next (gdbarch, NULL); - group != NULL; - group = reggroup_next (gdbarch, group)) - { - name = reggroup_name (group); - if (strncmp (word, name, len) == 0) - VEC_safe_push (char_ptr, result, xstrdup (name)); - } + if (add_registers) + for (i = 0; + (name = user_reg_map_regnum_to_name (gdbarch, i)) != NULL; + i++) + { + if (*name != '\0' && strncmp (word, name, len) == 0) + VEC_safe_push (char_ptr, result, xstrdup (name)); + } + + if (add_reggroups) + for (group = reggroup_next (gdbarch, NULL); + group != NULL; + group = reggroup_next (gdbarch, group)) + { + name = reggroup_name (group); + if (strncmp (word, name, len) == 0) + VEC_safe_push (char_ptr, result, xstrdup (name)); + } return result; } +VEC (char_ptr) * +reg_or_group_completer (struct cmd_list_element *ignore, + const char *text, const char *word) +{ + /* Complete on both registers and reggroups. */ + return reg_or_group_completer_1 (ignore, text, word, 1, 1); +} + +VEC (char_ptr) * +reggroup_completer (struct cmd_list_element *ignore, + const char *text, const char *word) +{ + /* Complete on reggroups only. */ + return reg_or_group_completer_1 (ignore, text, word, 0, 1); +} /* Get the list of chars that are considered as word breaks for the current command. */ diff --git a/gdb/completer.h b/gdb/completer.h index 56e1a2b..6c1f257 100644 --- a/gdb/completer.h +++ b/gdb/completer.h @@ -96,6 +96,9 @@ extern VEC (char_ptr) *signal_completer (struct cmd_list_element *, extern VEC (char_ptr) *reg_or_group_completer (struct cmd_list_element *, const char *, const char *); +extern VEC (char_ptr) *reggroup_completer (struct cmd_list_element *, + const char *, const char *); + extern char *get_gdb_completer_quote_characters (void); extern char *gdb_completion_word_break_characters (void); diff --git a/gdb/tui/tui-regs.c b/gdb/tui/tui-regs.c index 8dbcda1..685a896 100644 --- a/gdb/tui/tui-regs.c +++ b/gdb/tui/tui-regs.c @@ -39,6 +39,7 @@ #include "tui/tui-io.h" #include "reggroups.h" #include "valprint.h" +#include "completer.h" #include "gdb_curses.h" @@ -557,10 +558,8 @@ tui_display_register (struct tui_data_element *data, } static void -tui_reg_next_command (char *arg, int from_tty) +tui_reg_next (struct gdbarch *gdbarch) { - struct gdbarch *gdbarch = get_current_arch (); - if (TUI_DATA_WIN != NULL) { struct reggroup *group @@ -576,10 +575,8 @@ tui_reg_next_command (char *arg, int from_tty) } static void -tui_reg_prev_command (char *arg, int from_tty) +tui_reg_prev (struct gdbarch *gdbarch) { - struct gdbarch *gdbarch = get_current_arch (); - if (TUI_DATA_WIN != NULL) { struct reggroup *group @@ -606,31 +603,84 @@ tui_reg_prev_command (char *arg, int from_tty) } static void -tui_reg_float_command (char *arg, int from_tty) +tui_reg_command (char *args, int from_tty) { - tui_show_registers (float_reggroup); -} + struct gdbarch *gdbarch = get_current_arch (); -static void -tui_reg_general_command (char *arg, int from_tty) -{ - tui_show_registers (general_reggroup); -} + if (args) + { + if (strcmp (args, "next") == 0) + tui_reg_next (gdbarch); + else if (strcmp (args, "prev") == 0) + tui_reg_prev (gdbarch); + else + { + struct reggroup *group = NULL, *match = NULL; + size_t len = strlen (args); -static void -tui_reg_system_command (char *arg, int from_tty) -{ - tui_show_registers (system_reggroup); + for (group = reggroup_next (gdbarch, group); + group != NULL; + group = reggroup_next (gdbarch, group)) + { + if (strncmp (reggroup_name (group), args, len) == 0) + { + if (match != NULL) + { + match = NULL; + break; + } + match = group; + } + } + + if (match != NULL) + tui_show_registers (match); + else + error (_("unknown register group '%s'"), args); + } + } + else + { + struct reggroup *group = NULL; + + printf_unfiltered (_("\"tui reg\" must be followed by the name of " + "either a register group,\nor one of 'next' " + "or 'prev'. Known register groups are:\n")); + for (group = reggroup_next (gdbarch, group); group != NULL; ) + { + printf_unfiltered ("%s", reggroup_name (group)); + group = reggroup_next (gdbarch, group); + if (group != NULL) + printf_unfiltered (", "); + } + printf_unfiltered ("\n"); + } } -static struct cmd_list_element *tuireglist; +/* Complete names of register groups, and add the special "prev" and "next" + names. */ -static void -tui_reg_command (char *args, int from_tty) +static VEC (char_ptr) * +tui_reggroup_completer (struct cmd_list_element *ignore, + const char *text, const char *word) { - printf_unfiltered (_("\"tui reg\" must be followed by the name of a " - "tui reg command.\n")); - help_list (tuireglist, "tui reg ", all_commands, gdb_stdout); + VEC (char_ptr) *result = NULL; + static const char *extra[] = { "next", "prev", NULL }; + size_t len = strlen (word); + const char **tmp; + + if (!target_has_registers) + return result; + + result = reggroup_completer (ignore, text, word); + + for (tmp = extra; *tmp; ++tmp) + { + if (strncmp (word, *tmp, len) == 0) + VEC_safe_push (char_ptr, result, xstrdup (*tmp)); + } + + return result; } /* Provide a prototype to silence -Wmissing-prototypes. */ @@ -639,30 +689,13 @@ extern initialize_file_ftype _initialize_tui_regs; void _initialize_tui_regs (void) { - struct cmd_list_element **tuicmd; + struct cmd_list_element **tuicmd, *cmd; tuicmd = tui_get_cmd_list (); - add_prefix_cmd ("reg", class_tui, tui_reg_command, - _("TUI commands to control the register window."), - &tuireglist, "tui reg ", 0, - tuicmd); - - add_cmd ("float", class_tui, tui_reg_float_command, - _("Display only floating point registers."), - &tuireglist); - add_cmd ("general", class_tui, tui_reg_general_command, - _("Display only general registers."), - &tuireglist); - add_cmd ("system", class_tui, tui_reg_system_command, - _("Display only system registers."), - &tuireglist); - add_cmd ("next", class_tui, tui_reg_next_command, - _("Display next register group."), - &tuireglist); - add_cmd ("prev", class_tui, tui_reg_prev_command, - _("Display previous register group."), - &tuireglist); + cmd = add_cmd ("reg", class_tui, tui_reg_command, _("\ +TUI command to control the register window."), tuicmd); + set_cmd_completer (cmd, tui_reggroup_completer); }