| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- #!/bin/sh
- dir=`dirname "$0"`
- bin=$dir/../qbe
- binref=$dir/../qbe.ref
- tmp=/tmp/qbe.zzzz
- drv=$tmp.c
- asm=$tmp.s
- asmref=$tmp.ref.s
- exe=$tmp.exe
- out=$tmp.out
- init() {
- case "$TARGET" in
- arm64)
- for p in aarch64-linux-musl aarch64-linux-gnu
- do
- cc="$p-gcc -no-pie -static"
- qemu="qemu-aarch64"
- if
- $cc -v >/dev/null 2>&1 &&
- $qemu -version >/dev/null 2>&1
- then
- if sysroot=$($cc -print-sysroot) && test -n "$sysroot"
- then
- qemu="$qemu -L $sysroot"
- fi
- break
- fi
- cc=
- done
- if test -z "$cc"
- then
- echo "Cannot find arm64 compiler or qemu."
- exit 1
- fi
- bin="$bin -t arm64"
- ;;
- rv64)
- for p in riscv64-linux-musl riscv64-linux-gnu
- do
- cc="$p-gcc -no-pie -static"
- qemu="qemu-riscv64"
- if
- $cc -v >/dev/null 2>&1 &&
- $qemu -version >/dev/null 2>&1
- then
- if sysroot=$($cc -print-sysroot) && test -n "$sysroot"
- then
- qemu="$qemu -L $sysroot"
- fi
- break
- fi
- cc=
- done
- if test -z "$cc"
- then
- echo "Cannot find riscv64 compiler or qemu."
- exit 1
- fi
- bin="$bin -t rv64"
- ;;
- "")
- case `uname` in
- *Darwin*)
- cc="cc"
- ;;
- *OpenBSD*)
- cc="cc -nopie -lpthread"
- ;;
- *FreeBSD*)
- cc="cc -lpthread"
- ;;
- *)
- cc="${CC:-cc}"
- ccpost="-lpthread"
- ;;
- esac
- TARGET=`$bin -t?`
- ;;
- *)
- echo "Unknown target '$TARGET'."
- exit 1
- ;;
- esac
- }
- cleanup() {
- rm -f $drv $asm $exe $out
- }
- extract() {
- WHAT="$1"
- FILE="$2"
- awk "
- /^# >>> $WHAT/ {
- p = 1
- next
- }
- /^# <<</ {
- p = 0
- }
- p
- " $FILE \
- | sed -e 's/# //' \
- | sed -e 's/#$//'
- }
- once() {
- t="$1"
- if ! test -f $t
- then
- echo "invalid test file $t" >&2
- exit 1
- fi
- if
- sed -e 1q $t |
- grep "skip.* $TARGET\( .*\)\?$" \
- >/dev/null
- then
- return 0
- fi
- printf "%-45s" "$(basename $t)..."
- if ! $bin -o $asm $t
- then
- echo "[qbe fail]"
- return 1
- fi
- if test -x $binref
- then
- $binref -o $asmref $t 2>/dev/null
- fi
- extract driver $t > $drv
- extract output $t > $out
- if test -s $drv
- then
- src="$drv $asm"
- else
- src="$asm"
- fi
- if ! $cc -g -o $exe $src $ccpost
- then
- echo "[cc fail]"
- return 1
- fi
- if test -s $out
- then
- $qemu $exe a b c | diff -u - $out
- ret=$?
- reason="output"
- else
- $qemu $exe a b c
- ret=$?
- reason="returned $ret"
- fi
- if test $ret -ne 0
- then
- echo "[$reason fail]"
- return 1
- fi
- echo "[ok]"
- if test -f $asmref && ! cmp -s $asm $asmref
- then
- loc0=`wc -l $asm | cut -d' ' -f1`
- loc1=`wc -l $asmref | cut -d' ' -f1`
- printf " asm diff: %+d\n" $(($loc0 - $loc1))
- return 0
- fi
- }
- #trap cleanup TERM QUIT
- init
- if test -z "$1"
- then
- echo "usage: tools/test.sh {all, SSAFILE}" 2>&1
- exit 1
- fi
- case "$1" in
- "all")
- fail=0
- count=0
- for t in $dir/../test/[!_]*.ssa
- do
- once $t
- fail=`expr $fail + $?`
- count=`expr $count + 1`
- done
- if test $fail -ge 1
- then
- echo
- echo "$fail of $count tests failed!"
- else
- echo
- echo "All is fine!"
- fi
- exit $fail
- ;;
- *)
- once $1
- exit $?
- ;;
- esac
|