summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2020-09-18 11:02:51 +0200
committerNikita Popov <nikita.ppv@gmail.com>2020-09-18 11:03:08 +0200
commit34bb5ba2ea1db1e4b4bad991fdcf436c688dd54d (patch)
treea7eda678e4089680ef6ec5b329cb860edcbe8c07
parent9e94bcfdbc8e4b0be0273896b4ea8fb2efdc0833 (diff)
downloadphp-git-34bb5ba2ea1db1e4b4bad991fdcf436c688dd54d.tar.gz
Remove support for EXT_NOP
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.
-rw-r--r--UPGRADING.INTERNALS6
-rw-r--r--Zend/zend_compile.c5
-rw-r--r--Zend/zend_execute.c3
-rw-r--r--ext/opcache/Optimizer/compact_literals.c2
-rw-r--r--ext/opcache/Optimizer/dce.c1
-rw-r--r--ext/opcache/Optimizer/zend_cfg.c9
-rw-r--r--ext/opcache/jit/zend_jit.c18
-rw-r--r--ext/opcache/jit/zend_jit_trace.c11
-rw-r--r--ext/opcache/jit/zend_jit_x86.dasc3
-rw-r--r--sapi/phpdbg/phpdbg.c3
10 files changed, 14 insertions, 47 deletions
diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS
index 249cd553ba..1815a9c264 100644
--- a/UPGRADING.INTERNALS
+++ b/UPGRADING.INTERNALS
@@ -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
========================
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index 719e7aaffe..f42542c6b2 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -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;
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index 22afd49c2e..e2e5aa8391 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -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) {
diff --git a/ext/opcache/Optimizer/compact_literals.c b/ext/opcache/Optimizer/compact_literals.c
index 3feba98d03..0e1529d2bd 100644
--- a/ext/opcache/Optimizer/compact_literals.c
+++ b/ext/opcache/Optimizer/compact_literals.c
@@ -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++;
diff --git a/ext/opcache/Optimizer/dce.c b/ext/opcache/Optimizer/dce.c
index c2f7550e91..91c9665d1d 100644
--- a/ext/opcache/Optimizer/dce.c
+++ b/ext/opcache/Optimizer/dce.c
@@ -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:
diff --git a/ext/opcache/Optimizer/zend_cfg.c b/ext/opcache/Optimizer/zend_cfg.c
index f036950ffa..0560bcf2d5 100644
--- a/ext/opcache/Optimizer/zend_cfg.c
+++ b/ext/opcache/Optimizer/zend_cfg.c
@@ -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;
diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c
index 7c9704954a..3dad8e4f91 100644
--- a/ext/opcache/jit/zend_jit.c
+++ b/ext/opcache/jit/zend_jit.c
@@ -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++;
}
diff --git a/ext/opcache/jit/zend_jit_trace.c b/ext/opcache/jit/zend_jit_trace.c
index 65b6f17c95..4edb08e08f 100644
--- a/ext/opcache/jit/zend_jit_trace.c
+++ b/ext/opcache/jit/zend_jit_trace.c
@@ -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++;
}
diff --git a/ext/opcache/jit/zend_jit_x86.dasc b/ext/opcache/jit/zend_jit_x86.dasc
index befc6717d9..daff6fb641 100644
--- a/ext/opcache/jit/zend_jit_x86.dasc
+++ b/ext/opcache/jit/zend_jit_x86.dasc
@@ -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
}
diff --git a/sapi/phpdbg/phpdbg.c b/sapi/phpdbg/phpdbg.c
index 4629f94986..54d06a84c7 100644
--- a/sapi/phpdbg/phpdbg.c
+++ b/sapi/phpdbg/phpdbg.c
@@ -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
;
}