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