• 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 //  This file defines the TargetInfo interface.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_CLANG_BASIC_TARGETINFO_H
15 #define LLVM_CLANG_BASIC_TARGETINFO_H
16 
17 #include "clang/Basic/LLVM.h"
18 #include "llvm/ADT/IntrusiveRefCntPtr.h"
19 #include "llvm/ADT/StringMap.h"
20 #include "llvm/ADT/StringRef.h"
21 #include "llvm/ADT/StringSwitch.h"
22 #include "llvm/ADT/Triple.h"
23 #include "llvm/Support/DataTypes.h"
24 #include "clang/Basic/AddressSpaces.h"
25 #include "clang/Basic/VersionTuple.h"
26 #include <cassert>
27 #include <vector>
28 #include <string>
29 
30 namespace llvm {
31 struct fltSemantics;
32 }
33 
34 namespace clang {
35 class DiagnosticsEngine;
36 class LangOptions;
37 class MacroBuilder;
38 class SourceLocation;
39 class SourceManager;
40 class TargetOptions;
41 
42 namespace Builtin { struct Info; }
43 
44 /// TargetCXXABI - The types of C++ ABIs for which we can generate code.
45 enum TargetCXXABI {
46   /// The generic ("Itanium") C++ ABI, documented at:
47   ///   http://www.codesourcery.com/public/cxx-abi/
48   CXXABI_Itanium,
49 
50   /// The ARM C++ ABI, based largely on the Itanium ABI but with
51   /// significant differences.
52   ///    http://infocenter.arm.com
53   ///                    /help/topic/com.arm.doc.ihi0041c/IHI0041C_cppabi.pdf
54   CXXABI_ARM,
55 
56   /// The Visual Studio ABI.  Only scattered official documentation exists.
57   CXXABI_Microsoft
58 };
59 
60 /// TargetInfo - This class exposes information about the current target.
61 ///
62 class TargetInfo : public RefCountedBase<TargetInfo> {
63   llvm::Triple Triple;
64 protected:
65   // Target values set by the ctor of the actual target implementation.  Default
66   // values are specified by the TargetInfo constructor.
67   bool BigEndian;
68   bool TLSSupported;
69   bool NoAsmVariants;  // True if {|} are normal characters.
70   unsigned char PointerWidth, PointerAlign;
71   unsigned char BoolWidth, BoolAlign;
72   unsigned char IntWidth, IntAlign;
73   unsigned char HalfWidth, HalfAlign;
74   unsigned char FloatWidth, FloatAlign;
75   unsigned char DoubleWidth, DoubleAlign;
76   unsigned char LongDoubleWidth, LongDoubleAlign;
77   unsigned char LargeArrayMinWidth, LargeArrayAlign;
78   unsigned char LongWidth, LongAlign;
79   unsigned char LongLongWidth, LongLongAlign;
80   unsigned char SuitableAlign;
81   unsigned char MaxAtomicPromoteWidth, MaxAtomicInlineWidth;
82   const char *DescriptionString;
83   const char *UserLabelPrefix;
84   const char *MCountName;
85   const llvm::fltSemantics *HalfFormat, *FloatFormat, *DoubleFormat,
86     *LongDoubleFormat;
87   unsigned char RegParmMax, SSERegParmMax;
88   TargetCXXABI CXXABI;
89   const LangAS::Map *AddrSpaceMap;
90 
91   mutable StringRef PlatformName;
92   mutable VersionTuple PlatformMinVersion;
93 
94   unsigned HasAlignMac68kSupport : 1;
95   unsigned RealTypeUsesObjCFPRet : 3;
96   unsigned ComplexLongDoubleUsesFP2Ret : 1;
97 
98   // TargetInfo Constructor.  Default initializes all fields.
99   TargetInfo(const std::string &T);
100 
101 public:
102   /// CreateTargetInfo - Construct a target for the given options.
103   ///
104   /// \param Opts - The options to use to initialize the target. The target may
105   /// modify the options to canonicalize the target feature information to match
106   /// what the backend expects.
107   static TargetInfo* CreateTargetInfo(DiagnosticsEngine &Diags,
108                                       TargetOptions &Opts);
109 
110   virtual ~TargetInfo();
111 
112   ///===---- Target Data Type Query Methods -------------------------------===//
113   enum IntType {
114     NoInt = 0,
115     SignedShort,
116     UnsignedShort,
117     SignedInt,
118     UnsignedInt,
119     SignedLong,
120     UnsignedLong,
121     SignedLongLong,
122     UnsignedLongLong
123   };
124 
125   enum RealType {
126     Float = 0,
127     Double,
128     LongDouble
129   };
130 
131 protected:
132   IntType SizeType, IntMaxType, UIntMaxType, PtrDiffType, IntPtrType, WCharType,
133           WIntType, Char16Type, Char32Type, Int64Type, SigAtomicType;
134 
135   /// Flag whether the Objective-C built-in boolean type should be signed char.
136   /// Otherwise, when this flag is not set, the normal built-in boolean type is
137   /// used.
138   unsigned UseSignedCharForObjCBool : 1;
139 
140   /// Control whether the alignment of bit-field types is respected when laying
141   /// out structures. If true, then the alignment of the bit-field type will be
142   /// used to (a) impact the alignment of the containing structure, and (b)
143   /// ensure that the individual bit-field will not straddle an alignment
144   /// boundary.
145   unsigned UseBitFieldTypeAlignment : 1;
146 
147   /// Control whether zero length bitfields (e.g., int : 0;) force alignment of
148   /// the next bitfield.  If the alignment of the zero length bitfield is
149   /// greater than the member that follows it, `bar', `bar' will be aligned as
150   /// the type of the zero-length bitfield.
151   unsigned UseZeroLengthBitfieldAlignment : 1;
152 
153   /// If non-zero, specifies a fixed alignment value for bitfields that follow
154   /// zero length bitfield, regardless of the zero length bitfield type.
155   unsigned ZeroLengthBitfieldBoundary;
156 
157 public:
getSizeType()158   IntType getSizeType() const { return SizeType; }
getIntMaxType()159   IntType getIntMaxType() const { return IntMaxType; }
getUIntMaxType()160   IntType getUIntMaxType() const { return UIntMaxType; }
getPtrDiffType(unsigned AddrSpace)161   IntType getPtrDiffType(unsigned AddrSpace) const {
162     return AddrSpace == 0 ? PtrDiffType : getPtrDiffTypeV(AddrSpace);
163   }
getIntPtrType()164   IntType getIntPtrType() const { return IntPtrType; }
getWCharType()165   IntType getWCharType() const { return WCharType; }
getWIntType()166   IntType getWIntType() const { return WIntType; }
getChar16Type()167   IntType getChar16Type() const { return Char16Type; }
getChar32Type()168   IntType getChar32Type() const { return Char32Type; }
getInt64Type()169   IntType getInt64Type() const { return Int64Type; }
getSigAtomicType()170   IntType getSigAtomicType() const { return SigAtomicType; }
171 
172 
173   /// getTypeWidth - Return the width (in bits) of the specified integer type
174   /// enum. For example, SignedInt -> getIntWidth().
175   unsigned getTypeWidth(IntType T) const;
176 
177   /// getTypeAlign - Return the alignment (in bits) of the specified integer
178   /// type enum. For example, SignedInt -> getIntAlign().
179   unsigned getTypeAlign(IntType T) const;
180 
181   /// isTypeSigned - Return whether an integer types is signed. Returns true if
182   /// the type is signed; false otherwise.
183   static bool isTypeSigned(IntType T);
184 
185   /// getPointerWidth - Return the width of pointers on this target, for the
186   /// specified address space.
getPointerWidth(unsigned AddrSpace)187   uint64_t getPointerWidth(unsigned AddrSpace) const {
188     return AddrSpace == 0 ? PointerWidth : getPointerWidthV(AddrSpace);
189   }
getPointerAlign(unsigned AddrSpace)190   uint64_t getPointerAlign(unsigned AddrSpace) const {
191     return AddrSpace == 0 ? PointerAlign : getPointerAlignV(AddrSpace);
192   }
193 
194   /// getBoolWidth/Align - Return the size of '_Bool' and C++ 'bool' for this
195   /// target, in bits.
getBoolWidth()196   unsigned getBoolWidth() const { return BoolWidth; }
getBoolAlign()197   unsigned getBoolAlign() const { return BoolAlign; }
198 
getCharWidth()199   unsigned getCharWidth() const { return 8; } // FIXME
getCharAlign()200   unsigned getCharAlign() const { return 8; } // FIXME
201 
202   /// getShortWidth/Align - Return the size of 'signed short' and
203   /// 'unsigned short' for this target, in bits.
getShortWidth()204   unsigned getShortWidth() const { return 16; } // FIXME
getShortAlign()205   unsigned getShortAlign() const { return 16; } // FIXME
206 
207   /// getIntWidth/Align - Return the size of 'signed int' and 'unsigned int' for
208   /// this target, in bits.
getIntWidth()209   unsigned getIntWidth() const { return IntWidth; }
getIntAlign()210   unsigned getIntAlign() const { return IntAlign; }
211 
212   /// getLongWidth/Align - Return the size of 'signed long' and 'unsigned long'
213   /// for this target, in bits.
getLongWidth()214   unsigned getLongWidth() const { return LongWidth; }
getLongAlign()215   unsigned getLongAlign() const { return LongAlign; }
216 
217   /// getLongLongWidth/Align - Return the size of 'signed long long' and
218   /// 'unsigned long long' for this target, in bits.
getLongLongWidth()219   unsigned getLongLongWidth() const { return LongLongWidth; }
getLongLongAlign()220   unsigned getLongLongAlign() const { return LongLongAlign; }
221 
222   /// getSuitableAlign - Return the alignment that is suitable for storing any
223   /// object with a fundamental alignment requirement.
getSuitableAlign()224   unsigned getSuitableAlign() const { return SuitableAlign; }
225 
226   /// getWCharWidth/Align - Return the size of 'wchar_t' for this target, in
227   /// bits.
getWCharWidth()228   unsigned getWCharWidth() const { return getTypeWidth(WCharType); }
getWCharAlign()229   unsigned getWCharAlign() const { return getTypeAlign(WCharType); }
230 
231   /// getChar16Width/Align - Return the size of 'char16_t' for this target, in
232   /// bits.
getChar16Width()233   unsigned getChar16Width() const { return getTypeWidth(Char16Type); }
getChar16Align()234   unsigned getChar16Align() const { return getTypeAlign(Char16Type); }
235 
236   /// getChar32Width/Align - Return the size of 'char32_t' for this target, in
237   /// bits.
getChar32Width()238   unsigned getChar32Width() const { return getTypeWidth(Char32Type); }
getChar32Align()239   unsigned getChar32Align() const { return getTypeAlign(Char32Type); }
240 
241   /// getHalfWidth/Align/Format - Return the size/align/format of 'half'.
getHalfWidth()242   unsigned getHalfWidth() const { return HalfWidth; }
getHalfAlign()243   unsigned getHalfAlign() const { return HalfAlign; }
getHalfFormat()244   const llvm::fltSemantics &getHalfFormat() const { return *HalfFormat; }
245 
246   /// getFloatWidth/Align/Format - Return the size/align/format of 'float'.
getFloatWidth()247   unsigned getFloatWidth() const { return FloatWidth; }
getFloatAlign()248   unsigned getFloatAlign() const { return FloatAlign; }
getFloatFormat()249   const llvm::fltSemantics &getFloatFormat() const { return *FloatFormat; }
250 
251   /// getDoubleWidth/Align/Format - Return the size/align/format of 'double'.
getDoubleWidth()252   unsigned getDoubleWidth() const { return DoubleWidth; }
getDoubleAlign()253   unsigned getDoubleAlign() const { return DoubleAlign; }
getDoubleFormat()254   const llvm::fltSemantics &getDoubleFormat() const { return *DoubleFormat; }
255 
256   /// getLongDoubleWidth/Align/Format - Return the size/align/format of 'long
257   /// double'.
getLongDoubleWidth()258   unsigned getLongDoubleWidth() const { return LongDoubleWidth; }
getLongDoubleAlign()259   unsigned getLongDoubleAlign() const { return LongDoubleAlign; }
getLongDoubleFormat()260   const llvm::fltSemantics &getLongDoubleFormat() const {
261     return *LongDoubleFormat;
262   }
263 
264   /// getFloatEvalMethod - Return the value for the C99 FLT_EVAL_METHOD macro.
getFloatEvalMethod()265   virtual unsigned getFloatEvalMethod() const { return 0; }
266 
267   // getLargeArrayMinWidth/Align - Return the minimum array size that is
268   // 'large' and its alignment.
getLargeArrayMinWidth()269   unsigned getLargeArrayMinWidth() const { return LargeArrayMinWidth; }
getLargeArrayAlign()270   unsigned getLargeArrayAlign() const { return LargeArrayAlign; }
271 
272   /// getMaxAtomicPromoteWidth - Return the maximum width lock-free atomic
273   /// operation which will ever be supported for the given target
getMaxAtomicPromoteWidth()274   unsigned getMaxAtomicPromoteWidth() const { return MaxAtomicPromoteWidth; }
275   /// getMaxAtomicInlineWidth - Return the maximum width lock-free atomic
276   /// operation which can be inlined given the supported features of the
277   /// given target.
getMaxAtomicInlineWidth()278   unsigned getMaxAtomicInlineWidth() const { return MaxAtomicInlineWidth; }
279 
280   /// getIntMaxTWidth - Return the size of intmax_t and uintmax_t for this
281   /// target, in bits.
getIntMaxTWidth()282   unsigned getIntMaxTWidth() const {
283     return getTypeWidth(IntMaxType);
284   }
285 
286   /// getRegisterWidth - Return the "preferred" register width on this target.
getRegisterWidth()287   uint64_t getRegisterWidth() const {
288     // Currently we assume the register width on the target matches the pointer
289     // width, we can introduce a new variable for this if/when some target wants
290     // it.
291     return LongWidth;
292   }
293 
294   /// getUserLabelPrefix - This returns the default value of the
295   /// __USER_LABEL_PREFIX__ macro, which is the prefix given to user symbols by
296   /// default.  On most platforms this is "_", but it is "" on some, and "." on
297   /// others.
getUserLabelPrefix()298   const char *getUserLabelPrefix() const {
299     return UserLabelPrefix;
300   }
301 
302   /// MCountName - This returns name of the mcount instrumentation function.
getMCountName()303   const char *getMCountName() const {
304     return MCountName;
305   }
306 
307   /// useSignedCharForObjCBool - Check if the Objective-C built-in boolean
308   /// type should be signed char.  Otherwise, if this returns false, the
309   /// normal built-in boolean type should also be used for Objective-C.
useSignedCharForObjCBool()310   bool useSignedCharForObjCBool() const {
311     return UseSignedCharForObjCBool;
312   }
noSignedCharForObjCBool()313   void noSignedCharForObjCBool() {
314     UseSignedCharForObjCBool = false;
315   }
316 
317   /// useBitFieldTypeAlignment() - Check whether the alignment of bit-field
318   /// types is respected when laying out structures.
useBitFieldTypeAlignment()319   bool useBitFieldTypeAlignment() const {
320     return UseBitFieldTypeAlignment;
321   }
322 
323   /// useZeroLengthBitfieldAlignment() - Check whether zero length bitfields
324   /// should force alignment of the next member.
useZeroLengthBitfieldAlignment()325   bool useZeroLengthBitfieldAlignment() const {
326     return UseZeroLengthBitfieldAlignment;
327   }
328 
329   /// getZeroLengthBitfieldBoundary() - Get the fixed alignment value in bits
330   /// for a member that follows a zero length bitfield.
getZeroLengthBitfieldBoundary()331   unsigned getZeroLengthBitfieldBoundary() const {
332     return ZeroLengthBitfieldBoundary;
333   }
334 
335   /// hasAlignMac68kSupport - Check whether this target support '#pragma options
336   /// align=mac68k'.
hasAlignMac68kSupport()337   bool hasAlignMac68kSupport() const {
338     return HasAlignMac68kSupport;
339   }
340 
341   /// getTypeName - Return the user string for the specified integer type enum.
342   /// For example, SignedShort -> "short".
343   static const char *getTypeName(IntType T);
344 
345   /// getTypeConstantSuffix - Return the constant suffix for the specified
346   /// integer type enum. For example, SignedLong -> "L".
347   static const char *getTypeConstantSuffix(IntType T);
348 
349   /// \brief Check whether the given real type should use the "fpret" flavor of
350   /// Obj-C message passing on this target.
useObjCFPRetForRealType(RealType T)351   bool useObjCFPRetForRealType(RealType T) const {
352     return RealTypeUsesObjCFPRet & (1 << T);
353   }
354 
355   /// \brief Check whether _Complex long double should use the "fp2ret" flavor
356   /// of Obj-C message passing on this target.
useObjCFP2RetForComplexLongDouble()357   bool useObjCFP2RetForComplexLongDouble() const {
358     return ComplexLongDoubleUsesFP2Ret;
359   }
360 
361   ///===---- Other target property query methods --------------------------===//
362 
363   /// getTargetDefines - Appends the target-specific #define values for this
364   /// target set to the specified buffer.
365   virtual void getTargetDefines(const LangOptions &Opts,
366                                 MacroBuilder &Builder) const = 0;
367 
368 
369   /// getTargetBuiltins - Return information about target-specific builtins for
370   /// the current primary target, and info about which builtins are non-portable
371   /// across the current set of primary and secondary targets.
372   virtual void getTargetBuiltins(const Builtin::Info *&Records,
373                                  unsigned &NumRecords) const = 0;
374 
375   /// isCLZForZeroUndef - The __builtin_clz* and __builtin_ctz* built-in
376   /// functions are specified to have undefined results for zero inputs, but
377   /// on targets that support these operations in a way that provides
378   /// well-defined results for zero without loss of performance, it is a good
379   /// idea to avoid optimizing based on that undef behavior.
isCLZForZeroUndef()380   virtual bool isCLZForZeroUndef() const { return true; }
381 
382   /// getVAListDeclaration - Return the declaration to use for
383   /// __builtin_va_list, which is target-specific.
384   virtual const char *getVAListDeclaration() const = 0;
385 
386   /// isValidClobber - Returns whether the passed in string is
387   /// a valid clobber in an inline asm statement. This is used by
388   /// Sema.
389   bool isValidClobber(StringRef Name) const;
390 
391   /// isValidGCCRegisterName - Returns whether the passed in string
392   /// is a valid register name according to GCC. This is used by Sema for
393   /// inline asm statements.
394   bool isValidGCCRegisterName(StringRef Name) const;
395 
396   // getNormalizedGCCRegisterName - Returns the "normalized" GCC register name.
397   // For example, on x86 it will return "ax" when "eax" is passed in.
398   StringRef getNormalizedGCCRegisterName(StringRef Name) const;
399 
400   struct ConstraintInfo {
401     enum {
402       CI_None = 0x00,
403       CI_AllowsMemory = 0x01,
404       CI_AllowsRegister = 0x02,
405       CI_ReadWrite = 0x04,       // "+r" output constraint (read and write).
406       CI_HasMatchingInput = 0x08 // This output operand has a matching input.
407     };
408     unsigned Flags;
409     int TiedOperand;
410 
411     std::string ConstraintStr;  // constraint: "=rm"
412     std::string Name;           // Operand name: [foo] with no []'s.
413   public:
ConstraintInfoConstraintInfo414     ConstraintInfo(StringRef ConstraintStr, StringRef Name)
415       : Flags(0), TiedOperand(-1), ConstraintStr(ConstraintStr.str()),
416       Name(Name.str()) {}
417 
getConstraintStrConstraintInfo418     const std::string &getConstraintStr() const { return ConstraintStr; }
getNameConstraintInfo419     const std::string &getName() const { return Name; }
isReadWriteConstraintInfo420     bool isReadWrite() const { return (Flags & CI_ReadWrite) != 0; }
allowsRegisterConstraintInfo421     bool allowsRegister() const { return (Flags & CI_AllowsRegister) != 0; }
allowsMemoryConstraintInfo422     bool allowsMemory() const { return (Flags & CI_AllowsMemory) != 0; }
423 
424     /// hasMatchingInput - Return true if this output operand has a matching
425     /// (tied) input operand.
hasMatchingInputConstraintInfo426     bool hasMatchingInput() const { return (Flags & CI_HasMatchingInput) != 0; }
427 
428     /// hasTiedOperand() - Return true if this input operand is a matching
429     /// constraint that ties it to an output operand.  If this returns true,
430     /// then getTiedOperand will indicate which output operand this is tied to.
hasTiedOperandConstraintInfo431     bool hasTiedOperand() const { return TiedOperand != -1; }
getTiedOperandConstraintInfo432     unsigned getTiedOperand() const {
433       assert(hasTiedOperand() && "Has no tied operand!");
434       return (unsigned)TiedOperand;
435     }
436 
setIsReadWriteConstraintInfo437     void setIsReadWrite() { Flags |= CI_ReadWrite; }
setAllowsMemoryConstraintInfo438     void setAllowsMemory() { Flags |= CI_AllowsMemory; }
setAllowsRegisterConstraintInfo439     void setAllowsRegister() { Flags |= CI_AllowsRegister; }
setHasMatchingInputConstraintInfo440     void setHasMatchingInput() { Flags |= CI_HasMatchingInput; }
441 
442     /// setTiedOperand - Indicate that this is an input operand that is tied to
443     /// the specified output operand.  Copy over the various constraint
444     /// information from the output.
setTiedOperandConstraintInfo445     void setTiedOperand(unsigned N, ConstraintInfo &Output) {
446       Output.setHasMatchingInput();
447       Flags = Output.Flags;
448       TiedOperand = N;
449       // Don't copy Name or constraint string.
450     }
451   };
452 
453   // validateOutputConstraint, validateInputConstraint - Checks that
454   // a constraint is valid and provides information about it.
455   // FIXME: These should return a real error instead of just true/false.
456   bool validateOutputConstraint(ConstraintInfo &Info) const;
457   bool validateInputConstraint(ConstraintInfo *OutputConstraints,
458                                unsigned NumOutputs,
459                                ConstraintInfo &info) const;
460   bool resolveSymbolicName(const char *&Name,
461                            ConstraintInfo *OutputConstraints,
462                            unsigned NumOutputs, unsigned &Index) const;
463 
464   // Constraint parm will be left pointing at the last character of
465   // the constraint.  In practice, it won't be changed unless the
466   // constraint is longer than one character.
convertConstraint(const char * & Constraint)467   virtual std::string convertConstraint(const char *&Constraint) const {
468     // 'p' defaults to 'r', but can be overridden by targets.
469     if (*Constraint == 'p')
470       return std::string("r");
471     return std::string(1, *Constraint);
472   }
473 
474   // Returns a string of target-specific clobbers, in LLVM format.
475   virtual const char *getClobbers() const = 0;
476 
477 
478   /// getTriple - Return the target triple of the primary target.
getTriple()479   const llvm::Triple &getTriple() const {
480     return Triple;
481   }
482 
getTargetDescription()483   const char *getTargetDescription() const {
484     return DescriptionString;
485   }
486 
487   struct GCCRegAlias {
488     const char * const Aliases[5];
489     const char * const Register;
490   };
491 
492   struct AddlRegName {
493     const char * const Names[5];
494     const unsigned RegNum;
495   };
496 
497   /// hasProtectedVisibility - Does this target support "protected"
498   /// visibility?
499   ///
500   /// Any target which dynamic libraries will naturally support
501   /// something like "default" (meaning that the symbol is visible
502   /// outside this shared object) and "hidden" (meaning that it isn't)
503   /// visibilities, but "protected" is really an ELF-specific concept
504   /// with wierd semantics designed around the convenience of dynamic
505   /// linker implementations.  Which is not to suggest that there's
506   /// consistent target-independent semantics for "default" visibility
507   /// either; the entire thing is pretty badly mangled.
hasProtectedVisibility()508   virtual bool hasProtectedVisibility() const { return true; }
509 
useGlobalsForAutomaticVariables()510   virtual bool useGlobalsForAutomaticVariables() const { return false; }
511 
512   /// getCFStringSection - Return the section to use for CFString
513   /// literals, or 0 if no special section is used.
getCFStringSection()514   virtual const char *getCFStringSection() const {
515     return "__DATA,__cfstring";
516   }
517 
518   /// getNSStringSection - Return the section to use for NSString
519   /// literals, or 0 if no special section is used.
getNSStringSection()520   virtual const char *getNSStringSection() const {
521     return "__OBJC,__cstring_object,regular,no_dead_strip";
522   }
523 
524   /// getNSStringNonFragileABISection - Return the section to use for
525   /// NSString literals, or 0 if no special section is used (NonFragile ABI).
getNSStringNonFragileABISection()526   virtual const char *getNSStringNonFragileABISection() const {
527     return "__DATA, __objc_stringobj, regular, no_dead_strip";
528   }
529 
530   /// isValidSectionSpecifier - This is an optional hook that targets can
531   /// implement to perform semantic checking on attribute((section("foo")))
532   /// specifiers.  In this case, "foo" is passed in to be checked.  If the
533   /// section specifier is invalid, the backend should return a non-empty string
534   /// that indicates the problem.
535   ///
536   /// This hook is a simple quality of implementation feature to catch errors
537   /// and give good diagnostics in cases when the assembler or code generator
538   /// would otherwise reject the section specifier.
539   ///
isValidSectionSpecifier(StringRef SR)540   virtual std::string isValidSectionSpecifier(StringRef SR) const {
541     return "";
542   }
543 
544   /// setForcedLangOptions - Set forced language options.
545   /// Apply changes to the target information with respect to certain
546   /// language options which change the target configuration.
547   virtual void setForcedLangOptions(LangOptions &Opts);
548 
549   /// getDefaultFeatures - Get the default set of target features for the CPU;
550   /// this should include all legal feature strings on the target.
getDefaultFeatures(llvm::StringMap<bool> & Features)551   virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
552   }
553 
554   /// getABI - Get the ABI in use.
getABI()555   virtual const char *getABI() const {
556     return "";
557   }
558 
559   /// getCXXABI - Get the C++ ABI in use.
getCXXABI()560   virtual TargetCXXABI getCXXABI() const {
561     return CXXABI;
562   }
563 
564   /// setCPU - Target the specific CPU.
565   ///
566   /// \return - False on error (invalid CPU name).
setCPU(const std::string & Name)567   virtual bool setCPU(const std::string &Name) {
568     return false;
569   }
570 
571   /// setABI - Use the specific ABI.
572   ///
573   /// \return - False on error (invalid ABI name).
setABI(const std::string & Name)574   virtual bool setABI(const std::string &Name) {
575     return false;
576   }
577 
578   /// setCXXABI - Use this specific C++ ABI.
579   ///
580   /// \return - False on error (invalid C++ ABI name).
setCXXABI(const std::string & Name)581   bool setCXXABI(const std::string &Name) {
582     static const TargetCXXABI Unknown = static_cast<TargetCXXABI>(-1);
583     TargetCXXABI ABI = llvm::StringSwitch<TargetCXXABI>(Name)
584       .Case("arm", CXXABI_ARM)
585       .Case("itanium", CXXABI_Itanium)
586       .Case("microsoft", CXXABI_Microsoft)
587       .Default(Unknown);
588     if (ABI == Unknown) return false;
589     return setCXXABI(ABI);
590   }
591 
592   /// setCXXABI - Set the C++ ABI to be used by this implementation.
593   ///
594   /// \return - False on error (ABI not valid on this target)
setCXXABI(TargetCXXABI ABI)595   virtual bool setCXXABI(TargetCXXABI ABI) {
596     CXXABI = ABI;
597     return true;
598   }
599 
600   /// setFeatureEnabled - Enable or disable a specific target feature,
601   /// the feature name must be valid.
602   ///
603   /// \return - False on error (invalid feature name).
setFeatureEnabled(llvm::StringMap<bool> & Features,StringRef Name,bool Enabled)604   virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
605                                  StringRef Name,
606                                  bool Enabled) const {
607     return false;
608   }
609 
610   /// HandleTargetOptions - Perform initialization based on the user configured
611   /// set of features (e.g., +sse4). The list is guaranteed to have at most one
612   /// entry per feature.
613   ///
614   /// The target may modify the features list, to change which options are
615   /// passed onwards to the backend.
HandleTargetFeatures(std::vector<std::string> & Features)616   virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
617   }
618 
619   /// \brief Determine whether the given target has the given feature.
hasFeature(StringRef Feature)620   virtual bool hasFeature(StringRef Feature) const {
621     return false;
622   }
623 
624   // getRegParmMax - Returns maximal number of args passed in registers.
getRegParmMax()625   unsigned getRegParmMax() const {
626     assert(RegParmMax < 7 && "RegParmMax value is larger than AST can handle");
627     return RegParmMax;
628   }
629 
630   /// isTLSSupported - Whether the target supports thread-local storage.
isTLSSupported()631   bool isTLSSupported() const {
632     return TLSSupported;
633   }
634 
635   /// hasNoAsmVariants - Return true if {|} are normal characters in the
636   /// asm string.  If this returns false (the default), then {abc|xyz} is syntax
637   /// that says that when compiling for asm variant #0, "abc" should be
638   /// generated, but when compiling for asm variant #1, "xyz" should be
639   /// generated.
hasNoAsmVariants()640   bool hasNoAsmVariants() const {
641     return NoAsmVariants;
642   }
643 
644   /// getEHDataRegisterNumber - Return the register number that
645   /// __builtin_eh_return_regno would return with the specified argument.
getEHDataRegisterNumber(unsigned RegNo)646   virtual int getEHDataRegisterNumber(unsigned RegNo) const {
647     return -1;
648   }
649 
650   /// getStaticInitSectionSpecifier - Return the section to use for C++ static
651   /// initialization functions.
getStaticInitSectionSpecifier()652   virtual const char *getStaticInitSectionSpecifier() const {
653     return 0;
654   }
655 
getAddressSpaceMap()656   const LangAS::Map &getAddressSpaceMap() const {
657     return *AddrSpaceMap;
658   }
659 
660   /// \brief Retrieve the name of the platform as it is used in the
661   /// availability attribute.
getPlatformName()662   StringRef getPlatformName() const { return PlatformName; }
663 
664   /// \brief Retrieve the minimum desired version of the platform, to
665   /// which the program should be compiled.
getPlatformMinVersion()666   VersionTuple getPlatformMinVersion() const { return PlatformMinVersion; }
667 
isBigEndian()668   bool isBigEndian() const { return BigEndian; }
669 
670 protected:
getPointerWidthV(unsigned AddrSpace)671   virtual uint64_t getPointerWidthV(unsigned AddrSpace) const {
672     return PointerWidth;
673   }
getPointerAlignV(unsigned AddrSpace)674   virtual uint64_t getPointerAlignV(unsigned AddrSpace) const {
675     return PointerAlign;
676   }
getPtrDiffTypeV(unsigned AddrSpace)677   virtual enum IntType getPtrDiffTypeV(unsigned AddrSpace) const {
678     return PtrDiffType;
679   }
680   virtual void getGCCRegNames(const char * const *&Names,
681                               unsigned &NumNames) const = 0;
682   virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
683                                 unsigned &NumAliases) const = 0;
getGCCAddlRegNames(const AddlRegName * & Addl,unsigned & NumAddl)684   virtual void getGCCAddlRegNames(const AddlRegName *&Addl,
685 				  unsigned &NumAddl) const {
686     Addl = 0;
687     NumAddl = 0;
688   }
689   virtual bool validateAsmConstraint(const char *&Name,
690                                      TargetInfo::ConstraintInfo &info) const= 0;
691 };
692 
693 }  // end namespace clang
694 
695 #endif
696