]> granicus.if.org Git - php/commitdiff
Remove support for EXT_NOP
authorNikita Popov <nikita.ppv@gmail.com>
Fri, 18 Sep 2020 09:02:51 +0000 (11:02 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Fri, 18 Sep 2020 09:03:08 +0000 (11:03 +0200)
This is an annoying edge case that regularly gets broken. As we're
not aware of significant users of this API, and there are other
ways to hook this, remove support for EXT_NOP.

UPGRADING.INTERNALS
Zend/zend_compile.c
Zend/zend_execute.c
ext/opcache/Optimizer/compact_literals.c
ext/opcache/Optimizer/dce.c
ext/opcache/Optimizer/zend_cfg.c
ext/opcache/jit/zend_jit.c
ext/opcache/jit/zend_jit_trace.c
ext/opcache/jit/zend_jit_x86.dasc
sapi/phpdbg/phpdbg.c

index 249cd553bab5364ff3f5742fdbfe47c432da03cc..1815a9c264b21841209fa538f76d745c54df2d3d 100644 (file)
@@ -23,6 +23,8 @@ PHP 8.0 INTERNALS UPGRADE NOTES
   t. Signature changes
   u. Error Notification callbacks to replace zend_error_cb overwrite use-cases
   v. Removed Zend APIs
+  w. Renamed Zend APIs
+  x. ZEND_EXT_NOP no longer emitted
 
 2. Build system changes
   a. Abstract
@@ -395,6 +397,10 @@ PHP 8.0 INTERNALS UPGRADE NOTES
   w. The following APIs have been renamed:
      - _zend_ts_hash_init() to zend_ts_hash_init()
 
+  x. In COMPILE_EXTENDED_STMT mode, a ZEND_EXT_NOP opcode will no longer be
+     generated at the start of a function. Use the new observer APIs or hook
+     into zend_execute_ex instead.
+
 ========================
 2. Build system changes
 ========================
index 719e7aaffeff04fe628dc6f3ee8b6d8c7a2a6d57..f42542c6b2611ef589d41d0eb88f42b65b0b6784 100644 (file)
@@ -6936,11 +6936,6 @@ void zend_compile_func_decl(znode *result, zend_ast *ast, zend_bool toplevel) /*
 
        zend_oparray_context_begin(&orig_oparray_context);
 
-       if (CG(compiler_options) & ZEND_COMPILE_EXTENDED_STMT) {
-               zend_op *opline_ext = zend_emit_op(NULL, ZEND_EXT_NOP, NULL, NULL);
-               opline_ext->lineno = decl->start_lineno;
-       }
-
        {
                /* Push a separator to the loop variable stack */
                zend_loop_var dummy_var;
index 22afd49c2e0c7c849462230de670f4a256c1f9dd..e2e5aa83915d76b0dbb693e7fb5ebdea98caaa84 100644 (file)
@@ -4454,14 +4454,13 @@ ZEND_API zend_result ZEND_FASTCALL zend_handle_undef_args(zend_execute_data *cal
        if (fbc->type == ZEND_USER_FUNCTION) {
                zend_op_array *op_array = &fbc->op_array;
                uint32_t num_args = ZEND_CALL_NUM_ARGS(call);
-               uint32_t opline_offset = op_array->opcodes[0].opcode == ZEND_EXT_NOP;
                for (uint32_t i = 0; i < num_args; i++) {
                        zval *arg = ZEND_CALL_VAR_NUM(call, i);
                        if (!Z_ISUNDEF_P(arg)) {
                                continue;
                        }
 
-                       zend_op *opline = &op_array->opcodes[i + opline_offset];
+                       zend_op *opline = &op_array->opcodes[i];
                        if (EXPECTED(opline->opcode == ZEND_RECV_INIT)) {
                                zval *default_value = RT_CONSTANT(opline, opline->op2);
                                if (Z_OPT_TYPE_P(default_value) == IS_CONSTANT_AST) {
index 3feba98d033c6f368441a1d0b53d485a190ad85b..0e1529d2bd1953690730cc99c88838657829782a 100644 (file)
@@ -815,7 +815,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
                                                Z_CACHE_SLOT_P(val) = op_array->cache_size;
                                                op_array->cache_size += sizeof(zval);
                                        }
-                               } else if (opline->opcode != ZEND_RECV && opline->opcode != ZEND_EXT_NOP) {
+                               } else if (opline->opcode != ZEND_RECV) {
                                        break;
                                }
                                opline++;
index c2f7550e91c684b1f7785d664ba46ecba98aad89..91c9665d1daaea0996482f8a00f6935fd3291d58 100644 (file)
@@ -152,7 +152,6 @@ static inline zend_bool may_have_side_effects(
                case ZEND_EXT_STMT:
                case ZEND_EXT_FCALL_BEGIN:
                case ZEND_EXT_FCALL_END:
-               case ZEND_EXT_NOP:
                case ZEND_TICKS:
                case ZEND_YIELD:
                case ZEND_YIELD_FROM:
index f036950ffac4cb47d18af0d525f7504f0600882a..0560bcf2d5caa3a8248986ddc65e0f83c32ab5e8 100644 (file)
@@ -112,10 +112,6 @@ static void zend_mark_reachable_blocks(const zend_op_array *op_array, zend_cfg *
        zend_basic_block *blocks = cfg->blocks;
 
        blocks[start].flags = ZEND_BB_START;
-       if (op_array->opcodes[0].opcode == ZEND_EXT_NOP
-        && (cfg->flags & ZEND_CFG_RECV_ENTRY)) {
-               blocks[1].flags |= ZEND_BB_RECV_ENTRY;
-       }
        zend_mark_reachable(op_array->opcodes, cfg, blocks + start);
 
        if (op_array->last_try_catch) {
@@ -291,10 +287,6 @@ int zend_build_cfg(zend_arena **arena, const zend_op_array *op_array, uint32_t b
 
        /* Build CFG, Step 1: Find basic blocks starts, calculate number of blocks */
        BB_START(0);
-       if (op_array->opcodes[0].opcode == ZEND_EXT_NOP
-        && (build_flags & ZEND_CFG_RECV_ENTRY)) {
-               BB_START(1);
-       }
        for (i = 0; i < op_array->last; i++) {
                zend_op *opline = op_array->opcodes + i;
                switch (opline->opcode) {
@@ -434,7 +426,6 @@ int zend_build_cfg(zend_arena **arena, const zend_op_array *op_array, uint32_t b
                        case ZEND_FUNC_GET_ARGS:
                                flags |= ZEND_FUNC_VARARG;
                                break;
-                       case ZEND_EXT_NOP:
                        case ZEND_EXT_STMT:
                                flags |= ZEND_FUNC_HAS_EXTENDED_STMT;
                                break;
index 7c9704954a354d049f4e572c5dcb207e14c7bec5..3dad8e4f911151386936729d2fc1f332ec04bb24 100644 (file)
@@ -2118,8 +2118,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
                                        }
                                        recv_emitted = 1;
                                } else if (opline->opcode == ZEND_RECV) {
-                                       if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)
-                                        && op_array->opcodes[0].opcode != ZEND_EXT_NOP) {
+                                       if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
                                                /* skip */
                                                continue;
                                        } else if (recv_emitted) {
@@ -3540,9 +3539,6 @@ static void ZEND_FASTCALL zend_runtime_jit(void)
 
                /* restore original opcode handlers */
                if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
-                       if (opline->opcode == ZEND_EXT_NOP) {
-                               opline++;
-                       }
                        while (opline->opcode == ZEND_RECV || opline->opcode == ZEND_RECV_INIT) {
                                opline++;
                        }
@@ -3576,9 +3572,6 @@ void zend_jit_check_funcs(HashTable *function_table, zend_bool is_method) {
                op_array = &func->op_array;
                opline = op_array->opcodes;
                if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
-                       if (opline->opcode == ZEND_EXT_NOP) {
-                               opline++;
-                       }
                        while (opline->opcode == ZEND_RECV || opline->opcode == ZEND_RECV_INIT) {
                                opline++;
                        }
@@ -3651,9 +3644,6 @@ static int zend_jit_setup_hot_counters(zend_op_array *op_array)
 
        if (JIT_G(hot_func)) {
                if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
-                       if (opline->opcode == ZEND_EXT_NOP) {
-                               opline++;
-                       }
                        while (opline->opcode == ZEND_RECV || opline->opcode == ZEND_RECV_INIT) {
                                opline++;
                        }
@@ -3692,9 +3682,6 @@ ZEND_EXT_API int zend_jit_op_array(zend_op_array *op_array, zend_script *script)
                /* Set run-time JIT handler */
                ZEND_ASSERT(zend_jit_runtime_jit_handler != NULL);
                if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
-                       if (opline->opcode == ZEND_EXT_NOP) {
-                               opline++;
-                       }
                        while (opline->opcode == ZEND_RECV || opline->opcode == ZEND_RECV_INIT) {
                                opline++;
                        }
@@ -3714,9 +3701,6 @@ ZEND_EXT_API int zend_jit_op_array(zend_op_array *op_array, zend_script *script)
                ZEND_ASSERT(zend_jit_profile_jit_handler != NULL);
                if (op_array->function_name) {
                        if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
-                               if (opline->opcode == ZEND_EXT_NOP) {
-                                       opline++;
-                               }
                                while (opline->opcode == ZEND_RECV || opline->opcode == ZEND_RECV_INIT) {
                                        opline++;
                                }
index 65b6f17c95799d34c070055ac597f2ea9e749913..4edb08e08f9b034bdaec1dd78dadb0c668386669 100644 (file)
@@ -1743,8 +1743,7 @@ propagate_arg:
                                }
                        }
                        if (opline->opcode == ZEND_RECV_INIT
-                        && !(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)
-                        && op_array->opcodes[0].opcode != ZEND_EXT_NOP) {
+                        && !(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
                                /* RECV_INIT always copy the constant */
                                ssa_var_info[ssa_ops[idx].result_def].type = _const_op_type(RT_CONSTANT(opline, opline->op2));
                        } else if ((opline->opcode == ZEND_FE_FETCH_R || opline->opcode == ZEND_FE_FETCH_RW)
@@ -1806,8 +1805,7 @@ propagate_arg:
                                                }
                                        }
                                        if (opline->opcode == ZEND_RECV_INIT
-                                        && !(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)
-                                        && op_array->opcodes[0].opcode != ZEND_EXT_NOP) {
+                                        && !(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
                                                /* RECV_INIT always copy the constant */
                                                ssa_var_info[ssa_ops[idx].result_def].type = _const_op_type(RT_CONSTANT(opline, opline->op2));
                                        } else {
@@ -1887,7 +1885,6 @@ propagate_arg:
                                        ssa_var_info[v].type = MAY_BE_UNDEF | MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_REF | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF;
                                }
                                if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)
-                                && op_array->opcodes[0].opcode != ZEND_EXT_NOP
                                 && i < op_array->num_args) {
                                        /* Propagate argument type */
                                        ssa_var_info[v].type &= STACK_INFO(frame->stack, i);
@@ -5323,7 +5320,6 @@ done:
                                          || prev_opline->opcode == ZEND_CHECK_UNDEF_ARGS)
                                         && p->op_array->num_args
                                         && (p->op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS) == 0
-                                        && (p->op_array->opcodes[0].opcode != ZEND_EXT_NOP)
                                         && ((p+1)->op == ZEND_JIT_TRACE_VM
                                          || (p+1)->op == ZEND_JIT_TRACE_END)
                                         && TRACE_FRAME_NUM_ARGS(call) < p->op_array->num_args
@@ -6814,9 +6810,6 @@ static int zend_jit_setup_hot_trace_counters(zend_op_array *op_array)
                ZEND_ASSERT(zend_jit_func_trace_counter_handler != NULL);
                opline = op_array->opcodes;
                if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
-                       if (opline->opcode == ZEND_EXT_NOP) {
-                               opline++;
-                       }
                        while (opline->opcode == ZEND_RECV || opline->opcode == ZEND_RECV_INIT) {
                                opline++;
                        }
index befc6717d9d347c03fc8793a8849054352dd8dea..daff6fb641dff347d6999be79126150f3484b0b5 100644 (file)
@@ -12199,8 +12199,7 @@ static int zend_jit_recv_init(dasm_State **Dst, const zend_op *opline, const zen
        zend_jit_addr res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var);
 
        if (JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE ||
-           (op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS) ||
-           op_array->opcodes[0].opcode == ZEND_EXT_NOP) {
+           (op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
                |       cmp dword EX->This.u2.num_args, arg_num
                |       jae >5
        }
index 4629f94986fcf8f872312a1cd6e98c1ff6c78ee3..54d06a84c7703be81ea83d1611c05b77f1137624 100644 (file)
@@ -482,7 +482,8 @@ static zend_always_inline zend_bool phpdbg_is_ignored_opcode(zend_uchar opcode)
         || opcode == ZEND_DECLARE_CONST || opcode == ZEND_DECLARE_CLASS || opcode == ZEND_DECLARE_FUNCTION
         || opcode == ZEND_DECLARE_CLASS_DELAYED
         || opcode == ZEND_DECLARE_ANON_CLASS || opcode == ZEND_FAST_RET || opcode == ZEND_TICKS
-        || opcode == ZEND_EXT_STMT || opcode == ZEND_EXT_FCALL_BEGIN || opcode == ZEND_EXT_FCALL_END || opcode == ZEND_EXT_NOP || opcode == ZEND_BIND_GLOBAL
+        || opcode == ZEND_EXT_STMT || opcode == ZEND_EXT_FCALL_BEGIN || opcode == ZEND_EXT_FCALL_END
+        || opcode == ZEND_BIND_GLOBAL
        ;
 }