* doc/sourcebuild.texi (Test directives): Describe selector
authorjanis <janis@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 1 Feb 2005 17:54:45 +0000 (17:54 +0000)
committerjanis <janis@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 1 Feb 2005 17:54:45 +0000 (17:54 +0000)
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

gcc/ChangeLog
gcc/doc/sourcebuild.texi
gcc/testsuite/ChangeLog
gcc/testsuite/lib/gcc-dg.exp

index 4cbeae3..9f27f20 100644 (file)
@@ -1,3 +1,8 @@
+2005-02-01  Janis Johnson  <janis187@us.ibm.com>
+
+       * doc/sourcebuild.texi (Test directives): Describe selector
+       expressions.
+
 2005-02-01  Segher Boessenkool  <segher@kernel.crashing.org>
 
        * config.gcc (powerpc64-*-linux*): Default to -m64 also for
index f6da0c9..14cdee2 100644 (file)
@@ -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} @}] @}
index 1a394f2..28334bb 100644 (file)
@@ -1,5 +1,9 @@
 2005-02-01  Janis Johnson  <janis187@us.ibm.com>
 
+       * 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.
index 9e1ea04..6e09639 100644 (file)
@@ -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]