3.9 KiB
3.9 KiB
Phase 11.7 – JIT Complete Plan (Cranelift)
Goal
- Ship a complete JIT backend (Cranelift) for MIR Core‑15 with Semantics layer as the single source of truth, GC sync/async support, and full Box/Extern integration. Keep DX simple and cross‑platform.
Milestones
- Bootstrap (Infra + Skeleton)
- Add backend module:
src/backend/cranelift/{mod.rs,context.rs,lower.rs,jit.rs,object.rs} - Context: host ISA, FunctionBuilder, Module (JIT/Object) setup helpers
- Runner:
--backend craneliftexecution path; feature flag reuse (cranelift-jit) - Minimal ops: Const i64/f64/bool/null/string → CLIF values; Return; straight‑line add/sub
- Smoke:
apps/tests/ny-echo-litereturns 0 via JIT
- Core MIR‑15 Lowering (Parity with VM)
- Control: Jump/Branch/Phi, Load/Store (alloca on entry; i1↔i64 widen/narrow)
- Unary/Binary/Compare: int/float/ptr eq/ne; logical and/or via to_bool
- TypeOp (when needed) + pointer/int casts (handle→i64/i8* via ABI helpers)
- Strings: concat via NyRT shims (
nyash.string.concat_*) - BoxCall (by‑id): fixed/tagged args (<=4) + vector path; handle‑first returns (i64/ptr)
- ExternCall:
env.console.*,env.debug.trace,console.readLinevia NyRT shims - Smokes: array/map/vinvoke(size/ret), echo; compare outputs with VM
- GC Cooperation
- Sync barriers: insert read/write barriers at Load/Store & NewBox as per VM semantics
- Async safepoints: at call sites/loop backedges; NyRT entry glue to yield if required
- Tests: targeted barrier smoke (array/map mutations) + perf sanity (no excessive barriers)
- Parity + Stability
- UnsupportedLegacyInstruction: maintain strict mode; allow env override for debug
- Error reporting: source op pretty‑print, MIR value ids in error messages
- Logging:
NYASH_CLI_VERBOSE=1shows JIT compile stages + object sizes (optional) - Doc/Doctor script:
tools/doctor.ps1/.shfor quick env checks (optional nice‑to‑have)
- AOT (Optional within 11.7 if time)
cranelift-objectemit:.ofor main; link with NyRT → exe (tools/build_cl.*)- Windows: clang/lld link; Linux: cc link; parity with LLVM’s scripts
Instruction Coverage (MIR Core‑15)
- Const, UnaryOp, BinOp, Compare, TypeOp
- Load, Store, Phi, Jump, Branch, Return
- Call, NewBox, BoxCall, ExternCall
ABI & Shims
- Handle‑first: receiver/values normalized to i64; ptr/int casts via helpers
- NyRT shims used:
nyash.console.*,nyash.debug.trace,nyash.console.readline,nyash_string_new,nyash.string.concat_*,nyash_array_*_h,nyash.instance.*_h, plugin invoke (by‑id tagged, vector variants)
Semantics Integration (new in 11.7)
- Add
Semanticstrait as unified MIR semantics API. - Provide
SemanticsVM(exec) andSemanticsClif(lower) so the same MIR walks yield identical behavior across VM and JIT. - Use
semantics::MirInterpreterfor parity tests; prefer zero‑cost abstractions with static dispatch.
Status Notes (2025‑09‑01)
- LLVM AOT: closed for now due to Windows dependency weight; Cranelift is the mainline.
- VM: safepoint/barrier/scheduler wired and observable (CountingGc).
- JIT:
nyash.rt.checkpoint/nyash.gc.barrier_writesymbols are available via NyRT; LowerCore needs to emit safepoints and barriers; Await lowering pending.
Deliverables
- Code: Cranelift backend files + runner integration
- Tools: build/run scripts for JIT/AOT; updated smokes to exercise CL route
- Docs: this plan + CURRENT_TASK.md; brief README how to run JIT
Risks & Mitigations
- Pointer/int mismatch → normalize via i64/ptr helpers in one place; add asserts
- Barrier placement overhead → start with conservative placement; measure; trim if safe
- Windows toolchain variance → Cranelift avoids external LLVM; keep MSVC only
Timeline (indicative)
- Week 1: Milestone 1 + 2 (most ops) → basic smokes green
- Week 2: GC barriers + safepoints, full parity sweep; docs/tools polish
- Optional: AOT via cl‑object emit & link scripts