This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils 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: [libiberty and gdb] floatformat_is_valid


On Mon, Sep 15, 2003 at 04:54:17PM -0400, Andrew Cagney wrote:

>+/* Return non-zero iff the data at FROM is a valid number in format FMT. >*/
>+
>+int
>+floatformat_is_valid (fmt, from)
>+ const struct floatformat *fmt;
>+ char *from;
>+{


Shouldn't this be a new virtual method in floatformat?

The attached implements this. Any objections?


Floatformats don't have any virtual methods right now; if you want to
add them, be my guest.  Besides, this is more in line with the
libiberty policy of backwards compatibility, since it does not change
the structure layout.

There didn't seem to be a problem when "name" was added, or arm_ext was deleted.


enjoy,
Andrew

Index: include/ChangeLog
2003-09-15  Andrew Cagney  <cagney@redhat.com>

	* floatformat.h (struct floatformat): Add field "is_valid".

Index: libiberty/ChangeLog
2003-09-15  Andrew Cagney  <cagney@redhat.com>

	* floatformat.c (floatformat_i387_ext_is_valid): New function.
	(floatformat_always_valid): New function.
	(floatformat_m68881_ext): Initialize new "is_valid" field to
	"floatformat_i387_ext_is_valid".
	(floatformat_ieee_single_little): Initialize "is_valid" field to
	floatformat_always_valid.
	(floatformat_ieee_double_big): Ditto.
	(floatformat_ieee_double_little): Ditto.
	(floatformat_ieee_double_little): Ditto.
	(floatformat_ieee_double_littlebyte_bigword): Ditto.
	(floatformat_i960_ext): Ditto.
	(floatformat_m88110_ext): Ditto.
	(floatformat_m88110_harris_ext): Ditto.
	(floatformat_arm_ext_big): Ditto.
	(floatformat_arm_ext_littlebyte_bigword): Ditto.
	(floatformat_ia64_spill_big): Ditto.
	(floatformat_ia64_spill_little): Ditto.
	(floatformat_ia64_quad_big): Ditto.
	(floatformat_ia64_quad_little): Ditto.
	(floatformat_ia64_quad_little): Ditto.
	(floatformat_is_valid): Call "is_valid".

Index: include/floatformat.h
===================================================================
RCS file: /cvs/src/src/include/floatformat.h,v
retrieving revision 1.8
diff -u -r1.8 floatformat.h
--- include/floatformat.h	16 Sep 2003 01:47:53 -0000	1.8
+++ include/floatformat.h	16 Sep 2003 02:24:45 -0000
@@ -80,6 +80,9 @@
 
   /* Internal name for debugging. */
   const char *name;
+
+  /* Validator method.  */
+  int (*is_valid) PARAMS ((const struct floatformat *fmt, const char *from));
 };
 
 /* floatformats for IEEE single and double, big and little endian.  */
Index: libiberty/floatformat.c
===================================================================
RCS file: /cvs/src/src/libiberty/floatformat.c,v
retrieving revision 1.9
diff -u -r1.9 floatformat.c
--- libiberty/floatformat.c	16 Sep 2003 01:47:54 -0000	1.9
+++ libiberty/floatformat.c	16 Sep 2003 02:25:42 -0000
@@ -29,6 +29,22 @@
 extern char *memset ();
 #endif
 
+static unsigned long get_field PARAMS ((const unsigned char *,
+					enum floatformat_byteorders,
+					unsigned int,
+					unsigned int,
+					unsigned int));
+static int floatformat_always_valid PARAMS ((const struct floatformat *fmt,
+					     const char *from));
+
+static int
+floatformat_always_valid (fmt, from)
+     const struct floatformat *fmt;
+     const char *from;
+{
+  return 1;
+}
+
 /* The odds that CHAR_BIT will be anything but 8 are low enough that I'm not
    going to bother with trying to muck around with whether it is defined in
    a system header, what we do if not, etc.  */
