[PATCH v2 05/65] Arm: use is_whitespace()
Jan Beulich
jbeulich@suse.com
Mon Jan 27 15:50:00 GMT 2025
Wherever blanks are permissible in input, tabs ought to be permissible,
too. This is particularly relevant when -f is passed to gas (alongside
appropriate input). At the same time use is_end_of_stmt() instead of an
open-coded nul char check.
In parse_neon_type() be more aggressive and remove the special casing of
certain characters altogether. The original default case simply having
"break" can't have been correct.
---
I don't think I see why parse_qfloat_immediate() checks for '\n'. If
that was needed, "line" (really: statement) separators would need
checking for, too. Yet an easy experiment demonstrates that this case is
working correctly despite the lack of a check for ';'.
The check for "0x" in parse_qfloat_immediate() seems fishy, too: If it
was actually needed, "0X" would apparently also checking form. Yet again
experimentally that's properly refused anyway, by atof_ieee() I guess.
While for parse_neon_type() the change improves the handling of this set
of (bad) examples (including the case of passing -f to gas):
vcvt.bf016.f32 d0, q0
vcvt.bf16.f032 d0, q0
vcvt.b16.f32 d0, q0
vcvt.b f16.f32 d0, q0
vcvt.bf 16.f32 d0, q0
vcvt.bf16.f 32 d0, q0
vcvt.b f16.f32 d0, q0
vcvt.b 16.f32 d0, q0
vcvt.b 32.f32 d0, q0
vcvt.bf 16.f32 d0, q0
several are left which imo also ought to be rejected. Yet that will want
sorting separately.
---
v2: Also replace ISSPACE().
--- a/gas/config/tc-arm.c
+++ b/gas/config/tc-arm.c
@@ -1081,7 +1081,7 @@ const char FLT_CHARS[] = "rRsSfFdDxXeEpP
/* Separator character handling. */
-#define skip_whitespace(str) do { if (*(str) == ' ') ++(str); } while (0)
+#define skip_whitespace(str) do { if (is_whitespace (*(str))) ++(str); } while (0)
enum fp_16bit_format
{
@@ -1510,13 +1510,9 @@ parse_neon_type (struct neon_type *type,
return FAIL;
}
goto done;
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- case ' ': case '.':
+ default:
as_bad (_("unexpected type character `b' -- did you mean `bf'?"));
return FAIL;
- default:
- break;
}
break;
default:
@@ -5055,7 +5051,8 @@ set_fp16_format (int dummy ATTRIBUTE_UNU
new_format = ARM_FP16_FORMAT_DEFAULT;
name = input_line_pointer;
- while (*input_line_pointer && !ISSPACE (*input_line_pointer))
+ while (!is_end_of_stmt (*input_line_pointer)
+ && !is_whitespace (*input_line_pointer))
input_line_pointer++;
saved_char = *input_line_pointer;
@@ -5366,7 +5363,7 @@ parse_qfloat_immediate (char **ccp, int
return FAIL;
else
{
- for (; *fpnum != '\0' && *fpnum != ' ' && *fpnum != '\n'; fpnum++)
+ for (; *fpnum != '\0' && !is_whitespace (*fpnum) && *fpnum != '\n'; fpnum++)
if (*fpnum == '.' || *fpnum == 'e' || *fpnum == 'E')
{
found_fpchar = 1;
@@ -22450,7 +22447,7 @@ opcode_lookup (char **str)
/* Scan up to the end of the mnemonic, which must end in white space,
'.' (in unified mode, or for Neon/VFP instructions), or end of string. */
for (base = end = *str; *end != '\0'; end++)
- if (*end == ' ' || *end == '.')
+ if (is_whitespace (*end) || *end == '.')
break;
if (end == base)
@@ -22481,7 +22478,7 @@ opcode_lookup (char **str)
if (parse_neon_type (&inst.vectype, str) == FAIL)
return NULL;
}
- else if (end[offset] != '\0' && end[offset] != ' ')
+ else if (end[offset] != '\0' && !is_whitespace (end[offset]))
return NULL;
}
else
More information about the Binutils
mailing list