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