summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2020-09-29 16:33:32 +0300
committerDmitry Stogov <dmitry@zend.com>2020-09-29 16:33:32 +0300
commitb44cf9377464327d58756a6f76f316ba8df86198 (patch)
treec9518382deae9462003c998ee7a74871dc6e344a
parentf3c58a5ed6bbb22260d2d848cc2bfd36ed8b00e3 (diff)
downloadphp-git-b44cf9377464327d58756a6f76f316ba8df86198.tar.gz
Allow tracing JIT cooperate with function JIT.
-rw-r--r--ext/opcache/jit/zend_jit_trace.c12
-rw-r--r--ext/opcache/jit/zend_jit_vm_helpers.c13
2 files changed, 21 insertions, 4 deletions
diff --git a/ext/opcache/jit/zend_jit_trace.c b/ext/opcache/jit/zend_jit_trace.c
index 311e4c3e0a..caf162e44d 100644
--- a/ext/opcache/jit/zend_jit_trace.c
+++ b/ext/opcache/jit/zend_jit_trace.c
@@ -5788,6 +5788,7 @@ static zend_jit_trace_stop zend_jit_compile_root_trace(zend_jit_trace_rec *trace
{
zend_jit_trace_stop ret;
const void *handler;
+ uint8_t orig_trigger;
zend_jit_trace_info *t = NULL;
zend_jit_trace_exit_info exit_info[ZEND_JIT_TRACE_MAX_EXITS];
@@ -5818,8 +5819,13 @@ static zend_jit_trace_stop zend_jit_compile_root_trace(zend_jit_trace_rec *trace
t->exit_info = exit_info;
t->stack_map = NULL;
+ orig_trigger = JIT_G(trigger);
+ JIT_G(trigger) = ZEND_JIT_ON_HOT_TRACE;
+
handler = zend_jit_trace(trace_buffer, 0, 0);
+ JIT_G(trigger) = orig_trigger;
+
if (handler) {
zend_jit_trace_exit_info *shared_exit_info = NULL;
@@ -6407,6 +6413,7 @@ static zend_jit_trace_stop zend_jit_compile_side_trace(zend_jit_trace_rec *trace
{
zend_jit_trace_stop ret;
const void *handler;
+ uint8_t orig_trigger;
zend_jit_trace_info *t;
zend_jit_trace_exit_info exit_info[ZEND_JIT_TRACE_MAX_EXITS];
@@ -6439,8 +6446,13 @@ static zend_jit_trace_stop zend_jit_compile_side_trace(zend_jit_trace_rec *trace
t->exit_info = exit_info;
t->stack_map = NULL;
+ orig_trigger = JIT_G(trigger);
+ JIT_G(trigger) = ZEND_JIT_ON_HOT_TRACE;
+
handler = zend_jit_trace(trace_buffer, parent_num, exit_num);
+ JIT_G(trigger) = orig_trigger;
+
if (handler) {
zend_jit_trace_exit_info *shared_exit_info = NULL;
diff --git a/ext/opcache/jit/zend_jit_vm_helpers.c b/ext/opcache/jit/zend_jit_vm_helpers.c
index 5ca1fb25aa..f022b16e29 100644
--- a/ext/opcache/jit/zend_jit_vm_helpers.c
+++ b/ext/opcache/jit/zend_jit_vm_helpers.c
@@ -465,7 +465,9 @@ static int zend_jit_trace_record_fake_init_call_ex(zend_execute_data *call, zend
&& (func->op_array.fn_flags & ZEND_ACC_CLOSURE)) {
jit_extension =
(zend_jit_op_array_trace_extension*)ZEND_FUNC_INFO(&func->op_array);
- if (UNEXPECTED(!jit_extension || (func->op_array.fn_flags & ZEND_ACC_FAKE_CLOSURE))) {
+ if (UNEXPECTED(!jit_extension
+ || !(jit_extension->func_info.flags & ZEND_FUNC_JIT_ON_HOT_TRACE)
+ || (func->op_array.fn_flags & ZEND_ACC_FAKE_CLOSURE))) {
return -1;
}
func = (zend_function*)jit_extension->op_array;
@@ -765,8 +767,9 @@ zend_jit_trace_stop ZEND_FASTCALL zend_jit_trace_execute(zend_execute_data *ex,
op_array = &EX(func)->op_array;
jit_extension =
(zend_jit_op_array_trace_extension*)ZEND_FUNC_INFO(op_array);
- if (UNEXPECTED(!jit_extension)) {
- stop = ZEND_JIT_TRACE_STOP_BAD_FUNC;
+ if (UNEXPECTED(!jit_extension)
+ || UNEXPECTED(!(jit_extension->func_info.flags & ZEND_FUNC_JIT_ON_HOT_TRACE))) {
+ stop = ZEND_JIT_TRACE_STOP_INTERPRETER;
break;
}
offset = jit_extension->offset;
@@ -902,7 +905,9 @@ zend_jit_trace_stop ZEND_FASTCALL zend_jit_trace_execute(zend_execute_data *ex,
&& (func->op_array.fn_flags & ZEND_ACC_CLOSURE)) {
jit_extension =
(zend_jit_op_array_trace_extension*)ZEND_FUNC_INFO(&func->op_array);
- if (UNEXPECTED(!jit_extension) || (func->op_array.fn_flags & ZEND_ACC_FAKE_CLOSURE)) {
+ if (UNEXPECTED(!jit_extension)
+ || !(jit_extension->func_info.flags & ZEND_FUNC_JIT_ON_HOT_TRACE)
+ || (func->op_array.fn_flags & ZEND_ACC_FAKE_CLOSURE)) {
stop = ZEND_JIT_TRACE_STOP_INTERPRETER;
break;
}