]> granicus.if.org Git - php/commitdiff
Allow tracing JIT cooperate with function JIT.
authorDmitry Stogov <dmitry@zend.com>
Tue, 29 Sep 2020 13:33:32 +0000 (16:33 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 29 Sep 2020 13:33:32 +0000 (16:33 +0300)
ext/opcache/jit/zend_jit_trace.c
ext/opcache/jit/zend_jit_vm_helpers.c

index 311e4c3e0a3ebe60f3a665f05972363d399d3474..caf162e44d48049813787ac6254e5da32c8aa817 100644 (file)
@@ -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;
 
index 5ca1fb25aa6180fe6b5c525e0cf0e35237bc053a..f022b16e298cd02dbe05f3a9ea8070248acb97d3 100644 (file)
@@ -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;
                                        }