Index: src/base/cpu.cc |
diff --git a/src/base/cpu.cc b/src/base/cpu.cc |
index 9d0715ade8f1e1805abb1a61642f91ade5276e9f..5bc8b13a97ba2fb9ca2094e32b43d288cf3b0157 100644 |
--- a/src/base/cpu.cc |
+++ b/src/base/cpu.cc |
@@ -7,12 +7,18 @@ |
#if V8_LIBC_MSVCRT |
#include <intrin.h> // __cpuid() |
#endif |
-#if V8_OS_POSIX |
-#include <unistd.h> // sysconf() |
+#if V8_OS_LINUX |
+#include <linux/auxvec.h> // AT_HWCAP |
+#endif |
+#if V8_GLIBC_PREREQ(2, 16) |
+#include <sys/auxv.h> // getauxval() |
#endif |
#if V8_OS_QNX |
#include <sys/syspage.h> // cpuinfo |
#endif |
+#if V8_OS_POSIX |
+#include <unistd.h> // sysconf() |
+#endif |
#include <ctype.h> |
#include <limits.h> |
@@ -92,11 +98,12 @@ static V8_INLINE void __cpuid(int cpu_info[4], int info_type) { |
#define HWCAP_IDIV (HWCAP_IDIVA | HWCAP_IDIVT) |
#define HWCAP_LPAE (1 << 20) |
-#define AT_HWCAP 16 |
- |
-// Read the ELF HWCAP flags by parsing /proc/self/auxv. |
static uint32_t ReadELFHWCaps() { |
uint32_t result = 0; |
+#if V8_GLIBC_PREREQ(2, 16) |
+ result = static_cast<uint32_t>(getauxval(AT_HWCAP)); |
+#else |
+ // Read the ELF HWCAP flags by parsing /proc/self/auxv. |
FILE* fp = fopen("/proc/self/auxv", "r"); |
if (fp != NULL) { |
struct { uint32_t tag; uint32_t value; } entry; |
@@ -112,6 +119,7 @@ static uint32_t ReadELFHWCaps() { |
} |
fclose(fp); |
} |
+#endif |
return result; |
} |
@@ -310,7 +318,7 @@ CPU::CPU() : stepping_(0), |
has_vfp3_d32_(false), |
is_fp64_mode_(false) { |
memcpy(vendor_, "Unknown", 8); |
-#if defined(__pnacl__) |
+#if V8_OS_NACL |
// Portable host shouldn't do feature detection. |
// TODO(jfb): Remove the hardcoded ARM simulator flags in the build, and |
// hardcode them here instead. |