arm64: try qemu-system-aarch64
[qbe.git] / tools / test.sh
blob4e7076fd0bf04117e640fe73ccc675476b6ad4c5
1 #!/bin/sh
3 dir=`cd $(dirname "$0"); pwd`
4 bin=$dir/../obj/qbe
5 binref=$dir/../obj/qbe.ref
7 tmp=/tmp/qbe.zzzz
9 drv=$tmp.c
10 asm=$tmp.s
11 asmref=$tmp.ref.s
12 exe=$tmp.exe
13 out=$tmp.out
15 testcc() {
16 echo "int main() { }" | $1 -x c -o /dev/null - >/dev/null 2>&1
17 return $?
20 init() {
21 case "$TARGET" in
22 arm64)
23 qemucmd=qemu-system-aarch64
24 if ! $qemucmd -version >/dev/null 2>&1
25 then
26 qemucmd=qemu-aarch64
28 for p in aarch64-linux-musl aarch64-linux-gnu
30 cc=$p-gcc
31 qemu="$qemucmd -L /usr/$p"
33 $cc -v >/dev/null 2>&1 &&
34 $qemu -version >/dev/null 2>&1 &&
35 test -d /usr/$p
36 then
37 break
39 cc=
40 done
41 if test -z "$cc"
42 then
43 echo "Cannot find arm64 compiler or qemu."
44 exit 1
46 bin="$bin -t arm64"
48 "")
49 case `uname` in
50 *Darwin*)
51 cc="cc -Wl,-no_pie"
53 *OpenBSD*)
54 cc="cc -nopie"
56 *FreeBSD*)
57 cc="cc"
60 cc="cc -no-pie"
61 testcc "$cc" || cc="cc"
63 esac
66 echo "Unknown target '$TARGET'."
67 exit 1
69 esac
72 cleanup() {
73 rm -f $drv $asm $exe $out
76 extract() {
77 WHAT="$1"
78 FILE="$2"
80 awk "
81 /^# >>> $WHAT/ {
82 p = 1
83 next
85 /^# <<</ {
86 p = 0
89 " $FILE \
90 | sed -e 's/# //' \
91 | sed -e 's/#$//'
94 once() {
95 t="$1"
97 if ! test -f $t
98 then
99 echo "invalid test file $t" >&2
100 exit 1
104 sed -e 1q $t |
105 grep "skip.* $TARGET\( .*\)\?$" \
106 >/dev/null
107 then
108 return 0
111 printf "%-45s" "$(basename $t)..."
113 if ! $bin -o $asm $t
114 then
115 echo "[qbe fail]"
116 return 1
119 if test -x $binref
120 then
121 $binref -o $asmref $t 2>/dev/null
124 extract driver $t > $drv
125 extract output $t > $out
127 if test -s $drv
128 then
129 src="$drv $asm"
130 else
131 src="$asm"
134 if ! $cc -g -o $exe $src
135 then
136 echo "[cc fail]"
137 return 1
140 if test -s $out
141 then
142 $qemu $exe a b c | diff - $out
143 ret=$?
144 reason="output"
145 else
146 $qemu $exe a b c
147 ret=$?
148 reason="returned $RET"
151 if test $ret -ne 0
152 then
153 echo "[$reason fail]"
154 return 1
157 echo "[ok]"
159 if test -f $asmref && ! cmp -s $asm $asmref
160 then
161 loc0=`wc -l $asm | cut -d' ' -f1`
162 loc1=`wc -l $asmref | cut -d' ' -f1`
163 printf " asm diff: %+d\n" $(($loc0 - $loc1))
164 return 0
168 #trap cleanup TERM QUIT
170 init
172 if test -z "$1"
173 then
174 echo "usage: tools/test.sh {all, SSAFILE}" 2>&1
175 exit 1
178 case "$1" in
179 "all")
180 fail=0
181 for t in $dir/../test/[!_]*.ssa
183 once $t
184 fail=`expr $fail + $?`
185 done
186 if test $fail -ge 1
187 then
188 echo
189 echo "$fail test(s) failed!"
190 else
191 echo
192 echo "All is fine!"
194 exit $fail
197 once $1
198 exit $?
200 esac