This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

nesting .irp/.irpc/.rept


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: binutils-mainline-nested-repeat.patch
Description: Text document


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]