summary refs log tree commit diff
path: root/lisc/tools/abitest.sh
blob: 449ed43a5ed82c0737b7ab93949398402cba93f7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#!/bin/sh

OCAMLC=/usr/bin/ocamlc
QBE=lisc

failure() {
	echo "Failure at stage:" $1 >&2
	exit 1
}

cleanup() {
	rm -fr $TMP
}

compile() {
	cp tools/abi.ml $TMP
	pushd $TMP > /dev/null
	if ! $OCAMLC abi.ml -o gentest
	then
		popd > /dev/null
		cleanup
		failure "abifuzz compilation"
	fi
	popd > /dev/null
}

once() {
	if test -z "$1"
	then
		$TMP/gentest $TMP c ssa
	else
		$TMP/gentest -s $1 $TMP c ssa
	fi

	./$QBE -o $TMP/callee.s $TMP/callee.ssa ||
		failure "qbe"

	c99 -g -o $TMP/abitest $TMP/caller.c $TMP/callee.s ||
		failure "cc + linking"

	$TMP/abitest ||
		failure "runtime"
}

usage() {
	echo "usage: abitest.sh [-s SEED] [-n ITERATIONS]" >&2
	exit 1
}

N=1

while test -n "$1"
do
	test -n "$2" || usage
	case "$1" in
	"-s")
		S="$2"
		N=1
		;;
	"-n")
		N="$2"
		;;
	*)
		usage
		;;
	esac
	shift 2
done

TMP=`mktemp -d abifuzz.XXXXXX`

compile

if test -n "$S"
then
	once $S
else
	for n in `seq $N`
	do
		once
		echo "$n" | grep "00$"
	done
fi

echo "All done."

cleanup