1 # Copyright (C) 2006-2024 Free Software Foundation, Inc. 2 # 3 # This program is free software; you can redistribute it and/or modify 4 # it under the terms of the GNU General Public License as published by 5 # the Free Software Foundation; either version 3 of the License, or 6 # (at your option) any later version. 7 # 8 # This program is distributed in the hope that it will be useful, 9 # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 # GNU General Public License for more details. 12 # 13 # You should have received a copy of the GNU General Public License 14 # along with this program. If not, see <http://www.gnu.org/licenses/>. 15 16 # Miscellaneous CRIS simulator testcases in assembly code, testing 17 # dv-rv.c and dv-cris.c functions. 18 19 sim_init 20 21 # Check whether dv-rv and dv-cris are present. 22 23 proc sim_has_rv_and_cris {} { 24 global srcdir 25 global subdir 26 global objdir 27 global sim_path 28 global SIMFLAGS_FOR_TARGET 29 30 if ![file exists $sim_path] { 31 return 0 32 } 33 34 # We need to assemble and link a trivial program and pass that, in 35 # order to test successful exit. 36 37 # A bit of duplication here for the assembling and linking part; 38 # what we want to do it to run the simulator without affecting the 39 # PASS/FAIL counters, and we can use e.g. run_sim_test for that. 40 41 if ![info exists SIMFLAGS_FOR_TARGET] { 42 set SIMFLAGS_FOR_TARGET "" 43 } 44 45 set comp_output [target_assemble $srcdir/$subdir/quit.s $objdir/quit.o \ 46 "-I$srcdir/$subdir"] 47 48 if ![string match "" $comp_output] { 49 verbose -log "$comp_output" 3 50 fail "rv sim test setup (assembling)" 51 return 0 52 } 53 54 set comp_output [target_link $objdir/quit.o $objdir/quit.x ""] 55 56 if ![string match "" $comp_output] { 57 verbose -log "$comp_output" 3 58 fail "rv sim test setup (linking)" 59 return 0 60 } 61 62 set result \ 63 [sim_run $objdir/quit.x \ 64 "$SIMFLAGS_FOR_TARGET --hw-device rv --hw-device cris --hw-info" \ 65 "" "" ""] 66 set return_code [lindex $result 0] 67 set output [lindex $result 1] 68 69 if { $return_code == 0 } { 70 return 1 71 } 72 73 return 0 74 } 75 76 # Similar to slurp_options, but lines are fixed format "^#r ..." (not 77 # "^#{ws}*r:{ws}+" to avoid intruding on slurp_options syntax). Only 78 # trailing whitespace of the "..." is trimmed. Beware that lines 79 # including parameters may not contain ":". 80 81 proc slurp_rv { file } { 82 global subdir srcdir 83 if [catch { set f [open $file r] } x] { 84 #perror "couldn't open `$file': $x" 85 perror "$x" 86 return -1 87 } 88 set rv_array {} 89 # whitespace expression 90 set ws {[ ]*} 91 # whitespace is ignored at the end of a line. 92 set pat "^#r (.*)$ws\$" 93 # Allow arbitrary lines until the first option is seen. 94 set seen_opt 0 95 while { [gets $f line] != -1 } { 96 set line [string trim $line] 97 # Whitespace here is space-tab. 98 if [regexp $pat $line xxx cmd] { 99 # match! 100 set cmd [string map [list \ 101 {$pwd} [pwd] \ 102 {$srcdir} "$srcdir" \ 103 {$subdir} "$subdir" \ 104 ] "$cmd"] 105 lappend rv_array $cmd 106 set seen_opt 1 107 } else { 108 if { $seen_opt } { 109 break 110 } 111 } 112 } 113 close $f 114 return $rv_array 115 } 116 117 # The main test loop. 118 119 if [istarget *] { 120 global ASFLAGS_FOR_TARGET 121 global LDFLAGS_FOR_TARGET 122 global SIMFLAGS_FOR_TARGET 123 set has_rv_and_cris [sim_has_rv_and_cris] 124 125 global builddir 126 set rvdummy "$builddir/cris/rvdummy" 127 128 # All machines we test and the corresponding assembler option. 129 # We'll only ever test v10 and higher here. 130 131 set combos {{"crisv10" "--march=v10 --no-mul-bug-abort"} 132 {"crisv32" "--march=v32"}} 133 134 # We need to pass different assembler flags for each machine. 135 # Specifying it here rather than adding a specifier to each and every 136 # test-file is preferrable. 137 138 foreach combo $combos { 139 set mach [lindex $combo 0] 140 set ASFLAGS_FOR_TARGET "[lindex $combo 1]" 141 142 # The .ms suffix is for "miscellaneous .s". 143 foreach src [lsort [glob -nocomplain $srcdir/$subdir/*.ms]] { 144 145 # If we're only testing specific files and this isn't one of them, 146 # skip it. 147 if ![runtest_file_p $runtests $src] { 148 continue 149 } 150 151 # Whoever runs the test should be alerted that not all 152 # testcases have been checked; that's why we do the loop 153 # and don't just return at the top. 154 if !$has_rv_and_cris { 155 untested $src 156 continue 157 } 158 159 # Unfortunately this seems like the only way to pass 160 # additional sim, ld etc. options to run_sim_test. 161 set SIMFLAGS_FOR_TARGET "--hw-file $srcdir/$subdir/std.dev" 162 set LDFLAGS_FOR_TARGET "--section-start=.text=0" 163 164 # We parse options an extra time besides in run_sim_test, 165 # to determine if our defaults should be overridden. 166 167 set opt_array [slurp_options $src] 168 foreach i $opt_array { 169 set opt_name [lindex $i 0] 170 set opt_machs [lindex $i 1] 171 set opt_val [lindex $i 2] 172 173 # Allow concatenating to the default options by 174 # specifying a mach. 175 if { $opt_name == "sim" && $opt_machs == "" } { 176 set SIMFLAGS_FOR_TARGET "" 177 } 178 } 179 180 set rvdummy_id -1 181 set hostcmds [slurp_rv $src] 182 183 if { $hostcmds != "" } { 184 # I guess we could ask to have rvdummy executed on a 185 # remote host, but it looks like too much trouble for 186 # a feature rarely used. 187 if [is_remote host] { 188 untested $src 189 continue 190 } 191 192 set src_components [file split $src] 193 set rvfile "[lindex $src_components \ 194 [expr [llength $src_components] - 1]].r" 195 196 if [catch { set f [open $rvfile w] } x] { 197 error "$x" 198 } { 199 set contents [join $hostcmds "\n"] 200 verbose "rv: $contents" 2 201 puts $f $contents 202 close $f 203 } 204 205 spawn -noecho $rvdummy "$rvfile" 206 if { $spawn_id < 0 } { 207 error "Couldn't spawn $rvdummy" 208 continue 209 } 210 set rvdummy_id $spawn_id 211 } 212 213 run_sim_test $src $mach 214 215 # Stop the rvdummy, if it's still running. We need to 216 # wait on it anyway to avoid it turning into a zombie. 217 if { $rvdummy_id != -1 } { 218 close -i $rvdummy_id 219 wait -i $rvdummy_id 220 221 # Gleaned from framework.exp, this seems an indicator 222 # to whether the test had expected outcome. If so, we 223 # want to remove the rv-file. 224 if { $exit_status == 0 } { 225 file delete $rvfile 226 } 227 } 228 } 229 } 230 } 231