# Copyright (C) 2005-2021 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 this program. If not, see . # 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" } if [istarget cris*-*-elf] { append CFLAGS_FOR_TARGET " -sim" } # Using target_compile, since it is less noisy, if { [target_compile $srcdir/$subdir/hello.c compilercheck.x \ "executable" "" ] == "" } { set has_cc 1 # Now check if we can link a program dynamically, and where # libc.so is located. If it is, we provide a sym link to the # directory (which must end in /lib) in [pwd], so /lib/ld.so.1 is # found (which must reside along libc.so). We don't bother # replacing the board ldflags like below as we don't care about # detrimental effects on the executable from the specs and # -static in the board ldflags, we just add -Bdynamic. if [regexp "(.*/lib)/libc.so" \ [target_compile $srcdir/$subdir/hello.c compilercheck.x \ "executable" \ "ldflags=-print-file-name=libc.so -Wl,-Bdynamic"] \ xxx libcsodir] { file delete lib verbose -log "Creating link to $libcsodir in [pwd]" file link lib $libcsodir } } { 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]] { set orig_ldflags "" 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) "" set opts(dynamic) "" # 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" } } if { $opt_name == "dynamic" \ && [info exists board_info([target_info name],ldflags)] } { # Weed out -static from ldflags, but keep the original in # $orig_ldflags. set orig_ldflags $board_info([target_info name],ldflags) set ldflags " $orig_ldflags " regsub -all " -static " $ldflags " " ldflags set board_info([target_info name],ldflags) $ldflags } 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 } if { $orig_ldflags != "" } { set board_info([target_info name],ldflags) $orig_ldflags } 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 return_code [lindex $result 0] set output [lindex $result 1] set status fail if { $return_code == 0 } { set status pass } 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" } }