Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

<!-- status-snapshot:begin -->
<!-- generated by script/status/snapshot.php from docs/status-snapshot.json (#36395) — do not hand-edit -->
**Snapshot (2026-09-04, from [`docs/status-snapshot.json`](docs/status-snapshot.json)):** self-host spine **8197** / **8197** · capability matrix **4054** rows (VM yes **4021**, JIT **1883**, AOT **1737**) · differential cases **296** · apps corpus **1**/**12** ready · VM driver probe target ~**20**ms · local CI streak **1**d ([#36401](https://github.com/PurHur/php-compiler/issues/36401))
**Snapshot (2026-09-04, from [`docs/status-snapshot.json`](docs/status-snapshot.json)):** self-host spine **8198** / **8198** · capability matrix **4054** rows (VM yes **4021**, JIT **1883**, AOT **1737**) · differential cases **296** · apps corpus **1**/**12** ready · VM driver probe target ~**20**ms · local CI streak **1**d ([#36401](https://github.com/PurHur/php-compiler/issues/36401))

## Current implementation status

Expand All @@ -22,7 +22,7 @@
| **VM (`phpc run`)** | ✅ Production-shaped for dev/CI | Broadest language coverage; reference executor and JIT/AOT fallback |
| **AOT (`phpc build`)** | ✅ For curated subset | Standalone binaries for examples **000–009** and small CGI apps; Composer stacks tracked in [#36382](https://github.com/PurHur/php-compiler/issues/36382) / [#36380](https://github.com/PurHur/php-compiler/issues/36380) |
| **JIT (`bin/jit.php`)** | 🚧 Partial | LLVM IR for many constructs; **MCJIT execute** still flaky ([#98](https://github.com/PurHur/php-compiler/issues/98)) |
| **Self-host north star** | 🚧 | **Release scope:** static `phpc` builds user/Composer projects ([ADR #36393](docs/adr/36393-selfhost-user-payoff.md)) · spine **8197** / **8197** ✅ · M3 HelloWorld `emit_path=native` · `BOOTSTRAP_M4_REQUIRE_NATIVE_EMIT=1` refuses COPY ([#36146](https://github.com/PurHur/php-compiler/issues/36146)) · daily `north-star5-verify-fast` · `--strict` / gen-2==gen-3 are research, not release gates |
| **Self-host north star** | 🚧 | **Release scope:** static `phpc` builds user/Composer projects ([ADR #36393](docs/adr/36393-selfhost-user-payoff.md)) · spine **8198** / **8198** ✅ · M3 HelloWorld `emit_path=native` · `BOOTSTRAP_M4_REQUIRE_NATIVE_EMIT=1` refuses COPY ([#36146](https://github.com/PurHur/php-compiler/issues/36146)) · daily `north-star5-verify-fast` · `--strict` / gen-2==gen-3 are research, not release gates |

### What you can rely on today

Expand All @@ -38,7 +38,7 @@ Counts from `php script/bootstrap-spine-count.php` / `docs/status-snapshot.json`
| Milestone | Status | What it means |
|-----------|--------|----------------|
| **M0–M1** | ✅ | `compiler_minimal` + compile-smoke bundles link and run natively |
| **M2** | ✅ **8197** / **8197** | Full Phase A inventory in spine smoke |
| **M2** | ✅ **8198** / **8198** | Full Phase A inventory in spine smoke |
| **M3** | ✅ / 🚧 | HelloWorld `emit_path=native` via gen-0 argv helper ([#22178](https://github.com/PurHur/php-compiler/issues/22178)); `BOOTSTRAP_M3_REQUIRE_NATIVE_EMIT=1` refuses sidecar COPY ([#21860](https://github.com/PurHur/php-compiler/issues/21860), [#36146](https://github.com/PurHur/php-compiler/issues/36146)) |
| **M4** | 🚧 | `BOOTSTRAP_M4_REQUIRE_NATIVE_EMIT=1` refuses sidecar COPY ([#36146](https://github.com/PurHur/php-compiler/issues/36146)); default `bootstrap-loop-probe` may exit **2** when the ladder is degraded — not a false OK |
| **M5** | 🚧 | Daily: `make north-star5-verify-fast` · before bootstrap merges: `make north-star5-verify ARGS=--strict` |
Expand Down Expand Up @@ -255,7 +255,7 @@ Full matrices (auto-generated): [`docs/capabilities.md`](docs/capabilities.md) (

**Self-host (experimental, not “stable app” scope)**

See [Current implementation status](#current-implementation-status-july-2026) for the full M0–M5 ladder. Summary: M0–M5 bootstrap gates ✅; spine **8197** / **8197**; M3 strict native + inventory argv ✅; M4 full `bootstrap-loop-probe` ✅; M5 **`north-star5-verify-fast`** (daily) ✅ — **`--strict` red at step 4a2** ([#21417](https://github.com/PurHur/php-compiler/issues/21417)) ([#1492](https://github.com/PurHur/php-compiler/issues/1492), [#8559](https://github.com/PurHur/php-compiler/issues/8559)). Recent: native spine bundle probe, fast VM execute smoke ([#2201](https://github.com/PurHur/php-compiler/issues/2201)), `GeneratorYieldSourceMarker` spine unit ([#10356](https://github.com/PurHur/php-compiler/pull/10356)).
See [Current implementation status](#current-implementation-status-july-2026) for the full M0–M5 ladder. Summary: M0–M5 bootstrap gates ✅; spine **8198** / **8198**; M3 strict native + inventory argv ✅; M4 full `bootstrap-loop-probe` ✅; M5 **`north-star5-verify-fast`** (daily) ✅ — **`--strict` red at step 4a2** ([#21417](https://github.com/PurHur/php-compiler/issues/21417)) ([#1492](https://github.com/PurHur/php-compiler/issues/1492), [#8559](https://github.com/PurHur/php-compiler/issues/8559)). Recent: native spine bundle probe, fast VM execute smoke ([#2201](https://github.com/PurHur/php-compiler/issues/2201)), `GeneratorYieldSourceMarker` spine unit ([#10356](https://github.com/PurHur/php-compiler/pull/10356)).

**What we do not target in v1.x**

Expand Down
315 changes: 161 additions & 154 deletions docs/bootstrap-inventory.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ Regenerate: `php script/bootstrap-inventory.php`

| Metric | Count |
|--------|------:|
| PHP files on vm.php path | 8197 |
| Phase A inventory files (M2 ratio SSOT) | 8197 |
| PHP files on vm.php path | 8198 |
| Phase A inventory files (M2 ratio SSOT) | 8198 |
| Phase A ratio-deferred paths | 0 |
| Source constructs flagged (blockers) | 0 |
| Source constructs flagged (warnings) | 25974 |
| Source constructs flagged (warnings) | 25976 |

## Compiler CFG gaps (`lib/Compiler.php`)

Expand Down Expand Up @@ -7059,6 +7059,7 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag
| `lib/JIT/Concern/CompileBlockInternal.php` | 0 | 51 |
| `lib/JIT/Concern/EmitJitReturn.php` | 0 | 2 |
| `lib/JIT/Concern/InitJitMethodCall.php` | 0 | 3 |
| `lib/JIT/Concern/TernaryJumpIfEchoMergeAndReturnPhi.php` | 0 | 2 |
| `lib/JIT/Context.php` | 0 | 334 |
| `lib/JIT/DatePeriodForeachSnapshot.php` | 0 | 3 |
| `lib/JIT/DeprecatedCallGuard.php` | 0 | 1 |
Expand Down Expand Up @@ -50462,156 +50463,156 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag
### `lib/JIT.php`

**Warnings** (review for bootstrap subset):
- new JIT\Call\ExternalMethod (line 336)
- new JIT\Scope (line 365)
- new Operand\Literal (line 1671)
- new Operand\Literal (line 1687)
- new JIT\Call\Native (line 2165)
- new Variable (line 3171)
- new JIT\Call\Native (line 3197)
- new Variable (line 3287)
- new JIT\Call\Vararg (line 3314)
- new JIT\Call\Native (line 3324)
- new JIT\Call\Native (line 3613)
- new JIT\Variable (line 3853)
- new JIT\Call\Native (line 3870)
- new JIT\Call\Native (line 3915)
- new JIT\Call\Native (line 3985)
- new JIT\Call\Native (line 4027)
- new JIT\Call\Native (line 4072)
- new JIT\Call\Native (line 4127)
- new JIT\Call\Native (line 5314)
- new JIT\Call\Native (line 5345)
- new JIT\Call\Native (line 5392)
- new JIT\Call\Native (line 5466)
- new JIT\Call\Native (line 5520)
- new JIT\Call\Native (line 5607)
- new JIT\Call\Native (line 6100)
- new JIT\Call\Native (line 6131)
- new JIT\Call\Native (line 6167)
- new JIT\Call\Native (line 6202)
- new JIT\Call\Native (line 6237)
- new JIT\Call\Native (line 6272)
- new JIT\Call\Native (line 6384)
- new JIT\Call\Native (line 7610)
- new JIT\Call\Native (line 7648)
- new JIT\Call\Native (line 7682)
- new JIT\Call\Native (line 7803)
- new JIT\Call\Native (line 8453)
- new JIT\Call\Native (line 8525)
- new Operand\Literal (line 9740)
- new Type (line 11147)
- new Type (line 11182)
- new Type (line 11237)
- new Type (line 11412)
- new Type (line 11458)
- new Variable (line 11759)
- new Variable (line 11782)
- new Variable (line 11811)
- new Variable (line 11837)
- new Variable (line 11862)
- new Variable (line 11907)
- new Type (line 11915)
- new Variable (line 11935)
- new Type (line 11944)
- new Variable (line 11963)
- new Type (line 11971)
- new Variable (line 11997)
- new Type (line 12005)
- new Variable (line 12028)
- new Variable (line 12052)
- new Operand\Literal (line 12186)
- new CompileError (line 13073)
- new CompileError (line 13237)
- new Variable (line 13359)
- new Variable (line 13403)
- new Variable (line 13463)
- new Variable (line 14159)
- new Variable (line 14179)
- new Variable (line 14200)
- new Variable (line 14252)
- new JIT\Call\ForeachIndexedClosureCall (line 14734)
- new Variable (line 14823)
- new Variable (line 14853)
- new Variable (line 14872)
- new Variable (line 14902)
- new Variable (line 14939)
- new Variable (line 14959)
- new Variable (line 14972)
- new Variable (line 15015)
- new JIT\Variable (line 16848)
- new JIT\Variable (line 16911)
- new OpCode (line 16962)
- new Variable (line 16963)
- new VM\Variable (line 16986)
- new Variable (line 17017)
- new Variable (line 17052)
- new Variable (line 17121)
- new Variable (line 17165)
- new Variable (line 17210)
- new Variable (line 17223)
- new Variable (line 17237)
- new OpCode (line 17259)
- new Variable (line 17260)
- new Variable (line 17556)
- new Variable (line 17666)
- new Variable (line 18075)
- new Variable (line 18119)
- new Variable (line 18171)
- new Variable (line 18182)
- new Variable (line 18193)
- new JIT\Call\ExternalMethod (line 338)
- new JIT\Scope (line 367)
- new Operand\Literal (line 617)
- new Operand\Literal (line 633)
- new JIT\Call\Native (line 1111)
- new Variable (line 2117)
- new JIT\Call\Native (line 2143)
- new Variable (line 2233)
- new JIT\Call\Vararg (line 2260)
- new JIT\Call\Native (line 2270)
- new JIT\Call\Native (line 2559)
- new JIT\Variable (line 2799)
- new JIT\Call\Native (line 2816)
- new JIT\Call\Native (line 2861)
- new JIT\Call\Native (line 2931)
- new JIT\Call\Native (line 2973)
- new JIT\Call\Native (line 3018)
- new JIT\Call\Native (line 3073)
- new JIT\Call\Native (line 4260)
- new JIT\Call\Native (line 4291)
- new JIT\Call\Native (line 4338)
- new JIT\Call\Native (line 4412)
- new JIT\Call\Native (line 4466)
- new JIT\Call\Native (line 4553)
- new JIT\Call\Native (line 5046)
- new JIT\Call\Native (line 5077)
- new JIT\Call\Native (line 5113)
- new JIT\Call\Native (line 5148)
- new JIT\Call\Native (line 5183)
- new JIT\Call\Native (line 5218)
- new JIT\Call\Native (line 5330)
- new JIT\Call\Native (line 6556)
- new JIT\Call\Native (line 6594)
- new JIT\Call\Native (line 6628)
- new JIT\Call\Native (line 6749)
- new JIT\Call\Native (line 7399)
- new JIT\Call\Native (line 7471)
- new Operand\Literal (line 8686)
- new Type (line 10093)
- new Type (line 10128)
- new Type (line 10183)
- new Type (line 10358)
- new Type (line 10404)
- new Variable (line 10705)
- new Variable (line 10728)
- new Variable (line 10757)
- new Variable (line 10783)
- new Variable (line 10808)
- new Variable (line 10853)
- new Type (line 10861)
- new Variable (line 10881)
- new Type (line 10890)
- new Variable (line 10909)
- new Type (line 10917)
- new Variable (line 10943)
- new Type (line 10951)
- new Variable (line 10974)
- new Variable (line 10998)
- new Operand\Literal (line 11132)
- new CompileError (line 12019)
- new CompileError (line 12183)
- new Variable (line 12305)
- new Variable (line 12349)
- new Variable (line 12409)
- new Variable (line 13105)
- new Variable (line 13125)
- new Variable (line 13146)
- new Variable (line 13198)
- new JIT\Call\ForeachIndexedClosureCall (line 13680)
- new Variable (line 13769)
- new Variable (line 13799)
- new Variable (line 13818)
- new Variable (line 13848)
- new Variable (line 13885)
- new Variable (line 13905)
- new Variable (line 13918)
- new Variable (line 13961)
- new JIT\Variable (line 15794)
- new JIT\Variable (line 15857)
- new OpCode (line 15908)
- new Variable (line 15909)
- new VM\Variable (line 15932)
- new Variable (line 15963)
- new Variable (line 15998)
- new Variable (line 16067)
- new Variable (line 16111)
- new Variable (line 16156)
- new Variable (line 16169)
- new Variable (line 16183)
- new OpCode (line 16205)
- new Variable (line 16206)
- new Variable (line 16502)
- new Variable (line 16612)
- new Variable (line 17021)
- new Variable (line 17065)
- new Variable (line 17117)
- new Variable (line 17128)
- new Variable (line 17139)
- new Variable (line 17159)
- new Variable (line 17222)
- new Variable (line 17285)
- new Variable (line 17318)
- new OpCode (line 17346)
- new Variable (line 17347)
- new Variable (line 17406)
- new OpCode (line 17414)
- new Variable (line 17415)
- new Variable (line 17444)
- new Variable (line 17479)
- new Variable (line 17519)
- new OpCode (line 17534)
- new Variable (line 17535)
- new Variable (line 17603)
- new Variable (line 17620)
- new Variable (line 17627)
- new OpCode (line 17637)
- new Variable (line 17638)
- new Variable (line 17756)
- new Variable (line 17787)
- new Variable (line 17855)
- new Operand\Literal (line 17864)
- new Variable (line 17879)
- new Variable (line 18213)
- new Variable (line 18276)
- new Variable (line 18339)
- new Variable (line 18372)
- new OpCode (line 18400)
- new Variable (line 18401)
- new Variable (line 18460)
- new OpCode (line 18468)
- new Variable (line 18469)
- new Variable (line 18498)
- new Variable (line 18533)
- new Variable (line 18573)
- new OpCode (line 18588)
- new Variable (line 18589)
- new Variable (line 18657)
- new Variable (line 18674)
- new Variable (line 18681)
- new OpCode (line 18691)
- new Variable (line 18692)
- new Variable (line 18810)
- new Variable (line 18841)
- new Variable (line 18909)
- new Operand\Literal (line 18918)
- new Variable (line 18933)
- new Variable (line 19267)
- new JIT\Call\VmCoerceVariableToString (line 19416)
- new JIT\Call\NoOpConstruct (line 19619)
- new JIT\Call\IncludePathResolverResolve (line 19790)
- new Operand\Literal (line 19906)
- new Operand\Literal (line 19908)
- new Operand\Literal (line 19919)
- new Operand\Literal (line 19926)
- new JIT\Call\RuntimeVariableStaticMethodCall (line 19967)
- new JIT\Call\RuntimeVariableStaticMethodCall (line 19999)
- new JIT\Call\RuntimeIndirectStaticMethodCall (line 20042)
- new JIT\Call\NestedJitCompileScopeIsActiveTrue (line 20070)
- new JIT\Call\EmitCatchableError (line 20111)
- new JIT\Call\RuntimeIndirectStaticMethodCall (line 20294)
- new JIT\Call\RuntimeIndirectStaticMethodCall (line 20461)
- new Operand\Literal (line 21275)
- new VM (line 22099)
- new VM\Variable (line 22108)
- new VM\ClassEntry (line 22213)
- new Func\PHP (line 22232)
- new VM\ClassEntry (line 22278)
- new Variable (line 22295)
- new Variable (line 22408)
- new Variable (line 22449)
- new Variable (line 22509)
- new Variable (line 22728)
- new Variable (line 24635)
- 628 class method(s)
- new JIT\Call\VmCoerceVariableToString (line 18362)
- new JIT\Call\NoOpConstruct (line 18565)
- new JIT\Call\IncludePathResolverResolve (line 18736)
- new Operand\Literal (line 18852)
- new Operand\Literal (line 18854)
- new Operand\Literal (line 18865)
- new Operand\Literal (line 18872)
- new JIT\Call\RuntimeVariableStaticMethodCall (line 18913)
- new JIT\Call\RuntimeVariableStaticMethodCall (line 18945)
- new JIT\Call\RuntimeIndirectStaticMethodCall (line 18988)
- new JIT\Call\NestedJitCompileScopeIsActiveTrue (line 19016)
- new JIT\Call\EmitCatchableError (line 19057)
- new JIT\Call\RuntimeIndirectStaticMethodCall (line 19240)
- new JIT\Call\RuntimeIndirectStaticMethodCall (line 19407)
- new Operand\Literal (line 20221)
- new VM (line 21045)
- new VM\Variable (line 21054)
- new VM\ClassEntry (line 21159)
- new Func\PHP (line 21178)
- new VM\ClassEntry (line 21224)
- new Variable (line 21241)
- new Variable (line 21354)
- new Variable (line 21395)
- new Variable (line 21455)
- new Variable (line 21674)
- new Variable (line 23581)
- 586 class method(s)
- 25 closure(s)

### `lib/JIT/Analyzer.php`
Expand Down Expand Up @@ -58122,6 +58123,12 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag
- 1 class method(s)
- 1 closure(s)

### `lib/JIT/Concern/TernaryJumpIfEchoMergeAndReturnPhi.php`

**Warnings** (review for bootstrap subset):
- trait TernaryJumpIfEchoMergeAndReturnPhi (line 18)
- 42 class method(s)

### `lib/JIT/Context.php`

**Warnings** (review for bootstrap subset):
Expand Down Expand Up @@ -59365,8 +59372,8 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag
### `lib/JIT/JitValueBox.php`

**Warnings** (review for bootstrap subset):
- new Variable (line 260)
- new Variable (line 345)
- new Variable (line 266)
- new Variable (line 351)
- 22 class method(s)

### `lib/JIT/JitValueCompare.php`
Expand Down
Loading