[RFC,03/19] Target FP: Complete tdep move to convert_typed_floating

Message ID 20170905182045.22009D8086F@oc3748833570.ibm.com
State New, archived
Headers

Commit Message

Ulrich Weigand Sept. 5, 2017, 6:20 p.m. UTC
  [RFC][03/19] Target FP: Complete tdep move to convert_typed_floating

Many tdep files need to perform conversions between two floating-point
types, usually when accessing FP registers.  Most targets now use the
convert_typed_floating helper routine to do so.  However, a small number
still use the old method of converting via a DOUBLEST.  Since we want
to get rid of DOUBLEST, these targets need to be moves to the new
method as well.

The main obstacle is that for convert_typed_floating we need an actual
*type*, not just a floatformat.

In arm-tdep.c, this is very straightforward, since there is already a
type using the ARM extended floatformat.

For sh-tdep.c and sh64-tdep.c, no such type already exists, so I've
added one to the gdbarch_tdep struct as done on other targets.

Bye,
Ulrich

ChangeLog:

	* arm-tdep.c: Do not include "floatformat.h".
	(convert_from_extended): Remove.
	(convert_to_extended): Likewise.
	(arm_extract_return_value): Use convert_typed_floating.
	(arm_store_return_value): Likewise.

	* sh-tdep.h (struct gdbarch_tdep): Add sh_littlebyte_bigword_type.
	* sh-tdep.c: Do not include "floatformat.h".
	(sh_littlebyte_bigword_type): New function.
	(sh_register_convert_to_virtual): Use convert_typed_floating.
	(sh_register_convert_to_raw): Likewise.
	* sh64-tdep.c: Do not include "floatformat.h".
	(struct gdbarch_tdep): Add sh_littlebyte_bigword_type.
	(sh64_littlebyte_bigword_type): New function.
	(sh64_extract_return_value): Use convert_typed_floating.
	(sh64_register_convert_to_virtual): Likewise.
	(sh64_register_convert_to_raw): Likewise.
  

Comments

Simon Marchi Sept. 20, 2017, 7:35 a.m. UTC | #1
On 2017-09-05 20:20, Ulrich Weigand wrote:
> [RFC][03/19] Target FP: Complete tdep move to convert_typed_floating
> 
> Many tdep files need to perform conversions between two floating-point
> types, usually when accessing FP registers.  Most targets now use the
> convert_typed_floating helper routine to do so.  However, a small 
> number
> still use the old method of converting via a DOUBLEST.  Since we want
> to get rid of DOUBLEST, these targets need to be moves to the new
> method as well.
> 
> The main obstacle is that for convert_typed_floating we need an actual
> *type*, not just a floatformat.
> 
> In arm-tdep.c, this is very straightforward, since there is already a
> type using the ARM extended floatformat.
> 
> For sh-tdep.c and sh64-tdep.c, no such type already exists, so I've
> added one to the gdbarch_tdep struct as done on other targets.

So far the patches look like good cleanups on their own own, 
independently of the rest of the series.

