@@ -761,7 +761,7 @@ static int find_return_ssa_var(zend_jit_trace_rec *p, zend_ssa_op *ssa_op)
761
761
762
762
static const zend_op * zend_jit_trace_find_init_fcall_op (zend_jit_trace_rec * p , const zend_op_array * op_array )
763
763
{
764
- if (!p -> fake ) {
764
+ if (!( p -> info & ZEND_JIT_TRACE_FAKE_INIT_CALL ) ) {
765
765
p -- ;
766
766
while (1 ) {
767
767
if (p -> op == ZEND_JIT_TRACE_VM ) {
@@ -1058,11 +1058,10 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1058
1058
stack = frame -> stack ;
1059
1059
op_array = p -> op_array ;
1060
1060
level ++ ;
1061
- // TODO: remove this restriction ???
1062
- if (ssa_vars_count >= 0xff ) {
1061
+ if (ssa_vars_count >= ZEND_JIT_TRACE_MAX_SSA_VAR ) {
1063
1062
return NULL ;
1064
1063
}
1065
- p -> first_ssa_var = ssa_vars_count ;
1064
+ ZEND_JIT_TRACE_SET_FIRST_SSA_VAR ( p -> info , ssa_vars_count ) ;
1066
1065
for (i = 0 ; i < op_array -> last_var ; i ++ ) {
1067
1066
SET_STACK_VAR (stack , i , ssa_vars_count ++ );
1068
1067
}
@@ -1071,11 +1070,10 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1071
1070
frame = zend_jit_trace_ret_frame (frame , op_array );
1072
1071
stack = frame -> stack ;
1073
1072
if (level == 0 ) {
1074
- // TODO: remove this restriction ???
1075
- if (ssa_vars_count >= 0xff ) {
1073
+ if (ssa_vars_count >= ZEND_JIT_TRACE_MAX_SSA_VAR ) {
1076
1074
return NULL ;
1077
1075
}
1078
- p -> first_ssa_var = ssa_vars_count ;
1076
+ ZEND_JIT_TRACE_SET_FIRST_SSA_VAR ( p -> info , ssa_vars_count ) ;
1079
1077
for (i = 0 ; i < op_array -> last_var + op_array -> T ; i ++ ) {
1080
1078
SET_STACK_VAR (stack , i , ssa_vars_count ++ );
1081
1079
}
@@ -1561,7 +1559,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1561
1559
1562
1560
level ++ ;
1563
1561
i = 0 ;
1564
- v = p -> first_ssa_var ;
1562
+ v = ZEND_JIT_TRACE_GET_FIRST_SSA_VAR ( p -> info ) ;
1565
1563
while (i < op_array -> last_var ) {
1566
1564
ssa_vars [v ].var = i ;
1567
1565
if (i < op_array -> num_args ) {
@@ -1601,7 +1599,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1601
1599
ssa = & jit_extension -> func_info .ssa ;
1602
1600
if (level == 0 ) {
1603
1601
i = 0 ;
1604
- v = p -> first_ssa_var ;
1602
+ v = ZEND_JIT_TRACE_GET_FIRST_SSA_VAR ( p -> info ) ;
1605
1603
while (i < op_array -> last_var ) {
1606
1604
ssa_vars [v ].var = i ;
1607
1605
if (!ssa -> var_info
@@ -1629,7 +1627,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1629
1627
const zend_op * opline = q -> opline - 1 ;
1630
1628
if (opline -> result_type != IS_UNUSED ) {
1631
1629
ssa_var_info [
1632
- p -> first_ssa_var +
1630
+ ZEND_JIT_TRACE_GET_FIRST_SSA_VAR ( p -> info ) +
1633
1631
EX_VAR_TO_NUM (opline -> result .var )] = return_value_info ;
1634
1632
}
1635
1633
}
@@ -1729,19 +1727,20 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1729
1727
trace_buffer -> op_array -> function_name ?
1730
1728
ZSTR_VAL (trace_buffer -> op_array -> function_name ) : "$main" ,
1731
1729
ZSTR_VAL (trace_buffer -> op_array -> filename ),
1732
- (( zend_jit_trace_start_rec * ) trace_buffer ) -> opline -> lineno );
1730
+ trace_buffer [ 1 ]. opline -> lineno );
1733
1731
} else {
1734
1732
fprintf (stderr , "---- TRACE %d TSSA start (%s) %s() %s:%d\n" ,
1735
1733
ZEND_JIT_TRACE_NUM ,
1736
1734
zend_jit_trace_star_desc (trace_buffer -> start ),
1737
1735
trace_buffer -> op_array -> function_name ?
1738
1736
ZSTR_VAL (trace_buffer -> op_array -> function_name ) : "$main" ,
1739
1737
ZSTR_VAL (trace_buffer -> op_array -> filename ),
1740
- (( zend_jit_trace_start_rec * ) trace_buffer ) -> opline -> lineno );
1738
+ trace_buffer [ 1 ]. opline -> lineno );
1741
1739
}
1742
1740
zend_jit_dump_trace (trace_buffer , tssa );
1743
1741
if (trace_buffer -> stop == ZEND_JIT_TRACE_STOP_LINK ) {
1744
- uint32_t link_to = zend_jit_find_trace (EG (current_execute_data )-> opline -> handler );;
1742
+ uint32_t idx = trace_buffer [1 ].last ;
1743
+ uint32_t link_to = zend_jit_find_trace (trace_buffer [idx ].opline -> handler );
1745
1744
fprintf (stderr , "---- TRACE %d TSSA stop (link to %d)\n" ,
1746
1745
ZEND_JIT_TRACE_NUM ,
1747
1746
link_to );
@@ -2062,7 +2061,7 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace
2062
2061
jit_extension =
2063
2062
(zend_jit_op_array_trace_extension * )ZEND_FUNC_INFO (op_array );
2064
2063
op_array_ssa = & jit_extension -> func_info .ssa ;
2065
- j = p -> first_ssa_var ;
2064
+ j = ZEND_JIT_TRACE_GET_FIRST_SSA_VAR ( p -> info ) ;
2066
2065
for (i = 0 ; i < op_array -> last_var ; i ++ ) {
2067
2066
SET_STACK_VAR (stack , i , j );
2068
2067
vars_op_array [j ] = op_array ;
@@ -2091,7 +2090,7 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace
2091
2090
stack = frame -> stack ;
2092
2091
if (level == 0 ) {
2093
2092
/* New return frames */
2094
- j = p -> first_ssa_var ;
2093
+ j = ZEND_JIT_TRACE_GET_FIRST_SSA_VAR ( p -> info ) ;
2095
2094
for (i = 0 ; i < op_array -> last_var + op_array -> T ; i ++ ) {
2096
2095
SET_STACK_VAR (stack , i , j );
2097
2096
vars_op_array [j ] = op_array ;
@@ -2481,7 +2480,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
2481
2480
TRACE_FRAME_INIT (frame , op_array , TRACE_FRAME_MASK_UNKNOWN_RETURN , -1 );
2482
2481
stack = frame -> stack ;
2483
2482
2484
- opline = (( zend_jit_trace_start_rec * ) p ) -> opline ;
2483
+ opline = p [ 1 ]. opline ;
2485
2484
name = zend_jit_trace_name (op_array , opline -> lineno );
2486
2485
p += ZEND_JIT_TRACE_START_REC_SIZE ;
2487
2486
@@ -3809,17 +3808,20 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
3809
3808
op_array_ssa = & jit_extension -> func_info .ssa ;
3810
3809
call = frame -> call ;
3811
3810
if (!call ) {
3811
+ uint32_t v ;
3812
+
3812
3813
assert (0 ); // This should be handled by "fake" ZEND_JIT_TRACE_INIT_CALL
3813
3814
/* Trace missed INIT_FCALL opcode */
3814
3815
call = top ;
3815
3816
TRACE_FRAME_INIT (call , op_array , 0 , -1 ); // TODO: should be possible to get the real number af arguments ???
3816
3817
top = zend_jit_trace_call_frame (top , op_array );
3817
3818
i = 0 ;
3819
+ v = ZEND_JIT_TRACE_GET_FIRST_SSA_VAR (p -> info );
3818
3820
while (i < p -> op_array -> num_args ) {
3819
3821
/* Initialize abstract stack using SSA */
3820
- if (!(ssa -> var_info [p -> first_ssa_var + i ].type & MAY_BE_GUARD )
3821
- && has_concrete_type (ssa -> var_info [p -> first_ssa_var + i ].type )) {
3822
- SET_STACK_TYPE (call -> stack , i , concrete_type (ssa -> var_info [p -> first_ssa_var + i ].type ));
3822
+ if (!(ssa -> var_info [v + i ].type & MAY_BE_GUARD )
3823
+ && has_concrete_type (ssa -> var_info [v + i ].type )) {
3824
+ SET_STACK_TYPE (call -> stack , i , concrete_type (ssa -> var_info [v + i ].type ));
3823
3825
} else {
3824
3826
SET_STACK_TYPE (call -> stack , i , IS_UNKNOWN );
3825
3827
}
@@ -3838,17 +3840,17 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
3838
3840
}
3839
3841
frame -> call = call -> prev ;
3840
3842
call -> prev = frame ;
3841
- if (p -> return_value_used ) {
3843
+ if (p -> info & ZEND_JIT_TRACE_RETRUN_VALUE_USED ) {
3842
3844
TRACE_FRAME_SET_RETURN_VALUE_USED (call );
3843
3845
} else {
3844
3846
TRACE_FRAME_SET_RETURN_VALUE_UNUSED (call );
3845
3847
}
3846
3848
JIT_G (current_frame ) = frame = call ;
3847
3849
stack = frame -> stack ;
3848
3850
if (ra ) {
3849
- for (i = 0 ; i < op_array -> last_var ; i ++ ) {
3850
- int j = p -> first_ssa_var + i ;
3851
+ int j = ZEND_JIT_TRACE_GET_FIRST_SSA_VAR (p -> info );
3851
3852
3853
+ for (i = 0 ; i < op_array -> last_var ; i ++ ,j ++ ) {
3852
3854
if (ra [j ] && (ra [j ]-> flags & ZREG_LOAD ) != 0 ) {
3853
3855
//SET_STACK_REG(stack, i, ra[j]->reg);
3854
3856
if (!zend_jit_load_var (& dasm_state , ssa -> var_info [j ].type , i , ra [j ]-> reg )) {
@@ -3869,22 +3871,23 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
3869
3871
stack = frame -> stack ;
3870
3872
ZEND_ASSERT (& frame -> func -> op_array == op_array );
3871
3873
} else {
3874
+ uint32_t j = ZEND_JIT_TRACE_GET_FIRST_SSA_VAR (p -> info );
3875
+
3872
3876
frame = zend_jit_trace_ret_frame (frame , op_array );
3873
3877
TRACE_FRAME_INIT (frame , op_array , TRACE_FRAME_MASK_UNKNOWN_RETURN , -1 );
3874
3878
stack = frame -> stack ;
3875
- for (i = 0 ; i < op_array -> last_var + op_array -> T ; i ++ ) {
3879
+ for (i = 0 ; i < op_array -> last_var + op_array -> T ; i ++ , j ++ ) {
3876
3880
/* Initialize abstract stack using SSA */
3877
- if (!(ssa -> var_info [p -> first_ssa_var + i ].type & MAY_BE_GUARD )
3878
- && has_concrete_type (ssa -> var_info [p -> first_ssa_var + i ].type )) {
3879
- SET_STACK_TYPE (stack , i , concrete_type (ssa -> var_info [p -> first_ssa_var + i ].type ));
3881
+ if (!(ssa -> var_info [j ].type & MAY_BE_GUARD )
3882
+ && has_concrete_type (ssa -> var_info [j ].type )) {
3883
+ SET_STACK_TYPE (stack , i , concrete_type (ssa -> var_info [j ].type ));
3880
3884
} else {
3881
3885
SET_STACK_TYPE (stack , i , IS_UNKNOWN );
3882
3886
}
3883
3887
}
3884
3888
if (ra ) {
3885
- for (i = 0 ; i < op_array -> last_var + op_array -> T ; i ++ ) {
3886
- int j = p -> first_ssa_var + i ;
3887
-
3889
+ j = ZEND_JIT_TRACE_GET_FIRST_SSA_VAR (p -> info );
3890
+ for (i = 0 ; i < op_array -> last_var + op_array -> T ; i ++ , j ++ ) {
3888
3891
if (ra [j ] && (ra [j ]-> flags & ZREG_LOAD ) != 0 ) {
3889
3892
//SET_STACK_REG(stack, i, ra[j]->reg);
3890
3893
if (!zend_jit_load_var (& dasm_state , ssa -> var_info [j ].type , i , ra [j ]-> reg )) {
@@ -3917,7 +3920,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
3917
3920
call = top ;
3918
3921
TRACE_FRAME_INIT (call , p -> func , TRACE_FRAME_MASK_NESTED , num_args );
3919
3922
call -> prev = frame -> call ;
3920
- if (!p -> fake ) {
3923
+ if (!( p -> info & ZEND_JIT_TRACE_FAKE_INIT_CALL ) ) {
3921
3924
TRACE_FRAME_SET_LAST_SEND_BY_VAL (call );
3922
3925
}
3923
3926
frame -> call = call ;
@@ -3938,7 +3941,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
3938
3941
i ++ ;
3939
3942
}
3940
3943
}
3941
- if (p -> fake ) {
3944
+ if (p -> info & ZEND_JIT_TRACE_FAKE_INIT_CALL ) {
3942
3945
int skip_guard = 0 ;
3943
3946
3944
3947
if (init_opline ) {
@@ -3952,7 +3955,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
3952
3955
call_info = call_info -> next_callee ;
3953
3956
}
3954
3957
}
3955
- if (!skip_guard && !zend_jit_init_fcall_guard (& dasm_state , NULL , p -> func , (( zend_jit_trace_start_rec * ) trace_buffer ) -> opline )) {
3958
+ if (!skip_guard && !zend_jit_init_fcall_guard (& dasm_state , NULL , p -> func , trace_buffer [ 1 ]. opline )) {
3956
3959
goto jit_failure ;
3957
3960
}
3958
3961
frame -> call_level ++ ;
@@ -4143,7 +4146,7 @@ static zend_jit_trace_stop zend_jit_compile_root_trace(zend_jit_trace_rec *trace
4143
4146
t -> child_count = 0 ;
4144
4147
t -> stack_map_size = 0 ;
4145
4148
t -> flags = 0 ;
4146
- t -> opline = (( zend_jit_trace_start_rec * ) trace_buffer ) -> opline ;
4149
+ t -> opline = trace_buffer [ 1 ]. opline ;
4147
4150
t -> exit_info = exit_info ;
4148
4151
t -> stack_map = NULL ;
4149
4152
@@ -4400,7 +4403,7 @@ static void zend_jit_dump_trace(zend_jit_trace_rec *trace_buffer, zend_ssa *tssa
4400
4403
level ++ ;
4401
4404
if (tssa && tssa -> var_info ) {
4402
4405
call_level ++ ;
4403
- v = p -> first_ssa_var ;
4406
+ v = ZEND_JIT_TRACE_GET_FIRST_SSA_VAR ( p -> info ) ;
4404
4407
vars_count = op_array -> last_var ;
4405
4408
for (i = 0 ; i < vars_count ; i ++ , v ++ ) {
4406
4409
if (tssa -> vars [v ].use_chain >= 0 || tssa -> vars [v ].phi_use_chain ) {
@@ -4422,7 +4425,7 @@ static void zend_jit_dump_trace(zend_jit_trace_rec *trace_buffer, zend_ssa *tssa
4422
4425
ZSTR_VAL (op_array -> filename ));
4423
4426
if (tssa && tssa -> var_info ) {
4424
4427
if (call_level == 0 ) {
4425
- v = p -> first_ssa_var ;
4428
+ v = ZEND_JIT_TRACE_GET_FIRST_SSA_VAR ( p -> info ) ;
4426
4429
vars_count = op_array -> last_var + op_array -> T ;
4427
4430
for (i = 0 ; i < vars_count ; i ++ , v ++ ) {
4428
4431
if (tssa -> vars [v ].use_chain >= 0 || tssa -> vars [v ].phi_use_chain ) {
@@ -4437,7 +4440,7 @@ static void zend_jit_dump_trace(zend_jit_trace_rec *trace_buffer, zend_ssa *tssa
4437
4440
}
4438
4441
} else if (p -> op == ZEND_JIT_TRACE_INIT_CALL ) {
4439
4442
if (p -> func != (zend_function * )& zend_pass_function ) {
4440
- fprintf (stderr , p -> fake ? " %*c>fake_init %s%s%s\n" : " %*c>init %s%s%s\n" ,
4443
+ fprintf (stderr , ( p -> info & ZEND_JIT_TRACE_FAKE_INIT_CALL ) ? " %*c>fake_init %s%s%s\n" : " %*c>init %s%s%s\n" ,
4441
4444
level , ' ' ,
4442
4445
p -> func -> common .scope ? ZSTR_VAL (p -> func -> common .scope -> name ) : "" ,
4443
4446
p -> func -> common .scope ? "::" : "" ,
@@ -4571,7 +4574,8 @@ int ZEND_FASTCALL zend_jit_trace_hot_root(zend_execute_data *execute_data, const
4571
4574
if (ZEND_JIT_TRACE_STOP_OK (stop )) {
4572
4575
if (ZCG (accel_directives ).jit_debug & ZEND_JIT_DEBUG_TRACE_STOP ) {
4573
4576
if (stop == ZEND_JIT_TRACE_STOP_LINK ) {
4574
- uint32_t link_to = zend_jit_find_trace (EG (current_execute_data )-> opline -> handler );;
4577
+ uint32_t idx = trace_buffer [1 ].last ;
4578
+ uint32_t link_to = zend_jit_find_trace (trace_buffer [idx ].opline -> handler );
4575
4579
fprintf (stderr , "---- TRACE %d stop (link to %d)\n" ,
4576
4580
trace_num ,
4577
4581
link_to );
@@ -4840,7 +4844,8 @@ int ZEND_FASTCALL zend_jit_trace_hot_side(zend_execute_data *execute_data, uint3
4840
4844
if (ZEND_JIT_TRACE_STOP_OK (stop )) {
4841
4845
if (ZCG (accel_directives ).jit_debug & ZEND_JIT_DEBUG_TRACE_STOP ) {
4842
4846
if (stop == ZEND_JIT_TRACE_STOP_LINK ) {
4843
- uint32_t link_to = zend_jit_find_trace (EG (current_execute_data )-> opline -> handler );;
4847
+ uint32_t idx = trace_buffer [1 ].last ;
4848
+ uint32_t link_to = zend_jit_find_trace (trace_buffer [idx ].opline -> handler );;
4844
4849
fprintf (stderr , "---- TRACE %d stop (link to %d)\n" ,
4845
4850
trace_num ,
4846
4851
link_to );
0 commit comments