From: Dmitry Stogov Date: Tue, 29 Sep 2020 13:33:32 +0000 (+0300) Subject: Allow tracing JIT cooperate with function JIT. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b44cf9377464327d58756a6f76f316ba8df86198;p=php Allow tracing JIT cooperate with function JIT. --- 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; }