aboutsummaryrefslogtreecommitdiff
path: root/gas/read.c
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2017-10-20 11:45:19 +0100
committerNick Clifton <nickc@redhat.com>2017-10-20 11:45:19 +0100
commit808811a36951c6bc2ee9d56124603d7ef88a019e (patch)
treeae4cdacbbf0fad18ed8625bc7d792787485145ab /gas/read.c
parent36862fc052b7006c78024952c4024c60b8a2733f (diff)
downloadbinutils-808811a36951c6bc2ee9d56124603d7ef88a019e.zip
binutils-808811a36951c6bc2ee9d56124603d7ef88a019e.tar.gz
binutils-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.c22
1 files changed, 17 insertions, 5 deletions
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);