This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
[RFA] mips: Fix "info registers" output
- To: gdb-patches at sources dot redhat dot com
- Subject: [RFA] mips: Fix "info registers" output
- From: Daniel Jacobowitz <dmj+ at andrew dot cmu dot edu>
- Date: Tue, 19 Jun 2001 22:50:07 -0700
There were some pretty nasty problems in the FP register printing code, and
a potential formatting problem in the GP register printing code. How
does this look to correct them?
2001-06-19 Daniel Jacobowitz <drow@mvista.com>
* mips-tdep.c (do_fp_register_row): Convert to use
REGISTER_CONVERT_TO_TYPE.
(do_gp_register_row): Only add whitespace if registers
were printed.
Index: mips-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/mips-tdep.c,v
retrieving revision 1.54
diff -u -p -r1.54 mips-tdep.c
--- mips-tdep.c 2001/06/16 20:00:24 1.54
+++ mips-tdep.c 2001/06/20 05:42:58
@@ -2649,34 +2702,27 @@ mips_print_register (int regnum, int all
static int
do_fp_register_row (int regnum)
{ /* do values for FP (float) regs */
- char *raw_buffer[2];
- char *dbl_buffer;
- /* use HI and LO to control the order of combining two flt regs */
- int HI = (TARGET_BYTE_ORDER == BIG_ENDIAN);
- int LO = (TARGET_BYTE_ORDER != BIG_ENDIAN);
+ char *raw_buffer;
double doub, flt1, flt2; /* doubles extracted from raw hex data */
int inv1, inv2, inv3;
- raw_buffer[0] = (char *) alloca (REGISTER_RAW_SIZE (FP0_REGNUM));
- raw_buffer[1] = (char *) alloca (REGISTER_RAW_SIZE (FP0_REGNUM));
- dbl_buffer = (char *) alloca (2 * REGISTER_RAW_SIZE (FP0_REGNUM));
+ raw_buffer = (char *) alloca (2 * REGISTER_RAW_SIZE (FP0_REGNUM));
/* Get the data in raw format. */
- if (read_relative_register_raw_bytes (regnum, raw_buffer[HI]))
+ if (read_relative_register_raw_bytes (regnum, raw_buffer))
error ("can't read register %d (%s)", regnum, REGISTER_NAME (regnum));
if (REGISTER_RAW_SIZE (regnum) == 4)
{
/* 4-byte registers: we can fit two registers per row. */
/* Also print every pair of 4-byte regs as an 8-byte double. */
- if (read_relative_register_raw_bytes (regnum + 1, raw_buffer[LO]))
+ if (read_relative_register_raw_bytes (regnum + 1, raw_buffer + REGISTER_RAW_SIZE (FP0_REGNUM)))
error ("can't read register %d (%s)",
regnum + 1, REGISTER_NAME (regnum + 1));
- /* copy the two floats into one double, and unpack both */
- memcpy (dbl_buffer, raw_buffer, 2 * REGISTER_RAW_SIZE (FP0_REGNUM));
- flt1 = unpack_double (builtin_type_float, raw_buffer[HI], &inv1);
- flt2 = unpack_double (builtin_type_float, raw_buffer[LO], &inv2);
- doub = unpack_double (builtin_type_double, dbl_buffer, &inv3);
+ flt1 = unpack_double (builtin_type_float, raw_buffer, &inv1);
+ flt2 = unpack_double (builtin_type_float, raw_buffer + REGISTER_RAW_SIZE (FP0_REGNUM), &inv2);
+ REGISTER_CONVERT_TO_TYPE (regnum, builtin_type_double, raw_buffer);
+ doub = unpack_double (builtin_type_double, raw_buffer, &inv3);
printf_filtered (" %-5s", REGISTER_NAME (regnum));
if (inv1)
@@ -2704,10 +2750,8 @@ do_fp_register_row (int regnum)
{ /* eight byte registers: print each one as float AND as double. */
int offset = 4 * (TARGET_BYTE_ORDER == BIG_ENDIAN);
- memcpy (dbl_buffer, raw_buffer[HI], 2 * REGISTER_RAW_SIZE (FP0_REGNUM));
- flt1 = unpack_double (builtin_type_float,
- &raw_buffer[HI][offset], &inv1);
- doub = unpack_double (builtin_type_double, dbl_buffer, &inv3);
+ flt1 = unpack_double (builtin_type_float, &raw_buffer[offset], &inv1);
+ doub = unpack_double (builtin_type_double, raw_buffer, &inv3);
printf_filtered (" %-5s: ", REGISTER_NAME (regnum));
if (inv1)
@@ -2742,19 +2786,21 @@ do_gp_register_row (int regnum)
/* For GP registers, we print a separate row of names above the vals */
- printf_filtered (" ");
for (col = 0; col < ncols && regnum < numregs; regnum++)
{
if (*REGISTER_NAME (regnum) == '\0')
continue; /* unused register */
if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (regnum)) == TYPE_CODE_FLT)
break; /* end the row: reached FP register */
+ if (col == 0)
+ printf_filtered (" ");
printf_filtered (MIPS_REGSIZE == 8 ? "%17s" : "%9s",
REGISTER_NAME (regnum));
col++;
}
- printf_filtered (start_regnum < MIPS_NUMREGS ? "\n R%-4d" : "\n ",
- start_regnum); /* print the R0 to R31 names */
+ if (col > 0)
+ printf_filtered (start_regnum < MIPS_NUMREGS ? "\n R%-4d" : "\n ",
+ start_regnum); /* print the R0 to R31 names */
regnum = start_regnum; /* go back to start of row */
/* now print the values in hex, 4 or 8 to the row */
--
Daniel Jacobowitz Carnegie Mellon University
MontaVista Software Debian GNU/Linux Developer