gas: correct ignoring of C-style number suffixes
authorJan Beulich <jbeulich@suse.com>
Fri, 3 Nov 2023 12:33:38 +0000 (13:33 +0100)
committerJan Beulich <jbeulich@suse.com>
Fri, 3 Nov 2023 12:33:38 +0000 (13:33 +0100)
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.

Reviewed-by: Neal Frager <neal.frager@amd.com>
gas/expr.c
gas/testsuite/gas/all/const-1.l [new file with mode: 0644]
gas/testsuite/gas/all/const-1.s [new file with mode: 0644]
gas/testsuite/gas/all/gas.exp

index 204cfebc4c79cbc829d0fce65696c7f6f0fe736f..6b1e1c31e5d6e89ac304b2a08c4b5c6b80e8cbe8 100644 (file)
@@ -538,17 +538,26 @@ integer_constant (int radix, expressionS *expressionP)
 #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 expr_mode mode)
            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 expr_mode mode)
        case '5':
        case '6':
        case '7':
+       numeric:
          integer_constant ((flag_m68k_mri || NUMBERS_WITH_SUFFIX)
                            ? 0 : 8,
                            expressionP);
diff --git a/gas/testsuite/gas/all/const-1.l b/gas/testsuite/gas/all/const-1.l
new file mode 100644 (file)
index 0000000..4c1bb58
--- /dev/null
@@ -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
diff --git a/gas/testsuite/gas/all/const-1.s b/gas/testsuite/gas/all/const-1.s
new file mode 100644 (file)
index 0000000..25b7f3e
--- /dev/null
@@ -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
index 007408f03d8a7581f36abb67a78ff20c3c816463..25fe5dd89890e191c26c65c7103cd7a0e74ef66d 100644 (file)
@@ -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