37 lines
2.0 KiB
Markdown
37 lines
2.0 KiB
Markdown
# Handoff — the x86 backend, wired to the dev loop
|
||
|
||
Branch `dev-loop`, worktree `agent-aaf84e55296df121c`, from `f459352`. This is items 1, 2 and 3 of
|
||
`HANDOFF-x86-redef.md`'s "What remains": the new-name path, the transient thunk, and the wiring that lets
|
||
`flan dev` choose the backend for a host and its modules together.
|
||
|
||
**Status: in progress.** This file is written before the work rather than after it, so that a session that ends
|
||
early leaves its plan behind rather than nothing.
|
||
|
||
## Why
|
||
|
||
`llc` is 15–17ms of a ~19ms `C-c C-c` (`docs/BUILT.md`). The hand-written backend exists to replace that
|
||
number and has never been given the chance: `--x86` is read only by `flan build`'s argument list, and the
|
||
daemon builds both halves through LLVM. Until it is wired, the backend saves nothing.
|
||
|
||
## The plan, in the order it will be committed
|
||
|
||
1. **The new-name path** in `X86.redefinition`. A `slot` predicate beside `fnctx.ext`, a fourth `loc` case
|
||
for a module-local slot, `flan_dev_cell` / `flan_dev_global` calls in `flan_reload_install`, and an init
|
||
image for a new global. `test/test_reload.ml`'s v3/v4/v5 fixtures already exist and currently assert a
|
||
refusal; the transcript replaces it.
|
||
2. **The transient thunk**: `flan_reload_call` and the `@flan_reload_transient` marker, with an x86 analogue
|
||
of `emit.ml`'s `m.nstr` condition — a module that holds a string literal can never claim to be transient,
|
||
because the string outlives the call and the agent unloads the mapping.
|
||
3. **The wiring**: an `x86` field on `Session.t` and on `Session.change`, set once in `Dev.start` from
|
||
`flan dev --x86`, exactly parallel to `debug` — whose own comment already says why both ends have to come
|
||
from one flag. Never a fallback: if `X86.redefinition` refuses, the daemon reports the refusal. A silent
|
||
fallback to LLVM is precisely the crossed pair `flan.abi.x86` exists to refuse.
|
||
|
||
## Decisions, recorded as they are made
|
||
|
||
(to be filled in)
|
||
|
||
## Measurements
|
||
|
||
(to be filled in: emit / assemble / link / dlopen, both backends)
|