commit 14ba583ce257058b9eeccf580e289a3487c8f371
parent f753db1d7995abbd515ba6c79f7a22ea8d97de1f
Author: Ryan Sepassi <rsepassi@gmail.com>
Date: Sat, 16 May 2026 09:36:36 -0700
Run toy tests at O0 and O1
Diffstat:
| M | test/toy/run.sh | | | 80 | +++++++++++++++++++++++++++++++++++++++++-------------------------------------- |
1 file changed, 42 insertions(+), 38 deletions(-)
diff --git a/test/toy/run.sh b/test/toy/run.sh
@@ -2,9 +2,9 @@
# test/toy/run.sh — .toy frontend end-to-end tests.
#
# Paths per case:
-# R cfree run case.toy
-# L cfree cc -c case.toy -> cfree ld case.o -> native executable
-# X cfree cc -target -> cfree ld -> exec_target for Linux cross targets
+# R cfree run -O{level} case.toy
+# L cfree cc -O{level} -c case.toy -> cfree ld case.o -> native executable
+# X cfree cc -O{level} -target -> cfree ld -> exec_target for Linux cross targets
#
# Sidecars:
# <name>.expected expected process exit code, default 0
@@ -13,6 +13,7 @@
# ./run.sh [name_filter] [paths]
# CFREE_TEST_FILTER / CFREE_TEST_PATHS, where paths is a subset of "RLX".
# X is opt-in cross-arch cc+ld+exec for aa64, x64, and rv64.
+# CFREE_TOY_OPT_LEVELS selects optimization levels, default "0 1".
set -u
@@ -27,6 +28,7 @@ case "$PATHS" in *R*) RUN_R=1;; *) RUN_R=0;; esac
case "$PATHS" in *L*) RUN_L=1;; *) RUN_L=0;; esac
case "$PATHS" in *X*) RUN_X=1;; *) RUN_X=0;; esac
TOY_CROSS_ARCHS="${CFREE_TOY_CROSS_ARCHS:-aa64 x64 rv64}"
+TOY_OPT_LEVELS="${CFREE_TOY_OPT_LEVELS:-0 1}"
mkdir -p "$BUILD_DIR"
@@ -78,40 +80,40 @@ check_rc() {
}
run_case_run() {
- local name="$1" src="$2" expected="$3" work="$4"
+ local name="$1" src="$2" expected="$3" work="$4" opt="$5"
local out="$work/run.out" err="$work/run.err" rc
- "$CFREE" run "$src" > "$out" 2> "$err"
+ "$CFREE" run "-O$opt" "$src" > "$out" 2> "$err"
rc=$?
- check_rc "$name/R" "$rc" "$expected" "$err"
+ check_rc "$name/R-O$opt" "$rc" "$expected" "$err"
}
run_case_link() {
- local name="$1" src="$2" expected="$3" work="$4"
+ local name="$1" src="$2" expected="$3" work="$4" opt="$5"
local obj="$work/$name.o" exe="$work/$name.exe"
local cc_err="$work/cc.err" ld_err="$work/ld.err" out="$work/exe.out"
local err="$work/exe.err" rc
- if ! "$CFREE" cc -c "$src" -o "$obj" > "$work/cc.out" 2> "$cc_err"; then
- note_fail "$name/L"
- printf ' cfree cc -c failed\n'
+ if ! "$CFREE" cc "-O$opt" -c "$src" -o "$obj" > "$work/cc.out" 2> "$cc_err"; then
+ note_fail "$name/L-O$opt"
+ printf ' cfree cc -O%s -c failed\n' "$opt"
sed 's/^/ | /' "$cc_err"
return
fi
if [ -s "$cc_err" ]; then
- note_fail "$name/L"
- printf ' cfree cc -c wrote stderr\n'
+ note_fail "$name/L-O$opt"
+ printf ' cfree cc -O%s -c wrote stderr\n' "$opt"
sed 's/^/ | /' "$cc_err"
return
fi
if ! "$CFREE" ld "$obj" -o "$exe" > "$work/ld.out" 2> "$ld_err"; then
- note_fail "$name/L"
+ note_fail "$name/L-O$opt"
printf ' cfree ld failed\n'
sed 's/^/ | /' "$ld_err"
return
fi
if [ -s "$ld_err" ]; then
- note_fail "$name/L"
+ note_fail "$name/L-O$opt"
printf ' cfree ld wrote stderr\n'
sed 's/^/ | /' "$ld_err"
return
@@ -120,7 +122,7 @@ run_case_link() {
chmod +x "$exe" 2>/dev/null || true
"$exe" > "$out" 2> "$err"
rc=$?
- check_rc "$name/L" "$rc" "$expected" "$err"
+ check_rc "$name/L-O$opt" "$rc" "$expected" "$err"
}
cross_triple_for() {
@@ -182,17 +184,17 @@ EOF_START
}
run_case_cross_one() {
- local arch="$1" name="$2" src="$3" expected="$4" work="$5"
+ local arch="$1" name="$2" src="$3" expected="$4" work="$5" opt="$6"
local triple tag obj exe start_obj cc_err ld_err out err rc label
triple="$(cross_triple_for "$arch")" || {
- note_skip "$name/X:$arch" "unknown cross arch"
+ note_skip "$name/X-O$opt:$arch" "unknown cross arch"
return
}
tag="$(cross_tag_for "$arch")" || {
- note_skip "$name/X:$arch" "unknown cross arch"
+ note_skip "$name/X-O$opt:$arch" "unknown cross arch"
return
}
- label="$name/X:$arch"
+ label="$name/X-O$opt:$arch"
if [ "$arch" != "aa64" ] && [ "$arch" != "aarch64" ] &&
grep -q 'asmnop' "$src"; then
note_skip "$label" "asmnop is target-specific before toy asm selectors"
@@ -203,23 +205,23 @@ run_case_cross_one() {
return
fi
- obj="$work/$name.$arch.o"
- exe="$work/$name.$arch.exe"
+ obj="$work/$name.O$opt.$arch.o"
+ exe="$work/$name.O$opt.$arch.exe"
cc_err="$work/$arch.cc.err"
ld_err="$work/$arch.ld.err"
out="$work/$arch.out"
err="$work/$arch.err"
- if ! "$CFREE" cc -target "$triple" -c "$src" -o "$obj" \
+ if ! "$CFREE" cc "-O$opt" -target "$triple" -c "$src" -o "$obj" \
> "$work/$arch.cc.out" 2> "$cc_err"; then
note_fail "$label"
- printf ' cfree cc -target %s -c failed\n' "$triple"
+ printf ' cfree cc -O%s -target %s -c failed\n' "$opt" "$triple"
sed 's/^/ | /' "$cc_err"
return
fi
if [ -s "$cc_err" ]; then
note_fail "$label"
- printf ' cfree cc -target %s -c wrote stderr\n' "$triple"
+ printf ' cfree cc -O%s -target %s -c wrote stderr\n' "$opt" "$triple"
sed 's/^/ | /' "$cc_err"
return
fi
@@ -255,9 +257,9 @@ run_case_cross_one() {
}
run_case_cross() {
- local name="$1" src="$2" expected="$3" work="$4" arch
+ local name="$1" src="$2" expected="$3" work="$4" opt="$5" arch
for arch in $TOY_CROSS_ARCHS; do
- run_case_cross_one "$arch" "$name" "$src" "$expected" "$work"
+ run_case_cross_one "$arch" "$name" "$src" "$expected" "$work" "$opt"
done
}
@@ -294,18 +296,20 @@ for src in "${cases[@]}"; do
continue
fi
expected="$(expected_for "$src")"
- work="$BUILD_DIR/$name"
- rm -rf "$work"
- mkdir -p "$work"
- if [ $RUN_R -eq 1 ]; then
- run_case_run "$name" "$src" "$expected" "$work"
- fi
- if [ $RUN_L -eq 1 ]; then
- run_case_link "$name" "$src" "$expected" "$work"
- fi
- if [ $RUN_X -eq 1 ]; then
- run_case_cross "$name" "$src" "$expected" "$work"
- fi
+ for opt in $TOY_OPT_LEVELS; do
+ work="$BUILD_DIR/$name/O$opt"
+ rm -rf "$work"
+ mkdir -p "$work"
+ if [ $RUN_R -eq 1 ]; then
+ run_case_run "$name" "$src" "$expected" "$work" "$opt"
+ fi
+ if [ $RUN_L -eq 1 ]; then
+ run_case_link "$name" "$src" "$expected" "$work" "$opt"
+ fi
+ if [ $RUN_X -eq 1 ]; then
+ run_case_cross "$name" "$src" "$expected" "$work" "$opt"
+ fi
+ done
done
printf '\nResults: %d pass, %d fail, %d skip\n' "$PASS" "$FAIL" "$SKIP"