From 808811a36951c6bc2ee9d56124603d7ef88a019e Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Fri, 20 Oct 2017 11:45:19 +0100 Subject: [PATCH] Improve handling of REPT pseudo op with a negative count. PR 22324 * read.c (s_rept): Use size_t type for count parameter. (do_repeat): Change type of count parameter to size_t. Issue an error is the count parameter is negative. (do_repeat_with_expression): Likewise. * read.h: Update prototypes for do_repeat and do_repeat_with_expression. * doc/as.texinfo (Rept): Document that a zero count is allowed but negative counts are not. * config/tc-rx.c (rx_rept): Use size_t type for count parameter. * config/tc-tic54x.c (tic54x_loop): Cast count parameter to size_t type. * testsuite/gas/macros/end.s: Add a test using a negative repeat count. * testsuite/gas/macros/end.l: Add expected error message. --- gas/ChangeLog | 18 ++++++++++++++++++ gas/config/tc-rx.c | 2 +- gas/config/tc-tic54x.c | 2 +- gas/doc/as.texinfo | 3 +++ gas/read.c | 22 +++++++++++++++++----- gas/read.h | 4 ++-- gas/testsuite/gas/macros/end.l | 1 + gas/testsuite/gas/macros/end.s | 3 +++ 8 files changed, 46 insertions(+), 9 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 5e55e94..b0c7184 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,21 @@ +2017-10-20 Nick Clifton + + PR 22324 + * read.c (s_rept): Use size_t type for count parameter. + (do_repeat): Change type of count parameter to size_t. + Issue an error is the count parameter is negative. + (do_repeat_with_expression): Likewise. + * read.h: Update prototypes for do_repeat and + do_repeat_with_expression. + * doc/as.texinfo (Rept): Document that a zero count is allowed but + negative counts are not. + * config/tc-rx.c (rx_rept): Use size_t type for count parameter. + * config/tc-tic54x.c (tic54x_loop): Cast count parameter to size_t + type. + * testsuite/gas/macros/end.s: Add a test using a negative repeat + count. + * testsuite/gas/macros/end.l: Add expected error message. + 2017-10-19 Palmer Dabbelt * config/tc-riscv.c (md_apply_fix): Mark diff --git a/gas/config/tc-rx.c b/gas/config/tc-rx.c index ba826c7..1cd3675 100644 --- a/gas/config/tc-rx.c +++ b/gas/config/tc-rx.c @@ -560,7 +560,7 @@ rx_list (int ignore ATTRIBUTE_UNUSED) static void rx_rept (int ignore ATTRIBUTE_UNUSED) { - int count = get_absolute_expression (); + size_t count = get_absolute_expression (); do_repeat_with_expander (count, "MREPEAT", "ENDR", "..MACREP"); } diff --git a/gas/config/tc-tic54x.c b/gas/config/tc-tic54x.c index cbc4a19..f7dc0f5 100644 --- a/gas/config/tc-tic54x.c +++ b/gas/config/tc-tic54x.c @@ -2031,7 +2031,7 @@ tic54x_loop (int count) if (!is_end_of_line[(int) *input_line_pointer]) count = get_absolute_expression (); - do_repeat (count, "LOOP", "ENDLOOP"); + do_repeat ((size_t) count, "LOOP", "ENDLOOP"); } /* Normally, endloop gets eaten by the preceding loop. */ diff --git a/gas/doc/as.texinfo b/gas/doc/as.texinfo index 8c125fd..9485d68 100644 --- a/gas/doc/as.texinfo +++ b/gas/doc/as.texinfo @@ -6392,6 +6392,9 @@ is equivalent to assembling .long 0 @end example +A count of zero is allowed, but nothing is generated. Negative counts are not +allowed and if encountered will be treated as if they were zero. + @node Sbttl @section @code{.sbttl "@var{subheading}"} diff --git a/gas/read.c b/gas/read.c index 1643c5c..9f2909f 100644 --- a/gas/read.c +++ b/gas/read.c @@ -3106,9 +3106,9 @@ s_bad_end (int endr) void s_rept (int ignore ATTRIBUTE_UNUSED) { - int count; + size_t count; - count = get_absolute_expression (); + count = (size_t) get_absolute_expression (); do_repeat (count, "REPT", "ENDR"); } @@ -3117,11 +3117,17 @@ s_rept (int ignore ATTRIBUTE_UNUSED) different directives to be used as the start/end keys. */ void -do_repeat (int count, const char *start, const char *end) +do_repeat (size_t count, const char *start, const char *end) { sb one; sb many; + if (((ssize_t) count) < 0) + { + as_bad (_("negative count for %s - ignored"), start); + count = 0; + } + sb_new (&one); if (!buffer_and_nest (start, end, &one, get_non_macro_line_sb)) { @@ -3144,7 +3150,7 @@ do_repeat (int count, const char *start, const char *end) block is replaced by the iteration count. */ void -do_repeat_with_expander (int count, +do_repeat_with_expander (size_t count, const char * start, const char * end, const char * expander) @@ -3152,6 +3158,12 @@ do_repeat_with_expander (int count, sb one; sb many; + if (((ssize_t) count) < 0) + { + as_bad (_("negative count for %s - ignored"), start); + count = 0; + } + sb_new (&one); if (!buffer_and_nest (start, end, &one, get_non_macro_line_sb)) { @@ -3172,7 +3184,7 @@ do_repeat_with_expander (int count, sb_build (& processed, one.len); sb_add_sb (& processed, & one); sub = strstr (processed.ptr, expander); - len = sprintf (sub, "%d", count); + len = sprintf (sub, "%lu", (unsigned long) count); gas_assert (len < 8); strcpy (sub + len, sub + 8); processed.len -= (8 - len); diff --git a/gas/read.h b/gas/read.h index e83118f..f16455d 100644 --- a/gas/read.h +++ b/gas/read.h @@ -146,8 +146,8 @@ extern void stabs_generate_asm_file (void); extern void stabs_generate_asm_lineno (void); extern void stabs_generate_asm_func (const char *, const char *); extern void stabs_generate_asm_endfunc (const char *, const char *); -extern void do_repeat (int,const char *,const char *); -extern void do_repeat_with_expander (int, const char *, const char *, const char *); +extern void do_repeat (size_t, const char *, const char *); +extern void do_repeat_with_expander (size_t, const char *, const char *, const char *); extern void end_repeat (int); extern void do_parse_cons_expression (expressionS *, int); diff --git a/gas/testsuite/gas/macros/end.l b/gas/testsuite/gas/macros/end.l index 1675ff8..ff5d452 100644 --- a/gas/testsuite/gas/macros/end.l +++ b/gas/testsuite/gas/macros/end.l @@ -1,3 +1,4 @@ .*: Assembler messages: .*:1: Warning: \.endm .* \.macro .*:2: Warning: \.endr .* (\.rept|\.irpc?).*(\.rept|\.irpc?).*(\.rept|\.irpc?) +.*:3: Error: negative count for REPT - ignored diff --git a/gas/testsuite/gas/macros/end.s b/gas/testsuite/gas/macros/end.s index 3a136c6..300b055 100644 --- a/gas/testsuite/gas/macros/end.s +++ b/gas/testsuite/gas/macros/end.s @@ -1,2 +1,5 @@ .endm .endr + .rept -1 + .endr + -- 2.7.4