@@ -451,25 +451,40 @@ static zend_always_inline void zend_jit_trace_add_op_guard(zend_ssa
451
451
#define CHECK_OP1_DATA_TRACE_TYPE () \
452
452
CHECK_OP_TRACE_TYPE((opline+1)->op1.var, (ssa_op+1)->op1_use, op1_data_info, op3_type)
453
453
454
- static zend_always_inline size_t zend_jit_trace_frame_size (const zend_op_array * op_array )
454
+ static zend_always_inline size_t zend_jit_trace_op_array_frame_size (const zend_op_array * op_array )
455
455
{
456
- if (op_array && op_array -> type == ZEND_USER_FUNCTION ) {
456
+ if (op_array ) {
457
+ assert (op_array -> type == ZEND_USER_FUNCTION );
457
458
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 )));
458
- } else if (op_array ) {
459
- 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 )));
460
459
} else {
461
460
return ZEND_MM_ALIGNED_SIZE (offsetof(zend_jit_trace_stack_frame , stack ));
462
461
}
463
462
}
464
463
465
- static zend_jit_trace_stack_frame * zend_jit_trace_call_frame ( zend_jit_trace_stack_frame * frame , const zend_op_array * op_array )
464
+ static zend_always_inline size_t zend_jit_trace_function_frame_size ( const zend_function * func )
466
465
{
467
- return (zend_jit_trace_stack_frame * )((char * )frame + zend_jit_trace_frame_size (op_array ));
466
+ if (func && func -> type == ZEND_USER_FUNCTION ) {
467
+ return zend_jit_trace_op_array_frame_size (& func -> op_array );
468
+ } else if (func ) {
469
+ return ZEND_MM_ALIGNED_SIZE (offsetof(zend_jit_trace_stack_frame , stack ) + ZEND_MM_ALIGNED_SIZE (func -> common .num_args * sizeof (zend_jit_trace_stack )));
470
+ } else {
471
+ return ZEND_MM_ALIGNED_SIZE (offsetof(zend_jit_trace_stack_frame , stack ));
472
+ }
473
+ }
474
+
475
+ static zend_jit_trace_stack_frame * zend_jit_trace_op_array_call_frame (zend_jit_trace_stack_frame * frame , const zend_op_array * op_array )
476
+ {
477
+ return (zend_jit_trace_stack_frame * )((char * )frame + zend_jit_trace_op_array_frame_size (op_array ));
478
+ }
479
+
480
+ static zend_jit_trace_stack_frame * zend_jit_trace_function_call_frame (zend_jit_trace_stack_frame * frame , const zend_function * func )
481
+ {
482
+ return (zend_jit_trace_stack_frame * )((char * )frame + zend_jit_trace_function_frame_size (func ));
468
483
}
469
484
470
- static zend_jit_trace_stack_frame * zend_jit_trace_ret_frame (zend_jit_trace_stack_frame * frame , const zend_op_array * op_array )
485
+ static zend_jit_trace_stack_frame * zend_jit_trace_op_array_ret_frame (zend_jit_trace_stack_frame * frame , const zend_op_array * op_array )
471
486
{
472
- return (zend_jit_trace_stack_frame * )((char * )frame - zend_jit_trace_frame_size (op_array ));
487
+ return (zend_jit_trace_stack_frame * )((char * )frame - zend_jit_trace_op_array_frame_size (op_array ));
473
488
}
474
489
475
490
static void zend_jit_trace_send_type (const zend_op * opline , zend_jit_trace_stack_frame * call , zend_uchar type )
@@ -1160,7 +1175,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1160
1175
* Calculate size of abstract stack;
1161
1176
* Construct regular SSA for involved op_array */
1162
1177
const zend_op_array * op_array = trace_buffer -> op_array ;
1163
- size_t stack_size = zend_jit_trace_frame_size (op_array );
1178
+ size_t stack_size = zend_jit_trace_op_array_frame_size (op_array );
1164
1179
size_t stack_top = stack_size ;
1165
1180
size_t stack_bottom = 0 ;
1166
1181
int ssa_ops_count = 0 ;
@@ -1200,7 +1215,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1200
1215
ssa_ops_count += zend_jit_trace_op_len (p -> opline );
1201
1216
} else if (p -> op == ZEND_JIT_TRACE_INIT_CALL ) {
1202
1217
call_level ++ ;
1203
- stack_top += zend_jit_trace_frame_size (p -> op_array );
1218
+ stack_top += zend_jit_trace_function_frame_size (p -> func );
1204
1219
if (stack_top > stack_size ) {
1205
1220
stack_size = stack_top ;
1206
1221
}
@@ -1213,7 +1228,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1213
1228
ssa -> cfg .flags |= ZEND_FUNC_INDIRECT_VAR_ACCESS ;
1214
1229
}
1215
1230
}
1216
- const size_t frame_size = zend_jit_trace_frame_size (p -> op_array );
1231
+ const size_t frame_size = zend_jit_trace_function_frame_size (p -> func );
1217
1232
if (call_level == 0 ) {
1218
1233
if (stack_top + frame_size > stack_size ) {
1219
1234
stack_size = stack_top + frame_size ;
@@ -1225,7 +1240,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1225
1240
} else if (p -> op == ZEND_JIT_TRACE_ENTER ) {
1226
1241
op_array = p -> op_array ;
1227
1242
if (call_level == 0 ) {
1228
- stack_top += zend_jit_trace_frame_size (op_array );
1243
+ stack_top += zend_jit_trace_op_array_frame_size (op_array );
1229
1244
if (stack_top > stack_size ) {
1230
1245
stack_size = stack_top ;
1231
1246
}
@@ -1250,7 +1265,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1250
1265
}
1251
1266
} else if (p -> op == ZEND_JIT_TRACE_BACK ) {
1252
1267
if (level == 0 ) {
1253
- stack_bottom += zend_jit_trace_frame_size (p -> op_array );
1268
+ stack_bottom += zend_jit_trace_op_array_frame_size (p -> op_array );
1254
1269
zend_jit_op_array_trace_extension * const jit_extension =
1255
1270
(zend_jit_op_array_trace_extension * )ZEND_FUNC_INFO (op_array );
1256
1271
ssa = & jit_extension -> func_info .ssa ;
@@ -1267,7 +1282,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1267
1282
ssa = zend_jit_trace_build_ssa (op_array , script );
1268
1283
}
1269
1284
} else {
1270
- stack_top -= zend_jit_trace_frame_size (op_array );
1285
+ stack_top -= zend_jit_trace_op_array_frame_size (op_array );
1271
1286
level -- ;
1272
1287
}
1273
1288
op_array = p -> op_array ;
@@ -1366,7 +1381,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1366
1381
idx ++ ;
1367
1382
}
1368
1383
} else if (p -> op == ZEND_JIT_TRACE_ENTER ) {
1369
- frame = zend_jit_trace_call_frame (frame , op_array );
1384
+ frame = zend_jit_trace_op_array_call_frame (frame , op_array );
1370
1385
stack = frame -> stack ;
1371
1386
op_array = p -> op_array ;
1372
1387
level ++ ;
@@ -1379,7 +1394,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1379
1394
}
1380
1395
} else if (p -> op == ZEND_JIT_TRACE_BACK ) {
1381
1396
op_array = p -> op_array ;
1382
- frame = zend_jit_trace_ret_frame (frame , op_array );
1397
+ frame = zend_jit_trace_op_array_ret_frame (frame , op_array );
1383
1398
stack = frame -> stack ;
1384
1399
if (level == 0 ) {
1385
1400
if (ssa_vars_count >= ZEND_JIT_TRACE_MAX_SSA_VAR ) {
@@ -1582,7 +1597,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1582
1597
}
1583
1598
1584
1599
frame = JIT_G (current_frame );
1585
- zend_jit_trace_stack_frame * top = zend_jit_trace_call_frame (frame , op_array );
1600
+ zend_jit_trace_stack_frame * top = zend_jit_trace_op_array_call_frame (frame , op_array );
1586
1601
TRACE_FRAME_INIT (frame , op_array , 0 , 0 );
1587
1602
TRACE_FRAME_SET_RETURN_SSA_VAR (frame , -1 );
1588
1603
frame -> used_stack = 0 ;
@@ -2275,7 +2290,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
2275
2290
call = top ;
2276
2291
TRACE_FRAME_INIT (call , op_array , 0 , 0 );
2277
2292
call -> used_stack = 0 ;
2278
- top = zend_jit_trace_call_frame (top , op_array );
2293
+ top = zend_jit_trace_op_array_call_frame (top , op_array );
2279
2294
for (i = 0 ; i < op_array -> last_var + op_array -> T ; i ++ ) {
2280
2295
SET_STACK_TYPE (call -> stack , i , IS_UNKNOWN , 1 );
2281
2296
}
@@ -2397,7 +2412,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
2397
2412
ZEND_ASSERT (& frame -> func -> op_array == op_array );
2398
2413
} else {
2399
2414
max_used_stack = used_stack = -1 ;
2400
- frame = zend_jit_trace_ret_frame (frame , op_array );
2415
+ frame = zend_jit_trace_op_array_ret_frame (frame , op_array );
2401
2416
TRACE_FRAME_INIT (frame , op_array , 0 , 0 );
2402
2417
TRACE_FRAME_SET_RETURN_SSA_VAR (frame , -1 );
2403
2418
frame -> used_stack = 0 ;
@@ -2412,9 +2427,9 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
2412
2427
call -> prev = frame -> call ;
2413
2428
call -> used_stack = 0 ;
2414
2429
frame -> call = call ;
2415
- top = zend_jit_trace_call_frame (top , p -> op_array );
2430
+ top = zend_jit_trace_function_call_frame (top , p -> func );
2416
2431
if (p -> func && p -> func -> type == ZEND_USER_FUNCTION ) {
2417
- for (i = 0 ; i < p -> op_array -> last_var + p -> op_array -> T ; i ++ ) {
2432
+ for (i = 0 ; i < p -> func -> op_array . last_var + p -> func -> op_array . T ; i ++ ) {
2418
2433
SET_STACK_INFO (call -> stack , i , -1 );
2419
2434
}
2420
2435
}
@@ -2961,7 +2976,7 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace
2961
2976
/* New call frames */
2962
2977
zend_jit_trace_stack_frame * prev_frame = frame ;
2963
2978
2964
- frame = zend_jit_trace_call_frame (frame , op_array );
2979
+ frame = zend_jit_trace_op_array_call_frame (frame , op_array );
2965
2980
frame -> prev = prev_frame ;
2966
2981
frame -> func = (const zend_function * )p -> op_array ;
2967
2982
stack = frame -> stack ;
@@ -2995,7 +3010,7 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace
2995
3010
zend_jit_op_array_trace_extension * const jit_extension =
2996
3011
(zend_jit_op_array_trace_extension * )ZEND_FUNC_INFO (op_array );
2997
3012
op_array_ssa = & jit_extension -> func_info .ssa ;
2998
- frame = zend_jit_trace_ret_frame (frame , op_array );
3013
+ frame = zend_jit_trace_op_array_ret_frame (frame , op_array );
2999
3014
stack = frame -> stack ;
3000
3015
if (level == 0 ) {
3001
3016
/* New return frames */
@@ -3937,7 +3952,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
3937
3952
ZEND_ASSERT (p -> op == ZEND_JIT_TRACE_START );
3938
3953
const zend_op_array * op_array = p -> op_array ;
3939
3954
zend_jit_trace_stack_frame * frame = JIT_G (current_frame );
3940
- zend_jit_trace_stack_frame * top = zend_jit_trace_call_frame (frame , op_array );
3955
+ zend_jit_trace_stack_frame * top = zend_jit_trace_op_array_call_frame (frame , op_array );
3941
3956
TRACE_FRAME_INIT (frame , op_array , TRACE_FRAME_MASK_UNKNOWN_RETURN , -1 );
3942
3957
int checked_stack ;
3943
3958
int peek_checked_stack ;
@@ -6489,7 +6504,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
6489
6504
stack = frame -> stack ;
6490
6505
ZEND_ASSERT (& frame -> func -> op_array == op_array );
6491
6506
} else {
6492
- frame = zend_jit_trace_ret_frame (frame , op_array );
6507
+ frame = zend_jit_trace_op_array_ret_frame (frame , op_array );
6493
6508
TRACE_FRAME_INIT (frame , op_array , TRACE_FRAME_MASK_UNKNOWN_RETURN , -1 );
6494
6509
frame -> used_stack = checked_stack = peek_checked_stack = 0 ;
6495
6510
stack = frame -> stack ;
@@ -6575,40 +6590,40 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
6575
6590
}
6576
6591
}
6577
6592
frame -> call = call ;
6578
- top = zend_jit_trace_call_frame (top , p -> op_array );
6593
+ top = zend_jit_trace_function_call_frame (top , p -> func );
6579
6594
if (p -> func ) {
6580
6595
if (p -> func -> type == ZEND_USER_FUNCTION ) {
6581
6596
if (JIT_G (opt_level ) >= ZEND_JIT_LEVEL_INLINE ) {
6582
6597
zend_jit_op_array_trace_extension * jit_extension =
6583
- (zend_jit_op_array_trace_extension * )ZEND_FUNC_INFO (p -> op_array );
6598
+ (zend_jit_op_array_trace_extension * )ZEND_FUNC_INFO (& p -> func -> op_array );
6584
6599
6585
6600
uint32_t i = 0 ;
6586
- while (i < p -> op_array -> num_args ) {
6601
+ while (i < p -> func -> op_array . num_args ) {
6587
6602
/* Types of arguments are going to be stored in abstract stack when processing SEV instruction */
6588
6603
SET_STACK_TYPE (call -> stack , i , IS_UNKNOWN , 1 );
6589
6604
i ++ ;
6590
6605
}
6591
- while (i < p -> op_array -> last_var ) {
6606
+ while (i < p -> func -> op_array . last_var ) {
6592
6607
if (jit_extension
6593
- && zend_jit_var_may_alias (p -> op_array , & jit_extension -> func_info .ssa , i ) != NO_ALIAS ) {
6608
+ && zend_jit_var_may_alias (& p -> func -> op_array , & jit_extension -> func_info .ssa , i ) != NO_ALIAS ) {
6594
6609
SET_STACK_TYPE (call -> stack , i , IS_UNKNOWN , 1 );
6595
6610
} else {
6596
6611
SET_STACK_TYPE (call -> stack , i , IS_UNDEF , 1 );
6597
6612
}
6598
6613
i ++ ;
6599
6614
}
6600
- while (i < p -> op_array -> last_var + p -> op_array -> T ) {
6615
+ while (i < p -> func -> op_array . last_var + p -> func -> op_array . T ) {
6601
6616
SET_STACK_TYPE (call -> stack , i , IS_UNKNOWN , 1 );
6602
6617
i ++ ;
6603
6618
}
6604
6619
} else {
6605
- for (uint32_t i = 0 ; i < p -> op_array -> last_var + p -> op_array -> T ; i ++ ) {
6620
+ for (uint32_t i = 0 ; i < p -> func -> op_array . last_var + p -> func -> op_array . T ; i ++ ) {
6606
6621
SET_STACK_TYPE (call -> stack , i , IS_UNKNOWN , 1 );
6607
6622
}
6608
6623
}
6609
6624
} else {
6610
6625
ZEND_ASSERT (p -> func -> type == ZEND_INTERNAL_FUNCTION );
6611
- for (uint32_t i = 0 ; i < p -> op_array -> num_args ; i ++ ) {
6626
+ for (uint32_t i = 0 ; i < p -> func -> common . num_args ; i ++ ) {
6612
6627
SET_STACK_TYPE (call -> stack , i , IS_UNKNOWN , 1 );
6613
6628
}
6614
6629
}
0 commit comments