From 69cab370cf666f2e7692158ac7dffc6a65207f4a Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Fri, 24 May 2024 12:22:54 +0200 Subject: 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. --- gas/doc/as.texi | 15 ++++++++------- gas/macro.c | 20 ++++++-------------- gas/testsuite/gas/macros/irpc-quote.l | 18 ++++++++++++++++++ gas/testsuite/gas/macros/irpc-quote.s | 6 ++++++ gas/testsuite/gas/macros/macros.exp | 2 ++ 5 files changed, 40 insertions(+), 21 deletions(-) create mode 100644 gas/testsuite/gas/macros/irpc-quote.l create mode 100644 gas/testsuite/gas/macros/irpc-quote.s 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 -- cgit v1.1