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]
Other format: [Raw text]

Re: [RFA] mips: Fix "info registers" output


> 
> FP_REGISTER_DOUBLE describes a property of the ABI.  I don't really
> think it's the appropriate check when printing floating-point
> registers; we always take care to print the single-precision value even
> if FP_REGISTER_DOUBLE, because they might be used in single-precision
> anyway.

True, sort of.  The decision is a function of that FP bit, 
FP_REGISTER_DOUBLE and the user typing ``(gdb) set mips 
fp-register-double on, damit!'' (the user is always right :-).

If the FP register bit is used by just this code, other parts of GDB are 
going to be inconsistent since they are still using FP_REGISTER_DOUBLE 
when [un]packing FP registers.  Can I suggest using FP_REGISTER_DOUBLE 
initially (#if 0 #else #endif the code in mips2_fp_compat()) and bug 
report the need to change everyting to use mips2_fp_compat() as a 
separate change.

Apart from that, I think the code is brilliant.  Just suggest a few 
comment tweaks before the commit.

+      if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
+ 
{
+ 
   mips_read_fp_register_single (regno, rare_buffer + 4);
+ 
   mips_read_fp_register_single (regno + 1, rare_buffer);
+ 
}
+      else
+ 
{
+ 
   mips_read_fp_register_single (regno, rare_buffer);
+ 
   mips_read_fp_register_single (regno + 1, rare_buffer + 4);
+ 
}

Suggest mentioning that mips_read_fp_register_single() handles the 
problem of extracting the correct four bytes from from each register.

> -  /* use HI and LO to control the order of combining two flt regs */
> -  int HI = (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG);
> -  int LO = (TARGET_BYTE_ORDER != BFD_ENDIAN_BIG);

Yes! In 20:20 hindsight that was a very confusing idea.

> +      /* 4-byte registers: we can fit two registers per row.  */
> +      /* Also print every pair of 4-byte regs as an 8-byte double.  */
> +      mips_read_fp_register_single (regnum, raw_buffer);
> +      flt1 = unpack_double (builtin_type_float, raw_buffer, &inv1);
> +
> +      mips_read_fp_register_single (regnum + 1, raw_buffer);
> +      flt2 = unpack_double (builtin_type_float, raw_buffer, &inv2);
>  
> +      mips_read_fp_register_double (regnum, raw_buffer);
> +      doub = unpack_double (builtin_type_double, raw_buffer, &inv3);
> +      
>        printf_filtered (" %-5s", REGISTER_NAME (regnum));

Suggest a FIXME and bug report here.  It isn't safe to assume things 
like builtin_type_double is 64 bit.  The code should use the ABI 
independant builtin_type_ieee_BLAH.  But this is a separate bug and not 
your problem :-)

enjoy,
Andrew







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