From ca3bc58f0ac01b58c2285752be247766840b0b44 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Mon, 31 Jan 2005 14:30:34 +0000 Subject: [PATCH] gas/ 2005-01-31 Jan Beulich * macro.c (buffer_and_nest): Allow 'from' being NULL; handle anything that can end with .endr in that case. Make requiring/permitting pseudo-ops without leading dot closer to the logic in read.c serving the same purpose. (expand_irp): Don't pass a mnemonic to buffer_and_nest as it will be ignored. gas/testsuite/ 2005-01-31 Jan Beulich * gas/macros/repeat.[ds]: New. * gas/macros/macros.exp: Run new test. --- gas/ChangeLog | 9 +++++ gas/macro.c | 39 ++++++++++++++------- gas/testsuite/ChangeLog | 5 +++ gas/testsuite/gas/macros/macros.exp | 1 + gas/testsuite/gas/macros/repeat.d | 43 +++++++++++++++++++++++ gas/testsuite/gas/macros/repeat.s | 53 +++++++++++++++++++++++++++++ 6 files changed, 137 insertions(+), 13 deletions(-) create mode 100644 gas/testsuite/gas/macros/repeat.d create mode 100644 gas/testsuite/gas/macros/repeat.s diff --git a/gas/ChangeLog b/gas/ChangeLog index 01e2c04a1a2..80fa64af8cd 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,12 @@ +2005-01-31 Jan Beulich + + * macro.c (buffer_and_nest): Allow 'from' being NULL; handle anything + that can end with .endr in that case. Make requiring/permitting + pseudo-ops without leading dot closer to the logic in read.c serving + the same purpose. + (expand_irp): Don't pass a mnemonic to buffer_and_nest as it will be + ignored. + 2005-01-31 Jan Beulich * macro.c (do_formals): Adjust to no longer accept empty parameter diff --git a/gas/macro.c b/gas/macro.c index 2173d00a17c..44d2bf84c81 100644 --- a/gas/macro.c +++ b/gas/macro.c @@ -152,6 +152,7 @@ macro_mri_mode (int mri) /* Read input lines till we get to a TO string. Increase nesting depth if we get a FROM string. Put the results into sb at PTR. + FROM may be NULL (or will be ignored) if TO is "ENDR". Add a new input line to an sb using GET_LINE. Return 1 on success, 0 on unexpected EOF. */ @@ -159,23 +160,31 @@ int buffer_and_nest (const char *from, const char *to, sb *ptr, int (*get_line) (sb *)) { - int from_len = strlen (from); + int from_len; int to_len = strlen (to); int depth = 1; int line_start = ptr->len; int more = get_line (ptr); + if (to_len == 4 && strcasecmp(to, "ENDR") == 0) + { + from = NULL; + from_len = 0; + } + else + from_len = strlen (from); + while (more) { /* Try and find the first pseudo op on the line. */ int i = line_start; - if (! macro_alternate && ! macro_mri) + if (! NO_PSEUDO_DOT && ! flag_m68k_mri) { /* With normal syntax we can suck what we want till we get to the dot. With the alternate, labels have to start in - the first column, since we cant tell what's a label and + the first column, since we can't tell what's a label and whats a pseudoop. */ /* Skip leading whitespace. */ @@ -200,12 +209,22 @@ buffer_and_nest (const char *from, const char *to, sb *ptr, i++; if (i < ptr->len && (ptr->ptr[i] == '.' - || macro_alternate + || NO_PSEUDO_DOT || macro_mri)) { - if (ptr->ptr[i] == '.') + if (! flag_m68k_mri && ptr->ptr[i] == '.') i++; - if (strncasecmp (ptr->ptr + i, from, from_len) == 0 + if (from == NULL + && strncasecmp (ptr->ptr + i, "IRPC", from_len = 4) != 0 + && strncasecmp (ptr->ptr + i, "IRP", from_len = 3) != 0 + && strncasecmp (ptr->ptr + i, "IREPC", from_len = 5) != 0 + && strncasecmp (ptr->ptr + i, "IREP", from_len = 4) != 0 + && strncasecmp (ptr->ptr + i, "REPT", from_len = 4) != 0 + && strncasecmp (ptr->ptr + i, "REP", from_len = 3) != 0) + from_len = 0; + if ((from != NULL + ? strncasecmp (ptr->ptr + i, from, from_len) == 0 + : from_len > 0) && (ptr->len == (i + from_len) || ! ISALNUM (ptr->ptr[i + from_len]))) depth++; @@ -1122,21 +1141,15 @@ delete_macro (const char *name) const char * expand_irp (int irpc, int idx, sb *in, sb *out, int (*get_line) (sb *)) { - const char *mn; sb sub; formal_entry f; struct hash_control *h; const char *err; - if (irpc) - mn = "IRPC"; - else - mn = "IRP"; - idx = sb_skip_white (idx, in); sb_new (&sub); - if (! buffer_and_nest (mn, "ENDR", &sub, get_line)) + if (! buffer_and_nest (NULL, "ENDR", &sub, get_line)) return _("unexpected end of file in irp or irpc"); sb_new (&f.name); diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index aba29e04158..30c921777b0 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-01-31 Jan Beulich + + * gas/macros/repeat.[ds]: New. + * gas/macros/macros.exp: Run new test. + 2005-01-31 Jan Beulich * gas/macros/badarg.[ls]: New. diff --git a/gas/testsuite/gas/macros/macros.exp b/gas/testsuite/gas/macros/macros.exp index 100a3a3d40c..8b99de11860 100644 --- a/gas/testsuite/gas/macros/macros.exp +++ b/gas/testsuite/gas/macros/macros.exp @@ -26,6 +26,7 @@ run_dump_test test3 if { ![istarget *c54x*-*-*] && ![istarget *c4x*-*-*] } { run_dump_test irp run_dump_test rept + run_dump_test repeat } diff --git a/gas/testsuite/gas/macros/repeat.d b/gas/testsuite/gas/macros/repeat.d new file mode 100644 index 00000000000..272e441d02c --- /dev/null +++ b/gas/testsuite/gas/macros/repeat.d @@ -0,0 +1,43 @@ +#objdump: -r +#name: nested irp/irpc/rept + +.*: +file format .* + +RELOCATION RECORDS FOR .* +OFFSET[ ]+TYPE[ ]+VALUE.* +0+00[ ]+[a-zA-Z0-9_]+[ ]+irp_irp_19 +0+04[ ]+[a-zA-Z0-9_]+[ ]+irp_irp_18 +0+08[ ]+[a-zA-Z0-9_]+[ ]+irp_irp_29 +0+0c[ ]+[a-zA-Z0-9_]+[ ]+irp_irp_28 +0+10[ ]+[a-zA-Z0-9_]+[ ]+irp_irpc_19 +0+14[ ]+[a-zA-Z0-9_]+[ ]+irp_irpc_18 +0+18[ ]+[a-zA-Z0-9_]+[ ]+irp_irpc_29 +0+1c[ ]+[a-zA-Z0-9_]+[ ]+irp_irpc_28 +0+20[ ]+[a-zA-Z0-9_]+[ ]+irp_rept_1 +0+24[ ]+[a-zA-Z0-9_]+[ ]+irp_rept_1 +0+28[ ]+[a-zA-Z0-9_]+[ ]+irp_rept_2 +0+2c[ ]+[a-zA-Z0-9_]+[ ]+irp_rept_2 +0+30[ ]+[a-zA-Z0-9_]+[ ]+irpc_irp_19 +0+34[ ]+[a-zA-Z0-9_]+[ ]+irpc_irp_18 +0+38[ ]+[a-zA-Z0-9_]+[ ]+irpc_irp_29 +0+3c[ ]+[a-zA-Z0-9_]+[ ]+irpc_irp_28 +0+40[ ]+[a-zA-Z0-9_]+[ ]+irpc_irpc_19 +0+44[ ]+[a-zA-Z0-9_]+[ ]+irpc_irpc_18 +0+48[ ]+[a-zA-Z0-9_]+[ ]+irpc_irpc_29 +0+4c[ ]+[a-zA-Z0-9_]+[ ]+irpc_irpc_28 +0+50[ ]+[a-zA-Z0-9_]+[ ]+irpc_rept_1 +0+54[ ]+[a-zA-Z0-9_]+[ ]+irpc_rept_1 +0+58[ ]+[a-zA-Z0-9_]+[ ]+irpc_rept_2 +0+5c[ ]+[a-zA-Z0-9_]+[ ]+irpc_rept_2 +0+60[ ]+[a-zA-Z0-9_]+[ ]+rept_irp_9 +0+64[ ]+[a-zA-Z0-9_]+[ ]+rept_irp_8 +0+68[ ]+[a-zA-Z0-9_]+[ ]+rept_irp_9 +0+6c[ ]+[a-zA-Z0-9_]+[ ]+rept_irp_8 +0+70[ ]+[a-zA-Z0-9_]+[ ]+rept_irpc_9 +0+74[ ]+[a-zA-Z0-9_]+[ ]+rept_irpc_8 +0+78[ ]+[a-zA-Z0-9_]+[ ]+rept_irpc_9 +0+7c[ ]+[a-zA-Z0-9_]+[ ]+rept_irpc_8 +0+80[ ]+[a-zA-Z0-9_]+[ ]+rept_rept +0+84[ ]+[a-zA-Z0-9_]+[ ]+rept_rept +0+88[ ]+[a-zA-Z0-9_]+[ ]+rept_rept +0+8c[ ]+[a-zA-Z0-9_]+[ ]+rept_rept diff --git a/gas/testsuite/gas/macros/repeat.s b/gas/testsuite/gas/macros/repeat.s new file mode 100644 index 00000000000..70329f720c1 --- /dev/null +++ b/gas/testsuite/gas/macros/repeat.s @@ -0,0 +1,53 @@ + .irp param1,1,2 + .irp param2,9,8 + .long irp_irp_\param1\param2 + .endr + .endr + + .irp param1,1,2 + .irpc param2,98 + .long irp_irpc_\param1\param2 + .endr + .endr + + .irp param1,1,2 + .rept 2 + .long irp_rept_\param1 + .endr + .endr + + .irpc param1,12 + .irp param2,9,8 + .long irpc_irp_\param1\param2 + .endr + .endr + + .irpc param1,12 + .irpc param2,98 + .long irpc_irpc_\param1\param2 + .endr + .endr + + .irpc param1,12 + .rept 2 + .long irpc_rept_\param1 + .endr + .endr + + .rept 2 + .irp param2,9,8 + .long rept_irp_\param2 + .endr + .endr + + .rept 2 + .irpc param2,98 + .long rept_irpc_\param2 + .endr + .endr + + .rept 2 + .rept 2 + .long rept_rept + .endr + .endr -- 2.30.2