The backend serves the editor, which is what it was for
This commit is contained in:
parent
e7bb643d9d
commit
7f44cc3c8f
55
NEXT.md
55
NEXT.md
@ -1,3 +1,58 @@
|
||||
# Where this is — 2026-09-14, end of session
|
||||
|
||||
**Branch `dev-loop` at `e7bb643`, tree clean, no branches but `dev-loop` and `master`, nothing running.**
|
||||
`dune test` is 232 checks and 0 failures in about 47 seconds; `dune build @checks` runs `@page`, `@x86` and
|
||||
`@cells` and is the thing to run deliberately. The survey is 103 MATCH / 0 DIFFER / 0 refused.
|
||||
|
||||
## The core thesis is done
|
||||
|
||||
`flan dev --x86` works. The hand-written backend now serves the editor, which is the only thing it was ever
|
||||
for, and it is roughly twice as fast as the LLVM path:
|
||||
|
||||
| | LLVM | `--x86` |
|
||||
|---|---|---|
|
||||
| `C-c C-c` at the socket | 62–66ms | **27–30ms** |
|
||||
| `C-x C-e` | 60–61ms | **24–25ms** |
|
||||
| codegen | `llc` 42–48ms | `as` **8.0–8.4ms** |
|
||||
| link | `ld` 9.7–11.4ms | `ld` 8.9–9.3ms |
|
||||
|
||||
Both rows were measured on this machine, because its `llc` is slower than the one `docs/BUILT.md` recorded.
|
||||
What the headline hides is where the remaining time now sits: `ld` did not move and is half the x86 build, and
|
||||
about 9ms of the round trip is the frontend re-checking the program — 14% of the LLVM loop but a third of this
|
||||
one. The next millisecond is in the linker, not the code generator.
|
||||
|
||||
## The one thing that does not work, and it is not small
|
||||
|
||||
**`flan dev --x86` requires `--two-process` and refuses the merged daemon.** A merged host is `-rdynamic`, so
|
||||
it exports every `flan.*` body, and those interpose the prelude bodies of the LLVM-built macro module the
|
||||
compiler loads into itself. An LLVM caller lands in an x86 body and takes SIGSEGV inside `flan.[clamp]` during
|
||||
the first macro expansion, before the program has started. `flan.abi.x86` does not guard this and was never
|
||||
meant to — a macro module deliberately carries no marker. `-Bsymbolic` is the wrong fix. The honest one is
|
||||
hidden visibility on a macro module's Flan bodies, and it wants its own lane. `start_merged`'s `--x86`
|
||||
plumbing is written and correct, just unreachable. See `docs/handoffs/HANDOFF-x86-devloop.md`.
|
||||
|
||||
## Still open, unchanged
|
||||
|
||||
**`ArithError` established no restarts**, for the mechanical reason in `docs/handoffs/HANDOFF-arith.md`: the
|
||||
runtime cannot push a restart frame on a program's behalf. The question is whether signal-and-die-with-a-location
|
||||
is enough, or whether `saturate` belongs on the cast arm alone.
|
||||
|
||||
**Frame descriptions are gated on `--debug`.** Correct in every build, free at runtime, and a release build is
|
||||
where a crash would most want them. One `if` in three places.
|
||||
|
||||
**The 2MB OFL font** `examples/text-codepoints-loading.flan` would like vendored. It runs without it and says so
|
||||
on screen.
|
||||
|
||||
## Settled this session, so nobody reopens it
|
||||
|
||||
`dune test` stays fast and slow checks stay opt-in. `@page`, `@x86` and `@cells` are aliases, `@checks` is the
|
||||
umbrella, and none of them is attached to `@runtest`. The reason is not cost in the abstract: the suite is run
|
||||
constantly, including by every lane, so a second added to the default run is paid hundreds of times. Quick
|
||||
tests for the inner loop, the full suite on purpose.
|
||||
|
||||
`tools/` is empty. Both sweep scripts were deleted — they existed only to convert lanes that branched before a
|
||||
rename, every such branch has merged, and both had stopped being able to tell a real hit from a false one.
|
||||
|
||||
# Where this is — 2026-09-14 morning, wrap-up
|
||||
|
||||
**Branch `dev-loop` at `0661e60`, working tree clean, every lane merged, nothing running.**
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user