Skip to content

Commit 6e90810

Browse files
bwoebitest@test.test
authored andcommitted
Fixup remaining place in zend_jit_vm_helpers.c
And add basic test for opcache_jit_blacklist. Signed-off-by: Bob Weinand <[email protected]>
1 parent 498f6ae commit 6e90810

File tree

4 files changed

+37
-23
lines changed

4 files changed

+37
-23
lines changed

ext/opcache/jit/zend_jit_trace.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7658,16 +7658,18 @@ static void zend_jit_blacklist_root_trace(const zend_op *opline, size_t offset)
76587658

76597659
ZEND_EXT_API void zend_jit_blacklist_function(zend_op_array *op_array) {
76607660
zend_jit_op_array_trace_extension *jit_extension = (zend_jit_op_array_trace_extension *)ZEND_FUNC_INFO(op_array);
7661-
if (!jit_extension || !(jit_extension->func_info.flags & ZEND_JIT_ON_HOT_TRACE)) {
7661+
if (!jit_extension || !(jit_extension->func_info.flags & ZEND_FUNC_JIT_ON_HOT_TRACE)) {
76627662
return;
76637663
}
76647664

76657665
zend_shared_alloc_lock();
76667666
SHM_UNPROTECT();
7667+
zend_jit_unprotect();
76677668

76687669
zend_jit_stop_persistent_op_array(op_array);
76697670
jit_extension->func_info.flags &= ~ZEND_FUNC_JIT_ON_HOT_TRACE;
76707671

7672+
zend_jit_protect();
76717673
SHM_PROTECT();
76727674
zend_shared_alloc_unlock();
76737675
}

ext/opcache/jit/zend_jit_vm_helpers.c

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -524,9 +524,9 @@ static int zend_jit_trace_record_fake_init_call_ex(zend_execute_data *call, zend
524524
if (func->type == ZEND_USER_FUNCTION) {
525525
jit_extension =
526526
(zend_jit_op_array_trace_extension*)ZEND_FUNC_INFO(&func->op_array);
527-
if (UNEXPECTED(!jit_extension
528-
|| !(jit_extension->func_info.flags & ZEND_FUNC_JIT_ON_HOT_TRACE)
529-
|| (func->op_array.fn_flags & ZEND_ACC_FAKE_CLOSURE))) {
527+
if (UNEXPECTED(!jit_extension && (func->op_array.fn_flags & ZEND_ACC_CLOSURE))
528+
|| (jit_extension && !(jit_extension->func_info.flags & ZEND_FUNC_JIT_ON_HOT_TRACE))
529+
|| (func->op_array.fn_flags & ZEND_ACC_FAKE_CLOSURE)) {
530530
return -1;
531531
}
532532
if (func->op_array.fn_flags & ZEND_ACC_CLOSURE) {
@@ -1104,26 +1104,15 @@ zend_jit_trace_stop ZEND_FASTCALL zend_jit_trace_execute(zend_execute_data *ex,
11041104
if (func->type == ZEND_USER_FUNCTION) {
11051105
jit_extension =
11061106
(zend_jit_op_array_trace_extension*)ZEND_FUNC_INFO(&func->op_array);
1107+
if (UNEXPECTED(!jit_extension && (func->op_array.fn_flags & ZEND_ACC_CLOSURE))
1108+
|| (jit_extension && !(jit_extension->func_info.flags & ZEND_FUNC_JIT_ON_HOT_TRACE))
1109+
|| (func->op_array.fn_flags & ZEND_ACC_FAKE_CLOSURE)) {
1110+
stop = ZEND_JIT_TRACE_STOP_INTERPRETER;
1111+
break;
1112+
}
11071113
if (func->op_array.fn_flags & ZEND_ACC_CLOSURE) {
1108-
if (UNEXPECTED(!jit_extension
1109-
|| !(jit_extension->func_info.flags & ZEND_FUNC_JIT_ON_HOT_TRACE)
1110-
|| (func->op_array.fn_flags & ZEND_ACC_FAKE_CLOSURE))) {
1111-
stop = ZEND_JIT_TRACE_STOP_INTERPRETER;
1112-
break;
1113-
}
11141114
func = (zend_function*)jit_extension->op_array;
11151115
}
1116-
// First not-skipped op
1117-
zend_op *opline = func->op_array.opcodes;
1118-
if (!(func->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
1119-
while (opline->opcode == ZEND_RECV || opline->opcode == ZEND_RECV_INIT) {
1120-
opline++;
1121-
}
1122-
}
1123-
if (jit_extension && ZEND_OP_TRACE_INFO(opline, jit_extension->offset)->trace_flags & ZEND_JIT_TRACE_BLACKLISTED) {
1124-
stop = ZEND_JIT_TRACE_STOP_BLACK_LIST;
1125-
break;
1126-
}
11271116
}
11281117

11291118
#ifndef HAVE_GCC_GLOBAL_REGS
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
--TEST--
2+
Basic usage of opcache_jit_blacklist()
3+
--INI--
4+
opcache.enable=1
5+
opcache.enable_cli=1
6+
opcache.file_update_protection=0
7+
opcache.protect_memory=1
8+
opcache.jit=tracing
9+
--EXTENSIONS--
10+
opcache
11+
--FILE--
12+
<?php
13+
function foo() {
14+
$x = 1;
15+
$x += 0;
16+
++$x;
17+
var_dump($x);
18+
}
19+
opcache_jit_blacklist(foo(...));
20+
foo();
21+
?>
22+
--EXPECT--
23+
int(2)

ext/opcache/zend_accelerator_module.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -928,13 +928,13 @@ ZEND_FUNCTION(opcache_invalidate)
928928
/* {{{ Prevents JIT on function. Call it before the first invocation of the given function. */
929929
ZEND_FUNCTION(opcache_jit_blacklist)
930930
{
931-
zend_object *closure;
931+
zval *closure;
932932

933933
if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &closure, zend_ce_closure) == FAILURE) {
934934
RETURN_THROWS();
935935
}
936936

937-
const zend_function *func = zend_get_closure_method_def(closure);
937+
const zend_function *func = zend_get_closure_method_def(Z_OBJ_P(closure));
938938
if (ZEND_USER_CODE(func->type)) {
939939
zend_jit_blacklist_function((zend_op_array *)&func->op_array);
940940
}

0 commit comments

Comments
 (0)