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/LLVM.h"
19 #include "clang/Basic/CodeGenOptions.h"
20 #include "clang/Basic/Specifiers.h"
21 #include "clang/Basic/TargetCXXABI.h"
22 #include "clang/Basic/TargetOptions.h"
23 #include "llvm/ADT/APFloat.h"
24 #include "llvm/ADT/APInt.h"
25 #include "llvm/ADT/ArrayRef.h"
26 #include "llvm/ADT/IntrusiveRefCntPtr.h"
27 #include "llvm/ADT/Optional.h"
28 #include "llvm/ADT/SmallSet.h"
29 #include "llvm/ADT/StringMap.h"
30 #include "llvm/ADT/StringRef.h"
31 #include "llvm/ADT/Triple.h"
32 #include "llvm/Support/DataTypes.h"
33 #include "llvm/Support/VersionTuple.h"
34 #include <cassert>
35 #include <string>
36 #include <vector>
37 
38 namespace llvm {
39 struct fltSemantics;
40 class DataLayout;
41 }
42 
43 namespace clang {
44 class DiagnosticsEngine;
45 class LangOptions;
46 class CodeGenOptions;
47 class MacroBuilder;
48 class QualType;
49 class SourceLocation;
50 class SourceManager;
51 
52 namespace Builtin { struct Info; }
53 
54 /// Fields controlling how types are laid out in memory; these may need to
55 /// be copied for targets like AMDGPU that base their ABIs on an auxiliary
56 /// CPU target.
57 struct TransferrableTargetInfo {
58   unsigned char PointerWidth, PointerAlign;
59   unsigned char BoolWidth, BoolAlign;
60   unsigned char IntWidth, IntAlign;
61   unsigned char HalfWidth, HalfAlign;
62   unsigned char FloatWidth, FloatAlign;
63   unsigned char DoubleWidth, DoubleAlign;
64   unsigned char LongDoubleWidth, LongDoubleAlign, Float128Align;
65   unsigned char LargeArrayMinWidth, LargeArrayAlign;
66   unsigned char LongWidth, LongAlign;
67   unsigned char LongLongWidth, LongLongAlign;
68 
69   // Fixed point bit widths
70   unsigned char ShortAccumWidth, ShortAccumAlign;
71   unsigned char AccumWidth, AccumAlign;
72   unsigned char LongAccumWidth, LongAccumAlign;
73   unsigned char ShortFractWidth, ShortFractAlign;
74   unsigned char FractWidth, FractAlign;
75   unsigned char LongFractWidth, LongFractAlign;
76 
77   // If true, unsigned fixed point types have the same number of fractional bits
78   // as their signed counterparts, forcing the unsigned types to have one extra
79   // bit of padding. Otherwise, unsigned fixed point types have
80   // one more fractional bit than its corresponding signed type. This is false
81   // by default.
82   bool PaddingOnUnsignedFixedPoint;
83 
84   // Fixed point integral and fractional bit sizes
85   // Saturated types share the same integral/fractional bits as their
86   // corresponding unsaturated types.
87   // For simplicity, the fractional bits in a _Fract type will be one less the
88   // width of that _Fract type. This leaves all signed _Fract types having no
89   // padding and unsigned _Fract types will only have 1 bit of padding after the
90   // sign if PaddingOnUnsignedFixedPoint is set.
91   unsigned char ShortAccumScale;
92   unsigned char AccumScale;
93   unsigned char LongAccumScale;
94 
95   unsigned char SuitableAlign;
96   unsigned char DefaultAlignForAttributeAligned;
97   unsigned char MinGlobalAlign;
98 
99   unsigned short NewAlign;
100   unsigned short MaxVectorAlign;
101   unsigned short MaxTLSAlign;
102 
103   const llvm::fltSemantics *HalfFormat, *FloatFormat, *DoubleFormat,
104     *LongDoubleFormat, *Float128Format;
105 
106   ///===---- Target Data Type Query Methods -------------------------------===//
107   enum IntType {
108     NoInt = 0,
109     SignedChar,
110     UnsignedChar,
111     SignedShort,
112     UnsignedShort,
113     SignedInt,
114     UnsignedInt,
115     SignedLong,
116     UnsignedLong,
117     SignedLongLong,
118     UnsignedLongLong
119   };
120 
121   enum RealType {
122     NoFloat = 255,
123     Float = 0,
124     Double,
125     LongDouble,
126     Float128
127   };
128 protected:
129   IntType SizeType, IntMaxType, PtrDiffType, IntPtrType, WCharType,
130           WIntType, Char16Type, Char32Type, Int64Type, SigAtomicType,
131           ProcessIDType;
132 
133   /// Whether Objective-C's built-in boolean type should be signed char.
134   ///
135   /// Otherwise, when this flag is not set, the normal built-in boolean type is
136   /// used.
137   unsigned UseSignedCharForObjCBool : 1;
138 
139   /// Control whether the alignment of bit-field types is respected when laying
140   /// out structures. If true, then the alignment of the bit-field type will be
141   /// used to (a) impact the alignment of the containing structure, and (b)
142   /// ensure that the individual bit-field will not straddle an alignment
143   /// boundary.
144   unsigned UseBitFieldTypeAlignment : 1;
145 
146   /// Whether zero length bitfields (e.g., int : 0;) force alignment of
147   /// the next bitfield.
148   ///
149   /// If the alignment of the zero length bitfield is greater than the member
150   /// that follows it, `bar', `bar' will be aligned as the type of the
151   /// zero-length bitfield.
152   unsigned UseZeroLengthBitfieldAlignment : 1;
153 
154   ///  Whether explicit bit field alignment attributes are honored.
155   unsigned UseExplicitBitFieldAlignment : 1;
156 
157   /// If non-zero, specifies a fixed alignment value for bitfields that follow
158   /// zero length bitfield, regardless of the zero length bitfield type.
159   unsigned ZeroLengthBitfieldBoundary;
160 };
161 
162 /// Exposes information about the current target.
163 ///
164 class TargetInfo : public virtual TransferrableTargetInfo,
165                    public RefCountedBase<TargetInfo> {
166   std::shared_ptr<TargetOptions> TargetOpts;
167   llvm::Triple Triple;
168 protected:
169   // Target values set by the ctor of the actual target implementation.  Default
170   // values are specified by the TargetInfo constructor.
171   bool BigEndian;
172   bool TLSSupported;
173   bool VLASupported;
174   bool NoAsmVariants;  // True if {|} are normal characters.
175   bool HasLegalHalfType; // True if the backend supports operations on the half
176                          // LLVM IR type.
177   bool HasFloat128;
178   bool HasFloat16;
179 
180   unsigned char MaxAtomicPromoteWidth, MaxAtomicInlineWidth;
181   unsigned short SimdDefaultAlign;
182   std::unique_ptr<llvm::DataLayout> DataLayout;
183   const char *MCountName;
184   unsigned char RegParmMax, SSERegParmMax;
185   TargetCXXABI TheCXXABI;
186   const LangASMap *AddrSpaceMap;
187 
188   mutable StringRef PlatformName;
189   mutable VersionTuple PlatformMinVersion;
190 
191   unsigned HasAlignMac68kSupport : 1;
192   unsigned RealTypeUsesObjCFPRet : 3;
193   unsigned ComplexLongDoubleUsesFP2Ret : 1;
194 
195   unsigned HasBuiltinMSVaList : 1;
196 
197   unsigned IsRenderScriptTarget : 1;
198 
199   unsigned HasAArch64SVETypes : 1;
200 
201   // TargetInfo Constructor.  Default initializes all fields.
202   TargetInfo(const llvm::Triple &T);
203 
204   void resetDataLayout(StringRef DL);
205 
206 public:
207   /// Construct a target for the given options.
208   ///
209   /// \param Opts - The options to use to initialize the target. The target may
210   /// modify the options to canonicalize the target feature information to match
211   /// what the backend expects.
212   static TargetInfo *
213   CreateTargetInfo(DiagnosticsEngine &Diags,
214                    const std::shared_ptr<TargetOptions> &Opts);
215 
216   virtual ~TargetInfo();
217 
218   /// Retrieve the target options.
219   TargetOptions &getTargetOpts() const {
220     assert(TargetOpts && "Missing target options");
221     return *TargetOpts;
222   }
223 
224   /// The different kinds of __builtin_va_list types defined by
225   /// the target implementation.
226   enum BuiltinVaListKind {
227     /// typedef char* __builtin_va_list;
228     CharPtrBuiltinVaList = 0,
229 
230     /// typedef void* __builtin_va_list;
231     VoidPtrBuiltinVaList,
232 
233     /// __builtin_va_list as defined by the AArch64 ABI
234     /// http://infocenter.arm.com/help/topic/com.arm.doc.ihi0055a/IHI0055A_aapcs64.pdf
235     AArch64ABIBuiltinVaList,
236 
237     /// __builtin_va_list as defined by the PNaCl ABI:
238     /// http://www.chromium.org/nativeclient/pnacl/bitcode-abi#TOC-Machine-Types
239     PNaClABIBuiltinVaList,
240 
241     /// __builtin_va_list as defined by the Power ABI:
242     /// https://www.power.org
243     ///        /resources/downloads/Power-Arch-32-bit-ABI-supp-1.0-Embedded.pdf
244     PowerABIBuiltinVaList,
245 
246     /// __builtin_va_list as defined by the x86-64 ABI:
247     /// http://refspecs.linuxbase.org/elf/x86_64-abi-0.21.pdf
248     X86_64ABIBuiltinVaList,
249 
250     /// __builtin_va_list as defined by ARM AAPCS ABI
251     /// http://infocenter.arm.com
252     //        /help/topic/com.arm.doc.ihi0042d/IHI0042D_aapcs.pdf
253     AAPCSABIBuiltinVaList,
254 
255     // typedef struct __va_list_tag
256     //   {
257     //     long __gpr;
258     //     long __fpr;
259     //     void *__overflow_arg_area;
260     //     void *__reg_save_area;
261     //   } va_list[1];
262     SystemZBuiltinVaList
263   };
264 
265 protected:
266   /// Specify if mangling based on address space map should be used or
267   /// not for language specific address spaces
268   bool UseAddrSpaceMapMangling;
269 
270 public:
271   IntType getSizeType() const { return SizeType; }
272   IntType getSignedSizeType() const {
273     switch (SizeType) {
274     case UnsignedShort:
275       return SignedShort;
276     case UnsignedInt:
277       return SignedInt;
278     case UnsignedLong:
279       return SignedLong;
280     case UnsignedLongLong:
281       return SignedLongLong;
282     default:
283       llvm_unreachable("Invalid SizeType");
284     }
285   }
286   IntType getIntMaxType() const { return IntMaxType; }
287   IntType getUIntMaxType() const {
288     return getCorrespondingUnsignedType(IntMaxType);
289   }
290   IntType getPtrDiffType(unsigned AddrSpace) const {
291     return AddrSpace == 0 ? PtrDiffType : getPtrDiffTypeV(AddrSpace);
292   }
293   IntType getUnsignedPtrDiffType(unsigned AddrSpace) const {
294     return getCorrespondingUnsignedType(getPtrDiffType(AddrSpace));
295   }
296   IntType getIntPtrType() const { return IntPtrType; }
297   IntType getUIntPtrType() const {
298     return getCorrespondingUnsignedType(IntPtrType);
299   }
300   IntType getWCharType() const { return WCharType; }
301   IntType getWIntType() const { return WIntType; }
302   IntType getChar16Type() const { return Char16Type; }
303   IntType getChar32Type() const { return Char32Type; }
304   IntType getInt64Type() const { return Int64Type; }
305   IntType getUInt64Type() const {
306     return getCorrespondingUnsignedType(Int64Type);
307   }
308   IntType getSigAtomicType() const { return SigAtomicType; }
309   IntType getProcessIDType() const { return ProcessIDType; }
310 
311   static IntType getCorrespondingUnsignedType(IntType T) {
312     switch (T) {
313     case SignedChar:
314       return UnsignedChar;
315     case SignedShort:
316       return UnsignedShort;
317     case SignedInt:
318       return UnsignedInt;
319     case SignedLong:
320       return UnsignedLong;
321     case SignedLongLong:
322       return UnsignedLongLong;
323     default:
324       llvm_unreachable("Unexpected signed integer type");
325     }
326   }
327 
328   /// In the event this target uses the same number of fractional bits for its
329   /// unsigned types as it does with its signed counterparts, there will be
330   /// exactly one bit of padding.
331   /// Return true if unsigned fixed point types have padding for this target.
332   bool doUnsignedFixedPointTypesHavePadding() const {
333     return PaddingOnUnsignedFixedPoint;
334   }
335 
336   /// Return the width (in bits) of the specified integer type enum.
337   ///
338   /// For example, SignedInt -> getIntWidth().
339   unsigned getTypeWidth(IntType T) const;
340 
341   /// Return integer type with specified width.
342   virtual IntType getIntTypeByWidth(unsigned BitWidth, bool IsSigned) const;
343 
344   /// Return the smallest integer type with at least the specified width.
345   virtual IntType getLeastIntTypeByWidth(unsigned BitWidth,
346                                          bool IsSigned) const;
347 
348   /// Return floating point type with specified width.
349   RealType getRealTypeByWidth(unsigned BitWidth) const;
350 
351   /// Return the alignment (in bits) of the specified integer type enum.
352   ///
353   /// For example, SignedInt -> getIntAlign().
354   unsigned getTypeAlign(IntType T) const;
355 
356   /// Returns true if the type is signed; false otherwise.
357   static bool isTypeSigned(IntType T);
358 
359   /// Return the width of pointers on this target, for the
360   /// specified address space.
361   uint64_t getPointerWidth(unsigned AddrSpace) const {
362     return AddrSpace == 0 ? PointerWidth : getPointerWidthV(AddrSpace);
363   }
364   uint64_t getPointerAlign(unsigned AddrSpace) const {
365     return AddrSpace == 0 ? PointerAlign : getPointerAlignV(AddrSpace);
366   }
367 
368   /// Return the maximum width of pointers on this target.
369   virtual uint64_t getMaxPointerWidth() const {
370     return PointerWidth;
371   }
372 
373   /// Get integer value for null pointer.
374   /// \param AddrSpace address space of pointee in source language.
375   virtual uint64_t getNullPointerValue(LangAS AddrSpace) const { return 0; }
376 
377   /// Return the size of '_Bool' and C++ 'bool' for this target, in bits.
378   unsigned getBoolWidth() const { return BoolWidth; }
379 
380   /// Return the alignment of '_Bool' and C++ 'bool' for this target.
381   unsigned getBoolAlign() const { return BoolAlign; }
382 
383   unsigned getCharWidth() const { return 8; } // FIXME
384   unsigned getCharAlign() const { return 8; } // FIXME
385 
386   /// Return the size of 'signed short' and 'unsigned short' for this
387   /// target, in bits.
388   unsigned getShortWidth() const { return 16; } // FIXME
389 
390   /// Return the alignment of 'signed short' and 'unsigned short' for
391   /// this target.
392   unsigned getShortAlign() const { return 16; } // FIXME
393 
394   /// getIntWidth/Align - Return the size of 'signed int' and 'unsigned int' for
395   /// this target, in bits.
396   unsigned getIntWidth() const { return IntWidth; }
397   unsigned getIntAlign() const { return IntAlign; }
398 
399   /// getLongWidth/Align - Return the size of 'signed long' and 'unsigned long'
400   /// for this target, in bits.
401   unsigned getLongWidth() const { return LongWidth; }
402   unsigned getLongAlign() const { return LongAlign; }
403 
404   /// getLongLongWidth/Align - Return the size of 'signed long long' and
405   /// 'unsigned long long' for this target, in bits.
406   unsigned getLongLongWidth() const { return LongLongWidth; }
407   unsigned getLongLongAlign() const { return LongLongAlign; }
408 
409   /// getShortAccumWidth/Align - Return the size of 'signed short _Accum' and
410   /// 'unsigned short _Accum' for this target, in bits.
411   unsigned getShortAccumWidth() const { return ShortAccumWidth; }
412   unsigned getShortAccumAlign() const { return ShortAccumAlign; }
413 
414   /// getAccumWidth/Align - Return the size of 'signed _Accum' and
415   /// 'unsigned _Accum' for this target, in bits.
416   unsigned getAccumWidth() const { return AccumWidth; }
417   unsigned getAccumAlign() const { return AccumAlign; }
418 
419   /// getLongAccumWidth/Align - Return the size of 'signed long _Accum' and
420   /// 'unsigned long _Accum' for this target, in bits.
421   unsigned getLongAccumWidth() const { return LongAccumWidth; }
422   unsigned getLongAccumAlign() const { return LongAccumAlign; }
423 
424   /// getShortFractWidth/Align - Return the size of 'signed short _Fract' and
425   /// 'unsigned short _Fract' for this target, in bits.
426   unsigned getShortFractWidth() const { return ShortFractWidth; }
427   unsigned getShortFractAlign() const { return ShortFractAlign; }
428 
429   /// getFractWidth/Align - Return the size of 'signed _Fract' and
430   /// 'unsigned _Fract' for this target, in bits.
431   unsigned getFractWidth() const { return FractWidth; }
432   unsigned getFractAlign() const { return FractAlign; }
433 
434   /// getLongFractWidth/Align - Return the size of 'signed long _Fract' and
435   /// 'unsigned long _Fract' for this target, in bits.
436   unsigned getLongFractWidth() const { return LongFractWidth; }
437   unsigned getLongFractAlign() const { return LongFractAlign; }
438 
439   /// getShortAccumScale/IBits - Return the number of fractional/integral bits
440   /// in a 'signed short _Accum' type.
441   unsigned getShortAccumScale() const { return ShortAccumScale; }
442   unsigned getShortAccumIBits() const {
443     return ShortAccumWidth - ShortAccumScale - 1;
444   }
445 
446   /// getAccumScale/IBits - Return the number of fractional/integral bits
447   /// in a 'signed _Accum' type.
448   unsigned getAccumScale() const { return AccumScale; }
449   unsigned getAccumIBits() const { return AccumWidth - AccumScale - 1; }
450 
451   /// getLongAccumScale/IBits - Return the number of fractional/integral bits
452   /// in a 'signed long _Accum' type.
453   unsigned getLongAccumScale() const { return LongAccumScale; }
454   unsigned getLongAccumIBits() const {
455     return LongAccumWidth - LongAccumScale - 1;
456   }
457 
458   /// getUnsignedShortAccumScale/IBits - Return the number of
459   /// fractional/integral bits in a 'unsigned short _Accum' type.
460   unsigned getUnsignedShortAccumScale() const {
461     return PaddingOnUnsignedFixedPoint ? ShortAccumScale : ShortAccumScale + 1;
462   }
463   unsigned getUnsignedShortAccumIBits() const {
464     return PaddingOnUnsignedFixedPoint
465                ? getShortAccumIBits()
466                : ShortAccumWidth - getUnsignedShortAccumScale();
467   }
468 
469   /// getUnsignedAccumScale/IBits - Return the number of fractional/integral
470   /// bits in a 'unsigned _Accum' type.
471   unsigned getUnsignedAccumScale() const {
472     return PaddingOnUnsignedFixedPoint ? AccumScale : AccumScale + 1;
473   }
474   unsigned getUnsignedAccumIBits() const {
475     return PaddingOnUnsignedFixedPoint ? getAccumIBits()
476                                        : AccumWidth - getUnsignedAccumScale();
477   }
478 
479   /// getUnsignedLongAccumScale/IBits - Return the number of fractional/integral
480   /// bits in a 'unsigned long _Accum' type.
481   unsigned getUnsignedLongAccumScale() const {
482     return PaddingOnUnsignedFixedPoint ? LongAccumScale : LongAccumScale + 1;
483   }
484   unsigned getUnsignedLongAccumIBits() const {
485     return PaddingOnUnsignedFixedPoint
486                ? getLongAccumIBits()
487                : LongAccumWidth - getUnsignedLongAccumScale();
488   }
489 
490   /// getShortFractScale - Return the number of fractional bits
491   /// in a 'signed short _Fract' type.
492   unsigned getShortFractScale() const { return ShortFractWidth - 1; }
493 
494   /// getFractScale - Return the number of fractional bits
495   /// in a 'signed _Fract' type.
496   unsigned getFractScale() const { return FractWidth - 1; }
497 
498   /// getLongFractScale - Return the number of fractional bits
499   /// in a 'signed long _Fract' type.
500   unsigned getLongFractScale() const { return LongFractWidth - 1; }
501 
502   /// getUnsignedShortFractScale - Return the number of fractional bits
503   /// in a 'unsigned short _Fract' type.
504   unsigned getUnsignedShortFractScale() const {
505     return PaddingOnUnsignedFixedPoint ? getShortFractScale()
506                                        : getShortFractScale() + 1;
507   }
508 
509   /// getUnsignedFractScale - Return the number of fractional bits
510   /// in a 'unsigned _Fract' type.
511   unsigned getUnsignedFractScale() const {
512     return PaddingOnUnsignedFixedPoint ? getFractScale() : getFractScale() + 1;
513   }
514 
515   /// getUnsignedLongFractScale - Return the number of fractional bits
516   /// in a 'unsigned long _Fract' type.
517   unsigned getUnsignedLongFractScale() const {
518     return PaddingOnUnsignedFixedPoint ? getLongFractScale()
519                                        : getLongFractScale() + 1;
520   }
521 
522   /// Determine whether the __int128 type is supported on this target.
523   virtual bool hasInt128Type() const {
524     return (getPointerWidth(0) >= 64) || getTargetOpts().ForceEnableInt128;
525   } // FIXME
526 
527   /// Determine whether _Float16 is supported on this target.
528   virtual bool hasLegalHalfType() const { return HasLegalHalfType; }
529 
530   /// Determine whether the __float128 type is supported on this target.
531   virtual bool hasFloat128Type() const { return HasFloat128; }
532 
533   /// Determine whether the _Float16 type is supported on this target.
534   virtual bool hasFloat16Type() const { return HasFloat16; }
535 
536   /// Return the alignment that is suitable for storing any
537   /// object with a fundamental alignment requirement.
538   unsigned getSuitableAlign() const { return SuitableAlign; }
539 
540   /// Return the default alignment for __attribute__((aligned)) on
541   /// this target, to be used if no alignment value is specified.
542   unsigned getDefaultAlignForAttributeAligned() const {
543     return DefaultAlignForAttributeAligned;
544   }
545 
546   /// getMinGlobalAlign - Return the minimum alignment of a global variable,
547   /// unless its alignment is explicitly reduced via attributes.
548   virtual unsigned getMinGlobalAlign (uint64_t) const {
549     return MinGlobalAlign;
550   }
551 
552   /// Return the largest alignment for which a suitably-sized allocation with
553   /// '::operator new(size_t)' is guaranteed to produce a correctly-aligned
554   /// pointer.
555   unsigned getNewAlign() const {
556     return NewAlign ? NewAlign : std::max(LongDoubleAlign, LongLongAlign);
557   }
558 
559   /// getWCharWidth/Align - Return the size of 'wchar_t' for this target, in
560   /// bits.
561   unsigned getWCharWidth() const { return getTypeWidth(WCharType); }
562   unsigned getWCharAlign() const { return getTypeAlign(WCharType); }
563 
564   /// getChar16Width/Align - Return the size of 'char16_t' for this target, in
565   /// bits.
566   unsigned getChar16Width() const { return getTypeWidth(Char16Type); }
567   unsigned getChar16Align() const { return getTypeAlign(Char16Type); }
568 
569   /// getChar32Width/Align - Return the size of 'char32_t' for this target, in
570   /// bits.
571   unsigned getChar32Width() const { return getTypeWidth(Char32Type); }
572   unsigned getChar32Align() const { return getTypeAlign(Char32Type); }
573 
574   /// getHalfWidth/Align/Format - Return the size/align/format of 'half'.
575   unsigned getHalfWidth() const { return HalfWidth; }
576   unsigned getHalfAlign() const { return HalfAlign; }
577   const llvm::fltSemantics &getHalfFormat() const { return *HalfFormat; }
578 
579   /// getFloatWidth/Align/Format - Return the size/align/format of 'float'.
580   unsigned getFloatWidth() const { return FloatWidth; }
581   unsigned getFloatAlign() const { return FloatAlign; }
582   const llvm::fltSemantics &getFloatFormat() const { return *FloatFormat; }
583 
584   /// getDoubleWidth/Align/Format - Return the size/align/format of 'double'.
585   unsigned getDoubleWidth() const { return DoubleWidth; }
586   unsigned getDoubleAlign() const { return DoubleAlign; }
587   const llvm::fltSemantics &getDoubleFormat() const { return *DoubleFormat; }
588 
589   /// getLongDoubleWidth/Align/Format - Return the size/align/format of 'long
590   /// double'.
591   unsigned getLongDoubleWidth() const { return LongDoubleWidth; }
592   unsigned getLongDoubleAlign() const { return LongDoubleAlign; }
593   const llvm::fltSemantics &getLongDoubleFormat() const {
594     return *LongDoubleFormat;
595   }
596 
597   /// getFloat128Width/Align/Format - Return the size/align/format of
598   /// '__float128'.
599   unsigned getFloat128Width() const { return 128; }
600   unsigned getFloat128Align() const { return Float128Align; }
601   const llvm::fltSemantics &getFloat128Format() const {
602     return *Float128Format;
603   }
604 
605   /// Return the mangled code of long double.
606   virtual const char *getLongDoubleMangling() const { return "e"; }
607 
608   /// Return the mangled code of __float128.
609   virtual const char *getFloat128Mangling() const { return "g"; }
610 
611   /// Return the value for the C99 FLT_EVAL_METHOD macro.
612   virtual unsigned getFloatEvalMethod() const { return 0; }
613 
614   // getLargeArrayMinWidth/Align - Return the minimum array size that is
615   // 'large' and its alignment.
616   unsigned getLargeArrayMinWidth() const { return LargeArrayMinWidth; }
617   unsigned getLargeArrayAlign() const { return LargeArrayAlign; }
618 
619   /// Return the maximum width lock-free atomic operation which will
620   /// ever be supported for the given target
621   unsigned getMaxAtomicPromoteWidth() const { return MaxAtomicPromoteWidth; }
622   /// Return the maximum width lock-free atomic operation which can be
623   /// inlined given the supported features of the given target.
624   unsigned getMaxAtomicInlineWidth() const { return MaxAtomicInlineWidth; }
625   /// Set the maximum inline or promote width lock-free atomic operation
626   /// for the given target.
627   virtual void setMaxAtomicWidth() {}
628   /// Returns true if the given target supports lock-free atomic
629   /// operations at the specified width and alignment.
630   virtual bool hasBuiltinAtomic(uint64_t AtomicSizeInBits,
631                                 uint64_t AlignmentInBits) const {
632     return AtomicSizeInBits <= AlignmentInBits &&
633            AtomicSizeInBits <= getMaxAtomicInlineWidth() &&
634            (AtomicSizeInBits <= getCharWidth() ||
635             llvm::isPowerOf2_64(AtomicSizeInBits / getCharWidth()));
636   }
637 
638   /// Return the maximum vector alignment supported for the given target.
639   unsigned getMaxVectorAlign() const { return MaxVectorAlign; }
640   /// Return default simd alignment for the given target. Generally, this
641   /// value is type-specific, but this alignment can be used for most of the
642   /// types for the given target.
643   unsigned getSimdDefaultAlign() const { return SimdDefaultAlign; }
644 
645   /// Return the alignment (in bits) of the thrown exception object. This is
646   /// only meaningful for targets that allocate C++ exceptions in a system
647   /// runtime, such as those using the Itanium C++ ABI.
648   virtual unsigned getExnObjectAlignment() const {
649     // Itanium says that an _Unwind_Exception has to be "double-word"
650     // aligned (and thus the end of it is also so-aligned), meaning 16
651     // bytes.  Of course, that was written for the actual Itanium,
652     // which is a 64-bit platform.  Classically, the ABI doesn't really
653     // specify the alignment on other platforms, but in practice
654     // libUnwind declares the struct with __attribute__((aligned)), so
655     // we assume that alignment here.  (It's generally 16 bytes, but
656     // some targets overwrite it.)
657     return getDefaultAlignForAttributeAligned();
658   }
659 
660   /// Return the size of intmax_t and uintmax_t for this target, in bits.
661   unsigned getIntMaxTWidth() const {
662     return getTypeWidth(IntMaxType);
663   }
664 
665   // Return the size of unwind_word for this target.
666   virtual unsigned getUnwindWordWidth() const { return getPointerWidth(0); }
667 
668   /// Return the "preferred" register width on this target.
669   virtual unsigned getRegisterWidth() const {
670     // Currently we assume the register width on the target matches the pointer
671     // width, we can introduce a new variable for this if/when some target wants
672     // it.
673     return PointerWidth;
674   }
675 
676   /// Returns the name of the mcount instrumentation function.
677   const char *getMCountName() const {
678     return MCountName;
679   }
680 
681   /// Check if the Objective-C built-in boolean type should be signed
682   /// char.
683   ///
684   /// Otherwise, if this returns false, the normal built-in boolean type
685   /// should also be used for Objective-C.
686   bool useSignedCharForObjCBool() const {
687     return UseSignedCharForObjCBool;
688   }
689   void noSignedCharForObjCBool() {
690     UseSignedCharForObjCBool = false;
691   }
692 
693   /// Check whether the alignment of bit-field types is respected
694   /// when laying out structures.
695   bool useBitFieldTypeAlignment() const {
696     return UseBitFieldTypeAlignment;
697   }
698 
699   /// Check whether zero length bitfields should force alignment of
700   /// the next member.
701   bool useZeroLengthBitfieldAlignment() const {
702     return UseZeroLengthBitfieldAlignment;
703   }
704 
705   /// Get the fixed alignment value in bits for a member that follows
706   /// a zero length bitfield.
707   unsigned getZeroLengthBitfieldBoundary() const {
708     return ZeroLengthBitfieldBoundary;
709   }
710 
711   /// Check whether explicit bitfield alignment attributes should be
712   //  honored, as in "__attribute__((aligned(2))) int b : 1;".
713   bool useExplicitBitFieldAlignment() const {
714     return UseExplicitBitFieldAlignment;
715   }
716 
717   /// Check whether this target support '\#pragma options align=mac68k'.
718   bool hasAlignMac68kSupport() const {
719     return HasAlignMac68kSupport;
720   }
721 
722   /// Return the user string for the specified integer type enum.
723   ///
724   /// For example, SignedShort -> "short".
725   static const char *getTypeName(IntType T);
726 
727   /// Return the constant suffix for the specified integer type enum.
728   ///
729   /// For example, SignedLong -> "L".
730   const char *getTypeConstantSuffix(IntType T) const;
731 
732   /// Return the printf format modifier for the specified
733   /// integer type enum.
734   ///
735   /// For example, SignedLong -> "l".
736   static const char *getTypeFormatModifier(IntType T);
737 
738   /// Check whether the given real type should use the "fpret" flavor of
739   /// Objective-C message passing on this target.
740   bool useObjCFPRetForRealType(RealType T) const {
741     return RealTypeUsesObjCFPRet & (1 << T);
742   }
743 
744   /// Check whether _Complex long double should use the "fp2ret" flavor
745   /// of Objective-C message passing on this target.
746   bool useObjCFP2RetForComplexLongDouble() const {
747     return ComplexLongDoubleUsesFP2Ret;
748   }
749 
750   /// Check whether llvm intrinsics such as llvm.convert.to.fp16 should be used
751   /// to convert to and from __fp16.
752   /// FIXME: This function should be removed once all targets stop using the
753   /// conversion intrinsics.
754   virtual bool useFP16ConversionIntrinsics() const {
755     return true;
756   }
757 
758   /// Specify if mangling based on address space map should be used or
759   /// not for language specific address spaces
760   bool useAddressSpaceMapMangling() const {
761     return UseAddrSpaceMapMangling;
762   }
763 
764   ///===---- Other target property query methods --------------------------===//
765 
766   /// Appends the target-specific \#define values for this
767   /// target set to the specified buffer.
768   virtual void getTargetDefines(const LangOptions &Opts,
769                                 MacroBuilder &Builder) const = 0;
770 
771 
772   /// Return information about target-specific builtins for
773   /// the current primary target, and info about which builtins are non-portable
774   /// across the current set of primary and secondary targets.
775   virtual ArrayRef<Builtin::Info> getTargetBuiltins() const = 0;
776 
777   /// The __builtin_clz* and __builtin_ctz* built-in
778   /// functions are specified to have undefined results for zero inputs, but
779   /// on targets that support these operations in a way that provides
780   /// well-defined results for zero without loss of performance, it is a good
781   /// idea to avoid optimizing based on that undef behavior.
782   virtual bool isCLZForZeroUndef() const { return true; }
783 
784   /// Returns the kind of __builtin_va_list type that should be used
785   /// with this target.
786   virtual BuiltinVaListKind getBuiltinVaListKind() const = 0;
787 
788   /// Returns whether or not type \c __builtin_ms_va_list type is
789   /// available on this target.
790   bool hasBuiltinMSVaList() const { return HasBuiltinMSVaList; }
791 
792   /// Returns true for RenderScript.
793   bool isRenderScriptTarget() const { return IsRenderScriptTarget; }
794 
795   /// Returns whether or not the AArch64 SVE built-in types are
796   /// available on this target.
797   bool hasAArch64SVETypes() const { return HasAArch64SVETypes; }
798 
799   /// Returns whether the passed in string is a valid clobber in an
800   /// inline asm statement.
801   ///
802   /// This is used by Sema.
803   bool isValidClobber(StringRef Name) const;
804 
805   /// Returns whether the passed in string is a valid register name
806   /// according to GCC.
807   ///
808   /// This is used by Sema for inline asm statements.
809   virtual bool isValidGCCRegisterName(StringRef Name) const;
810 
811   /// Returns the "normalized" GCC register name.
812   ///
813   /// ReturnCannonical true will return the register name without any additions
814   /// such as "{}" or "%" in it's canonical form, for example:
815   /// ReturnCanonical = true and Name = "rax", will return "ax".
816   StringRef getNormalizedGCCRegisterName(StringRef Name,
817                                          bool ReturnCanonical = false) const;
818 
819   /// Extracts a register from the passed constraint (if it is a
820   /// single-register constraint) and the asm label expression related to a
821   /// variable in the input or output list of an inline asm statement.
822   ///
823   /// This function is used by Sema in order to diagnose conflicts between
824   /// the clobber list and the input/output lists.
825   virtual StringRef getConstraintRegister(StringRef Constraint,
826                                           StringRef Expression) const {
827     return "";
828   }
829 
830   struct ConstraintInfo {
831     enum {
832       CI_None = 0x00,
833       CI_AllowsMemory = 0x01,
834       CI_AllowsRegister = 0x02,
835       CI_ReadWrite = 0x04,         // "+r" output constraint (read and write).
836       CI_HasMatchingInput = 0x08,  // This output operand has a matching input.
837       CI_ImmediateConstant = 0x10, // This operand must be an immediate constant
838       CI_EarlyClobber = 0x20,      // "&" output constraint (early clobber).
839     };
840     unsigned Flags;
841     int TiedOperand;
842     struct {
843       int Min;
844       int Max;
845       bool isConstrained;
846     } ImmRange;
847     llvm::SmallSet<int, 4> ImmSet;
848 
849     std::string ConstraintStr;  // constraint: "=rm"
850     std::string Name;           // Operand name: [foo] with no []'s.
851   public:
852     ConstraintInfo(StringRef ConstraintStr, StringRef Name)
853         : Flags(0), TiedOperand(-1), ConstraintStr(ConstraintStr.str()),
854           Name(Name.str()) {
855       ImmRange.Min = ImmRange.Max = 0;
856       ImmRange.isConstrained = false;
857     }
858 
859     const std::string &getConstraintStr() const { return ConstraintStr; }
860     const std::string &getName() const { return Name; }
861     bool isReadWrite() const { return (Flags & CI_ReadWrite) != 0; }
862     bool earlyClobber() { return (Flags & CI_EarlyClobber) != 0; }
863     bool allowsRegister() const { return (Flags & CI_AllowsRegister) != 0; }
864     bool allowsMemory() const { return (Flags & CI_AllowsMemory) != 0; }
865 
866     /// Return true if this output operand has a matching
867     /// (tied) input operand.
868     bool hasMatchingInput() const { return (Flags & CI_HasMatchingInput) != 0; }
869 
870     /// Return true if this input operand is a matching
871     /// constraint that ties it to an output operand.
872     ///
873     /// If this returns true then getTiedOperand will indicate which output
874     /// operand this is tied to.
875     bool hasTiedOperand() const { return TiedOperand != -1; }
876     unsigned getTiedOperand() const {
877       assert(hasTiedOperand() && "Has no tied operand!");
878       return (unsigned)TiedOperand;
879     }
880 
881     bool requiresImmediateConstant() const {
882       return (Flags & CI_ImmediateConstant) != 0;
883     }
884     bool isValidAsmImmediate(const llvm::APInt &Value) const {
885       if (!ImmSet.empty())
886         return Value.isSignedIntN(32) &&
887                ImmSet.count(Value.getZExtValue()) != 0;
888       return !ImmRange.isConstrained ||
889              (Value.sge(ImmRange.Min) && Value.sle(ImmRange.Max));
890     }
891 
892     void setIsReadWrite() { Flags |= CI_ReadWrite; }
893     void setEarlyClobber() { Flags |= CI_EarlyClobber; }
894     void setAllowsMemory() { Flags |= CI_AllowsMemory; }
895     void setAllowsRegister() { Flags |= CI_AllowsRegister; }
896     void setHasMatchingInput() { Flags |= CI_HasMatchingInput; }
897     void setRequiresImmediate(int Min, int Max) {
898       Flags |= CI_ImmediateConstant;
899       ImmRange.Min = Min;
900       ImmRange.Max = Max;
901       ImmRange.isConstrained = true;
902     }
903     void setRequiresImmediate(llvm::ArrayRef<int> Exacts) {
904       Flags |= CI_ImmediateConstant;
905       for (int Exact : Exacts)
906         ImmSet.insert(Exact);
907     }
908     void setRequiresImmediate(int Exact) {
909       Flags |= CI_ImmediateConstant;
910       ImmSet.insert(Exact);
911     }
912     void setRequiresImmediate() {
913       Flags |= CI_ImmediateConstant;
914     }
915 
916     /// Indicate that this is an input operand that is tied to
917     /// the specified output operand.
918     ///
919     /// Copy over the various constraint information from the output.
920     void setTiedOperand(unsigned N, ConstraintInfo &Output) {
921       Output.setHasMatchingInput();
922       Flags = Output.Flags;
923       TiedOperand = N;
924       // Don't copy Name or constraint string.
925     }
926   };
927 
928   /// Validate register name used for global register variables.
929   ///
930   /// This function returns true if the register passed in RegName can be used
931   /// for global register variables on this target. In addition, it returns
932   /// true in HasSizeMismatch if the size of the register doesn't match the
933   /// variable size passed in RegSize.
934   virtual bool validateGlobalRegisterVariable(StringRef RegName,
935                                               unsigned RegSize,
936                                               bool &HasSizeMismatch) const {
937     HasSizeMismatch = false;
938     return true;
939   }
940 
941   // validateOutputConstraint, validateInputConstraint - Checks that
942   // a constraint is valid and provides information about it.
943   // FIXME: These should return a real error instead of just true/false.
944   bool validateOutputConstraint(ConstraintInfo &Info) const;
945   bool validateInputConstraint(MutableArrayRef<ConstraintInfo> OutputConstraints,
946                                ConstraintInfo &info) const;
947 
948   virtual bool validateOutputSize(const llvm::StringMap<bool> &FeatureMap,
949                                   StringRef /*Constraint*/,
950                                   unsigned /*Size*/) const {
951     return true;
952   }
953 
954   virtual bool validateInputSize(const llvm::StringMap<bool> &FeatureMap,
955                                  StringRef /*Constraint*/,
956                                  unsigned /*Size*/) const {
957     return true;
958   }
959   virtual bool
960   validateConstraintModifier(StringRef /*Constraint*/,
961                              char /*Modifier*/,
962                              unsigned /*Size*/,
963                              std::string &/*SuggestedModifier*/) const {
964     return true;
965   }
966   virtual bool
967   validateAsmConstraint(const char *&Name,
968                         TargetInfo::ConstraintInfo &info) const = 0;
969 
970   bool resolveSymbolicName(const char *&Name,
971                            ArrayRef<ConstraintInfo> OutputConstraints,
972                            unsigned &Index) const;
973 
974   // Constraint parm will be left pointing at the last character of
975   // the constraint.  In practice, it won't be changed unless the
976   // constraint is longer than one character.
977   virtual std::string convertConstraint(const char *&Constraint) const {
978     // 'p' defaults to 'r', but can be overridden by targets.
979     if (*Constraint == 'p')
980       return std::string("r");
981     return std::string(1, *Constraint);
982   }
983 
984   /// Returns a string of target-specific clobbers, in LLVM format.
985   virtual const char *getClobbers() const = 0;
986 
987   /// Returns true if NaN encoding is IEEE 754-2008.
988   /// Only MIPS allows a different encoding.
989   virtual bool isNan2008() const {
990     return true;
991   }
992 
993   /// Returns the target triple of the primary target.
994   const llvm::Triple &getTriple() const {
995     return Triple;
996   }
997 
998   const llvm::DataLayout &getDataLayout() const {
999     assert(DataLayout && "Uninitialized DataLayout!");
1000     return *DataLayout;
1001   }
1002 
1003   struct GCCRegAlias {
1004     const char * const Aliases[5];
1005     const char * const Register;
1006   };
1007 
1008   struct AddlRegName {
1009     const char * const Names[5];
1010     const unsigned RegNum;
1011   };
1012 
1013   /// Does this target support "protected" visibility?
1014   ///
1015   /// Any target which dynamic libraries will naturally support
1016   /// something like "default" (meaning that the symbol is visible
1017   /// outside this shared object) and "hidden" (meaning that it isn't)
1018   /// visibilities, but "protected" is really an ELF-specific concept
1019   /// with weird semantics designed around the convenience of dynamic
1020   /// linker implementations.  Which is not to suggest that there's
1021   /// consistent target-independent semantics for "default" visibility
1022   /// either; the entire thing is pretty badly mangled.
1023   virtual bool hasProtectedVisibility() const { return true; }
1024 
1025   /// An optional hook that targets can implement to perform semantic
1026   /// checking on attribute((section("foo"))) specifiers.
1027   ///
1028   /// In this case, "foo" is passed in to be checked.  If the section
1029   /// specifier is invalid, the backend should return a non-empty string
1030   /// that indicates the problem.
1031   ///
1032   /// This hook is a simple quality of implementation feature to catch errors
1033   /// and give good diagnostics in cases when the assembler or code generator
1034   /// would otherwise reject the section specifier.
1035   ///
1036   virtual std::string isValidSectionSpecifier(StringRef SR) const {
1037     return "";
1038   }
1039 
1040   /// Set forced language options.
1041   ///
1042   /// Apply changes to the target information with respect to certain
1043   /// language options which change the target configuration and adjust
1044   /// the language based on the target options where applicable.
1045   virtual void adjust(LangOptions &Opts);
1046 
1047   /// Adjust target options based on codegen options.
1048   virtual void adjustTargetOptions(const CodeGenOptions &CGOpts,
1049                                    TargetOptions &TargetOpts) const {}
1050 
1051   /// Initialize the map with the default set of target features for the
1052   /// CPU this should include all legal feature strings on the target.
1053   ///
1054   /// \return False on error (invalid features).
1055   virtual bool initFeatureMap(llvm::StringMap<bool> &Features,
1056                               DiagnosticsEngine &Diags, StringRef CPU,
1057                               const std::vector<std::string> &FeatureVec) const;
1058 
1059   /// Get the ABI currently in use.
1060   virtual StringRef getABI() const { return StringRef(); }
1061 
1062   /// Get the C++ ABI currently in use.
1063   TargetCXXABI getCXXABI() const {
1064     return TheCXXABI;
1065   }
1066 
1067   /// Target the specified CPU.
1068   ///
1069   /// \return  False on error (invalid CPU name).
1070   virtual bool setCPU(const std::string &Name) {
1071     return false;
1072   }
1073 
1074   /// Fill a SmallVectorImpl with the valid values to setCPU.
1075   virtual void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const {}
1076 
1077   /// brief Determine whether this TargetInfo supports the given CPU name.
1078   virtual bool isValidCPUName(StringRef Name) const {
1079     return true;
1080   }
1081 
1082   /// Use the specified ABI.
1083   ///
1084   /// \return False on error (invalid ABI name).
1085   virtual bool setABI(const std::string &Name) {
1086     return false;
1087   }
1088 
1089   /// Use the specified unit for FP math.
1090   ///
1091   /// \return False on error (invalid unit name).
1092   virtual bool setFPMath(StringRef Name) {
1093     return false;
1094   }
1095 
1096   /// Enable or disable a specific target feature;
1097   /// the feature name must be valid.
1098   virtual void setFeatureEnabled(llvm::StringMap<bool> &Features,
1099                                  StringRef Name,
1100                                  bool Enabled) const {
1101     Features[Name] = Enabled;
1102   }
1103 
1104   /// Determine whether this TargetInfo supports the given feature.
1105   virtual bool isValidFeatureName(StringRef Feature) const {
1106     return true;
1107   }
1108 
1109   struct BranchProtectionInfo {
1110     CodeGenOptions::SignReturnAddressScope SignReturnAddr =
1111         CodeGenOptions::SignReturnAddressScope::None;
1112     CodeGenOptions::SignReturnAddressKeyValue SignKey =
1113         CodeGenOptions::SignReturnAddressKeyValue::AKey;
1114     bool BranchTargetEnforcement = false;
1115   };
1116 
1117   /// Determine if this TargetInfo supports the given branch protection
1118   /// specification
1119   virtual bool validateBranchProtection(StringRef Spec,
1120                                         BranchProtectionInfo &BPI,
1121                                         StringRef &Err) const {
1122     Err = "";
1123     return false;
1124   }
1125 
1126   /// Perform initialization based on the user configured
1127   /// set of features (e.g., +sse4).
1128   ///
1129   /// The list is guaranteed to have at most one entry per feature.
1130   ///
1131   /// The target may modify the features list, to change which options are
1132   /// passed onwards to the backend.
1133   /// FIXME: This part should be fixed so that we can change handleTargetFeatures
1134   /// to merely a TargetInfo initialization routine.
1135   ///
1136   /// \return  False on error.
1137   virtual bool handleTargetFeatures(std::vector<std::string> &Features,
1138                                     DiagnosticsEngine &Diags) {
1139     return true;
1140   }
1141 
1142   /// Determine whether the given target has the given feature.
1143   virtual bool hasFeature(StringRef Feature) const {
1144     return false;
1145   }
1146 
1147   /// Identify whether this target supports multiversioning of functions,
1148   /// which requires support for cpu_supports and cpu_is functionality.
1149   bool supportsMultiVersioning() const { return getTriple().isX86(); }
1150 
1151   /// Identify whether this target supports IFuncs.
1152   bool supportsIFunc() const { return getTriple().isOSBinFormatELF(); }
1153 
1154   // Validate the contents of the __builtin_cpu_supports(const char*)
1155   // argument.
1156   virtual bool validateCpuSupports(StringRef Name) const { return false; }
1157 
1158   // Return the target-specific priority for features/cpus/vendors so
1159   // that they can be properly sorted for checking.
1160   virtual unsigned multiVersionSortPriority(StringRef Name) const {
1161     return 0;
1162   }
1163 
1164   // Validate the contents of the __builtin_cpu_is(const char*)
1165   // argument.
1166   virtual bool validateCpuIs(StringRef Name) const { return false; }
1167 
1168   // Validate a cpu_dispatch/cpu_specific CPU option, which is a different list
1169   // from cpu_is, since it checks via features rather than CPUs directly.
1170   virtual bool validateCPUSpecificCPUDispatch(StringRef Name) const {
1171     return false;
1172   }
1173 
1174   // Get the character to be added for mangling purposes for cpu_specific.
1175   virtual char CPUSpecificManglingCharacter(StringRef Name) const {
1176     llvm_unreachable(
1177         "cpu_specific Multiversioning not implemented on this target");
1178   }
1179 
1180   // Get a list of the features that make up the CPU option for
1181   // cpu_specific/cpu_dispatch so that it can be passed to llvm as optimization
1182   // options.
1183   virtual void getCPUSpecificCPUDispatchFeatures(
1184       StringRef Name, llvm::SmallVectorImpl<StringRef> &Features) const {
1185     llvm_unreachable(
1186         "cpu_specific Multiversioning not implemented on this target");
1187   }
1188 
1189   // Returns maximal number of args passed in registers.
1190   unsigned getRegParmMax() const {
1191     assert(RegParmMax < 7 && "RegParmMax value is larger than AST can handle");
1192     return RegParmMax;
1193   }
1194 
1195   /// Whether the target supports thread-local storage.
1196   bool isTLSSupported() const {
1197     return TLSSupported;
1198   }
1199 
1200   /// Return the maximum alignment (in bits) of a TLS variable
1201   ///
1202   /// Gets the maximum alignment (in bits) of a TLS variable on this target.
1203   /// Returns zero if there is no such constraint.
1204   unsigned short getMaxTLSAlign() const {
1205     return MaxTLSAlign;
1206   }
1207 
1208   /// Whether target supports variable-length arrays.
1209   bool isVLASupported() const { return VLASupported; }
1210 
1211   /// Whether the target supports SEH __try.
1212   bool isSEHTrySupported() const {
1213     return getTriple().isOSWindows() &&
1214            (getTriple().isX86() ||
1215             getTriple().getArch() == llvm::Triple::aarch64);
1216   }
1217 
1218   /// Return true if {|} are normal characters in the asm string.
1219   ///
1220   /// If this returns false (the default), then {abc|xyz} is syntax
1221   /// that says that when compiling for asm variant #0, "abc" should be
1222   /// generated, but when compiling for asm variant #1, "xyz" should be
1223   /// generated.
1224   bool hasNoAsmVariants() const {
1225     return NoAsmVariants;
1226   }
1227 
1228   /// Return the register number that __builtin_eh_return_regno would
1229   /// return with the specified argument.
1230   /// This corresponds with TargetLowering's getExceptionPointerRegister
1231   /// and getExceptionSelectorRegister in the backend.
1232   virtual int getEHDataRegisterNumber(unsigned RegNo) const {
1233     return -1;
1234   }
1235 
1236   /// Return the section to use for C++ static initialization functions.
1237   virtual const char *getStaticInitSectionSpecifier() const {
1238     return nullptr;
1239   }
1240 
1241   const LangASMap &getAddressSpaceMap() const { return *AddrSpaceMap; }
1242 
1243   /// Map from the address space field in builtin description strings to the
1244   /// language address space.
1245   virtual LangAS getOpenCLBuiltinAddressSpace(unsigned AS) const {
1246     return getLangASFromTargetAS(AS);
1247   }
1248 
1249   /// Map from the address space field in builtin description strings to the
1250   /// language address space.
1251   virtual LangAS getCUDABuiltinAddressSpace(unsigned AS) const {
1252     return getLangASFromTargetAS(AS);
1253   }
1254 
1255   /// Return an AST address space which can be used opportunistically
1256   /// for constant global memory. It must be possible to convert pointers into
1257   /// this address space to LangAS::Default. If no such address space exists,
1258   /// this may return None, and such optimizations will be disabled.
1259   virtual llvm::Optional<LangAS> getConstantAddressSpace() const {
1260     return LangAS::Default;
1261   }
1262 
1263   /// Retrieve the name of the platform as it is used in the
1264   /// availability attribute.
1265   StringRef getPlatformName() const { return PlatformName; }
1266 
1267   /// Retrieve the minimum desired version of the platform, to
1268   /// which the program should be compiled.
1269   VersionTuple getPlatformMinVersion() const { return PlatformMinVersion; }
1270 
1271   bool isBigEndian() const { return BigEndian; }
1272   bool isLittleEndian() const { return !BigEndian; }
1273 
1274   /// Gets the default calling convention for the given target and
1275   /// declaration context.
1276   virtual CallingConv getDefaultCallingConv() const {
1277     // Not all targets will specify an explicit calling convention that we can
1278     // express.  This will always do the right thing, even though it's not
1279     // an explicit calling convention.
1280     return CC_C;
1281   }
1282 
1283   enum CallingConvCheckResult {
1284     CCCR_OK,
1285     CCCR_Warning,
1286     CCCR_Ignore,
1287     CCCR_Error,
1288   };
1289 
1290   /// Determines whether a given calling convention is valid for the
1291   /// target. A calling convention can either be accepted, produce a warning
1292   /// and be substituted with the default calling convention, or (someday)
1293   /// produce an error (such as using thiscall on a non-instance function).
1294   virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
1295     switch (CC) {
1296       default:
1297         return CCCR_Warning;
1298       case CC_C:
1299         return CCCR_OK;
1300     }
1301   }
1302 
1303   enum CallingConvKind {
1304     CCK_Default,
1305     CCK_ClangABI4OrPS4,
1306     CCK_MicrosoftWin64
1307   };
1308 
1309   virtual CallingConvKind getCallingConvKind(bool ClangABICompat4) const;
1310 
1311   /// Controls if __builtin_longjmp / __builtin_setjmp can be lowered to
1312   /// llvm.eh.sjlj.longjmp / llvm.eh.sjlj.setjmp.
1313   virtual bool hasSjLjLowering() const {
1314     return false;
1315   }
1316 
1317   /// Check if the target supports CFProtection branch.
1318   virtual bool
1319   checkCFProtectionBranchSupported(DiagnosticsEngine &Diags) const;
1320 
1321   /// Check if the target supports CFProtection branch.
1322   virtual bool
1323   checkCFProtectionReturnSupported(DiagnosticsEngine &Diags) const;
1324 
1325   /// Whether target allows to overalign ABI-specified preferred alignment
1326   virtual bool allowsLargerPreferedTypeAlignment() const { return true; }
1327 
1328   /// Set supported OpenCL extensions and optional core features.
1329   virtual void setSupportedOpenCLOpts() {}
1330 
1331   /// Set supported OpenCL extensions as written on command line
1332   virtual void setOpenCLExtensionOpts() {
1333     for (const auto &Ext : getTargetOpts().OpenCLExtensionsAsWritten) {
1334       getTargetOpts().SupportedOpenCLOptions.support(Ext);
1335     }
1336   }
1337 
1338   /// Get supported OpenCL extensions and optional core features.
1339   OpenCLOptions &getSupportedOpenCLOpts() {
1340     return getTargetOpts().SupportedOpenCLOptions;
1341   }
1342 
1343   /// Get const supported OpenCL extensions and optional core features.
1344   const OpenCLOptions &getSupportedOpenCLOpts() const {
1345       return getTargetOpts().SupportedOpenCLOptions;
1346   }
1347 
1348   enum OpenCLTypeKind {
1349     OCLTK_Default,
1350     OCLTK_ClkEvent,
1351     OCLTK_Event,
1352     OCLTK_Image,
1353     OCLTK_Pipe,
1354     OCLTK_Queue,
1355     OCLTK_ReserveID,
1356     OCLTK_Sampler,
1357   };
1358 
1359   /// Get address space for OpenCL type.
1360   virtual LangAS getOpenCLTypeAddrSpace(OpenCLTypeKind TK) const;
1361 
1362   /// \returns Target specific vtbl ptr address space.
1363   virtual unsigned getVtblPtrAddressSpace() const {
1364     return 0;
1365   }
1366 
1367   /// \returns If a target requires an address within a target specific address
1368   /// space \p AddressSpace to be converted in order to be used, then return the
1369   /// corresponding target specific DWARF address space.
1370   ///
1371   /// \returns Otherwise return None and no conversion will be emitted in the
1372   /// DWARF.
1373   virtual Optional<unsigned> getDWARFAddressSpace(unsigned AddressSpace) const {
1374     return None;
1375   }
1376 
1377   /// \returns The version of the SDK which was used during the compilation if
1378   /// one was specified, or an empty version otherwise.
1379   const llvm::VersionTuple &getSDKVersion() const {
1380     return getTargetOpts().SDKVersion;
1381   }
1382 
1383   /// Check the target is valid after it is fully initialized.
1384   virtual bool validateTarget(DiagnosticsEngine &Diags) const {
1385     return true;
1386   }
1387 
1388   virtual void setAuxTarget(const TargetInfo *Aux) {}
1389 
1390   /// Whether target allows debuginfo types for decl only variables.
1391   virtual bool allowDebugInfoForExternalVar() const { return false; }
1392 
1393 protected:
1394   /// Copy type and layout related info.
1395   void copyAuxTarget(const TargetInfo *Aux);
1396   virtual uint64_t getPointerWidthV(unsigned AddrSpace) const {
1397     return PointerWidth;
1398   }
1399   virtual uint64_t getPointerAlignV(unsigned AddrSpace) const {
1400     return PointerAlign;
1401   }
1402   virtual enum IntType getPtrDiffTypeV(unsigned AddrSpace) const {
1403     return PtrDiffType;
1404   }
1405   virtual ArrayRef<const char *> getGCCRegNames() const = 0;
1406   virtual ArrayRef<GCCRegAlias> getGCCRegAliases() const = 0;
1407   virtual ArrayRef<AddlRegName> getGCCAddlRegNames() const {
1408     return None;
1409   }
1410 
1411  private:
1412   // Assert the values for the fractional and integral bits for each fixed point
1413   // type follow the restrictions given in clause 6.2.6.3 of N1169.
1414   void CheckFixedPointBits() const;
1415 };
1416 
1417 }  // end namespace clang
1418 
1419 #endif
1420