81 lines
2.4 KiB
Bash
Executable file
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
|