Targets.cpp revision 70d9b16e951db66152a1d5ecd723edab01267514
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 PTXAddrSpaceMap[] = {
950    0,    // opencl_global
951    4,    // opencl_local
952    1     // opencl_constant
953  };
954  class PTXTargetInfo : public TargetInfo {
955    static const char * const GCCRegNames[];
956    static const Builtin::Info BuiltinInfo[];
957    std::vector<llvm::StringRef> AvailableFeatures;
958  public:
959    PTXTargetInfo(const std::string& triple) : TargetInfo(triple) {
960      BigEndian = false;
961      TLSSupported = false;
962      LongWidth = LongAlign = 64;
963      AddrSpaceMap = &PTXAddrSpaceMap;
964      // Define available target features
965      // These must be defined in sorted order!
966      AvailableFeatures.push_back("compute10");
967      AvailableFeatures.push_back("compute11");
968      AvailableFeatures.push_back("compute12");
969      AvailableFeatures.push_back("compute13");
970      AvailableFeatures.push_back("compute20");
971      AvailableFeatures.push_back("double");
972      AvailableFeatures.push_back("no-fma");
973      AvailableFeatures.push_back("ptx20");
974      AvailableFeatures.push_back("ptx21");
975      AvailableFeatures.push_back("ptx22");
976      AvailableFeatures.push_back("ptx23");
977      AvailableFeatures.push_back("sm10");
978      AvailableFeatures.push_back("sm11");
979      AvailableFeatures.push_back("sm12");
980      AvailableFeatures.push_back("sm13");
981      AvailableFeatures.push_back("sm20");
982      AvailableFeatures.push_back("sm21");
983      AvailableFeatures.push_back("sm22");
984      AvailableFeatures.push_back("sm23");
985    }
986    virtual void getTargetDefines(const LangOptions &Opts,
987                                  MacroBuilder &Builder) const {
988      Builder.defineMacro("__PTX__");
989    }
990    virtual void getTargetBuiltins(const Builtin::Info *&Records,
991                                   unsigned &NumRecords) const {
992      Records = BuiltinInfo;
993      NumRecords = clang::PTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
994    }
995    virtual bool hasFeature(StringRef Feature) const {
996      return Feature == "ptx";
997    }
998
999    virtual void getGCCRegNames(const char * const *&Names,
1000                                unsigned &NumNames) const;
1001    virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1002                                  unsigned &NumAliases) const {
1003      // No aliases.
1004      Aliases = 0;
1005      NumAliases = 0;
1006    }
1007    virtual bool validateAsmConstraint(const char *&Name,
1008                                       TargetInfo::ConstraintInfo &info) const {
1009      // FIXME: implement
1010      return true;
1011    }
1012    virtual const char *getClobbers() const {
1013      // FIXME: Is this really right?
1014      return "";
1015    }
1016    virtual const char *getVAListDeclaration() const {
1017      // FIXME: implement
1018      return "typedef char* __builtin_va_list;";
1019    }
1020
1021    virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1022                                   StringRef Name,
1023                                   bool Enabled) const;
1024  };
1025
1026  const Builtin::Info PTXTargetInfo::BuiltinInfo[] = {
1027#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1028#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1029                                              ALL_LANGUAGES },
1030#include "clang/Basic/BuiltinsPTX.def"
1031  };
1032
1033  const char * const PTXTargetInfo::GCCRegNames[] = {
1034    "r0"
1035  };
1036
1037  void PTXTargetInfo::getGCCRegNames(const char * const *&Names,
1038                                     unsigned &NumNames) const {
1039    Names = GCCRegNames;
1040    NumNames = llvm::array_lengthof(GCCRegNames);
1041  }
1042
1043  bool PTXTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1044                                        StringRef Name,
1045                                        bool Enabled) const {
1046    if(std::binary_search(AvailableFeatures.begin(), AvailableFeatures.end(),
1047                          Name)) {
1048      Features[Name] = Enabled;
1049      return true;
1050    } else {
1051      return false;
1052    }
1053  }
1054
1055  class PTX32TargetInfo : public PTXTargetInfo {
1056  public:
1057  PTX32TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
1058      PointerWidth = PointerAlign = 32;
1059      SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
1060      DescriptionString
1061        = "e-p:32:32-i64:64:64-f64:64:64-n1:8:16:32:64";
1062    }
1063  };
1064
1065  class PTX64TargetInfo : public PTXTargetInfo {
1066  public:
1067  PTX64TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
1068      PointerWidth = PointerAlign = 64;
1069      SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
1070      DescriptionString
1071        = "e-p:64:64-i64:64:64-f64:64:64-n1:8:16:32:64";
1072    }
1073  };
1074}
1075
1076namespace {
1077// MBlaze abstract base class
1078class MBlazeTargetInfo : public TargetInfo {
1079  static const char * const GCCRegNames[];
1080  static const TargetInfo::GCCRegAlias GCCRegAliases[];
1081
1082public:
1083  MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
1084    DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
1085  }
1086
1087  virtual void getTargetBuiltins(const Builtin::Info *&Records,
1088                                 unsigned &NumRecords) const {
1089    // FIXME: Implement.
1090    Records = 0;
1091    NumRecords = 0;
1092  }
1093
1094  virtual void getTargetDefines(const LangOptions &Opts,
1095                                MacroBuilder &Builder) const;
1096
1097  virtual bool hasFeature(StringRef Feature) const {
1098    return Feature == "mblaze";
1099  }
1100
1101  virtual const char *getVAListDeclaration() const {
1102    return "typedef char* __builtin_va_list;";
1103  }
1104  virtual const char *getTargetPrefix() const {
1105    return "mblaze";
1106  }
1107  virtual void getGCCRegNames(const char * const *&Names,
1108                              unsigned &NumNames) const;
1109  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1110                                unsigned &NumAliases) const;
1111  virtual bool validateAsmConstraint(const char *&Name,
1112                                     TargetInfo::ConstraintInfo &Info) const {
1113    switch (*Name) {
1114    default: return false;
1115    case 'O': // Zero
1116      return true;
1117    case 'b': // Base register
1118    case 'f': // Floating point register
1119      Info.setAllowsRegister();
1120      return true;
1121    }
1122  }
1123  virtual const char *getClobbers() const {
1124    return "";
1125  }
1126};
1127
1128/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
1129/// #defines that are not tied to a specific subtarget.
1130void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
1131                                     MacroBuilder &Builder) const {
1132  // Target identification.
1133  Builder.defineMacro("__microblaze__");
1134  Builder.defineMacro("_ARCH_MICROBLAZE");
1135  Builder.defineMacro("__MICROBLAZE__");
1136
1137  // Target properties.
1138  Builder.defineMacro("_BIG_ENDIAN");
1139  Builder.defineMacro("__BIG_ENDIAN__");
1140
1141  // Subtarget options.
1142  Builder.defineMacro("__REGISTER_PREFIX__", "");
1143}
1144
1145
1146const char * const MBlazeTargetInfo::GCCRegNames[] = {
1147  "r0",   "r1",   "r2",   "r3",   "r4",   "r5",   "r6",   "r7",
1148  "r8",   "r9",   "r10",  "r11",  "r12",  "r13",  "r14",  "r15",
1149  "r16",  "r17",  "r18",  "r19",  "r20",  "r21",  "r22",  "r23",
1150  "r24",  "r25",  "r26",  "r27",  "r28",  "r29",  "r30",  "r31",
1151  "$f0",  "$f1",  "$f2",  "$f3",  "$f4",  "$f5",  "$f6",  "$f7",
1152  "$f8",  "$f9",  "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
1153  "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
1154  "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
1155  "hi",   "lo",   "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
1156  "$fcc5","$fcc6","$fcc7","$ap",  "$rap", "$frp"
1157};
1158
1159void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
1160                                   unsigned &NumNames) const {
1161  Names = GCCRegNames;
1162  NumNames = llvm::array_lengthof(GCCRegNames);
1163}
1164
1165const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
1166  { {"f0"},  "r0" },
1167  { {"f1"},  "r1" },
1168  { {"f2"},  "r2" },
1169  { {"f3"},  "r3" },
1170  { {"f4"},  "r4" },
1171  { {"f5"},  "r5" },
1172  { {"f6"},  "r6" },
1173  { {"f7"},  "r7" },
1174  { {"f8"},  "r8" },
1175  { {"f9"},  "r9" },
1176  { {"f10"}, "r10" },
1177  { {"f11"}, "r11" },
1178  { {"f12"}, "r12" },
1179  { {"f13"}, "r13" },
1180  { {"f14"}, "r14" },
1181  { {"f15"}, "r15" },
1182  { {"f16"}, "r16" },
1183  { {"f17"}, "r17" },
1184  { {"f18"}, "r18" },
1185  { {"f19"}, "r19" },
1186  { {"f20"}, "r20" },
1187  { {"f21"}, "r21" },
1188  { {"f22"}, "r22" },
1189  { {"f23"}, "r23" },
1190  { {"f24"}, "r24" },
1191  { {"f25"}, "r25" },
1192  { {"f26"}, "r26" },
1193  { {"f27"}, "r27" },
1194  { {"f28"}, "r28" },
1195  { {"f29"}, "r29" },
1196  { {"f30"}, "r30" },
1197  { {"f31"}, "r31" },
1198};
1199
1200void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1201                                     unsigned &NumAliases) const {
1202  Aliases = GCCRegAliases;
1203  NumAliases = llvm::array_lengthof(GCCRegAliases);
1204}
1205} // end anonymous namespace.
1206
1207namespace {
1208// Namespace for x86 abstract base class
1209const Builtin::Info BuiltinInfo[] = {
1210#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1211#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1212                                              ALL_LANGUAGES },
1213#include "clang/Basic/BuiltinsX86.def"
1214};
1215
1216static const char* const GCCRegNames[] = {
1217  "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1218  "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
1219  "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
1220  "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1221  "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1222  "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1223  "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
1224  "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1225  "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
1226};
1227
1228const TargetInfo::AddlRegName AddlRegNames[] = {
1229  { { "al", "ah", "eax", "rax" }, 0 },
1230  { { "bl", "bh", "ebx", "rbx" }, 3 },
1231  { { "cl", "ch", "ecx", "rcx" }, 2 },
1232  { { "dl", "dh", "edx", "rdx" }, 1 },
1233  { { "esi", "rsi" }, 4 },
1234  { { "edi", "rdi" }, 5 },
1235  { { "esp", "rsp" }, 7 },
1236  { { "ebp", "rbp" }, 6 },
1237};
1238
1239// X86 target abstract base class; x86-32 and x86-64 are very close, so
1240// most of the implementation can be shared.
1241class X86TargetInfo : public TargetInfo {
1242  enum X86SSEEnum {
1243    NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2
1244  } SSELevel;
1245  enum MMX3DNowEnum {
1246    NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1247  } MMX3DNowLevel;
1248
1249  bool HasAES;
1250  bool HasLZCNT;
1251  bool HasBMI;
1252  bool HasBMI2;
1253  bool HasPOPCNT;
1254  bool HasFMA4;
1255
1256  /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1257  ///
1258  /// Each enumeration represents a particular CPU supported by Clang. These
1259  /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1260  enum CPUKind {
1261    CK_Generic,
1262
1263    /// \name i386
1264    /// i386-generation processors.
1265    //@{
1266    CK_i386,
1267    //@}
1268
1269    /// \name i486
1270    /// i486-generation processors.
1271    //@{
1272    CK_i486,
1273    CK_WinChipC6,
1274    CK_WinChip2,
1275    CK_C3,
1276    //@}
1277
1278    /// \name i586
1279    /// i586-generation processors, P5 microarchitecture based.
1280    //@{
1281    CK_i586,
1282    CK_Pentium,
1283    CK_PentiumMMX,
1284    //@}
1285
1286    /// \name i686
1287    /// i686-generation processors, P6 / Pentium M microarchitecture based.
1288    //@{
1289    CK_i686,
1290    CK_PentiumPro,
1291    CK_Pentium2,
1292    CK_Pentium3,
1293    CK_Pentium3M,
1294    CK_PentiumM,
1295    CK_C3_2,
1296
1297    /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1298    /// Clang however has some logic to suport this.
1299    // FIXME: Warn, deprecate, and potentially remove this.
1300    CK_Yonah,
1301    //@}
1302
1303    /// \name Netburst
1304    /// Netburst microarchitecture based processors.
1305    //@{
1306    CK_Pentium4,
1307    CK_Pentium4M,
1308    CK_Prescott,
1309    CK_Nocona,
1310    //@}
1311
1312    /// \name Core
1313    /// Core microarchitecture based processors.
1314    //@{
1315    CK_Core2,
1316
1317    /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1318    /// codename which GCC no longer accepts as an option to -march, but Clang
1319    /// has some logic for recognizing it.
1320    // FIXME: Warn, deprecate, and potentially remove this.
1321    CK_Penryn,
1322    //@}
1323
1324    /// \name Atom
1325    /// Atom processors
1326    //@{
1327    CK_Atom,
1328    //@}
1329
1330    /// \name Nehalem
1331    /// Nehalem microarchitecture based processors.
1332    //@{
1333    CK_Corei7,
1334    CK_Corei7AVX,
1335    CK_CoreAVXi,
1336    CK_CoreAVX2,
1337    //@}
1338
1339    /// \name K6
1340    /// K6 architecture processors.
1341    //@{
1342    CK_K6,
1343    CK_K6_2,
1344    CK_K6_3,
1345    //@}
1346
1347    /// \name K7
1348    /// K7 architecture processors.
1349    //@{
1350    CK_Athlon,
1351    CK_AthlonThunderbird,
1352    CK_Athlon4,
1353    CK_AthlonXP,
1354    CK_AthlonMP,
1355    //@}
1356
1357    /// \name K8
1358    /// K8 architecture processors.
1359    //@{
1360    CK_Athlon64,
1361    CK_Athlon64SSE3,
1362    CK_AthlonFX,
1363    CK_K8,
1364    CK_K8SSE3,
1365    CK_Opteron,
1366    CK_OpteronSSE3,
1367    CK_AMDFAM10,
1368    //@}
1369
1370    /// \name Bobcat
1371    /// Bobcat architecture processors.
1372    //@{
1373    CK_BTVER1,
1374    //@}
1375
1376    /// \name Bulldozer
1377    /// Bulldozer architecture processors.
1378    //@{
1379    CK_BDVER1,
1380    CK_BDVER2,
1381    //@}
1382
1383    /// This specification is deprecated and will be removed in the future.
1384    /// Users should prefer \see CK_K8.
1385    // FIXME: Warn on this when the CPU is set to it.
1386    CK_x86_64,
1387    //@}
1388
1389    /// \name Geode
1390    /// Geode processors.
1391    //@{
1392    CK_Geode
1393    //@}
1394  } CPU;
1395
1396public:
1397  X86TargetInfo(const std::string& triple)
1398    : TargetInfo(triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
1399      HasAES(false), HasLZCNT(false), HasBMI(false), HasBMI2(false),
1400      HasPOPCNT(false), HasFMA4(false), CPU(CK_Generic) {
1401    BigEndian = false;
1402    LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
1403  }
1404  virtual unsigned getFloatEvalMethod() const {
1405    // X87 evaluates with 80 bits "long double" precision.
1406    return SSELevel == NoSSE ? 2 : 0;
1407  }
1408  virtual void getTargetBuiltins(const Builtin::Info *&Records,
1409                                 unsigned &NumRecords) const {
1410    Records = BuiltinInfo;
1411    NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
1412  }
1413  virtual void getGCCRegNames(const char * const *&Names,
1414                              unsigned &NumNames) const {
1415    Names = GCCRegNames;
1416    NumNames = llvm::array_lengthof(GCCRegNames);
1417  }
1418  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1419                                unsigned &NumAliases) const {
1420    Aliases = 0;
1421    NumAliases = 0;
1422  }
1423  virtual void getGCCAddlRegNames(const AddlRegName *&Names,
1424				  unsigned &NumNames) const {
1425    Names = AddlRegNames;
1426    NumNames = llvm::array_lengthof(AddlRegNames);
1427  }
1428  virtual bool validateAsmConstraint(const char *&Name,
1429                                     TargetInfo::ConstraintInfo &info) const;
1430  virtual std::string convertConstraint(const char *&Constraint) const;
1431  virtual const char *getClobbers() const {
1432    return "~{dirflag},~{fpsr},~{flags}";
1433  }
1434  virtual void getTargetDefines(const LangOptions &Opts,
1435                                MacroBuilder &Builder) const;
1436  virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1437                                 StringRef Name,
1438                                 bool Enabled) const;
1439  virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
1440  virtual bool hasFeature(StringRef Feature) const;
1441  virtual void HandleTargetFeatures(std::vector<std::string> &Features);
1442  virtual const char* getABI() const {
1443    if (PointerWidth == 64 && SSELevel >= AVX)
1444      return "avx";
1445    else if (PointerWidth == 32 && MMX3DNowLevel == NoMMX3DNow)
1446      return "no-mmx";
1447    return "";
1448  }
1449  virtual bool setCPU(const std::string &Name) {
1450    CPU = llvm::StringSwitch<CPUKind>(Name)
1451      .Case("i386", CK_i386)
1452      .Case("i486", CK_i486)
1453      .Case("winchip-c6", CK_WinChipC6)
1454      .Case("winchip2", CK_WinChip2)
1455      .Case("c3", CK_C3)
1456      .Case("i586", CK_i586)
1457      .Case("pentium", CK_Pentium)
1458      .Case("pentium-mmx", CK_PentiumMMX)
1459      .Case("i686", CK_i686)
1460      .Case("pentiumpro", CK_PentiumPro)
1461      .Case("pentium2", CK_Pentium2)
1462      .Case("pentium3", CK_Pentium3)
1463      .Case("pentium3m", CK_Pentium3M)
1464      .Case("pentium-m", CK_PentiumM)
1465      .Case("c3-2", CK_C3_2)
1466      .Case("yonah", CK_Yonah)
1467      .Case("pentium4", CK_Pentium4)
1468      .Case("pentium4m", CK_Pentium4M)
1469      .Case("prescott", CK_Prescott)
1470      .Case("nocona", CK_Nocona)
1471      .Case("core2", CK_Core2)
1472      .Case("penryn", CK_Penryn)
1473      .Case("atom", CK_Atom)
1474      .Case("corei7", CK_Corei7)
1475      .Case("corei7-avx", CK_Corei7AVX)
1476      .Case("core-avx-i", CK_CoreAVXi)
1477      .Case("core-avx2", CK_CoreAVX2)
1478      .Case("k6", CK_K6)
1479      .Case("k6-2", CK_K6_2)
1480      .Case("k6-3", CK_K6_3)
1481      .Case("athlon", CK_Athlon)
1482      .Case("athlon-tbird", CK_AthlonThunderbird)
1483      .Case("athlon-4", CK_Athlon4)
1484      .Case("athlon-xp", CK_AthlonXP)
1485      .Case("athlon-mp", CK_AthlonMP)
1486      .Case("athlon64", CK_Athlon64)
1487      .Case("athlon64-sse3", CK_Athlon64SSE3)
1488      .Case("athlon-fx", CK_AthlonFX)
1489      .Case("k8", CK_K8)
1490      .Case("k8-sse3", CK_K8SSE3)
1491      .Case("opteron", CK_Opteron)
1492      .Case("opteron-sse3", CK_OpteronSSE3)
1493      .Case("amdfam10", CK_AMDFAM10)
1494      .Case("btver1", CK_BTVER1)
1495      .Case("bdver1", CK_BDVER1)
1496      .Case("bdver2", CK_BDVER2)
1497      .Case("x86-64", CK_x86_64)
1498      .Case("geode", CK_Geode)
1499      .Default(CK_Generic);
1500
1501    // Perform any per-CPU checks necessary to determine if this CPU is
1502    // acceptable.
1503    // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1504    // invalid without explaining *why*.
1505    switch (CPU) {
1506    case CK_Generic:
1507      // No processor selected!
1508      return false;
1509
1510    case CK_i386:
1511    case CK_i486:
1512    case CK_WinChipC6:
1513    case CK_WinChip2:
1514    case CK_C3:
1515    case CK_i586:
1516    case CK_Pentium:
1517    case CK_PentiumMMX:
1518    case CK_i686:
1519    case CK_PentiumPro:
1520    case CK_Pentium2:
1521    case CK_Pentium3:
1522    case CK_Pentium3M:
1523    case CK_PentiumM:
1524    case CK_Yonah:
1525    case CK_C3_2:
1526    case CK_Pentium4:
1527    case CK_Pentium4M:
1528    case CK_Prescott:
1529    case CK_K6:
1530    case CK_K6_2:
1531    case CK_K6_3:
1532    case CK_Athlon:
1533    case CK_AthlonThunderbird:
1534    case CK_Athlon4:
1535    case CK_AthlonXP:
1536    case CK_AthlonMP:
1537    case CK_Geode:
1538      // Only accept certain architectures when compiling in 32-bit mode.
1539      if (PointerWidth != 32)
1540        return false;
1541
1542      // Fallthrough
1543    case CK_Nocona:
1544    case CK_Core2:
1545    case CK_Penryn:
1546    case CK_Atom:
1547    case CK_Corei7:
1548    case CK_Corei7AVX:
1549    case CK_CoreAVXi:
1550    case CK_CoreAVX2:
1551    case CK_Athlon64:
1552    case CK_Athlon64SSE3:
1553    case CK_AthlonFX:
1554    case CK_K8:
1555    case CK_K8SSE3:
1556    case CK_Opteron:
1557    case CK_OpteronSSE3:
1558    case CK_AMDFAM10:
1559    case CK_BTVER1:
1560    case CK_BDVER1:
1561    case CK_BDVER2:
1562    case CK_x86_64:
1563      return true;
1564    }
1565    llvm_unreachable("Unhandled CPU kind");
1566  }
1567};
1568
1569void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1570  // FIXME: This should not be here.
1571  Features["3dnow"] = false;
1572  Features["3dnowa"] = false;
1573  Features["mmx"] = false;
1574  Features["sse"] = false;
1575  Features["sse2"] = false;
1576  Features["sse3"] = false;
1577  Features["ssse3"] = false;
1578  Features["sse41"] = false;
1579  Features["sse42"] = false;
1580  Features["sse4a"] = false;
1581  Features["aes"] = false;
1582  Features["avx"] = false;
1583  Features["avx2"] = false;
1584  Features["lzcnt"] = false;
1585  Features["bmi"] = false;
1586  Features["bmi2"] = false;
1587  Features["popcnt"] = false;
1588  Features["fma4"] = false;
1589
1590  // FIXME: This *really* should not be here.
1591
1592  // X86_64 always has SSE2.
1593  if (PointerWidth == 64)
1594    Features["sse2"] = Features["sse"] = Features["mmx"] = true;
1595
1596  switch (CPU) {
1597  case CK_Generic:
1598  case CK_i386:
1599  case CK_i486:
1600  case CK_i586:
1601  case CK_Pentium:
1602  case CK_i686:
1603  case CK_PentiumPro:
1604    break;
1605  case CK_PentiumMMX:
1606  case CK_Pentium2:
1607    setFeatureEnabled(Features, "mmx", true);
1608    break;
1609  case CK_Pentium3:
1610  case CK_Pentium3M:
1611    setFeatureEnabled(Features, "mmx", true);
1612    setFeatureEnabled(Features, "sse", true);
1613    break;
1614  case CK_PentiumM:
1615  case CK_Pentium4:
1616  case CK_Pentium4M:
1617  case CK_x86_64:
1618    setFeatureEnabled(Features, "mmx", true);
1619    setFeatureEnabled(Features, "sse2", true);
1620    break;
1621  case CK_Yonah:
1622  case CK_Prescott:
1623  case CK_Nocona:
1624    setFeatureEnabled(Features, "mmx", true);
1625    setFeatureEnabled(Features, "sse3", true);
1626    break;
1627  case CK_Core2:
1628    setFeatureEnabled(Features, "mmx", true);
1629    setFeatureEnabled(Features, "ssse3", true);
1630    break;
1631  case CK_Penryn:
1632    setFeatureEnabled(Features, "mmx", true);
1633    setFeatureEnabled(Features, "sse4.1", true);
1634    break;
1635  case CK_Atom:
1636    setFeatureEnabled(Features, "mmx", true);
1637    setFeatureEnabled(Features, "ssse3", true);
1638    break;
1639  case CK_Corei7:
1640    setFeatureEnabled(Features, "mmx", true);
1641    setFeatureEnabled(Features, "sse4", true);
1642    setFeatureEnabled(Features, "aes", true);
1643    break;
1644  case CK_Corei7AVX:
1645  case CK_CoreAVXi:
1646    setFeatureEnabled(Features, "mmx", true);
1647    setFeatureEnabled(Features, "avx", true);
1648    setFeatureEnabled(Features, "aes", true);
1649    break;
1650  case CK_CoreAVX2:
1651    setFeatureEnabled(Features, "mmx", true);
1652    setFeatureEnabled(Features, "avx2", true);
1653    setFeatureEnabled(Features, "aes", true);
1654    setFeatureEnabled(Features, "lzcnt", true);
1655    setFeatureEnabled(Features, "bmi", true);
1656    setFeatureEnabled(Features, "bmi2", true);
1657    break;
1658  case CK_K6:
1659  case CK_WinChipC6:
1660    setFeatureEnabled(Features, "mmx", true);
1661    break;
1662  case CK_K6_2:
1663  case CK_K6_3:
1664  case CK_WinChip2:
1665  case CK_C3:
1666    setFeatureEnabled(Features, "3dnow", true);
1667    break;
1668  case CK_Athlon:
1669  case CK_AthlonThunderbird:
1670  case CK_Geode:
1671    setFeatureEnabled(Features, "3dnowa", true);
1672    break;
1673  case CK_Athlon4:
1674  case CK_AthlonXP:
1675  case CK_AthlonMP:
1676    setFeatureEnabled(Features, "sse", true);
1677    setFeatureEnabled(Features, "3dnowa", true);
1678    break;
1679  case CK_K8:
1680  case CK_Opteron:
1681  case CK_Athlon64:
1682  case CK_AthlonFX:
1683    setFeatureEnabled(Features, "sse2", true);
1684    setFeatureEnabled(Features, "3dnowa", true);
1685    break;
1686  case CK_K8SSE3:
1687  case CK_OpteronSSE3:
1688  case CK_Athlon64SSE3:
1689    setFeatureEnabled(Features, "sse3", true);
1690    setFeatureEnabled(Features, "3dnowa", true);
1691    break;
1692  case CK_AMDFAM10:
1693    setFeatureEnabled(Features, "sse3", true);
1694    setFeatureEnabled(Features, "sse4a", true);
1695    setFeatureEnabled(Features, "3dnowa", true);
1696    break;
1697  case CK_BTVER1:
1698    setFeatureEnabled(Features, "ssse3", true);
1699    setFeatureEnabled(Features, "sse4a", true);
1700  case CK_BDVER1:
1701  case CK_BDVER2:
1702    setFeatureEnabled(Features, "avx", true);
1703    setFeatureEnabled(Features, "sse4a", true);
1704    setFeatureEnabled(Features, "aes", true);
1705    break;
1706  case CK_C3_2:
1707    setFeatureEnabled(Features, "mmx", true);
1708    setFeatureEnabled(Features, "sse", true);
1709    break;
1710  }
1711}
1712
1713bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1714                                      StringRef Name,
1715                                      bool Enabled) const {
1716  // FIXME: This *really* should not be here.  We need some way of translating
1717  // options into llvm subtarget features.
1718  if (!Features.count(Name) &&
1719      (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1"))
1720    return false;
1721
1722  // FIXME: this should probably use a switch with fall through.
1723
1724  if (Enabled) {
1725    if (Name == "mmx")
1726      Features["mmx"] = true;
1727    else if (Name == "sse")
1728      Features["mmx"] = Features["sse"] = true;
1729    else if (Name == "sse2")
1730      Features["mmx"] = Features["sse"] = Features["sse2"] = true;
1731    else if (Name == "sse3")
1732      Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1733        true;
1734    else if (Name == "ssse3")
1735      Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1736        Features["ssse3"] = true;
1737    else if (Name == "sse4" || Name == "sse4.2")
1738      Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1739        Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1740        Features["popcnt"] = true;
1741    else if (Name == "sse4.1")
1742      Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1743        Features["ssse3"] = Features["sse41"] = true;
1744    else if (Name == "3dnow")
1745      Features["mmx"] = Features["3dnow"] = true;
1746    else if (Name == "3dnowa")
1747      Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = true;
1748    else if (Name == "aes")
1749      Features["aes"] = true;
1750    else if (Name == "avx")
1751      Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1752        Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1753        Features["popcnt"] = Features["avx"] = true;
1754    else if (Name == "avx2")
1755      Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1756        Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1757        Features["popcnt"] = Features["avx"] = Features["avx2"] = true;
1758    else if (Name == "fma4")
1759        Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1760        Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1761        Features["popcnt"] = Features["avx"] = Features["fma4"] = true;
1762    else if (Name == "sse4a")
1763      Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1764        Features["lzcnt"] = Features["popcnt"] = Features["sse4a"] = true;
1765    else if (Name == "lzcnt")
1766      Features["lzcnt"] = true;
1767    else if (Name == "bmi")
1768      Features["bmi"] = true;
1769    else if (Name == "bmi2")
1770      Features["bmi2"] = true;
1771    else if (Name == "popcnt")
1772      Features["popcnt"] = true;
1773  } else {
1774    if (Name == "mmx")
1775      Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = false;
1776    else if (Name == "sse")
1777      Features["sse"] = Features["sse2"] = Features["sse3"] =
1778        Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1779        Features["sse4a"] = false;
1780    else if (Name == "sse2")
1781      Features["sse2"] = Features["sse3"] = Features["ssse3"] =
1782        Features["sse41"] = Features["sse42"] = Features["sse4a"] = false;
1783    else if (Name == "sse3")
1784      Features["sse3"] = Features["ssse3"] = Features["sse41"] =
1785        Features["sse42"] = Features["sse4a"] = false;
1786    else if (Name == "ssse3")
1787      Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1788    else if (Name == "sse4" || Name == "sse4.1")
1789      Features["sse41"] = Features["sse42"] = false;
1790    else if (Name == "sse4.2")
1791      Features["sse42"] = false;
1792    else if (Name == "3dnow")
1793      Features["3dnow"] = Features["3dnowa"] = false;
1794    else if (Name == "3dnowa")
1795      Features["3dnowa"] = false;
1796    else if (Name == "aes")
1797      Features["aes"] = false;
1798    else if (Name == "avx")
1799      Features["avx"] = Features["avx2"] = Features["fma4"] = false;
1800    else if (Name == "avx2")
1801      Features["avx2"] = false;
1802    else if (Name == "sse4a")
1803      Features["sse4a"] = false;
1804    else if (Name == "lzcnt")
1805      Features["lzcnt"] = false;
1806    else if (Name == "bmi")
1807      Features["bmi"] = false;
1808    else if (Name == "bmi2")
1809      Features["bmi2"] = false;
1810    else if (Name == "popcnt")
1811      Features["popcnt"] = false;
1812    else if (Name == "fma4")
1813      Features["fma4"] = false;
1814  }
1815
1816  return true;
1817}
1818
1819/// HandleTargetOptions - Perform initialization based on the user
1820/// configured set of features.
1821void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
1822  // Remember the maximum enabled sselevel.
1823  for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1824    // Ignore disabled features.
1825    if (Features[i][0] == '-')
1826      continue;
1827
1828    StringRef Feature = StringRef(Features[i]).substr(1);
1829
1830    if (Feature == "aes") {
1831      HasAES = true;
1832      continue;
1833    }
1834
1835    if (Feature == "lzcnt") {
1836      HasLZCNT = true;
1837      continue;
1838    }
1839
1840    if (Feature == "bmi") {
1841      HasBMI = true;
1842      continue;
1843    }
1844
1845    if (Feature == "bmi2") {
1846      HasBMI2 = true;
1847      continue;
1848    }
1849
1850    if (Feature == "popcnt") {
1851      HasPOPCNT = true;
1852      continue;
1853    }
1854
1855    if (Feature == "fma4") {
1856      HasFMA4 = true;
1857      continue;
1858    }
1859
1860    assert(Features[i][0] == '+' && "Invalid target feature!");
1861    X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
1862      .Case("avx2", AVX2)
1863      .Case("avx", AVX)
1864      .Case("sse42", SSE42)
1865      .Case("sse41", SSE41)
1866      .Case("ssse3", SSSE3)
1867      .Case("sse3", SSE3)
1868      .Case("sse2", SSE2)
1869      .Case("sse", SSE1)
1870      .Default(NoSSE);
1871    SSELevel = std::max(SSELevel, Level);
1872
1873    MMX3DNowEnum ThreeDNowLevel =
1874      llvm::StringSwitch<MMX3DNowEnum>(Feature)
1875        .Case("3dnowa", AMD3DNowAthlon)
1876        .Case("3dnow", AMD3DNow)
1877        .Case("mmx", MMX)
1878        .Default(NoMMX3DNow);
1879
1880    MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
1881  }
1882
1883  // Don't tell the backend if we're turning off mmx; it will end up disabling
1884  // SSE, which we don't want.
1885  std::vector<std::string>::iterator it;
1886  it = std::find(Features.begin(), Features.end(), "-mmx");
1887  if (it != Features.end())
1888    Features.erase(it);
1889}
1890
1891/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
1892/// definitions for this particular subtarget.
1893void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
1894                                     MacroBuilder &Builder) const {
1895  // Target identification.
1896  if (PointerWidth == 64) {
1897    if (getLongWidth() == 64) {
1898      Builder.defineMacro("_LP64");
1899      Builder.defineMacro("__LP64__");
1900    }
1901    Builder.defineMacro("__amd64__");
1902    Builder.defineMacro("__amd64");
1903    Builder.defineMacro("__x86_64");
1904    Builder.defineMacro("__x86_64__");
1905  } else {
1906    DefineStd(Builder, "i386", Opts);
1907  }
1908
1909  // Subtarget options.
1910  // FIXME: We are hard-coding the tune parameters based on the CPU, but they
1911  // truly should be based on -mtune options.
1912  switch (CPU) {
1913  case CK_Generic:
1914    break;
1915  case CK_i386:
1916    // The rest are coming from the i386 define above.
1917    Builder.defineMacro("__tune_i386__");
1918    break;
1919  case CK_i486:
1920  case CK_WinChipC6:
1921  case CK_WinChip2:
1922  case CK_C3:
1923    defineCPUMacros(Builder, "i486");
1924    break;
1925  case CK_PentiumMMX:
1926    Builder.defineMacro("__pentium_mmx__");
1927    Builder.defineMacro("__tune_pentium_mmx__");
1928    // Fallthrough
1929  case CK_i586:
1930  case CK_Pentium:
1931    defineCPUMacros(Builder, "i586");
1932    defineCPUMacros(Builder, "pentium");
1933    break;
1934  case CK_Pentium3:
1935  case CK_Pentium3M:
1936  case CK_PentiumM:
1937    Builder.defineMacro("__tune_pentium3__");
1938    // Fallthrough
1939  case CK_Pentium2:
1940  case CK_C3_2:
1941    Builder.defineMacro("__tune_pentium2__");
1942    // Fallthrough
1943  case CK_PentiumPro:
1944    Builder.defineMacro("__tune_i686__");
1945    Builder.defineMacro("__tune_pentiumpro__");
1946    // Fallthrough
1947  case CK_i686:
1948    Builder.defineMacro("__i686");
1949    Builder.defineMacro("__i686__");
1950    // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
1951    Builder.defineMacro("__pentiumpro");
1952    Builder.defineMacro("__pentiumpro__");
1953    break;
1954  case CK_Pentium4:
1955  case CK_Pentium4M:
1956    defineCPUMacros(Builder, "pentium4");
1957    break;
1958  case CK_Yonah:
1959  case CK_Prescott:
1960  case CK_Nocona:
1961    defineCPUMacros(Builder, "nocona");
1962    break;
1963  case CK_Core2:
1964  case CK_Penryn:
1965    defineCPUMacros(Builder, "core2");
1966    break;
1967  case CK_Atom:
1968    defineCPUMacros(Builder, "atom");
1969    break;
1970  case CK_Corei7:
1971  case CK_Corei7AVX:
1972  case CK_CoreAVXi:
1973  case CK_CoreAVX2:
1974    defineCPUMacros(Builder, "corei7");
1975    break;
1976  case CK_K6_2:
1977    Builder.defineMacro("__k6_2__");
1978    Builder.defineMacro("__tune_k6_2__");
1979    // Fallthrough
1980  case CK_K6_3:
1981    if (CPU != CK_K6_2) {  // In case of fallthrough
1982      // FIXME: GCC may be enabling these in cases where some other k6
1983      // architecture is specified but -m3dnow is explicitly provided. The
1984      // exact semantics need to be determined and emulated here.
1985      Builder.defineMacro("__k6_3__");
1986      Builder.defineMacro("__tune_k6_3__");
1987    }
1988    // Fallthrough
1989  case CK_K6:
1990    defineCPUMacros(Builder, "k6");
1991    break;
1992  case CK_Athlon:
1993  case CK_AthlonThunderbird:
1994  case CK_Athlon4:
1995  case CK_AthlonXP:
1996  case CK_AthlonMP:
1997    defineCPUMacros(Builder, "athlon");
1998    if (SSELevel != NoSSE) {
1999      Builder.defineMacro("__athlon_sse__");
2000      Builder.defineMacro("__tune_athlon_sse__");
2001    }
2002    break;
2003  case CK_K8:
2004  case CK_K8SSE3:
2005  case CK_x86_64:
2006  case CK_Opteron:
2007  case CK_OpteronSSE3:
2008  case CK_Athlon64:
2009  case CK_Athlon64SSE3:
2010  case CK_AthlonFX:
2011    defineCPUMacros(Builder, "k8");
2012    break;
2013  case CK_AMDFAM10:
2014    defineCPUMacros(Builder, "amdfam10");
2015    break;
2016  case CK_BTVER1:
2017    defineCPUMacros(Builder, "btver1");
2018    break;
2019  case CK_BDVER1:
2020    defineCPUMacros(Builder, "bdver1");
2021    break;
2022  case CK_BDVER2:
2023    defineCPUMacros(Builder, "bdver2");
2024    break;
2025  case CK_Geode:
2026    defineCPUMacros(Builder, "geode");
2027    break;
2028  }
2029
2030  // Target properties.
2031  Builder.defineMacro("__LITTLE_ENDIAN__");
2032  Builder.defineMacro("__REGISTER_PREFIX__", "");
2033
2034  // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2035  // functions in glibc header files that use FP Stack inline asm which the
2036  // backend can't deal with (PR879).
2037  Builder.defineMacro("__NO_MATH_INLINES");
2038
2039  if (HasAES)
2040    Builder.defineMacro("__AES__");
2041
2042  if (HasLZCNT)
2043    Builder.defineMacro("__LZCNT__");
2044
2045  if (HasBMI)
2046    Builder.defineMacro("__BMI__");
2047
2048  if (HasBMI2)
2049    Builder.defineMacro("__BMI2__");
2050
2051  if (HasPOPCNT)
2052    Builder.defineMacro("__POPCNT__");
2053
2054  if (HasFMA4)
2055    Builder.defineMacro("__FMA4__");
2056
2057  // Each case falls through to the previous one here.
2058  switch (SSELevel) {
2059  case AVX2:
2060    Builder.defineMacro("__AVX2__");
2061  case AVX:
2062    Builder.defineMacro("__AVX__");
2063  case SSE42:
2064    Builder.defineMacro("__SSE4_2__");
2065  case SSE41:
2066    Builder.defineMacro("__SSE4_1__");
2067  case SSSE3:
2068    Builder.defineMacro("__SSSE3__");
2069  case SSE3:
2070    Builder.defineMacro("__SSE3__");
2071  case SSE2:
2072    Builder.defineMacro("__SSE2__");
2073    Builder.defineMacro("__SSE2_MATH__");  // -mfp-math=sse always implied.
2074  case SSE1:
2075    Builder.defineMacro("__SSE__");
2076    Builder.defineMacro("__SSE_MATH__");   // -mfp-math=sse always implied.
2077  case NoSSE:
2078    break;
2079  }
2080
2081  if (Opts.MicrosoftExt && PointerWidth == 32) {
2082    switch (SSELevel) {
2083    case AVX2:
2084    case AVX:
2085    case SSE42:
2086    case SSE41:
2087    case SSSE3:
2088    case SSE3:
2089    case SSE2:
2090      Builder.defineMacro("_M_IX86_FP", Twine(2));
2091      break;
2092    case SSE1:
2093      Builder.defineMacro("_M_IX86_FP", Twine(1));
2094      break;
2095    default:
2096      Builder.defineMacro("_M_IX86_FP", Twine(0));
2097    }
2098  }
2099
2100  // Each case falls through to the previous one here.
2101  switch (MMX3DNowLevel) {
2102  case AMD3DNowAthlon:
2103    Builder.defineMacro("__3dNOW_A__");
2104  case AMD3DNow:
2105    Builder.defineMacro("__3dNOW__");
2106  case MMX:
2107    Builder.defineMacro("__MMX__");
2108  case NoMMX3DNow:
2109    break;
2110  }
2111}
2112
2113bool X86TargetInfo::hasFeature(StringRef Feature) const {
2114  return llvm::StringSwitch<bool>(Feature)
2115      .Case("aes", HasAES)
2116      .Case("avx", SSELevel >= AVX)
2117      .Case("avx2", SSELevel >= AVX2)
2118      .Case("bmi", HasBMI)
2119      .Case("bmi2", HasBMI2)
2120      .Case("fma4", HasFMA4)
2121      .Case("lzcnt", HasLZCNT)
2122      .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2123      .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2124      .Case("mmx", MMX3DNowLevel >= MMX)
2125      .Case("popcnt", HasPOPCNT)
2126      .Case("sse", SSELevel >= SSE1)
2127      .Case("sse2", SSELevel >= SSE2)
2128      .Case("sse3", SSELevel >= SSE3)
2129      .Case("ssse3", SSELevel >= SSSE3)
2130      .Case("sse41", SSELevel >= SSE41)
2131      .Case("sse42", SSELevel >= SSE42)
2132      .Case("x86", true)
2133      .Case("x86_32", PointerWidth == 32)
2134      .Case("x86_64", PointerWidth == 64)
2135      .Default(false);
2136}
2137
2138bool
2139X86TargetInfo::validateAsmConstraint(const char *&Name,
2140                                     TargetInfo::ConstraintInfo &Info) const {
2141  switch (*Name) {
2142  default: return false;
2143  case 'Y': // first letter of a pair:
2144    switch (*(Name+1)) {
2145    default: return false;
2146    case '0':  // First SSE register.
2147    case 't':  // Any SSE register, when SSE2 is enabled.
2148    case 'i':  // Any SSE register, when SSE2 and inter-unit moves enabled.
2149    case 'm':  // any MMX register, when inter-unit moves enabled.
2150      break;   // falls through to setAllowsRegister.
2151  }
2152  case 'a': // eax.
2153  case 'b': // ebx.
2154  case 'c': // ecx.
2155  case 'd': // edx.
2156  case 'S': // esi.
2157  case 'D': // edi.
2158  case 'A': // edx:eax.
2159  case 'f': // any x87 floating point stack register.
2160  case 't': // top of floating point stack.
2161  case 'u': // second from top of floating point stack.
2162  case 'q': // Any register accessible as [r]l: a, b, c, and d.
2163  case 'y': // Any MMX register.
2164  case 'x': // Any SSE register.
2165  case 'Q': // Any register accessible as [r]h: a, b, c, and d.
2166  case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2167  case 'l': // "Index" registers: any general register that can be used as an
2168            // index in a base+index memory access.
2169    Info.setAllowsRegister();
2170    return true;
2171  case 'C': // SSE floating point constant.
2172  case 'G': // x87 floating point constant.
2173  case 'e': // 32-bit signed integer constant for use with zero-extending
2174            // x86_64 instructions.
2175  case 'Z': // 32-bit unsigned integer constant for use with zero-extending
2176            // x86_64 instructions.
2177    return true;
2178  }
2179}
2180
2181
2182std::string
2183X86TargetInfo::convertConstraint(const char *&Constraint) const {
2184  switch (*Constraint) {
2185  case 'a': return std::string("{ax}");
2186  case 'b': return std::string("{bx}");
2187  case 'c': return std::string("{cx}");
2188  case 'd': return std::string("{dx}");
2189  case 'S': return std::string("{si}");
2190  case 'D': return std::string("{di}");
2191  case 'p': // address
2192    return std::string("im");
2193  case 't': // top of floating point stack.
2194    return std::string("{st}");
2195  case 'u': // second from top of floating point stack.
2196    return std::string("{st(1)}"); // second from top of floating point stack.
2197  default:
2198    return std::string(1, *Constraint);
2199  }
2200}
2201} // end anonymous namespace
2202
2203namespace {
2204// X86-32 generic target
2205class X86_32TargetInfo : public X86TargetInfo {
2206public:
2207  X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
2208    DoubleAlign = LongLongAlign = 32;
2209    LongDoubleWidth = 96;
2210    LongDoubleAlign = 32;
2211    SuitableAlign = 128;
2212    DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2213                        "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
2214                        "a0:0:64-f80:32:32-n8:16:32-S128";
2215    SizeType = UnsignedInt;
2216    PtrDiffType = SignedInt;
2217    IntPtrType = SignedInt;
2218    RegParmMax = 3;
2219
2220    // Use fpret for all types.
2221    RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2222                             (1 << TargetInfo::Double) |
2223                             (1 << TargetInfo::LongDouble));
2224
2225    // x86-32 has atomics up to 8 bytes
2226    // FIXME: Check that we actually have cmpxchg8b before setting
2227    // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
2228    MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
2229  }
2230  virtual const char *getVAListDeclaration() const {
2231    return "typedef char* __builtin_va_list;";
2232  }
2233
2234  int getEHDataRegisterNumber(unsigned RegNo) const {
2235    if (RegNo == 0) return 0;
2236    if (RegNo == 1) return 2;
2237    return -1;
2238  }
2239};
2240} // end anonymous namespace
2241
2242namespace {
2243class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
2244public:
2245  NetBSDI386TargetInfo(const std::string &triple) :
2246    NetBSDTargetInfo<X86_32TargetInfo>(triple) {
2247  }
2248
2249  virtual unsigned getFloatEvalMethod() const {
2250    // NetBSD defaults to "double" rounding
2251    return 1;
2252  }
2253};
2254} // end anonymous namespace
2255
2256namespace {
2257class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
2258public:
2259  OpenBSDI386TargetInfo(const std::string& triple) :
2260    OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
2261    SizeType = UnsignedLong;
2262    IntPtrType = SignedLong;
2263    PtrDiffType = SignedLong;
2264  }
2265};
2266} // end anonymous namespace
2267
2268namespace {
2269class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
2270public:
2271  DarwinI386TargetInfo(const std::string& triple) :
2272    DarwinTargetInfo<X86_32TargetInfo>(triple) {
2273    LongDoubleWidth = 128;
2274    LongDoubleAlign = 128;
2275    SuitableAlign = 128;
2276    SizeType = UnsignedLong;
2277    IntPtrType = SignedLong;
2278    DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2279                        "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
2280                        "a0:0:64-f80:128:128-n8:16:32-S128";
2281    HasAlignMac68kSupport = true;
2282  }
2283
2284};
2285} // end anonymous namespace
2286
2287namespace {
2288// x86-32 Windows target
2289class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
2290public:
2291  WindowsX86_32TargetInfo(const std::string& triple)
2292    : WindowsTargetInfo<X86_32TargetInfo>(triple) {
2293    TLSSupported = false;
2294    WCharType = UnsignedShort;
2295    DoubleAlign = LongLongAlign = 64;
2296    DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2297                        "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
2298                        "v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32";
2299  }
2300  virtual void getTargetDefines(const LangOptions &Opts,
2301                                MacroBuilder &Builder) const {
2302    WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
2303  }
2304};
2305} // end anonymous namespace
2306
2307namespace {
2308
2309// x86-32 Windows Visual Studio target
2310class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
2311public:
2312  VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
2313    : WindowsX86_32TargetInfo(triple) {
2314    LongDoubleWidth = LongDoubleAlign = 64;
2315    LongDoubleFormat = &llvm::APFloat::IEEEdouble;
2316  }
2317  virtual void getTargetDefines(const LangOptions &Opts,
2318                                MacroBuilder &Builder) const {
2319    WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
2320    WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
2321    // The value of the following reflects processor type.
2322    // 300=386, 400=486, 500=Pentium, 600=Blend (default)
2323    // We lost the original triple, so we use the default.
2324    Builder.defineMacro("_M_IX86", "600");
2325  }
2326};
2327} // end anonymous namespace
2328
2329namespace {
2330// x86-32 MinGW target
2331class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
2332public:
2333  MinGWX86_32TargetInfo(const std::string& triple)
2334    : WindowsX86_32TargetInfo(triple) {
2335  }
2336  virtual void getTargetDefines(const LangOptions &Opts,
2337                                MacroBuilder &Builder) const {
2338    WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
2339    DefineStd(Builder, "WIN32", Opts);
2340    DefineStd(Builder, "WINNT", Opts);
2341    Builder.defineMacro("_X86_");
2342    Builder.defineMacro("__MSVCRT__");
2343    Builder.defineMacro("__MINGW32__");
2344
2345    // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2346    // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
2347    if (Opts.MicrosoftExt)
2348      // Provide "as-is" __declspec.
2349      Builder.defineMacro("__declspec", "__declspec");
2350    else
2351      // Provide alias of __attribute__ like mingw32-gcc.
2352      Builder.defineMacro("__declspec(a)", "__attribute__((a))");
2353  }
2354};
2355} // end anonymous namespace
2356
2357namespace {
2358// x86-32 Cygwin target
2359class CygwinX86_32TargetInfo : public X86_32TargetInfo {
2360public:
2361  CygwinX86_32TargetInfo(const std::string& triple)
2362    : X86_32TargetInfo(triple) {
2363    TLSSupported = false;
2364    WCharType = UnsignedShort;
2365    DoubleAlign = LongLongAlign = 64;
2366    DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2367                        "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
2368                        "a0:0:64-f80:32:32-n8:16:32-S32";
2369  }
2370  virtual void getTargetDefines(const LangOptions &Opts,
2371                                MacroBuilder &Builder) const {
2372    X86_32TargetInfo::getTargetDefines(Opts, Builder);
2373    Builder.defineMacro("__CYGWIN__");
2374    Builder.defineMacro("__CYGWIN32__");
2375    DefineStd(Builder, "unix", Opts);
2376    if (Opts.CPlusPlus)
2377      Builder.defineMacro("_GNU_SOURCE");
2378  }
2379};
2380} // end anonymous namespace
2381
2382namespace {
2383// x86-32 Haiku target
2384class HaikuX86_32TargetInfo : public X86_32TargetInfo {
2385public:
2386  HaikuX86_32TargetInfo(const std::string& triple)
2387    : X86_32TargetInfo(triple) {
2388    SizeType = UnsignedLong;
2389    IntPtrType = SignedLong;
2390    PtrDiffType = SignedLong;
2391    this->UserLabelPrefix = "";
2392  }
2393  virtual void getTargetDefines(const LangOptions &Opts,
2394                                MacroBuilder &Builder) const {
2395    X86_32TargetInfo::getTargetDefines(Opts, Builder);
2396    Builder.defineMacro("__INTEL__");
2397    Builder.defineMacro("__HAIKU__");
2398  }
2399};
2400} // end anonymous namespace
2401
2402// RTEMS Target
2403template<typename Target>
2404class RTEMSTargetInfo : public OSTargetInfo<Target> {
2405protected:
2406  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
2407                            MacroBuilder &Builder) const {
2408    // RTEMS defines; list based off of gcc output
2409
2410    Builder.defineMacro("__rtems__");
2411    Builder.defineMacro("__ELF__");
2412  }
2413public:
2414  RTEMSTargetInfo(const std::string &triple)
2415    : OSTargetInfo<Target>(triple) {
2416      this->UserLabelPrefix = "";
2417
2418      llvm::Triple Triple(triple);
2419      switch (Triple.getArch()) {
2420        default:
2421        case llvm::Triple::x86:
2422          // this->MCountName = ".mcount";
2423          break;
2424        case llvm::Triple::mips:
2425        case llvm::Triple::mipsel:
2426        case llvm::Triple::ppc:
2427        case llvm::Triple::ppc64:
2428          // this->MCountName = "_mcount";
2429          break;
2430        case llvm::Triple::arm:
2431          // this->MCountName = "__mcount";
2432          break;
2433      }
2434
2435    }
2436};
2437
2438namespace {
2439// x86-32 RTEMS target
2440class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
2441public:
2442  RTEMSX86_32TargetInfo(const std::string& triple)
2443    : X86_32TargetInfo(triple) {
2444    SizeType = UnsignedLong;
2445    IntPtrType = SignedLong;
2446    PtrDiffType = SignedLong;
2447    this->UserLabelPrefix = "";
2448  }
2449  virtual void getTargetDefines(const LangOptions &Opts,
2450                                MacroBuilder &Builder) const {
2451    X86_32TargetInfo::getTargetDefines(Opts, Builder);
2452    Builder.defineMacro("__INTEL__");
2453    Builder.defineMacro("__rtems__");
2454  }
2455};
2456} // end anonymous namespace
2457
2458namespace {
2459// x86-64 generic target
2460class X86_64TargetInfo : public X86TargetInfo {
2461public:
2462  X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
2463    LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
2464    LongDoubleWidth = 128;
2465    LongDoubleAlign = 128;
2466    LargeArrayMinWidth = 128;
2467    LargeArrayAlign = 128;
2468    SuitableAlign = 128;
2469    IntMaxType = SignedLong;
2470    UIntMaxType = UnsignedLong;
2471    Int64Type = SignedLong;
2472    RegParmMax = 6;
2473
2474    DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2475                        "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
2476                        "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128";
2477
2478    // Use fpret only for long double.
2479    RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
2480
2481    // Use fp2ret for _Complex long double.
2482    ComplexLongDoubleUsesFP2Ret = true;
2483
2484    // x86-64 has atomics up to 16 bytes.
2485    // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
2486    // on CPUs with cmpxchg16b
2487    MaxAtomicPromoteWidth = 128;
2488    MaxAtomicInlineWidth = 64;
2489  }
2490  virtual const char *getVAListDeclaration() const {
2491    return "typedef struct __va_list_tag {"
2492           "  unsigned gp_offset;"
2493           "  unsigned fp_offset;"
2494           "  void* overflow_arg_area;"
2495           "  void* reg_save_area;"
2496           "} __va_list_tag;"
2497           "typedef __va_list_tag __builtin_va_list[1];";
2498  }
2499
2500  int getEHDataRegisterNumber(unsigned RegNo) const {
2501    if (RegNo == 0) return 0;
2502    if (RegNo == 1) return 1;
2503    return -1;
2504  }
2505};
2506} // end anonymous namespace
2507
2508namespace {
2509// x86-64 Windows target
2510class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
2511public:
2512  WindowsX86_64TargetInfo(const std::string& triple)
2513    : WindowsTargetInfo<X86_64TargetInfo>(triple) {
2514    TLSSupported = false;
2515    WCharType = UnsignedShort;
2516    LongWidth = LongAlign = 32;
2517    DoubleAlign = LongLongAlign = 64;
2518    IntMaxType = SignedLongLong;
2519    UIntMaxType = UnsignedLongLong;
2520    Int64Type = SignedLongLong;
2521    SizeType = UnsignedLongLong;
2522    PtrDiffType = SignedLongLong;
2523    IntPtrType = SignedLongLong;
2524    this->UserLabelPrefix = "";
2525  }
2526  virtual void getTargetDefines(const LangOptions &Opts,
2527                                MacroBuilder &Builder) const {
2528    WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
2529    Builder.defineMacro("_WIN64");
2530  }
2531  virtual const char *getVAListDeclaration() const {
2532    return "typedef char* __builtin_va_list;";
2533  }
2534};
2535} // end anonymous namespace
2536
2537namespace {
2538// x86-64 Windows Visual Studio target
2539class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
2540public:
2541  VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
2542    : WindowsX86_64TargetInfo(triple) {
2543    LongDoubleWidth = LongDoubleAlign = 64;
2544    LongDoubleFormat = &llvm::APFloat::IEEEdouble;
2545  }
2546  virtual void getTargetDefines(const LangOptions &Opts,
2547                                MacroBuilder &Builder) const {
2548    WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
2549    WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
2550    Builder.defineMacro("_M_X64");
2551    Builder.defineMacro("_M_AMD64");
2552  }
2553};
2554} // end anonymous namespace
2555
2556namespace {
2557// x86-64 MinGW target
2558class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
2559public:
2560  MinGWX86_64TargetInfo(const std::string& triple)
2561    : WindowsX86_64TargetInfo(triple) {
2562  }
2563  virtual void getTargetDefines(const LangOptions &Opts,
2564                                MacroBuilder &Builder) const {
2565    WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
2566    DefineStd(Builder, "WIN64", Opts);
2567    Builder.defineMacro("__MSVCRT__");
2568    Builder.defineMacro("__MINGW32__");
2569    Builder.defineMacro("__MINGW64__");
2570
2571    // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2572    // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
2573    if (Opts.MicrosoftExt)
2574      // Provide "as-is" __declspec.
2575      Builder.defineMacro("__declspec", "__declspec");
2576    else
2577      // Provide alias of __attribute__ like mingw32-gcc.
2578      Builder.defineMacro("__declspec(a)", "__attribute__((a))");
2579  }
2580};
2581} // end anonymous namespace
2582
2583namespace {
2584class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
2585public:
2586  DarwinX86_64TargetInfo(const std::string& triple)
2587      : DarwinTargetInfo<X86_64TargetInfo>(triple) {
2588    Int64Type = SignedLongLong;
2589  }
2590};
2591} // end anonymous namespace
2592
2593namespace {
2594class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
2595public:
2596  OpenBSDX86_64TargetInfo(const std::string& triple)
2597      : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
2598    IntMaxType = SignedLongLong;
2599    UIntMaxType = UnsignedLongLong;
2600    Int64Type = SignedLongLong;
2601  }
2602};
2603} // end anonymous namespace
2604
2605namespace {
2606class ARMTargetInfo : public TargetInfo {
2607  // Possible FPU choices.
2608  enum FPUMode {
2609    NoFPU,
2610    VFP2FPU,
2611    VFP3FPU,
2612    NeonFPU
2613  };
2614
2615  static bool FPUModeIsVFP(FPUMode Mode) {
2616    return Mode >= VFP2FPU && Mode <= NeonFPU;
2617  }
2618
2619  static const TargetInfo::GCCRegAlias GCCRegAliases[];
2620  static const char * const GCCRegNames[];
2621
2622  std::string ABI, CPU;
2623
2624  unsigned FPU : 3;
2625
2626  unsigned IsThumb : 1;
2627
2628  // Initialized via features.
2629  unsigned SoftFloat : 1;
2630  unsigned SoftFloatABI : 1;
2631
2632  static const Builtin::Info BuiltinInfo[];
2633
2634public:
2635  ARMTargetInfo(const std::string &TripleStr)
2636    : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
2637  {
2638    BigEndian = false;
2639    SizeType = UnsignedInt;
2640    PtrDiffType = SignedInt;
2641    // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
2642    WCharType = UnsignedInt;
2643
2644    // {} in inline assembly are neon specifiers, not assembly variant
2645    // specifiers.
2646    NoAsmVariants = true;
2647
2648    // FIXME: Should we just treat this as a feature?
2649    IsThumb = getTriple().getArchName().startswith("thumb");
2650    if (IsThumb) {
2651      // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
2652      // so set preferred for small types to 32.
2653      DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
2654                           "i64:64:64-f32:32:32-f64:64:64-"
2655                           "v64:64:64-v128:64:128-a0:0:32-n32-S64");
2656    } else {
2657      DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2658                           "i64:64:64-f32:32:32-f64:64:64-"
2659                           "v64:64:64-v128:64:128-a0:0:64-n32-S64");
2660    }
2661
2662    // ARM targets default to using the ARM C++ ABI.
2663    CXXABI = CXXABI_ARM;
2664
2665    // ARM has atomics up to 8 bytes
2666    // FIXME: Set MaxAtomicInlineWidth if we have the feature v6e
2667    MaxAtomicPromoteWidth = 64;
2668
2669    // Do force alignment of members that follow zero length bitfields.  If
2670    // the alignment of the zero-length bitfield is greater than the member
2671    // that follows it, `bar', `bar' will be aligned as the  type of the
2672    // zero length bitfield.
2673    UseZeroLengthBitfieldAlignment = true;
2674  }
2675  virtual const char *getABI() const { return ABI.c_str(); }
2676  virtual bool setABI(const std::string &Name) {
2677    ABI = Name;
2678
2679    // The defaults (above) are for AAPCS, check if we need to change them.
2680    //
2681    // FIXME: We need support for -meabi... we could just mangle it into the
2682    // name.
2683    if (Name == "apcs-gnu") {
2684      DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
2685      SizeType = UnsignedLong;
2686
2687      // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
2688      WCharType = SignedInt;
2689
2690      // Do not respect the alignment of bit-field types when laying out
2691      // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
2692      UseBitFieldTypeAlignment = false;
2693
2694      /// gcc forces the alignment to 4 bytes, regardless of the type of the
2695      /// zero length bitfield.  This corresponds to EMPTY_FIELD_BOUNDARY in
2696      /// gcc.
2697      ZeroLengthBitfieldBoundary = 32;
2698
2699      if (IsThumb) {
2700        // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
2701        // so set preferred for small types to 32.
2702        DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
2703                             "i64:32:64-f32:32:32-f64:32:64-"
2704                             "v64:32:64-v128:32:128-a0:0:32-n32-S32");
2705      } else {
2706        DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2707                             "i64:32:64-f32:32:32-f64:32:64-"
2708                             "v64:32:64-v128:32:128-a0:0:32-n32-S32");
2709      }
2710
2711      // FIXME: Override "preferred align" for double and long long.
2712    } else if (Name == "aapcs") {
2713      // FIXME: Enumerated types are variable width in straight AAPCS.
2714    } else if (Name == "aapcs-linux") {
2715      ;
2716    } else
2717      return false;
2718
2719    return true;
2720  }
2721
2722  void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
2723    if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
2724      Features["vfp2"] = true;
2725    else if (CPU == "cortex-a8" || CPU == "cortex-a9")
2726      Features["neon"] = true;
2727  }
2728
2729  virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2730                                 StringRef Name,
2731                                 bool Enabled) const {
2732    if (Name == "soft-float" || Name == "soft-float-abi" ||
2733        Name == "vfp2" || Name == "vfp3" || Name == "neon" || Name == "d16" ||
2734        Name == "neonfp") {
2735      Features[Name] = Enabled;
2736    } else
2737      return false;
2738
2739    return true;
2740  }
2741
2742  virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
2743    FPU = NoFPU;
2744    SoftFloat = SoftFloatABI = false;
2745    for (unsigned i = 0, e = Features.size(); i != e; ++i) {
2746      if (Features[i] == "+soft-float")
2747        SoftFloat = true;
2748      else if (Features[i] == "+soft-float-abi")
2749        SoftFloatABI = true;
2750      else if (Features[i] == "+vfp2")
2751        FPU = VFP2FPU;
2752      else if (Features[i] == "+vfp3")
2753        FPU = VFP3FPU;
2754      else if (Features[i] == "+neon")
2755        FPU = NeonFPU;
2756    }
2757
2758    // Remove front-end specific options which the backend handles differently.
2759    std::vector<std::string>::iterator it;
2760    it = std::find(Features.begin(), Features.end(), "+soft-float");
2761    if (it != Features.end())
2762      Features.erase(it);
2763    it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
2764    if (it != Features.end())
2765      Features.erase(it);
2766  }
2767
2768  virtual bool hasFeature(StringRef Feature) const {
2769    return llvm::StringSwitch<bool>(Feature)
2770        .Case("arm", true)
2771        .Case("softfloat", SoftFloat)
2772        .Case("thumb", IsThumb)
2773        .Case("neon", FPU == NeonFPU && !SoftFloat &&
2774              StringRef(getCPUDefineSuffix(CPU)).startswith("7"))
2775        .Default(false);
2776  }
2777  static const char *getCPUDefineSuffix(StringRef Name) {
2778    return llvm::StringSwitch<const char*>(Name)
2779      .Cases("arm8", "arm810", "4")
2780      .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
2781      .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
2782      .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
2783      .Case("ep9312", "4T")
2784      .Cases("arm10tdmi", "arm1020t", "5T")
2785      .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
2786      .Case("arm926ej-s", "5TEJ")
2787      .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
2788      .Cases("xscale", "iwmmxt", "5TE")
2789      .Case("arm1136j-s", "6J")
2790      .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
2791      .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
2792      .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
2793      .Cases("cortex-a8", "cortex-a9", "7A")
2794      .Case("cortex-m3", "7M")
2795      .Case("cortex-m4", "7M")
2796      .Case("cortex-m0", "6M")
2797      .Default(0);
2798  }
2799  virtual bool setCPU(const std::string &Name) {
2800    if (!getCPUDefineSuffix(Name))
2801      return false;
2802
2803    CPU = Name;
2804    return true;
2805  }
2806  virtual void getTargetDefines(const LangOptions &Opts,
2807                                MacroBuilder &Builder) const {
2808    // Target identification.
2809    Builder.defineMacro("__arm");
2810    Builder.defineMacro("__arm__");
2811
2812    // Target properties.
2813    Builder.defineMacro("__ARMEL__");
2814    Builder.defineMacro("__LITTLE_ENDIAN__");
2815    Builder.defineMacro("__REGISTER_PREFIX__", "");
2816
2817    StringRef CPUArch = getCPUDefineSuffix(CPU);
2818    Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
2819
2820    // Subtarget options.
2821
2822    // FIXME: It's more complicated than this and we don't really support
2823    // interworking.
2824    if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
2825      Builder.defineMacro("__THUMB_INTERWORK__");
2826
2827    if (ABI == "aapcs" || ABI == "aapcs-linux")
2828      Builder.defineMacro("__ARM_EABI__");
2829
2830    if (SoftFloat)
2831      Builder.defineMacro("__SOFTFP__");
2832
2833    if (CPU == "xscale")
2834      Builder.defineMacro("__XSCALE__");
2835
2836    bool IsARMv7 = CPUArch.startswith("7");
2837    if (IsThumb) {
2838      Builder.defineMacro("__THUMBEL__");
2839      Builder.defineMacro("__thumb__");
2840      if (CPUArch == "6T2" || IsARMv7)
2841        Builder.defineMacro("__thumb2__");
2842    }
2843
2844    // Note, this is always on in gcc, even though it doesn't make sense.
2845    Builder.defineMacro("__APCS_32__");
2846
2847    if (FPUModeIsVFP((FPUMode) FPU))
2848      Builder.defineMacro("__VFP_FP__");
2849
2850    // This only gets set when Neon instructions are actually available, unlike
2851    // the VFP define, hence the soft float and arch check. This is subtly
2852    // different from gcc, we follow the intent which was that it should be set
2853    // when Neon instructions are actually available.
2854    if (FPU == NeonFPU && !SoftFloat && IsARMv7)
2855      Builder.defineMacro("__ARM_NEON__");
2856  }
2857  virtual void getTargetBuiltins(const Builtin::Info *&Records,
2858                                 unsigned &NumRecords) const {
2859    Records = BuiltinInfo;
2860    NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
2861  }
2862  virtual bool isCLZForZeroUndef() const { return false; }
2863  virtual const char *getVAListDeclaration() const {
2864    return "typedef void* __builtin_va_list;";
2865  }
2866  virtual void getGCCRegNames(const char * const *&Names,
2867                              unsigned &NumNames) const;
2868  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2869                                unsigned &NumAliases) const;
2870  virtual bool validateAsmConstraint(const char *&Name,
2871                                     TargetInfo::ConstraintInfo &Info) const {
2872    // FIXME: Check if this is complete
2873    switch (*Name) {
2874    default:
2875    case 'l': // r0-r7
2876    case 'h': // r8-r15
2877    case 'w': // VFP Floating point register single precision
2878    case 'P': // VFP Floating point register double precision
2879      Info.setAllowsRegister();
2880      return true;
2881    case 'Q': // A memory address that is a single base register.
2882      Info.setAllowsMemory();
2883      return true;
2884    case 'U': // a memory reference...
2885      switch (Name[1]) {
2886      case 'q': // ...ARMV4 ldrsb
2887      case 'v': // ...VFP load/store (reg+constant offset)
2888      case 'y': // ...iWMMXt load/store
2889      case 't': // address valid for load/store opaque types wider
2890	        // than 128-bits
2891      case 'n': // valid address for Neon doubleword vector load/store
2892      case 'm': // valid address for Neon element and structure load/store
2893      case 's': // valid address for non-offset loads/stores of quad-word
2894	        // values in four ARM registers
2895        Info.setAllowsMemory();
2896        Name++;
2897        return true;
2898      }
2899    }
2900    return false;
2901  }
2902  virtual std::string convertConstraint(const char *&Constraint) const {
2903    std::string R;
2904    switch (*Constraint) {
2905    case 'U':   // Two-character constraint; add "^" hint for later parsing.
2906      R = std::string("^") + std::string(Constraint, 2);
2907      Constraint++;
2908      break;
2909    case 'p': // 'p' should be translated to 'r' by default.
2910      R = std::string("r");
2911      break;
2912    default:
2913      return std::string(1, *Constraint);
2914    }
2915    return R;
2916  }
2917  virtual const char *getClobbers() const {
2918    // FIXME: Is this really right?
2919    return "";
2920  }
2921};
2922
2923const char * const ARMTargetInfo::GCCRegNames[] = {
2924  // Integer registers
2925  "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2926  "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
2927
2928  // Float registers
2929  "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2930  "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2931  "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2932  "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2933
2934  // Double registers
2935  "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
2936  "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
2937  "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
2938  "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
2939
2940  // Quad registers
2941  "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
2942  "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
2943};
2944
2945void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
2946                                   unsigned &NumNames) const {
2947  Names = GCCRegNames;
2948  NumNames = llvm::array_lengthof(GCCRegNames);
2949}
2950
2951const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
2952  { { "a1" }, "r0" },
2953  { { "a2" }, "r1" },
2954  { { "a3" }, "r2" },
2955  { { "a4" }, "r3" },
2956  { { "v1" }, "r4" },
2957  { { "v2" }, "r5" },
2958  { { "v3" }, "r6" },
2959  { { "v4" }, "r7" },
2960  { { "v5" }, "r8" },
2961  { { "v6", "rfp" }, "r9" },
2962  { { "sl" }, "r10" },
2963  { { "fp" }, "r11" },
2964  { { "ip" }, "r12" },
2965  { { "r13" }, "sp" },
2966  { { "r14" }, "lr" },
2967  { { "r15" }, "pc" },
2968  // The S, D and Q registers overlap, but aren't really aliases; we
2969  // don't want to substitute one of these for a different-sized one.
2970};
2971
2972void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2973                                       unsigned &NumAliases) const {
2974  Aliases = GCCRegAliases;
2975  NumAliases = llvm::array_lengthof(GCCRegAliases);
2976}
2977
2978const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
2979#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
2980#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
2981                                              ALL_LANGUAGES },
2982#include "clang/Basic/BuiltinsARM.def"
2983};
2984} // end anonymous namespace.
2985
2986namespace {
2987class DarwinARMTargetInfo :
2988  public DarwinTargetInfo<ARMTargetInfo> {
2989protected:
2990  virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
2991                            MacroBuilder &Builder) const {
2992    getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
2993  }
2994
2995public:
2996  DarwinARMTargetInfo(const std::string& triple)
2997    : DarwinTargetInfo<ARMTargetInfo>(triple) {
2998    HasAlignMac68kSupport = true;
2999    // iOS always has 64-bit atomic instructions.
3000    // FIXME: This should be based off of the target features in ARMTargetInfo.
3001    MaxAtomicInlineWidth = 64;
3002  }
3003};
3004} // end anonymous namespace.
3005
3006
3007namespace {
3008// Hexagon abstract base class
3009class HexagonTargetInfo : public TargetInfo {
3010  static const Builtin::Info BuiltinInfo[];
3011  static const char * const GCCRegNames[];
3012  static const TargetInfo::GCCRegAlias GCCRegAliases[];
3013  std::string CPU;
3014public:
3015  HexagonTargetInfo(const std::string& triple) : TargetInfo(triple)  {
3016    BigEndian = false;
3017    DescriptionString = ("e-p:32:32:32-"
3018                         "i64:64:64-i32:32:32-"
3019                         "i16:16:16-i1:32:32-a:0:0");
3020
3021    // {} in inline assembly are packet specifiers, not assembly variant
3022    // specifiers.
3023    NoAsmVariants = true;
3024  }
3025
3026  virtual void getTargetBuiltins(const Builtin::Info *&Records,
3027                                 unsigned &NumRecords) const {
3028    Records = BuiltinInfo;
3029    NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
3030  }
3031
3032  virtual bool validateAsmConstraint(const char *&Name,
3033                                     TargetInfo::ConstraintInfo &Info) const {
3034    return true;
3035  }
3036
3037  virtual void getTargetDefines(const LangOptions &Opts,
3038                                MacroBuilder &Builder) const;
3039
3040  virtual bool hasFeature(StringRef Feature) const {
3041    return Feature == "hexagon";
3042  }
3043
3044  virtual const char *getVAListDeclaration() const {
3045    return "typedef char* __builtin_va_list;";
3046  }
3047  virtual void getGCCRegNames(const char * const *&Names,
3048                              unsigned &NumNames) const;
3049  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3050                                unsigned &NumAliases) const;
3051  virtual const char *getClobbers() const {
3052    return "";
3053  }
3054
3055  static const char *getHexagonCPUSuffix(StringRef Name) {
3056    return llvm::StringSwitch<const char*>(Name)
3057      .Case("hexagonv2", "2")
3058      .Case("hexagonv3", "3")
3059      .Case("hexagonv4", "4")
3060      .Default(0);
3061  }
3062
3063  virtual bool setCPU(const std::string &Name) {
3064    if (!getHexagonCPUSuffix(Name))
3065      return false;
3066
3067    CPU = Name;
3068    return true;
3069  }
3070};
3071
3072void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
3073                                MacroBuilder &Builder) const {
3074  Builder.defineMacro("qdsp6");
3075  Builder.defineMacro("__qdsp6", "1");
3076  Builder.defineMacro("__qdsp6__", "1");
3077
3078  Builder.defineMacro("hexagon");
3079  Builder.defineMacro("__hexagon", "1");
3080  Builder.defineMacro("__hexagon__", "1");
3081
3082  if(CPU == "hexagonv1") {
3083    Builder.defineMacro("__HEXAGON_V1__");
3084    Builder.defineMacro("__HEXAGON_ARCH__", "1");
3085    if(Opts.HexagonQdsp6Compat) {
3086      Builder.defineMacro("__QDSP6_V1__");
3087      Builder.defineMacro("__QDSP6_ARCH__", "1");
3088    }
3089  }
3090  else if(CPU == "hexagonv2") {
3091    Builder.defineMacro("__HEXAGON_V2__");
3092    Builder.defineMacro("__HEXAGON_ARCH__", "2");
3093    if(Opts.HexagonQdsp6Compat) {
3094      Builder.defineMacro("__QDSP6_V2__");
3095      Builder.defineMacro("__QDSP6_ARCH__", "2");
3096    }
3097  }
3098  else if(CPU == "hexagonv3") {
3099    Builder.defineMacro("__HEXAGON_V3__");
3100    Builder.defineMacro("__HEXAGON_ARCH__", "3");
3101    if(Opts.HexagonQdsp6Compat) {
3102      Builder.defineMacro("__QDSP6_V3__");
3103      Builder.defineMacro("__QDSP6_ARCH__", "3");
3104    }
3105  }
3106  else if(CPU == "hexagonv4") {
3107    Builder.defineMacro("__HEXAGON_V4__");
3108    Builder.defineMacro("__HEXAGON_ARCH__", "4");
3109    if(Opts.HexagonQdsp6Compat) {
3110      Builder.defineMacro("__QDSP6_V4__");
3111      Builder.defineMacro("__QDSP6_ARCH__", "4");
3112    }
3113  }
3114}
3115
3116const char * const HexagonTargetInfo::GCCRegNames[] = {
3117  "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3118  "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3119  "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3120  "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
3121  "p0", "p1", "p2", "p3",
3122  "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
3123};
3124
3125void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
3126                                   unsigned &NumNames) const {
3127  Names = GCCRegNames;
3128  NumNames = llvm::array_lengthof(GCCRegNames);
3129}
3130
3131
3132const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
3133  { { "sp" }, "r29" },
3134  { { "fp" }, "r30" },
3135  { { "lr" }, "r31" },
3136 };
3137
3138void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3139                                     unsigned &NumAliases) const {
3140  Aliases = GCCRegAliases;
3141  NumAliases = llvm::array_lengthof(GCCRegAliases);
3142}
3143
3144
3145const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
3146#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3147#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3148                                              ALL_LANGUAGES },
3149#include "clang/Basic/BuiltinsHexagon.def"
3150};
3151}
3152
3153
3154namespace {
3155class SparcV8TargetInfo : public TargetInfo {
3156  static const TargetInfo::GCCRegAlias GCCRegAliases[];
3157  static const char * const GCCRegNames[];
3158  bool SoftFloat;
3159public:
3160  SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
3161    // FIXME: Support Sparc quad-precision long double?
3162    BigEndian = false;
3163    DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3164                        "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
3165  }
3166  virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
3167                                 StringRef Name,
3168                                 bool Enabled) const {
3169    if (Name == "soft-float")
3170      Features[Name] = Enabled;
3171    else
3172      return false;
3173
3174    return true;
3175  }
3176  virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
3177    SoftFloat = false;
3178    for (unsigned i = 0, e = Features.size(); i != e; ++i)
3179      if (Features[i] == "+soft-float")
3180        SoftFloat = true;
3181  }
3182  virtual void getTargetDefines(const LangOptions &Opts,
3183                                MacroBuilder &Builder) const {
3184    DefineStd(Builder, "sparc", Opts);
3185    Builder.defineMacro("__sparcv8");
3186    Builder.defineMacro("__REGISTER_PREFIX__", "");
3187
3188    if (SoftFloat)
3189      Builder.defineMacro("SOFT_FLOAT", "1");
3190  }
3191
3192  virtual bool hasFeature(StringRef Feature) const {
3193    return llvm::StringSwitch<bool>(Feature)
3194             .Case("softfloat", SoftFloat)
3195             .Case("sparc", true)
3196             .Default(false);
3197  }
3198
3199  virtual void getTargetBuiltins(const Builtin::Info *&Records,
3200                                 unsigned &NumRecords) const {
3201    // FIXME: Implement!
3202  }
3203  virtual const char *getVAListDeclaration() const {
3204    return "typedef void* __builtin_va_list;";
3205  }
3206  virtual void getGCCRegNames(const char * const *&Names,
3207                              unsigned &NumNames) const;
3208  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3209                                unsigned &NumAliases) const;
3210  virtual bool validateAsmConstraint(const char *&Name,
3211                                     TargetInfo::ConstraintInfo &info) const {
3212    // FIXME: Implement!
3213    return false;
3214  }
3215  virtual const char *getClobbers() const {
3216    // FIXME: Implement!
3217    return "";
3218  }
3219};
3220
3221const char * const SparcV8TargetInfo::GCCRegNames[] = {
3222  "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3223  "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3224  "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3225  "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
3226};
3227
3228void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
3229                                       unsigned &NumNames) const {
3230  Names = GCCRegNames;
3231  NumNames = llvm::array_lengthof(GCCRegNames);
3232}
3233
3234const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
3235  { { "g0" }, "r0" },
3236  { { "g1" }, "r1" },
3237  { { "g2" }, "r2" },
3238  { { "g3" }, "r3" },
3239  { { "g4" }, "r4" },
3240  { { "g5" }, "r5" },
3241  { { "g6" }, "r6" },
3242  { { "g7" }, "r7" },
3243  { { "o0" }, "r8" },
3244  { { "o1" }, "r9" },
3245  { { "o2" }, "r10" },
3246  { { "o3" }, "r11" },
3247  { { "o4" }, "r12" },
3248  { { "o5" }, "r13" },
3249  { { "o6", "sp" }, "r14" },
3250  { { "o7" }, "r15" },
3251  { { "l0" }, "r16" },
3252  { { "l1" }, "r17" },
3253  { { "l2" }, "r18" },
3254  { { "l3" }, "r19" },
3255  { { "l4" }, "r20" },
3256  { { "l5" }, "r21" },
3257  { { "l6" }, "r22" },
3258  { { "l7" }, "r23" },
3259  { { "i0" }, "r24" },
3260  { { "i1" }, "r25" },
3261  { { "i2" }, "r26" },
3262  { { "i3" }, "r27" },
3263  { { "i4" }, "r28" },
3264  { { "i5" }, "r29" },
3265  { { "i6", "fp" }, "r30" },
3266  { { "i7" }, "r31" },
3267};
3268
3269void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3270                                         unsigned &NumAliases) const {
3271  Aliases = GCCRegAliases;
3272  NumAliases = llvm::array_lengthof(GCCRegAliases);
3273}
3274} // end anonymous namespace.
3275
3276namespace {
3277class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
3278public:
3279  AuroraUXSparcV8TargetInfo(const std::string& triple) :
3280      AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
3281    SizeType = UnsignedInt;
3282    PtrDiffType = SignedInt;
3283  }
3284};
3285class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
3286public:
3287  SolarisSparcV8TargetInfo(const std::string& triple) :
3288      SolarisTargetInfo<SparcV8TargetInfo>(triple) {
3289    SizeType = UnsignedInt;
3290    PtrDiffType = SignedInt;
3291  }
3292};
3293} // end anonymous namespace.
3294
3295namespace {
3296  class MSP430TargetInfo : public TargetInfo {
3297    static const char * const GCCRegNames[];
3298  public:
3299    MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
3300      BigEndian = false;
3301      TLSSupported = false;
3302      IntWidth = 16; IntAlign = 16;
3303      LongWidth = 32; LongLongWidth = 64;
3304      LongAlign = LongLongAlign = 16;
3305      PointerWidth = 16; PointerAlign = 16;
3306      SuitableAlign = 16;
3307      SizeType = UnsignedInt;
3308      IntMaxType = SignedLong;
3309      UIntMaxType = UnsignedLong;
3310      IntPtrType = SignedShort;
3311      PtrDiffType = SignedInt;
3312      SigAtomicType = SignedLong;
3313      DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
3314   }
3315    virtual void getTargetDefines(const LangOptions &Opts,
3316                                  MacroBuilder &Builder) const {
3317      Builder.defineMacro("MSP430");
3318      Builder.defineMacro("__MSP430__");
3319      // FIXME: defines for different 'flavours' of MCU
3320    }
3321    virtual void getTargetBuiltins(const Builtin::Info *&Records,
3322                                   unsigned &NumRecords) const {
3323     // FIXME: Implement.
3324      Records = 0;
3325      NumRecords = 0;
3326    }
3327    virtual bool hasFeature(StringRef Feature) const {
3328      return Feature == "msp430";
3329    }
3330    virtual void getGCCRegNames(const char * const *&Names,
3331                                unsigned &NumNames) const;
3332    virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3333                                  unsigned &NumAliases) const {
3334      // No aliases.
3335      Aliases = 0;
3336      NumAliases = 0;
3337    }
3338    virtual bool validateAsmConstraint(const char *&Name,
3339                                       TargetInfo::ConstraintInfo &info) const {
3340      // No target constraints for now.
3341      return false;
3342    }
3343    virtual const char *getClobbers() const {
3344      // FIXME: Is this really right?
3345      return "";
3346    }
3347    virtual const char *getVAListDeclaration() const {
3348      // FIXME: implement
3349      return "typedef char* __builtin_va_list;";
3350   }
3351  };
3352
3353  const char * const MSP430TargetInfo::GCCRegNames[] = {
3354    "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3355    "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
3356  };
3357
3358  void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
3359                                        unsigned &NumNames) const {
3360    Names = GCCRegNames;
3361    NumNames = llvm::array_lengthof(GCCRegNames);
3362  }
3363}
3364
3365namespace {
3366
3367  // LLVM and Clang cannot be used directly to output native binaries for
3368  // target, but is used to compile C code to llvm bitcode with correct
3369  // type and alignment information.
3370  //
3371  // TCE uses the llvm bitcode as input and uses it for generating customized
3372  // target processor and program binary. TCE co-design environment is
3373  // publicly available in http://tce.cs.tut.fi
3374
3375  static const unsigned TCEOpenCLAddrSpaceMap[] = {
3376      3, // opencl_global
3377      4, // opencl_local
3378      5  // opencl_constant
3379  };
3380
3381  class TCETargetInfo : public TargetInfo{
3382  public:
3383    TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
3384      TLSSupported = false;
3385      IntWidth = 32;
3386      LongWidth = LongLongWidth = 32;
3387      PointerWidth = 32;
3388      IntAlign = 32;
3389      LongAlign = LongLongAlign = 32;
3390      PointerAlign = 32;
3391      SuitableAlign = 32;
3392      SizeType = UnsignedInt;
3393      IntMaxType = SignedLong;
3394      UIntMaxType = UnsignedLong;
3395      IntPtrType = SignedInt;
3396      PtrDiffType = SignedInt;
3397      FloatWidth = 32;
3398      FloatAlign = 32;
3399      DoubleWidth = 32;
3400      DoubleAlign = 32;
3401      LongDoubleWidth = 32;
3402      LongDoubleAlign = 32;
3403      FloatFormat = &llvm::APFloat::IEEEsingle;
3404      DoubleFormat = &llvm::APFloat::IEEEsingle;
3405      LongDoubleFormat = &llvm::APFloat::IEEEsingle;
3406      DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
3407                          "i16:16:32-i32:32:32-i64:32:32-"
3408                          "f32:32:32-f64:32:32-v64:32:32-"
3409                          "v128:32:32-a0:0:32-n32";
3410      AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
3411    }
3412
3413    virtual void getTargetDefines(const LangOptions &Opts,
3414                                  MacroBuilder &Builder) const {
3415      DefineStd(Builder, "tce", Opts);
3416      Builder.defineMacro("__TCE__");
3417      Builder.defineMacro("__TCE_V1__");
3418    }
3419    virtual bool hasFeature(StringRef Feature) const {
3420      return Feature == "tce";
3421    }
3422
3423    virtual void getTargetBuiltins(const Builtin::Info *&Records,
3424                                   unsigned &NumRecords) const {}
3425    virtual const char *getClobbers() const {
3426      return "";
3427    }
3428    virtual const char *getVAListDeclaration() const {
3429      return "typedef void* __builtin_va_list;";
3430    }
3431    virtual void getGCCRegNames(const char * const *&Names,
3432                                unsigned &NumNames) const {}
3433    virtual bool validateAsmConstraint(const char *&Name,
3434                                       TargetInfo::ConstraintInfo &info) const {
3435      return true;
3436    }
3437    virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3438                                  unsigned &NumAliases) const {}
3439  };
3440}
3441
3442namespace {
3443class MipsTargetInfoBase : public TargetInfo {
3444  std::string CPU;
3445  bool SoftFloat;
3446  bool SingleFloat;
3447
3448protected:
3449  std::string ABI;
3450
3451public:
3452  MipsTargetInfoBase(const std::string& triple,
3453                     const std::string& ABIStr,
3454                     const std::string& CPUStr)
3455    : TargetInfo(triple),
3456      CPU(CPUStr),
3457      SoftFloat(false), SingleFloat(false),
3458      ABI(ABIStr)
3459  {}
3460
3461  virtual const char *getABI() const { return ABI.c_str(); }
3462  virtual bool setABI(const std::string &Name) = 0;
3463  virtual bool setCPU(const std::string &Name) {
3464    CPU = Name;
3465    return true;
3466  }
3467  void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
3468    Features[ABI] = true;
3469    Features[CPU] = true;
3470  }
3471
3472  virtual void getArchDefines(const LangOptions &Opts,
3473                              MacroBuilder &Builder) const {
3474    if (SoftFloat)
3475      Builder.defineMacro("__mips_soft_float", Twine(1));
3476    else if (SingleFloat)
3477      Builder.defineMacro("__mips_single_float", Twine(1));
3478    else if (!SoftFloat && !SingleFloat)
3479      Builder.defineMacro("__mips_hard_float", Twine(1));
3480    else
3481      llvm_unreachable("Invalid float ABI for Mips.");
3482
3483    Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
3484    Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
3485    Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
3486  }
3487
3488  virtual void getTargetDefines(const LangOptions &Opts,
3489                                MacroBuilder &Builder) const = 0;
3490  virtual void getTargetBuiltins(const Builtin::Info *&Records,
3491                                 unsigned &NumRecords) const {
3492    // FIXME: Implement!
3493  }
3494  virtual bool hasFeature(StringRef Feature) const {
3495    return Feature == "mips";
3496  }
3497  virtual const char *getVAListDeclaration() const {
3498    return "typedef void* __builtin_va_list;";
3499  }
3500  virtual void getGCCRegNames(const char * const *&Names,
3501                              unsigned &NumNames) const {
3502    static const char * const GCCRegNames[] = {
3503      // CPU register names
3504      // Must match second column of GCCRegAliases
3505      "$0",   "$1",   "$2",   "$3",   "$4",   "$5",   "$6",   "$7",
3506      "$8",   "$9",   "$10",  "$11",  "$12",  "$13",  "$14",  "$15",
3507      "$16",  "$17",  "$18",  "$19",  "$20",  "$21",  "$22",  "$23",
3508      "$24",  "$25",  "$26",  "$27",  "$28",  "$29",  "$30",  "$31",
3509      // Floating point register names
3510      "$f0",  "$f1",  "$f2",  "$f3",  "$f4",  "$f5",  "$f6",  "$f7",
3511      "$f8",  "$f9",  "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
3512      "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
3513      "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
3514      // Hi/lo and condition register names
3515      "hi",   "lo",   "",     "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
3516      "$fcc5","$fcc6","$fcc7"
3517    };
3518    Names = GCCRegNames;
3519    NumNames = llvm::array_lengthof(GCCRegNames);
3520  }
3521  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3522                                unsigned &NumAliases) const = 0;
3523  virtual bool validateAsmConstraint(const char *&Name,
3524                                     TargetInfo::ConstraintInfo &Info) const {
3525    switch (*Name) {
3526    default:
3527      return false;
3528
3529    case 'r': // CPU registers.
3530    case 'd': // Equivalent to "r" unless generating MIPS16 code.
3531    case 'y': // Equivalent to "r", backwards compatibility only.
3532    case 'f': // floating-point registers.
3533    case 'c': // $25 for indirect jumps
3534    case 'l': // lo register
3535    case 'x': // hilo register pair
3536      Info.setAllowsRegister();
3537      return true;
3538    }
3539  }
3540
3541  virtual const char *getClobbers() const {
3542    // FIXME: Implement!
3543    return "";
3544  }
3545
3546  virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
3547                                 StringRef Name,
3548                                 bool Enabled) const {
3549    if (Name == "soft-float" || Name == "single-float" ||
3550        Name == "o32" || Name == "n32" || Name == "n64" || Name == "eabi" ||
3551        Name == "mips32" || Name == "mips32r2" ||
3552        Name == "mips64" || Name == "mips64r2") {
3553      Features[Name] = Enabled;
3554      return true;
3555    }
3556    return false;
3557  }
3558
3559  virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
3560    SoftFloat = false;
3561    SingleFloat = false;
3562
3563    for (std::vector<std::string>::iterator it = Features.begin(),
3564         ie = Features.end(); it != ie; ++it) {
3565      if (*it == "+single-float") {
3566        SingleFloat = true;
3567        break;
3568      }
3569
3570      if (*it == "+soft-float") {
3571        SoftFloat = true;
3572        // This option is front-end specific.
3573        // Do not need to pass it to the backend.
3574        Features.erase(it);
3575        break;
3576      }
3577    }
3578  }
3579};
3580
3581class Mips32TargetInfoBase : public MipsTargetInfoBase {
3582public:
3583  Mips32TargetInfoBase(const std::string& triple) :
3584    MipsTargetInfoBase(triple, "o32", "mips32") {
3585    SizeType = UnsignedInt;
3586    PtrDiffType = SignedInt;
3587  }
3588  virtual bool setABI(const std::string &Name) {
3589    if ((Name == "o32") || (Name == "eabi")) {
3590      ABI = Name;
3591      return true;
3592    } else
3593      return false;
3594  }
3595  virtual void getArchDefines(const LangOptions &Opts,
3596                              MacroBuilder &Builder) const {
3597    MipsTargetInfoBase::getArchDefines(Opts, Builder);
3598
3599    if (ABI == "o32") {
3600      Builder.defineMacro("__mips_o32");
3601      Builder.defineMacro("_ABIO32", "1");
3602      Builder.defineMacro("_MIPS_SIM", "_ABIO32");
3603    }
3604    else if (ABI == "eabi")
3605      Builder.defineMacro("__mips_eabi");
3606    else
3607      llvm_unreachable("Invalid ABI for Mips32.");
3608  }
3609  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3610                                unsigned &NumAliases) const {
3611    static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
3612      { { "at" },  "$1" },
3613      { { "v0" },  "$2" },
3614      { { "v1" },  "$3" },
3615      { { "a0" },  "$4" },
3616      { { "a1" },  "$5" },
3617      { { "a2" },  "$6" },
3618      { { "a3" },  "$7" },
3619      { { "t0" },  "$8" },
3620      { { "t1" },  "$9" },
3621      { { "t2" }, "$10" },
3622      { { "t3" }, "$11" },
3623      { { "t4" }, "$12" },
3624      { { "t5" }, "$13" },
3625      { { "t6" }, "$14" },
3626      { { "t7" }, "$15" },
3627      { { "s0" }, "$16" },
3628      { { "s1" }, "$17" },
3629      { { "s2" }, "$18" },
3630      { { "s3" }, "$19" },
3631      { { "s4" }, "$20" },
3632      { { "s5" }, "$21" },
3633      { { "s6" }, "$22" },
3634      { { "s7" }, "$23" },
3635      { { "t8" }, "$24" },
3636      { { "t9" }, "$25" },
3637      { { "k0" }, "$26" },
3638      { { "k1" }, "$27" },
3639      { { "gp" }, "$28" },
3640      { { "sp","$sp" }, "$29" },
3641      { { "fp","$fp" }, "$30" },
3642      { { "ra" }, "$31" }
3643    };
3644    Aliases = GCCRegAliases;
3645    NumAliases = llvm::array_lengthof(GCCRegAliases);
3646  }
3647};
3648
3649class Mips32EBTargetInfo : public Mips32TargetInfoBase {
3650public:
3651  Mips32EBTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
3652    DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
3653                        "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
3654  }
3655  virtual void getTargetDefines(const LangOptions &Opts,
3656                                MacroBuilder &Builder) const {
3657    DefineStd(Builder, "mips", Opts);
3658    Builder.defineMacro("_mips");
3659    DefineStd(Builder, "MIPSEB", Opts);
3660    Builder.defineMacro("_MIPSEB");
3661    Builder.defineMacro("__REGISTER_PREFIX__", "");
3662    getArchDefines(Opts, Builder);
3663  }
3664};
3665
3666class Mips32ELTargetInfo : public Mips32TargetInfoBase {
3667public:
3668  Mips32ELTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
3669    BigEndian = false;
3670    DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
3671                        "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
3672  }
3673  virtual void getTargetDefines(const LangOptions &Opts,
3674                                MacroBuilder &Builder) const {
3675    DefineStd(Builder, "mips", Opts);
3676    Builder.defineMacro("_mips");
3677    DefineStd(Builder, "MIPSEL", Opts);
3678    Builder.defineMacro("_MIPSEL");
3679    Builder.defineMacro("__REGISTER_PREFIX__", "");
3680    getArchDefines(Opts, Builder);
3681  }
3682};
3683
3684class Mips64TargetInfoBase : public MipsTargetInfoBase {
3685  virtual void SetDescriptionString(const std::string &Name) = 0;
3686public:
3687  Mips64TargetInfoBase(const std::string& triple) :
3688    MipsTargetInfoBase(triple, "n64", "mips64") {
3689    LongWidth = LongAlign = 64;
3690    PointerWidth = PointerAlign = 64;
3691    LongDoubleWidth = LongDoubleAlign = 128;
3692    LongDoubleFormat = &llvm::APFloat::IEEEquad;
3693    SuitableAlign = 128;
3694  }
3695  virtual bool setABI(const std::string &Name) {
3696    SetDescriptionString(Name);
3697
3698    if (Name != "n32" && Name != "n64")
3699      return false;
3700
3701    ABI = Name;
3702
3703    if (Name == "n32") {
3704      LongWidth = LongAlign = 32;
3705      PointerWidth = PointerAlign = 32;
3706    }
3707
3708    return true;
3709  }
3710  virtual void getArchDefines(const LangOptions &Opts,
3711                              MacroBuilder &Builder) const {
3712    MipsTargetInfoBase::getArchDefines(Opts, Builder);
3713
3714    if (ABI == "n32") {
3715      Builder.defineMacro("__mips_n32");
3716      Builder.defineMacro("_ABIN32", "2");
3717      Builder.defineMacro("_MIPS_SIM", "_ABIN32");
3718    }
3719    else if (ABI == "n64") {
3720      Builder.defineMacro("__mips_n64");
3721      Builder.defineMacro("_ABI64", "3");
3722      Builder.defineMacro("_MIPS_SIM", "_ABI64");
3723    }
3724    else
3725      llvm_unreachable("Invalid ABI for Mips64.");
3726  }
3727  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3728                                unsigned &NumAliases) const {
3729    static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
3730      { { "at" },  "$1" },
3731      { { "v0" },  "$2" },
3732      { { "v1" },  "$3" },
3733      { { "a0" },  "$4" },
3734      { { "a1" },  "$5" },
3735      { { "a2" },  "$6" },
3736      { { "a3" },  "$7" },
3737      { { "a4" },  "$8" },
3738      { { "a5" },  "$9" },
3739      { { "a6" }, "$10" },
3740      { { "a7" }, "$11" },
3741      { { "t0" }, "$12" },
3742      { { "t1" }, "$13" },
3743      { { "t2" }, "$14" },
3744      { { "t3" }, "$15" },
3745      { { "s0" }, "$16" },
3746      { { "s1" }, "$17" },
3747      { { "s2" }, "$18" },
3748      { { "s3" }, "$19" },
3749      { { "s4" }, "$20" },
3750      { { "s5" }, "$21" },
3751      { { "s6" }, "$22" },
3752      { { "s7" }, "$23" },
3753      { { "t8" }, "$24" },
3754      { { "t9" }, "$25" },
3755      { { "k0" }, "$26" },
3756      { { "k1" }, "$27" },
3757      { { "gp" }, "$28" },
3758      { { "sp","$sp" }, "$29" },
3759      { { "fp","$fp" }, "$30" },
3760      { { "ra" }, "$31" }
3761    };
3762    Aliases = GCCRegAliases;
3763    NumAliases = llvm::array_lengthof(GCCRegAliases);
3764  }
3765};
3766
3767class Mips64EBTargetInfo : public Mips64TargetInfoBase {
3768  virtual void SetDescriptionString(const std::string &Name) {
3769    // Change DescriptionString only if ABI is n32.
3770    if (Name == "n32")
3771      DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
3772                          "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
3773                          "v64:64:64-n32";
3774  }
3775public:
3776  Mips64EBTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
3777    // Default ABI is n64.
3778    DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
3779                        "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
3780                        "v64:64:64-n32";
3781  }
3782  virtual void getTargetDefines(const LangOptions &Opts,
3783                                MacroBuilder &Builder) const {
3784    DefineStd(Builder, "mips", Opts);
3785    Builder.defineMacro("_mips");
3786    DefineStd(Builder, "MIPSEB", Opts);
3787    Builder.defineMacro("_MIPSEB");
3788    Builder.defineMacro("__REGISTER_PREFIX__", "");
3789    getArchDefines(Opts, Builder);
3790  }
3791};
3792
3793class Mips64ELTargetInfo : public Mips64TargetInfoBase {
3794  virtual void SetDescriptionString(const std::string &Name) {
3795    // Change DescriptionString only if ABI is n32.
3796    if (Name == "n32")
3797      DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
3798                          "i64:64:64-f32:32:32-f64:64:64-f128:128:128"
3799                          "-v64:64:64-n32";
3800  }
3801public:
3802  Mips64ELTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
3803    // Default ABI is n64.
3804    BigEndian = false;
3805    DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
3806                        "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
3807                        "v64:64:64-n32";
3808  }
3809  virtual void getTargetDefines(const LangOptions &Opts,
3810                                MacroBuilder &Builder) const {
3811    DefineStd(Builder, "mips", Opts);
3812    Builder.defineMacro("_mips");
3813    DefineStd(Builder, "MIPSEL", Opts);
3814    Builder.defineMacro("_MIPSEL");
3815    Builder.defineMacro("__REGISTER_PREFIX__", "");
3816    getArchDefines(Opts, Builder);
3817  }
3818};
3819} // end anonymous namespace.
3820
3821namespace {
3822class PNaClTargetInfo : public TargetInfo {
3823public:
3824  PNaClTargetInfo(const std::string& triple) : TargetInfo(triple) {
3825    BigEndian = false;
3826    this->UserLabelPrefix = "";
3827    this->LongAlign = 32;
3828    this->LongWidth = 32;
3829    this->PointerAlign = 32;
3830    this->PointerWidth = 32;
3831    this->IntMaxType = TargetInfo::SignedLongLong;
3832    this->UIntMaxType = TargetInfo::UnsignedLongLong;
3833    this->Int64Type = TargetInfo::SignedLongLong;
3834    this->DoubleAlign = 64;
3835    this->LongDoubleWidth = 64;
3836    this->LongDoubleAlign = 64;
3837    this->SizeType = TargetInfo::UnsignedInt;
3838    this->PtrDiffType = TargetInfo::SignedInt;
3839    this->IntPtrType = TargetInfo::SignedInt;
3840    this->RegParmMax = 2;
3841    DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
3842                        "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
3843  }
3844
3845  void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
3846  }
3847  virtual void getArchDefines(const LangOptions &Opts,
3848                              MacroBuilder &Builder) const {
3849    Builder.defineMacro("__le32__");
3850    Builder.defineMacro("__pnacl__");
3851  }
3852  virtual void getTargetDefines(const LangOptions &Opts,
3853                                MacroBuilder &Builder) const {
3854    DefineStd(Builder, "unix", Opts);
3855    Builder.defineMacro("__ELF__");
3856    if (Opts.POSIXThreads)
3857      Builder.defineMacro("_REENTRANT");
3858    if (Opts.CPlusPlus)
3859      Builder.defineMacro("_GNU_SOURCE");
3860
3861    Builder.defineMacro("__LITTLE_ENDIAN__");
3862    Builder.defineMacro("__native_client__");
3863    getArchDefines(Opts, Builder);
3864  }
3865  virtual bool hasFeature(StringRef Feature) const {
3866    return Feature == "pnacl";
3867  }
3868  virtual void getTargetBuiltins(const Builtin::Info *&Records,
3869                                 unsigned &NumRecords) const {
3870  }
3871  virtual const char *getVAListDeclaration() const {
3872    return "typedef int __builtin_va_list[4];";
3873  }
3874  virtual void getGCCRegNames(const char * const *&Names,
3875                              unsigned &NumNames) const;
3876  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3877                                unsigned &NumAliases) const;
3878  virtual bool validateAsmConstraint(const char *&Name,
3879                                     TargetInfo::ConstraintInfo &Info) const {
3880    return false;
3881  }
3882
3883  virtual const char *getClobbers() const {
3884    return "";
3885  }
3886};
3887
3888void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
3889                                     unsigned &NumNames) const {
3890  Names = NULL;
3891  NumNames = 0;
3892}
3893
3894void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3895                                       unsigned &NumAliases) const {
3896  Aliases = NULL;
3897  NumAliases = 0;
3898}
3899} // end anonymous namespace.
3900
3901
3902//===----------------------------------------------------------------------===//
3903// Driver code
3904//===----------------------------------------------------------------------===//
3905
3906static TargetInfo *AllocateTarget(const std::string &T) {
3907  llvm::Triple Triple(T);
3908  llvm::Triple::OSType os = Triple.getOS();
3909
3910  switch (Triple.getArch()) {
3911  default:
3912    return NULL;
3913
3914  case llvm::Triple::hexagon:
3915    return new HexagonTargetInfo(T);
3916
3917  case llvm::Triple::arm:
3918  case llvm::Triple::thumb:
3919    if (Triple.isOSDarwin())
3920      return new DarwinARMTargetInfo(T);
3921
3922    switch (os) {
3923    case llvm::Triple::Linux:
3924      return new LinuxTargetInfo<ARMTargetInfo>(T);
3925    case llvm::Triple::FreeBSD:
3926      return new FreeBSDTargetInfo<ARMTargetInfo>(T);
3927    case llvm::Triple::NetBSD:
3928      return new NetBSDTargetInfo<ARMTargetInfo>(T);
3929    case llvm::Triple::RTEMS:
3930      return new RTEMSTargetInfo<ARMTargetInfo>(T);
3931    default:
3932      return new ARMTargetInfo(T);
3933    }
3934
3935  case llvm::Triple::msp430:
3936    return new MSP430TargetInfo(T);
3937
3938  case llvm::Triple::mips:
3939    switch (os) {
3940    case llvm::Triple::Linux:
3941      return new LinuxTargetInfo<Mips32EBTargetInfo>(T);
3942    case llvm::Triple::RTEMS:
3943      return new RTEMSTargetInfo<Mips32EBTargetInfo>(T);
3944    case llvm::Triple::FreeBSD:
3945      return new FreeBSDTargetInfo<Mips32EBTargetInfo>(T);
3946    case llvm::Triple::NetBSD:
3947      return new NetBSDTargetInfo<Mips32EBTargetInfo>(T);
3948    default:
3949      return new Mips32EBTargetInfo(T);
3950    }
3951
3952  case llvm::Triple::mipsel:
3953    switch (os) {
3954    case llvm::Triple::Linux:
3955      return new LinuxTargetInfo<Mips32ELTargetInfo>(T);
3956    case llvm::Triple::RTEMS:
3957      return new RTEMSTargetInfo<Mips32ELTargetInfo>(T);
3958    case llvm::Triple::FreeBSD:
3959      return new FreeBSDTargetInfo<Mips32ELTargetInfo>(T);
3960    case llvm::Triple::NetBSD:
3961      return new NetBSDTargetInfo<Mips32ELTargetInfo>(T);
3962    default:
3963      return new Mips32ELTargetInfo(T);
3964    }
3965
3966  case llvm::Triple::mips64:
3967    switch (os) {
3968    case llvm::Triple::Linux:
3969      return new LinuxTargetInfo<Mips64EBTargetInfo>(T);
3970    case llvm::Triple::RTEMS:
3971      return new RTEMSTargetInfo<Mips64EBTargetInfo>(T);
3972    case llvm::Triple::FreeBSD:
3973      return new FreeBSDTargetInfo<Mips64EBTargetInfo>(T);
3974    case llvm::Triple::NetBSD:
3975      return new NetBSDTargetInfo<Mips64EBTargetInfo>(T);
3976    default:
3977      return new Mips64EBTargetInfo(T);
3978    }
3979
3980  case llvm::Triple::mips64el:
3981    switch (os) {
3982    case llvm::Triple::Linux:
3983      return new LinuxTargetInfo<Mips64ELTargetInfo>(T);
3984    case llvm::Triple::RTEMS:
3985      return new RTEMSTargetInfo<Mips64ELTargetInfo>(T);
3986    case llvm::Triple::FreeBSD:
3987      return new FreeBSDTargetInfo<Mips64ELTargetInfo>(T);
3988    case llvm::Triple::NetBSD:
3989      return new NetBSDTargetInfo<Mips64ELTargetInfo>(T);
3990    default:
3991      return new Mips64ELTargetInfo(T);
3992    }
3993
3994  case llvm::Triple::le32:
3995    switch (os) {
3996      case llvm::Triple::NativeClient:
3997        return new PNaClTargetInfo(T);
3998      default:
3999        return NULL;
4000    }
4001
4002  case llvm::Triple::ppc:
4003    if (Triple.isOSDarwin())
4004      return new DarwinPPC32TargetInfo(T);
4005    switch (os) {
4006    case llvm::Triple::Linux:
4007      return new LinuxTargetInfo<PPC32TargetInfo>(T);
4008    case llvm::Triple::FreeBSD:
4009      return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
4010    case llvm::Triple::NetBSD:
4011      return new NetBSDTargetInfo<PPC32TargetInfo>(T);
4012    case llvm::Triple::RTEMS:
4013      return new RTEMSTargetInfo<PPC32TargetInfo>(T);
4014    default:
4015      return new PPC32TargetInfo(T);
4016    }
4017
4018  case llvm::Triple::ppc64:
4019    if (Triple.isOSDarwin())
4020      return new DarwinPPC64TargetInfo(T);
4021    switch (os) {
4022    case llvm::Triple::Linux:
4023      return new LinuxTargetInfo<PPC64TargetInfo>(T);
4024    case llvm::Triple::Lv2:
4025      return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
4026    case llvm::Triple::FreeBSD:
4027      return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
4028    case llvm::Triple::NetBSD:
4029      return new NetBSDTargetInfo<PPC64TargetInfo>(T);
4030    default:
4031      return new PPC64TargetInfo(T);
4032    }
4033
4034  case llvm::Triple::ptx32:
4035    return new PTX32TargetInfo(T);
4036  case llvm::Triple::ptx64:
4037    return new PTX64TargetInfo(T);
4038
4039  case llvm::Triple::mblaze:
4040    return new MBlazeTargetInfo(T);
4041
4042  case llvm::Triple::sparc:
4043    switch (os) {
4044    case llvm::Triple::Linux:
4045      return new LinuxTargetInfo<SparcV8TargetInfo>(T);
4046    case llvm::Triple::AuroraUX:
4047      return new AuroraUXSparcV8TargetInfo(T);
4048    case llvm::Triple::Solaris:
4049      return new SolarisSparcV8TargetInfo(T);
4050    case llvm::Triple::NetBSD:
4051      return new NetBSDTargetInfo<SparcV8TargetInfo>(T);
4052    case llvm::Triple::RTEMS:
4053      return new RTEMSTargetInfo<SparcV8TargetInfo>(T);
4054    default:
4055      return new SparcV8TargetInfo(T);
4056    }
4057
4058  // FIXME: Need a real SPU target.
4059  case llvm::Triple::cellspu:
4060    return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
4061
4062  case llvm::Triple::tce:
4063    return new TCETargetInfo(T);
4064
4065  case llvm::Triple::x86:
4066    if (Triple.isOSDarwin())
4067      return new DarwinI386TargetInfo(T);
4068
4069    switch (os) {
4070    case llvm::Triple::AuroraUX:
4071      return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
4072    case llvm::Triple::Linux:
4073      return new LinuxTargetInfo<X86_32TargetInfo>(T);
4074    case llvm::Triple::DragonFly:
4075      return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
4076    case llvm::Triple::NetBSD:
4077      return new NetBSDI386TargetInfo(T);
4078    case llvm::Triple::OpenBSD:
4079      return new OpenBSDI386TargetInfo(T);
4080    case llvm::Triple::FreeBSD:
4081      return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
4082    case llvm::Triple::Minix:
4083      return new MinixTargetInfo<X86_32TargetInfo>(T);
4084    case llvm::Triple::Solaris:
4085      return new SolarisTargetInfo<X86_32TargetInfo>(T);
4086    case llvm::Triple::Cygwin:
4087      return new CygwinX86_32TargetInfo(T);
4088    case llvm::Triple::MinGW32:
4089      return new MinGWX86_32TargetInfo(T);
4090    case llvm::Triple::Win32:
4091      return new VisualStudioWindowsX86_32TargetInfo(T);
4092    case llvm::Triple::Haiku:
4093      return new HaikuX86_32TargetInfo(T);
4094    case llvm::Triple::RTEMS:
4095      return new RTEMSX86_32TargetInfo(T);
4096    default:
4097      return new X86_32TargetInfo(T);
4098    }
4099
4100  case llvm::Triple::x86_64:
4101    if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
4102      return new DarwinX86_64TargetInfo(T);
4103
4104    switch (os) {
4105    case llvm::Triple::AuroraUX:
4106      return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
4107    case llvm::Triple::Linux:
4108      return new LinuxTargetInfo<X86_64TargetInfo>(T);
4109    case llvm::Triple::DragonFly:
4110      return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
4111    case llvm::Triple::NetBSD:
4112      return new NetBSDTargetInfo<X86_64TargetInfo>(T);
4113    case llvm::Triple::OpenBSD:
4114      return new OpenBSDX86_64TargetInfo(T);
4115    case llvm::Triple::FreeBSD:
4116      return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
4117    case llvm::Triple::Solaris:
4118      return new SolarisTargetInfo<X86_64TargetInfo>(T);
4119    case llvm::Triple::MinGW32:
4120      return new MinGWX86_64TargetInfo(T);
4121    case llvm::Triple::Win32:   // This is what Triple.h supports now.
4122      return new VisualStudioWindowsX86_64TargetInfo(T);
4123    default:
4124      return new X86_64TargetInfo(T);
4125    }
4126  }
4127}
4128
4129/// CreateTargetInfo - Return the target info object for the specified target
4130/// triple.
4131TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
4132                                         TargetOptions &Opts) {
4133  llvm::Triple Triple(Opts.Triple);
4134
4135  // Construct the target
4136  OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
4137  if (!Target) {
4138    Diags.Report(diag::err_target_unknown_triple) << Triple.str();
4139    return 0;
4140  }
4141
4142  // Set the target CPU if specified.
4143  if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
4144    Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
4145    return 0;
4146  }
4147
4148  // Set the target ABI if specified.
4149  if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
4150    Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
4151    return 0;
4152  }
4153
4154  // Set the target C++ ABI.
4155  if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
4156    Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
4157    return 0;
4158  }
4159
4160  // Compute the default target features, we need the target to handle this
4161  // because features may have dependencies on one another.
4162  llvm::StringMap<bool> Features;
4163  Target->getDefaultFeatures(Features);
4164
4165  // Apply the user specified deltas.
4166  // First the enables.
4167  for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
4168         ie = Opts.Features.end(); it != ie; ++it) {
4169    const char *Name = it->c_str();
4170
4171    if (Name[0] != '+')
4172      continue;
4173
4174    // Apply the feature via the target.
4175    if (!Target->setFeatureEnabled(Features, Name + 1, true)) {
4176      Diags.Report(diag::err_target_invalid_feature) << Name;
4177      return 0;
4178    }
4179  }
4180
4181  // Then the disables.
4182  for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
4183         ie = Opts.Features.end(); it != ie; ++it) {
4184    const char *Name = it->c_str();
4185
4186    if (Name[0] == '+')
4187      continue;
4188
4189    // Apply the feature via the target.
4190    if (Name[0] != '-' ||
4191        !Target->setFeatureEnabled(Features, Name + 1, false)) {
4192      Diags.Report(diag::err_target_invalid_feature) << Name;
4193      return 0;
4194    }
4195  }
4196
4197  // Add the features to the compile options.
4198  //
4199  // FIXME: If we are completely confident that we have the right set, we only
4200  // need to pass the minuses.
4201  Opts.Features.clear();
4202  for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
4203         ie = Features.end(); it != ie; ++it)
4204    Opts.Features.push_back((it->second ? "+" : "-") + it->first().str());
4205  Target->HandleTargetFeatures(Opts.Features);
4206
4207  return Target.take();
4208}
4209