From: janis Date: Tue, 1 Feb 2005 17:54:45 +0000 (+0000) Subject: * doc/sourcebuild.texi (Test directives): Describe selector X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=95793430ec74af9429183919fc629f4eca66f096 * doc/sourcebuild.texi (Test directives): Describe selector expressions. * lib/gcc-dg.exp (selector_opd, selector_list, selector_expression): New procs. (dg-process-target (local override)): Handle selector expressions. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@94551 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4cbeae3269a..9f27f20124a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2005-02-01 Janis Johnson + + * doc/sourcebuild.texi (Test directives): Describe selector + expressions. + 2005-02-01 Segher Boessenkool * config.gcc (powerpc64-*-linux*): Default to -m64 also for diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi index f6da0c910f4..14cdee2e4d6 100644 --- a/gcc/doc/sourcebuild.texi +++ b/gcc/doc/sourcebuild.texi @@ -919,17 +919,26 @@ DejaGnu directives, which know nothing about the GCC directives, so the DejaGnu directives must precede GCC directives. Several test directives include selectors which are usually preceded by -the keyword @code{target} or @code{xfail}. A selector is one or -more target triplets, possibly including wildcard characters, or else a -single effective-target keyword. Depending on the context, the selector -specifies whether a test is skipped and reported as unsupported or is -expected to fail. Use @samp{*-*-*} to match any target. - +the keyword @code{target} or @code{xfail}. A selector is: one or more +target triplets, possibly including wildcard characters; a single +effective-target keyword; or a logical expression. Depending on the +context, the selector specifies whether a test is skipped and reported +as unsupported or is expected to fail. Use @samp{*-*-*} to match any +target. Effective-target keywords are defined in @file{target-supports.exp} in -the GCC testsuite or, in the case of unusual effective targets that are -used only for a limited number of tests, in @file{.exp} files in the -same directory as the tests. There is no mechanism to combine or negate -effective-target keywords. +the GCC testsuite. + +A selector expression appears within curly braces and uses a single +logical operator: one of @option{!}, @option{&&}, or @option{||}. 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: + +@smallexample +@{ target @{ ! "hppa*-*-* ia64*-*-*" @} @} +@{ target @{ powerpc*-*-* && lp64 @} @} +@{ xfail @{ lp64 || vect_no_align @} @} +@end smallexample @table @code @item @{ dg-do @var{do-what-keyword} [@{ target/xfail @var{selector} @}] @} diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1a394f2fef1..28334bbaa1d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,9 @@ 2005-02-01 Janis Johnson + * lib/gcc-dg.exp (selector_opd, selector_list, selector_expression): + New procs. + (dg-process-target (local override)): Handle selector expressions. + * gcc.test-framework/README: Describe tests in source directory. * gcc.test-framework/test-framework.awk: Handle dg- tests. * gcc.test-framework/test-framework.exp: Handle dg- tests. diff --git a/gcc/testsuite/lib/gcc-dg.exp b/gcc/testsuite/lib/gcc-dg.exp index 9e1ea04c88f..6e09639b1cf 100644 --- a/gcc/testsuite/lib/gcc-dg.exp +++ b/gcc/testsuite/lib/gcc-dg.exp @@ -522,17 +522,74 @@ if { [info procs saved-dg-test] == [list] } { # selector is one of: # xfail target-triplet-1 ... # xfail effective-target-keyword +# xfail selector-expression # target target-triplet-1 ... # target effective-target-keyword +# target selector-expression # # For a target list the result is "S" if the target is selected, "N" otherwise. # For an xfail list the result is "F" if the target is affected, "P" otherwise. +# +# A selector expression appears within curly braces and uses a single logical +# operator: !, &&, or ||. An operand is another selector expression, an +# effective-target keyword, or a list of target triplets within quotes or +# curly braces. if { [info procs saved-dg-process-target] == [list] } { rename dg-process-target saved-dg-process-target + # Evaluate an operand within a selector expression. + proc selector_opd { op } { + set selector "target" + lappend selector $op + set answer [ expr { [dg-process-target $selector] == "S" } ] + verbose "selector_opd: `$op' $answer" 2 + return $answer + } + + # Evaluate a target triplet list within a selector expression. + # Unlike other operands, this needs to be expanded from a list to + # the same string as "target". + proc selector_list { op } { + set selector "target [join $op]" + set answer [ expr { [dg-process-target $selector] == "S" } ] + verbose "selector_list: `$op' $answer" 2 + return $answer + } + + # Evaluate a selector expression. + proc selector_expression { exp } { + if { [llength $exp] == 2 } { + if [string match "!" [lindex $exp 0]] { + set op1 [lindex $exp 1] + set answer [expr { ! [selector_opd $op1] }] + } else { + # Assume it's a list of target triplets. + set answer [selector_list $exp] + } + } elseif { [llength $exp] == 3 } { + set op1 [lindex $exp 0] + set opr [lindex $exp 1] + set op2 [lindex $exp 2] + if [string match "&&" $opr] { + set answer [expr { [selector_opd $op1] && [selector_opd $op2] }] + } elseif [string match "||" $opr] { + set answer [expr { [selector_opd $op1] || [selector_opd $op2] }] + } else { + # Assume it's a list of target triplets. + set answer [selector_list $exp] + } + } else { + # Assume it's a list of target triplets. + set answer [selector_list $exp] + } + + verbose "selector_expression: `$exp' $answer" 2 + return $answer + } + proc dg-process-target { args } { - verbose "replacement dg-process-target" 2 + verbose "replacement dg-process-target: `$args'" 2 # Extract the 'what' keyword from the argument list. set selector [string trim [lindex $args 0]] @@ -557,6 +614,14 @@ if { [info procs saved-dg-process-target] == [list] } { } } + if [string match "{*}" $rest] { + if [selector_expression [lindex $rest 0]] { + return [expr { $what == "xfail" ? "F" : "S" }] + } else { + return [expr { $what == "xfail" ? "P" : "N" }] + } + } + # The selector is not an effective-target keyword, so process # the list of target triplets. return [saved-dg-process-target $selector]