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/TargetParser/AArch64TargetParser.h" 19 #include <optional> 20 21 namespace clang { 22 namespace targets { 23 24 enum AArch64AddrSpace { ptr32_sptr = 270, ptr32_uptr = 271, ptr64 = 272 }; 25 26 static const unsigned ARM64AddrSpaceMap[] = { 27 0, // Default 28 0, // opencl_global 29 0, // opencl_local 30 0, // opencl_constant 31 0, // opencl_private 32 0, // opencl_generic 33 0, // opencl_global_device 34 0, // opencl_global_host 35 0, // cuda_device 36 0, // cuda_constant 37 0, // cuda_shared 38 0, // sycl_global 39 0, // sycl_global_device 40 0, // sycl_global_host 41 0, // sycl_local 42 0, // sycl_private 43 static_cast<unsigned>(AArch64AddrSpace::ptr32_sptr), 44 static_cast<unsigned>(AArch64AddrSpace::ptr32_uptr), 45 static_cast<unsigned>(AArch64AddrSpace::ptr64), 46 0, // hlsl_groupshared 47 0, // hlsl_constant 48 // Wasm address space values for this target are dummy values, 49 // as it is only enabled for Wasm targets. 50 20, // wasm_funcref 51 }; 52 53 class LLVM_LIBRARY_VISIBILITY AArch64TargetInfo : public TargetInfo { 54 virtual void setDataLayout() = 0; 55 static const TargetInfo::GCCRegAlias GCCRegAliases[]; 56 static const char *const GCCRegNames[]; 57 58 enum FPUModeEnum { 59 FPUMode = (1 << 0), 60 NeonMode = (1 << 1), 61 SveMode = (1 << 2), 62 }; 63 64 unsigned FPU = FPUMode; 65 bool HasCRC = false; 66 bool HasAES = false; 67 bool HasSHA2 = false; 68 bool HasSHA3 = false; 69 bool HasSM4 = false; 70 bool HasFullFP16 = false; 71 bool HasDotProd = false; 72 bool HasFP16FML = false; 73 bool HasMTE = false; 74 bool HasTME = false; 75 bool HasPAuth = false; 76 bool HasLS64 = false; 77 bool HasRandGen = false; 78 bool HasMatMul = false; 79 bool HasBFloat16 = false; 80 bool HasSVE2 = false; 81 bool HasSVE2p1 = false; 82 bool HasSVEAES = false; 83 bool HasSVE2SHA3 = false; 84 bool HasSVE2SM4 = false; 85 bool HasSVEB16B16 = false; 86 bool HasSVEBitPerm = false; 87 bool HasMatmulFP64 = false; 88 bool HasMatmulFP32 = false; 89 bool HasLSE = false; 90 bool HasFlagM = false; 91 bool HasAlternativeNZCV = false; 92 bool HasMOPS = false; 93 bool HasD128 = false; 94 bool HasRCPC = false; 95 bool HasRDM = false; 96 bool HasDIT = false; 97 bool HasCCPP = false; 98 bool HasCCDP = false; 99 bool HasFRInt3264 = false; 100 bool HasSME = false; 101 bool HasSME2 = false; 102 bool HasSMEF64F64 = false; 103 bool HasSMEI16I64 = false; 104 bool HasSMEF16F16 = false; 105 bool HasSMEB16B16 = false; 106 bool HasSME2p1 = false; 107 bool HasSB = false; 108 bool HasPredRes = false; 109 bool HasSSBS = false; 110 bool HasBTI = false; 111 bool HasWFxT = false; 112 bool HasJSCVT = false; 113 bool HasFCMA = false; 114 bool HasNoFP = false; 115 bool HasNoNeon = false; 116 bool HasNoSVE = false; 117 bool HasFMV = true; 118 bool HasGCS = false; 119 bool HasRCPC3 = false; 120 bool HasSMEFA64 = false; 121 bool HasPAuthLR = false; 122 123 const llvm::AArch64::ArchInfo *ArchInfo = &llvm::AArch64::ARMV8A; 124 125 std::string ABI; 126 127 public: 128 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts); 129 130 StringRef getABI() const override; 131 bool setABI(const std::string &Name) override; 132 133 bool validateBranchProtection(StringRef Spec, StringRef Arch, 134 BranchProtectionInfo &BPI, 135 StringRef &Err) const override; 136 137 bool isValidCPUName(StringRef Name) const override; 138 void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const override; 139 bool setCPU(const std::string &Name) override; 140 141 uint64_t getFMVPriority(ArrayRef<StringRef> Features) const override; 142 143 bool useFP16ConversionIntrinsics() const override { 144 return false; 145 } 146 147 void setArchFeatures(); 148 149 void getTargetDefinesARMV81A(const LangOptions &Opts, 150 MacroBuilder &Builder) const; 151 void getTargetDefinesARMV82A(const LangOptions &Opts, 152 MacroBuilder &Builder) const; 153 void getTargetDefinesARMV83A(const LangOptions &Opts, 154 MacroBuilder &Builder) const; 155 void getTargetDefinesARMV84A(const LangOptions &Opts, 156 MacroBuilder &Builder) const; 157 void getTargetDefinesARMV85A(const LangOptions &Opts, 158 MacroBuilder &Builder) const; 159 void getTargetDefinesARMV86A(const LangOptions &Opts, 160 MacroBuilder &Builder) const; 161 void getTargetDefinesARMV87A(const LangOptions &Opts, 162 MacroBuilder &Builder) const; 163 void getTargetDefinesARMV88A(const LangOptions &Opts, 164 MacroBuilder &Builder) const; 165 void getTargetDefinesARMV89A(const LangOptions &Opts, 166 MacroBuilder &Builder) const; 167 void getTargetDefinesARMV9A(const LangOptions &Opts, 168 MacroBuilder &Builder) const; 169 void getTargetDefinesARMV91A(const LangOptions &Opts, 170 MacroBuilder &Builder) const; 171 void getTargetDefinesARMV92A(const LangOptions &Opts, 172 MacroBuilder &Builder) const; 173 void getTargetDefinesARMV93A(const LangOptions &Opts, 174 MacroBuilder &Builder) const; 175 void getTargetDefinesARMV94A(const LangOptions &Opts, 176 MacroBuilder &Builder) const; 177 void getTargetDefinesARMV95A(const LangOptions &Opts, 178 MacroBuilder &Builder) const; 179 void getTargetDefinesARMV96A(const LangOptions &Opts, 180 MacroBuilder &Builder) const; 181 void getTargetDefines(const LangOptions &Opts, 182 MacroBuilder &Builder) const override; 183 184 ArrayRef<Builtin::Info> getTargetBuiltins() const override; 185 186 std::optional<std::pair<unsigned, unsigned>> 187 getVScaleRange(const LangOptions &LangOpts) const override; 188 bool doesFeatureAffectCodeGen(StringRef Name) const override; 189 bool validateCpuSupports(StringRef FeatureStr) const override; 190 bool hasFeature(StringRef Feature) const override; 191 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name, 192 bool Enabled) const override; 193 bool handleTargetFeatures(std::vector<std::string> &Features, 194 DiagnosticsEngine &Diags) override; 195 ParsedTargetAttr parseTargetAttr(StringRef Str) const override; 196 bool supportsTargetAttributeTune() const override { return true; } 197 bool supportsCpuSupports() const override { return true; } 198 bool checkArithmeticFenceSupported() const override { return true; } 199 200 bool hasBFloat16Type() const override; 201 202 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override; 203 204 bool isCLZForZeroUndef() const override; 205 206 BuiltinVaListKind getBuiltinVaListKind() const override; 207 208 ArrayRef<const char *> getGCCRegNames() const override; 209 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override; 210 211 std::string convertConstraint(const char *&Constraint) const override; 212 213 bool validateAsmConstraint(const char *&Name, 214 TargetInfo::ConstraintInfo &Info) const override; 215 bool 216 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size, 217 std::string &SuggestedModifier) const override; 218 std::string_view getClobbers() const override; 219 220 StringRef getConstraintRegister(StringRef Constraint, 221 StringRef Expression) const override { 222 return Expression; 223 } 224 225 int getEHDataRegisterNumber(unsigned RegNo) const override; 226 227 bool validatePointerAuthKey(const llvm::APSInt &value) const override; 228 229 const char *getBFloat16Mangling() const override { return "u6__bf16"; }; 230 bool hasInt128Type() const override; 231 232 bool hasBitIntType() const override { return true; } 233 234 bool validateTarget(DiagnosticsEngine &Diags) const override; 235 236 bool validateGlobalRegisterVariable(StringRef RegName, unsigned RegSize, 237 bool &HasSizeMismatch) const override; 238 239 uint64_t getPointerWidthV(LangAS AddrSpace) const override { 240 if (AddrSpace == LangAS::ptr32_sptr || AddrSpace == LangAS::ptr32_uptr) 241 return 32; 242 if (AddrSpace == LangAS::ptr64) 243 return 64; 244 return PointerWidth; 245 } 246 247 uint64_t getPointerAlignV(LangAS AddrSpace) const override { 248 return getPointerWidthV(AddrSpace); 249 } 250 }; 251 252 class LLVM_LIBRARY_VISIBILITY AArch64leTargetInfo : public AArch64TargetInfo { 253 public: 254 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts); 255 256 void getTargetDefines(const LangOptions &Opts, 257 MacroBuilder &Builder) const override; 258 private: 259 void setDataLayout() override; 260 }; 261 262 class LLVM_LIBRARY_VISIBILITY WindowsARM64TargetInfo 263 : public WindowsTargetInfo<AArch64leTargetInfo> { 264 const llvm::Triple Triple; 265 266 public: 267 WindowsARM64TargetInfo(const llvm::Triple &Triple, 268 const TargetOptions &Opts); 269 270 void setDataLayout() override; 271 272 BuiltinVaListKind getBuiltinVaListKind() const override; 273 274 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override; 275 }; 276 277 // Windows ARM, MS (C++) ABI 278 class LLVM_LIBRARY_VISIBILITY MicrosoftARM64TargetInfo 279 : public WindowsARM64TargetInfo { 280 public: 281 MicrosoftARM64TargetInfo(const llvm::Triple &Triple, 282 const TargetOptions &Opts); 283 284 void getTargetDefines(const LangOptions &Opts, 285 MacroBuilder &Builder) const override; 286 TargetInfo::CallingConvKind 287 getCallingConvKind(bool ClangABICompat4) const override; 288 289 unsigned getMinGlobalAlign(uint64_t TypeSize, 290 bool HasNonWeakDef) const override; 291 }; 292 293 // ARM64 MinGW target 294 class LLVM_LIBRARY_VISIBILITY MinGWARM64TargetInfo 295 : public WindowsARM64TargetInfo { 296 public: 297 MinGWARM64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts); 298 }; 299 300 class LLVM_LIBRARY_VISIBILITY AArch64beTargetInfo : public AArch64TargetInfo { 301 public: 302 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts); 303 void getTargetDefines(const LangOptions &Opts, 304 MacroBuilder &Builder) const override; 305 306 private: 307 void setDataLayout() override; 308 }; 309 310 void getAppleMachOAArch64Defines(MacroBuilder &Builder, const LangOptions &Opts, 311 const llvm::Triple &Triple); 312 313 class LLVM_LIBRARY_VISIBILITY AppleMachOAArch64TargetInfo 314 : public AppleMachOTargetInfo<AArch64leTargetInfo> { 315 public: 316 AppleMachOAArch64TargetInfo(const llvm::Triple &Triple, 317 const TargetOptions &Opts); 318 319 protected: 320 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 321 MacroBuilder &Builder) const override; 322 }; 323 324 class LLVM_LIBRARY_VISIBILITY DarwinAArch64TargetInfo 325 : public DarwinTargetInfo<AArch64leTargetInfo> { 326 public: 327 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts); 328 329 BuiltinVaListKind getBuiltinVaListKind() const override; 330 331 protected: 332 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 333 MacroBuilder &Builder) const override; 334 }; 335 336 } // namespace targets 337 } // namespace clang 338 339 #endif // LLVM_CLANG_LIB_BASIC_TARGETS_AARCH64_H 340