3.4 KiB
3.4 KiB
Cranelift AOT Smoke (Windows‑first)
Purpose
- Validate the Cranelift‑based AOT pipeline end‑to‑end:
- Build
nyashwithcranelift-jitfeature. - Emit an object via
NYASH_AOT_OBJECT_OUTwhile running--backend cranelift. - Link the object with NyRT into a runnable binary (via LinkerBox or helper scripts).
- Run the binary and assert output.
- Build
Prerequisites
- Build flags:
cargo build --release --features cranelift-jit - Windows:
- Prefer MSVC
link.exe(Developer Command Prompt or properly set env). - Fallback:
lld-linkinPATH. - PowerShell available for
tools/aot_smoke_cranelift.ps1.
- Prefer MSVC
- Unix (optional): system linker (
ld), orlld/mold, andtools/aot_smoke_cranelift.sh.
Environment toggles
NYASH_CLIF_ARRAY_SMOKE=1: run array smoke (simple Result check).NYASH_CLIF_ARRAY_RET_SMOKE=1: run “return value” array smoke.NYASH_CLIF_ECHO_SMOKE=1: run echo smoke (stdin → stdout).NYASH_CLIF_VINVOKE_SMOKE=1: run variable‑length invoke smoke (plugins required).NYASH_CLIF_VINVOKE_RET_SMOKE=1: run vinvoke return/size smokes (plugins required).NYASH_DISABLE_PLUGINS=1: disable plugin‑dependent smokes.NYASH_LINK_VERBOSE=1: print final link command.
Pseudo run
- Script:
tools/aot_smoke_cranelift.sh/tools/aot_smoke_cranelift.ps1 - Typical invocation:
./tools/aot_smoke_cranelift.sh release
Pseudo output (example)
[clif-aot-smoke] building nyash (release, feature=cranelift-jit)...
[clif-aot-smoke] emitting object via --backend cranelift ...
[clif-aot-smoke] OK: object generated: /ABS/path/target/aot_objects/core_smoke.obj (1536 bytes)
[clif-aot-smoke][win] linking app_clif.exe using link.exe
[clif-aot-smoke][win] entry=nyash_main subsystem=CONSOLE runtime=nyrt.lib
[clif-aot-smoke] running app_clif.exe ...
[clif-aot-smoke] output: Result: 3
[clif-aot-smoke] OK: core smoke passed
[clif-aot-smoke] skipping array smoke (set NYASH_CLIF_ARRAY_SMOKE=1 to enable)
[clif-aot-smoke] skipping echo smoke (set NYASH_CLIF_ECHO_SMOKE=1 to enable)
[clif-aot-smoke] skipping vinvoke smokes (set NYASH_CLIF_VINVOKE_SMOKE=1 / NYASH_CLIF_VINVOKE_RET_SMOKE=1)
What the script does (intended)
- Build:
cargo build --release --features cranelift-jit
- Emit object:
- Ensure stable output dir:
mkdir -p target/aot_objects NYASH_AOT_OBJECT_OUT="$PWD/target/aot_objects/core_smoke.obj" ./target/release/nyash --backend cranelift apps/hello/main.hako > /dev/null || true- Validate file exists and non‑zero size.
- Ensure stable output dir:
- Link:
- Windows: PowerShell
tools/aot_smoke_cranelift.ps1 -Mode release - Unix:
tools/aot_smoke_cranelift.sh release
- Windows: PowerShell
- Run and verify:
./app_clif[.exe]→ expect a line includingResult:.
Windows specifics
- Prefer MSVC
link.exe; auto‑fallback tolld-linkif present. - If neither available, fail with a helpful message to open a Developer Command Prompt or install LLVM lld.
- Use
.objextension for emitted object; still accept.oif emitted by a GNU toolchain.
Exit codes
- 0: all enabled smokes passed
- 1: object missing/empty, or unexpected program output
- 2: toolchain missing (no Cranelift build or no linker)
Future alignment with LinkerBox
- This smoke is the acceptance test for LinkerBox’s AOT path on Cranelift:
- Same entrypoint (
nyash_main), runtime linkage (nyrt.lib/libnyrt.a), and CLI env (NYASH_LINKER,NYASH_LINK_FLAGS,NYASH_LINK_VERBOSE). - When LinkerBox becomes default, keep CLI stable and swap implementation behind it.
- Same entrypoint (