1cb14a3feSDimitry Andric //===-- cpu_model/aarch64.c - Support for __cpu_model builtin ----*- C -*-===// 2cb14a3feSDimitry Andric // 3cb14a3feSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4cb14a3feSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5cb14a3feSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6cb14a3feSDimitry Andric // 7cb14a3feSDimitry Andric //===----------------------------------------------------------------------===// 8cb14a3feSDimitry Andric // 9cb14a3feSDimitry Andric // This file is based on LLVM's lib/Support/Host.cpp. 10cb14a3feSDimitry Andric // It implements __aarch64_have_lse_atomics, __aarch64_cpu_features for 11cb14a3feSDimitry Andric // AArch64. 12cb14a3feSDimitry Andric // 13cb14a3feSDimitry Andric //===----------------------------------------------------------------------===// 14cb14a3feSDimitry Andric 15*0fca6ea1SDimitry Andric #include "aarch64.h" 16cb14a3feSDimitry Andric 17cb14a3feSDimitry Andric #if !defined(__aarch64__) 18cb14a3feSDimitry Andric #error This file is intended only for aarch64-based targets 19cb14a3feSDimitry Andric #endif 20cb14a3feSDimitry Andric 21cb14a3feSDimitry Andric #if __has_include(<sys/ifunc.h>) 22cb14a3feSDimitry Andric #include <sys/ifunc.h> 23cb14a3feSDimitry Andric #else 24cb14a3feSDimitry Andric typedef struct __ifunc_arg_t { 25cb14a3feSDimitry Andric unsigned long _size; 26cb14a3feSDimitry Andric unsigned long _hwcap; 27cb14a3feSDimitry Andric unsigned long _hwcap2; 28cb14a3feSDimitry Andric } __ifunc_arg_t; 29cb14a3feSDimitry Andric #endif // __has_include(<sys/ifunc.h>) 30cb14a3feSDimitry Andric 31cb14a3feSDimitry Andric // LSE support detection for out-of-line atomics 32cb14a3feSDimitry Andric // using HWCAP and Auxiliary vector 33cb14a3feSDimitry Andric _Bool __aarch64_have_lse_atomics 34cb14a3feSDimitry Andric __attribute__((visibility("hidden"), nocommon)) = false; 35cb14a3feSDimitry Andric 36cb14a3feSDimitry Andric #if defined(__FreeBSD__) 37cb14a3feSDimitry Andric // clang-format off: should not reorder sys/auxv.h alphabetically 38cb14a3feSDimitry Andric #include <sys/auxv.h> 39cb14a3feSDimitry Andric // clang-format on 40cb14a3feSDimitry Andric #include "aarch64/hwcap.inc" 41cb14a3feSDimitry Andric #include "aarch64/lse_atomics/freebsd.inc" 42cb14a3feSDimitry Andric #elif defined(__Fuchsia__) 43cb14a3feSDimitry Andric #include "aarch64/hwcap.inc" 44cb14a3feSDimitry Andric #include "aarch64/lse_atomics/fuchsia.inc" 45cb14a3feSDimitry Andric #elif defined(__ANDROID__) 46cb14a3feSDimitry Andric #include "aarch64/hwcap.inc" 47cb14a3feSDimitry Andric #include "aarch64/lse_atomics/android.inc" 48cb14a3feSDimitry Andric #elif __has_include(<sys/auxv.h>) 49cb14a3feSDimitry Andric #include "aarch64/hwcap.inc" 50cb14a3feSDimitry Andric #include "aarch64/lse_atomics/sysauxv.inc" 51cb14a3feSDimitry Andric #else 52cb14a3feSDimitry Andric // When unimplemented, we leave __aarch64_have_lse_atomics initialized to false. 53cb14a3feSDimitry Andric #endif 54cb14a3feSDimitry Andric 55cb14a3feSDimitry Andric #if !defined(DISABLE_AARCH64_FMV) 56cb14a3feSDimitry Andric 57cb14a3feSDimitry Andric // Architecture features used 58cb14a3feSDimitry Andric // in Function Multi Versioning 59cb14a3feSDimitry Andric struct { 60cb14a3feSDimitry Andric unsigned long long features; 61cb14a3feSDimitry Andric // As features grows new fields could be added 62cb14a3feSDimitry Andric } __aarch64_cpu_features __attribute__((visibility("hidden"), nocommon)); 63cb14a3feSDimitry Andric 64cb14a3feSDimitry Andric // The formatter wants to re-order these includes, but doing so is incorrect: 65cb14a3feSDimitry Andric // clang-format off 66cb14a3feSDimitry Andric #if defined(__APPLE__) 67cb14a3feSDimitry Andric #include "aarch64/fmv/apple.inc" 68cb14a3feSDimitry Andric #elif defined(__FreeBSD__) 69cb14a3feSDimitry Andric #include "aarch64/fmv/mrs.inc" 70cb14a3feSDimitry Andric #include "aarch64/fmv/freebsd.inc" 71cb14a3feSDimitry Andric #elif defined(__Fuchsia__) 72cb14a3feSDimitry Andric #include "aarch64/fmv/fuchsia.inc" 73cb14a3feSDimitry Andric #elif defined(__ANDROID__) 74cb14a3feSDimitry Andric #include "aarch64/fmv/mrs.inc" 75cb14a3feSDimitry Andric #include "aarch64/fmv/android.inc" 76cb14a3feSDimitry Andric #elif __has_include(<sys/auxv.h>) 77cb14a3feSDimitry Andric #include "aarch64/fmv/mrs.inc" 78cb14a3feSDimitry Andric #include "aarch64/fmv/sysauxv.inc" 79cb14a3feSDimitry Andric #else 80cb14a3feSDimitry Andric #include "aarch64/fmv/unimplemented.inc" 81cb14a3feSDimitry Andric #endif 82cb14a3feSDimitry Andric // clang-format on 83cb14a3feSDimitry Andric 84cb14a3feSDimitry Andric #endif // !defined(DISABLE_AARCH64_FMV) 85