summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2020-05-19 11:10:19 +0200
committerNikita Popov <nikita.ppv@gmail.com>2020-05-19 11:15:54 +0200
commit33b5c026aa0b3f4a88a1be599463138cb79ebb5d (patch)
tree3c5694a98bb6ee30a0ed2c06cc80ad8029ea00da
parentd377467d86ec74fc0311989fef5c674d1d5b1ea4 (diff)
downloadphp-git-33b5c026aa0b3f4a88a1be599463138cb79ebb5d.tar.gz
Extract zend_foreach_op_array()
Move this functionality from zend_call_graph into zend_optimizer, because we use this pattern in a number of places.
-rw-r--r--ext/opcache/Optimizer/zend_call_graph.c55
-rw-r--r--ext/opcache/Optimizer/zend_optimizer.c97
-rw-r--r--ext/opcache/Optimizer/zend_optimizer_internal.h3
3 files changed, 52 insertions, 103 deletions
diff --git a/ext/opcache/Optimizer/zend_call_graph.c b/ext/opcache/Optimizer/zend_call_graph.c
index 3b79bc445d..5087527f66 100644
--- a/ext/opcache/Optimizer/zend_call_graph.c
+++ b/ext/opcache/Optimizer/zend_call_graph.c
@@ -27,18 +27,15 @@
#include "zend_inference.h"
#include "zend_call_graph.h"
-typedef int (*zend_op_array_func_t)(zend_call_graph *call_graph, zend_op_array *op_array);
-
-static int zend_op_array_calc(zend_call_graph *call_graph, zend_op_array *op_array)
+static void zend_op_array_calc(zend_op_array *op_array, void *context)
{
- (void) op_array;
-
+ zend_call_graph *call_graph = context;
call_graph->op_arrays_count++;
- return SUCCESS;
}
-static int zend_op_array_collect(zend_call_graph *call_graph, zend_op_array *op_array)
+static void zend_op_array_collect(zend_op_array *op_array, void *context)
{
+ zend_call_graph *call_graph = context;
zend_func_info *func_info = call_graph->func_infos + call_graph->op_arrays_count;
ZEND_SET_FUNC_INFO(op_array, func_info);
@@ -47,41 +44,6 @@ static int zend_op_array_collect(zend_call_graph *call_graph, zend_op_array *op_
func_info->num_args = -1;
func_info->return_value_used = -1;
call_graph->op_arrays_count++;
- return SUCCESS;
-}
-
-static int zend_foreach_op_array(zend_call_graph *call_graph, zend_script *script, zend_op_array_func_t func)
-{
- zend_class_entry *ce;
- zend_string *key;
- zend_op_array *op_array;
-
- if (func(call_graph, &script->main_op_array) != SUCCESS) {
- return FAILURE;
- }
-
- ZEND_HASH_FOREACH_PTR(&script->function_table, op_array) {
- if (func(call_graph, op_array) != SUCCESS) {
- return FAILURE;
- }
- } ZEND_HASH_FOREACH_END();
-
- ZEND_HASH_FOREACH_STR_KEY_PTR(&script->class_table, key, ce) {
- if (ce->refcount > 1 && !zend_string_equals_ci(key, ce->name)) {
- continue;
- }
- ZEND_HASH_FOREACH_PTR(&ce->function_table, op_array) {
- if (op_array->scope == ce
- && op_array->type == ZEND_USER_FUNCTION
- && !(op_array->fn_flags & ZEND_ACC_TRAIT_CLONE)) {
- if (func(call_graph, op_array) != SUCCESS) {
- return FAILURE;
- }
- }
- } ZEND_HASH_FOREACH_END();
- } ZEND_HASH_FOREACH_END();
-
- return SUCCESS;
}
int zend_analyze_calls(zend_arena **arena, zend_script *script, uint32_t build_flags, zend_op_array *op_array, zend_func_info *func_info)
@@ -259,15 +221,12 @@ static void zend_sort_op_arrays(zend_call_graph *call_graph)
int zend_build_call_graph(zend_arena **arena, zend_script *script, zend_call_graph *call_graph) /* {{{ */
{
call_graph->op_arrays_count = 0;
- if (zend_foreach_op_array(call_graph, script, zend_op_array_calc) != SUCCESS) {
- return FAILURE;
- }
+ zend_foreach_op_array(script, zend_op_array_calc, call_graph);
+
call_graph->op_arrays = (zend_op_array**)zend_arena_calloc(arena, call_graph->op_arrays_count, sizeof(zend_op_array*));
call_graph->func_infos = (zend_func_info*)zend_arena_calloc(arena, call_graph->op_arrays_count, sizeof(zend_func_info));
call_graph->op_arrays_count = 0;
- if (zend_foreach_op_array(call_graph, script, zend_op_array_collect) != SUCCESS) {
- return FAILURE;
- }
+ zend_foreach_op_array(script, zend_op_array_collect, call_graph);
return SUCCESS;
}
diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c
index 061f79d1b3..2e75ae1fd3 100644
--- a/ext/opcache/Optimizer/zend_optimizer.c
+++ b/ext/opcache/Optimizer/zend_optimizer.c
@@ -1333,6 +1333,44 @@ static zend_bool needs_live_range(zend_op_array *op_array, zend_op *def_opline)
return 1;
}
+void zend_foreach_op_array(zend_script *script, zend_op_array_func_t func, void *context)
+{
+ zend_class_entry *ce;
+ zend_string *key;
+ zend_op_array *op_array;
+
+ func(&script->main_op_array, context);
+
+ ZEND_HASH_FOREACH_PTR(&script->function_table, op_array) {
+ func(op_array, context);
+ } ZEND_HASH_FOREACH_END();
+
+ ZEND_HASH_FOREACH_STR_KEY_PTR(&script->class_table, key, ce) {
+ if (ce->refcount > 1 && !zend_string_equals_ci(key, ce->name)) {
+ continue;
+ }
+ ZEND_HASH_FOREACH_PTR(&ce->function_table, op_array) {
+ if (op_array->scope == ce
+ && op_array->type == ZEND_USER_FUNCTION
+ && !(op_array->fn_flags & ZEND_ACC_TRAIT_CLONE)) {
+ func(op_array, context);
+ }
+ } ZEND_HASH_FOREACH_END();
+ } ZEND_HASH_FOREACH_END();
+}
+
+static void step_optimize_op_array(zend_op_array *op_array, void *context) {
+ zend_optimize_op_array(op_array, (zend_optimizer_ctx *) context);
+}
+
+static void step_adjust_fcall_stack_size(zend_op_array *op_array, void *context) {
+ zend_adjust_fcall_stack_size(op_array, (zend_optimizer_ctx *) context);
+}
+
+static void step_dump_after_optimizer(zend_op_array *op_array, void *context) {
+ zend_dump_op_array(op_array, ZEND_DUMP_LIVE_RANGES, "after optimizer", NULL);
+}
+
int zend_optimize_script(zend_script *script, zend_long optimization_level, zend_long debug_level)
{
zend_class_entry *ce;
@@ -1441,44 +1479,10 @@ int zend_optimize_script(zend_script *script, zend_long optimization_level, zend
ZEND_SET_FUNC_INFO(call_graph.op_arrays[i], NULL);
}
} else {
- zend_optimize_op_array(&script->main_op_array, &ctx);
-
- ZEND_HASH_FOREACH_PTR(&script->function_table, op_array) {
- zend_optimize_op_array(op_array, &ctx);
- } ZEND_HASH_FOREACH_END();
-
- ZEND_HASH_FOREACH_STR_KEY_PTR(&script->class_table, key, ce) {
- if (ce->refcount > 1 && !zend_string_equals_ci(key, ce->name)) {
- continue;
- }
- ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->function_table, name, op_array) {
- if (op_array->scope == ce
- && op_array->type == ZEND_USER_FUNCTION
- && !(op_array->fn_flags & ZEND_ACC_TRAIT_CLONE)) {
- zend_optimize_op_array(op_array, &ctx);
- }
- } ZEND_HASH_FOREACH_END();
- } ZEND_HASH_FOREACH_END();
+ zend_foreach_op_array(script, step_optimize_op_array, &ctx);
if (ZEND_OPTIMIZER_PASS_12 & optimization_level) {
- zend_adjust_fcall_stack_size(&script->main_op_array, &ctx);
-
- ZEND_HASH_FOREACH_PTR(&script->function_table, op_array) {
- zend_adjust_fcall_stack_size(op_array, &ctx);
- } ZEND_HASH_FOREACH_END();
-
- ZEND_HASH_FOREACH_STR_KEY_PTR(&script->class_table, key, ce) {
- if (ce->refcount > 1 && !zend_string_equals_ci(key, ce->name)) {
- continue;
- }
- ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->function_table, name, op_array) {
- if (op_array->scope == ce
- && op_array->type == ZEND_USER_FUNCTION
- && !(op_array->fn_flags & ZEND_ACC_TRAIT_CLONE)) {
- zend_adjust_fcall_stack_size(op_array, &ctx);
- }
- } ZEND_HASH_FOREACH_END();
- } ZEND_HASH_FOREACH_END();
+ zend_foreach_op_array(script, step_adjust_fcall_stack_size, &ctx);
}
}
@@ -1507,25 +1511,8 @@ int zend_optimize_script(zend_script *script, zend_long optimization_level, zend
} ZEND_HASH_FOREACH_END();
if ((debug_level & ZEND_DUMP_AFTER_OPTIMIZER) &&
- (ZEND_OPTIMIZER_PASS_7 & optimization_level)) {
- zend_dump_op_array(&script->main_op_array,
- ZEND_DUMP_LIVE_RANGES, "after optimizer", NULL);
-
- ZEND_HASH_FOREACH_PTR(&script->function_table, op_array) {
- zend_dump_op_array(op_array,
- ZEND_DUMP_LIVE_RANGES, "after optimizer", NULL);
- } ZEND_HASH_FOREACH_END();
-
- ZEND_HASH_FOREACH_PTR(&script->class_table, ce) {
- ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->function_table, name, op_array) {
- if (op_array->scope == ce
- && op_array->type == ZEND_USER_FUNCTION
- && !(op_array->fn_flags & ZEND_ACC_TRAIT_CLONE)) {
- zend_dump_op_array(op_array,
- ZEND_DUMP_LIVE_RANGES, "after optimizer", NULL);
- }
- } ZEND_HASH_FOREACH_END();
- } ZEND_HASH_FOREACH_END();
+ (ZEND_OPTIMIZER_PASS_7 & optimization_level)) {
+ zend_foreach_op_array(script, step_dump_after_optimizer, NULL);
}
if (ctx.constants) {
diff --git a/ext/opcache/Optimizer/zend_optimizer_internal.h b/ext/opcache/Optimizer/zend_optimizer_internal.h
index a525b668bf..0c8c2fe4c7 100644
--- a/ext/opcache/Optimizer/zend_optimizer_internal.h
+++ b/ext/opcache/Optimizer/zend_optimizer_internal.h
@@ -117,4 +117,7 @@ int sccp_optimize_op_array(zend_optimizer_ctx *ctx, zend_op_array *op_arrya, zen
int dce_optimize_op_array(zend_op_array *op_array, zend_ssa *ssa, zend_bool reorder_dtor_effects);
int zend_ssa_escape_analysis(const zend_script *script, zend_op_array *op_array, zend_ssa *ssa);
+typedef void (*zend_op_array_func_t)(zend_op_array *, void *context);
+void zend_foreach_op_array(zend_script *script, zend_op_array_func_t func, void *context);
+
#endif