Hi Richard! On 2021-04-19T20:28:31+0100, Richard Sandiford via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > This patch adds target selectors of the form: > > { any-opts "opt1" ... "optn" } > { no-opts "opt1" ... "optn" } > > for skipping or xfailing tests based on compiler options.
Nice! > It only > works for dg-final selectors. Curious, what does it take to make this work generally, not just for 'dg-final'? (I shall look into that myself, if you don't know off-hand.) > The patch then uses no-opts to exclude -O0 and (sometimes) -Og from Basically, I need the same thing for 'dg-message', where a diagnostic doesn't vs. does appear depending of 'if (optimize)' (thus, simply, 'no-opts "-O0"' vs. 'any-opts "-O0"'). (My other option is to add a simple 'check_effective_target_O0' using 'check_no_compiler_messages' and some '#ifdef __OPTIMIZE__', '#error', I suppose.) Grüße Thomas > some guality.exp xfails. AFAICT (based on gcc-testresults) these > tests pass for those options for all targets. > > Tested on aarch64-linux-gnu and x86_64-linux-gnu. OK to install? > If so, OK now, or should it wait for GCC 12? > > Richard > > > gcc/ > * doc/sourcebuild.texi: Document no-opts and any-opts target > selectors. > > gcc/testsuite/ > * lib/target-supports-dg.exp (selector_expression): Handle any-opts > and no-opts. > * gcc.dg/guality/pr41353-1.c: Exclude -O0 from xfail. > * gcc.dg/guality/pr59776.c: Likewise. > * gcc.dg/guality/pr54970.c: Likewise -O0 and -Og. > --- > gcc/doc/sourcebuild.texi | 90 +++++++++++++++++++++++- > gcc/testsuite/gcc.dg/guality/pr41353-1.c | 2 +- > gcc/testsuite/gcc.dg/guality/pr54970.c | 16 ++--- > gcc/testsuite/gcc.dg/guality/pr59776.c | 4 +- > gcc/testsuite/lib/target-supports-dg.exp | 10 ++- > 5 files changed, 107 insertions(+), 15 deletions(-) > > diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi > index b0001247795..d3200a42e44 100644 > --- a/gcc/doc/sourcebuild.texi > +++ b/gcc/doc/sourcebuild.texi > @@ -1301,6 +1301,8 @@ A selector is: > @item one or more target triplets, possibly including wildcard characters; > use @samp{*-*-*} to match any target > @item a single effective-target keyword (@pxref{Effective-Target Keywords}) > +@item a list of compiler options that should be included or excluded > +(as described in more detail below) > @item a logical expression > @end itemize > > @@ -1313,14 +1315,96 @@ test to fail for targets that match @var{selector2}. > > A selector expression appears within curly braces and uses a single > logical operator: one of @samp{!}, @samp{&&}, or @samp{||}. An > -operand is another selector expression, an effective-target keyword, > -a single target triplet, or a list of target triplets within quotes or > -curly braces. For example: > +operand is one of the following: > + > +@itemize @bullet > +@item > +another selector expression, in curly braces > + > +@item > +an effective-target keyword, such as @code{lp64} > + > +@item > +a single target triplet > + > +@item > +a list of target triplets within quotes or curly braces > + > +@item > +one of the following: > + > +@table @samp > +@item @{ any-opts @var{opt1} @dots{} @var{optn} @} > +Each of @var{opt1} to @var{optn} is a space-separated list of option globs. > +The selector expression evaluates to true if, for one of these strings, > +every glob in the string matches an option that was passed to the compiler. > +For example: > + > +@smallexample > +@{ any-opts "-O3 -flto" "-O[2g]" @} > +@end smallexample > + > +is true if any of the following are true: > + > +@itemize @bullet > +@item > +@option{-O2} was passed to the compiler > + > +@item > +@option{-Og} was passed to the compiler > + > +@item > +both @option{-O3} and @option{-flto} were passed to the compiler > +@end itemize > + > +This kind of selector can only be used within @code{dg-final} directives. > +Use @code{dg-skip-if}, @code{dg-xfail-if} or @code{dg-xfail-run-if} to > +skip whole tests based on options, or to mark them as expected to fail > +with certain options. > + > +@item @{ no-opts @var{opt1} @dots{} @var{optn} @} > +As for @code{any-opts} above, each of @var{opt1} to @var{optn} is a > +space-separated list of option globs. The selector expression > +evaluates to true if, for all of these strings, there is at least > +one glob that does not match an option that was passed to the compiler. > +It is shorthand for: > + > +@smallexample > +@{ ! @{ any-opts @var{opt1} @dots{} @var{optn} @} @} > +@end smallexample > + > +For example: > + > +@smallexample > +@{ no-opts "-O3 -flto" "-O[2g]" @} > +@end smallexample > + > +is true if all of the following are true: > + > +@itemize @bullet > +@item > +@option{-O2} was not passed to the compiler > + > +@item > +@option{-Og} was not passed to the compiler > + > +@item > +at least one of @option{-O3} or @option{-flto} was not passed to the compiler > +@end itemize > + > +Like @code{any-opts}, this kind of selector can only be used within > +@code{dg-final} directives. > + > +@end table > +@end itemize > + > +Here are some examples of full target selectors: > > @smallexample > @{ target @{ ! "hppa*-*-* ia64*-*-*" @} @} > @{ target @{ powerpc*-*-* && lp64 @} @} > @{ xfail @{ lp64 || vect_no_align @} @} > +@{ xfail @{ aarch64*-*-* && @{ any-opts "-O2" @} @} @} > @end smallexample > > @node Effective-Target Keywords > diff --git a/gcc/testsuite/lib/target-supports-dg.exp > b/gcc/testsuite/lib/target-supports-dg.exp > index c014abce4f5..94ba79eb4ae 100644 > --- a/gcc/testsuite/lib/target-supports-dg.exp > +++ b/gcc/testsuite/lib/target-supports-dg.exp > @@ -570,7 +570,15 @@ if { [info procs saved-dg-process-target] == [list] } { > > # Evaluate a selector expression. > proc selector_expression { exp } { > - if { [llength $exp] == 2 } { > + if { [llength $exp] >= 2 > + && [string match "any-opts" [lindex $exp 0]] } { > + set args [list "" { *-*-* } [lrange $exp 1 end] ""] > + set answer [check_conditional_xfail $args] > + } elseif { [llength $exp] >= 2 > + && [string match "no-opts" [lindex $exp 0]] } { > + set args [list "" { *-*-* } "*" [lrange $exp 1 end]] > + set answer [check_conditional_xfail $args] > + } elseif { [llength $exp] == 2 } { > if [string match "!" [lindex $exp 0]] { > set op1 [lindex $exp 1] > set answer [expr { ! [selector_opd $op1] }] > diff --git a/gcc/testsuite/gcc.dg/guality/pr41353-1.c > b/gcc/testsuite/gcc.dg/guality/pr41353-1.c > index cd306328fda..6639a524f0f 100644 > --- a/gcc/testsuite/gcc.dg/guality/pr41353-1.c > +++ b/gcc/testsuite/gcc.dg/guality/pr41353-1.c > @@ -22,7 +22,7 @@ f2 (int i, int j) > { > j += i; > /* { dg-final { gdb-test .+4 "i" "37" } } */ > - /* { dg-final { gdb-test .+3 "j" "28 + 37" { xfail *-*-* } } } */ > + /* { dg-final { gdb-test .+3 "j" "28 + 37" { xfail { no-opts "-O0" } } } } > */ > int i1 = 2 * i; /* { dg-final { gdb-test .+2 "i1" "2 * 37" } } */ > int i2 = 3 * i; /* { dg-final { gdb-test .+1 "i2" "3 * 37" } } */ > return j; > diff --git a/gcc/testsuite/gcc.dg/guality/pr54970.c > b/gcc/testsuite/gcc.dg/guality/pr54970.c > index 2e0bc5784a9..e60cc043fc9 100644 > --- a/gcc/testsuite/gcc.dg/guality/pr54970.c > +++ b/gcc/testsuite/gcc.dg/guality/pr54970.c > @@ -8,39 +8,39 @@ > int > main () > { > - int a[] = { 1, 2, 3 }; /* { dg-final { gdb-test .+4 "a\[0\]" "1" { > xfail { *-*-* } } } } */ > + int a[] = { 1, 2, 3 }; /* { dg-final { gdb-test .+4 "a\[0\]" "1" { > xfail { no-opts "-O0" "-Og" } } } } */ > int *p = a + 2; /* { dg-final { gdb-test .+3 "a\[1\]" "2" } } */ > int *q = a + 1; /* { dg-final { gdb-test .+2 "a\[2\]" "3" } } */ > /* { dg-final { gdb-test .+1 "*p" "3" } } */ > asm volatile (NOP); /* { dg-final { gdb-test . "*q" "2" } } > */ > - *p += 10; /* { dg-final { gdb-test .+4 "a\[0\]" "1" { > xfail { *-*-* } } } } */ > + *p += 10; /* { dg-final { gdb-test .+4 "a\[0\]" "1" { > xfail { no-opts "-O0" "-Og" } } } } */ > /* { dg-final { gdb-test .+3 "a\[1\]" "2" } } */ > /* { dg-final { gdb-test .+2 "a\[2\]" "13" } } > */ > /* { dg-final { gdb-test .+1 "*p" "13" } } */ > asm volatile (NOP); /* { dg-final { gdb-test . "*q" "2" } } > */ > - *q += 10; /* { dg-final { gdb-test .+4 "a\[0\]" "1" { > xfail { *-*-* } } } } */ > + *q += 10; /* { dg-final { gdb-test .+4 "a\[0\]" "1" { > xfail { no-opts "-O0" "-Og" } } } } */ > /* { dg-final { gdb-test .+3 "a\[1\]" "12" } } > */ > /* { dg-final { gdb-test .+2 "a\[2\]" "13" } } > */ > /* { dg-final { gdb-test .+1 "*p" "13" } } */ > asm volatile (NOP); /* { dg-final { gdb-test . "*q" "12" } > } */ > __builtin_memcpy (&a, (int [3]) { 4, 5, 6 }, sizeof (a)); > - /* { dg-final { gdb-test .+4 "a\[0\]" "4" { > xfail { *-*-* } } } } */ > + /* { dg-final { gdb-test .+4 "a\[0\]" "4" { > xfail { no-opts "-O0" "-Og" } } } } */ > /* { dg-final { gdb-test .+3 "a\[1\]" "5" } } */ > /* { dg-final { gdb-test .+2 "a\[2\]" "6" } } */ > /* { dg-final { gdb-test .+1 "*p" "6" } } */ > asm volatile (NOP); /* { dg-final { gdb-test . "*q" "5" } } > */ > - *p += 20; /* { dg-final { gdb-test .+4 "a\[0\]" "4" { > xfail { *-*-* } } } } */ > + *p += 20; /* { dg-final { gdb-test .+4 "a\[0\]" "4" { > xfail { no-opts "-O0" "-Og" } } } } */ > /* { dg-final { gdb-test .+3 "a\[1\]" "5" } } */ > /* { dg-final { gdb-test .+2 "a\[2\]" "26" } } > */ > /* { dg-final { gdb-test .+1 "*p" "26" } } */ > asm volatile (NOP); /* { dg-final { gdb-test . "*q" "5" } } > */ > - *q += 20; /* { dg-final { gdb-test .+8 "a\[0\]" "4" { > xfail { *-*-* } } } } */ > + *q += 20; /* { dg-final { gdb-test .+8 "a\[0\]" "4" { > xfail { no-opts "-O0" "-Og" } } } } */ > /* { dg-final { gdb-test .+7 "a\[1\]" "25" } } > */ > /* { dg-final { gdb-test .+6 "a\[2\]" "26" } } > */ > /* { dg-final { gdb-test .+5 "*p" "26" } } */ > /* { dg-final { gdb-test .+4 "p\[-1\]" "25" } } > */ > - /* { dg-final { gdb-test .+3 "p\[-2\]" "4" { > xfail { *-*-* } } } } */ > - /* { dg-final { gdb-test .+2 "q\[-1\]" "4" { > xfail { *-*-* } } } } */ > + /* { dg-final { gdb-test .+3 "p\[-2\]" "4" { > xfail { no-opts "-O0" "-Og" } } } } */ > + /* { dg-final { gdb-test .+2 "q\[-1\]" "4" { > xfail { no-opts "-O0" "-Og" } } } } */ > /* { dg-final { gdb-test .+1 "q\[1\]" "26" } } > */ > asm volatile (NOP); /* { dg-final { gdb-test . "*q" "25" } > } */ > return 0; > diff --git a/gcc/testsuite/gcc.dg/guality/pr59776.c > b/gcc/testsuite/gcc.dg/guality/pr59776.c > index 7c95a9f9416..9777f6229de 100644 > --- a/gcc/testsuite/gcc.dg/guality/pr59776.c > +++ b/gcc/testsuite/gcc.dg/guality/pr59776.c > @@ -12,11 +12,11 @@ foo (struct S *p) > struct S s1, s2; /* { dg-final { gdb-test pr59776.c:17 > "s1.f" "5.0" } } */ > s1 = *p; /* { dg-final { gdb-test pr59776.c:17 > "s1.g" "6.0" } } */ > s2 = s1; /* { dg-final { gdb-test pr59776.c:17 > "s2.f" "0.0" } } */ > - *(int *) &s2.f = 0; /* { dg-final { gdb-test > pr59776.c:17 "s2.g" "6.0" { xfail *-*-* } } } */ > + *(int *) &s2.f = 0; /* { dg-final { gdb-test > pr59776.c:17 "s2.g" "6.0" { xfail { no-opts "-O0" } } } } */ > asm volatile (NOP : : : "memory"); /* { dg-final { gdb-test pr59776.c:20 > "s1.f" "5.0" } } */ > asm volatile (NOP : : : "memory"); /* { dg-final { gdb-test pr59776.c:20 > "s1.g" "6.0" } } */ > s2 = s1; /* { dg-final { gdb-test pr59776.c:20 > "s2.f" "5.0" } } */ > - asm volatile (NOP : : : "memory"); /* { dg-final { gdb-test pr59776.c:20 > "s2.g" "6.0" { xfail *-*-* } } } */ > + asm volatile (NOP : : : "memory"); /* { dg-final { gdb-test pr59776.c:20 > "s2.g" "6.0" { xfail { no-opts "-O0" } } } } */ > asm volatile (NOP : : : "memory"); > } > ----------------- Mentor Graphics (Deutschland) GmbH, Arnulfstrasse 201, 80634 München Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Frank Thürauf