blaise/scripts/fixpoint.sh
Graeme Geldenhuys 0cfb9ffa98 release: v0.7.0 — FPC-independent, fully self-hosting
Bump version to 0.7.0. Update fixpoint.sh to use the latest release
binary as stage-1 instead of FPC — FPC is no longer needed anywhere
in the toolchain.
2026-05-13 00:35:56 +01:00

88 lines
2.7 KiB
Bash
Executable file

#!/bin/bash
# Fixpoint test for the Blaise self-hosting check.
#
# Uses the most recent release binary as stage-1 (no FPC dependency).
#
# Steps:
# 1. Find stage-1 binary (latest release or explicit $STAGE1).
# 2. Rebuild + install RTL (cheap when nothing changed).
# 3. stage-1 -> stage-2 IR.
# 4. Assemble + link stage-2 binary via QBE + gcc.
# 5. stage-2 -> stage-3 IR (5-minute timeout).
# 6. diff stage-2.ssa stage-3.ssa => empty = clean fixpoint.
set -e
if [ ! -f "compiler/src/main/pascal/Blaise.pas" ]; then
echo "Run this script from the project root: ./scripts/fixpoint.sh" >&2
exit 1
fi
# Stage-1 binary: honour $STAGE1, otherwise pick the latest release.
if [ -n "$STAGE1" ]; then
STAGE1_BIN="$STAGE1"
elif [ -d releases ]; then
LATEST=$(ls -d releases/v* 2>/dev/null | sort -V | tail -1)
STAGE1_BIN="$LATEST/blaise"
fi
if [ ! -x "$STAGE1_BIN" ]; then
echo "No stage-1 binary found. Set STAGE1=/path/to/blaise or add a release." >&2
exit 10
fi
echo "stage-1: $STAGE1_BIN"
echo "[1/5] rebuild + install RTL"
( cd rtl && make > /tmp/fp_rtl.log 2>&1 && make install >> /tmp/fp_rtl.log 2>&1 ) || {
echo "RTL_FAIL"; tail -5 /tmp/fp_rtl.log; exit 11;
}
echo "[2/5] stage-1 -> stage-2 IR"
"$STAGE1_BIN" --source compiler/src/main/pascal/Blaise.pas \
--unit-path compiler/src/main/pascal --unit-path rtl/src/main/pascal \
--emit-ir > /tmp/fp_stage2.ssa 2>/tmp/fp_stage2.err
if [ ! -s /tmp/fp_stage2.ssa ] || head -1 /tmp/fp_stage2.ssa | grep -qi 'error\|exception'; then
echo "STAGE2_IR_FAIL"
head -3 /tmp/fp_stage2.ssa
head -3 /tmp/fp_stage2.err
exit 1
fi
echo " stage-2 IR: $(wc -l < /tmp/fp_stage2.ssa) lines"
echo "[3/5] assemble + link stage-2 binary"
vendor/qbe/qbe -o /tmp/fp_stage2.s /tmp/fp_stage2.ssa 2>/tmp/fp_qbe.err || {
echo "QBE_FAIL"; cat /tmp/fp_qbe.err; exit 2;
}
gcc -o /tmp/fp_blaise2 /tmp/fp_stage2.s compiler/target/blaise_rtl.a 2>/tmp/fp_gcc.err || {
echo "GCC_FAIL"; cat /tmp/fp_gcc.err; exit 3;
}
echo "[4/5] stage-2 -> stage-3 IR (5min timeout)"
timeout 300 /tmp/fp_blaise2 --source compiler/src/main/pascal/Blaise.pas \
--unit-path compiler/src/main/pascal --unit-path rtl/src/main/pascal \
--emit-ir > /tmp/fp_stage3.ssa 2>/tmp/fp_stage3.err
RC=$?
if [ $RC -eq 124 ]; then
echo "STAGE3_TIMEOUT"
exit 4
elif [ $RC -eq 139 ]; then
echo "STAGE3_SEGFAULT"
exit 4
elif [ $RC -ne 0 ]; then
echo "STAGE3_FAIL rc=$RC"
head -3 /tmp/fp_stage3.err
exit 5
fi
echo " stage-3 IR: $(wc -l < /tmp/fp_stage3.ssa) lines"
echo "[5/5] compare"
DIFFLINES=$(diff /tmp/fp_stage2.ssa /tmp/fp_stage3.ssa | wc -l)
if [ $DIFFLINES -eq 0 ]; then
echo "FIXPOINT_OK"
exit 0
else
echo "FIXPOINT_DIFF lines=$DIFFLINES"
diff /tmp/fp_stage2.ssa /tmp/fp_stage3.ssa | head -20
exit 6
fi