> Index: binutils-gdb/gdb/sh-tdep.c
> ===================================================================
> --- binutils-gdb.orig/gdb/sh-tdep.c
> +++ binutils-gdb/gdb/sh-tdep.c
> @@ -33,7 +33,6 @@
>  #include "dis-asm.h"
>  #include "inferior.h"
>  #include "arch-utils.h"
> -#include "floatformat.h"
>  #include "regcache.h"
>  #include "doublest.h"
>  #include "osabi.h"
> @@ -1552,6 +1551,19 @@ sh_register_reggroup_p (struct gdbarch *
>     The other pseudo registers (the FVs) also don't pose a problem
>     because they are stored as 4 individual FP elements.  */
> 
> +static struct type *
> +sh_littlebyte_bigword_type (struct gdbarch *gdbarch)
> +{
> +  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +
> +  if (!tdep->sh_littlebyte_bigword_type)

Nit, use == NULL.

> +    tdep->sh_littlebyte_bigword_type
> +      = arch_float_type (gdbarch, -1, 
> "builtin_type_sh_littlebyte_bigword",
> +                         floatformats_arm_ext);

This refers to arm, is it right?

Same comments for sh64.

Thanks,

Simon
  

Patch

Index: binutils-gdb/gdb/arm-tdep.c
===================================================================
--- binutils-gdb.orig/gdb/arm-tdep.c
+++ binutils-gdb/gdb/arm-tdep.c
@@ -31,7 +31,6 @@ 
 #include "regcache.h"
 #include "reggroups.h"
 #include "doublest.h"
-#include "floatformat.h"
 #include "value.h"
 #include "arch-utils.h"
 #include "osabi.h"
@@ -227,11 +226,6 @@  static void show_disassembly_style_sfunc
 					  struct cmd_list_element *,
 					  const char *);
 
-static void convert_from_extended (const struct floatformat *, const void *,
-				   void *, int);
-static void convert_to_extended (const struct floatformat *, void *,
-				 const void *, int);
-
 static enum register_status arm_neon_quad_read (struct gdbarch *gdbarch,
 						struct regcache *regcache,
 						int regnum, gdb_byte *buf);
@@ -4212,39 +4206,6 @@  arm_register_sim_regno (struct gdbarch *
   internal_error (__FILE__, __LINE__, _("Bad REGNUM %d"), regnum);
 }
 
-/* NOTE: cagney/2001-08-20: Both convert_from_extended() and
-   convert_to_extended() use floatformat_arm_ext_littlebyte_bigword.
-   It is thought that this is is the floating-point register format on
-   little-endian systems.  */
-
-static void
-convert_from_extended (const struct floatformat *fmt, const void *ptr,
-		       void *dbl, int endianess)
-{
-  DOUBLEST d;
-
-  if (endianess == BFD_ENDIAN_BIG)
-    floatformat_to_doublest (&floatformat_arm_ext_big, ptr, &d);
-  else
-    floatformat_to_doublest (&floatformat_arm_ext_littlebyte_bigword,
-			     ptr, &d);
-  floatformat_from_doublest (fmt, &d, dbl);
-}
-
-static void
-convert_to_extended (const struct floatformat *fmt, void *dbl, const void *ptr,
-		     int endianess)
-{
-  DOUBLEST d;
-
-  floatformat_to_doublest (fmt, ptr, &d);
-  if (endianess == BFD_ENDIAN_BIG)
-    floatformat_from_doublest (&floatformat_arm_ext_big, &d, dbl);
-  else
-    floatformat_from_doublest (&floatformat_arm_ext_littlebyte_bigword,
-			       &d, dbl);
-}
-
 /* Given BUF, which is OLD_LEN bytes ending at ENDADDR, expand
    the buffer to be NEW_LEN bytes ending at ENDADDR.  Return
    NULL if an error occurs.  BUF is freed.  */
@@ -7949,8 +7910,8 @@  arm_extract_return_value (struct type *t
 	    bfd_byte tmpbuf[FP_REGISTER_SIZE];
 
 	    regcache_cooked_read (regs, ARM_F0_REGNUM, tmpbuf);
-	    convert_from_extended (floatformat_from_type (type), tmpbuf,
-				   valbuf, gdbarch_byte_order (gdbarch));
+	    convert_typed_floating (tmpbuf, arm_ext_type (gdbarch),
+				    valbuf, type);
 	  }
 	  break;
 
@@ -8154,8 +8115,7 @@  arm_store_return_value (struct type *typ
 	{
 	case ARM_FLOAT_FPA:
 
-	  convert_to_extended (floatformat_from_type (type), buf, valbuf,
-			       gdbarch_byte_order (gdbarch));
+	  convert_typed_floating (valbuf, type, buf, arm_ext_type (gdbarch));
 	  regcache_cooked_write (regs, ARM_F0_REGNUM, buf);
 	  break;
 
Index: binutils-gdb/gdb/sh-tdep.h
===================================================================
--- binutils-gdb.orig/gdb/sh-tdep.h
+++ binutils-gdb/gdb/sh-tdep.h
@@ -101,6 +101,8 @@  struct gdbarch_tdep
      inside the associated core file section.  */
   struct sh_corefile_regmap *core_fpregmap;
   int sizeof_fpregset;
+  /* ISA-specific data types.  */
+  struct type *sh_littlebyte_bigword_type;
 };
 
 extern const struct regset sh_corefile_gregset;
Index: binutils-gdb/gdb/sh-tdep.c
===================================================================
--- binutils-gdb.orig/gdb/sh-tdep.c
+++ binutils-gdb/gdb/sh-tdep.c
@@ -33,7 +33,6 @@ 
 #include "dis-asm.h"
 #include "inferior.h"
 #include "arch-utils.h"
-#include "floatformat.h"
 #include "regcache.h"
 #include "doublest.h"
 #include "osabi.h"
@@ -1552,6 +1551,19 @@  sh_register_reggroup_p (struct gdbarch *
    The other pseudo registers (the FVs) also don't pose a problem
    because they are stored as 4 individual FP elements.  */
 
+static struct type *
+sh_littlebyte_bigword_type (struct gdbarch *gdbarch)
+{
+  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+
+  if (!tdep->sh_littlebyte_bigword_type)
+    tdep->sh_littlebyte_bigword_type
+      = arch_float_type (gdbarch, -1, "builtin_type_sh_littlebyte_bigword",
+                         floatformats_arm_ext);
+
+  return tdep->sh_littlebyte_bigword_type;
+}
+
 static void
 sh_register_convert_to_virtual (struct gdbarch *gdbarch, int regnum,
 				struct type *type, gdb_byte *from, gdb_byte *to)
@@ -1564,12 +1576,8 @@  sh_register_convert_to_virtual (struct g
     }
 
   if (regnum >= DR0_REGNUM && regnum <= DR_LAST_REGNUM)
-    {
-      DOUBLEST val;
-      floatformat_to_doublest (&floatformat_ieee_double_littlebyte_bigword,
-			       from, &val);
-      store_typed_floating (to, type, val);
-    }
+    convert_typed_floating (from, sh_littlebyte_bigword_type (gdbarch),
+			    to, type);
   else
     error
       ("sh_register_convert_to_virtual called with non DR register number");
@@ -1587,11 +1595,8 @@  sh_register_convert_to_raw (struct gdbar
     }
 
   if (regnum >= DR0_REGNUM && regnum <= DR_LAST_REGNUM)
-    {
-      DOUBLEST val = extract_typed_floating (from, type);
-      floatformat_from_doublest (&floatformat_ieee_double_littlebyte_bigword,
-				 &val, to);
-    }
+    convert_typed_floating (from, type,
+			    to, sh_littlebyte_bigword_type (gdbarch));
   else
     error (_("sh_register_convert_to_raw called with non DR register number"));
 }
Index: binutils-gdb/gdb/sh64-tdep.c
===================================================================
--- binutils-gdb.orig/gdb/sh64-tdep.c
+++ binutils-gdb/gdb/sh64-tdep.c
@@ -26,7 +26,6 @@ 
 #include "frame-unwind.h"
 #include "dwarf2-frame.h"
 #include "symtab.h"
-#include "floatformat.h"
 #include "gdbtypes.h"
 #include "gdbcmd.h"
 #include "gdbcore.h"
@@ -59,8 +58,23 @@  enum sh_abi
 struct gdbarch_tdep
   {
     enum sh_abi sh_abi;
+    /* ISA-specific data types.  */
+    struct type *sh_littlebyte_bigword_type;
   };
 
+struct type *
+sh64_littlebyte_bigword_type (struct gdbarch *gdbarch)
+{
+  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+
+  if (!tdep->sh_littlebyte_bigword_type)
+    tdep->sh_littlebyte_bigword_type
+      = arch_float_type (gdbarch, -1, "builtin_type_sh_littlebyte_bigword",
+                         floatformats_arm_ext);
+
+  return tdep->sh_littlebyte_bigword_type;
+}
+
 struct sh64_frame_cache
 {
   /* Base address.  */
@@ -1241,18 +1255,11 @@  sh64_extract_return_value (struct type *
       else if (len == 8)
 	{
 	  /* return value stored in DR0_REGNUM.  */
-	  DOUBLEST val;
 	  gdb_byte buf[8];
-
 	  regcache_cooked_read (regcache, DR0_REGNUM, buf);
 	  
-	  if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_LITTLE)
-	    floatformat_to_doublest (&floatformat_ieee_double_littlebyte_bigword,
-				     buf, &val);
-	  else
-	    floatformat_to_doublest (&floatformat_ieee_double_big,
-				     buf, &val);
-	  store_typed_floating (valbuf, type, val);
+	  convert_typed_floating (buf, sh64_littlebyte_bigword_type (gdbarch),
+				  valbuf, type);
 	}
     }
   else
@@ -1461,12 +1468,8 @@  sh64_register_convert_to_virtual (struct
        && regnum <= DR_LAST_REGNUM)
       || (regnum >= DR0_C_REGNUM 
 	  && regnum <= DR_LAST_C_REGNUM))
-    {
-      DOUBLEST val;
-      floatformat_to_doublest (&floatformat_ieee_double_littlebyte_bigword, 
-			       from, &val);
-      store_typed_floating (to, type, val);
-    }
+    convert_typed_floating (from, sh64_littlebyte_bigword_type (gdbarch),
+			    to, type);
   else
     error (_("sh64_register_convert_to_virtual "
 	     "called with non DR register number"));
@@ -1487,11 +1490,8 @@  sh64_register_convert_to_raw (struct gdb
        && regnum <= DR_LAST_REGNUM)
       || (regnum >= DR0_C_REGNUM 
 	  && regnum <= DR_LAST_C_REGNUM))
-    {
-      DOUBLEST val = extract_typed_floating (from, type);
-      floatformat_from_doublest (&floatformat_ieee_double_littlebyte_bigword, 
-				 &val, to);
-    }
+    convert_typed_floating (from, type,
+			    to, sh64_littlebyte_bigword_type (gdbarch));
   else
     error (_("sh64_register_convert_to_raw called "
 	     "with non DR register number"));