]> granicus.if.org Git - php/commitdiff
Fix #76825: Undefined symbols ___cpuid_count
authorChristoph M. Becker <cmbecker69@gmx.de>
Mon, 5 Nov 2018 17:24:39 +0000 (18:24 +0100)
committerChristoph M. Becker <cmbecker69@gmx.de>
Mon, 5 Nov 2018 17:24:39 +0000 (18:24 +0100)
Apparently, the presence of `cpuid.h` is not necessarily sufficient to
guarantee the availability of `__cpuid_count()`.  We therefore test for
the latter explicitly.

NEWS
Zend/Zend.m4
Zend/zend_cpuinfo.c

diff --git a/NEWS b/NEWS
index 49c8cd9e29817914cbb03ec5d043d45f59db6647..a0949e94be8681e1fbab5857721405dfdee8e655 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,7 @@ PHP                                                                        NEWS
 ?? ??? ????, PHP 7.3.0RC5
 
 - Core:
+  . Fixed bug #76825 (Undefined symbols ___cpuid_count). (Laruence, cmb)
   . Fixed bug #77110 (undefined symbol zend_string_equal_val in C++ build).
     (Remi)
 
@@ -139,7 +140,6 @@ PHP                                                                        NEWS
 13 Sep 2018, PHP 7.3.0RC1
 
 - Core:
-  . Fixed bug #76825 (Undefined symbols ___cpuid_count). (Laruence)
   . Fixed bug #76820 (Z_COPYABLE invalid definition). (mvdwerve, cmb)
   . Fixed bug #76510 (file_exists() stopped working for phar://). (cmb)
 
index 20dd0f9a39cd6397defb30206249ac0e7e60e41d..67cea95a9139829c7d37016dcc859b1d346a1a44 100644 (file)
@@ -596,3 +596,21 @@ dnl This is the most probable fallback so we assume yes in case of cross compile
 if test "$ac_cv_huge_val_nan" = "yes"; then
   AC_DEFINE([HAVE_HUGE_VAL_NAN], 1, [whether HUGE_VAL + -HUGEVAL == NAN])
 fi
+
+dnl
+dnl Check whether __cpuid_count is available
+dnl
+AC_CACHE_CHECK(whether __cpuid_count is available, ac_cv_cpuid_count_available, [
+AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+  #include <cpuid.h>
+]], [[
+  unsigned eax, ebx, ecx, edx;
+  __cpuid_count(0, 0, eax, ebx, ecx, edx);
+]])], [
+  ac_cv_cpuid_count_available=yes
+], [
+  ac_cv_cpuid_count_available=no
+])])
+if test "$ac_cv_cpuid_count_available" = "yes"; then
+  AC_DEFINE([HAVE_CPUID_COUNT], 1, [whether __cpuid_count is available])
+fi
index ffa370416dc4c4eb5b527c81e7ff0a45a7d59118..5791a11c62f51e83625413a7a15e2fe1bfb49db6 100644 (file)
@@ -29,7 +29,7 @@ typedef struct _zend_cpu_info {
 static zend_cpu_info cpuinfo = {0};
 
 #if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
-# ifdef HAVE_CPUID_H
+# if defined(HAVE_CPUID_H) && defined(HAVE_CPUID_COUNT)
 # include <cpuid.h>
 static void __zend_cpuid(uint32_t func, uint32_t subfunc, zend_cpu_info *cpuinfo) {
        __cpuid_count(func, subfunc, cpuinfo->eax, cpuinfo->ebx, cpuinfo->ecx, cpuinfo->edx);