Home | History | Annotate | Line # | Download | only in Targets
AArch64.h revision 1.1.1.2
      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-exception
      6 //
      7 //===----------------------------------------------------------------------===//
      8 //
      9 // This file declares AArch64 TargetInfo objects.
     10 //
     11 //===----------------------------------------------------------------------===//
     12 
     13 #ifndef LLVM_CLANG_LIB_BASIC_TARGETS_AARCH64_H
     14 #define LLVM_CLANG_LIB_BASIC_TARGETS_AARCH64_H
     15 
     16 #include "OSTargets.h"
     17 #include "clang/Basic/TargetBuiltins.h"
     18 #include "llvm/Support/TargetParser.h"
     19 
     20 namespace clang {
     21 namespace targets {
     22 
     23 class LLVM_LIBRARY_VISIBILITY AArch64TargetInfo : public TargetInfo {
     24   virtual void setDataLayout() = 0;
     25   static const TargetInfo::GCCRegAlias GCCRegAliases[];
     26   static const char *const GCCRegNames[];
     27 
     28   enum FPUModeEnum { FPUMode, NeonMode = (1 << 0), SveMode = (1 << 1) };
     29 
     30   unsigned FPU;
     31   bool HasCRC;
     32   bool HasCrypto;
     33   bool HasAES;
     34   bool HasSHA2;
     35   bool HasSHA3;
     36   bool HasSM4;
     37   bool HasUnaligned;
     38   bool HasFullFP16;
     39   bool HasDotProd;
     40   bool HasFP16FML;
     41   bool HasMTE;
     42   bool HasTME;
     43   bool HasPAuth;
     44   bool HasLS64;
     45   bool HasRandGen;
     46   bool HasMatMul;
     47   bool HasSVE2;
     48   bool HasSVE2AES;
     49   bool HasSVE2SHA3;
     50   bool HasSVE2SM4;
     51   bool HasSVE2BitPerm;
     52   bool HasMatmulFP64;
     53   bool HasMatmulFP32;
     54   bool HasLSE;
     55   bool HasFlagM;
     56 
     57   llvm::AArch64::ArchKind ArchKind;
     58 
     59   static const Builtin::Info BuiltinInfo[];
     60 
     61   std::string ABI;
     62 
     63 public:
     64   AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
     65 
     66   StringRef getABI() const override;
     67   bool setABI(const std::string &Name) override;
     68 
     69   bool validateBranchProtection(StringRef, BranchProtectionInfo &,
     70                                 StringRef &) const override;
     71 
     72   bool isValidCPUName(StringRef Name) const override;
     73   void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const override;
     74   bool setCPU(const std::string &Name) override;
     75 
     76   bool useFP16ConversionIntrinsics() const override {
     77     return false;
     78   }
     79 
     80   void getTargetDefinesARMV81A(const LangOptions &Opts,
     81                                MacroBuilder &Builder) const;
     82   void getTargetDefinesARMV82A(const LangOptions &Opts,
     83                                MacroBuilder &Builder) const;
     84   void getTargetDefinesARMV83A(const LangOptions &Opts,
     85                                MacroBuilder &Builder) const;
     86   void getTargetDefinesARMV84A(const LangOptions &Opts,
     87                                MacroBuilder &Builder) const;
     88   void getTargetDefinesARMV85A(const LangOptions &Opts,
     89                                MacroBuilder &Builder) const;
     90   void getTargetDefinesARMV86A(const LangOptions &Opts,
     91                                MacroBuilder &Builder) const;
     92   void getTargetDefinesARMV87A(const LangOptions &Opts,
     93                                MacroBuilder &Builder) const;
     94   void getTargetDefines(const LangOptions &Opts,
     95                         MacroBuilder &Builder) const override;
     96 
     97   ArrayRef<Builtin::Info> getTargetBuiltins() const override;
     98 
     99   bool hasFeature(StringRef Feature) const override;
    100   bool handleTargetFeatures(std::vector<std::string> &Features,
    101                             DiagnosticsEngine &Diags) override;
    102 
    103   CallingConvCheckResult checkCallingConvention(CallingConv CC) const override;
    104 
    105   bool isCLZForZeroUndef() const override;
    106 
    107   BuiltinVaListKind getBuiltinVaListKind() const override;
    108 
    109   ArrayRef<const char *> getGCCRegNames() const override;
    110   ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
    111 
    112   std::string convertConstraint(const char *&Constraint) const override {
    113     std::string R;
    114     switch (*Constraint) {
    115     case 'U': // Three-character constraint; add "@3" hint for later parsing.
    116       R = std::string("@3") + std::string(Constraint, 3);
    117       Constraint += 2;
    118       break;
    119     default:
    120       R = TargetInfo::convertConstraint(Constraint);
    121       break;
    122     }
    123     return R;
    124   }
    125 
    126   bool validateAsmConstraint(const char *&Name,
    127                              TargetInfo::ConstraintInfo &Info) const override;
    128   bool
    129   validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
    130                              std::string &SuggestedModifier) const override;
    131   const char *getClobbers() const override;
    132 
    133   StringRef getConstraintRegister(StringRef Constraint,
    134                                   StringRef Expression) const override {
    135     return Expression;
    136   }
    137 
    138   int getEHDataRegisterNumber(unsigned RegNo) const override;
    139 
    140   const char *getBFloat16Mangling() const override { return "u6__bf16"; };
    141   bool hasInt128Type() const override;
    142 
    143   bool hasExtIntType() const override { return true; }
    144 };
    145 
    146 class LLVM_LIBRARY_VISIBILITY AArch64leTargetInfo : public AArch64TargetInfo {
    147 public:
    148   AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
    149 
    150   void getTargetDefines(const LangOptions &Opts,
    151                             MacroBuilder &Builder) const override;
    152 private:
    153   void setDataLayout() override;
    154 };
    155 
    156 class LLVM_LIBRARY_VISIBILITY WindowsARM64TargetInfo
    157     : public WindowsTargetInfo<AArch64leTargetInfo> {
    158   const llvm::Triple Triple;
    159 
    160 public:
    161   WindowsARM64TargetInfo(const llvm::Triple &Triple,
    162                          const TargetOptions &Opts);
    163 
    164   void setDataLayout() override;
    165 
    166   BuiltinVaListKind getBuiltinVaListKind() const override;
    167 
    168   CallingConvCheckResult checkCallingConvention(CallingConv CC) const override;
    169 };
    170 
    171 // Windows ARM, MS (C++) ABI
    172 class LLVM_LIBRARY_VISIBILITY MicrosoftARM64TargetInfo
    173     : public WindowsARM64TargetInfo {
    174 public:
    175   MicrosoftARM64TargetInfo(const llvm::Triple &Triple,
    176                            const TargetOptions &Opts);
    177 
    178   void getTargetDefines(const LangOptions &Opts,
    179                         MacroBuilder &Builder) const override;
    180   TargetInfo::CallingConvKind
    181   getCallingConvKind(bool ClangABICompat4) const override;
    182 
    183   unsigned getMinGlobalAlign(uint64_t TypeSize) const override;
    184 };
    185 
    186 // ARM64 MinGW target
    187 class LLVM_LIBRARY_VISIBILITY MinGWARM64TargetInfo
    188     : public WindowsARM64TargetInfo {
    189 public:
    190   MinGWARM64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
    191 };
    192 
    193 class LLVM_LIBRARY_VISIBILITY AArch64beTargetInfo : public AArch64TargetInfo {
    194 public:
    195   AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
    196   void getTargetDefines(const LangOptions &Opts,
    197                         MacroBuilder &Builder) const override;
    198 
    199 private:
    200   void setDataLayout() override;
    201 };
    202 
    203 class LLVM_LIBRARY_VISIBILITY DarwinAArch64TargetInfo
    204     : public DarwinTargetInfo<AArch64leTargetInfo> {
    205 public:
    206   DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
    207 
    208   BuiltinVaListKind getBuiltinVaListKind() const override;
    209 
    210  protected:
    211   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
    212                     MacroBuilder &Builder) const override;
    213 };
    214 
    215 // 64-bit RenderScript is aarch64
    216 class LLVM_LIBRARY_VISIBILITY RenderScript64TargetInfo
    217     : public AArch64leTargetInfo {
    218 public:
    219   RenderScript64TargetInfo(const llvm::Triple &Triple,
    220                            const TargetOptions &Opts);
    221 
    222   void getTargetDefines(const LangOptions &Opts,
    223                         MacroBuilder &Builder) const override;
    224 };
    225 
    226 } // namespace targets
    227 } // namespace clang
    228 
    229 #endif // LLVM_CLANG_LIB_BASIC_TARGETS_AARCH64_H
    230