@@ -39,25 +55,29 @@
 {
   floatformat_big, 32, 0, 1, 8, 127, 255, 9, 23,
   floatformat_intbit_no,
-  "floatformat_ieee_single_big"
+  "floatformat_ieee_single_big",
+  floatformat_always_valid
 };
 const struct floatformat floatformat_ieee_single_little =
 {
   floatformat_little, 32, 0, 1, 8, 127, 255, 9, 23,
   floatformat_intbit_no,
-  "floatformat_ieee_single_little"
+  "floatformat_ieee_single_little",
+  floatformat_always_valid
 };
 const struct floatformat floatformat_ieee_double_big =
 {
   floatformat_big, 64, 0, 1, 11, 1023, 2047, 12, 52,
   floatformat_intbit_no,
-  "floatformat_ieee_double_big"
+  "floatformat_ieee_double_big",
+  floatformat_always_valid
 };
 const struct floatformat floatformat_ieee_double_little =
 {
   floatformat_little, 64, 0, 1, 11, 1023, 2047, 12, 52,
   floatformat_intbit_no,
-  "floatformat_ieee_double_little"
+  "floatformat_ieee_double_little",
+  floatformat_always_valid
 };
 
 /* floatformat for IEEE double, little endian byte order, with big endian word
@@ -67,34 +87,64 @@
 {
   floatformat_littlebyte_bigword, 64, 0, 1, 11, 1023, 2047, 12, 52,
   floatformat_intbit_no,
-  "floatformat_ieee_double_littlebyte_bigword"
+  "floatformat_ieee_double_littlebyte_bigword",
+  floatformat_always_valid
 };
 
+static int floatformat_i387_ext_is_valid PARAMS ((const struct floatformat *fmt, const char *from));
+
+static int
+floatformat_i387_ext_is_valid (fmt, from)
+     const struct floatformat *fmt;
+     const char *from;
+{
+  /* In the i387 double-extended format, if the exponent is all ones,
+     then the integer bit must be set.  If the exponent is neither 0
+     nor ~0, the intbit must also be set.  Only if the exponent is
+     zero can it be zero, and then it must be zero.  */
+  unsigned long exponent, int_bit;
+  const unsigned char *ufrom = (const unsigned char *) from;
+  
+  exponent = get_field (ufrom, fmt->byteorder, fmt->totalsize,
+			fmt->exp_start, fmt->exp_len);
+  int_bit = get_field (ufrom, fmt->byteorder, fmt->totalsize,
+		       fmt->man_start, 1);
+  
+  if ((exponent == 0) != (int_bit == 0))
+    return 0;
+  else
+    return 1;
+}
+
 const struct floatformat floatformat_i387_ext =
 {
   floatformat_little, 80, 0, 1, 15, 0x3fff, 0x7fff, 16, 64,
   floatformat_intbit_yes,
-  "floatformat_i387_ext"
+  "floatformat_i387_ext",
+  floatformat_i387_ext_is_valid
 };
 const struct floatformat floatformat_m68881_ext =
 {
   /* Note that the bits from 16 to 31 are unused.  */
   floatformat_big, 96, 0, 1, 15, 0x3fff, 0x7fff, 32, 64,
   floatformat_intbit_yes,
-  "floatformat_m68881_ext"
+  "floatformat_m68881_ext",
+  floatformat_always_valid
 };
 const struct floatformat floatformat_i960_ext =
 {
   /* Note that the bits from 0 to 15 are unused.  */
   floatformat_little, 96, 16, 17, 15, 0x3fff, 0x7fff, 32, 64,
   floatformat_intbit_yes,
-  "floatformat_i960_ext"
+  "floatformat_i960_ext",
+  floatformat_always_valid
 };
 const struct floatformat floatformat_m88110_ext =
 {
   floatformat_big, 80, 0, 1, 15, 0x3fff, 0x7fff, 16, 64,
   floatformat_intbit_yes,
-  "floatformat_m88110_ext"
+  "floatformat_m88110_ext",
+  floatformat_always_valid
 };
 const struct floatformat floatformat_m88110_harris_ext =
 {
@@ -102,53 +152,54 @@
      double, and the last 64 bits are wasted. */
   floatformat_big,128, 0, 1, 11,  0x3ff,  0x7ff, 12, 52,
   floatformat_intbit_no,
-  "floatformat_m88110_ext_harris"
+  "floatformat_m88110_ext_harris",
+  floatformat_always_valid
 };
 const struct floatformat floatformat_arm_ext_big =
 {
   /* Bits 1 to 16 are unused.  */
   floatformat_big, 96, 0, 17, 15, 0x3fff, 0x7fff, 32, 64,
   floatformat_intbit_yes,
-  "floatformat_arm_ext_big"
+  "floatformat_arm_ext_big",
+  floatformat_always_valid
 };
 const struct floatformat floatformat_arm_ext_littlebyte_bigword =
 {
   /* Bits 1 to 16 are unused.  */
   floatformat_littlebyte_bigword, 96, 0, 17, 15, 0x3fff, 0x7fff, 32, 64,
   floatformat_intbit_yes,
-  "floatformat_arm_ext_littlebyte_bigword"
+  "floatformat_arm_ext_littlebyte_bigword",
+  floatformat_always_valid
 };
 const struct floatformat floatformat_ia64_spill_big =
 {
   floatformat_big, 128, 0, 1, 17, 65535, 0x1ffff, 18, 64,
   floatformat_intbit_yes,
-  "floatformat_ia64_spill_big"
+  "floatformat_ia64_spill_big",
+  floatformat_always_valid
 };
 const struct floatformat floatformat_ia64_spill_little =
 {
   floatformat_little, 128, 0, 1, 17, 65535, 0x1ffff, 18, 64,
   floatformat_intbit_yes,
-  "floatformat_ia64_spill_little"
+  "floatformat_ia64_spill_little",
+  floatformat_always_valid
 };
 const struct floatformat floatformat_ia64_quad_big =
 {
   floatformat_big, 128, 0, 1, 15, 16383, 0x7fff, 16, 112,
   floatformat_intbit_no,
-  "floatformat_ia64_quad_big"
+  "floatformat_ia64_quad_big",
+  floatformat_always_valid
 };
 const struct floatformat floatformat_ia64_quad_little =
 {
   floatformat_little, 128, 0, 1, 15, 16383, 0x7fff, 16, 112,
   floatformat_intbit_no,
-  "floatformat_ia64_quad_little"
+  "floatformat_ia64_quad_little",
+  floatformat_always_valid
 };
 
