gas: fold do_repeat{,_with_expander}()
authorJan Beulich <jbeulich@suse.com>
Wed, 18 May 2022 07:37:34 +0000 (09:37 +0200)
committerJan Beulich <jbeulich@suse.com>
Wed, 18 May 2022 07:37:34 +0000 (09:37 +0200)
do_repeat_with_expander() already deals with the "no expander" case
quite fine, so there's really little point having two functions. What it
lacks compared with do_repeat() is a call to sb_build(), which can
simply be moved (and the then redundant sb_new() be avoided). Along with
this moving also flip if the main if()'s condition such that the "no
expander" case is handled first.

gas/config/tc-rx.c
gas/config/tc-tic54x.c
gas/read.c
gas/read.h

index 451df6bc2f1d465bd7a383626ca5a47b90238880..ea747956855099e499deed3797e6c041607d4dec 100644 (file)
@@ -566,7 +566,7 @@ rx_rept (int ignore ATTRIBUTE_UNUSED)
 {
   size_t count = get_absolute_expression ();
 
-  do_repeat_with_expander (count, "MREPEAT", "ENDR", "..MACREP");
+  do_repeat (count, "MREPEAT", "ENDR", "..MACREP");
 }
 
 /* Like cons() accept that strings are allowed.  */
index dc8cc1d8cbff6e354c142d40581f1a1c3ac5aa23..ebefcf1c83c2f6324beb70526c3cfb39e3a35f12 100644 (file)
@@ -2034,7 +2034,7 @@ tic54x_loop (int count)
   if (!is_end_of_line[(unsigned char) *input_line_pointer])
     count = get_absolute_expression ();
 
-  do_repeat ((size_t) count, "LOOP", "ENDLOOP");
+  do_repeat ((size_t) count, "LOOP", "ENDLOOP", NULL);
 }
 
 /* Normally, endloop gets eaten by the preceding loop.  */
index 71bb664ada46e97c59c0ee2e9b8733f440984a0a..9870a0492b832adb48322c09afe8f16fb3189622 100644 (file)
@@ -3094,14 +3094,17 @@ s_rept (int ignore ATTRIBUTE_UNUSED)
 
   count = (size_t) get_absolute_expression ();
 
-  do_repeat (count, "REPT", "ENDR");
+  do_repeat (count, "REPT", "ENDR", NULL);
 }
 
 /* This function provides a generic repeat block implementation.   It allows
-   different directives to be used as the start/end keys.  */
+   different directives to be used as the start/end keys.  Any text matching
+   the optional EXPANDER in the block is replaced by the remaining iteration
+   count.  */
 
 void
-do_repeat (size_t count, const char *start, const char *end)
+do_repeat (size_t count, const char *start, const char *end,
+          const char *expander)
 {
   sb one;
   sb many;
@@ -3119,46 +3122,16 @@ do_repeat (size_t count, const char *start, const char *end)
       return;
     }
 
-  sb_build (&many, count * one.len);
-  while (count-- > 0)
-    sb_add_sb (&many, &one);
-
-  sb_kill (&one);
-
-  input_scrub_include_sb (&many, input_line_pointer, expanding_repeat);
-  sb_kill (&many);
-  buffer_limit = input_scrub_next_buffer (&input_line_pointer);
-}
-
-/* Like do_repeat except that any text matching EXPANDER in the
-   block is replaced by the iteration count.  */
-
-void
-do_repeat_with_expander (size_t count,
-                        const char * start,
-                        const char * end,
-                        const char * expander)
-{
-  sb one;
-  sb many;
-
-  if (((ssize_t) count) < 0)
+  if (expander == NULL || strstr (one.ptr, expander) == NULL)
     {
-      as_bad (_("negative count for %s - ignored"), start);
-      count = 0;
+      sb_build (&many, count * one.len);
+      while (count-- > 0)
+       sb_add_sb (&many, &one);
     }
-
-  sb_new (&one);
-  if (!buffer_and_nest (start, end, &one, get_non_macro_line_sb))
+  else
     {
-      as_bad (_("%s without %s"), start, end);
-      return;
-    }
+      sb_new (&many);
 
-  sb_new (&many);
-
-  if (expander != NULL && strstr (one.ptr, expander) != NULL)
-    {
       while (count -- > 0)
        {
          int len;
@@ -3177,9 +3150,6 @@ do_repeat_with_expander (size_t count,
          sb_kill (& processed);
        }
     }
-  else
-    while (count-- > 0)
-      sb_add_sb (&many, &one);
 
   sb_kill (&one);
 
index 0d2e0e33df41445965977554e8900ba1b1255c0d..0fa9e7951894b3a3e67df4fd9e94d270d3ecfa74 100644 (file)
@@ -148,8 +148,7 @@ 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 (size_t, const char *, const char *);
-extern void do_repeat_with_expander (size_t, const char *, const char *, const char *);
+extern void do_repeat (size_t, const char *, const char *, const char *);
 extern void end_repeat (int);
 extern void do_parse_cons_expression (expressionS *, int);