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 
useFP16ConversionIntrinsics()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 
convertConstraint(const char * & Constraint)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 
getConstraintRegister(StringRef Constraint,StringRef Expression)133   StringRef getConstraintRegister(StringRef Constraint,
134                                   StringRef Expression) const override {
135     return Expression;
136   }
137 
138   int getEHDataRegisterNumber(unsigned RegNo) const override;
139 
getBFloat16Mangling()140   const char *getBFloat16Mangling() const override { return "u6__bf16"; };
141   bool hasInt128Type() const override;
142 
hasExtIntType()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