2002-08-21 Andrew Cagney <ac131313@redhat.com>

* infcmd.c (default_print_registers_info): Replace
do_registers_info.
(registers_info): Use gdbarch_print_registers_info instead of
DO_REGISTERS_INFO.
* inferior.h (default_print_registers_info): Replace
do_registers_info.
* gdbarch.sh (PRINT_REGISTERS_INFO): New method.
(DO_REGISTERS_INFO): Change to a predicate function.
* gdbarch.h, gdbarch.c: Regenerate.

2002-08-21  Andrew Cagney  <ac131313@redhat.com>
* gdbint.texinfo (Target Architecture Definition): Document
print_registers_info.  Note that DO_REGISTERS_INFO is deprecated.
This commit is contained in:
Andrew Cagney 2002-08-21 16:34:10 +00:00
parent e23792ccb6
commit 0ab7a79125
8 changed files with 143 additions and 41 deletions

View file

@ -1,3 +1,15 @@
2002-08-21 Andrew Cagney <ac131313@redhat.com>
* infcmd.c (default_print_registers_info): Replace
do_registers_info.
(registers_info): Use gdbarch_print_registers_info instead of
DO_REGISTERS_INFO.
* inferior.h (default_print_registers_info): Replace
do_registers_info.
* gdbarch.sh (PRINT_REGISTERS_INFO): New method.
(DO_REGISTERS_INFO): Change to a predicate function.
* gdbarch.h, gdbarch.c: Regenerate.
2002-08-21 Keith Seitz <keiths@redhat.com>
* gdb-events.sh: Add target-changed event.

View file

@ -1,3 +1,8 @@
2002-08-21 Andrew Cagney <ac131313@redhat.com>
* gdbint.texinfo (Target Architecture Definition): Document
print_registers_info. Note that DO_REGISTERS_INFO is deprecated.
2002-08-19 Andrew Cagney <ac131313@redhat.com>
* gdb.texinfo (Remote Protocol): Reformat. Use cross references.

View file

@ -3094,11 +3094,23 @@ library in which breakpoints cannot be set and so should be disabled.
@findex DO_REGISTERS_INFO
If defined, use this to print the value of a register or all registers.
This method is deprecated.
@item PRINT_FLOAT_INFO()
#findex PRINT_FLOAT_INFO
@findex PRINT_FLOAT_INFO
If defined, then the @samp{info float} command will print information about
the processor's floating point unit.
@item print_registers_info (@var{gdbarch}, @var{frame}, @var{regnum}, @var{all})
@findex print_registers_info
If defined, pretty print the value of the register @var{regnum} for the
specified @var{frame}. If the value of @var{regnum} is -1, pretty print
either all registers (@var{all} is non zero) or a select subset of
registers (@var{all} is zero).
The default method prints one register per line, and if @var{all} is
zero omits floating-point registers.
@item PRINT_VECTOR_INFO()
@findex PRINT_VECTOR_INFO
If defined, then the @samp{info vector} command will call this function

View file

