libstdc++: Improve output verbosity options and default

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.

Signed-off-by: Matthias Kretz <m.kretz@gsi.de>

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.
This commit is contained in:
Matthias Kretz 2021-06-23 16:34:30 +01:00 committed by Jonathan Wakely
parent 15f2669c9d
commit 848bc05a98
2 changed files with 122 additions and 50 deletions

View file

@ -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

View file

@ -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
clean:
rm -f -- *.sum *.log *.exe
.progress:
@echo 0 > .progress
.PHONY: clean help
.progress_total:
@echo $N > .progress_total
clean:
rm -f -- *.sum *.log *.exe .progress .progress_total
.PHONY: all clean help .progress .progress_total
.PRECIOUS: %.log %.sum
EOF