diff options
-rw-r--r-- | gdb/ChangeLog | 14 | ||||
-rw-r--r-- | gdb/config/h8500/tm-h8500.h | 10 | ||||
-rw-r--r-- | gdb/h8500-tdep.c | 115 |
3 files changed, 133 insertions, 6 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 0e2e4b9..1a9f050 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,19 @@ 2002-10-31 Andrew Cagney <cagney@redhat.com> + * h8500-tdep.c (h8500_print_registers_info): New static function, + clone of infcmd.c's default_print_registers_info. + (h8500_do_registers_info): New funtion. + (h8500_print_register_hook): Rename print_register_hook, make + static. + + * config/h8500/tm-h8500.h: Update copyright. + (DEPRECATED_DO_REGISTERS_INFO): Define. + (h8500_do_registers_info: Declare. + (PRINT_REGISTER_HOOK): Delete macro. + (print_register_hook): Delete function. + +2002-10-31 Andrew Cagney <cagney@redhat.com> + * z8k-tdep.c (z8k_print_register_hook): Make static. (z8k_print_registers_info): New static function, clone of infcmd.c's default_print_registers_info. diff --git a/gdb/config/h8500/tm-h8500.h b/gdb/config/h8500/tm-h8500.h index 30acdbe..50fccfc 100644 --- a/gdb/config/h8500/tm-h8500.h +++ b/gdb/config/h8500/tm-h8500.h @@ -1,6 +1,7 @@ /* Parameters for execution on a H8/500 series machine. - Copyright 1993, 1994, 1995, 1998, 1999, 2000, 2001 - Free Software Foundation, Inc. + + Copyright 1993, 1994, 1995, 1998, 1999, 2000, 2001, 2002 Free + Software Foundation, Inc. This file is part of GDB. @@ -253,8 +254,9 @@ extern CORE_ADDR h8500_addr_bits_remove (CORE_ADDR); #define read_memory_short(x) (read_memory_integer(x,2) & 0xffff) -#define PRINT_REGISTER_HOOK(regno) print_register_hook(regno) -extern void print_register_hook (int); +extern void h8500_do_registers_info (int regnum, int all); +#define DEPRECATED_DO_REGISTERS_INFO(REGNUM,ALL) \ + h8500_do_registers_info (REGNUM, ALL) extern int minimum_mode; diff --git a/gdb/h8500-tdep.c b/gdb/h8500-tdep.c index 0696c4e..0bfae7a 100644 --- a/gdb/h8500-tdep.c +++ b/gdb/h8500-tdep.c @@ -175,8 +175,8 @@ h8500_pop_frame (void) } } -void -print_register_hook (int regno) +static void +h8500_print_register_hook (int regno) { if (regno == CCR_REGNUM) { @@ -221,6 +221,117 @@ print_register_hook (int regno) } } +static void +h8500_print_registers_info (struct gdbarch *gdbarch, + struct ui_file *file, + struct frame_info *frame, + int regnum, int print_all) +{ + 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); + + for (i = 0; i < numregs; i++) + { + /* Decide between printing all regs, non-float / vector regs, or + specific reg. */ + if (regnum == -1) + { + if (!print_all) + { + if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (i)) == TYPE_CODE_FLT) + continue; + if (TYPE_VECTOR (REGISTER_VIRTUAL_TYPE (i))) + continue; + } + } + else + { + if (i != regnum) + continue; + } + + /* If the register name is empty, it is undefined for this + processor, so don't display anything. */ + if (REGISTER_NAME (i) == NULL || *(REGISTER_NAME (i)) == '\0') + continue; + + 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 (frame, i, raw_buffer)) + { + 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)) + { + REGISTER_CONVERT_TO_VIRTUAL (i, REGISTER_VIRTUAL_TYPE (i), + raw_buffer, virtual_buffer); + } + else + { + memcpy (virtual_buffer, raw_buffer, + REGISTER_VIRTUAL_SIZE (i)); + } + + /* If virtual format is floating, print it that way, and in raw + hex. */ + if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (i)) == TYPE_CODE_FLT) + { + int j; + + val_print (REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, 0, + file, 0, 1, 0, Val_pretty_default); + + fprintf_filtered (file, "\t(raw 0x"); + for (j = 0; j < REGISTER_RAW_SIZE (i); j++) + { + 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]); + } + fprintf_filtered (file, ")"); + } + else + { + /* Print the register in hex. */ + val_print (REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, 0, + file, 'x', 1, 0, Val_pretty_default); + /* If not a vector register, print it also according to its + natural format. */ + if (TYPE_VECTOR (REGISTER_VIRTUAL_TYPE (i)) == 0) + { + fprintf_filtered (file, "\t"); + val_print (REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, 0, + file, 0, 1, 0, Val_pretty_default); + } + } + + /* Some h8500 specific info. */ + h8500_print_register_hook (i); + + fprintf_filtered (file, "\n"); + } +} + +void +h8500_do_registers_info (int regnum, int all) +{ + h8500_print_registers_info (current_gdbarch, gdb_stdout, selected_frame, + regnum, all); +} + int h8500_register_size (int regno) { |