[compiler-rt] [FMV][AArch64] Add initial AT_HWCAP3 / AT_HWCAP4 support (PR #161595)

Brad Smith via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 2 15:11:53 PDT 2025


https://github.com/brad0 updated https://github.com/llvm/llvm-project/pull/161595

>From a995ba224ab4706a776edd0892a776e9671bdec6 Mon Sep 17 00:00:00 2001
From: Brad Smith <brad at comstyle.com>
Date: Wed, 1 Oct 2025 17:50:53 -0400
Subject: [PATCH] [FMV][AArch64] Add initial AT_HWCAP3 / AT_HWCAP4 support

Add support for AT_HWCAP3 / AT_HWCAP4 which is supported by glibc, musl,
Android and FreeBSD 15/-current.

Stop using sys/ifunc.h as libgcc has done. This is more portable as
older glibc will not have the hwcap3/4 fields.
---
 compiler-rt/lib/builtins/cpu_model/aarch64.c     |  6 ++----
 .../builtins/cpu_model/aarch64/fmv/android.inc   |  4 ++++
 .../cpu_model/aarch64/fmv/elf_aux_info.inc       | 14 +++++++-------
 .../builtins/cpu_model/aarch64/fmv/getauxval.inc |  4 ++++
 .../lib/builtins/cpu_model/aarch64/hwcap.inc     | 16 ++++++++++++++++
 5 files changed, 33 insertions(+), 11 deletions(-)

diff --git a/compiler-rt/lib/builtins/cpu_model/aarch64.c b/compiler-rt/lib/builtins/cpu_model/aarch64.c
index d7880529ebe70..ca487cbcc3817 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 a9e3594e93c2d..d19beca690580 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 aa975dc854f97..1ada7b69de268 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 486f77a1e4d2f..6c52c5311bc53 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 2f44e9e5f635e..7350c71ea9e05 100644
--- a/compiler-rt/lib/builtins/cpu_model/aarch64/hwcap.inc
+++ b/compiler-rt/lib/builtins/cpu_model/aarch64/hwcap.inc
@@ -190,3 +190,19 @@
 #ifndef HWCAP2_CSSC
 #define HWCAP2_CSSC (1UL << 34)
 #endif
+
+#ifndef AT_HWCAP3
+#ifdef __linux__
+#define AT_HWCAP3 29
+#else
+#define AT_HWCAP3 38
+#endif
+#endif
+
+#ifndef AT_HWCAP4
+#ifdef __linux__
+#define AT_HWCAP4 30
+#else
+#define AT_HWCAP4 39
+#endif
+#endif



More information about the llvm-commits mailing list