@@ -2456,6 +2456,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
2456
2456
zend_uchar res_type = IS_UNKNOWN ;
2457
2457
const zend_op * opline , * orig_opline ;
2458
2458
const zend_ssa_op * ssa_op , * orig_ssa_op ;
2459
+ const void * timeout_exit_addr = NULL ;
2459
2460
2460
2461
JIT_G (current_trace ) = trace_buffer ;
2461
2462
@@ -2628,17 +2629,16 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
2628
2629
}
2629
2630
2630
2631
if (trace_buffer -> stop != ZEND_JIT_TRACE_STOP_RECURSIVE_RET ) {
2631
- const void * exit_addr = NULL ;
2632
-
2633
2632
if (ra && zend_jit_trace_stack_needs_deoptimization (stack , op_array -> last_var + op_array -> T )) {
2634
- uint32_t exit_point = zend_jit_trace_get_exit_point (NULL , NULL , NULL , 0 );
2633
+ uint32_t exit_point = zend_jit_trace_get_exit_point (NULL , NULL , NULL , ZEND_JIT_EXIT_TO_VM );
2635
2634
2636
- exit_addr = zend_jit_trace_get_exit_addr (exit_point );
2637
- if (!exit_addr ) {
2635
+ timeout_exit_addr = zend_jit_trace_get_exit_addr (exit_point );
2636
+ if (!timeout_exit_addr ) {
2638
2637
goto jit_failure ;
2639
2638
}
2639
+ } else {
2640
+ timeout_exit_addr = dasm_labels [zend_lbinterrupt_handler ];
2640
2641
}
2641
- zend_jit_check_timeout (& dasm_state , opline , exit_addr );
2642
2642
}
2643
2643
2644
2644
if (ra && trace_buffer -> stop != ZEND_JIT_TRACE_STOP_LOOP ) {
@@ -3981,7 +3981,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
3981
3981
}
3982
3982
}
3983
3983
t -> link = ZEND_JIT_TRACE_NUM ;
3984
- zend_jit_jmp (& dasm_state , 0 ); /* jump back to start of the trace loop */
3984
+ t -> loop_kind = p -> stop ;
3985
+ zend_jit_trace_end_loop (& dasm_state , 0 , timeout_exit_addr ); /* jump back to start of the trace loop */
3985
3986
} else if (p -> stop == ZEND_JIT_TRACE_STOP_LINK ) {
3986
3987
if (ra ) {
3987
3988
/* Generate code for trace deoptimization */
@@ -4000,7 +4001,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
4000
4001
goto jit_failure ;
4001
4002
}
4002
4003
t -> link = zend_jit_find_trace (p -> opline -> handler );
4003
- zend_jit_trace_link_to_root (& dasm_state , p -> opline -> handler );
4004
+ zend_jit_trace_link_to_root (& dasm_state , & zend_jit_traces [ t -> link ] );
4004
4005
} else if (p -> stop == ZEND_JIT_TRACE_STOP_RETURN ) {
4005
4006
zend_jit_trace_return (& dasm_state , 0 );
4006
4007
} else {
@@ -4139,6 +4140,7 @@ static zend_jit_trace_stop zend_jit_compile_root_trace(zend_jit_trace_rec *trace
4139
4140
t -> exit_count = 0 ;
4140
4141
t -> child_count = 0 ;
4141
4142
t -> stack_map_size = 0 ;
4143
+ t -> loop_kind = 0 ;
4142
4144
t -> opline = ((zend_jit_trace_start_rec * )trace_buffer )-> opline ;
4143
4145
t -> exit_info = exit_info ;
4144
4146
t -> stack_map = NULL ;
@@ -4699,6 +4701,7 @@ static zend_jit_trace_stop zend_jit_compile_side_trace(zend_jit_trace_rec *trace
4699
4701
t -> exit_count = 0 ;
4700
4702
t -> child_count = 0 ;
4701
4703
t -> stack_map_size = 0 ;
4704
+ t -> loop_kind = 0 ;
4702
4705
t -> opline = NULL ;
4703
4706
t -> exit_info = exit_info ;
4704
4707
t -> stack_map = NULL ;
0 commit comments