From: Dmitry Stogov Date: Wed, 6 May 2020 20:16:45 +0000 (+0300) Subject: Avoid Program Counter guard in side trace started from Fake Init Fcall guard. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9d869f24d4e316920f775e7abfdbc76a284a8d8e;p=php Avoid Program Counter guard in side trace started from Fake Init Fcall guard. --- diff --git a/ext/opcache/jit/zend_jit_trace.c b/ext/opcache/jit/zend_jit_trace.c index 614f9c0dff..224b66db0c 100644 --- a/ext/opcache/jit/zend_jit_trace.c +++ b/ext/opcache/jit/zend_jit_trace.c @@ -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++; diff --git a/ext/opcache/jit/zend_jit_x86.dasc b/ext/opcache/jit/zend_jit_x86.dasc index c1cd2a6a91..443b789788 100644 --- a/ext/opcache/jit/zend_jit_x86.dasc +++ b/ext/opcache/jit/zend_jit_x86.dasc @@ -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;