2021-01-01 16:03:39 +08:00
|
|
|
# Copyright (C) 2006-2021 Free Software Foundation, Inc.
|
2006-04-03 11:05:00 +08:00
|
|
|
#
|
|
|
|
# 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
|
2007-08-24 22:30:15 +08:00
|
|
|
# the Free Software Foundation; either version 3 of the License, or
|
2006-04-03 11:05:00 +08:00
|
|
|
# (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
|
2007-08-24 22:30:15 +08:00
|
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
2006-04-03 11:05:00 +08:00
|
|
|
|
|
|
|
# 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]
|
|
|
|
|
2021-01-05 14:26:21 +08:00
|
|
|
if { $return_code == 0 } {
|
2006-04-03 11:05:00 +08:00
|
|
|
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
|
2015-12-25 18:51:46 +08:00
|
|
|
|
|
|
|
# See the logic in sim-defs.exp for more details.
|
|
|
|
set sim [board_info target sim]
|
|
|
|
if [string equal "" $sim] {
|
|
|
|
global objdir
|
2021-04-04 21:01:09 +08:00
|
|
|
set rvdummy "$objdir/cris/rvdummy"
|
2015-12-25 18:51:46 +08:00
|
|
|
} else {
|
|
|
|
set rvdummy "[file dirname [board_info target sim]]/rvdummy"
|
|
|
|
}
|
2006-04-03 11:05:00 +08:00
|
|
|
|
|
|
|
# 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
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|