From 287d614b3203c06fe3b2af137b5e99c33f82f6d6 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Fri, 12 Jul 2024 08:48:20 +0200 Subject: add upstream patch for PHP 8.4 --- php-pecl-vld.spec | 67 +++--------- vld-upstream.patch | 299 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 316 insertions(+), 50 deletions(-) create mode 100644 vld-upstream.patch diff --git a/php-pecl-vld.spec b/php-pecl-vld.spec index 3a2ed6c..54ea477 100644 --- a/php-pecl-vld.spec +++ b/php-pecl-vld.spec @@ -1,6 +1,6 @@ # remirepo spec file for php-pecl-vld # -# Copyright (c) 2013-2023 Remi Collet +# Copyright (c) 2013-2024 Remi Collet # License: CC-BY-SA-4.0 # http://creativecommons.org/licenses/by-sa/4.0/ # @@ -13,29 +13,21 @@ %global gh_short %(c=%{gh_commit}; echo ${c:0:7}) %global gh_owner derickr %global gh_project vld -#global gh_date 20180814 %global pecl_name vld %global with_zts 0%{!?_without_zts:%{?__ztsphp:1}} %global ini_name 40-%{pecl_name}.ini -%if 0%{?gh_date:1} -%global sources %{gh_project}-%{gh_commit} -%else %global sources %{pecl_name}-%{version} -%endif %global _configure ../%{sources}/configure Summary: Dump the internal representation of PHP scripts Name: %{?scl_prefix}php-pecl-%{pecl_name} -Version: 0.18.0 -%if 0%{?gh_date:1} -Release: 0.16.%{gh_date}.%{gh_short}%{?dist}%{!?scl:%{!?nophptag:%(%{__php} -r 'echo ".".PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')}} -Source0: https://github.com/%{gh_owner}/%{gh_project}/archive/%{gh_commit}/%{pecl_name}-%{version}-%{gh_short}.tar.gz -%else -Release: 2%{?dist}%{!?nophptag:%(%{__php} -r 'echo ".".PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')} -Source0: https://pecl.php.net/get/%{sources}.tgz -%endif License: PHP-3.01 +Version: 0.18.0 +Release: 3%{?dist}%{!?nophptag:%(%{__php} -r 'echo ".".PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')} URL: https://pecl.php.net/package/%{pecl_name} +Source0: https://pecl.php.net/get/%{sources}.tgz + +Patch0: %{pecl_name}-upstream.patch BuildRequires: make BuildRequires: %{?dtsprefix}gcc @@ -60,25 +52,18 @@ Package built for PHP %(%{__php} -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSIO %prep %setup -q -c -%if 0%{?gh_date:1} -%{__php} -r ' - $pkg = simplexml_load_file("NTS/package.xml"); - $pkg->date = substr("%{gh_date}",0,4)."-".substr("%{gh_date}",4,2)."-".substr("%{gh_date}",6,2); - $pkg->version->release = "%{version}dev"; - $pkg->stability->release = "devel"; - $pkg->asXML("package.xml"); -' -%endif -%{?_licensedir:sed -e '/LICENSE/s/role="doc"/role="src"/' -i package.xml} +sed -e '/LICENSE/s/role="doc"/role="src"/' -i package.xml pushd %{sources} -: Fix version -sed -e 's/"0.16.0"/"%{version}"/' -i vld.c +%patch -P0 -p1 + +#: Fix version +#sed -e 's/"0.16.0"/"%{version}"/' -i vld.c : Check version -if ! grep -q '"%{version}%{?gh_date:-dev}"' vld.c; then - : Error: Upstream extension version, expecting %{version}%{?gh_date:-dev}%{?prever:-%{prever}}. +if ! grep -q '"%{version}"' vld.c; then + : Error: Upstream extension version, expecting %{version}. exit 1 fi popd @@ -147,27 +132,6 @@ cd %{sources} for i in $(grep 'role="doc"' ../package.xml | sed -e 's/^.*name="//;s/".*$//') do install -Dpm 644 $i %{buildroot}%{pecl_docdir}/%{pecl_name}/$i done -%{!?_licensedir:install -Dpm 644 LICENSE %{buildroot}%{pecl_docdir}/%{pecl_name}/LICENSE} - - -%if 0%{?fedora} < 24 && 0%{?rhel} < 8 -# when pear installed alone, after us -%triggerin -- %{?scl_prefix}php-pear -if [ -x %{__pecl} ] ; then - %{pecl_install} %{pecl_xmldir}/%{name}.xml >/dev/null || : -fi - -# posttrans as pear can be installed after us -%posttrans -if [ -x %{__pecl} ] ; then - %{pecl_install} %{pecl_xmldir}/%{name}.xml >/dev/null || : -fi - -%postun -if [ $1 -eq 0 -a -x %{__pecl} ] ; then - %{pecl_uninstall} %{pecl_name} >/dev/null || : -fi -%endif %check @@ -185,7 +149,7 @@ fi %files -%{?_licensedir:%license %{sources}/LICENSE} +%license %{sources}/LICENSE %doc %{pecl_docdir}/%{pecl_name} %{pecl_xmldir}/%{name}.xml @@ -199,6 +163,9 @@ fi %changelog +* Fri Jul 12 2024 Remi Collet - 0.18.0-3 +- add upstream patch for PHP 8.4 + * Mon Sep 4 2023 Remi Collet - 0.18.0-2 - build out of sources tree diff --git a/vld-upstream.patch b/vld-upstream.patch new file mode 100644 index 0000000..b57e4de --- /dev/null +++ b/vld-upstream.patch @@ -0,0 +1,299 @@ +From 850d2d82c293e52cf0ef57e6cc762617fcc09979 Mon Sep 17 00:00:00 2001 +From: Derick Rethans +Date: Mon, 10 Oct 2022 16:47:13 +0100 +Subject: [PATCH 1/5] Fixed crash with CATCH on PHP 8.2 with 32-bit + +--- + branchinfo.c | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +diff --git a/branchinfo.c b/branchinfo.c +index 3547c1b..bddd9ff 100644 +--- a/branchinfo.c ++++ b/branchinfo.c +@@ -113,7 +113,11 @@ void vld_branch_post_process(zend_op_array *opa, vld_branch_info *branch_info) + if (vld_set_in(branch_info->entry_points, i) && opa->opcodes[i].opcode == ZEND_CATCH) { + #if PHP_VERSION_ID >= 70300 + # if ZEND_USE_ABS_JMP_ADDR ++# if PHP_VERSION_ID >= 80200 ++ if (opa->opcodes[i].op2.jmp_addr != -1) { ++# else + if (opa->opcodes[i].op2.jmp_addr != NULL) { ++# endif + # else + if (opa->opcodes[i].op2.jmp_offset != 0) { + # endif +@@ -264,9 +268,9 @@ void vld_branch_info_dump(zend_op_array *opa, vld_branch_info *branch_info) + for (i = 0; i < branch_info->starts->size; i++) { + if (vld_set_in(branch_info->starts, i)) { + fprintf( +- VLD_G(path_dump_file), +- "\t\"%s_%d\" [ label = \"{ op #%d-%d | line %d-%d }\" ];\n", +- fname, i, i, ++ VLD_G(path_dump_file), ++ "\t\"%s_%d\" [ label = \"{ op #%d-%d | line %d-%d }\" ];\n", ++ fname, i, i, + branch_info->branches[i].end_op, + branch_info->branches[i].start_lineno, + branch_info->branches[i].end_lineno +-- +2.45.2 + +From 298cea2f3880cdc775fddbdb4fcb334e1f19bfc5 Mon Sep 17 00:00:00 2001 +From: Derick Rethans +Date: Fri, 16 Dec 2022 10:27:40 +0000 +Subject: [PATCH 2/5] Fixed showing the JMP for the 'default' (or error) case + in MATCH instructions + +--- + srm_oparray.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/srm_oparray.c b/srm_oparray.c +index 9fc75d4..54661c3 100644 +--- a/srm_oparray.c ++++ b/srm_oparray.c +@@ -341,7 +341,7 @@ static const op_usage opcodes[] = { + # if PHP_VERSION_ID >= 70400 + /* 194 */ { "ARRAY_KEY_EXISTS", ALL_USED }, + # if PHP_VERSION_ID >= 80000 +- /* 195 */ { "MATCH", ALL_USED | OP2_JMP_ARRAY }, ++ /* 195 */ { "MATCH", ALL_USED | OP2_JMP_ARRAY | EXT_VAL_JMP_REL }, + /* 196 */ { "CASE_STRICT", ALL_USED }, + /* 197 */ { "MATCH_ERROR", ALL_USED }, + /* 198 */ { "JMP_NULL", ALL_USED }, +-- +2.45.2 + +From 7d25f1e5949935aa153b37d6bdaf19cf8079772a Mon Sep 17 00:00:00 2001 +From: Derick Rethans +Date: Tue, 28 May 2024 15:09:58 +0100 +Subject: [PATCH 3/5] RECV uses OP2_OPNUM too + +--- + srm_oparray.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/srm_oparray.c b/srm_oparray.c +index 54661c3..1df6f06 100644 +--- a/srm_oparray.c ++++ b/srm_oparray.c +@@ -145,7 +145,7 @@ static const op_usage opcodes[] = { + /* 60 */ { "DO_FCALL", SPECIAL }, + /* 61 */ { "INIT_FCALL", ALL_USED }, + /* 62 */ { "RETURN", OP1_USED }, +- /* 63 */ { "RECV", RES_USED | OP1_USED }, ++ /* 63 */ { "RECV", RES_USED | OP1_USED | OP2_OPNUM }, + /* 64 */ { "RECV_INIT", ALL_USED }, + /* 65 */ { "SEND_VAL", OP1_USED }, + /* 66 */ { "SEND_VAR_EX", ALL_USED }, +@@ -649,6 +649,9 @@ static unsigned int vld_get_special_flags(const zend_op *op, unsigned int base_a + } + #endif + break; ++ case ZEND_RECV: ++ flags = OP1_USED|OP2_USED|OP2_OPNUM; ++ break; + } + return flags; + } +-- +2.45.2 + +From d7abb0c5ebda8277cda4be37a92d55e29ab5b503 Mon Sep 17 00:00:00 2001 +From: Derick Rethans +Date: Tue, 28 May 2024 15:11:24 +0100 +Subject: [PATCH 4/5] PHP_CHECK_GCC_ARG is now AX_CHECK_COMPILE_FLAG + +--- + config.m4 | 72 +++++++++++++++++++++++++++---------------------------- + 1 file changed, 36 insertions(+), 36 deletions(-) + +diff --git a/config.m4 b/config.m4 +index 54b914d..18cfa7d 100644 +--- a/config.m4 ++++ b/config.m4 +@@ -20,42 +20,42 @@ if test "$PHP_VLD" != "no"; then + CPPFLAGS=$old_CPPFLAGS + + if test "$PHP_VLD_DEV" = "yes"; then +- PHP_CHECK_GCC_ARG(-Wbool-conversion, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wbool-conversion") +- PHP_CHECK_GCC_ARG(-Wdeclaration-after-statement, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wdeclaration-after-statement") +- PHP_CHECK_GCC_ARG(-Wdiscarded-qualifiers, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wdiscarded-qualifiers") +- PHP_CHECK_GCC_ARG(-Wduplicate-enum, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wduplicate-enum") +- PHP_CHECK_GCC_ARG(-Wempty-body, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wempty-body") +- PHP_CHECK_GCC_ARG(-Wenum-compare, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wenum-compare") +- PHP_CHECK_GCC_ARG(-Werror, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Werror") +- PHP_CHECK_GCC_ARG(-Wextra, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wextra") +- PHP_CHECK_GCC_ARG(-Wformat-nonliteral, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wformat-nonliteral") +- PHP_CHECK_GCC_ARG(-Wformat-security, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wformat-security") +- PHP_CHECK_GCC_ARG(-Wheader-guard, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wheader-guard") +- PHP_CHECK_GCC_ARG(-Wincompatible-pointer-types-discards-qualifiers, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wincompatible-pointer-types-discards-qualifiers") +- PHP_CHECK_GCC_ARG(-Wimplicit-fallthrough, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wimplicit-fallthrough") +- PHP_CHECK_GCC_ARG(-Winit-self, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Winit-self") +- PHP_CHECK_GCC_ARG(-Wlogical-not-parentheses, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wlogical-not-parentheses") +- PHP_CHECK_GCC_ARG(-Wlogical-op, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wlogical-op") +- PHP_CHECK_GCC_ARG(-Wlogical-op-parentheses, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wlogical-op-parentheses") +- PHP_CHECK_GCC_ARG(-Wloop-analysis, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wloop-analysis") +- PHP_CHECK_GCC_ARG(-Wmaybe-uninitialized, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wmaybe-uninitialized") +- PHP_CHECK_GCC_ARG(-Wmissing-format-attribute, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wmissing-format-attribute") +- PHP_CHECK_GCC_ARG(-Wno-missing-field-initializers, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wno-missing-field-initializers") +- PHP_CHECK_GCC_ARG(-Wno-sign-compare, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wno-sign-compare") +- PHP_CHECK_GCC_ARG(-Wno-unused-but-set-variable, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wno-unused-but-set-variable") +- PHP_CHECK_GCC_ARG(-Wno-unused-parameter, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wno-unused-parameter") +- PHP_CHECK_GCC_ARG(-Wno-variadic-macros, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wno-variadic-macros") +- PHP_CHECK_GCC_ARG(-Wparentheses, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wparentheses") +- PHP_CHECK_GCC_ARG(-Wpointer-bool-conversion, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wpointer-bool-conversion") +- PHP_CHECK_GCC_ARG(-Wsizeof-array-argument, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wsizeof-array-argument") +- PHP_CHECK_GCC_ARG(-Wstring-conversion, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wstring-conversion") +- PHP_CHECK_GCC_ARG(-Wwrite-strings, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wwrite-strings") +- PHP_CHECK_GCC_ARG(-fdiagnostics-show-option, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -fdiagnostics-show-option") +- PHP_CHECK_GCC_ARG(-fno-exceptions, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -fno-exceptions") +- PHP_CHECK_GCC_ARG(-fno-omit-frame-pointer, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -fno-omit-frame-pointer") +- PHP_CHECK_GCC_ARG(-fno-optimize-sibling-calls, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -fno-optimize-sibling-calls") +- PHP_CHECK_GCC_ARG(-fsanitize-address, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -fsanitize-address") +- PHP_CHECK_GCC_ARG(-fstack-protector, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -fstack-protector") ++ AX_CHECK_COMPILE_FLAG(-Wbool-conversion, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wbool-conversion") ++ AX_CHECK_COMPILE_FLAG(-Wdeclaration-after-statement, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wdeclaration-after-statement") ++ AX_CHECK_COMPILE_FLAG(-Wdiscarded-qualifiers, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wdiscarded-qualifiers") ++ AX_CHECK_COMPILE_FLAG(-Wduplicate-enum, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wduplicate-enum") ++ AX_CHECK_COMPILE_FLAG(-Wempty-body, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wempty-body") ++ AX_CHECK_COMPILE_FLAG(-Wenum-compare, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wenum-compare") ++ AX_CHECK_COMPILE_FLAG(-Werror, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Werror") ++ AX_CHECK_COMPILE_FLAG(-Wextra, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wextra") ++ AX_CHECK_COMPILE_FLAG(-Wformat-nonliteral, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wformat-nonliteral") ++ AX_CHECK_COMPILE_FLAG(-Wformat-security, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wformat-security") ++ AX_CHECK_COMPILE_FLAG(-Wheader-guard, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wheader-guard") ++ AX_CHECK_COMPILE_FLAG(-Wincompatible-pointer-types-discards-qualifiers, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wincompatible-pointer-types-discards-qualifiers") ++ AX_CHECK_COMPILE_FLAG(-Wimplicit-fallthrough, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wimplicit-fallthrough") ++ AX_CHECK_COMPILE_FLAG(-Winit-self, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Winit-self") ++ AX_CHECK_COMPILE_FLAG(-Wlogical-not-parentheses, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wlogical-not-parentheses") ++ AX_CHECK_COMPILE_FLAG(-Wlogical-op, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wlogical-op") ++ AX_CHECK_COMPILE_FLAG(-Wlogical-op-parentheses, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wlogical-op-parentheses") ++ AX_CHECK_COMPILE_FLAG(-Wloop-analysis, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wloop-analysis") ++ AX_CHECK_COMPILE_FLAG(-Wmaybe-uninitialized, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wmaybe-uninitialized") ++ AX_CHECK_COMPILE_FLAG(-Wmissing-format-attribute, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wmissing-format-attribute") ++ AX_CHECK_COMPILE_FLAG(-Wno-missing-field-initializers, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wno-missing-field-initializers") ++ AX_CHECK_COMPILE_FLAG(-Wno-sign-compare, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wno-sign-compare") ++ AX_CHECK_COMPILE_FLAG(-Wno-unused-but-set-variable, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wno-unused-but-set-variable") ++ AX_CHECK_COMPILE_FLAG(-Wno-unused-parameter, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wno-unused-parameter") ++ AX_CHECK_COMPILE_FLAG(-Wno-variadic-macros, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wno-variadic-macros") ++ AX_CHECK_COMPILE_FLAG(-Wparentheses, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wparentheses") ++ AX_CHECK_COMPILE_FLAG(-Wpointer-bool-conversion, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wpointer-bool-conversion") ++ AX_CHECK_COMPILE_FLAG(-Wsizeof-array-argument, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wsizeof-array-argument") ++ AX_CHECK_COMPILE_FLAG(-Wstring-conversion, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wstring-conversion") ++ AX_CHECK_COMPILE_FLAG(-Wwrite-strings, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wwrite-strings") ++ AX_CHECK_COMPILE_FLAG(-fdiagnostics-show-option, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -fdiagnostics-show-option") ++ AX_CHECK_COMPILE_FLAG(-fno-exceptions, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -fno-exceptions") ++ AX_CHECK_COMPILE_FLAG(-fno-omit-frame-pointer, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -fno-omit-frame-pointer") ++ AX_CHECK_COMPILE_FLAG(-fno-optimize-sibling-calls, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -fno-optimize-sibling-calls") ++ AX_CHECK_COMPILE_FLAG(-fsanitize-address, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -fsanitize-address") ++ AX_CHECK_COMPILE_FLAG(-fstack-protector, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -fstack-protector") + + MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS" + STD_CFLAGS="-g -O0 -Wall" +-- +2.45.2 + +From df1c52c4cb62e5ff31e1b72e3f11df9a45ee567a Mon Sep 17 00:00:00 2001 +From: Derick Rethans +Date: Wed, 26 Jun 2024 16:58:42 +0100 +Subject: [PATCH 5/5] Add support for PHP 8.4 opcodes ZEND_JMP_FRAMELESS and + ZEND_FRAMELESS_ICALL_[0-3] + +--- + srm_oparray.c | 29 +++++++++++++++++++++++++++++ + srm_oparray.h | 2 ++ + tests/jmp_frameless.inc | 6 ++++++ + 3 files changed, 37 insertions(+) + create mode 100644 tests/jmp_frameless.inc + +diff --git a/srm_oparray.c b/srm_oparray.c +index 1df6f06..3bd6dce 100644 +--- a/srm_oparray.c ++++ b/srm_oparray.c +@@ -350,6 +350,16 @@ static const op_usage opcodes[] = { + /* 200 */ { "FETCH_GLOBALS", ALL_USED }, + /* 201 */ { "VERIFY_NEVER_TYPE", ALL_USED }, + /* 202 */ { "ZEND_CALLABLE_CONVERT", ALL_USED }, ++# if PHP_VERSION_ID >= 80300 ++ /* 203 */ { "ZEND_BIND_INIT_STATIC_OR_JMP", ALL_USED }, ++# if PHP_VERSION_ID >= 80400 ++ /* 204 */ { "ZEND_FRAMELESS_ICALL_0", ALL_USED | EXT_VAL_FLF }, ++ /* 205 */ { "ZEND_FRAMELESS_ICALL_1", ALL_USED | EXT_VAL_FLF }, ++ /* 206 */ { "ZEND_FRAMELESS_ICALL_2", ALL_USED | EXT_VAL_FLF }, ++ /* 207 */ { "ZEND_FRAMELESS_ICALL_3", ALL_USED | EXT_VAL_FLF }, ++ /* 208 */ { "ZEND_JMP_FRAMELESS", ALL_USED | EXT_CACHED_PTR | OP2_OPNUM }, ++# endif ++# endif + # endif + # endif + # else +@@ -814,6 +824,12 @@ void vld_dump_op(int nr, zend_op * op_ptr, unsigned int base_address, int notdea + last_lineno = op.lineno; + } + ++#if PHP_VERSION_ID >= 80400 ++ if (flags & EXT_VAL_FLF) { ++ fetch_type = (char*) ZEND_FLF_FUNC(&op)->common.function_name->val; ++ } ++#endif ++ + if (op.opcode >= NUM_KNOWN_OPCODES) { + if (VLD_G(format)) { + vld_printf(stderr, "%5d %s %c %c %c %c %s <%03d>%-23s %s %-14s ", nr, VLD_G(col_sep), notdead ? ' ' : '*', entry ? 'E' : ' ', start ? '>' : ' ', end ? '>' : ' ', VLD_G(col_sep), op.opcode, VLD_G(col_sep), fetch_type); +@@ -834,6 +850,11 @@ void vld_dump_op(int nr, zend_op * op_ptr, unsigned int base_address, int notdea + } + } + ++#if PHP_VERSION_ID >= 80400 ++ if (flags & EXT_CACHED_PTR) { ++ vld_printf(stderr, "s%-3d ", op.extended_value); ++ } else ++#endif + if (flags & EXT_VAL) { + #if PHP_VERSION_ID >= 70300 + if (op.opcode == ZEND_CATCH) { +@@ -1085,6 +1106,14 @@ int vld_find_jumps(zend_op_array *opa, unsigned int position, size_t *jump_count + *jump_count = 1; + return 1; + ++#if PHP_VERSION_ID >= 80400 ++ } else if (opcode.opcode == ZEND_JMP_FRAMELESS) { ++ jumps[0] = VLD_ZNODE_JMP_LINE(opcode.op2, position, base_address); ++ jumps[1] = position + 1; ++ *jump_count = 2; ++ return 1; ++#endif ++ + } else if ( + opcode.opcode == ZEND_GENERATOR_RETURN || + opcode.opcode == ZEND_EXIT || +diff --git a/srm_oparray.h b/srm_oparray.h +index 7cc0803..ee65c25 100644 +--- a/srm_oparray.h ++++ b/srm_oparray.h +@@ -57,6 +57,8 @@ + #define EXT_VAL_JMP_ABS 1<<25 + #define VLD_IS_JMP_ARRAY 1<<26 + #define VLD_IS_INDEX 1<<27 ++#define EXT_VAL_FLF 1<<28 ++#define EXT_CACHED_PTR 1<<29 + + typedef struct _op_usage { + const char *name; +diff --git a/tests/jmp_frameless.inc b/tests/jmp_frameless.inc +new file mode 100644 +index 0000000..f693565 +--- /dev/null ++++ b/tests/jmp_frameless.inc +@@ -0,0 +1,6 @@ ++