1 //===--- TargetInfo.h - Expose information about the target -----*- 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 /// \file 10 /// Defines the clang::TargetInfo interface. 11 /// 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_CLANG_BASIC_TARGETINFO_H 15 #define LLVM_CLANG_BASIC_TARGETINFO_H 16 17 #include "clang/Basic/AddressSpaces.h" 18 #include "clang/Basic/BitmaskEnum.h" 19 #include "clang/Basic/CodeGenOptions.h" 20 #include "clang/Basic/LLVM.h" 21 #include "clang/Basic/LangOptions.h" 22 #include "clang/Basic/Specifiers.h" 23 #include "clang/Basic/TargetCXXABI.h" 24 #include "clang/Basic/TargetOptions.h" 25 #include "llvm/ADT/APFloat.h" 26 #include "llvm/ADT/APInt.h" 27 #include "llvm/ADT/ArrayRef.h" 28 #include "llvm/ADT/IntrusiveRefCntPtr.h" 29 #include "llvm/ADT/SmallSet.h" 30 #include "llvm/ADT/StringMap.h" 31 #include "llvm/ADT/StringRef.h" 32 #include "llvm/ADT/Triple.h" 33 #include "llvm/Frontend/OpenMP/OMPGridValues.h" 34 #include "llvm/IR/DerivedTypes.h" 35 #include "llvm/Support/DataTypes.h" 36 #include "llvm/Support/Error.h" 37 #include "llvm/Support/VersionTuple.h" 38 #include <cassert> 39 #include <optional> 40 #include <string> 41 #include <vector> 42 43 namespace llvm { 44 struct fltSemantics; 45 } 46 47 namespace clang { 48 class DiagnosticsEngine; 49 class LangOptions; 50 class CodeGenOptions; 51 class MacroBuilder; 52 53 /// Contains information gathered from parsing the contents of TargetAttr. 54 struct ParsedTargetAttr { 55 std::vector<std::string> Features; 56 StringRef CPU; 57 StringRef Tune; 58 StringRef BranchProtection; 59 StringRef Duplicate; 60 bool operator ==(const ParsedTargetAttr &Other) const { 61 return Duplicate == Other.Duplicate && CPU == Other.CPU && 62 Tune == Other.Tune && BranchProtection == Other.BranchProtection && 63 Features == Other.Features; 64 } 65 }; 66 67 namespace Builtin { struct Info; } 68 69 enum class FloatModeKind { 70 NoFloat = 0, 71 Half = 1 << 0, 72 Float = 1 << 1, 73 Double = 1 << 2, 74 LongDouble = 1 << 3, 75 Float128 = 1 << 4, 76 Ibm128 = 1 << 5, 77 LLVM_MARK_AS_BITMASK_ENUM(Ibm128) 78 }; 79 80 /// Fields controlling how types are laid out in memory; these may need to 81 /// be copied for targets like AMDGPU that base their ABIs on an auxiliary 82 /// CPU target. 83 struct TransferrableTargetInfo { 84 unsigned char PointerWidth, PointerAlign; 85 unsigned char BoolWidth, BoolAlign; 86 unsigned char IntWidth, IntAlign; 87 unsigned char HalfWidth, HalfAlign; 88 unsigned char BFloat16Width, BFloat16Align; 89 unsigned char FloatWidth, FloatAlign; 90 unsigned char DoubleWidth, DoubleAlign; 91 unsigned char LongDoubleWidth, LongDoubleAlign, Float128Align, Ibm128Align; 92 unsigned char LargeArrayMinWidth, LargeArrayAlign; 93 unsigned char LongWidth, LongAlign; 94 unsigned char LongLongWidth, LongLongAlign; 95 unsigned char Int128Align; 96 97 // Fixed point bit widths 98 unsigned char ShortAccumWidth, ShortAccumAlign; 99 unsigned char AccumWidth, AccumAlign; 100 unsigned char LongAccumWidth, LongAccumAlign; 101 unsigned char ShortFractWidth, ShortFractAlign; 102 unsigned char FractWidth, FractAlign; 103 unsigned char LongFractWidth, LongFractAlign; 104 105 // If true, unsigned fixed point types have the same number of fractional bits 106 // as their signed counterparts, forcing the unsigned types to have one extra 107 // bit of padding. Otherwise, unsigned fixed point types have 108 // one more fractional bit than its corresponding signed type. This is false 109 // by default. 110 bool PaddingOnUnsignedFixedPoint; 111 112 // Fixed point integral and fractional bit sizes 113 // Saturated types share the same integral/fractional bits as their 114 // corresponding unsaturated types. 115 // For simplicity, the fractional bits in a _Fract type will be one less the 116 // width of that _Fract type. This leaves all signed _Fract types having no 117 // padding and unsigned _Fract types will only have 1 bit of padding after the 118 // sign if PaddingOnUnsignedFixedPoint is set. 119 unsigned char ShortAccumScale; 120 unsigned char AccumScale; 121 unsigned char LongAccumScale; 122 123 unsigned char DefaultAlignForAttributeAligned; 124 unsigned char MinGlobalAlign; 125 126 unsigned short SuitableAlign; 127 unsigned short NewAlign; 128 unsigned MaxVectorAlign; 129 unsigned MaxTLSAlign; 130 131 const llvm::fltSemantics *HalfFormat, *BFloat16Format, *FloatFormat, 132 *DoubleFormat, *LongDoubleFormat, *Float128Format, *Ibm128Format; 133 134 ///===---- Target Data Type Query Methods -------------------------------===// 135 enum IntType { 136 NoInt = 0, 137 SignedChar, 138 UnsignedChar, 139 SignedShort, 140 UnsignedShort, 141 SignedInt, 142 UnsignedInt, 143 SignedLong, 144 UnsignedLong, 145 SignedLongLong, 146 UnsignedLongLong 147 }; 148 149 protected: 150 IntType SizeType, IntMaxType, PtrDiffType, IntPtrType, WCharType, WIntType, 151 Char16Type, Char32Type, Int64Type, Int16Type, SigAtomicType, 152 ProcessIDType; 153 154 /// Whether Objective-C's built-in boolean type should be signed char. 155 /// 156 /// Otherwise, when this flag is not set, the normal built-in boolean type is 157 /// used. 158 unsigned UseSignedCharForObjCBool : 1; 159 160 /// Control whether the alignment of bit-field types is respected when laying 161 /// out structures. If true, then the alignment of the bit-field type will be 162 /// used to (a) impact the alignment of the containing structure, and (b) 163 /// ensure that the individual bit-field will not straddle an alignment 164 /// boundary. 165 unsigned UseBitFieldTypeAlignment : 1; 166 167 /// Whether zero length bitfields (e.g., int : 0;) force alignment of 168 /// the next bitfield. 169 /// 170 /// If the alignment of the zero length bitfield is greater than the member 171 /// that follows it, `bar', `bar' will be aligned as the type of the 172 /// zero-length bitfield. 173 unsigned UseZeroLengthBitfieldAlignment : 1; 174 175 /// Whether zero length bitfield alignment is respected if they are the 176 /// leading members. 177 unsigned UseLeadingZeroLengthBitfield : 1; 178 179 /// Whether explicit bit field alignment attributes are honored. 180 unsigned UseExplicitBitFieldAlignment : 1; 181 182 /// If non-zero, specifies a fixed alignment value for bitfields that follow 183 /// zero length bitfield, regardless of the zero length bitfield type. 184 unsigned ZeroLengthBitfieldBoundary; 185 186 /// If non-zero, specifies a maximum alignment to truncate alignment 187 /// specified in the aligned attribute of a static variable to this value. 188 unsigned MaxAlignedAttribute; 189 }; 190 191 /// OpenCL type kinds. 192 enum OpenCLTypeKind : uint8_t { 193 OCLTK_Default, 194 OCLTK_ClkEvent, 195 OCLTK_Event, 196 OCLTK_Image, 197 OCLTK_Pipe, 198 OCLTK_Queue, 199 OCLTK_ReserveID, 200 OCLTK_Sampler, 201 }; 202 203 /// Exposes information about the current target. 204 /// 205 class TargetInfo : public virtual TransferrableTargetInfo, 206 public RefCountedBase<TargetInfo> { 207 std::shared_ptr<TargetOptions> TargetOpts; 208 llvm::Triple Triple; 209 protected: 210 // Target values set by the ctor of the actual target implementation. Default 211 // values are specified by the TargetInfo constructor. 212 bool BigEndian; 213 bool TLSSupported; 214 bool VLASupported; 215 bool NoAsmVariants; // True if {|} are normal characters. 216 bool HasLegalHalfType; // True if the backend supports operations on the half 217 // LLVM IR type. 218 bool HalfArgsAndReturns; 219 bool HasFloat128; 220 bool HasFloat16; 221 bool HasBFloat16; 222 bool HasIbm128; 223 bool HasLongDouble; 224 bool HasFPReturn; 225 bool HasStrictFP; 226 227 unsigned char MaxAtomicPromoteWidth, MaxAtomicInlineWidth; 228 unsigned short SimdDefaultAlign; 229 std::string DataLayoutString; 230 const char *UserLabelPrefix; 231 const char *MCountName; 232 unsigned char RegParmMax, SSERegParmMax; 233 TargetCXXABI TheCXXABI; 234 const LangASMap *AddrSpaceMap; 235 236 mutable StringRef PlatformName; 237 mutable VersionTuple PlatformMinVersion; 238 239 unsigned HasAlignMac68kSupport : 1; 240 unsigned RealTypeUsesObjCFPRetMask : llvm::BitWidth<FloatModeKind>; 241 unsigned ComplexLongDoubleUsesFP2Ret : 1; 242 243 unsigned HasBuiltinMSVaList : 1; 244 245 unsigned IsRenderScriptTarget : 1; 246 247 unsigned HasAArch64SVETypes : 1; 248 249 unsigned HasRISCVVTypes : 1; 250 251 unsigned AllowAMDGPUUnsafeFPAtomics : 1; 252 253 unsigned ARMCDECoprocMask : 8; 254 255 unsigned MaxOpenCLWorkGroupSize; 256 257 std::optional<unsigned> MaxBitIntWidth; 258 259 std::optional<llvm::Triple> DarwinTargetVariantTriple; 260 261 // TargetInfo Constructor. Default initializes all fields. 262 TargetInfo(const llvm::Triple &T); 263 264 // UserLabelPrefix must match DL's getGlobalPrefix() when interpreted 265 // as a DataLayout object. 266 void resetDataLayout(StringRef DL, const char *UserLabelPrefix = ""); 267 268 public: 269 /// Construct a target for the given options. 270 /// 271 /// \param Opts - The options to use to initialize the target. The target may 272 /// modify the options to canonicalize the target feature information to match 273 /// what the backend expects. 274 static TargetInfo * 275 CreateTargetInfo(DiagnosticsEngine &Diags, 276 const std::shared_ptr<TargetOptions> &Opts); 277 278 virtual ~TargetInfo(); 279 280 /// Retrieve the target options. getTargetOpts()281 TargetOptions &getTargetOpts() const { 282 assert(TargetOpts && "Missing target options"); 283 return *TargetOpts; 284 } 285 286 /// The different kinds of __builtin_va_list types defined by 287 /// the target implementation. 288 enum BuiltinVaListKind { 289 /// typedef char* __builtin_va_list; 290 CharPtrBuiltinVaList = 0, 291 292 /// typedef void* __builtin_va_list; 293 VoidPtrBuiltinVaList, 294 295 /// __builtin_va_list as defined by the AArch64 ABI 296 /// http://infocenter.arm.com/help/topic/com.arm.doc.ihi0055a/IHI0055A_aapcs64.pdf 297 AArch64ABIBuiltinVaList, 298 299 /// __builtin_va_list as defined by the PNaCl ABI: 300 /// http://www.chromium.org/nativeclient/pnacl/bitcode-abi#TOC-Machine-Types 301 PNaClABIBuiltinVaList, 302 303 /// __builtin_va_list as defined by the Power ABI: 304 /// https://www.power.org 305 /// /resources/downloads/Power-Arch-32-bit-ABI-supp-1.0-Embedded.pdf 306 PowerABIBuiltinVaList, 307 308 /// __builtin_va_list as defined by the x86-64 ABI: 309 /// http://refspecs.linuxbase.org/elf/x86_64-abi-0.21.pdf 310 X86_64ABIBuiltinVaList, 311 312 /// __builtin_va_list as defined by ARM AAPCS ABI 313 /// http://infocenter.arm.com 314 // /help/topic/com.arm.doc.ihi0042d/IHI0042D_aapcs.pdf 315 AAPCSABIBuiltinVaList, 316 317 // typedef struct __va_list_tag 318 // { 319 // long __gpr; 320 // long __fpr; 321 // void *__overflow_arg_area; 322 // void *__reg_save_area; 323 // } va_list[1]; 324 SystemZBuiltinVaList, 325 326 // typedef struct __va_list_tag { 327 // void *__current_saved_reg_area_pointer; 328 // void *__saved_reg_area_end_pointer; 329 // void *__overflow_area_pointer; 330 //} va_list; 331 HexagonBuiltinVaList 332 }; 333 334 protected: 335 /// Specify if mangling based on address space map should be used or 336 /// not for language specific address spaces 337 bool UseAddrSpaceMapMangling; 338 339 public: getSizeType()340 IntType getSizeType() const { return SizeType; } getSignedSizeType()341 IntType getSignedSizeType() const { 342 switch (SizeType) { 343 case UnsignedShort: 344 return SignedShort; 345 case UnsignedInt: 346 return SignedInt; 347 case UnsignedLong: 348 return SignedLong; 349 case UnsignedLongLong: 350 return SignedLongLong; 351 default: 352 llvm_unreachable("Invalid SizeType"); 353 } 354 } getIntMaxType()355 IntType getIntMaxType() const { return IntMaxType; } getUIntMaxType()356 IntType getUIntMaxType() const { 357 return getCorrespondingUnsignedType(IntMaxType); 358 } getPtrDiffType(LangAS AddrSpace)359 IntType getPtrDiffType(LangAS AddrSpace) const { 360 return AddrSpace == LangAS::Default ? PtrDiffType 361 : getPtrDiffTypeV(AddrSpace); 362 } getUnsignedPtrDiffType(LangAS AddrSpace)363 IntType getUnsignedPtrDiffType(LangAS AddrSpace) const { 364 return getCorrespondingUnsignedType(getPtrDiffType(AddrSpace)); 365 } getIntPtrType()366 IntType getIntPtrType() const { return IntPtrType; } getUIntPtrType()367 IntType getUIntPtrType() const { 368 return getCorrespondingUnsignedType(IntPtrType); 369 } getWCharType()370 IntType getWCharType() const { return WCharType; } getWIntType()371 IntType getWIntType() const { return WIntType; } getChar16Type()372 IntType getChar16Type() const { return Char16Type; } getChar32Type()373 IntType getChar32Type() const { return Char32Type; } getInt64Type()374 IntType getInt64Type() const { return Int64Type; } getUInt64Type()375 IntType getUInt64Type() const { 376 return getCorrespondingUnsignedType(Int64Type); 377 } getInt16Type()378 IntType getInt16Type() const { return Int16Type; } getUInt16Type()379 IntType getUInt16Type() const { 380 return getCorrespondingUnsignedType(Int16Type); 381 } getSigAtomicType()382 IntType getSigAtomicType() const { return SigAtomicType; } getProcessIDType()383 IntType getProcessIDType() const { return ProcessIDType; } 384 getCorrespondingUnsignedType(IntType T)385 static IntType getCorrespondingUnsignedType(IntType T) { 386 switch (T) { 387 case SignedChar: 388 return UnsignedChar; 389 case SignedShort: 390 return UnsignedShort; 391 case SignedInt: 392 return UnsignedInt; 393 case SignedLong: 394 return UnsignedLong; 395 case SignedLongLong: 396 return UnsignedLongLong; 397 default: 398 llvm_unreachable("Unexpected signed integer type"); 399 } 400 } 401 402 /// In the event this target uses the same number of fractional bits for its 403 /// unsigned types as it does with its signed counterparts, there will be 404 /// exactly one bit of padding. 405 /// Return true if unsigned fixed point types have padding for this target. doUnsignedFixedPointTypesHavePadding()406 bool doUnsignedFixedPointTypesHavePadding() const { 407 return PaddingOnUnsignedFixedPoint; 408 } 409 410 /// Return the width (in bits) of the specified integer type enum. 411 /// 412 /// For example, SignedInt -> getIntWidth(). 413 unsigned getTypeWidth(IntType T) const; 414 415 /// Return integer type with specified width. 416 virtual IntType getIntTypeByWidth(unsigned BitWidth, bool IsSigned) const; 417 418 /// Return the smallest integer type with at least the specified width. 419 virtual IntType getLeastIntTypeByWidth(unsigned BitWidth, 420 bool IsSigned) const; 421 422 /// Return floating point type with specified width. On PPC, there are 423 /// three possible types for 128-bit floating point: "PPC double-double", 424 /// IEEE 754R quad precision, and "long double" (which under the covers 425 /// is represented as one of those two). At this time, there is no support 426 /// for an explicit "PPC double-double" type (i.e. __ibm128) so we only 427 /// need to differentiate between "long double" and IEEE quad precision. 428 FloatModeKind getRealTypeByWidth(unsigned BitWidth, 429 FloatModeKind ExplicitType) const; 430 431 /// Return the alignment (in bits) of the specified integer type enum. 432 /// 433 /// For example, SignedInt -> getIntAlign(). 434 unsigned getTypeAlign(IntType T) const; 435 436 /// Returns true if the type is signed; false otherwise. 437 static bool isTypeSigned(IntType T); 438 439 /// Return the width of pointers on this target, for the 440 /// specified address space. getPointerWidth(LangAS AddrSpace)441 uint64_t getPointerWidth(LangAS AddrSpace) const { 442 return AddrSpace == LangAS::Default ? PointerWidth 443 : getPointerWidthV(AddrSpace); 444 } getPointerAlign(LangAS AddrSpace)445 uint64_t getPointerAlign(LangAS AddrSpace) const { 446 return AddrSpace == LangAS::Default ? PointerAlign 447 : getPointerAlignV(AddrSpace); 448 } 449 450 /// Return the maximum width of pointers on this target. getMaxPointerWidth()451 virtual uint64_t getMaxPointerWidth() const { 452 return PointerWidth; 453 } 454 455 /// Get integer value for null pointer. 456 /// \param AddrSpace address space of pointee in source language. getNullPointerValue(LangAS AddrSpace)457 virtual uint64_t getNullPointerValue(LangAS AddrSpace) const { return 0; } 458 459 /// Return the size of '_Bool' and C++ 'bool' for this target, in bits. getBoolWidth()460 unsigned getBoolWidth() const { return BoolWidth; } 461 462 /// Return the alignment of '_Bool' and C++ 'bool' for this target. getBoolAlign()463 unsigned getBoolAlign() const { return BoolAlign; } 464 getCharWidth()465 unsigned getCharWidth() const { return 8; } // FIXME getCharAlign()466 unsigned getCharAlign() const { return 8; } // FIXME 467 468 /// Return the size of 'signed short' and 'unsigned short' for this 469 /// target, in bits. getShortWidth()470 unsigned getShortWidth() const { return 16; } // FIXME 471 472 /// Return the alignment of 'signed short' and 'unsigned short' for 473 /// this target. getShortAlign()474 unsigned getShortAlign() const { return 16; } // FIXME 475 476 /// getIntWidth/Align - Return the size of 'signed int' and 'unsigned int' for 477 /// this target, in bits. getIntWidth()478 unsigned getIntWidth() const { return IntWidth; } getIntAlign()479 unsigned getIntAlign() const { return IntAlign; } 480 481 /// getLongWidth/Align - Return the size of 'signed long' and 'unsigned long' 482 /// for this target, in bits. getLongWidth()483 unsigned getLongWidth() const { return LongWidth; } getLongAlign()484 unsigned getLongAlign() const { return LongAlign; } 485 486 /// getLongLongWidth/Align - Return the size of 'signed long long' and 487 /// 'unsigned long long' for this target, in bits. getLongLongWidth()488 unsigned getLongLongWidth() const { return LongLongWidth; } getLongLongAlign()489 unsigned getLongLongAlign() const { return LongLongAlign; } 490 491 /// getInt128Align() - Returns the alignment of Int128. getInt128Align()492 unsigned getInt128Align() const { return Int128Align; } 493 494 /// getShortAccumWidth/Align - Return the size of 'signed short _Accum' and 495 /// 'unsigned short _Accum' for this target, in bits. getShortAccumWidth()496 unsigned getShortAccumWidth() const { return ShortAccumWidth; } getShortAccumAlign()497 unsigned getShortAccumAlign() const { return ShortAccumAlign; } 498 499 /// getAccumWidth/Align - Return the size of 'signed _Accum' and 500 /// 'unsigned _Accum' for this target, in bits. getAccumWidth()501 unsigned getAccumWidth() const { return AccumWidth; } getAccumAlign()502 unsigned getAccumAlign() const { return AccumAlign; } 503 504 /// getLongAccumWidth/Align - Return the size of 'signed long _Accum' and 505 /// 'unsigned long _Accum' for this target, in bits. getLongAccumWidth()506 unsigned getLongAccumWidth() const { return LongAccumWidth; } getLongAccumAlign()507 unsigned getLongAccumAlign() const { return LongAccumAlign; } 508 509 /// getShortFractWidth/Align - Return the size of 'signed short _Fract' and 510 /// 'unsigned short _Fract' for this target, in bits. getShortFractWidth()511 unsigned getShortFractWidth() const { return ShortFractWidth; } getShortFractAlign()512 unsigned getShortFractAlign() const { return ShortFractAlign; } 513 514 /// getFractWidth/Align - Return the size of 'signed _Fract' and 515 /// 'unsigned _Fract' for this target, in bits. getFractWidth()516 unsigned getFractWidth() const { return FractWidth; } getFractAlign()517 unsigned getFractAlign() const { return FractAlign; } 518 519 /// getLongFractWidth/Align - Return the size of 'signed long _Fract' and 520 /// 'unsigned long _Fract' for this target, in bits. getLongFractWidth()521 unsigned getLongFractWidth() const { return LongFractWidth; } getLongFractAlign()522 unsigned getLongFractAlign() const { return LongFractAlign; } 523 524 /// getShortAccumScale/IBits - Return the number of fractional/integral bits 525 /// in a 'signed short _Accum' type. getShortAccumScale()526 unsigned getShortAccumScale() const { return ShortAccumScale; } getShortAccumIBits()527 unsigned getShortAccumIBits() const { 528 return ShortAccumWidth - ShortAccumScale - 1; 529 } 530 531 /// getAccumScale/IBits - Return the number of fractional/integral bits 532 /// in a 'signed _Accum' type. getAccumScale()533 unsigned getAccumScale() const { return AccumScale; } getAccumIBits()534 unsigned getAccumIBits() const { return AccumWidth - AccumScale - 1; } 535 536 /// getLongAccumScale/IBits - Return the number of fractional/integral bits 537 /// in a 'signed long _Accum' type. getLongAccumScale()538 unsigned getLongAccumScale() const { return LongAccumScale; } getLongAccumIBits()539 unsigned getLongAccumIBits() const { 540 return LongAccumWidth - LongAccumScale - 1; 541 } 542 543 /// getUnsignedShortAccumScale/IBits - Return the number of 544 /// fractional/integral bits in a 'unsigned short _Accum' type. getUnsignedShortAccumScale()545 unsigned getUnsignedShortAccumScale() const { 546 return PaddingOnUnsignedFixedPoint ? ShortAccumScale : ShortAccumScale + 1; 547 } getUnsignedShortAccumIBits()548 unsigned getUnsignedShortAccumIBits() const { 549 return PaddingOnUnsignedFixedPoint 550 ? getShortAccumIBits() 551 : ShortAccumWidth - getUnsignedShortAccumScale(); 552 } 553 554 /// getUnsignedAccumScale/IBits - Return the number of fractional/integral 555 /// bits in a 'unsigned _Accum' type. getUnsignedAccumScale()556 unsigned getUnsignedAccumScale() const { 557 return PaddingOnUnsignedFixedPoint ? AccumScale : AccumScale + 1; 558 } getUnsignedAccumIBits()559 unsigned getUnsignedAccumIBits() const { 560 return PaddingOnUnsignedFixedPoint ? getAccumIBits() 561 : AccumWidth - getUnsignedAccumScale(); 562 } 563 564 /// getUnsignedLongAccumScale/IBits - Return the number of fractional/integral 565 /// bits in a 'unsigned long _Accum' type. getUnsignedLongAccumScale()566 unsigned getUnsignedLongAccumScale() const { 567 return PaddingOnUnsignedFixedPoint ? LongAccumScale : LongAccumScale + 1; 568 } getUnsignedLongAccumIBits()569 unsigned getUnsignedLongAccumIBits() const { 570 return PaddingOnUnsignedFixedPoint 571 ? getLongAccumIBits() 572 : LongAccumWidth - getUnsignedLongAccumScale(); 573 } 574 575 /// getShortFractScale - Return the number of fractional bits 576 /// in a 'signed short _Fract' type. getShortFractScale()577 unsigned getShortFractScale() const { return ShortFractWidth - 1; } 578 579 /// getFractScale - Return the number of fractional bits 580 /// in a 'signed _Fract' type. getFractScale()581 unsigned getFractScale() const { return FractWidth - 1; } 582 583 /// getLongFractScale - Return the number of fractional bits 584 /// in a 'signed long _Fract' type. getLongFractScale()585 unsigned getLongFractScale() const { return LongFractWidth - 1; } 586 587 /// getUnsignedShortFractScale - Return the number of fractional bits 588 /// in a 'unsigned short _Fract' type. getUnsignedShortFractScale()589 unsigned getUnsignedShortFractScale() const { 590 return PaddingOnUnsignedFixedPoint ? getShortFractScale() 591 : getShortFractScale() + 1; 592 } 593 594 /// getUnsignedFractScale - Return the number of fractional bits 595 /// in a 'unsigned _Fract' type. getUnsignedFractScale()596 unsigned getUnsignedFractScale() const { 597 return PaddingOnUnsignedFixedPoint ? getFractScale() : getFractScale() + 1; 598 } 599 600 /// getUnsignedLongFractScale - Return the number of fractional bits 601 /// in a 'unsigned long _Fract' type. getUnsignedLongFractScale()602 unsigned getUnsignedLongFractScale() const { 603 return PaddingOnUnsignedFixedPoint ? getLongFractScale() 604 : getLongFractScale() + 1; 605 } 606 607 /// Determine whether the __int128 type is supported on this target. hasInt128Type()608 virtual bool hasInt128Type() const { 609 return (getPointerWidth(LangAS::Default) >= 64) || 610 getTargetOpts().ForceEnableInt128; 611 } // FIXME 612 613 /// Determine whether the _BitInt type is supported on this target. This 614 /// limitation is put into place for ABI reasons. 615 /// FIXME: _BitInt is a required type in C23, so there's not much utility in 616 /// asking whether the target supported it or not; I think this should be 617 /// removed once backends have been alerted to the type and have had the 618 /// chance to do implementation work if needed. hasBitIntType()619 virtual bool hasBitIntType() const { 620 return false; 621 } 622 623 // Different targets may support a different maximum width for the _BitInt 624 // type, depending on what operations are supported. getMaxBitIntWidth()625 virtual size_t getMaxBitIntWidth() const { 626 // Consider -fexperimental-max-bitint-width= first. 627 if (MaxBitIntWidth) 628 return std::min<size_t>(*MaxBitIntWidth, llvm::IntegerType::MAX_INT_BITS); 629 630 // FIXME: this value should be llvm::IntegerType::MAX_INT_BITS, which is 631 // maximum bit width that LLVM claims its IR can support. However, most 632 // backends currently have a bug where they only support float to int 633 // conversion (and vice versa) on types that are <= 128 bits and crash 634 // otherwise. We're setting the max supported value to 128 to be 635 // conservative. 636 return 128; 637 } 638 639 /// Determine whether _Float16 is supported on this target. hasLegalHalfType()640 virtual bool hasLegalHalfType() const { return HasLegalHalfType; } 641 642 /// Whether half args and returns are supported. allowHalfArgsAndReturns()643 virtual bool allowHalfArgsAndReturns() const { return HalfArgsAndReturns; } 644 645 /// Determine whether the __float128 type is supported on this target. hasFloat128Type()646 virtual bool hasFloat128Type() const { return HasFloat128; } 647 648 /// Determine whether the _Float16 type is supported on this target. hasFloat16Type()649 virtual bool hasFloat16Type() const { return HasFloat16; } 650 651 /// Determine whether the _BFloat16 type is supported on this target. hasBFloat16Type()652 virtual bool hasBFloat16Type() const { return HasBFloat16; } 653 654 /// Determine whether the __ibm128 type is supported on this target. hasIbm128Type()655 virtual bool hasIbm128Type() const { return HasIbm128; } 656 657 /// Determine whether the long double type is supported on this target. hasLongDoubleType()658 virtual bool hasLongDoubleType() const { return HasLongDouble; } 659 660 /// Determine whether return of a floating point value is supported 661 /// on this target. hasFPReturn()662 virtual bool hasFPReturn() const { return HasFPReturn; } 663 664 /// Determine whether constrained floating point is supported on this target. hasStrictFP()665 virtual bool hasStrictFP() const { return HasStrictFP; } 666 667 /// Return the alignment that is the largest alignment ever used for any 668 /// scalar/SIMD data type on the target machine you are compiling for 669 /// (including types with an extended alignment requirement). getSuitableAlign()670 unsigned getSuitableAlign() const { return SuitableAlign; } 671 672 /// Return the default alignment for __attribute__((aligned)) on 673 /// this target, to be used if no alignment value is specified. getDefaultAlignForAttributeAligned()674 unsigned getDefaultAlignForAttributeAligned() const { 675 return DefaultAlignForAttributeAligned; 676 } 677 678 /// getMinGlobalAlign - Return the minimum alignment of a global variable, 679 /// unless its alignment is explicitly reduced via attributes. getMinGlobalAlign(uint64_t)680 virtual unsigned getMinGlobalAlign (uint64_t) const { 681 return MinGlobalAlign; 682 } 683 684 /// Return the largest alignment for which a suitably-sized allocation with 685 /// '::operator new(size_t)' is guaranteed to produce a correctly-aligned 686 /// pointer. getNewAlign()687 unsigned getNewAlign() const { 688 return NewAlign ? NewAlign : std::max(LongDoubleAlign, LongLongAlign); 689 } 690 691 /// getWCharWidth/Align - Return the size of 'wchar_t' for this target, in 692 /// bits. getWCharWidth()693 unsigned getWCharWidth() const { return getTypeWidth(WCharType); } getWCharAlign()694 unsigned getWCharAlign() const { return getTypeAlign(WCharType); } 695 696 /// getChar16Width/Align - Return the size of 'char16_t' for this target, in 697 /// bits. getChar16Width()698 unsigned getChar16Width() const { return getTypeWidth(Char16Type); } getChar16Align()699 unsigned getChar16Align() const { return getTypeAlign(Char16Type); } 700 701 /// getChar32Width/Align - Return the size of 'char32_t' for this target, in 702 /// bits. getChar32Width()703 unsigned getChar32Width() const { return getTypeWidth(Char32Type); } getChar32Align()704 unsigned getChar32Align() const { return getTypeAlign(Char32Type); } 705 706 /// getHalfWidth/Align/Format - Return the size/align/format of 'half'. getHalfWidth()707 unsigned getHalfWidth() const { return HalfWidth; } getHalfAlign()708 unsigned getHalfAlign() const { return HalfAlign; } getHalfFormat()709 const llvm::fltSemantics &getHalfFormat() const { return *HalfFormat; } 710 711 /// getFloatWidth/Align/Format - Return the size/align/format of 'float'. getFloatWidth()712 unsigned getFloatWidth() const { return FloatWidth; } getFloatAlign()713 unsigned getFloatAlign() const { return FloatAlign; } getFloatFormat()714 const llvm::fltSemantics &getFloatFormat() const { return *FloatFormat; } 715 716 /// getBFloat16Width/Align/Format - Return the size/align/format of '__bf16'. getBFloat16Width()717 unsigned getBFloat16Width() const { return BFloat16Width; } getBFloat16Align()718 unsigned getBFloat16Align() const { return BFloat16Align; } getBFloat16Format()719 const llvm::fltSemantics &getBFloat16Format() const { return *BFloat16Format; } 720 721 /// getDoubleWidth/Align/Format - Return the size/align/format of 'double'. getDoubleWidth()722 unsigned getDoubleWidth() const { return DoubleWidth; } getDoubleAlign()723 unsigned getDoubleAlign() const { return DoubleAlign; } getDoubleFormat()724 const llvm::fltSemantics &getDoubleFormat() const { return *DoubleFormat; } 725 726 /// getLongDoubleWidth/Align/Format - Return the size/align/format of 'long 727 /// double'. getLongDoubleWidth()728 unsigned getLongDoubleWidth() const { return LongDoubleWidth; } getLongDoubleAlign()729 unsigned getLongDoubleAlign() const { return LongDoubleAlign; } getLongDoubleFormat()730 const llvm::fltSemantics &getLongDoubleFormat() const { 731 return *LongDoubleFormat; 732 } 733 734 /// getFloat128Width/Align/Format - Return the size/align/format of 735 /// '__float128'. getFloat128Width()736 unsigned getFloat128Width() const { return 128; } getFloat128Align()737 unsigned getFloat128Align() const { return Float128Align; } getFloat128Format()738 const llvm::fltSemantics &getFloat128Format() const { 739 return *Float128Format; 740 } 741 742 /// getIbm128Width/Align/Format - Return the size/align/format of 743 /// '__ibm128'. getIbm128Width()744 unsigned getIbm128Width() const { return 128; } getIbm128Align()745 unsigned getIbm128Align() const { return Ibm128Align; } getIbm128Format()746 const llvm::fltSemantics &getIbm128Format() const { return *Ibm128Format; } 747 748 /// Return the mangled code of long double. getLongDoubleMangling()749 virtual const char *getLongDoubleMangling() const { return "e"; } 750 751 /// Return the mangled code of __float128. getFloat128Mangling()752 virtual const char *getFloat128Mangling() const { return "g"; } 753 754 /// Return the mangled code of __ibm128. getIbm128Mangling()755 virtual const char *getIbm128Mangling() const { 756 llvm_unreachable("ibm128 not implemented on this target"); 757 } 758 759 /// Return the mangled code of bfloat. getBFloat16Mangling()760 virtual const char *getBFloat16Mangling() const { 761 llvm_unreachable("bfloat not implemented on this target"); 762 } 763 764 /// Return the value for the C99 FLT_EVAL_METHOD macro. getFPEvalMethod()765 virtual LangOptions::FPEvalMethodKind getFPEvalMethod() const { 766 return LangOptions::FPEvalMethodKind::FEM_Source; 767 } 768 supportSourceEvalMethod()769 virtual bool supportSourceEvalMethod() const { return true; } 770 771 // getLargeArrayMinWidth/Align - Return the minimum array size that is 772 // 'large' and its alignment. getLargeArrayMinWidth()773 unsigned getLargeArrayMinWidth() const { return LargeArrayMinWidth; } getLargeArrayAlign()774 unsigned getLargeArrayAlign() const { return LargeArrayAlign; } 775 776 /// Return the maximum width lock-free atomic operation which will 777 /// ever be supported for the given target getMaxAtomicPromoteWidth()778 unsigned getMaxAtomicPromoteWidth() const { return MaxAtomicPromoteWidth; } 779 /// Return the maximum width lock-free atomic operation which can be 780 /// inlined given the supported features of the given target. getMaxAtomicInlineWidth()781 unsigned getMaxAtomicInlineWidth() const { return MaxAtomicInlineWidth; } 782 /// Set the maximum inline or promote width lock-free atomic operation 783 /// for the given target. setMaxAtomicWidth()784 virtual void setMaxAtomicWidth() {} 785 /// Returns true if the given target supports lock-free atomic 786 /// operations at the specified width and alignment. hasBuiltinAtomic(uint64_t AtomicSizeInBits,uint64_t AlignmentInBits)787 virtual bool hasBuiltinAtomic(uint64_t AtomicSizeInBits, 788 uint64_t AlignmentInBits) const { 789 return AtomicSizeInBits <= AlignmentInBits && 790 AtomicSizeInBits <= getMaxAtomicInlineWidth() && 791 (AtomicSizeInBits <= getCharWidth() || 792 llvm::isPowerOf2_64(AtomicSizeInBits / getCharWidth())); 793 } 794 795 /// Return the maximum vector alignment supported for the given target. getMaxVectorAlign()796 unsigned getMaxVectorAlign() const { return MaxVectorAlign; } 797 /// Return default simd alignment for the given target. Generally, this 798 /// value is type-specific, but this alignment can be used for most of the 799 /// types for the given target. getSimdDefaultAlign()800 unsigned getSimdDefaultAlign() const { return SimdDefaultAlign; } 801 getMaxOpenCLWorkGroupSize()802 unsigned getMaxOpenCLWorkGroupSize() const { return MaxOpenCLWorkGroupSize; } 803 804 /// Return the alignment (in bits) of the thrown exception object. This is 805 /// only meaningful for targets that allocate C++ exceptions in a system 806 /// runtime, such as those using the Itanium C++ ABI. getExnObjectAlignment()807 virtual unsigned getExnObjectAlignment() const { 808 // Itanium says that an _Unwind_Exception has to be "double-word" 809 // aligned (and thus the end of it is also so-aligned), meaning 16 810 // bytes. Of course, that was written for the actual Itanium, 811 // which is a 64-bit platform. Classically, the ABI doesn't really 812 // specify the alignment on other platforms, but in practice 813 // libUnwind declares the struct with __attribute__((aligned)), so 814 // we assume that alignment here. (It's generally 16 bytes, but 815 // some targets overwrite it.) 816 return getDefaultAlignForAttributeAligned(); 817 } 818 819 /// Return the size of intmax_t and uintmax_t for this target, in bits. getIntMaxTWidth()820 unsigned getIntMaxTWidth() const { 821 return getTypeWidth(IntMaxType); 822 } 823 824 // Return the size of unwind_word for this target. getUnwindWordWidth()825 virtual unsigned getUnwindWordWidth() const { 826 return getPointerWidth(LangAS::Default); 827 } 828 829 /// Return the "preferred" register width on this target. getRegisterWidth()830 virtual unsigned getRegisterWidth() const { 831 // Currently we assume the register width on the target matches the pointer 832 // width, we can introduce a new variable for this if/when some target wants 833 // it. 834 return PointerWidth; 835 } 836 837 /// \brief Returns the default value of the __USER_LABEL_PREFIX__ macro, 838 /// which is the prefix given to user symbols by default. 839 /// 840 /// On most platforms this is "", but it is "_" on some. getUserLabelPrefix()841 const char *getUserLabelPrefix() const { return UserLabelPrefix; } 842 843 /// Returns the name of the mcount instrumentation function. getMCountName()844 const char *getMCountName() const { 845 return MCountName; 846 } 847 848 /// Check if the Objective-C built-in boolean type should be signed 849 /// char. 850 /// 851 /// Otherwise, if this returns false, the normal built-in boolean type 852 /// should also be used for Objective-C. useSignedCharForObjCBool()853 bool useSignedCharForObjCBool() const { 854 return UseSignedCharForObjCBool; 855 } noSignedCharForObjCBool()856 void noSignedCharForObjCBool() { 857 UseSignedCharForObjCBool = false; 858 } 859 860 /// Check whether the alignment of bit-field types is respected 861 /// when laying out structures. useBitFieldTypeAlignment()862 bool useBitFieldTypeAlignment() const { 863 return UseBitFieldTypeAlignment; 864 } 865 866 /// Check whether zero length bitfields should force alignment of 867 /// the next member. useZeroLengthBitfieldAlignment()868 bool useZeroLengthBitfieldAlignment() const { 869 return UseZeroLengthBitfieldAlignment; 870 } 871 872 /// Check whether zero length bitfield alignment is respected if they are 873 /// leading members. useLeadingZeroLengthBitfield()874 bool useLeadingZeroLengthBitfield() const { 875 return UseLeadingZeroLengthBitfield; 876 } 877 878 /// Get the fixed alignment value in bits for a member that follows 879 /// a zero length bitfield. getZeroLengthBitfieldBoundary()880 unsigned getZeroLengthBitfieldBoundary() const { 881 return ZeroLengthBitfieldBoundary; 882 } 883 884 /// Get the maximum alignment in bits for a static variable with 885 /// aligned attribute. getMaxAlignedAttribute()886 unsigned getMaxAlignedAttribute() const { return MaxAlignedAttribute; } 887 888 /// Check whether explicit bitfield alignment attributes should be 889 // honored, as in "__attribute__((aligned(2))) int b : 1;". useExplicitBitFieldAlignment()890 bool useExplicitBitFieldAlignment() const { 891 return UseExplicitBitFieldAlignment; 892 } 893 894 /// Check whether this target support '\#pragma options align=mac68k'. hasAlignMac68kSupport()895 bool hasAlignMac68kSupport() const { 896 return HasAlignMac68kSupport; 897 } 898 899 /// Return the user string for the specified integer type enum. 900 /// 901 /// For example, SignedShort -> "short". 902 static const char *getTypeName(IntType T); 903 904 /// Return the constant suffix for the specified integer type enum. 905 /// 906 /// For example, SignedLong -> "L". 907 const char *getTypeConstantSuffix(IntType T) const; 908 909 /// Return the printf format modifier for the specified 910 /// integer type enum. 911 /// 912 /// For example, SignedLong -> "l". 913 static const char *getTypeFormatModifier(IntType T); 914 915 /// Check whether the given real type should use the "fpret" flavor of 916 /// Objective-C message passing on this target. useObjCFPRetForRealType(FloatModeKind T)917 bool useObjCFPRetForRealType(FloatModeKind T) const { 918 return (int)((FloatModeKind)RealTypeUsesObjCFPRetMask & T); 919 } 920 921 /// Check whether _Complex long double should use the "fp2ret" flavor 922 /// of Objective-C message passing on this target. useObjCFP2RetForComplexLongDouble()923 bool useObjCFP2RetForComplexLongDouble() const { 924 return ComplexLongDoubleUsesFP2Ret; 925 } 926 927 /// Check whether llvm intrinsics such as llvm.convert.to.fp16 should be used 928 /// to convert to and from __fp16. 929 /// FIXME: This function should be removed once all targets stop using the 930 /// conversion intrinsics. useFP16ConversionIntrinsics()931 virtual bool useFP16ConversionIntrinsics() const { 932 return true; 933 } 934 935 /// Specify if mangling based on address space map should be used or 936 /// not for language specific address spaces useAddressSpaceMapMangling()937 bool useAddressSpaceMapMangling() const { 938 return UseAddrSpaceMapMangling; 939 } 940 941 ///===---- Other target property query methods --------------------------===// 942 943 /// Appends the target-specific \#define values for this 944 /// target set to the specified buffer. 945 virtual void getTargetDefines(const LangOptions &Opts, 946 MacroBuilder &Builder) const = 0; 947 948 949 /// Return information about target-specific builtins for 950 /// the current primary target, and info about which builtins are non-portable 951 /// across the current set of primary and secondary targets. 952 virtual ArrayRef<Builtin::Info> getTargetBuiltins() const = 0; 953 954 /// Returns target-specific min and max values VScale_Range. 955 virtual std::optional<std::pair<unsigned, unsigned>> getVScaleRange(const LangOptions & LangOpts)956 getVScaleRange(const LangOptions &LangOpts) const { 957 return std::nullopt; 958 } 959 /// The __builtin_clz* and __builtin_ctz* built-in 960 /// functions are specified to have undefined results for zero inputs, but 961 /// on targets that support these operations in a way that provides 962 /// well-defined results for zero without loss of performance, it is a good 963 /// idea to avoid optimizing based on that undef behavior. isCLZForZeroUndef()964 virtual bool isCLZForZeroUndef() const { return true; } 965 966 /// Returns the kind of __builtin_va_list type that should be used 967 /// with this target. 968 virtual BuiltinVaListKind getBuiltinVaListKind() const = 0; 969 970 /// Returns whether or not type \c __builtin_ms_va_list type is 971 /// available on this target. hasBuiltinMSVaList()972 bool hasBuiltinMSVaList() const { return HasBuiltinMSVaList; } 973 974 /// Returns true for RenderScript. isRenderScriptTarget()975 bool isRenderScriptTarget() const { return IsRenderScriptTarget; } 976 977 /// Returns whether or not the AArch64 SVE built-in types are 978 /// available on this target. hasAArch64SVETypes()979 bool hasAArch64SVETypes() const { return HasAArch64SVETypes; } 980 981 /// Returns whether or not the RISC-V V built-in types are 982 /// available on this target. hasRISCVVTypes()983 bool hasRISCVVTypes() const { return HasRISCVVTypes; } 984 985 /// Returns whether or not the AMDGPU unsafe floating point atomics are 986 /// allowed. allowAMDGPUUnsafeFPAtomics()987 bool allowAMDGPUUnsafeFPAtomics() const { return AllowAMDGPUUnsafeFPAtomics; } 988 989 /// For ARM targets returns a mask defining which coprocessors are configured 990 /// as Custom Datapath. getARMCDECoprocMask()991 uint32_t getARMCDECoprocMask() const { return ARMCDECoprocMask; } 992 993 /// Returns whether the passed in string is a valid clobber in an 994 /// inline asm statement. 995 /// 996 /// This is used by Sema. 997 bool isValidClobber(StringRef Name) const; 998 999 /// Returns whether the passed in string is a valid register name 1000 /// according to GCC. 1001 /// 1002 /// This is used by Sema for inline asm statements. 1003 virtual bool isValidGCCRegisterName(StringRef Name) const; 1004 1005 /// Returns the "normalized" GCC register name. 1006 /// 1007 /// ReturnCannonical true will return the register name without any additions 1008 /// such as "{}" or "%" in it's canonical form, for example: 1009 /// ReturnCanonical = true and Name = "rax", will return "ax". 1010 StringRef getNormalizedGCCRegisterName(StringRef Name, 1011 bool ReturnCanonical = false) const; 1012 isSPRegName(StringRef)1013 virtual bool isSPRegName(StringRef) const { return false; } 1014 1015 /// Extracts a register from the passed constraint (if it is a 1016 /// single-register constraint) and the asm label expression related to a 1017 /// variable in the input or output list of an inline asm statement. 1018 /// 1019 /// This function is used by Sema in order to diagnose conflicts between 1020 /// the clobber list and the input/output lists. getConstraintRegister(StringRef Constraint,StringRef Expression)1021 virtual StringRef getConstraintRegister(StringRef Constraint, 1022 StringRef Expression) const { 1023 return ""; 1024 } 1025 1026 struct ConstraintInfo { 1027 enum { 1028 CI_None = 0x00, 1029 CI_AllowsMemory = 0x01, 1030 CI_AllowsRegister = 0x02, 1031 CI_ReadWrite = 0x04, // "+r" output constraint (read and write). 1032 CI_HasMatchingInput = 0x08, // This output operand has a matching input. 1033 CI_ImmediateConstant = 0x10, // This operand must be an immediate constant 1034 CI_EarlyClobber = 0x20, // "&" output constraint (early clobber). 1035 }; 1036 unsigned Flags; 1037 int TiedOperand; 1038 struct { 1039 int Min; 1040 int Max; 1041 bool isConstrained; 1042 } ImmRange; 1043 llvm::SmallSet<int, 4> ImmSet; 1044 1045 std::string ConstraintStr; // constraint: "=rm" 1046 std::string Name; // Operand name: [foo] with no []'s. 1047 public: ConstraintInfoConstraintInfo1048 ConstraintInfo(StringRef ConstraintStr, StringRef Name) 1049 : Flags(0), TiedOperand(-1), ConstraintStr(ConstraintStr.str()), 1050 Name(Name.str()) { 1051 ImmRange.Min = ImmRange.Max = 0; 1052 ImmRange.isConstrained = false; 1053 } 1054 getConstraintStrConstraintInfo1055 const std::string &getConstraintStr() const { return ConstraintStr; } getNameConstraintInfo1056 const std::string &getName() const { return Name; } isReadWriteConstraintInfo1057 bool isReadWrite() const { return (Flags & CI_ReadWrite) != 0; } earlyClobberConstraintInfo1058 bool earlyClobber() { return (Flags & CI_EarlyClobber) != 0; } allowsRegisterConstraintInfo1059 bool allowsRegister() const { return (Flags & CI_AllowsRegister) != 0; } allowsMemoryConstraintInfo1060 bool allowsMemory() const { return (Flags & CI_AllowsMemory) != 0; } 1061 1062 /// Return true if this output operand has a matching 1063 /// (tied) input operand. hasMatchingInputConstraintInfo1064 bool hasMatchingInput() const { return (Flags & CI_HasMatchingInput) != 0; } 1065 1066 /// Return true if this input operand is a matching 1067 /// constraint that ties it to an output operand. 1068 /// 1069 /// If this returns true then getTiedOperand will indicate which output 1070 /// operand this is tied to. hasTiedOperandConstraintInfo1071 bool hasTiedOperand() const { return TiedOperand != -1; } getTiedOperandConstraintInfo1072 unsigned getTiedOperand() const { 1073 assert(hasTiedOperand() && "Has no tied operand!"); 1074 return (unsigned)TiedOperand; 1075 } 1076 requiresImmediateConstantConstraintInfo1077 bool requiresImmediateConstant() const { 1078 return (Flags & CI_ImmediateConstant) != 0; 1079 } isValidAsmImmediateConstraintInfo1080 bool isValidAsmImmediate(const llvm::APInt &Value) const { 1081 if (!ImmSet.empty()) 1082 return Value.isSignedIntN(32) && ImmSet.contains(Value.getZExtValue()); 1083 return !ImmRange.isConstrained || 1084 (Value.sge(ImmRange.Min) && Value.sle(ImmRange.Max)); 1085 } 1086 setIsReadWriteConstraintInfo1087 void setIsReadWrite() { Flags |= CI_ReadWrite; } setEarlyClobberConstraintInfo1088 void setEarlyClobber() { Flags |= CI_EarlyClobber; } setAllowsMemoryConstraintInfo1089 void setAllowsMemory() { Flags |= CI_AllowsMemory; } setAllowsRegisterConstraintInfo1090 void setAllowsRegister() { Flags |= CI_AllowsRegister; } setHasMatchingInputConstraintInfo1091 void setHasMatchingInput() { Flags |= CI_HasMatchingInput; } setRequiresImmediateConstraintInfo1092 void setRequiresImmediate(int Min, int Max) { 1093 Flags |= CI_ImmediateConstant; 1094 ImmRange.Min = Min; 1095 ImmRange.Max = Max; 1096 ImmRange.isConstrained = true; 1097 } setRequiresImmediateConstraintInfo1098 void setRequiresImmediate(llvm::ArrayRef<int> Exacts) { 1099 Flags |= CI_ImmediateConstant; 1100 for (int Exact : Exacts) 1101 ImmSet.insert(Exact); 1102 } setRequiresImmediateConstraintInfo1103 void setRequiresImmediate(int Exact) { 1104 Flags |= CI_ImmediateConstant; 1105 ImmSet.insert(Exact); 1106 } setRequiresImmediateConstraintInfo1107 void setRequiresImmediate() { 1108 Flags |= CI_ImmediateConstant; 1109 } 1110 1111 /// Indicate that this is an input operand that is tied to 1112 /// the specified output operand. 1113 /// 1114 /// Copy over the various constraint information from the output. setTiedOperandConstraintInfo1115 void setTiedOperand(unsigned N, ConstraintInfo &Output) { 1116 Output.setHasMatchingInput(); 1117 Flags = Output.Flags; 1118 TiedOperand = N; 1119 // Don't copy Name or constraint string. 1120 } 1121 }; 1122 1123 /// Validate register name used for global register variables. 1124 /// 1125 /// This function returns true if the register passed in RegName can be used 1126 /// for global register variables on this target. In addition, it returns 1127 /// true in HasSizeMismatch if the size of the register doesn't match the 1128 /// variable size passed in RegSize. validateGlobalRegisterVariable(StringRef RegName,unsigned RegSize,bool & HasSizeMismatch)1129 virtual bool validateGlobalRegisterVariable(StringRef RegName, 1130 unsigned RegSize, 1131 bool &HasSizeMismatch) const { 1132 HasSizeMismatch = false; 1133 return true; 1134 } 1135 1136 // validateOutputConstraint, validateInputConstraint - Checks that 1137 // a constraint is valid and provides information about it. 1138 // FIXME: These should return a real error instead of just true/false. 1139 bool validateOutputConstraint(ConstraintInfo &Info) const; 1140 bool validateInputConstraint(MutableArrayRef<ConstraintInfo> OutputConstraints, 1141 ConstraintInfo &info) const; 1142 validateOutputSize(const llvm::StringMap<bool> & FeatureMap,StringRef,unsigned)1143 virtual bool validateOutputSize(const llvm::StringMap<bool> &FeatureMap, 1144 StringRef /*Constraint*/, 1145 unsigned /*Size*/) const { 1146 return true; 1147 } 1148 validateInputSize(const llvm::StringMap<bool> & FeatureMap,StringRef,unsigned)1149 virtual bool validateInputSize(const llvm::StringMap<bool> &FeatureMap, 1150 StringRef /*Constraint*/, 1151 unsigned /*Size*/) const { 1152 return true; 1153 } 1154 virtual bool validateConstraintModifier(StringRef,char,unsigned,std::string &)1155 validateConstraintModifier(StringRef /*Constraint*/, 1156 char /*Modifier*/, 1157 unsigned /*Size*/, 1158 std::string &/*SuggestedModifier*/) const { 1159 return true; 1160 } 1161 virtual bool 1162 validateAsmConstraint(const char *&Name, 1163 TargetInfo::ConstraintInfo &info) const = 0; 1164 1165 bool resolveSymbolicName(const char *&Name, 1166 ArrayRef<ConstraintInfo> OutputConstraints, 1167 unsigned &Index) const; 1168 1169 // Constraint parm will be left pointing at the last character of 1170 // the constraint. In practice, it won't be changed unless the 1171 // constraint is longer than one character. convertConstraint(const char * & Constraint)1172 virtual std::string convertConstraint(const char *&Constraint) const { 1173 // 'p' defaults to 'r', but can be overridden by targets. 1174 if (*Constraint == 'p') 1175 return std::string("r"); 1176 return std::string(1, *Constraint); 1177 } 1178 1179 /// Replace some escaped characters with another string based on 1180 /// target-specific rules handleAsmEscapedChar(char C)1181 virtual std::optional<std::string> handleAsmEscapedChar(char C) const { 1182 return std::nullopt; 1183 } 1184 1185 /// Returns a string of target-specific clobbers, in LLVM format. 1186 virtual const char *getClobbers() const = 0; 1187 1188 /// Returns true if NaN encoding is IEEE 754-2008. 1189 /// Only MIPS allows a different encoding. isNan2008()1190 virtual bool isNan2008() const { 1191 return true; 1192 } 1193 1194 /// Returns the target triple of the primary target. getTriple()1195 const llvm::Triple &getTriple() const { 1196 return Triple; 1197 } 1198 1199 /// Returns the target ID if supported. getTargetID()1200 virtual std::optional<std::string> getTargetID() const { 1201 return std::nullopt; 1202 } 1203 getDataLayoutString()1204 const char *getDataLayoutString() const { 1205 assert(!DataLayoutString.empty() && "Uninitialized DataLayout!"); 1206 return DataLayoutString.c_str(); 1207 } 1208 1209 struct GCCRegAlias { 1210 const char * const Aliases[5]; 1211 const char * const Register; 1212 }; 1213 1214 struct AddlRegName { 1215 const char * const Names[5]; 1216 const unsigned RegNum; 1217 }; 1218 1219 /// Does this target support "protected" visibility? 1220 /// 1221 /// Any target which dynamic libraries will naturally support 1222 /// something like "default" (meaning that the symbol is visible 1223 /// outside this shared object) and "hidden" (meaning that it isn't) 1224 /// visibilities, but "protected" is really an ELF-specific concept 1225 /// with weird semantics designed around the convenience of dynamic 1226 /// linker implementations. Which is not to suggest that there's 1227 /// consistent target-independent semantics for "default" visibility 1228 /// either; the entire thing is pretty badly mangled. hasProtectedVisibility()1229 virtual bool hasProtectedVisibility() const { return true; } 1230 1231 /// Does this target aim for semantic compatibility with 1232 /// Microsoft C++ code using dllimport/export attributes? shouldDLLImportComdatSymbols()1233 virtual bool shouldDLLImportComdatSymbols() const { 1234 return getTriple().isWindowsMSVCEnvironment() || 1235 getTriple().isWindowsItaniumEnvironment() || getTriple().isPS(); 1236 } 1237 1238 // Does this target have PS4 specific dllimport/export handling? hasPS4DLLImportExport()1239 virtual bool hasPS4DLLImportExport() const { 1240 return getTriple().isPS() || 1241 // Windows Itanium support allows for testing the SCEI flavour of 1242 // dllimport/export handling on a Windows system. 1243 (getTriple().isWindowsItaniumEnvironment() && 1244 getTriple().getVendor() == llvm::Triple::SCEI); 1245 } 1246 1247 /// Set forced language options. 1248 /// 1249 /// Apply changes to the target information with respect to certain 1250 /// language options which change the target configuration and adjust 1251 /// the language based on the target options where applicable. 1252 virtual void adjust(DiagnosticsEngine &Diags, LangOptions &Opts); 1253 1254 /// Adjust target options based on codegen options. adjustTargetOptions(const CodeGenOptions & CGOpts,TargetOptions & TargetOpts)1255 virtual void adjustTargetOptions(const CodeGenOptions &CGOpts, 1256 TargetOptions &TargetOpts) const {} 1257 1258 /// Initialize the map with the default set of target features for the 1259 /// CPU this should include all legal feature strings on the target. 1260 /// 1261 /// \return False on error (invalid features). 1262 virtual bool initFeatureMap(llvm::StringMap<bool> &Features, 1263 DiagnosticsEngine &Diags, StringRef CPU, 1264 const std::vector<std::string> &FeatureVec) const; 1265 1266 /// Get the ABI currently in use. getABI()1267 virtual StringRef getABI() const { return StringRef(); } 1268 1269 /// Get the C++ ABI currently in use. getCXXABI()1270 TargetCXXABI getCXXABI() const { 1271 return TheCXXABI; 1272 } 1273 1274 /// Target the specified CPU. 1275 /// 1276 /// \return False on error (invalid CPU name). setCPU(const std::string & Name)1277 virtual bool setCPU(const std::string &Name) { 1278 return false; 1279 } 1280 1281 /// Fill a SmallVectorImpl with the valid values to setCPU. fillValidCPUList(SmallVectorImpl<StringRef> & Values)1282 virtual void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const {} 1283 1284 /// Fill a SmallVectorImpl with the valid values for tuning CPU. fillValidTuneCPUList(SmallVectorImpl<StringRef> & Values)1285 virtual void fillValidTuneCPUList(SmallVectorImpl<StringRef> &Values) const { 1286 fillValidCPUList(Values); 1287 } 1288 1289 /// brief Determine whether this TargetInfo supports the given CPU name. isValidCPUName(StringRef Name)1290 virtual bool isValidCPUName(StringRef Name) const { 1291 return true; 1292 } 1293 1294 /// brief Determine whether this TargetInfo supports the given CPU name for 1295 // tuning. isValidTuneCPUName(StringRef Name)1296 virtual bool isValidTuneCPUName(StringRef Name) const { 1297 return isValidCPUName(Name); 1298 } 1299 1300 virtual ParsedTargetAttr parseTargetAttr(StringRef Str) const; 1301 1302 /// brief Determine whether this TargetInfo supports tune in target attribute. supportsTargetAttributeTune()1303 virtual bool supportsTargetAttributeTune() const { 1304 return false; 1305 } 1306 1307 /// Use the specified ABI. 1308 /// 1309 /// \return False on error (invalid ABI name). setABI(const std::string & Name)1310 virtual bool setABI(const std::string &Name) { 1311 return false; 1312 } 1313 1314 /// Use the specified unit for FP math. 1315 /// 1316 /// \return False on error (invalid unit name). setFPMath(StringRef Name)1317 virtual bool setFPMath(StringRef Name) { 1318 return false; 1319 } 1320 1321 /// Check if target has a given feature enabled hasFeatureEnabled(const llvm::StringMap<bool> & Features,StringRef Name)1322 virtual bool hasFeatureEnabled(const llvm::StringMap<bool> &Features, 1323 StringRef Name) const { 1324 return Features.lookup(Name); 1325 } 1326 1327 /// Enable or disable a specific target feature; 1328 /// the feature name must be valid. setFeatureEnabled(llvm::StringMap<bool> & Features,StringRef Name,bool Enabled)1329 virtual void setFeatureEnabled(llvm::StringMap<bool> &Features, 1330 StringRef Name, 1331 bool Enabled) const { 1332 Features[Name] = Enabled; 1333 } 1334 1335 /// Determine whether this TargetInfo supports the given feature. isValidFeatureName(StringRef Feature)1336 virtual bool isValidFeatureName(StringRef Feature) const { 1337 return true; 1338 } 1339 1340 /// Returns true if feature has an impact on target code 1341 /// generation and get its dependent options in second argument. getFeatureDepOptions(StringRef Feature,std::string & Options)1342 virtual bool getFeatureDepOptions(StringRef Feature, 1343 std::string &Options) const { 1344 return true; 1345 } 1346 1347 struct BranchProtectionInfo { 1348 LangOptions::SignReturnAddressScopeKind SignReturnAddr = 1349 LangOptions::SignReturnAddressScopeKind::None; 1350 LangOptions::SignReturnAddressKeyKind SignKey = 1351 LangOptions::SignReturnAddressKeyKind::AKey; 1352 bool BranchTargetEnforcement = false; 1353 }; 1354 1355 /// Determine if the Architecture in this TargetInfo supports branch 1356 /// protection isBranchProtectionSupportedArch(StringRef Arch)1357 virtual bool isBranchProtectionSupportedArch(StringRef Arch) const { 1358 return false; 1359 } 1360 1361 /// Determine if this TargetInfo supports the given branch protection 1362 /// specification validateBranchProtection(StringRef Spec,StringRef Arch,BranchProtectionInfo & BPI,StringRef & Err)1363 virtual bool validateBranchProtection(StringRef Spec, StringRef Arch, 1364 BranchProtectionInfo &BPI, 1365 StringRef &Err) const { 1366 Err = ""; 1367 return false; 1368 } 1369 1370 /// Perform initialization based on the user configured 1371 /// set of features (e.g., +sse4). 1372 /// 1373 /// The list is guaranteed to have at most one entry per feature. 1374 /// 1375 /// The target may modify the features list, to change which options are 1376 /// passed onwards to the backend. 1377 /// FIXME: This part should be fixed so that we can change handleTargetFeatures 1378 /// to merely a TargetInfo initialization routine. 1379 /// 1380 /// \return False on error. handleTargetFeatures(std::vector<std::string> & Features,DiagnosticsEngine & Diags)1381 virtual bool handleTargetFeatures(std::vector<std::string> &Features, 1382 DiagnosticsEngine &Diags) { 1383 return true; 1384 } 1385 1386 /// Determine whether the given target has the given feature. hasFeature(StringRef Feature)1387 virtual bool hasFeature(StringRef Feature) const { 1388 return false; 1389 } 1390 1391 /// Identify whether this target supports multiversioning of functions, 1392 /// which requires support for cpu_supports and cpu_is functionality. supportsMultiVersioning()1393 bool supportsMultiVersioning() const { 1394 return getTriple().isX86() || getTriple().isAArch64(); 1395 } 1396 1397 /// Identify whether this target supports IFuncs. supportsIFunc()1398 bool supportsIFunc() const { 1399 return getTriple().isOSBinFormatELF() && !getTriple().isOSFuchsia(); 1400 } 1401 1402 // Validate the contents of the __builtin_cpu_supports(const char*) 1403 // argument. validateCpuSupports(StringRef Name)1404 virtual bool validateCpuSupports(StringRef Name) const { return false; } 1405 1406 // Return the target-specific priority for features/cpus/vendors so 1407 // that they can be properly sorted for checking. multiVersionSortPriority(StringRef Name)1408 virtual unsigned multiVersionSortPriority(StringRef Name) const { 1409 return 0; 1410 } 1411 1412 // Return the target-specific cost for feature 1413 // that taken into account in priority sorting. multiVersionFeatureCost()1414 virtual unsigned multiVersionFeatureCost() const { return 0; } 1415 1416 // Validate the contents of the __builtin_cpu_is(const char*) 1417 // argument. validateCpuIs(StringRef Name)1418 virtual bool validateCpuIs(StringRef Name) const { return false; } 1419 1420 // Validate a cpu_dispatch/cpu_specific CPU option, which is a different list 1421 // from cpu_is, since it checks via features rather than CPUs directly. validateCPUSpecificCPUDispatch(StringRef Name)1422 virtual bool validateCPUSpecificCPUDispatch(StringRef Name) const { 1423 return false; 1424 } 1425 1426 // Get the character to be added for mangling purposes for cpu_specific. CPUSpecificManglingCharacter(StringRef Name)1427 virtual char CPUSpecificManglingCharacter(StringRef Name) const { 1428 llvm_unreachable( 1429 "cpu_specific Multiversioning not implemented on this target"); 1430 } 1431 1432 // Get the value for the 'tune-cpu' flag for a cpu_specific variant with the 1433 // programmer-specified 'Name'. getCPUSpecificTuneName(StringRef Name)1434 virtual StringRef getCPUSpecificTuneName(StringRef Name) const { 1435 llvm_unreachable( 1436 "cpu_specific Multiversioning not implemented on this target"); 1437 } 1438 1439 // Get a list of the features that make up the CPU option for 1440 // cpu_specific/cpu_dispatch so that it can be passed to llvm as optimization 1441 // options. getCPUSpecificCPUDispatchFeatures(StringRef Name,llvm::SmallVectorImpl<StringRef> & Features)1442 virtual void getCPUSpecificCPUDispatchFeatures( 1443 StringRef Name, llvm::SmallVectorImpl<StringRef> &Features) const { 1444 llvm_unreachable( 1445 "cpu_specific Multiversioning not implemented on this target"); 1446 } 1447 1448 // Get the cache line size of a given cpu. This method switches over 1449 // the given cpu and returns "std::nullopt" if the CPU is not found. getCPUCacheLineSize()1450 virtual std::optional<unsigned> getCPUCacheLineSize() const { 1451 return std::nullopt; 1452 } 1453 1454 // Returns maximal number of args passed in registers. getRegParmMax()1455 unsigned getRegParmMax() const { 1456 assert(RegParmMax < 7 && "RegParmMax value is larger than AST can handle"); 1457 return RegParmMax; 1458 } 1459 1460 /// Whether the target supports thread-local storage. isTLSSupported()1461 bool isTLSSupported() const { 1462 return TLSSupported; 1463 } 1464 1465 /// Return the maximum alignment (in bits) of a TLS variable 1466 /// 1467 /// Gets the maximum alignment (in bits) of a TLS variable on this target. 1468 /// Returns zero if there is no such constraint. getMaxTLSAlign()1469 unsigned getMaxTLSAlign() const { return MaxTLSAlign; } 1470 1471 /// Whether target supports variable-length arrays. isVLASupported()1472 bool isVLASupported() const { return VLASupported; } 1473 1474 /// Whether the target supports SEH __try. isSEHTrySupported()1475 bool isSEHTrySupported() const { 1476 return getTriple().isOSWindows() && 1477 (getTriple().isX86() || 1478 getTriple().getArch() == llvm::Triple::aarch64); 1479 } 1480 1481 /// Return true if {|} are normal characters in the asm string. 1482 /// 1483 /// If this returns false (the default), then {abc|xyz} is syntax 1484 /// that says that when compiling for asm variant #0, "abc" should be 1485 /// generated, but when compiling for asm variant #1, "xyz" should be 1486 /// generated. hasNoAsmVariants()1487 bool hasNoAsmVariants() const { 1488 return NoAsmVariants; 1489 } 1490 1491 /// Return the register number that __builtin_eh_return_regno would 1492 /// return with the specified argument. 1493 /// This corresponds with TargetLowering's getExceptionPointerRegister 1494 /// and getExceptionSelectorRegister in the backend. getEHDataRegisterNumber(unsigned RegNo)1495 virtual int getEHDataRegisterNumber(unsigned RegNo) const { 1496 return -1; 1497 } 1498 1499 /// Return the section to use for C++ static initialization functions. getStaticInitSectionSpecifier()1500 virtual const char *getStaticInitSectionSpecifier() const { 1501 return nullptr; 1502 } 1503 getAddressSpaceMap()1504 const LangASMap &getAddressSpaceMap() const { return *AddrSpaceMap; } getTargetAddressSpace(LangAS AS)1505 unsigned getTargetAddressSpace(LangAS AS) const { 1506 if (isTargetAddressSpace(AS)) 1507 return toTargetAddressSpace(AS); 1508 return getAddressSpaceMap()[(unsigned)AS]; 1509 } 1510 1511 /// Map from the address space field in builtin description strings to the 1512 /// language address space. getOpenCLBuiltinAddressSpace(unsigned AS)1513 virtual LangAS getOpenCLBuiltinAddressSpace(unsigned AS) const { 1514 return getLangASFromTargetAS(AS); 1515 } 1516 1517 /// Map from the address space field in builtin description strings to the 1518 /// language address space. getCUDABuiltinAddressSpace(unsigned AS)1519 virtual LangAS getCUDABuiltinAddressSpace(unsigned AS) const { 1520 return getLangASFromTargetAS(AS); 1521 } 1522 1523 /// Return an AST address space which can be used opportunistically 1524 /// for constant global memory. It must be possible to convert pointers into 1525 /// this address space to LangAS::Default. If no such address space exists, 1526 /// this may return std::nullopt, and such optimizations will be disabled. getConstantAddressSpace()1527 virtual std::optional<LangAS> getConstantAddressSpace() const { 1528 return LangAS::Default; 1529 } 1530 1531 // access target-specific GPU grid values that must be consistent between 1532 // host RTL (plugin), deviceRTL and clang. getGridValue()1533 virtual const llvm::omp::GV &getGridValue() const { 1534 llvm_unreachable("getGridValue not implemented on this target"); 1535 } 1536 1537 /// Retrieve the name of the platform as it is used in the 1538 /// availability attribute. getPlatformName()1539 StringRef getPlatformName() const { return PlatformName; } 1540 1541 /// Retrieve the minimum desired version of the platform, to 1542 /// which the program should be compiled. getPlatformMinVersion()1543 VersionTuple getPlatformMinVersion() const { return PlatformMinVersion; } 1544 isBigEndian()1545 bool isBigEndian() const { return BigEndian; } isLittleEndian()1546 bool isLittleEndian() const { return !BigEndian; } 1547 1548 /// Whether the option -fextend-arguments={32,64} is supported on the target. supportsExtendIntArgs()1549 virtual bool supportsExtendIntArgs() const { return false; } 1550 1551 /// Controls if __arithmetic_fence is supported in the targeted backend. checkArithmeticFenceSupported()1552 virtual bool checkArithmeticFenceSupported() const { return false; } 1553 1554 /// Gets the default calling convention for the given target and 1555 /// declaration context. getDefaultCallingConv()1556 virtual CallingConv getDefaultCallingConv() const { 1557 // Not all targets will specify an explicit calling convention that we can 1558 // express. This will always do the right thing, even though it's not 1559 // an explicit calling convention. 1560 return CC_C; 1561 } 1562 1563 enum CallingConvCheckResult { 1564 CCCR_OK, 1565 CCCR_Warning, 1566 CCCR_Ignore, 1567 CCCR_Error, 1568 }; 1569 1570 /// Determines whether a given calling convention is valid for the 1571 /// target. A calling convention can either be accepted, produce a warning 1572 /// and be substituted with the default calling convention, or (someday) 1573 /// produce an error (such as using thiscall on a non-instance function). checkCallingConvention(CallingConv CC)1574 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const { 1575 switch (CC) { 1576 default: 1577 return CCCR_Warning; 1578 case CC_C: 1579 return CCCR_OK; 1580 } 1581 } 1582 1583 enum CallingConvKind { 1584 CCK_Default, 1585 CCK_ClangABI4OrPS4, 1586 CCK_MicrosoftWin64 1587 }; 1588 1589 virtual CallingConvKind getCallingConvKind(bool ClangABICompat4) const; 1590 1591 /// Controls whether explicitly defaulted (`= default`) special member 1592 /// functions disqualify something from being POD-for-the-purposes-of-layout. 1593 /// Historically, Clang didn't consider these acceptable for POD, but GCC 1594 /// does. So in newer Clang ABIs they are acceptable for POD to be compatible 1595 /// with GCC/Itanium ABI, and remains disqualifying for targets that need 1596 /// Clang backwards compatibility rather than GCC/Itanium ABI compatibility. 1597 virtual bool areDefaultedSMFStillPOD(const LangOptions&) const; 1598 1599 /// Controls if __builtin_longjmp / __builtin_setjmp can be lowered to 1600 /// llvm.eh.sjlj.longjmp / llvm.eh.sjlj.setjmp. hasSjLjLowering()1601 virtual bool hasSjLjLowering() const { 1602 return false; 1603 } 1604 1605 /// Check if the target supports CFProtection branch. 1606 virtual bool 1607 checkCFProtectionBranchSupported(DiagnosticsEngine &Diags) const; 1608 1609 /// Check if the target supports CFProtection return. 1610 virtual bool 1611 checkCFProtectionReturnSupported(DiagnosticsEngine &Diags) const; 1612 1613 /// Whether target allows to overalign ABI-specified preferred alignment allowsLargerPreferedTypeAlignment()1614 virtual bool allowsLargerPreferedTypeAlignment() const { return true; } 1615 1616 /// Whether target defaults to the `power` alignment rules of AIX. defaultsToAIXPowerAlignment()1617 virtual bool defaultsToAIXPowerAlignment() const { return false; } 1618 1619 /// Set supported OpenCL extensions and optional core features. setSupportedOpenCLOpts()1620 virtual void setSupportedOpenCLOpts() {} 1621 1622 virtual void supportAllOpenCLOpts(bool V = true) { 1623 #define OPENCLEXTNAME(Ext) \ 1624 setFeatureEnabled(getTargetOpts().OpenCLFeaturesMap, #Ext, V); 1625 #include "clang/Basic/OpenCLExtensions.def" 1626 } 1627 1628 /// Set supported OpenCL extensions as written on command line setCommandLineOpenCLOpts()1629 virtual void setCommandLineOpenCLOpts() { 1630 for (const auto &Ext : getTargetOpts().OpenCLExtensionsAsWritten) { 1631 bool IsPrefixed = (Ext[0] == '+' || Ext[0] == '-'); 1632 std::string Name = IsPrefixed ? Ext.substr(1) : Ext; 1633 bool V = IsPrefixed ? Ext[0] == '+' : true; 1634 1635 if (Name == "all") { 1636 supportAllOpenCLOpts(V); 1637 continue; 1638 } 1639 1640 getTargetOpts().OpenCLFeaturesMap[Name] = V; 1641 } 1642 } 1643 1644 /// Get supported OpenCL extensions and optional core features. getSupportedOpenCLOpts()1645 llvm::StringMap<bool> &getSupportedOpenCLOpts() { 1646 return getTargetOpts().OpenCLFeaturesMap; 1647 } 1648 1649 /// Get const supported OpenCL extensions and optional core features. getSupportedOpenCLOpts()1650 const llvm::StringMap<bool> &getSupportedOpenCLOpts() const { 1651 return getTargetOpts().OpenCLFeaturesMap; 1652 } 1653 1654 /// Get address space for OpenCL type. 1655 virtual LangAS getOpenCLTypeAddrSpace(OpenCLTypeKind TK) const; 1656 1657 /// \returns Target specific vtbl ptr address space. getVtblPtrAddressSpace()1658 virtual unsigned getVtblPtrAddressSpace() const { 1659 return 0; 1660 } 1661 1662 /// \returns If a target requires an address within a target specific address 1663 /// space \p AddressSpace to be converted in order to be used, then return the 1664 /// corresponding target specific DWARF address space. 1665 /// 1666 /// \returns Otherwise return std::nullopt and no conversion will be emitted 1667 /// in the DWARF. getDWARFAddressSpace(unsigned AddressSpace)1668 virtual std::optional<unsigned> getDWARFAddressSpace(unsigned AddressSpace) 1669 const { 1670 return std::nullopt; 1671 } 1672 1673 /// \returns The version of the SDK which was used during the compilation if 1674 /// one was specified, or an empty version otherwise. getSDKVersion()1675 const llvm::VersionTuple &getSDKVersion() const { 1676 return getTargetOpts().SDKVersion; 1677 } 1678 1679 /// Check the target is valid after it is fully initialized. validateTarget(DiagnosticsEngine & Diags)1680 virtual bool validateTarget(DiagnosticsEngine &Diags) const { 1681 return true; 1682 } 1683 1684 /// Check that OpenCL target has valid options setting based on OpenCL 1685 /// version. 1686 virtual bool validateOpenCLTarget(const LangOptions &Opts, 1687 DiagnosticsEngine &Diags) const; 1688 setAuxTarget(const TargetInfo * Aux)1689 virtual void setAuxTarget(const TargetInfo *Aux) {} 1690 1691 /// Whether target allows debuginfo types for decl only variables/functions. allowDebugInfoForExternalRef()1692 virtual bool allowDebugInfoForExternalRef() const { return false; } 1693 1694 /// Returns the darwin target variant triple, the variant of the deployment 1695 /// target for which the code is being compiled. getDarwinTargetVariantTriple()1696 const llvm::Triple *getDarwinTargetVariantTriple() const { 1697 return DarwinTargetVariantTriple ? &*DarwinTargetVariantTriple : nullptr; 1698 } 1699 1700 /// Returns the version of the darwin target variant SDK which was used during 1701 /// the compilation if one was specified, or an empty version otherwise. getDarwinTargetVariantSDKVersion()1702 const std::optional<VersionTuple> getDarwinTargetVariantSDKVersion() const { 1703 return !getTargetOpts().DarwinTargetVariantSDKVersion.empty() 1704 ? getTargetOpts().DarwinTargetVariantSDKVersion 1705 : std::optional<VersionTuple>(); 1706 } 1707 1708 protected: 1709 /// Copy type and layout related info. 1710 void copyAuxTarget(const TargetInfo *Aux); getPointerWidthV(LangAS AddrSpace)1711 virtual uint64_t getPointerWidthV(LangAS AddrSpace) const { 1712 return PointerWidth; 1713 } getPointerAlignV(LangAS AddrSpace)1714 virtual uint64_t getPointerAlignV(LangAS AddrSpace) const { 1715 return PointerAlign; 1716 } getPtrDiffTypeV(LangAS AddrSpace)1717 virtual enum IntType getPtrDiffTypeV(LangAS AddrSpace) const { 1718 return PtrDiffType; 1719 } 1720 virtual ArrayRef<const char *> getGCCRegNames() const = 0; 1721 virtual ArrayRef<GCCRegAlias> getGCCRegAliases() const = 0; getGCCAddlRegNames()1722 virtual ArrayRef<AddlRegName> getGCCAddlRegNames() const { 1723 return std::nullopt; 1724 } 1725 1726 private: 1727 // Assert the values for the fractional and integral bits for each fixed point 1728 // type follow the restrictions given in clause 6.2.6.3 of N1169. 1729 void CheckFixedPointBits() const; 1730 }; 1731 1732 } // end namespace clang 1733 1734 #endif 1735