// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception __attribute__((visibility("hidden"), nocommon)) _Bool __aarch64_has_sme_and_tpidr2_el0; // We have multiple ways to check that the function has SME, depending on our // target. // * For Linux we can use __getauxval(). // * For newlib we can use __aarch64_sme_accessible(). #if defined(__linux__) #ifndef AT_HWCAP2 #define AT_HWCAP2 26 #endif #ifndef HWCAP2_SME #define HWCAP2_SME (1 << 23) #endif extern unsigned long int __getauxval (unsigned long int); static _Bool has_sme(void) { return __getauxval(AT_HWCAP2) & HWCAP2_SME; } #else // defined(__linux__) #if defined(COMPILER_RT_SHARED_LIB) __attribute__((weak)) #endif extern _Bool __aarch64_sme_accessible(void); static _Bool has_sme(void) { #if defined(COMPILER_RT_SHARED_LIB) if (!__aarch64_sme_accessible) return 0; #endif return __aarch64_sme_accessible(); } #endif // defined(__linux__) #if __GNUC__ >= 9 #pragma GCC diagnostic ignored "-Wprio-ctor-dtor" #endif __attribute__((constructor(90))) static void init_aarch64_has_sme(void) { __aarch64_has_sme_and_tpidr2_el0 = has_sme(); }