# Copyright (C) 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

# Miscellaneous CRIS simulator testcases testing syscall sequences.

if ![istarget cris*-*-*] {
    return
}

set CFLAGS_FOR_TARGET "-O2"
if [istarget cris-*-*] {
    set mach "crisv10"
} {
    set mach "crisv32"
}

# Using target_compile, since it is less noisy,
if { [target_compile $srcdir/$subdir/hello.c compilercheck.x \
	  "executable" "" ] == "" } {
    set has_cc 1
} {
    verbose -log "Can't execute C compiler"
    set has_cc 0
}

# Like istarget, except take a list of targets as a string.
proc anytarget { targets } {
    set targetlist [split $targets]
    set argc [llength $targetlist]
    for { set i 0 } { $i < $argc } { incr i } {
	if [istarget [lindex $targetlist $i]] {
	    return 1
	}
    }
    return 0
}

foreach src [lsort [glob -nocomplain $srcdir/$subdir/*.c]] {
    if ![runtest_file_p $runtests $src] {
	continue
    }
    set testname "[file tail $src]"

    set opt_array [slurp_options $src]
    if { $opt_array == -1 } {
	unresolved $testname
	return
    }

    # And again, to simplify specifying tests.
    if ![runtest_file_p $runtests $src] {
	continue
    }

    # Note absence of CC in results, but don't make a big fuss over it.
    if { $has_cc == 0 } {
	untested $testname
	continue
    }

    # Clear default options
    set opts(cc) ""
    set opts(sim) ""
    set opts(output) ""
    set opts(progoptions) ""
    set opts(timeout) ""
    set opts(mach) ""
    set opts(xerror) "no"
    set opts(dest) "$testname.x"
    set opts(simenv) ""
    set opts(kfail) ""
    set opts(xfail) ""
    set opts(target) ""
    set opts(notarget) ""

    # Clear any machine specific options specified in a previous test case
    if [info exists opts(sim,$mach)] {
	unset opts(sim,$mach)
    }

    foreach i $opt_array {
	set opt_name [lindex $i 0]
	set opt_machs [lindex $i 1]
	set opt_val [lindex $i 2]
	if ![info exists opts($opt_name)] {
	    perror "unknown option $opt_name in file $src"
	    unresolved $testname
	    return
	}

	# Replace specific substitutions:
	# @exedir@ is where the test-program is located.
	regsub -all "@exedir@" $opt_val "[pwd]" opt_val
	# @srcdir@ is where the source of the test-program is located.
	regsub -all "@srcdir@" $opt_val "$srcdir/$subdir" opt_val

	# Multiple of these options concatenate, they don't override.
	if { $opt_name == "output" || $opt_name == "progoptions" } {
	    set opt_val "$opts($opt_name)$opt_val"
	}

	# Similar with "xfail", "kfail", "target" and "notarget", but
	# arguments are space-separated.
	if { $opt_name == "xfail" || $opt_name == "kfail" \
		 || $opt_name == "target"  || $opt_name == "notarget" } {
	    if { $opts($opt_name) != "" } {
		set opt_val "$opts($opt_name) $opt_val"
	    }
	}

	foreach m $opt_machs {
	    set opts($opt_name,$m) $opt_val
	}
	if { "$opt_machs" == "" } {
	    set opts($opt_name) $opt_val
	}
    }

    if { $opts(output) == "" } {
	if { "$opts(xerror)" == "no" } {
	    set opts(output) "pass\n"
	} else {
	    set opts(output) "fail\n"
	}
    }

    if { $opts(target) != "" && ![anytarget $opts(target)] } {
	continue
    }

    if { $opts(notarget) != "" && [anytarget $opts(notarget)] } {
	continue
    }

    # If no machine specific options, default to the general version.
    if ![info exists opts(sim,$mach)] {
	set opts(sim,$mach) $opts(sim)
    }

    # Change \n sequences to newline chars.
    regsub -all "\\\\n" $opts(output) "\n" opts(output)

    verbose -log "Compiling $src with $opts(cc)"

    set dest "$opts(dest)"
    if { [sim_compile $src $dest "executable" "$opts(cc)" ] != "" } {
	unresolved $testname
	continue
    }

    verbose -log "Simulating $src with $opts(sim,$mach)"

    # Time to setup xfailures and kfailures.
    if { "$opts(xfail)" != "" } {
	verbose -log "xfail: $opts(xfail)"
	# Using eval to make $opts(xfail) appear as individual
	# arguments.
	eval setup_xfail $opts(xfail)
    }
    if { "$opts(kfail)" != "" } {
	verbose -log "kfail: $opts(kfail)"
	eval setup_kfail $opts(kfail)
    }

    set result [sim_run $dest "$opts(sim,$mach)" "$opts(progoptions)" \
	"" "$opts(simenv)"]
    set status [lindex $result 0]
    set output [lindex $result 1]

    if { "$status" == "pass" } {
	if { "$opts(xerror)" == "no" } {
	    if [string match $opts(output) $output] {
		pass "$mach $testname"
	    } else {
		verbose -log "output:  $output" 3
		verbose -log "pattern: $opts(output)" 3
		fail "$mach $testname (execution)"
	    }
	} else {
	    verbose -log "`pass' return code when expecting failure" 3
	    fail "$mach $testname (execution)"
	}
    } elseif { "$status" == "fail" } {
	if { "$opts(xerror)" == "no" } {
	    fail "$mach $testname (execution)"
	} else {
	    if [string match $opts(output) $output] {
		pass "$mach $testname"
	    } else {
		verbose -log "output:  $output" 3
		verbose -log "pattern: $opts(output)" 3
		fail "$mach $testname (execution)"
	    }
	}
    } else {
	$status "$mach $testname"
    }
}
