This is the mail archive of the gdb-cvs@sourceware.org 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]

[binutils-gdb] Simplify floatformat_from_type


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=0db7851f9f490f0b60689df5a218ccce60896e3d

commit 0db7851f9f490f0b60689df5a218ccce60896e3d
Author: Ulrich Weigand <ulrich.weigand@de.ibm.com>
Date:   Wed Sep 27 19:03:36 2017 +0200

    Simplify floatformat_from_type
    
    For historical reasons, the TYPE_FLOATFORMAT element is still set to hold
    an array of two floatformat structs, one for big-endian and the other for
    little-endian.  When accessing the element via floatformat_from_type,
    the code would check the type's byte order and return the appropriate
    floatformat.
    
    However, these days this is quite unnecessary, since the type's byte order
    is already known at the time the type is allocated and the floatformat is
    installed into TYPE_FLOATFORMAT.  Therefore, we can just install the correct
    version here.
    
    Also, moves the (now trivially simple) floatformat_from_type accessor to
    gdbtypes.{c,h}, since it doesn't really need to be in doublest.c now.
    
    gdb/ChangeLog
    2017-09-27  Ulrich Weigand  <uweigand@de.ibm.com>
    
    	* doublest.h (floatformat_from_type): Move to gdbtypes.h.
    	* doublest.c (floatformat_from_type): Move to gdbtypes.c.
    
    	* gdbtypes.h (union type_specific): Make field floatformat hold
    	just a single struct floatformat, not an array.
    	(floatformat_from_type): Move here.
    	* gdbtypes.c (floatformat_from_type): Move here.  Update to
    	changed TYPE_FLOATFORMAT definition.
    	(verify_floatformat): Update to changed TYPE_FLOATFORMAT.
    	(recursive_dump_type): Likewise.
    	(init_float_type): Install correct floatformat for byte order.
    	(arch_float_type): Likewise.

Diff:
---
 gdb/ChangeLog  | 15 +++++++++++++++
 gdb/doublest.c | 16 ----------------
 gdb/doublest.h |  6 ------
 gdb/gdbtypes.c | 56 ++++++++++++++++++++++++++------------------------------
 gdb/gdbtypes.h | 12 +++++++-----
 5 files changed, 48 insertions(+), 57 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 7de4542..478ec65 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,20 @@
 2017-09-27  Ulrich Weigand  <uweigand@de.ibm.com>
 
+	* doublest.h (floatformat_from_type): Move to gdbtypes.h.
+	* doublest.c (floatformat_from_type): Move to gdbtypes.c.
+
+	* gdbtypes.h (union type_specific): Make field floatformat hold
+	just a single struct floatformat, not an array.
+	(floatformat_from_type): Move here.
+	* gdbtypes.c (floatformat_from_type): Move here.  Update to
+	changed TYPE_FLOATFORMAT definition.
+	(verify_floatformat): Update to changed TYPE_FLOATFORMAT.
+	(recursive_dump_type): Likewise.
+	(init_float_type): Install correct floatformat for byte order.
+	(arch_float_type): Likewise.
+
+2017-09-27  Ulrich Weigand  <uweigand@de.ibm.com>
+
 	* gdbtypes.c (init_type): Change incoming argument from
 	length-in-bytes to length-in-bits.  Assert length is a
 	multiple of TARGET_CHAR_BITS.
diff --git a/gdb/doublest.c b/gdb/doublest.c
index e464177..2047087 100644
--- a/gdb/doublest.c
+++ b/gdb/doublest.c
@@ -770,22 +770,6 @@ floatformat_from_doublest (const struct floatformat *fmt,
 }
 
 
-/* Return the floating-point format for a floating-point variable of
-   type TYPE.  */
-
-const struct floatformat *
-floatformat_from_type (const struct type *type)
-{
-  struct gdbarch *gdbarch = get_type_arch (type);
-  const struct floatformat *fmt;
-
-  gdb_assert (TYPE_CODE (type) == TYPE_CODE_FLT);
-  gdb_assert (TYPE_FLOATFORMAT (type));
-  fmt = TYPE_FLOATFORMAT (type)[gdbarch_byte_order (gdbarch)];
-  gdb_assert (TYPE_LENGTH (type) >= floatformat_totalsize_bytes (fmt));
-  return fmt;
-}
-
 /* Extract a floating-point number of type TYPE from a target-order
    byte-stream at ADDR.  Returns the value as type DOUBLEST.  */
 
