#   Copyright (C) 1997, 1999, 2000, 2003, 2004, 2005, 2007, 2008, 2009, 2010
#   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 3 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 GCC; see the file COPYING3.  If not see
# <http://www.gnu.org/licenses/>.

# DejaGnu's dg-test defines extra flags that are used to compile a test.
# Access them for directives that need to examine all options that are
# used for a test, including checks for non-cached effective targets.
# We don't know how far up the call chain it is but we know we'll hit
# it eventually, and that we're at least 3 calls down.

proc current_compiler_flags { } {
    set frames 2
    while { ![info exists flags1] } {
	set frames [expr $frames + 1]
	upvar $frames dg-extra-tool-flags flags1
    }
    upvar $frames tool_flags flags2
    return "$flags1 $flags2"
}

# 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 overriding weak symbols, skip this
# test.

proc dg-require-weak-override { args } {
    set weak_override_available [ check_weak_override_available ]
    if { $weak_override_available == -1 } {
	upvar name name
	unresolved "$name"
    }
    if { $weak_override_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"]
    }
}

# 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.
# Only apply this if the optional selector matches.

proc dg-require-effective-target { args } {
    set args [lreplace $args 0 0]
    # Verify the number of arguments.  The last is optional.
    if { [llength $args] < 1 || [llength $args] > 2 } {
	error "syntax error, need a single effective-target keyword with optional selector"
    }
    
    # Evaluate selector if present.
    if { [llength $args] == 2 } {
	switch [dg-process-target [lindex $args 1]] {
	    "S" { }
	    "N" { return }
	}
    }

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

# If the host is remote rather than the same as the build system, skip
# this test.  Some tests are incompatible with DejaGnu's handling of
# remote hosts, which involves copying the source file to the host and
# compiling it with a relative path and "-o a.out".

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

# Add any target-specific flags needed for accessing the given list
# of features.  This must come after all dg-options.

proc dg-add-options { args } {
    upvar dg-extra-tool-flags extra-tool-flags

    foreach arg [lrange $args 1 end] {
	if { [info procs add_options_for_$arg] != "" } {
	    set extra-tool-flags \
		[eval [list add_options_for_$arg ${extra-tool-flags}]]
	} else {
	    error "Unrecognized option type: $arg"
	}
    }
}

# 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

    # 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 [current_compiler_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 next two arguments are optional.  If they were not specified,
    # use the defaults.
    if { [llength $args] == 2 } {
	lappend $args [list "*"]
    }
    if { [llength $args] == 3 } {
	lappend $args [list ""]
    }

    # If the option strings are the defaults, or the same as the
    # defaults, there is no need to call check_conditional_xfail to
    # compare them to the actual options.
    if { [string compare [lindex $args 2] "*"] == 0
	 && [string compare [lindex $args 3] "" ] == 0 } {
	set result 1    
    } else {
	# 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 } {
    # Verify the number of arguments.  The last two are optional.
    set args [lreplace $args 0 0]
    if { [llength $args] < 2 || [llength $args] > 4 } {
	error "dg-skip-if 2: need 2, 3, or 4 arguments"
    }

    # 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 selector [list target [lindex $args 1]]
    if { [dg-process-target $selector] == "S" } {
	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 } {
    # Verify the number of arguments.  The last three are optional.
    set args [lreplace $args 0 0]
    if { [llength $args] < 2 || [llength $args] > 4 } {
	error "dg-xfail-if: need 2, 3, or 4 arguments"
    }

    # 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 selector [list target [lindex $args 1]]
    if { [dg-process-target $selector] == "S" } {
	global compiler_conditional_xfail_data

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

	# Supply default values for unspecified optional arguments.
	if { [llength $args] == 2 } {
	    lappend $args [list "*"]
	}
	if { [llength $args] == 3 } {
	    lappend $args [list ""]
	}

	set compiler_conditional_xfail_data $args
    }
}

# Like dg-xfail-if but for the execute step.

proc dg-xfail-run-if { args } {
    # Verify the number of arguments.  The last two are optional.
    set args [lreplace $args 0 0]
    if { [llength $args] < 2 || [llength $args] > 4 } {
	error "dg-xfail-run-if: need 2, 3, or 4 arguments"
    }

    # 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 selector [list target [lindex $args 1]]
    if { [dg-process-target $selector] == "S" } {
	if [check-flags $args] {
	    upvar dg-do-what dg-do-what
            set dg-do-what [list [lindex ${dg-do-what} 0] "S" "F"]
	}
    }
}

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