@@ -1056,7 +1056,10 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1056
1056
stack = frame -> stack ;
1057
1057
op_array = p -> op_array ;
1058
1058
level ++ ;
1059
- ZEND_ASSERT (ssa_vars_count < 0xff );
1059
+ // TODO: remove this restriction ???
1060
+ if (ssa_vars_count >= 0xff ) {
1061
+ return NULL ;
1062
+ }
1060
1063
p -> first_ssa_var = ssa_vars_count ;
1061
1064
for (i = 0 ; i < op_array -> last_var ; i ++ ) {
1062
1065
SET_STACK_VAR (stack , i , ssa_vars_count ++ );
@@ -1066,7 +1069,10 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1066
1069
frame = zend_jit_trace_ret_frame (frame , op_array );
1067
1070
stack = frame -> stack ;
1068
1071
if (level == 0 ) {
1069
- ZEND_ASSERT (ssa_vars_count <= 0xff );
1072
+ // TODO: remove this restriction ???
1073
+ if (ssa_vars_count >= 0xff ) {
1074
+ return NULL ;
1075
+ }
1070
1076
p -> first_ssa_var = ssa_vars_count ;
1071
1077
for (i = 0 ; i < op_array -> last_var + op_array -> T ; i ++ ) {
1072
1078
SET_STACK_VAR (stack , i , ssa_vars_count ++ );
@@ -2456,6 +2462,12 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
2456
2462
2457
2463
ssa = zend_jit_trace_build_tssa (trace_buffer , parent_trace , exit_num , script , op_arrays , & num_op_arrays );
2458
2464
2465
+ if (!ssa ) {
2466
+ zend_arena_release (& CG (arena ), checkpoint );
2467
+ JIT_G (current_trace ) = NULL ;
2468
+ return NULL ;
2469
+ }
2470
+
2459
2471
/* Register allocation */
2460
2472
if (zend_jit_reg_alloc && zend_jit_level >= ZEND_JIT_LEVEL_INLINE ) {
2461
2473
ra = zend_jit_trace_allocate_registers (trace_buffer , ssa , parent_trace , exit_num );
@@ -3990,7 +4002,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
3990
4002
t -> link = zend_jit_find_trace (p -> opline -> handler );
3991
4003
zend_jit_trace_link_to_root (& dasm_state , p -> opline -> handler );
3992
4004
} else if (p -> stop == ZEND_JIT_TRACE_STOP_RETURN ) {
3993
- zend_jit_trace_return (& dasm_state );
4005
+ zend_jit_trace_return (& dasm_state , 0 );
3994
4006
} else {
3995
4007
// TODO: not implemented ???
3996
4008
ZEND_ASSERT (0 && p -> stop );
@@ -4053,6 +4065,7 @@ static const void *zend_jit_trace_exit_to_vm(uint32_t trace_num, uint32_t exit_n
4053
4065
const zend_op * opline ;
4054
4066
uint32_t i , stack_size ;
4055
4067
zend_jit_trace_stack * stack ;
4068
+ zend_bool original_handler = 0 ;
4056
4069
4057
4070
if (!zend_jit_trace_exit_needs_deoptimization (trace_num , exit_num )) {
4058
4071
return dasm_labels [zend_lbtrace_escape ];
@@ -4084,9 +4097,13 @@ static const void *zend_jit_trace_exit_to_vm(uint32_t trace_num, uint32_t exit_n
4084
4097
opline = (const zend_op * )((uintptr_t )opline & ~(ZEND_JIT_EXIT_JITED |ZEND_JIT_EXIT_BLACKLISTED ));
4085
4098
if (opline ) {
4086
4099
zend_jit_set_ip (& dasm_state , opline );
4100
+ if (opline == zend_jit_traces [zend_jit_traces [trace_num ].root ].opline ) {
4101
+ /* prevent endless loop */
4102
+ original_handler = 1 ;
4103
+ }
4087
4104
}
4088
4105
4089
- zend_jit_trace_return (& dasm_state );
4106
+ zend_jit_trace_return (& dasm_state , original_handler );
4090
4107
4091
4108
handler = dasm_link_and_encode (& dasm_state , NULL , NULL , NULL , NULL , name , 1 );
4092
4109
@@ -4123,6 +4140,7 @@ static zend_jit_trace_stop zend_jit_compile_root_trace(zend_jit_trace_rec *trace
4123
4140
t -> exit_count = 0 ;
4124
4141
t -> child_count = 0 ;
4125
4142
t -> stack_map_size = 0 ;
4143
+ t -> opline = ((zend_jit_trace_start_rec * )trace_buffer )-> opline ;
4126
4144
t -> exit_info = exit_info ;
4127
4145
t -> stack_map = NULL ;
4128
4146
@@ -4674,6 +4692,7 @@ static zend_jit_trace_stop zend_jit_compile_side_trace(zend_jit_trace_rec *trace
4674
4692
t -> exit_count = 0 ;
4675
4693
t -> child_count = 0 ;
4676
4694
t -> stack_map_size = 0 ;
4695
+ t -> opline = NULL ;
4677
4696
t -> exit_info = exit_info ;
4678
4697
t -> stack_map = NULL ;
4679
4698
0 commit comments