From 067df263448ee26013cddee1065bc9c1f028bd23 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 24 Nov 2021 16:13:34 +0300 Subject: [PATCH] Use memrchr() when available On x86_64 glibc memrchr() uses SSE/AVX CPU extensions and works much faster then naive loop. On x86 32-bit we still use inlined version. memrchr() is a GNU extension. Its prototype becomes available when is included with defined _GNU_SOURCE macro. Previously, we defined it in "php_config.h", but some sources may include befire it. To avod mess we also pass -D_GNU_SOURCE to C compiler. --- Zend/zend_operators.h | 5 +++++ Zend/zend_signal.c | 4 +++- configure.ac | 7 +++++++ ext/pdo_firebird/firebird_driver.c | 4 +++- ext/zlib/zlib_fopen_wrapper.c | 4 +++- main/snprintf.c | 4 +++- main/spprintf.c | 4 +++- main/streams/cast.c | 4 +++- main/streams/memory.c | 4 +++- main/streams/streams.c | 4 +++- sapi/fpm/fpm/fpm_trace_pread.c | 4 +++- 11 files changed, 39 insertions(+), 9 deletions(-) diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h index ce9d852819e..410745cbc34 100644 --- a/Zend/zend_operators.h +++ b/Zend/zend_operators.h @@ -211,6 +211,10 @@ zend_memnstr(const char *haystack, const char *needle, size_t needle_len, const static zend_always_inline const void *zend_memrchr(const void *s, int c, size_t n) { +#if defined(HAVE_MEMRCHR) && !defined(i386) + /* On x86 memrchr() doesn't use SSE/AVX, so inlined version is faster */ + return (const void*)memrchr(s, c, n); +#else const unsigned char *e; if (0 == n) { return NULL; @@ -222,6 +226,7 @@ static zend_always_inline const void *zend_memrchr(const void *s, int c, size_t } } return NULL; +#endif } diff --git a/Zend/zend_signal.c b/Zend/zend_signal.c index 3c090ccb8c5..68bc3de3ff2 100644 --- a/Zend/zend_signal.c +++ b/Zend/zend_signal.c @@ -25,7 +25,9 @@ All other licensing and usage conditions are those of the PHP Group. */ -#define _GNU_SOURCE +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif #include #include "zend.h" diff --git a/configure.ac b/configure.ac index 602c72154af..db1cac4ca60 100644 --- a/configure.ac +++ b/configure.ac @@ -265,6 +265,12 @@ else AC_MSG_RESULT(no) fi +dnl The effect of _GNU_SOURCE defined in config.h depeds on includes order +if test "$ac_cv_safe_to_define___extensions__" = yes ; then + AC_MSG_CHECKING(whether to use -D_GNU_SOURCE cflag) + CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE" + AC_MSG_RESULT(yes) +fi dnl Include Zend configurations. dnl ---------------------------------------------------------------------------- @@ -609,6 +615,7 @@ vasprintf \ asprintf \ nanosleep \ memmem \ +memrchr \ ) AX_FUNC_WHICH_GETHOSTBYNAME_R diff --git a/ext/pdo_firebird/firebird_driver.c b/ext/pdo_firebird/firebird_driver.c index 36a7a2bebc0..7dc40f510d4 100644 --- a/ext/pdo_firebird/firebird_driver.c +++ b/ext/pdo_firebird/firebird_driver.c @@ -18,7 +18,9 @@ #include "config.h" #endif -#define _GNU_SOURCE +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif #include "php.h" #include "zend_exceptions.h" diff --git a/ext/zlib/zlib_fopen_wrapper.c b/ext/zlib/zlib_fopen_wrapper.c index c55b3e10030..b414b33a872 100644 --- a/ext/zlib/zlib_fopen_wrapper.c +++ b/ext/zlib/zlib_fopen_wrapper.c @@ -15,7 +15,9 @@ +----------------------------------------------------------------------+ */ -#define _GNU_SOURCE +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif #include "php.h" #include "php_zlib.h" diff --git a/main/snprintf.c b/main/snprintf.c index f082115c676..3c379c5c2ce 100644 --- a/main/snprintf.c +++ b/main/snprintf.c @@ -14,7 +14,9 @@ +----------------------------------------------------------------------+ */ -#define _GNU_SOURCE +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif #include "php.h" #include diff --git a/main/spprintf.c b/main/spprintf.c index 4c01347fcf4..37b81dc6d53 100644 --- a/main/spprintf.c +++ b/main/spprintf.c @@ -72,7 +72,9 @@ * SIO stdio-replacement strx_* functions by Panos Tsirigotis * for xinetd. */ -#define _GNU_SOURCE +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif #include "php.h" #include diff --git a/main/streams/cast.c b/main/streams/cast.c index db0f039eae1..3bad65fbac1 100644 --- a/main/streams/cast.c +++ b/main/streams/cast.c @@ -14,7 +14,9 @@ +----------------------------------------------------------------------+ */ -#define _GNU_SOURCE +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif #include "php.h" #include "php_globals.h" #include "php_network.h" diff --git a/main/streams/memory.c b/main/streams/memory.c index 0784f1617cf..365976716d2 100644 --- a/main/streams/memory.c +++ b/main/streams/memory.c @@ -14,7 +14,9 @@ +----------------------------------------------------------------------+ */ -#define _GNU_SOURCE +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif #include "php.h" #include "ext/standard/base64.h" diff --git a/main/streams/streams.c b/main/streams/streams.c index 883a31c5a6f..1581e3ffae2 100644 --- a/main/streams/streams.c +++ b/main/streams/streams.c @@ -17,7 +17,9 @@ +----------------------------------------------------------------------+ */ -#define _GNU_SOURCE +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif #include "php.h" #include "php_globals.h" #include "php_memory_streams.h" diff --git a/sapi/fpm/fpm/fpm_trace_pread.c b/sapi/fpm/fpm/fpm_trace_pread.c index 22b476f778d..8bf42234109 100644 --- a/sapi/fpm/fpm/fpm_trace_pread.c +++ b/sapi/fpm/fpm/fpm_trace_pread.c @@ -1,6 +1,8 @@ /* (c) 2007,2008 Andrei Nigmatulin */ -#define _GNU_SOURCE +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif #define _FILE_OFFSET_BITS 64 #include "fpm_config.h"