Skip to content

Commit 0b4bfd1

Browse files
committed
Return -1 to signal execute_data reloading
Instead of returning -opline. This simplifies JIT as we can simply return -1 for VM_ENTER/VM_LEAVE. However, this implies that EX(opline) must be in sync.
1 parent 3851c7d commit 0b4bfd1

File tree

4 files changed

+34
-37
lines changed

4 files changed

+34
-37
lines changed

Zend/zend_vm_execute.h

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Zend/zend_vm_gen.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1944,9 +1944,9 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
19441944
out($f,"# define ZEND_VM_ENTER() opline = EG(current_execute_data)->opline; ZEND_VM_ENTER_EX()\n");
19451945
out($f,"# define ZEND_VM_LEAVE() return 2\n");
19461946
out($f,"#else\n");
1947-
out($f,"# define ZEND_VM_ENTER_EX() return (zend_op*)-(uintptr_t)opline\n");
1948-
out($f,"# define ZEND_VM_ENTER() execute_data = EG(current_execute_data); LOAD_OPLINE(); ZEND_VM_ENTER_EX()\n");
1949-
out($f,"# define ZEND_VM_LEAVE() return (zend_op*)-(uintptr_t)opline\n");
1947+
out($f,"# define ZEND_VM_ENTER_EX() return (zend_op*)-1\n");
1948+
out($f,"# define ZEND_VM_ENTER() ZEND_VM_ENTER_EX()\n");
1949+
out($f,"# define ZEND_VM_LEAVE() return (zend_op*)-1\n");
19501950
out($f,"#endif\n");
19511951
out($f,"#define ZEND_VM_INTERRUPT() ZEND_VM_TAIL_CALL(zend_interrupt_helper".($spec?"_SPEC":"")."(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));\n");
19521952
out($f,"#define ZEND_VM_LOOP_INTERRUPT() zend_interrupt_helper".($spec?"_SPEC":"")."(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);\n");
@@ -2181,8 +2181,8 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
21812181
$m[1]."return;\n" .
21822182
"#else\n" .
21832183
$m[1]."if (EXPECTED(opline != NULL)) {\n" .
2184-
$m[1]."\topline = (zend_op*)-(uintptr_t)opline;\n".
21852184
$m[1]."\texecute_data = EG(current_execute_data);\n".
2185+
$m[1]."\topline = EX(opline);\n".
21862186
$m[1]."\tZEND_VM_LOOP_INTERRUPT_CHECK();\n".
21872187
$m[1]."} else {\n" .
21882188
"# ifdef ZEND_VM_IP_GLOBAL_REG\n" .

ext/opcache/jit/ir/ir_builder.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,6 @@ extern "C" {
145145
#define ir_MOD_I64(_op1, _op2) ir_BINARY_OP_I64(IR_MOD, (_op1), (_op2))
146146

147147
#define ir_NEG(_type, _op1) ir_UNARY_OP(IR_NEG, (_type), (_op1))
148-
#define ir_NEG_A(_op1) ir_UNARY_OP_A(IR_NEG, (_op1))
149148
#define ir_NEG_C(_op1) ir_UNARY_OP_C(IR_NEG, (_op1))
150149
#define ir_NEG_I8(_op1) ir_UNARY_OP_I8(IR_NEG, (_op1))
151150
#define ir_NEG_I16(_op1) ir_UNARY_OP_I16(IR_NEG, (_op1))

ext/opcache/jit/zend_jit_ir.c

Lines changed: 23 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1885,6 +1885,7 @@ static void zend_jit_check_timeout(zend_jit_ctx *jit, const zend_op *opline, con
18851885

18861886
ir_IF_TRUE_cold(if_timeout);
18871887
jit_LOAD_IP_ADDR(jit, opline);
1888+
ir_STORE(jit_EX(opline), ir_CONST_ADDR(opline));
18881889
ir_IJMP(jit_STUB_ADDR(jit, jit_stub_interrupt_handler));
18891890
ir_IF_FALSE(if_timeout);
18901891
}
@@ -2011,7 +2012,7 @@ static int zend_jit_interrupt_handler_stub(zend_jit_ctx *jit)
20112012
if (GCC_GLOBAL_REGS) {
20122013
ir_TAILCALL(IR_VOID, ir_LOAD_A(jit_IP(jit)));
20132014
} else {
2014-
ir_RETURN(ir_NEG_A(jit_IP(jit))); // ZEND_VM_ENTER
2015+
ir_RETURN(ir_CONST_ADDR(-1)); // ZEND_VM_ENTER
20152016
}
20162017
return 1;
20172018
}
@@ -2206,13 +2207,13 @@ static int zend_jit_leave_throw_stub(zend_jit_ctx *jit)
22062207
// JIT: opline = EG(exception_op);
22072208
jit_LOAD_IP(jit, jit_EG(exception_op));
22082209

2209-
if (GCC_GLOBAL_REGS) {
2210-
ir_STORE(jit_EX(opline), jit_IP(jit));
2210+
ir_STORE(jit_EX(opline), jit_IP(jit));
22112211

2212+
if (GCC_GLOBAL_REGS) {
22122213
// JIT: HANDLE_EXCEPTION()
22132214
ir_IJMP(jit_STUB_ADDR(jit, jit_stub_exception_handler));
22142215
} else {
2215-
ir_RETURN(ir_NEG_A(jit_IP(jit))); // ZEND_VM_LEAVE
2216+
ir_RETURN(ir_CONST_ADDR(-1)); // ZEND_VM_LEAVE
22162217
}
22172218

22182219
return 1;
@@ -2407,8 +2408,8 @@ static int zend_jit_trace_escape_stub(zend_jit_ctx *jit)
24072408
if (GCC_GLOBAL_REGS) {
24082409
ir_TAILCALL(IR_VOID, ir_LOAD_A(jit_IP(jit)));
24092410
} 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
24122413
}
24132414

