gdb: Add 'tui reg prev' command.
authorAndrew Burgess <andrew.burgess@embecosm.com>
Thu, 21 May 2015 19:51:53 +0000 (21:51 +0200)
committerAndrew Burgess <andrew.burgess@embecosm.com>
Tue, 26 May 2015 21:18:50 +0000 (22:18 +0100)
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
gdb/doc/ChangeLog
gdb/doc/gdb.texinfo
gdb/reggroups.c
gdb/reggroups.h
gdb/tui/tui-regs.c

index e1252e4ae10ce4055a6eb4a4189dd43a7914c604..2a6a870fa99d7b15317acb4b8751bfcf56fc56e7 100644 (file)
@@ -1,3 +1,10 @@
+2015-05-26  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+       * 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  <omair.javaid@linaro.org>
            Yao Qi  <yao.qi@linaro.org>
 
index 445f64d01f49790ed8ed59e80db11d1c87b3419c..b99c316ebdc210af02dc779c8eccd802119d0ef8 100644 (file)
@@ -1,3 +1,7 @@
+2015-05-26  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+       * gdb.texinfo (TUI Commands): Add 'tui reg prev' details.
+
 2015-05-22  Andrew Burgess  <andrew.burgess@embecosm.com>
 
        * gdb.texinfo (TUI): Include 'tui enable' in the introduction.
index e38fd314a25cc93399871ef756b706f95b4febac..566cb9a639d512d73fde6e9354e2c17c0d070391 100644 (file)
@@ -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.
 
index cbafc01d0349594f9f53f7666057cd9dab75b315..745c5ea5de89e713ad00a43be7e449dbc337a4c1 100644 (file)
@@ -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,
index 2ad74bc26531c1063761250c6a72eb8b81178db0..425a25c899434e5886faf202ee10c68144dd3727 100644 (file)
@@ -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,
index 8d4c0f8f42c88dbd0db551ababfe26104403c31d..7cf386d3303244286d9afac362905eb64799e295 100644 (file)
@@ -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);
 }