|
|
|
@ -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) |
|
|
|
{ |
|
|
|
|