mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-18 12:24:38 +08:00
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:
parent
c14c7a8a61
commit
19c2883a9b
@ -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>
|
||||
|
||||
|
59
gas/expr.c
59
gas/expr.c
@ -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':
|
||||
|
Loading…
Reference in New Issue
Block a user