• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===--- TargetInfo.h - Expose information about the target -----*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 ///
10 /// \file
11 /// \brief Defines the clang::TargetInfo interface.
12 ///
13 //===----------------------------------------------------------------------===//
14 
15 #ifndef LLVM_CLANG_BASIC_TARGETINFO_H
16 #define LLVM_CLANG_BASIC_TARGETINFO_H
17 
18 #include "clang/Basic/AddressSpaces.h"
19 #include "clang/Basic/LLVM.h"
20 #include "clang/Basic/Specifiers.h"
21 #include "clang/Basic/TargetCXXABI.h"
22 #include "clang/Basic/TargetOptions.h"
23 #include "clang/Basic/VersionTuple.h"
24 #include "llvm/ADT/APInt.h"
25 #include "llvm/ADT/IntrusiveRefCntPtr.h"
26 #include "llvm/ADT/SmallSet.h"
27 #include "llvm/ADT/StringMap.h"
28 #include "llvm/ADT/StringRef.h"
29 #include "llvm/ADT/StringSwitch.h"
30 #include "llvm/ADT/Triple.h"
31 #include "llvm/IR/DataLayout.h"
32 #include "llvm/Support/DataTypes.h"
33 #include <cassert>
34 #include <string>
35 #include <vector>
36 
37 namespace llvm {
38 struct fltSemantics;
39 }
40 
41 namespace clang {
42 class DiagnosticsEngine;
43 class LangOptions;
44 class MacroBuilder;
45 class SourceLocation;
46 class SourceManager;
47 
48 namespace Builtin { struct Info; }
49 
50 /// \brief Exposes information about the current target.
51 ///
52 class TargetInfo : public RefCountedBase<TargetInfo> {
53   std::shared_ptr<TargetOptions> TargetOpts;
54   llvm::Triple Triple;
55 protected:
56   // Target values set by the ctor of the actual target implementation.  Default
57   // values are specified by the TargetInfo constructor.
58   bool BigEndian;
59   bool TLSSupported;
60   bool NoAsmVariants;  // True if {|} are normal characters.
61   bool HasFloat128;
62   unsigned char PointerWidth, PointerAlign;
63   unsigned char BoolWidth, BoolAlign;
64   unsigned char IntWidth, IntAlign;
65   unsigned char HalfWidth, HalfAlign;
66   unsigned char FloatWidth, FloatAlign;
67   unsigned char DoubleWidth, DoubleAlign;
68   unsigned char LongDoubleWidth, LongDoubleAlign, Float128Align;
69   unsigned char LargeArrayMinWidth, LargeArrayAlign;
70   unsigned char LongWidth, LongAlign;
71   unsigned char LongLongWidth, LongLongAlign;
72   unsigned char SuitableAlign;
73   unsigned char DefaultAlignForAttributeAligned;
74   unsigned char MinGlobalAlign;
75   unsigned char MaxAtomicPromoteWidth, MaxAtomicInlineWidth;
76   unsigned short MaxVectorAlign;
77   unsigned short MaxTLSAlign;
78   unsigned short SimdDefaultAlign;
79   std::unique_ptr<llvm::DataLayout> DataLayout;
80   const char *MCountName;
81   const llvm::fltSemantics *HalfFormat, *FloatFormat, *DoubleFormat,
82     *LongDoubleFormat, *Float128Format;
83   unsigned char RegParmMax, SSERegParmMax;
84   TargetCXXABI TheCXXABI;
85   const LangAS::Map *AddrSpaceMap;
86 
87   mutable StringRef PlatformName;
88   mutable VersionTuple PlatformMinVersion;
89 
90   unsigned HasAlignMac68kSupport : 1;
91   unsigned RealTypeUsesObjCFPRet : 3;
92   unsigned ComplexLongDoubleUsesFP2Ret : 1;
93 
94   unsigned HasBuiltinMSVaList : 1;
95 
96   unsigned IsRenderScriptTarget : 1;
97 
98   // TargetInfo Constructor.  Default initializes all fields.
99   TargetInfo(const llvm::Triple &T);
100 
resetDataLayout(StringRef DL)101   void resetDataLayout(StringRef DL) {
102     DataLayout.reset(new llvm::DataLayout(DL));
103   }
104 
105 public:
106   /// \brief Construct a target for the given options.
107   ///
108   /// \param Opts - The options to use to initialize the target. The target may
109   /// modify the options to canonicalize the target feature information to match
110   /// what the backend expects.
111   static TargetInfo *
112   CreateTargetInfo(DiagnosticsEngine &Diags,
113                    const std::shared_ptr<TargetOptions> &Opts);
114 
115   virtual ~TargetInfo();
116 
117   /// \brief Retrieve the target options.
getTargetOpts()118   TargetOptions &getTargetOpts() const {
119     assert(TargetOpts && "Missing target options");
120     return *TargetOpts;
121   }
122 
123   ///===---- Target Data Type Query Methods -------------------------------===//
124   enum IntType {
125     NoInt = 0,
126     SignedChar,
127     UnsignedChar,
128     SignedShort,
129     UnsignedShort,
130     SignedInt,
131     UnsignedInt,
132     SignedLong,
133     UnsignedLong,
134     SignedLongLong,
135     UnsignedLongLong
136   };
137 
138   enum RealType {
139     NoFloat = 255,
140     Float = 0,
141     Double,
142     LongDouble,
143     Float128
144   };
145 
146   /// \brief The different kinds of __builtin_va_list types defined by
147   /// the target implementation.
148   enum BuiltinVaListKind {
149     /// typedef char* __builtin_va_list;
150     CharPtrBuiltinVaList = 0,
151 
152     /// typedef void* __builtin_va_list;
153     VoidPtrBuiltinVaList,
154 
155     /// __builtin_va_list as defind by the AArch64 ABI
156     /// http://infocenter.arm.com/help/topic/com.arm.doc.ihi0055a/IHI0055A_aapcs64.pdf
157     AArch64ABIBuiltinVaList,
158 
159     /// __builtin_va_list as defined by the PNaCl ABI:
160     /// http://www.chromium.org/nativeclient/pnacl/bitcode-abi#TOC-Machine-Types
161     PNaClABIBuiltinVaList,
162 
163     /// __builtin_va_list as defined by the Power ABI:
164     /// https://www.power.org
165     ///        /resources/downloads/Power-Arch-32-bit-ABI-supp-1.0-Embedded.pdf
166     PowerABIBuiltinVaList,
167 
168     /// __builtin_va_list as defined by the x86-64 ABI:
169     /// http://www.x86-64.org/documentation/abi.pdf
170     X86_64ABIBuiltinVaList,
171 
172     /// __builtin_va_list as defined by ARM AAPCS ABI
173     /// http://infocenter.arm.com
174     //        /help/topic/com.arm.doc.ihi0042d/IHI0042D_aapcs.pdf
175     AAPCSABIBuiltinVaList,
176 
177     // typedef struct __va_list_tag
178     //   {
179     //     long __gpr;
180     //     long __fpr;
181     //     void *__overflow_arg_area;
182     //     void *__reg_save_area;
183     //   } va_list[1];
184     SystemZBuiltinVaList
185   };
186 
187 protected:
188   IntType SizeType, IntMaxType, PtrDiffType, IntPtrType, WCharType,
189           WIntType, Char16Type, Char32Type, Int64Type, SigAtomicType,
190           ProcessIDType;
191 
192   /// \brief Whether Objective-C's built-in boolean type should be signed char.
193   ///
194   /// Otherwise, when this flag is not set, the normal built-in boolean type is
195   /// used.
196   unsigned UseSignedCharForObjCBool : 1;
197 
198   /// Control whether the alignment of bit-field types is respected when laying
199   /// out structures. If true, then the alignment of the bit-field type will be
200   /// used to (a) impact the alignment of the containing structure, and (b)
201   /// ensure that the individual bit-field will not straddle an alignment
202   /// boundary.
203   unsigned UseBitFieldTypeAlignment : 1;
204 
205   /// \brief Whether zero length bitfields (e.g., int : 0;) force alignment of
206   /// the next bitfield.
207   ///
208   /// If the alignment of the zero length bitfield is greater than the member
209   /// that follows it, `bar', `bar' will be aligned as the type of the
210   /// zero-length bitfield.
211   unsigned UseZeroLengthBitfieldAlignment : 1;
212 
213   /// \brief  Whether explicit bit field alignment attributes are honored.
214   unsigned UseExplicitBitFieldAlignment : 1;
215 
216   /// If non-zero, specifies a fixed alignment value for bitfields that follow
217   /// zero length bitfield, regardless of the zero length bitfield type.
218   unsigned ZeroLengthBitfieldBoundary;
219 
220   /// \brief Specify if mangling based on address space map should be used or
221   /// not for language specific address spaces
222   bool UseAddrSpaceMapMangling;
223 
224 public:
getSizeType()225   IntType getSizeType() const { return SizeType; }
getIntMaxType()226   IntType getIntMaxType() const { return IntMaxType; }
getUIntMaxType()227   IntType getUIntMaxType() const {
228     return getCorrespondingUnsignedType(IntMaxType);
229   }
getPtrDiffType(unsigned AddrSpace)230   IntType getPtrDiffType(unsigned AddrSpace) const {
231     return AddrSpace == 0 ? PtrDiffType : getPtrDiffTypeV(AddrSpace);
232   }
getIntPtrType()233   IntType getIntPtrType() const { return IntPtrType; }
getUIntPtrType()234   IntType getUIntPtrType() const {
235     return getCorrespondingUnsignedType(IntPtrType);
236   }
getWCharType()237   IntType getWCharType() const { return WCharType; }
getWIntType()238   IntType getWIntType() const { return WIntType; }
getChar16Type()239   IntType getChar16Type() const { return Char16Type; }
getChar32Type()240   IntType getChar32Type() const { return Char32Type; }
getInt64Type()241   IntType getInt64Type() const { return Int64Type; }
getUInt64Type()242   IntType getUInt64Type() const {
243     return getCorrespondingUnsignedType(Int64Type);
244   }
getSigAtomicType()245   IntType getSigAtomicType() const { return SigAtomicType; }
getProcessIDType()246   IntType getProcessIDType() const { return ProcessIDType; }
247 
getCorrespondingUnsignedType(IntType T)248   static IntType getCorrespondingUnsignedType(IntType T) {
249     switch (T) {
250     case SignedChar:
251       return UnsignedChar;
252     case SignedShort:
253       return UnsignedShort;
254     case SignedInt:
255       return UnsignedInt;
256     case SignedLong:
257       return UnsignedLong;
258     case SignedLongLong:
259       return UnsignedLongLong;
260     default:
261       llvm_unreachable("Unexpected signed integer type");
262     }
263   }
264 
265   /// \brief Return the width (in bits) of the specified integer type enum.
266   ///
267   /// For example, SignedInt -> getIntWidth().
268   unsigned getTypeWidth(IntType T) const;
269 
270   /// \brief Return integer type with specified width.
271   virtual IntType getIntTypeByWidth(unsigned BitWidth, bool IsSigned) const;
272 
273   /// \brief Return the smallest integer type with at least the specified width.
274   virtual IntType getLeastIntTypeByWidth(unsigned BitWidth,
275                                          bool IsSigned) const;
276 
277   /// \brief Return floating point type with specified width.
278   RealType getRealTypeByWidth(unsigned BitWidth) const;
279 
280   /// \brief Return the alignment (in bits) of the specified integer type enum.
281   ///
282   /// For example, SignedInt -> getIntAlign().
283   unsigned getTypeAlign(IntType T) const;
284 
285   /// \brief Returns true if the type is signed; false otherwise.
286   static bool isTypeSigned(IntType T);
287 
288   /// \brief Return the width of pointers on this target, for the
289   /// specified address space.
getPointerWidth(unsigned AddrSpace)290   uint64_t getPointerWidth(unsigned AddrSpace) const {
291     return AddrSpace == 0 ? PointerWidth : getPointerWidthV(AddrSpace);
292   }
getPointerAlign(unsigned AddrSpace)293   uint64_t getPointerAlign(unsigned AddrSpace) const {
294     return AddrSpace == 0 ? PointerAlign : getPointerAlignV(AddrSpace);
295   }
296 
297   /// \brief Return the size of '_Bool' and C++ 'bool' for this target, in bits.
getBoolWidth()298   unsigned getBoolWidth() const { return BoolWidth; }
299 
300   /// \brief Return the alignment of '_Bool' and C++ 'bool' for this target.
getBoolAlign()301   unsigned getBoolAlign() const { return BoolAlign; }
302 
getCharWidth()303   unsigned getCharWidth() const { return 8; } // FIXME
getCharAlign()304   unsigned getCharAlign() const { return 8; } // FIXME
305 
306   /// \brief Return the size of 'signed short' and 'unsigned short' for this
307   /// target, in bits.
getShortWidth()308   unsigned getShortWidth() const { return 16; } // FIXME
309 
310   /// \brief Return the alignment of 'signed short' and 'unsigned short' for
311   /// this target.
getShortAlign()312   unsigned getShortAlign() const { return 16; } // FIXME
313 
314   /// getIntWidth/Align - Return the size of 'signed int' and 'unsigned int' for
315   /// this target, in bits.
getIntWidth()316   unsigned getIntWidth() const { return IntWidth; }
getIntAlign()317   unsigned getIntAlign() const { return IntAlign; }
318 
319   /// getLongWidth/Align - Return the size of 'signed long' and 'unsigned long'
320   /// for this target, in bits.
getLongWidth()321   unsigned getLongWidth() const { return LongWidth; }
getLongAlign()322   unsigned getLongAlign() const { return LongAlign; }
323 
324   /// getLongLongWidth/Align - Return the size of 'signed long long' and
325   /// 'unsigned long long' for this target, in bits.
getLongLongWidth()326   unsigned getLongLongWidth() const { return LongLongWidth; }
getLongLongAlign()327   unsigned getLongLongAlign() const { return LongLongAlign; }
328 
329   /// \brief Determine whether the __int128 type is supported on this target.
hasInt128Type()330   virtual bool hasInt128Type() const {
331     return getPointerWidth(0) >= 64;
332   } // FIXME
333 
334   /// \brief Determine whether the __float128 type is supported on this target.
hasFloat128Type()335   virtual bool hasFloat128Type() const { return HasFloat128; }
336 
337   /// \brief Return the alignment that is suitable for storing any
338   /// object with a fundamental alignment requirement.
getSuitableAlign()339   unsigned getSuitableAlign() const { return SuitableAlign; }
340 
341   /// \brief Return the default alignment for __attribute__((aligned)) on
342   /// this target, to be used if no alignment value is specified.
getDefaultAlignForAttributeAligned()343   unsigned getDefaultAlignForAttributeAligned() const {
344     return DefaultAlignForAttributeAligned;
345   }
346 
347   /// getMinGlobalAlign - Return the minimum alignment of a global variable,
348   /// unless its alignment is explicitly reduced via attributes.
getMinGlobalAlign()349   unsigned getMinGlobalAlign() const { return MinGlobalAlign; }
350 
351   /// getWCharWidth/Align - Return the size of 'wchar_t' for this target, in
352   /// bits.
getWCharWidth()353   unsigned getWCharWidth() const { return getTypeWidth(WCharType); }
getWCharAlign()354   unsigned getWCharAlign() const { return getTypeAlign(WCharType); }
355 
356   /// getChar16Width/Align - Return the size of 'char16_t' for this target, in
357   /// bits.
getChar16Width()358   unsigned getChar16Width() const { return getTypeWidth(Char16Type); }
getChar16Align()359   unsigned getChar16Align() const { return getTypeAlign(Char16Type); }
360 
361   /// getChar32Width/Align - Return the size of 'char32_t' for this target, in
362   /// bits.
getChar32Width()363   unsigned getChar32Width() const { return getTypeWidth(Char32Type); }
getChar32Align()364   unsigned getChar32Align() const { return getTypeAlign(Char32Type); }
365 
366   /// getHalfWidth/Align/Format - Return the size/align/format of 'half'.
getHalfWidth()367   unsigned getHalfWidth() const { return HalfWidth; }
getHalfAlign()368   unsigned getHalfAlign() const { return HalfAlign; }
getHalfFormat()369   const llvm::fltSemantics &getHalfFormat() const { return *HalfFormat; }
370 
371   /// getFloatWidth/Align/Format - Return the size/align/format of 'float'.
getFloatWidth()372   unsigned getFloatWidth() const { return FloatWidth; }
getFloatAlign()373   unsigned getFloatAlign() const { return FloatAlign; }
getFloatFormat()374   const llvm::fltSemantics &getFloatFormat() const { return *FloatFormat; }
375 
376   /// getDoubleWidth/Align/Format - Return the size/align/format of 'double'.
getDoubleWidth()377   unsigned getDoubleWidth() const { return DoubleWidth; }
getDoubleAlign()378   unsigned getDoubleAlign() const { return DoubleAlign; }
getDoubleFormat()379   const llvm::fltSemantics &getDoubleFormat() const { return *DoubleFormat; }
380 
381   /// getLongDoubleWidth/Align/Format - Return the size/align/format of 'long
382   /// double'.
getLongDoubleWidth()383   unsigned getLongDoubleWidth() const { return LongDoubleWidth; }
getLongDoubleAlign()384   unsigned getLongDoubleAlign() const { return LongDoubleAlign; }
getLongDoubleFormat()385   const llvm::fltSemantics &getLongDoubleFormat() const {
386     return *LongDoubleFormat;
387   }
388 
389   /// getFloat128Width/Align/Format - Return the size/align/format of
390   /// '__float128'.
getFloat128Width()391   unsigned getFloat128Width() const { return 128; }
getFloat128Align()392   unsigned getFloat128Align() const { return Float128Align; }
getFloat128Format()393   const llvm::fltSemantics &getFloat128Format() const {
394     return *Float128Format;
395   }
396 
397   /// \brief Return true if the 'long double' type should be mangled like
398   /// __float128.
useFloat128ManglingForLongDouble()399   virtual bool useFloat128ManglingForLongDouble() const { return false; }
400 
401   /// \brief Return the value for the C99 FLT_EVAL_METHOD macro.
getFloatEvalMethod()402   virtual unsigned getFloatEvalMethod() const { return 0; }
403 
404   // getLargeArrayMinWidth/Align - Return the minimum array size that is
405   // 'large' and its alignment.
getLargeArrayMinWidth()406   unsigned getLargeArrayMinWidth() const { return LargeArrayMinWidth; }
getLargeArrayAlign()407   unsigned getLargeArrayAlign() const { return LargeArrayAlign; }
408 
409   /// \brief Return the maximum width lock-free atomic operation which will
410   /// ever be supported for the given target
getMaxAtomicPromoteWidth()411   unsigned getMaxAtomicPromoteWidth() const { return MaxAtomicPromoteWidth; }
412   /// \brief Return the maximum width lock-free atomic operation which can be
413   /// inlined given the supported features of the given target.
getMaxAtomicInlineWidth()414   unsigned getMaxAtomicInlineWidth() const { return MaxAtomicInlineWidth; }
415   /// \brief Returns true if the given target supports lock-free atomic
416   /// operations at the specified width and alignment.
hasBuiltinAtomic(uint64_t AtomicSizeInBits,uint64_t AlignmentInBits)417   virtual bool hasBuiltinAtomic(uint64_t AtomicSizeInBits,
418                                 uint64_t AlignmentInBits) const {
419     return AtomicSizeInBits <= AlignmentInBits &&
420            AtomicSizeInBits <= getMaxAtomicInlineWidth() &&
421            (AtomicSizeInBits <= getCharWidth() ||
422             llvm::isPowerOf2_64(AtomicSizeInBits / getCharWidth()));
423   }
424 
425   /// \brief Return the maximum vector alignment supported for the given target.
getMaxVectorAlign()426   unsigned getMaxVectorAlign() const { return MaxVectorAlign; }
427   /// \brief Return default simd alignment for the given target. Generally, this
428   /// value is type-specific, but this alignment can be used for most of the
429   /// types for the given target.
getSimdDefaultAlign()430   unsigned getSimdDefaultAlign() const { return SimdDefaultAlign; }
431 
432   /// Return the alignment (in bits) of the thrown exception object. This is
433   /// only meaningful for targets that allocate C++ exceptions in a system
434   /// runtime, such as those using the Itanium C++ ABI.
getExnObjectAlignment()435   virtual unsigned getExnObjectAlignment() const {
436     // Itanium says that an _Unwind_Exception has to be "double-word"
437     // aligned (and thus the end of it is also so-aligned), meaning 16
438     // bytes.  Of course, that was written for the actual Itanium,
439     // which is a 64-bit platform.  Classically, the ABI doesn't really
440     // specify the alignment on other platforms, but in practice
441     // libUnwind declares the struct with __attribute__((aligned)), so
442     // we assume that alignment here.  (It's generally 16 bytes, but
443     // some targets overwrite it.)
444     return getDefaultAlignForAttributeAligned();
445   }
446 
447   /// \brief Return the size of intmax_t and uintmax_t for this target, in bits.
getIntMaxTWidth()448   unsigned getIntMaxTWidth() const {
449     return getTypeWidth(IntMaxType);
450   }
451 
452   // Return the size of unwind_word for this target.
getUnwindWordWidth()453   virtual unsigned getUnwindWordWidth() const { return getPointerWidth(0); }
454 
455   /// \brief Return the "preferred" register width on this target.
getRegisterWidth()456   virtual unsigned getRegisterWidth() const {
457     // Currently we assume the register width on the target matches the pointer
458     // width, we can introduce a new variable for this if/when some target wants
459     // it.
460     return PointerWidth;
461   }
462 
463   /// \brief Returns the name of the mcount instrumentation function.
getMCountName()464   const char *getMCountName() const {
465     return MCountName;
466   }
467 
468   /// \brief Check if the Objective-C built-in boolean type should be signed
469   /// char.
470   ///
471   /// Otherwise, if this returns false, the normal built-in boolean type
472   /// should also be used for Objective-C.
useSignedCharForObjCBool()473   bool useSignedCharForObjCBool() const {
474     return UseSignedCharForObjCBool;
475   }
noSignedCharForObjCBool()476   void noSignedCharForObjCBool() {
477     UseSignedCharForObjCBool = false;
478   }
479 
480   /// \brief Check whether the alignment of bit-field types is respected
481   /// when laying out structures.
useBitFieldTypeAlignment()482   bool useBitFieldTypeAlignment() const {
483     return UseBitFieldTypeAlignment;
484   }
485 
486   /// \brief Check whether zero length bitfields should force alignment of
487   /// the next member.
useZeroLengthBitfieldAlignment()488   bool useZeroLengthBitfieldAlignment() const {
489     return UseZeroLengthBitfieldAlignment;
490   }
491 
492   /// \brief Get the fixed alignment value in bits for a member that follows
493   /// a zero length bitfield.
getZeroLengthBitfieldBoundary()494   unsigned getZeroLengthBitfieldBoundary() const {
495     return ZeroLengthBitfieldBoundary;
496   }
497 
498   /// \brief Check whether explicit bitfield alignment attributes should be
499   //  honored, as in "__attribute__((aligned(2))) int b : 1;".
useExplicitBitFieldAlignment()500   bool useExplicitBitFieldAlignment() const {
501     return UseExplicitBitFieldAlignment;
502   }
503 
504   /// \brief Check whether this target support '\#pragma options align=mac68k'.
hasAlignMac68kSupport()505   bool hasAlignMac68kSupport() const {
506     return HasAlignMac68kSupport;
507   }
508 
509   /// \brief Return the user string for the specified integer type enum.
510   ///
511   /// For example, SignedShort -> "short".
512   static const char *getTypeName(IntType T);
513 
514   /// \brief Return the constant suffix for the specified integer type enum.
515   ///
516   /// For example, SignedLong -> "L".
517   const char *getTypeConstantSuffix(IntType T) const;
518 
519   /// \brief Return the printf format modifier for the specified
520   /// integer type enum.
521   ///
522   /// For example, SignedLong -> "l".
523   static const char *getTypeFormatModifier(IntType T);
524 
525   /// \brief Check whether the given real type should use the "fpret" flavor of
526   /// Objective-C message passing on this target.
useObjCFPRetForRealType(RealType T)527   bool useObjCFPRetForRealType(RealType T) const {
528     return RealTypeUsesObjCFPRet & (1 << T);
529   }
530 
531   /// \brief Check whether _Complex long double should use the "fp2ret" flavor
532   /// of Objective-C message passing on this target.
useObjCFP2RetForComplexLongDouble()533   bool useObjCFP2RetForComplexLongDouble() const {
534     return ComplexLongDoubleUsesFP2Ret;
535   }
536 
537   /// \brief Specify if mangling based on address space map should be used or
538   /// not for language specific address spaces
useAddressSpaceMapMangling()539   bool useAddressSpaceMapMangling() const {
540     return UseAddrSpaceMapMangling;
541   }
542 
543   ///===---- Other target property query methods --------------------------===//
544 
545   /// \brief Appends the target-specific \#define values for this
546   /// target set to the specified buffer.
547   virtual void getTargetDefines(const LangOptions &Opts,
548                                 MacroBuilder &Builder) const = 0;
549 
550 
551   /// Return information about target-specific builtins for
552   /// the current primary target, and info about which builtins are non-portable
553   /// across the current set of primary and secondary targets.
554   virtual ArrayRef<Builtin::Info> getTargetBuiltins() const = 0;
555 
556   /// The __builtin_clz* and __builtin_ctz* built-in
557   /// functions are specified to have undefined results for zero inputs, but
558   /// on targets that support these operations in a way that provides
559   /// well-defined results for zero without loss of performance, it is a good
560   /// idea to avoid optimizing based on that undef behavior.
isCLZForZeroUndef()561   virtual bool isCLZForZeroUndef() const { return true; }
562 
563   /// \brief Returns the kind of __builtin_va_list type that should be used
564   /// with this target.
565   virtual BuiltinVaListKind getBuiltinVaListKind() const = 0;
566 
567   /// Returns whether or not type \c __builtin_ms_va_list type is
568   /// available on this target.
hasBuiltinMSVaList()569   bool hasBuiltinMSVaList() const { return HasBuiltinMSVaList; }
570 
571   /// Returns true for RenderScript.
isRenderScriptTarget()572   bool isRenderScriptTarget() const { return IsRenderScriptTarget; }
573 
574   /// \brief Returns whether the passed in string is a valid clobber in an
575   /// inline asm statement.
576   ///
577   /// This is used by Sema.
578   bool isValidClobber(StringRef Name) const;
579 
580   /// \brief Returns whether the passed in string is a valid register name
581   /// according to GCC.
582   ///
583   /// This is used by Sema for inline asm statements.
584   bool isValidGCCRegisterName(StringRef Name) const;
585 
586   /// \brief Returns the "normalized" GCC register name.
587   ///
588   /// For example, on x86 it will return "ax" when "eax" is passed in.
589   StringRef getNormalizedGCCRegisterName(StringRef Name) const;
590 
591   struct ConstraintInfo {
592     enum {
593       CI_None = 0x00,
594       CI_AllowsMemory = 0x01,
595       CI_AllowsRegister = 0x02,
596       CI_ReadWrite = 0x04,         // "+r" output constraint (read and write).
597       CI_HasMatchingInput = 0x08,  // This output operand has a matching input.
598       CI_ImmediateConstant = 0x10, // This operand must be an immediate constant
599       CI_EarlyClobber = 0x20,      // "&" output constraint (early clobber).
600     };
601     unsigned Flags;
602     int TiedOperand;
603     struct {
604       int Min;
605       int Max;
606     } ImmRange;
607     llvm::SmallSet<int, 4> ImmSet;
608 
609     std::string ConstraintStr;  // constraint: "=rm"
610     std::string Name;           // Operand name: [foo] with no []'s.
611   public:
ConstraintInfoConstraintInfo612     ConstraintInfo(StringRef ConstraintStr, StringRef Name)
613         : Flags(0), TiedOperand(-1), ConstraintStr(ConstraintStr.str()),
614           Name(Name.str()) {
615       ImmRange.Min = ImmRange.Max = 0;
616     }
617 
getConstraintStrConstraintInfo618     const std::string &getConstraintStr() const { return ConstraintStr; }
getNameConstraintInfo619     const std::string &getName() const { return Name; }
isReadWriteConstraintInfo620     bool isReadWrite() const { return (Flags & CI_ReadWrite) != 0; }
earlyClobberConstraintInfo621     bool earlyClobber() { return (Flags & CI_EarlyClobber) != 0; }
allowsRegisterConstraintInfo622     bool allowsRegister() const { return (Flags & CI_AllowsRegister) != 0; }
allowsMemoryConstraintInfo623     bool allowsMemory() const { return (Flags & CI_AllowsMemory) != 0; }
624 
625     /// \brief Return true if this output operand has a matching
626     /// (tied) input operand.
hasMatchingInputConstraintInfo627     bool hasMatchingInput() const { return (Flags & CI_HasMatchingInput) != 0; }
628 
629     /// \brief Return true if this input operand is a matching
630     /// constraint that ties it to an output operand.
631     ///
632     /// If this returns true then getTiedOperand will indicate which output
633     /// operand this is tied to.
hasTiedOperandConstraintInfo634     bool hasTiedOperand() const { return TiedOperand != -1; }
getTiedOperandConstraintInfo635     unsigned getTiedOperand() const {
636       assert(hasTiedOperand() && "Has no tied operand!");
637       return (unsigned)TiedOperand;
638     }
639 
requiresImmediateConstantConstraintInfo640     bool requiresImmediateConstant() const {
641       return (Flags & CI_ImmediateConstant) != 0;
642     }
isValidAsmImmediateConstraintInfo643     bool isValidAsmImmediate(const llvm::APInt &Value) const {
644       return (Value.sge(ImmRange.Min) && Value.sle(ImmRange.Max)) ||
645              ImmSet.count(Value.getZExtValue()) != 0;
646     }
647 
setIsReadWriteConstraintInfo648     void setIsReadWrite() { Flags |= CI_ReadWrite; }
setEarlyClobberConstraintInfo649     void setEarlyClobber() { Flags |= CI_EarlyClobber; }
setAllowsMemoryConstraintInfo650     void setAllowsMemory() { Flags |= CI_AllowsMemory; }
setAllowsRegisterConstraintInfo651     void setAllowsRegister() { Flags |= CI_AllowsRegister; }
setHasMatchingInputConstraintInfo652     void setHasMatchingInput() { Flags |= CI_HasMatchingInput; }
setRequiresImmediateConstraintInfo653     void setRequiresImmediate(int Min, int Max) {
654       Flags |= CI_ImmediateConstant;
655       ImmRange.Min = Min;
656       ImmRange.Max = Max;
657     }
setRequiresImmediateConstraintInfo658     void setRequiresImmediate(llvm::ArrayRef<int> Exacts) {
659       Flags |= CI_ImmediateConstant;
660       for (int Exact : Exacts)
661         ImmSet.insert(Exact);
662     }
setRequiresImmediateConstraintInfo663     void setRequiresImmediate(int Exact) {
664       Flags |= CI_ImmediateConstant;
665       ImmSet.insert(Exact);
666     }
setRequiresImmediateConstraintInfo667     void setRequiresImmediate() {
668       Flags |= CI_ImmediateConstant;
669       ImmRange.Min = INT_MIN;
670       ImmRange.Max = INT_MAX;
671     }
672 
673     /// \brief Indicate that this is an input operand that is tied to
674     /// the specified output operand.
675     ///
676     /// Copy over the various constraint information from the output.
setTiedOperandConstraintInfo677     void setTiedOperand(unsigned N, ConstraintInfo &Output) {
678       Output.setHasMatchingInput();
679       Flags = Output.Flags;
680       TiedOperand = N;
681       // Don't copy Name or constraint string.
682     }
683   };
684 
685   /// \brief Validate register name used for global register variables.
686   ///
687   /// This function returns true if the register passed in RegName can be used
688   /// for global register variables on this target. In addition, it returns
689   /// true in HasSizeMismatch if the size of the register doesn't match the
690   /// variable size passed in RegSize.
validateGlobalRegisterVariable(StringRef RegName,unsigned RegSize,bool & HasSizeMismatch)691   virtual bool validateGlobalRegisterVariable(StringRef RegName,
692                                               unsigned RegSize,
693                                               bool &HasSizeMismatch) const {
694     HasSizeMismatch = false;
695     return true;
696   }
697 
698   // validateOutputConstraint, validateInputConstraint - Checks that
699   // a constraint is valid and provides information about it.
700   // FIXME: These should return a real error instead of just true/false.
701   bool validateOutputConstraint(ConstraintInfo &Info) const;
702   bool validateInputConstraint(MutableArrayRef<ConstraintInfo> OutputConstraints,
703                                ConstraintInfo &info) const;
704 
validateOutputSize(StringRef,unsigned)705   virtual bool validateOutputSize(StringRef /*Constraint*/,
706                                   unsigned /*Size*/) const {
707     return true;
708   }
709 
validateInputSize(StringRef,unsigned)710   virtual bool validateInputSize(StringRef /*Constraint*/,
711                                  unsigned /*Size*/) const {
712     return true;
713   }
714   virtual bool
validateConstraintModifier(StringRef,char,unsigned,std::string &)715   validateConstraintModifier(StringRef /*Constraint*/,
716                              char /*Modifier*/,
717                              unsigned /*Size*/,
718                              std::string &/*SuggestedModifier*/) const {
719     return true;
720   }
721   virtual bool
722   validateAsmConstraint(const char *&Name,
723                         TargetInfo::ConstraintInfo &info) const = 0;
724 
725   bool resolveSymbolicName(const char *&Name,
726                            ArrayRef<ConstraintInfo> OutputConstraints,
727                            unsigned &Index) const;
728 
729   // Constraint parm will be left pointing at the last character of
730   // the constraint.  In practice, it won't be changed unless the
731   // constraint is longer than one character.
convertConstraint(const char * & Constraint)732   virtual std::string convertConstraint(const char *&Constraint) const {
733     // 'p' defaults to 'r', but can be overridden by targets.
734     if (*Constraint == 'p')
735       return std::string("r");
736     return std::string(1, *Constraint);
737   }
738 
739   /// \brief Returns a string of target-specific clobbers, in LLVM format.
740   virtual const char *getClobbers() const = 0;
741 
742   /// \brief Returns true if NaN encoding is IEEE 754-2008.
743   /// Only MIPS allows a different encoding.
isNan2008()744   virtual bool isNan2008() const {
745     return true;
746   }
747 
748   /// \brief Returns the target triple of the primary target.
getTriple()749   const llvm::Triple &getTriple() const {
750     return Triple;
751   }
752 
getDataLayout()753   const llvm::DataLayout &getDataLayout() const {
754     assert(DataLayout && "Uninitialized DataLayout!");
755     return *DataLayout;
756   }
757 
758   struct GCCRegAlias {
759     const char * const Aliases[5];
760     const char * const Register;
761   };
762 
763   struct AddlRegName {
764     const char * const Names[5];
765     const unsigned RegNum;
766   };
767 
768   /// \brief Does this target support "protected" visibility?
769   ///
770   /// Any target which dynamic libraries will naturally support
771   /// something like "default" (meaning that the symbol is visible
772   /// outside this shared object) and "hidden" (meaning that it isn't)
773   /// visibilities, but "protected" is really an ELF-specific concept
774   /// with weird semantics designed around the convenience of dynamic
775   /// linker implementations.  Which is not to suggest that there's
776   /// consistent target-independent semantics for "default" visibility
777   /// either; the entire thing is pretty badly mangled.
hasProtectedVisibility()778   virtual bool hasProtectedVisibility() const { return true; }
779 
780   /// \brief An optional hook that targets can implement to perform semantic
781   /// checking on attribute((section("foo"))) specifiers.
782   ///
783   /// In this case, "foo" is passed in to be checked.  If the section
784   /// specifier is invalid, the backend should return a non-empty string
785   /// that indicates the problem.
786   ///
787   /// This hook is a simple quality of implementation feature to catch errors
788   /// and give good diagnostics in cases when the assembler or code generator
789   /// would otherwise reject the section specifier.
790   ///
isValidSectionSpecifier(StringRef SR)791   virtual std::string isValidSectionSpecifier(StringRef SR) const {
792     return "";
793   }
794 
795   /// \brief Set forced language options.
796   ///
797   /// Apply changes to the target information with respect to certain
798   /// language options which change the target configuration.
799   virtual void adjust(const LangOptions &Opts);
800 
801   /// \brief Initialize the map with the default set of target features for the
802   /// CPU this should include all legal feature strings on the target.
803   ///
804   /// \return False on error (invalid features).
805   virtual bool initFeatureMap(llvm::StringMap<bool> &Features,
806                               DiagnosticsEngine &Diags, StringRef CPU,
807                               const std::vector<std::string> &FeatureVec) const;
808 
809   /// \brief Get the ABI currently in use.
getABI()810   virtual StringRef getABI() const { return StringRef(); }
811 
812   /// \brief Get the C++ ABI currently in use.
getCXXABI()813   TargetCXXABI getCXXABI() const {
814     return TheCXXABI;
815   }
816 
817   /// \brief Target the specified CPU.
818   ///
819   /// \return  False on error (invalid CPU name).
setCPU(const std::string & Name)820   virtual bool setCPU(const std::string &Name) {
821     return false;
822   }
823 
824   /// \brief Use the specified ABI.
825   ///
826   /// \return False on error (invalid ABI name).
setABI(const std::string & Name)827   virtual bool setABI(const std::string &Name) {
828     return false;
829   }
830 
831   /// \brief Use the specified unit for FP math.
832   ///
833   /// \return False on error (invalid unit name).
setFPMath(StringRef Name)834   virtual bool setFPMath(StringRef Name) {
835     return false;
836   }
837 
838   /// \brief Enable or disable a specific target feature;
839   /// the feature name must be valid.
setFeatureEnabled(llvm::StringMap<bool> & Features,StringRef Name,bool Enabled)840   virtual void setFeatureEnabled(llvm::StringMap<bool> &Features,
841                                  StringRef Name,
842                                  bool Enabled) const {
843     Features[Name] = Enabled;
844   }
845 
846   /// \brief Perform initialization based on the user configured
847   /// set of features (e.g., +sse4).
848   ///
849   /// The list is guaranteed to have at most one entry per feature.
850   ///
851   /// The target may modify the features list, to change which options are
852   /// passed onwards to the backend.
853   /// FIXME: This part should be fixed so that we can change handleTargetFeatures
854   /// to merely a TargetInfo initialization routine.
855   ///
856   /// \return  False on error.
handleTargetFeatures(std::vector<std::string> & Features,DiagnosticsEngine & Diags)857   virtual bool handleTargetFeatures(std::vector<std::string> &Features,
858                                     DiagnosticsEngine &Diags) {
859     return true;
860   }
861 
862   /// \brief Determine whether the given target has the given feature.
hasFeature(StringRef Feature)863   virtual bool hasFeature(StringRef Feature) const {
864     return false;
865   }
866 
867   // \brief Validate the contents of the __builtin_cpu_supports(const char*)
868   // argument.
validateCpuSupports(StringRef Name)869   virtual bool validateCpuSupports(StringRef Name) const { return false; }
870 
871   // \brief Returns maximal number of args passed in registers.
getRegParmMax()872   unsigned getRegParmMax() const {
873     assert(RegParmMax < 7 && "RegParmMax value is larger than AST can handle");
874     return RegParmMax;
875   }
876 
877   /// \brief Whether the target supports thread-local storage.
isTLSSupported()878   bool isTLSSupported() const {
879     return TLSSupported;
880   }
881 
882   /// \brief Return the maximum alignment (in bits) of a TLS variable
883   ///
884   /// Gets the maximum alignment (in bits) of a TLS variable on this target.
885   /// Returns zero if there is no such constraint.
getMaxTLSAlign()886   unsigned short getMaxTLSAlign() const {
887     return MaxTLSAlign;
888   }
889 
890   /// \brief Whether the target supports SEH __try.
isSEHTrySupported()891   bool isSEHTrySupported() const {
892     return getTriple().isOSWindows() &&
893            (getTriple().getArch() == llvm::Triple::x86 ||
894             getTriple().getArch() == llvm::Triple::x86_64);
895   }
896 
897   /// \brief Return true if {|} are normal characters in the asm string.
898   ///
899   /// If this returns false (the default), then {abc|xyz} is syntax
900   /// that says that when compiling for asm variant #0, "abc" should be
901   /// generated, but when compiling for asm variant #1, "xyz" should be
902   /// generated.
hasNoAsmVariants()903   bool hasNoAsmVariants() const {
904     return NoAsmVariants;
905   }
906 
907   /// \brief Return the register number that __builtin_eh_return_regno would
908   /// return with the specified argument.
909   /// This corresponds with TargetLowering's getExceptionPointerRegister
910   /// and getExceptionSelectorRegister in the backend.
getEHDataRegisterNumber(unsigned RegNo)911   virtual int getEHDataRegisterNumber(unsigned RegNo) const {
912     return -1;
913   }
914 
915   /// \brief Return the section to use for C++ static initialization functions.
getStaticInitSectionSpecifier()916   virtual const char *getStaticInitSectionSpecifier() const {
917     return nullptr;
918   }
919 
getAddressSpaceMap()920   const LangAS::Map &getAddressSpaceMap() const {
921     return *AddrSpaceMap;
922   }
923 
924   /// \brief Retrieve the name of the platform as it is used in the
925   /// availability attribute.
getPlatformName()926   StringRef getPlatformName() const { return PlatformName; }
927 
928   /// \brief Retrieve the minimum desired version of the platform, to
929   /// which the program should be compiled.
getPlatformMinVersion()930   VersionTuple getPlatformMinVersion() const { return PlatformMinVersion; }
931 
isBigEndian()932   bool isBigEndian() const { return BigEndian; }
933 
934   enum CallingConvMethodType {
935     CCMT_Unknown,
936     CCMT_Member,
937     CCMT_NonMember
938   };
939 
940   /// \brief Gets the default calling convention for the given target and
941   /// declaration context.
getDefaultCallingConv(CallingConvMethodType MT)942   virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const {
943     // Not all targets will specify an explicit calling convention that we can
944     // express.  This will always do the right thing, even though it's not
945     // an explicit calling convention.
946     return CC_C;
947   }
948 
949   enum CallingConvCheckResult {
950     CCCR_OK,
951     CCCR_Warning,
952     CCCR_Ignore,
953   };
954 
955   /// \brief Determines whether a given calling convention is valid for the
956   /// target. A calling convention can either be accepted, produce a warning
957   /// and be substituted with the default calling convention, or (someday)
958   /// produce an error (such as using thiscall on a non-instance function).
checkCallingConvention(CallingConv CC)959   virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
960     switch (CC) {
961       default:
962         return CCCR_Warning;
963       case CC_C:
964         return CCCR_OK;
965     }
966   }
967 
968   /// Controls if __builtin_longjmp / __builtin_setjmp can be lowered to
969   /// llvm.eh.sjlj.longjmp / llvm.eh.sjlj.setjmp.
hasSjLjLowering()970   virtual bool hasSjLjLowering() const {
971     return false;
972   }
973 
974   /// \brief Whether target allows to overalign ABI-specified prefered alignment
allowsLargerPreferedTypeAlignment()975   virtual bool allowsLargerPreferedTypeAlignment() const { return true; }
976 
977   /// \brief Set supported OpenCL extensions and optional core features.
setSupportedOpenCLOpts()978   virtual void setSupportedOpenCLOpts() {}
979 
980   /// \brief Get supported OpenCL extensions and optional core features.
getSupportedOpenCLOpts()981   OpenCLOptions &getSupportedOpenCLOpts() {
982     return getTargetOpts().SupportedOpenCLOptions;
983   }
984 
985   /// \brief Get const supported OpenCL extensions and optional core features.
getSupportedOpenCLOpts()986   const OpenCLOptions &getSupportedOpenCLOpts() const {
987       return getTargetOpts().SupportedOpenCLOptions;
988   }
989 
990   /// \brief Check the target is valid after it is fully initialized.
validateTarget(DiagnosticsEngine & Diags)991   virtual bool validateTarget(DiagnosticsEngine &Diags) const {
992     return true;
993   }
994 
995 protected:
getPointerWidthV(unsigned AddrSpace)996   virtual uint64_t getPointerWidthV(unsigned AddrSpace) const {
997     return PointerWidth;
998   }
getPointerAlignV(unsigned AddrSpace)999   virtual uint64_t getPointerAlignV(unsigned AddrSpace) const {
1000     return PointerAlign;
1001   }
getPtrDiffTypeV(unsigned AddrSpace)1002   virtual enum IntType getPtrDiffTypeV(unsigned AddrSpace) const {
1003     return PtrDiffType;
1004   }
1005   virtual ArrayRef<const char *> getGCCRegNames() const = 0;
1006   virtual ArrayRef<GCCRegAlias> getGCCRegAliases() const = 0;
getGCCAddlRegNames()1007   virtual ArrayRef<AddlRegName> getGCCAddlRegNames() const {
1008     return None;
1009   }
1010 };
1011 
1012 }  // end namespace clang
1013 
1014 #endif
1015