From: Dmitry Stogov Date: Fri, 20 Mar 2020 12:36:40 +0000 (+0300) Subject: JIT for INIT_NS_FCALL_BY_NAME X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=37154753818781c80b0a6279b47a4228dce83ef3;p=php JIT for INIT_NS_FCALL_BY_NAME --- diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c index a664aa341a..70c60e7bff 100644 --- a/ext/opcache/jit/zend_jit.c +++ b/ext/opcache/jit/zend_jit.c @@ -2437,6 +2437,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op goto done; case ZEND_INIT_FCALL: case ZEND_INIT_FCALL_BY_NAME: + case ZEND_INIT_NS_FCALL_BY_NAME: if (!zend_jit_init_fcall(&dasm_state, opline, b, op_array, ssa, call_level, NULL)) { goto jit_failure; } diff --git a/ext/opcache/jit/zend_jit_disasm_x86.c b/ext/opcache/jit/zend_jit_disasm_x86.c index 3f03644791..2ff7b960fd 100644 --- a/ext/opcache/jit/zend_jit_disasm_x86.c +++ b/ext/opcache/jit/zend_jit_disasm_x86.c @@ -397,6 +397,7 @@ static int zend_jit_disasm_init(void) REGISTER_HELPER(memcmp); REGISTER_HELPER(zend_jit_init_func_run_time_cache_helper); REGISTER_HELPER(zend_jit_find_func_helper); + REGISTER_HELPER(zend_jit_find_ns_func_helper); REGISTER_HELPER(zend_jit_extend_stack_helper); REGISTER_HELPER(zend_jit_int_extend_stack_helper); REGISTER_HELPER(zend_jit_leave_nested_func_helper); diff --git a/ext/opcache/jit/zend_jit_helpers.c b/ext/opcache/jit/zend_jit_helpers.c index 34824d9528..21c325bf5b 100644 --- a/ext/opcache/jit/zend_jit_helpers.c +++ b/ext/opcache/jit/zend_jit_helpers.c @@ -66,6 +66,24 @@ static zend_function* ZEND_FASTCALL zend_jit_find_func_helper(zend_string *name) return fbc; } +static zend_function* ZEND_FASTCALL zend_jit_find_ns_func_helper(zval *func_name) +{ + zval *func = zend_hash_find_ex(EG(function_table), Z_STR_P(func_name + 1), 1); + zend_function *fbc; + + if (func == NULL) { + func = zend_hash_find_ex(EG(function_table), Z_STR_P(func_name + 2), 1); + if (UNEXPECTED(func == NULL)) { + return NULL; + } + } + fbc = Z_FUNC_P(func); + 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); + } + return fbc; +} + static zend_execute_data* ZEND_FASTCALL zend_jit_extend_stack_helper(uint32_t used_stack, zend_function *fbc) { zend_execute_data *call = (zend_execute_data*)zend_vm_stack_extend(used_stack); diff --git a/ext/opcache/jit/zend_jit_trace.c b/ext/opcache/jit/zend_jit_trace.c index 39e9a7621b..3115694f84 100644 --- a/ext/opcache/jit/zend_jit_trace.c +++ b/ext/opcache/jit/zend_jit_trace.c @@ -2171,6 +2171,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par goto done; case ZEND_INIT_FCALL: case ZEND_INIT_FCALL_BY_NAME: + case ZEND_INIT_NS_FCALL_BY_NAME: if (!zend_jit_init_fcall(&dasm_state, opline, op_array_ssa->cfg.map ? op_array_ssa->cfg.map[opline - op_array->opcodes] : -1, op_array, op_array_ssa, call_level, p + 1)) { goto jit_failure; } @@ -2660,8 +2661,6 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par } goto done; #endif -// case ZEND_INIT_NS_FCALL_BY_NAME: - // TODO: we may need a guard after INIT_NS_FCALL??? case ZEND_INIT_METHOD_CALL: case ZEND_INIT_DYNAMIC_CALL: if (!zend_jit_trace_handler(&dasm_state, op_array, opline, zend_may_throw(opline, ssa_op, op_array, ssa), p + 1)) { diff --git a/ext/opcache/jit/zend_jit_x86.dasc b/ext/opcache/jit/zend_jit_x86.dasc index 388bf3f806..1ab349e17c 100644 --- a/ext/opcache/jit/zend_jit_x86.dasc +++ b/ext/opcache/jit/zend_jit_x86.dasc @@ -7740,8 +7740,7 @@ static int zend_jit_init_fcall(dasm_State **Dst, const zend_op *opline, uint32_t if (!func && trace - && trace->op == ZEND_JIT_TRACE_INIT_CALL - && (opline->opcode == ZEND_INIT_FCALL || opline->opcode == ZEND_INIT_FCALL_BY_NAME)) { + && trace->op == ZEND_JIT_TRACE_INIT_CALL) { /* TODO: add guard ??? */ func = (zend_function*)trace->func; } @@ -7774,12 +7773,16 @@ static int zend_jit_init_fcall(dasm_State **Dst, const zend_op *opline, uint32_t if (opline->opcode == ZEND_INIT_FCALL) { | LOAD_ADDR FCARG1a, Z_STR_P(zv); + | EXT_CALL zend_jit_find_func_helper, r0 } else if (opline->opcode == ZEND_INIT_FCALL_BY_NAME) { | LOAD_ADDR FCARG1a, Z_STR_P(zv + 1); + | EXT_CALL zend_jit_find_func_helper, r0 + } else if (opline->opcode == ZEND_INIT_NS_FCALL_BY_NAME) { + | LOAD_ADDR FCARG1a, zv; + | EXT_CALL zend_jit_find_ns_func_helper, r0 } else { ZEND_ASSERT(0); } - | EXT_CALL zend_jit_find_func_helper, r0 | // CACHE_PTR(opline->result.num, fbc); | mov r1, EX->run_time_cache | mov aword [r1 + opline->result.num], r0