Drop the compiler image from no-eval binaries (footprint)

An AOT-compiled app only needs the analyzer/back end at runtime to compile from
source — eval / load-string / load-file. Macros are expanded at build time and a
require of a baked namespace no-ops, so a closed app that never compiles at runtime
carries the compiler image (~0.8MB) as dead weight.

Under --tree-shake, when reachability is trustworthy (no bail) and no reachable code
references eval/load-string/load-file/load-reader/load, omit host/chez/seed/image.ss
+ compile-eval.ss from the runtime manifest. bld-tree-shake returns the flag
alongside the shaken forms; bld-emit-runtime filters the manifest.

Measured: build-app 9.84MB -> 9.05MB, still runs. Safety verified: an app that evals
keeps the compiler (eval is a bail + compile ref) and eval works at runtime.
build-smoke asserts the compiler is gone in the no-eval app; full make test green.
This commit is contained in:
Yogthos 2026-06-23 20:07:46 -04:00
parent 20c5b92ea8
commit 3c5d548b70
3 changed files with 61 additions and 35 deletions

View file

@ -92,4 +92,8 @@ fi
if grep -q 'def-var! "app.util" "twice"' "$out.build/flat.ss"; then
echo " FAIL: --tree-shake did not drop the unreachable twice macro"; exit 1
fi
echo "build smoke: passed (release + optimized + direct-link + tree-shake)"
# The app never evals, so the compiler image (analyzer/back end) is dropped.
if grep -q 'def-var! "jolt.analyzer"' "$out.build/flat.ss"; then
echo " FAIL: --tree-shake kept the compiler image in a no-eval app"; exit 1
fi
echo "build smoke: passed (release + optimized + direct-link + tree-shake + compiler-drop)"