[binutils-gdb] Fix the assembler's floating point number parser so that it can correctly handle numbers encoded as

Nick Clifton nickc@sourceware.org
Thu Aug 22 11:55:00 GMT 2019


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

commit a3197745b1edfd711e345b7c94c68be85eb11e48
Author: Bosco Garc?a <jbgg.gnu@gmail.com>
Date:   Thu Aug 22 12:54:06 2019 +0100

    Fix the assembler's floating point number parser so that it can correctly handle numbers encoded as a leading decimal point, followed by zeroes, followed by a non-zero sequence.
    
    	* atof-generic.c (atof_generic): Do not ignore leading zeros if
    	they appear after a decimal point.
    	* testsuite/gas/all/float.s: Extend test to include a number with
    	a leading decimal point followed by several zeroes.
    	* testsuite/gas/i386/fp.s: Likewise.
    	* testsuite/gas/i386/fp.d: Update expected output.

Diff:
---
 gas/ChangeLog                 | 10 ++++++++++
 gas/atof-generic.c            | 39 ++++++++++++++++++++++++++++++++-------
 gas/testsuite/gas/all/float.s |  2 ++
 gas/testsuite/gas/i386/fp.d   |  1 +
 gas/testsuite/gas/i386/fp.s   |  4 ++++
 5 files changed, 49 insertions(+), 7 deletions(-)

diff --git a/gas/ChangeLog b/gas/ChangeLog
index 655c8ad..bd9887e 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,13 @@
+2019-08-22  Bosco García  <jbgg.gnu@gmail.com>
+	    Nick Clifton  <nickc@redhat.com>
+
+	* atof-generic.c (atof_generic): Do not ignore leading zeros if
+	they appear after a decimal point.
+	* testsuite/gas/all/float.s: Extend test to include a number with
+	a leading decimal point followed by several zeroes.
+	* testsuite/gas/i386/fp.s: Likewise.
+	* testsuite/gas/i386/fp.d: Update expected output.
+
 2019-08-22  Barnaby Wilks  <barnaby.wilks@arm.com>
 
 	* config/tc-aarch64.c: Add float16 directive and add "Hh" to
diff --git a/gas/atof-generic.c b/gas/atof-generic.c
index 40ee910..345ccef 100644
--- a/gas/atof-generic.c
+++ b/gas/atof-generic.c
@@ -184,23 +184,42 @@ atof_generic (/* return pointer to just AFTER number we read.  */
 
 #ifndef OLD_FLOAT_READS
   /* Ignore trailing 0's after the decimal point.  The original code here
-   * (ifdef'd out) does not do this, and numbers like
-   *	4.29496729600000000000e+09	(2**31)
-   * come out inexact for some reason related to length of the digit
-   * string.
-   */
+     (ifdef'd out) does not do this, and numbers like
+    	4.29496729600000000000e+09	(2**31)
+     come out inexact for some reason related to length of the digit
+     string.  */
+
+  /* The case number_of_digits_before_decimal = 0 is handled for
+     deleting zeros after decimal.  In this case the decimal mark and
+     the first zero digits after decimal mark are skipped.  */
+  seen_significant_digit = 0;
+  signed long subtract_decimal_exponent = 0;
+
   if (c && IS_DECIMAL_MARK (c))
     {
-      unsigned int zeros = 0;	/* Length of current string of zeros */
+      unsigned int zeros = 0;	/* Length of current string of zeros.  */
+
+      if (number_of_digits_before_decimal == 0)
+	/* Skip decimal mark.  */
+	first_digit++;
 
       for (p++; (c = *p) && ISDIGIT (c); p++)
 	{
 	  if (c == '0')
 	    {
-	      zeros++;
+	      if (number_of_digits_before_decimal == 0
+		  && !seen_significant_digit)
+		{
+		  /* Skip '0' and the decimal mark.  */
+		  first_digit++;
+		  subtract_decimal_exponent--;
+		}
+	      else
+		zeros++;
 	    }
 	  else
 	    {
+	      seen_significant_digit = 1;
 	      number_of_digits_after_decimal += 1 + zeros;
 	      zeros = 0;
 	    }
@@ -287,6 +306,12 @@ atof_generic (/* return pointer to just AFTER number we read.  */
 	}
     }
 
+#ifndef OLD_FLOAT_READS
+  /* Subtract_decimal_exponent != 0 when number_of_digits_before_decimal = 0
+     and first digit after decimal is '0'.  */
+  decimal_exponent += subtract_decimal_exponent;
+#endif
+
   *address_of_string_pointer = p;
 
   number_of_digits_available =
diff --git a/gas/testsuite/gas/all/float.s b/gas/testsuite/gas/all/float.s
index b098cad..902914f 100644
--- a/gas/testsuite/gas/all/float.s
+++ b/gas/testsuite/gas/all/float.s
@@ -2,3 +2,5 @@
 foo:	.single	0r1.2345e+06
 	.single 0f3.14159
 	.double 0r2.718282
+        .double .0000000000000000000001
+        .double 1e-22
diff --git a/gas/testsuite/gas/i386/fp.d b/gas/testsuite/gas/i386/fp.d
index 21838e2..a9a9538 100644
--- a/gas/testsuite/gas/i386/fp.d
+++ b/gas/testsuite/gas/i386/fp.d
@@ -6,3 +6,4 @@
 Contents of section .data:
  0000 00881bcd 4b789ad4 004071a3 79094f93  ....Kx...@q.y.O.
  0010 0a40789a 5440789a 54400000 00000000  .@x.T@x.T@......
+ 0020 e65e1710 20395e3b e65e1710 20395e3b  .\^.. 9\^;.\^.. 9\^;
diff --git a/gas/testsuite/gas/i386/fp.s b/gas/testsuite/gas/i386/fp.s
index 4187d4e..a1f2b0f 100644
--- a/gas/testsuite/gas/i386/fp.s
+++ b/gas/testsuite/gas/i386/fp.s
@@ -11,3 +11,7 @@
 	.single 3.32192809488736218171e0
 #	.byte 0x78, 0x9a, 0x54, 0x40, 0, 0, 0, 0
 	.byte 0, 0, 0, 0, 0, 0
+
+# The assembler used to treat the next value as zero instead of 1e-22.
+        .double .0000000000000000000001
+        .double 1e-22



More information about the Binutils-cvs mailing list