From a06cde8236e3fbc3cfb35d07b3b97c47d338f5ac Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Sat, 3 Feb 2018 17:15:18 +0100 Subject: [PATCH] If the target attribute is available, attach it explicitly The ifunc attribute might be not available as it is binary format dependent. --- Zend/zend_portability.h | 14 ++++++++++++++ ext/standard/string.c | 7 +++---- win32/build/config.w32.h.in | 5 +++++ 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/Zend/zend_portability.h b/Zend/zend_portability.h index 89f3020a31..bd3e23edfe 100644 --- a/Zend/zend_portability.h +++ b/Zend/zend_portability.h @@ -514,6 +514,8 @@ static zend_always_inline double _zend_get_nan(void) /* {{{ */ # endif #endif +/* Intrinsics macros start. */ + #if defined(HAVE_FUNC_ATTRIBUTE_IFUNC) && defined(HAVE_FUNC_ATTRIBUTE_TARGET) # define ZEND_INTRIN_HAVE_IFUNC_TARGET 1 #endif @@ -532,6 +534,18 @@ static zend_always_inline double _zend_get_nan(void) /* {{{ */ # define ZEND_INTRIN_SSE4_2_FUNC_PTR 1 #endif +#if ZEND_INTRIN_SSE4_2_RESOLVER +# if defined(HAVE_FUNC_ATTRIBUTE_TARGET) +# define ZEND_INTRIN_SSE4_2_FUNC_DECL(func) ZEND_API func __attribute__((target("sse4.2"))) +# else +# define ZEND_INTRIN_SSE4_2_FUNC_DECL(func) func +# endif +#else +# define ZEND_INTRIN_SSE4_2_FUNC_DECL(func) +#endif + +/* Intrinsics macros end. */ + #ifdef ZEND_WIN32 # define ZEND_SET_ALIGNED(alignment, decl) __declspec(align(alignment)) decl #elif HAVE_ATTRIBUTE_ALIGNED diff --git a/ext/standard/string.c b/ext/standard/string.c index 02f78a4f0e..ad75a77f93 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -3866,10 +3866,11 @@ PHPAPI zend_string *php_addcslashes(zend_string *str, int should_free, char *wha # include "Zend/zend_bitset.h" # include "Zend/zend_cpuinfo.h" +ZEND_INTRIN_SSE4_2_FUNC_DECL(zend_string *php_addslashes_sse42(zend_string *str, int should_free)); +zend_string *php_addslashes_default(zend_string *str, int should_free); + # if ZEND_INTRIN_SSE4_2_FUNC_PROTO PHPAPI zend_string *php_addslashes(zend_string *str, int should_free) __attribute__((ifunc("resolve_addslashes"))); -zend_string *php_addslashes_sse42(zend_string *str, int should_free) __attribute__((target("sse4.2"))); -zend_string *php_addslashes_default(zend_string *str, int should_free); static void *resolve_addslashes() { if (zend_cpu_supports(ZEND_CPU_FEATURE_SSE42)) { @@ -3878,8 +3879,6 @@ static void *resolve_addslashes() { return php_addslashes_default; } # else /* ZEND_INTRIN_SSE4_2_FUNC_PTR */ -zend_string *php_addslashes_sse42(zend_string *str, int should_free); -zend_string *php_addslashes_default(zend_string *str, int should_free); PHPAPI zend_string *(*php_addslashes)(zend_string *str, int should_free) = NULL; diff --git a/win32/build/config.w32.h.in b/win32/build/config.w32.h.in index 9572f65d82..ab010f4cb5 100644 --- a/win32/build/config.w32.h.in +++ b/win32/build/config.w32.h.in @@ -178,3 +178,8 @@ #define HAVE_FTOK 1 #define HAVE_NICE + +#ifdef __clang__ +#define HAVE_FUNC_ATTRIBUTE_TARGET 1 +#endif + -- 2.40.0