1# Expect script for ld-d10v tests 2# Copyright (C) 2002-2014 Free Software Foundation, Inc. 3# 4# This file is part of the GNU Binutils. 5# 6# This program is free software; you can redistribute it and/or modify 7# it under the terms of the GNU General Public License as published by 8# the Free Software Foundation; either version 3 of the License, or 9# (at your option) any later version. 10# 11# This program is distributed in the hope that it will be useful, 12# but WITHOUT ANY WARRANTY; without even the implied warranty of 13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14# GNU General Public License for more details. 15# 16# You should have received a copy of the GNU General Public License 17# along with this program; if not, write to the Free Software 18# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 19# MA 02110-1301, USA. 20# 21# Written by Tom Rix, trix@redhat.com 22# 23 24# Test d10v 25 26if ![istarget d10v-*-*] { 27 return 28} 29 30# run_link_test FILE 31# Copied from run_dump_test, with the dumping part removed. 32# 33# Assemble a .s file, then run some utility on it and check the output. 34# 35# There should be an assembly language file named FILE.s in the test 36# suite directory. `run_link_test' will assemble and link FILE.s 37# 38# The FILE.lt file begins with zero or more option lines, which specify 39# flags to pass to the assembler, the program to run to dump the 40# assembler's output, and the options it wants. The option lines have 41# the syntax: 42# 43# # OPTION: VALUE 44# 45# OPTION is the name of some option, like "name" or "ld", and 46# VALUE is OPTION's value. The valid options are described below. 47# Whitespace is ignored everywhere, except within VALUE. The option 48# list ends with the first line that doesn't match the above syntax 49# (hmm, not great for error detection). 50# 51# The interesting options are: 52# 53# name: TEST-NAME 54# The name of this test, passed to DejaGNU's `pass' and `fail' 55# commands. If omitted, this defaults to FILE, the root of the 56# .s and .d files' names. 57# 58# as: FLAGS 59# When assembling, pass FLAGS to the assembler. 60# If assembling several files, you can pass different assembler 61# options in the "source" directives. See below. 62# 63# ld: FLAGS 64# Link assembled files using FLAGS, in the order of the "source" 65# directives, when using multiple files. 66# 67# source: SOURCE [FLAGS] 68# Assemble the file SOURCE.s using the flags in the "as" directive 69# and the (optional) FLAGS. If omitted, the source defaults to 70# FILE.s. 71# This is useful if several .x files want to share a .s file. 72# More than one "source" directive can be given, which is useful 73# when testing linking. 74# 75# xfail: TARGET 76# The test is expected to fail on TARGET. This may occur more than 77# once. 78# 79# target: TARGET 80# Only run the test for TARGET. This may occur more than once; the 81# target being tested must match at least one. 82# 83# notarget: TARGET 84# Do not run the test for TARGET. This may occur more than once; 85# the target being tested must not match any of them. 86# 87# Each option may occur at most once unless otherwise mentioned. 88# 89 90proc run_link_test { name } { 91 global subdir srcdir 92 global AS LD 93 global ASFLAGS LDFLAGS 94 global host_triplet runtests 95 96 if [string match "*/*" $name] { 97 set file $name 98 set name [file tail $name] 99 } else { 100 set file "$srcdir/$subdir/$name" 101 } 102 103 if ![runtest_file_p $runtests $name] then { 104 return 105 } 106 107 set opt_array [slurp_options "${file}.lt"] 108 if { $opt_array == -1 } { 109 perror "error reading options from $file.lt" 110 unresolved $subdir/$name 111 return 112 } 113 set dumpfile tmpdir/dump.out 114 set run_ld 0 115 set opts(as) {} 116 set opts(ld) {} 117 set opts(xfail) {} 118 set opts(target) {} 119 set opts(notarget) {} 120 set opts(name) {} 121 set opts(source) {} 122 set asflags(${file}.s) {} 123 124 foreach i $opt_array { 125 set opt_name [lindex $i 0] 126 set opt_val [lindex $i 1] 127 if ![info exists opts($opt_name)] { 128 perror "unknown option $opt_name in file $file.lt" 129 unresolved $subdir/$name 130 return 131 } 132 133 switch -- $opt_name { 134 xfail {} 135 target {} 136 notarget {} 137 source { 138 # Move any source-specific as-flags to a separate array to 139 # simplify processing. 140 if { [llength $opt_val] > 1 } { 141 set asflags([lindex $opt_val 0]) [lrange $opt_val 1 end] 142 set opt_val [lindex $opt_val 0] 143 } else { 144 set asflags($opt_val) {} 145 } 146 } 147 default { 148 if [string length $opts($opt_name)] { 149 perror "option $opt_name multiply set in $file.lt" 150 unresolved $subdir/$name 151 return 152 } 153 } 154 } 155 set opts($opt_name) [concat $opts($opt_name) $opt_val] 156 } 157 158 # Decide early whether we should run the test for this target. 159 if { [llength $opts(target)] > 0 } { 160 set targmatch 0 161 foreach targ $opts(target) { 162 if [istarget $targ] { 163 set targmatch 1 164 break 165 } 166 } 167 if { $targmatch == 0 } { 168 return 169 } 170 } 171 foreach targ $opts(notarget) { 172 if [istarget $targ] { 173 return 174 } 175 } 176 177 if { $opts(name) == "" } { 178 set testname "$subdir/$name" 179 } else { 180 set testname $opts(name) 181 } 182 183 if { $opts(source) == "" } { 184 set sourcefiles [list ${file}.s] 185 } else { 186 set sourcefiles {} 187 foreach sf $opts(source) { 188 lappend sourcefiles "$srcdir/$subdir/$sf" 189 # Must have asflags indexed on source name. 190 set asflags($srcdir/$subdir/$sf) $asflags($sf) 191 } 192 } 193 194 # Time to setup xfailures. 195 foreach targ $opts(xfail) { 196 setup_xfail $targ 197 } 198 199 # Assemble each file. 200 set objfiles {} 201 for { set i 0 } { $i < [llength $sourcefiles] } { incr i } { 202 set sourcefile [lindex $sourcefiles $i] 203 204 set objfile "tmpdir/dump$i.o" 205 lappend objfiles $objfile 206 set cmd "$AS $ASFLAGS $opts(as) $asflags($sourcefile) -o $objfile $sourcefile" 207 208 send_log "$cmd\n" 209 set cmdret [catch "exec $cmd" comp_output] 210 set comp_output [prune_warnings $comp_output] 211 212 # We accept errors at assembly stage too, unless we're supposed to 213 # link something. 214 if { $cmdret != 0 || ![string match "" $comp_output] } then { 215 send_log "$comp_output\n" 216 verbose "$comp_output" 3 217 fail $testname 218 return 219 } 220 } 221 222 # Link the file(s). 223 set objfile "tmpdir/dump" 224 set cmd "$LD $LDFLAGS $opts(ld) -o $objfile $objfiles" 225 226 send_log "$cmd\n" 227 set cmdret [catch "exec $cmd" comp_output] 228 set comp_output [prune_warnings $comp_output] 229 230 if { $cmdret != 0 || ![string match "" $comp_output] } then { 231 232 send_log "$comp_output\n" 233 verbose "$comp_output" 3 234 fail $testname 235 return 236 } 237 pass $testname 238} 239 240 241set test_list [lsort [glob -nocomplain $srcdir/$subdir/*.d]] 242foreach test $test_list { 243 # We need to strip the ".d", but can leave the dirname. 244 verbose [file rootname $test] 245 run_dump_test [file rootname $test] 246} 247 248set test_list [lsort [glob -nocomplain $srcdir/$subdir/*.lt]] 249foreach test $test_list { 250 # We need to strip the ".lt", but can leave the dirname. 251 verbose [file rootname $test] 252 run_link_test [file rootname $test] 253} 254