Blame script/test.bash

Packit b1f7ae
#! /bin/bash
Packit b1f7ae
#
Packit b1f7ae
# Copyright (c) 2013-2017, Intel Corporation
Packit b1f7ae
#
Packit b1f7ae
# Redistribution and use in source and binary forms, with or without
Packit b1f7ae
# modification, are permitted provided that the following conditions are met:
Packit b1f7ae
#
Packit b1f7ae
#  * Redistributions of source code must retain the above copyright notice,
Packit b1f7ae
#    this list of conditions and the following disclaimer.
Packit b1f7ae
#  * Redistributions in binary form must reproduce the above copyright notice,
Packit b1f7ae
#    this list of conditions and the following disclaimer in the documentation
Packit b1f7ae
#    and/or other materials provided with the distribution.
Packit b1f7ae
#  * Neither the name of Intel Corporation nor the names of its contributors
Packit b1f7ae
#    may be used to endorse or promote products derived from this software
Packit b1f7ae
#    without specific prior written permission.
Packit b1f7ae
#
Packit b1f7ae
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
Packit b1f7ae
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Packit b1f7ae
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
Packit b1f7ae
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
Packit b1f7ae
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
Packit b1f7ae
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
Packit b1f7ae
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
Packit b1f7ae
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
Packit b1f7ae
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
Packit b1f7ae
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
Packit b1f7ae
# POSSIBILITY OF SUCH DAMAGE.
Packit b1f7ae
#
Packit b1f7ae
# This script executes ptt tests and compares the output of tools, like
Packit b1f7ae
# ptxed or ptdump, with the expected output from the ptt testfile.
Packit b1f7ae
Packit b1f7ae
info() {
Packit b1f7ae
	[[ $verbose != 0 ]] && echo -e "$@" >&2
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
run() {
Packit b1f7ae
	info "$@"
Packit b1f7ae
	"$@"
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
asm2addr() {
Packit b1f7ae
	local line
Packit b1f7ae
	line=`grep -i ^org "$1"`
Packit b1f7ae
	[[ $? != 0 ]] && return $?
Packit b1f7ae
	echo $line | sed "s/org *//"
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
usage() {
Packit b1f7ae
	cat <
Packit b1f7ae
usage: $0 [<options>] <pttfile>...
Packit b1f7ae
Packit b1f7ae
options:
Packit b1f7ae
  -h            this text
Packit b1f7ae
  -v            print commands as they are executed
Packit b1f7ae
  -c cpu[,cpu]  comma-separated list of cpu's for the tests (see pttc -h, for valid values)
Packit b1f7ae
  -f            exit with 1 if any of the tests failed
Packit b1f7ae
  -l            only list .diff files
Packit b1f7ae
  -g            specify the pttc command (default: pttc)
Packit b1f7ae
  -G            specify additional arguments to pttc
Packit b1f7ae
  -d            specify the ptdump command (default: ptdump)
Packit b1f7ae
  -D            specify additional arguments to ptdump
Packit b1f7ae
  -x            specify the ptxed command (default: ptxed)
Packit b1f7ae
  -X            specify additional arguments to ptxed
Packit b1f7ae
Packit b1f7ae
  <pttfile>     annotated yasm file ending in .ptt
Packit b1f7ae
EOF
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
pttc_cmd=pttc
Packit b1f7ae
pttc_arg=""
Packit b1f7ae
ptdump_cmd=ptdump
Packit b1f7ae
ptdump_arg=""
Packit b1f7ae
ptxed_cmd=ptxed
Packit b1f7ae
ptxed_arg=""
Packit b1f7ae
exit_fails=0
Packit b1f7ae
list=0
Packit b1f7ae
verbose=0
Packit b1f7ae
while getopts "hvc:flg:G:d:D:x:X:" option; do
Packit b1f7ae
	case $option in
Packit b1f7ae
	h)
Packit b1f7ae
		usage
Packit b1f7ae
		exit 0
Packit b1f7ae
		;;
Packit b1f7ae
	v)
Packit b1f7ae
		verbose=1
Packit b1f7ae
		;;
Packit b1f7ae
	c)
Packit b1f7ae
		cpus=`echo $OPTARG | sed "s/,/ /g"`
Packit b1f7ae
		;;
Packit b1f7ae
	f)
