diff --git a/docs/bootstrap-inventory.md b/docs/bootstrap-inventory.md index 70f8edef636..99b3b8c07a3 100644 --- a/docs/bootstrap-inventory.md +++ b/docs/bootstrap-inventory.md @@ -3738,183 +3738,183 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag - new OpCode (line 909) - new OpCode (line 921) - new Block (line 933) -- new OpCode (line 939) -- new Variable (line 960) -- new Operand\Temporary (line 964) -- new OpCode (line 967) -- new Block (line 1092) -- new OpCode (line 1108) -- new Operand\Literal (line 1123) -- new Variable (line 1125) -- new Operand\Temporary (line 1127) -- new OpCode (line 1130) -- new OpCode (line 1148) -- new OpCode (line 1162) -- new Operand\Literal (line 1188) -- new OpCode (line 1190) -- new Operand\Variable (line 1203) -- new Operand\Literal (line 1203) -- new Operand\Literal (line 1213) -- new Temporary (line 1216) -- new OpCode (line 1219) -- new OpCode (line 1225) -- new Variable (line 1235) -- new Operand\Temporary (line 1236) -- new OpCode (line 1272) -- new Operand\Literal (line 1282) -- new OpCode (line 1284) -- new Operand\Literal (line 1297) -- new OpCode (line 1300) -- new OpCode (line 1308) -- new OpCode (line 1316) -- new OpCode (line 1324) -- new OpCode (line 1350) -- new OpCode (line 1355) -- new OpCode (line 1362) -- new OpCode (line 1368) -- new OpCode (line 1380) -- new OpCode (line 1406) -- new OpCode (line 1423) -- new Block (line 1435) -- new OpCode (line 1442) -- new OpCode (line 1545) -- new OpCode (line 1552) -- new Operand\Literal (line 1568) -- new OpCode (line 1570) -- new Operand\Literal (line 1585) -- new OpCode (line 1587) -- new OpCode (line 1600) +- new OpCode (line 937) +- new Operand\Literal (line 964) +- new Variable (line 966) +- new Operand\Temporary (line 968) +- new OpCode (line 971) +- new Variable (line 996) +- new Operand\Temporary (line 1000) +- new OpCode (line 1003) +- new Block (line 1128) +- new OpCode (line 1144) +- new OpCode (line 1159) +- new OpCode (line 1173) +- new Operand\Literal (line 1199) +- new OpCode (line 1201) +- new Operand\Variable (line 1214) +- new Operand\Literal (line 1214) +- new Operand\Literal (line 1224) +- new Temporary (line 1227) +- new OpCode (line 1230) +- new OpCode (line 1236) +- new Variable (line 1246) +- new Operand\Temporary (line 1247) +- new OpCode (line 1283) +- new Operand\Literal (line 1293) +- new OpCode (line 1295) +- new Operand\Literal (line 1308) +- new OpCode (line 1311) +- new OpCode (line 1319) +- new OpCode (line 1327) +- new OpCode (line 1335) +- new OpCode (line 1361) +- new OpCode (line 1366) +- new OpCode (line 1373) +- new OpCode (line 1379) +- new OpCode (line 1391) +- new OpCode (line 1417) +- new OpCode (line 1434) +- new Block (line 1446) +- new OpCode (line 1453) +- new OpCode (line 1556) +- new OpCode (line 1563) +- new Operand\Literal (line 1579) +- new OpCode (line 1581) +- new Operand\Literal (line 1596) +- new OpCode (line 1598) - new OpCode (line 1611) -- new OpCode (line 1617) -- new OpCode (line 1625) -- new OpCode (line 1640) -- new OpCode (line 1646) -- new OpCode (line 1654) +- new OpCode (line 1622) +- new OpCode (line 1628) +- new OpCode (line 1636) +- new OpCode (line 1651) +- new OpCode (line 1657) - new OpCode (line 1665) - new OpCode (line 1676) -- new OpCode (line 1688) -- new OpCode (line 1694) -- new OpCode (line 1707) +- new OpCode (line 1687) +- new OpCode (line 1699) +- new OpCode (line 1705) - new OpCode (line 1718) -- new OpCode (line 1732) -- new Operand\Literal (line 1744) -- new Operand\Literal (line 1761) -- new OpCode (line 1776) -- new OpCode (line 1786) -- new OpCode (line 1791) -- new OpCode (line 1798) -- new OpCode (line 1807) -- new OpCode (line 1820) -- new OpCode (line 1833) +- new OpCode (line 1729) +- new OpCode (line 1743) +- new Operand\Literal (line 1755) +- new Operand\Literal (line 1772) +- new OpCode (line 1787) +- new OpCode (line 1797) +- new OpCode (line 1802) +- new OpCode (line 1809) +- new OpCode (line 1818) +- new OpCode (line 1831) - new OpCode (line 1844) -- new OpCode (line 1850) -- new OpCode (line 1856) -- new OpCode (line 1865) -- new OpCode (line 1871) -- new OpCode (line 1886) -- new OpCode (line 1899) -- new OpCode (line 1932) -- new Operand\Literal (line 1959) -- new OpCode (line 1962) -- new Operand\Literal (line 1975) -- new OpCode (line 1980) -- new OpCode (line 1989) -- new OpCode (line 2015) -- new OpCode (line 2023) -- new OpCode (line 2029) -- new Block (line 2037) -- new Block (line 2041) -- new OpCode (line 2053) -- new Block (line 2060) -- new OpCode (line 2068) -- new OpCode (line 2076) -- new OpCode (line 2085) -- new OpCode (line 2088) +- new OpCode (line 1855) +- new OpCode (line 1861) +- new OpCode (line 1867) +- new OpCode (line 1876) +- new OpCode (line 1882) +- new OpCode (line 1897) +- new OpCode (line 1910) +- new OpCode (line 1943) +- new Operand\Literal (line 1970) +- new OpCode (line 1973) +- new Operand\Literal (line 1986) +- new OpCode (line 1991) +- new OpCode (line 2000) +- new OpCode (line 2026) +- new OpCode (line 2034) +- new OpCode (line 2040) +- new Block (line 2048) +- new Block (line 2052) +- new OpCode (line 2064) +- new Block (line 2071) +- new OpCode (line 2079) +- new OpCode (line 2087) - new OpCode (line 2096) -- new OpCode (line 2114) -- new OpCode (line 2127) -- new Block (line 2140) -- new Block (line 2144) -- new Operand\Literal (line 2147) -- new OpCode (line 2150) -- new OpCode (line 2156) -- new Block (line 2160) -- new OpCode (line 2163) -- new OpCode (line 2169) -- new OpCode (line 2175) -- new Block (line 2193) -- new Block (line 2197) -- new Operand\Literal (line 2200) -- new OpCode (line 2203) -- new OpCode (line 2209) -- new Block (line 2213) -- new OpCode (line 2216) -- new OpCode (line 2225) -- new OpCode (line 2230) -- new OpCode (line 2234) -- new OpCode (line 2240) -- new Variable (line 2288) -- new Operand\Literal (line 2290) -- new OpCode (line 2315) -- new Operand\Temporary (line 2355) -- new HashTable (line 2363) -- new Variable (line 2394) -- new Variable (line 2420) -- new Block (line 2551) -- new Block (line 2554) -- new OpCode (line 2557) -- new OpCode (line 2563) -- new OpCode (line 2580) -- new Block (line 2587) -- new OpCode (line 2590) -- new OpCode (line 2600) -- new Temporary (line 2610) -- new Variable (line 2620) -- new Operand\Temporary (line 2622) -- new Variable (line 2817) -- new OpCode (line 2841) -- new OpCode (line 2898) -- new OpCode (line 2913) -- new OpCode (line 2923) -- new OpCode (line 2930) -- new OpCode (line 2933) -- new OpCode (line 2938) -- new OpCode (line 2943) -- new OpCode (line 2951) -- new OpCode (line 2960) -- new Variable (line 2971) -- new Operand\Literal (line 2973) -- new OpCode (line 2976) -- new OpCode (line 2995) -- new OpCode (line 3015) -- new OpCode (line 3037) -- new OpCode (line 3043) -- new OpCode (line 3060) -- new Variable (line 3088) -- new Temporary (line 3090) -- new Variable (line 3098) -- new Temporary (line 3100) -- new OpCode (line 3110) -- new Operand\Literal (line 3199) -- new Variable (line 3201) -- new OpCode (line 3206) -- new OpCode (line 3235) -- new OpCode (line 3244) -- new OpCode (line 3247) +- new OpCode (line 2099) +- new OpCode (line 2107) +- new OpCode (line 2125) +- new OpCode (line 2138) +- new Block (line 2151) +- new Block (line 2155) +- new Operand\Literal (line 2158) +- new OpCode (line 2161) +- new OpCode (line 2167) +- new Block (line 2171) +- new OpCode (line 2174) +- new OpCode (line 2180) +- new OpCode (line 2186) +- new Block (line 2204) +- new Block (line 2208) +- new Operand\Literal (line 2211) +- new OpCode (line 2214) +- new OpCode (line 2220) +- new Block (line 2224) +- new OpCode (line 2227) +- new OpCode (line 2236) +- new OpCode (line 2241) +- new OpCode (line 2245) +- new OpCode (line 2251) +- new Variable (line 2299) +- new Operand\Literal (line 2301) +- new OpCode (line 2326) +- new Operand\Temporary (line 2366) +- new HashTable (line 2374) +- new Variable (line 2405) +- new Variable (line 2431) +- new Block (line 2562) +- new Block (line 2565) +- new OpCode (line 2568) +- new OpCode (line 2574) +- new OpCode (line 2591) +- new Block (line 2598) +- new OpCode (line 2601) +- new OpCode (line 2611) +- new Temporary (line 2621) +- new Variable (line 2631) +- new Operand\Temporary (line 2633) +- new Variable (line 2828) +- new OpCode (line 2852) +- new OpCode (line 2909) +- new OpCode (line 2924) +- new OpCode (line 2934) +- new OpCode (line 2941) +- new OpCode (line 2944) +- new OpCode (line 2949) +- new OpCode (line 2954) +- new OpCode (line 2962) +- new OpCode (line 2971) +- new Variable (line 2982) +- new Operand\Literal (line 2984) +- new OpCode (line 2987) +- new OpCode (line 3006) +- new OpCode (line 3026) +- new OpCode (line 3048) +- new OpCode (line 3054) +- new OpCode (line 3071) +- new Variable (line 3099) +- new Temporary (line 3101) +- new Variable (line 3109) +- new Temporary (line 3111) +- new OpCode (line 3121) +- new Operand\Literal (line 3210) +- new Variable (line 3212) +- new OpCode (line 3217) +- new OpCode (line 3246) +- new OpCode (line 3255) - new OpCode (line 3258) -- new OpCode (line 3261) -- new OpCode (line 3276) -- new OpCode (line 3286) -- new OpCode (line 3291) -- new OpCode (line 3308) -- new OpCode (line 3313) -- new OpCode (line 3315) -- new Literal (line 3334) -- new OpCode (line 3414) -- new Variable (line 3420) -- new Temporary (line 3422) +- new OpCode (line 3269) +- new OpCode (line 3272) +- new OpCode (line 3287) +- new OpCode (line 3297) +- new OpCode (line 3302) +- new OpCode (line 3319) +- new OpCode (line 3324) +- new OpCode (line 3326) +- new Literal (line 3345) - new OpCode (line 3425) -- 123 class method(s) — PHPCfg Op\Stmt\ClassMethod not lowered in Compiler +- new Variable (line 3431) +- new Temporary (line 3433) +- new OpCode (line 3436) +- 124 class method(s) — PHPCfg Op\Stmt\ClassMethod not lowered in Compiler ### `lib/Compiler/AttributeNames.php` @@ -3965,57 +3965,57 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag - new JIT\Scope (line 156) - new Operand\Literal (line 207) - new Operand\Literal (line 223) -- new Variable (line 795) -- new JIT\Call\Vararg (line 805) -- new JIT\Call\Native (line 815) -- new JIT\Call\Native (line 959) -- new JIT\Variable (line 1089) -- new JIT\Call\Native (line 1106) -- new JIT\Call\Native (line 1164) -- new JIT\Call\Native (line 1206) -- new JIT\Call\Native (line 1252) -- new JIT\Call\Native (line 2215) -- new JIT\Call\Native (line 2246) -- new JIT\Call\Native (line 2290) -- new JIT\Call\Native (line 2337) -- new JIT\Call\Native (line 2365) -- new JIT\Call\Native (line 2853) -- new JIT\Call\Native (line 2891) -- new JIT\Call\Native (line 2925) -- new JIT\Call\Native (line 2969) -- new JIT\Call\Native (line 3326) -- new JIT\Call\Native (line 3392) -- new ext\standard\boolval (line 3757) -- new Operand\Literal (line 3837) -- new JIT\Variable (line 3871) -- new Operand\Literal (line 3946) -- new ext\standard\intval (line 4050) -- new Variable (line 4079) -- new Variable (line 4190) -- new OpCode (line 4273) -- new Variable (line 4522) -- new JIT\Call\RuntimeVariableFunction (line 4557) -- new Variable (line 4731) -- new Variable (line 4750) -- new Variable (line 5531) -- new Variable (line 5571) -- new Variable (line 5590) -- new Variable (line 6123) -- new Variable (line 6143) -- new Variable (line 6213) -- new Variable (line 6419) -- new Variable (line 6458) -- new Operand\Literal (line 6467) -- new Variable (line 6482) -- new Operand\Literal (line 6804) -- new Operand\Literal (line 6808) -- new Operand\Literal (line 6812) -- new Variable (line 6816) -- new Variable (line 6840) -- new Variable (line 6852) -- new Variable (line 7065) -- new Variable (line 7081) -- 179 class method(s) — PHPCfg Op\Stmt\ClassMethod not lowered in Compiler +- new Variable (line 814) +- new JIT\Call\Vararg (line 824) +- new JIT\Call\Native (line 834) +- new JIT\Call\Native (line 978) +- new JIT\Variable (line 1123) +- new JIT\Call\Native (line 1140) +- new JIT\Call\Native (line 1198) +- new JIT\Call\Native (line 1240) +- new JIT\Call\Native (line 1286) +- new JIT\Call\Native (line 2273) +- new JIT\Call\Native (line 2304) +- new JIT\Call\Native (line 2348) +- new JIT\Call\Native (line 2395) +- new JIT\Call\Native (line 2457) +- new JIT\Call\Native (line 2972) +- new JIT\Call\Native (line 3010) +- new JIT\Call\Native (line 3044) +- new JIT\Call\Native (line 3088) +- new JIT\Call\Native (line 3445) +- new JIT\Call\Native (line 3511) +- new ext\standard\boolval (line 3876) +- new Operand\Literal (line 3956) +- new JIT\Variable (line 3990) +- new Operand\Literal (line 4065) +- new ext\standard\intval (line 4169) +- new Variable (line 4198) +- new Variable (line 4309) +- new OpCode (line 4392) +- new Variable (line 4641) +- new JIT\Call\RuntimeVariableFunction (line 4676) +- new Variable (line 4850) +- new Variable (line 4869) +- new Variable (line 5650) +- new Variable (line 5690) +- new Variable (line 5709) +- new Variable (line 6242) +- new Variable (line 6262) +- new Variable (line 6332) +- new Variable (line 6538) +- new Variable (line 6577) +- new Operand\Literal (line 6586) +- new Variable (line 6601) +- new Operand\Literal (line 6923) +- new Operand\Literal (line 6927) +- new Operand\Literal (line 6931) +- new Variable (line 6935) +- new Variable (line 6959) +- new Variable (line 6971) +- new Variable (line 7184) +- new Variable (line 7200) +- 180 class method(s) — PHPCfg Op\Stmt\ClassMethod not lowered in Compiler ### `lib/JIT/Analyzer.php` diff --git a/docs/bootstrap-selfhost.md b/docs/bootstrap-selfhost.md index e03c9ac3639..ec49b2acdc6 100644 --- a/docs/bootstrap-selfhost.md +++ b/docs/bootstrap-selfhost.md @@ -1,6 +1,6 @@ # Self-host bootstrap roadmap -**Project north star:** The **compiler fully compiles itself** — native AOT from `lib/` (no `vendor/` at cold boot), then compiles PHP and rebuilds the next compiler revision without Zend. **M2 spine:** **717/717** `require_once` units with real **`bin/vm.php`** (`src/cli_driver.php` via `cli_spine_shim`; `lib/VM/HashTable.php` promoted — [#2543](https://github.com/PurHur/php-compiler/issues/2543)) ([#2134](https://github.com/PurHur/php-compiler/issues/2134); `php script/bootstrap-spine-count.php`). **Living tracker:** [#1492](https://github.com/PurHur/php-compiler/issues/1492) (was [#1056](https://github.com/PurHur/php-compiler/issues/1056)) · **re-root doc:** [self-host-target.md](self-host-target.md) · **generation ladder:** [bootstrap-generations.md](bootstrap-generations.md) · public status: [development-status § North star](https://purhur.github.io/php-compiler/development-status.html#north-star-self-host). Parent tracking: [#78](https://github.com/PurHur/php-compiler/issues/78) (roadmap), [#212](https://github.com/PurHur/php-compiler/issues/212) (closed umbrella). +**Project north star:** The **compiler fully compiles itself** — native AOT from `lib/` (no `vendor/` at cold boot), then compiles PHP and rebuilds the next compiler revision without Zend. **M2 spine:** **724/725** literal `require_once` (**725/725** with `cli_spine_shim`) with real **`bin/vm.php`** (`src/cli_driver.php` via `cli_spine_shim`; `lib/VM/HashTable.php` promoted — [#2543](https://github.com/PurHur/php-compiler/issues/2543)) ([#2134](https://github.com/PurHur/php-compiler/issues/2134); `php script/bootstrap-spine-count.php`). **Living tracker:** [#1492](https://github.com/PurHur/php-compiler/issues/1492) (was [#1056](https://github.com/PurHur/php-compiler/issues/1056)) · **re-root doc:** [self-host-target.md](self-host-target.md) · **generation ladder:** [bootstrap-generations.md](bootstrap-generations.md) · public status: [development-status § North star](https://purhur.github.io/php-compiler/development-status.html#north-star-self-host). Parent tracking: [#78](https://github.com/PurHur/php-compiler/issues/78) (roadmap), [#212](https://github.com/PurHur/php-compiler/issues/212) (closed umbrella). ## Current gates @@ -35,8 +35,8 @@ | Self-host probe in full CI | `./script/ci-local.sh` (LLVM tail) | ✅ default-on when LLVM 9 present; `BOOTSTRAP_SELFHOST_PROBE_GATE=0` to skip ([#829](https://github.com/PurHur/php-compiler/issues/829)) | | Wave gate in full CI | `./script/ci-local.sh` (LLVM tail) | ✅ default-on when LLVM 9 present; `BOOTSTRAP_WAVE_CHECK=0` to skip; `./script/bootstrap-wave-check.sh --fail-fast` | | Self-host native link | `./script/bootstrap-selfhost-link.sh` | ✅ `build/selfhost` prints `compiler_minimal bundle OK` ([#557](https://github.com/PurHur/php-compiler/issues/557), [#913](https://github.com/PurHur/php-compiler/issues/913)) | -| M2 lib spine smoke lint | `php bin/compile.php -l test/selfhost/compiler_lib_spine_smoke/main.php` | ✅ **717/717** units ([#1492](https://github.com/PurHur/php-compiler/issues/1492), [#2543](https://github.com/PurHur/php-compiler/issues/2543), [#2652](https://github.com/PurHur/php-compiler/issues/2652), [#2001](https://github.com/PurHur/php-compiler/issues/2001), [#2126](https://github.com/PurHur/php-compiler/issues/2126)) -| M2 spine coverage drift | `php script/check-selfhost-spine-coverage-sync.php` | ✅ **717** spine units vs **718** Phase A SSOT (no ratio-deferred — [#2543](https://github.com/PurHur/php-compiler/issues/2543)); `SELFHOST_SPINE_COVERAGE_SYNC_GATE=1` ([#1945](https://github.com/PurHur/php-compiler/issues/1945), [#2632](https://github.com/PurHur/php-compiler/issues/2632), [#2652](https://github.com/PurHur/php-compiler/issues/2652)) +| M2 lib spine smoke lint | `php bin/compile.php -l test/selfhost/compiler_lib_spine_smoke/main.php` | ✅ **724/725** literal units (**725/725** with cli shim; [#2840](https://github.com/PurHur/php-compiler/issues/2840)) | +| M2 spine coverage drift | `php script/check-selfhost-spine-coverage-sync.php` | ✅ **725** inventory files covered (no ratio-deferred); `SELFHOST_SPINE_COVERAGE_SYNC_GATE=1` ([#1945](https://github.com/PurHur/php-compiler/issues/1945), [#2840](https://github.com/PurHur/php-compiler/issues/2840)) | M2 lib spine smoke native run | `./script/bootstrap-selfhost-lib-spine-smoke-link.sh` or `BOOTSTRAP_LIB_SPINE_SMOKE=1 make bootstrap-selfhost-lib-spine-smoke` | ✅ `build/selfhost-lib-spine-smoke` prints `compiler_lib_spine_smoke bundle OK` | | M2 lib spine VM `-r` smoke | `./script/bootstrap-selfhost-lib-spine-vm-smoke.sh` or `BOOTSTRAP_LIB_SPINE_VM_SMOKE=1 make bootstrap-selfhost-lib-spine-vm-smoke` | ✅ same binary + `PHP_COMPILER_VM_SPINE_SMOKE=1` prints `vm-spine-ok` ([#1846](https://github.com/PurHur/php-compiler/issues/1846); `ci-local.sh` default `BOOTSTRAP_LIB_SPINE_VM_SMOKE_GATE=1` ([#1867](https://github.com/PurHur/php-compiler/issues/1867)); set `0` to skip) | | M2 VM driver execute | `./script/bootstrap-selfhost-vm-driver-execute-probe.sh` or `make bootstrap-selfhost-vm-driver-execute-probe` | ✅ spine binary + `PHP_COMPILER_VM_DRIVER_EXECUTE=1` dispatches `bin/vm.php` `run()` → `vm driver ok` ([#2201](https://github.com/PurHur/php-compiler/issues/2201)); `BOOTSTRAP_VM_DRIVER_EXECUTE_GATE=1` opt-in in `ci-local.sh` llvm tail ([#2227](https://github.com/PurHur/php-compiler/issues/2227)) | @@ -57,11 +57,11 @@ | M3 Runtime compile smoke strict probe | `BOOTSTRAP_M3_RUNTIME_COMPILE_SMOKE_STRICT=1 ./script/bootstrap-selfhost-runtime-compile-smoke.sh` or `make bootstrap-selfhost-runtime-compile-smoke-strict` | ✅ `emit_path=native` — strict auto-enables compile-driver link env ([#2610](https://github.com/PurHur/php-compiler/issues/2610); refuses `emit_path=zend_fallback_would_be_used`) | | M3 Runtime compile smoke strict CI gate | `BOOTSTRAP_RUNTIME_COMPILE_SMOKE_STRICT_GATE=1 ./script/ci-local.sh` | opt-in ([#2294](https://github.com/PurHur/php-compiler/issues/2294)); runs strict probe (default **off** in `ci-local.sh` until stable) | | M4 bootstrap-loop gen-1 link | `./script/bootstrap-loop-gen1-link.sh` or `make bootstrap-loop-gen1-link` | ✅ gen-1 link + gen-2 native emit (`emit_path=native`) when LLVM present — script defaults compile-driver link env ([#2611](https://github.com/PurHur/php-compiler/issues/2611)); **Zend fallback** (`emit_path=zend partial`) when native blocked; set `BOOTSTRAP_M4_LINK_COMPILE_DRIVER=0` to bisect | -| M4 gen-1 full-spine emit | `./script/bootstrap-loop-gen1-full-spine-emit.sh` or `make bootstrap-loop-gen1-full-spine-emit` | ✅ gen-1→gen-2 **717/717** spine (`build/bootstrap-loop-gen2-full-spine`) | +| M4 gen-1 full-spine emit | `./script/bootstrap-loop-gen1-full-spine-emit.sh` or `make bootstrap-loop-gen1-full-spine-emit` | ✅ gen-1→gen-2 **725/725** spine (`build/bootstrap-loop-gen2-full-spine`) | | M4 gen-2→gen-3 spine recompile | `./script/bootstrap-loop-gen2-recompile-spine.sh` or `make bootstrap-loop-gen2-recompile-spine` | ✅ gen-2 native driver (`build/bin-compile-aot`) recompiles spine → `build/bootstrap-loop-gen3-full-spine` ([#2697](https://github.com/PurHur/php-compiler/pull/2697)); alias `make bootstrap-loop-gen2-recompile-minimal` | | M4 gen-2 strict emit gate | `BOOTSTRAP_M4_GEN2_STRICT=1 ./script/bootstrap-loop-gen1-link.sh` | opt-in ([#2115](https://github.com/PurHur/php-compiler/issues/2115)); refuses Zend fallback (`emit_path=zend_fallback_would_be_used`); auto-enables compile-driver link env | | M4 bootstrap-loop probe | `./script/bootstrap-loop-probe.sh` or `make bootstrap-loop-probe` | ✅ **ladder** — M2 + **M3 HelloWorld strict** (same env as `make bootstrap-selfhost-helloworld`, #2612) + gen-1→gen-2 + gen-2→gen-3 spine; `--dry-run` skips gen-3 ([#1498](https://github.com/PurHur/php-compiler/issues/1498), [#2611](https://github.com/PurHur/php-compiler/issues/2611)) | -| M4 full-spine loop probe | `make bootstrap-loop-full-spine-probe` or `BOOTSTRAP_M4_GEN1_COMPILE_FULL_SPINE=1 make bootstrap-loop-probe` | ✅ inventory-scale gen-1 emit (`compiler_lib_spine_smoke`, **718** units) + gen-2 smoke ([#2770](https://github.com/PurHur/php-compiler/issues/2770), [#2664](https://github.com/PurHur/php-compiler/issues/2664)); heavy — opt-in `BOOTSTRAP_M4_FULL_SPINE_PROBE_GATE=1` in `ci-local.sh` llvm tail | +| M4 full-spine loop probe | `make bootstrap-loop-full-spine-probe` or `BOOTSTRAP_M4_GEN1_COMPILE_FULL_SPINE=1 make bootstrap-loop-probe` | ✅ inventory-scale gen-1 emit (`compiler_lib_spine_smoke`, **725** units) + gen-2 smoke ([#2770](https://github.com/PurHur/php-compiler/issues/2770), [#2664](https://github.com/PurHur/php-compiler/issues/2664)); heavy — opt-in `BOOTSTRAP_M4_FULL_SPINE_PROBE_GATE=1` in `ci-local.sh` llvm tail | | M5 driver smoke in wave-check | `BOOTSTRAP_M5_DRIVER_SMOKE=1 ./script/bootstrap-wave-check.sh` or `--with-driver-smoke` | ✅ gen-1 native compile+run without Zend on emit ([#2769](https://github.com/PurHur/php-compiler/issues/2769), [#1521](https://github.com/PurHur/php-compiler/issues/1521)); opt-in with helloworld wave slice | | M4 bootstrap-loop probe in CI (fast) | `BOOTSTRAP_LOOP_PROBE_GATE=1 ./script/ci-fast.sh` | opt-in runs `--dry-run` ladder ([#1777](https://github.com/PurHur/php-compiler/issues/1777), [#1929](https://github.com/PurHur/php-compiler/issues/1929)) | | M4 bootstrap-loop probe in CI (local) | `./script/ci-local.sh` (LLVM tail) | default-on full ladder after M3 strict ([#2780](https://github.com/PurHur/php-compiler/issues/2780), [#2058](https://github.com/PurHur/php-compiler/issues/2058)); opt-out `BOOTSTRAP_M4_LOOP_PROBE=0` | diff --git a/docs/self-host-target.md b/docs/self-host-target.md index 161ffc8984e..a5954b77145 100644 --- a/docs/self-host-target.md +++ b/docs/self-host-target.md @@ -34,10 +34,10 @@ That is **M5**. Everything below is the honest path from today’s bootstrap to | Layer | Today | Target | |-------|-------|--------| | **Bootstrap driver** | Gen-0 Zend `php bin/compile.php` once; routine `bootstrap-selfhost-link` / spine / M4 gen-1 prefer `build/bin-compile-aot` or `build/selfhost-compile-driver` when present ([#2842](https://github.com/PurHur/php-compiler/issues/2842)) | Compiled `bin/compile.php` only | -| **Bundle size** | **717** curated `require_once` in spine smoke (108 minimal overlap + **609** M2-only) | **717** Phase A inventory files (SSOT) | -| **Inventory coverage** | **717/717** in spine smoke with real **`bin/vm.php`** ([#2134](https://github.com/PurHur/php-compiler/issues/2134); **#2652** emit-TU JIT batch; **`lib/VM/HashTable.php`** promoted [#2543](https://github.com/PurHur/php-compiler/issues/2543)); `src/cli_driver.php` via `cli_spine_shim` | **~100%** | +| **Bundle size** | **724** curated `require_once` in spine smoke (+ **1** `cli_spine_shim` for `src/cli_driver.php`) | **725** Phase A inventory files (SSOT) | +| **Inventory coverage** | **724/725** literal `require_once` (**725/725** with cli shim; `check-selfhost-spine-coverage-sync`) with real **`bin/vm.php`** ([#2134](https://github.com/PurHur/php-compiler/issues/2134); **#2652** emit-TU JIT batch; **`lib/VM/HashTable.php`** promoted [#2543](https://github.com/PurHur/php-compiler/issues/2543)); `src/cli_driver.php` via `cli_spine_shim` | **~100%** | | **HelloWorld** | Native **run** ✅; strict probe **emit_path=native** ✅ (27 May 2026) | Native compile for arbitrary PHP | -| **Bootstrap loop (M4)** | Gen-1→gen-2 smoke/spine **native** ✅; gen-2→gen-3 spine **717/717** ✅; full revision / argv CLI ⬜ | Native full revision rebuild | +| **Bootstrap loop (M4)** | Gen-1→gen-2 smoke/spine **native** ✅; gen-2→gen-3 spine **725/725** ✅; full revision / argv CLI ⬜ | Native full revision rebuild | | **Vendor** | `ircmaxell/php-types` **object_ok** ([#1416](https://github.com/PurHur/php-compiler/issues/1416)); cfg/llvm parse blockers | Prelinked artifacts only (no `vendor/autoload.php`) | ### Gates (run after `script/apply-patches.sh`) @@ -52,11 +52,11 @@ That is **M5**. Everything below is the honest path from today’s bootstrap to | M2 `BOOTSTRAP_LIB_SPINE_SMOKE=1` spine link | ✅ `compiler_lib_spine_smoke bundle OK` | | M3 `make bootstrap-selfhost-helloworld` | ✅ strict default — HelloWorld `emit_path=native` (verified 27 May 2026) | | M4 `make bootstrap-loop-gen1-link` | ✅ gen-1 link + gen-2 smoke **`emit_path=native`** (`BOOTSTRAP_M4_LINK_COMPILE_DRIVER=1`, #2611); **Zend fallback** (`emit_path=zend partial`) when native blocked; strict: `BOOTSTRAP_M4_GEN2_STRICT=1`; presenter: [GETTING-STARTED §7](GETTING-STARTED.md) ([#2464](https://github.com/PurHur/php-compiler/issues/2464)) | -| M4 `make bootstrap-loop-gen1-full-spine-emit` | ✅ gen-1→gen-2 **717/717** spine (`bootstrap-loop-gen2-full-spine`) | -| M4 `make bootstrap-loop-gen2-recompile-spine` | ✅ gen-2→gen-3 **717/717** spine (`bootstrap-loop-gen3-full-spine`) — native driver recompiles spine ([#2697](https://github.com/PurHur/php-compiler/pull/2697)) | +| M4 `make bootstrap-loop-gen1-full-spine-emit` | ✅ gen-1→gen-2 **725/725** spine (`bootstrap-loop-gen2-full-spine`) | +| M4 `make bootstrap-loop-gen2-recompile-spine` | ✅ gen-2→gen-3 **725/725** spine (`bootstrap-loop-gen3-full-spine`) — native driver recompiles spine ([#2697](https://github.com/PurHur/php-compiler/pull/2697)) | | M4 `make bootstrap-loop-probe` | ✅ full ladder — M2 + M3 HelloWorld strict + gen-1→gen-2 + gen-2→gen-3; `--dry-run` skips gen-3 ([#1498](https://github.com/PurHur/php-compiler/issues/1498)); `make north-star4-verify` — [GETTING-STARTED §7](GETTING-STARTED.md) | | `make bootstrap-aot-link` | ✅ **71/71** | -| `make bootstrap-inventory-check` | ✅ **717** Phase A files, **717** vm.php-path files, **0** source blockers | +| `make bootstrap-inventory-check` | ✅ **725** Phase A files, **725** vm.php-path files, **0** source blockers | | `make north-star5-verify` | ✅ inventory + spine + selfhost link; vendor **1/3** `object_ok` (partial; `--strict` for 3/3) | --- @@ -67,11 +67,11 @@ That is **M5**. Everything below is the honest path from today’s bootstrap to |-----------|----------------|--------|-----| | **M0** | AOT can link a **small** honest `lib/` subset | ✅ | 100% | | **M1** | Bundle is **compiler-shaped** (lint + compile-smoke) | ✅ | 100% | -| **M2** | Spine grows toward full `bin/vm.php` inventory | ✅ **717** units (link; **`bin/vm.php`** [#2134](https://github.com/PurHur/php-compiler/issues/2134); [#2543](https://github.com/PurHur/php-compiler/issues/2543); [#2652](https://github.com/PurHur/php-compiler/issues/2652)) | **~100%** | +| **M2** | Spine grows toward full `bin/vm.php` inventory | ✅ **725/725** coverage (**724** literal `require_once` + cli shim; [#2840](https://github.com/PurHur/php-compiler/issues/2840)) | **~100%** | | **M3** | Self-host binary **compiles external PHP** (HelloWorld) without Zend emit | 🚧 smoke strict **native** ✅; full `Compiler` CFG 🚧 | **~65%** | **M3 unit probe presenter** ([#2360](https://github.com/PurHur/php-compiler/issues/2360)): `make north-star3-verify` runs `008-SelfHostProbe` plus optional `bootstrap-selfhost-{compiler,jit,vm,parser,types}-unit-probe.sh` when LLVM 9 and probe scripts are present (parser step [#2418](https://github.com/PurHur/php-compiler/issues/2418), PHPTypes step [#2434](https://github.com/PurHur/php-compiler/issues/2434)). **Parser unit probe** ([#2409](https://github.com/PurHur/php-compiler/issues/2409)): `make bootstrap-selfhost-parser-unit-probe` — CFG front-end (`Runtime` + `lib/Compiler.php` bundle); CI gate ([#2417](https://github.com/PurHur/php-compiler/issues/2417)) opt-in in `ci-local.sh`. **PHPTypes unit probe** ([#2430](https://github.com/PurHur/php-compiler/issues/2430)): `make bootstrap-selfhost-types-unit-probe` — `lib/JIT.php` / `JIT\Builtin\Type` external-class constant seeds; Zend smoke for `Type::TYPE_*` + union/intersection `fromTypeDecl`; `BOOTSTRAP_PHPTYPES_UNIT_PROBE_GATE=1` default-on in `ci-local.sh` ([#2433](https://github.com/PurHur/php-compiler/issues/2433), [#2436](https://github.com/PurHur/php-compiler/issues/2436)). **VM unit probe** ([#2354](https://github.com/PurHur/php-compiler/issues/2354)): `make bootstrap-selfhost-vm-unit-probe` / `BOOTSTRAP_VM_UNIT_PROBE_GATE=1` in `ci-local.sh` llvm tail. Compiler/JIT unit probes: [#2216](https://github.com/PurHur/php-compiler/issues/2216), [#2332](https://github.com/PurHur/php-compiler/issues/2332). -| **M4** | Self-host binary **rebuilds** the next compiler tree | 🚧 gen-2→gen-3 spine **717/717** ✅; full revision / argv CLI ⬜ | **~75%** | +| **M4** | Self-host binary **rebuilds** the next compiler tree | 🚧 gen-2→gen-3 spine **725/725** ✅; full revision / argv CLI ⬜ | **~75%** | | **M5** | Full self-host; Zend retired from loop | 🚧 `php-types` prelinked **object_ok**; cold boot open | **~15%** | **Indicative north star composite:** **~70%** (weighted across M0–M5; see formula below). @@ -80,7 +80,7 @@ That is **M5**. Everything below is the honest path from today’s bootstrap to | Indicator | Formula | May 2026 | |-----------|---------|----------| -| **M2 spine progress** | `require_once` units in `compiler_lib_spine_smoke` ÷ Phase A inventory file count | **717 / 717** (`bin/vm.php` [#2134](https://github.com/PurHur/php-compiler/issues/2134); `lib/VM/HashTable.php` [#2543](https://github.com/PurHur/php-compiler/issues/2543); **#2652** emit-TU JIT batch) | +| **M2 spine progress** | `require_once` units in `compiler_lib_spine_smoke` ÷ Phase A inventory file count | **724 / 725** literal (`725/725` with `cli_spine_shim`; [#2840](https://github.com/PurHur/php-compiler/issues/2840)) | | **Public “Self-host” row** | Same M2 ratio until M3–M5 gates add weight ([`development-status.md`](pages/development-status.md)) | **~99%** | | **M5 vendor prelink** | `object_ok` packages ÷ 3 | **1 / 3** (`php-types`) | | **Composite (internal)** | Milestone weights in table above (M0–M1 = 100%, M2 = spine %, M3–M5 = gate %) | **~70%** | @@ -134,7 +134,7 @@ Parallel batches ([#1419](https://github.com/PurHur/php-compiler/issues/1419), [ | Entry | Units | Role | |-------|------:|------| | `test/selfhost/compiler_minimal/main.php` | **108** | M0 core | -| `test/selfhost/compiler_lib_spine_smoke/main.php` | **717** | M2 complete (#2543 VM HashTable + #2652 emit-TU JIT batch) | +| `test/selfhost/compiler_lib_spine_smoke/main.php` | **724** (+ cli shim → **725**) | M2 complete ([#2840](https://github.com/PurHur/php-compiler/issues/2840)) | | `test/selfhost/compiler_helloworld_smoke/` | — | M3 probe + compile driver | | `test/selfhost/bootstrap_loop_smoke/` | — | M4 scaffold (gen-1→gen-2→gen-3 loop; [#1498](https://github.com/PurHur/php-compiler/issues/1498)) |