From 533b38269438dbe7a3d540b8ad46c406fcca3c1e Mon Sep 17 00:00:00 2001 From: PurHur Date: Tue, 1 Sep 2026 20:37:02 +0000 Subject: [PATCH] AOT: per-function ELF sections + link --gc-sections (#36198 part A) Tag each defined LLVM function with `.text.` before object emit and pass --gc-sections/-s at link so duplicate helper-runtime bodies can be discarded once units are re-emitted. Also source bootstrap sidecar stamp helper before the VM driver fast path and sync spine coverage for AotGcSections.php. Co-authored-by: Cursor --- docs/bootstrap-inventory.md | 1160 +++++++++-------- lib/AOT/Linker.php | 7 +- lib/JIT/AotGcSections.php | 90 ++ lib/JIT/Context.php | 1 + .../.m3_compiler_lib_sidecar.sha | 2 +- ...tstrap-selfhost-vm-driver-execute-probe.sh | 5 +- .../compiler_lib_spine_smoke/main.php | 1 + test/unit/AotGcSectionsTest.php | 65 + 8 files changed, 748 insertions(+), 583 deletions(-) create mode 100644 lib/JIT/AotGcSections.php create mode 100644 test/unit/AotGcSectionsTest.php diff --git a/docs/bootstrap-inventory.md b/docs/bootstrap-inventory.md index 52827621962..683a04864bd 100644 --- a/docs/bootstrap-inventory.md +++ b/docs/bootstrap-inventory.md @@ -8,11 +8,11 @@ Regenerate: `php script/bootstrap-inventory.php` | Metric | Count | |--------|------:| -| PHP files on vm.php path | 8058 | -| Phase A inventory files (M2 ratio SSOT) | 8058 | +| PHP files on vm.php path | 8059 | +| Phase A inventory files (M2 ratio SSOT) | 8059 | | Phase A ratio-deferred paths | 0 | | Source constructs flagged (blockers) | 0 | -| Source constructs flagged (warnings) | 25650 | +| Source constructs flagged (warnings) | 25651 | ## Compiler CFG gaps (`lib/Compiler.php`) @@ -5600,6 +5600,7 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag | `lib/JIT.php` | 0 | 220 | | `lib/JIT/Analyzer.php` | 0 | 1 | | `lib/JIT/AotDebugSymbols.php` | 0 | 1 | +| `lib/JIT/AotGcSections.php` | 0 | 1 | | `lib/JIT/ArrayAccessHelper.php` | 0 | 1 | | `lib/JIT/ArrayBuiltinHelper.php` | 0 | 6 | | `lib/JIT/ArrayColumnLlvm.php` | 0 | 11 | @@ -12695,18 +12696,18 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag ### `ext/ds/DsFactories.php` **Warnings** (review for bootstrap subset): -- new Error (line 42) -- new HashTable (line 44) -- new ObjectEntry (line 51) -- new Error (line 71) -- new HashTable (line 73) -- new ObjectEntry (line 80) -- new Error (line 100) -- new HashTable (line 102) -- new ObjectEntry (line 109) -- new Error (line 129) -- new HashTable (line 131) -- new ObjectEntry (line 138) +- new Error (line 49) +- new HashTable (line 51) +- new ObjectEntry (line 58) +- new Error (line 78) +- new HashTable (line 80) +- new ObjectEntry (line 87) +- new Error (line 107) +- new HashTable (line 109) +- new ObjectEntry (line 116) +- new Error (line 136) +- new HashTable (line 138) +- new ObjectEntry (line 145) - 5 class method(s) ### `ext/ds/Module.php` @@ -48087,8 +48088,8 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag ### `lib/AOT/ExternalMethodBind.php` **Warnings** (review for bootstrap subset): -- new Call\Native (line 86) -- 7 class method(s) +- new Call\Native (line 87) +- 9 class method(s) ### `lib/AOT/HelperRuntimeCache.php` @@ -48425,7 +48426,7 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag - new Variable (line 1936) - new Variable (line 1962) - new Variable (line 2002) -- 133 class method(s) +- 134 class method(s) ### `lib/BuiltinByRefParams.php` @@ -49703,219 +49704,219 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag - new Operand\Literal (line 1636) - new Operand\Literal (line 1652) - new JIT\Call\Native (line 2130) -- new Variable (line 3095) -- new JIT\Call\Vararg (line 3106) -- new JIT\Call\Native (line 3116) -- new JIT\Call\Native (line 3385) -- new JIT\Variable (line 3625) -- new JIT\Call\Native (line 3642) -- new JIT\Call\Native (line 3687) -- new JIT\Call\Native (line 3757) -- new JIT\Call\Native (line 3799) -- new JIT\Call\Native (line 3844) -- new JIT\Call\Native (line 3899) -- new JIT\Call\Native (line 5087) -- new JIT\Call\Native (line 5118) -- new JIT\Call\Native (line 5165) -- new JIT\Call\Native (line 5239) -- new JIT\Call\Native (line 5293) -- new JIT\Call\Native (line 5380) -- new JIT\Call\Native (line 5873) -- new JIT\Call\Native (line 5904) -- new JIT\Call\Native (line 5940) -- new JIT\Call\Native (line 5975) -- new JIT\Call\Native (line 6010) -- new JIT\Call\Native (line 6045) -- new JIT\Call\Native (line 6157) -- new JIT\Call\Native (line 7383) -- new JIT\Call\Native (line 7421) -- new JIT\Call\Native (line 7455) -- new JIT\Call\Native (line 7576) -- new JIT\Call\Native (line 8226) -- new JIT\Call\Native (line 8298) -- new JIT\Variable (line 8794) -- new Type (line 9170) -- new Type (line 9189) -- new Variable (line 9249) -- new Variable (line 9286) -- new Type (line 9723) -- new Variable (line 9949) -- new Variable (line 10049) -- new Variable (line 10074) -- new Variable (line 10111) -- new Variable (line 10295) -- new Error (line 10529) -- new Variable (line 10566) -- new Variable (line 10574) -- new Operand\Literal (line 10790) -- new Variable (line 11087) -- new Variable (line 11206) -- new Operand\Literal (line 11328) -- new Operand\Literal (line 11408) -- new Operand\Literal (line 11501) -- new Variable (line 12063) -- new Variable (line 12142) -- new Variable (line 12222) -- new Variable (line 12301) -- new Variable (line 12335) -- new VM\Variable (line 12372) -- new OpCode (line 12493) -- new Variable (line 13402) -- new Variable (line 13490) -- new Variable (line 13520) -- new JIT\Call\ClosureWithBinding (line 13538) -- new JIT\Call\EmitCatchableError (line 13632) -- new JIT\Call\RuntimeIndirectClosureCall (line 13678) -- new JIT\Call\RuntimeVariableFunction (line 13726) -- new JIT\Call\EmitCatchableError (line 13770) -- new Variable (line 14086) -- new Variable (line 14100) -- new Variable (line 14124) -- new VM\Variable (line 14594) -- new VM (line 14600) -- new Variable (line 14879) -- new Type (line 14887) -- new Variable (line 14915) -- new Type (line 14923) -- new JIT\Call\RuntimeIndirectInstanceMethodCall (line 14928) -- new Variable (line 14963) -- new Type (line 14974) -- new Operand\Literal (line 15106) -- new Operand\Literal (line 15161) -- new Type (line 15239) -- new Variable (line 15432) -- new Variable (line 15513) -- new Variable (line 15554) -- new Variable (line 15586) -- new Operand\Literal (line 15732) -- new Operand\Literal (line 16936) -- new Type (line 18340) -- new Type (line 18375) -- new Type (line 18430) -- new Type (line 18605) -- new Type (line 18651) -- new Variable (line 18902) -- new Variable (line 18923) -- new Variable (line 18949) -- new Variable (line 18974) -- new Variable (line 19022) -- new Type (line 19030) -- new Variable (line 19050) -- new Type (line 19059) -- new Variable (line 19078) -- new Type (line 19086) -- new Variable (line 19112) -- new Type (line 19120) -- new Variable (line 19143) -- new Variable (line 19167) -- new Operand\Literal (line 19301) -- new CompileError (line 20186) -- new CompileError (line 20329) -- new Variable (line 20394) -- new Variable (line 20438) -- new Variable (line 21017) -- new Variable (line 21037) -- new Variable (line 21058) -- new Variable (line 21110) -- new JIT\Call\ForeachIndexedClosureCall (line 21592) -- new Variable (line 21733) -- new Variable (line 21765) -- new Variable (line 21796) -- new Variable (line 21863) -- new Type (line 21898) -- new Variable (line 21992) -- new Variable (line 22034) -- new Variable (line 22060) -- new Variable (line 22322) -- new Variable (line 22340) -- new Type (line 22387) -- new Variable (line 22408) -- new Variable (line 22463) -- new Variable (line 22507) -- new Variable (line 22532) -- new Type (line 22904) -- new Variable (line 22983) -- new Variable (line 23065) -- new Type (line 23077) -- new Type (line 23384) -- new Variable (line 23468) -- new Variable (line 23498) -- new Variable (line 23517) -- new Variable (line 23547) -- new Variable (line 23584) -- new Variable (line 23604) -- new Variable (line 23617) -- new Variable (line 23660) -- new JIT\Variable (line 25486) -- new JIT\Variable (line 25549) -- new OpCode (line 25600) -- new Variable (line 25601) -- new VM\Variable (line 25624) -- new Variable (line 25655) -- new Variable (line 25690) -- new Variable (line 25759) -- new Variable (line 25803) -- new Variable (line 25848) -- new Variable (line 25861) -- new Variable (line 25875) -- new OpCode (line 25897) -- new Variable (line 25898) -- new Variable (line 26232) -- new Variable (line 26288) -- new Variable (line 26326) -- new OpCode (line 26354) -- new Variable (line 26355) -- new Variable (line 26414) -- new OpCode (line 26422) -- new Variable (line 26423) -- new Variable (line 26452) -- new Variable (line 26487) -- new Variable (line 26527) -- new OpCode (line 26542) -- new Variable (line 26543) -- new Variable (line 26611) +- new Variable (line 3101) +- new JIT\Call\Vararg (line 3114) +- new JIT\Call\Native (line 3124) +- new JIT\Call\Native (line 3402) +- new JIT\Variable (line 3642) +- new JIT\Call\Native (line 3659) +- new JIT\Call\Native (line 3704) +- new JIT\Call\Native (line 3774) +- new JIT\Call\Native (line 3816) +- new JIT\Call\Native (line 3861) +- new JIT\Call\Native (line 3916) +- new JIT\Call\Native (line 5104) +- new JIT\Call\Native (line 5135) +- new JIT\Call\Native (line 5182) +- new JIT\Call\Native (line 5256) +- new JIT\Call\Native (line 5310) +- new JIT\Call\Native (line 5397) +- new JIT\Call\Native (line 5890) +- new JIT\Call\Native (line 5921) +- new JIT\Call\Native (line 5957) +- new JIT\Call\Native (line 5992) +- new JIT\Call\Native (line 6027) +- new JIT\Call\Native (line 6062) +- new JIT\Call\Native (line 6174) +- new JIT\Call\Native (line 7400) +- new JIT\Call\Native (line 7438) +- new JIT\Call\Native (line 7472) +- new JIT\Call\Native (line 7593) +- new JIT\Call\Native (line 8243) +- new JIT\Call\Native (line 8315) +- new JIT\Variable (line 8811) +- new Type (line 9187) +- new Type (line 9206) +- new Variable (line 9266) +- new Variable (line 9303) +- new Type (line 9740) +- new Variable (line 9966) +- new Variable (line 10066) +- new Variable (line 10091) +- new Variable (line 10128) +- new Variable (line 10312) +- new Error (line 10546) +- new Variable (line 10583) +- new Variable (line 10591) +- new Operand\Literal (line 10807) +- new Variable (line 11104) +- new Variable (line 11223) +- new Operand\Literal (line 11345) +- new Operand\Literal (line 11425) +- new Operand\Literal (line 11518) +- new Variable (line 12080) +- new Variable (line 12159) +- new Variable (line 12239) +- new Variable (line 12318) +- new Variable (line 12352) +- new VM\Variable (line 12389) +- new OpCode (line 12510) +- new Variable (line 13419) +- new Variable (line 13507) +- new Variable (line 13537) +- new JIT\Call\ClosureWithBinding (line 13555) +- new JIT\Call\EmitCatchableError (line 13649) +- new JIT\Call\RuntimeIndirectClosureCall (line 13695) +- new JIT\Call\RuntimeVariableFunction (line 13743) +- new JIT\Call\EmitCatchableError (line 13787) +- new Variable (line 14103) +- new Variable (line 14117) +- new Variable (line 14141) +- new VM\Variable (line 14611) +- new VM (line 14617) +- new Variable (line 14896) +- new Type (line 14904) +- new Variable (line 14932) +- new Type (line 14940) +- new JIT\Call\RuntimeIndirectInstanceMethodCall (line 14945) +- new Variable (line 14980) +- new Type (line 14991) +- new Operand\Literal (line 15123) +- new Operand\Literal (line 15178) +- new Type (line 15256) +- new Variable (line 15449) +- new Variable (line 15530) +- new Variable (line 15571) +- new Variable (line 15603) +- new Operand\Literal (line 15749) +- new Operand\Literal (line 16953) +- new Type (line 18357) +- new Type (line 18392) +- new Type (line 18447) +- new Type (line 18622) +- new Type (line 18668) +- new Variable (line 18919) +- new Variable (line 18940) +- new Variable (line 18966) +- new Variable (line 18991) +- new Variable (line 19039) +- new Type (line 19047) +- new Variable (line 19067) +- new Type (line 19076) +- new Variable (line 19095) +- new Type (line 19103) +- new Variable (line 19129) +- new Type (line 19137) +- new Variable (line 19160) +- new Variable (line 19184) +- new Operand\Literal (line 19318) +- new CompileError (line 20203) +- new CompileError (line 20346) +- new Variable (line 20411) +- new Variable (line 20455) +- new Variable (line 21034) +- new Variable (line 21054) +- new Variable (line 21075) +- new Variable (line 21127) +- new JIT\Call\ForeachIndexedClosureCall (line 21609) +- new Variable (line 21750) +- new Variable (line 21782) +- new Variable (line 21813) +- new Variable (line 21880) +- new Type (line 21915) +- new Variable (line 22009) +- new Variable (line 22051) +- new Variable (line 22077) +- new Variable (line 22339) +- new Variable (line 22357) +- new Type (line 22404) +- new Variable (line 22425) +- new Variable (line 22480) +- new Variable (line 22524) +- new Variable (line 22549) +- new Type (line 22921) +- new Variable (line 23000) +- new Variable (line 23082) +- new Type (line 23094) +- new Type (line 23401) +- new Variable (line 23485) +- new Variable (line 23515) +- new Variable (line 23534) +- new Variable (line 23564) +- new Variable (line 23601) +- new Variable (line 23621) +- new Variable (line 23634) +- new Variable (line 23677) +- new JIT\Variable (line 25503) +- new JIT\Variable (line 25566) +- new OpCode (line 25617) +- new Variable (line 25618) +- new VM\Variable (line 25641) +- new Variable (line 25672) +- new Variable (line 25707) +- new Variable (line 25776) +- new Variable (line 25820) +- new Variable (line 25865) +- new Variable (line 25878) +- new Variable (line 25892) +- new OpCode (line 25914) +- new Variable (line 25915) +- new Variable (line 26249) +- new Variable (line 26305) +- new Variable (line 26343) +- new OpCode (line 26371) +- new Variable (line 26372) +- new Variable (line 26431) +- new OpCode (line 26439) +- new Variable (line 26440) +- new Variable (line 26469) +- new Variable (line 26504) +- new Variable (line 26544) +- new OpCode (line 26559) +- new Variable (line 26560) - new Variable (line 26628) -- new Variable (line 26635) -- new OpCode (line 26645) -- new Variable (line 26646) -- new Variable (line 26764) -- new Variable (line 26795) -- new Variable (line 26863) -- new Operand\Literal (line 26872) -- new Variable (line 26887) -- new Variable (line 27222) -- new VM\PropertyIsInitializedHandler (line 27324) -- new JIT\Call\RuntimeIndirectInstanceMethodCall (line 27352) -- new JIT\Call\RuntimeIndirectInstanceMethodCall (line 27644) -- new JIT\Call\RuntimeIndirectInstanceMethodCall (line 28533) -- new JIT\Call\EmitCatchableError (line 28888) -- new JIT\Call\RuntimeIndirectInstanceMethodCall (line 29134) -- new JIT\Call\VmCoerceVariableToString (line 29261) -- new JIT\Call\NoOpConstruct (line 29436) -- new JIT\Call\IncludePathResolverResolve (line 29607) -- new Operand\Literal (line 29723) -- new Operand\Literal (line 29725) -- new Operand\Literal (line 29736) -- new Operand\Literal (line 29743) -- new JIT\Call\RuntimeVariableStaticMethodCall (line 29784) -- new JIT\Call\RuntimeVariableStaticMethodCall (line 29816) -- new JIT\Call\RuntimeIndirectStaticMethodCall (line 29859) -- new JIT\Call\NestedJitCompileScopeIsActiveTrue (line 29887) -- new JIT\Call\EmitCatchableError (line 29928) -- new JIT\Call\RuntimeIndirectStaticMethodCall (line 30111) -- new JIT\Call\RuntimeIndirectStaticMethodCall (line 30278) -- new Operand\Literal (line 31073) -- new VM (line 32095) -- new VM\Variable (line 32104) -- new VM\ClassEntry (line 32209) -- new Func\PHP (line 32228) -- new VM\ClassEntry (line 32274) -- new Variable (line 32291) -- new Variable (line 32404) -- new Variable (line 32445) -- new Variable (line 32504) -- new Variable (line 32723) -- new Variable (line 34107) +- new Variable (line 26645) +- new Variable (line 26652) +- new OpCode (line 26662) +- new Variable (line 26663) +- new Variable (line 26781) +- new Variable (line 26812) +- new Variable (line 26880) +- new Operand\Literal (line 26889) +- new Variable (line 26904) +- new Variable (line 27239) +- new VM\PropertyIsInitializedHandler (line 27341) +- new JIT\Call\RuntimeIndirectInstanceMethodCall (line 27369) +- new JIT\Call\RuntimeIndirectInstanceMethodCall (line 27661) +- new JIT\Call\RuntimeIndirectInstanceMethodCall (line 28550) +- new JIT\Call\EmitCatchableError (line 28905) +- new JIT\Call\RuntimeIndirectInstanceMethodCall (line 29151) +- new JIT\Call\VmCoerceVariableToString (line 29278) +- new JIT\Call\NoOpConstruct (line 29453) +- new JIT\Call\IncludePathResolverResolve (line 29624) +- new Operand\Literal (line 29740) +- new Operand\Literal (line 29742) +- new Operand\Literal (line 29753) +- new Operand\Literal (line 29760) +- new JIT\Call\RuntimeVariableStaticMethodCall (line 29801) +- new JIT\Call\RuntimeVariableStaticMethodCall (line 29833) +- new JIT\Call\RuntimeIndirectStaticMethodCall (line 29876) +- new JIT\Call\NestedJitCompileScopeIsActiveTrue (line 29904) +- new JIT\Call\EmitCatchableError (line 29945) +- new JIT\Call\RuntimeIndirectStaticMethodCall (line 30128) +- new JIT\Call\RuntimeIndirectStaticMethodCall (line 30295) +- new Operand\Literal (line 31090) +- new VM (line 32112) +- new VM\Variable (line 32121) +- new VM\ClassEntry (line 32226) +- new Func\PHP (line 32245) +- new VM\ClassEntry (line 32291) +- new Variable (line 32308) +- new Variable (line 32421) +- new Variable (line 32462) +- new Variable (line 32521) +- new Variable (line 32740) +- new Variable (line 34124) - 598 class method(s) - 26 closure(s) @@ -49929,6 +49930,11 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag **Warnings** (review for bootstrap subset): - 6 class method(s) +### `lib/JIT/AotGcSections.php` + +**Warnings** (review for bootstrap subset): +- 6 class method(s) + ### `lib/JIT/ArrayAccessHelper.php` **Warnings** (review for bootstrap subset): @@ -50120,8 +50126,8 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag ### `lib/JIT/BootstrapCompileSmokeM3Emit.php` **Warnings** (review for bootstrap subset): -- new Call\Native (line 794) -- new Call\Native (line 849) +- new Call\Native (line 799) +- new Call\Native (line 854) - 27 class method(s) ### `lib/JIT/BoundMethodCallableHelper.php` @@ -52325,7 +52331,7 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag ### `lib/JIT/Builtin/ReadonlyRaise.php` **Warnings** (review for bootstrap subset): -- new Error (line 513) +- new Error (line 525) - 21 class method(s) ### `lib/JIT/Builtin/RealpathLibcRuntime.php` @@ -57329,359 +57335,359 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag ### `lib/JIT/Context.php` **Warnings** (review for bootstrap subset): -- new Variable (line 899) -- new Scope (line 996) -- new Analyzer (line 1017) -- new Helper (line 1018) -- new Builtin\Refcount (line 1020) -- new Builtin\Output (line 1022) -- new Builtin\Type (line 1023) -- new Builtin\Internal (line 1024) -- new Builtin\VarArg (line 1025) -- new Builtin\ErrorHandler (line 1026) -- new Scope (line 1052) -- new Call\ExternalMethod (line 1107) -- new Call\DomXmlDocumentCreateFromString (line 1191) -- new Call\DomHtmlDocumentCreateFromString (line 1192) -- new Call\DomXmlDocumentCreateFromFile (line 1193) -- new Call\DomHtmlDocumentCreateFromFile (line 1194) -- new Builtin\IsNullFn (line 1692) -- new Builtin\IsNullFn (line 1693) -- new Call\SplObjectStorageMethod (line 1694) -- new Call\SplObjectStorageMethod (line 1695) -- new Call\SplObjectStorageMethod (line 1696) -- new Call\SplObjectStorageMethod (line 1697) -- new Call\SplObjectStorageMethod (line 1698) -- new Call\SplObjectStorageMethod (line 1699) -- new Call\SplObjectStorageMethod (line 1701) -- new Call\SplObjectStorageMethod (line 1702) -- new Call\SplObjectStorageMethod (line 1704) -- new Call\SplObjectStorageMethod (line 1705) +- new Variable (line 906) +- new Scope (line 1003) +- new Analyzer (line 1024) +- new Helper (line 1025) +- new Builtin\Refcount (line 1027) +- new Builtin\Output (line 1029) +- new Builtin\Type (line 1030) +- new Builtin\Internal (line 1031) +- new Builtin\VarArg (line 1032) +- new Builtin\ErrorHandler (line 1033) +- new Scope (line 1059) +- new Call\ExternalMethod (line 1114) +- new Call\DomXmlDocumentCreateFromString (line 1198) +- new Call\DomHtmlDocumentCreateFromString (line 1199) +- new Call\DomXmlDocumentCreateFromFile (line 1200) +- new Call\DomHtmlDocumentCreateFromFile (line 1201) +- new Builtin\IsNullFn (line 1704) +- new Builtin\IsNullFn (line 1705) - new Call\SplObjectStorageMethod (line 1706) +- new Call\SplObjectStorageMethod (line 1707) - new Call\SplObjectStorageMethod (line 1708) - new Call\SplObjectStorageMethod (line 1709) - new Call\SplObjectStorageMethod (line 1710) - new Call\SplObjectStorageMethod (line 1711) -- new Call\SplObjectStorageMethod (line 1712) - new Call\SplObjectStorageMethod (line 1713) - new Call\SplObjectStorageMethod (line 1714) - new Call\SplObjectStorageMethod (line 1716) +- new Call\SplObjectStorageMethod (line 1717) - new Call\SplObjectStorageMethod (line 1718) -- new Call\SplObjectStorageMethod (line 1719) -- new Call\ArrayIteratorConstruct (line 1724) -- new Call\ArrayIteratorConstruct (line 1725) -- new Call\ArrayIteratorMethod (line 1751) -- new Call\ArrayIteratorMethod (line 1755) -- new Call\ArrayIteratorConstruct (line 1762) -- new Call\ArrayObjectMethod (line 1789) -- new Call\RecursiveIteratorIteratorConstruct (line 1792) -- new Call\RecursiveIteratorIteratorArgcMethod (line 1794) -- new Call\RecursiveIteratorIteratorArgcMethod (line 1795) -- new Call\RecursiveIteratorIteratorArgcMethod (line 1796) -- new Call\LimitIteratorConstruct (line 1802) -- new Call\LimitIteratorMethod (line 1803) -- new Call\LimitIteratorMethod (line 1804) -- new Call\AppendIteratorMethod (line 1805) -- new Call\AppendIteratorMethod (line 1806) -- new Call\RegexIteratorConstruct (line 1807) -- new Call\CallbackFilterIteratorConstruct (line 1808) -- new Call\CachingIteratorConstruct (line 1810) -- new Call\CachingIteratorGetCache (line 1811) -- new Call\CachingIteratorMethod (line 1813) -- new Call\SplHtPosIteratorMethod (line 1821) -- new Call\SplHtPosIteratorMethod (line 1827) -- new Call\EmptyIteratorMethod (line 1839) -- new Call\FilterIteratorMethod (line 1848) -- new Call\ParentIteratorConstruct (line 1856) -- new Call\ParentIteratorArgcMethod (line 1858) -- new Call\ParentIteratorArgcMethod (line 1862) -- new Call\MultipleIteratorMethod (line 1866) -- new Call\MultipleIteratorMethod (line 1867) -- new Call\RecursiveTreeIteratorConstruct (line 1868) -- new Call\DirectoryMethod (line 1872) -- new Call\DirectoryIteratorMethod (line 1899) -- new Call\DirectoryIteratorMethod (line 1914) -- new Call\SplFileObjectMethod (line 1934) -- new Call\DirectoryIteratorMethod (line 1946) -- new Call\SplFileObjectMethod (line 1961) -- new Call\DirectoryIteratorMethod (line 1974) -- new Call\GlobIteratorMethod (line 1986) -- new Call\SplHeapMethod (line 2000) -- new Call\SplPriorityQueueMethod (line 2011) -- new Call\SplDllistMethod (line 2037) -- new Call\SplFixedArrayMethod (line 2051) -- new Call\WeakReferenceCreate (line 2054) -- new Call\WeakReferenceGet (line 2055) -- new Call\SensitiveParameterValueConstruct (line 2056) -- new Call\SensitiveParameterValueGetValue (line 2057) -- new Call\WeakMapMethod (line 2058) -- new Call\WeakMapMethod (line 2059) -- new Call\WeakMapMethod (line 2060) -- new Call\WeakMapMethod (line 2061) -- new Call\WeakMapMethod (line 2062) -- new Call\PhpTokenConstruct (line 2065) -- new Call\PhpTokenTokenize (line 2066) -- new Call\PhpTokenGetTokenName (line 2067) -- new Call\BcMathNumberConstruct (line 2070) -- new Call\BcMathNumberToString (line 2071) -- new Call\BcMathNumberMethod (line 2074) -- new Call\ReflectionClassConstruct (line 2078) -- new Call\ReflectionObjectConstruct (line 2079) -- new Call\ReflectionClassGetName (line 2080) -- new Call\ReflectionObjectGetName (line 2082) -- new Call\ReflectionClassGetShortName (line 2083) -- new Call\ReflectionClassGetNamespaceName (line 2084) -- new Call\ReflectionClassInNamespace (line 2085) -- new Call\ReflectionClassGetAttributes (line 2086) -- new Call\ReflectionClassGetMethod (line 2088) -- new Call\ReflectionClassGetConstructor (line 2090) -- new Call\ReflectionClassGetProperty (line 2091) -- new Call\ReflectionClassGetReflectionConstant (line 2092) -- new Call\ReflectionClassHasMember (line 2094) -- new Call\ReflectionClassHasMember (line 2095) -- new Call\ReflectionClassHasMember (line 2096) -- new Call\ReflectionClassGetConstant (line 2098) -- new Call\ReflectionClassGetConstants (line 2100) -- new Call\ReflectionClassGetReflectionConstants (line 2102) -- new Call\ReflectionClassGetFileName (line 2104) -- new Call\ReflectionClassSourceLocationQuery (line 2107) -- new Call\ReflectionClassSourceLocationQuery (line 2108) -- new Call\ReflectionClassSourceLocationQuery (line 2109) -- new Call\ReflectionClassNameListQuery (line 2111) -- new Call\ReflectionClassNameListQuery (line 2112) -- new Call\ReflectionClassClassMapQuery (line 2114) -- new Call\ReflectionClassClassMapQuery (line 2115) -- new Call\ReflectionClassGetTraitAliases (line 2117) -- new Call\ReflectionClassToString (line 2119) -- new Call\ReflectionClassRelationQuery (line 2121) -- new Call\ReflectionClassRelationQuery (line 2122) -- new Call\ReflectionClassIsFinal (line 2124) -- new Call\ReflectionClassIsInstantiable (line 2126) -- new Call\ReflectionClassIsInstance (line 2128) -- new Call\ReflectionClassIsCloneable (line 2130) -- new Call\ReflectionClassIsAnonymous (line 2132) -- new Call\ReflectionClassKindQuery (line 2134) -- new Call\ReflectionClassKindQuery (line 2135) -- new Call\ReflectionClassKindQuery (line 2136) -- new Call\ReflectionClassKindQuery (line 2137) -- new Call\ReflectionClassKindQuery (line 2139) -- new Call\ReflectionClassKindQuery (line 2140) -- new Call\ReflectionClassKindQuery (line 2141) -- new Call\ReflectionClassIsIterateable (line 2143) -- new Call\ReflectionClassIsIterateable (line 2144) -- new Call\ReflectionClassGetParentClass (line 2146) -- new Call\ReflectionClassGetModifiers (line 2148) -- new Call\ReflectionClassNewInstanceWithoutConstructor (line 2150) -- new Call\ReflectionClassNewInstance (line 2152) -- new Call\ReflectionClassNewInstanceArgs (line 2154) -- new Call\ReflectionClassGetDefaultProperties (line 2156) -- new Call\ReflectionClassGetMethods (line 2158) -- new Call\ReflectionClassGetProperties (line 2160) -- new Call\ReflectionClassGetStaticProperties (line 2162) -- new Call\ReflectionClassGetStaticPropertyValue (line 2164) -- new Call\ReflectionClassSetStaticPropertyValue (line 2166) -- new Call\ReflectionClassGetExtensionName (line 2168) -- new Call\ReflectionClassGetExtension (line 2170) -- new Call\ReflectionClassNewLazyProxy (line 2172) -- new Call\ReflectionClassNewLazyGhost (line 2173) -- new Call\ReflectionPropertyConstruct (line 2176) -- new Call\ReflectionPropertyGetName (line 2177) -- new Call\ReflectionParameterConstruct (line 2178) -- new Call\ReflectionParameterGetName (line 2179) -- new Call\ReflectionParameterGetType (line 2180) -- new Call\ReflectionParameterHasType (line 2181) -- new Call\ReflectionParameterAllowsNull (line 2182) -- new Call\ReflectionParameterIsDefaultValueAvailable (line 2183) -- new Call\ReflectionParameterGetDefaultValue (line 2184) -- new Call\ReflectionPropertyGetAttributes (line 2185) -- new Call\ReflectionPropertyIsFinal (line 2187) -- new Call\ReflectionPropertyIsVirtual (line 2188) -- new Call\ReflectionPropertyGetRawValue (line 2189) -- new Call\ReflectionPropertySetRawValue (line 2190) -- new Call\ReflectionSetAccessible (line 2192) -- new Call\ReflectionPropertyGetValue (line 2193) -- new Call\ReflectionPropertySetValue (line 2194) -- new Call\ReflectionGetDeclaringClass (line 2196) -- new Call\ReflectionMethodConstruct (line 2202) -- new Call\ReflectionMethodGetName (line 2204) -- new Call\ReflectionGetDeclaringClass (line 2206) -- new Call\ReflectionSetAccessible (line 2211) -- new Call\ReflectionMethodInvoke (line 2212) -- new Call\ReflectionMethodIsPublic (line 2214) -- new Call\ReflectionMethodIsStatic (line 2215) -- new Call\ReflectionMethodGetNumberOfParameters (line 2216) -- new Call\ReflectionMethodGetNumberOfRequiredParameters (line 2217) -- new Call\ReflectionClassConstantConstruct (line 2218) -- new Call\ReflectionClassConstantGetName (line 2219) -- new Call\ReflectionPropertyGetMangledName (line 2221) -- new Call\ReflectionConstantConstruct (line 2224) -- new Call\ReflectionConstantGetName (line 2225) -- new Call\ReflectionConstantGetValue (line 2226) -- new Call\ReflectionConstantGetAttributes (line 2229) -- new Call\ReflectionClassConstantGetAttributes (line 2232) -- new Call\ReflectionMethodGetAttributes (line 2233) -- new Call\ReflectionFunctionConstruct (line 2234) -- new Call\ReflectionFunctionGetName (line 2235) -- new Call\ReflectionExtensionConstruct (line 2237) -- new Call\ReflectionExtensionGetName (line 2238) -- new Call\ReflectionExtensionGetVersion (line 2240) -- new Call\ReflectionExtensionGetClassNames (line 2242) -- new Call\ReflectionExtensionGetClasses (line 2244) -- new Call\ReflectionExtensionGetFunctions (line 2246) -- new Call\ReflectionExtensionIsPersistent (line 2248) -- new Call\ReflectionExtensionIsTemporary (line 2249) -- new Call\ReflectionExtensionGetDependencies (line 2251) -- new Call\ReflectionExtensionGetConstants (line 2253) -- new Call\ReflectionExtensionGetINIEntries (line 2255) -- new Call\ReflectionExtensionToString (line 2257) -- new Call\ReflectionExtensionInfo (line 2258) -- new Call\ReflectionFunctionIsVariadic (line 2260) -- new Call\ReflectionFunctionGetNumberOfParameters (line 2262) -- new Call\ReflectionFunctionGetNumberOfRequiredParameters (line 2263) -- new Call\ReflectionFunctionGetParameters (line 2264) -- new Call\ReflectionFunctionGetReturnType (line 2265) -- new Call\ReflectionFunctionHasReturnType (line 2266) -- new Call\ReflectionFunctionIsUserDefined (line 2267) -- new Call\ReflectionFunctionIsInternal (line 2268) -- new Call\ReflectionParameterIsSensitiveParameter (line 2270) -- new Call\ReflectionParameterIsVariadic (line 2272) -- new Call\ReflectionParameterIsOptional (line 2273) -- new Call\ReflectionFunctionGetNamedArguments (line 2275) -- new Call\ReflectionMethodGetNamedArguments (line 2276) -- new Call\ReflectionAttributeGetName (line 2278) -- new Call\ReflectionAttributeGetTarget (line 2279) -- new Call\ReflectionAttributeNewInstance (line 2280) -- new Call\ReflectionEnumConstruct (line 2281) -- new Call\ReflectionEnumGetName (line 2282) -- new Call\ReflectionEnumHasCase (line 2283) -- new Call\ReflectionEnumGetCase (line 2284) -- new Call\ReflectionEnumGetCases (line 2285) -- new Call\ReflectionEnumIsBacked (line 2286) -- new Call\ReflectionEnumGetBackingType (line 2287) -- new Call\ReflectionEnumUnitCaseGetName (line 2288) -- new Call\ReflectionEnumUnitCaseGetName (line 2289) -- new Call\ReflectionEnumUnitCaseGetValue (line 2290) -- new Call\ReflectionNamedTypeGetName (line 2293) -- new Call\ReflectionNamedTypeToString (line 2294) -- new Call\ReflectionUnionTypeToString (line 2295) -- new Call\ExceptionGetMessage (line 2296) -- new Call\ExceptionGetCode (line 2297) -- new Call\ExceptionToString (line 2298) -- new Call\ExceptionGetTrace (line 2299) -- new Call\ExceptionGetTraceAsString (line 2300) -- new Call\ExceptionGetFile (line 2301) -- new Call\ExceptionGetLine (line 2302) -- new Call\ExceptionGetPrevious (line 2303) -- new Call\ExceptionConstruct (line 2327) -- new Call\ExceptionGetTrace (line 2339) -- new Call\ExceptionGetTraceAsString (line 2342) -- new Call\ExceptionGetMessage (line 2345) -- new Call\ExceptionGetCode (line 2348) -- new Call\ExceptionGetFile (line 2351) -- new Call\ExceptionGetLine (line 2354) -- new Call\ExceptionGetPrevious (line 2357) -- new Call\ExceptionGetMessage (line 2361) -- new Call\ExceptionGetCode (line 2362) -- new Call\ExceptionGetTrace (line 2364) -- new Call\ExceptionGetTraceAsString (line 2365) -- new Call\ExceptionGetFile (line 2366) -- new Call\ExceptionGetLine (line 2367) -- new Call\ExceptionGetPrevious (line 2368) -- new Call\DateTimeConstruct (line 2374) -- new Call\DateTimeImmutableConstruct (line 2375) -- new Call\DomDocumentConstruct (line 2377) -- new Call\ZipArchiveConstruct (line 2379) -- new Call\ZipArchiveMethod (line 2437) -- new Call\Sqlite3Method (line 2445) -- new Call\Sqlite3StmtMethod (line 2451) -- new Call\Sqlite3ResultMethod (line 2457) -- new Call\DateTimeZoneConstruct (line 2462) -- new Call\DateIntervalConstruct (line 2463) -- new Call\DateIntervalFormat (line 2464) -- new Call\DatePeriodConstruct (line 2465) -- new Call\DatePeriodCreateFromISO8601String (line 2467) -- new Call\DatePeriodIteratorMethod (line 2469) -- new Call\DatePeriodAccessorMethod (line 2474) -- new Call\DateTimeFormat (line 2476) -- new Call\DateTimeFormat (line 2477) -- new Call\DateTimeCreateFromFormat (line 2479) -- new Call\DateTimeCreateFromFormat (line 2480) -- new Call\DateTimeCreateFromInterface (line 2482) -- new Call\DateTimeCreateFromInterface (line 2483) -- new Call\DateTimeCreateFromImmutable (line 2484) -- new Call\DateTimeImmutableCreateFromMutable (line 2485) -- new Call\DateTimeCreateFromTimestamp (line 2488) -- new Call\DateTimeCreateFromTimestamp (line 2489) -- new Call\DateTimeGetMicrosecond (line 2493) -- new Call\DateTimeGetMicrosecond (line 2494) -- new Call\DateTimeSetMicrosecond (line 2495) -- new Call\DateTimeSetMicrosecond (line 2496) -- new Call\DateIntervalCreateFromDateString (line 2499) -- new Call\DateTimeSetTimezone (line 2501) -- new Call\DateTimeGetTimezone (line 2502) -- new Call\DateTimeGetTimezone (line 2503) -- new Call\DateTimeGetOffset (line 2506) -- new Call\DateTimeGetOffset (line 2507) +- new Call\SplObjectStorageMethod (line 1720) +- new Call\SplObjectStorageMethod (line 1721) +- new Call\SplObjectStorageMethod (line 1722) +- new Call\SplObjectStorageMethod (line 1723) +- new Call\SplObjectStorageMethod (line 1724) +- new Call\SplObjectStorageMethod (line 1725) +- new Call\SplObjectStorageMethod (line 1726) +- new Call\SplObjectStorageMethod (line 1728) +- new Call\SplObjectStorageMethod (line 1730) +- new Call\SplObjectStorageMethod (line 1731) +- new Call\ArrayIteratorConstruct (line 1736) +- new Call\ArrayIteratorConstruct (line 1737) +- new Call\ArrayIteratorMethod (line 1763) +- new Call\ArrayIteratorMethod (line 1767) +- new Call\ArrayIteratorConstruct (line 1774) +- new Call\ArrayObjectMethod (line 1801) +- new Call\RecursiveIteratorIteratorConstruct (line 1804) +- new Call\RecursiveIteratorIteratorArgcMethod (line 1806) +- new Call\RecursiveIteratorIteratorArgcMethod (line 1807) +- new Call\RecursiveIteratorIteratorArgcMethod (line 1808) +- new Call\LimitIteratorConstruct (line 1814) +- new Call\LimitIteratorMethod (line 1815) +- new Call\LimitIteratorMethod (line 1816) +- new Call\AppendIteratorMethod (line 1817) +- new Call\AppendIteratorMethod (line 1818) +- new Call\RegexIteratorConstruct (line 1819) +- new Call\CallbackFilterIteratorConstruct (line 1820) +- new Call\CachingIteratorConstruct (line 1822) +- new Call\CachingIteratorGetCache (line 1823) +- new Call\CachingIteratorMethod (line 1825) +- new Call\SplHtPosIteratorMethod (line 1833) +- new Call\SplHtPosIteratorMethod (line 1839) +- new Call\EmptyIteratorMethod (line 1851) +- new Call\FilterIteratorMethod (line 1860) +- new Call\ParentIteratorConstruct (line 1868) +- new Call\ParentIteratorArgcMethod (line 1870) +- new Call\ParentIteratorArgcMethod (line 1874) +- new Call\MultipleIteratorMethod (line 1878) +- new Call\MultipleIteratorMethod (line 1879) +- new Call\RecursiveTreeIteratorConstruct (line 1880) +- new Call\DirectoryMethod (line 1884) +- new Call\DirectoryIteratorMethod (line 1911) +- new Call\DirectoryIteratorMethod (line 1926) +- new Call\SplFileObjectMethod (line 1946) +- new Call\DirectoryIteratorMethod (line 1958) +- new Call\SplFileObjectMethod (line 1973) +- new Call\DirectoryIteratorMethod (line 1986) +- new Call\GlobIteratorMethod (line 1998) +- new Call\SplHeapMethod (line 2012) +- new Call\SplPriorityQueueMethod (line 2023) +- new Call\SplDllistMethod (line 2049) +- new Call\SplFixedArrayMethod (line 2063) +- new Call\WeakReferenceCreate (line 2066) +- new Call\WeakReferenceGet (line 2067) +- new Call\SensitiveParameterValueConstruct (line 2068) +- new Call\SensitiveParameterValueGetValue (line 2069) +- new Call\WeakMapMethod (line 2070) +- new Call\WeakMapMethod (line 2071) +- new Call\WeakMapMethod (line 2072) +- new Call\WeakMapMethod (line 2073) +- new Call\WeakMapMethod (line 2074) +- new Call\PhpTokenConstruct (line 2077) +- new Call\PhpTokenTokenize (line 2078) +- new Call\PhpTokenGetTokenName (line 2079) +- new Call\BcMathNumberConstruct (line 2082) +- new Call\BcMathNumberToString (line 2083) +- new Call\BcMathNumberMethod (line 2086) +- new Call\ReflectionClassConstruct (line 2090) +- new Call\ReflectionObjectConstruct (line 2091) +- new Call\ReflectionClassGetName (line 2092) +- new Call\ReflectionObjectGetName (line 2094) +- new Call\ReflectionClassGetShortName (line 2095) +- new Call\ReflectionClassGetNamespaceName (line 2096) +- new Call\ReflectionClassInNamespace (line 2097) +- new Call\ReflectionClassGetAttributes (line 2098) +- new Call\ReflectionClassGetMethod (line 2100) +- new Call\ReflectionClassGetConstructor (line 2102) +- new Call\ReflectionClassGetProperty (line 2103) +- new Call\ReflectionClassGetReflectionConstant (line 2104) +- new Call\ReflectionClassHasMember (line 2106) +- new Call\ReflectionClassHasMember (line 2107) +- new Call\ReflectionClassHasMember (line 2108) +- new Call\ReflectionClassGetConstant (line 2110) +- new Call\ReflectionClassGetConstants (line 2112) +- new Call\ReflectionClassGetReflectionConstants (line 2114) +- new Call\ReflectionClassGetFileName (line 2116) +- new Call\ReflectionClassSourceLocationQuery (line 2119) +- new Call\ReflectionClassSourceLocationQuery (line 2120) +- new Call\ReflectionClassSourceLocationQuery (line 2121) +- new Call\ReflectionClassNameListQuery (line 2123) +- new Call\ReflectionClassNameListQuery (line 2124) +- new Call\ReflectionClassClassMapQuery (line 2126) +- new Call\ReflectionClassClassMapQuery (line 2127) +- new Call\ReflectionClassGetTraitAliases (line 2129) +- new Call\ReflectionClassToString (line 2131) +- new Call\ReflectionClassRelationQuery (line 2133) +- new Call\ReflectionClassRelationQuery (line 2134) +- new Call\ReflectionClassIsFinal (line 2136) +- new Call\ReflectionClassIsInstantiable (line 2138) +- new Call\ReflectionClassIsInstance (line 2140) +- new Call\ReflectionClassIsCloneable (line 2142) +- new Call\ReflectionClassIsAnonymous (line 2144) +- new Call\ReflectionClassKindQuery (line 2146) +- new Call\ReflectionClassKindQuery (line 2147) +- new Call\ReflectionClassKindQuery (line 2148) +- new Call\ReflectionClassKindQuery (line 2149) +- new Call\ReflectionClassKindQuery (line 2151) +- new Call\ReflectionClassKindQuery (line 2152) +- new Call\ReflectionClassKindQuery (line 2153) +- new Call\ReflectionClassIsIterateable (line 2155) +- new Call\ReflectionClassIsIterateable (line 2156) +- new Call\ReflectionClassGetParentClass (line 2158) +- new Call\ReflectionClassGetModifiers (line 2160) +- new Call\ReflectionClassNewInstanceWithoutConstructor (line 2162) +- new Call\ReflectionClassNewInstance (line 2164) +- new Call\ReflectionClassNewInstanceArgs (line 2166) +- new Call\ReflectionClassGetDefaultProperties (line 2168) +- new Call\ReflectionClassGetMethods (line 2170) +- new Call\ReflectionClassGetProperties (line 2172) +- new Call\ReflectionClassGetStaticProperties (line 2174) +- new Call\ReflectionClassGetStaticPropertyValue (line 2176) +- new Call\ReflectionClassSetStaticPropertyValue (line 2178) +- new Call\ReflectionClassGetExtensionName (line 2180) +- new Call\ReflectionClassGetExtension (line 2182) +- new Call\ReflectionClassNewLazyProxy (line 2184) +- new Call\ReflectionClassNewLazyGhost (line 2185) +- new Call\ReflectionPropertyConstruct (line 2188) +- new Call\ReflectionPropertyGetName (line 2189) +- new Call\ReflectionParameterConstruct (line 2190) +- new Call\ReflectionParameterGetName (line 2191) +- new Call\ReflectionParameterGetType (line 2192) +- new Call\ReflectionParameterHasType (line 2193) +- new Call\ReflectionParameterAllowsNull (line 2194) +- new Call\ReflectionParameterIsDefaultValueAvailable (line 2195) +- new Call\ReflectionParameterGetDefaultValue (line 2196) +- new Call\ReflectionPropertyGetAttributes (line 2197) +- new Call\ReflectionPropertyIsFinal (line 2199) +- new Call\ReflectionPropertyIsVirtual (line 2200) +- new Call\ReflectionPropertyGetRawValue (line 2201) +- new Call\ReflectionPropertySetRawValue (line 2202) +- new Call\ReflectionSetAccessible (line 2204) +- new Call\ReflectionPropertyGetValue (line 2205) +- new Call\ReflectionPropertySetValue (line 2206) +- new Call\ReflectionGetDeclaringClass (line 2208) +- new Call\ReflectionMethodConstruct (line 2214) +- new Call\ReflectionMethodGetName (line 2216) +- new Call\ReflectionGetDeclaringClass (line 2218) +- new Call\ReflectionSetAccessible (line 2223) +- new Call\ReflectionMethodInvoke (line 2224) +- new Call\ReflectionMethodIsPublic (line 2226) +- new Call\ReflectionMethodIsStatic (line 2227) +- new Call\ReflectionMethodGetNumberOfParameters (line 2228) +- new Call\ReflectionMethodGetNumberOfRequiredParameters (line 2229) +- new Call\ReflectionClassConstantConstruct (line 2230) +- new Call\ReflectionClassConstantGetName (line 2231) +- new Call\ReflectionPropertyGetMangledName (line 2233) +- new Call\ReflectionConstantConstruct (line 2236) +- new Call\ReflectionConstantGetName (line 2237) +- new Call\ReflectionConstantGetValue (line 2238) +- new Call\ReflectionConstantGetAttributes (line 2241) +- new Call\ReflectionClassConstantGetAttributes (line 2244) +- new Call\ReflectionMethodGetAttributes (line 2245) +- new Call\ReflectionFunctionConstruct (line 2246) +- new Call\ReflectionFunctionGetName (line 2247) +- new Call\ReflectionExtensionConstruct (line 2249) +- new Call\ReflectionExtensionGetName (line 2250) +- new Call\ReflectionExtensionGetVersion (line 2252) +- new Call\ReflectionExtensionGetClassNames (line 2254) +- new Call\ReflectionExtensionGetClasses (line 2256) +- new Call\ReflectionExtensionGetFunctions (line 2258) +- new Call\ReflectionExtensionIsPersistent (line 2260) +- new Call\ReflectionExtensionIsTemporary (line 2261) +- new Call\ReflectionExtensionGetDependencies (line 2263) +- new Call\ReflectionExtensionGetConstants (line 2265) +- new Call\ReflectionExtensionGetINIEntries (line 2267) +- new Call\ReflectionExtensionToString (line 2269) +- new Call\ReflectionExtensionInfo (line 2270) +- new Call\ReflectionFunctionIsVariadic (line 2272) +- new Call\ReflectionFunctionGetNumberOfParameters (line 2274) +- new Call\ReflectionFunctionGetNumberOfRequiredParameters (line 2275) +- new Call\ReflectionFunctionGetParameters (line 2276) +- new Call\ReflectionFunctionGetReturnType (line 2277) +- new Call\ReflectionFunctionHasReturnType (line 2278) +- new Call\ReflectionFunctionIsUserDefined (line 2279) +- new Call\ReflectionFunctionIsInternal (line 2280) +- new Call\ReflectionParameterIsSensitiveParameter (line 2282) +- new Call\ReflectionParameterIsVariadic (line 2284) +- new Call\ReflectionParameterIsOptional (line 2285) +- new Call\ReflectionFunctionGetNamedArguments (line 2287) +- new Call\ReflectionMethodGetNamedArguments (line 2288) +- new Call\ReflectionAttributeGetName (line 2290) +- new Call\ReflectionAttributeGetTarget (line 2291) +- new Call\ReflectionAttributeNewInstance (line 2292) +- new Call\ReflectionEnumConstruct (line 2293) +- new Call\ReflectionEnumGetName (line 2294) +- new Call\ReflectionEnumHasCase (line 2295) +- new Call\ReflectionEnumGetCase (line 2296) +- new Call\ReflectionEnumGetCases (line 2297) +- new Call\ReflectionEnumIsBacked (line 2298) +- new Call\ReflectionEnumGetBackingType (line 2299) +- new Call\ReflectionEnumUnitCaseGetName (line 2300) +- new Call\ReflectionEnumUnitCaseGetName (line 2301) +- new Call\ReflectionEnumUnitCaseGetValue (line 2302) +- new Call\ReflectionNamedTypeGetName (line 2305) +- new Call\ReflectionNamedTypeToString (line 2306) +- new Call\ReflectionUnionTypeToString (line 2307) +- new Call\ExceptionGetMessage (line 2308) +- new Call\ExceptionGetCode (line 2309) +- new Call\ExceptionToString (line 2310) +- new Call\ExceptionGetTrace (line 2311) +- new Call\ExceptionGetTraceAsString (line 2312) +- new Call\ExceptionGetFile (line 2313) +- new Call\ExceptionGetLine (line 2314) +- new Call\ExceptionGetPrevious (line 2315) +- new Call\ExceptionConstruct (line 2339) +- new Call\ExceptionGetTrace (line 2351) +- new Call\ExceptionGetTraceAsString (line 2354) +- new Call\ExceptionGetMessage (line 2357) +- new Call\ExceptionGetCode (line 2360) +- new Call\ExceptionGetFile (line 2363) +- new Call\ExceptionGetLine (line 2366) +- new Call\ExceptionGetPrevious (line 2369) +- new Call\ExceptionGetMessage (line 2373) +- new Call\ExceptionGetCode (line 2374) +- new Call\ExceptionGetTrace (line 2376) +- new Call\ExceptionGetTraceAsString (line 2377) +- new Call\ExceptionGetFile (line 2378) +- new Call\ExceptionGetLine (line 2379) +- new Call\ExceptionGetPrevious (line 2380) +- new Call\DateTimeConstruct (line 2386) +- new Call\DateTimeImmutableConstruct (line 2387) +- new Call\DomDocumentConstruct (line 2389) +- new Call\ZipArchiveConstruct (line 2391) +- new Call\ZipArchiveMethod (line 2449) +- new Call\Sqlite3Method (line 2457) +- new Call\Sqlite3StmtMethod (line 2463) +- new Call\Sqlite3ResultMethod (line 2469) +- new Call\DateTimeZoneConstruct (line 2474) +- new Call\DateIntervalConstruct (line 2475) +- new Call\DateIntervalFormat (line 2476) +- new Call\DatePeriodConstruct (line 2477) +- new Call\DatePeriodCreateFromISO8601String (line 2479) +- new Call\DatePeriodIteratorMethod (line 2481) +- new Call\DatePeriodAccessorMethod (line 2486) +- new Call\DateTimeFormat (line 2488) +- new Call\DateTimeFormat (line 2489) +- new Call\DateTimeCreateFromFormat (line 2491) +- new Call\DateTimeCreateFromFormat (line 2492) +- new Call\DateTimeCreateFromInterface (line 2494) +- new Call\DateTimeCreateFromInterface (line 2495) +- new Call\DateTimeCreateFromImmutable (line 2496) +- new Call\DateTimeImmutableCreateFromMutable (line 2497) +- new Call\DateTimeCreateFromTimestamp (line 2500) +- new Call\DateTimeCreateFromTimestamp (line 2501) +- new Call\DateTimeGetMicrosecond (line 2505) +- new Call\DateTimeGetMicrosecond (line 2506) +- new Call\DateTimeSetMicrosecond (line 2507) +- new Call\DateTimeSetMicrosecond (line 2508) +- new Call\DateIntervalCreateFromDateString (line 2511) - new Call\DateTimeSetTimezone (line 2513) -- new Call\DateTimeGetTimestamp (line 2517) -- new Call\DateTimeGetTimestamp (line 2518) -- new Call\DateTimeSetTimestamp (line 2519) -- new Call\DateTimeSetTimestamp (line 2521) -- new Call\DateTimeSetDate (line 2524) -- new Call\DateTimeSetDate (line 2525) -- new Call\DateTimeSetTime (line 2526) -- new Call\DateTimeSetTime (line 2527) -- new Call\DateTimeSetISODate (line 2528) -- new Call\DateTimeSetISODate (line 2529) -- new Call\DateTimeGetLastErrors (line 2531) -- new Call\DateTimeGetLastErrors (line 2532) -- new Call\DateTimeModify (line 2535) -- new Call\DateTimeModify (line 2536) -- new Call\DateTimeAdd (line 2539) -- new Call\DateTimeAdd (line 2540) -- new Call\DateTimeSub (line 2541) -- new Call\DateTimeSub (line 2542) -- new Call\ProceduralDateAdd (line 2544) -- new Call\ProceduralDateSub (line 2545) -- new Call\DateTimeDiff (line 2547) -- new Call\DateTimeDiff (line 2548) -- new Call\DateTimeZoneGetTransitions (line 2550) -- new Call\DateTimeZoneGetName (line 2552) -- new Call\DateTimeZoneGetLocation (line 2554) -- new Call\DateTimeZoneGetOffset (line 2556) -- new Call\DateTimeZoneListIdentifiers (line 2558) -- new Call\DateTimeZoneListAbbreviations (line 2560) -- new Call\NumberFormatterCreate (line 2572) -- new Call\NumberFormatterFormat (line 2573) -- new Call\IntlDateFormatterCreate (line 2575) -- new Call\IntlDateFormatterFormat (line 2576) -- new Call\CollatorCompare (line 2578) -- new Call\NormalizerNormalize (line 2580) -- new Call\MessageFormatterConstruct (line 2582) -- new Call\MessageFormatterFormat (line 2583) -- new Call\TransliteratorCreate (line 2585) -- new Call\TransliteratorTransliterate (line 2586) -- new Call\FinfoConstruct (line 2588) -- new Call\FinfoFile (line 2589) -- new Call\FinfoBuffer (line 2590) -- new Call\FinfoSetFlags (line 2591) -- new Call\PdoConstruct (line 2593) -- new Call\PdoGetAvailableDrivers (line 2594) -- new Call\PdoQuote (line 2595) -- new Result (line 3126) -- new Result (line 3148) -- new Variable (line 4021) -- new Variable (line 4282) -- new Variable (line 4575) -- new Variable (line 4702) -- new VMVariable (line 4871) -- new VMVariable (line 4887) -- new VMVariable (line 4893) -- new VMVariable (line 4899) -- new VMVariable (line 4910) -- new Variable (line 4974) -- new Variable (line 4994) -- new Variable (line 5039) +- new Call\DateTimeGetTimezone (line 2514) +- new Call\DateTimeGetTimezone (line 2515) +- new Call\DateTimeGetOffset (line 2518) +- new Call\DateTimeGetOffset (line 2519) +- new Call\DateTimeSetTimezone (line 2525) +- new Call\DateTimeGetTimestamp (line 2529) +- new Call\DateTimeGetTimestamp (line 2530) +- new Call\DateTimeSetTimestamp (line 2531) +- new Call\DateTimeSetTimestamp (line 2533) +- new Call\DateTimeSetDate (line 2536) +- new Call\DateTimeSetDate (line 2537) +- new Call\DateTimeSetTime (line 2538) +- new Call\DateTimeSetTime (line 2539) +- new Call\DateTimeSetISODate (line 2540) +- new Call\DateTimeSetISODate (line 2541) +- new Call\DateTimeGetLastErrors (line 2543) +- new Call\DateTimeGetLastErrors (line 2544) +- new Call\DateTimeModify (line 2547) +- new Call\DateTimeModify (line 2548) +- new Call\DateTimeAdd (line 2551) +- new Call\DateTimeAdd (line 2552) +- new Call\DateTimeSub (line 2553) +- new Call\DateTimeSub (line 2554) +- new Call\ProceduralDateAdd (line 2556) +- new Call\ProceduralDateSub (line 2557) +- new Call\DateTimeDiff (line 2559) +- new Call\DateTimeDiff (line 2560) +- new Call\DateTimeZoneGetTransitions (line 2562) +- new Call\DateTimeZoneGetName (line 2564) +- new Call\DateTimeZoneGetLocation (line 2566) +- new Call\DateTimeZoneGetOffset (line 2568) +- new Call\DateTimeZoneListIdentifiers (line 2570) +- new Call\DateTimeZoneListAbbreviations (line 2572) +- new Call\NumberFormatterCreate (line 2584) +- new Call\NumberFormatterFormat (line 2585) +- new Call\IntlDateFormatterCreate (line 2587) +- new Call\IntlDateFormatterFormat (line 2588) +- new Call\CollatorCompare (line 2590) +- new Call\NormalizerNormalize (line 2592) +- new Call\MessageFormatterConstruct (line 2594) +- new Call\MessageFormatterFormat (line 2595) +- new Call\TransliteratorCreate (line 2597) +- new Call\TransliteratorTransliterate (line 2598) +- new Call\FinfoConstruct (line 2600) +- new Call\FinfoFile (line 2601) +- new Call\FinfoBuffer (line 2602) +- new Call\FinfoSetFlags (line 2603) +- new Call\PdoConstruct (line 2605) +- new Call\PdoGetAvailableDrivers (line 2606) +- new Call\PdoQuote (line 2607) +- new Result (line 3139) +- new Result (line 3161) +- new Variable (line 4034) +- new Variable (line 4295) +- new Variable (line 4588) +- new Variable (line 4715) +- new VMVariable (line 4884) +- new VMVariable (line 4900) +- new VMVariable (line 4906) +- new VMVariable (line 4912) +- new VMVariable (line 4923) +- new Variable (line 4987) +- new Variable (line 5007) +- new Variable (line 5052) - 121 class method(s) - 31 closure(s) @@ -57700,7 +57706,7 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag ### `lib/JIT/DiscardedPureCallElision.php` **Warnings** (review for bootstrap subset): -- 1 class method(s) +- 5 class method(s) ### `lib/JIT/DnfParamCheck.php` diff --git a/lib/AOT/Linker.php b/lib/AOT/Linker.php index bdf700bce58..c3665845bc1 100644 --- a/lib/AOT/Linker.php +++ b/lib/AOT/Linker.php @@ -5,6 +5,7 @@ namespace PHPCompiler\AOT; use PHPCompiler\JIT\AotDebugSymbols; +use PHPCompiler\JIT\AotGcSections; use PHPCompiler\JIT\Builtin\OpensslSignRuntime; /** @@ -112,6 +113,8 @@ public static function link(string $objectFile, string $executable): void $cmd = implode(' ', [ escapeshellarg($ld), AotDebugSymbols::linkFlag(), + AotGcSections::linkStripFlag(), + AotGcSections::linkGcSectionsFlag(false), self::helperMuldefsFlag('-z muldefs'), self::libcNameHideFlag(false), '-dynamic-linker /lib64/ld-linux-x86-64.so.2', @@ -149,7 +152,7 @@ public static function link(string $objectFile, string $executable): void // When linking with the bundled clang, ensure we can still resolve host libraries // (libpcre2-8, libcrypt, ...). Some bootstrap envs only ship the runtime .so/.a under // /usr/lib/x86_64-linux-gnu without a full sysroot lib tree. - $cmd = escapeshellarg($clang).' '.AotDebugSymbols::linkFlag().self::helperMuldefsFlag(' -Wl,-z,muldefs').self::libcNameHideFlag(true).$objects.' '.self::HOST_LIB_SEARCH.' -lm '.self::runtimeLinkLibs().' -o '.escapeshellarg($executable); + $cmd = escapeshellarg($clang).' '.AotDebugSymbols::linkFlag().AotGcSections::linkStripFlag().AotGcSections::linkGcSectionsFlag(true).self::helperMuldefsFlag(' -Wl,-z,muldefs').self::libcNameHideFlag(true).$objects.' '.self::HOST_LIB_SEARCH.' -lm '.self::runtimeLinkLibs().' -o '.escapeshellarg($executable); self::run($cmd, $env); self::unlinkIfTemp($runtimeObjects); @@ -543,7 +546,7 @@ private static function linkWithSystemCompiler( continue; } $cmd = escapeshellarg($path) . ' ' - . AotDebugSymbols::linkFlag() . self::helperMuldefsFlag(' -Wl,-z,muldefs') . self::libcNameHideFlag(true) . $objects . ' '.self::HOST_LIB_SEARCH.' -lm '.self::RUNTIME_LINK_LIBS.' -o ' . escapeshellarg($executable); + . AotDebugSymbols::linkFlag() . AotGcSections::linkStripFlag() . AotGcSections::linkGcSectionsFlag(true) . self::helperMuldefsFlag(' -Wl,-z,muldefs') . self::libcNameHideFlag(true) . $objects . ' '.self::HOST_LIB_SEARCH.' -lm '.self::RUNTIME_LINK_LIBS.' -o ' . escapeshellarg($executable); $captured = self::runCaptured($cmd, null); if (0 === $captured['code']) { self::unlinkIfTemp($runtimeObjects); diff --git a/lib/JIT/AotGcSections.php b/lib/JIT/AotGcSections.php new file mode 100644 index 00000000000..b6fad11d1f8 --- /dev/null +++ b/lib/JIT/AotGcSections.php @@ -0,0 +1,90 @@ +` so ld --gc-sections can drop bodies + * that are not reachable from main / llvm.global_ctors / .init_array. + */ + public static function applyFunctionSections(PHPLLVM\LLVM $llvm, PHPLLVM\Module $module): void + { + if (!self::isEnabled()) { + return; + } + $function = $module->getFirstFunction(); + while (null !== $function) { + if ($function instanceof PHPLLVM\Value\Function_ + && $function->countBasicBlocks() > 0) { + $name = self::llvmValueName($llvm, $function); + if ('' !== $name) { + $llvm->lib->LLVMSetSection($function->value, '.text.'.$name); + } + } + $function = $function->getNext(); + } + } + + private static function llvmValueName(PHPLLVM\LLVM $llvm, PHPLLVM\Value $value): string + { + $raw = $llvm->lib->LLVMGetValueName($value->value); + if (null === $raw) { + return ''; + } + + return $raw->toString(); + } + + /** @param bool $asWlPrefix true for clang/gcc drivers */ + public static function linkGcSectionsFlag(bool $asWlPrefix): string + { + if (!self::isEnabled()) { + return ''; + } + + return $asWlPrefix ? ' -Wl,--gc-sections ' : ' --gc-sections '; + } + + public static function linkStripFlag(): string + { + return self::stripAtLink() ? '-s ' : ''; + } +} diff --git a/lib/JIT/Context.php b/lib/JIT/Context.php index a99a808cd85..01c1f9ebe09 100644 --- a/lib/JIT/Context.php +++ b/lib/JIT/Context.php @@ -3099,6 +3099,7 @@ public function compileToFile(string $file) { || $vendorObjectOnly; // M5 vendor argv uses -o path ending in .o; do not append a second .o (#3054). $objectFile = $keepingObjectOnly && str_ends_with($file, '.o') ? $file : $file.'.o'; + AotGcSections::applyFunctionSections($this->llvm, $this->module); Progress::noteFunction('jit_context_emit_object_begin'); $machine->emitToFile($this->module, $objectFile, $machine::CODEGEN_FILE_TYPE_OBJECT); Progress::noteFunction('jit_context_emit_object_done'); diff --git a/prelinked/bootstrap-gen0/.m3_compiler_lib_sidecar.sha b/prelinked/bootstrap-gen0/.m3_compiler_lib_sidecar.sha index 0fe2976de5f..164722c594e 100755 --- a/prelinked/bootstrap-gen0/.m3_compiler_lib_sidecar.sha +++ b/prelinked/bootstrap-gen0/.m3_compiler_lib_sidecar.sha @@ -1 +1 @@ -41f5cf26dd5186729bdc819893627dc53dd56b5a \ No newline at end of file +509ecf910f461ad81cff53279b51aa22fe8f924b \ No newline at end of file diff --git a/script/bootstrap-selfhost-vm-driver-execute-probe.sh b/script/bootstrap-selfhost-vm-driver-execute-probe.sh index 67a6c1e5e91..c80ae6a2d4d 100755 --- a/script/bootstrap-selfhost-vm-driver-execute-probe.sh +++ b/script/bootstrap-selfhost-vm-driver-execute-probe.sh @@ -6,6 +6,8 @@ # BOOTSTRAP_VM_DRIVER_EXECUTE_PROBE_FULL_LINK=1 (north-star5 / post-spine-entry edits). set -euo pipefail ROOT="$(cd "$(dirname "$0")/.." && pwd)" +# shellcheck source=bootstrap-gen0-install-prelinked-driver.sh +source "$(dirname "$0")/bootstrap-gen0-install-prelinked-driver.sh" ENTRY="${ROOT}/test/selfhost/compiler_lib_spine_smoke/main.php" OUT="${ROOT}/build/selfhost-lib-spine-smoke" LINK="${ROOT}/script/bootstrap-selfhost-lib-spine-smoke-link.sh" @@ -92,9 +94,6 @@ if [[ -x "${OUT}" ]]; then fast_probe_failed=1 fi -# shellcheck source=bootstrap-gen0-install-prelinked-driver.sh -source "$(dirname "$0")/bootstrap-gen0-install-prelinked-driver.sh" - full_link="${BOOTSTRAP_VM_DRIVER_EXECUTE_PROBE_FULL_LINK:-0}" if [[ "${full_link}" != "1" && "${want_sha}" != "${have_sha}" ]]; then echo "bootstrap-selfhost-vm-driver-execute-probe: sidecar stamp stale (want ${want_sha}, have ${have_sha:-}) — fast path skips relink (set BOOTSTRAP_VM_DRIVER_EXECUTE_PROBE_FULL_LINK=1 to rebuild)" >&2 diff --git a/test/selfhost/compiler_lib_spine_smoke/main.php b/test/selfhost/compiler_lib_spine_smoke/main.php index 587f06eb1d6..3aaf0d79abf 100644 --- a/test/selfhost/compiler_lib_spine_smoke/main.php +++ b/test/selfhost/compiler_lib_spine_smoke/main.php @@ -5373,6 +5373,7 @@ require_once __DIR__.'/../../../lib/JIT.php'; require_once __DIR__.'/../../../lib/JIT/Analyzer.php'; require_once __DIR__.'/../../../lib/JIT/AotDebugSymbols.php'; +require_once __DIR__.'/../../../lib/JIT/AotGcSections.php'; require_once __DIR__.'/../../../lib/JIT/ArrayAccessHelper.php'; require_once __DIR__.'/../../../lib/JIT/ArrayBuiltinHelper.php'; require_once __DIR__.'/../../../lib/JIT/ArrayFilterCallbackPolicy.php'; diff --git a/test/unit/AotGcSectionsTest.php b/test/unit/AotGcSectionsTest.php new file mode 100644 index 00000000000..be9fddba53d --- /dev/null +++ b/test/unit/AotGcSectionsTest.php @@ -0,0 +1,65 @@ +assertTrue(AotGcSections::isEnabled()); + } + + public function testOptOutViaEnv(): void + { + putenv(AotGcSections::ENV.'=0'); + $this->assertFalse(AotGcSections::isEnabled()); + } + + public function testStripByDefault(): void + { + $this->assertTrue(AotGcSections::stripAtLink()); + $this->assertSame('-s ', AotGcSections::linkStripFlag()); + } + + public function testStripSuppressedForDebugSymbols(): void + { + AotDebugSymbols::enable(); + $this->assertFalse(AotGcSections::stripAtLink()); + $this->assertSame('', AotGcSections::linkStripFlag()); + } + + public function testStripSuppressedForPhpcDebugSymbolsEnv(): void + { + putenv(AotGcSections::STRIP_SUPPRESS_ENV.'=1'); + $this->assertFalse(AotGcSections::stripAtLink()); + } + + public function testLinkGcSectionsFlags(): void + { + $this->assertSame(' --gc-sections ', AotGcSections::linkGcSectionsFlag(false)); + $this->assertSame(' -Wl,--gc-sections ', AotGcSections::linkGcSectionsFlag(true)); + putenv(AotGcSections::ENV.'=0'); + $this->assertSame('', AotGcSections::linkGcSectionsFlag(false)); + } +}