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 <neal.frager@amd.com>
This commit is contained in:
Jan Beulich
2023-11-03 13:33:38 +01:00
parent c76820a017
commit 88bfe6ac8b
4 changed files with 116 additions and 4 deletions

View 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);

View File

@@ -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

View File

@@ -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

View 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