[v3,1/2] Add new GDB command "maint print user-registers"
Commit Message
This adds a command for listing the "user" registers. So far GDB
offered no means of determining the set of user registers and omitted
them from all other register listings.
gdb/ChangeLog:
* user-regs.c: Include "target.h" and "cli/cli-cmds.h".
(maintenance_print_user_registers): New.
(_initialize_user_regs): Register new "maint print user-registers"
subcommand.
* NEWS: Mention new GDB command "maint print user-registers".
gdb/doc/ChangeLog:
* gdb.texinfo: Document "maint print user-registers".
---
gdb/NEWS | 3 +++
gdb/doc/gdb.texinfo | 12 ++++++++++++
gdb/user-regs.c | 30 ++++++++++++++++++++++++++++++
3 files changed, 45 insertions(+)
Comments
Andreas Arnez <arnez@linux.vnet.ibm.com> writes:
> [...]
> @@ -215,10 +217,38 @@ value_of_user_reg (int regnum, struct frame_info *frame)
> return reg->read (frame, reg->baton);
> }
>
> +static void
> +maintenance_print_user_registers (char *args, int from_tty)
> +{
> + struct gdbarch *gdbarch;
> + struct gdb_user_regs *regs;
> + struct user_reg *reg;
> + int nr;
> +
> + if (!target_has_registers)
> + error (_("The program has no registers now."));
> +
> + gdbarch = get_frame_arch (get_selected_frame (NULL));
> + regs = gdbarch_data (gdbarch, user_regs_data);
> + nr = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
> +
> + fprintf_unfiltered (gdb_stdout, " Nr Name\n");
> + for (reg = regs->first; reg != NULL; reg = reg->next)
> + {
> + fprintf_unfiltered (gdb_stdout, "%3d %s\n", nr, reg->name);
> + nr++;
> + }
> +}
> +
> [...]
Hi.
Nit: I realize the rest of the file uses "nr" but
it's a horrible name. I hadn't read user-regs.c
in awhile, and was reading your patch absent that context.
I read "nr" and think "number of registers",
and that's the only thing that comes to mind
as a possible interpretation.
I'm not asking you to change any other uses,
but can I ask that "nr" here be named "regnum" or some such.
In the column title you could use "Num" or some such.
Also, I think the loop would be more readable thusly:
+ for (reg = regs->first; reg != NULL; reg = reg->next, regnum++)
I have a slight preference for this instead:
+ for (reg = regs->first; reg != NULL; reg = reg->next, ++regnum)
but the rest of the file uses post-inc, so whatever.
> From: Andreas Arnez <arnez@linux.vnet.ibm.com>
> Date: Wed, 10 Dec 2014 18:22:38 +0100
>
> This adds a command for listing the "user" registers. So far GDB
> offered no means of determining the set of user registers and omitted
> them from all other register listings.
Thanks.
> +@kindex maint print user-registers
> +@cindex user registers
> +@item maint print user-registers
> +List all currently available ``user'' registers. User registers
When you first introduce new terminology, it is best to use @dfn, like
this:
List all currently available @dfn{user registers}.
This will look prettier in print, and will have the same effect as
``..'' in the Info manual.
Other than that, the documentation parts are OK.
On Wed, Dec 10 2014, Eli Zaretskii wrote:
> When you first introduce new terminology, it is best to use @dfn, like
> this:
>
> List all currently available @dfn{user registers}.
>
> This will look prettier in print, and will have the same effect as
> ``..'' in the Info manual.
Sure, I will include this change in the next version.
@@ -45,6 +45,9 @@ add-auto-load-scripts-directory directory
Add entries to the list of directories from which to load auto-loaded
scripts.
+maint print user-registers
+ List all currently available "user" registers.
+
* On resume, GDB now always passes the signal the program had stopped
for to the thread the signal was sent to, even if the user changed
threads before resuming. Previously GDB would often (but not
@@ -10256,6 +10256,7 @@ the selected stack frame. The @var{regname} may be any register name valid on
the machine you are using, with or without the initial @samp{$}.
@end table
+@anchor{standard registers}
@cindex stack pointer register
@cindex program counter register
@cindex process status register
@@ -33435,6 +33436,17 @@ If @var{regexp} is specified, only print object files whose names
match @var{regexp}. For each object file, this command prints its name,
address in memory, and all of its psymtabs and symtabs.
+@kindex maint print user-registers
+@cindex user registers
+@item maint print user-registers
+List all currently available ``user'' registers. User registers
+typically provide alternate names for actual hardware registers. They
+include the four ``standard'' registers @code{$fp}, @code{$pc},
+@code{$sp}, and @code{$ps}. @xref{standard registers}. User
+registers can be used in expressions in the same way as the canonical
+register names, but only the latter are listed by the @code{info
+registers} and @code{maint print registers} commands.
+
@kindex maint print section-scripts
@cindex info for known .debug_gdb_scripts-loaded scripts
@item maint print section-scripts [@var{regexp}]
@@ -23,6 +23,8 @@
#include "user-regs.h"
#include "gdbtypes.h"
#include "frame.h"
+#include "target.h"
+#include "cli/cli-cmds.h"
/* A table of user registers.
@@ -215,10 +217,38 @@ value_of_user_reg (int regnum, struct frame_info *frame)
return reg->read (frame, reg->baton);
}
+static void
+maintenance_print_user_registers (char *args, int from_tty)
+{
+ struct gdbarch *gdbarch;
+ struct gdb_user_regs *regs;
+ struct user_reg *reg;
+ int nr;
+
+ if (!target_has_registers)
+ error (_("The program has no registers now."));
+
+ gdbarch = get_frame_arch (get_selected_frame (NULL));
+ regs = gdbarch_data (gdbarch, user_regs_data);
+ nr = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
+
+ fprintf_unfiltered (gdb_stdout, " Nr Name\n");
+ for (reg = regs->first; reg != NULL; reg = reg->next)
+ {
+ fprintf_unfiltered (gdb_stdout, "%3d %s\n", nr, reg->name);
+ nr++;
+ }
+}
+
extern initialize_file_ftype _initialize_user_regs; /* -Wmissing-prototypes */
void
_initialize_user_regs (void)
{
user_regs_data = gdbarch_data_register_post_init (user_regs_init);
+
+ add_cmd ("user-registers", class_maintenance,
+ maintenance_print_user_registers,
+ _("List the names of the current user registers.\n"),
+ &maintenanceprintlist);
}