@@ -1885,6 +1885,7 @@ static void zend_jit_check_timeout(zend_jit_ctx *jit, const zend_op *opline, con
1885
1885
1886
1886
ir_IF_TRUE_cold(if_timeout);
1887
1887
jit_LOAD_IP_ADDR(jit, opline);
1888
+ ir_STORE(jit_EX(opline), ir_CONST_ADDR(opline));
1888
1889
ir_IJMP(jit_STUB_ADDR(jit, jit_stub_interrupt_handler));
1889
1890
ir_IF_FALSE(if_timeout);
1890
1891
}
@@ -2011,7 +2012,7 @@ static int zend_jit_interrupt_handler_stub(zend_jit_ctx *jit)
2011
2012
if (GCC_GLOBAL_REGS) {
2012
2013
ir_TAILCALL(IR_VOID, ir_LOAD_A(jit_IP(jit)));
2013
2014
} else {
2014
- ir_RETURN(ir_NEG_A(jit_IP(jit) )); // ZEND_VM_ENTER
2015
+ ir_RETURN(ir_CONST_ADDR(-1 )); // ZEND_VM_ENTER
2015
2016
}
2016
2017
return 1;
2017
2018
}
@@ -2206,13 +2207,13 @@ static int zend_jit_leave_throw_stub(zend_jit_ctx *jit)
2206
2207
// JIT: opline = EG(exception_op);
2207
2208
jit_LOAD_IP(jit, jit_EG(exception_op));
2208
2209
2209
- if (GCC_GLOBAL_REGS) {
2210
- ir_STORE(jit_EX(opline), jit_IP(jit));
2210
+ ir_STORE(jit_EX(opline), jit_IP(jit));
2211
2211
2212
+ if (GCC_GLOBAL_REGS) {
2212
2213
// JIT: HANDLE_EXCEPTION()
2213
2214
ir_IJMP(jit_STUB_ADDR(jit, jit_stub_exception_handler));
2214
2215
} else {
2215
- ir_RETURN(ir_NEG_A(jit_IP(jit) )); // ZEND_VM_LEAVE
2216
+ ir_RETURN(ir_CONST_ADDR(-1 )); // ZEND_VM_LEAVE
2216
2217
}
2217
2218
2218
2219
return 1;
@@ -2407,8 +2408,8 @@ static int zend_jit_trace_escape_stub(zend_jit_ctx *jit)
2407
2408
if (GCC_GLOBAL_REGS) {
2408
2409
ir_TAILCALL(IR_VOID, ir_LOAD_A(jit_IP(jit)));
2409
2410
} else {
2410
- // TODO: tailcall ?
2411
- ir_RETURN(ir_NEG_A(jit_IP(jit) )); // ZEND_VM_ENTER
2411
+ ir_STORE(jit_EX(opline), jit_IP(jit)); // TODO: do we need this ?
2412
+ ir_RETURN(ir_CONST_ADDR(-1 )); // ZEND_VM_ENTER
2412
2413
}
2413
2414
2414
2415
return 1;
@@ -2434,8 +2435,7 @@ static int zend_jit_trace_exit_stub(zend_jit_ctx *jit)
2434
2435
jit_STORE_IP(jit, ref);
2435
2436
ir_TAILCALL(IR_VOID, ir_LOAD_A(jit_IP(jit)));
2436
2437
} else {
2437
- ref = ir_LOAD_A(jit_EX(opline));
2438
- ir_RETURN(ir_NEG_A(ref)); // ZEND_VM_ENTER
2438
+ ir_RETURN(ir_CONST_ADDR(-1)); // ZEND_VM_ENTER
2439
2439
}
2440
2440
2441
2441
ir_IF_FALSE(if_zero);
@@ -2458,13 +2458,9 @@ static int zend_jit_trace_exit_stub(zend_jit_ctx *jit)
2458
2458
#if defined(IR_TARGET_X86)
2459
2459
addr = ir_CAST_FC_FUNC(addr);
2460
2460
#endif
2461
- ref = ir_CALL_2(IR_ADDR, addr, jit_FP(jit), jit_IP(jit));
2462
- // Force reload execute_ex in VM
2463
- ir_ref is_positive = ir_IF(ir_GE(ref, ir_CONST_I32(0)));
2464
- ir_IF_TRUE(is_positive);
2465
- ir_RETURN(ir_NEG_A(ref)); // ZEND_VM_ENTER
2466
- ir_IF_FALSE(is_positive);
2467
- ir_RETURN(ref);
2461
+ ir_CALL_2(IR_ADDR, addr, jit_FP(jit), jit_IP(jit));
2462
+ ir_GUARD(ir_GT(ref, ir_CONST_I32(0)), jit_STUB_ADDR(jit, jit_stub_trace_halt));
2463
+ ir_RETURN(ir_CONST_ADDR(-1)); // ZEND_VM_ENTER
2468
2464
}
2469
2465
2470
2466
return 1;
@@ -4213,13 +4209,8 @@ static int zend_jit_tail_handler(zend_jit_ctx *jit, const zend_op *opline)
4213
4209
|| opline->opcode == ZEND_MATCH_ERROR
4214
4210
|| opline->opcode == ZEND_THROW
4215
4211
|| opline->opcode == ZEND_VERIFY_NEVER_TYPE)) {
4216
- ir_ref ip = ir_CALL_2(IR_ADDR, ir_CONST_FC_FUNC(handler), jit_FP(jit), jit_IP(jit));
4217
- // Force reload execute_ex in VM (TODO: check if we actually need this)
4218
- ir_ref is_positive = ir_IF(ir_GE(ip, ir_CONST_I32(0)));
4219
- ir_IF_TRUE(is_positive);
4220
- ir_RETURN(ir_NEG_A(ip)); // ZEND_VM_ENTER
4221
- ir_IF_FALSE(is_positive);
4222
- ir_RETURN(ip);
4212
+ ir_CALL_2(IR_ADDR, ir_CONST_FC_FUNC(handler), jit_FP(jit), jit_IP(jit));
4213
+ ir_RETURN(ir_CONST_ADDR(-1)); // ZEND_VM_ENTER
4223
4214
} else {
4224
4215
ir_TAILCALL_2(IR_ADDR, ir_CONST_FC_FUNC(handler), jit_FP(jit), jit_IP(jit));
4225
4216
}
@@ -7977,6 +7968,7 @@ static int zend_jit_escape_if_undef(zend_jit_ctx *jit, int var, uint32_t flags,
7977
7968
}
7978
7969
7979
7970
jit_LOAD_IP_ADDR(jit, opline - 1);
7971
+ ir_STORE(jit_EX(opline), ir_CONST_ADDR(opline));
7980
7972
ir_IJMP(jit_STUB_ADDR(jit, jit_stub_trace_escape));
7981
7973
7982
7974
ir_IF_TRUE(if_def);
@@ -10236,6 +10228,7 @@ static int zend_jit_do_fcall(zend_jit_ctx *jit, const zend_op *opline, const zen
10236
10228
}
10237
10229
if (zend_accel_in_shm(func->op_array.opcodes)) {
10238
10230
jit_LOAD_IP_ADDR(jit, func->op_array.opcodes + num_args);
10231
+ ir_STORE(jit_EX(opline), ir_CONST_ADDR(func->op_array.opcodes + num_args));
10239
10232
} else {
10240
10233
if (!func_ref) {
10241
10234
func_ref = ir_LOAD_A(jit_CALL(rx, func));
@@ -10245,6 +10238,7 @@ static int zend_jit_do_fcall(zend_jit_ctx *jit, const zend_op *opline, const zen
10245
10238
ip = ir_ADD_OFFSET(ip, num_args * sizeof(zend_op));
10246
10239
}
10247
10240
jit_LOAD_IP(jit, ip);
10241
+ ir_STORE(jit_EX(opline), ip);
10248
10242
}
10249
10243
10250
10244
if (!trace && op_array == &func->op_array && call_num_args >= op_array->required_num_args) {
@@ -10267,6 +10261,7 @@ static int zend_jit_do_fcall(zend_jit_ctx *jit, const zend_op *opline, const zen
10267
10261
ip = ir_LOAD_A(ir_ADD_OFFSET(func_ref, offsetof(zend_op_array, opcodes)));
10268
10262
}
10269
10263
jit_LOAD_IP(jit, ip);
10264
+ ir_STORE(jit_EX(opline), ip);
10270
10265
helper = ir_CONST_FC_FUNC(zend_jit_copy_extra_args_helper);
10271
10266
} else {
10272
10267
helper = ir_CONST_FC_FUNC(zend_jit_copy_extra_args_helper_no_skip_recv);
@@ -10291,6 +10286,7 @@ static int zend_jit_do_fcall(zend_jit_ctx *jit, const zend_op *opline, const zen
10291
10286
ip = ir_LOAD_A(ir_ADD_OFFSET(func_ref, offsetof(zend_op_array, opcodes)));
10292
10287
}
10293
10288
jit_LOAD_IP(jit, ip);
10289
+ ir_STORE(jit_EX(opline), ip);
10294
10290
10295
10291
// JIT: num_args = EX_NUM_ARGS();
10296
10292
ir_ref num_args, first_extra_arg;
@@ -10448,7 +10444,7 @@ static int zend_jit_do_fcall(zend_jit_ctx *jit, const zend_op *opline, const zen
10448
10444
if (GCC_GLOBAL_REGS) {
10449
10445
ir_TAILCALL(IR_VOID, ir_LOAD_A(jit_IP(jit)));
10450
10446
} else {
10451
- ir_RETURN(ir_NEG_A(jit_IP(jit) )); // ZEND_VM_ENTER
10447
+ ir_RETURN(ir_CONST_ADDR(-1 )); // ZEND_VM_ENTER
10452
10448
}
10453
10449
} while (0);
10454
10450
@@ -10682,10 +10678,12 @@ static int zend_jit_do_fcall(zend_jit_ctx *jit, const zend_op *opline, const zen
10682
10678
10683
10679
if ((!trace || !func) && opline->opcode != ZEND_DO_ICALL) {
10684
10680
jit_LOAD_IP_ADDR(jit, opline + 1);
10681
+ ir_STORE(jit_EX(opline), ir_CONST_ADDR(opline + 1));
10685
10682
} else if (trace
10686
10683
&& trace->op == ZEND_JIT_TRACE_END
10687
10684
&& trace->stop >= ZEND_JIT_TRACE_STOP_INTERPRETER) {
10688
10685
jit_LOAD_IP_ADDR(jit, opline + 1);
10686
+ ir_STORE(jit_EX(opline), ir_CONST_ADDR(opline + 1));
10689
10687
}
10690
10688
}
10691
10689
@@ -11216,7 +11214,7 @@ static int zend_jit_leave_func(zend_jit_ctx *jit,
11216
11214
if (GCC_GLOBAL_REGS) {
11217
11215
ir_TAILCALL(IR_VOID, ir_LOAD_A(jit_IP(jit)));
11218
11216
} else {
11219
- ir_RETURN(ir_NEG_A(jit_IP(jit) )); // ZEND_VM_LEAVE
11217
+ ir_RETURN(ir_CONST_ADDR(-1 )); // ZEND_VM_LEAVE
11220
11218
}
11221
11219
11222
11220
jit->b = -1;
@@ -17346,7 +17344,7 @@ static int zend_jit_trace_return(zend_jit_ctx *jit, bool original_handler, const
17346
17344
return 1;
17347
17345
}
17348
17346
}
17349
- ir_RETURN(ir_NEG_A(jit_IP(jit))) ; // ZEND_VM_RETURN
17347
+ ir_RETURN(ir_CONST_ADDR(-1)) ; // ZEND_VM_LEAVE
17350
17348
}
17351
17349
return 1;
17352
17350
}
0 commit comments