From ad842144541f614986b8ac5b4db4bfba733f0290 Mon Sep 17 00:00:00 2001 From: "Maciej W. Rozycki" Date: Thu, 25 Oct 2007 11:30:55 +0000 Subject: [PATCH] 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). --- gdb/ChangeLog | 10 ++++++++++ gdb/Makefile.in | 3 ++- gdb/infcmd.c | 27 +++++++++++++++++++++------ 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 1546a0450e1..82eaeb3d070 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2007-10-25 David Ung + Maciej W. Rozycki + + 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). + 2007-10-25 Joel Brobecker * NEWS: Document status of hppa64-hpux support. diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 8fc1d8afc4f..36ed94845c5 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -2208,7 +2208,8 @@ infcmd.o: infcmd.c $(defs_h) $(gdb_string_h) $(symtab_h) $(gdbtypes_h) \ $(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) \ diff --git a/gdb/infcmd.c b/gdb/infcmd.c index 7f45cc7f7d4..2fb0f23d75d 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -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 @@ registers_info (char *addr_exp, int fpregs) 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; -- 2.30.2