This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[RFA] mips: Fix "info registers" output


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]