# Milestone: V3 self-hosts (byte-identical fixpoint) Tags `v3-fixpoint`, `v3-bootstrap`, `v3-selfhosting`. Suite **111/111**. ## What it means `m2compiler-V3` now compiles its **own complete source set** with itself, reproducing its image **byte for byte**: ``` bootstrap/fixpoint.sh Stage 1 gm2 -fiso builds V3 (CR -m) -> m2s1 Stage 2 m2s1 compiles SymTab QbeGen M2S M2P M2 -> stage2.ssa -> m2s2 Stage 3 m2s2 compiles the same set -> stage3.ssa cmp -> FIXPOINT OK (1,991,439 bytes) ``` The compiler no longer needs GNU Modula-2 except as a one-time seed for Stage 1; Stage 2 onward is V3 all the way down. ## The pipeline - **Frontend**: Coco/R grammar (`src/M2.atg` → `M2S` scanner, `M2P` parser, `M2` driver). - **Symbol table** (`SymTab`) + **QBE backend** (`QbeGen`) → SSA text. - **`qbe` → `cc`** (with `runtime/syslib/shim.c`). - Two compiler generations coexist: gm2 builds it for the seed; V3 rebuilds it thereafter. ## Building blocks delivered along the way Language: scalars, composites (arrays/records/sets/pointers), control flow, procedures (value/VAR/open/nested + static links/FORWARD), separate compilation (DEFINITION/IMPLEMENTATION, IMPORT, opaque), 64-bit ints, `ADDRESS`/`ADR`/`SIZE`, procedure types + indirect calls, Wirth-style nested modules, short-circuit `AND`/`OR`, `BITSET`, typed set constructors, `HALT`, and GNU-compatible literals (`0x`, octal char, `LENGTH`/`ORDL`/`CAP`, `&`/`~`). Runtime/ABI: NUL-terminated CHAR arrays (terminator slot at index = count), inline record array fields, heap/stack descriptor initialisation (nested arrays included), string lib (`Strings`), `FileIO` (host for Stage 1; self-hosted `runtime/syslib/FileIO` for Stage 2+), C shim. ## Reproduce ```sh cd /home/eric/Projets/Projets-Modula2/MyWork/m2compiler-V3 ./bootstrap/fixpoint.sh # FIXPOINT OK cd compiler && ./build.sh && ./run_tests.sh # 111/111 ``` ## Deliberate divergences (per plan) No generics/interfaces, no ARC/exceptions, QBE backend is terminal (no native codegen), Linux only, and some GNU/classic conveniences accepted for self-hosting. `SYSTEM` facilities are built-ins, not an importable module. ## Where to go next - Make cross-stage `FileIO` selection explicit; `M2make`-driven builds. - Broaden the stdlib; the Unicode step from `docs/plan.md` (UCHAR/ UString). - Optional native backend / additional targets (Blaise parity).