gas 0f handling
authorAlan Modra <amodra@gmail.com>
Thu, 13 Aug 2015 06:27:15 +0000 (15:57 +0930)
committerAlan Modra <amodra@gmail.com>
Thu, 13 Aug 2015 06:36:20 +0000 (16:06 +0930)
_start:
 .byte 0f-_start
0:

Fixes
..:2: Error: floating point number invalid
..:2: Error: junk at end of line, first unrecognized character is `_'

* expr.c (operand): Rewrite handling of operands starting with "0f".
If atof_generic only parses "-" or "+", treat as expression.

gas/ChangeLog
gas/expr.c

index 9fa703255a7f00e2d52cd9393350019289d74a6a..ecf77fb311762283843981d7aad1108b73c975ac 100644 (file)
@@ -1,3 +1,8 @@
+2015-08-13  Alan Modra  <amodra@gmail.com>
+
+       * expr.c (operand): Rewrite handling of operands starting with "0f".
+       If atof_generic only parses "-" or "+", treat as expression.
+
 2015-08-13  Alan Modra  <amodra@gmail.com>
            DJ Delorie  <dj@redhat.com>
 
index 2dae6bacce0b2779e1faa56dfb56b1b186b598f3..f8acd4129b46f4726ad0ce43f6fabd9cfb88ca1a 100644 (file)
@@ -877,48 +877,35 @@ operand (expressionS *expressionP, enum expr_mode mode)
        case 'f':
          if (LOCAL_LABELS_FB)
            {
+             int is_label = 1;
+
              /* If it says "0f" and it could possibly be a floating point
                 number, make it one.  Otherwise, make it a local label,
                 and try to deal with parsing the rest later.  */
-             if (!input_line_pointer[1]
-                 || (is_end_of_line[0xff & input_line_pointer[1]])
-                 || strchr (FLT_CHARS, 'f') == NULL)
-               goto is_0f_label;
-             {
-               char *cp = input_line_pointer + 1;
-               int r = atof_generic (&cp, ".", EXP_CHARS,
-                                     &generic_floating_point_number);
-               switch (r)
-                 {
-                 case 0:
-                 case ERROR_EXPONENT_OVERFLOW:
-                   if (*cp == 'f' || *cp == 'b')
-                     /* Looks like a difference expression.  */
-                     goto is_0f_label;
-                   else if (cp == input_line_pointer + 1)
-                     /* No characters has been accepted -- looks like
-                        end of operand.  */
-                     goto is_0f_label;
-                   else
-                     goto is_0f_float;
-                 default:
-                   as_fatal (_("expr.c(operand): bad atof_generic return val %d"),
-                             r);
-                 }
-             }
-
-             /* Okay, now we've sorted it out.  We resume at one of these
-                two labels, depending on what we've decided we're probably
-                looking at.  */
-           is_0f_label:
-             input_line_pointer--;
-             integer_constant (10, expressionP);
-             break;
-
-           is_0f_float:
-             /* Fall through.  */
-             ;
+             if (!is_end_of_line[(unsigned char) input_line_pointer[1]]
+                 && strchr (FLT_CHARS, 'f') != NULL)
+               {
+                 char *cp = input_line_pointer + 1;
+
+                 atof_generic (&cp, ".", EXP_CHARS,
+                               &generic_floating_point_number);
+
+                 /* Was nothing parsed, or does it look like an
+                    expression?  */
+                 is_label = (cp == input_line_pointer + 1
+                             || (cp == input_line_pointer + 2
+                                 && (cp[-1] == '-' || cp[-1] == '+'))
+                             || *cp == 'f'
+                             || *cp == 'b');
+               }
+             if (is_label)
+               {
+                 input_line_pointer--;
+                 integer_constant (10, expressionP);
+                 break;
+               }
            }
+         /* Fall through.  */
 
        case 'd':
        case 'D':