From 88bfe6ac8bcbaf1eb0c1e4be02c21a5c048b7335 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Fri, 3 Nov 2023 13:33:38 +0100 Subject: [PATCH] gas: correct ignoring of C-style number suffixes 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 --- gas/expr.c | 31 +++++++++++++--- gas/testsuite/gas/all/const-1.l | 64 +++++++++++++++++++++++++++++++++ gas/testsuite/gas/all/const-1.s | 20 +++++++++++ gas/testsuite/gas/all/gas.exp | 5 +++ 4 files changed, 116 insertions(+), 4 deletions(-) create mode 100644 gas/testsuite/gas/all/const-1.l create mode 100644 gas/testsuite/gas/all/const-1.s diff --git a/gas/expr.c b/gas/expr.c index 204cfebc4c7..6b1e1c31e5d 100644 --- a/gas/expr.c +++ b/gas/expr.c @@ -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 index 00000000000..4c1bb58f5a7 --- /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 diff --git a/gas/testsuite/gas/all/const-1.s b/gas/testsuite/gas/all/const-1.s new file mode 100644 index 00000000000..25b7f3e0b82 --- /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 diff --git a/gas/testsuite/gas/all/gas.exp b/gas/testsuite/gas/all/gas.exp index 007408f03d8..25fe5dd8989 100644 --- 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 -- 2.30.2