[compiler-rt] [builtins] Fix CPU feature detection for Zircon (PR #76276)

Petr Hosek via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 22 20:55:47 PST 2023


https://github.com/petrhosek created https://github.com/llvm/llvm-project/pull/76276

This is a follow up to #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.

>From cc47139e8e6cca0ef7fa59e3135118a4c858f451 Mon Sep 17 00:00:00 2001
From: Petr Hosek <phosek at google.com>
Date: Sat, 23 Dec 2023 04:48:39 +0000
Subject: [PATCH] [builtins] Fix CPU feature detection for Zircon

This is a follow up to #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.
---
 .../cpu_model/aarch64/fmv/fuchsia.inc         | 46 +++++++++++++------
 1 file changed, 31 insertions(+), 15 deletions(-)

diff --git a/compiler-rt/lib/builtins/cpu_model/aarch64/fmv/fuchsia.inc b/compiler-rt/lib/builtins/cpu_model/aarch64/fmv/fuchsia.inc
index 4dab6ff58b3782..7c3beaf3f36446 100644
--- a/compiler-rt/lib/builtins/cpu_model/aarch64/fmv/fuchsia.inc
+++ b/compiler-rt/lib/builtins/cpu_model/aarch64/fmv/fuchsia.inc
@@ -1,22 +1,38 @@
-void __init_cpu_features_resolver(unsigned long hwcap,
-                                  const __ifunc_arg_t *arg) {
+#include <zircon/features.h>
+#include <zircon/syscalls.h>
+
+void __init_cpu_features_resolver() {
   if (__aarch64_cpu_features.features)
     return;
 
-  __init_cpu_features_constructor(hwcap, arg);
-}
-
-void CONSTRUCTOR_ATTRIBUTE __init_cpu_features(void) {
-  // CPU features already initialized.
-  if (__aarch64_cpu_features.features)
+  // This ensures the vDSO is a direct link-time dependency of anything that
+  // needs this initializer code.
+#pragma comment(lib, "zircon")
+  uint32_t features;
+  zx_status_t status = _zx_system_get_features(ZX_FEATURE_KIND_CPU, &features);
+  if (status != ZX_OK)
     return;
 
-  unsigned long hwcap = getauxval(AT_HWCAP);
-  unsigned long hwcap2 = getauxval(AT_HWCAP2);
+#define setCPUFeature(cpu_feature) \
+  __aarch64_cpu_features.features |= 1ULL << cpu_feature
+#define checkCPUFeature(zx_feature, cpu_feature) \
+  if ((features & zx_feature) != 0) setCPUFeature(cpu_feature)
+
+  checkCPUFeature(ZX_ARM64_FEATURE_ISA_FP, FEAT_FP);
+  checkCPUFeature(ZX_ARM64_FEATURE_ISA_ASIMD, FEAT_SIMD);
+  checkCPUFeature(ZX_ARM64_FEATURE_ISA_AES, FEAT_AES);
+  checkCPUFeature(ZX_ARM64_FEATURE_ISA_PMULL, FEAT_PMULL);
+  checkCPUFeature(ZX_ARM64_FEATURE_ISA_SHA1, FEAT_SHA1);
+  checkCPUFeature(ZX_ARM64_FEATURE_ISA_SHA256, FEAT_SHA2);
+  checkCPUFeature(ZX_ARM64_FEATURE_ISA_CRC32, FEAT_CRC);
+  checkCPUFeature(ZX_ARM64_FEATURE_ISA_RDM, FEAT_RDM);
+  checkCPUFeature(ZX_ARM64_FEATURE_ISA_SHA3, FEAT_SHA3);
+  checkCPUFeature(ZX_ARM64_FEATURE_ISA_SM4, FEAT_SM4);
+  checkCPUFeature(ZX_ARM64_FEATURE_ISA_DP, FEAT_DOTPROD);
+  checkCPUFeature(ZX_ARM64_FEATURE_ISA_FHM, FEAT_FP16FML);
+  checkCPUFeature(ZX_ARM64_FEATURE_ISA_SHA512, FEAT_SHA3);
+  checkCPUFeature(ZX_ARM64_FEATURE_ISA_I8MM, FEAT_I8MM);
+  checkCPUFeature(ZX_ARM64_FEATURE_ISA_SVE, FEAT_SVE);
 
-  __ifunc_arg_t arg;
-  arg._size = sizeof(__ifunc_arg_t);
-  arg._hwcap = hwcap;
-  arg._hwcap2 = hwcap2;
-  __init_cpu_features_constructor(hwcap | _IFUNC_ARG_HWCAP, &arg);
+  setCPUFeature(FEAT_INIT);
 }



More information about the llvm-commits mailing list