mirror of
https://github.com/php/php-src.git
synced 2026-04-01 21:22:13 +02:00
JIT: Update run_time_cache slot in zend_jit_find_func helper
This commit is contained in:
@@ -8464,21 +8464,19 @@ static int zend_jit_init_fcall(dasm_State **Dst, const zend_op *opline, uint32_t
|
|||||||
|
|
||||||
if (opline->opcode == ZEND_INIT_FCALL) {
|
if (opline->opcode == ZEND_INIT_FCALL) {
|
||||||
| LOAD_ADDR FCARG1x, Z_STR_P(zv);
|
| LOAD_ADDR FCARG1x, Z_STR_P(zv);
|
||||||
|
| add FCARG2x, REG2, #opline->result.num
|
||||||
| EXT_CALL zend_jit_find_func_helper, REG0
|
| EXT_CALL zend_jit_find_func_helper, REG0
|
||||||
} else if (opline->opcode == ZEND_INIT_FCALL_BY_NAME) {
|
} else if (opline->opcode == ZEND_INIT_FCALL_BY_NAME) {
|
||||||
| LOAD_ADDR FCARG1x, Z_STR_P(zv + 1);
|
| LOAD_ADDR FCARG1x, Z_STR_P(zv + 1);
|
||||||
|
| add FCARG2x, REG2, #opline->result.num
|
||||||
| EXT_CALL zend_jit_find_func_helper, REG0
|
| EXT_CALL zend_jit_find_func_helper, REG0
|
||||||
} else if (opline->opcode == ZEND_INIT_NS_FCALL_BY_NAME) {
|
} else if (opline->opcode == ZEND_INIT_NS_FCALL_BY_NAME) {
|
||||||
| LOAD_ADDR FCARG1x, zv;
|
| LOAD_ADDR FCARG1x, zv;
|
||||||
|
| add FCARG2x, REG2, #opline->result.num
|
||||||
| EXT_CALL zend_jit_find_ns_func_helper, REG0
|
| EXT_CALL zend_jit_find_ns_func_helper, REG0
|
||||||
} else {
|
} else {
|
||||||
ZEND_UNREACHABLE();
|
ZEND_UNREACHABLE();
|
||||||
}
|
}
|
||||||
| // CACHE_PTR(opline->result.num, fbc);
|
|
||||||
| ldr REG1, EX->run_time_cache
|
|
||||||
| // Get the return value of function zend_jit_find_func_helper/zend_jit_find_ns_func_helper
|
|
||||||
| mov REG0, RETVALx
|
|
||||||
| str REG0, [REG1, #opline->result.num]
|
|
||||||
if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) {
|
if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) {
|
||||||
int32_t exit_point = zend_jit_trace_get_exit_point(opline, 0);
|
int32_t exit_point = zend_jit_trace_get_exit_point(opline, 0);
|
||||||
const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
|
const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ static zend_never_inline zend_op_array* ZEND_FASTCALL zend_jit_init_func_run_tim
|
|||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
static zend_function* ZEND_FASTCALL zend_jit_find_func_helper(zend_string *name)
|
static zend_function* ZEND_FASTCALL zend_jit_find_func_helper(zend_string *name, void **cache_slot)
|
||||||
{
|
{
|
||||||
zval *func = zend_hash_find_known_hash(EG(function_table), name);
|
zval *func = zend_hash_find_known_hash(EG(function_table), name);
|
||||||
zend_function *fbc;
|
zend_function *fbc;
|
||||||
@@ -73,10 +73,11 @@ static zend_function* ZEND_FASTCALL zend_jit_find_func_helper(zend_string *name)
|
|||||||
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
|
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
|
||||||
fbc = _zend_jit_init_func_run_time_cache(&fbc->op_array);
|
fbc = _zend_jit_init_func_run_time_cache(&fbc->op_array);
|
||||||
}
|
}
|
||||||
|
*cache_slot = fbc;
|
||||||
return fbc;
|
return fbc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static zend_function* ZEND_FASTCALL zend_jit_find_ns_func_helper(zval *func_name)
|
static zend_function* ZEND_FASTCALL zend_jit_find_ns_func_helper(zval *func_name, void **cache_slot)
|
||||||
{
|
{
|
||||||
zval *func = zend_hash_find_known_hash(EG(function_table), Z_STR_P(func_name + 1));
|
zval *func = zend_hash_find_known_hash(EG(function_table), Z_STR_P(func_name + 1));
|
||||||
zend_function *fbc;
|
zend_function *fbc;
|
||||||
@@ -91,6 +92,7 @@ static zend_function* ZEND_FASTCALL zend_jit_find_ns_func_helper(zval *func_name
|
|||||||
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
|
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
|
||||||
fbc = _zend_jit_init_func_run_time_cache(&fbc->op_array);
|
fbc = _zend_jit_init_func_run_time_cache(&fbc->op_array);
|
||||||
}
|
}
|
||||||
|
*cache_slot = fbc;
|
||||||
return fbc;
|
return fbc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9030,19 +9030,19 @@ static int zend_jit_init_fcall(dasm_State **Dst, const zend_op *opline, uint32_t
|
|||||||
|
|
||||||
if (opline->opcode == ZEND_INIT_FCALL) {
|
if (opline->opcode == ZEND_INIT_FCALL) {
|
||||||
| LOAD_ADDR FCARG1a, Z_STR_P(zv);
|
| LOAD_ADDR FCARG1a, Z_STR_P(zv);
|
||||||
|
| lea FCARG2a, aword [r2 + opline->result.num]
|
||||||
| EXT_CALL zend_jit_find_func_helper, r0
|
| EXT_CALL zend_jit_find_func_helper, r0
|
||||||
} else if (opline->opcode == ZEND_INIT_FCALL_BY_NAME) {
|
} else if (opline->opcode == ZEND_INIT_FCALL_BY_NAME) {
|
||||||
| LOAD_ADDR FCARG1a, Z_STR_P(zv + 1);
|
| LOAD_ADDR FCARG1a, Z_STR_P(zv + 1);
|
||||||
|
| lea FCARG2a, aword [r2 + opline->result.num]
|
||||||
| EXT_CALL zend_jit_find_func_helper, r0
|
| EXT_CALL zend_jit_find_func_helper, r0
|
||||||
} else if (opline->opcode == ZEND_INIT_NS_FCALL_BY_NAME) {
|
} else if (opline->opcode == ZEND_INIT_NS_FCALL_BY_NAME) {
|
||||||
| LOAD_ADDR FCARG1a, zv;
|
| LOAD_ADDR FCARG1a, zv;
|
||||||
|
| lea FCARG2a, aword [r2 + opline->result.num]
|
||||||
| EXT_CALL zend_jit_find_ns_func_helper, r0
|
| EXT_CALL zend_jit_find_ns_func_helper, r0
|
||||||
} else {
|
} else {
|
||||||
ZEND_UNREACHABLE();
|
ZEND_UNREACHABLE();
|
||||||
}
|
}
|
||||||
| // CACHE_PTR(opline->result.num, fbc);
|
|
||||||
| mov r1, EX->run_time_cache
|
|
||||||
| mov aword [r1 + opline->result.num], r0
|
|
||||||
if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) {
|
if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) {
|
||||||
int32_t exit_point = zend_jit_trace_get_exit_point(opline, 0);
|
int32_t exit_point = zend_jit_trace_get_exit_point(opline, 0);
|
||||||
const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
|
const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
|
||||||
|
|||||||
Reference in New Issue
Block a user