#   Copyright (C) 1997, 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

# If this target does not support weak symbols, skip this test.

proc dg-require-weak { args } {
    set weak_available [ check_weak_available ]
    if { $weak_available == -1 } {
	upvar name name
	unresolved "$name"
    }
    if { $weak_available != 1 } {
	upvar dg-do-what dg-do-what
	set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
    }
}

# If this target does not support the "visibility" attribute, skip this
# test.

proc dg-require-visibility { args } {
    set visibility_available [ check_visibility_available [lindex $args 1 ] ]
    if { $visibility_available == -1 } {
	upvar name name
	unresolved "$name"
    }
    if { $visibility_available != 1 } {
	upvar dg-do-what dg-do-what
	set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
    }
}

# If this target does not support the "alias" attribute, skip this
# test.

proc dg-require-alias { args } {
    set alias_available [ check_alias_available ]
    if { $alias_available == -1 } {
	upvar name name
	unresolved "$name"
    }
    if { $alias_available < 2 } {
	upvar dg-do-what dg-do-what
	set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
    }
}

# If this target's linker does not support the --gc-sections flag,
# skip this test.

proc dg-require-gc-sections { args } {
    if { ![ check_gc_sections_available ] } {
	upvar dg-do-what dg-do-what
	set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
    }
}

# If this target does not support profiling, skip this test.

proc dg-require-profiling { args } {
    if { ![ check_profiling_available ${args} ] } {
	upvar dg-do-what dg-do-what
	set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
    }
}

# LLVM LOCAL begin
# Skip tests that use the -fdump options; llvm doesn't have these
# and never will.

proc dg-require-fdump { args } {
    if { [ is_llvm ] } {
	upvar dg-do-what dg-do-what
	set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
    }
}    

# Skip tests that assume padding holes in a struct have
# deterministic values.
proc dg-require-holes-deterministic { args } {
    if { [ is_llvm ] } {
	upvar dg-do-what dg-do-what
	set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
    }
}    

# Skip tests that use stabs; llvm doesn't currently support these.
proc dg-require-stabs { args } {
    if { [ is_llvm ] } {
	upvar dg-do-what dg-do-what
	set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
    }
}    

# LLVM LOCAL end

# If this target does not support DLL attributes skip this test.

proc dg-require-dll { args } {
    global target_triplet
    # As a special case, the mcore-*-elf supports these attributes.
    # All Symbian OS targets also support these attributes.
    if { [string match "mcore-*-elf" $target_triplet]
         || [string match "*-*-symbianelf" $target_triplet]} {
	return
    }
    # PE/COFF targets support dllimport/dllexport.
    if { [gcc_target_object_format] == "pe" } {
	return
    }

    upvar dg-do-what dg-do-what
    set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
}

proc dg-require-iconv { args } {
    if { ![ check_iconv_available ${args} ] } {
	upvar dg-do-what dg-do-what
        set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
    }
}

# If this target does not support named sections skip this test.

proc dg-require-named-sections { args } {
    if { ![ check_named_sections_available ] } {
	upvar dg-do-what dg-do-what
        set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
    }
}

# If the target does not match the required effective target, skip this test.

proc dg-require-effective-target { args } {
    set args [lreplace $args 0 0]
    if { ![is-effective-target [lindex $args 0]] } {
	upvar dg-do-what dg-do-what
        set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
    }
}

# If this target does not have fork, skip this test.

proc dg-require-fork { args } {
    if { ![check_fork_available] } {
	upvar dg-do-what dg-do-what
        set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
    }
}

# If this target does not have mkfifo, skip this test.

proc dg-require-mkfifo { args } {
    if { ![check_mkfifo_available] } {
	upvar dg-do-what dg-do-what
        set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
    }
}

# If this target does not use __cxa_atexit, skip this test.

proc dg-require-cxa-atexit { args } {
    if { ![ check_cxa_atexit_available ] } {
        upvar dg-do-what dg-do-what
        set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
    }
}

# Check the flags with which the test will be run against options in
# a test directive that will skip or xfail that test.  The DejaGnu proc
# check_conditional_xfail will look at the options in compiler_flags, so
# set that up for this test based on flags we know about.

proc check_test_flags { args } {
    global compiler_flags
    upvar 2 dg-extra-tool-flags extra_tool_flags

    # Pull the args out of the enclosing list.
    set args [lindex $args 0]

    # Start the list with a dummy tool name so the list will match "*"
    # if there are no flags.
    set compiler_flags " toolname "
    append compiler_flags $extra_tool_flags
    set dest [target_info name]
    if [board_info $dest exists multilib_flags] {
	append compiler_flags "[board_info $dest multilib_flags] "
    }

    set answer [check_conditional_xfail $args]

    # Any value in this variable originally was left over from an earlier test.
    set compiler_flags ""

    verbose "check_test_flags: $args $answer" 2
    return $answer
}

