gas: correct ignoring of C-style number suffixes

Message ID 05210620-3cfc-d254-1e35-35a0bad179e7@suse.com
State New
Headers
Series gas: correct ignoring of C-style number suffixes |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_binutils_check--master-arm success Testing passed
linaro-tcwg-bot/tcwg_binutils_build--master-arm success Testing passed
linaro-tcwg-bot/tcwg_binutils_build--master-aarch64 success Testing passed
linaro-tcwg-bot/tcwg_binutils_check--master-aarch64 success Testing passed

Commit Message

Jan Beulich Oct. 30, 2023, 2:38 p.m. UTC
  First of all the respective original changes didn't deal with just 0
having such a suffix - this needs additional logic outside of
integer_constant(). Further bogus suffixes having more than two L-s
were accepted, while valid suffixes with U following the L(s) weren't.
Finally respective tests were introduced for Sparc only.
---
Instead of disabling the test for tic{,5}4x an alternative might be to
use .dc.b. What I'm unclear about is whether that then really results in
rubbish for those two targets (i.e. I'm uncertain whether they really
shouldn't also override those directives).
  

Comments

Neal Frager Oct. 31, 2023, 10:05 a.m. UTC | #1
> First of all the respective original changes didn't deal with just 0 having such a suffix - this needs additional logic outside of integer_constant(). Further bogus suffixes having more than two L-s were accepted, while valid suffixes with U following the L(s) weren't.
> Finally respective tests were introduced for Sparc only.
> ---
> Instead of disabling the test for tic{,5}4x an alternative might be to use .dc.b. What I'm unclear about is whether that then really results in rubbish for those two targets (i.e. I'm uncertain whether they really shouldn't also override those directives).

Reviewed-by: Neal Frager <neal.frager@amd.com>

Thank you for developing this solution.

Best regards,
Neal Frager
AMD
  

Patch

--- a/gas/expr.c
+++ b/gas/expr.c
@@ -538,17 +538,26 @@  integer_constant (int radix, expressionS
 #ifndef tc_allow_U_suffix
 #define tc_allow_U_suffix 1
 #endif
+  bool u_seen = !tc_allow_U_suffix;
   /* PR 19910: Look for, and ignore, a U suffix to the number.  */
-  if (tc_allow_U_suffix && (c == 'U' || c == 'u'))
-    c = * input_line_pointer++;
+  if (!u_seen && (c == 'U' || c == 'u'))
+    {
+      c = *input_line_pointer++;
+      u_seen = true;
+    }
 
 #ifndef tc_allow_L_suffix
 #define tc_allow_L_suffix 1
 #endif
   /* PR 20732: Look for, and ignore, a L or LL suffix to the number.  */
-  if (tc_allow_L_suffix)
-    while (c == 'L' || c == 'l')
+  if (tc_allow_L_suffix && (c == 'L' || c == 'l'))
+    {
       c = * input_line_pointer++;
+      if (c == 'L' || c == 'l')
+	c = *input_line_pointer++;
+      if (!u_seen && (c == 'U' || c == 'u'))
+	c = *input_line_pointer++;
+    }
 
   if (small)
     {
@@ -888,6 +897,19 @@  operand (expressionS *expressionP, enum
 	    input_line_pointer++;
 	  goto default_case;
 
+	case 'l':
+	case 'L':
+	  /* Accept an L suffix to the zero.  */
+	  if (tc_allow_L_suffix)
+	    goto numeric;
+	  goto default_case;
+
+	case 'u':
+	case 'U':
+	  /* Accept a U suffix to the zero.  */
+	  if (!tc_allow_U_suffix)
+	    goto default_case;
+	  /* Fall through.  */
 	case '0':
 	case '1':
 	case '2':
@@ -896,6 +918,7 @@  operand (expressionS *expressionP, enum
 	case '5':
 	case '6':
 	case '7':
+	numeric:
 	  integer_constant ((flag_m68k_mri || NUMBERS_WITH_SUFFIX)
 			    ? 0 : 8,
 			    expressionP);
--- /dev/null
+++ b/gas/testsuite/gas/all/const-1.l
@@ -0,0 +1,64 @@ 
+# This should match the output of gas -alm const-1.s.
+.*: Assembler messages:
+.*:5: Error: .*`l'
+.*:18:  Info: .*
+.*:6: Error: .*`l'
+.*:18:  Info: .*
+.*:7: Error: .*`l'
+.*:18:  Info: .*
+.*:8: Error: .*`l'
+.*:18:  Info: .*
+.*:5: Error: .*`u'
+.*:19:  Info: .*
+.*:6: Error: .*`u'
+.*:19:  Info: .*
+.*:7: Error: .*`u'
+.*:19:  Info: .*
+.*:8: Error: .*`u'
+.*:19:  Info: .*
+.*:5: Error: .*`l'
+.*:20:  Info: .*
+.*:6: Error: .*`l'
+.*:20:  Info: .*
+.*:7: Error: .*`l'
+.*:20:  Info: .*
+.*:8: Error: .*`l'
+.*:20:  Info: .*
+.*GAS .*/const-1\.s[ 	].*
+#...
+[ 	]*[0-9]*[ 	]+const u
+[ 	]*[0-9]*[ 	]+\?\?\?\? 00[ 	]+>  \.byte 0u
+[ 	]*[0-9]*[ 	]+\?\?\?\? 00[ 	]+>  \.byte 00u
+[ 	]*[0-9]*[ 	]+\?\?\?\? 00[ 	]+>  \.byte 0x0u
+[ 	]*[0-9]*[ 	]+\?\?\?\? 01[ 	]+>  \.byte 1u
+[ 	]*[0-9]*[ 	]+const l
+[ 	]*[0-9]*[ 	]+\?\?\?\? 00[ 	]+>  \.byte 0l
+[ 	]*[0-9]*[ 	]+\?\?\?\? 00[ 	]+>  \.byte 00l
+[ 	]*[0-9]*[ 	]+\?\?\?\? 00[ 	]+>  \.byte 0x0l
+[ 	]*[0-9]*[ 	]+\?\?\?\? 01[ 	]+>  \.byte 1l
+[ 	]*[0-9]*[ 	]+const ul
+[ 	]*[0-9]*[ 	]+\?\?\?\? 00[ 	]+>  \.byte 0ul
+[ 	]*[0-9]*[ 	]+\?\?\?\? 00[ 	]+>  \.byte 00ul
+[ 	]*[0-9]*[ 	]+\?\?\?\? 00[ 	]+>  \.byte 0x0ul
+[ 	]*[0-9]*[ 	]+\?\?\?\? 01[ 	]+>  \.byte 1ul
+[ 	]*[0-9]*[ 	]+const lu
+[ 	]*[0-9]*[ 	]+\?\?\?\? 00[ 	]+>  \.byte 0lu
+[ 	]*[0-9]*[ 	]+\?\?\?\? 00[ 	]+>  \.byte 00lu
+[ 	]*[0-9]*[ 	]+\?\?\?\? 00[ 	]+>  \.byte 0x0lu
+[ 	]*[0-9]*[ 	]+\?\?\?\? 01[ 	]+>  \.byte 1lu
+[ 	]*[0-9]*[ 	]+const ll
+[ 	]*[0-9]*[ 	]+\?\?\?\? 00[ 	]+>  \.byte 0ll
+[ 	]*[0-9]*[ 	]+\?\?\?\? 00[ 	]+>  \.byte 00ll
+[ 	]*[0-9]*[ 	]+\?\?\?\? 00[ 	]+>  \.byte 0x0ll
+[ 	]*[0-9]*[ 	]+\?\?\?\? 01[ 	]+>  \.byte 1ll
+[ 	]*[0-9]*[ 	]+const llu
+[ 	]*[0-9]*[ 	]+\?\?\?\? 00[ 	]+>  \.byte 0llu
+[ 	]*[0-9]*[ 	]+\?\?\?\? 00[ 	]+>  \.byte 00llu
+[ 	]*[0-9]*[ 	]+\?\?\?\? 00[ 	]+>  \.byte 0x0llu
+[ 	]*[0-9]*[ 	]+\?\?\?\? 01[ 	]+>  \.byte 1llu
+[ 	]*[0-9]*[ 	]+const ull
+[ 	]*[0-9]*[ 	]+\?\?\?\? 00[ 	]+>  \.byte 0ull
+[ 	]*[0-9]*[ 	]+\?\?\?\? 00[ 	]+>  \.byte 00ull
+[ 	]*[0-9]*[ 	]+\?\?\?\? 00[ 	]+>  \.byte 0x0ull
+[ 	]*[0-9]*[ 	]+\?\?\?\? 01[ 	]+>  \.byte 1ull
+#pass
--- /dev/null
+++ b/gas/testsuite/gas/all/const-1.s
@@ -0,0 +1,20 @@ 
+	.data
+data:
+
+	.macro const, sfx
+	.byte 0\sfx
+	.byte 00\sfx
+	.byte 0x0\sfx
+	.byte 1\sfx
+	.endm
+
+	const u
+	const l
+	const ul
+	const lu
+	const ll
+	const llu
+	const ull
+	const lll
+	const ulu
+	const lul
--- a/gas/testsuite/gas/all/gas.exp
+++ b/gas/testsuite/gas/all/gas.exp
@@ -469,6 +469,11 @@  run_list_test cond-2 "-al"
 setup_xfail "tic30-*-*"
 run_list_test linefile ""
 
+# Again, .byte does not emit 8 bits on either tic4x or tic54x.
+if { ![istarget "tic4x*-*-*"] && ![istarget "tic54x*-*-*"] } {
+    run_list_test const-1 "-alm"
+}
+
 run_list_test macro "-alm"
 
 run_list_test pr20312