]> granicus.if.org Git - php/commitdiff
JIT for INIT_NS_FCALL_BY_NAME
authorDmitry Stogov <dmitry@zend.com>
Fri, 20 Mar 2020 12:36:40 +0000 (15:36 +0300)
committerDmitry Stogov <dmitry@zend.com>
Fri, 20 Mar 2020 12:36:40 +0000 (15:36 +0300)
ext/opcache/jit/zend_jit.c
ext/opcache/jit/zend_jit_disasm_x86.c
ext/opcache/jit/zend_jit_helpers.c
ext/opcache/jit/zend_jit_trace.c
ext/opcache/jit/zend_jit_x86.dasc

index a664aa341adefaed25b33e8273c04eb1b33c44a3..70c60e7bff6d42832712890f42a9da37053df0ce 100644 (file)
@@ -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;
                                                }
index 3f036447912a8fd746227a1aaab3288ff0a61c55..2ff7b960fdfbea4ddd6c7bd9704910fc990d8714 100644 (file)
@@ -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);
index 34824d95285a0671cea3d16914271712321ecc36..21c325bf5b1140a38b4ad576a14fc1975291f558 100644 (file)
@@ -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);
index 39e9a7621b548e3e79ff7947ef2b4074c0791d6a..3115694f84a33425e2b0782a1277125111670227 100644 (file)
@@ -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)) {
index 388bf3f806c7dc9380418d438d7094006d7cc753..1ab349e17c2e7649ba0019c30b30fdb5f3d66f4a 100644 (file)
@@ -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