@ -172,6 +172,7 @@ struct gdbarch
int max_register_virtual_size;
gdbarch_register_virtual_type_ftype *register_virtual_type;
gdbarch_do_registers_info_ftype *do_registers_info;
gdbarch_print_registers_info_ftype *print_registers_info;
gdbarch_print_float_info_ftype *print_float_info;
gdbarch_print_vector_info_ftype *print_vector_info;
gdbarch_register_sim_regno_ftype *register_sim_regno;
@ -324,6 +325,7 @@ struct gdbarch startup_gdbarch =
0,
0,
0,
default_print_registers_info,
0,
0,
0,
@ -493,7 +495,7 @@ gdbarch_alloc (const struct gdbarch_info *info,
current_gdbarch->max_register_raw_size = -1;
current_gdbarch->register_virtual_size = generic_register_size;
current_gdbarch->max_register_virtual_size = -1;
current_gdbarch->do_registers_info = do_registers_info;
current_gdbarch->print_registers_info = default_print_registers_info;
current_gdbarch->register_sim_regno = legacy_register_sim_regno;
current_gdbarch->cannot_fetch_register = cannot_register_not;
current_gdbarch->cannot_store_register = cannot_register_not;
@ -640,7 +642,8 @@ verify_gdbarch (struct gdbarch *gdbarch)
if ((GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL)
&& (gdbarch->register_virtual_type == 0))
fprintf_unfiltered (log, "\n\tregister_virtual_type");
/* Skip verify of do_registers_info, invalid_p == 0 */
/* Skip verify of do_registers_info, has predicate */
/* Skip verify of print_registers_info, invalid_p == 0 */
/* Skip verify of print_float_info, has predicate */
/* Skip verify of print_vector_info, has predicate */
/* Skip verify of register_sim_regno, invalid_p == 0 */
@ -1566,6 +1569,10 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file)
fprintf_unfiltered (file,
"gdbarch_dump: print_float_info = 0x%08lx\n",
(long) current_gdbarch->print_float_info);
if (GDB_MULTI_ARCH)
fprintf_unfiltered (file,
"gdbarch_dump: print_registers_info = 0x%08lx\n",
(long) current_gdbarch->print_registers_info);
if (GDB_MULTI_ARCH)
fprintf_unfiltered (file,
"gdbarch_dump: print_vector_info = 0x%08lx\n",
@ -2996,6 +3003,13 @@ set_gdbarch_register_virtual_type (struct gdbarch *gdbarch,
gdbarch->register_virtual_type = register_virtual_type;
}
int
gdbarch_do_registers_info_p (struct gdbarch *gdbarch)
{
gdb_assert (gdbarch != NULL);
return gdbarch->do_registers_info != 0;
}
void
gdbarch_do_registers_info (struct gdbarch *gdbarch, int reg_nr, int fpregs)
{
@ -3015,6 +3029,25 @@ set_gdbarch_do_registers_info (struct gdbarch *gdbarch,
gdbarch->do_registers_info = do_registers_info;
}
void
gdbarch_print_registers_info (struct gdbarch *gdbarch, struct ui_file *file, struct frame_info *frame, int regnum, int all)
{
gdb_assert (gdbarch != NULL);
if (gdbarch->print_registers_info == 0)
internal_error (__FILE__, __LINE__,
"gdbarch: gdbarch_print_registers_info invalid");
if (gdbarch_debug >= 2)
fprintf_unfiltered (gdb_stdlog, "gdbarch_print_registers_info called\n");
gdbarch->print_registers_info (gdbarch, file, frame, regnum, all);
}
void
set_gdbarch_print_registers_info (struct gdbarch *gdbarch,
gdbarch_print_registers_info_ftype print_registers_info)
{
gdbarch->print_registers_info = print_registers_info;
}
int
gdbarch_print_float_info_p (struct gdbarch *gdbarch)
{

View file

@ -778,9 +778,29 @@ extern void set_gdbarch_register_virtual_type (struct gdbarch *gdbarch, gdbarch_
#endif
#endif
#if defined (DO_REGISTERS_INFO)
/* Legacy for systems yet to multi-arch DO_REGISTERS_INFO */
#if !defined (DO_REGISTERS_INFO_P)
#define DO_REGISTERS_INFO_P() (1)
#endif
#endif
/* Default predicate for non- multi-arch targets. */
#if (!GDB_MULTI_ARCH) && !defined (DO_REGISTERS_INFO_P)
#define DO_REGISTERS_INFO_P() (0)
#endif
extern int gdbarch_do_registers_info_p (struct gdbarch *gdbarch);
#if (GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL) && defined (DO_REGISTERS_INFO_P)
#error "Non multi-arch definition of DO_REGISTERS_INFO"
#endif
#if (GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL) || !defined (DO_REGISTERS_INFO_P)
#define DO_REGISTERS_INFO_P() (gdbarch_do_registers_info_p (current_gdbarch))
#endif
/* Default (function) for non- multi-arch platforms. */
#if (!GDB_MULTI_ARCH) && !defined (DO_REGISTERS_INFO)
#define DO_REGISTERS_INFO(reg_nr, fpregs) (do_registers_info (reg_nr, fpregs))
#define DO_REGISTERS_INFO(reg_nr, fpregs) (internal_error (__FILE__, __LINE__, "DO_REGISTERS_INFO"), 0)
#endif
typedef void (gdbarch_do_registers_info_ftype) (int reg_nr, int fpregs);
@ -795,6 +815,10 @@ extern void set_gdbarch_do_registers_info (struct gdbarch *gdbarch, gdbarch_do_r
#endif
#endif
typedef void (gdbarch_print_registers_info_ftype) (struct gdbarch *gdbarch, struct ui_file *file, struct frame_info *frame, int regnum, int all);
extern void gdbarch_print_registers_info (struct gdbarch *gdbarch, struct ui_file *file, struct frame_info *frame, int regnum, int all);
extern void set_gdbarch_print_registers_info (struct gdbarch *gdbarch, gdbarch_print_registers_info_ftype *print_registers_info);
extern int gdbarch_print_float_info_p (struct gdbarch *gdbarch);
typedef void (gdbarch_print_float_info_ftype) (struct gdbarch *gdbarch, struct ui_file *file, struct frame_info *frame, const char *args);

View file

@ -467,7 +467,9 @@ v:2:MAX_REGISTER_RAW_SIZE:int:max_register_raw_size::::0:-1
f:2:REGISTER_VIRTUAL_SIZE:int:register_virtual_size:int reg_nr:reg_nr::generic_register_size:generic_register_size::0
v:2:MAX_REGISTER_VIRTUAL_SIZE:int:max_register_virtual_size::::0:-1
f:2:REGISTER_VIRTUAL_TYPE:struct type *:register_virtual_type:int reg_nr:reg_nr::0:0
f:2:DO_REGISTERS_INFO:void:do_registers_info:int reg_nr, int fpregs:reg_nr, fpregs:::do_registers_info::0
#
F:2:DO_REGISTERS_INFO:void:do_registers_info:int reg_nr, int fpregs:reg_nr, fpregs
m:2:PRINT_REGISTERS_INFO:void:print_registers_info:struct ui_file *file, struct frame_info *frame, int regnum, int all:file, frame, regnum, all:::default_print_registers_info::0
M:2:PRINT_FLOAT_INFO:void:print_float_info:struct ui_file *file, struct frame_info *frame, const char *args:file, frame, args
M:2:PRINT_VECTOR_INFO:void:print_vector_info:struct ui_file *file, struct frame_info *frame, const char *args:file, frame, args
# MAP a GDB RAW register number onto a simulator register number. See

View file

@ -1550,23 +1550,33 @@ path_command (char *dirname, int from_tty)
char *gdb_register_names[] = REGISTER_NAMES;
#endif
/* Print out the machine register regnum. If regnum is -1, print all
registers (all == 1) or all non-float and non-vector registers (all
== 0).
registers (print_all == 1) or all non-float and non-vector
registers (print_all == 0).
For most machines, having all_registers_info() print the
register(s) one per line is good enough. If a different format
is required, (eg, for MIPS or Pyramid 90x, which both have
lots of regs), or there is an existing convention for showing
all the registers, define the macro DO_REGISTERS_INFO(regnum, fp)
to provide that format. */
register(s) one per line is good enough. If a different format is
required, (eg, for MIPS or Pyramid 90x, which both have lots of
regs), or there is an existing convention for showing all the
registers, define the architecture method PRINT_REGISTERS_INFO to
provide that format. */
void
do_registers_info (int regnum, int print_all)
default_print_registers_info (struct gdbarch *gdbarch,
struct ui_file *file,
struct frame_info *frame,
int regnum, int print_all)
{
register int i;
int numregs = NUM_REGS + NUM_PSEUDO_REGS;
char *raw_buffer = (char*) alloca (MAX_REGISTER_RAW_SIZE);
char *virtual_buffer = (char*) alloca (MAX_REGISTER_VIRTUAL_SIZE);
int i;
const int numregs = NUM_REGS + NUM_PSEUDO_REGS;
char *raw_buffer = alloca (MAX_REGISTER_RAW_SIZE);
char *virtual_buffer = alloca (MAX_REGISTER_VIRTUAL_SIZE);
/* FIXME: cagney/2002-03-08: This should be deprecated. */
if (DO_REGISTERS_INFO_P ())
{
DO_REGISTERS_INFO (regnum, print_all);
return;
}
for (i = 0; i < numregs; i++)
{
@ -1593,16 +1603,19 @@ do_registers_info (int regnum, int print_all)
if (REGISTER_NAME (i) == NULL || *(REGISTER_NAME (i)) == '\0')
continue;
fputs_filtered (REGISTER_NAME (i), gdb_stdout);
print_spaces_filtered (15 - strlen (REGISTER_NAME (i)), gdb_stdout);
fputs_filtered (REGISTER_NAME (i), file);
print_spaces_filtered (15 - strlen (REGISTER_NAME (i)), file);
/* Get the data in raw format. */
if (! frame_register_read (selected_frame, i, raw_buffer))
if (! frame_register_read (frame, i, raw_buffer))
{
printf_filtered ("*value not available*\n");
fprintf_filtered (file, "*value not available*\n");
continue;
}
/* FIXME: cagney/2002-08-03: This code shouldn't be necessary.
The function frame_register_read() should have returned the
pre-cooked register so no conversion is necessary. */
/* Convert raw data to virtual format if necessary. */
if (REGISTER_CONVERTIBLE (i))
{
@ -1615,22 +1628,26 @@ do_registers_info (int regnum, int print_all)
REGISTER_VIRTUAL_SIZE (i));
}
/* If virtual format is floating, print it that way, and in raw hex. */
/* If virtual format is floating, print it that way, and in raw
hex. */
if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (i)) == TYPE_CODE_FLT)
{
register int j;
int j;
val_print (REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, 0,
gdb_stdout, 0, 1, 0, Val_pretty_default);
file, 0, 1, 0, Val_pretty_default);
printf_filtered ("\t(raw 0x");
fprintf_filtered (file, "\t(raw 0x");
for (j = 0; j < REGISTER_RAW_SIZE (i); j++)
{
register int idx = TARGET_BYTE_ORDER == BFD_ENDIAN_BIG ? j
: REGISTER_RAW_SIZE (i) - 1 - j;
printf_filtered ("%02x", (unsigned char) raw_buffer[idx]);
int idx;
if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
idx = j;
else
idx = REGISTER_RAW_SIZE (i) - 1 - j;
fprintf_filtered (file, "%02x", (unsigned char) raw_buffer[idx]);
}
printf_filtered (")");
fprintf_filtered (file, ")");
}
else
{
@ -1653,7 +1670,7 @@ do_registers_info (int regnum, int print_all)
PRINT_REGISTER_HOOK (i);
#endif
printf_filtered ("\n");
fprintf_filtered (file, "\n");
}
}
@ -1670,7 +1687,8 @@ registers_info (char *addr_exp, int fpregs)
if (!addr_exp)
{
DO_REGISTERS_INFO (-1, fpregs);
gdbarch_print_registers_info (current_gdbarch, gdb_stdout,
selected_frame, -1, fpregs);
return;
}
@ -1695,7 +1713,8 @@ registers_info (char *addr_exp, int fpregs)
error ("%.*s: invalid register", (int) (end - addr_exp), addr_exp);
found:
DO_REGISTERS_INFO (regnum, fpregs);
gdbarch_print_registers_info (current_gdbarch, gdb_stdout,
selected_frame, regnum, fpregs);
addr_exp = end;
while (*addr_exp == ' ' || *addr_exp == '\t')
@ -1737,11 +1756,7 @@ print_vector_info (struct gdbarch *gdbarch, struct ui_file *file,
if (TYPE_VECTOR (REGISTER_VIRTUAL_TYPE (regnum)))
{
printed_something = 1;
#if 0
gdbarch_print_registers_info (gdbarch, file, frame, regnum, 1);
#else
do_registers_info (regnum, 1);
#endif
}
}
if (!printed_something)
@ -1921,11 +1936,7 @@ print_float_info (struct gdbarch *gdbarch, struct ui_file *file,
if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (regnum)) == TYPE_CODE_FLT)
{
printed_something = 1;
#if 0
gdbarch_print_registers_info (gdbarch, file, frame, regnum, 1);
#else
do_registers_info (regnum, 1);
#endif
}
}
if (!printed_something)

View file

@ -205,7 +205,10 @@ extern void resume (int, enum target_signal);
/* From misc files */
extern void do_registers_info (int, int);
extern void default_print_registers_info (struct gdbarch *gdbarch,
struct ui_file *file,
struct frame_info *frame,
int regnum, int all);
extern void store_inferior_registers (int);