joeylib2/make/support/iigs/clang-smoke.sh

65 lines
2.7 KiB
Bash
Executable file

#!/usr/bin/env bash
# clang-smoke.sh - End-to-end smoke test of the llvm-mos w65816 IIgs
# build path. Compiles a tiny C main that calls JoeyLib's ported asm
# (iigsInitRowLut), links it with clang-build.sh, runs it under MAME's
# apple2gs, and verifies the LUT the asm computed.
#
# This proves the whole toolchain end to end: clang -> llvm-mc ->
# link816 -> runnable IIgs image -> correct runtime result. Exit 0 on
# success. Needs the toolchain:iigs install (make exports its paths).
set -euo pipefail
: "${LLVM816_ROOT:?LLVM816_ROOT unset: run ./install.sh install toolchain:iigs, then use make or source toolchains/env.sh}"
: "${MAME:?MAME unset: run ./install.sh install emulator:iigs}"
: "${IIGS_ROMPATH:?IIGS_ROMPATH unset: run ./install.sh install emulator:iigs}"
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO="$(cd "$HERE/../../.." && pwd)"
RUN_IN_MAME="$LLVM816_ROOT/scripts/runInMame.sh"
[ -x "$RUN_IN_MAME" ] || { echo "clang-smoke: $RUN_IN_MAME missing" >&2; exit 1; }
# runInMame.sh takes MAME and MAME_ROMPATH from the environment, so it
# runs the installer's patched MAME against the installer's ROM set.
export MAME
export MAME_ROMPATH="$IIGS_ROMPATH"
tmp="$(mktemp -d)"
trap 'rm -rf "$tmp"' EXIT
# gRowOffsetLut[5] = 5 * 160 = 800 = 0x0320. Publish it to a 24-bit
# address MAME can read back (bank 2 is clear of IIgs ROM scribbling).
cat > "$tmp/smoke.c" <<'EOF'
#include <stdint.h>
extern void iigsInitRowLut(void);
extern uint16_t gRowOffsetLut[];
int main(void) {
iigsInitRowLut();
*(volatile uint16_t *)0x025000 = gRowOffsetLut[5];
return 0;
}
EOF
# runInMame.sh raw-loads the image at $00:1000 and jumps there, so the
# smoke needs a BARE binary -- NOT the ExpressLoad GS/OS OMF (crt0Gsos.o,
# Loader-relocated) that clang-build.sh now emits. Build it directly with
# the bare crt0.o at --text-base 0x1000. link816 dead-strips the unused
# runtime, so offering libgcc/libc/extras is free.
echo "[clang-smoke] building bare smoke.bin (crt0.o, --text-base 0x1000)"
RT="$LLVM816_ROOT/runtime"
CLANG="$LLVM816_ROOT/tools/llvm-mos-build/bin/clang"
LLVM_MC="$LLVM816_ROOT/tools/llvm-mos-build/bin/llvm-mc"
LINK="$LLVM816_ROOT/tools/link816"
"$CLANG" --target=w65816 -O2 -ffreestanding -ffunction-sections \
-I"$RT/include" -c "$tmp/smoke.c" -o "$tmp/smoke.o"
"$LLVM_MC" -arch=w65816 -filetype=obj \
"$REPO/src/iigs/joeyDraw.s" -o "$tmp/joeyDraw.o"
"$LINK" -o "$tmp/smoke.bin" --text-base 0x1000 \
"$RT/crt0.o" "$RT/libgcc.o" "$RT/libc.o" "$RT/extras.o" \
"$tmp/smoke.o" "$tmp/joeyDraw.o"
echo "[clang-smoke] running under MAME apple2gs, checking gRowOffsetLut[5] == 0x0320"
bash "$RUN_IN_MAME" "$tmp/smoke.bin" --check 0x025000=0320
echo "[clang-smoke] PASS"