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