]> granicus.if.org Git - php/commitdiff
Keep trace number in EG(jit_trace_num) instead of EG(reserved)[zend_func_info_rid]
authorDmitry Stogov <dmitry@zend.com>
Mon, 25 May 2020 14:05:26 +0000 (17:05 +0300)
committerDmitry Stogov <dmitry@zend.com>
Mon, 25 May 2020 14:05:26 +0000 (17:05 +0300)
Zend/zend_execute_API.c
Zend/zend_globals.h
ext/opcache/jit/zend_jit_disasm_x86.c
ext/opcache/jit/zend_jit_trace.c
ext/opcache/jit/zend_jit_x86.dasc

index 6986841db259987631a7893503bbc38832ad1634..1b48bed125f83aad0782653332987b381da29954 100644 (file)
@@ -794,9 +794,11 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache) /
        if (func->type == ZEND_USER_FUNCTION) {
                int call_via_handler = (func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE) != 0;
                const zend_op *current_opline_before_exception = EG(opline_before_exception);
+               uint32_t orig_jit_trace_num = EG(jit_trace_num);
 
                zend_init_func_execute_data(call, &func->op_array, fci->retval);
                zend_execute_ex(call);
+               EG(jit_trace_num) = orig_jit_trace_num;
                EG(opline_before_exception) = current_opline_before_exception;
                if (call_via_handler) {
                        /* We must re-initialize function again */
index 298c22fe616515cc9f4385f3da64f549564f49d1..1d64d001f646f7e0ba4564eee292d3cb0f58e6da 100644 (file)
@@ -164,6 +164,8 @@ struct _zend_executor_globals {
        struct _zend_execute_data *current_execute_data;
        zend_class_entry *fake_scope; /* used to avoid checks accessing properties */
 
+       uint32_t jit_trace_num; /* Used by tracing JIT to reference the currently running trace */
+
        zend_long precision;
 
        int ticks_count;
index 97937f5afc9cf34813a69c1c3b7e278fe2c5a684..f94bf1af3a20c1953514430d12d69bb0598147a0 100644 (file)
@@ -385,6 +385,7 @@ static int zend_jit_disasm_init(void)
        REGISTER_EG(vm_stack_top);
        REGISTER_EG(vm_stack_end);
        REGISTER_EG(symbol_table);
+       REGISTER_EG(jit_trace_num);
 #undef  REGISTER_EG
 #endif
 
index d438b09bc1f597fa891bb93a207c0d8057d68c46..7279e52086520ce21d331e9e4e3c6ec666a7c9bc 100644 (file)
@@ -4994,7 +4994,7 @@ blacklist:
 
 int ZEND_FASTCALL zend_jit_trace_exit(uint32_t exit_num, zend_jit_registers_buf *regs)
 {
-       uint32_t trace_num = (uint32_t)(uintptr_t)EG(reserved)[zend_func_info_rid];
+       uint32_t trace_num = EG(jit_trace_num);
        zend_execute_data *execute_data = EG(current_execute_data);
        const zend_op *orig_opline = EX(opline);
        const zend_op *opline;
index 0d0ec990b1b5c84709b9ec69512a9bbf00a8636f..867ffbd74b2cbfeec6d57912843cb079646a5a18 100644 (file)
@@ -2853,8 +2853,8 @@ static int zend_jit_trace_begin(dasm_State **Dst, uint32_t trace_num)
 {
        current_trace_num = trace_num;
 
-       |       //EG(reserved)[zend_func_info_rid] = trace_num;
-       |       MEM_OP2_1_ZTS mov, aword, executor_globals, reserved[zend_func_info_rid], trace_num, r0
+       |       // EG(jit_trace_num) = trace_num;
+       |       MEM_OP2_1_ZTS mov, dword, executor_globals, jit_trace_num, trace_num, r0
 
        return 1;
 }
@@ -8588,17 +8588,6 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend
                        |       call aword [r0 + offsetof(zend_internal_function, handler)]
                }
 
-               if (trace) {
-                       // TODO: This is a quick dirty fix ??????
-                       //
-                       // Internal function may call another trace that,
-                       // replaces EG(trace_id) and the following side exit
-                       // from this trace is going to be mad !!!!!!
-                       //
-                       // Lets set EG(trace_id) once again...
-                       zend_jit_trace_begin(Dst, current_trace_num);
-               }
-
                |       // EG(current_execute_data) = execute_data;
                |       MEM_OP2_1_ZTS mov, aword, executor_globals, current_execute_data, FP, r0