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