15bb525f4SRobert Mustacchi#!/usr/bin/ksh
25bb525f4SRobert Mustacchi#
35bb525f4SRobert Mustacchi#
45bb525f4SRobert Mustacchi# This file and its contents are supplied under the terms of the
55bb525f4SRobert Mustacchi# Common Development and Distribution License ("CDDL"), version 1.0.
65bb525f4SRobert Mustacchi# You may only use this file in accordance with the terms of version
75bb525f4SRobert Mustacchi# 1.0 of the CDDL.
85bb525f4SRobert Mustacchi#
95bb525f4SRobert Mustacchi# A full copy of the text of the CDDL should have accompanied this
105bb525f4SRobert Mustacchi# source.  A copy of the CDDL is also available via the Internet at
115bb525f4SRobert Mustacchi# http://www.illumos.org/license/CDDL.
125bb525f4SRobert Mustacchi#
135bb525f4SRobert Mustacchi
145bb525f4SRobert Mustacchi#
155bb525f4SRobert Mustacchi# Copyright (c) 2019, Joyent, Inc.
165bb525f4SRobert Mustacchi#
175bb525f4SRobert Mustacchi
185bb525f4SRobert Mustacchi#
195bb525f4SRobert Mustacchi# Run all of the various CTF tests
205bb525f4SRobert Mustacchi#
215bb525f4SRobert Mustacchi
225bb525f4SRobert Mustacchiunalias -a
235bb525f4SRobert Mustacchi#set -o xtrace
245bb525f4SRobert Mustacchi
255bb525f4SRobert Mustacchiif [[ -z "$TMPDIR" ]]; then
265bb525f4SRobert Mustacchi	TMPDIR="/tmp"
275bb525f4SRobert Mustacchifi
285bb525f4SRobert Mustacchi
293eca6103SJohn Levon
305bb525f4SRobert Mustacchictf_arg0=$(basename $0)
315bb525f4SRobert Mustacchictf_root=$(cd $(dirname $0) && echo $PWD)
325bb525f4SRobert Mustacchictf_tests=
333eca6103SJohn Levonctf_cc="gcc"
343eca6103SJohn Levonctf_cxx="g++"
35*3cec9822SRobert Mustacchictf_as="gas"
365bb525f4SRobert Mustacchictf_convert="ctfconvert"
375bb525f4SRobert Mustacchictf_merge="ctfmerge"
385bb525f4SRobert Mustacchictf_debugflags="-gdwarf-2 "
395bb525f4SRobert Mustacchictf_mach32="-m32"
405bb525f4SRobert Mustacchictf_mach64="-m64"
415bb525f4SRobert Mustacchictf_temp="$TMPDIR/ctftest.$$.o"
425bb525f4SRobert Mustacchictf_makefile="Makefile.ctftest"
435bb525f4SRobert Mustacchictf_nerrs=0
44*3cec9822SRobert Mustacchictf_cc_type=
45*3cec9822SRobert Mustacchictf_cc_vers=
465bb525f4SRobert Mustacchi
475bb525f4SRobert Mustacchiusage()
485bb525f4SRobert Mustacchi{
495bb525f4SRobert Mustacchi	typeset msg="$*"
505bb525f4SRobert Mustacchi	[[ -z "$msg" ]] || echo "$msg" >&2
515bb525f4SRobert Mustacchi	cat <<USAGE >&2
523eca6103SJohn LevonUsage: $ctf_arg0 [-a as] [-c cc] [-C CC] [-g flags] [-m ctfmerge] [-t ctfconvert]
535bb525f4SRobert Mustacchi
545bb525f4SRobert Mustacchi	Runs the CTF test suite
555bb525f4SRobert Mustacchi
563eca6103SJohn Levon	-a assembler		Use the specified assembler, defaults to 'as'
573eca6103SJohn Levon	-c compiler		Use the specified C compiler, defaults to 'gcc'
583eca6103SJohn Levon	-C compiler		Use the specified C++ compiler, defaults to 'g++'
595bb525f4SRobert Mustacchi	-g flags		Use flags to generate debug info. Defaults to
605bb525f4SRobert Mustacchi				"-gdwarf-2".
615bb525f4SRobert Mustacchi	-m ctfmerge		Use the specified ctfmerge, defaults to
623eca6103SJohn Levon				'ctfmerge'
635bb525f4SRobert Mustacchi	-t ctfconvert		Use the specified ctfconvert, defaults to
643eca6103SJohn Levon				'ctfconvert'
655bb525f4SRobert MustacchiUSAGE
665bb525f4SRobert Mustacchi	exit 2
675bb525f4SRobert Mustacchi}
685bb525f4SRobert Mustacchi
695bb525f4SRobert Mustacchi
705bb525f4SRobert Mustacchitest_fail()
715bb525f4SRobert Mustacchi{
725bb525f4SRobert Mustacchi	typeset msg="$*"
735bb525f4SRobert Mustacchi	[[ -z "$msg" ]] && msg="failed"
745bb525f4SRobert Mustacchi	echo "TEST FAILED: $msg" >&2
755bb525f4SRobert Mustacchi	((ctf_nerrs++))
765bb525f4SRobert Mustacchi}
775bb525f4SRobert Mustacchi
78*3cec9822SRobert Mustacchiwarn()
79*3cec9822SRobert Mustacchi{
80*3cec9822SRobert Mustacchi	typeset msg="$*"
81*3cec9822SRobert Mustacchi	echo "$ctf_arg0: $msg" >&2
82*3cec9822SRobert Mustacchi}
83*3cec9822SRobert Mustacchi
845bb525f4SRobert Mustacchifatal()
855bb525f4SRobert Mustacchi{
865bb525f4SRobert Mustacchi	typeset msg="$*"
875bb525f4SRobert Mustacchi	[[ -z "$msg" ]] && msg="failed"
885bb525f4SRobert Mustacchi	echo "$ctf_arg0: $msg" >&2
89*3cec9822SRobert Mustacchi	rm -f "$ctf_temp"
905bb525f4SRobert Mustacchi	exit 1
915bb525f4SRobert Mustacchi}
925bb525f4SRobert Mustacchi
93*3cec9822SRobert Mustacchi#
94*3cec9822SRobert Mustacchi# Attempt to try and figure out what class and version of compiler we
95*3cec9822SRobert Mustacchi# are dealing with so we can try and skip known failures due to existing
96*3cec9822SRobert Mustacchi# bugs in the compiler.
97*3cec9822SRobert Mustacchi#
98*3cec9822SRobert Mustacchidetermine_compiler()
99*3cec9822SRobert Mustacchi{
100*3cec9822SRobert Mustacchi	typeset name=$($ctf_cc --version | awk '{ print $1; exit; }')
101*3cec9822SRobert Mustacchi	typeset version
102*3cec9822SRobert Mustacchi
103*3cec9822SRobert Mustacchi	if [[ "$name" == "gcc" ]]; then
104*3cec9822SRobert Mustacchi		version=$($ctf_cc --version | awk '{ print $NF; exit; }')
105*3cec9822SRobert Mustacchi	elif [[ "$name" == "clang" ]]; then
106*3cec9822SRobert Mustacchi		version=$($ctf_cc --version | awk '{ print $NF; exit; }')
107*3cec9822SRobert Mustacchi	else
108*3cec9822SRobert Mustacchi		warn "failed to parse compiler name from $ctf_cc, will " \
109*3cec9822SRobert Mustacchi		    "not make any assumptions about expected failures"
110*3cec9822SRobert Mustacchi		name="unknown"
111*3cec9822SRobert Mustacchi		version="unknown"
112*3cec9822SRobert Mustacchi	fi
113*3cec9822SRobert Mustacchi
114*3cec9822SRobert Mustacchi	ctf_cc_type="$name"
115*3cec9822SRobert Mustacchi	ctf_cc_version="$version"
116*3cec9822SRobert Mustacchi}
117*3cec9822SRobert Mustacchi
1185bb525f4SRobert Mustacchiannounce()
1195bb525f4SRobert Mustacchi{
1205bb525f4SRobert Mustacchi	cat << EOF
1215bb525f4SRobert MustacchiBeginning CTF tests with the following settings:
1223eca6103SJohn Levoncc:		$(which $ctf_cc)
123*3cec9822SRobert Mustacchidetected:	$ctf_cc_type $ctf_cc_version
1243eca6103SJohn LevonCC:		$(which $ctf_cxx)
1253eca6103SJohn Levonas:		$(which $ctf_as)
1263eca6103SJohn Levonctfconvert:	$(which $ctf_convert)
1273eca6103SJohn Levonctfmerge:	$(which $ctf_merge)
1285bb525f4SRobert Mustacchi32-bit CFLAGS:	$ctf_32cflags
1295bb525f4SRobert Mustacchi64-bit CFLAGS:	$ctf_64cflags
1305bb525f4SRobert Mustacchi
1315bb525f4SRobert MustacchiEOF
1325bb525f4SRobert Mustacchi}
1335bb525f4SRobert Mustacchi
1345bb525f4SRobert Mustacchirun_one()
1355bb525f4SRobert Mustacchi{
1365bb525f4SRobert Mustacchi	typeset source=$1 checker=$2 flags=$3
1375bb525f4SRobert Mustacchi
1383eca6103SJohn Levon	if ! "$ctf_cc" $flags -o "$ctf_temp" -c "$source"; then
1395bb525f4SRobert Mustacchi		test_fail "failed to compile $source with flags: $flags"
1405bb525f4SRobert Mustacchi		return
1415bb525f4SRobert Mustacchi	fi
1425bb525f4SRobert Mustacchi
1435bb525f4SRobert Mustacchi	if ! "$ctf_convert" "$ctf_temp"; then
1445bb525f4SRobert Mustacchi		test_fail "failed to convert CTF in $source"
1455bb525f4SRobert Mustacchi		return
1465bb525f4SRobert Mustacchi	fi
1475bb525f4SRobert Mustacchi
1485bb525f4SRobert Mustacchi	if ! "$checker" "$ctf_temp"; then
1495bb525f4SRobert Mustacchi		test_fail "check for $source, $checker, failed"
1505bb525f4SRobert Mustacchi		return
1515bb525f4SRobert Mustacchi	fi
1525bb525f4SRobert Mustacchi
153*3cec9822SRobert Mustacchi	rm -f "$ctf_temp"
1545bb525f4SRobert Mustacchi	echo "TEST PASSED: $source $flags"
1555bb525f4SRobert Mustacchi}
1565bb525f4SRobert Mustacchi
1575bb525f4SRobert Mustacchi#
1585bb525f4SRobert Mustacchi# Perform a more complex build. The Makefile present will drive the
1595bb525f4SRobert Mustacchi# building of the artifacts and the running of the tests based on the
1605bb525f4SRobert Mustacchi# variables that we pass to it.
1615bb525f4SRobert Mustacchi#
1625bb525f4SRobert Mustacchirun_dir()
1635bb525f4SRobert Mustacchi{
1645bb525f4SRobert Mustacchi	typeset dir outdir check32 check64 flags32 flags64
1655bb525f4SRobert Mustacchi
1665bb525f4SRobert Mustacchi	dir=$1
1675bb525f4SRobert Mustacchi	outdir="$TMPDIR/ctftest.$$-$(basename $d)"
1685bb525f4SRobert Mustacchi	check32=$2
1695bb525f4SRobert Mustacchi	flags32=$3
1705bb525f4SRobert Mustacchi	check64=$4
1715bb525f4SRobert Mustacchi	flags64=$5
1725bb525f4SRobert Mustacchi
1735bb525f4SRobert Mustacchi	if ! mkdir $outdir; then
1745bb525f4SRobert Mustacchi		fatal "failed to make temporary directory '$outdir'"
1755bb525f4SRobert Mustacchi	fi
1765bb525f4SRobert Mustacchi
1775bb525f4SRobert Mustacchi	if ! make -C $dir -f Makefile.ctftest \
1785bb525f4SRobert Mustacchi	    BUILDDIR="$outdir" \
1793eca6103SJohn Levon	    CC="$ctf_cc" \
1805bb525f4SRobert Mustacchi	    CFLAGS32="$ctf_mach32" \
1815bb525f4SRobert Mustacchi	    CFLAGS64="$ctf_mach64" \
1825bb525f4SRobert Mustacchi	    DEBUGFLAGS="$ctf_debugflags" \
1835bb525f4SRobert Mustacchi	    CTFCONVERT="$ctf_convert" \
1845bb525f4SRobert Mustacchi	    CTFMERGE="$ctf_merge" \
1855bb525f4SRobert Mustacchi	    build 1>/dev/null; then
1865bb525f4SRobert Mustacchi		rm -rf $outdir
1875bb525f4SRobert Mustacchi		test_fail "failed to build $dir"
1885bb525f4SRobert Mustacchi		return
1895bb525f4SRobert Mustacchi	fi
1905bb525f4SRobert Mustacchi
1915bb525f4SRobert Mustacchi	if ! make -C $dir -f Makefile.ctftest \
1925bb525f4SRobert Mustacchi	    BUILDDIR="$outdir" \
1935bb525f4SRobert Mustacchi	    CHECK32="$check32" \
1945bb525f4SRobert Mustacchi	    CHECK64="$check64" \
1955bb525f4SRobert Mustacchi	    run-test 1>/dev/null; then
1965bb525f4SRobert Mustacchi		rm -rf $outdir
1975bb525f4SRobert Mustacchi		test_fail "failed to run tests for $dir"
1985bb525f4SRobert Mustacchi		return
1995bb525f4SRobert Mustacchi	fi
2005bb525f4SRobert Mustacchi
2015bb525f4SRobert Mustacchi	rm -rf $outdir
2025bb525f4SRobert Mustacchi	echo "TEST PASSED: $dir (dir)"
2035bb525f4SRobert Mustacchi}
2045bb525f4SRobert Mustacchi
2055bb525f4SRobert Mustacchi#
2065bb525f4SRobert Mustacchi# Find all of the tests that exist and then try to run them all. Tests
2075bb525f4SRobert Mustacchi# may either be a single file or a directory.
2085bb525f4SRobert Mustacchi#
2095bb525f4SRobert Mustacchirun_tests()
2105bb525f4SRobert Mustacchi{
2115bb525f4SRobert Mustacchi	typeset t base check
2125bb525f4SRobert Mustacchi	ctf_tests=$(ls "$ctf_root"/*.c)
2135bb525f4SRobert Mustacchi	for t in $ctf_tests; do
2145bb525f4SRobert Mustacchi		base=$(basename "$t" .c)
2155bb525f4SRobert Mustacchi		check=$(echo "$base" | sed s/test-/check-/)
2165bb525f4SRobert Mustacchi		if [[ -f "$ctf_root/$check" ]]; then
2175bb525f4SRobert Mustacchi			run_one $t "$ctf_root/$check" "$ctf_32cflags"
2185bb525f4SRobert Mustacchi			run_one $t "$ctf_root/$check" "$ctf_64cflags"
2195bb525f4SRobert Mustacchi		elif [[ -f "$ctf_root/$check-32" && \
2205bb525f4SRobert Mustacchi		    -f "$ctf_root/$check-64" ]]; then
2215bb525f4SRobert Mustacchi			run_one $t "$ctf_root/$check-32" "$ctf_32cflags"
2225bb525f4SRobert Mustacchi			run_one $t "$ctf_root/$check-64" "$ctf_64cflags"
2235bb525f4SRobert Mustacchi		else
2245bb525f4SRobert Mustacchi			test_fail "missing checker for $t"
2255bb525f4SRobert Mustacchi		fi
2265bb525f4SRobert Mustacchi	done
2275bb525f4SRobert Mustacchi
2285bb525f4SRobert Mustacchi	for d in $(find "$ctf_root" -maxdepth 1 -type d -name 'test-*'); do
2295bb525f4SRobert Mustacchi		[[ ! -f "$d/$ctf_makefile" ]] && continue
2305bb525f4SRobert Mustacchi		base=$(basename "$d")
2315bb525f4SRobert Mustacchi		check=$(echo "$base" | sed s/test-/check-/)
2325bb525f4SRobert Mustacchi		if [[ -f "$ctf_root/$check" ]]; then
2335bb525f4SRobert Mustacchi			run_dir $d "$ctf_root/$check" "$ctf_32cflags" \
2345bb525f4SRobert Mustacchi			    "$ctf_root/$check" "$ctf_64cflags"
2355bb525f4SRobert Mustacchi		elif [[ -f "$ctf_root/$check-32" && \
2365bb525f4SRobert Mustacchi		    -f "$ctf_root/$check-64" ]]; then
2375bb525f4SRobert Mustacchi			run_dir $d "$ctf_root/$check-32" "$ctf_32cflags" \
2385bb525f4SRobert Mustacchi			    "$ctf_root/$check-64" "$ctf_64cflags"
2395bb525f4SRobert Mustacchi		else
2405bb525f4SRobert Mustacchi			test_fail "missing checker for $t"
2415bb525f4SRobert Mustacchi		fi
2425bb525f4SRobert Mustacchi	done
2433eca6103SJohn Levon
2443eca6103SJohn Levon	outdir="$TMPDIR/ctftest.$$"
2453eca6103SJohn Levon
2463eca6103SJohn Levon	for f in $(find "$ctf_root" -maxdepth 1 -type f -name 'ctftest-*'); do
2473eca6103SJohn Levon		if ! mkdir $outdir; then
2483eca6103SJohn Levon			fatal "failed to make temporary directory '$outdir'"
2493eca6103SJohn Levon		fi
2503eca6103SJohn Levon
2513eca6103SJohn Levon		echo "Running $f in $outdir"
2523eca6103SJohn Levon
2533eca6103SJohn Levon		(cd $outdir && $f)
2543eca6103SJohn Levon
2553eca6103SJohn Levon		if [[ $? -ne 0 ]]; then
2563eca6103SJohn Levon			test_fail "$f failed"
2573eca6103SJohn Levon		else
2583eca6103SJohn Levon			echo "TEST PASSED: $f"
2593eca6103SJohn Levon		fi
2603eca6103SJohn Levon
2613eca6103SJohn Levon		rm -rf $outdir
2623eca6103SJohn Levon	done
2635bb525f4SRobert Mustacchi}
2645bb525f4SRobert Mustacchi
2653eca6103SJohn Levonwhile getopts ":a:C:c:g:m:t:" c $@; do
2665bb525f4SRobert Mustacchi	case "$c" in
2673eca6103SJohn Levon	a)
2683eca6103SJohn Levon		ctf_as=$OPTARG
2693eca6103SJohn Levon		;;
2703eca6103SJohn Levon	C)
2713eca6103SJohn Levon		ctf_cxx=$OPTARG
2723eca6103SJohn Levon		;;
2735bb525f4SRobert Mustacchi	c)
2743eca6103SJohn Levon		ctf_cc=$OPTARG
2755bb525f4SRobert Mustacchi		;;
2765bb525f4SRobert Mustacchi	g)
2775bb525f4SRobert Mustacchi		ctf_debugflags=$OPTARG
2785bb525f4SRobert Mustacchi		;;
2795bb525f4SRobert Mustacchi	m)
2805bb525f4SRobert Mustacchi		ctf_merge=$OPTARG
2815bb525f4SRobert Mustacchi		;;
2825bb525f4SRobert Mustacchi	t)
2835bb525f4SRobert Mustacchi		ctf_convert=$OPTARG
2845bb525f4SRobert Mustacchi		;;
2855bb525f4SRobert Mustacchi	:)
2865bb525f4SRobert Mustacchi		usage "option requires an argument -- $OPTARG"
2875bb525f4SRobert Mustacchi		;;
2885bb525f4SRobert Mustacchi	*)
2895bb525f4SRobert Mustacchi		usage "invalid option -- $OPTARG"
2905bb525f4SRobert Mustacchi		;;
2915bb525f4SRobert Mustacchi	esac
2925bb525f4SRobert Mustacchidone
2935bb525f4SRobert Mustacchi
2945bb525f4SRobert Mustacchictf_32cflags="$ctf_mach32 $ctf_debugflags"
2955bb525f4SRobert Mustacchictf_64cflags="$ctf_mach64 $ctf_debugflags"
2965bb525f4SRobert Mustacchi
297*3cec9822SRobert Mustacchidetermine_compiler
298*3cec9822SRobert Mustacchi
2993eca6103SJohn Levonexport ctf_as ctf_cc ctf_cxx ctf_debugflags ctf_merge ctf_convert
300*3cec9822SRobert Mustacchiexport ctf_cc_type ctf_cc_version
3013eca6103SJohn Levon
3025bb525f4SRobert Mustacchiannounce
3035bb525f4SRobert Mustacchi
3045bb525f4SRobert Mustacchirun_tests
3055bb525f4SRobert Mustacchi
3065bb525f4SRobert Mustacchiif [[ $ctf_nerrs -ne 0 ]]; then
3075bb525f4SRobert Mustacchi	if [[ $ctf_nerrs -eq 1 ]]; then
3085bb525f4SRobert Mustacchi		printf "\n%s: %u test failed\n" "$ctf_arg0" "$ctf_nerrs"
3095bb525f4SRobert Mustacchi	else
3105bb525f4SRobert Mustacchi		printf "\n%s: %u tests failed\n" "$ctf_arg0" "$ctf_nerrs"
3115bb525f4SRobert Mustacchi	fi
3123eca6103SJohn Levon	exit 1
3135bb525f4SRobert Mustacchielse
3145bb525f4SRobert Mustacchi	printf "\n%s: All tests passed successfully\n" "$ctf_arg0"
3155bb525f4SRobert Mustacchi	exit 0
3165bb525f4SRobert Mustacchifi
317