summary refs log tree commit diff
path: root/tools/test.sh
diff options
context:
space:
mode:
Diffstat (limited to 'tools/test.sh')
-rwxr-xr-xtools/test.sh168
1 files changed, 168 insertions, 0 deletions
diff --git a/tools/test.sh b/tools/test.sh
new file mode 100755
index 0000000..5430ccd
--- /dev/null
+++ b/tools/test.sh
@@ -0,0 +1,168 @@
+#!/bin/sh
+
+dir=`cd $(dirname "$0"); pwd`
+bin=$dir/../obj/qbe
+
+tmp=/tmp/qbe.zzzz
+
+drv=$tmp.c
+asm=$tmp.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
+			qemu="qemu-aarch64 -L /usr/$p"
+			if
+				$cc -v >/dev/null 2>&1 &&
+				$qemu -version >/dev/null 2>&1 &&
+				test -d /usr/$p
+			then
+				break
+			fi
+			cc=
+		done
+		if test -z "$cc"
+		then
+			echo "Cannot find arm64 compiler or qemu."
+			exit 1
+		fi
+                bin="$bin -t arm64"
+		;;
+	"")
+		case `uname` in
+		*OpenBSD*)
+			cc="cc -nopie"
+			;;
+		*)
+			cc="cc"
+			;;
+		esac
+		;;
+	*)
+		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
+
+	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
+	then
+		echo "[cc fail]"
+		return 1
+	fi
+
+	if test -s $out
+	then
+		$qemu $exe a b c | diff - $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]"
+}
+
+#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
+	for t in $dir/../test/[!_]*.ssa
+	do
+		once $t
+		fail=`expr $fail + $?`
+	done
+	if test $fail -ge 1
+	then
+		echo
+		echo "$fail test(s) failed!"
+	else
+		echo
+		echo "All is fine!"
+	fi
+	exit $fail
+	;;
+*)
+	once $1
+	exit $?
+	;;
+esac