public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* 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).