[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