-static unsigned long get_field PARAMS ((const unsigned char *,
-					enum floatformat_byteorders,
-					unsigned int,
-					unsigned int,
-					unsigned int));
-
 /* Extract a field which starts at START and is LEN bits long.  DATA and
    TOTAL_LEN are the thing we are extracting it from, in byteorder ORDER.  */
 static unsigned long
@@ -411,30 +462,7 @@
      const struct floatformat *fmt;
      const char *from;
 {
-  if (fmt == &floatformat_i387_ext)
-    {
-      /* In the i387 double-extended format, if the exponent is all
-	 ones, then the integer bit must be set.  If the exponent
-	 is neither 0 nor ~0, the intbit must also be set.  Only
-	 if the exponent is zero can it be zero, and then it must
-	 be zero.  */
-      unsigned long exponent, int_bit;
-      const unsigned char *ufrom = (const unsigned char *) from;
-
-      exponent = get_field (ufrom, fmt->byteorder, fmt->totalsize,
-			    fmt->exp_start, fmt->exp_len);
-      int_bit = get_field (ufrom, fmt->byteorder, fmt->totalsize,
-			   fmt->man_start, 1);
-
-      if ((exponent == 0) != (int_bit == 0))
-	return 0;
-      else
-	return 1;
-    }
-
-  /* Other formats with invalid representations should be added
-     here.  */
-  return 1;
+  return fmt->is_valid (fmt, from);
 }
 
 

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