]> granicus.if.org Git - php/commitdiff
Added missing deoptimization code for trampoline handling
authorDmitry Stogov <dmitry@zend.com>
Thu, 19 Nov 2020 09:32:36 +0000 (12:32 +0300)
committerDmitry Stogov <dmitry@zend.com>
Thu, 19 Nov 2020 09:32:36 +0000 (12:32 +0300)
ext/opcache/jit/zend_jit_disasm_x86.c
ext/opcache/jit/zend_jit_helpers.c
ext/opcache/jit/zend_jit_trace.c
ext/opcache/jit/zend_jit_x86.dasc

index afd830e89f1aabd4f052736e570dcfd6bb1143fe..11335918cbac5436c52f2579bd5a73ab51cee455 100644 (file)
@@ -494,6 +494,7 @@ static int zend_jit_disasm_init(void)
 #if (PHP_VERSION_ID <= 80000) && (SIZEOF_SIZE_T == 4)
        REGISTER_HELPER(zval_jit_update_constant_ex);
 #endif
+       REGISTER_HELPER(zend_jit_free_trampoline_helper);
 #undef  REGISTER_HELPER
 
 #ifndef _WIN32
index 5d5a30541b7c0e3b40c4243fa97a6d8fcad1e7a8..7c164cd23ba8c6f8e18b1d6bd20fdc6c6a82068a 100644 (file)
@@ -2666,4 +2666,11 @@ static zend_result ZEND_FASTCALL zval_jit_update_constant_ex(zval *p, zend_class
        }
        return SUCCESS;
 }
-#endif
\ No newline at end of file
+#endif
+
+static void ZEND_FASTCALL zend_jit_free_trampoline_helper(zend_function *func)
+{
+       ZEND_ASSERT(func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE);
+       zend_string_release_ex(func->common.function_name, 0);
+       zend_free_trampoline(func);
+}
index b74ccaad31f37aeeea182402ac48719d237ee52d..f08791a8d15358157089278c711cd81f496036bd 100644 (file)
@@ -3289,6 +3289,12 @@ static int zend_jit_trace_deoptimization(dasm_State             **Dst,
                }
        }
 
+       if ((flags & ZEND_JIT_EXIT_METHOD_CALL) && !polymorphic_side_trace) {
+               if (!zend_jit_free_trampoline(Dst)) {
+                       return 0;
+               }
+       }
+
        return 1;
 }
 
index 9187e3d7f0d13ddf205f1047245fa680f3190a5a..1a590313c7a2dbc54a1e5ed83a1a3bb24f03bbb4 100644 (file)
@@ -3930,6 +3930,17 @@ static int zend_jit_store_const(dasm_State **Dst, int var, zend_reg reg)
        return 1;
 }
 
+static int zend_jit_free_trampoline(dasm_State **Dst)
+{
+       |       /// if (UNEXPECTED(func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE))
+       |       test dword [r0 + offsetof(zend_function, common.fn_flags)], ZEND_ACC_CALL_VIA_TRAMPOLINE
+       |       jz >1
+       |       mov FCARG1a, r0
+       |       EXT_CALL zend_jit_free_trampoline_helper, r0
+       |1:
+       return 1;
+}
+
 static int zend_jit_inc_dec(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, zend_jit_addr op1_addr, uint32_t op1_def_info, zend_jit_addr op1_def_addr, uint32_t res_use_info, uint32_t res_info, zend_jit_addr res_addr, int may_overflow, int may_throw)
 {
        if (op1_info & ((MAY_BE_UNDEF|MAY_BE_ANY)-MAY_BE_LONG)) {