aboutsummaryrefslogtreecommitdiff
path: root/compiler-rt/lib/builtins/cpu_model
diff options
context:
space:
mode:
Diffstat (limited to 'compiler-rt/lib/builtins/cpu_model')
-rw-r--r--compiler-rt/lib/builtins/cpu_model/aarch64.c6
-rw-r--r--compiler-rt/lib/builtins/cpu_model/aarch64/fmv/android.inc4
-rw-r--r--compiler-rt/lib/builtins/cpu_model/aarch64/fmv/elf_aux_info.inc14
-rw-r--r--compiler-rt/lib/builtins/cpu_model/aarch64/fmv/getauxval.inc4
-rw-r--r--compiler-rt/lib/builtins/cpu_model/aarch64/hwcap.inc20
5 files changed, 35 insertions, 13 deletions
diff --git a/compiler-rt/lib/builtins/cpu_model/aarch64.c b/compiler-rt/lib/builtins/cpu_model/aarch64.c
index 8af736d..be29c90 100644
--- a/compiler-rt/lib/builtins/cpu_model/aarch64.c
+++ b/compiler-rt/lib/builtins/cpu_model/aarch64.c
@@ -19,15 +19,13 @@
#error This file is intended only for aarch64-based targets
#endif
-#if __has_include(<sys/ifunc.h>)
-#include <sys/ifunc.h>
-#else
typedef struct __ifunc_arg_t {
unsigned long _size;
unsigned long _hwcap;
unsigned long _hwcap2;
+ unsigned long _hwcap3;
+ unsigned long _hwcap4;
} __ifunc_arg_t;
-#endif // __has_include(<sys/ifunc.h>)
// LSE support detection for out-of-line atomics
// using HWCAP and Auxiliary vector
diff --git a/compiler-rt/lib/builtins/cpu_model/aarch64/fmv/android.inc b/compiler-rt/lib/builtins/cpu_model/aarch64/fmv/android.inc
index a9e3594..d19beca 100644
--- a/compiler-rt/lib/builtins/cpu_model/aarch64/fmv/android.inc
+++ b/compiler-rt/lib/builtins/cpu_model/aarch64/fmv/android.inc
@@ -27,10 +27,14 @@ void CONSTRUCTOR_ATTRIBUTE __init_cpu_features(void) {
unsigned long hwcap = getauxval(AT_HWCAP);
unsigned long hwcap2 = getauxval(AT_HWCAP2);
+ unsigned long hwcap3 = getauxval(AT_HWCAP3);
+ unsigned long hwcap4 = getauxval(AT_HWCAP4);
__ifunc_arg_t arg;
arg._size = sizeof(__ifunc_arg_t);
arg._hwcap = hwcap;
arg._hwcap2 = hwcap2;
+ arg._hwcap3 = hwcap3;
+ arg._hwcap4 = hwcap4;
__init_cpu_features_constructor(hwcap | _IFUNC_ARG_HWCAP, &arg);
}
diff --git a/compiler-rt/lib/builtins/cpu_model/aarch64/fmv/elf_aux_info.inc b/compiler-rt/lib/builtins/cpu_model/aarch64/fmv/elf_aux_info.inc
index aa975dc..1ada7b6 100644
--- a/compiler-rt/lib/builtins/cpu_model/aarch64/fmv/elf_aux_info.inc
+++ b/compiler-rt/lib/builtins/cpu_model/aarch64/fmv/elf_aux_info.inc
@@ -7,21 +7,21 @@ void __init_cpu_features_resolver(unsigned long hwcap,
}
void CONSTRUCTOR_ATTRIBUTE __init_cpu_features(void) {
- unsigned long hwcap = 0;
- unsigned long hwcap2 = 0;
+ unsigned long hwcap, hwcap2, hwcap3, hwcap4 = 0;
// CPU features already initialized.
if (__atomic_load_n(&__aarch64_cpu_features.features, __ATOMIC_RELAXED))
return;
- int res = 0;
- res = elf_aux_info(AT_HWCAP, &hwcap, sizeof hwcap);
- res |= elf_aux_info(AT_HWCAP2, &hwcap2, sizeof hwcap2);
- if (res)
- return;
+ elf_aux_info(AT_HWCAP, &hwcap, sizeof hwcap);
+ elf_aux_info(AT_HWCAP2, &hwcap2, sizeof hwcap2);
+ elf_aux_info(AT_HWCAP3, &hwcap3, sizeof hwcap3);
+ elf_aux_info(AT_HWCAP4, &hwcap4, sizeof hwcap4);
__ifunc_arg_t arg;
arg._size = sizeof(__ifunc_arg_t);
arg._hwcap = hwcap;
arg._hwcap2 = hwcap2;
+ arg._hwcap3 = hwcap3;
+ arg._hwcap4 = hwcap4;
__init_cpu_features_constructor(hwcap | _IFUNC_ARG_HWCAP, &arg);
}
diff --git a/compiler-rt/lib/builtins/cpu_model/aarch64/fmv/getauxval.inc b/compiler-rt/lib/builtins/cpu_model/aarch64/fmv/getauxval.inc
index 486f77a..6c52c53 100644
--- a/compiler-rt/lib/builtins/cpu_model/aarch64/fmv/getauxval.inc
+++ b/compiler-rt/lib/builtins/cpu_model/aarch64/fmv/getauxval.inc
@@ -12,10 +12,14 @@ void CONSTRUCTOR_ATTRIBUTE __init_cpu_features(void) {
unsigned long hwcap = getauxval(AT_HWCAP);
unsigned long hwcap2 = getauxval(AT_HWCAP2);
+ unsigned long hwcap3 = getauxval(AT_HWCAP3);
+ unsigned long hwcap4 = getauxval(AT_HWCAP4);
__ifunc_arg_t arg;
arg._size = sizeof(__ifunc_arg_t);
arg._hwcap = hwcap;
arg._hwcap2 = hwcap2;
+ arg._hwcap3 = hwcap3;
+ arg._hwcap4 = hwcap4;
__init_cpu_features_constructor(hwcap | _IFUNC_ARG_HWCAP, &arg);
}
diff --git a/compiler-rt/lib/builtins/cpu_model/aarch64/hwcap.inc b/compiler-rt/lib/builtins/cpu_model/aarch64/hwcap.inc
index 2f44e9e..159c617 100644
--- a/compiler-rt/lib/builtins/cpu_model/aarch64/hwcap.inc
+++ b/compiler-rt/lib/builtins/cpu_model/aarch64/hwcap.inc
@@ -7,7 +7,7 @@
#define _IFUNC_ARG_HWCAP (1ULL << 62)
#endif
#ifndef AT_HWCAP
-#define AT_HWCAP 16
+#define AT_HWCAP 16 // Linux value
#endif
#ifndef HWCAP_CPUID
#define HWCAP_CPUID (1 << 11)
@@ -95,7 +95,7 @@
#endif
#ifndef AT_HWCAP2
-#define AT_HWCAP2 26
+#define AT_HWCAP2 26 // Linux value
#endif
#ifndef HWCAP2_DCPODP
#define HWCAP2_DCPODP (1 << 0)
@@ -190,3 +190,19 @@
#ifndef HWCAP2_CSSC
#define HWCAP2_CSSC (1UL << 34)
#endif
+
+#ifndef AT_HWCAP3
+#ifdef __linux__
+#define AT_HWCAP3 29 // Linux value
+#else
+#define AT_HWCAP3 38 // BSD value
+#endif
+#endif
+
+#ifndef AT_HWCAP4
+#ifdef __linux__
+#define AT_HWCAP4 30 // Linux value
+#else
+#define AT_HWCAP4 39 // BSD value
+#endif
+#endif