Skip to content

Commit 5002b0f

Browse files
committed
Revert "Return -1 to signal execute_data reloading"
This reverts commit 9aaceaf6a2480836ae59d9657d37b10bbe04268e.
1 parent 0b4bfd1 commit 5002b0f

File tree

4 files changed

+37
-34
lines changed

4 files changed

+37
-34
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*)-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");
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");
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".
21842185
$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: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ 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))
148149
#define ir_NEG_C(_op1) ir_UNARY_OP_C(IR_NEG, (_op1))
149150
#define ir_NEG_I8(_op1) ir_UNARY_OP_I8(IR_NEG, (_op1))
150151
#define ir_NEG_I16(_op1) ir_UNARY_OP_I16(IR_NEG, (_op1))

ext/opcache/jit/zend_jit_ir.c

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1885,7 +1885,6 @@ 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));
18891888
ir_IJMP(jit_STUB_ADDR(jit, jit_stub_interrupt_handler));
18901889
ir_IF_FALSE(if_timeout);
18911890
}
@@ -2012,7 +2011,7 @@ static int zend_jit_interrupt_handler_stub(zend_jit_ctx *jit)
20122011
if (GCC_GLOBAL_REGS) {
20132012
ir_TAILCALL(IR_VOID, ir_LOAD_A(jit_IP(jit)));
20142013
} else {
2015-
ir_RETURN(ir_CONST_ADDR(-1)); // ZEND_VM_ENTER
2014+
ir_RETURN(ir_NEG_A(jit_IP(jit))); // ZEND_VM_ENTER
20162015
}
20172016
return 1;
20182017
}
@@ -2207,13 +2206,13 @@ static int zend_jit_leave_throw_stub(zend_jit_ctx *jit)
22072206
// JIT: opline = EG(exception_op);
22082207
jit_LOAD_IP(jit, jit_EG(exception_op));
22092208

2210-
ir_STORE(jit_EX(opline), jit_IP(jit));
2211-
22122209
if (GCC_GLOBAL_REGS) {
2210+
ir_STORE(jit_EX(opline), jit_IP(jit));
2211+
22132212
// JIT: HANDLE_EXCEPTION()
22142213
ir_IJMP(jit_STUB_ADDR(jit, jit_stub_exception_handler));
22152214
} else {
2216-
ir_RETURN(ir_CONST_ADDR(-1)); // ZEND_VM_LEAVE
2215+
ir_RETURN(ir_NEG_A(jit_IP(jit))); // ZEND_VM_LEAVE
22172216
}
22182217

22192218
return 1;
@@ -2408,8 +2407,8 @@ static int zend_jit_trace_escape_stub(zend_jit_ctx *jit)
24082407
if (GCC_GLOBAL_REGS) {
24092408
ir_TAILCALL(IR_VOID, ir_LOAD_A(jit_IP(jit)));
24102409
} else {
2411-
ir_STORE(jit_EX(opline), jit_IP(jit)); // TODO: do we need this?
2412-
ir_RETURN(ir_CONST_ADDR(-1)); // ZEND_VM_ENTER
2410+
// TODO: tailcall?
2411+
ir_RETURN(ir_NEG_A(jit_IP(jit))); // ZEND_VM_ENTER
24132412
}
24142413

24152414
return 1;
@@ -2435,7 +2434,8 @@ static int zend_jit_trace_exit_stub(zend_jit_ctx *jit)
24352434
jit_STORE_IP(jit, ref);
24362435
ir_TAILCALL(IR_VOID, ir_LOAD_A(jit_IP(jit)));
24372436
} else {
2438-
ir_RETURN(ir_CONST_ADDR(-1)); // ZEND_VM_ENTER
2437+
ref = ir_LOAD_A(jit_EX(opline));
2438+
ir_RETURN(ir_NEG_A(ref)); // ZEND_VM_ENTER
24392439
}
24402440

24412441
ir_IF_FALSE(if_zero);
@@ -2458,9 +2458,13 @@ 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-
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
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);
24642468
}
24652469

24662470
return 1;
@@ -4209,8 +4213,13 @@ static int zend_jit_tail_handler(zend_jit_ctx *jit, const zend_op *opline)
42094213
|| opline->opcode == ZEND_MATCH_ERROR
42104214
|| opline->opcode == ZEND_THROW
42114215
|| opline->opcode == ZEND_VERIFY_NEVER_TYPE)) {
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
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);
42144223
} else {
42154224
ir_TAILCALL_2(IR_ADDR, ir_CONST_FC_FUNC(handler), jit_FP(jit), jit_IP(jit));
42164225
}
@@ -7968,7 +7977,6 @@ static int zend_jit_escape_if_undef(zend_jit_ctx *jit, int var, uint32_t flags,
79687977
}
79697978

