* nesting .irp/.irpc/.rept
@ 2005-01-26 16:32 Jan Beulich
2005-01-31 11:25 ` Nick Clifton
0 siblings, 1 reply; 2+ messages in thread
From: Jan Beulich @ 2005-01-26 16:32 UTC (permalink / raw)
To: binutils
[-- Attachment #1: Type: text/plain, Size: 6840 bytes --]
Nesting .irp, .irpc, or .rept within one another wasn't possible; only
nesting identical directives was accepted.
Built and tested natively on i686-pc-linux-gnu and as cross tools for
a
large number of targets.
Jan
gas/
2005-01-26 Jan Beulich <jbeulich@novell.com>
* 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-26 Jan Beulich <jbeulich@novell.com>
* gas/macros/repeat.[ds]: New.
* gas/macros/macros.exp: Run new test.
---
/home/jbeulich/src/binutils/mainline/2005-01-25.13.54/gas/macro.c 2004-10-08
08:52:54.000000000 +0200
+++ 2005-01-25.13.54/gas/macro.c 2005-01-26 08:40:29.169097584
+0100
@@ -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
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++;
@@ -1101,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);
---
/home/jbeulich/src/binutils/mainline/2005-01-25.13.54/gas/testsuite/gas/macros/macros.exp 2004-11-18
15:05:44.000000000 +0100
+++
2005-01-25.13.54/gas/testsuite/gas/macros/macros.exp 2005-01-26
08:40:29.172097128 +0100
@@ -13,6 +13,7 @@ run_dump_test test3
if { ![istarget *c54x*-*-*] && ![istarget *c4x*-*-*] } {
run_dump_test irp
run_dump_test rept
+ run_dump_test repeat
}
---
/home/jbeulich/src/binutils/mainline/2005-01-25.13.54/gas/testsuite/gas/macros/repeat.d 1970-01-01
01:00:00.000000000 +0100
+++ 2005-01-25.13.54/gas/testsuite/gas/macros/repeat.d 2005-01-25
11:14:11.000000000 +0100
@@ -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
---
/home/jbeulich/src/binutils/mainline/2005-01-25.13.54/gas/testsuite/gas/macros/repeat.s 1970-01-01
01:00:00.000000000 +0100
+++ 2005-01-25.13.54/gas/testsuite/gas/macros/repeat.s 2005-01-25
11:11:47.000000000 +0100
@@ -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
[-- Attachment #2: binutils-mainline-nested-repeat.patch --]
[-- Type: text/plain, Size: 6839 bytes --]
Nesting .irp, .irpc, or .rept within one another wasn't possible; only
nesting identical directives was accepted.
Built and tested natively on i686-pc-linux-gnu and as cross tools for a
large number of targets.
Jan
gas/
2005-01-26 Jan Beulich <jbeulich@novell.com>
* 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-26 Jan Beulich <jbeulich@novell.com>
* gas/macros/repeat.[ds]: New.
* gas/macros/macros.exp: Run new test.
--- /home/jbeulich/src/binutils/mainline/2005-01-25.13.54/gas/macro.c 2004-10-08 08:52:54.000000000 +0200
+++ 2005-01-25.13.54/gas/macro.c 2005-01-26 08:40:29.169097584 +0100
@@ -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
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++;
@@ -1101,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);
--- /home/jbeulich/src/binutils/mainline/2005-01-25.13.54/gas/testsuite/gas/macros/macros.exp 2004-11-18 15:05:44.000000000 +0100
+++ 2005-01-25.13.54/gas/testsuite/gas/macros/macros.exp 2005-01-26 08:40:29.172097128 +0100
@@ -13,6 +13,7 @@ run_dump_test test3
if { ![istarget *c54x*-*-*] && ![istarget *c4x*-*-*] } {
run_dump_test irp
run_dump_test rept
+ run_dump_test repeat
}
--- /home/jbeulich/src/binutils/mainline/2005-01-25.13.54/gas/testsuite/gas/macros/repeat.d 1970-01-01 01:00:00.000000000 +0100
+++ 2005-01-25.13.54/gas/testsuite/gas/macros/repeat.d 2005-01-25 11:14:11.000000000 +0100
@@ -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
--- /home/jbeulich/src/binutils/mainline/2005-01-25.13.54/gas/testsuite/gas/macros/repeat.s 1970-01-01 01:00:00.000000000 +0100
+++ 2005-01-25.13.54/gas/testsuite/gas/macros/repeat.s 2005-01-25 11:11:47.000000000 +0100
@@ -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
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: nesting .irp/.irpc/.rept
2005-01-26 16:32 nesting .irp/.irpc/.rept Jan Beulich
@ 2005-01-31 11:25 ` Nick Clifton
0 siblings, 0 replies; 2+ messages in thread
From: Nick Clifton @ 2005-01-31 11:25 UTC (permalink / raw)
To: Jan Beulich; +Cc: binutils
Hi Jan,
> gas/
> 2005-01-26 Jan Beulich <jbeulich@novell.com>
>
> * 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-26 Jan Beulich <jbeulich@novell.com>
>
> * gas/macros/repeat.[ds]: New.
> * gas/macros/macros.exp: Run new test.
>
Approved - please apply.
Cheers
Nick
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2005-01-31 11:25 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-01-26 16:32 nesting .irp/.irpc/.rept Jan Beulich
2005-01-31 11:25 ` Nick Clifton
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).