Skip to content

Commit b2868be

Browse files
committed
[builtins] Fix CPU feature detection for Zircon
This is a follow up to llvm#75635 which broke the build on Fuchsia. We don't support ifunc on Fuchsia so we shouldn't define __init_cpu_features. For __init_cpu_features_resolver we have to use _zx_system_get_features as a Zircon native solution.
1 parent 63c3148 commit b2868be

File tree

2 files changed

+44
-16
lines changed

2 files changed

+44
-16
lines changed

compiler-rt/lib/builtins/cpu_model/aarch64.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,6 @@ struct {
133133
#include "aarch64/fmv/mrs.inc"
134134
#include "aarch64/fmv/freebsd.inc"
135135
#elif defined(__Fuchsia__)
136-
#include "aarch64/fmv/mrs.inc"
137136
#include "aarch64/fmv/fuchsia.inc"
138137
#elif defined(__ANDROID__)
139138
#include "aarch64/fmv/mrs.inc"
Lines changed: 44 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,51 @@
1-
void __init_cpu_features_resolver(unsigned long hwcap,
2-
const __ifunc_arg_t *arg) {
1+
#include <zircon/features.h>
2+
#include <zircon/syscalls.h>
3+
4+
void __init_cpu_features_resolver() {
35
if (__aarch64_cpu_features.features)
46
return;
57

6-
__init_cpu_features_constructor(hwcap, arg);
7-
}
8-
9-
void CONSTRUCTOR_ATTRIBUTE __init_cpu_features(void) {
10-
// CPU features already initialized.
11-
if (__aarch64_cpu_features.features)
8+
// This ensures the vDSO is a direct link-time dependency of anything that
9+
// needs this initializer code.
10+
#pragma comment(lib, "zircon")
11+
uint32_t features;
12+
zx_status_t status = _zx_system_get_features(ZX_FEATURE_KIND_CPU, &features);
13+
if (status != ZX_OK)
1214
return;
1315

14-
unsigned long hwcap = getauxval(AT_HWCAP);
15-
unsigned long hwcap2 = getauxval(AT_HWCAP2);
16+
#define setCPUFeature(cpu_feature) \
17+
__aarch64_cpu_features.features |= 1ULL << cpu_feature
18+
19+
if (features & ZX_ARM64_FEATURE_ISA_FP)
20+
setCPUFeature(FEAT_FP);
21+
if (features & ZX_ARM64_FEATURE_ISA_ASIMD)
22+
setCPUFeature(FEAT_SIMD);
23+
if (features & ZX_ARM64_FEATURE_ISA_AES)
24+
setCPUFeature(FEAT_AES);
25+
if (features & ZX_ARM64_FEATURE_ISA_PMULL)
26+
setCPUFeature(FEAT_PMULL);
27+
if (features & ZX_ARM64_FEATURE_ISA_SHA1)
28+
setCPUFeature(FEAT_SHA1);
29+
if (features & ZX_ARM64_FEATURE_ISA_SHA256)
30+
setCPUFeature(FEAT_SHA2);
31+
if (features & ZX_ARM64_FEATURE_ISA_CRC32)
32+
setCPUFeature(FEAT_CRC);
33+
if (features & ZX_ARM64_FEATURE_ISA_RDM)
34+
setCPUFeature(FEAT_RDM);
35+
if (features & ZX_ARM64_FEATURE_ISA_SHA3)
36+
setCPUFeature(FEAT_SHA3);
37+
if (features & ZX_ARM64_FEATURE_ISA_SM4)
38+
setCPUFeature(FEAT_SM4);
39+
if (features & ZX_ARM64_FEATURE_ISA_DP)
40+
setCPUFeature(FEAT_DOTPROD);
41+
if (features & ZX_ARM64_FEATURE_ISA_FHM)
42+
setCPUFeature(FEAT_FP16FML);
43+
if (features & ZX_ARM64_FEATURE_ISA_SHA512)
44+
setCPUFeature(FEAT_SHA3);
45+
if (features & ZX_ARM64_FEATURE_ISA_I8MM)
46+
setCPUFeature(FEAT_I8MM);
47+
if (features & ZX_ARM64_FEATURE_ISA_SVE)
48+
setCPUFeature(FEAT_SVE);
1649

17-
__ifunc_arg_t arg;
18-
arg._size = sizeof(__ifunc_arg_t);
19-
arg._hwcap = hwcap;
20-
arg._hwcap2 = hwcap2;
21-
__init_cpu_features_constructor(hwcap | _IFUNC_ARG_HWCAP, &arg);
50+
setCPUFeature(FEAT_INIT);
2251
}

0 commit comments

Comments
 (0)