Skip to content

Commit 6d5f173

Browse files
committed
Revert "Fix vm_interrupt for tailcall VM"
This reverts commit a0f68b1.
1 parent 445c541 commit 6d5f173

5 files changed

Lines changed: 84 additions & 8 deletions

File tree

Zend/zend_vm_def.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10523,7 +10523,12 @@ ZEND_VM_DEFINE_OP(137, ZEND_OP_DATA);
1052310523
ZEND_VM_HELPER(zend_interrupt_helper, ANY, ANY)
1052410524
{
1052510525
zend_atomic_bool_store_ex(&EG(vm_interrupt), false);
10526+
#if ZEND_VM_KIND == ZEND_VM_KIND_TAILCALL
10527+
/* opline is &call_interrupt_op. Load orig opline. */
10528+
LOAD_OPLINE();
10529+
#else
1052610530
SAVE_OPLINE();
10531+
#endif
1052710532
if (zend_atomic_bool_load_ex(&EG(timed_out))) {
1052810533
zend_timeout();
1052910534
} else if (zend_interrupt_function) {

Zend/zend_vm_execute.h

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

Zend/zend_vm_execute.skl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,11 @@ ZEND_API const zend_op *zend_get_halt_op(void)
163163

164164
ZEND_API const zend_op *zend_get_interrupt_op(void)
165165
{
166+
#if ZEND_VM_KIND == ZEND_VM_KIND_TAILCALL
167+
return &call_interrupt_op;
168+
#else
166169
return NULL;
170+
#endif
167171
}
168172

169173
#if ZEND_VM_KIND == ZEND_VM_KIND_TAILCALL

Zend/zend_vm_gen.php

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1594,6 +1594,19 @@ function gen_halt_handler($f, $kind) {
15941594
out($f,"}\n\n");
15951595
}
15961596

1597+
function gen_interrupt_func($f, $kind, $spec) {
1598+
$cconv = $kind === ZEND_VM_KIND_TAILCALL ? 'ZEND_OPCODE_HANDLER_CCONV' : 'ZEND_OPCODE_HANDLER_FUNC_CCONV';
1599+
$variant = $kind === ZEND_VM_KIND_TAILCALL ? '_TAILCALL' : '';
1600+
out($f, "static ZEND_COLD zend_never_inline ZEND_OPCODE_HANDLER_RET {$cconv} zend_interrupt{$variant}(ZEND_OPCODE_HANDLER_ARGS) {\n");
1601+
out($f,"\tSAVE_OPLINE();\n");
1602+
if ($kind === ZEND_VM_KIND_TAILCALL) {
1603+
out($f,"\tZEND_VM_TAIL_CALL(zend_interrupt_helper".($spec?"_SPEC":"")."_TAILCALL(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));\n");
1604+
} else {
1605+
out($f, "\treturn &call_interrupt_op;\n");
1606+
}
1607+
out($f, "}\n");
1608+
}
1609+
15971610
function extra_spec_name($extra_spec) {
15981611
global $prefix;
15991612

@@ -1804,10 +1817,14 @@ function gen_executor_code($f, $spec, $kind, $prolog, &$switch_labels = array())
18041817
switch ($kind) {
18051818
case ZEND_VM_KIND_CALL:
18061819
gen_null_handler($f, $kind);
1820+
out($f, "#if ZEND_VM_KIND == ZEND_VM_KIND_TAILCALL\n");
1821+
gen_interrupt_func($f, $kind, $spec);
1822+
out($f, "#endif\n");
18071823
break;
18081824
case ZEND_VM_KIND_TAILCALL:
18091825
gen_null_handler($f, $kind);
18101826
gen_halt_handler($f, $kind);
1827+
gen_interrupt_func($f, $kind, $spec);
18111828
break;
18121829
case ZEND_VM_KIND_SWITCH:
18131830
out($f,"default: ZEND_NULL_LABEL:\n");
@@ -1845,7 +1862,7 @@ function gen_executor_code($f, $spec, $kind, $prolog, &$switch_labels = array())
18451862
out($f, "#pragma push_macro(\"ZEND_VM_INTERRUPT\")\n");
18461863
out($f, "#undef ZEND_VM_INTERRUPT\n");
18471864
out($f, "#define ZEND_VM_CONTINUE(handler) return opline\n");
1848-
out($f, "#define ZEND_VM_INTERRUPT() return zend_interrupt_helper".($spec?"_SPEC":"")."(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)\n");
1865+
out($f, "#define ZEND_VM_INTERRUPT() return zend_interrupt(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)\n");
18491866
out($f, $delayed_helpers);
18501867
out($f, "#pragma pop_macro(\"ZEND_VM_INTERRUPT\")\n");
18511868
out($f, "#pragma pop_macro(\"ZEND_VM_CONTINUE\")\n");
@@ -1900,7 +1917,10 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
19001917
if ($kind == ZEND_VM_KIND_HYBRID || $kind == ZEND_VM_KIND_CALL) {
19011918
out($f,"#if ZEND_VM_KIND == ZEND_VM_KIND_HYBRID || ZEND_VM_KIND == ZEND_VM_KIND_TAILCALL\n\n");
19021919
out($f,"static zend_vm_opcode_handler_func_t const * zend_opcode_handler_funcs;\n");
1903-
out($f,"#endif\n");
1920+
out($f,"#endif\n\n");
1921+
out($f,"#if ZEND_VM_KIND == ZEND_VM_KIND_TAILCALL\n");
1922+
out($f,"static const zend_op call_interrupt_op;\n");
1923+
out($f,"#endif\n\n");
19041924
}
19051925
out($f,"#if (ZEND_VM_KIND != ZEND_VM_KIND_HYBRID && ZEND_VM_KIND != ZEND_VM_KIND_TAILCALL) || !ZEND_VM_SPEC\n");
19061926
out($f,"static zend_vm_opcode_handler_t zend_vm_get_opcode_handler(uint8_t opcode, const zend_op* op);\n");
@@ -2133,11 +2153,17 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
21332153
out($f,"# define ZEND_VM_TAIL_CALL(call) ZEND_MUSTTAIL return call\n");
21342154
out($f,"# define ZEND_VM_CONTINUE() ZEND_VM_TAIL_CALL(opline->handler(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU))\n");
21352155
out($f,"# define ZEND_VM_RETURN() opline = &call_halt_op; ZEND_VM_CONTINUE()\n");
2136-
out($f,"# define ZEND_VM_DISPATCH_TO_HELPER(call) return call\n");
2156+
out($f,"# define ZEND_VM_DISPATCH_TO_HELPER(call) \\\n");
2157+
out($f," do { \\\n");
2158+
out($f," opline = call; \\\n");
2159+
out($f," ZEND_VM_TAIL_CALL(opline->handler(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); \\\n");
2160+
out($f," } while (0)\n");
21372161
out($f,"# define ZEND_VM_DISPATCH_TO_LEAVE_HELPER(helper) opline = &call_leave_op; SAVE_OPLINE(); ZEND_VM_CONTINUE()\n");
2138-
out($f,"# define ZEND_VM_INTERRUPT() ZEND_VM_TAIL_CALL(zend_interrupt_helper".($spec?"_SPEC":"")."_TAILCALL(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU))\n");
2162+
out($f,"# define ZEND_VM_INTERRUPT() ZEND_VM_TAIL_CALL(zend_interrupt_TAILCALL(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU))\n");
21392163
out($f,"\n");
21402164
out($f,"static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV zend_interrupt_helper".($spec?"_SPEC":"")."_TAILCALL(ZEND_OPCODE_HANDLER_ARGS);\n");
2165+
out($f,"static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV zend_interrupt(ZEND_OPCODE_HANDLER_ARGS);\n");
2166+
out($f,"static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV zend_interrupt_TAILCALL(ZEND_OPCODE_HANDLER_ARGS);\n");
21412167
out($f,"static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_NULL_TAILCALL_HANDLER(ZEND_OPCODE_HANDLER_ARGS);\n");
21422168
out($f,"static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV ZEND_HALT_TAILCALL_HANDLER(ZEND_OPCODE_HANDLER_ARGS);\n");
21432169
out($f,"static zend_never_inline const zend_op *ZEND_OPCODE_HANDLER_CCONV zend_leave_helper_SPEC_TAILCALL(zend_execute_data *ex, const zend_op *opline);\n");
@@ -2148,6 +2174,9 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
21482174
out($f,"static const zend_op call_leave_op = {\n");
21492175
out($f," .handler = zend_leave_helper_SPEC_TAILCALL,\n");
21502176
out($f,"};\n");
2177+
out($f,"static const zend_op call_interrupt_op = {\n");
2178+
out($f," .handler = zend_interrupt_helper_SPEC_TAILCALL,\n");
2179+
out($f,"};\n");
21512180
out($f,"\n");
21522181

21532182
gen_executor_code($f, $spec, ZEND_VM_KIND_TAILCALL, $m[1]);

ext/opcache/jit/zend_jit_vm_helpers.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1073,7 +1073,7 @@ zend_jit_trace_stop ZEND_FASTCALL zend_jit_trace_execute(zend_execute_data *ex,
10731073
#else
10741074
opline = handler(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
10751075
# if ZEND_VM_KIND == ZEND_VM_KIND_TAILCALL
1076-
while (UNEXPECTED(zend_jit_interrupt_op && opline == zend_jit_interrupt_op)) {
1076+
while (UNEXPECTED(opline == zend_jit_interrupt_op)) {
10771077
opline = zend_vm_handle_interrupt(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
10781078
}
10791079
# endif

0 commit comments

Comments
 (0)