com php-src: More accurate handling of global registers (allow VM with single global register): Zend/zend_execute.c Zend/zend_ vm_execute.h
Zend/zend_vm_gen.php
| From: | Dmitry Stogov | Date: | Tue, 12 Feb 2019 14:39:02 +0000 |
| Subject: | com php-src: More accurate handling of global registers (allow VM with single global register): Zend/zend_execute.c Zend/zend_ vm_execute.h Zend/zend_vm_gen.php |
||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-104602@lists.php.net to get a copy of this message | ||
Commit: 626bc3a2de517f4e0ae647324dd05ceacdfe776b
Author: Dmitry Stogov <dmitry@zend.com> Tue, 12 Feb 2019 17:39:02 +0300
Parents: c4b77e03b1f4444b492cc056d90edb02566f6fe2
Branches: PHP-7.4 master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=626bc3a2de517f4e0ae647324dd05ceacdfe776b
Log:
More accurate handling of global registers (allow VM with single global register)
Changed paths:
M Zend/zend_execute.c
M Zend/zend_vm_execute.h
M Zend/zend_vm_gen.php
Diff:
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index 840c18b..2c7a451 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -63,21 +63,28 @@
# pragma GCC diagnostic ignored "-Wvolatile-register-var"
register zend_execute_data* volatile execute_data __asm__(ZEND_VM_FP_GLOBAL_REG);
# pragma GCC diagnostic warning "-Wvolatile-register-var"
+#endif
+
+#ifdef ZEND_VM_FP_GLOBAL_REG
# define EXECUTE_DATA_D void
# define EXECUTE_DATA_C
# define EXECUTE_DATA_DC
# define EXECUTE_DATA_CC
# define NO_EXECUTE_DATA_CC
-# define OPLINE_D void
-# define OPLINE_C
-# define OPLINE_DC
-# define OPLINE_CC
#else
# define EXECUTE_DATA_D zend_execute_data* execute_data
# define EXECUTE_DATA_C execute_data
# define EXECUTE_DATA_DC , EXECUTE_DATA_D
# define EXECUTE_DATA_CC , EXECUTE_DATA_C
# define NO_EXECUTE_DATA_CC , NULL
+#endif
+
+#ifdef ZEND_VM_IP_GLOBAL_REG
+# define OPLINE_D void
+# define OPLINE_C
+# define OPLINE_DC
+# define OPLINE_CC
+#else
# define OPLINE_D const zend_op* opline
# define OPLINE_C opline
# define OPLINE_DC , OPLINE_D
@@ -3306,7 +3313,7 @@ static zend_never_inline void zend_copy_extra_args(EXECUTE_DATA_D)
if (EXPECTED((op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS) == 0)) {
/* Skip useless ZEND_RECV and ZEND_RECV_INIT opcodes */
-#if defined(ZEND_VM_FP_GLOBAL_REG) && ((ZEND_VM_KIND == ZEND_VM_KIND_CALL) || (ZEND_VM_KIND
== ZEND_VM_KIND_HYBRID))
+#if defined(ZEND_VM_IP_GLOBAL_REG) && ((ZEND_VM_KIND == ZEND_VM_KIND_CALL) || (ZEND_VM_KIND
== ZEND_VM_KIND_HYBRID))
opline += first_extra_arg;
#else
EX(opline) += first_extra_arg;
@@ -3358,7 +3365,7 @@ static zend_always_inline void i_init_func_execute_data(zend_op_array
*op_array,
uint32_t first_extra_arg, num_args;
ZEND_ASSERT(EX(func) == (zend_function*)op_array);
-#if defined(ZEND_VM_FP_GLOBAL_REG) && ((ZEND_VM_KIND == ZEND_VM_KIND_CALL) || (ZEND_VM_KIND
== ZEND_VM_KIND_HYBRID))
+#if defined(ZEND_VM_IP_GLOBAL_REG) && ((ZEND_VM_KIND == ZEND_VM_KIND_CALL) || (ZEND_VM_KIND
== ZEND_VM_KIND_HYBRID))
opline = op_array->opcodes;
#else
EX(opline) = op_array->opcodes;
@@ -3375,7 +3382,7 @@ static zend_always_inline void i_init_func_execute_data(zend_op_array
*op_array,
}
} else if (EXPECTED((op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS) == 0)) {
/* Skip useless ZEND_RECV and ZEND_RECV_INIT opcodes */
-#if defined(ZEND_VM_FP_GLOBAL_REG) && ((ZEND_VM_KIND == ZEND_VM_KIND_CALL) || (ZEND_VM_KIND
== ZEND_VM_KIND_HYBRID))
+#if defined(ZEND_VM_IP_GLOBAL_REG) && ((ZEND_VM_KIND == ZEND_VM_KIND_CALL) || (ZEND_VM_KIND
== ZEND_VM_KIND_HYBRID))
opline += num_args;
#else
EX(opline) += num_args;
@@ -3388,7 +3395,7 @@ static zend_always_inline void i_init_func_execute_data(zend_op_array
*op_array,
EX_LOAD_RUN_TIME_CACHE(op_array);
EG(current_execute_data) = execute_data;
-#if defined(ZEND_VM_FP_GLOBAL_REG) && ((ZEND_VM_KIND == ZEND_VM_KIND_CALL) || (ZEND_VM_KIND
== ZEND_VM_KIND_HYBRID))
+#if defined(ZEND_VM_IP_GLOBAL_REG) && ((ZEND_VM_KIND == ZEND_VM_KIND_CALL) || (ZEND_VM_KIND
== ZEND_VM_KIND_HYBRID))
EX(opline) = opline;
#endif
}
@@ -3471,7 +3478,11 @@ ZEND_API void zend_init_func_execute_data(zend_execute_data *ex,
zend_op_array *
{
#if defined(ZEND_VM_FP_GLOBAL_REG) && ((ZEND_VM_KIND == ZEND_VM_KIND_CALL) || (ZEND_VM_KIND
== ZEND_VM_KIND_HYBRID))
zend_execute_data *orig_execute_data = execute_data;
+#endif
+#if defined(ZEND_VM_IP_GLOBAL_REG) && ((ZEND_VM_KIND == ZEND_VM_KIND_CALL) || (ZEND_VM_KIND
== ZEND_VM_KIND_HYBRID))
const zend_op *orig_opline = opline;
+#endif
+#if defined(ZEND_VM_FP_GLOBAL_REG) && ((ZEND_VM_KIND == ZEND_VM_KIND_CALL) || (ZEND_VM_KIND
== ZEND_VM_KIND_HYBRID))
execute_data = ex;
#else
zend_execute_data *execute_data = ex;
@@ -3483,9 +3494,11 @@ ZEND_API void zend_init_func_execute_data(zend_execute_data *ex,
zend_op_array *
}
i_init_func_execute_data(op_array, return_value, 1 EXECUTE_DATA_CC);
-#if defined(ZEND_VM_FP_GLOBAL_REG) && ((ZEND_VM_KIND == ZEND_VM_KIND_CALL) || (ZEND_VM_KIND
== ZEND_VM_KIND_HYBRID))
+#if defined(ZEND_VM_IP_GLOBAL_REG) && ((ZEND_VM_KIND == ZEND_VM_KIND_CALL) || (ZEND_VM_KIND
== ZEND_VM_KIND_HYBRID))
EX(opline) = opline;
opline = orig_opline;
+#endif
+#if defined(ZEND_VM_FP_GLOBAL_REG) && ((ZEND_VM_KIND == ZEND_VM_KIND_CALL) || (ZEND_VM_KIND
== ZEND_VM_KIND_HYBRID))
execute_data = orig_execute_data;
#endif
}
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index 89d958f..41d2e74 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -67892,8 +67892,12 @@ zend_leave_helper_SPEC_LABEL:
ZEND_YIELD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(HYBRID_HALT):
+#ifdef ZEND_VM_FP_GLOBAL_REG
execute_data = orig_execute_data;
+#endif
+#ifdef ZEND_VM_IP_GLOBAL_REG
opline = orig_opline;
+#endif
return;
HYBRID_DEFAULT:
VM_TRACE(ZEND_NULL)
diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php
index c7eaa52..8e56e71 100755
--- a/Zend/zend_vm_gen.php
+++ b/Zend/zend_vm_gen.php
@@ -1814,8 +1814,12 @@ function gen_executor_code($f, $spec, $kind, $prolog, &$switch_labels =
array())
break;
case ZEND_VM_KIND_HYBRID:
out($f,"\t\t\tHYBRID_CASE(HYBRID_HALT):\n");
+ out($f,"#ifdef ZEND_VM_FP_GLOBAL_REG\n");
out($f,"\t\t\t\texecute_data = orig_execute_data;\n");
+ out($f,"#endif\n");
+ out($f,"#ifdef ZEND_VM_IP_GLOBAL_REG\n");
out($f,"\t\t\t\topline = orig_opline;\n");
+ out($f,"#endif\n");
out($f,"\t\t\t\treturn;\n");
out($f,"\t\t\tHYBRID_DEFAULT:\n");
out($f,"\t\t\t\tVM_TRACE(ZEND_NULL)\n");