diff options
author | Jan Beulich <jbeulich@suse.com> | 2022-05-18 09:37:34 +0200 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2022-05-18 09:37:34 +0200 |
commit | 7e6d6b62d8d2036a86a36b7f03862bb23506bf5c (patch) | |
tree | c262b70bb3c84231d8d2c33bdd8d9dede6c7f864 /gas | |
parent | 43fe575c32f8d63e397280aa65e5fe39d587112e (diff) | |
download | gdb-7e6d6b62d8d2036a86a36b7f03862bb23506bf5c.zip gdb-7e6d6b62d8d2036a86a36b7f03862bb23506bf5c.tar.gz gdb-7e6d6b62d8d2036a86a36b7f03862bb23506bf5c.tar.bz2 |
gas: fold do_repeat{,_with_expander}()
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.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/config/tc-rx.c | 2 | ||||
-rw-r--r-- | gas/config/tc-tic54x.c | 2 | ||||
-rw-r--r-- | gas/read.c | 54 | ||||
-rw-r--r-- | gas/read.h | 3 |
4 files changed, 15 insertions, 46 deletions
diff --git a/gas/config/tc-rx.c b/gas/config/tc-rx.c index 451df6b..ea74795 100644 --- a/gas/config/tc-rx.c +++ b/gas/config/tc-rx.c @@ -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. */ diff --git a/gas/config/tc-tic54x.c b/gas/config/tc-tic54x.c index dc8cc1d..ebefcf1 100644 --- a/gas/config/tc-tic54x.c +++ b/gas/config/tc-tic54x.c @@ -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. */ @@ -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); @@ -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); |