This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: infcmd.c: Output user registers correctly
On Wed, 24 Oct 2007, Daniel Jacobowitz wrote:
> On Wed, Oct 24, 2007 at 04:59:47PM +0100, Maciej W. Rozycki wrote:
> > 2007-10-24 David Ung <davidu@mips.com>
> > Maciej W. Rozycki <macro@mips.com>
> >
> > * infcmd.c (registers_info): Check for a user register before
> > calling target's gdbarch_print_registers_info(). If found to be
> > so, extract the implicit value of user register and call
> > print_scalar_formatted().
> > * value.h (value_of_user_reg): Add prototype.
> >
> > OK to apply?
>
> OK, thanks. This also fixes PR exp/1926. There may be another one
> too, but that's the only one I can find at present.
I have just checked and value_of_user_reg() is already declared in
user-regs.h. I am inclined to commit this change instead so as to avoid
having prototypes in two different places. OK?
2007-10-24 David Ung <davidu@mips.com>
Maciej W. Rozycki <macro@mips.com>
PR exp/1926
* infcmd.c (registers_info): Check for a user register before
calling target's gdbarch_print_registers_info(). If found to be
so, extract the implicit value of user register and call
print_scalar_formatted().
* Makefile.in: (infcmd.o): Add $(user_regs_h).
Maciej
Index: binutils-quilt/src/gdb/infcmd.c
===================================================================
--- binutils-quilt.orig/src/gdb/infcmd.c 2007-10-24 16:50:07.000000000 +0100
+++ binutils-quilt/src/gdb/infcmd.c 2007-10-24 18:51:16.000000000 +0100
@@ -47,6 +47,7 @@
#include "gdb_assert.h"
#include "observer.h"
#include "target-descriptions.h"
+#include "user-regs.h"
/* Functions exported for general use, in inferior.h: */
@@ -1705,21 +1706,35 @@
while ((*addr_exp) != '\0' && !isspace ((*addr_exp)))
addr_exp++;
end = addr_exp;
-
+
/* Figure out what we've found and display it. */
/* A register name? */
{
- int regnum = frame_map_name_to_regnum (frame,
- start, end - start);
+ int regnum = frame_map_name_to_regnum (frame, start, end - start);
if (regnum >= 0)
{
- gdbarch_print_registers_info (gdbarch, gdb_stdout,
- frame, regnum, fpregs);
+ /* User registers lie completely outside of the range of
+ normal registers. Catch them early so that the target
+ never sees them. */
+ if (regnum >= gdbarch_num_regs (gdbarch)
+ + gdbarch_num_pseudo_regs (gdbarch))
+ {
+ struct value *val = value_of_user_reg (regnum, frame);
+
+ printf_filtered ("%s: ", start);
+ print_scalar_formatted (value_contents (val),
+ check_typedef (value_type (val)),
+ 'x', 0, gdb_stdout);
+ printf_filtered ("\n");
+ }
+ else
+ gdbarch_print_registers_info (gdbarch, gdb_stdout,
+ frame, regnum, fpregs);
continue;
}
}
-
+
/* A register number? (how portable is this one?). */
{
char *endptr;
Index: binutils-quilt/src/gdb/Makefile.in
===================================================================
--- binutils-quilt.orig/src/gdb/Makefile.in 2007-10-24 17:01:15.000000000 +0100
+++ binutils-quilt/src/gdb/Makefile.in 2007-10-24 18:50:03.000000000 +0100
@@ -2204,7 +2204,8 @@
$(symfile_h) $(gdbcore_h) $(target_h) $(language_h) $(symfile_h) \
$(objfiles_h) $(completer_h) $(ui_out_h) $(event_top_h) \
$(parser_defs_h) $(regcache_h) $(reggroups_h) $(block_h) \
- $(solib_h) $(gdb_assert_h) $(observer_h) $(target_descriptions_h)
+ $(solib_h) $(gdb_assert_h) $(observer_h) $(target_descriptions_h) \
+ $(user_regs_h)
inf-loop.o: inf-loop.c $(defs_h) $(inferior_h) $(target_h) $(event_loop_h) \
$(event_top_h) $(inf_loop_h) $(remote_h) $(exceptions_h)
inflow.o: inflow.c $(defs_h) $(frame_h) $(inferior_h) $(command_h) \