diff options
author | Nick Clifton <nickc@redhat.com> | 2017-10-20 11:45:19 +0100 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2017-10-20 11:45:19 +0100 |
commit | 808811a36951c6bc2ee9d56124603d7ef88a019e (patch) | |
tree | ae4cdacbbf0fad18ed8625bc7d792787485145ab /gas/read.c | |
parent | 36862fc052b7006c78024952c4024c60b8a2733f (diff) | |
download | gdb-808811a36951c6bc2ee9d56124603d7ef88a019e.zip gdb-808811a36951c6bc2ee9d56124603d7ef88a019e.tar.gz gdb-808811a36951c6bc2ee9d56124603d7ef88a019e.tar.bz2 |
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.
Diffstat (limited to 'gas/read.c')
-rw-r--r-- | gas/read.c | 22 |
1 files changed, 17 insertions, 5 deletions
@@ -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); |