@@ -5,8 +5,22 @@ abi=0
name=
srcdir="$(cd "${0%/*}" && pwd)/tests"
sim="$GCC_TEST_SIMULATOR"
-quiet=false
-verbose=false
+
+# output_mode values:
+# print only failures with minimal context
+readonly really_quiet=0
+# as above plus same-line output of last successful test
+readonly same_line=1
+# as above plus percentage
+readonly percentage=2
+# print one line per finished test with minimal context on failure
+readonly verbose=3
+# print one line per finished test with full output of the compiler and test
+readonly really_verbose=4
+
+output_mode=$really_quiet
+[ -t 1 ] && output_mode=$same_line
+
timeout=180
run_expensive=false
if [ -n "$GCC_TEST_RUN_EXPENSIVE" ]; then
@@ -21,8 +35,12 @@ Usage: $0 [Options] <g++ invocation>
Options:
-h, --help Print this message and exit.
- -q, --quiet Only print failures.
- -v, --verbose Print compiler and test output on failure.
+ -q, --quiet Disable same-line progress output (default if stdout is
+ not a tty).
+ -p, --percentage Add percentage to default same-line progress output.
+ -v, --verbose Print one line per test and minimal extra information on
+ failure.
+ -vv Print all compiler and test output.
-t <type>, --type <type>
The value_type to test (default: $type).
-a [0-9], --abi [0-9]
@@ -36,9 +54,10 @@ Options:
GCC_TEST_SIMULATOR).
--timeout-factor <x>
Multiply the default timeout with x.
- --run-expensive Compile and run tests marked as expensive (default:
+ -x, --run-expensive Compile and run tests marked as expensive (default:
true if GCC_TEST_RUN_EXPENSIVE is set, false otherwise).
- --only <pattern> Compile and run only tests matching the given pattern.
+ -o <pattern>, --only <pattern>
+ Compile and run only tests matching the given pattern.
EOF
}
@@ -49,71 +68,74 @@ while [ $# -gt 0 ]; do
exit
;;
-q|--quiet)
- quiet=true
+ output_mode=$really_quiet
+ ;;
+ -p|--percentage)
+ output_mode=$percentage
;;
-v|--verbose)
- verbose=true
+ if [ $output_mode -lt $verbose ]; then
+ output_mode=$verbose
+ else
+ output_mode=$really_verbose
+ fi
;;
- --run-expensive)
+ -x|--run-expensive)
run_expensive=true
;;
-k|--keep-failed)
keep_failed=true
;;
- --only)
+ -o|--only)
only="$2"
shift
;;
- --only=*)
- only="${1#--only=}"
- ;;
-t|--type)
type="$2"
shift
;;
- --type=*)
- type="${1#--type=}"
- ;;
-a|--abi)
abi="$2"
shift
;;
- --abi=*)
- abi="${1#--abi=}"
- ;;
-n|--name)
name="$2"
shift
;;
- --name=*)
- name="${1#--name=}"
- ;;
--srcdir)
srcdir="$2"
shift
;;
- --srcdir=*)
- srcdir="${1#--srcdir=}"
- ;;
--sim)
sim="$2"
shift
;;
- --sim=*)
- sim="${1#--sim=}"
- ;;
--timeout-factor)
timeout=$(awk "BEGIN { print int($timeout * $2) }")
shift
;;
- --timeout-factor=*)
- x=${1#--timeout-factor=}
- timeout=$(awk "BEGIN { print int($timeout * $x) }")
- ;;
--)
shift
break
;;
+ --*=*)
+ opt="$1"
+ shift
+ value=${opt#*=}
+ set -- ${opt%=$value} "$value" ${1+"$@"}
+ continue
+ ;;
+ -[ahknopqtvx][ahknopqtvx]*)
+ opt="$1"
+ shift
+ next=${opt#??}
+ set -- ${opt%$next} "-$next" ${1+"$@"}
+ continue
+ ;;
+ -*)
+ echo "Error: Unrecognized option '$1'" >&2
+ exit 1
+ ;;
*)
break
;;
@@ -121,6 +143,17 @@ while [ $# -gt 0 ]; do
shift
done
+if [ $output_mode = $percentage ]; then
+ inc_progress() {
+ {
+ flock -n 9
+ n=$(($(cat .progress) + 1))
+ echo $n >&9
+ echo $n
+ } 9<>.progress
+ }
+fi
+
CXX="$1"
shift
CXXFLAGS="$@"
@@ -133,6 +166,7 @@ sum="${testname}.sum"
if [ -n "$only" ]; then
if echo "$testname"|awk "{ exit /$only/ }"; then
touch "$log" "$sum"
+ [ $output_mode = $percentage ] && inc_progress >/dev/null
exit 0
fi
fi
@@ -146,35 +180,58 @@ else
exit 1
fi
+if [ $output_mode = $percentage ]; then
+ show_progress() {
+ n=$(inc_progress)
+ read total < .progress_total
+ total=${total}0
+ printf "\e[1G\e[K[%3d %%] ${src##*/} $type $abiflag" \
+ $((n * 1005 / total))
+ }
+ trap 'show_progress' EXIT
+ prefix="\e[1G\e[K"
+elif [ $output_mode = $same_line ]; then
+ show_progress() {
+ printf "\e[1G\e[K${src##*/} $type $abiflag"
+ }
+ trap 'show_progress' EXIT
+ prefix="\e[1G\e[K"
+else
+ prefix=""
+fi
+
fail() {
+ printf "$prefix"
echo "FAIL: $src $type $abiflag ($*)" | tee -a "$sum" "$log"
}
xpass() {
+ printf "$prefix"
echo "XPASS: $src $type $abiflag ($*)" | tee -a "$sum" "$log"
}
xfail() {
- $quiet || echo "XFAIL: $src $type $abiflag ($*)"
+ [ $output_mode -ge $verbose ] && echo "XFAIL: $src $type $abiflag ($*)"
echo "XFAIL: $src $type $abiflag ($*)" >> "$sum"
echo "XFAIL: $src $type $abiflag ($*)" >> "$log"
}
pass() {
- $quiet || echo "PASS: $src $type $abiflag ($*)"
+ [ $output_mode -ge $verbose ] && echo "PASS: $src $type $abiflag ($*)"
echo "PASS: $src $type $abiflag ($*)" >> "$sum"
echo "PASS: $src $type $abiflag ($*)" >> "$log"
}
unsupported() {
- $quiet || echo "UNSUPPORTED: $src $type $abiflag ($*)"
+ test
+ [ $output_mode -ge $verbose ] && echo "UNSUPPORTED: $src $type $abiflag ($*)"
echo "UNSUPPORTED: $src $type $abiflag ($*)" >> "$sum"
echo "UNSUPPORTED: $src $type $abiflag ($*)" >> "$log"
}
write_log_and_verbose() {
echo "$*" >> "$log"
- if $verbose; then
+ if [ $output_mode = $really_verbose ]; then
if [ -z "$COLUMNS" ] || ! type fmt>/dev/null; then
echo "$*"
else
@@ -265,7 +322,7 @@ if read_src_option timeout-factor factor; then
fi
log_output() {
- if $verbose; then
+ if [ $output_mode = $really_verbose ]; then
maxcol=${1:-1024}
awk "
BEGIN { count = 0 }
@@ -323,7 +380,7 @@ verify_compilation() {
warnings=$(grep -ic 'warning:' "$log")
if [ $warnings -gt 0 ]; then
fail "excess warnings:" $warnings
- if ! $verbose && ! $quiet; then
+ if [ $output_mode = $verbose ]; then
grep -i 'warning:' "$log" | head -n5
fi
elif [ "$xfail" = "compile" ]; then
@@ -344,7 +401,7 @@ verify_compilation() {
fail "excess errors:" $errors
fi
fi
- if ! $verbose && ! $quiet; then
+ if [ $output_mode = $verbose ]; then
grep -i 'error:' "$log" | head -n5
fi
return 1
@@ -365,7 +422,7 @@ verify_test() {
return 0
else
$keep_failed || rm "$exe"
- if ! $verbose && ! $quiet; then
+ if [ $output_mode = $verbose ]; then
grep -i fail "$log" | head -n5
fi
if [ $exitstatus -eq 124 ]; then
@@ -97,7 +97,7 @@ driveroptions := \$(DRIVEROPTS)
all: simd_testsuite.sum
-simd_testsuite.sum: simd_testsuite.log
+simd_testsuite.sum: .progress .progress_total simd_testsuite.log
@printf "\n\t\t=== simd_testsuite \$(test_flags) Summary ===\n\n"\\
"# of expected passes:\t\t\$(shell grep -c '^PASS:' \$@)\n"\\
"# of unexpected passes:\t\t\$(shell grep -c '^XPASS:' \$@)\n"\\
@@ -255,7 +255,7 @@ EOF
done
cat <<EOF
run-%: export GCC_TEST_RUN_EXPENSIVE=yes
-run-%: driveroptions += -v
+run-%: driveroptions += -vv
run-%: %.log
@rm \$^ \$(^:log=sum)
@@ -266,17 +266,22 @@ EOF
dsthelp="${dst%Makefile}.make_help.txt"
cat <<EOF > "$dsthelp"
use DRIVEROPTS=<options> to pass the following options:
--q, --quiet Only print failures.
--v, --verbose Print compiler and test output on failure.
+-q, --quiet Disable same-line progress output (default if stdout is
+ not a tty).
+-p, --percentage Add percentage to default same-line progress output.
+-v, --verbose Print one line per test and minimal extra information on
+ failure.
+-vv Print all compiler and test output.
-k, --keep-failed Keep executables of failed tests.
--sim <executable> Path to an executable that is prepended to the test
execution binary (default: the value of
GCC_TEST_SIMULATOR).
--timeout-factor <x>
Multiply the default timeout with x.
---run-expensive Compile and run tests marked as expensive (default:
+-x, --run-expensive Compile and run tests marked as expensive (default:
true if GCC_TEST_RUN_EXPENSIVE is set, false otherwise).
---only <pattern> Compile and run only tests matching the given pattern.
+-o <pattern>, --only <pattern>
+ Compile and run only tests matching the given pattern.
use TESTFLAGS=<flags> to pass additional compiler flags
@@ -285,9 +290,13 @@ The following are some of the valid targets for this Makefile:
... clean
... help"
EOF
+ N=$(((0$(
+ all_tests | while read file && read name; do
+ all_types "$file" | printf " + %d" $(wc -l)
+ done) ) * 5))
all_tests | while read file && read name; do
echo "... run-${name}"
- all_types | while read t && read type; do
+ all_types "$file" | while read t && read type; do
echo "... run-${name}-${type}"
for i in $(seq 0 9); do
echo "... run-${name}-${type}-$i"
@@ -296,10 +305,16 @@ EOF
done >> "$dsthelp"
cat <<EOF
+.progress:
+ @echo 0 > .progress
+
+.progress_total:
+ @echo $N > .progress_total
+
clean:
- rm -f -- *.sum *.log *.exe
+ rm -f -- *.sum *.log *.exe .progress .progress_total
-.PHONY: clean help
+.PHONY: all clean help .progress .progress_total
.PRECIOUS: %.log %.sum
EOF
For most uses --quiet was too quiet while the default was too noisy. Now the default output, if stdout is a tty, shows the last successful test on the same line. With --percentage it adds a percentage at the start of the line. --percentage is not default because it requires more resources and might not be 100% compatible to all environments. If stdout is not a tty the default is quiet output like for dejagnu. Additionally, argument parsing now recognizes contracted short options which is easier to use with e.g. DRIVEROPTS=-pxk. libstdc++-v3/ChangeLog: * testsuite/experimental/simd/driver.sh: Rewrite output verbosity logic. Add -p/--percentage option. Allow -v/--verbose to be used twice. Add -x and -o short options. Parse long options with = instead of separating space generically. Parce contracted short options. Make unrecognized options an error. If same-line output is active, trap on EXIT to increment the progress (only with --percentage), erase the line and print the current status. * testsuite/experimental/simd/generate_makefile.sh: Initialize helper files for progress account keeping. Update help target for changes to DRIVEROPTS. Signed-off-by: Matthias Kretz <m.kretz@gsi.de> --- .../testsuite/experimental/simd/driver.sh | 137 +++++++++++++----- .../experimental/simd/generate_makefile.sh | 33 +++-- 2 files changed, 121 insertions(+), 49 deletions(-) -- ────────────────────────────────────────────────────────────────────────── Dr. Matthias Kretz https://mattkretz.github.io GSI Helmholtz Centre for Heavy Ion Research https://gsi.de std::experimental::simd https://github.com/VcDevel/std-simd ──────────────────────────────────────────────────────────────────────────