Path: blob/main/contrib/llvm-project/compiler-rt/lib/builtins/cpu_model/aarch64.c
35291 views
//===-- cpu_model/aarch64.c - Support for __cpu_model builtin ----*- C -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file is based on LLVM's lib/Support/Host.cpp.9// It implements __aarch64_have_lse_atomics, __aarch64_cpu_features for10// AArch64.11//12//===----------------------------------------------------------------------===//1314#include "aarch64.h"1516#if !defined(__aarch64__)17#error This file is intended only for aarch64-based targets18#endif1920#if __has_include(<sys/ifunc.h>)21#include <sys/ifunc.h>22#else23typedef struct __ifunc_arg_t {24unsigned long _size;25unsigned long _hwcap;26unsigned long _hwcap2;27} __ifunc_arg_t;28#endif // __has_include(<sys/ifunc.h>)2930// LSE support detection for out-of-line atomics31// using HWCAP and Auxiliary vector32_Bool __aarch64_have_lse_atomics33__attribute__((visibility("hidden"), nocommon)) = false;3435#if defined(__FreeBSD__)36// clang-format off: should not reorder sys/auxv.h alphabetically37#include <sys/auxv.h>38// clang-format on39#include "aarch64/hwcap.inc"40#include "aarch64/lse_atomics/freebsd.inc"41#elif defined(__Fuchsia__)42#include "aarch64/hwcap.inc"43#include "aarch64/lse_atomics/fuchsia.inc"44#elif defined(__ANDROID__)45#include "aarch64/hwcap.inc"46#include "aarch64/lse_atomics/android.inc"47#elif __has_include(<sys/auxv.h>)48#include "aarch64/hwcap.inc"49#include "aarch64/lse_atomics/sysauxv.inc"50#else51// When unimplemented, we leave __aarch64_have_lse_atomics initialized to false.52#endif5354#if !defined(DISABLE_AARCH64_FMV)5556// Architecture features used57// in Function Multi Versioning58struct {59unsigned long long features;60// As features grows new fields could be added61} __aarch64_cpu_features __attribute__((visibility("hidden"), nocommon));6263// The formatter wants to re-order these includes, but doing so is incorrect:64// clang-format off65#if defined(__APPLE__)66#include "aarch64/fmv/apple.inc"67#elif defined(__FreeBSD__)68#include "aarch64/fmv/mrs.inc"69#include "aarch64/fmv/freebsd.inc"70#elif defined(__Fuchsia__)71#include "aarch64/fmv/fuchsia.inc"72#elif defined(__ANDROID__)73#include "aarch64/fmv/mrs.inc"74#include "aarch64/fmv/android.inc"75#elif __has_include(<sys/auxv.h>)76#include "aarch64/fmv/mrs.inc"77#include "aarch64/fmv/sysauxv.inc"78#else79#include "aarch64/fmv/unimplemented.inc"80#endif81// clang-format on8283#endif // !defined(DISABLE_AARCH64_FMV)848586