# Compare flags for a test directive against flags that will be used to
# compile the test: multilib flags, flags for torture options, and either
# the default flags for this group of tests or flags specified with a
# previous dg-options directive.

proc check-flags { args } {
    global compiler_flags
    global TOOL_OPTIONS
    # These variables are from DejaGnu's dg-test.
    upvar dg-extra-tool-flags extra_tool_flags
    upvar tool_flags tool_flags

    # The args are within another list; pull them out.
    set args [lindex $args 0]

    # Start the list with a dummy tool name so the list will match "*"
    # if there are no flags.
    set compiler_flags " toolname "
    append compiler_flags $extra_tool_flags
    append compiler_flags $tool_flags
    # If running a subset of the test suite, $TOOL_OPTIONS may not exist.
    catch {append compiler_flags " $TOOL_OPTIONS "}
    set dest [target_info name]
    if [board_info $dest exists multilib_flags] {
	append compiler_flags "[board_info $dest multilib_flags] "
    }

    # The target list might be an effective-target keyword, so replace
    # the original list with "*-*-*", since we already know it matches.
    set result [check_conditional_xfail [lreplace $args 1 1 "*-*-*"]]

    # Any value in this variable was left over from an earlier test.
    set compiler_flags ""

    return $result
}

# Skip the test (report it as UNSUPPORTED) if the target list and
# included flags are matched and the excluded flags are not matched.
#
# The first argument is the line number of the dg-skip-if directive
# within the test file.   Remaining arguments are as for xfail lists:
# message { targets } { include } { exclude }
#
# This tests against multilib flags plus either the default flags for this
# group of tests or flags specified with a previous dg-options command.

proc dg-skip-if { args } {
    # Don't bother if we're already skipping the test.
    upvar dg-do-what dg-do-what
    if { [lindex ${dg-do-what} 1] == "N" } {
      return
    }

    set args [lreplace $args 0 0]

    set selector [list target [lindex $args 1]]
    if { [dg-process-target $selector] == "S" } {
	# These are defined in DejaGnu's dg-test, needed by check-flags.
	upvar dg-extra-tool-flags dg-extra-tool-flags
	upvar tool_flags tool_flags

	if [check-flags $args] {
	    upvar dg-do-what dg-do-what
            set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
	}
    }
}

# Like check_conditional_xfail, but callable from a dg test.

proc dg-xfail-if { args } {
    # Don't change anything if we're already skipping the test.
    upvar dg-do-what dg-do-what
    if { [lindex ${dg-do-what} 1] == "N" } {
      return
    }

    set args [lreplace $args 0 0]
    set selector [list target [lindex $args 1]]
    if { [dg-process-target $selector] == "S" } {
	global compiler_conditional_xfail_data
	set compiler_conditional_xfail_data [lreplace $args 1 1 "*-*-*"]
    }
}

# Record whether the program is expected to return a nonzero status.

set shouldfail 0

proc dg-shouldfail { args } {
    # Don't bother if we're already skipping the test.
    upvar dg-do-what dg-do-what
    if { [lindex ${dg-do-what} 1] == "N" } {
      return
    }

    global shouldfail

    set args [lreplace $args 0 0]
    if { [llength $args] > 1 } {
	set selector [list target [lindex $args 1]]
	if { [dg-process-target $selector] == "S" } {
	    # The target matches, now check the flags.  These variables
	    # are defined in DejaGnu's dg-test, needed by check-flags.
	    upvar dg-extra-tool-flags dg-extra-tool-flags
	    upvar tool_flags tool_flags

	    if [check-flags $args] {
		set shouldfail 1
	    }
	}
    } else {
	set shouldfail 1
    }
}

# Intercept the call to the DejaGnu version of dg-process-target to
# support use of an effective-target keyword in place of a list of
# target triplets to xfail or skip a test.
#
# 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: `$args'" 2
	
	# Extract the 'what' keyword from the argument list.
	set selector [string trim [lindex $args 0]]
	if [regexp "^xfail " $selector] {
	    set what "xfail"
	} elseif [regexp "^target " $selector] {
	    set what "target"
	} else {
	    error "syntax error in target selector \"$selector\""
	}

	# Extract the rest of the list, which might be a keyword.
	regsub "^${what}" $selector "" rest
	set rest [string trim $rest]

	if [is-effective-target-keyword $rest] {
	    # The selector is an effective target keyword.
	    if [is-effective-target $rest] {
		return [expr { $what == "xfail" ? "F" : "S" }]
	    } else {
		return [expr { $what == "xfail" ? "P" : "N" }]
	    }
	}

	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]
    }
}
