gas 0f handling

_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.
This commit is contained in:
Alan Modra 2015-08-13 15:57:15 +09:30
parent c14c7a8a61
commit 19c2883a9b
2 changed files with 28 additions and 36 deletions

View 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>

View 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);
}
}
if (!is_end_of_line[(unsigned char) input_line_pointer[1]]
&& strchr (FLT_CHARS, 'f') != NULL)
{
char *cp = input_line_pointer + 1;
/* 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;
atof_generic (&cp, ".", EXP_CHARS,
&generic_floating_point_number);
is_0f_float:
/* Fall through. */
;
/* 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':