@@ -427,25 +427,25 @@ static zend_always_inline void zend_jit_trace_add_op_guard(zend_ssa
427
427
#define CHECK_OP1_DATA_TRACE_TYPE () \
428
428
CHECK_OP_TRACE_TYPE((opline+1)->op1.var, (ssa_op+1)->op1_use, op1_data_info, op3_type)
429
429
430
- static zend_always_inline size_t zend_jit_trace_frame_size (const zend_op_array * op_array )
430
+ static zend_always_inline size_t zend_jit_trace_frame_size (const zend_op_array * op_array , uint32_t num_args )
431
431
{
432
432
if (op_array && op_array -> type == ZEND_USER_FUNCTION ) {
433
433
return ZEND_MM_ALIGNED_SIZE (offsetof(zend_jit_trace_stack_frame , stack ) + ZEND_MM_ALIGNED_SIZE ((op_array -> last_var + op_array -> T ) * sizeof (zend_jit_trace_stack )));
434
434
} else if (op_array ) {
435
435
return ZEND_MM_ALIGNED_SIZE (offsetof(zend_jit_trace_stack_frame , stack ) + ZEND_MM_ALIGNED_SIZE (op_array -> num_args * sizeof (zend_jit_trace_stack )));
436
436
} else {
437
- return ZEND_MM_ALIGNED_SIZE (offsetof(zend_jit_trace_stack_frame , stack ));
437
+ return ZEND_MM_ALIGNED_SIZE (offsetof(zend_jit_trace_stack_frame , stack ) + ZEND_MM_ALIGNED_SIZE ( num_args * sizeof ( zend_jit_trace_stack )) );
438
438
}
439
439
}
440
440
441
- static zend_jit_trace_stack_frame * zend_jit_trace_call_frame (zend_jit_trace_stack_frame * frame , const zend_op_array * op_array )
441
+ static zend_jit_trace_stack_frame * zend_jit_trace_call_frame (zend_jit_trace_stack_frame * frame , const zend_op_array * op_array , uint32_t num_args )
442
442
{
443
- return (zend_jit_trace_stack_frame * )((char * )frame + zend_jit_trace_frame_size (op_array ));
443
+ return (zend_jit_trace_stack_frame * )((char * )frame + zend_jit_trace_frame_size (op_array , num_args ));
444
444
}
445
445
446
446
static zend_jit_trace_stack_frame * zend_jit_trace_ret_frame (zend_jit_trace_stack_frame * frame , const zend_op_array * op_array )
447
447
{
448
- return (zend_jit_trace_stack_frame * )((char * )frame - zend_jit_trace_frame_size (op_array ));
448
+ return (zend_jit_trace_stack_frame * )((char * )frame - zend_jit_trace_frame_size (op_array , 0 ));
449
449
}
450
450
451
451
static void zend_jit_trace_send_type (const zend_op * opline , zend_jit_trace_stack_frame * call , uint8_t type )
@@ -1323,7 +1323,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1323
1323
* Calculate size of abstract stack;
1324
1324
* Construct regular SSA for involved op_array */
1325
1325
op_array = trace_buffer -> op_array ;
1326
- stack_top = stack_size = zend_jit_trace_frame_size (op_array );
1326
+ stack_top = stack_size = zend_jit_trace_frame_size (op_array , 0 );
1327
1327
stack_bottom = 0 ;
1328
1328
p = trace_buffer + ZEND_JIT_TRACE_START_REC_SIZE ;
1329
1329
ssa_ops_count = 0 ;
@@ -1363,7 +1363,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1363
1363
ssa_ops_count += zend_jit_trace_op_len (p -> opline );
1364
1364
} else if (p -> op == ZEND_JIT_TRACE_INIT_CALL ) {
1365
1365
call_level ++ ;
1366
- stack_top += zend_jit_trace_frame_size (p -> op_array );
1366
+ stack_top += zend_jit_trace_frame_size (p -> op_array , ZEND_JIT_TRACE_NUM_ARGS ( p -> info ) );
1367
1367
if (stack_top > stack_size ) {
1368
1368
stack_size = stack_top ;
1369
1369
}
@@ -1377,7 +1377,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1377
1377
ssa -> cfg .flags |= ZEND_FUNC_INDIRECT_VAR_ACCESS ;
1378
1378
}
1379
1379
}
1380
- frame_size = zend_jit_trace_frame_size (p -> op_array );
1380
+ frame_size = zend_jit_trace_frame_size (p -> op_array , ZEND_JIT_TRACE_NUM_ARGS ( p -> info ) );
1381
1381
if (call_level == 0 ) {
1382
1382
if (stack_top + frame_size > stack_size ) {
1383
1383
stack_size = stack_top + frame_size ;
@@ -1389,7 +1389,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1389
1389
} else if (p -> op == ZEND_JIT_TRACE_ENTER ) {
1390
1390
op_array = p -> op_array ;
1391
1391
if (call_level == 0 ) {
1392
- stack_top += zend_jit_trace_frame_size (op_array );
1392
+ stack_top += zend_jit_trace_frame_size (op_array , 0 );
1393
1393
if (stack_top > stack_size ) {
1394
1394
stack_size = stack_top ;
1395
1395
}
@@ -1414,7 +1414,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1414
1414
}
1415
1415
} else if (p -> op == ZEND_JIT_TRACE_BACK ) {
1416
1416
if (level == 0 ) {
1417
- stack_bottom += zend_jit_trace_frame_size (p -> op_array );
1417
+ stack_bottom += zend_jit_trace_frame_size (p -> op_array , 0 );
1418
1418
jit_extension =
1419
1419
(zend_jit_op_array_trace_extension * )ZEND_FUNC_INFO (op_array );
1420
1420
ssa = & jit_extension -> func_info .ssa ;
@@ -1431,7 +1431,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1431
1431
ssa = zend_jit_trace_build_ssa (op_array , script );
1432
1432
}
1433
1433
} else {
1434
- stack_top -= zend_jit_trace_frame_size (op_array );
1434
+ stack_top -= zend_jit_trace_frame_size (op_array , 0 );
1435
1435
level -- ;
1436
1436
}
1437
1437
op_array = p -> op_array ;
@@ -1534,7 +1534,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1534
1534
len -- ;
1535
1535
}
1536
1536
} else if (p -> op == ZEND_JIT_TRACE_ENTER ) {
1537
- frame = zend_jit_trace_call_frame (frame , op_array );
1537
+ frame = zend_jit_trace_call_frame (frame , op_array , 0 );
1538
1538
stack = frame -> stack ;
1539
1539
op_array = p -> op_array ;
1540
1540
level ++ ;
@@ -1754,7 +1754,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1754
1754
}
1755
1755
1756
1756
frame = JIT_G (current_frame );
1757
- top = zend_jit_trace_call_frame (frame , op_array );
1757
+ top = zend_jit_trace_call_frame (frame , op_array , 0 );
1758
1758
TRACE_FRAME_INIT (frame , op_array , 0 , 0 );
1759
1759
TRACE_FRAME_SET_RETURN_SSA_VAR (frame , -1 );
1760
1760
frame -> used_stack = 0 ;
@@ -2448,7 +2448,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
2448
2448
call = top ;
2449
2449
TRACE_FRAME_INIT (call , op_array , 0 , 0 );
2450
2450
call -> used_stack = 0 ;
2451
- top = zend_jit_trace_call_frame (top , op_array );
2451
+ top = zend_jit_trace_call_frame (top , op_array , 0 );
2452
2452
} else {
2453
2453
ZEND_ASSERT (& call -> func -> op_array == op_array );
2454
2454
}
@@ -2583,7 +2583,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
2583
2583
call -> prev = frame -> call ;
2584
2584
call -> used_stack = 0 ;
2585
2585
frame -> call = call ;
2586
- top = zend_jit_trace_call_frame (top , p -> op_array );
2586
+ top = zend_jit_trace_call_frame (top , p -> op_array , ZEND_JIT_TRACE_NUM_ARGS ( p -> info ) );
2587
2587
if (p -> func && p -> func -> type == ZEND_USER_FUNCTION ) {
2588
2588
for (i = 0 ; i < p -> op_array -> last_var + p -> op_array -> T ; i ++ ) {
2589
2589
SET_STACK_INFO (call -> stack , i , -1 );
@@ -2626,6 +2626,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
2626
2626
2627
2627
if (idx > 0
2628
2628
&& ssa_ops [idx - 1 ].result_def >= 0
2629
+ && p -> func
2629
2630
&& (p -> func -> common .fn_flags & ZEND_ACC_HAS_RETURN_TYPE )
2630
2631
&& !(p -> func -> common .fn_flags & ZEND_ACC_RETURN_REFERENCE )) {
2631
2632
ZEND_ASSERT (ssa_opcodes [idx - 1 ] == opline );
@@ -3156,7 +3157,7 @@ static zend_jit_reg_var* zend_jit_trace_allocate_registers(zend_jit_trace_rec *t
3156
3157
}
3157
3158
}
3158
3159
3159
- frame = zend_jit_trace_call_frame (frame , op_array );
3160
+ frame = zend_jit_trace_call_frame (frame , op_array , 0 );
3160
3161
frame -> prev = prev_frame ;
3161
3162
frame -> func = (const zend_function * )p -> op_array ;
3162
3163
stack = frame -> stack ;
@@ -3306,8 +3307,7 @@ static zend_jit_reg_var* zend_jit_trace_allocate_registers(zend_jit_trace_rec *t
3306
3307
}
3307
3308
phi = phi -> next ;
3308
3309
}
3309
- } else if (p -> stop == ZEND_JIT_TRACE_STOP_LINK
3310
- || p -> stop == ZEND_JIT_TRACE_STOP_INTERPRETER ) {
3310
+ } else if (p -> stop >= ZEND_JIT_TRACE_STOP_LINK ) {
3311
3311
for (i = 0 ; i < op_array -> last_var + op_array -> T ; i ++ ) {
3312
3312
int var = STACK_VAR (stack , i );
3313
3313
if (var >= 0 && RA_HAS_REG (var )
@@ -4123,7 +4123,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
4123
4123
ZEND_ASSERT (p -> op == ZEND_JIT_TRACE_START );
4124
4124
op_array = p -> op_array ;
4125
4125
frame = JIT_G (current_frame );
4126
- top = zend_jit_trace_call_frame (frame , op_array );
4126
+ top = zend_jit_trace_call_frame (frame , op_array , 0 );
4127
4127
TRACE_FRAME_INIT (frame , op_array , TRACE_FRAME_MASK_UNKNOWN_RETURN , -1 );
4128
4128
frame -> used_stack = checked_stack = peek_checked_stack = 0 ;
4129
4129
stack = frame -> stack ;
@@ -7006,7 +7006,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
7006
7006
}
7007
7007
}
7008
7008
frame -> call = call ;
7009
- top = zend_jit_trace_call_frame (top , p -> op_array );
7009
+ top = zend_jit_trace_call_frame (top , p -> op_array , ZEND_JIT_TRACE_NUM_ARGS ( p -> info ) );
7010
7010
if (p -> func ) {
7011
7011
if (p -> func -> type == ZEND_USER_FUNCTION ) {
7012
7012
if (JIT_G (opt_level ) >= ZEND_JIT_LEVEL_INLINE ) {
@@ -7192,8 +7192,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
7192
7192
7193
7193
zend_jit_trace_end_loop (& ctx , jit -> trace_loop_ref , timeout_exit_addr ); /* jump back to start of the trace loop */
7194
7194
}
7195
- } else if (p -> stop == ZEND_JIT_TRACE_STOP_LINK
7196
- || p -> stop == ZEND_JIT_TRACE_STOP_INTERPRETER ) {
7195
+ } else if (p -> stop >= ZEND_JIT_TRACE_STOP_LINK ) {
7197
7196
if (ra
7198
7197
&& (p - 1 )-> op != ZEND_JIT_TRACE_ENTER
7199
7198
&& (p - 1 )-> op != ZEND_JIT_TRACE_BACK
@@ -7303,8 +7302,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
7303
7302
break ;
7304
7303
}
7305
7304
}
7306
- } else if (p -> stop == ZEND_JIT_TRACE_STOP_LINK
7307
- || p -> stop == ZEND_JIT_TRACE_STOP_INTERPRETER ) {
7305
+ } else if (p -> stop >= ZEND_JIT_TRACE_STOP_LINK ) {
7308
7306
if (opline
7309
7307
&& (opline -> opcode == ZEND_DO_UCALL
7310
7308
|| opline -> opcode == ZEND_DO_FCALL
@@ -7929,7 +7927,7 @@ static void zend_jit_dump_trace(zend_jit_trace_rec *trace_buffer, zend_ssa *tssa
7929
7927
level , ' ' ,
7930
7928
(p -> func && p -> func -> common .scope ) ? ZSTR_VAL (p -> func -> common .scope -> name ) : "" ,
7931
7929
(p -> func && p -> func -> common .scope ) ? "::" : "" ,
7932
- p -> func ? ZSTR_VAL (p -> func -> common .function_name ) : "???" );
7930
+ ( p -> func && p -> func -> common . function_name ) ? ZSTR_VAL (p -> func -> common .function_name ) : "???" );
7933
7931
} else {
7934
7932
fprintf (stderr , " %*c>skip\n" ,
7935
7933
level , ' ' );
@@ -7938,9 +7936,9 @@ static void zend_jit_dump_trace(zend_jit_trace_rec *trace_buffer, zend_ssa *tssa
7938
7936
if (p -> func != (zend_function * )& zend_pass_function ) {
7939
7937
fprintf (stderr , " %*c>call %s%s%s\n" ,
7940
7938
level , ' ' ,
7941
- p -> func -> common .scope ? ZSTR_VAL (p -> func -> common .scope -> name ) : "" ,
7942
- p -> func -> common .scope ? "::" : "" ,
7943
- ZSTR_VAL (p -> func -> common .function_name ));
7939
+ ( p -> func && p -> func -> common .scope ) ? ZSTR_VAL (p -> func -> common .scope -> name ) : "" ,
7940
+ ( p -> func && p -> func -> common .scope ) ? "::" : "" ,
7941
+ ( p -> func && p -> func -> common . function_name ) ? ZSTR_VAL (p -> func -> common .function_name ) : "???" );
7944
7942
} else {
7945
7943
fprintf (stderr , " %*c>skip\n" ,
7946
7944
level , ' ' );
0 commit comments