aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@suse.com>2024-05-24 12:22:54 +0200
committerJan Beulich <jbeulich@suse.com>2024-05-24 12:22:54 +0200
commit69cab370cf666f2e7692158ac7dffc6a65207f4a (patch)
tree4dd137ffc1e93812fd03210c7baf545e88f9891c
parent6b15ec516579f8005e97d58ec06b1c98debf947b (diff)
downloadgdb-69cab370cf666f2e7692158ac7dffc6a65207f4a.zip
gdb-69cab370cf666f2e7692158ac7dffc6a65207f4a.tar.gz
gdb-69cab370cf666f2e7692158ac7dffc6a65207f4a.tar.bz2
gas: adjust handling of quotes for .irpc
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.
-rw-r--r--gas/doc/as.texi15
-rw-r--r--gas/macro.c20
-rw-r--r--gas/testsuite/gas/macros/irpc-quote.l18
-rw-r--r--gas/testsuite/gas/macros/irpc-quote.s6
-rw-r--r--gas/testsuite/gas/macros/macros.exp2
5 files changed, 40 insertions, 21 deletions
diff --git a/gas/doc/as.texi b/gas/doc/as.texi
index 1fb97c4..f5a7a5e 100644
--- a/gas/doc/as.texi
+++ b/gas/doc/as.texi
@@ -5859,7 +5859,7 @@ processing must also be performed upon the symbols as well.
@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 @var{symbol}, see also @ref{Macro}.
@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
diff --git a/gas/macro.c b/gas/macro.c
index 3036e6a..077bb01 100644
--- a/gas/macro.c
+++ b/gas/macro.c
@@ -1369,12 +1369,6 @@ expand_irp (int irpc, size_t idx, sb *in, sb *out, size_t (*get_line) (sb *))
{
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, sb *out, size_t (*get_line) (sb *))
{
if (in->ptr[idx] == '"')
{
- size_t nxt;
+ in_quotes = ! in_quotes;
+ ++idx;
- if (irpc)
- in_quotes = ! in_quotes;
-
- 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);
diff --git a/gas/testsuite/gas/macros/irpc-quote.l b/gas/testsuite/gas/macros/irpc-quote.l
new file mode 100644
index 0000000..89b627e
--- /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<
+> <
diff --git a/gas/testsuite/gas/macros/irpc-quote.s b/gas/testsuite/gas/macros/irpc-quote.s
new file mode 100644
index 0000000..0499f69
--- /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
diff --git a/gas/testsuite/gas/macros/macros.exp b/gas/testsuite/gas/macros/macros.exp
index ed08e75..4934709 100644
--- 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