Targets.cpp revision 5ccd3d0214b9d765a1bb41872da27d3c5530ab2b
1//===--- Targets.cpp - Implement -arch option and targets -----------------===//
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 implements construction of a TargetInfo object from a
11// target triple.
12//
13//===----------------------------------------------------------------------===//
14
15#include "clang/Basic/TargetInfo.h"
16#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
18#include "clang/Basic/LangOptions.h"
19#include "clang/Basic/MacroBuilder.h"
20#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
22#include "llvm/ADT/APFloat.h"
23#include "llvm/ADT/OwningPtr.h"
24#include "llvm/ADT/STLExtras.h"
25#include "llvm/ADT/StringRef.h"
26#include "llvm/ADT/StringSwitch.h"
27#include "llvm/ADT/Triple.h"
28#include "llvm/IR/Type.h"
29#include "llvm/MC/MCSectionMachO.h"
30#include "llvm/Support/ErrorHandling.h"
31#include <algorithm>
32using namespace clang;
33
34//===----------------------------------------------------------------------===//
35//  Common code shared among targets.
36//===----------------------------------------------------------------------===//
37
38/// DefineStd - Define a macro name and standard variants.  For example if
39/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
40/// when in GNU mode.
41static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
42                      const LangOptions &Opts) {
43  assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
44
45  // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
46  // in the user's namespace.
47  if (Opts.GNUMode)
48    Builder.defineMacro(MacroName);
49
50  // Define __unix.
51  Builder.defineMacro("__" + MacroName);
52
53  // Define __unix__.
54  Builder.defineMacro("__" + MacroName + "__");
55}
56
57static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
58                            bool Tuning = true) {
59  Builder.defineMacro("__" + CPUName);
60  Builder.defineMacro("__" + CPUName + "__");
61  if (Tuning)
62    Builder.defineMacro("__tune_" + CPUName + "__");
63}
64
65//===----------------------------------------------------------------------===//
66// Defines specific to certain operating systems.
67//===----------------------------------------------------------------------===//
68
69namespace {
70template<typename TgtInfo>
71class OSTargetInfo : public TgtInfo {
72protected:
73  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
74                            MacroBuilder &Builder) const=0;
75public:
76  OSTargetInfo(const std::string& triple) : TgtInfo(triple) {}
77  virtual void getTargetDefines(const LangOptions &Opts,
78                                MacroBuilder &Builder) const {
79    TgtInfo::getTargetDefines(Opts, Builder);
80    getOSDefines(Opts, TgtInfo::getTriple(), Builder);
81  }
82
83};
84} // end anonymous namespace
85
86
87static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
88                             const llvm::Triple &Triple,
89                             StringRef &PlatformName,
90                             VersionTuple &PlatformMinVersion) {
91  Builder.defineMacro("__APPLE_CC__", "5621");
92  Builder.defineMacro("__APPLE__");
93  Builder.defineMacro("__MACH__");
94  Builder.defineMacro("OBJC_NEW_PROPERTIES");
95  // AddressSanitizer doesn't play well with source fortification, which is on
96  // by default on Darwin.
97  if (Opts.Sanitize.Address) Builder.defineMacro("_FORTIFY_SOURCE", "0");
98
99  if (!Opts.ObjCAutoRefCount) {
100    // __weak is always defined, for use in blocks and with objc pointers.
101    Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
102
103    // Darwin defines __strong even in C mode (just to nothing).
104    if (Opts.getGC() != LangOptions::NonGC)
105      Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
106    else
107      Builder.defineMacro("__strong", "");
108
109    // __unsafe_unretained is defined to nothing in non-ARC mode. We even
110    // allow this in C, since one might have block pointers in structs that
111    // are used in pure C code and in Objective-C ARC.
112    Builder.defineMacro("__unsafe_unretained", "");
113  }
114
115  if (Opts.Static)
116    Builder.defineMacro("__STATIC__");
117  else
118    Builder.defineMacro("__DYNAMIC__");
119
120  if (Opts.POSIXThreads)
121    Builder.defineMacro("_REENTRANT");
122
123  // Get the platform type and version number from the triple.
124  unsigned Maj, Min, Rev;
125  if (Triple.isMacOSX()) {
126    Triple.getMacOSXVersion(Maj, Min, Rev);
127    PlatformName = "macosx";
128  } else {
129    Triple.getOSVersion(Maj, Min, Rev);
130    PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
131  }
132
133  // If -target arch-pc-win32-macho option specified, we're
134  // generating code for Win32 ABI. No need to emit
135  // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
136  if (PlatformName == "win32") {
137    PlatformMinVersion = VersionTuple(Maj, Min, Rev);
138    return;
139  }
140
141  // Set the appropriate OS version define.
142  if (Triple.getOS() == llvm::Triple::IOS) {
143    assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
144    char Str[6];
145    Str[0] = '0' + Maj;
146    Str[1] = '0' + (Min / 10);
147    Str[2] = '0' + (Min % 10);
148    Str[3] = '0' + (Rev / 10);
149    Str[4] = '0' + (Rev % 10);
150    Str[5] = '\0';
151    Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
152  } else {
153    // Note that the Driver allows versions which aren't representable in the
154    // define (because we only get a single digit for the minor and micro
155    // revision numbers). So, we limit them to the maximum representable
156    // version.
157    assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
158    assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
159    char Str[5];
160    Str[0] = '0' + (Maj / 10);
161    Str[1] = '0' + (Maj % 10);
162    Str[2] = '0' + std::min(Min, 9U);
163    Str[3] = '0' + std::min(Rev, 9U);
164    Str[4] = '\0';
165    Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
166  }
167
168  PlatformMinVersion = VersionTuple(Maj, Min, Rev);
169}
170
171namespace {
172template<typename Target>
173class DarwinTargetInfo : public OSTargetInfo<Target> {
174protected:
175  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
176                            MacroBuilder &Builder) const {
177    getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
178                     this->PlatformMinVersion);
179  }
180
181public:
182  DarwinTargetInfo(const std::string& triple) :
183    OSTargetInfo<Target>(triple) {
184      llvm::Triple T = llvm::Triple(triple);
185      this->TLSSupported = T.isMacOSX() && !T.isMacOSXVersionLT(10,7);
186      this->MCountName = "\01mcount";
187    }
188
189  virtual std::string isValidSectionSpecifier(StringRef SR) const {
190    // Let MCSectionMachO validate this.
191    StringRef Segment, Section;
192    unsigned TAA, StubSize;
193    bool HasTAA;
194    return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
195                                                       TAA, HasTAA, StubSize);
196  }
197
198  virtual const char *getStaticInitSectionSpecifier() const {
199    // FIXME: We should return 0 when building kexts.
200    return "__TEXT,__StaticInit,regular,pure_instructions";
201  }
202
203  /// Darwin does not support protected visibility.  Darwin's "default"
204  /// is very similar to ELF's "protected";  Darwin requires a "weak"
205  /// attribute on declarations that can be dynamically replaced.
206  virtual bool hasProtectedVisibility() const {
207    return false;
208  }
209};
210
211
212// DragonFlyBSD Target
213template<typename Target>
214class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
215protected:
216  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
217                            MacroBuilder &Builder) const {
218    // DragonFly defines; list based off of gcc output
219    Builder.defineMacro("__DragonFly__");
220    Builder.defineMacro("__DragonFly_cc_version", "100001");
221    Builder.defineMacro("__ELF__");
222    Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
223    Builder.defineMacro("__tune_i386__");
224    DefineStd(Builder, "unix", Opts);
225  }
226public:
227  DragonFlyBSDTargetInfo(const std::string &triple)
228    : OSTargetInfo<Target>(triple) {
229      this->UserLabelPrefix = "";
230
231      llvm::Triple Triple(triple);
232      switch (Triple.getArch()) {
233        default:
234        case llvm::Triple::x86:
235        case llvm::Triple::x86_64:
236          this->MCountName = ".mcount";
237          break;
238      }
239  }
240};
241
242// FreeBSD Target
243template<typename Target>
244class FreeBSDTargetInfo : public OSTargetInfo<Target> {
245protected:
246  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
247                            MacroBuilder &Builder) const {
248    // FreeBSD defines; list based off of gcc output
249
250    unsigned Release = Triple.getOSMajorVersion();
251    if (Release == 0U)
252      Release = 8;
253
254    Builder.defineMacro("__FreeBSD__", Twine(Release));
255    Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
256    Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
257    DefineStd(Builder, "unix", Opts);
258    Builder.defineMacro("__ELF__");
259  }
260public:
261  FreeBSDTargetInfo(const std::string &triple)
262    : OSTargetInfo<Target>(triple) {
263      this->UserLabelPrefix = "";
264
265      llvm::Triple Triple(triple);
266      switch (Triple.getArch()) {
267        default:
268        case llvm::Triple::x86:
269        case llvm::Triple::x86_64:
270          this->MCountName = ".mcount";
271          break;
272        case llvm::Triple::mips:
273        case llvm::Triple::mipsel:
274        case llvm::Triple::ppc:
275        case llvm::Triple::ppc64:
276          this->MCountName = "_mcount";
277          break;
278        case llvm::Triple::arm:
279          this->MCountName = "__mcount";
280          break;
281      }
282
283    }
284};
285
286// Minix Target
287template<typename Target>
288class MinixTargetInfo : public OSTargetInfo<Target> {
289protected:
290  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
291                            MacroBuilder &Builder) const {
292    // Minix defines
293
294    Builder.defineMacro("__minix", "3");
295    Builder.defineMacro("_EM_WSIZE", "4");
296    Builder.defineMacro("_EM_PSIZE", "4");
297    Builder.defineMacro("_EM_SSIZE", "2");
298    Builder.defineMacro("_EM_LSIZE", "4");
299    Builder.defineMacro("_EM_FSIZE", "4");
300    Builder.defineMacro("_EM_DSIZE", "8");
301    Builder.defineMacro("__ELF__");
302    DefineStd(Builder, "unix", Opts);
303  }
304public:
305  MinixTargetInfo(const std::string &triple)
306    : OSTargetInfo<Target>(triple) {
307      this->UserLabelPrefix = "";
308    }
309};
310
311// Linux target
312template<typename Target>
313class LinuxTargetInfo : public OSTargetInfo<Target> {
314protected:
315  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
316                            MacroBuilder &Builder) const {
317    // Linux defines; list based off of gcc output
318    DefineStd(Builder, "unix", Opts);
319    DefineStd(Builder, "linux", Opts);
320    Builder.defineMacro("__gnu_linux__");
321    Builder.defineMacro("__ELF__");
322    if (Triple.getEnvironment() == llvm::Triple::Android)
323      Builder.defineMacro("__ANDROID__", "1");
324    if (Opts.POSIXThreads)
325      Builder.defineMacro("_REENTRANT");
326    if (Opts.CPlusPlus)
327      Builder.defineMacro("_GNU_SOURCE");
328  }
329public:
330  LinuxTargetInfo(const std::string& triple)
331    : OSTargetInfo<Target>(triple) {
332    this->UserLabelPrefix = "";
333    this->WIntType = TargetInfo::UnsignedInt;
334  }
335
336  virtual const char *getStaticInitSectionSpecifier() const {
337    return ".text.startup";
338  }
339};
340
341// NetBSD Target
342template<typename Target>
343class NetBSDTargetInfo : public OSTargetInfo<Target> {
344protected:
345  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
346                            MacroBuilder &Builder) const {
347    // NetBSD defines; list based off of gcc output
348    Builder.defineMacro("__NetBSD__");
349    Builder.defineMacro("__unix__");
350    Builder.defineMacro("__ELF__");
351    if (Opts.POSIXThreads)
352      Builder.defineMacro("_POSIX_THREADS");
353  }
354public:
355  NetBSDTargetInfo(const std::string &triple)
356    : OSTargetInfo<Target>(triple) {
357      this->UserLabelPrefix = "";
358    }
359};
360
361// OpenBSD Target
362template<typename Target>
363class OpenBSDTargetInfo : public OSTargetInfo<Target> {
364protected:
365  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
366                            MacroBuilder &Builder) const {
367    // OpenBSD defines; list based off of gcc output
368
369    Builder.defineMacro("__OpenBSD__");
370    DefineStd(Builder, "unix", Opts);
371    Builder.defineMacro("__ELF__");
372    if (Opts.POSIXThreads)
373      Builder.defineMacro("_REENTRANT");
374  }
375public:
376  OpenBSDTargetInfo(const std::string &triple)
377    : OSTargetInfo<Target>(triple) {
378      this->UserLabelPrefix = "";
379      this->TLSSupported = false;
380
381      llvm::Triple Triple(triple);
382      switch (Triple.getArch()) {
383        default:
384        case llvm::Triple::x86:
385        case llvm::Triple::x86_64:
386        case llvm::Triple::arm:
387        case llvm::Triple::sparc:
388          this->MCountName = "__mcount";
389          break;
390        case llvm::Triple::mips64:
391        case llvm::Triple::mips64el:
392        case llvm::Triple::ppc:
393        case llvm::Triple::sparcv9:
394          this->MCountName = "_mcount";
395          break;
396      }
397  }
398};
399
400// Bitrig Target
401template<typename Target>
402class BitrigTargetInfo : public OSTargetInfo<Target> {
403protected:
404  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
405                            MacroBuilder &Builder) const {
406    // Bitrig defines; list based off of gcc output
407
408    Builder.defineMacro("__Bitrig__");
409    DefineStd(Builder, "unix", Opts);
410    Builder.defineMacro("__ELF__");
411    if (Opts.POSIXThreads)
412      Builder.defineMacro("_REENTRANT");
413  }
414public:
415  BitrigTargetInfo(const std::string &triple)
416    : OSTargetInfo<Target>(triple) {
417      this->UserLabelPrefix = "";
418      this->TLSSupported = false;
419      this->MCountName = "__mcount";
420  }
421};
422
423// PSP Target
424template<typename Target>
425class PSPTargetInfo : public OSTargetInfo<Target> {
426protected:
427  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
428                            MacroBuilder &Builder) const {
429    // PSP defines; list based on the output of the pspdev gcc toolchain.
430    Builder.defineMacro("PSP");
431    Builder.defineMacro("_PSP");
432    Builder.defineMacro("__psp__");
433    Builder.defineMacro("__ELF__");
434  }
435public:
436  PSPTargetInfo(const std::string& triple)
437    : OSTargetInfo<Target>(triple) {
438    this->UserLabelPrefix = "";
439  }
440};
441
442// PS3 PPU Target
443template<typename Target>
444class PS3PPUTargetInfo : public OSTargetInfo<Target> {
445protected:
446  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
447                            MacroBuilder &Builder) const {
448    // PS3 PPU defines.
449    Builder.defineMacro("__PPC__");
450    Builder.defineMacro("__PPU__");
451    Builder.defineMacro("__CELLOS_LV2__");
452    Builder.defineMacro("__ELF__");
453    Builder.defineMacro("__LP32__");
454    Builder.defineMacro("_ARCH_PPC64");
455    Builder.defineMacro("__powerpc64__");
456  }
457public:
458  PS3PPUTargetInfo(const std::string& triple)
459    : OSTargetInfo<Target>(triple) {
460    this->UserLabelPrefix = "";
461    this->LongWidth = this->LongAlign = 32;
462    this->PointerWidth = this->PointerAlign = 32;
463    this->IntMaxType = TargetInfo::SignedLongLong;
464    this->UIntMaxType = TargetInfo::UnsignedLongLong;
465    this->Int64Type = TargetInfo::SignedLongLong;
466    this->SizeType = TargetInfo::UnsignedInt;
467    this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
468                              "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
469  }
470};
471
472// FIXME: Need a real SPU target.
473// PS3 SPU Target
474template<typename Target>
475class PS3SPUTargetInfo : public OSTargetInfo<Target> {
476protected:
477  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
478                            MacroBuilder &Builder) const {
479    // PS3 PPU defines.
480    Builder.defineMacro("__SPU__");
481    Builder.defineMacro("__ELF__");
482  }
483public:
484  PS3SPUTargetInfo(const std::string& triple)
485    : OSTargetInfo<Target>(triple) {
486    this->UserLabelPrefix = "";
487  }
488};
489
490// AuroraUX target
491template<typename Target>
492class AuroraUXTargetInfo : public OSTargetInfo<Target> {
493protected:
494  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
495                            MacroBuilder &Builder) const {
496    DefineStd(Builder, "sun", Opts);
497    DefineStd(Builder, "unix", Opts);
498    Builder.defineMacro("__ELF__");
499    Builder.defineMacro("__svr4__");
500    Builder.defineMacro("__SVR4");
501  }
502public:
503  AuroraUXTargetInfo(const std::string& triple)
504    : OSTargetInfo<Target>(triple) {
505    this->UserLabelPrefix = "";
506    this->WCharType = this->SignedLong;
507    // FIXME: WIntType should be SignedLong
508  }
509};
510
511// Solaris target
512template<typename Target>
513class SolarisTargetInfo : public OSTargetInfo<Target> {
514protected:
515  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
516                            MacroBuilder &Builder) const {
517    DefineStd(Builder, "sun", Opts);
518    DefineStd(Builder, "unix", Opts);
519    Builder.defineMacro("__ELF__");
520    Builder.defineMacro("__svr4__");
521    Builder.defineMacro("__SVR4");
522    // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
523    // newer, but to 500 for everything else.  feature_test.h has a check to
524    // ensure that you are not using C99 with an old version of X/Open or C89
525    // with a new version.
526    if (Opts.C99 || Opts.C11)
527      Builder.defineMacro("_XOPEN_SOURCE", "600");
528    else
529      Builder.defineMacro("_XOPEN_SOURCE", "500");
530    if (Opts.CPlusPlus)
531      Builder.defineMacro("__C99FEATURES__");
532    Builder.defineMacro("_LARGEFILE_SOURCE");
533    Builder.defineMacro("_LARGEFILE64_SOURCE");
534    Builder.defineMacro("__EXTENSIONS__");
535    Builder.defineMacro("_REENTRANT");
536  }
537public:
538  SolarisTargetInfo(const std::string& triple)
539    : OSTargetInfo<Target>(triple) {
540    this->UserLabelPrefix = "";
541    this->WCharType = this->SignedInt;
542    // FIXME: WIntType should be SignedLong
543  }
544};
545
546// Windows target
547template<typename Target>
548class WindowsTargetInfo : public OSTargetInfo<Target> {
549protected:
550  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
551                            MacroBuilder &Builder) const {
552    Builder.defineMacro("_WIN32");
553  }
554  void getVisualStudioDefines(const LangOptions &Opts,
555                              MacroBuilder &Builder) const {
556    if (Opts.CPlusPlus) {
557      if (Opts.RTTI)
558        Builder.defineMacro("_CPPRTTI");
559
560      if (Opts.Exceptions)
561        Builder.defineMacro("_CPPUNWIND");
562    }
563
564    if (!Opts.CharIsSigned)
565      Builder.defineMacro("_CHAR_UNSIGNED");
566
567    // FIXME: POSIXThreads isn't exactly the option this should be defined for,
568    //        but it works for now.
569    if (Opts.POSIXThreads)
570      Builder.defineMacro("_MT");
571
572    if (Opts.MSCVersion != 0)
573      Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion));
574
575    if (Opts.MicrosoftExt) {
576      Builder.defineMacro("_MSC_EXTENSIONS");
577
578      if (Opts.CPlusPlus11) {
579        Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
580        Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
581        Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
582      }
583    }
584
585    Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
586  }
587
588public:
589  WindowsTargetInfo(const std::string &triple)
590    : OSTargetInfo<Target>(triple) {}
591};
592
593template <typename Target>
594class NaClTargetInfo : public OSTargetInfo<Target> {
595 protected:
596  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
597                            MacroBuilder &Builder) const {
598    if (Opts.POSIXThreads)
599      Builder.defineMacro("_REENTRANT");
600    if (Opts.CPlusPlus)
601      Builder.defineMacro("_GNU_SOURCE");
602
603    DefineStd(Builder, "unix", Opts);
604    Builder.defineMacro("__ELF__");
605    Builder.defineMacro("__native_client__");
606  }
607 public:
608  NaClTargetInfo(const std::string &triple)
609    : OSTargetInfo<Target>(triple) {
610    this->UserLabelPrefix = "";
611    this->LongAlign = 32;
612    this->LongWidth = 32;
613    this->PointerAlign = 32;
614    this->PointerWidth = 32;
615    this->IntMaxType = TargetInfo::SignedLongLong;
616    this->UIntMaxType = TargetInfo::UnsignedLongLong;
617    this->Int64Type = TargetInfo::SignedLongLong;
618    this->DoubleAlign = 64;
619    this->LongDoubleWidth = 64;
620    this->LongDoubleAlign = 64;
621    this->SizeType = TargetInfo::UnsignedInt;
622    this->PtrDiffType = TargetInfo::SignedInt;
623    this->IntPtrType = TargetInfo::SignedInt;
624    this->RegParmMax = 2;
625    this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
626    this->DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
627                              "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
628  }
629  virtual typename Target::CallingConvCheckResult checkCallingConvention(
630      CallingConv CC) const {
631    return CC == CC_PnaclCall ? Target::CCCR_OK :
632        Target::checkCallingConvention(CC);
633  }
634};
635} // end anonymous namespace.
636
637//===----------------------------------------------------------------------===//
638// Specific target implementations.
639//===----------------------------------------------------------------------===//
640
641namespace {
642// PPC abstract base class
643class PPCTargetInfo : public TargetInfo {
644  static const Builtin::Info BuiltinInfo[];
645  static const char * const GCCRegNames[];
646  static const TargetInfo::GCCRegAlias GCCRegAliases[];
647  std::string CPU;
648public:
649  PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {
650    LongDoubleWidth = LongDoubleAlign = 128;
651    LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
652  }
653
654  /// \brief Flags for architecture specific defines.
655  typedef enum {
656    ArchDefineNone  = 0,
657    ArchDefineName  = 1 << 0, // <name> is substituted for arch name.
658    ArchDefinePpcgr = 1 << 1,
659    ArchDefinePpcsq = 1 << 2,
660    ArchDefine440   = 1 << 3,
661    ArchDefine603   = 1 << 4,
662    ArchDefine604   = 1 << 5,
663    ArchDefinePwr4  = 1 << 6,
664    ArchDefinePwr6  = 1 << 7,
665    ArchDefineA2    = 1 << 8,
666    ArchDefineA2q   = 1 << 9
667  } ArchDefineTypes;
668
669  virtual bool setCPU(const std::string &Name) {
670    bool CPUKnown = llvm::StringSwitch<bool>(Name)
671      .Case("generic", true)
672      .Case("440", true)
673      .Case("450", true)
674      .Case("601", true)
675      .Case("602", true)
676      .Case("603", true)
677      .Case("603e", true)
678      .Case("603ev", true)
679      .Case("604", true)
680      .Case("604e", true)
681      .Case("620", true)
682      .Case("g3", true)
683      .Case("7400", true)
684      .Case("g4", true)
685      .Case("7450", true)
686      .Case("g4+", true)
687      .Case("750", true)
688      .Case("970", true)
689      .Case("g5", true)
690      .Case("a2", true)
691      .Case("a2q", true)
692      .Case("e500mc", true)
693      .Case("e5500", true)
694      .Case("pwr6", true)
695      .Case("pwr7", true)
696      .Case("ppc", true)
697      .Case("ppc64", true)
698      .Default(false);
699
700    if (CPUKnown)
701      CPU = Name;
702
703    return CPUKnown;
704  }
705
706  virtual void getTargetBuiltins(const Builtin::Info *&Records,
707                                 unsigned &NumRecords) const {
708    Records = BuiltinInfo;
709    NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
710  }
711
712  virtual bool isCLZForZeroUndef() const { return false; }
713
714  virtual void getTargetDefines(const LangOptions &Opts,
715                                MacroBuilder &Builder) const;
716
717  virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
718
719  virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
720                                 StringRef Name,
721                                 bool Enabled) const;
722
723  virtual bool hasFeature(StringRef Feature) const;
724
725  virtual void getGCCRegNames(const char * const *&Names,
726                              unsigned &NumNames) const;
727  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
728                                unsigned &NumAliases) const;
729  virtual bool validateAsmConstraint(const char *&Name,
730                                     TargetInfo::ConstraintInfo &Info) const {
731    switch (*Name) {
732    default: return false;
733    case 'O': // Zero
734      break;
735    case 'b': // Base register
736    case 'f': // Floating point register
737      Info.setAllowsRegister();
738      break;
739    // FIXME: The following are added to allow parsing.
740    // I just took a guess at what the actions should be.
741    // Also, is more specific checking needed?  I.e. specific registers?
742    case 'd': // Floating point register (containing 64-bit value)
743    case 'v': // Altivec vector register
744      Info.setAllowsRegister();
745      break;
746    case 'w':
747      switch (Name[1]) {
748        case 'd':// VSX vector register to hold vector double data
749        case 'f':// VSX vector register to hold vector float data
750        case 's':// VSX vector register to hold scalar float data
751        case 'a':// Any VSX register
752          break;
753        default:
754          return false;
755      }
756      Info.setAllowsRegister();
757      Name++; // Skip over 'w'.
758      break;
759    case 'h': // `MQ', `CTR', or `LINK' register
760    case 'q': // `MQ' register
761    case 'c': // `CTR' register
762    case 'l': // `LINK' register
763    case 'x': // `CR' register (condition register) number 0
764    case 'y': // `CR' register (condition register)
765    case 'z': // `XER[CA]' carry bit (part of the XER register)
766      Info.setAllowsRegister();
767      break;
768    case 'I': // Signed 16-bit constant
769    case 'J': // Unsigned 16-bit constant shifted left 16 bits
770              //  (use `L' instead for SImode constants)
771    case 'K': // Unsigned 16-bit constant
772    case 'L': // Signed 16-bit constant shifted left 16 bits
773    case 'M': // Constant larger than 31
774    case 'N': // Exact power of 2
775    case 'P': // Constant whose negation is a signed 16-bit constant
776    case 'G': // Floating point constant that can be loaded into a
777              // register with one instruction per word
778    case 'H': // Integer/Floating point constant that can be loaded
779              // into a register using three instructions
780      break;
781    case 'm': // Memory operand. Note that on PowerPC targets, m can
782              // include addresses that update the base register. It
783              // is therefore only safe to use `m' in an asm statement
784              // if that asm statement accesses the operand exactly once.
785              // The asm statement must also use `%U<opno>' as a
786              // placeholder for the "update" flag in the corresponding
787              // load or store instruction. For example:
788              // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
789              // is correct but:
790              // asm ("st %1,%0" : "=m" (mem) : "r" (val));
791              // is not. Use es rather than m if you don't want the base
792              // register to be updated.
793    case 'e':
794      if (Name[1] != 's')
795          return false;
796              // es: A "stable" memory operand; that is, one which does not
797              // include any automodification of the base register. Unlike
798              // `m', this constraint can be used in asm statements that
799              // might access the operand several times, or that might not
800              // access it at all.
801      Info.setAllowsMemory();
802      Name++; // Skip over 'e'.
803      break;
804    case 'Q': // Memory operand that is an offset from a register (it is
805              // usually better to use `m' or `es' in asm statements)
806    case 'Z': // Memory operand that is an indexed or indirect from a
807              // register (it is usually better to use `m' or `es' in
808              // asm statements)
809      Info.setAllowsMemory();
810      Info.setAllowsRegister();
811      break;
812    case 'R': // AIX TOC entry
813    case 'a': // Address operand that is an indexed or indirect from a
814              // register (`p' is preferable for asm statements)
815    case 'S': // Constant suitable as a 64-bit mask operand
816    case 'T': // Constant suitable as a 32-bit mask operand
817    case 'U': // System V Release 4 small data area reference
818    case 't': // AND masks that can be performed by two rldic{l, r}
819              // instructions
820    case 'W': // Vector constant that does not require memory
821    case 'j': // Vector constant that is all zeros.
822      break;
823    // End FIXME.
824    }
825    return true;
826  }
827  virtual const char *getClobbers() const {
828    return "";
829  }
830  int getEHDataRegisterNumber(unsigned RegNo) const {
831    if (RegNo == 0) return 3;
832    if (RegNo == 1) return 4;
833    return -1;
834  }
835};
836
837const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
838#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
839#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
840                                              ALL_LANGUAGES },
841#include "clang/Basic/BuiltinsPPC.def"
842};
843
844
845/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
846/// #defines that are not tied to a specific subtarget.
847void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
848                                     MacroBuilder &Builder) const {
849  // Target identification.
850  Builder.defineMacro("__ppc__");
851  Builder.defineMacro("_ARCH_PPC");
852  Builder.defineMacro("__powerpc__");
853  Builder.defineMacro("__POWERPC__");
854  if (PointerWidth == 64) {
855    Builder.defineMacro("_ARCH_PPC64");
856    Builder.defineMacro("__powerpc64__");
857    Builder.defineMacro("__ppc64__");
858  } else {
859    Builder.defineMacro("__ppc__");
860  }
861
862  // Target properties.
863  if (getTriple().getOS() != llvm::Triple::NetBSD &&
864      getTriple().getOS() != llvm::Triple::OpenBSD)
865    Builder.defineMacro("_BIG_ENDIAN");
866  Builder.defineMacro("__BIG_ENDIAN__");
867
868  // Subtarget options.
869  Builder.defineMacro("__NATURAL_ALIGNMENT__");
870  Builder.defineMacro("__REGISTER_PREFIX__", "");
871
872  // FIXME: Should be controlled by command line option.
873  Builder.defineMacro("__LONG_DOUBLE_128__");
874
875  if (Opts.AltiVec) {
876    Builder.defineMacro("__VEC__", "10206");
877    Builder.defineMacro("__ALTIVEC__");
878  }
879
880  // CPU identification.
881  ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
882    .Case("440",   ArchDefineName)
883    .Case("450",   ArchDefineName | ArchDefine440)
884    .Case("601",   ArchDefineName)
885    .Case("602",   ArchDefineName | ArchDefinePpcgr)
886    .Case("603",   ArchDefineName | ArchDefinePpcgr)
887    .Case("603e",  ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
888    .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
889    .Case("604",   ArchDefineName | ArchDefinePpcgr)
890    .Case("604e",  ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
891    .Case("620",   ArchDefineName | ArchDefinePpcgr)
892    .Case("7400",  ArchDefineName | ArchDefinePpcgr)
893    .Case("7450",  ArchDefineName | ArchDefinePpcgr)
894    .Case("750",   ArchDefineName | ArchDefinePpcgr)
895    .Case("970",   ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
896                     | ArchDefinePpcsq)
897    .Case("pwr6",  ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
898    .Case("pwr7",  ArchDefineName | ArchDefinePwr6 | ArchDefinePpcgr
899                     | ArchDefinePpcsq)
900    .Case("a2",    ArchDefineA2)
901    .Case("a2q",   ArchDefineName | ArchDefineA2 | ArchDefineA2q)
902    .Default(ArchDefineNone);
903
904  if (defs & ArchDefineName)
905    Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
906  if (defs & ArchDefinePpcgr)
907    Builder.defineMacro("_ARCH_PPCGR");
908  if (defs & ArchDefinePpcsq)
909    Builder.defineMacro("_ARCH_PPCSQ");
910  if (defs & ArchDefine440)
911    Builder.defineMacro("_ARCH_440");
912  if (defs & ArchDefine603)
913    Builder.defineMacro("_ARCH_603");
914  if (defs & ArchDefine604)
915    Builder.defineMacro("_ARCH_604");
916  if (defs & (ArchDefinePwr4 | ArchDefinePwr6))
917    Builder.defineMacro("_ARCH_PWR4");
918  if (defs & ArchDefinePwr6) {
919    Builder.defineMacro("_ARCH_PWR5");
920    Builder.defineMacro("_ARCH_PWR6");
921  }
922  if (defs & ArchDefineA2)
923    Builder.defineMacro("_ARCH_A2");
924  if (defs & ArchDefineA2q) {
925    Builder.defineMacro("_ARCH_A2Q");
926    Builder.defineMacro("_ARCH_QP");
927  }
928
929  if (getTriple().getVendor() == llvm::Triple::BGQ) {
930    Builder.defineMacro("__bg__");
931    Builder.defineMacro("__THW_BLUEGENE__");
932    Builder.defineMacro("__bgq__");
933    Builder.defineMacro("__TOS_BGQ__");
934  }
935}
936
937void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
938  Features["altivec"] = llvm::StringSwitch<bool>(CPU)
939    .Case("7400", true)
940    .Case("g4", true)
941    .Case("7450", true)
942    .Case("g4+", true)
943    .Case("970", true)
944    .Case("g5", true)
945    .Case("pwr6", true)
946    .Case("pwr7", true)
947    .Case("ppc64", true)
948    .Default(false);
949}
950
951bool PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
952                                         StringRef Name,
953                                         bool Enabled) const {
954  if (Name == "altivec") {
955    Features[Name] = Enabled;
956    return true;
957  }
958
959  return false;
960}
961
962bool PPCTargetInfo::hasFeature(StringRef Feature) const {
963  return Feature == "powerpc";
964}
965
966
967const char * const PPCTargetInfo::GCCRegNames[] = {
968  "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
969  "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
970  "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
971  "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
972  "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
973  "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
974  "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
975  "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
976  "mq", "lr", "ctr", "ap",
977  "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
978  "xer",
979  "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
980  "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
981  "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
982  "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
983  "vrsave", "vscr",
984  "spe_acc", "spefscr",
985  "sfp"
986};
987
988void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
989                                   unsigned &NumNames) const {
990  Names = GCCRegNames;
991  NumNames = llvm::array_lengthof(GCCRegNames);
992}
993
994const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
995  // While some of these aliases do map to different registers
996  // they still share the same register name.
997  { { "0" }, "r0" },
998  { { "1"}, "r1" },
999  { { "2" }, "r2" },
1000  { { "3" }, "r3" },
1001  { { "4" }, "r4" },
1002  { { "5" }, "r5" },
1003  { { "6" }, "r6" },
1004  { { "7" }, "r7" },
1005  { { "8" }, "r8" },
1006  { { "9" }, "r9" },
1007  { { "10" }, "r10" },
1008  { { "11" }, "r11" },
1009  { { "12" }, "r12" },
1010  { { "13" }, "r13" },
1011  { { "14" }, "r14" },
1012  { { "15" }, "r15" },
1013  { { "16" }, "r16" },
1014  { { "17" }, "r17" },
1015  { { "18" }, "r18" },
1016  { { "19" }, "r19" },
1017  { { "20" }, "r20" },
1018  { { "21" }, "r21" },
1019  { { "22" }, "r22" },
1020  { { "23" }, "r23" },
1021  { { "24" }, "r24" },
1022  { { "25" }, "r25" },
1023  { { "26" }, "r26" },
1024  { { "27" }, "r27" },
1025  { { "28" }, "r28" },
1026  { { "29" }, "r29" },
1027  { { "30" }, "r30" },
1028  { { "31" }, "r31" },
1029  { { "fr0" }, "f0" },
1030  { { "fr1" }, "f1" },
1031  { { "fr2" }, "f2" },
1032  { { "fr3" }, "f3" },
1033  { { "fr4" }, "f4" },
1034  { { "fr5" }, "f5" },
1035  { { "fr6" }, "f6" },
1036  { { "fr7" }, "f7" },
1037  { { "fr8" }, "f8" },
1038  { { "fr9" }, "f9" },
1039  { { "fr10" }, "f10" },
1040  { { "fr11" }, "f11" },
1041  { { "fr12" }, "f12" },
1042  { { "fr13" }, "f13" },
1043  { { "fr14" }, "f14" },
1044  { { "fr15" }, "f15" },
1045  { { "fr16" }, "f16" },
1046  { { "fr17" }, "f17" },
1047  { { "fr18" }, "f18" },
1048  { { "fr19" }, "f19" },
1049  { { "fr20" }, "f20" },
1050  { { "fr21" }, "f21" },
1051  { { "fr22" }, "f22" },
1052  { { "fr23" }, "f23" },
1053  { { "fr24" }, "f24" },
1054  { { "fr25" }, "f25" },
1055  { { "fr26" }, "f26" },
1056  { { "fr27" }, "f27" },
1057  { { "fr28" }, "f28" },
1058  { { "fr29" }, "f29" },
1059  { { "fr30" }, "f30" },
1060  { { "fr31" }, "f31" },
1061  { { "cc" }, "cr0" },
1062};
1063
1064void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1065                                     unsigned &NumAliases) const {
1066  Aliases = GCCRegAliases;
1067  NumAliases = llvm::array_lengthof(GCCRegAliases);
1068}
1069} // end anonymous namespace.
1070
1071namespace {
1072class PPC32TargetInfo : public PPCTargetInfo {
1073public:
1074  PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
1075    DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1076                        "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
1077
1078    switch (getTriple().getOS()) {
1079    case llvm::Triple::Linux:
1080    case llvm::Triple::FreeBSD:
1081    case llvm::Triple::NetBSD:
1082      SizeType = UnsignedInt;
1083      PtrDiffType = SignedInt;
1084      IntPtrType = SignedInt;
1085      break;
1086    default:
1087      break;
1088    }
1089
1090    if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1091      LongDoubleWidth = LongDoubleAlign = 64;
1092      LongDoubleFormat = &llvm::APFloat::IEEEdouble;
1093    }
1094
1095    // PPC32 supports atomics up to 4 bytes.
1096    MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
1097  }
1098
1099  virtual BuiltinVaListKind getBuiltinVaListKind() const {
1100    // This is the ELF definition, and is overridden by the Darwin sub-target
1101    return TargetInfo::PowerABIBuiltinVaList;
1102  }
1103};
1104} // end anonymous namespace.
1105
1106namespace {
1107class PPC64TargetInfo : public PPCTargetInfo {
1108public:
1109  PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
1110    LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
1111    IntMaxType = SignedLong;
1112    UIntMaxType = UnsignedLong;
1113    Int64Type = SignedLong;
1114
1115    if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1116      LongDoubleWidth = LongDoubleAlign = 64;
1117      LongDoubleFormat = &llvm::APFloat::IEEEdouble;
1118      DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1119                          "i64:64:64-f32:32:32-f64:64:64-f128:64:64-"
1120                          "v128:128:128-n32:64";
1121    } else
1122      DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1123                          "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
1124                          "v128:128:128-n32:64";
1125
1126    // PPC64 supports atomics up to 8 bytes.
1127    MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
1128  }
1129  virtual BuiltinVaListKind getBuiltinVaListKind() const {
1130    return TargetInfo::CharPtrBuiltinVaList;
1131  }
1132};
1133} // end anonymous namespace.
1134
1135
1136namespace {
1137class DarwinPPC32TargetInfo :
1138  public DarwinTargetInfo<PPC32TargetInfo> {
1139public:
1140  DarwinPPC32TargetInfo(const std::string& triple)
1141    : DarwinTargetInfo<PPC32TargetInfo>(triple) {
1142    HasAlignMac68kSupport = true;
1143    BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
1144    LongLongAlign = 32;
1145    SuitableAlign = 128;
1146    DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1147                        "i64:32:64-f32:32:32-f64:64:64-v128:128:128-n32";
1148  }
1149  virtual BuiltinVaListKind getBuiltinVaListKind() const {
1150    return TargetInfo::CharPtrBuiltinVaList;
1151  }
1152};
1153
1154class DarwinPPC64TargetInfo :
1155  public DarwinTargetInfo<PPC64TargetInfo> {
1156public:
1157  DarwinPPC64TargetInfo(const std::string& triple)
1158    : DarwinTargetInfo<PPC64TargetInfo>(triple) {
1159    HasAlignMac68kSupport = true;
1160    SuitableAlign = 128;
1161    DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1162                        "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
1163  }
1164};
1165} // end anonymous namespace.
1166
1167namespace {
1168  static const unsigned NVPTXAddrSpaceMap[] = {
1169    1,    // opencl_global
1170    3,    // opencl_local
1171    4,    // opencl_constant
1172    1,    // cuda_device
1173    4,    // cuda_constant
1174    3,    // cuda_shared
1175  };
1176  class NVPTXTargetInfo : public TargetInfo {
1177    static const char * const GCCRegNames[];
1178    static const Builtin::Info BuiltinInfo[];
1179    std::vector<StringRef> AvailableFeatures;
1180  public:
1181    NVPTXTargetInfo(const std::string& triple) : TargetInfo(triple) {
1182      BigEndian = false;
1183      TLSSupported = false;
1184      LongWidth = LongAlign = 64;
1185      AddrSpaceMap = &NVPTXAddrSpaceMap;
1186      // Define available target features
1187      // These must be defined in sorted order!
1188      NoAsmVariants = true;
1189    }
1190    virtual void getTargetDefines(const LangOptions &Opts,
1191                                  MacroBuilder &Builder) const {
1192      Builder.defineMacro("__PTX__");
1193      Builder.defineMacro("__NVPTX__");
1194    }
1195    virtual void getTargetBuiltins(const Builtin::Info *&Records,
1196                                   unsigned &NumRecords) const {
1197      Records = BuiltinInfo;
1198      NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
1199    }
1200    virtual bool hasFeature(StringRef Feature) const {
1201      return Feature == "ptx" || Feature == "nvptx";
1202    }
1203
1204    virtual void getGCCRegNames(const char * const *&Names,
1205                                unsigned &NumNames) const;
1206    virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1207                                  unsigned &NumAliases) const {
1208      // No aliases.
1209      Aliases = 0;
1210      NumAliases = 0;
1211    }
1212    virtual bool validateAsmConstraint(const char *&Name,
1213                                       TargetInfo::ConstraintInfo &info) const {
1214      // FIXME: implement
1215      return true;
1216    }
1217    virtual const char *getClobbers() const {
1218      // FIXME: Is this really right?
1219      return "";
1220    }
1221    virtual BuiltinVaListKind getBuiltinVaListKind() const {
1222      // FIXME: implement
1223      return TargetInfo::CharPtrBuiltinVaList;
1224    }
1225    virtual bool setCPU(const std::string &Name) {
1226      return Name == "sm_10" || Name == "sm_13" || Name == "sm_20";
1227    }
1228    virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1229                                   StringRef Name,
1230                                   bool Enabled) const;
1231  };
1232
1233  const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1234#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1235#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1236                                              ALL_LANGUAGES },
1237#include "clang/Basic/BuiltinsNVPTX.def"
1238  };
1239
1240  const char * const NVPTXTargetInfo::GCCRegNames[] = {
1241    "r0"
1242  };
1243
1244  void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1245                                     unsigned &NumNames) const {
1246    Names = GCCRegNames;
1247    NumNames = llvm::array_lengthof(GCCRegNames);
1248  }
1249
1250  bool NVPTXTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1251                                          StringRef Name,
1252                                          bool Enabled) const {
1253    if(std::binary_search(AvailableFeatures.begin(), AvailableFeatures.end(),
1254                          Name)) {
1255      Features[Name] = Enabled;
1256      return true;
1257    } else {
1258      return false;
1259    }
1260  }
1261
1262  class NVPTX32TargetInfo : public NVPTXTargetInfo {
1263  public:
1264    NVPTX32TargetInfo(const std::string& triple) : NVPTXTargetInfo(triple) {
1265      PointerWidth = PointerAlign = 32;
1266      SizeType     = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
1267      DescriptionString
1268        = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
1269          "f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-"
1270          "n16:32:64";
1271  }
1272  };
1273
1274  class NVPTX64TargetInfo : public NVPTXTargetInfo {
1275  public:
1276    NVPTX64TargetInfo(const std::string& triple) : NVPTXTargetInfo(triple) {
1277      PointerWidth = PointerAlign = 64;
1278      SizeType     = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
1279      DescriptionString
1280        = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
1281          "f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-"
1282          "n16:32:64";
1283  }
1284  };
1285}
1286
1287namespace {
1288
1289static const unsigned R600AddrSpaceMap[] = {
1290  1,    // opencl_global
1291  3,    // opencl_local
1292  2,    // opencl_constant
1293  1,    // cuda_device
1294  2,    // cuda_constant
1295  3     // cuda_shared
1296};
1297
1298class R600TargetInfo : public TargetInfo {
1299public:
1300  R600TargetInfo(const std::string& triple) : TargetInfo(triple) {
1301    DescriptionString =
1302          "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16"
1303          "-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f80:32:32"
1304          "-v16:16:16-v24:32:32-v32:32:32-v48:64:64-v64:64:64"
1305          "-v96:128:128-v128:128:128-v192:256:256-v256:256:256"
1306          "-v512:512:512-v1024:1024:1024-v2048:2048:2048"
1307          "-n8:16:32:64";
1308    AddrSpaceMap = &R600AddrSpaceMap;
1309  }
1310
1311  virtual const char * getClobbers() const {
1312    return "";
1313  }
1314
1315  virtual void getGCCRegNames(const char * const *&Names,
1316                              unsigned &numNames) const  {
1317    Names = NULL;
1318    numNames = 0;
1319  }
1320
1321  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1322                                unsigned &NumAliases) const {
1323    Aliases = NULL;
1324    NumAliases = 0;
1325  }
1326
1327  virtual bool validateAsmConstraint(const char *&Name,
1328                                     TargetInfo::ConstraintInfo &info) const {
1329    return true;
1330  }
1331
1332  virtual void getTargetBuiltins(const Builtin::Info *&Records,
1333                                 unsigned &NumRecords) const {
1334    Records = NULL;
1335    NumRecords = 0;
1336  }
1337
1338
1339  virtual void getTargetDefines(const LangOptions &Opts,
1340                                MacroBuilder &Builder) const {
1341    Builder.defineMacro("__R600__");
1342  }
1343
1344  virtual BuiltinVaListKind getBuiltinVaListKind() const {
1345    return TargetInfo::CharPtrBuiltinVaList;
1346  }
1347
1348};
1349
1350} // end anonymous namespace
1351
1352namespace {
1353// MBlaze abstract base class
1354class MBlazeTargetInfo : public TargetInfo {
1355  static const char * const GCCRegNames[];
1356  static const TargetInfo::GCCRegAlias GCCRegAliases[];
1357
1358public:
1359  MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
1360    DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
1361  }
1362
1363  virtual void getTargetBuiltins(const Builtin::Info *&Records,
1364                                 unsigned &NumRecords) const {
1365    // FIXME: Implement.
1366    Records = 0;
1367    NumRecords = 0;
1368  }
1369
1370  virtual void getTargetDefines(const LangOptions &Opts,
1371                                MacroBuilder &Builder) const;
1372
1373  virtual bool hasFeature(StringRef Feature) const {
1374    return Feature == "mblaze";
1375  }
1376
1377  virtual BuiltinVaListKind getBuiltinVaListKind() const {
1378    return TargetInfo::CharPtrBuiltinVaList;
1379  }
1380  virtual const char *getTargetPrefix() const {
1381    return "mblaze";
1382  }
1383  virtual void getGCCRegNames(const char * const *&Names,
1384                              unsigned &NumNames) const;
1385  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1386                                unsigned &NumAliases) const;
1387  virtual bool validateAsmConstraint(const char *&Name,
1388                                     TargetInfo::ConstraintInfo &Info) const {
1389    switch (*Name) {
1390    default: return false;
1391    case 'O': // Zero
1392      return true;
1393    case 'b': // Base register
1394    case 'f': // Floating point register
1395      Info.setAllowsRegister();
1396      return true;
1397    }
1398  }
1399  virtual const char *getClobbers() const {
1400    return "";
1401  }
1402};
1403
1404/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
1405/// #defines that are not tied to a specific subtarget.
1406void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
1407                                     MacroBuilder &Builder) const {
1408  // Target identification.
1409  Builder.defineMacro("__microblaze__");
1410  Builder.defineMacro("_ARCH_MICROBLAZE");
1411  Builder.defineMacro("__MICROBLAZE__");
1412
1413  // Target properties.
1414  Builder.defineMacro("_BIG_ENDIAN");
1415  Builder.defineMacro("__BIG_ENDIAN__");
1416
1417  // Subtarget options.
1418  Builder.defineMacro("__REGISTER_PREFIX__", "");
1419}
1420
1421
1422const char * const MBlazeTargetInfo::GCCRegNames[] = {
1423  "r0",   "r1",   "r2",   "r3",   "r4",   "r5",   "r6",   "r7",
1424  "r8",   "r9",   "r10",  "r11",  "r12",  "r13",  "r14",  "r15",
1425  "r16",  "r17",  "r18",  "r19",  "r20",  "r21",  "r22",  "r23",
1426  "r24",  "r25",  "r26",  "r27",  "r28",  "r29",  "r30",  "r31",
1427  "$f0",  "$f1",  "$f2",  "$f3",  "$f4",  "$f5",  "$f6",  "$f7",
1428  "$f8",  "$f9",  "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
1429  "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
1430  "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
1431  "hi",   "lo",   "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
1432  "$fcc5","$fcc6","$fcc7","$ap",  "$rap", "$frp"
1433};
1434
1435void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
1436                                   unsigned &NumNames) const {
1437  Names = GCCRegNames;
1438  NumNames = llvm::array_lengthof(GCCRegNames);
1439}
1440
1441const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
1442  { {"f0"},  "r0" },
1443  { {"f1"},  "r1" },
1444  { {"f2"},  "r2" },
1445  { {"f3"},  "r3" },
1446  { {"f4"},  "r4" },
1447  { {"f5"},  "r5" },
1448  { {"f6"},  "r6" },
1449  { {"f7"},  "r7" },
1450  { {"f8"},  "r8" },
1451  { {"f9"},  "r9" },
1452  { {"f10"}, "r10" },
1453  { {"f11"}, "r11" },
1454  { {"f12"}, "r12" },
1455  { {"f13"}, "r13" },
1456  { {"f14"}, "r14" },
1457  { {"f15"}, "r15" },
1458  { {"f16"}, "r16" },
1459  { {"f17"}, "r17" },
1460  { {"f18"}, "r18" },
1461  { {"f19"}, "r19" },
1462  { {"f20"}, "r20" },
1463  { {"f21"}, "r21" },
1464  { {"f22"}, "r22" },
1465  { {"f23"}, "r23" },
1466  { {"f24"}, "r24" },
1467  { {"f25"}, "r25" },
1468  { {"f26"}, "r26" },
1469  { {"f27"}, "r27" },
1470  { {"f28"}, "r28" },
1471  { {"f29"}, "r29" },
1472  { {"f30"}, "r30" },
1473  { {"f31"}, "r31" },
1474};
1475
1476void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1477                                     unsigned &NumAliases) const {
1478  Aliases = GCCRegAliases;
1479  NumAliases = llvm::array_lengthof(GCCRegAliases);
1480}
1481} // end anonymous namespace.
1482
1483namespace {
1484// Namespace for x86 abstract base class
1485const Builtin::Info BuiltinInfo[] = {
1486#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1487#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1488                                              ALL_LANGUAGES },
1489#include "clang/Basic/BuiltinsX86.def"
1490};
1491
1492static const char* const GCCRegNames[] = {
1493  "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1494  "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
1495  "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
1496  "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1497  "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1498  "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1499  "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
1500  "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1501  "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
1502};
1503
1504const TargetInfo::AddlRegName AddlRegNames[] = {
1505  { { "al", "ah", "eax", "rax" }, 0 },
1506  { { "bl", "bh", "ebx", "rbx" }, 3 },
1507  { { "cl", "ch", "ecx", "rcx" }, 2 },
1508  { { "dl", "dh", "edx", "rdx" }, 1 },
1509  { { "esi", "rsi" }, 4 },
1510  { { "edi", "rdi" }, 5 },
1511  { { "esp", "rsp" }, 7 },
1512  { { "ebp", "rbp" }, 6 },
1513};
1514
1515// X86 target abstract base class; x86-32 and x86-64 are very close, so
1516// most of the implementation can be shared.
1517class X86TargetInfo : public TargetInfo {
1518  enum X86SSEEnum {
1519    NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2
1520  } SSELevel;
1521  enum MMX3DNowEnum {
1522    NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1523  } MMX3DNowLevel;
1524
1525  bool HasAES;
1526  bool HasPCLMUL;
1527  bool HasLZCNT;
1528  bool HasRDRND;
1529  bool HasBMI;
1530  bool HasBMI2;
1531  bool HasPOPCNT;
1532  bool HasRTM;
1533  bool HasSSE4a;
1534  bool HasFMA4;
1535  bool HasFMA;
1536  bool HasXOP;
1537  bool HasF16C;
1538
1539  /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1540  ///
1541  /// Each enumeration represents a particular CPU supported by Clang. These
1542  /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1543  enum CPUKind {
1544    CK_Generic,
1545
1546    /// \name i386
1547    /// i386-generation processors.
1548    //@{
1549    CK_i386,
1550    //@}
1551
1552    /// \name i486
1553    /// i486-generation processors.
1554    //@{
1555    CK_i486,
1556    CK_WinChipC6,
1557    CK_WinChip2,
1558    CK_C3,
1559    //@}
1560
1561    /// \name i586
1562    /// i586-generation processors, P5 microarchitecture based.
1563    //@{
1564    CK_i586,
1565    CK_Pentium,
1566    CK_PentiumMMX,
1567    //@}
1568
1569    /// \name i686
1570    /// i686-generation processors, P6 / Pentium M microarchitecture based.
1571    //@{
1572    CK_i686,
1573    CK_PentiumPro,
1574    CK_Pentium2,
1575    CK_Pentium3,
1576    CK_Pentium3M,
1577    CK_PentiumM,
1578    CK_C3_2,
1579
1580    /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1581    /// Clang however has some logic to suport this.
1582    // FIXME: Warn, deprecate, and potentially remove this.
1583    CK_Yonah,
1584    //@}
1585
1586    /// \name Netburst
1587    /// Netburst microarchitecture based processors.
1588    //@{
1589    CK_Pentium4,
1590    CK_Pentium4M,
1591    CK_Prescott,
1592    CK_Nocona,
1593    //@}
1594
1595    /// \name Core
1596    /// Core microarchitecture based processors.
1597    //@{
1598    CK_Core2,
1599
1600    /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1601    /// codename which GCC no longer accepts as an option to -march, but Clang
1602    /// has some logic for recognizing it.
1603    // FIXME: Warn, deprecate, and potentially remove this.
1604    CK_Penryn,
1605    //@}
1606
1607    /// \name Atom
1608    /// Atom processors
1609    //@{
1610    CK_Atom,
1611    //@}
1612
1613    /// \name Nehalem
1614    /// Nehalem microarchitecture based processors.
1615    //@{
1616    CK_Corei7,
1617    CK_Corei7AVX,
1618    CK_CoreAVXi,
1619    CK_CoreAVX2,
1620    //@}
1621
1622    /// \name K6
1623    /// K6 architecture processors.
1624    //@{
1625    CK_K6,
1626    CK_K6_2,
1627    CK_K6_3,
1628    //@}
1629
1630    /// \name K7
1631    /// K7 architecture processors.
1632    //@{
1633    CK_Athlon,
1634    CK_AthlonThunderbird,
1635    CK_Athlon4,
1636    CK_AthlonXP,
1637    CK_AthlonMP,
1638    //@}
1639
1640    /// \name K8
1641    /// K8 architecture processors.
1642    //@{
1643    CK_Athlon64,
1644    CK_Athlon64SSE3,
1645    CK_AthlonFX,
1646    CK_K8,
1647    CK_K8SSE3,
1648    CK_Opteron,
1649    CK_OpteronSSE3,
1650    CK_AMDFAM10,
1651    //@}
1652
1653    /// \name Bobcat
1654    /// Bobcat architecture processors.
1655    //@{
1656    CK_BTVER1,
1657    //@}
1658
1659    /// \name Bulldozer
1660    /// Bulldozer architecture processors.
1661    //@{
1662    CK_BDVER1,
1663    CK_BDVER2,
1664    //@}
1665
1666    /// This specification is deprecated and will be removed in the future.
1667    /// Users should prefer \see CK_K8.
1668    // FIXME: Warn on this when the CPU is set to it.
1669    CK_x86_64,
1670    //@}
1671
1672    /// \name Geode
1673    /// Geode processors.
1674    //@{
1675    CK_Geode
1676    //@}
1677  } CPU;
1678
1679public:
1680  X86TargetInfo(const std::string& triple)
1681    : TargetInfo(triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
1682      HasAES(false), HasPCLMUL(false), HasLZCNT(false), HasRDRND(false),
1683      HasBMI(false), HasBMI2(false), HasPOPCNT(false), HasRTM(false),
1684      HasSSE4a(false), HasFMA4(false), HasFMA(false), HasXOP(false),
1685      HasF16C(false), CPU(CK_Generic) {
1686    BigEndian = false;
1687    LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
1688  }
1689  virtual unsigned getFloatEvalMethod() const {
1690    // X87 evaluates with 80 bits "long double" precision.
1691    return SSELevel == NoSSE ? 2 : 0;
1692  }
1693  virtual void getTargetBuiltins(const Builtin::Info *&Records,
1694                                 unsigned &NumRecords) const {
1695    Records = BuiltinInfo;
1696    NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
1697  }
1698  virtual void getGCCRegNames(const char * const *&Names,
1699                              unsigned &NumNames) const {
1700    Names = GCCRegNames;
1701    NumNames = llvm::array_lengthof(GCCRegNames);
1702  }
1703  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1704                                unsigned &NumAliases) const {
1705    Aliases = 0;
1706    NumAliases = 0;
1707  }
1708  virtual void getGCCAddlRegNames(const AddlRegName *&Names,
1709                                  unsigned &NumNames) const {
1710    Names = AddlRegNames;
1711    NumNames = llvm::array_lengthof(AddlRegNames);
1712  }
1713  virtual bool validateAsmConstraint(const char *&Name,
1714                                     TargetInfo::ConstraintInfo &info) const;
1715  virtual std::string convertConstraint(const char *&Constraint) const;
1716  virtual const char *getClobbers() const {
1717    return "~{dirflag},~{fpsr},~{flags}";
1718  }
1719  virtual void getTargetDefines(const LangOptions &Opts,
1720                                MacroBuilder &Builder) const;
1721  virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1722                                 StringRef Name,
1723                                 bool Enabled) const;
1724  virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
1725  virtual bool hasFeature(StringRef Feature) const;
1726  virtual void HandleTargetFeatures(std::vector<std::string> &Features);
1727  virtual const char* getABI() const {
1728    if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
1729      return "avx";
1730    else if (getTriple().getArch() == llvm::Triple::x86 &&
1731             MMX3DNowLevel == NoMMX3DNow)
1732      return "no-mmx";
1733    return "";
1734  }
1735  virtual bool setCPU(const std::string &Name) {
1736    CPU = llvm::StringSwitch<CPUKind>(Name)
1737      .Case("i386", CK_i386)
1738      .Case("i486", CK_i486)
1739      .Case("winchip-c6", CK_WinChipC6)
1740      .Case("winchip2", CK_WinChip2)
1741      .Case("c3", CK_C3)
1742      .Case("i586", CK_i586)
1743      .Case("pentium", CK_Pentium)
1744      .Case("pentium-mmx", CK_PentiumMMX)
1745      .Case("i686", CK_i686)
1746      .Case("pentiumpro", CK_PentiumPro)
1747      .Case("pentium2", CK_Pentium2)
1748      .Case("pentium3", CK_Pentium3)
1749      .Case("pentium3m", CK_Pentium3M)
1750      .Case("pentium-m", CK_PentiumM)
1751      .Case("c3-2", CK_C3_2)
1752      .Case("yonah", CK_Yonah)
1753      .Case("pentium4", CK_Pentium4)
1754      .Case("pentium4m", CK_Pentium4M)
1755      .Case("prescott", CK_Prescott)
1756      .Case("nocona", CK_Nocona)
1757      .Case("core2", CK_Core2)
1758      .Case("penryn", CK_Penryn)
1759      .Case("atom", CK_Atom)
1760      .Case("corei7", CK_Corei7)
1761      .Case("corei7-avx", CK_Corei7AVX)
1762      .Case("core-avx-i", CK_CoreAVXi)
1763      .Case("core-avx2", CK_CoreAVX2)
1764      .Case("k6", CK_K6)
1765      .Case("k6-2", CK_K6_2)
1766      .Case("k6-3", CK_K6_3)
1767      .Case("athlon", CK_Athlon)
1768      .Case("athlon-tbird", CK_AthlonThunderbird)
1769      .Case("athlon-4", CK_Athlon4)
1770      .Case("athlon-xp", CK_AthlonXP)
1771      .Case("athlon-mp", CK_AthlonMP)
1772      .Case("athlon64", CK_Athlon64)
1773      .Case("athlon64-sse3", CK_Athlon64SSE3)
1774      .Case("athlon-fx", CK_AthlonFX)
1775      .Case("k8", CK_K8)
1776      .Case("k8-sse3", CK_K8SSE3)
1777      .Case("opteron", CK_Opteron)
1778      .Case("opteron-sse3", CK_OpteronSSE3)
1779      .Case("amdfam10", CK_AMDFAM10)
1780      .Case("btver1", CK_BTVER1)
1781      .Case("bdver1", CK_BDVER1)
1782      .Case("bdver2", CK_BDVER2)
1783      .Case("x86-64", CK_x86_64)
1784      .Case("geode", CK_Geode)
1785      .Default(CK_Generic);
1786
1787    // Perform any per-CPU checks necessary to determine if this CPU is
1788    // acceptable.
1789    // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1790    // invalid without explaining *why*.
1791    switch (CPU) {
1792    case CK_Generic:
1793      // No processor selected!
1794      return false;
1795
1796    case CK_i386:
1797    case CK_i486:
1798    case CK_WinChipC6:
1799    case CK_WinChip2:
1800    case CK_C3:
1801    case CK_i586:
1802    case CK_Pentium:
1803    case CK_PentiumMMX:
1804    case CK_i686:
1805    case CK_PentiumPro:
1806    case CK_Pentium2:
1807    case CK_Pentium3:
1808    case CK_Pentium3M:
1809    case CK_PentiumM:
1810    case CK_Yonah:
1811    case CK_C3_2:
1812    case CK_Pentium4:
1813    case CK_Pentium4M:
1814    case CK_Prescott:
1815    case CK_K6:
1816    case CK_K6_2:
1817    case CK_K6_3:
1818    case CK_Athlon:
1819    case CK_AthlonThunderbird:
1820    case CK_Athlon4:
1821    case CK_AthlonXP:
1822    case CK_AthlonMP:
1823    case CK_Geode:
1824      // Only accept certain architectures when compiling in 32-bit mode.
1825      if (getTriple().getArch() != llvm::Triple::x86)
1826        return false;
1827
1828      // Fallthrough
1829    case CK_Nocona:
1830    case CK_Core2:
1831    case CK_Penryn:
1832    case CK_Atom:
1833    case CK_Corei7:
1834    case CK_Corei7AVX:
1835    case CK_CoreAVXi:
1836    case CK_CoreAVX2:
1837    case CK_Athlon64:
1838    case CK_Athlon64SSE3:
1839    case CK_AthlonFX:
1840    case CK_K8:
1841    case CK_K8SSE3:
1842    case CK_Opteron:
1843    case CK_OpteronSSE3:
1844    case CK_AMDFAM10:
1845    case CK_BTVER1:
1846    case CK_BDVER1:
1847    case CK_BDVER2:
1848    case CK_x86_64:
1849      return true;
1850    }
1851    llvm_unreachable("Unhandled CPU kind");
1852  }
1853
1854  virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
1855    // We accept all non-ARM calling conventions
1856    return (CC == CC_X86ThisCall ||
1857            CC == CC_X86FastCall ||
1858            CC == CC_X86StdCall ||
1859            CC == CC_C ||
1860            CC == CC_X86Pascal ||
1861            CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
1862  }
1863
1864  virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const {
1865    return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
1866  }
1867};
1868
1869void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1870  // FIXME: This should not be here.
1871  Features["3dnow"] = false;
1872  Features["3dnowa"] = false;
1873  Features["mmx"] = false;
1874  Features["sse"] = false;
1875  Features["sse2"] = false;
1876  Features["sse3"] = false;
1877  Features["ssse3"] = false;
1878  Features["sse41"] = false;
1879  Features["sse42"] = false;
1880  Features["sse4a"] = false;
1881  Features["aes"] = false;
1882  Features["pclmul"] = false;
1883  Features["avx"] = false;
1884  Features["avx2"] = false;
1885  Features["lzcnt"] = false;
1886  Features["rdrand"] = false;
1887  Features["bmi"] = false;
1888  Features["bmi2"] = false;
1889  Features["popcnt"] = false;
1890  Features["rtm"] = false;
1891  Features["fma4"] = false;
1892  Features["fma"] = false;
1893  Features["xop"] = false;
1894  Features["f16c"] = false;
1895
1896  // FIXME: This *really* should not be here.
1897
1898  // X86_64 always has SSE2.
1899  if (getTriple().getArch() == llvm::Triple::x86_64)
1900    setFeatureEnabled(Features, "sse2", true);
1901
1902  switch (CPU) {
1903  case CK_Generic:
1904  case CK_i386:
1905  case CK_i486:
1906  case CK_i586:
1907  case CK_Pentium:
1908  case CK_i686:
1909  case CK_PentiumPro:
1910    break;
1911  case CK_PentiumMMX:
1912  case CK_Pentium2:
1913    setFeatureEnabled(Features, "mmx", true);
1914    break;
1915  case CK_Pentium3:
1916  case CK_Pentium3M:
1917    setFeatureEnabled(Features, "sse", true);
1918    break;
1919  case CK_PentiumM:
1920  case CK_Pentium4:
1921  case CK_Pentium4M:
1922  case CK_x86_64:
1923    setFeatureEnabled(Features, "sse2", true);
1924    break;
1925  case CK_Yonah:
1926  case CK_Prescott:
1927  case CK_Nocona:
1928    setFeatureEnabled(Features, "sse3", true);
1929    break;
1930  case CK_Core2:
1931    setFeatureEnabled(Features, "ssse3", true);
1932    break;
1933  case CK_Penryn:
1934    setFeatureEnabled(Features, "sse4.1", true);
1935    break;
1936  case CK_Atom:
1937    setFeatureEnabled(Features, "ssse3", true);
1938    break;
1939  case CK_Corei7:
1940    setFeatureEnabled(Features, "sse4", true);
1941    break;
1942  case CK_Corei7AVX:
1943    setFeatureEnabled(Features, "avx", true);
1944    setFeatureEnabled(Features, "aes", true);
1945    setFeatureEnabled(Features, "pclmul", true);
1946    break;
1947  case CK_CoreAVXi:
1948    setFeatureEnabled(Features, "avx", true);
1949    setFeatureEnabled(Features, "aes", true);
1950    setFeatureEnabled(Features, "pclmul", true);
1951    setFeatureEnabled(Features, "rdrnd", true);
1952    setFeatureEnabled(Features, "f16c", true);
1953    break;
1954  case CK_CoreAVX2:
1955    setFeatureEnabled(Features, "avx2", true);
1956    setFeatureEnabled(Features, "aes", true);
1957    setFeatureEnabled(Features, "pclmul", true);
1958    setFeatureEnabled(Features, "lzcnt", true);
1959    setFeatureEnabled(Features, "rdrnd", true);
1960    setFeatureEnabled(Features, "f16c", true);
1961    setFeatureEnabled(Features, "bmi", true);
1962    setFeatureEnabled(Features, "bmi2", true);
1963    setFeatureEnabled(Features, "rtm", true);
1964    setFeatureEnabled(Features, "fma", true);
1965    break;
1966  case CK_K6:
1967  case CK_WinChipC6:
1968    setFeatureEnabled(Features, "mmx", true);
1969    break;
1970  case CK_K6_2:
1971  case CK_K6_3:
1972  case CK_WinChip2:
1973  case CK_C3:
1974    setFeatureEnabled(Features, "3dnow", true);
1975    break;
1976  case CK_Athlon:
1977  case CK_AthlonThunderbird:
1978  case CK_Geode:
1979    setFeatureEnabled(Features, "3dnowa", true);
1980    break;
1981  case CK_Athlon4:
1982  case CK_AthlonXP:
1983  case CK_AthlonMP:
1984    setFeatureEnabled(Features, "sse", true);
1985    setFeatureEnabled(Features, "3dnowa", true);
1986    break;
1987  case CK_K8:
1988  case CK_Opteron:
1989  case CK_Athlon64:
1990  case CK_AthlonFX:
1991    setFeatureEnabled(Features, "sse2", true);
1992    setFeatureEnabled(Features, "3dnowa", true);
1993    break;
1994  case CK_K8SSE3:
1995  case CK_OpteronSSE3:
1996  case CK_Athlon64SSE3:
1997    setFeatureEnabled(Features, "sse3", true);
1998    setFeatureEnabled(Features, "3dnowa", true);
1999    break;
2000  case CK_AMDFAM10:
2001    setFeatureEnabled(Features, "sse3", true);
2002    setFeatureEnabled(Features, "sse4a", true);
2003    setFeatureEnabled(Features, "3dnowa", true);
2004    setFeatureEnabled(Features, "lzcnt", true);
2005    setFeatureEnabled(Features, "popcnt", true);
2006    break;
2007  case CK_BTVER1:
2008    setFeatureEnabled(Features, "ssse3", true);
2009    setFeatureEnabled(Features, "sse4a", true);
2010    setFeatureEnabled(Features, "lzcnt", true);
2011    setFeatureEnabled(Features, "popcnt", true);
2012    break;
2013  case CK_BDVER1:
2014    setFeatureEnabled(Features, "xop", true);
2015    setFeatureEnabled(Features, "lzcnt", true);
2016    setFeatureEnabled(Features, "aes", true);
2017    setFeatureEnabled(Features, "pclmul", true);
2018    break;
2019  case CK_BDVER2:
2020    setFeatureEnabled(Features, "xop", true);
2021    setFeatureEnabled(Features, "lzcnt", true);
2022    setFeatureEnabled(Features, "aes", true);
2023    setFeatureEnabled(Features, "pclmul", true);
2024    setFeatureEnabled(Features, "bmi", true);
2025    setFeatureEnabled(Features, "fma", true);
2026    setFeatureEnabled(Features, "f16c", true);
2027    break;
2028  case CK_C3_2:
2029    setFeatureEnabled(Features, "sse", true);
2030    break;
2031  }
2032}
2033
2034bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
2035                                      StringRef Name,
2036                                      bool Enabled) const {
2037  // FIXME: This *really* should not be here.  We need some way of translating
2038  // options into llvm subtarget features.
2039  if (!Features.count(Name) &&
2040      (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1" &&
2041       Name != "rdrnd"))
2042    return false;
2043
2044  // FIXME: this should probably use a switch with fall through.
2045
2046  if (Enabled) {
2047    if (Name == "mmx")
2048      Features["mmx"] = true;
2049    else if (Name == "sse")
2050      Features["mmx"] = Features["sse"] = true;
2051    else if (Name == "sse2")
2052      Features["mmx"] = Features["sse"] = Features["sse2"] = true;
2053    else if (Name == "sse3")
2054      Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
2055        true;
2056    else if (Name == "ssse3")
2057      Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
2058        Features["ssse3"] = true;
2059    else if (Name == "sse4" || Name == "sse4.2")
2060      Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
2061        Features["ssse3"] = Features["sse41"] = Features["sse42"] =
2062        Features["popcnt"] = true;
2063    else if (Name == "sse4.1")
2064      Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
2065        Features["ssse3"] = Features["sse41"] = true;
2066    else if (Name == "3dnow")
2067      Features["mmx"] = Features["3dnow"] = true;
2068    else if (Name == "3dnowa")
2069      Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = true;
2070    else if (Name == "aes")
2071      Features["sse"] = Features["sse2"] = Features["aes"] = true;
2072    else if (Name == "pclmul")
2073      Features["sse"] = Features["sse2"] = Features["pclmul"] = true;
2074    else if (Name == "avx")
2075      Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
2076        Features["ssse3"] = Features["sse41"] = Features["sse42"] =
2077        Features["popcnt"] = Features["avx"] = true;
2078    else if (Name == "avx2")
2079      Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
2080        Features["ssse3"] = Features["sse41"] = Features["sse42"] =
2081        Features["popcnt"] = Features["avx"] = Features["avx2"] = true;
2082    else if (Name == "fma")
2083      Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
2084        Features["ssse3"] = Features["sse41"] = Features["sse42"] =
2085        Features["popcnt"] = Features["avx"] = Features["fma"] = true;
2086    else if (Name == "fma4")
2087      Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
2088        Features["ssse3"] = Features["sse41"] = Features["sse42"] =
2089        Features["popcnt"] = Features["avx"] = Features["sse4a"] =
2090        Features["fma4"] = true;
2091    else if (Name == "xop")
2092      Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
2093        Features["ssse3"] = Features["sse41"] = Features["sse42"] =
2094        Features["popcnt"] = Features["avx"] = Features["sse4a"] =
2095        Features["fma4"] = Features["xop"] = true;
2096    else if (Name == "sse4a")
2097      Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
2098        Features["sse4a"] = true;
2099    else if (Name == "lzcnt")
2100      Features["lzcnt"] = true;
2101    else if (Name == "rdrnd")
2102      Features["rdrand"] = true;
2103    else if (Name == "bmi")
2104      Features["bmi"] = true;
2105    else if (Name == "bmi2")
2106      Features["bmi2"] = true;
2107    else if (Name == "popcnt")
2108      Features["popcnt"] = true;
2109    else if (Name == "f16c")
2110      Features["f16c"] = true;
2111    else if (Name == "rtm")
2112      Features["rtm"] = true;
2113  } else {
2114    if (Name == "mmx")
2115      Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = false;
2116    else if (Name == "sse")
2117      Features["sse"] = Features["sse2"] = Features["sse3"] =
2118        Features["ssse3"] = Features["sse41"] = Features["sse42"] =
2119        Features["sse4a"] = Features["avx"] = Features["avx2"] =
2120        Features["fma"] = Features["fma4"] = Features["aes"] =
2121        Features["pclmul"] = Features["xop"] = false;
2122    else if (Name == "sse2")
2123      Features["sse2"] = Features["sse3"] = Features["ssse3"] =
2124        Features["sse41"] = Features["sse42"] = Features["sse4a"] =
2125        Features["avx"] = Features["avx2"] = Features["fma"] =
2126        Features["fma4"] = Features["aes"] = Features["pclmul"] =
2127        Features["xop"] = false;
2128    else if (Name == "sse3")
2129      Features["sse3"] = Features["ssse3"] = Features["sse41"] =
2130        Features["sse42"] = Features["sse4a"] = Features["avx"] =
2131        Features["avx2"] = Features["fma"] = Features["fma4"] =
2132        Features["xop"] = false;
2133    else if (Name == "ssse3")
2134      Features["ssse3"] = Features["sse41"] = Features["sse42"] =
2135        Features["avx"] = Features["avx2"] = Features["fma"] = false;
2136    else if (Name == "sse4" || Name == "sse4.1")
2137      Features["sse41"] = Features["sse42"] = Features["avx"] =
2138        Features["avx2"] = Features["fma"] = false;
2139    else if (Name == "sse4.2")
2140      Features["sse42"] = Features["avx"] = Features["avx2"] =
2141        Features["fma"] = false;
2142    else if (Name == "3dnow")
2143      Features["3dnow"] = Features["3dnowa"] = false;
2144    else if (Name == "3dnowa")
2145      Features["3dnowa"] = false;
2146    else if (Name == "aes")
2147      Features["aes"] = false;
2148    else if (Name == "pclmul")
2149      Features["pclmul"] = false;
2150    else if (Name == "avx")
2151      Features["avx"] = Features["avx2"] = Features["fma"] =
2152        Features["fma4"] = Features["xop"] = false;
2153    else if (Name == "avx2")
2154      Features["avx2"] = false;
2155    else if (Name == "fma")
2156      Features["fma"] = false;
2157    else if (Name == "sse4a")
2158      Features["sse4a"] = Features["fma4"] = Features["xop"] = false;
2159    else if (Name == "lzcnt")
2160      Features["lzcnt"] = false;
2161    else if (Name == "rdrnd")
2162      Features["rdrand"] = false;
2163    else if (Name == "bmi")
2164      Features["bmi"] = false;
2165    else if (Name == "bmi2")
2166      Features["bmi2"] = false;
2167    else if (Name == "popcnt")
2168      Features["popcnt"] = false;
2169    else if (Name == "fma4")
2170      Features["fma4"] = Features["xop"] = false;
2171    else if (Name == "xop")
2172      Features["xop"] = false;
2173    else if (Name == "f16c")
2174      Features["f16c"] = false;
2175    else if (Name == "rtm")
2176      Features["rtm"] = false;
2177  }
2178
2179  return true;
2180}
2181
2182/// HandleTargetOptions - Perform initialization based on the user
2183/// configured set of features.
2184void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
2185  // Remember the maximum enabled sselevel.
2186  for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2187    // Ignore disabled features.
2188    if (Features[i][0] == '-')
2189      continue;
2190
2191    StringRef Feature = StringRef(Features[i]).substr(1);
2192
2193    if (Feature == "aes") {
2194      HasAES = true;
2195      continue;
2196    }
2197
2198    if (Feature == "pclmul") {
2199      HasPCLMUL = true;
2200      continue;
2201    }
2202
2203    if (Feature == "lzcnt") {
2204      HasLZCNT = true;
2205      continue;
2206    }
2207
2208    if (Feature == "rdrand") {
2209      HasRDRND = true;
2210      continue;
2211    }
2212
2213    if (Feature == "bmi") {
2214      HasBMI = true;
2215      continue;
2216    }
2217
2218    if (Feature == "bmi2") {
2219      HasBMI2 = true;
2220      continue;
2221    }
2222
2223    if (Feature == "popcnt") {
2224      HasPOPCNT = true;
2225      continue;
2226    }
2227
2228    if (Feature == "rtm") {
2229      HasRTM = true;
2230      continue;
2231    }
2232
2233    if (Feature == "sse4a") {
2234      HasSSE4a = true;
2235      continue;
2236    }
2237
2238    if (Feature == "fma4") {
2239      HasFMA4 = true;
2240      continue;
2241    }
2242
2243    if (Feature == "fma") {
2244      HasFMA = true;
2245      continue;
2246    }
2247
2248    if (Feature == "xop") {
2249      HasXOP = true;
2250      continue;
2251    }
2252
2253    if (Feature == "f16c") {
2254      HasF16C = true;
2255      continue;
2256    }
2257
2258    assert(Features[i][0] == '+' && "Invalid target feature!");
2259    X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
2260      .Case("avx2", AVX2)
2261      .Case("avx", AVX)
2262      .Case("sse42", SSE42)
2263      .Case("sse41", SSE41)
2264      .Case("ssse3", SSSE3)
2265      .Case("sse3", SSE3)
2266      .Case("sse2", SSE2)
2267      .Case("sse", SSE1)
2268      .Default(NoSSE);
2269    SSELevel = std::max(SSELevel, Level);
2270
2271    MMX3DNowEnum ThreeDNowLevel =
2272      llvm::StringSwitch<MMX3DNowEnum>(Feature)
2273        .Case("3dnowa", AMD3DNowAthlon)
2274        .Case("3dnow", AMD3DNow)
2275        .Case("mmx", MMX)
2276        .Default(NoMMX3DNow);
2277
2278    MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
2279  }
2280
2281  // Don't tell the backend if we're turning off mmx; it will end up disabling
2282  // SSE, which we don't want.
2283  std::vector<std::string>::iterator it;
2284  it = std::find(Features.begin(), Features.end(), "-mmx");
2285  if (it != Features.end())
2286    Features.erase(it);
2287}
2288
2289/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2290/// definitions for this particular subtarget.
2291void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
2292                                     MacroBuilder &Builder) const {
2293  // Target identification.
2294  if (getTriple().getArch() == llvm::Triple::x86_64) {
2295    Builder.defineMacro("__amd64__");
2296    Builder.defineMacro("__amd64");
2297    Builder.defineMacro("__x86_64");
2298    Builder.defineMacro("__x86_64__");
2299  } else {
2300    DefineStd(Builder, "i386", Opts);
2301  }
2302
2303  // Subtarget options.
2304  // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2305  // truly should be based on -mtune options.
2306  switch (CPU) {
2307  case CK_Generic:
2308    break;
2309  case CK_i386:
2310    // The rest are coming from the i386 define above.
2311    Builder.defineMacro("__tune_i386__");
2312    break;
2313  case CK_i486:
2314  case CK_WinChipC6:
2315  case CK_WinChip2:
2316  case CK_C3:
2317    defineCPUMacros(Builder, "i486");
2318    break;
2319  case CK_PentiumMMX:
2320    Builder.defineMacro("__pentium_mmx__");
2321    Builder.defineMacro("__tune_pentium_mmx__");
2322    // Fallthrough
2323  case CK_i586:
2324  case CK_Pentium:
2325    defineCPUMacros(Builder, "i586");
2326    defineCPUMacros(Builder, "pentium");
2327    break;
2328  case CK_Pentium3:
2329  case CK_Pentium3M:
2330  case CK_PentiumM:
2331    Builder.defineMacro("__tune_pentium3__");
2332    // Fallthrough
2333  case CK_Pentium2:
2334  case CK_C3_2:
2335    Builder.defineMacro("__tune_pentium2__");
2336    // Fallthrough
2337  case CK_PentiumPro:
2338    Builder.defineMacro("__tune_i686__");
2339    Builder.defineMacro("__tune_pentiumpro__");
2340    // Fallthrough
2341  case CK_i686:
2342    Builder.defineMacro("__i686");
2343    Builder.defineMacro("__i686__");
2344    // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2345    Builder.defineMacro("__pentiumpro");
2346    Builder.defineMacro("__pentiumpro__");
2347    break;
2348  case CK_Pentium4:
2349  case CK_Pentium4M:
2350    defineCPUMacros(Builder, "pentium4");
2351    break;
2352  case CK_Yonah:
2353  case CK_Prescott:
2354  case CK_Nocona:
2355    defineCPUMacros(Builder, "nocona");
2356    break;
2357  case CK_Core2:
2358  case CK_Penryn:
2359    defineCPUMacros(Builder, "core2");
2360    break;
2361  case CK_Atom:
2362    defineCPUMacros(Builder, "atom");
2363    break;
2364  case CK_Corei7:
2365  case CK_Corei7AVX:
2366  case CK_CoreAVXi:
2367  case CK_CoreAVX2:
2368    defineCPUMacros(Builder, "corei7");
2369    break;
2370  case CK_K6_2:
2371    Builder.defineMacro("__k6_2__");
2372    Builder.defineMacro("__tune_k6_2__");
2373    // Fallthrough
2374  case CK_K6_3:
2375    if (CPU != CK_K6_2) {  // In case of fallthrough
2376      // FIXME: GCC may be enabling these in cases where some other k6
2377      // architecture is specified but -m3dnow is explicitly provided. The
2378      // exact semantics need to be determined and emulated here.
2379      Builder.defineMacro("__k6_3__");
2380      Builder.defineMacro("__tune_k6_3__");
2381    }
2382    // Fallthrough
2383  case CK_K6:
2384    defineCPUMacros(Builder, "k6");
2385    break;
2386  case CK_Athlon:
2387  case CK_AthlonThunderbird:
2388  case CK_Athlon4:
2389  case CK_AthlonXP:
2390  case CK_AthlonMP:
2391    defineCPUMacros(Builder, "athlon");
2392    if (SSELevel != NoSSE) {
2393      Builder.defineMacro("__athlon_sse__");
2394      Builder.defineMacro("__tune_athlon_sse__");
2395    }
2396    break;
2397  case CK_K8:
2398  case CK_K8SSE3:
2399  case CK_x86_64:
2400  case CK_Opteron:
2401  case CK_OpteronSSE3:
2402  case CK_Athlon64:
2403  case CK_Athlon64SSE3:
2404  case CK_AthlonFX:
2405    defineCPUMacros(Builder, "k8");
2406    break;
2407  case CK_AMDFAM10:
2408    defineCPUMacros(Builder, "amdfam10");
2409    break;
2410  case CK_BTVER1:
2411    defineCPUMacros(Builder, "btver1");
2412    break;
2413  case CK_BDVER1:
2414    defineCPUMacros(Builder, "bdver1");
2415    break;
2416  case CK_BDVER2:
2417    defineCPUMacros(Builder, "bdver2");
2418    break;
2419  case CK_Geode:
2420    defineCPUMacros(Builder, "geode");
2421    break;
2422  }
2423
2424  // Target properties.
2425  Builder.defineMacro("__LITTLE_ENDIAN__");
2426  Builder.defineMacro("__REGISTER_PREFIX__", "");
2427
2428  // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2429  // functions in glibc header files that use FP Stack inline asm which the
2430  // backend can't deal with (PR879).
2431  Builder.defineMacro("__NO_MATH_INLINES");
2432
2433  if (HasAES)
2434    Builder.defineMacro("__AES__");
2435
2436  if (HasPCLMUL)
2437    Builder.defineMacro("__PCLMUL__");
2438
2439  if (HasLZCNT)
2440    Builder.defineMacro("__LZCNT__");
2441
2442  if (HasRDRND)
2443    Builder.defineMacro("__RDRND__");
2444
2445  if (HasBMI)
2446    Builder.defineMacro("__BMI__");
2447
2448  if (HasBMI2)
2449    Builder.defineMacro("__BMI2__");
2450
2451  if (HasPOPCNT)
2452    Builder.defineMacro("__POPCNT__");
2453
2454  if (HasRTM)
2455    Builder.defineMacro("__RTM__");
2456
2457  if (HasSSE4a)
2458    Builder.defineMacro("__SSE4A__");
2459
2460  if (HasFMA4)
2461    Builder.defineMacro("__FMA4__");
2462
2463  if (HasFMA)
2464    Builder.defineMacro("__FMA__");
2465
2466  if (HasXOP)
2467    Builder.defineMacro("__XOP__");
2468
2469  if (HasF16C)
2470    Builder.defineMacro("__F16C__");
2471
2472  // Each case falls through to the previous one here.
2473  switch (SSELevel) {
2474  case AVX2:
2475    Builder.defineMacro("__AVX2__");
2476  case AVX:
2477    Builder.defineMacro("__AVX__");
2478  case SSE42:
2479    Builder.defineMacro("__SSE4_2__");
2480  case SSE41:
2481    Builder.defineMacro("__SSE4_1__");
2482  case SSSE3:
2483    Builder.defineMacro("__SSSE3__");
2484  case SSE3:
2485    Builder.defineMacro("__SSE3__");
2486  case SSE2:
2487    Builder.defineMacro("__SSE2__");
2488    Builder.defineMacro("__SSE2_MATH__");  // -mfp-math=sse always implied.
2489  case SSE1:
2490    Builder.defineMacro("__SSE__");
2491    Builder.defineMacro("__SSE_MATH__");   // -mfp-math=sse always implied.
2492  case NoSSE:
2493    break;
2494  }
2495
2496  if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
2497    switch (SSELevel) {
2498    case AVX2:
2499    case AVX:
2500    case SSE42:
2501    case SSE41:
2502    case SSSE3:
2503    case SSE3:
2504    case SSE2:
2505      Builder.defineMacro("_M_IX86_FP", Twine(2));
2506      break;
2507    case SSE1:
2508      Builder.defineMacro("_M_IX86_FP", Twine(1));
2509      break;
2510    default:
2511      Builder.defineMacro("_M_IX86_FP", Twine(0));
2512    }
2513  }
2514
2515  // Each case falls through to the previous one here.
2516  switch (MMX3DNowLevel) {
2517  case AMD3DNowAthlon:
2518    Builder.defineMacro("__3dNOW_A__");
2519  case AMD3DNow:
2520    Builder.defineMacro("__3dNOW__");
2521  case MMX:
2522    Builder.defineMacro("__MMX__");
2523  case NoMMX3DNow:
2524    break;
2525  }
2526}
2527
2528bool X86TargetInfo::hasFeature(StringRef Feature) const {
2529  return llvm::StringSwitch<bool>(Feature)
2530      .Case("aes", HasAES)
2531      .Case("avx", SSELevel >= AVX)
2532      .Case("avx2", SSELevel >= AVX2)
2533      .Case("bmi", HasBMI)
2534      .Case("bmi2", HasBMI2)
2535      .Case("fma", HasFMA)
2536      .Case("fma4", HasFMA4)
2537      .Case("lzcnt", HasLZCNT)
2538      .Case("rdrnd", HasRDRND)
2539      .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2540      .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2541      .Case("mmx", MMX3DNowLevel >= MMX)
2542      .Case("pclmul", HasPCLMUL)
2543      .Case("popcnt", HasPOPCNT)
2544      .Case("rtm", HasRTM)
2545      .Case("sse", SSELevel >= SSE1)
2546      .Case("sse2", SSELevel >= SSE2)
2547      .Case("sse3", SSELevel >= SSE3)
2548      .Case("ssse3", SSELevel >= SSSE3)
2549      .Case("sse41", SSELevel >= SSE41)
2550      .Case("sse42", SSELevel >= SSE42)
2551      .Case("sse4a", HasSSE4a)
2552      .Case("x86", true)
2553      .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
2554      .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
2555      .Case("xop", HasXOP)
2556      .Case("f16c", HasF16C)
2557      .Default(false);
2558}
2559
2560bool
2561X86TargetInfo::validateAsmConstraint(const char *&Name,
2562                                     TargetInfo::ConstraintInfo &Info) const {
2563  switch (*Name) {
2564  default: return false;
2565  case 'Y': // first letter of a pair:
2566    switch (*(Name+1)) {
2567    default: return false;
2568    case '0':  // First SSE register.
2569    case 't':  // Any SSE register, when SSE2 is enabled.
2570    case 'i':  // Any SSE register, when SSE2 and inter-unit moves enabled.
2571    case 'm':  // any MMX register, when inter-unit moves enabled.
2572      break;   // falls through to setAllowsRegister.
2573  }
2574  case 'a': // eax.
2575  case 'b': // ebx.
2576  case 'c': // ecx.
2577  case 'd': // edx.
2578  case 'S': // esi.
2579  case 'D': // edi.
2580  case 'A': // edx:eax.
2581  case 'f': // any x87 floating point stack register.
2582  case 't': // top of floating point stack.
2583  case 'u': // second from top of floating point stack.
2584  case 'q': // Any register accessible as [r]l: a, b, c, and d.
2585  case 'y': // Any MMX register.
2586  case 'x': // Any SSE register.
2587  case 'Q': // Any register accessible as [r]h: a, b, c, and d.
2588  case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2589  case 'l': // "Index" registers: any general register that can be used as an
2590            // index in a base+index memory access.
2591    Info.setAllowsRegister();
2592    return true;
2593  case 'C': // SSE floating point constant.
2594  case 'G': // x87 floating point constant.
2595  case 'e': // 32-bit signed integer constant for use with zero-extending
2596            // x86_64 instructions.
2597  case 'Z': // 32-bit unsigned integer constant for use with zero-extending
2598            // x86_64 instructions.
2599    return true;
2600  }
2601}
2602
2603
2604std::string
2605X86TargetInfo::convertConstraint(const char *&Constraint) const {
2606  switch (*Constraint) {
2607  case 'a': return std::string("{ax}");
2608  case 'b': return std::string("{bx}");
2609  case 'c': return std::string("{cx}");
2610  case 'd': return std::string("{dx}");
2611  case 'S': return std::string("{si}");
2612  case 'D': return std::string("{di}");
2613  case 'p': // address
2614    return std::string("im");
2615  case 't': // top of floating point stack.
2616    return std::string("{st}");
2617  case 'u': // second from top of floating point stack.
2618    return std::string("{st(1)}"); // second from top of floating point stack.
2619  default:
2620    return std::string(1, *Constraint);
2621  }
2622}
2623} // end anonymous namespace
2624
2625namespace {
2626// X86-32 generic target
2627class X86_32TargetInfo : public X86TargetInfo {
2628public:
2629  X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
2630    DoubleAlign = LongLongAlign = 32;
2631    LongDoubleWidth = 96;
2632    LongDoubleAlign = 32;
2633    SuitableAlign = 128;
2634    DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2635                        "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
2636                        "a0:0:64-f80:32:32-n8:16:32-S128";
2637    SizeType = UnsignedInt;
2638    PtrDiffType = SignedInt;
2639    IntPtrType = SignedInt;
2640    RegParmMax = 3;
2641
2642    // Use fpret for all types.
2643    RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2644                             (1 << TargetInfo::Double) |
2645                             (1 << TargetInfo::LongDouble));
2646
2647    // x86-32 has atomics up to 8 bytes
2648    // FIXME: Check that we actually have cmpxchg8b before setting
2649    // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
2650    MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
2651  }
2652  virtual BuiltinVaListKind getBuiltinVaListKind() const {
2653    return TargetInfo::CharPtrBuiltinVaList;
2654  }
2655
2656  int getEHDataRegisterNumber(unsigned RegNo) const {
2657    if (RegNo == 0) return 0;
2658    if (RegNo == 1) return 2;
2659    return -1;
2660  }
2661  virtual bool validateInputSize(StringRef Constraint,
2662                                 unsigned Size) const {
2663    switch (Constraint[0]) {
2664    default: break;
2665    case 'a':
2666    case 'b':
2667    case 'c':
2668    case 'd':
2669      return Size <= 32;
2670    }
2671
2672    return true;
2673  }
2674};
2675} // end anonymous namespace
2676
2677namespace {
2678class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
2679public:
2680  NetBSDI386TargetInfo(const std::string &triple) :
2681    NetBSDTargetInfo<X86_32TargetInfo>(triple) {
2682  }
2683
2684  virtual unsigned getFloatEvalMethod() const {
2685    // NetBSD defaults to "double" rounding
2686    return 1;
2687  }
2688};
2689} // end anonymous namespace
2690
2691namespace {
2692class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
2693public:
2694  OpenBSDI386TargetInfo(const std::string& triple) :
2695    OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
2696    SizeType = UnsignedLong;
2697    IntPtrType = SignedLong;
2698    PtrDiffType = SignedLong;
2699  }
2700};
2701} // end anonymous namespace
2702
2703namespace {
2704class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
2705public:
2706  BitrigI386TargetInfo(const std::string& triple) :
2707    BitrigTargetInfo<X86_32TargetInfo>(triple) {
2708    SizeType = UnsignedLong;
2709    IntPtrType = SignedLong;
2710    PtrDiffType = SignedLong;
2711  }
2712};
2713} // end anonymous namespace
2714
2715namespace {
2716class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
2717public:
2718  DarwinI386TargetInfo(const std::string& triple) :
2719    DarwinTargetInfo<X86_32TargetInfo>(triple) {
2720    LongDoubleWidth = 128;
2721    LongDoubleAlign = 128;
2722    SuitableAlign = 128;
2723    MaxVectorAlign = 256;
2724    SizeType = UnsignedLong;
2725    IntPtrType = SignedLong;
2726    DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2727                        "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
2728                        "a0:0:64-f80:128:128-n8:16:32-S128";
2729    HasAlignMac68kSupport = true;
2730  }
2731
2732};
2733} // end anonymous namespace
2734
2735namespace {
2736// x86-32 Windows target
2737class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
2738public:
2739  WindowsX86_32TargetInfo(const std::string& triple)
2740    : WindowsTargetInfo<X86_32TargetInfo>(triple) {
2741    TLSSupported = false;
2742    WCharType = UnsignedShort;
2743    DoubleAlign = LongLongAlign = 64;
2744    DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2745                        "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
2746                        "v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32";
2747  }
2748  virtual void getTargetDefines(const LangOptions &Opts,
2749                                MacroBuilder &Builder) const {
2750    WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
2751  }
2752};
2753} // end anonymous namespace
2754
2755namespace {
2756
2757// x86-32 Windows Visual Studio target
2758class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
2759public:
2760  VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
2761    : WindowsX86_32TargetInfo(triple) {
2762    LongDoubleWidth = LongDoubleAlign = 64;
2763    LongDoubleFormat = &llvm::APFloat::IEEEdouble;
2764  }
2765  virtual void getTargetDefines(const LangOptions &Opts,
2766                                MacroBuilder &Builder) const {
2767    WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
2768    WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
2769    // The value of the following reflects processor type.
2770    // 300=386, 400=486, 500=Pentium, 600=Blend (default)
2771    // We lost the original triple, so we use the default.
2772    Builder.defineMacro("_M_IX86", "600");
2773  }
2774};
2775} // end anonymous namespace
2776
2777namespace {
2778// x86-32 MinGW target
2779class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
2780public:
2781  MinGWX86_32TargetInfo(const std::string& triple)
2782    : WindowsX86_32TargetInfo(triple) {
2783  }
2784  virtual void getTargetDefines(const LangOptions &Opts,
2785                                MacroBuilder &Builder) const {
2786    WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
2787    DefineStd(Builder, "WIN32", Opts);
2788    DefineStd(Builder, "WINNT", Opts);
2789    Builder.defineMacro("_X86_");
2790    Builder.defineMacro("__MSVCRT__");
2791    Builder.defineMacro("__MINGW32__");
2792
2793    // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2794    // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
2795    if (Opts.MicrosoftExt)
2796      // Provide "as-is" __declspec.
2797      Builder.defineMacro("__declspec", "__declspec");
2798    else
2799      // Provide alias of __attribute__ like mingw32-gcc.
2800      Builder.defineMacro("__declspec(a)", "__attribute__((a))");
2801  }
2802};
2803} // end anonymous namespace
2804
2805namespace {
2806// x86-32 Cygwin target
2807class CygwinX86_32TargetInfo : public X86_32TargetInfo {
2808public:
2809  CygwinX86_32TargetInfo(const std::string& triple)
2810    : X86_32TargetInfo(triple) {
2811    TLSSupported = false;
2812    WCharType = UnsignedShort;
2813    DoubleAlign = LongLongAlign = 64;
2814    DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2815                        "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
2816                        "a0:0:64-f80:32:32-n8:16:32-S32";
2817  }
2818  virtual void getTargetDefines(const LangOptions &Opts,
2819                                MacroBuilder &Builder) const {
2820    X86_32TargetInfo::getTargetDefines(Opts, Builder);
2821    Builder.defineMacro("_X86_");
2822    Builder.defineMacro("__CYGWIN__");
2823    Builder.defineMacro("__CYGWIN32__");
2824    DefineStd(Builder, "unix", Opts);
2825    if (Opts.CPlusPlus)
2826      Builder.defineMacro("_GNU_SOURCE");
2827  }
2828};
2829} // end anonymous namespace
2830
2831namespace {
2832// x86-32 Haiku target
2833class HaikuX86_32TargetInfo : public X86_32TargetInfo {
2834public:
2835  HaikuX86_32TargetInfo(const std::string& triple)
2836    : X86_32TargetInfo(triple) {
2837    SizeType = UnsignedLong;
2838    IntPtrType = SignedLong;
2839    PtrDiffType = SignedLong;
2840    ProcessIDType = SignedLong;
2841    this->UserLabelPrefix = "";
2842    this->TLSSupported = false;
2843  }
2844  virtual void getTargetDefines(const LangOptions &Opts,
2845                                MacroBuilder &Builder) const {
2846    X86_32TargetInfo::getTargetDefines(Opts, Builder);
2847    Builder.defineMacro("__INTEL__");
2848    Builder.defineMacro("__HAIKU__");
2849  }
2850};
2851} // end anonymous namespace
2852
2853// RTEMS Target
2854template<typename Target>
2855class RTEMSTargetInfo : public OSTargetInfo<Target> {
2856protected:
2857  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
2858                            MacroBuilder &Builder) const {
2859    // RTEMS defines; list based off of gcc output
2860
2861    Builder.defineMacro("__rtems__");
2862    Builder.defineMacro("__ELF__");
2863  }
2864public:
2865  RTEMSTargetInfo(const std::string &triple)
2866    : OSTargetInfo<Target>(triple) {
2867      this->UserLabelPrefix = "";
2868
2869      llvm::Triple Triple(triple);
2870      switch (Triple.getArch()) {
2871        default:
2872        case llvm::Triple::x86:
2873          // this->MCountName = ".mcount";
2874          break;
2875        case llvm::Triple::mips:
2876        case llvm::Triple::mipsel:
2877        case llvm::Triple::ppc:
2878        case llvm::Triple::ppc64:
2879          // this->MCountName = "_mcount";
2880          break;
2881        case llvm::Triple::arm:
2882          // this->MCountName = "__mcount";
2883          break;
2884      }
2885
2886    }
2887};
2888
2889namespace {
2890// x86-32 RTEMS target
2891class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
2892public:
2893  RTEMSX86_32TargetInfo(const std::string& triple)
2894    : X86_32TargetInfo(triple) {
2895    SizeType = UnsignedLong;
2896    IntPtrType = SignedLong;
2897    PtrDiffType = SignedLong;
2898    this->UserLabelPrefix = "";
2899  }
2900  virtual void getTargetDefines(const LangOptions &Opts,
2901                                MacroBuilder &Builder) const {
2902    X86_32TargetInfo::getTargetDefines(Opts, Builder);
2903    Builder.defineMacro("__INTEL__");
2904    Builder.defineMacro("__rtems__");
2905  }
2906};
2907} // end anonymous namespace
2908
2909namespace {
2910// x86-64 generic target
2911class X86_64TargetInfo : public X86TargetInfo {
2912public:
2913  X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
2914    LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
2915    LongDoubleWidth = 128;
2916    LongDoubleAlign = 128;
2917    LargeArrayMinWidth = 128;
2918    LargeArrayAlign = 128;
2919    SuitableAlign = 128;
2920    IntMaxType = SignedLong;
2921    UIntMaxType = UnsignedLong;
2922    Int64Type = SignedLong;
2923    RegParmMax = 6;
2924
2925    DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2926                        "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
2927                        "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128";
2928
2929    // Use fpret only for long double.
2930    RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
2931
2932    // Use fp2ret for _Complex long double.
2933    ComplexLongDoubleUsesFP2Ret = true;
2934
2935    // x86-64 has atomics up to 16 bytes.
2936    // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
2937    // on CPUs with cmpxchg16b
2938    MaxAtomicPromoteWidth = 128;
2939    MaxAtomicInlineWidth = 64;
2940  }
2941  virtual BuiltinVaListKind getBuiltinVaListKind() const {
2942    return TargetInfo::X86_64ABIBuiltinVaList;
2943  }
2944
2945  int getEHDataRegisterNumber(unsigned RegNo) const {
2946    if (RegNo == 0) return 0;
2947    if (RegNo == 1) return 1;
2948    return -1;
2949  }
2950
2951  virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
2952    return (CC == CC_Default ||
2953            CC == CC_C ||
2954            CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
2955  }
2956
2957  virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const {
2958    return CC_C;
2959  }
2960
2961};
2962} // end anonymous namespace
2963
2964namespace {
2965// x86-64 Windows target
2966class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
2967public:
2968  WindowsX86_64TargetInfo(const std::string& triple)
2969    : WindowsTargetInfo<X86_64TargetInfo>(triple) {
2970    TLSSupported = false;
2971    WCharType = UnsignedShort;
2972    LongWidth = LongAlign = 32;
2973    DoubleAlign = LongLongAlign = 64;
2974    IntMaxType = SignedLongLong;
2975    UIntMaxType = UnsignedLongLong;
2976    Int64Type = SignedLongLong;
2977    SizeType = UnsignedLongLong;
2978    PtrDiffType = SignedLongLong;
2979    IntPtrType = SignedLongLong;
2980    this->UserLabelPrefix = "";
2981  }
2982  virtual void getTargetDefines(const LangOptions &Opts,
2983                                MacroBuilder &Builder) const {
2984    WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
2985    Builder.defineMacro("_WIN64");
2986  }
2987  virtual BuiltinVaListKind getBuiltinVaListKind() const {
2988    return TargetInfo::CharPtrBuiltinVaList;
2989  }
2990};
2991} // end anonymous namespace
2992
2993namespace {
2994// x86-64 Windows Visual Studio target
2995class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
2996public:
2997  VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
2998    : WindowsX86_64TargetInfo(triple) {
2999    LongDoubleWidth = LongDoubleAlign = 64;
3000    LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3001  }
3002  virtual void getTargetDefines(const LangOptions &Opts,
3003                                MacroBuilder &Builder) const {
3004    WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3005    WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
3006    Builder.defineMacro("_M_X64");
3007    Builder.defineMacro("_M_AMD64");
3008  }
3009};
3010} // end anonymous namespace
3011
3012namespace {
3013// x86-64 MinGW target
3014class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3015public:
3016  MinGWX86_64TargetInfo(const std::string& triple)
3017    : WindowsX86_64TargetInfo(triple) {
3018  }
3019  virtual void getTargetDefines(const LangOptions &Opts,
3020                                MacroBuilder &Builder) const {
3021    WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3022    DefineStd(Builder, "WIN64", Opts);
3023    Builder.defineMacro("__MSVCRT__");
3024    Builder.defineMacro("__MINGW32__");
3025    Builder.defineMacro("__MINGW64__");
3026
3027    // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
3028    // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
3029    if (Opts.MicrosoftExt)
3030      // Provide "as-is" __declspec.
3031      Builder.defineMacro("__declspec", "__declspec");
3032    else
3033      // Provide alias of __attribute__ like mingw32-gcc.
3034      Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3035  }
3036};
3037} // end anonymous namespace
3038
3039namespace {
3040class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3041public:
3042  DarwinX86_64TargetInfo(const std::string& triple)
3043      : DarwinTargetInfo<X86_64TargetInfo>(triple) {
3044    Int64Type = SignedLongLong;
3045    MaxVectorAlign = 256;
3046  }
3047};
3048} // end anonymous namespace
3049
3050namespace {
3051class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3052public:
3053  OpenBSDX86_64TargetInfo(const std::string& triple)
3054      : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
3055    IntMaxType = SignedLongLong;
3056    UIntMaxType = UnsignedLongLong;
3057    Int64Type = SignedLongLong;
3058  }
3059};
3060} // end anonymous namespace
3061
3062namespace {
3063class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3064public:
3065  BitrigX86_64TargetInfo(const std::string& triple)
3066      : BitrigTargetInfo<X86_64TargetInfo>(triple) {
3067     IntMaxType = SignedLongLong;
3068     UIntMaxType = UnsignedLongLong;
3069     Int64Type = SignedLongLong;
3070  }
3071};
3072}
3073
3074namespace {
3075class AArch64TargetInfo : public TargetInfo {
3076  static const char * const GCCRegNames[];
3077  static const TargetInfo::GCCRegAlias GCCRegAliases[];
3078public:
3079  AArch64TargetInfo(const std::string& triple) : TargetInfo(triple) {
3080    BigEndian = false;
3081    LongWidth = LongAlign = 64;
3082    LongDoubleWidth = LongDoubleAlign = 128;
3083    PointerWidth = PointerAlign = 64;
3084    SuitableAlign = 128;
3085    DescriptionString = "e-p:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3086                        "i64:64:64-i128:128:128-f32:32:32-f64:64:64-"
3087                        "f128:128:128-n32:64-S128";
3088
3089    WCharType = UnsignedInt;
3090    LongDoubleFormat = &llvm::APFloat::IEEEquad;
3091
3092    TheCXXABI.set(TargetCXXABI::GenericAArch64);
3093  }
3094  virtual void getTargetDefines(const LangOptions &Opts,
3095                                MacroBuilder &Builder) const {
3096    // GCC defines theses currently
3097    Builder.defineMacro("__aarch64__");
3098    Builder.defineMacro("__AARCH64EL__");
3099
3100    // ACLE predefines. Many can only have one possible value on v8 AArch64.
3101
3102    // FIXME: these were written based on an unreleased version of a 32-bit ACLE
3103    // which was intended to be compatible with a 64-bit implementation. They
3104    // will need updating when a real 64-bit ACLE exists. Particularly pressing
3105    // instances are: __AARCH_ISA_A32, __AARCH_ISA_T32, __ARCH_PCS.
3106    Builder.defineMacro("__AARCH_ACLE",    "101");
3107    Builder.defineMacro("__AARCH",         "8");
3108    Builder.defineMacro("__AARCH_PROFILE", "'A'");
3109
3110    Builder.defineMacro("__AARCH_FEATURE_UNALIGNED");
3111    Builder.defineMacro("__AARCH_FEATURE_CLZ");
3112    Builder.defineMacro("__AARCH_FEATURE_FMA");
3113
3114    // FIXME: ACLE 1.1 reserves bit 4. Will almost certainly come to mean
3115    // 128-bit LDXP present, at which point this becomes 0x1f.
3116    Builder.defineMacro("__AARCH_FEATURE_LDREX", "0xf");
3117
3118    // 0xe implies support for half, single and double precision operations.
3119    Builder.defineMacro("__AARCH_FP", "0xe");
3120
3121    // PCS specifies this for SysV variants, which is all we support. Other ABIs
3122    // may choose __AARCH_FP16_FORMAT_ALTERNATIVE.
3123    Builder.defineMacro("__AARCH_FP16_FORMAT_IEEE");
3124
3125    if (Opts.FastMath || Opts.FiniteMathOnly)
3126      Builder.defineMacro("__AARCH_FP_FAST");
3127
3128    if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
3129      Builder.defineMacro("__AARCH_FP_FENV_ROUNDING");
3130
3131    Builder.defineMacro("__AARCH_SIZEOF_WCHAR_T",
3132                        Opts.ShortWChar ? "2" : "4");
3133
3134    Builder.defineMacro("__AARCH_SIZEOF_MINIMAL_ENUM",
3135                        Opts.ShortEnums ? "1" : "4");
3136
3137    if (BigEndian)
3138      Builder.defineMacro("__AARCH_BIG_ENDIAN");
3139  }
3140  virtual void getTargetBuiltins(const Builtin::Info *&Records,
3141                                 unsigned &NumRecords) const {
3142    Records = 0;
3143    NumRecords = 0;
3144  }
3145  virtual bool hasFeature(StringRef Feature) const {
3146    return Feature == "aarch64";
3147  }
3148  virtual void getGCCRegNames(const char * const *&Names,
3149                              unsigned &NumNames) const;
3150  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3151                                unsigned &NumAliases) const;
3152
3153  virtual bool isCLZForZeroUndef() const { return false; }
3154
3155  virtual bool validateAsmConstraint(const char *&Name,
3156                                     TargetInfo::ConstraintInfo &Info) const {
3157    switch (*Name) {
3158    default: return false;
3159    case 'w': // An FP/SIMD vector register
3160      Info.setAllowsRegister();
3161      return true;
3162    case 'I': // Constant that can be used with an ADD instruction
3163    case 'J': // Constant that can be used with a SUB instruction
3164    case 'K': // Constant that can be used with a 32-bit logical instruction
3165    case 'L': // Constant that can be used with a 64-bit logical instruction
3166    case 'M': // Constant that can be used as a 32-bit MOV immediate
3167    case 'N': // Constant that can be used as a 64-bit MOV immediate
3168    case 'Y': // Floating point constant zero
3169    case 'Z': // Integer constant zero
3170      return true;
3171    case 'Q': // A memory reference with base register and no offset
3172      Info.setAllowsMemory();
3173      return true;
3174    case 'S': // A symbolic address
3175      Info.setAllowsRegister();
3176      return true;
3177    case 'U':
3178      // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
3179      // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
3180      // Usa: An absolute symbolic address
3181      // Ush: The high part (bits 32:12) of a pc-relative symbolic address
3182      llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
3183    }
3184  }
3185
3186  virtual const char *getClobbers() const {
3187    // There are no AArch64 clobbers shared by all asm statements.
3188    return "";
3189  }
3190
3191  virtual BuiltinVaListKind getBuiltinVaListKind() const {
3192    return TargetInfo::AArch64ABIBuiltinVaList;
3193  }
3194};
3195
3196const char * const AArch64TargetInfo::GCCRegNames[] = {
3197  "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7",
3198  "w8", "w9", "w10", "w11", "w12", "w13", "w14", "w15",
3199  "w16", "w17", "w18", "w19", "w20", "w21", "w22", "w23",
3200  "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp", "wzr",
3201
3202  "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
3203  "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
3204  "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
3205  "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp", "xzr",
3206
3207  "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7",
3208  "b8", "b9", "b10", "b11", "b12", "b13", "b14", "b15",
3209  "b16", "b17", "b18", "b19", "b20", "b21", "b22", "b23",
3210  "b24", "b25", "b26", "b27", "b28", "b29", "b30", "b31",
3211
3212  "h0", "h1", "h2", "h3", "h4", "h5", "h6", "h7",
3213  "h8", "h9", "h10", "h11", "h12", "h13", "h14", "h15",
3214  "h16", "h17", "h18", "h19", "h20", "h21", "h22", "h23",
3215  "h24", "h25", "h26", "h27", "h28", "h29", "h30", "h31",
3216
3217  "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
3218  "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
3219  "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
3220  "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
3221
3222  "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
3223  "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
3224  "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
3225  "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
3226
3227  "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
3228  "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
3229  "q16", "q17", "q18", "q19", "q20", "q21", "q22", "q23",
3230  "q24", "q25", "q26", "q27", "q28", "q29", "q30", "q31"
3231};
3232
3233void AArch64TargetInfo::getGCCRegNames(const char * const *&Names,
3234                                       unsigned &NumNames) const {
3235  Names = GCCRegNames;
3236  NumNames = llvm::array_lengthof(GCCRegNames);
3237}
3238
3239const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
3240  { { "x16" }, "ip0"},
3241  { { "x17" }, "ip1"},
3242  { { "x29" }, "fp" },
3243  { { "x30" }, "lr" }
3244};
3245
3246void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3247                                         unsigned &NumAliases) const {
3248  Aliases = GCCRegAliases;
3249  NumAliases = llvm::array_lengthof(GCCRegAliases);
3250
3251}
3252} // end anonymous namespace
3253
3254namespace {
3255class ARMTargetInfo : public TargetInfo {
3256  // Possible FPU choices.
3257  enum FPUMode {
3258    VFP2FPU = (1 << 0),
3259    VFP3FPU = (1 << 1),
3260    VFP4FPU = (1 << 2),
3261    NeonFPU = (1 << 3)
3262  };
3263
3264  static bool FPUModeIsVFP(FPUMode Mode) {
3265    return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU);
3266  }
3267
3268  static const TargetInfo::GCCRegAlias GCCRegAliases[];
3269  static const char * const GCCRegNames[];
3270
3271  std::string ABI, CPU;
3272
3273  unsigned FPU : 4;
3274
3275  unsigned IsAAPCS : 1;
3276  unsigned IsThumb : 1;
3277
3278  // Initialized via features.
3279  unsigned SoftFloat : 1;
3280  unsigned SoftFloatABI : 1;
3281
3282  static const Builtin::Info BuiltinInfo[];
3283
3284public:
3285  ARMTargetInfo(const std::string &TripleStr)
3286    : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s"), IsAAPCS(true)
3287  {
3288    BigEndian = false;
3289    SizeType = UnsignedInt;
3290    PtrDiffType = SignedInt;
3291    // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3292    WCharType = UnsignedInt;
3293
3294    // {} in inline assembly are neon specifiers, not assembly variant
3295    // specifiers.
3296    NoAsmVariants = true;
3297
3298    // FIXME: Should we just treat this as a feature?
3299    IsThumb = getTriple().getArchName().startswith("thumb");
3300    if (IsThumb) {
3301      // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3302      // so set preferred for small types to 32.
3303      DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
3304                           "i64:64:64-f32:32:32-f64:64:64-"
3305                           "v64:64:64-v128:64:128-a0:0:32-n32-S64");
3306    } else {
3307      DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3308                           "i64:64:64-f32:32:32-f64:64:64-"
3309                           "v64:64:64-v128:64:128-a0:0:64-n32-S64");
3310    }
3311
3312    // ARM targets default to using the ARM C++ ABI.
3313    TheCXXABI.set(TargetCXXABI::GenericARM);
3314
3315    // ARM has atomics up to 8 bytes
3316    // FIXME: Set MaxAtomicInlineWidth if we have the feature v6e
3317    MaxAtomicPromoteWidth = 64;
3318
3319    // Do force alignment of members that follow zero length bitfields.  If
3320    // the alignment of the zero-length bitfield is greater than the member
3321    // that follows it, `bar', `bar' will be aligned as the  type of the
3322    // zero length bitfield.
3323    UseZeroLengthBitfieldAlignment = true;
3324  }
3325  virtual const char *getABI() const { return ABI.c_str(); }
3326  virtual bool setABI(const std::string &Name) {
3327    ABI = Name;
3328
3329    // The defaults (above) are for AAPCS, check if we need to change them.
3330    //
3331    // FIXME: We need support for -meabi... we could just mangle it into the
3332    // name.
3333    if (Name == "apcs-gnu") {
3334      DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
3335      // size_t is unsigned int on FreeBSD.
3336      if (getTriple().getOS() != llvm::Triple::FreeBSD)
3337        SizeType = UnsignedLong;
3338
3339      // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3340      WCharType = SignedInt;
3341
3342      // Do not respect the alignment of bit-field types when laying out
3343      // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3344      UseBitFieldTypeAlignment = false;
3345
3346      /// gcc forces the alignment to 4 bytes, regardless of the type of the
3347      /// zero length bitfield.  This corresponds to EMPTY_FIELD_BOUNDARY in
3348      /// gcc.
3349      ZeroLengthBitfieldBoundary = 32;
3350
3351      IsAAPCS = false;
3352
3353      if (IsThumb) {
3354        // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3355        // so set preferred for small types to 32.
3356        DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
3357                             "i64:32:64-f32:32:32-f64:32:64-"
3358                             "v64:32:64-v128:32:128-a0:0:32-n32-S32");
3359      } else {
3360        DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3361                             "i64:32:64-f32:32:32-f64:32:64-"
3362                             "v64:32:64-v128:32:128-a0:0:32-n32-S32");
3363      }
3364
3365      // FIXME: Override "preferred align" for double and long long.
3366    } else if (Name == "aapcs" || Name == "aapcs-vfp") {
3367      IsAAPCS = true;
3368      // FIXME: Enumerated types are variable width in straight AAPCS.
3369    } else if (Name == "aapcs-linux") {
3370      IsAAPCS = true;
3371    } else
3372      return false;
3373
3374    return true;
3375  }
3376
3377  void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
3378    if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3379      Features["vfp2"] = true;
3380    else if (CPU == "cortex-a8" || CPU == "cortex-a15" ||
3381             CPU == "cortex-a9" || CPU == "cortex-a9-mp")
3382      Features["neon"] = true;
3383    else if (CPU == "swift") {
3384      Features["vfp4"] = true;
3385      Features["neon"] = true;
3386    }
3387  }
3388
3389  virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
3390                                 StringRef Name,
3391                                 bool Enabled) const {
3392    if (Name == "soft-float" || Name == "soft-float-abi" ||
3393        Name == "vfp2" || Name == "vfp3" || Name == "vfp4" || Name == "neon" ||
3394        Name == "d16" || Name == "neonfp") {
3395      Features[Name] = Enabled;
3396    } else
3397      return false;
3398
3399    return true;
3400  }
3401
3402  virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
3403    FPU = 0;
3404    SoftFloat = SoftFloatABI = false;
3405    for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3406      if (Features[i] == "+soft-float")
3407        SoftFloat = true;
3408      else if (Features[i] == "+soft-float-abi")
3409        SoftFloatABI = true;
3410      else if (Features[i] == "+vfp2")
3411        FPU |= VFP2FPU;
3412      else if (Features[i] == "+vfp3")
3413        FPU |= VFP3FPU;
3414      else if (Features[i] == "+vfp4")
3415        FPU |= VFP4FPU;
3416      else if (Features[i] == "+neon")
3417        FPU |= NeonFPU;
3418    }
3419
3420    // Remove front-end specific options which the backend handles differently.
3421    std::vector<std::string>::iterator it;
3422    it = std::find(Features.begin(), Features.end(), "+soft-float");
3423    if (it != Features.end())
3424      Features.erase(it);
3425    it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
3426    if (it != Features.end())
3427      Features.erase(it);
3428  }
3429
3430  virtual bool hasFeature(StringRef Feature) const {
3431    return llvm::StringSwitch<bool>(Feature)
3432        .Case("arm", true)
3433        .Case("softfloat", SoftFloat)
3434        .Case("thumb", IsThumb)
3435        .Case("neon", FPU == NeonFPU && !SoftFloat &&
3436              StringRef(getCPUDefineSuffix(CPU)).startswith("7"))
3437        .Default(false);
3438  }
3439  // FIXME: Should we actually have some table instead of these switches?
3440  static const char *getCPUDefineSuffix(StringRef Name) {
3441    return llvm::StringSwitch<const char*>(Name)
3442      .Cases("arm8", "arm810", "4")
3443      .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
3444      .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3445      .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3446      .Case("ep9312", "4T")
3447      .Cases("arm10tdmi", "arm1020t", "5T")
3448      .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3449      .Case("arm926ej-s", "5TEJ")
3450      .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3451      .Cases("xscale", "iwmmxt", "5TE")
3452      .Case("arm1136j-s", "6J")
3453      .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
3454      .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
3455      .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
3456      .Cases("cortex-a5", "cortex-a8", "cortex-a9", "cortex-a15", "7A")
3457      .Case("cortex-r5", "7R")
3458      .Case("cortex-a9-mp", "7F")
3459      .Case("swift", "7S")
3460      .Cases("cortex-m3", "cortex-m4", "7M")
3461      .Case("cortex-m0", "6M")
3462      .Default(0);
3463  }
3464  static const char *getCPUProfile(StringRef Name) {
3465    return llvm::StringSwitch<const char*>(Name)
3466      .Cases("cortex-a8", "cortex-a9", "A")
3467      .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
3468      .Case("cortex-r5", "R")
3469      .Default("");
3470  }
3471  virtual bool setCPU(const std::string &Name) {
3472    if (!getCPUDefineSuffix(Name))
3473      return false;
3474
3475    CPU = Name;
3476    return true;
3477  }
3478  virtual void getTargetDefines(const LangOptions &Opts,
3479                                MacroBuilder &Builder) const {
3480    // Target identification.
3481    Builder.defineMacro("__arm");
3482    Builder.defineMacro("__arm__");
3483
3484    // Target properties.
3485    Builder.defineMacro("__ARMEL__");
3486    Builder.defineMacro("__LITTLE_ENDIAN__");
3487    Builder.defineMacro("__REGISTER_PREFIX__", "");
3488
3489    StringRef CPUArch = getCPUDefineSuffix(CPU);
3490    Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
3491    Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
3492    StringRef CPUProfile = getCPUProfile(CPU);
3493    if (!CPUProfile.empty())
3494      Builder.defineMacro("__ARM_ARCH_PROFILE", CPUProfile);
3495
3496    // Subtarget options.
3497
3498    // FIXME: It's more complicated than this and we don't really support
3499    // interworking.
3500    if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
3501      Builder.defineMacro("__THUMB_INTERWORK__");
3502
3503    if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
3504      // M-class CPUs on Darwin follow AAPCS, but not EABI.
3505      if (!(getTriple().isOSDarwin() && CPUProfile == "M"))
3506        Builder.defineMacro("__ARM_EABI__");
3507      Builder.defineMacro("__ARM_PCS", "1");
3508
3509      if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
3510        Builder.defineMacro("__ARM_PCS_VFP", "1");
3511    }
3512
3513    if (SoftFloat)
3514      Builder.defineMacro("__SOFTFP__");
3515
3516    if (CPU == "xscale")
3517      Builder.defineMacro("__XSCALE__");
3518
3519    bool IsARMv7 = CPUArch.startswith("7");
3520    if (IsThumb) {
3521      Builder.defineMacro("__THUMBEL__");
3522      Builder.defineMacro("__thumb__");
3523      if (CPUArch == "6T2" || IsARMv7)
3524        Builder.defineMacro("__thumb2__");
3525    }
3526
3527    // Note, this is always on in gcc, even though it doesn't make sense.
3528    Builder.defineMacro("__APCS_32__");
3529
3530    if (FPUModeIsVFP((FPUMode) FPU)) {
3531      Builder.defineMacro("__VFP_FP__");
3532      if (FPU & VFP2FPU)
3533        Builder.defineMacro("__ARM_VFPV2__");
3534      if (FPU & VFP3FPU)
3535        Builder.defineMacro("__ARM_VFPV3__");
3536      if (FPU & VFP4FPU)
3537        Builder.defineMacro("__ARM_VFPV4__");
3538    }
3539
3540    // This only gets set when Neon instructions are actually available, unlike
3541    // the VFP define, hence the soft float and arch check. This is subtly
3542    // different from gcc, we follow the intent which was that it should be set
3543    // when Neon instructions are actually available.
3544    if ((FPU & NeonFPU) && !SoftFloat && IsARMv7)
3545      Builder.defineMacro("__ARM_NEON__");
3546  }
3547  virtual void getTargetBuiltins(const Builtin::Info *&Records,
3548                                 unsigned &NumRecords) const {
3549    Records = BuiltinInfo;
3550    NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
3551  }
3552  virtual bool isCLZForZeroUndef() const { return false; }
3553  virtual BuiltinVaListKind getBuiltinVaListKind() const {
3554    return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
3555  }
3556  virtual void getGCCRegNames(const char * const *&Names,
3557                              unsigned &NumNames) const;
3558  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3559                                unsigned &NumAliases) const;
3560  virtual bool validateAsmConstraint(const char *&Name,
3561                                     TargetInfo::ConstraintInfo &Info) const {
3562    switch (*Name) {
3563    default: break;
3564    case 'l': // r0-r7
3565    case 'h': // r8-r15
3566    case 'w': // VFP Floating point register single precision
3567    case 'P': // VFP Floating point register double precision
3568      Info.setAllowsRegister();
3569      return true;
3570    case 'Q': // A memory address that is a single base register.
3571      Info.setAllowsMemory();
3572      return true;
3573    case 'U': // a memory reference...
3574      switch (Name[1]) {
3575      case 'q': // ...ARMV4 ldrsb
3576      case 'v': // ...VFP load/store (reg+constant offset)
3577      case 'y': // ...iWMMXt load/store
3578      case 't': // address valid for load/store opaque types wider
3579                // than 128-bits
3580      case 'n': // valid address for Neon doubleword vector load/store
3581      case 'm': // valid address for Neon element and structure load/store
3582      case 's': // valid address for non-offset loads/stores of quad-word
3583                // values in four ARM registers
3584        Info.setAllowsMemory();
3585        Name++;
3586        return true;
3587      }
3588    }
3589    return false;
3590  }
3591  virtual std::string convertConstraint(const char *&Constraint) const {
3592    std::string R;
3593    switch (*Constraint) {
3594    case 'U':   // Two-character constraint; add "^" hint for later parsing.
3595      R = std::string("^") + std::string(Constraint, 2);
3596      Constraint++;
3597      break;
3598    case 'p': // 'p' should be translated to 'r' by default.
3599      R = std::string("r");
3600      break;
3601    default:
3602      return std::string(1, *Constraint);
3603    }
3604    return R;
3605  }
3606  virtual bool validateConstraintModifier(StringRef Constraint,
3607                                          const char Modifier,
3608                                          unsigned Size) const {
3609    bool isOutput = (Constraint[0] == '=');
3610    bool isInOut = (Constraint[0] == '+');
3611
3612    // Strip off constraint modifiers.
3613    while (Constraint[0] == '=' ||
3614           Constraint[0] == '+' ||
3615           Constraint[0] == '&')
3616      Constraint = Constraint.substr(1);
3617
3618    switch (Constraint[0]) {
3619    default: break;
3620    case 'r': {
3621      switch (Modifier) {
3622      default:
3623        return isInOut || (isOutput && Size >= 32) ||
3624          (!isOutput && !isInOut && Size <= 32);
3625      case 'q':
3626        // A register of size 32 cannot fit a vector type.
3627        return false;
3628      }
3629    }
3630    }
3631
3632    return true;
3633  }
3634  virtual const char *getClobbers() const {
3635    // FIXME: Is this really right?
3636    return "";
3637  }
3638
3639  virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
3640    return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
3641  }
3642};
3643
3644const char * const ARMTargetInfo::GCCRegNames[] = {
3645  // Integer registers
3646  "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3647  "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
3648
3649  // Float registers
3650  "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
3651  "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
3652  "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
3653  "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
3654
3655  // Double registers
3656  "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
3657  "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
3658  "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
3659  "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
3660
3661  // Quad registers
3662  "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
3663  "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
3664};
3665
3666void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
3667                                   unsigned &NumNames) const {
3668  Names = GCCRegNames;
3669  NumNames = llvm::array_lengthof(GCCRegNames);
3670}
3671
3672const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
3673  { { "a1" }, "r0" },
3674  { { "a2" }, "r1" },
3675  { { "a3" }, "r2" },
3676  { { "a4" }, "r3" },
3677  { { "v1" }, "r4" },
3678  { { "v2" }, "r5" },
3679  { { "v3" }, "r6" },
3680  { { "v4" }, "r7" },
3681  { { "v5" }, "r8" },
3682  { { "v6", "rfp" }, "r9" },
3683  { { "sl" }, "r10" },
3684  { { "fp" }, "r11" },
3685  { { "ip" }, "r12" },
3686  { { "r13" }, "sp" },
3687  { { "r14" }, "lr" },
3688  { { "r15" }, "pc" },
3689  // The S, D and Q registers overlap, but aren't really aliases; we
3690  // don't want to substitute one of these for a different-sized one.
3691};
3692
3693void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3694                                       unsigned &NumAliases) const {
3695  Aliases = GCCRegAliases;
3696  NumAliases = llvm::array_lengthof(GCCRegAliases);
3697}
3698
3699const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
3700#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3701#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3702                                              ALL_LANGUAGES },
3703#include "clang/Basic/BuiltinsARM.def"
3704};
3705} // end anonymous namespace.
3706
3707namespace {
3708class DarwinARMTargetInfo :
3709  public DarwinTargetInfo<ARMTargetInfo> {
3710protected:
3711  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3712                            MacroBuilder &Builder) const {
3713    getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
3714  }
3715
3716public:
3717  DarwinARMTargetInfo(const std::string& triple)
3718    : DarwinTargetInfo<ARMTargetInfo>(triple) {
3719    HasAlignMac68kSupport = true;
3720    // iOS always has 64-bit atomic instructions.
3721    // FIXME: This should be based off of the target features in ARMTargetInfo.
3722    MaxAtomicInlineWidth = 64;
3723
3724    // Darwin on iOS uses a variant of the ARM C++ ABI.
3725    TheCXXABI.set(TargetCXXABI::iOS);
3726  }
3727};
3728} // end anonymous namespace.
3729
3730
3731namespace {
3732// Hexagon abstract base class
3733class HexagonTargetInfo : public TargetInfo {
3734  static const Builtin::Info BuiltinInfo[];
3735  static const char * const GCCRegNames[];
3736  static const TargetInfo::GCCRegAlias GCCRegAliases[];
3737  std::string CPU;
3738public:
3739  HexagonTargetInfo(const std::string& triple) : TargetInfo(triple)  {
3740    BigEndian = false;
3741    DescriptionString = ("e-p:32:32:32-"
3742                         "i64:64:64-i32:32:32-i16:16:16-i1:32:32-"
3743                         "f64:64:64-f32:32:32-a0:0-n32");
3744
3745    // {} in inline assembly are packet specifiers, not assembly variant
3746    // specifiers.
3747    NoAsmVariants = true;
3748  }
3749
3750  virtual void getTargetBuiltins(const Builtin::Info *&Records,
3751                                 unsigned &NumRecords) const {
3752    Records = BuiltinInfo;
3753    NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
3754  }
3755
3756  virtual bool validateAsmConstraint(const char *&Name,
3757                                     TargetInfo::ConstraintInfo &Info) const {
3758    return true;
3759  }
3760
3761  virtual void getTargetDefines(const LangOptions &Opts,
3762                                MacroBuilder &Builder) const;
3763
3764  virtual bool hasFeature(StringRef Feature) const {
3765    return Feature == "hexagon";
3766  }
3767
3768  virtual BuiltinVaListKind getBuiltinVaListKind() const {
3769    return TargetInfo::CharPtrBuiltinVaList;
3770  }
3771  virtual void getGCCRegNames(const char * const *&Names,
3772                              unsigned &NumNames) const;
3773  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3774                                unsigned &NumAliases) const;
3775  virtual const char *getClobbers() const {
3776    return "";
3777  }
3778
3779  static const char *getHexagonCPUSuffix(StringRef Name) {
3780    return llvm::StringSwitch<const char*>(Name)
3781      .Case("hexagonv2", "2")
3782      .Case("hexagonv3", "3")
3783      .Case("hexagonv4", "4")
3784      .Case("hexagonv5", "5")
3785      .Default(0);
3786  }
3787
3788  virtual bool setCPU(const std::string &Name) {
3789    if (!getHexagonCPUSuffix(Name))
3790      return false;
3791
3792    CPU = Name;
3793    return true;
3794  }
3795};
3796
3797void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
3798                                MacroBuilder &Builder) const {
3799  Builder.defineMacro("qdsp6");
3800  Builder.defineMacro("__qdsp6", "1");
3801  Builder.defineMacro("__qdsp6__", "1");
3802
3803  Builder.defineMacro("hexagon");
3804  Builder.defineMacro("__hexagon", "1");
3805  Builder.defineMacro("__hexagon__", "1");
3806
3807  if(CPU == "hexagonv1") {
3808    Builder.defineMacro("__HEXAGON_V1__");
3809    Builder.defineMacro("__HEXAGON_ARCH__", "1");
3810    if(Opts.HexagonQdsp6Compat) {
3811      Builder.defineMacro("__QDSP6_V1__");
3812      Builder.defineMacro("__QDSP6_ARCH__", "1");
3813    }
3814  }
3815  else if(CPU == "hexagonv2") {
3816    Builder.defineMacro("__HEXAGON_V2__");
3817    Builder.defineMacro("__HEXAGON_ARCH__", "2");
3818    if(Opts.HexagonQdsp6Compat) {
3819      Builder.defineMacro("__QDSP6_V2__");
3820      Builder.defineMacro("__QDSP6_ARCH__", "2");
3821    }
3822  }
3823  else if(CPU == "hexagonv3") {
3824    Builder.defineMacro("__HEXAGON_V3__");
3825    Builder.defineMacro("__HEXAGON_ARCH__", "3");
3826    if(Opts.HexagonQdsp6Compat) {
3827      Builder.defineMacro("__QDSP6_V3__");
3828      Builder.defineMacro("__QDSP6_ARCH__", "3");
3829    }
3830  }
3831  else if(CPU == "hexagonv4") {
3832    Builder.defineMacro("__HEXAGON_V4__");
3833    Builder.defineMacro("__HEXAGON_ARCH__", "4");
3834    if(Opts.HexagonQdsp6Compat) {
3835      Builder.defineMacro("__QDSP6_V4__");
3836      Builder.defineMacro("__QDSP6_ARCH__", "4");
3837    }
3838  }
3839  else if(CPU == "hexagonv5") {
3840    Builder.defineMacro("__HEXAGON_V5__");
3841    Builder.defineMacro("__HEXAGON_ARCH__", "5");
3842    if(Opts.HexagonQdsp6Compat) {
3843      Builder.defineMacro("__QDSP6_V5__");
3844      Builder.defineMacro("__QDSP6_ARCH__", "5");
3845    }
3846  }
3847}
3848
3849const char * const HexagonTargetInfo::GCCRegNames[] = {
3850  "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3851  "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3852  "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3853  "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
3854  "p0", "p1", "p2", "p3",
3855  "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
3856};
3857
3858void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
3859                                   unsigned &NumNames) const {
3860  Names = GCCRegNames;
3861  NumNames = llvm::array_lengthof(GCCRegNames);
3862}
3863
3864
3865const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
3866  { { "sp" }, "r29" },
3867  { { "fp" }, "r30" },
3868  { { "lr" }, "r31" },
3869 };
3870
3871void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3872                                     unsigned &NumAliases) const {
3873  Aliases = GCCRegAliases;
3874  NumAliases = llvm::array_lengthof(GCCRegAliases);
3875}
3876
3877
3878const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
3879#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3880#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3881                                              ALL_LANGUAGES },
3882#include "clang/Basic/BuiltinsHexagon.def"
3883};
3884}
3885
3886
3887namespace {
3888class SparcV8TargetInfo : public TargetInfo {
3889  static const TargetInfo::GCCRegAlias GCCRegAliases[];
3890  static const char * const GCCRegNames[];
3891  bool SoftFloat;
3892public:
3893  SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
3894    // FIXME: Support Sparc quad-precision long double?
3895    DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3896                        "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
3897  }
3898  virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
3899                                 StringRef Name,
3900                                 bool Enabled) const {
3901    if (Name == "soft-float")
3902      Features[Name] = Enabled;
3903    else
3904      return false;
3905
3906    return true;
3907  }
3908  virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
3909    SoftFloat = false;
3910    for (unsigned i = 0, e = Features.size(); i != e; ++i)
3911      if (Features[i] == "+soft-float")
3912        SoftFloat = true;
3913  }
3914  virtual void getTargetDefines(const LangOptions &Opts,
3915                                MacroBuilder &Builder) const {
3916    DefineStd(Builder, "sparc", Opts);
3917    Builder.defineMacro("__sparcv8");
3918    Builder.defineMacro("__REGISTER_PREFIX__", "");
3919
3920    if (SoftFloat)
3921      Builder.defineMacro("SOFT_FLOAT", "1");
3922  }
3923
3924  virtual bool hasFeature(StringRef Feature) const {
3925    return llvm::StringSwitch<bool>(Feature)
3926             .Case("softfloat", SoftFloat)
3927             .Case("sparc", true)
3928             .Default(false);
3929  }
3930
3931  virtual void getTargetBuiltins(const Builtin::Info *&Records,
3932                                 unsigned &NumRecords) const {
3933    // FIXME: Implement!
3934  }
3935  virtual BuiltinVaListKind getBuiltinVaListKind() const {
3936    return TargetInfo::VoidPtrBuiltinVaList;
3937  }
3938  virtual void getGCCRegNames(const char * const *&Names,
3939                              unsigned &NumNames) const;
3940  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3941                                unsigned &NumAliases) const;
3942  virtual bool validateAsmConstraint(const char *&Name,
3943                                     TargetInfo::ConstraintInfo &info) const {
3944    // FIXME: Implement!
3945    return false;
3946  }
3947  virtual const char *getClobbers() const {
3948    // FIXME: Implement!
3949    return "";
3950  }
3951};
3952
3953const char * const SparcV8TargetInfo::GCCRegNames[] = {
3954  "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3955  "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3956  "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3957  "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
3958};
3959
3960void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
3961                                       unsigned &NumNames) const {
3962  Names = GCCRegNames;
3963  NumNames = llvm::array_lengthof(GCCRegNames);
3964}
3965
3966const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
3967  { { "g0" }, "r0" },
3968  { { "g1" }, "r1" },
3969  { { "g2" }, "r2" },
3970  { { "g3" }, "r3" },
3971  { { "g4" }, "r4" },
3972  { { "g5" }, "r5" },
3973  { { "g6" }, "r6" },
3974  { { "g7" }, "r7" },
3975  { { "o0" }, "r8" },
3976  { { "o1" }, "r9" },
3977  { { "o2" }, "r10" },
3978  { { "o3" }, "r11" },
3979  { { "o4" }, "r12" },
3980  { { "o5" }, "r13" },
3981  { { "o6", "sp" }, "r14" },
3982  { { "o7" }, "r15" },
3983  { { "l0" }, "r16" },
3984  { { "l1" }, "r17" },
3985  { { "l2" }, "r18" },
3986  { { "l3" }, "r19" },
3987  { { "l4" }, "r20" },
3988  { { "l5" }, "r21" },
3989  { { "l6" }, "r22" },
3990  { { "l7" }, "r23" },
3991  { { "i0" }, "r24" },
3992  { { "i1" }, "r25" },
3993  { { "i2" }, "r26" },
3994  { { "i3" }, "r27" },
3995  { { "i4" }, "r28" },
3996  { { "i5" }, "r29" },
3997  { { "i6", "fp" }, "r30" },
3998  { { "i7" }, "r31" },
3999};
4000
4001void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4002                                         unsigned &NumAliases) const {
4003  Aliases = GCCRegAliases;
4004  NumAliases = llvm::array_lengthof(GCCRegAliases);
4005}
4006} // end anonymous namespace.
4007
4008namespace {
4009class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
4010public:
4011  AuroraUXSparcV8TargetInfo(const std::string& triple) :
4012      AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
4013    SizeType = UnsignedInt;
4014    PtrDiffType = SignedInt;
4015  }
4016};
4017class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
4018public:
4019  SolarisSparcV8TargetInfo(const std::string& triple) :
4020      SolarisTargetInfo<SparcV8TargetInfo>(triple) {
4021    SizeType = UnsignedInt;
4022    PtrDiffType = SignedInt;
4023  }
4024};
4025} // end anonymous namespace.
4026
4027namespace {
4028  class MSP430TargetInfo : public TargetInfo {
4029    static const char * const GCCRegNames[];
4030  public:
4031    MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
4032      BigEndian = false;
4033      TLSSupported = false;
4034      IntWidth = 16; IntAlign = 16;
4035      LongWidth = 32; LongLongWidth = 64;
4036      LongAlign = LongLongAlign = 16;
4037      PointerWidth = 16; PointerAlign = 16;
4038      SuitableAlign = 16;
4039      SizeType = UnsignedInt;
4040      IntMaxType = SignedLong;
4041      UIntMaxType = UnsignedLong;
4042      IntPtrType = SignedShort;
4043      PtrDiffType = SignedInt;
4044      SigAtomicType = SignedLong;
4045      DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
4046   }
4047    virtual void getTargetDefines(const LangOptions &Opts,
4048                                  MacroBuilder &Builder) const {
4049      Builder.defineMacro("MSP430");
4050      Builder.defineMacro("__MSP430__");
4051      // FIXME: defines for different 'flavours' of MCU
4052    }
4053    virtual void getTargetBuiltins(const Builtin::Info *&Records,
4054                                   unsigned &NumRecords) const {
4055     // FIXME: Implement.
4056      Records = 0;
4057      NumRecords = 0;
4058    }
4059    virtual bool hasFeature(StringRef Feature) const {
4060      return Feature == "msp430";
4061    }
4062    virtual void getGCCRegNames(const char * const *&Names,
4063                                unsigned &NumNames) const;
4064    virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4065                                  unsigned &NumAliases) const {
4066      // No aliases.
4067      Aliases = 0;
4068      NumAliases = 0;
4069    }
4070    virtual bool validateAsmConstraint(const char *&Name,
4071                                       TargetInfo::ConstraintInfo &info) const {
4072      // No target constraints for now.
4073      return false;
4074    }
4075    virtual const char *getClobbers() const {
4076      // FIXME: Is this really right?
4077      return "";
4078    }
4079    virtual BuiltinVaListKind getBuiltinVaListKind() const {
4080      // FIXME: implement
4081      return TargetInfo::CharPtrBuiltinVaList;
4082   }
4083  };
4084
4085  const char * const MSP430TargetInfo::GCCRegNames[] = {
4086    "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4087    "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
4088  };
4089
4090  void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
4091                                        unsigned &NumNames) const {
4092    Names = GCCRegNames;
4093    NumNames = llvm::array_lengthof(GCCRegNames);
4094  }
4095}
4096
4097namespace {
4098
4099  // LLVM and Clang cannot be used directly to output native binaries for
4100  // target, but is used to compile C code to llvm bitcode with correct
4101  // type and alignment information.
4102  //
4103  // TCE uses the llvm bitcode as input and uses it for generating customized
4104  // target processor and program binary. TCE co-design environment is
4105  // publicly available in http://tce.cs.tut.fi
4106
4107  static const unsigned TCEOpenCLAddrSpaceMap[] = {
4108      3, // opencl_global
4109      4, // opencl_local
4110      5, // opencl_constant
4111      0, // cuda_device
4112      0, // cuda_constant
4113      0  // cuda_shared
4114  };
4115
4116  class TCETargetInfo : public TargetInfo{
4117  public:
4118    TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
4119      TLSSupported = false;
4120      IntWidth = 32;
4121      LongWidth = LongLongWidth = 32;
4122      PointerWidth = 32;
4123      IntAlign = 32;
4124      LongAlign = LongLongAlign = 32;
4125      PointerAlign = 32;
4126      SuitableAlign = 32;
4127      SizeType = UnsignedInt;
4128      IntMaxType = SignedLong;
4129      UIntMaxType = UnsignedLong;
4130      IntPtrType = SignedInt;
4131      PtrDiffType = SignedInt;
4132      FloatWidth = 32;
4133      FloatAlign = 32;
4134      DoubleWidth = 32;
4135      DoubleAlign = 32;
4136      LongDoubleWidth = 32;
4137      LongDoubleAlign = 32;
4138      FloatFormat = &llvm::APFloat::IEEEsingle;
4139      DoubleFormat = &llvm::APFloat::IEEEsingle;
4140      LongDoubleFormat = &llvm::APFloat::IEEEsingle;
4141      DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
4142                          "i16:16:32-i32:32:32-i64:32:32-"
4143                          "f32:32:32-f64:32:32-v64:32:32-"
4144                          "v128:32:32-a0:0:32-n32";
4145      AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
4146    }
4147
4148    virtual void getTargetDefines(const LangOptions &Opts,
4149                                  MacroBuilder &Builder) const {
4150      DefineStd(Builder, "tce", Opts);
4151      Builder.defineMacro("__TCE__");
4152      Builder.defineMacro("__TCE_V1__");
4153    }
4154    virtual bool hasFeature(StringRef Feature) const {
4155      return Feature == "tce";
4156    }
4157
4158    virtual void getTargetBuiltins(const Builtin::Info *&Records,
4159                                   unsigned &NumRecords) const {}
4160    virtual const char *getClobbers() const {
4161      return "";
4162    }
4163    virtual BuiltinVaListKind getBuiltinVaListKind() const {
4164      return TargetInfo::VoidPtrBuiltinVaList;
4165    }
4166    virtual void getGCCRegNames(const char * const *&Names,
4167                                unsigned &NumNames) const {}
4168    virtual bool validateAsmConstraint(const char *&Name,
4169                                       TargetInfo::ConstraintInfo &info) const {
4170      return true;
4171    }
4172    virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4173                                  unsigned &NumAliases) const {}
4174  };
4175}
4176
4177namespace {
4178class MipsTargetInfoBase : public TargetInfo {
4179  static const Builtin::Info BuiltinInfo[];
4180  std::string CPU;
4181  bool IsMips16;
4182  enum MipsFloatABI {
4183    HardFloat, SingleFloat, SoftFloat
4184  } FloatABI;
4185  enum DspRevEnum {
4186    NoDSP, DSP1, DSP2
4187  } DspRev;
4188
4189protected:
4190  std::string ABI;
4191
4192public:
4193  MipsTargetInfoBase(const std::string& triple,
4194                     const std::string& ABIStr,
4195                     const std::string& CPUStr)
4196    : TargetInfo(triple),
4197      CPU(CPUStr),
4198      IsMips16(false),
4199      FloatABI(HardFloat),
4200      DspRev(NoDSP),
4201      ABI(ABIStr)
4202  {}
4203
4204  virtual const char *getABI() const { return ABI.c_str(); }
4205  virtual bool setABI(const std::string &Name) = 0;
4206  virtual bool setCPU(const std::string &Name) {
4207    CPU = Name;
4208    return true;
4209  }
4210  void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
4211    Features[ABI] = true;
4212    Features[CPU] = true;
4213  }
4214
4215  virtual void getTargetDefines(const LangOptions &Opts,
4216                                MacroBuilder &Builder) const {
4217    DefineStd(Builder, "mips", Opts);
4218    Builder.defineMacro("_mips");
4219    Builder.defineMacro("__REGISTER_PREFIX__", "");
4220
4221    switch (FloatABI) {
4222    case HardFloat:
4223      Builder.defineMacro("__mips_hard_float", Twine(1));
4224      break;
4225    case SingleFloat:
4226      Builder.defineMacro("__mips_hard_float", Twine(1));
4227      Builder.defineMacro("__mips_single_float", Twine(1));
4228      break;
4229    case SoftFloat:
4230      Builder.defineMacro("__mips_soft_float", Twine(1));
4231      break;
4232    }
4233
4234    if (IsMips16)
4235      Builder.defineMacro("__mips16", Twine(1));
4236
4237    switch (DspRev) {
4238    default:
4239      break;
4240    case DSP1:
4241      Builder.defineMacro("__mips_dsp_rev", Twine(1));
4242      Builder.defineMacro("__mips_dsp", Twine(1));
4243      break;
4244    case DSP2:
4245      Builder.defineMacro("__mips_dsp_rev", Twine(2));
4246      Builder.defineMacro("__mips_dspr2", Twine(1));
4247      Builder.defineMacro("__mips_dsp", Twine(1));
4248      break;
4249    }
4250
4251    Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
4252    Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
4253    Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
4254
4255    Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
4256    Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
4257  }
4258
4259  virtual void getTargetBuiltins(const Builtin::Info *&Records,
4260                                 unsigned &NumRecords) const {
4261    Records = BuiltinInfo;
4262    NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
4263  }
4264  virtual bool hasFeature(StringRef Feature) const {
4265    return Feature == "mips";
4266  }
4267  virtual BuiltinVaListKind getBuiltinVaListKind() const {
4268    return TargetInfo::VoidPtrBuiltinVaList;
4269  }
4270  virtual void getGCCRegNames(const char * const *&Names,
4271                              unsigned &NumNames) const {
4272    static const char * const GCCRegNames[] = {
4273      // CPU register names
4274      // Must match second column of GCCRegAliases
4275      "$0",   "$1",   "$2",   "$3",   "$4",   "$5",   "$6",   "$7",
4276      "$8",   "$9",   "$10",  "$11",  "$12",  "$13",  "$14",  "$15",
4277      "$16",  "$17",  "$18",  "$19",  "$20",  "$21",  "$22",  "$23",
4278      "$24",  "$25",  "$26",  "$27",  "$28",  "$29",  "$30",  "$31",
4279      // Floating point register names
4280      "$f0",  "$f1",  "$f2",  "$f3",  "$f4",  "$f5",  "$f6",  "$f7",
4281      "$f8",  "$f9",  "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
4282      "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
4283      "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
4284      // Hi/lo and condition register names
4285      "hi",   "lo",   "",     "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
4286      "$fcc5","$fcc6","$fcc7"
4287    };
4288    Names = GCCRegNames;
4289    NumNames = llvm::array_lengthof(GCCRegNames);
4290  }
4291  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4292                                unsigned &NumAliases) const = 0;
4293  virtual bool validateAsmConstraint(const char *&Name,
4294                                     TargetInfo::ConstraintInfo &Info) const {
4295    switch (*Name) {
4296    default:
4297      return false;
4298
4299    case 'r': // CPU registers.
4300    case 'd': // Equivalent to "r" unless generating MIPS16 code.
4301    case 'y': // Equivalent to "r", backwards compatibility only.
4302    case 'f': // floating-point registers.
4303    case 'c': // $25 for indirect jumps
4304    case 'l': // lo register
4305    case 'x': // hilo register pair
4306      Info.setAllowsRegister();
4307      return true;
4308    }
4309  }
4310
4311  virtual const char *getClobbers() const {
4312    // FIXME: Implement!
4313    return "";
4314  }
4315
4316  virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
4317                                 StringRef Name,
4318                                 bool Enabled) const {
4319    if (Name == "soft-float" || Name == "single-float" ||
4320        Name == "o32" || Name == "n32" || Name == "n64" || Name == "eabi" ||
4321        Name == "mips32" || Name == "mips32r2" ||
4322        Name == "mips64" || Name == "mips64r2" ||
4323        Name == "mips16" || Name == "dsp" || Name == "dspr2") {
4324      Features[Name] = Enabled;
4325      return true;
4326    }
4327    return false;
4328  }
4329
4330  virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
4331    IsMips16 = false;
4332    FloatABI = HardFloat;
4333    DspRev = NoDSP;
4334
4335    for (std::vector<std::string>::iterator it = Features.begin(),
4336         ie = Features.end(); it != ie; ++it) {
4337      if (*it == "+single-float")
4338        FloatABI = SingleFloat;
4339      else if (*it == "+soft-float")
4340        FloatABI = SoftFloat;
4341      else if (*it == "+mips16")
4342        IsMips16 = true;
4343      else if (*it == "+dsp")
4344        DspRev = std::max(DspRev, DSP1);
4345      else if (*it == "+dspr2")
4346        DspRev = std::max(DspRev, DSP2);
4347    }
4348
4349    // Remove front-end specific option.
4350    std::vector<std::string>::iterator it =
4351      std::find(Features.begin(), Features.end(), "+soft-float");
4352    if (it != Features.end())
4353      Features.erase(it);
4354  }
4355};
4356
4357const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
4358#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4359#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4360                                              ALL_LANGUAGES },
4361#include "clang/Basic/BuiltinsMips.def"
4362};
4363
4364class Mips32TargetInfoBase : public MipsTargetInfoBase {
4365public:
4366  Mips32TargetInfoBase(const std::string& triple) :
4367    MipsTargetInfoBase(triple, "o32", "mips32") {
4368    SizeType = UnsignedInt;
4369    PtrDiffType = SignedInt;
4370    MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
4371  }
4372  virtual bool setABI(const std::string &Name) {
4373    if ((Name == "o32") || (Name == "eabi")) {
4374      ABI = Name;
4375      return true;
4376    } else
4377      return false;
4378  }
4379  virtual void getTargetDefines(const LangOptions &Opts,
4380                                MacroBuilder &Builder) const {
4381    MipsTargetInfoBase::getTargetDefines(Opts, Builder);
4382
4383    if (ABI == "o32") {
4384      Builder.defineMacro("__mips_o32");
4385      Builder.defineMacro("_ABIO32", "1");
4386      Builder.defineMacro("_MIPS_SIM", "_ABIO32");
4387    }
4388    else if (ABI == "eabi")
4389      Builder.defineMacro("__mips_eabi");
4390    else
4391      llvm_unreachable("Invalid ABI for Mips32.");
4392  }
4393  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4394                                unsigned &NumAliases) const {
4395    static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
4396      { { "at" },  "$1" },
4397      { { "v0" },  "$2" },
4398      { { "v1" },  "$3" },
4399      { { "a0" },  "$4" },
4400      { { "a1" },  "$5" },
4401      { { "a2" },  "$6" },
4402      { { "a3" },  "$7" },
4403      { { "t0" },  "$8" },
4404      { { "t1" },  "$9" },
4405      { { "t2" }, "$10" },
4406      { { "t3" }, "$11" },
4407      { { "t4" }, "$12" },
4408      { { "t5" }, "$13" },
4409      { { "t6" }, "$14" },
4410      { { "t7" }, "$15" },
4411      { { "s0" }, "$16" },
4412      { { "s1" }, "$17" },
4413      { { "s2" }, "$18" },
4414      { { "s3" }, "$19" },
4415      { { "s4" }, "$20" },
4416      { { "s5" }, "$21" },
4417      { { "s6" }, "$22" },
4418      { { "s7" }, "$23" },
4419      { { "t8" }, "$24" },
4420      { { "t9" }, "$25" },
4421      { { "k0" }, "$26" },
4422      { { "k1" }, "$27" },
4423      { { "gp" }, "$28" },
4424      { { "sp","$sp" }, "$29" },
4425      { { "fp","$fp" }, "$30" },
4426      { { "ra" }, "$31" }
4427    };
4428    Aliases = GCCRegAliases;
4429    NumAliases = llvm::array_lengthof(GCCRegAliases);
4430  }
4431};
4432
4433class Mips32EBTargetInfo : public Mips32TargetInfoBase {
4434public:
4435  Mips32EBTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
4436    DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
4437                        "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S64";
4438  }
4439  virtual void getTargetDefines(const LangOptions &Opts,
4440                                MacroBuilder &Builder) const {
4441    DefineStd(Builder, "MIPSEB", Opts);
4442    Builder.defineMacro("_MIPSEB");
4443    Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
4444  }
4445};
4446
4447class Mips32ELTargetInfo : public Mips32TargetInfoBase {
4448public:
4449  Mips32ELTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
4450    BigEndian = false;
4451    DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
4452                        "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S64";
4453  }
4454  virtual void getTargetDefines(const LangOptions &Opts,
4455                                MacroBuilder &Builder) const {
4456    DefineStd(Builder, "MIPSEL", Opts);
4457    Builder.defineMacro("_MIPSEL");
4458    Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
4459  }
4460};
4461
4462class Mips64TargetInfoBase : public MipsTargetInfoBase {
4463  virtual void SetDescriptionString(const std::string &Name) = 0;
4464public:
4465  Mips64TargetInfoBase(const std::string& triple) :
4466    MipsTargetInfoBase(triple, "n64", "mips64") {
4467    LongWidth = LongAlign = 64;
4468    PointerWidth = PointerAlign = 64;
4469    LongDoubleWidth = LongDoubleAlign = 128;
4470    LongDoubleFormat = &llvm::APFloat::IEEEquad;
4471    if (getTriple().getOS() == llvm::Triple::FreeBSD) {
4472      LongDoubleWidth = LongDoubleAlign = 64;
4473      LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4474    }
4475    SuitableAlign = 128;
4476    MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
4477  }
4478  virtual bool setABI(const std::string &Name) {
4479    SetDescriptionString(Name);
4480
4481    if (Name != "n32" && Name != "n64")
4482      return false;
4483
4484    ABI = Name;
4485
4486    if (Name == "n32") {
4487      LongWidth = LongAlign = 32;
4488      PointerWidth = PointerAlign = 32;
4489    }
4490
4491    return true;
4492  }
4493  virtual void getTargetDefines(const LangOptions &Opts,
4494                                MacroBuilder &Builder) const {
4495    MipsTargetInfoBase::getTargetDefines(Opts, Builder);
4496
4497    Builder.defineMacro("__mips64");
4498    Builder.defineMacro("__mips64__");
4499
4500    if (ABI == "n32") {
4501      Builder.defineMacro("__mips_n32");
4502      Builder.defineMacro("_ABIN32", "2");
4503      Builder.defineMacro("_MIPS_SIM", "_ABIN32");
4504    }
4505    else if (ABI == "n64") {
4506      Builder.defineMacro("__mips_n64");
4507      Builder.defineMacro("_ABI64", "3");
4508      Builder.defineMacro("_MIPS_SIM", "_ABI64");
4509    }
4510    else
4511      llvm_unreachable("Invalid ABI for Mips64.");
4512  }
4513  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4514                                unsigned &NumAliases) const {
4515    static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
4516      { { "at" },  "$1" },
4517      { { "v0" },  "$2" },
4518      { { "v1" },  "$3" },
4519      { { "a0" },  "$4" },
4520      { { "a1" },  "$5" },
4521      { { "a2" },  "$6" },
4522      { { "a3" },  "$7" },
4523      { { "a4" },  "$8" },
4524      { { "a5" },  "$9" },
4525      { { "a6" }, "$10" },
4526      { { "a7" }, "$11" },
4527      { { "t0" }, "$12" },
4528      { { "t1" }, "$13" },
4529      { { "t2" }, "$14" },
4530      { { "t3" }, "$15" },
4531      { { "s0" }, "$16" },
4532      { { "s1" }, "$17" },
4533      { { "s2" }, "$18" },
4534      { { "s3" }, "$19" },
4535      { { "s4" }, "$20" },
4536      { { "s5" }, "$21" },
4537      { { "s6" }, "$22" },
4538      { { "s7" }, "$23" },
4539      { { "t8" }, "$24" },
4540      { { "t9" }, "$25" },
4541      { { "k0" }, "$26" },
4542      { { "k1" }, "$27" },
4543      { { "gp" }, "$28" },
4544      { { "sp","$sp" }, "$29" },
4545      { { "fp","$fp" }, "$30" },
4546      { { "ra" }, "$31" }
4547    };
4548    Aliases = GCCRegAliases;
4549    NumAliases = llvm::array_lengthof(GCCRegAliases);
4550  }
4551};
4552
4553class Mips64EBTargetInfo : public Mips64TargetInfoBase {
4554  virtual void SetDescriptionString(const std::string &Name) {
4555    // Change DescriptionString only if ABI is n32.
4556    if (Name == "n32")
4557      DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
4558                          "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
4559                          "v64:64:64-n32:64-S128";
4560  }
4561public:
4562  Mips64EBTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
4563    // Default ABI is n64.
4564    DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
4565                        "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
4566                        "v64:64:64-n32:64-S128";
4567  }
4568  virtual void getTargetDefines(const LangOptions &Opts,
4569                                MacroBuilder &Builder) const {
4570    DefineStd(Builder, "MIPSEB", Opts);
4571    Builder.defineMacro("_MIPSEB");
4572    Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
4573  }
4574};
4575
4576class Mips64ELTargetInfo : public Mips64TargetInfoBase {
4577  virtual void SetDescriptionString(const std::string &Name) {
4578    // Change DescriptionString only if ABI is n32.
4579    if (Name == "n32")
4580      DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
4581                          "i64:64:64-f32:32:32-f64:64:64-f128:128:128"
4582                          "-v64:64:64-n32:64-S128";
4583  }
4584public:
4585  Mips64ELTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
4586    // Default ABI is n64.
4587    BigEndian = false;
4588    DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
4589                        "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
4590                        "v64:64:64-n32:64-S128";
4591  }
4592  virtual void getTargetDefines(const LangOptions &Opts,
4593                                MacroBuilder &Builder) const {
4594    DefineStd(Builder, "MIPSEL", Opts);
4595    Builder.defineMacro("_MIPSEL");
4596    Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
4597  }
4598};
4599} // end anonymous namespace.
4600
4601namespace {
4602class PNaClTargetInfo : public TargetInfo {
4603public:
4604  PNaClTargetInfo(const std::string& triple) : TargetInfo(triple) {
4605    BigEndian = false;
4606    this->UserLabelPrefix = "";
4607    this->LongAlign = 32;
4608    this->LongWidth = 32;
4609    this->PointerAlign = 32;
4610    this->PointerWidth = 32;
4611    this->IntMaxType = TargetInfo::SignedLongLong;
4612    this->UIntMaxType = TargetInfo::UnsignedLongLong;
4613    this->Int64Type = TargetInfo::SignedLongLong;
4614    this->DoubleAlign = 64;
4615    this->LongDoubleWidth = 64;
4616    this->LongDoubleAlign = 64;
4617    this->SizeType = TargetInfo::UnsignedInt;
4618    this->PtrDiffType = TargetInfo::SignedInt;
4619    this->IntPtrType = TargetInfo::SignedInt;
4620    this->RegParmMax = 2;
4621    DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
4622                        "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
4623  }
4624
4625  void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
4626  }
4627  virtual void getArchDefines(const LangOptions &Opts,
4628                              MacroBuilder &Builder) const {
4629    Builder.defineMacro("__le32__");
4630    Builder.defineMacro("__pnacl__");
4631  }
4632  virtual void getTargetDefines(const LangOptions &Opts,
4633                                MacroBuilder &Builder) const {
4634    Builder.defineMacro("__LITTLE_ENDIAN__");
4635    getArchDefines(Opts, Builder);
4636  }
4637  virtual bool hasFeature(StringRef Feature) const {
4638    return Feature == "pnacl";
4639  }
4640  virtual void getTargetBuiltins(const Builtin::Info *&Records,
4641                                 unsigned &NumRecords) const {
4642  }
4643  virtual BuiltinVaListKind getBuiltinVaListKind() const {
4644    return TargetInfo::PNaClABIBuiltinVaList;
4645  }
4646  virtual void getGCCRegNames(const char * const *&Names,
4647                              unsigned &NumNames) const;
4648  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4649                                unsigned &NumAliases) const;
4650  virtual bool validateAsmConstraint(const char *&Name,
4651                                     TargetInfo::ConstraintInfo &Info) const {
4652    return false;
4653  }
4654
4655  virtual const char *getClobbers() const {
4656    return "";
4657  }
4658};
4659
4660void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
4661                                     unsigned &NumNames) const {
4662  Names = NULL;
4663  NumNames = 0;
4664}
4665
4666void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4667                                       unsigned &NumAliases) const {
4668  Aliases = NULL;
4669  NumAliases = 0;
4670}
4671} // end anonymous namespace.
4672
4673namespace {
4674  static const unsigned SPIRAddrSpaceMap[] = {
4675    1,    // opencl_global
4676    3,    // opencl_local
4677    2,    // opencl_constant
4678    0,    // cuda_device
4679    0,    // cuda_constant
4680    0     // cuda_shared
4681  };
4682  class SPIRTargetInfo : public TargetInfo {
4683    static const char * const GCCRegNames[];
4684    static const Builtin::Info BuiltinInfo[];
4685    std::vector<StringRef> AvailableFeatures;
4686  public:
4687    SPIRTargetInfo(const std::string& triple) : TargetInfo(triple) {
4688      assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
4689        "SPIR target must use unknown OS");
4690      assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
4691        "SPIR target must use unknown environment type");
4692      BigEndian = false;
4693      TLSSupported = false;
4694      LongWidth = LongAlign = 64;
4695      AddrSpaceMap = &SPIRAddrSpaceMap;
4696      // Define available target features
4697      // These must be defined in sorted order!
4698      NoAsmVariants = true;
4699    }
4700    virtual void getTargetDefines(const LangOptions &Opts,
4701                                  MacroBuilder &Builder) const {
4702      DefineStd(Builder, "SPIR", Opts);
4703    }
4704    virtual bool hasFeature(StringRef Feature) const {
4705      return Feature == "spir";
4706    }
4707
4708    virtual void getTargetBuiltins(const Builtin::Info *&Records,
4709                                   unsigned &NumRecords) const {}
4710    virtual const char *getClobbers() const {
4711      return "";
4712    }
4713    virtual void getGCCRegNames(const char * const *&Names,
4714                                unsigned &NumNames) const {}
4715    virtual bool validateAsmConstraint(const char *&Name,
4716                                       TargetInfo::ConstraintInfo &info) const {
4717      return true;
4718    }
4719    virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4720                                  unsigned &NumAliases) const {}
4721    virtual BuiltinVaListKind getBuiltinVaListKind() const {
4722      return TargetInfo::VoidPtrBuiltinVaList;
4723    }
4724  };
4725
4726
4727  class SPIR32TargetInfo : public SPIRTargetInfo {
4728  public:
4729    SPIR32TargetInfo(const std::string& triple) : SPIRTargetInfo(triple) {
4730      PointerWidth = PointerAlign = 32;
4731      SizeType     = TargetInfo::UnsignedInt;
4732      PtrDiffType = IntPtrType = TargetInfo::SignedInt;
4733      DescriptionString
4734        = "p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
4735          "f32:32:32-f64:64:64-v16:16:16-v24:32:32-v32:32:32-v48:64:64-"
4736          "v64:64:64-v96:128:128-v128:128:128-v192:256:256-v256:256:256-"
4737          "v512:512:512-v1024:1024:1024";
4738  }
4739  };
4740
4741  class SPIR64TargetInfo : public SPIRTargetInfo {
4742  public:
4743    SPIR64TargetInfo(const std::string& triple) : SPIRTargetInfo(triple) {
4744      PointerWidth = PointerAlign = 64;
4745      SizeType     = TargetInfo::UnsignedLong;
4746      PtrDiffType = IntPtrType = TargetInfo::SignedLong;
4747      DescriptionString
4748        = "p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
4749          "f32:32:32-f64:64:64-v16:16:16-v24:32:32-v32:32:32-v48:64:64-"
4750          "v64:64:64-v96:128:128-v128:128:128-v192:256:256-v256:256:256-"
4751          "v512:512:512-v1024:1024:1024";
4752  }
4753  };
4754}
4755
4756
4757//===----------------------------------------------------------------------===//
4758// Driver code
4759//===----------------------------------------------------------------------===//
4760
4761static TargetInfo *AllocateTarget(const std::string &T) {
4762  llvm::Triple Triple(T);
4763  llvm::Triple::OSType os = Triple.getOS();
4764
4765  switch (Triple.getArch()) {
4766  default:
4767    return NULL;
4768
4769  case llvm::Triple::hexagon:
4770    return new HexagonTargetInfo(T);
4771
4772  case llvm::Triple::aarch64:
4773    switch (os) {
4774    case llvm::Triple::Linux:
4775      return new LinuxTargetInfo<AArch64TargetInfo>(T);
4776    default:
4777      return new AArch64TargetInfo(T);
4778    }
4779
4780  case llvm::Triple::arm:
4781  case llvm::Triple::thumb:
4782    if (Triple.isOSDarwin())
4783      return new DarwinARMTargetInfo(T);
4784
4785    switch (os) {
4786    case llvm::Triple::Linux:
4787      return new LinuxTargetInfo<ARMTargetInfo>(T);
4788    case llvm::Triple::FreeBSD:
4789      return new FreeBSDTargetInfo<ARMTargetInfo>(T);
4790    case llvm::Triple::NetBSD:
4791      return new NetBSDTargetInfo<ARMTargetInfo>(T);
4792    case llvm::Triple::OpenBSD:
4793      return new OpenBSDTargetInfo<ARMTargetInfo>(T);
4794    case llvm::Triple::Bitrig:
4795      return new BitrigTargetInfo<ARMTargetInfo>(T);
4796    case llvm::Triple::RTEMS:
4797      return new RTEMSTargetInfo<ARMTargetInfo>(T);
4798    case llvm::Triple::NaCl:
4799      return new NaClTargetInfo<ARMTargetInfo>(T);
4800    default:
4801      return new ARMTargetInfo(T);
4802    }
4803
4804  case llvm::Triple::msp430:
4805    return new MSP430TargetInfo(T);
4806
4807  case llvm::Triple::mips:
4808    switch (os) {
4809    case llvm::Triple::Linux:
4810      return new LinuxTargetInfo<Mips32EBTargetInfo>(T);
4811    case llvm::Triple::RTEMS:
4812      return new RTEMSTargetInfo<Mips32EBTargetInfo>(T);
4813    case llvm::Triple::FreeBSD:
4814      return new FreeBSDTargetInfo<Mips32EBTargetInfo>(T);
4815    case llvm::Triple::NetBSD:
4816      return new NetBSDTargetInfo<Mips32EBTargetInfo>(T);
4817    default:
4818      return new Mips32EBTargetInfo(T);
4819    }
4820
4821  case llvm::Triple::mipsel:
4822    switch (os) {
4823    case llvm::Triple::Linux:
4824      return new LinuxTargetInfo<Mips32ELTargetInfo>(T);
4825    case llvm::Triple::RTEMS:
4826      return new RTEMSTargetInfo<Mips32ELTargetInfo>(T);
4827    case llvm::Triple::FreeBSD:
4828      return new FreeBSDTargetInfo<Mips32ELTargetInfo>(T);
4829    case llvm::Triple::NetBSD:
4830      return new NetBSDTargetInfo<Mips32ELTargetInfo>(T);
4831    default:
4832      return new Mips32ELTargetInfo(T);
4833    }
4834
4835  case llvm::Triple::mips64:
4836    switch (os) {
4837    case llvm::Triple::Linux:
4838      return new LinuxTargetInfo<Mips64EBTargetInfo>(T);
4839    case llvm::Triple::RTEMS:
4840      return new RTEMSTargetInfo<Mips64EBTargetInfo>(T);
4841    case llvm::Triple::FreeBSD:
4842      return new FreeBSDTargetInfo<Mips64EBTargetInfo>(T);
4843    case llvm::Triple::NetBSD:
4844      return new NetBSDTargetInfo<Mips64EBTargetInfo>(T);
4845    case llvm::Triple::OpenBSD:
4846      return new OpenBSDTargetInfo<Mips64EBTargetInfo>(T);
4847    default:
4848      return new Mips64EBTargetInfo(T);
4849    }
4850
4851  case llvm::Triple::mips64el:
4852    switch (os) {
4853    case llvm::Triple::Linux:
4854      return new LinuxTargetInfo<Mips64ELTargetInfo>(T);
4855    case llvm::Triple::RTEMS:
4856      return new RTEMSTargetInfo<Mips64ELTargetInfo>(T);
4857    case llvm::Triple::FreeBSD:
4858      return new FreeBSDTargetInfo<Mips64ELTargetInfo>(T);
4859    case llvm::Triple::NetBSD:
4860      return new NetBSDTargetInfo<Mips64ELTargetInfo>(T);
4861    case llvm::Triple::OpenBSD:
4862      return new OpenBSDTargetInfo<Mips64ELTargetInfo>(T);
4863    default:
4864      return new Mips64ELTargetInfo(T);
4865    }
4866
4867  case llvm::Triple::le32:
4868    switch (os) {
4869      case llvm::Triple::NaCl:
4870        return new NaClTargetInfo<PNaClTargetInfo>(T);
4871      default:
4872        return NULL;
4873    }
4874
4875  case llvm::Triple::ppc:
4876    if (Triple.isOSDarwin())
4877      return new DarwinPPC32TargetInfo(T);
4878    switch (os) {
4879    case llvm::Triple::Linux:
4880      return new LinuxTargetInfo<PPC32TargetInfo>(T);
4881    case llvm::Triple::FreeBSD:
4882      return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
4883    case llvm::Triple::NetBSD:
4884      return new NetBSDTargetInfo<PPC32TargetInfo>(T);
4885    case llvm::Triple::OpenBSD:
4886      return new OpenBSDTargetInfo<PPC32TargetInfo>(T);
4887    case llvm::Triple::RTEMS:
4888      return new RTEMSTargetInfo<PPC32TargetInfo>(T);
4889    default:
4890      return new PPC32TargetInfo(T);
4891    }
4892
4893  case llvm::Triple::ppc64:
4894    if (Triple.isOSDarwin())
4895      return new DarwinPPC64TargetInfo(T);
4896    switch (os) {
4897    case llvm::Triple::Linux:
4898      return new LinuxTargetInfo<PPC64TargetInfo>(T);
4899    case llvm::Triple::Lv2:
4900      return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
4901    case llvm::Triple::FreeBSD:
4902      return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
4903    case llvm::Triple::NetBSD:
4904      return new NetBSDTargetInfo<PPC64TargetInfo>(T);
4905    default:
4906      return new PPC64TargetInfo(T);
4907    }
4908
4909  case llvm::Triple::nvptx:
4910    return new NVPTX32TargetInfo(T);
4911  case llvm::Triple::nvptx64:
4912    return new NVPTX64TargetInfo(T);
4913
4914  case llvm::Triple::mblaze:
4915    return new MBlazeTargetInfo(T);
4916
4917  case llvm::Triple::r600:
4918    return new R600TargetInfo(T);
4919
4920  case llvm::Triple::sparc:
4921    switch (os) {
4922    case llvm::Triple::Linux:
4923      return new LinuxTargetInfo<SparcV8TargetInfo>(T);
4924    case llvm::Triple::AuroraUX:
4925      return new AuroraUXSparcV8TargetInfo(T);
4926    case llvm::Triple::Solaris:
4927      return new SolarisSparcV8TargetInfo(T);
4928    case llvm::Triple::NetBSD:
4929      return new NetBSDTargetInfo<SparcV8TargetInfo>(T);
4930    case llvm::Triple::OpenBSD:
4931      return new OpenBSDTargetInfo<SparcV8TargetInfo>(T);
4932    case llvm::Triple::RTEMS:
4933      return new RTEMSTargetInfo<SparcV8TargetInfo>(T);
4934    default:
4935      return new SparcV8TargetInfo(T);
4936    }
4937
4938  case llvm::Triple::tce:
4939    return new TCETargetInfo(T);
4940
4941  case llvm::Triple::x86:
4942    if (Triple.isOSDarwin())
4943      return new DarwinI386TargetInfo(T);
4944
4945    switch (os) {
4946    case llvm::Triple::AuroraUX:
4947      return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
4948    case llvm::Triple::Linux:
4949      return new LinuxTargetInfo<X86_32TargetInfo>(T);
4950    case llvm::Triple::DragonFly:
4951      return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
4952    case llvm::Triple::NetBSD:
4953      return new NetBSDI386TargetInfo(T);
4954    case llvm::Triple::OpenBSD:
4955      return new OpenBSDI386TargetInfo(T);
4956    case llvm::Triple::Bitrig:
4957      return new BitrigI386TargetInfo(T);
4958    case llvm::Triple::FreeBSD:
4959      return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
4960    case llvm::Triple::Minix:
4961      return new MinixTargetInfo<X86_32TargetInfo>(T);
4962    case llvm::Triple::Solaris:
4963      return new SolarisTargetInfo<X86_32TargetInfo>(T);
4964    case llvm::Triple::Cygwin:
4965      return new CygwinX86_32TargetInfo(T);
4966    case llvm::Triple::MinGW32:
4967      return new MinGWX86_32TargetInfo(T);
4968    case llvm::Triple::Win32:
4969      return new VisualStudioWindowsX86_32TargetInfo(T);
4970    case llvm::Triple::Haiku:
4971      return new HaikuX86_32TargetInfo(T);
4972    case llvm::Triple::RTEMS:
4973      return new RTEMSX86_32TargetInfo(T);
4974    case llvm::Triple::NaCl:
4975      return new NaClTargetInfo<X86_32TargetInfo>(T);
4976    default:
4977      return new X86_32TargetInfo(T);
4978    }
4979
4980  case llvm::Triple::x86_64:
4981    if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
4982      return new DarwinX86_64TargetInfo(T);
4983
4984    switch (os) {
4985    case llvm::Triple::AuroraUX:
4986      return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
4987    case llvm::Triple::Linux:
4988      return new LinuxTargetInfo<X86_64TargetInfo>(T);
4989    case llvm::Triple::DragonFly:
4990      return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
4991    case llvm::Triple::NetBSD:
4992      return new NetBSDTargetInfo<X86_64TargetInfo>(T);
4993    case llvm::Triple::OpenBSD:
4994      return new OpenBSDX86_64TargetInfo(T);
4995    case llvm::Triple::Bitrig:
4996      return new BitrigX86_64TargetInfo(T);
4997    case llvm::Triple::FreeBSD:
4998      return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
4999    case llvm::Triple::Solaris:
5000      return new SolarisTargetInfo<X86_64TargetInfo>(T);
5001    case llvm::Triple::MinGW32:
5002      return new MinGWX86_64TargetInfo(T);
5003    case llvm::Triple::Win32:   // This is what Triple.h supports now.
5004      return new VisualStudioWindowsX86_64TargetInfo(T);
5005    case llvm::Triple::NaCl:
5006      return new NaClTargetInfo<X86_64TargetInfo>(T);
5007    default:
5008      return new X86_64TargetInfo(T);
5009    }
5010
5011    case llvm::Triple::spir: {
5012      llvm::Triple Triple(T);
5013      if (Triple.getOS() != llvm::Triple::UnknownOS ||
5014        Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
5015        return NULL;
5016      return new SPIR32TargetInfo(T);
5017    }
5018    case llvm::Triple::spir64: {
5019      llvm::Triple Triple(T);
5020      if (Triple.getOS() != llvm::Triple::UnknownOS ||
5021        Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
5022        return NULL;
5023      return new SPIR64TargetInfo(T);
5024    }
5025  }
5026}
5027
5028/// CreateTargetInfo - Return the target info object for the specified target
5029/// triple.
5030TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
5031                                         TargetOptions *Opts) {
5032  llvm::Triple Triple(Opts->Triple);
5033
5034  // Construct the target
5035  OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
5036  if (!Target) {
5037    Diags.Report(diag::err_target_unknown_triple) << Triple.str();
5038    return 0;
5039  }
5040  Target->setTargetOpts(Opts);
5041
5042  // Set the target CPU if specified.
5043  if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
5044    Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
5045    return 0;
5046  }
5047
5048  // Set the target ABI if specified.
5049  if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
5050    Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
5051    return 0;
5052  }
5053
5054  // Set the target C++ ABI.
5055  if (!Opts->CXXABI.empty() && !Target->setCXXABI(Opts->CXXABI)) {
5056    Diags.Report(diag::err_target_unknown_cxxabi) << Opts->CXXABI;
5057    return 0;
5058  }
5059
5060  // Compute the default target features, we need the target to handle this
5061  // because features may have dependencies on one another.
5062  llvm::StringMap<bool> Features;
5063  Target->getDefaultFeatures(Features);
5064
5065  // Apply the user specified deltas.
5066  // First the enables.
5067  for (std::vector<std::string>::const_iterator
5068         it = Opts->FeaturesAsWritten.begin(),
5069         ie = Opts->FeaturesAsWritten.end();
5070       it != ie; ++it) {
5071    const char *Name = it->c_str();
5072
5073    if (Name[0] != '+')
5074      continue;
5075
5076    // Apply the feature via the target.
5077    if (!Target->setFeatureEnabled(Features, Name + 1, true)) {
5078      Diags.Report(diag::err_target_invalid_feature) << Name;
5079      return 0;
5080    }
5081  }
5082
5083  // Then the disables.
5084  for (std::vector<std::string>::const_iterator
5085         it = Opts->FeaturesAsWritten.begin(),
5086         ie = Opts->FeaturesAsWritten.end();
5087       it != ie; ++it) {
5088    const char *Name = it->c_str();
5089
5090    if (Name[0] == '+')
5091      continue;
5092
5093    // Apply the feature via the target.
5094    if (Name[0] != '-' ||
5095        !Target->setFeatureEnabled(Features, Name + 1, false)) {
5096      Diags.Report(diag::err_target_invalid_feature) << Name;
5097      return 0;
5098    }
5099  }
5100
5101  // Add the features to the compile options.
5102  //
5103  // FIXME: If we are completely confident that we have the right set, we only
5104  // need to pass the minuses.
5105  Opts->Features.clear();
5106  for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
5107         ie = Features.end(); it != ie; ++it)
5108    Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
5109  Target->HandleTargetFeatures(Opts->Features);
5110
5111  return Target.take();
5112}
5113