79707979
jit_LOAD_IP_ADDR(jit, opline - 1);
7971-
ir_STORE(jit_EX(opline), ir_CONST_ADDR(opline));
79727980
ir_IJMP(jit_STUB_ADDR(jit, jit_stub_trace_escape));
79737981

79747982
ir_IF_TRUE(if_def);
@@ -10228,7 +10236,6 @@ static int zend_jit_do_fcall(zend_jit_ctx *jit, const zend_op *opline, const zen
1022810236
}
1022910237
if (zend_accel_in_shm(func->op_array.opcodes)) {
1023010238
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));
1023210239
} else {
1023310240
if (!func_ref) {
1023410241
func_ref = ir_LOAD_A(jit_CALL(rx, func));
@@ -10238,7 +10245,6 @@ static int zend_jit_do_fcall(zend_jit_ctx *jit, const zend_op *opline, const zen
1023810245
ip = ir_ADD_OFFSET(ip, num_args * sizeof(zend_op));
1023910246
}
1024010247
jit_LOAD_IP(jit, ip);
10241-
ir_STORE(jit_EX(opline), ip);
1024210248
}
1024310249

1024410250
if (!trace && op_array == &func->op_array && call_num_args >= op_array->required_num_args) {
@@ -10261,7 +10267,6 @@ static int zend_jit_do_fcall(zend_jit_ctx *jit, const zend_op *opline, const zen
1026110267
ip = ir_LOAD_A(ir_ADD_OFFSET(func_ref, offsetof(zend_op_array, opcodes)));
1026210268
}
1026310269
jit_LOAD_IP(jit, ip);
10264-
ir_STORE(jit_EX(opline), ip);
1026510270
helper = ir_CONST_FC_FUNC(zend_jit_copy_extra_args_helper);
1026610271
} else {
1026710272
helper = ir_CONST_FC_FUNC(zend_jit_copy_extra_args_helper_no_skip_recv);
@@ -10286,7 +10291,6 @@ static int zend_jit_do_fcall(zend_jit_ctx *jit, const zend_op *opline, const zen
1028610291
ip = ir_LOAD_A(ir_ADD_OFFSET(func_ref, offsetof(zend_op_array, opcodes)));
1028710292
}
1028810293
jit_LOAD_IP(jit, ip);
10289-
ir_STORE(jit_EX(opline), ip);
1029010294

1029110295
// JIT: num_args = EX_NUM_ARGS();
1029210296
ir_ref num_args, first_extra_arg;
@@ -10444,7 +10448,7 @@ static int zend_jit_do_fcall(zend_jit_ctx *jit, const zend_op *opline, const zen
1044410448
if (GCC_GLOBAL_REGS) {
1044510449
ir_TAILCALL(IR_VOID, ir_LOAD_A(jit_IP(jit)));
1044610450
} else {
10447-
ir_RETURN(ir_CONST_ADDR(-1)); // ZEND_VM_ENTER
10451+
ir_RETURN(ir_NEG_A(jit_IP(jit))); // ZEND_VM_ENTER
1044810452
}
1044910453
} while (0);
1045010454

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

1067910683
if ((!trace || !func) && opline->opcode != ZEND_DO_ICALL) {
1068010684
jit_LOAD_IP_ADDR(jit, opline + 1);
10681-
ir_STORE(jit_EX(opline), ir_CONST_ADDR(opline + 1));
1068210685
} else if (trace
1068310686
&& trace->op == ZEND_JIT_TRACE_END
1068410687
&& trace->stop >= ZEND_JIT_TRACE_STOP_INTERPRETER) {
1068510688
jit_LOAD_IP_ADDR(jit, opline + 1);
10686-
ir_STORE(jit_EX(opline), ir_CONST_ADDR(opline + 1));
1068710689
}
1068810690
}
1068910691

@@ -11214,7 +11216,7 @@ static int zend_jit_leave_func(zend_jit_ctx *jit,
1121411216
if (GCC_GLOBAL_REGS) {
1121511217
ir_TAILCALL(IR_VOID, ir_LOAD_A(jit_IP(jit)));
1121611218
} else {
11217-
ir_RETURN(ir_CONST_ADDR(-1)); // ZEND_VM_LEAVE
11219+
ir_RETURN(ir_NEG_A(jit_IP(jit))); // ZEND_VM_LEAVE
1121811220
}
1121911221

1122011222
jit->b = -1;
@@ -17344,7 +17346,7 @@ static int zend_jit_trace_return(zend_jit_ctx *jit, bool original_handler, const
1734417346
return 1;
1734517347
}
1734617348
}
17347-
ir_RETURN(ir_CONST_ADDR(-1)); // ZEND_VM_LEAVE
17349+
ir_RETURN(ir_NEG_A(jit_IP(jit))); // ZEND_VM_RETURN
1734817350
}
1734917351
return 1;
1735017352
}

0 commit comments

Comments
 (0)