90 lines
2.9 KiB
Bash
Executable file
90 lines
2.9 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# runCxxSmoke.sh — Phase 2.7 modern-C++ smoke harness.
|
|
#
|
|
# Builds each .cpp probe under tests/cxxSmoke/ through buildGno's recipe
|
|
# (clang++ -O2 + crt0Gno + libcGno + libcxxabi + omfEmit with
|
|
# ExpressLoad+cRELOCs), then launches the resulting OMF under GNO/ME in
|
|
# MAME via scripts/runInGno.sh and asserts the per-probe success
|
|
# markers in bank 2.
|
|
#
|
|
# Each probe stores the success sentinel 0x0099 at its dedicated marker
|
|
# slot; intermediate slots carry computed values that pin down which
|
|
# C++17 surface area was exercised. See per-probe headers for the
|
|
# marker contract.
|
|
#
|
|
# Usage:
|
|
# bash tests/cxxSmoke/runCxxSmoke.sh # all five
|
|
# bash tests/cxxSmoke/runCxxSmoke.sh rangeFor # one
|
|
# CXXSMOKE_FAIL_FAST=1 bash tests/cxxSmoke/runCxxSmoke.sh
|
|
#
|
|
# Exit status: 0 if every selected probe passes; 1 otherwise. Each
|
|
# probe runs ~3 minutes under MAME (GNO boot + login + shell + program
|
|
# launch + marker poll), so the full sweep is ~15 minutes.
|
|
|
|
set -uo pipefail
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
|
|
# Probe table: name + space-separated "addr=hexval" pairs. The last pair
|
|
# must always be the 0x0099 success sentinel; earlier pairs are computed
|
|
# values that anchor the check to the right surface area (so a partial
|
|
# regression — say the lambda fires but i32 capture is wrong — is caught
|
|
# at the data-pin rather than just the sentinel).
|
|
PROBES=(
|
|
"rangeFor 0x025000=000F 0x025002=0099"
|
|
"genericLambda 0x025000=2445 0x025002=0001 0x025004=0099"
|
|
"variadicTpl 0x025000=0078 0x025002=0099"
|
|
"structBind 0x025000=0007 0x025002=002A 0x025004=00DE 0x025006=00AD 0x025008=0099"
|
|
"foldExpr 0x025000=000A 0x025002=000A 0x025004=0003 0x025006=0099"
|
|
)
|
|
|
|
# Optionally restrict to a single probe by basename.
|
|
SELECTED="${1:-}"
|
|
|
|
pass=0
|
|
fail=0
|
|
declare -a FAILED
|
|
|
|
for row in "${PROBES[@]}"; do
|
|
set -- $row
|
|
name="$1"; shift
|
|
if [ -n "$SELECTED" ] && [ "$name" != "$SELECTED" ]; then
|
|
continue
|
|
fi
|
|
|
|
echo ""
|
|
echo "=== cxxSmoke: $name ==="
|
|
|
|
if ! bash "$SCRIPT_DIR/build.sh" "$name"; then
|
|
echo "[cxxSmoke FAIL] $name: build failed"
|
|
fail=$((fail + 1))
|
|
FAILED+=("$name (build)")
|
|
if [ -n "${CXXSMOKE_FAIL_FAST:-}" ]; then
|
|
break
|
|
fi
|
|
continue
|
|
fi
|
|
|
|
if bash "$ROOT/scripts/runInGno.sh" "$SCRIPT_DIR/$name.omf" --check "$@"; then
|
|
echo "[cxxSmoke OK] $name"
|
|
pass=$((pass + 1))
|
|
else
|
|
echo "[cxxSmoke FAIL] $name: marker mismatch (see check output above)"
|
|
fail=$((fail + 1))
|
|
FAILED+=("$name (run)")
|
|
if [ -n "${CXXSMOKE_FAIL_FAST:-}" ]; then
|
|
break
|
|
fi
|
|
fi
|
|
done
|
|
|
|
echo ""
|
|
echo "=== cxxSmoke summary: $pass passed, $fail failed ==="
|
|
if [ "$fail" -gt 0 ]; then
|
|
echo "failed probes:"
|
|
for f in "${FAILED[@]}"; do
|
|
echo " - $f"
|
|
done
|
|
exit 1
|
|
fi
|
|
exit 0
|