1
0
mirror of https://github.com/php/php-src.git synced 2026-04-18 05:21:02 +02:00

Avoid Program Counter guard in side trace started from Fake Init Fcall guard.

This commit is contained in:
Dmitry Stogov
2020-05-06 23:16:45 +03:00
parent 038502b92a
commit 9d869f24d4
2 changed files with 7 additions and 7 deletions

View 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++;

View 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;