]> granicus.if.org Git - php/commitdiff
Avoid Program Counter guard in side trace started from Fake Init Fcall guard.
authorDmitry Stogov <dmitry@zend.com>
Wed, 6 May 2020 20:16:45 +0000 (23:16 +0300)
committerDmitry Stogov <dmitry@zend.com>
Wed, 6 May 2020 20:16:45 +0000 (23:16 +0300)
ext/opcache/jit/zend_jit_trace.c
ext/opcache/jit/zend_jit_x86.dasc

index 614f9c0dfff15b7d82048d02ff0e4ae70b7668de..224b66db0c016d5bff0f8230c9b56b54b084b85b 100644 (file)
@@ -3569,7 +3569,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
                                                        goto jit_failure;
                                                }
                                                if ((p+1)->op == ZEND_JIT_TRACE_INIT_CALL) {
-                                                       if (!zend_jit_init_fcall_guard(&dasm_state, opline, (p+1)->func)) {
+                                                       if (!zend_jit_init_fcall_guard(&dasm_state, opline, (p+1)->func, opline+1)) {
                                                                goto jit_failure;
                                                        }
                                                }
@@ -3581,7 +3581,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
                                                if ((opline->op1_type != IS_CONST
                                                  || opline->op2_type != IS_CONST)
                                                 && (p+1)->op == ZEND_JIT_TRACE_INIT_CALL) {
-                                                       if (!zend_jit_init_fcall_guard(&dasm_state, opline, (p+1)->func)) {
+                                                       if (!zend_jit_init_fcall_guard(&dasm_state, opline, (p+1)->func, opline+1)) {
                                                                goto jit_failure;
                                                        }
                                                }
@@ -3592,7 +3592,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
                                                }
                                                if (opline->op2_type != IS_CONST
                                                 && (p+1)->op == ZEND_JIT_TRACE_INIT_CALL) {
-                                                       if (!zend_jit_init_fcall_guard(&dasm_state, opline, (p+1)->func)) {
+                                                       if (!zend_jit_init_fcall_guard(&dasm_state, opline, (p+1)->func, opline+1)) {
                                                                goto jit_failure;
                                                        }
                                                }
@@ -3603,7 +3603,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
                                                }
                                                if (opline->op1_type != IS_CONST
                                                 && (p+1)->op == ZEND_JIT_TRACE_INIT_CALL) {
-                                                       if (!zend_jit_init_fcall_guard(&dasm_state, opline, (p+1)->func)) {
+                                                       if (!zend_jit_init_fcall_guard(&dasm_state, opline, (p+1)->func, opline+1)) {
                                                                goto jit_failure;
                                                        }
                                                }
@@ -3952,7 +3952,7 @@ done:
                                                call_info = call_info->next_callee;
                                        }
                                }
-                               if (!skip_guard && !zend_jit_init_fcall_guard(&dasm_state, NULL, p->func)) {
+                               if (!skip_guard && !zend_jit_init_fcall_guard(&dasm_state, NULL, p->func, ((zend_jit_trace_start_rec*)trace_buffer)->opline)) {
                                        goto jit_failure;
                                }
                                frame->call_level++;
index c1cd2a6a914ccaca8e305d823ab3b9c9d62f66a2..443b78978805a278a17e60a4e85164cf3b58fa2c 100644 (file)
@@ -7725,7 +7725,7 @@ static int zend_jit_needs_call_chain(zend_call_info *call_info, uint32_t b, cons
        }
 }
 
-static int zend_jit_init_fcall_guard(dasm_State **Dst, const zend_op *opline, const zend_function *func)
+static int zend_jit_init_fcall_guard(dasm_State **Dst, const zend_op *opline, const zend_function *func, const zend_op *to_opline)
 {
        int32_t exit_point;
        const void *exit_addr;
@@ -7745,7 +7745,7 @@ static int zend_jit_init_fcall_guard(dasm_State **Dst, const zend_op *opline, co
                return 0;
        }
 
-       exit_point = zend_jit_trace_get_exit_point(opline, opline ? (opline+1) : NULL, NULL);
+       exit_point = zend_jit_trace_get_exit_point(opline, to_opline, NULL);
        exit_addr = zend_jit_trace_get_exit_addr(exit_point);
        if (!exit_addr) {
                return 0;