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