aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gas/ChangeLog18
-rw-r--r--gas/config/tc-rx.c2
-rw-r--r--gas/config/tc-tic54x.c2
-rw-r--r--gas/doc/as.texinfo3
-rw-r--r--gas/read.c22
-rw-r--r--gas/read.h4
-rw-r--r--gas/testsuite/gas/macros/end.l1
-rw-r--r--gas/testsuite/gas/macros/end.s3
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 <nickc@redhat.com>
+
+ 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 <palmer@dabbelt.com>
* 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
+