public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
From: Jan Beulich <jbeulich@suse.com>
To: Binutils <binutils@sourceware.org>
Subject: [PATCH 1/2] gas: adjust handling of quotes for .irpc
Date: Tue, 21 May 2024 07:54:03 +0200	[thread overview]
Message-ID: <87f925c4-573c-40ae-bf47-4d07415e73c7@suse.com> (raw)
In-Reply-To: <2d6b6832-f385-41ad-8bf5-e2b7dba581c8@suse.com>

The present handling of inner double quotes can lead to very strange
diagnostics. Follow one of the two possible interpretations of the doc:
@dots{} referring to possibly multiple white space separated
@var{values}, each of which may be quoted. The original implementation,
prior to 465e5617233f ("PR gas/3856"), hints at the other possible
interpretation: When quoted there's only a single @var{values}, with
inner quotes taken as ordinary characters. That, however, seems overall
less useful to me.

While touching the documentation, mirror the (inverse) spelling
correction (@section line inconsistent with actual description) to .irp
as well.
---
The other interpretation of the doc would also require adjustments:
in_quotes then would need to be left alone when encountering inner
quotes.

If quotes need to be possible to specify in a @var{values}, I think they
ought to be backslash-escaped, much like elsewhere when quoted entities
come into play. Adding support for that ought to be a separate change,
though.

--- a/gas/doc/as.texi
+++ b/gas/doc/as.texi
@@ -5859,7 +5859,7 @@ processing must also be performed upon t
 @end ifset
 
 @node Irp
-@section @code{.irp @var{symbol},@var{values}}@dots{}
+@section @code{.irp @var{symbol},@var{value}}@dots{}
 
 @cindex @code{irp} directive
 Evaluate a sequence of statements assigning different values to @var{symbol}.
@@ -5893,12 +5893,13 @@ For some caveats with the spelling of @v
 
 @cindex @code{irpc} directive
 Evaluate a sequence of statements assigning different values to @var{symbol}.
-The sequence of statements starts at the @code{.irpc} directive, and is
-terminated by an @code{.endr} directive.  For each character in @var{value},
-@var{symbol} is set to the character, and the sequence of statements is
-assembled.  If no @var{value} is listed, the sequence of statements is
-assembled once, with @var{symbol} set to the null string.  To refer to
-@var{symbol} within the sequence of statements, use @var{\symbol}.
+The sequence of statements starts at the line following the @code{.irpc}
+directive, and is terminated by an @code{.endr} directive.  For each character
+in each (possibly double quoted) @var{values}, @var{symbol} is set to the
+character, and the sequence of statements is assembled.  If no @var{values} is
+listed, the sequence of statements is assembled once, with @var{symbol} set to
+the null string.  To refer to @var{symbol} within the sequence of statements,
+use @var{\symbol}.
 
 For example, assembling
 
--- a/gas/macro.c
+++ b/gas/macro.c
@@ -1369,12 +1369,6 @@ expand_irp (int irpc, size_t idx, sb *in
     {
       bool in_quotes = false;
 
-      if (irpc && in->ptr[idx] == '"')
-	{
-	  in_quotes = true;
-	  ++idx;
-	}
-
       while (idx < in->len)
 	{
 	  if (!irpc)
@@ -1383,16 +1377,14 @@ expand_irp (int irpc, size_t idx, sb *in
 	    {
 	      if (in->ptr[idx] == '"')
 		{
-		  size_t nxt;
-
-		  if (irpc)
-		    in_quotes = ! in_quotes;
+		  in_quotes = ! in_quotes;
+		  ++idx;
 
-		  nxt = sb_skip_white (idx + 1, in);
-		  if (nxt >= in->len)
+		  if (! in_quotes)
 		    {
-		      idx = nxt;
-		      break;
+		      idx = sb_skip_white (idx, in);
+		      if (idx >= in->len)
+			break;
 		    }
 		}
 	      sb_reset (&f.actual);
--- /dev/null
+++ b/gas/testsuite/gas/macros/irpc-quote.l
@@ -0,0 +1,18 @@
+# This should match the output of gas irpc-quote.s.
+#...
+> <
+>a<
+>b<
+>c<
+>d<
+> <
+>e<
+>f<
+>1<
+>2<
+> <
+>3<
+>4<
+>5<
+>6<
+> <
--- /dev/null
+++ b/gas/testsuite/gas/macros/irpc-quote.s
@@ -0,0 +1,6 @@
+	.irpc c, " ab" cd " ef"
+	.print ">\c<"
+	.endr
+	.irpc c, "12 " 34 "56 "
+	.print ">\c<"
+	.endr
--- a/gas/testsuite/gas/macros/macros.exp
+++ b/gas/testsuite/gas/macros/macros.exp
@@ -109,3 +109,5 @@ run_list_test count
 # 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


  reply	other threads:[~2024-05-21  5:54 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-05-21  5:52 [PATCH 0/2] gas: .irp/.irpc handling Jan Beulich
2024-05-21  5:54 ` Jan Beulich [this message]
2024-05-21  5:54 ` [PATCH 2/2] gas: extend \+ support to .irp / .irpc Jan Beulich

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87f925c4-573c-40ae-bf47-4d07415e73c7@suse.com \
    --to=jbeulich@suse.com \
    --cc=binutils@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).