@@ -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
zend_jit_trace_rec * p = trace_buffer + ZEND_JIT_TRACE_START_REC_SIZE ;
@@ -1201,7 +1216,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1201
1216
ssa_ops_count += zend_jit_trace_op_len (p -> opline );
1202
1217
} else if (p -> op == ZEND_JIT_TRACE_INIT_CALL ) {
1203
1218
call_level ++ ;
1204
- stack_top += zend_jit_trace_frame_size (p -> op_array );
1219
+ stack_top += zend_jit_trace_function_frame_size (p -> func );
1205
1220
if (stack_top > stack_size ) {
1206
1221
stack_size = stack_top ;
1207
1222
}
@@ -1214,7 +1229,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1214
1229
ssa -> cfg .flags |= ZEND_FUNC_INDIRECT_VAR_ACCESS ;
1215
1230
}
1216
1231
}
1217
- const size_t frame_size = zend_jit_trace_frame_size (p -> op_array );
1232
+ const size_t frame_size = zend_jit_trace_function_frame_size (p -> func );
1218
1233
if (call_level == 0 ) {
1219
1234
if (stack_top + frame_size > stack_size ) {
1220
1235
stack_size = stack_top + frame_size ;
@@ -1226,7 +1241,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1226
1241
} else if (p -> op == ZEND_JIT_TRACE_ENTER ) {
1227
1242
op_array = p -> op_array ;
1228
1243
if (call_level == 0 ) {
1229
- stack_top += zend_jit_trace_frame_size (op_array );
1244
+ stack_top += zend_jit_trace_op_array_frame_size (op_array );
1230
1245
if (stack_top > stack_size ) {
1231
1246
stack_size = stack_top ;
1232
1247
}
@@ -1251,7 +1266,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1251
1266
}
1252
1267
} else if (p -> op == ZEND_JIT_TRACE_BACK ) {
1253
1268
if (level == 0 ) {
1254
- stack_bottom += zend_jit_trace_frame_size (p -> op_array );
1269
+ stack_bottom += zend_jit_trace_op_array_frame_size (p -> op_array );
1255
1270
zend_jit_op_array_trace_extension * const jit_extension =
1256
1271
(zend_jit_op_array_trace_extension * )ZEND_FUNC_INFO (op_array );
1257
1272
ssa = & jit_extension -> func_info .ssa ;
@@ -1268,7 +1283,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1268
1283
ssa = zend_jit_trace_build_ssa (op_array , script );
1269
1284
}
1270
1285
} else {
1271
- stack_top -= zend_jit_trace_frame_size (op_array );
1286
+ stack_top -= zend_jit_trace_op_array_frame_size (op_array );
1272
1287
level -- ;
1273
1288
}
1274
1289
op_array = p -> op_array ;
@@ -1368,7 +1383,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1368
1383
idx ++ ;
1369
1384
}
1370
1385
} else if (p -> op == ZEND_JIT_TRACE_ENTER ) {
1371
- frame = zend_jit_trace_call_frame (frame , op_array );
1386
+ frame = zend_jit_trace_op_array_call_frame (frame , op_array );
1372
1387
stack = frame -> stack ;
1373
1388
op_array = p -> op_array ;
1374
1389
level ++ ;
@@ -1381,7 +1396,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1381
1396
}
1382
1397
} else if (p -> op == ZEND_JIT_TRACE_BACK ) {
1383
1398
op_array = p -> op_array ;
1384
- frame = zend_jit_trace_ret_frame (frame , op_array );
1399
+ frame = zend_jit_trace_op_array_ret_frame (frame , op_array );
1385
1400
stack = frame -> stack ;
1386
1401
if (level == 0 ) {
1387
1402
if (ssa_vars_count >= ZEND_JIT_TRACE_MAX_SSA_VAR ) {
@@ -1586,7 +1601,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1586
1601
}
1587
1602
1588
1603
frame = JIT_G (current_frame );
1589
- zend_jit_trace_stack_frame * top = zend_jit_trace_call_frame (frame , op_array );
1604
+ zend_jit_trace_stack_frame * top = zend_jit_trace_op_array_call_frame (frame , op_array );
1590
1605
TRACE_FRAME_INIT (frame , op_array , 0 , 0 );
1591
1606
TRACE_FRAME_SET_RETURN_SSA_VAR (frame , -1 );
1592
1607
frame -> used_stack = 0 ;
@@ -2280,7 +2295,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
2280
2295
call = top ;
2281
2296
TRACE_FRAME_INIT (call , op_array , 0 , 0 );
2282
2297
call -> used_stack = 0 ;
2283
- top = zend_jit_trace_call_frame (top , op_array );
2298
+ top = zend_jit_trace_op_array_call_frame (top , op_array );
2284
2299
for (i = 0 ; i < op_array -> last_var + op_array -> T ; i ++ ) {
2285
2300
SET_STACK_TYPE (call -> stack , i , IS_UNKNOWN , 1 );
2286
2301
}
@@ -2402,7 +2417,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
2402
2417
ZEND_ASSERT (& frame -> func -> op_array == op_array );
2403
2418
} else {
2404
2419
max_used_stack = used_stack = -1 ;
2405
- frame = zend_jit_trace_ret_frame (frame , op_array );
2420
+ frame = zend_jit_trace_op_array_ret_frame (frame , op_array );
2406
2421
TRACE_FRAME_INIT (frame , op_array , 0 , 0 );
2407
2422
TRACE_FRAME_SET_RETURN_SSA_VAR (frame , -1 );
2408
2423
frame -> used_stack = 0 ;
@@ -2417,9 +2432,9 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
2417
2432
call -> prev = frame -> call ;
2418
2433
call -> used_stack = 0 ;
2419
2434
frame -> call = call ;
2420
- top = zend_jit_trace_call_frame (top , p -> op_array );
2435
+ top = zend_jit_trace_function_call_frame (top , p -> func );
2421
2436
if (p -> func && p -> func -> type == ZEND_USER_FUNCTION ) {
2422
- for (i = 0 ; i < p -> op_array -> last_var + p -> op_array -> T ; i ++ ) {
2437
+ for (i = 0 ; i < p -> func -> op_array . last_var + p -> func -> op_array . T ; i ++ ) {
2423
2438
SET_STACK_INFO (call -> stack , i , -1 );
2424
2439
}
2425
2440
}
@@ -2966,7 +2981,7 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace
2966
2981
/* New call frames */
2967
2982
zend_jit_trace_stack_frame * prev_frame = frame ;
2968
2983
2969
- frame = zend_jit_trace_call_frame (frame , op_array );
2984
+ frame = zend_jit_trace_op_array_call_frame (frame , op_array );
2970
2985
frame -> prev = prev_frame ;
2971
2986
frame -> func = (const zend_function * )p -> op_array ;
2972
2987
stack = frame -> stack ;
@@ -3000,7 +3015,7 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace
3000
3015
zend_jit_op_array_trace_extension * const jit_extension =
3001
3016
(zend_jit_op_array_trace_extension * )ZEND_FUNC_INFO (op_array );
3002
3017
op_array_ssa = & jit_extension -> func_info .ssa ;
3003
- frame = zend_jit_trace_ret_frame (frame , op_array );
3018
+ frame = zend_jit_trace_op_array_ret_frame (frame , op_array );
3004
3019
stack = frame -> stack ;
3005
3020
if (level == 0 ) {
3006
3021
/* New return frames */
@@ -3942,7 +3957,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
3942
3957
ZEND_ASSERT (p -> op == ZEND_JIT_TRACE_START );
3943
3958
const zend_op_array * op_array = p -> op_array ;
3944
3959
zend_jit_trace_stack_frame * frame = JIT_G (current_frame );
3945
- zend_jit_trace_stack_frame * top = zend_jit_trace_call_frame (frame , op_array );
3960
+ zend_jit_trace_stack_frame * top = zend_jit_trace_op_array_call_frame (frame , op_array );
3946
3961
TRACE_FRAME_INIT (frame , op_array , TRACE_FRAME_MASK_UNKNOWN_RETURN , -1 );
3947
3962
int checked_stack ;
3948
3963
int peek_checked_stack ;
@@ -6494,7 +6509,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
6494
6509
stack = frame -> stack ;
6495
6510
ZEND_ASSERT (& frame -> func -> op_array == op_array );
6496
6511
} else {
6497
- frame = zend_jit_trace_ret_frame (frame , op_array );
6512
+ frame = zend_jit_trace_op_array_ret_frame (frame , op_array );
6498
6513
TRACE_FRAME_INIT (frame , op_array , TRACE_FRAME_MASK_UNKNOWN_RETURN , -1 );
6499
6514
frame -> used_stack = checked_stack = peek_checked_stack = 0 ;
6500
6515
stack = frame -> stack ;
@@ -6580,40 +6595,40 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
6580
6595
}
6581
6596
}
6582
6597
frame -> call = call ;
6583
- top = zend_jit_trace_call_frame (top , p -> op_array );
6598
+ top = zend_jit_trace_function_call_frame (top , p -> func );
6584
6599
if (p -> func ) {
6585
6600
if (p -> func -> type == ZEND_USER_FUNCTION ) {
6586
6601
if (JIT_G (opt_level ) >= ZEND_JIT_LEVEL_INLINE ) {
6587
6602
zend_jit_op_array_trace_extension * jit_extension =
6588
- (zend_jit_op_array_trace_extension * )ZEND_FUNC_INFO (p -> op_array );
6603
+ (zend_jit_op_array_trace_extension * )ZEND_FUNC_INFO (& p -> func -> op_array );
6589
6604
6590
6605
uint32_t i = 0 ;
6591
- while (i < p -> op_array -> num_args ) {
6606
+ while (i < p -> func -> op_array . num_args ) {
6592
6607
/* Types of arguments are going to be stored in abstract stack when processing SEV instruction */
6593
6608
SET_STACK_TYPE (call -> stack , i , IS_UNKNOWN , 1 );
6594
6609
i ++ ;
6595
6610
}
6596
- while (i < p -> op_array -> last_var ) {
6611
+ while (i < p -> func -> op_array . last_var ) {
6597
6612
if (jit_extension
6598
- && zend_jit_var_may_alias (p -> op_array , & jit_extension -> func_info .ssa , i ) != NO_ALIAS ) {
6613
+ && zend_jit_var_may_alias (& p -> func -> op_array , & jit_extension -> func_info .ssa , i ) != NO_ALIAS ) {
6599
6614
SET_STACK_TYPE (call -> stack , i , IS_UNKNOWN , 1 );
6600
6615
} else {
6601
6616
SET_STACK_TYPE (call -> stack , i , IS_UNDEF , 1 );
6602
6617
}
6603
6618
i ++ ;
6604
6619
}
6605
- while (i < p -> op_array -> last_var + p -> op_array -> T ) {
6620
+ while (i < p -> func -> op_array . last_var + p -> func -> op_array . T ) {
6606
6621
SET_STACK_TYPE (call -> stack , i , IS_UNKNOWN , 1 );
6607
6622
i ++ ;
6608
6623
}
6609
6624
} else {
6610
- for (uint32_t i = 0 ; i < p -> op_array -> last_var + p -> op_array -> T ; i ++ ) {
6625
+ for (uint32_t i = 0 ; i < p -> func -> op_array . last_var + p -> func -> op_array . T ; i ++ ) {
6611
6626
SET_STACK_TYPE (call -> stack , i , IS_UNKNOWN , 1 );
6612
6627
}
6613
6628
}
6614
6629
} else {
6615
6630
ZEND_ASSERT (p -> func -> type == ZEND_INTERNAL_FUNCTION );
6616
- for (uint32_t i = 0 ; i < p -> op_array -> num_args ; i ++ ) {
6631
+ for (uint32_t i = 0 ; i < p -> func -> common . num_args ; i ++ ) {
6617
6632
SET_STACK_TYPE (call -> stack , i , IS_UNKNOWN , 1 );
6618
6633
}
6619
6634
}
0 commit comments