Packit b1f7ae
		exit_fails=1
Packit b1f7ae
		;;
Packit b1f7ae
	l)
Packit b1f7ae
		list=1
Packit b1f7ae
		;;
Packit b1f7ae
	g)
Packit b1f7ae
		pttc_cmd=$OPTARG
Packit b1f7ae
		;;
Packit b1f7ae
	G)
Packit b1f7ae
		pttc_arg=$OPTARG
Packit b1f7ae
		;;
Packit b1f7ae
	d)
Packit b1f7ae
		ptdump_cmd=$OPTARG
Packit b1f7ae
		;;
Packit b1f7ae
	D)
Packit b1f7ae
		ptdump_arg=$OPTARG
Packit b1f7ae
		;;
Packit b1f7ae
	x)
Packit b1f7ae
		ptxed_cmd=$OPTARG
Packit b1f7ae
		;;
Packit b1f7ae
	X)
Packit b1f7ae
		ptxed_arg=$OPTARG
Packit b1f7ae
		;;
Packit b1f7ae
	\?)
Packit b1f7ae
		exit 1
Packit b1f7ae
		;;
Packit b1f7ae
	esac
Packit b1f7ae
done
Packit b1f7ae
Packit b1f7ae
shift $(($OPTIND-1))
Packit b1f7ae
Packit b1f7ae
if [[ $# == 0 ]]; then
Packit b1f7ae
	usage
Packit b1f7ae
	exit 1
Packit b1f7ae
fi
Packit b1f7ae
Packit b1f7ae
# the exit status
Packit b1f7ae
status=0
Packit b1f7ae
Packit b1f7ae
ptt-ptdump-opts() {
Packit b1f7ae
	sed -n 's/[ \t]*;[ \t]*opt:ptdump[ \t][ \t]*\(.*\)[ \t]*/\1/p' "$1"
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
ptt-ptxed-opts() {
Packit b1f7ae
	sed -n 's/[ \t]*;[ \t]*opt:ptxed[ \t][ \t]*\(.*\)[ \t]*/\1/p' "$1"
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
run-ptt-test() {
Packit b1f7ae
	info "\n# run-ptt-test $@"
Packit b1f7ae
Packit b1f7ae
	ptt="$1"
Packit b1f7ae
	cpu="$2"
Packit b1f7ae
	base=`basename "${ptt%%.ptt}"`
Packit b1f7ae
Packit b1f7ae
	if [[ -n "$cpu" ]]; then
Packit b1f7ae
		cpu="--cpu $cpu"
Packit b1f7ae
	fi
Packit b1f7ae
Packit b1f7ae
	# the following are the files that are generated by pttc
Packit b1f7ae
	pt=$base.pt
Packit b1f7ae
	bin=$base.bin
Packit b1f7ae
	lst=$base.lst
Packit b1f7ae
Packit b1f7ae
Packit b1f7ae
	# execute pttc - remove the extra \r in Windows line endings
Packit b1f7ae
	exps=`run "$pttc_cmd" $pttc_arg $cpu "$ptt" | sed 's/\r\n/\n/g'`
Packit b1f7ae
	ret=$?
Packit b1f7ae
	if [[ $ret != 0 ]]; then
Packit b1f7ae
		echo "$ptt: $pttc_cmd $pttc_arg failed with $ret" >&2
Packit b1f7ae
		status=1
Packit b1f7ae
		return
Packit b1f7ae
	elif [[ -z $exps ]]; then
Packit b1f7ae
		echo "$ptt: $pttc_cmd $pttc_arg did not produce any .exp file" >&2
Packit b1f7ae
		status=1
Packit b1f7ae
		return
Packit b1f7ae
	fi
Packit b1f7ae
Packit b1f7ae
	# loop over all .exp files determine the tool, generate .out
Packit b1f7ae
	# files and compare .exp and .out file with diff.
Packit b1f7ae
	# all differences will be
Packit b1f7ae
	for exp in $exps; do
Packit b1f7ae
		exp_base=${exp%%.exp}
Packit b1f7ae
		out=$exp_base.out
Packit b1f7ae
		diff=$exp_base.diff
Packit b1f7ae
		tool=${exp_base##$base-}
Packit b1f7ae
		tool=${tool%%-cpu_*}
Packit b1f7ae
		case $tool in
Packit b1f7ae
		ptxed)
Packit b1f7ae
			addr=`asm2addr "$ptt"`
Packit b1f7ae
			if [[ $? != 0 ]]; then
Packit b1f7ae
				echo "$ptt: org directive not found in test file" >&2
Packit b1f7ae
				status=1
Packit b1f7ae
				continue
Packit b1f7ae
			fi
Packit b1f7ae
			local opts=`ptt-ptxed-opts "$ptt"`
Packit b1f7ae
			opts+=" --no-inst --check"
Packit b1f7ae
			run "$ptxed_cmd" $ptxed_arg --raw $bin:$addr $cpu $opts --pt $pt > $out
Packit b1f7ae
			;;
Packit b1f7ae
		ptdump)
Packit b1f7ae
			local opts=`ptt-ptdump-opts "$ptt"`
Packit b1f7ae
			run "$ptdump_cmd" $ptdump_arg $cpu $opts $pt > $out
Packit b1f7ae
			;;
Packit b1f7ae
		*)
Packit b1f7ae
			echo "$ptt: unknown tool '$tool'"
Packit b1f7ae
			status=1
Packit b1f7ae
			continue
Packit b1f7ae
			;;
Packit b1f7ae
		esac
Packit b1f7ae
		if run diff -ub $exp $out > $diff; then
Packit b1f7ae
			run rm $diff
Packit b1f7ae
		else
Packit b1f7ae
			if [[ $exit_fails != 0 ]]; then
Packit b1f7ae
				status=1
Packit b1f7ae
			fi
Packit b1f7ae
Packit b1f7ae
			if [[ $list != 0 ]]; then
Packit b1f7ae
				echo $diff
Packit b1f7ae
			else
Packit b1f7ae
				cat $diff
Packit b1f7ae
			fi
Packit b1f7ae
		fi
Packit b1f7ae
	done
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
ptt-cpus() {
Packit b1f7ae
	sed -n 's/[ \t]*;[ \t]*cpu[ \t][ \t]*\(.*\)[ \t]*/\1/p' "$1"
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
run-ptt-tests() {
Packit b1f7ae
	local ptt="$1"
Packit b1f7ae
	local cpus=$cpus
Packit b1f7ae
Packit b1f7ae
	# if no cpus are given on the command-line,
Packit b1f7ae
	# use the cpu directives from the pttfile.
Packit b1f7ae
	if [[ -z $cpus ]]; then
Packit b1f7ae
		cpus=`ptt-cpus "$ptt"`
Packit b1f7ae
	fi
Packit b1f7ae
Packit b1f7ae
	# if there are no cpu directives in the pttfile,
Packit b1f7ae
	# run the test without any cpu settings.
Packit b1f7ae
	if [[ -z $cpus ]]; then
Packit b1f7ae
		run-ptt-test "$ptt"
Packit b1f7ae
		return
Packit b1f7ae
	fi
Packit b1f7ae
Packit b1f7ae
	# otherwise run for each cpu the test.
Packit b1f7ae
	for i in $cpus; do
Packit b1f7ae
		run-ptt-test "$ptt" $i
Packit b1f7ae
	done
Packit b1f7ae
}
Packit b1f7ae
Packit b1f7ae
for ptt in "$@"; do
Packit b1f7ae
	run-ptt-tests "$ptt"
Packit b1f7ae
done
Packit b1f7ae
Packit b1f7ae
exit $status