[2/2] gas: extend \+ support to .irp / .irpc

Message ID 19f2e0aa-8f68-4d1a-8340-0fc24247984e@suse.com
State New
Headers
Series gas: .irp/.irpc handling |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_binutils_build--master-arm fail Patch failed to apply
linaro-tcwg-bot/tcwg_binutils_build--master-aarch64 fail Patch failed to apply

Commit Message

Jan Beulich May 21, 2024, 5:54 a.m. UTC
  These are effectively macro-like, without any separate macro definition.
They already support \@, so they would better also support \+. This
allows, where desired, to get away without maintaining an explicit count
variable in source code.

With this the recently introduced testcase doesn't need any xfails
anymore.
---
Perhaps .rep/.rept would benefit even more, but how to (tidily) support
the expansion there isn't quite clear to me, yet. While there is support
for some kind of expansion, that doesn't quite fit here: We can't just
strstr() for "\+", but would need to take into account earlier
backslashes as well, to properly deal with uses in e.g. nested .rept.
It's also not clear to me whether MIPS'es re-use of s_rept() should then
also do the expansion, or whether that ought to remain unchanged in
behavior.

Unlike for macros, the counter is incremented regardless of errors. I
think that's better (and macros may want switching to that, too), in
particular when conidering the effect on listings: For macros, as it
stands, there may be multiple (partial) macro expansions with the same
value, which may end up misleading.
  

Patch

--- a/gas/NEWS
+++ b/gas/NEWS
@@ -3,9 +3,10 @@ 
 * In x86 Intel syntax undue mnemonic suffixes are now warned about.  This is
   a first step towards rejecting their use where unjustified.
 
-* Assembler macros can now use the syntax \+ to access the number of times a
-  given macro has been executed.  This is similar to the already existing \@
-  syntax, except that the count is maintained on a per-macro basis.
+* Assembler macros as well as the bodies of .irp / .irpc can now use the
+  syntax \+ to access the number of times a given macro has been executed.
+  This is similar to the already existing \@ syntax, except that the count is
+  maintained on a per-macro basis.
   
 * Support the NF feature in Intel APX.
 
--- a/gas/macro.c
+++ b/gas/macro.c
@@ -798,7 +798,8 @@  sub_actual (size_t start, sb *in, sb *t,
 
 static const char *
 macro_expand_body (sb *in, sb *out, formal_entry *formals,
-		   struct htab *formal_hash, const macro_entry *macro)
+		   struct htab *formal_hash, const macro_entry *macro,
+		   unsigned int instance)
 {
   sb t;
   size_t src = 0;
@@ -854,13 +855,13 @@  macro_expand_body (sb *in, sb *out, form
 	      sprintf (buffer, "%u", macro_number);
 	      sb_add_string (out, buffer);
 	    }
-	  else if (macro && src < in->len && in->ptr[src] == '+')
+	  else if (src < in->len && in->ptr[src] == '+')
 	    {
 	      /* Sub in the current macro invocation number.  */
 
 	      char buffer[12];
 	      src++;
-	      sprintf (buffer, "%d", macro->count);
+	      sprintf (buffer, "%d", instance);
 	      sb_add_string (out, buffer);
 	    }
 	  else if (src < in->len && in->ptr[src] == '&')
@@ -1213,7 +1214,8 @@  macro_expand (size_t idx, sb *in, macro_
 	    }
 	}
 
-      err = macro_expand_body (&m->sub, out, m->formals, m->formal_hash, m);
+      err = macro_expand_body (&m->sub, out, m->formals, m->formal_hash, m,
+			       m->count);
     }
 
   /* Discard any unnamed formal arguments.  */
@@ -1363,11 +1365,12 @@  expand_irp (int irpc, size_t idx, sb *in
   if (idx >= in->len)
     {
       /* Expand once with a null string.  */
-      err = macro_expand_body (&sub, out, &f, h, 0);
+      err = macro_expand_body (&sub, out, &f, h, NULL, 0);
     }
   else
     {
       bool in_quotes = false;
+      unsigned int instance = 0;
 
       while (idx < in->len)
 	{
@@ -1392,7 +1395,8 @@  expand_irp (int irpc, size_t idx, sb *in
 	      ++idx;
 	    }
 
-	  err = macro_expand_body (&sub, out, &f, h, 0);
+	  err = macro_expand_body (&sub, out, &f, h, NULL, instance);
+	  ++instance;
 	  if (err != NULL)
 	    break;
 	  if (!irpc)
--- a/gas/testsuite/gas/macros/irp-count.d
+++ /dev/null
@@ -1,2 +0,0 @@ 
-#name: Macro counters inside IRP commands (irp-count.d)
-# Tests that \+ does not trip up IRP commands
--- a/gas/testsuite/gas/macros/irp-count.l
+++ b/gas/testsuite/gas/macros/irp-count.l
@@ -1,3 +1,7 @@ 
 #...
-\+
-\+
+a0
+a1
+b2
+x0
+x1
+y2
--- a/gas/testsuite/gas/macros/irp-count.s
+++ b/gas/testsuite/gas/macros/irp-count.s
@@ -1,7 +1,7 @@ 
-	.irp i,1
-	.print "\+"
+	.irp i,a,a,b
+	.print "\i\+"
 	.endr
 	
-	.irpc i,1
-	.print "\+"
+	.irpc i,xxy
+	.print "\i\+"
 	.endr
--- a/gas/testsuite/gas/macros/macros.exp
+++ b/gas/testsuite/gas/macros/macros.exp
@@ -103,11 +103,5 @@  gas_test_error "exit.s" "" ".exitm outsi
 
 run_list_test altmacro
 run_list_test count
-
-# The AVR, CRIS, MSP430 and Z80 targets define ONLY_STANDARD_ESCAPES,
-#  so \+ is rejected.
-# AIX targets need an extended regexp to match "\+".
-setup_xfail "avr-*-*" "cris*-*-*" "msp430-*-*" "z80-*-*" "*-*-aix*"
 run_list_test irp-count
-
 run_list_test irpc-quote