# Copyright (C) 2006, 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 this program. If not, see . # Miscellaneous CRIS simulator testcases in assembly code, testing # dv-rv.c and dv-cris.c functions. # Check whether dv-rv and dv-cris are present. proc sim_has_rv_and_cris {} { global srcdir global subdir global SIMFLAGS global global_as_options global global_ld_options global global_sim_options # We need to assemble and link a trivial program and pass that, in # order to test successful exit. # A bit of duplication here for the assembling and linking part; # what we want to do it to run the simulator without affecting the # PASS/FAIL counters, and we can use e.g. run_sim_test for that. if ![info exists global_as_options] { set global_as_options "" } if ![info exists global_ld_options] { set global_ld_options "" } if ![info exists global_sim_options] { set global_sim_options "" } set comp_output [target_assemble $srcdir/$subdir/quit.s quit.o \ "-I$srcdir/$subdir $global_as_options"] if ![string match "" $comp_output] { verbose -log "$comp_output" 3 fail "rv sim test setup (assembling)" return 0 } set comp_output [target_link quit.o quit.x "$global_ld_options"] if ![string match "" $comp_output] { verbose -log "$comp_output" 3 fail "rv sim test setup (linking)" return 0 } set result \ [sim_run quit.x \ "$global_sim_options --hw-device rv --hw-device cris --hw-info" \ "" "" ""] set return_code [lindex $result 0] set output [lindex $result 1] if { "$return_code" == "pass" } { return 1 } return 0 } # Similar to slurp_options, but lines are fixed format "^#r ..." (not # "^#{ws}*r:{ws}+" to avoid intruding on slurp_options syntax). Only # trailing whitespace of the "..." is trimmed. Beware that lines # including parameters may not contain ":". proc slurp_rv { file } { if [catch { set f [open $file r] } x] { #perror "couldn't open `$file': $x" perror "$x" return -1 } set rv_array {} # whitespace expression set ws {[ ]*} # whitespace is ignored at the end of a line. set pat "^#r (.*)$ws\$" # Allow arbitrary lines until the first option is seen. set seen_opt 0 while { [gets $f line] != -1 } { set line [string trim $line] # Whitespace here is space-tab. if [regexp $pat $line xxx cmd] { # match! lappend rv_array $cmd set seen_opt 1 } else { if { $seen_opt } { break } } } close $f return $rv_array } # The main test loop. if [istarget cris*-*-*] { global ASFLAGS_FOR_TARGET set has_rv_and_cris [sim_has_rv_and_cris] global global_as_options global global_ld_options global global_sim_options set saved_global_sim_options $global_sim_options set saved_global_ld_options $global_ld_options set rvdummy "[file dirname [board_info target sim]]/rvdummy" # All machines we test and the corresponding assembler option. # We'll only ever test v10 and higher here. set combos {{"crisv10" "--march=v10 --no-mul-bug-abort"} {"crisv32" "--march=v32"}} # We need to pass different assembler flags for each machine. # Specifying it here rather than adding a specifier to each and every # test-file is preferrable. foreach combo $combos { set mach [lindex $combo 0] set ASFLAGS_FOR_TARGET "[lindex $combo 1]" # The .ms suffix is for "miscellaneous .s". foreach src [lsort [glob -nocomplain $srcdir/$subdir/*.ms]] { # If we're only testing specific files and this isn't one of them, # skip it. if ![runtest_file_p $runtests $src] { continue } # Whoever runs the test should be alerted that not all # testcases have been checked; that's why we do the loop # and don't just return at the top. if !$has_rv_and_cris { untested $src continue } set sim_defaults "--hw-file $srcdir/$subdir/std.dev" set ld_defaults "--section-start=.text=0" # We parse options an extra time besides in run_sim_test, # to determine if our defaults should be overridden. set opt_array [slurp_options $src] foreach i $opt_array { set opt_name [lindex $i 0] set opt_machs [lindex $i 1] set opt_val [lindex $i 2] # Allow concatenating to the default options by # specifying a mach. if { $opt_name == "sim" && $opt_machs == "" } { set sim_defaults "" } if { $opt_name == "ld" && $opt_machs == "" } { set ld_defaults "" } } set rvdummy_id -1 set hostcmds [slurp_rv $src] if { $hostcmds != "" } { # I guess we could ask to have rvdummy executed on a # remote host, but it looks like too much trouble for # a feature rarely used. if [is_remote host] { untested $src continue } set src_components [file split $src] set rvfile "[lindex $src_components \ [expr [llength $src_components] - 1]].r" if [catch { set f [open $rvfile w] } x] { error "$x" } { set contents [join $hostcmds "\n"] # Make it possible to use files from the test # source directory; expected with the @-command. regsub -all "@srcdir@" $contents "$srcdir/$subdir" contents verbose "rv: $contents" 2 puts $f $contents close $f } spawn -noecho $rvdummy "$rvfile" if { $spawn_id < 0 } { error "Couldn't spawn $rvdummy" continue } set rvdummy_id $spawn_id } # Unfortunately this seems like the only way to pass # additional sim, ld etc. options to run_sim_test. set global_sim_options "$saved_global_sim_options $sim_defaults" set global_ld_options "$saved_global_ld_options $ld_defaults" run_sim_test $src $mach set global_sim_options $saved_global_sim_options set global_ld_options $saved_global_ld_options # Stop the rvdummy, if it's still running. We need to # wait on it anyway to avoid it turning into a zombie. if { $rvdummy_id != -1 } { close -i $rvdummy_id wait -i $rvdummy_id # Gleaned from framework.exp, this seems an indicator # to whether the test had expected outcome. If so, we # want to remove the rv-file. if { $exit_status == 0 } { file delete $rvfile } } } } }