Use autoconf for recognizing __builtin_unreachable() (#12266)

Older versions of GCC don't support __has_builtin(), but do support
__builtin_unreachable().
This commit is contained in:
Ilija Tovilo 2023-09-22 11:53:09 +02:00 committed by GitHub
parent 77bc5aafe1
commit 62e2402534
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 25 additions and 7 deletions

View File

@ -92,7 +92,7 @@
#elif defined(__clang__) && __has_builtin(__builtin_assume) #elif defined(__clang__) && __has_builtin(__builtin_assume)
# pragma clang diagnostic ignored "-Wassume" # pragma clang diagnostic ignored "-Wassume"
# define ZEND_ASSUME(c) __builtin_assume(c) # define ZEND_ASSUME(c) __builtin_assume(c)
#elif ((defined(__GNUC__) && ZEND_GCC_VERSION >= 4005) || __has_builtin(__builtin_unreachable)) && PHP_HAVE_BUILTIN_EXPECT #elif PHP_HAVE_BUILTIN_UNREACHABLE && PHP_HAVE_BUILTIN_EXPECT
# define ZEND_ASSUME(c) do { \ # define ZEND_ASSUME(c) do { \
if (__builtin_expect(!(c), 0)) __builtin_unreachable(); \ if (__builtin_expect(!(c), 0)) __builtin_unreachable(); \
} while (0) } while (0)
@ -106,12 +106,9 @@
# define ZEND_ASSERT(c) ZEND_ASSUME(c) # define ZEND_ASSERT(c) ZEND_ASSUME(c)
#endif #endif
#ifdef __has_builtin #ifdef PHP_HAVE_BUILTIN_UNREACHABLE
# if __has_builtin(__builtin_unreachable) # define _ZEND_UNREACHABLE() __builtin_unreachable()
# define _ZEND_UNREACHABLE() __builtin_unreachable() #else
# endif
#endif
#ifndef _ZEND_UNREACHABLE
# define _ZEND_UNREACHABLE() ZEND_ASSUME(0) # define _ZEND_UNREACHABLE() ZEND_ASSUME(0)
#endif #endif

View File

@ -2464,6 +2464,25 @@ AC_DEFUN([PHP_CHECK_BUILTIN_EXPECT], [
AC_DEFINE_UNQUOTED([PHP_HAVE_BUILTIN_EXPECT], [$have_builtin_expect], [Whether the compiler supports __builtin_expect]) AC_DEFINE_UNQUOTED([PHP_HAVE_BUILTIN_EXPECT], [$have_builtin_expect], [Whether the compiler supports __builtin_expect])
]) ])
dnl
dnl PHP_CHECK_BUILTIN_UNREACHABLE
dnl
AC_DEFUN([PHP_CHECK_BUILTIN_UNREACHABLE], [
AC_MSG_CHECKING([for __builtin_unreachable])
AC_LINK_IFELSE([AC_LANG_PROGRAM([], [[
__builtin_unreachable();
]])], [
have_builtin_unreachable=1
AC_MSG_RESULT([yes])
], [
have_builtin_unreachable=0
AC_MSG_RESULT([no])
])
AC_DEFINE_UNQUOTED([PHP_HAVE_BUILTIN_UNREACHABLE], [$have_builtin_unreachable], [Whether the compiler supports __builtin_unreachable])
])
dnl dnl
dnl PHP_CHECK_BUILTIN_CLZ dnl PHP_CHECK_BUILTIN_CLZ
dnl dnl

View File

@ -494,6 +494,8 @@ PHP_CHECK_STDINT_TYPES
dnl Check __builtin_expect dnl Check __builtin_expect
PHP_CHECK_BUILTIN_EXPECT PHP_CHECK_BUILTIN_EXPECT
dnl Check __builtin_unreachable
PHP_CHECK_BUILTIN_UNREACHABLE
dnl Check __builtin_clz dnl Check __builtin_clz
PHP_CHECK_BUILTIN_CLZ PHP_CHECK_BUILTIN_CLZ
dnl Check __builtin_clzl dnl Check __builtin_clzl