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