From 55b400279267cad460ca62a8211f0b414f564e93 Mon Sep 17 00:00:00 2001 From: Andrew Burgess Date: Thu, 21 May 2015 21:51:53 +0200 Subject: [PATCH] gdb: Add 'tui reg prev' command. There is already a 'tui reg next' command, this adds a symmetric 'tui reg prev' command. gdb/ChangeLog: * 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. * reggroups.h (reggroup_prev): Add declaration. Update comment. gdb/doc/ChangeLog: * gdb.texinfo (TUI Commands): Add 'tui reg prev' details. --- gdb/ChangeLog | 7 +++++++ gdb/doc/ChangeLog | 4 ++++ gdb/doc/gdb.texinfo | 6 ++++++ gdb/reggroups.c | 29 +++++++++++++++++++++++++++++ gdb/reggroups.h | 9 ++++++--- gdb/tui/tui-regs.c | 26 ++++++++++++++++++++++++++ 6 files changed, 78 insertions(+), 3 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index e1252e4ae1..2a6a870fa9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2015-05-26 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. + * reggroups.h (reggroup_prev): Add declaration. Update comment. + 2015-05-26 Omair Javaid Yao Qi diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 445f64d01f..b99c316ebd 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,7 @@ +2015-05-26 Andrew Burgess + + * gdb.texinfo (TUI Commands): Add 'tui reg prev' details. + 2015-05-22 Andrew Burgess * gdb.texinfo (TUI): Include 'tui enable' in the introduction. diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index e38fd314a2..566cb9a639 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -25014,6 +25014,12 @@ their order is target specific. The predefined register groups are the following: @code{general}, @code{float}, @code{system}, @code{vector}, @code{all}, @code{save}, @code{restore}. +@item tui reg prev +Show the previous register group. The list of register groups as well +as their order is target specific. The predefined register groups are +the following: @code{general}, @code{float}, @code{system}, +@code{vector}, @code{all}, @code{save}, @code{restore}. + @item tui reg system Show the system registers in the register window. diff --git a/gdb/reggroups.c b/gdb/reggroups.c index cbafc01d03..745c5ea5de 100644 --- a/gdb/reggroups.c +++ b/gdb/reggroups.c @@ -150,6 +150,35 @@ reggroup_next (struct gdbarch *gdbarch, struct reggroup *last) return NULL; } +/* See reggroups.h. */ + +struct reggroup * +reggroup_prev (struct gdbarch *gdbarch, struct reggroup *curr) +{ + struct reggroups *groups; + struct reggroup_el *el; + struct reggroup *prev; + + /* Don't allow this function to be called during architecture + creation. If there are no groups, use the default groups list. */ + groups = gdbarch_data (gdbarch, reggroups_data); + gdb_assert (groups != NULL); + if (groups->first == NULL) + groups = &default_groups; + + prev = NULL; + for (el = groups->first; el != NULL; el = el->next) + { + gdb_assert (el->group != NULL); + if (el->group == curr) + return prev; + prev = el->group; + } + if (curr == NULL) + return prev; + return NULL; +} + /* Is REGNUM a member of REGGROUP? */ int default_register_reggroup_p (struct gdbarch *gdbarch, int regnum, diff --git a/gdb/reggroups.h b/gdb/reggroups.h index 2ad74bc265..425a25c899 100644 --- a/gdb/reggroups.h +++ b/gdb/reggroups.h @@ -49,11 +49,14 @@ extern void reggroup_add (struct gdbarch *gdbarch, struct reggroup *group); extern const char *reggroup_name (struct reggroup *reggroup); extern enum reggroup_type reggroup_type (struct reggroup *reggroup); -/* Interator for the architecture's register groups. Pass in NULL, - returns the first group. Pass in a group, returns the next group, - or NULL when the last group is reached. */ +/* Iterators for the architecture's register groups. Pass in NULL, returns + the first (for next), or last (for prev) group. Pass in a group, + returns the next or previous group, or NULL when either the end or the + beginning of the group list is reached. */ extern struct reggroup *reggroup_next (struct gdbarch *gdbarch, struct reggroup *last); +extern struct reggroup *reggroup_prev (struct gdbarch *gdbarch, + struct reggroup *curr); /* Is REGNUM a member of REGGROUP? */ extern int default_register_reggroup_p (struct gdbarch *gdbarch, int regnum, diff --git a/gdb/tui/tui-regs.c b/gdb/tui/tui-regs.c index 8d4c0f8f42..7cf386d330 100644 --- a/gdb/tui/tui-regs.c +++ b/gdb/tui/tui-regs.c @@ -575,6 +575,29 @@ tui_reg_next_command (char *arg, int from_tty) } } +/* Implementation of the "tui reg prev" command. Cycle the register group + displayed in the tui REG window, moving backwards through the list of + available register groups. */ + +static void +tui_reg_prev_command (char *arg, int from_tty) +{ + struct gdbarch *gdbarch = get_current_arch (); + + if (TUI_DATA_WIN != NULL) + { + struct reggroup *group + = TUI_DATA_WIN->detail.data_display_info.current_group; + + group = reggroup_prev (gdbarch, group); + if (group == NULL) + group = reggroup_prev (gdbarch, NULL); + + if (group != NULL) + tui_show_registers (group); + } +} + static void tui_reg_float_command (char *arg, int from_tty) { @@ -630,6 +653,9 @@ _initialize_tui_regs (void) 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); } -- 2.34.1