@@ -3626,9 +3626,55 @@ void ZEND_FASTCALL zend_jit_hot_func(zend_execute_data *execute_data, const zend
3626
3626
/* JIT-ed code is going to be called by VM */
3627
3627
}
3628
3628
3629
+ static void zend_jit_setup_hot_counters_ex (zend_op_array * op_array , zend_cfg * cfg )
3630
+ {
3631
+ if (JIT_G (hot_func )) {
3632
+ zend_op * opline = op_array -> opcodes ;
3633
+
3634
+ if (!(op_array -> fn_flags & ZEND_ACC_HAS_TYPE_HINTS )) {
3635
+ while (opline -> opcode == ZEND_RECV || opline -> opcode == ZEND_RECV_INIT ) {
3636
+ opline ++ ;
3637
+ }
3638
+ }
3639
+
3640
+ opline -> handler = (const void * )zend_jit_func_hot_counter_handler ;
3641
+ }
3642
+
3643
+ if (JIT_G (hot_loop )) {
3644
+ uint32_t i ;
3645
+
3646
+ for (i = 0 ; i < cfg -> blocks_count ; i ++ ) {
3647
+ if ((cfg -> blocks [i ].flags & ZEND_BB_REACHABLE ) &&
3648
+ (cfg -> blocks [i ].flags & ZEND_BB_LOOP_HEADER )) {
3649
+ op_array -> opcodes [cfg -> blocks [i ].start ].handler =
3650
+ (const void * )zend_jit_loop_hot_counter_handler ;
3651
+ }
3652
+ }
3653
+ }
3654
+ }
3655
+
3656
+ static int zend_jit_restart_hot_counters (zend_op_array * op_array )
3657
+ {
3658
+ zend_jit_op_array_hot_extension * jit_extension ;
3659
+ zend_cfg cfg ;
3660
+ uint32_t i ;
3661
+
3662
+ jit_extension = (zend_jit_op_array_hot_extension * )ZEND_FUNC_INFO (op_array );
3663
+ for (i = 0 ; i < op_array -> last ; i ++ ) {
3664
+ op_array -> opcodes [i ].handler = jit_extension -> orig_handlers [i ];
3665
+ }
3666
+
3667
+ if (zend_jit_build_cfg (op_array , & cfg ) != SUCCESS ) {
3668
+ return FAILURE ;
3669
+ }
3670
+
3671
+ zend_jit_setup_hot_counters_ex (op_array , & cfg );
3672
+
3673
+ return SUCCESS ;
3674
+ }
3675
+
3629
3676
static int zend_jit_setup_hot_counters (zend_op_array * op_array )
3630
3677
{
3631
- zend_op * opline = op_array -> opcodes ;
3632
3678
zend_jit_op_array_hot_extension * jit_extension ;
3633
3679
zend_cfg cfg ;
3634
3680
uint32_t i ;
@@ -3649,25 +3695,7 @@ static int zend_jit_setup_hot_counters(zend_op_array *op_array)
3649
3695
}
3650
3696
ZEND_SET_FUNC_INFO (op_array , (void * )jit_extension );
3651
3697
3652
- if (JIT_G (hot_func )) {
3653
- if (!(op_array -> fn_flags & ZEND_ACC_HAS_TYPE_HINTS )) {
3654
- while (opline -> opcode == ZEND_RECV || opline -> opcode == ZEND_RECV_INIT ) {
3655
- opline ++ ;
3656
- }
3657
- }
3658
-
3659
- opline -> handler = (const void * )zend_jit_func_hot_counter_handler ;
3660
- }
3661
-
3662
- if (JIT_G (hot_loop )) {
3663
- for (i = 0 ; i < cfg .blocks_count ; i ++ ) {
3664
- if ((cfg .blocks [i ].flags & ZEND_BB_REACHABLE ) &&
3665
- (cfg .blocks [i ].flags & ZEND_BB_LOOP_HEADER )) {
3666
- op_array -> opcodes [cfg .blocks [i ].start ].handler =
3667
- (const void * )zend_jit_loop_hot_counter_handler ;
3668
- }
3669
- }
3670
- }
3698
+ zend_jit_setup_hot_counters_ex (op_array , & cfg );
3671
3699
3672
3700
zend_shared_alloc_register_xlat_entry (op_array -> opcodes , jit_extension );
3673
3701
@@ -3686,6 +3714,12 @@ ZEND_EXT_API int zend_jit_op_array(zend_op_array *op_array, zend_script *script)
3686
3714
zend_jit_op_array_extension * jit_extension ;
3687
3715
zend_op * opline = op_array -> opcodes ;
3688
3716
3717
+ if (CG (compiler_options ) & ZEND_COMPILE_PRELOAD ) {
3718
+ ZEND_SET_FUNC_INFO (op_array , NULL );
3719
+ zend_error (E_WARNING , "Preloading is incompatible with first-exec and profile triggered JIT" );
3720
+ return SUCCESS ;
3721
+ }
3722
+
3689
3723
/* Set run-time JIT handler */
3690
3724
ZEND_ASSERT (zend_jit_runtime_jit_handler != NULL );
3691
3725
if (!(op_array -> fn_flags & ZEND_ACC_HAS_TYPE_HINTS )) {
@@ -3706,6 +3740,12 @@ ZEND_EXT_API int zend_jit_op_array(zend_op_array *op_array, zend_script *script)
3706
3740
zend_jit_op_array_extension * jit_extension ;
3707
3741
zend_op * opline = op_array -> opcodes ;
3708
3742
3743
+ if (CG (compiler_options ) & ZEND_COMPILE_PRELOAD ) {
3744
+ ZEND_SET_FUNC_INFO (op_array , NULL );
3745
+ zend_error (E_WARNING , "Preloading is incompatible with first-exec and profile triggered JIT" );
3746
+ return SUCCESS ;
3747
+ }
3748
+
3709
3749
ZEND_ASSERT (zend_jit_profile_jit_handler != NULL );
3710
3750
if (op_array -> function_name ) {
3711
3751
if (!(op_array -> fn_flags & ZEND_ACC_HAS_TYPE_HINTS )) {
@@ -4265,6 +4305,59 @@ ZEND_EXT_API void zend_jit_deactivate(void)
4265
4305
}
4266
4306
}
4267
4307
4308
+ static void zend_jit_restart_preloaded_op_array (zend_op_array * op_array )
4309
+ {
4310
+ zend_func_info * func_info = ZEND_FUNC_INFO (op_array );
4311
+
4312
+ if (!func_info ) {
4313
+ return ;
4314
+ }
4315
+
4316
+ if (func_info -> flags & ZEND_FUNC_JIT_ON_HOT_TRACE ) {
4317
+ zend_jit_restart_hot_trace_counters (op_array );
4318
+ } else if (func_info -> flags & ZEND_FUNC_JIT_ON_HOT_COUNTERS ) {
4319
+ zend_jit_restart_hot_counters (op_array );
4320
+ #if 0
4321
+ // TODO: We have to restore handlers for some inner basic-blocks, but we didn't store them ???
4322
+ } else if (func_info -> flags & (ZEND_FUNC_JIT_ON_FIRST_EXEC |ZEND_FUNC_JIT_ON_PROF_REQUEST )) {
4323
+ zend_op * opline = op_array -> opcodes ;
4324
+ zend_jit_op_array_extension * jit_extension =
4325
+ (zend_jit_op_array_extension * )func_info ;
4326
+
4327
+ if (!(op_array -> fn_flags & ZEND_ACC_HAS_TYPE_HINTS )) {
4328
+ while (opline -> opcode == ZEND_RECV || opline -> opcode == ZEND_RECV_INIT ) {
4329
+ opline ++ ;
4330
+ }
4331
+ }
4332
+ if (func_info -> flags & ZEND_FUNC_JIT_ON_FIRST_EXEC ) {
4333
+ opline -> handler = (const void * )zend_jit_runtime_jit_handler ;
4334
+ } else {
4335
+ opline -> handler = (const void * )zend_jit_profile_jit_handler ;
4336
+ }
4337
+ #endif
4338
+ }
4339
+ }
4340
+
4341
+ static void zend_jit_restart_preloaded_script (zend_persistent_script * script )
4342
+ {
4343
+ zend_class_entry * ce ;
4344
+ zend_op_array * op_array ;
4345
+
4346
+ zend_jit_restart_preloaded_op_array (& script -> script .main_op_array );
4347
+
4348
+ ZEND_HASH_FOREACH_PTR (& script -> script .function_table , op_array ) {
4349
+ zend_jit_restart_preloaded_op_array (op_array );
4350
+ } ZEND_HASH_FOREACH_END ();
4351
+
4352
+ ZEND_HASH_FOREACH_PTR (& script -> script .class_table , ce ) {
4353
+ ZEND_HASH_FOREACH_PTR (& ce -> function_table , op_array ) {
4354
+ if (op_array -> type == ZEND_USER_FUNCTION ) {
4355
+ zend_jit_restart_preloaded_op_array (op_array );
4356
+ }
4357
+ } ZEND_HASH_FOREACH_END ();
4358
+ } ZEND_HASH_FOREACH_END ();
4359
+ }
4360
+
4268
4361
ZEND_EXT_API void zend_jit_restart (void )
4269
4362
{
4270
4363
if (dasm_buf ) {
@@ -4275,6 +4368,18 @@ ZEND_EXT_API void zend_jit_restart(void)
4275
4368
4276
4369
zend_jit_trace_restart ();
4277
4370
4371
+ if (ZCSG (preload_script )) {
4372
+ zend_jit_restart_preloaded_script (ZCSG (preload_script ));
4373
+ if (ZCSG (saved_scripts )) {
4374
+ zend_persistent_script * * p = ZCSG (saved_scripts );
4375
+
4376
+ while (* p ) {
4377
+ zend_jit_restart_preloaded_script (* p );
4378
+ p ++ ;
4379
+ }
4380
+ }
4381
+ }
4382
+
4278
4383
zend_jit_protect ();
4279
4384
}
4280
4385
}
0 commit comments