From: Richard Sandiford <richard.sandiford@linaro.org>
To: Tom de Vries <Tom_deVries@mentor.com>
Cc: GCC Patches <gcc-patches@gcc.gnu.org>,
Jakub Jelinek <jakub@redhat.com>,
Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>,
Mike Stump <mikestump@comcast.net>
Subject: Re: [RFC] Dejagnu patch to handle multi-line directives
Date: Mon, 12 Jun 2017 07:59:00 -0000 [thread overview]
Message-ID: <87mv9dskk4.fsf@linaro.org> (raw)
In-Reply-To: <d897d54e-5e05-b83b-973a-d1825fd8e76e@mentor.com> (Tom de Vries's message of "Sat, 10 Jun 2017 10:03:04 +0200")
Tom de Vries <Tom_deVries@mentor.com> writes:
> [ attached patch ]
>
> On 06/10/2017 09:57 AM, Tom de Vries wrote:
>> Hi,
>>
>> one thing that has bothered me on a regular basis is the inability to
>> spread long dejagnu directives over multiple lines.
>>
>> I've written a demonstrator patch (for the dejagnu sources) and tested
>> it by splitting this 108 chars line:
>> ...
>> /* { dg-additional-options "-DSTACK_SIZE=[dg-effective-target-value
>> stack_size]" { target { stack_size } } } */
>> ...
>> into:
>> ...
>> /* { dg-additional-options }
>> { dg-dc "-DSTACK_SIZE=[dg-effective-target-value stack_size]" }
>> { dg-dc { target { stack_size } } } */
>> ...
>>
>> Good idea to fix this?
>>
>> Good idea to fix this like this?
>>
>> If so, any other comments, before I suggest this at dejagnu project?
>>
>> Thanks,
>> - Tom
>>
>
> Add dg-dc support
>
> ---
> lib/dg.exp | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++----
> 1 file changed, 53 insertions(+), 4 deletions(-)
>
> diff --git a/lib/dg.exp b/lib/dg.exp
> index 7a894cb..67f46ab 100644
> --- a/lib/dg.exp
> +++ b/lib/dg.exp
> @@ -181,15 +181,64 @@ proc dg-format-linenum { linenum } {
> # we return:
> #
> # { dg-prms-id 1 1234 } { dg-build 2 fatal "some comment" }
> +#
> +# Directive dg-dc (short for dg-directive-continue) can be used for multi-line
> +# directives. This:
> +#
> +# /* { dg-x a b c } */
> +#
> +# is equivalent to:
> +#
> +# /* { dg-x } */
> +# /* { dg-dc a b } */
> +# /* { dg-dc c } */
> +#
> +# and to:
> +#
> +# /* { dg-x a } */
> +# /* { dg-dc b c} */
>
> proc dg-get-options { prog } {
> set result ""
> -
> - set tmp [grep $prog "{\[ \t\]\+dg-\[-a-z\]\+\[ \t\]\+.*\[ \t\]\+}" line]
> + set cmd_prev ""
> +
> + set grep_pattern [join {
> + "{"
> + "\[ \t\]\+"
> + "dg-\[-a-z\]\+"
> + "\[ \t\]\+"
> + "(.*\[ \t\]\+)?"
> + "}"
> + } ""]
> + set tmp [grep $prog $grep_pattern line]
> if {![string match "" $tmp]} {
> + set pattern [join {
> + "(\[0-9\]+)"
> + "\[ \t\]+"
> + "{"
> + "\[ \t\]+"
> + "(dg-\[-a-z\]+)"
> + "\[ \t\]+"
> + "((.*)\[ \t\]+)?"
> + "}"
> + "\[^\}\]*"
> + "(\n|$)"
> + } ""]
> foreach i $tmp {
> - regexp "(\[0-9\]+)\[ \t\]+{\[ \t\]+(dg-\[-a-z\]+)\[ \t\]+(.*)\[ \t\]+}\[^\}\]*(\n|$)" $i i line cmd args
> - append result " { $cmd $line $args }"
> + regexp $pattern $i dummy line cmd ws_args args
> + if { "$cmd" == "dg-dc" } {
> + set args_prev "$args_prev $args"
> + } else {
> + if { "$cmd_prev" != "" } {
> + append result " { $cmd_prev $line_prev $args_prev }"
> + }
> + set cmd_prev $cmd
> + set line_prev $line
> + set args_prev "$args"
> + }
> + }
> + if { "$cmd_prev" != "" } {
> + append result " { $cmd_prev $line_prev $args_prev }"
> }
> }
> return $result
I realise there's probably more that can go wrong with it, but how
about instead treating unbalanced { ... } as a sign that the directive
continues to the next line? This would allow:
/* { dg-additional-options
"-DSTACK_SIZE=[dg-effective-target-value stack_size]"
{ target { stack_size } } } */
To support per-line comments we probably need to drop the characters
before the start column, as in:
! { dg-additional-options
! "-DSTACK_SIZE=[dg-effective-target-value stack_size]"
! { target { stack_size } } }
Only lightly tested.
Thanks,
Richard
--- utils.exp.1 2017-06-12 08:07:34.004143966 +0100
+++ utils.exp 2017-06-12 08:54:13.609875614 +0100
@@ -161,6 +161,8 @@
# second is the pattern,
# third are any options.
# Options: line - puts line numbers of match in list
+# tcl - match trailing characters until a complete Tcl
+# script is read
#
proc grep { args } {
@@ -178,20 +180,51 @@
} else {
set options ""
}
+ set line_p [expr { [lsearch $options line] >= 0 }]
+ set tcl_p [expr { [lsearch $options tcl] >= 0 }]
set i 0
set fd [open $file r]
- while { [gets $fd cur_line]>=0 } {
+ while { $i >= 0 && [gets $fd cur_line] >= 0 } {
incr i
- if [regexp -- "$pattern" $cur_line match] {
- if ![string match "" $options] {
- foreach opt $options {
- case $opt in {
- "line" {
- lappend grep_out [concat $i $match]
+ if [regexp -indices -- "$pattern" $cur_line indices] {
+ set line $i
+ set start [lindex $indices 0]
+ set end [lindex $indices 1]
+ set match [string range $cur_line $start $end]
+ if { $tcl_p } {
+ incr end
+ while { ![info complete $match] } {
+ set next [string first "\}" $cur_line $end]
+ if { $next >= 0 } {
+ append match [string range $cur_line $end $next]
+ set end [expr $next + 1]
+ } else {
+ append match [string trimright \
+ [string range $cur_line $end end]]
+ # Expect the same number of characters of indentation.
+ # If we don't get a line that we expect, still treat
+ # this as a match (by breaking), so that it gets
+ # reported where appropriate.
+ if { [gets $fd cur_line] < 0 } {
+ break
}
+ incr i
+ if { [string length $cur_line] < $start } {
+ break
+ }
+ set cur_line [string trimleft \
+ [string range $cur_line $start end]]
+ if { [string is space $cur_line] } {
+ break
+ }
+ append match " "
+ set end 0
}
}
+ }
+ if { $line_p } {
+ lappend grep_out [concat $line $match]
} else {
lappend grep_out $match
}
--- dg.exp.1 2017-06-12 08:06:55.292935737 +0100
+++ dg.exp 2017-06-12 08:32:14.309351359 +0100
@@ -186,7 +186,7 @@
proc dg-get-options { prog } {
set result ""
- set tmp [grep $prog "{\[ \t\]\+dg-\[-a-z\]\+\[ \t\]\+.*\[ \t\]\+}" line]
+ set tmp [grep $prog "\{\[ \t\]\+dg-\[-a-z\]\+\[ \t\]" line tcl]
if ![string match "" $tmp] {
foreach i $tmp {
#send_user "Found: $i\n"
next prev parent reply other threads:[~2017-06-12 7:59 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-10 7:57 Tom de Vries
2017-06-10 8:03 ` Tom de Vries
2017-06-11 0:42 ` Segher Boessenkool
2017-06-12 7:59 ` Richard Sandiford [this message]
2017-06-12 18:54 ` Pedro Alves
2017-06-13 6:59 ` Richard Sandiford
2017-06-12 16:58 ` Mike Stump
2017-06-20 13:28 ` Rainer Orth
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=87mv9dskk4.fsf@linaro.org \
--to=richard.sandiford@linaro.org \
--cc=Tom_deVries@mentor.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=jakub@redhat.com \
--cc=mikestump@comcast.net \
--cc=ro@CeBiTec.Uni-Bielefeld.DE \
/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).