65816-llvm-mos/scripts/runFileCheckTests.sh
Scott Duensing 465f8ba947 Checkpoint
2026-05-05 22:00:34 -05:00

81 lines
2.4 KiB
Bash
Executable file

#!/usr/bin/env bash
# runFileCheckTests.sh - run W65816 backend regression tests.
#
# Walks src/llvm/test/CodeGen/W65816/*.ll and for each:
# - reads RUN: lines from the test header (lit-compatible syntax)
# - executes them with %s -> the test path
# - any non-zero exit fails the run.
#
# Why not lit: the in-tree llvm-mos build is configured with
# LLVM_INCLUDE_TESTS=OFF (saves ~5 min from incremental rebuilds and
# ~2 GB of test artifacts). These regression tests are codegen-shape
# pins, not full lit-harness sweeps; FileCheck alone covers our needs.
#
# Usage:
# scripts/runFileCheckTests.sh # run all
# scripts/runFileCheckTests.sh foo.ll bar.ll # run named (relative to dir)
set -euo pipefail
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
TEST_DIR="$PROJECT_ROOT/src/llvm/test/CodeGen/W65816"
LLC="$PROJECT_ROOT/tools/llvm-mos-build/bin/llc"
FILECHECK="$PROJECT_ROOT/tools/llvm-mos-build/bin/FileCheck"
NOT="$PROJECT_ROOT/tools/llvm-mos-build/bin/not"
[ -x "$LLC" ] || { echo "missing $LLC" >&2; exit 2; }
[ -x "$FILECHECK" ] || { echo "missing $FILECHECK; build with 'ninja FileCheck not'" >&2; exit 2; }
if [ $# -gt 0 ]; then
files=()
for f in "$@"; do
files+=("$TEST_DIR/$f")
done
else
mapfile -t files < <(find "$TEST_DIR" -maxdepth 1 -name '*.ll' | sort)
fi
pass=0
fail=0
failed=()
for f in "${files[@]}"; do
[ -f "$f" ] || { echo "skip missing: $f"; continue; }
name="$(basename "$f")"
runs=$(grep -E '^[[:space:]]*;[[:space:]]*RUN:' "$f" | sed -E 's/^[[:space:]]*;[[:space:]]*RUN:[[:space:]]*//')
if [ -z "$runs" ]; then
echo "SKIP $name (no RUN: line)"
continue
fi
ok=1
while IFS= read -r line; do
[ -z "$line" ] && continue
cmd=${line//%s/$f}
cmd=${cmd//llc/$LLC}
cmd=${cmd//FileCheck/$FILECHECK}
cmd=${cmd//not /$NOT }
out=$(bash -c "$cmd" 2>&1) || {
ok=0
echo "FAIL $name"
echo " cmd: $cmd"
echo "$out" | sed 's/^/ | /'
break
}
done <<< "$runs"
if [ $ok -eq 1 ]; then
echo "PASS $name"
pass=$((pass + 1))
else
fail=$((fail + 1))
failed+=("$name")
fi
done
echo
echo "==== W65816 FileCheck: $pass pass, $fail fail ===="
if [ $fail -gt 0 ]; then
printf ' - %s\n' "${failed[@]}"
exit 1
fi