#!/bin/sh
# DF-5580 final verification battery (runs on the guest, ~17 min total).
# All exit codes captured to files (remote login shell is csh; $? quoting
# is unreliable, so each phase writes its own status).
cd /root/df5580 || exit 1
rm -f status_*.txt

# 1. baseline userspace differential, 2^31 random + fixed sr64 battery
cc -O2 -Wall -o df5580_diff df5580_diff.c || exit 1
(time ./df5580_diff x 2147483648 0x243F6A8885A308D3 0x13198A2E03707344) > run.log 2>&1
echo "baseline_rc=$?" > status_run.txt

# 2. baseline again, different seeds (variance run)
(time ./df5580_diff x 2147483648 0xB7E151628AED2A6A 0xBF7158809CF4F3C7) > run.2.log 2>&1
echo "baseline2_rc=$?" > status_run2.txt

# 3. fixed-source differential, same seeds as (1)
cc -O2 -Wall -o df5580_diff_fixed df5580_diff_fixed.c || exit 1
(time ./df5580_diff_fixed x 2147483648 0x243F6A8885A308D3 0x13198A2E03707344) > run_fixed.log 2>&1
echo "fixed_rc=$?" > status_run_fixed.txt

# 4. UBSan abort-mode baseline (expect: UB fires, abort -> rc!=0)
cc -O1 -g -fsanitize=shift -fno-sanitize-recover=shift -c df5580_diff.c -o df5580_diff_ubab.o
cc -o df5580_ubsan_ab df5580_diff_ubab.o ubsan_stub.o
./df5580_ubsan_ab -e > ub_abort.log 2>&1
echo "ubsan_baseline_rc=$?" > status_ub_abort.txt

# 5. UBSan recover-mode census, edge+exhaustive+sr64 (expect: many events)
cc -O1 -g -fsanitize=shift -c df5580_diff.c -o df5580_diff_ubrec.o
cc -o df5580_ubsan_rec2 df5580_diff_ubrec.o ubsan_stub.o
./df5580_ubsan_rec2 x 0 > ub_rec.log 2>&1
echo "ubsan_rec_rc=$?" > status_ub_rec.txt

# 6. UBSan abort-mode FIXED source (expect: clean, rc=0)
cc -O1 -g -fsanitize=shift -fno-sanitize-recover=shift -c df5580_diff_fixed.c -o df5580_diff_fixed_ubab.o
cc -o df5580_ubsan_fixed_ab df5580_diff_fixed_ubab.o ubsan_stub.o
./df5580_ubsan_fixed_ab -e > ub_abort_fixed.log 2>&1
echo "ubsan_fixed_rc=$?" > status_ub_abort_fixed.txt

echo "=== statuses ==="
cat status_*.txt
echo "=== run.log tail ==="
tail -3 run.log
echo "=== run.2.log tail ==="
tail -3 run.2.log
echo "=== run_fixed.log tail ==="
tail -3 run_fixed.log
echo "=== ub_abort.log ==="
cat ub_abort.log
echo "=== ub census by site ==="
grep UBSAN-FIRED ub_rec.log | head -2
grep UBSAN-FIRED ub_rec.log | wc -l
grep UBSAN-FIRED ub_rec.log | sed -E 's/.*udivti3[.]c/udivti3.c/' | cut -d: -f1-2 | cut -d' ' -f1 | sort | uniq -c | sort -rn
echo "=== ub_abort_fixed.log tail ==="
tail -3 ub_abort_fixed.log