24142415
return 1;
@@ -2434,8 +2435,7 @@ static int zend_jit_trace_exit_stub(zend_jit_ctx *jit)
24342435
jit_STORE_IP(jit, ref);
24352436
ir_TAILCALL(IR_VOID, ir_LOAD_A(jit_IP(jit)));
24362437
} 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
24392439
}
24402440

24412441
ir_IF_FALSE(if_zero);
@@ -2458,13 +2458,9 @@ static int zend_jit_trace_exit_stub(zend_jit_ctx *jit)
24582458
#if defined(IR_TARGET_X86)
24592459
addr = ir_CAST_FC_FUNC(addr);
24602460
#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
24682464
}
24692465

24702466
return 1;
@@ -4213,13 +4209,8 @@ static int zend_jit_tail_handler(zend_jit_ctx *jit, const zend_op *opline)
42134209
|| opline->opcode == ZEND_MATCH_ERROR
42144210
|| opline->opcode == ZEND_THROW
42154211
|| 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
42234214
} else {
42244215
ir_TAILCALL_2(IR_ADDR, ir_CONST_FC_FUNC(handler), jit_FP(jit), jit_IP(jit));
42254216
}
@@ -7977,6 +7968,7 @@ static int zend_jit_escape_if_undef(zend_jit_ctx *jit, int var, uint32_t flags,
79777968
}
79787969

79797970
jit_LOAD_IP_ADDR(jit, opline - 1);
7971+
ir_STORE(jit_EX(opline), ir_CONST_ADDR(opline));
79807972
ir_IJMP(jit_STUB_ADDR(jit, jit_stub_trace_escape));
79817973

79827974
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
1023610228
}
1023710229
if (zend_accel_in_shm(func->op_array.opcodes)) {
1023810230
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));
1023910232
} else {
1024010233
if (!func_ref) {
1024110234
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
1024510238
ip = ir_ADD_OFFSET(ip, num_args * sizeof(zend_op));
1024610239
}
1024710240
jit_LOAD_IP(jit, ip);
10241+
ir_STORE(jit_EX(opline), ip);
1024810242
}
1024910243

1025010244
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
1026710261
ip = ir_LOAD_A(ir_ADD_OFFSET(func_ref, offsetof(zend_op_array, opcodes)));
1026810262
}
1026910263
jit_LOAD_IP(jit, ip);
10264+
ir_STORE(jit_EX(opline), ip);
1027010265
helper = ir_CONST_FC_FUNC(zend_jit_copy_extra_args_helper);
1027110266
} else {
1027210267
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
1029110286
ip = ir_LOAD_A(ir_ADD_OFFSET(func_ref, offsetof(zend_op_array, opcodes)));
1029210287
}
1029310288
jit_LOAD_IP(jit, ip);
10289+
ir_STORE(jit_EX(opline), ip);
1029410290

1029510291
// JIT: num_args = EX_NUM_ARGS();
1029610292
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
1044810444
if (GCC_GLOBAL_REGS) {
1044910445
ir_TAILCALL(IR_VOID, ir_LOAD_A(jit_IP(jit)));
1045010446
} else {
10451-
ir_RETURN(ir_NEG_A(jit_IP(jit))); // ZEND_VM_ENTER
10447+
ir_RETURN(ir_CONST_ADDR(-1)); // ZEND_VM_ENTER
1045210448
}
1045310449
} while (0);
1045410450

@@ -10682,10 +10678,12 @@ static int zend_jit_do_fcall(zend_jit_ctx *jit, const zend_op *opline, const zen
1068210678

1068310679
if ((!trace || !func) && opline->opcode != ZEND_DO_ICALL) {
1068410680
jit_LOAD_IP_ADDR(jit, opline + 1);
10681+
ir_STORE(jit_EX(opline), ir_CONST_ADDR(opline + 1));
1068510682
} else if (trace
1068610683
&& trace->op == ZEND_JIT_TRACE_END
1068710684
&& trace->stop >= ZEND_JIT_TRACE_STOP_INTERPRETER) {
1068810685
jit_LOAD_IP_ADDR(jit, opline + 1);
10686+
ir_STORE(jit_EX(opline), ir_CONST_ADDR(opline + 1));
1068910687
}
1069010688
}
1069110689

@@ -11216,7 +11214,7 @@ static int zend_jit_leave_func(zend_jit_ctx *jit,
1121611214
if (GCC_GLOBAL_REGS) {
1121711215
ir_TAILCALL(IR_VOID, ir_LOAD_A(jit_IP(jit)));
1121811216
} else {
11219-
ir_RETURN(ir_NEG_A(jit_IP(jit))); // ZEND_VM_LEAVE
11217+
ir_RETURN(ir_CONST_ADDR(-1)); // ZEND_VM_LEAVE
1122011218
}
1122111219

1122211220
jit->b = -1;
@@ -17346,7 +17344,7 @@ static int zend_jit_trace_return(zend_jit_ctx *jit, bool original_handler, const
1734617344
return 1;
1734717345
}
1734817346
}
17349-
ir_RETURN(ir_NEG_A(jit_IP(jit))); // ZEND_VM_RETURN
17347+
ir_RETURN(ir_CONST_ADDR(-1)); // ZEND_VM_LEAVE
1735017348
}
1735117349
return 1;
1735217350
}

0 commit comments

Comments
 (0)