1# Copyright (C) 2005, 2007 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 testing syscall sequences.
17
18if ![istarget cris*-*-*] {
19    return
20}
21
22set CFLAGS_FOR_TARGET "-O2"
23if [istarget cris-*-*] {
24    set mach "crisv10"
25} {
26    set mach "crisv32"
27}
28
29# Using target_compile, since it is less noisy,
30if { [target_compile $srcdir/$subdir/hello.c compilercheck.x \
31	  "executable" "" ] == "" } {
32    set has_cc 1
33} {
34    verbose -log "Can't execute C compiler"
35    set has_cc 0
36}
37
38# Like istarget, except take a list of targets as a string.
39proc anytarget { targets } {
40    set targetlist [split $targets]
41    set argc [llength $targetlist]
42    for { set i 0 } { $i < $argc } { incr i } {
43	if [istarget [lindex $targetlist $i]] {
44	    return 1
45	}
46    }
47    return 0
48}
49
50foreach src [lsort [glob -nocomplain $srcdir/$subdir/*.c]] {
51    if ![runtest_file_p $runtests $src] {
52	continue
53    }
54    set testname "[file tail $src]"
55
56    set opt_array [slurp_options $src]
57    if { $opt_array == -1 } {
58	unresolved $testname
59	return
60    }
61
62    # And again, to simplify specifying tests.
63    if ![runtest_file_p $runtests $src] {
64	continue
65    }
66
67    # Note absence of CC in results, but don't make a big fuss over it.
68    if { $has_cc == 0 } {
69	untested $testname
70	continue
71    }
72
73    # Clear default options
74    set opts(cc) ""
75    set opts(sim) ""
76    set opts(output) ""
77    set opts(progoptions) ""
78    set opts(timeout) ""
79    set opts(mach) ""
80    set opts(xerror) "no"
81    set opts(dest) "$testname.x"
82    set opts(simenv) ""
83    set opts(kfail) ""
84    set opts(xfail) ""
85    set opts(target) ""
86    set opts(notarget) ""
87
88    # Clear any machine specific options specified in a previous test case
89    if [info exists opts(sim,$mach)] {
90	unset opts(sim,$mach)
91    }
92
93    foreach i $opt_array {
94	set opt_name [lindex $i 0]
95	set opt_machs [lindex $i 1]
96	set opt_val [lindex $i 2]
97	if ![info exists opts($opt_name)] {
98	    perror "unknown option $opt_name in file $src"
99	    unresolved $testname
100	    return
101	}
102
103	# Replace specific substitutions:
104	# @exedir@ is where the test-program is located.
105	regsub -all "@exedir@" $opt_val "[pwd]" opt_val
106	# @srcdir@ is where the source of the test-program is located.
107	regsub -all "@srcdir@" $opt_val "$srcdir/$subdir" opt_val
108
109	# Multiple of these options concatenate, they don't override.
110	if { $opt_name == "output" || $opt_name == "progoptions" } {
111	    set opt_val "$opts($opt_name)$opt_val"
112	}
113
114	# Similar with "xfail", "kfail", "target" and "notarget", but
115	# arguments are space-separated.
116	if { $opt_name == "xfail" || $opt_name == "kfail" \
117		 || $opt_name == "target"  || $opt_name == "notarget" } {
118	    if { $opts($opt_name) != "" } {
119		set opt_val "$opts($opt_name) $opt_val"
120	    }
121	}
122
123	foreach m $opt_machs {
124	    set opts($opt_name,$m) $opt_val
125	}
126	if { "$opt_machs" == "" } {
127	    set opts($opt_name) $opt_val
128	}
129    }
130
131    if { $opts(output) == "" } {
132	if { "$opts(xerror)" == "no" } {
133	    set opts(output) "pass\n"
134	} else {
135	    set opts(output) "fail\n"
136	}
137    }
138
139    if { $opts(target) != "" && ![anytarget $opts(target)] } {
140	continue
141    }
142
143    if { $opts(notarget) != "" && [anytarget $opts(notarget)] } {
144	continue
145    }
146
147    # If no machine specific options, default to the general version.
148    if ![info exists opts(sim,$mach)] {
149	set opts(sim,$mach) $opts(sim)
150    }
151
152    # Change \n sequences to newline chars.
153    regsub -all "\\\\n" $opts(output) "\n" opts(output)
154
155    verbose -log "Compiling $src with $opts(cc)"
156
157    set dest "$opts(dest)"
158    if { [sim_compile $src $dest "executable" "$opts(cc)" ] != "" } {
159	unresolved $testname
160	continue
161    }
162
163    verbose -log "Simulating $src with $opts(sim,$mach)"
164
165    # Time to setup xfailures and kfailures.
166    if { "$opts(xfail)" != "" } {
167	verbose -log "xfail: $opts(xfail)"
168	# Using eval to make $opts(xfail) appear as individual
169	# arguments.
170	eval setup_xfail $opts(xfail)
171    }
172    if { "$opts(kfail)" != "" } {
173	verbose -log "kfail: $opts(kfail)"
174	eval setup_kfail $opts(kfail)
175    }
176
177    set result [sim_run $dest "$opts(sim,$mach)" "$opts(progoptions)" \
178	"" "$opts(simenv)"]
179    set status [lindex $result 0]
180    set output [lindex $result 1]
181
182    if { "$status" == "pass" } {
183	if { "$opts(xerror)" == "no" } {
184	    if [string match $opts(output) $output] {
185		pass "$mach $testname"
186	    } else {
187		verbose -log "output:  $output" 3
188		verbose -log "pattern: $opts(output)" 3
189		fail "$mach $testname (execution)"
190	    }
191	} else {
192	    verbose -log "`pass' return code when expecting failure" 3
193	    fail "$mach $testname (execution)"
194	}
195    } elseif { "$status" == "fail" } {
196	if { "$opts(xerror)" == "no" } {
197	    fail "$mach $testname (execution)"
198	} else {
199	    if [string match $opts(output) $output] {
200		pass "$mach $testname"
201	    } else {
202		verbose -log "output:  $output" 3
203		verbose -log "pattern: $opts(output)" 3
204		fail "$mach $testname (execution)"
205	    }
206	}
207    } else {
208	$status "$mach $testname"
209    }
210}
211