brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.4 KiB · 1a7aa65 Raw
370 lines · c
1//===--- AArch64.h - Declare AArch64 target feature support -----*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This file declares AArch64 TargetInfo objects.10//11//===----------------------------------------------------------------------===//12 13#ifndef LLVM_CLANG_LIB_BASIC_TARGETS_AARCH64_H14#define LLVM_CLANG_LIB_BASIC_TARGETS_AARCH64_H15 16#include "OSTargets.h"17#include "clang/Basic/TargetBuiltins.h"18#include "llvm/TargetParser/AArch64TargetParser.h"19#include <optional>20 21namespace clang {22namespace targets {23 24enum AArch64AddrSpace { ptr32_sptr = 270, ptr32_uptr = 271, ptr64 = 272 };25 26static const unsigned ARM64AddrSpaceMap[] = {27    0, // Default28    0, // opencl_global29    0, // opencl_local30    0, // opencl_constant31    0, // opencl_private32    0, // opencl_generic33    0, // opencl_global_device34    0, // opencl_global_host35    0, // cuda_device36    0, // cuda_constant37    0, // cuda_shared38    0, // sycl_global39    0, // sycl_global_device40    0, // sycl_global_host41    0, // sycl_local42    0, // sycl_private43    static_cast<unsigned>(AArch64AddrSpace::ptr32_sptr),44    static_cast<unsigned>(AArch64AddrSpace::ptr32_uptr),45    static_cast<unsigned>(AArch64AddrSpace::ptr64),46    0, // hlsl_groupshared47    0, // hlsl_constant48    0, // hlsl_private49    0, // hlsl_device50    0, // hlsl_input51    // Wasm address space values for this target are dummy values,52    // as it is only enabled for Wasm targets.53    20, // wasm_funcref54};55 56class LLVM_LIBRARY_VISIBILITY AArch64TargetInfo : public TargetInfo {57  virtual void setDataLayout() = 0;58  static const TargetInfo::GCCRegAlias GCCRegAliases[];59  static const char *const GCCRegNames[];60 61  enum FPUModeEnum {62    FPUMode = (1 << 0),63    NeonMode = (1 << 1),64    SveMode = (1 << 2),65  };66 67  unsigned FPU = FPUMode;68  bool HasCRC = false;69  bool HasCSSC = false;70  bool HasAES = false;71  bool HasSHA2 = false;72  bool HasSHA3 = false;73  bool HasSM4 = false;74  bool HasFullFP16 = false;75  bool HasDotProd = false;76  bool HasFP16FML = false;77  bool HasMTE = false;78  bool HasPAuth = false;79  bool HasLS64 = false;80  bool HasRandGen = false;81  bool HasMatMul = false;82  bool HasBFloat16 = false;83  bool HasSVE2 = false;84  bool HasSVE2p1 = false;85  bool HasSVEAES = false;86  bool HasSVE2SHA3 = false;87  bool HasSVE2SM4 = false;88  bool HasSVEB16B16 = false;89  bool HasSVEBitPerm = false;90  bool HasMatmulFP64 = false;91  bool HasMatmulFP32 = false;92  bool HasLSE = false;93  bool HasFlagM = false;94  bool HasAlternativeNZCV = false;95  bool HasMOPS = false;96  bool HasD128 = false;97  bool HasRCPC = false;98  bool HasRDM = false;99  bool HasDIT = false;100  bool HasCCPP = false;101  bool HasCCDP = false;102  bool HasFRInt3264 = false;103  bool HasSME = false;104  bool HasSME2 = false;105  bool HasSMEF64F64 = false;106  bool HasSMEI16I64 = false;107  bool HasSMEF16F16 = false;108  bool HasSMEB16B16 = false;109  bool HasSME2p1 = false;110  bool HasFP8 = false;111  bool HasFP8FMA = false;112  bool HasFP8DOT2 = false;113  bool HasFP8DOT4 = false;114  bool HasSSVE_FP8DOT2 = false;115  bool HasSSVE_FP8DOT4 = false;116  bool HasSSVE_FP8FMA = false;117  bool HasSME_F8F32 = false;118  bool HasSME_F8F16 = false;119  bool HasSB = false;120  bool HasPredRes = false;121  bool HasSSBS = false;122  bool HasBTI = false;123  bool HasWFxT = false;124  bool HasJSCVT = false;125  bool HasFCMA = false;126  bool HasNoFP = false;127  bool HasNoNeon = false;128  bool HasNoSVE = false;129  bool HasFMV = true;130  bool HasGCS = false;131  bool HasRCPC3 = false;132  bool HasSMEFA64 = false;133  bool HasPAuthLR = false;134 135  const llvm::AArch64::ArchInfo *ArchInfo = &llvm::AArch64::ARMV8A;136 137protected:138  std::string ABI;139 140public:141  AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);142 143  StringRef getABI() const override;144  bool setABI(const std::string &Name) override;145 146  bool validateBranchProtection(StringRef Spec, StringRef Arch,147                                BranchProtectionInfo &BPI,148                                const LangOptions &LO,149                                StringRef &Err) const override;150 151  bool isValidCPUName(StringRef Name) const override;152  void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const override;153  bool setCPU(const std::string &Name) override;154 155  llvm::APInt getFMVPriority(ArrayRef<StringRef> Features) const override;156 157  bool useFP16ConversionIntrinsics() const override {158    return false;159  }160 161  void getTargetDefinesARMV81A(const LangOptions &Opts,162                               MacroBuilder &Builder) const;163  void getTargetDefinesARMV82A(const LangOptions &Opts,164                               MacroBuilder &Builder) const;165  void getTargetDefinesARMV83A(const LangOptions &Opts,166                               MacroBuilder &Builder) const;167  void getTargetDefinesARMV84A(const LangOptions &Opts,168                               MacroBuilder &Builder) const;169  void getTargetDefinesARMV85A(const LangOptions &Opts,170                               MacroBuilder &Builder) const;171  void getTargetDefinesARMV86A(const LangOptions &Opts,172                               MacroBuilder &Builder) const;173  void getTargetDefinesARMV87A(const LangOptions &Opts,174                               MacroBuilder &Builder) const;175  void getTargetDefinesARMV88A(const LangOptions &Opts,176                               MacroBuilder &Builder) const;177  void getTargetDefinesARMV89A(const LangOptions &Opts,178                               MacroBuilder &Builder) const;179  void getTargetDefinesARMV9A(const LangOptions &Opts,180                              MacroBuilder &Builder) const;181  void getTargetDefinesARMV91A(const LangOptions &Opts,182                               MacroBuilder &Builder) const;183  void getTargetDefinesARMV92A(const LangOptions &Opts,184                               MacroBuilder &Builder) const;185  void getTargetDefinesARMV93A(const LangOptions &Opts,186                               MacroBuilder &Builder) const;187  void getTargetDefinesARMV94A(const LangOptions &Opts,188                               MacroBuilder &Builder) const;189  void getTargetDefinesARMV95A(const LangOptions &Opts,190                               MacroBuilder &Builder) const;191  void getTargetDefinesARMV96A(const LangOptions &Opts,192                               MacroBuilder &Builder) const;193  void getTargetDefinesARMV97A(const LangOptions &Opts,194                               MacroBuilder &Builder) const;195  void getTargetDefines(const LangOptions &Opts,196                        MacroBuilder &Builder) const override;197 198  llvm::SmallVector<Builtin::InfosShard> getTargetBuiltins() const override;199 200  std::optional<std::pair<unsigned, unsigned>>201  getVScaleRange(const LangOptions &LangOpts, ArmStreamingKind Mode,202                 llvm::StringMap<bool> *FeatureMap = nullptr) const override;203  bool doesFeatureAffectCodeGen(StringRef Name) const override;204  bool validateCpuSupports(StringRef FeatureStr) const override;205  bool hasFeature(StringRef Feature) const override;206  void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,207                         bool Enabled) const override;208  bool handleTargetFeatures(std::vector<std::string> &Features,209                            DiagnosticsEngine &Diags) override;210  ParsedTargetAttr parseTargetAttr(StringRef Str) const override;211  bool supportsTargetAttributeTune() const override { return true; }212  bool supportsCpuSupports() const override { return true; }213  bool checkArithmeticFenceSupported() const override { return true; }214 215  bool hasBFloat16Type() const override;216 217  CallingConvCheckResult checkCallingConvention(CallingConv CC) const override;218 219  bool isCLZForZeroUndef() const override;220 221  BuiltinVaListKind getBuiltinVaListKind() const override;222 223  ArrayRef<const char *> getGCCRegNames() const override;224  ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;225 226  std::string convertConstraint(const char *&Constraint) const override;227 228  bool validateAsmConstraint(const char *&Name,229                             TargetInfo::ConstraintInfo &Info) const override;230  bool231  validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,232                             std::string &SuggestedModifier) const override;233  std::string_view getClobbers() const override;234 235  StringRef getConstraintRegister(StringRef Constraint,236                                  StringRef Expression) const override {237    return Expression;238  }239 240  int getEHDataRegisterNumber(unsigned RegNo) const override;241 242  bool validatePointerAuthKey(const llvm::APSInt &value) const override;243 244  const char *getBFloat16Mangling() const override { return "u6__bf16"; };245 246  std::pair<unsigned, unsigned> hardwareInterferenceSizes() const override {247    return std::make_pair(256, 64);248  }249 250  bool hasInt128Type() const override;251 252  bool hasBitIntType() const override { return true; }253 254  bool validateTarget(DiagnosticsEngine &Diags) const override;255 256  bool validateGlobalRegisterVariable(StringRef RegName, unsigned RegSize,257                                      bool &HasSizeMismatch) const override;258 259  uint64_t getPointerWidthV(LangAS AddrSpace) const override {260    if (AddrSpace == LangAS::ptr32_sptr || AddrSpace == LangAS::ptr32_uptr)261      return 32;262    if (AddrSpace == LangAS::ptr64)263      return 64;264    return PointerWidth;265  }266 267  uint64_t getPointerAlignV(LangAS AddrSpace) const override {268    return getPointerWidthV(AddrSpace);269  }270};271 272class LLVM_LIBRARY_VISIBILITY AArch64leTargetInfo : public AArch64TargetInfo {273public:274  AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);275 276  void getTargetDefines(const LangOptions &Opts,277                            MacroBuilder &Builder) const override;278private:279  void setDataLayout() override;280};281 282template <>283inline bool284LinuxTargetInfo<AArch64leTargetInfo>::setABI(const std::string &Name) {285  if (Name == "pauthtest") {286    ABI = Name;287    return true;288  }289  return AArch64leTargetInfo::setABI(Name);290}291 292class LLVM_LIBRARY_VISIBILITY WindowsARM64TargetInfo293    : public WindowsTargetInfo<AArch64leTargetInfo> {294  const llvm::Triple Triple;295 296public:297  WindowsARM64TargetInfo(const llvm::Triple &Triple,298                         const TargetOptions &Opts);299 300  void setDataLayout() override;301 302  BuiltinVaListKind getBuiltinVaListKind() const override;303 304  CallingConvCheckResult checkCallingConvention(CallingConv CC) const override;305};306 307// Windows ARM, MS (C++) ABI308class LLVM_LIBRARY_VISIBILITY MicrosoftARM64TargetInfo309    : public WindowsARM64TargetInfo {310public:311  MicrosoftARM64TargetInfo(const llvm::Triple &Triple,312                           const TargetOptions &Opts);313 314  void getTargetDefines(const LangOptions &Opts,315                        MacroBuilder &Builder) const override;316  TargetInfo::CallingConvKind317  getCallingConvKind(bool ClangABICompat4) const override;318 319  unsigned getMinGlobalAlign(uint64_t TypeSize,320                             bool HasNonWeakDef) const override;321};322 323// ARM64 MinGW target324class LLVM_LIBRARY_VISIBILITY MinGWARM64TargetInfo325    : public WindowsARM64TargetInfo {326public:327  MinGWARM64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);328};329 330class LLVM_LIBRARY_VISIBILITY AArch64beTargetInfo : public AArch64TargetInfo {331public:332  AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);333  void getTargetDefines(const LangOptions &Opts,334                        MacroBuilder &Builder) const override;335 336private:337  void setDataLayout() override;338};339 340void getAppleMachOAArch64Defines(MacroBuilder &Builder, const LangOptions &Opts,341                                 const llvm::Triple &Triple);342 343class LLVM_LIBRARY_VISIBILITY AppleMachOAArch64TargetInfo344    : public AppleMachOTargetInfo<AArch64leTargetInfo> {345public:346  AppleMachOAArch64TargetInfo(const llvm::Triple &Triple,347                              const TargetOptions &Opts);348 349protected:350  void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,351                    MacroBuilder &Builder) const override;352};353 354class LLVM_LIBRARY_VISIBILITY DarwinAArch64TargetInfo355    : public DarwinTargetInfo<AArch64leTargetInfo> {356public:357  DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);358 359  BuiltinVaListKind getBuiltinVaListKind() const override;360 361 protected:362  void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,363                    MacroBuilder &Builder) const override;364};365 366} // namespace targets367} // namespace clang368 369#endif // LLVM_CLANG_LIB_BASIC_TARGETS_AARCH64_H370