summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2015-12-03 13:28:41 +0300
committerDmitry Stogov <dmitry@zend.com>2015-12-03 13:28:41 +0300
commit59424bb7bd2a5206dddb8575d8f081610be7bf50 (patch)
tree2639279dd17e530cb234117144636c753d154d8c
parent2fabcbfedbd895bcb437298bb94655bcb9556468 (diff)
downloadphp-git-59424bb7bd2a5206dddb8575d8f081610be7bf50.tar.gz
Fixed bug #71006 (symbol referencing errors on Sparc/Solaris)
-rw-r--r--NEWS1
-rw-r--r--Zend/zend_alloc.c10
-rw-r--r--Zend/zend_hash.c2
-rw-r--r--acinclude.m454
-rw-r--r--configure.in6
5 files changed, 67 insertions, 6 deletions
diff --git a/NEWS b/NEWS
index e6cf644946..e17978ca31 100644
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,7 @@ PHP NEWS
?? ??? 2015, PHP 7.0.1
- Core:
+ . Fixed bug #71006 (symbol referencing errors on Sparc/Solaris). (Dmitry)
. Fixed bug #70997 (When using parentClass:: instead of parent::, static
context changed). (Dmitry)
. Fixed bug #70970 (Segfault when combining error handler with output
diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c
index c9d4de43a4..6b335d2918 100644
--- a/Zend/zend_alloc.c
+++ b/Zend/zend_alloc.c
@@ -506,9 +506,9 @@ static void zend_mm_munmap(void *addr, size_t size)
/* number of trailing set (1) bits */
static zend_always_inline int zend_mm_bitset_nts(zend_mm_bitset bitset)
{
-#if (defined(__GNUC__) || __has_builtin(__builtin_ctzl)) && SIZEOF_ZEND_LONG == SIZEOF_LONG
+#if (defined(__GNUC__) || __has_builtin(__builtin_ctzl)) && SIZEOF_ZEND_LONG == SIZEOF_LONG && defined(PHP_HAVE_BUILTIN_CTZL)
return __builtin_ctzl(~bitset);
-#elif defined(__GNUC__) || __has_builtin(__builtin_ctzll)
+#elif (defined(__GNUC__) || __has_builtin(__builtin_ctzll)) && defined(PHP_HAVE_BUILTIN_CTZLL)
return __builtin_ctzll(~bitset);
#elif defined(_WIN32)
unsigned long index;
@@ -545,9 +545,9 @@ static zend_always_inline int zend_mm_bitset_nts(zend_mm_bitset bitset)
/* number of trailing zero bits (0x01 -> 1; 0x40 -> 6; 0x00 -> LEN) */
static zend_always_inline int zend_mm_bitset_ntz(zend_mm_bitset bitset)
{
-#if (defined(__GNUC__) || __has_builtin(__builtin_ctzl)) && SIZEOF_ZEND_LONG == SIZEOF_LONG
+#if (defined(__GNUC__) || __has_builtin(__builtin_ctzl)) && SIZEOF_ZEND_LONG == SIZEOF_LONG && defined(PHP_HAVE_BUILTIN_CTZL)
return __builtin_ctzl(bitset);
-#elif defined(__GNUC__) || __has_builtin(__builtin_ctzll)
+#elif (defined(__GNUC__) || __has_builtin(__builtin_ctzll)) && defined(PHP_HAVE_BUILTIN_CTZLL)
return __builtin_ctzll(bitset);
#elif defined(_WIN32)
unsigned long index;
@@ -1161,7 +1161,7 @@ static zend_always_inline void zend_mm_free_large(zend_mm_heap *heap, zend_mm_ch
/* higher set bit number (0->N/A, 1->1, 2->2, 4->3, 8->4, 127->7, 128->8 etc) */
static zend_always_inline int zend_mm_small_size_to_bit(int size)
{
-#if defined(__GNUC__) || __has_builtin(__builtin_clz)
+#if (defined(__GNUC__) || __has_builtin(__builtin_clz)) && defined(PHP_HAVE_BUILTIN_CLZ)
return (__builtin_clz(size) ^ 0x1f) + 1;
#elif defined(_WIN32)
unsigned long index;
diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c
index 283ceb8c18..ecfee33e14 100644
--- a/Zend/zend_hash.c
+++ b/Zend/zend_hash.c
@@ -112,7 +112,7 @@ static uint32_t zend_always_inline zend_hash_check_size(uint32_t nSize)
rather than using an undefined bis scan result. */
return nSize;
}
-#elif defined(__GNUC__) || __has_builtin(__builtin_clz)
+#elif (defined(__GNUC__) || __has_builtin(__builtin_clz)) && defined(PHP_HAVE_BUILTIN_CLZ)
return 0x2 << (__builtin_clz(nSize - 1) ^ 0x1f);
#else
nSize -= 1;
diff --git a/acinclude.m4 b/acinclude.m4
index ff2fad66f4..e828de1fd6 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -3050,3 +3050,57 @@ AC_DEFUN([PHP_CHECK_BUILTIN_EXPECT], [
AC_DEFINE_UNQUOTED([PHP_HAVE_BUILTIN_EXPECT], [$have_builtin_expect], [Whether the compiler supports __builtin_expect])
])
+
+dnl PHP_CHECK_BUILTIN_CLZ
+AC_DEFUN([PHP_CHECK_BUILTIN_CLZ], [
+ AC_MSG_CHECKING([for __builtin_clz])
+
+ AC_TRY_LINK(, [
+ return __builtin_clz(1) ? 1 : 0;
+ ], [
+ have_builtin_clz=1
+ AC_MSG_RESULT([yes])
+ ], [
+ have_builtin_clz=0
+ AC_MSG_RESULT([no])
+ ])
+
+ AC_DEFINE_UNQUOTED([PHP_HAVE_BUILTIN_CLZ], [$have_builtin_clz], [Whether the compiler supports __builtin_clz])
+
+])
+
+dnl PHP_CHECK_BUILTIN_CTZL
+AC_DEFUN([PHP_CHECK_BUILTIN_CTZL], [
+ AC_MSG_CHECKING([for __builtin_ctzl])
+
+ AC_TRY_LINK(, [
+ return __builtin_ctzl(2L) ? 1 : 0;
+ ], [
+ have_builtin_ctzl=1
+ AC_MSG_RESULT([yes])
+ ], [
+ have_builtin_ctzl=0
+ AC_MSG_RESULT([no])
+ ])
+
+ AC_DEFINE_UNQUOTED([PHP_HAVE_BUILTIN_CTZL], [$have_builtin_ctzl], [Whether the compiler supports __builtin_ctzl])
+
+])
+
+dnl PHP_CHECK_BUILTIN_CTZLL
+AC_DEFUN([PHP_CHECK_BUILTIN_CTZLL], [
+ AC_MSG_CHECKING([for __builtin_ctzll])
+
+ AC_TRY_LINK(, [
+ return __builtin_ctzll(2LL) ? 1 : 0;
+ ], [
+ have_builtin_ctzll=1
+ AC_MSG_RESULT([yes])
+ ], [
+ have_builtin_ctzll=0
+ AC_MSG_RESULT([no])
+ ])
+
+ AC_DEFINE_UNQUOTED([PHP_HAVE_BUILTIN_CTZLL], [$have_builtin_ctzll], [Whether the compiler supports __builtin_ctzll])
+
+])
diff --git a/configure.in b/configure.in
index 859574f218..4c0a4421e8 100644
--- a/configure.in
+++ b/configure.in
@@ -577,6 +577,12 @@ PHP_CHECK_STDINT_TYPES
dnl Check __builtin_expect
PHP_CHECK_BUILTIN_EXPECT
+dnl Check __builtin_clz
+PHP_CHECK_BUILTIN_CLZ
+dnl Check __builtin_ctzl
+PHP_CHECK_BUILTIN_CTZL
+dnl Check __builtin_ctzll
+PHP_CHECK_BUILTIN_CTZLL
dnl Check for members of the stat structure
AC_STRUCT_ST_BLKSIZE