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