xref: /freebsd-src/contrib/llvm-project/compiler-rt/lib/builtins/cpu_model/aarch64.c (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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