diff --git a/gdb/doublest.h b/gdb/doublest.h
index 23c6ee5..a22baef 100644
--- a/gdb/doublest.h
+++ b/gdb/doublest.h
@@ -83,12 +83,6 @@ extern enum float_kind floatformat_classify (const struct floatformat *,
 extern const char *floatformat_mantissa (const struct floatformat *,
 					 const bfd_byte *);
 
-/* Given TYPE, return its floatformat.  TYPE_FLOATFORMAT() may return
-   NULL.  type_floatformat() detects that and returns a floatformat
-   based on the type size when FLOATFORMAT is NULL.  */
-
-const struct floatformat *floatformat_from_type (const struct type *type);
-
 /* Return the floatformat's total size in host bytes.  */
 
 extern size_t floatformat_totalsize_bytes (const struct floatformat *fmt);
diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
index bec1fd5..57bc218 100644
--- a/gdb/gdbtypes.c
+++ b/gdb/gdbtypes.c
@@ -2734,22 +2734,30 @@ set_type_code (struct type *type, enum type_code code)
    determined by the floatformat.  Returns size to be used.  */
 
 static int
-verify_floatformat (int bit, const struct floatformat **floatformats)
+verify_floatformat (int bit, const struct floatformat *floatformat)
 {
-  gdb_assert (floatformats != NULL);
-  gdb_assert (floatformats[0] != NULL && floatformats[1] != NULL);
+  gdb_assert (floatformat != NULL);
 
   if (bit == -1)
-    bit = floatformats[0]->totalsize;
-  gdb_assert (bit >= 0);
+    bit = floatformat->totalsize;
 
-  size_t len = bit / TARGET_CHAR_BIT;
-  gdb_assert (len >= floatformat_totalsize_bytes (floatformats[0]));
-  gdb_assert (len >= floatformat_totalsize_bytes (floatformats[1]));
+  gdb_assert (bit >= 0);
+  gdb_assert (bit >= floatformat->totalsize);
 
   return bit;
 }
 
+/* Return the floating-point format for a floating-point variable of
+   type TYPE.  */
+
+const struct floatformat *
+floatformat_from_type (const struct type *type)
+{
+  gdb_assert (TYPE_CODE (type) == TYPE_CODE_FLT);
+  gdb_assert (TYPE_FLOATFORMAT (type));
+  return TYPE_FLOATFORMAT (type);
+}
+
 /* Helper function to initialize the standard scalar types.
 
    If NAME is non-NULL, then it is used to initialize the type name.
@@ -2842,11 +2850,13 @@ init_float_type (struct objfile *objfile,
 		 int bit, const char *name,
 		 const struct floatformat **floatformats)
 {
+  struct gdbarch *gdbarch = get_objfile_arch (objfile);
+  const struct floatformat *fmt = floatformats[gdbarch_byte_order (gdbarch)];
   struct type *t;
 
-  bit = verify_floatformat (bit, floatformats);
+  bit = verify_floatformat (bit, fmt);
   t = init_type (objfile, TYPE_CODE_FLT, bit, name);
-  TYPE_FLOATFORMAT (t) = floatformats;
+  TYPE_FLOATFORMAT (t) = fmt;
 
   return t;
 }
@@ -4544,26 +4554,11 @@ recursive_dump_type (struct type *type, int spaces)
 
       case TYPE_SPECIFIC_FLOATFORMAT:
 	printfi_filtered (spaces, "floatformat ");
-	if (TYPE_FLOATFORMAT (type) == NULL)
+	if (TYPE_FLOATFORMAT (type) == NULL
+	    || TYPE_FLOATFORMAT (type)->name == NULL)
 	  puts_filtered ("(null)");
 	else
-	  {
-	    puts_filtered ("{ ");
-	    if (TYPE_FLOATFORMAT (type)[0] == NULL
-		|| TYPE_FLOATFORMAT (type)[0]->name == NULL)
-	      puts_filtered ("(null)");
-	    else
-	      puts_filtered (TYPE_FLOATFORMAT (type)[0]->name);
-
-	    puts_filtered (", ");
-	    if (TYPE_FLOATFORMAT (type)[1] == NULL
-		|| TYPE_FLOATFORMAT (type)[1]->name == NULL)
-	      puts_filtered ("(null)");
-	    else
-	      puts_filtered (TYPE_FLOATFORMAT (type)[1]->name);
-
-	    puts_filtered (" }");
-	  }
+	  puts_filtered (TYPE_FLOATFORMAT (type)->name);
 	puts_filtered ("\n");
 	break;
 
@@ -4908,11 +4903,12 @@ arch_float_type (struct gdbarch *gdbarch,
 		 int bit, const char *name,
 		 const struct floatformat **floatformats)
 {
+  const struct floatformat *fmt = floatformats[gdbarch_byte_order (gdbarch)];
   struct type *t;
 
-  bit = verify_floatformat (bit, floatformats);
+  bit = verify_floatformat (bit, fmt);
   t = arch_type (gdbarch, TYPE_CODE_FLT, bit, name);
-  TYPE_FLOATFORMAT (t) = floatformats;
+  TYPE_FLOATFORMAT (t) = fmt;
 
   return t;
 }
diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h
index c96a328..009cea9 100644
--- a/gdb/gdbtypes.h
+++ b/gdb/gdbtypes.h
@@ -571,12 +571,11 @@ union type_specific
 
   struct gnat_aux_type *gnat_stuff;
 
-  /* * FLOATFORMAT is for TYPE_CODE_FLT.  It is a pointer to two
-     floatformat objects that describe the floating-point value
-     that resides within the type.  The first is for big endian
-     targets and the second is for little endian targets.  */
+  /* * FLOATFORMAT is for TYPE_CODE_FLT.  It is a pointer to a
+     floatformat object that describes the floating-point value
+     that resides within the type.  */
 
-  const struct floatformat **floatformat;
+  const struct floatformat *floatformat;
 
   /* * For TYPE_CODE_FUNC and TYPE_CODE_METHOD types.  */
 
@@ -1434,6 +1433,9 @@ extern void set_type_vptr_basetype (struct type *, struct type *);
 #define TYPE_ERROR_NAME(type) \
   (TYPE_NAME (type) ? TYPE_NAME (type) : _("<error type>"))
 
+/* Given TYPE, return its floatformat.  */
+const struct floatformat *floatformat_from_type (const struct type *type);
+
 struct builtin_type
 {
   /* Integral types.  */


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