]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/clang/lib/Basic/Targets.cpp
MFV r276761: tcpdump 4.6.2.
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / clang / lib / Basic / Targets.cpp
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/STLExtras.h"
24 #include "llvm/ADT/StringRef.h"
25 #include "llvm/ADT/StringSwitch.h"
26 #include "llvm/ADT/Triple.h"
27 #include "llvm/IR/Type.h"
28 #include "llvm/MC/MCSectionMachO.h"
29 #include "llvm/Support/ErrorHandling.h"
30 #include <algorithm>
31 #include <memory>
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 static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
58                             bool Tuning = true) {
59   Builder.defineMacro("__" + CPUName);
60   Builder.defineMacro("__" + CPUName + "__");
61   if (Tuning)
62     Builder.defineMacro("__tune_" + CPUName + "__");
63 }
64
65 //===----------------------------------------------------------------------===//
66 // Defines specific to certain operating systems.
67 //===----------------------------------------------------------------------===//
68
69 namespace {
70 template<typename TgtInfo>
71 class OSTargetInfo : public TgtInfo {
72 protected:
73   virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
74                             MacroBuilder &Builder) const=0;
75 public:
76   OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
77   void getTargetDefines(const LangOptions &Opts,
78                         MacroBuilder &Builder) const override {
79     TgtInfo::getTargetDefines(Opts, Builder);
80     getOSDefines(Opts, TgtInfo::getTriple(), Builder);
81   }
82
83 };
84 } // end anonymous namespace
85
86
87 static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
88                              const llvm::Triple &Triple,
89                              StringRef &PlatformName,
90                              VersionTuple &PlatformMinVersion) {
91   Builder.defineMacro("__APPLE_CC__", "6000");
92   Builder.defineMacro("__APPLE__");
93   Builder.defineMacro("OBJC_NEW_PROPERTIES");
94   // AddressSanitizer doesn't play well with source fortification, which is on
95   // by default on Darwin.
96   if (Opts.Sanitize.Address) Builder.defineMacro("_FORTIFY_SOURCE", "0");
97
98   if (!Opts.ObjCAutoRefCount) {
99     // __weak is always defined, for use in blocks and with objc pointers.
100     Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
101
102     // Darwin defines __strong even in C mode (just to nothing).
103     if (Opts.getGC() != LangOptions::NonGC)
104       Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
105     else
106       Builder.defineMacro("__strong", "");
107
108     // __unsafe_unretained is defined to nothing in non-ARC mode. We even
109     // allow this in C, since one might have block pointers in structs that
110     // are used in pure C code and in Objective-C ARC.
111     Builder.defineMacro("__unsafe_unretained", "");
112   }
113
114   if (Opts.Static)
115     Builder.defineMacro("__STATIC__");
116   else
117     Builder.defineMacro("__DYNAMIC__");
118
119   if (Opts.POSIXThreads)
120     Builder.defineMacro("_REENTRANT");
121
122   // Get the platform type and version number from the triple.
123   unsigned Maj, Min, Rev;
124   if (Triple.isMacOSX()) {
125     Triple.getMacOSXVersion(Maj, Min, Rev);
126     PlatformName = "macosx";
127   } else {
128     Triple.getOSVersion(Maj, Min, Rev);
129     PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
130   }
131
132   // If -target arch-pc-win32-macho option specified, we're
133   // generating code for Win32 ABI. No need to emit
134   // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
135   if (PlatformName == "win32") {
136     PlatformMinVersion = VersionTuple(Maj, Min, Rev);
137     return;
138   }
139
140   // Set the appropriate OS version define.
141   if (Triple.isiOS()) {
142     assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
143     char Str[6];
144     Str[0] = '0' + Maj;
145     Str[1] = '0' + (Min / 10);
146     Str[2] = '0' + (Min % 10);
147     Str[3] = '0' + (Rev / 10);
148     Str[4] = '0' + (Rev % 10);
149     Str[5] = '\0';
150     Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
151                         Str);
152   } else if (Triple.isMacOSX()) {
153     // Note that the Driver allows versions which aren't representable in the
154     // define (because we only get a single digit for the minor and micro
155     // revision numbers). So, we limit them to the maximum representable
156     // version.
157     assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
158     char Str[7];
159     if (Maj < 10 || (Maj == 10 && Min < 10)) {
160       Str[0] = '0' + (Maj / 10);
161       Str[1] = '0' + (Maj % 10);
162       Str[2] = '0' + std::min(Min, 9U);
163       Str[3] = '0' + std::min(Rev, 9U);
164       Str[4] = '\0';
165     } else {
166       // Handle versions > 10.9.
167       Str[0] = '0' + (Maj / 10);
168       Str[1] = '0' + (Maj % 10);
169       Str[2] = '0' + (Min / 10);
170       Str[3] = '0' + (Min % 10);
171       Str[4] = '0' + (Rev / 10);
172       Str[5] = '0' + (Rev % 10);
173       Str[6] = '\0';
174     }
175     Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
176   }
177
178   // Tell users about the kernel if there is one.
179   if (Triple.isOSDarwin())
180     Builder.defineMacro("__MACH__");
181
182   PlatformMinVersion = VersionTuple(Maj, Min, Rev);
183 }
184
185 namespace {
186 template<typename Target>
187 class DarwinTargetInfo : public OSTargetInfo<Target> {
188 protected:
189   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
190                     MacroBuilder &Builder) const override {
191     getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
192                      this->PlatformMinVersion);
193   }
194
195 public:
196   DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
197     this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
198     this->MCountName = "\01mcount";
199   }
200
201   std::string isValidSectionSpecifier(StringRef SR) const override {
202     // Let MCSectionMachO validate this.
203     StringRef Segment, Section;
204     unsigned TAA, StubSize;
205     bool HasTAA;
206     return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
207                                                        TAA, HasTAA, StubSize);
208   }
209
210   const char *getStaticInitSectionSpecifier() const override {
211     // FIXME: We should return 0 when building kexts.
212     return "__TEXT,__StaticInit,regular,pure_instructions";
213   }
214
215   /// Darwin does not support protected visibility.  Darwin's "default"
216   /// is very similar to ELF's "protected";  Darwin requires a "weak"
217   /// attribute on declarations that can be dynamically replaced.
218   bool hasProtectedVisibility() const override {
219     return false;
220   }
221 };
222
223
224 // DragonFlyBSD Target
225 template<typename Target>
226 class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
227 protected:
228   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
229                     MacroBuilder &Builder) const override {
230     // DragonFly defines; list based off of gcc output
231     Builder.defineMacro("__DragonFly__");
232     Builder.defineMacro("__DragonFly_cc_version", "100001");
233     Builder.defineMacro("__ELF__");
234     Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
235     Builder.defineMacro("__tune_i386__");
236     DefineStd(Builder, "unix", Opts);
237   }
238 public:
239   DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
240       : OSTargetInfo<Target>(Triple) {
241     this->UserLabelPrefix = "";
242
243     switch (Triple.getArch()) {
244     default:
245     case llvm::Triple::x86:
246     case llvm::Triple::x86_64:
247       this->MCountName = ".mcount";
248       break;
249     }
250   }
251 };
252
253 // FreeBSD Target
254 template<typename Target>
255 class FreeBSDTargetInfo : public OSTargetInfo<Target> {
256 protected:
257   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
258                     MacroBuilder &Builder) const override {
259     // FreeBSD defines; list based off of gcc output
260
261     unsigned Release = Triple.getOSMajorVersion();
262     if (Release == 0U)
263       Release = 8;
264
265     Builder.defineMacro("__FreeBSD__", Twine(Release));
266     Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
267     Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
268     DefineStd(Builder, "unix", Opts);
269     Builder.defineMacro("__ELF__");
270
271     // On FreeBSD, wchar_t contains the number of the code point as
272     // used by the character set of the locale. These character sets are
273     // not necessarily a superset of ASCII.
274     Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
275   }
276 public:
277   FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
278     this->UserLabelPrefix = "";
279
280     switch (Triple.getArch()) {
281     default:
282     case llvm::Triple::x86:
283     case llvm::Triple::x86_64:
284       this->MCountName = ".mcount";
285       break;
286     case llvm::Triple::mips:
287     case llvm::Triple::mipsel:
288     case llvm::Triple::ppc:
289     case llvm::Triple::ppc64:
290     case llvm::Triple::ppc64le:
291       this->MCountName = "_mcount";
292       break;
293     case llvm::Triple::arm:
294       this->MCountName = "__mcount";
295       break;
296     }
297   }
298 };
299
300 // GNU/kFreeBSD Target
301 template<typename Target>
302 class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
303 protected:
304   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
305                     MacroBuilder &Builder) const override {
306     // GNU/kFreeBSD defines; list based off of gcc output
307
308     DefineStd(Builder, "unix", Opts);
309     Builder.defineMacro("__FreeBSD_kernel__");
310     Builder.defineMacro("__GLIBC__");
311     Builder.defineMacro("__ELF__");
312     if (Opts.POSIXThreads)
313       Builder.defineMacro("_REENTRANT");
314     if (Opts.CPlusPlus)
315       Builder.defineMacro("_GNU_SOURCE");
316   }
317 public:
318   KFreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
319     this->UserLabelPrefix = "";
320   }
321 };
322
323 // Minix Target
324 template<typename Target>
325 class MinixTargetInfo : public OSTargetInfo<Target> {
326 protected:
327   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
328                     MacroBuilder &Builder) const override {
329     // Minix defines
330
331     Builder.defineMacro("__minix", "3");
332     Builder.defineMacro("_EM_WSIZE", "4");
333     Builder.defineMacro("_EM_PSIZE", "4");
334     Builder.defineMacro("_EM_SSIZE", "2");
335     Builder.defineMacro("_EM_LSIZE", "4");
336     Builder.defineMacro("_EM_FSIZE", "4");
337     Builder.defineMacro("_EM_DSIZE", "8");
338     Builder.defineMacro("__ELF__");
339     DefineStd(Builder, "unix", Opts);
340   }
341 public:
342   MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
343     this->UserLabelPrefix = "";
344   }
345 };
346
347 // Linux target
348 template<typename Target>
349 class LinuxTargetInfo : public OSTargetInfo<Target> {
350 protected:
351   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
352                     MacroBuilder &Builder) const override {
353     // Linux defines; list based off of gcc output
354     DefineStd(Builder, "unix", Opts);
355     DefineStd(Builder, "linux", Opts);
356     Builder.defineMacro("__gnu_linux__");
357     Builder.defineMacro("__ELF__");
358     if (Triple.getEnvironment() == llvm::Triple::Android)
359       Builder.defineMacro("__ANDROID__", "1");
360     if (Opts.POSIXThreads)
361       Builder.defineMacro("_REENTRANT");
362     if (Opts.CPlusPlus)
363       Builder.defineMacro("_GNU_SOURCE");
364   }
365 public:
366   LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
367     this->UserLabelPrefix = "";
368     this->WIntType = TargetInfo::UnsignedInt;
369
370     switch (Triple.getArch()) {
371     default:
372       break;
373     case llvm::Triple::ppc:
374     case llvm::Triple::ppc64:
375     case llvm::Triple::ppc64le:
376       this->MCountName = "_mcount";
377       break;
378     }
379   }
380
381   const char *getStaticInitSectionSpecifier() const override {
382     return ".text.startup";
383   }
384 };
385
386 // NetBSD Target
387 template<typename Target>
388 class NetBSDTargetInfo : public OSTargetInfo<Target> {
389 protected:
390   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
391                     MacroBuilder &Builder) const override {
392     // NetBSD defines; list based off of gcc output
393     Builder.defineMacro("__NetBSD__");
394     Builder.defineMacro("__unix__");
395     Builder.defineMacro("__ELF__");
396     if (Opts.POSIXThreads)
397       Builder.defineMacro("_POSIX_THREADS");
398
399     switch (Triple.getArch()) {
400     default:
401       break;
402     case llvm::Triple::arm:
403     case llvm::Triple::armeb:
404     case llvm::Triple::thumb:
405     case llvm::Triple::thumbeb:
406       Builder.defineMacro("__ARM_DWARF_EH__");
407       break;
408     }
409   }
410 public:
411   NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
412     this->UserLabelPrefix = "";
413   }
414 };
415
416 // OpenBSD Target
417 template<typename Target>
418 class OpenBSDTargetInfo : public OSTargetInfo<Target> {
419 protected:
420   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
421                     MacroBuilder &Builder) const override {
422     // OpenBSD defines; list based off of gcc output
423
424     Builder.defineMacro("__OpenBSD__");
425     DefineStd(Builder, "unix", Opts);
426     Builder.defineMacro("__ELF__");
427     if (Opts.POSIXThreads)
428       Builder.defineMacro("_REENTRANT");
429   }
430 public:
431   OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
432     this->UserLabelPrefix = "";
433     this->TLSSupported = false;
434
435       switch (Triple.getArch()) {
436         default:
437         case llvm::Triple::x86:
438         case llvm::Triple::x86_64:
439         case llvm::Triple::arm:
440         case llvm::Triple::sparc:
441           this->MCountName = "__mcount";
442           break;
443         case llvm::Triple::mips64:
444         case llvm::Triple::mips64el:
445         case llvm::Triple::ppc:
446         case llvm::Triple::sparcv9:
447           this->MCountName = "_mcount";
448           break;
449       }
450   }
451 };
452
453 // Bitrig Target
454 template<typename Target>
455 class BitrigTargetInfo : public OSTargetInfo<Target> {
456 protected:
457   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
458                     MacroBuilder &Builder) const override {
459     // Bitrig defines; list based off of gcc output
460
461     Builder.defineMacro("__Bitrig__");
462     DefineStd(Builder, "unix", Opts);
463     Builder.defineMacro("__ELF__");
464     if (Opts.POSIXThreads)
465       Builder.defineMacro("_REENTRANT");
466   }
467 public:
468   BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
469     this->UserLabelPrefix = "";
470     this->MCountName = "__mcount";
471   }
472 };
473
474 // PSP Target
475 template<typename Target>
476 class PSPTargetInfo : public OSTargetInfo<Target> {
477 protected:
478   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
479                     MacroBuilder &Builder) const override {
480     // PSP defines; list based on the output of the pspdev gcc toolchain.
481     Builder.defineMacro("PSP");
482     Builder.defineMacro("_PSP");
483     Builder.defineMacro("__psp__");
484     Builder.defineMacro("__ELF__");
485   }
486 public:
487   PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
488     this->UserLabelPrefix = "";
489   }
490 };
491
492 // PS3 PPU Target
493 template<typename Target>
494 class PS3PPUTargetInfo : public OSTargetInfo<Target> {
495 protected:
496   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
497                     MacroBuilder &Builder) const override {
498     // PS3 PPU defines.
499     Builder.defineMacro("__PPC__");
500     Builder.defineMacro("__PPU__");
501     Builder.defineMacro("__CELLOS_LV2__");
502     Builder.defineMacro("__ELF__");
503     Builder.defineMacro("__LP32__");
504     Builder.defineMacro("_ARCH_PPC64");
505     Builder.defineMacro("__powerpc64__");
506   }
507 public:
508   PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
509     this->UserLabelPrefix = "";
510     this->LongWidth = this->LongAlign = 32;
511     this->PointerWidth = this->PointerAlign = 32;
512     this->IntMaxType = TargetInfo::SignedLongLong;
513     this->Int64Type = TargetInfo::SignedLongLong;
514     this->SizeType = TargetInfo::UnsignedInt;
515     this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
516   }
517 };
518
519 // AuroraUX target
520 template<typename Target>
521 class AuroraUXTargetInfo : public OSTargetInfo<Target> {
522 protected:
523   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
524                     MacroBuilder &Builder) const override {
525     DefineStd(Builder, "sun", Opts);
526     DefineStd(Builder, "unix", Opts);
527     Builder.defineMacro("__ELF__");
528     Builder.defineMacro("__svr4__");
529     Builder.defineMacro("__SVR4");
530   }
531 public:
532   AuroraUXTargetInfo(const llvm::Triple &Triple)
533       : OSTargetInfo<Target>(Triple) {
534     this->UserLabelPrefix = "";
535     this->WCharType = this->SignedLong;
536     // FIXME: WIntType should be SignedLong
537   }
538 };
539
540 // Solaris target
541 template<typename Target>
542 class SolarisTargetInfo : public OSTargetInfo<Target> {
543 protected:
544   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
545                     MacroBuilder &Builder) const override {
546     DefineStd(Builder, "sun", Opts);
547     DefineStd(Builder, "unix", Opts);
548     Builder.defineMacro("__ELF__");
549     Builder.defineMacro("__svr4__");
550     Builder.defineMacro("__SVR4");
551     // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
552     // newer, but to 500 for everything else.  feature_test.h has a check to
553     // ensure that you are not using C99 with an old version of X/Open or C89
554     // with a new version.  
555     if (Opts.C99 || Opts.C11)
556       Builder.defineMacro("_XOPEN_SOURCE", "600");
557     else
558       Builder.defineMacro("_XOPEN_SOURCE", "500");
559     if (Opts.CPlusPlus)
560       Builder.defineMacro("__C99FEATURES__");
561     Builder.defineMacro("_LARGEFILE_SOURCE");
562     Builder.defineMacro("_LARGEFILE64_SOURCE");
563     Builder.defineMacro("__EXTENSIONS__");
564     Builder.defineMacro("_REENTRANT");
565   }
566 public:
567   SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
568     this->UserLabelPrefix = "";
569     this->WCharType = this->SignedInt;
570     // FIXME: WIntType should be SignedLong
571   }
572 };
573
574 // Windows target
575 template<typename Target>
576 class WindowsTargetInfo : public OSTargetInfo<Target> {
577 protected:
578   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
579                     MacroBuilder &Builder) const override {
580     Builder.defineMacro("_WIN32");
581   }
582   void getVisualStudioDefines(const LangOptions &Opts,
583                               MacroBuilder &Builder) const {
584     if (Opts.CPlusPlus) {
585       if (Opts.RTTIData)
586         Builder.defineMacro("_CPPRTTI");
587
588       if (Opts.Exceptions)
589         Builder.defineMacro("_CPPUNWIND");
590     }
591
592     if (!Opts.CharIsSigned)
593       Builder.defineMacro("_CHAR_UNSIGNED");
594
595     // FIXME: POSIXThreads isn't exactly the option this should be defined for,
596     //        but it works for now.
597     if (Opts.POSIXThreads)
598       Builder.defineMacro("_MT");
599
600     if (Opts.MSCompatibilityVersion) {
601       Builder.defineMacro("_MSC_VER",
602                           Twine(Opts.MSCompatibilityVersion / 100000));
603       Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
604       // FIXME We cannot encode the revision information into 32-bits
605       Builder.defineMacro("_MSC_BUILD", Twine(1));
606     }
607
608     if (Opts.MicrosoftExt) {
609       Builder.defineMacro("_MSC_EXTENSIONS");
610
611       if (Opts.CPlusPlus11) {
612         Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
613         Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
614         Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
615       }
616     }
617
618     Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
619   }
620
621 public:
622   WindowsTargetInfo(const llvm::Triple &Triple)
623       : OSTargetInfo<Target>(Triple) {}
624 };
625
626 template <typename Target>
627 class NaClTargetInfo : public OSTargetInfo<Target> {
628 protected:
629   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
630                     MacroBuilder &Builder) const override {
631     if (Opts.POSIXThreads)
632       Builder.defineMacro("_REENTRANT");
633     if (Opts.CPlusPlus)
634       Builder.defineMacro("_GNU_SOURCE");
635
636     DefineStd(Builder, "unix", Opts);
637     Builder.defineMacro("__ELF__");
638     Builder.defineMacro("__native_client__");
639   }
640
641 public:
642   NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
643     this->UserLabelPrefix = "";
644     this->LongAlign = 32;
645     this->LongWidth = 32;
646     this->PointerAlign = 32;
647     this->PointerWidth = 32;
648     this->IntMaxType = TargetInfo::SignedLongLong;
649     this->Int64Type = TargetInfo::SignedLongLong;
650     this->DoubleAlign = 64;
651     this->LongDoubleWidth = 64;
652     this->LongDoubleAlign = 64;
653     this->LongLongWidth = 64;
654     this->LongLongAlign = 64;
655     this->SizeType = TargetInfo::UnsignedInt;
656     this->PtrDiffType = TargetInfo::SignedInt;
657     this->IntPtrType = TargetInfo::SignedInt;
658     // RegParmMax is inherited from the underlying architecture
659     this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
660     if (Triple.getArch() == llvm::Triple::arm) {
661       this->DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:128-n32-S128";
662     } else if (Triple.getArch() == llvm::Triple::x86) {
663       this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
664     } else if (Triple.getArch() == llvm::Triple::x86_64) {
665       this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
666     } else if (Triple.getArch() == llvm::Triple::mipsel) {
667       // Handled on mips' setDescriptionString.
668     } else {
669       assert(Triple.getArch() == llvm::Triple::le32);
670       this->DescriptionString = "e-p:32:32-i64:64";
671     }
672   }
673   typename Target::CallingConvCheckResult checkCallingConvention(
674       CallingConv CC) const override {
675     return CC == CC_PnaclCall ? Target::CCCR_OK :
676         Target::checkCallingConvention(CC);
677   }
678 };
679 } // end anonymous namespace.
680
681 //===----------------------------------------------------------------------===//
682 // Specific target implementations.
683 //===----------------------------------------------------------------------===//
684
685 namespace {
686 // PPC abstract base class
687 class PPCTargetInfo : public TargetInfo {
688   static const Builtin::Info BuiltinInfo[];
689   static const char * const GCCRegNames[];
690   static const TargetInfo::GCCRegAlias GCCRegAliases[];
691   std::string CPU;
692
693   // Target cpu features.
694   bool HasVSX;
695
696 public:
697   PPCTargetInfo(const llvm::Triple &Triple)
698       : TargetInfo(Triple), HasVSX(false) {
699     BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
700     LongDoubleWidth = LongDoubleAlign = 128;
701     LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
702   }
703
704   /// \brief Flags for architecture specific defines.
705   typedef enum {
706     ArchDefineNone  = 0,
707     ArchDefineName  = 1 << 0, // <name> is substituted for arch name.
708     ArchDefinePpcgr = 1 << 1,
709     ArchDefinePpcsq = 1 << 2,
710     ArchDefine440   = 1 << 3,
711     ArchDefine603   = 1 << 4,
712     ArchDefine604   = 1 << 5,
713     ArchDefinePwr4  = 1 << 6,
714     ArchDefinePwr5  = 1 << 7,
715     ArchDefinePwr5x = 1 << 8,
716     ArchDefinePwr6  = 1 << 9,
717     ArchDefinePwr6x = 1 << 10,
718     ArchDefinePwr7  = 1 << 11,
719     ArchDefinePwr8  = 1 << 12,
720     ArchDefineA2    = 1 << 13,
721     ArchDefineA2q   = 1 << 14
722   } ArchDefineTypes;
723
724   // Note: GCC recognizes the following additional cpus:
725   //  401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
726   //  821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
727   //  titan, rs64.
728   bool setCPU(const std::string &Name) override {
729     bool CPUKnown = llvm::StringSwitch<bool>(Name)
730       .Case("generic", true)
731       .Case("440", true)
732       .Case("450", true)
733       .Case("601", true)
734       .Case("602", true)
735       .Case("603", true)
736       .Case("603e", true)
737       .Case("603ev", true)
738       .Case("604", true)
739       .Case("604e", true)
740       .Case("620", true)
741       .Case("630", true)
742       .Case("g3", true)
743       .Case("7400", true)
744       .Case("g4", true)
745       .Case("7450", true)
746       .Case("g4+", true)
747       .Case("750", true)
748       .Case("970", true)
749       .Case("g5", true)
750       .Case("a2", true)
751       .Case("a2q", true)
752       .Case("e500mc", true)
753       .Case("e5500", true)
754       .Case("power3", true)
755       .Case("pwr3", true)
756       .Case("power4", true)
757       .Case("pwr4", true)
758       .Case("power5", true)
759       .Case("pwr5", true)
760       .Case("power5x", true)
761       .Case("pwr5x", true)
762       .Case("power6", true)
763       .Case("pwr6", true)
764       .Case("power6x", true)
765       .Case("pwr6x", true)
766       .Case("power7", true)
767       .Case("pwr7", true)
768       .Case("power8", true)
769       .Case("pwr8", true)
770       .Case("powerpc", true)
771       .Case("ppc", true)
772       .Case("powerpc64", true)
773       .Case("ppc64", true)
774       .Case("powerpc64le", true)
775       .Case("ppc64le", true)
776       .Default(false);
777
778     if (CPUKnown)
779       CPU = Name;
780
781     return CPUKnown;
782   }
783
784   void getTargetBuiltins(const Builtin::Info *&Records,
785                          unsigned &NumRecords) const override {
786     Records = BuiltinInfo;
787     NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
788   }
789
790   bool isCLZForZeroUndef() const override { return false; }
791
792   void getTargetDefines(const LangOptions &Opts,
793                         MacroBuilder &Builder) const override;
794
795   void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
796
797   bool handleTargetFeatures(std::vector<std::string> &Features,
798                             DiagnosticsEngine &Diags) override;
799   bool hasFeature(StringRef Feature) const override;
800
801   void getGCCRegNames(const char * const *&Names,
802                       unsigned &NumNames) const override;
803   void getGCCRegAliases(const GCCRegAlias *&Aliases,
804                         unsigned &NumAliases) const override;
805   bool validateAsmConstraint(const char *&Name,
806                              TargetInfo::ConstraintInfo &Info) const override {
807     switch (*Name) {
808     default: return false;
809     case 'O': // Zero
810       break;
811     case 'b': // Base register
812     case 'f': // Floating point register
813       Info.setAllowsRegister();
814       break;
815     // FIXME: The following are added to allow parsing.
816     // I just took a guess at what the actions should be.
817     // Also, is more specific checking needed?  I.e. specific registers?
818     case 'd': // Floating point register (containing 64-bit value)
819     case 'v': // Altivec vector register
820       Info.setAllowsRegister();
821       break;
822     case 'w':
823       switch (Name[1]) {
824         case 'd':// VSX vector register to hold vector double data
825         case 'f':// VSX vector register to hold vector float data
826         case 's':// VSX vector register to hold scalar float data
827         case 'a':// Any VSX register
828         case 'c':// An individual CR bit
829           break;
830         default:
831           return false;
832       }
833       Info.setAllowsRegister();
834       Name++; // Skip over 'w'.
835       break;
836     case 'h': // `MQ', `CTR', or `LINK' register
837     case 'q': // `MQ' register
838     case 'c': // `CTR' register
839     case 'l': // `LINK' register
840     case 'x': // `CR' register (condition register) number 0
841     case 'y': // `CR' register (condition register)
842     case 'z': // `XER[CA]' carry bit (part of the XER register)
843       Info.setAllowsRegister();
844       break;
845     case 'I': // Signed 16-bit constant
846     case 'J': // Unsigned 16-bit constant shifted left 16 bits
847               //  (use `L' instead for SImode constants)
848     case 'K': // Unsigned 16-bit constant
849     case 'L': // Signed 16-bit constant shifted left 16 bits
850     case 'M': // Constant larger than 31
851     case 'N': // Exact power of 2
852     case 'P': // Constant whose negation is a signed 16-bit constant
853     case 'G': // Floating point constant that can be loaded into a
854               // register with one instruction per word
855     case 'H': // Integer/Floating point constant that can be loaded
856               // into a register using three instructions
857       break;
858     case 'm': // Memory operand. Note that on PowerPC targets, m can
859               // include addresses that update the base register. It
860               // is therefore only safe to use `m' in an asm statement
861               // if that asm statement accesses the operand exactly once.
862               // The asm statement must also use `%U<opno>' as a
863               // placeholder for the "update" flag in the corresponding
864               // load or store instruction. For example:
865               // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
866               // is correct but:
867               // asm ("st %1,%0" : "=m" (mem) : "r" (val));
868               // is not. Use es rather than m if you don't want the base
869               // register to be updated.
870     case 'e':
871       if (Name[1] != 's')
872           return false;
873               // es: A "stable" memory operand; that is, one which does not
874               // include any automodification of the base register. Unlike
875               // `m', this constraint can be used in asm statements that
876               // might access the operand several times, or that might not
877               // access it at all.
878       Info.setAllowsMemory();
879       Name++; // Skip over 'e'.
880       break;
881     case 'Q': // Memory operand that is an offset from a register (it is
882               // usually better to use `m' or `es' in asm statements)
883     case 'Z': // Memory operand that is an indexed or indirect from a
884               // register (it is usually better to use `m' or `es' in
885               // asm statements)
886       Info.setAllowsMemory();
887       Info.setAllowsRegister();
888       break;
889     case 'R': // AIX TOC entry
890     case 'a': // Address operand that is an indexed or indirect from a
891               // register (`p' is preferable for asm statements)
892     case 'S': // Constant suitable as a 64-bit mask operand
893     case 'T': // Constant suitable as a 32-bit mask operand
894     case 'U': // System V Release 4 small data area reference
895     case 't': // AND masks that can be performed by two rldic{l, r}
896               // instructions
897     case 'W': // Vector constant that does not require memory
898     case 'j': // Vector constant that is all zeros.
899       break;
900     // End FIXME.
901     }
902     return true;
903   }
904   std::string convertConstraint(const char *&Constraint) const override {
905     std::string R;
906     switch (*Constraint) {
907     case 'e':
908     case 'w':
909       // Two-character constraint; add "^" hint for later parsing.
910       R = std::string("^") + std::string(Constraint, 2);
911       Constraint++;
912       break;
913     default:
914       return TargetInfo::convertConstraint(Constraint);
915     }
916     return R;
917   }
918   const char *getClobbers() const override {
919     return "";
920   }
921   int getEHDataRegisterNumber(unsigned RegNo) const override {
922     if (RegNo == 0) return 3;
923     if (RegNo == 1) return 4;
924     return -1;
925   }
926 };
927
928 const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
929 #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
930 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
931                                               ALL_LANGUAGES },
932 #include "clang/Basic/BuiltinsPPC.def"
933 };
934
935   /// handleTargetFeatures - Perform initialization based on the user
936 /// configured set of features.
937 bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
938                                          DiagnosticsEngine &Diags) {
939   // Remember the maximum enabled sselevel.
940   for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
941     // Ignore disabled features.
942     if (Features[i][0] == '-')
943       continue;
944
945     StringRef Feature = StringRef(Features[i]).substr(1);
946
947     if (Feature == "vsx") {
948       HasVSX = true;
949       continue;
950     }
951
952     // TODO: Finish this list and add an assert that we've handled them
953     // all.
954   }
955
956   return true;
957 }
958
959 /// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
960 /// #defines that are not tied to a specific subtarget.
961 void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
962                                      MacroBuilder &Builder) const {
963   // Target identification.
964   Builder.defineMacro("__ppc__");
965   Builder.defineMacro("__PPC__");
966   Builder.defineMacro("_ARCH_PPC");
967   Builder.defineMacro("__powerpc__");
968   Builder.defineMacro("__POWERPC__");
969   if (PointerWidth == 64) {
970     Builder.defineMacro("_ARCH_PPC64");
971     Builder.defineMacro("__powerpc64__");
972     Builder.defineMacro("__ppc64__");
973     Builder.defineMacro("__PPC64__");
974   }
975
976   // Target properties.
977   if (getTriple().getArch() == llvm::Triple::ppc64le) {
978     Builder.defineMacro("_LITTLE_ENDIAN");
979     Builder.defineMacro("_CALL_ELF","2");
980   } else {
981     if (getTriple().getOS() != llvm::Triple::NetBSD &&
982         getTriple().getOS() != llvm::Triple::OpenBSD)
983       Builder.defineMacro("_BIG_ENDIAN");
984   }
985
986   // Subtarget options.
987   Builder.defineMacro("__NATURAL_ALIGNMENT__");
988   Builder.defineMacro("__REGISTER_PREFIX__", "");
989
990   // FIXME: Should be controlled by command line option.
991   if (LongDoubleWidth == 128)
992     Builder.defineMacro("__LONG_DOUBLE_128__");
993
994   if (Opts.AltiVec) {
995     Builder.defineMacro("__VEC__", "10206");
996     Builder.defineMacro("__ALTIVEC__");
997   }
998
999   // CPU identification.
1000   ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1001     .Case("440",   ArchDefineName)
1002     .Case("450",   ArchDefineName | ArchDefine440)
1003     .Case("601",   ArchDefineName)
1004     .Case("602",   ArchDefineName | ArchDefinePpcgr)
1005     .Case("603",   ArchDefineName | ArchDefinePpcgr)
1006     .Case("603e",  ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1007     .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1008     .Case("604",   ArchDefineName | ArchDefinePpcgr)
1009     .Case("604e",  ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1010     .Case("620",   ArchDefineName | ArchDefinePpcgr)
1011     .Case("630",   ArchDefineName | ArchDefinePpcgr)
1012     .Case("7400",  ArchDefineName | ArchDefinePpcgr)
1013     .Case("7450",  ArchDefineName | ArchDefinePpcgr)
1014     .Case("750",   ArchDefineName | ArchDefinePpcgr)
1015     .Case("970",   ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1016                      | ArchDefinePpcsq)
1017     .Case("a2",    ArchDefineA2)
1018     .Case("a2q",   ArchDefineName | ArchDefineA2 | ArchDefineA2q)
1019     .Case("pwr3",  ArchDefinePpcgr)
1020     .Case("pwr4",  ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1021     .Case("pwr5",  ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1022                      | ArchDefinePpcsq)
1023     .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1024                      | ArchDefinePpcgr | ArchDefinePpcsq)
1025     .Case("pwr6",  ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1026                      | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1027     .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1028                      | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1029                      | ArchDefinePpcsq)
1030     .Case("pwr7",  ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1031                      | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1032                      | ArchDefinePpcgr | ArchDefinePpcsq)
1033     .Case("pwr8",  ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1034                      | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1035                      | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1036     .Case("power3",  ArchDefinePpcgr)
1037     .Case("power4",  ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1038     .Case("power5",  ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1039                        | ArchDefinePpcsq)
1040     .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1041                        | ArchDefinePpcgr | ArchDefinePpcsq)
1042     .Case("power6",  ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1043                        | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1044     .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1045                        | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1046                        | ArchDefinePpcsq)
1047     .Case("power7",  ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1048                        | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1049                        | ArchDefinePpcgr | ArchDefinePpcsq)
1050     .Case("power8",  ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1051                        | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1052                        | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1053     .Default(ArchDefineNone);
1054
1055   if (defs & ArchDefineName)
1056     Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1057   if (defs & ArchDefinePpcgr)
1058     Builder.defineMacro("_ARCH_PPCGR");
1059   if (defs & ArchDefinePpcsq)
1060     Builder.defineMacro("_ARCH_PPCSQ");
1061   if (defs & ArchDefine440)
1062     Builder.defineMacro("_ARCH_440");
1063   if (defs & ArchDefine603)
1064     Builder.defineMacro("_ARCH_603");
1065   if (defs & ArchDefine604)
1066     Builder.defineMacro("_ARCH_604");
1067   if (defs & ArchDefinePwr4)
1068     Builder.defineMacro("_ARCH_PWR4");
1069   if (defs & ArchDefinePwr5)
1070     Builder.defineMacro("_ARCH_PWR5");
1071   if (defs & ArchDefinePwr5x)
1072     Builder.defineMacro("_ARCH_PWR5X");
1073   if (defs & ArchDefinePwr6)
1074     Builder.defineMacro("_ARCH_PWR6");
1075   if (defs & ArchDefinePwr6x)
1076     Builder.defineMacro("_ARCH_PWR6X");
1077   if (defs & ArchDefinePwr7)
1078     Builder.defineMacro("_ARCH_PWR7");
1079   if (defs & ArchDefinePwr8)
1080     Builder.defineMacro("_ARCH_PWR8");
1081   if (defs & ArchDefineA2)
1082     Builder.defineMacro("_ARCH_A2");
1083   if (defs & ArchDefineA2q) {
1084     Builder.defineMacro("_ARCH_A2Q");
1085     Builder.defineMacro("_ARCH_QP");
1086   }
1087
1088   if (getTriple().getVendor() == llvm::Triple::BGQ) {
1089     Builder.defineMacro("__bg__");
1090     Builder.defineMacro("__THW_BLUEGENE__");
1091     Builder.defineMacro("__bgq__");
1092     Builder.defineMacro("__TOS_BGQ__");
1093   }
1094
1095   if (HasVSX)
1096     Builder.defineMacro("__VSX__");
1097
1098   // FIXME: The following are not yet generated here by Clang, but are
1099   //        generated by GCC:
1100   //
1101   //   _SOFT_FLOAT_
1102   //   __RECIP_PRECISION__
1103   //   __APPLE_ALTIVEC__
1104   //   __RECIP__
1105   //   __RECIPF__
1106   //   __RSQRTE__
1107   //   __RSQRTEF__
1108   //   _SOFT_DOUBLE_
1109   //   __NO_LWSYNC__
1110   //   __HAVE_BSWAP__
1111   //   __LONGDOUBLE128
1112   //   __CMODEL_MEDIUM__
1113   //   __CMODEL_LARGE__
1114   //   _CALL_SYSV
1115   //   _CALL_DARWIN
1116   //   __NO_FPRS__
1117 }
1118
1119 void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1120   Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1121     .Case("7400", true)
1122     .Case("g4", true)
1123     .Case("7450", true)
1124     .Case("g4+", true)
1125     .Case("970", true)
1126     .Case("g5", true)
1127     .Case("pwr6", true)
1128     .Case("pwr7", true)
1129     .Case("pwr8", true)
1130     .Case("ppc64", true)
1131     .Case("ppc64le", true)
1132     .Default(false);
1133
1134   Features["qpx"] = (CPU == "a2q");
1135 }
1136
1137 bool PPCTargetInfo::hasFeature(StringRef Feature) const {
1138   return Feature == "powerpc";
1139 }
1140
1141   
1142 const char * const PPCTargetInfo::GCCRegNames[] = {
1143   "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1144   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1145   "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1146   "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1147   "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1148   "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1149   "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1150   "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
1151   "mq", "lr", "ctr", "ap",
1152   "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
1153   "xer",
1154   "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1155   "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1156   "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1157   "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1158   "vrsave", "vscr",
1159   "spe_acc", "spefscr",
1160   "sfp"
1161 };
1162
1163 void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
1164                                    unsigned &NumNames) const {
1165   Names = GCCRegNames;
1166   NumNames = llvm::array_lengthof(GCCRegNames);
1167 }
1168
1169 const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1170   // While some of these aliases do map to different registers
1171   // they still share the same register name.
1172   { { "0" }, "r0" },
1173   { { "1"}, "r1" },
1174   { { "2" }, "r2" },
1175   { { "3" }, "r3" },
1176   { { "4" }, "r4" },
1177   { { "5" }, "r5" },
1178   { { "6" }, "r6" },
1179   { { "7" }, "r7" },
1180   { { "8" }, "r8" },
1181   { { "9" }, "r9" },
1182   { { "10" }, "r10" },
1183   { { "11" }, "r11" },
1184   { { "12" }, "r12" },
1185   { { "13" }, "r13" },
1186   { { "14" }, "r14" },
1187   { { "15" }, "r15" },
1188   { { "16" }, "r16" },
1189   { { "17" }, "r17" },
1190   { { "18" }, "r18" },
1191   { { "19" }, "r19" },
1192   { { "20" }, "r20" },
1193   { { "21" }, "r21" },
1194   { { "22" }, "r22" },
1195   { { "23" }, "r23" },
1196   { { "24" }, "r24" },
1197   { { "25" }, "r25" },
1198   { { "26" }, "r26" },
1199   { { "27" }, "r27" },
1200   { { "28" }, "r28" },
1201   { { "29" }, "r29" },
1202   { { "30" }, "r30" },
1203   { { "31" }, "r31" },
1204   { { "fr0" }, "f0" },
1205   { { "fr1" }, "f1" },
1206   { { "fr2" }, "f2" },
1207   { { "fr3" }, "f3" },
1208   { { "fr4" }, "f4" },
1209   { { "fr5" }, "f5" },
1210   { { "fr6" }, "f6" },
1211   { { "fr7" }, "f7" },
1212   { { "fr8" }, "f8" },
1213   { { "fr9" }, "f9" },
1214   { { "fr10" }, "f10" },
1215   { { "fr11" }, "f11" },
1216   { { "fr12" }, "f12" },
1217   { { "fr13" }, "f13" },
1218   { { "fr14" }, "f14" },
1219   { { "fr15" }, "f15" },
1220   { { "fr16" }, "f16" },
1221   { { "fr17" }, "f17" },
1222   { { "fr18" }, "f18" },
1223   { { "fr19" }, "f19" },
1224   { { "fr20" }, "f20" },
1225   { { "fr21" }, "f21" },
1226   { { "fr22" }, "f22" },
1227   { { "fr23" }, "f23" },
1228   { { "fr24" }, "f24" },
1229   { { "fr25" }, "f25" },
1230   { { "fr26" }, "f26" },
1231   { { "fr27" }, "f27" },
1232   { { "fr28" }, "f28" },
1233   { { "fr29" }, "f29" },
1234   { { "fr30" }, "f30" },
1235   { { "fr31" }, "f31" },
1236   { { "cc" }, "cr0" },
1237 };
1238
1239 void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1240                                      unsigned &NumAliases) const {
1241   Aliases = GCCRegAliases;
1242   NumAliases = llvm::array_lengthof(GCCRegAliases);
1243 }
1244 } // end anonymous namespace.
1245
1246 namespace {
1247 class PPC32TargetInfo : public PPCTargetInfo {
1248 public:
1249   PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
1250     DescriptionString = "E-m:e-p:32:32-i64:64-n32";
1251
1252     switch (getTriple().getOS()) {
1253     case llvm::Triple::Linux:
1254     case llvm::Triple::FreeBSD:
1255     case llvm::Triple::NetBSD:
1256       SizeType = UnsignedInt;
1257       PtrDiffType = SignedInt;
1258       IntPtrType = SignedInt;
1259       break;
1260     default:
1261       break;
1262     }
1263
1264     if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1265       LongDoubleWidth = LongDoubleAlign = 64;
1266       LongDoubleFormat = &llvm::APFloat::IEEEdouble;
1267     }
1268
1269     // PPC32 supports atomics up to 4 bytes.
1270     MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
1271   }
1272
1273   BuiltinVaListKind getBuiltinVaListKind() const override {
1274     // This is the ELF definition, and is overridden by the Darwin sub-target
1275     return TargetInfo::PowerABIBuiltinVaList;
1276   }
1277 };
1278 } // end anonymous namespace.
1279
1280 // Note: ABI differences may eventually require us to have a separate
1281 // TargetInfo for little endian.
1282 namespace {
1283 class PPC64TargetInfo : public PPCTargetInfo {
1284 public:
1285   PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
1286     LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
1287     IntMaxType = SignedLong;
1288     Int64Type = SignedLong;
1289
1290     if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1291       LongDoubleWidth = LongDoubleAlign = 64;
1292       LongDoubleFormat = &llvm::APFloat::IEEEdouble;
1293       DescriptionString = "E-m:e-i64:64-n32:64";
1294     } else {
1295       if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1296         DescriptionString = "e-m:e-i64:64-n32:64";
1297       } else {
1298         DescriptionString = "E-m:e-i64:64-n32:64";
1299       }
1300 }
1301
1302     // PPC64 supports atomics up to 8 bytes.
1303     MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
1304   }
1305   BuiltinVaListKind getBuiltinVaListKind() const override {
1306     return TargetInfo::CharPtrBuiltinVaList;
1307   }
1308 };
1309 } // end anonymous namespace.
1310
1311
1312 namespace {
1313 class DarwinPPC32TargetInfo :
1314   public DarwinTargetInfo<PPC32TargetInfo> {
1315 public:
1316   DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1317       : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
1318     HasAlignMac68kSupport = true;
1319     BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
1320     PtrDiffType = SignedInt;    // for http://llvm.org/bugs/show_bug.cgi?id=15726
1321     LongLongAlign = 32;
1322     SuitableAlign = 128;
1323     DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
1324   }
1325   BuiltinVaListKind getBuiltinVaListKind() const override {
1326     return TargetInfo::CharPtrBuiltinVaList;
1327   }
1328 };
1329
1330 class DarwinPPC64TargetInfo :
1331   public DarwinTargetInfo<PPC64TargetInfo> {
1332 public:
1333   DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1334       : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
1335     HasAlignMac68kSupport = true;
1336     SuitableAlign = 128;
1337     DescriptionString = "E-m:o-i64:64-n32:64";
1338   }
1339 };
1340 } // end anonymous namespace.
1341
1342 namespace {
1343   static const unsigned NVPTXAddrSpaceMap[] = {
1344     1,    // opencl_global
1345     3,    // opencl_local
1346     4,    // opencl_constant
1347     1,    // cuda_device
1348     4,    // cuda_constant
1349     3,    // cuda_shared
1350   };
1351   class NVPTXTargetInfo : public TargetInfo {
1352     static const char * const GCCRegNames[];
1353     static const Builtin::Info BuiltinInfo[];
1354   public:
1355     NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
1356       BigEndian = false;
1357       TLSSupported = false;
1358       LongWidth = LongAlign = 64;
1359       AddrSpaceMap = &NVPTXAddrSpaceMap;
1360       UseAddrSpaceMapMangling = true;
1361       // Define available target features
1362       // These must be defined in sorted order!
1363       NoAsmVariants = true;
1364     }
1365     void getTargetDefines(const LangOptions &Opts,
1366                           MacroBuilder &Builder) const override {
1367       Builder.defineMacro("__PTX__");
1368       Builder.defineMacro("__NVPTX__");
1369     }
1370     void getTargetBuiltins(const Builtin::Info *&Records,
1371                            unsigned &NumRecords) const override {
1372       Records = BuiltinInfo;
1373       NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
1374     }
1375     bool hasFeature(StringRef Feature) const override {
1376       return Feature == "ptx" || Feature == "nvptx";
1377     }
1378
1379     void getGCCRegNames(const char * const *&Names,
1380                         unsigned &NumNames) const override;
1381     void getGCCRegAliases(const GCCRegAlias *&Aliases,
1382                                   unsigned &NumAliases) const override {
1383       // No aliases.
1384       Aliases = nullptr;
1385       NumAliases = 0;
1386     }
1387     bool validateAsmConstraint(const char *&Name,
1388                                TargetInfo::ConstraintInfo &Info) const override {
1389       switch (*Name) {
1390       default: return false;
1391       case 'c':
1392       case 'h':
1393       case 'r':
1394       case 'l':
1395       case 'f':
1396       case 'd':
1397         Info.setAllowsRegister();
1398         return true;
1399       }
1400     }
1401     const char *getClobbers() const override {
1402       // FIXME: Is this really right?
1403       return "";
1404     }
1405     BuiltinVaListKind getBuiltinVaListKind() const override {
1406       // FIXME: implement
1407       return TargetInfo::CharPtrBuiltinVaList;
1408     }
1409     bool setCPU(const std::string &Name) override {
1410       bool Valid = llvm::StringSwitch<bool>(Name)
1411         .Case("sm_20", true)
1412         .Case("sm_21", true)
1413         .Case("sm_30", true)
1414         .Case("sm_35", true)
1415         .Default(false);
1416
1417       return Valid;
1418     }
1419   };
1420
1421   const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1422 #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1423 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1424                                               ALL_LANGUAGES },
1425 #include "clang/Basic/BuiltinsNVPTX.def"
1426   };
1427
1428   const char * const NVPTXTargetInfo::GCCRegNames[] = {
1429     "r0"
1430   };
1431
1432   void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1433                                      unsigned &NumNames) const {
1434     Names = GCCRegNames;
1435     NumNames = llvm::array_lengthof(GCCRegNames);
1436   }
1437
1438   class NVPTX32TargetInfo : public NVPTXTargetInfo {
1439   public:
1440     NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
1441       PointerWidth = PointerAlign = 32;
1442       SizeType     = PtrDiffType = TargetInfo::UnsignedInt;
1443       IntPtrType = TargetInfo::SignedInt;
1444       DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
1445   }
1446   };
1447
1448   class NVPTX64TargetInfo : public NVPTXTargetInfo {
1449   public:
1450     NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
1451       PointerWidth = PointerAlign = 64;
1452       SizeType     = PtrDiffType = TargetInfo::UnsignedLongLong;
1453       IntPtrType = TargetInfo::SignedLongLong;
1454       DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
1455   }
1456   };
1457 }
1458
1459 namespace {
1460
1461 static const unsigned R600AddrSpaceMap[] = {
1462   1,    // opencl_global
1463   3,    // opencl_local
1464   2,    // opencl_constant
1465   1,    // cuda_device
1466   2,    // cuda_constant
1467   3     // cuda_shared
1468 };
1469
1470 static const char *DescriptionStringR600 =
1471   "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1472   "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
1473
1474 static const char *DescriptionStringR600DoubleOps =
1475   "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1476   "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
1477
1478 static const char *DescriptionStringSI =
1479   "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32-p24:64:64"
1480   "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1481   "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
1482
1483 class R600TargetInfo : public TargetInfo {
1484   static const Builtin::Info BuiltinInfo[];
1485
1486   /// \brief The GPU profiles supported by the R600 target.
1487   enum GPUKind {
1488     GK_NONE,
1489     GK_R600,
1490     GK_R600_DOUBLE_OPS,
1491     GK_R700,
1492     GK_R700_DOUBLE_OPS,
1493     GK_EVERGREEN,
1494     GK_EVERGREEN_DOUBLE_OPS,
1495     GK_NORTHERN_ISLANDS,
1496     GK_CAYMAN,
1497     GK_SOUTHERN_ISLANDS,
1498     GK_SEA_ISLANDS
1499   } GPU;
1500
1501 public:
1502   R600TargetInfo(const llvm::Triple &Triple)
1503       : TargetInfo(Triple), GPU(GK_R600) {
1504     DescriptionString = DescriptionStringR600;
1505     AddrSpaceMap = &R600AddrSpaceMap;
1506     UseAddrSpaceMapMangling = true;
1507   }
1508
1509   const char * getClobbers() const override {
1510     return "";
1511   }
1512
1513   void getGCCRegNames(const char * const *&Names,
1514                       unsigned &numNames) const override {
1515     Names = nullptr;
1516     numNames = 0;
1517   }
1518
1519   void getGCCRegAliases(const GCCRegAlias *&Aliases,
1520                         unsigned &NumAliases) const override {
1521     Aliases = nullptr;
1522     NumAliases = 0;
1523   }
1524
1525   bool validateAsmConstraint(const char *&Name,
1526                              TargetInfo::ConstraintInfo &info) const override {
1527     return true;
1528   }
1529
1530   void getTargetBuiltins(const Builtin::Info *&Records,
1531                          unsigned &NumRecords) const override {
1532     Records = BuiltinInfo;
1533     NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
1534   }
1535
1536   void getTargetDefines(const LangOptions &Opts,
1537                         MacroBuilder &Builder) const override {
1538     Builder.defineMacro("__R600__");
1539   }
1540
1541   BuiltinVaListKind getBuiltinVaListKind() const override {
1542     return TargetInfo::CharPtrBuiltinVaList;
1543   }
1544
1545   bool setCPU(const std::string &Name) override {
1546     GPU = llvm::StringSwitch<GPUKind>(Name)
1547       .Case("r600" ,    GK_R600)
1548       .Case("rv610",    GK_R600)
1549       .Case("rv620",    GK_R600)
1550       .Case("rv630",    GK_R600)
1551       .Case("rv635",    GK_R600)
1552       .Case("rs780",    GK_R600)
1553       .Case("rs880",    GK_R600)
1554       .Case("rv670",    GK_R600_DOUBLE_OPS)
1555       .Case("rv710",    GK_R700)
1556       .Case("rv730",    GK_R700)
1557       .Case("rv740",    GK_R700_DOUBLE_OPS)
1558       .Case("rv770",    GK_R700_DOUBLE_OPS)
1559       .Case("palm",     GK_EVERGREEN)
1560       .Case("cedar",    GK_EVERGREEN)
1561       .Case("sumo",     GK_EVERGREEN)
1562       .Case("sumo2",    GK_EVERGREEN)
1563       .Case("redwood",  GK_EVERGREEN)
1564       .Case("juniper",  GK_EVERGREEN)
1565       .Case("hemlock",  GK_EVERGREEN_DOUBLE_OPS)
1566       .Case("cypress",  GK_EVERGREEN_DOUBLE_OPS)
1567       .Case("barts",    GK_NORTHERN_ISLANDS)
1568       .Case("turks",    GK_NORTHERN_ISLANDS)
1569       .Case("caicos",   GK_NORTHERN_ISLANDS)
1570       .Case("cayman",   GK_CAYMAN)
1571       .Case("aruba",    GK_CAYMAN)
1572       .Case("tahiti",   GK_SOUTHERN_ISLANDS)
1573       .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1574       .Case("verde",    GK_SOUTHERN_ISLANDS)
1575       .Case("oland",    GK_SOUTHERN_ISLANDS)
1576       .Case("bonaire",  GK_SEA_ISLANDS)
1577       .Case("kabini",   GK_SEA_ISLANDS)
1578       .Case("kaveri",   GK_SEA_ISLANDS)
1579       .Case("hawaii",   GK_SEA_ISLANDS)
1580       .Case("mullins",  GK_SEA_ISLANDS)
1581       .Default(GK_NONE);
1582
1583     if (GPU == GK_NONE) {
1584       return false;
1585     }
1586
1587     // Set the correct data layout
1588     switch (GPU) {
1589     case GK_NONE:
1590     case GK_R600:
1591     case GK_R700:
1592     case GK_EVERGREEN:
1593     case GK_NORTHERN_ISLANDS:
1594       DescriptionString = DescriptionStringR600;
1595       break;
1596     case GK_R600_DOUBLE_OPS:
1597     case GK_R700_DOUBLE_OPS:
1598     case GK_EVERGREEN_DOUBLE_OPS:
1599     case GK_CAYMAN:
1600       DescriptionString = DescriptionStringR600DoubleOps;
1601       break;
1602     case GK_SOUTHERN_ISLANDS:
1603     case GK_SEA_ISLANDS:
1604       DescriptionString = DescriptionStringSI;
1605       break;
1606     }
1607
1608     return true;
1609   }
1610 };
1611
1612 const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1613 #define BUILTIN(ID, TYPE, ATTRS)                \
1614   { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1615 #include "clang/Basic/BuiltinsR600.def"
1616 };
1617
1618 } // end anonymous namespace
1619
1620 namespace {
1621 // Namespace for x86 abstract base class
1622 const Builtin::Info BuiltinInfo[] = {
1623 #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1624 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1625                                               ALL_LANGUAGES },
1626 #include "clang/Basic/BuiltinsX86.def"
1627 };
1628
1629 static const char* const GCCRegNames[] = {
1630   "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1631   "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
1632   "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
1633   "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1634   "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1635   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1636   "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
1637   "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1638   "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
1639 };
1640
1641 const TargetInfo::AddlRegName AddlRegNames[] = {
1642   { { "al", "ah", "eax", "rax" }, 0 },
1643   { { "bl", "bh", "ebx", "rbx" }, 3 },
1644   { { "cl", "ch", "ecx", "rcx" }, 2 },
1645   { { "dl", "dh", "edx", "rdx" }, 1 },
1646   { { "esi", "rsi" }, 4 },
1647   { { "edi", "rdi" }, 5 },
1648   { { "esp", "rsp" }, 7 },
1649   { { "ebp", "rbp" }, 6 },
1650 };
1651
1652 // X86 target abstract base class; x86-32 and x86-64 are very close, so
1653 // most of the implementation can be shared.
1654 class X86TargetInfo : public TargetInfo {
1655   enum X86SSEEnum {
1656     NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
1657   } SSELevel;
1658   enum MMX3DNowEnum {
1659     NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1660   } MMX3DNowLevel;
1661   enum XOPEnum {
1662     NoXOP,
1663     SSE4A,
1664     FMA4,
1665     XOP
1666   } XOPLevel;
1667
1668   bool HasAES;
1669   bool HasPCLMUL;
1670   bool HasLZCNT;
1671   bool HasRDRND;
1672   bool HasBMI;
1673   bool HasBMI2;
1674   bool HasPOPCNT;
1675   bool HasRTM;
1676   bool HasPRFCHW;
1677   bool HasRDSEED;
1678   bool HasTBM;
1679   bool HasFMA;
1680   bool HasF16C;
1681   bool HasAVX512CD, HasAVX512ER, HasAVX512PF;
1682   bool HasSHA;
1683   bool HasCX16;
1684
1685   /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1686   ///
1687   /// Each enumeration represents a particular CPU supported by Clang. These
1688   /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1689   enum CPUKind {
1690     CK_Generic,
1691
1692     /// \name i386
1693     /// i386-generation processors.
1694     //@{
1695     CK_i386,
1696     //@}
1697
1698     /// \name i486
1699     /// i486-generation processors.
1700     //@{
1701     CK_i486,
1702     CK_WinChipC6,
1703     CK_WinChip2,
1704     CK_C3,
1705     //@}
1706
1707     /// \name i586
1708     /// i586-generation processors, P5 microarchitecture based.
1709     //@{
1710     CK_i586,
1711     CK_Pentium,
1712     CK_PentiumMMX,
1713     //@}
1714
1715     /// \name i686
1716     /// i686-generation processors, P6 / Pentium M microarchitecture based.
1717     //@{
1718     CK_i686,
1719     CK_PentiumPro,
1720     CK_Pentium2,
1721     CK_Pentium3,
1722     CK_Pentium3M,
1723     CK_PentiumM,
1724     CK_C3_2,
1725
1726     /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1727     /// Clang however has some logic to suport this.
1728     // FIXME: Warn, deprecate, and potentially remove this.
1729     CK_Yonah,
1730     //@}
1731
1732     /// \name Netburst
1733     /// Netburst microarchitecture based processors.
1734     //@{
1735     CK_Pentium4,
1736     CK_Pentium4M,
1737     CK_Prescott,
1738     CK_Nocona,
1739     //@}
1740
1741     /// \name Core
1742     /// Core microarchitecture based processors.
1743     //@{
1744     CK_Core2,
1745
1746     /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1747     /// codename which GCC no longer accepts as an option to -march, but Clang
1748     /// has some logic for recognizing it.
1749     // FIXME: Warn, deprecate, and potentially remove this.
1750     CK_Penryn,
1751     //@}
1752
1753     /// \name Atom
1754     /// Atom processors
1755     //@{
1756     CK_Atom,
1757     CK_Silvermont,
1758     //@}
1759
1760     /// \name Nehalem
1761     /// Nehalem microarchitecture based processors.
1762     //@{
1763     CK_Corei7,
1764     CK_Corei7AVX,
1765     CK_CoreAVXi,
1766     CK_CoreAVX2,
1767     //@}
1768
1769     /// \name Knights Landing
1770     /// Knights Landing processor.
1771     CK_KNL,
1772
1773     /// \name K6
1774     /// K6 architecture processors.
1775     //@{
1776     CK_K6,
1777     CK_K6_2,
1778     CK_K6_3,
1779     //@}
1780
1781     /// \name K7
1782     /// K7 architecture processors.
1783     //@{
1784     CK_Athlon,
1785     CK_AthlonThunderbird,
1786     CK_Athlon4,
1787     CK_AthlonXP,
1788     CK_AthlonMP,
1789     //@}
1790
1791     /// \name K8
1792     /// K8 architecture processors.
1793     //@{
1794     CK_Athlon64,
1795     CK_Athlon64SSE3,
1796     CK_AthlonFX,
1797     CK_K8,
1798     CK_K8SSE3,
1799     CK_Opteron,
1800     CK_OpteronSSE3,
1801     CK_AMDFAM10,
1802     //@}
1803
1804     /// \name Bobcat
1805     /// Bobcat architecture processors.
1806     //@{
1807     CK_BTVER1,
1808     CK_BTVER2,
1809     //@}
1810
1811     /// \name Bulldozer
1812     /// Bulldozer architecture processors.
1813     //@{
1814     CK_BDVER1,
1815     CK_BDVER2,
1816     CK_BDVER3,
1817     CK_BDVER4,
1818     //@}
1819
1820     /// This specification is deprecated and will be removed in the future.
1821     /// Users should prefer \see CK_K8.
1822     // FIXME: Warn on this when the CPU is set to it.
1823     CK_x86_64,
1824     //@}
1825
1826     /// \name Geode
1827     /// Geode processors.
1828     //@{
1829     CK_Geode
1830     //@}
1831   } CPU;
1832
1833   enum FPMathKind {
1834     FP_Default,
1835     FP_SSE,
1836     FP_387
1837   } FPMath;
1838
1839 public:
1840   X86TargetInfo(const llvm::Triple &Triple)
1841       : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
1842         XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
1843         HasRDRND(false), HasBMI(false), HasBMI2(false), HasPOPCNT(false),
1844         HasRTM(false), HasPRFCHW(false), HasRDSEED(false), HasTBM(false),
1845         HasFMA(false), HasF16C(false), HasAVX512CD(false), HasAVX512ER(false),
1846         HasAVX512PF(false), HasSHA(false), HasCX16(false), CPU(CK_Generic),
1847         FPMath(FP_Default) {
1848     BigEndian = false;
1849     LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
1850   }
1851   unsigned getFloatEvalMethod() const override {
1852     // X87 evaluates with 80 bits "long double" precision.
1853     return SSELevel == NoSSE ? 2 : 0;
1854   }
1855   void getTargetBuiltins(const Builtin::Info *&Records,
1856                                  unsigned &NumRecords) const override {
1857     Records = BuiltinInfo;
1858     NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
1859   }
1860   void getGCCRegNames(const char * const *&Names,
1861                       unsigned &NumNames) const override {
1862     Names = GCCRegNames;
1863     NumNames = llvm::array_lengthof(GCCRegNames);
1864   }
1865   void getGCCRegAliases(const GCCRegAlias *&Aliases,
1866                         unsigned &NumAliases) const override {
1867     Aliases = nullptr;
1868     NumAliases = 0;
1869   }
1870   void getGCCAddlRegNames(const AddlRegName *&Names,
1871                           unsigned &NumNames) const override {
1872     Names = AddlRegNames;
1873     NumNames = llvm::array_lengthof(AddlRegNames);
1874   }
1875   bool validateAsmConstraint(const char *&Name,
1876                                      TargetInfo::ConstraintInfo &info) const override;
1877   std::string convertConstraint(const char *&Constraint) const override;
1878   const char *getClobbers() const override {
1879     return "~{dirflag},~{fpsr},~{flags}";
1880   }
1881   void getTargetDefines(const LangOptions &Opts,
1882                         MacroBuilder &Builder) const override;
1883   static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
1884                           bool Enabled);
1885   static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
1886                           bool Enabled);
1887   static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
1888                           bool Enabled);
1889   void setFeatureEnabled(llvm::StringMap<bool> &Features,
1890                          StringRef Name, bool Enabled) const override {
1891     setFeatureEnabledImpl(Features, Name, Enabled);
1892   }
1893   // This exists purely to cut down on the number of virtual calls in
1894   // getDefaultFeatures which calls this repeatedly.
1895   static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
1896                                     StringRef Name, bool Enabled);
1897   void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
1898   bool hasFeature(StringRef Feature) const override;
1899   bool handleTargetFeatures(std::vector<std::string> &Features,
1900                             DiagnosticsEngine &Diags) override;
1901   StringRef getABI() const override {
1902     if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
1903       return "avx";
1904     else if (getTriple().getArch() == llvm::Triple::x86 &&
1905              MMX3DNowLevel == NoMMX3DNow)
1906       return "no-mmx";
1907     return "";
1908   }
1909   bool setCPU(const std::string &Name) override {
1910     CPU = llvm::StringSwitch<CPUKind>(Name)
1911       .Case("i386", CK_i386)
1912       .Case("i486", CK_i486)
1913       .Case("winchip-c6", CK_WinChipC6)
1914       .Case("winchip2", CK_WinChip2)
1915       .Case("c3", CK_C3)
1916       .Case("i586", CK_i586)
1917       .Case("pentium", CK_Pentium)
1918       .Case("pentium-mmx", CK_PentiumMMX)
1919       .Case("i686", CK_i686)
1920       .Case("pentiumpro", CK_PentiumPro)
1921       .Case("pentium2", CK_Pentium2)
1922       .Case("pentium3", CK_Pentium3)
1923       .Case("pentium3m", CK_Pentium3M)
1924       .Case("pentium-m", CK_PentiumM)
1925       .Case("c3-2", CK_C3_2)
1926       .Case("yonah", CK_Yonah)
1927       .Case("pentium4", CK_Pentium4)
1928       .Case("pentium4m", CK_Pentium4M)
1929       .Case("prescott", CK_Prescott)
1930       .Case("nocona", CK_Nocona)
1931       .Case("core2", CK_Core2)
1932       .Case("penryn", CK_Penryn)
1933       .Case("atom", CK_Atom)
1934       .Case("slm", CK_Silvermont)
1935       .Case("corei7", CK_Corei7)
1936       .Case("corei7-avx", CK_Corei7AVX)
1937       .Case("core-avx-i", CK_CoreAVXi)
1938       .Case("core-avx2", CK_CoreAVX2)
1939       .Case("knl", CK_KNL)
1940       .Case("k6", CK_K6)
1941       .Case("k6-2", CK_K6_2)
1942       .Case("k6-3", CK_K6_3)
1943       .Case("athlon", CK_Athlon)
1944       .Case("athlon-tbird", CK_AthlonThunderbird)
1945       .Case("athlon-4", CK_Athlon4)
1946       .Case("athlon-xp", CK_AthlonXP)
1947       .Case("athlon-mp", CK_AthlonMP)
1948       .Case("athlon64", CK_Athlon64)
1949       .Case("athlon64-sse3", CK_Athlon64SSE3)
1950       .Case("athlon-fx", CK_AthlonFX)
1951       .Case("k8", CK_K8)
1952       .Case("k8-sse3", CK_K8SSE3)
1953       .Case("opteron", CK_Opteron)
1954       .Case("opteron-sse3", CK_OpteronSSE3)
1955       .Case("amdfam10", CK_AMDFAM10)
1956       .Case("btver1", CK_BTVER1)
1957       .Case("btver2", CK_BTVER2)
1958       .Case("bdver1", CK_BDVER1)
1959       .Case("bdver2", CK_BDVER2)
1960       .Case("bdver3", CK_BDVER3)
1961       .Case("bdver4", CK_BDVER4)
1962       .Case("x86-64", CK_x86_64)
1963       .Case("geode", CK_Geode)
1964       .Default(CK_Generic);
1965
1966     // Perform any per-CPU checks necessary to determine if this CPU is
1967     // acceptable.
1968     // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1969     // invalid without explaining *why*.
1970     switch (CPU) {
1971     case CK_Generic:
1972       // No processor selected!
1973       return false;
1974
1975     case CK_i386:
1976     case CK_i486:
1977     case CK_WinChipC6:
1978     case CK_WinChip2:
1979     case CK_C3:
1980     case CK_i586:
1981     case CK_Pentium:
1982     case CK_PentiumMMX:
1983     case CK_i686:
1984     case CK_PentiumPro:
1985     case CK_Pentium2:
1986     case CK_Pentium3:
1987     case CK_Pentium3M:
1988     case CK_PentiumM:
1989     case CK_Yonah:
1990     case CK_C3_2:
1991     case CK_Pentium4:
1992     case CK_Pentium4M:
1993     case CK_Prescott:
1994     case CK_K6:
1995     case CK_K6_2:
1996     case CK_K6_3:
1997     case CK_Athlon:
1998     case CK_AthlonThunderbird:
1999     case CK_Athlon4:
2000     case CK_AthlonXP:
2001     case CK_AthlonMP:
2002     case CK_Geode:
2003       // Only accept certain architectures when compiling in 32-bit mode.
2004       if (getTriple().getArch() != llvm::Triple::x86)
2005         return false;
2006
2007       // Fallthrough
2008     case CK_Nocona:
2009     case CK_Core2:
2010     case CK_Penryn:
2011     case CK_Atom:
2012     case CK_Silvermont:
2013     case CK_Corei7:
2014     case CK_Corei7AVX:
2015     case CK_CoreAVXi:
2016     case CK_CoreAVX2:
2017     case CK_KNL:
2018     case CK_Athlon64:
2019     case CK_Athlon64SSE3:
2020     case CK_AthlonFX:
2021     case CK_K8:
2022     case CK_K8SSE3:
2023     case CK_Opteron:
2024     case CK_OpteronSSE3:
2025     case CK_AMDFAM10:
2026     case CK_BTVER1:
2027     case CK_BTVER2:
2028     case CK_BDVER1:
2029     case CK_BDVER2:
2030     case CK_BDVER3:
2031     case CK_BDVER4:
2032     case CK_x86_64:
2033       return true;
2034     }
2035     llvm_unreachable("Unhandled CPU kind");
2036   }
2037
2038   bool setFPMath(StringRef Name) override;
2039
2040   CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2041     // We accept all non-ARM calling conventions
2042     return (CC == CC_X86ThisCall ||
2043             CC == CC_X86FastCall ||
2044             CC == CC_X86StdCall || 
2045             CC == CC_C || 
2046             CC == CC_X86Pascal ||
2047             CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
2048   }
2049
2050   CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
2051     return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
2052   }
2053 };
2054
2055 bool X86TargetInfo::setFPMath(StringRef Name) {
2056   if (Name == "387") {
2057     FPMath = FP_387;
2058     return true;
2059   }
2060   if (Name == "sse") {
2061     FPMath = FP_SSE;
2062     return true;
2063   }
2064   return false;
2065 }
2066
2067 void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
2068   // FIXME: This *really* should not be here.
2069
2070   // X86_64 always has SSE2.
2071   if (getTriple().getArch() == llvm::Triple::x86_64)
2072     setFeatureEnabledImpl(Features, "sse2", true);
2073
2074   switch (CPU) {
2075   case CK_Generic:
2076   case CK_i386:
2077   case CK_i486:
2078   case CK_i586:
2079   case CK_Pentium:
2080   case CK_i686:
2081   case CK_PentiumPro:
2082     break;
2083   case CK_PentiumMMX:
2084   case CK_Pentium2:
2085     setFeatureEnabledImpl(Features, "mmx", true);
2086     break;
2087   case CK_Pentium3:
2088   case CK_Pentium3M:
2089     setFeatureEnabledImpl(Features, "sse", true);
2090     break;
2091   case CK_PentiumM:
2092   case CK_Pentium4:
2093   case CK_Pentium4M:
2094   case CK_x86_64:
2095     setFeatureEnabledImpl(Features, "sse2", true);
2096     break;
2097   case CK_Yonah:
2098   case CK_Prescott:
2099   case CK_Nocona:
2100     setFeatureEnabledImpl(Features, "sse3", true);
2101     setFeatureEnabledImpl(Features, "cx16", true);
2102     break;
2103   case CK_Core2:
2104     setFeatureEnabledImpl(Features, "ssse3", true);
2105     setFeatureEnabledImpl(Features, "cx16", true);
2106     break;
2107   case CK_Penryn:
2108     setFeatureEnabledImpl(Features, "sse4.1", true);
2109     setFeatureEnabledImpl(Features, "cx16", true);
2110     break;
2111   case CK_Atom:
2112     setFeatureEnabledImpl(Features, "ssse3", true);
2113     setFeatureEnabledImpl(Features, "cx16", true);
2114     break;
2115   case CK_Silvermont:
2116     setFeatureEnabledImpl(Features, "sse4.2", true);
2117     setFeatureEnabledImpl(Features, "aes", true);
2118     setFeatureEnabledImpl(Features, "cx16", true);
2119     setFeatureEnabledImpl(Features, "pclmul", true);
2120     break;
2121   case CK_Corei7:
2122     setFeatureEnabledImpl(Features, "sse4.2", true);
2123     setFeatureEnabledImpl(Features, "cx16", true);
2124     break;
2125   case CK_Corei7AVX:
2126     setFeatureEnabledImpl(Features, "avx", true);
2127     setFeatureEnabledImpl(Features, "aes", true);
2128     setFeatureEnabledImpl(Features, "cx16", true);
2129     setFeatureEnabledImpl(Features, "pclmul", true);
2130     break;
2131   case CK_CoreAVXi:
2132     setFeatureEnabledImpl(Features, "avx", true);
2133     setFeatureEnabledImpl(Features, "aes", true);
2134     setFeatureEnabledImpl(Features, "pclmul", true);
2135     setFeatureEnabledImpl(Features, "rdrnd", true);
2136     setFeatureEnabledImpl(Features, "f16c", true);
2137     break;
2138   case CK_CoreAVX2:
2139     setFeatureEnabledImpl(Features, "avx2", true);
2140     setFeatureEnabledImpl(Features, "aes", true);
2141     setFeatureEnabledImpl(Features, "pclmul", true);
2142     setFeatureEnabledImpl(Features, "lzcnt", true);
2143     setFeatureEnabledImpl(Features, "rdrnd", true);
2144     setFeatureEnabledImpl(Features, "f16c", true);
2145     setFeatureEnabledImpl(Features, "bmi", true);
2146     setFeatureEnabledImpl(Features, "bmi2", true);
2147     setFeatureEnabledImpl(Features, "rtm", true);
2148     setFeatureEnabledImpl(Features, "fma", true);
2149     setFeatureEnabledImpl(Features, "cx16", true);
2150     break;
2151   case CK_KNL:
2152     setFeatureEnabledImpl(Features, "avx512f", true);
2153     setFeatureEnabledImpl(Features, "avx512cd", true);
2154     setFeatureEnabledImpl(Features, "avx512er", true);
2155     setFeatureEnabledImpl(Features, "avx512pf", true);
2156     setFeatureEnabledImpl(Features, "aes", true);
2157     setFeatureEnabledImpl(Features, "pclmul", true);
2158     setFeatureEnabledImpl(Features, "lzcnt", true);
2159     setFeatureEnabledImpl(Features, "rdrnd", true);
2160     setFeatureEnabledImpl(Features, "f16c", true);
2161     setFeatureEnabledImpl(Features, "bmi", true);
2162     setFeatureEnabledImpl(Features, "bmi2", true);
2163     setFeatureEnabledImpl(Features, "rtm", true);
2164     setFeatureEnabledImpl(Features, "fma", true);
2165     break;
2166   case CK_K6:
2167   case CK_WinChipC6:
2168     setFeatureEnabledImpl(Features, "mmx", true);
2169     break;
2170   case CK_K6_2:
2171   case CK_K6_3:
2172   case CK_WinChip2:
2173   case CK_C3:
2174     setFeatureEnabledImpl(Features, "3dnow", true);
2175     break;
2176   case CK_Athlon:
2177   case CK_AthlonThunderbird:
2178   case CK_Geode:
2179     setFeatureEnabledImpl(Features, "3dnowa", true);
2180     break;
2181   case CK_Athlon4:
2182   case CK_AthlonXP:
2183   case CK_AthlonMP:
2184     setFeatureEnabledImpl(Features, "sse", true);
2185     setFeatureEnabledImpl(Features, "3dnowa", true);
2186     break;
2187   case CK_K8:
2188   case CK_Opteron:
2189   case CK_Athlon64:
2190   case CK_AthlonFX:
2191     setFeatureEnabledImpl(Features, "sse2", true);
2192     setFeatureEnabledImpl(Features, "3dnowa", true);
2193     break;
2194   case CK_K8SSE3:
2195   case CK_OpteronSSE3:
2196   case CK_Athlon64SSE3:
2197     setFeatureEnabledImpl(Features, "sse3", true);
2198     setFeatureEnabledImpl(Features, "3dnowa", true);
2199     break;
2200   case CK_AMDFAM10:
2201     setFeatureEnabledImpl(Features, "sse3", true);
2202     setFeatureEnabledImpl(Features, "sse4a", true);
2203     setFeatureEnabledImpl(Features, "3dnowa", true);
2204     setFeatureEnabledImpl(Features, "lzcnt", true);
2205     setFeatureEnabledImpl(Features, "popcnt", true);
2206     break;
2207   case CK_BTVER1:
2208     setFeatureEnabledImpl(Features, "ssse3", true);
2209     setFeatureEnabledImpl(Features, "sse4a", true);
2210     setFeatureEnabledImpl(Features, "cx16", true);
2211     setFeatureEnabledImpl(Features, "lzcnt", true);
2212     setFeatureEnabledImpl(Features, "popcnt", true);
2213     setFeatureEnabledImpl(Features, "prfchw", true);
2214     break;
2215   case CK_BTVER2:
2216     setFeatureEnabledImpl(Features, "avx", true);
2217     setFeatureEnabledImpl(Features, "sse4a", true);
2218     setFeatureEnabledImpl(Features, "lzcnt", true);
2219     setFeatureEnabledImpl(Features, "aes", true);
2220     setFeatureEnabledImpl(Features, "pclmul", true);
2221     setFeatureEnabledImpl(Features, "prfchw", true);
2222     setFeatureEnabledImpl(Features, "bmi", true);
2223     setFeatureEnabledImpl(Features, "f16c", true);
2224     setFeatureEnabledImpl(Features, "cx16", true);
2225     break;
2226   case CK_BDVER1:
2227     setFeatureEnabledImpl(Features, "xop", true);
2228     setFeatureEnabledImpl(Features, "lzcnt", true);
2229     setFeatureEnabledImpl(Features, "aes", true);
2230     setFeatureEnabledImpl(Features, "pclmul", true);
2231     setFeatureEnabledImpl(Features, "prfchw", true);
2232     setFeatureEnabledImpl(Features, "cx16", true);
2233     break;
2234   case CK_BDVER4:
2235     setFeatureEnabledImpl(Features, "avx2", true);
2236     setFeatureEnabledImpl(Features, "bmi2", true);
2237     // FALLTHROUGH
2238   case CK_BDVER2:
2239   case CK_BDVER3:
2240     setFeatureEnabledImpl(Features, "xop", true);
2241     setFeatureEnabledImpl(Features, "lzcnt", true);
2242     setFeatureEnabledImpl(Features, "aes", true);
2243     setFeatureEnabledImpl(Features, "pclmul", true);
2244     setFeatureEnabledImpl(Features, "prfchw", true);
2245     setFeatureEnabledImpl(Features, "bmi", true);
2246     setFeatureEnabledImpl(Features, "fma", true);
2247     setFeatureEnabledImpl(Features, "f16c", true);
2248     setFeatureEnabledImpl(Features, "tbm", true);
2249     setFeatureEnabledImpl(Features, "cx16", true);
2250     break;
2251   case CK_C3_2:
2252     setFeatureEnabledImpl(Features, "sse", true);
2253     break;
2254   }
2255 }
2256
2257 void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
2258                                 X86SSEEnum Level, bool Enabled) {
2259   if (Enabled) {
2260     switch (Level) {
2261     case AVX512F:
2262       Features["avx512f"] = true;
2263     case AVX2:
2264       Features["avx2"] = true;
2265     case AVX:
2266       Features["avx"] = true;
2267     case SSE42:
2268       Features["sse4.2"] = true;
2269     case SSE41:
2270       Features["sse4.1"] = true;
2271     case SSSE3:
2272       Features["ssse3"] = true;
2273     case SSE3:
2274       Features["sse3"] = true;
2275     case SSE2:
2276       Features["sse2"] = true;
2277     case SSE1:
2278       Features["sse"] = true;
2279     case NoSSE:
2280       break;
2281     }
2282     return;
2283   }
2284
2285   switch (Level) {
2286   case NoSSE:
2287   case SSE1:
2288     Features["sse"] = false;
2289   case SSE2:
2290     Features["sse2"] = Features["pclmul"] = Features["aes"] =
2291       Features["sha"] = false;
2292   case SSE3:
2293     Features["sse3"] = false;
2294     setXOPLevel(Features, NoXOP, false);
2295   case SSSE3:
2296     Features["ssse3"] = false;
2297   case SSE41:
2298     Features["sse4.1"] = false;
2299   case SSE42:
2300     Features["sse4.2"] = false;
2301   case AVX:
2302     Features["fma"] = Features["avx"] = Features["f16c"] = false;
2303     setXOPLevel(Features, FMA4, false);
2304   case AVX2:
2305     Features["avx2"] = false;
2306   case AVX512F:
2307     Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
2308       Features["avx512pf"] = false;
2309   }
2310 }
2311
2312 void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
2313                                 MMX3DNowEnum Level, bool Enabled) {
2314   if (Enabled) {
2315     switch (Level) {
2316     case AMD3DNowAthlon:
2317       Features["3dnowa"] = true;
2318     case AMD3DNow:
2319       Features["3dnow"] = true;
2320     case MMX:
2321       Features["mmx"] = true;
2322     case NoMMX3DNow:
2323       break;
2324     }
2325     return;
2326   }
2327
2328   switch (Level) {
2329   case NoMMX3DNow:
2330   case MMX:
2331     Features["mmx"] = false;
2332   case AMD3DNow:
2333     Features["3dnow"] = false;
2334   case AMD3DNowAthlon:
2335     Features["3dnowa"] = false;
2336   }
2337 }
2338
2339 void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2340                                 bool Enabled) {
2341   if (Enabled) {
2342     switch (Level) {
2343     case XOP:
2344       Features["xop"] = true;
2345     case FMA4:
2346       Features["fma4"] = true;
2347       setSSELevel(Features, AVX, true);
2348     case SSE4A:
2349       Features["sse4a"] = true;
2350       setSSELevel(Features, SSE3, true);
2351     case NoXOP:
2352       break;
2353     }
2354     return;
2355   }
2356
2357   switch (Level) {
2358   case NoXOP:
2359   case SSE4A:
2360     Features["sse4a"] = false;
2361   case FMA4:
2362     Features["fma4"] = false;
2363   case XOP:
2364     Features["xop"] = false;
2365   }
2366 }
2367
2368 void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2369                                           StringRef Name, bool Enabled) {
2370   // FIXME: This *really* should not be here.  We need some way of translating
2371   // options into llvm subtarget features.
2372   if (Name == "sse4")
2373     Name = "sse4.2";
2374
2375   Features[Name] = Enabled;
2376
2377   if (Name == "mmx") {
2378     setMMXLevel(Features, MMX, Enabled);
2379   } else if (Name == "sse") {
2380     setSSELevel(Features, SSE1, Enabled);
2381   } else if (Name == "sse2") {
2382     setSSELevel(Features, SSE2, Enabled);
2383   } else if (Name == "sse3") {
2384     setSSELevel(Features, SSE3, Enabled);
2385   } else if (Name == "ssse3") {
2386     setSSELevel(Features, SSSE3, Enabled);
2387   } else if (Name == "sse4.2") {
2388     setSSELevel(Features, SSE42, Enabled);
2389   } else if (Name == "sse4.1") {
2390     setSSELevel(Features, SSE41, Enabled);
2391   } else if (Name == "3dnow") {
2392     setMMXLevel(Features, AMD3DNow, Enabled);
2393   } else if (Name == "3dnowa") {
2394     setMMXLevel(Features, AMD3DNowAthlon, Enabled);
2395   } else if (Name == "aes") {
2396     if (Enabled)
2397       setSSELevel(Features, SSE2, Enabled);
2398   } else if (Name == "pclmul") {
2399     if (Enabled)
2400       setSSELevel(Features, SSE2, Enabled);
2401   } else if (Name == "avx") {
2402     setSSELevel(Features, AVX, Enabled);
2403   } else if (Name == "avx2") {
2404     setSSELevel(Features, AVX2, Enabled);
2405   } else if (Name == "avx512f") {
2406     setSSELevel(Features, AVX512F, Enabled);
2407   } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf") {
2408     if (Enabled)
2409       setSSELevel(Features, AVX512F, Enabled);
2410   } else if (Name == "fma") {
2411     if (Enabled)
2412       setSSELevel(Features, AVX, Enabled);
2413   } else if (Name == "fma4") {
2414     setXOPLevel(Features, FMA4, Enabled);
2415   } else if (Name == "xop") {
2416     setXOPLevel(Features, XOP, Enabled);
2417   } else if (Name == "sse4a") {
2418     setXOPLevel(Features, SSE4A, Enabled);
2419   } else if (Name == "f16c") {
2420     if (Enabled)
2421       setSSELevel(Features, AVX, Enabled);
2422   } else if (Name == "sha") {
2423     if (Enabled)
2424       setSSELevel(Features, SSE2, Enabled);
2425   }
2426 }
2427
2428 /// handleTargetFeatures - Perform initialization based on the user
2429 /// configured set of features.
2430 bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
2431                                          DiagnosticsEngine &Diags) {
2432   // Remember the maximum enabled sselevel.
2433   for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2434     // Ignore disabled features.
2435     if (Features[i][0] == '-')
2436       continue;
2437
2438     StringRef Feature = StringRef(Features[i]).substr(1);
2439
2440     if (Feature == "aes") {
2441       HasAES = true;
2442       continue;
2443     }
2444
2445     if (Feature == "pclmul") {
2446       HasPCLMUL = true;
2447       continue;
2448     }
2449
2450     if (Feature == "lzcnt") {
2451       HasLZCNT = true;
2452       continue;
2453     }
2454
2455     if (Feature == "rdrnd") {
2456       HasRDRND = true;
2457       continue;
2458     }
2459
2460     if (Feature == "bmi") {
2461       HasBMI = true;
2462       continue;
2463     }
2464
2465     if (Feature == "bmi2") {
2466       HasBMI2 = true;
2467       continue;
2468     }
2469
2470     if (Feature == "popcnt") {
2471       HasPOPCNT = true;
2472       continue;
2473     }
2474
2475     if (Feature == "rtm") {
2476       HasRTM = true;
2477       continue;
2478     }
2479
2480     if (Feature == "prfchw") {
2481       HasPRFCHW = true;
2482       continue;
2483     }
2484
2485     if (Feature == "rdseed") {
2486       HasRDSEED = true;
2487       continue;
2488     }
2489
2490     if (Feature == "tbm") {
2491       HasTBM = true;
2492       continue;
2493     }
2494
2495     if (Feature == "fma") {
2496       HasFMA = true;
2497       continue;
2498     }
2499
2500     if (Feature == "f16c") {
2501       HasF16C = true;
2502       continue;
2503     }
2504
2505     if (Feature == "avx512cd") {
2506       HasAVX512CD = true;
2507       continue;
2508     }
2509
2510     if (Feature == "avx512er") {
2511       HasAVX512ER = true;
2512       continue;
2513     }
2514
2515     if (Feature == "avx512pf") {
2516       HasAVX512PF = true;
2517       continue;
2518     }
2519
2520     if (Feature == "sha") {
2521       HasSHA = true;
2522       continue;
2523     }
2524
2525     if (Feature == "cx16") {
2526       HasCX16 = true;
2527       continue;
2528     }
2529
2530     assert(Features[i][0] == '+' && "Invalid target feature!");
2531     X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
2532       .Case("avx512f", AVX512F)
2533       .Case("avx2", AVX2)
2534       .Case("avx", AVX)
2535       .Case("sse4.2", SSE42)
2536       .Case("sse4.1", SSE41)
2537       .Case("ssse3", SSSE3)
2538       .Case("sse3", SSE3)
2539       .Case("sse2", SSE2)
2540       .Case("sse", SSE1)
2541       .Default(NoSSE);
2542     SSELevel = std::max(SSELevel, Level);
2543
2544     MMX3DNowEnum ThreeDNowLevel =
2545       llvm::StringSwitch<MMX3DNowEnum>(Feature)
2546         .Case("3dnowa", AMD3DNowAthlon)
2547         .Case("3dnow", AMD3DNow)
2548         .Case("mmx", MMX)
2549         .Default(NoMMX3DNow);
2550     MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
2551
2552     XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2553         .Case("xop", XOP)
2554         .Case("fma4", FMA4)
2555         .Case("sse4a", SSE4A)
2556         .Default(NoXOP);
2557     XOPLevel = std::max(XOPLevel, XLevel);
2558   }
2559
2560   // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2561   // Can't do this earlier because we need to be able to explicitly enable
2562   // popcnt and still disable sse4.2.
2563   if (!HasPOPCNT && SSELevel >= SSE42 &&
2564       std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2565     HasPOPCNT = true;
2566     Features.push_back("+popcnt");
2567   }
2568
2569   // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2570   if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2571       std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2572     HasPRFCHW = true;
2573     Features.push_back("+prfchw");
2574   }
2575
2576   // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2577   // matches the selected sse level.
2578   if (FPMath == FP_SSE && SSELevel < SSE1) {
2579     Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2580     return false;
2581   } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2582     Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2583     return false;
2584   }
2585
2586   // Don't tell the backend if we're turning off mmx; it will end up disabling
2587   // SSE, which we don't want.
2588   // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2589   // then enable MMX.
2590   std::vector<std::string>::iterator it;
2591   it = std::find(Features.begin(), Features.end(), "-mmx");
2592   if (it != Features.end())
2593     Features.erase(it);
2594   else if (SSELevel > NoSSE)
2595     MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
2596   return true;
2597 }
2598
2599 /// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2600 /// definitions for this particular subtarget.
2601 void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
2602                                      MacroBuilder &Builder) const {
2603   // Target identification.
2604   if (getTriple().getArch() == llvm::Triple::x86_64) {
2605     Builder.defineMacro("__amd64__");
2606     Builder.defineMacro("__amd64");
2607     Builder.defineMacro("__x86_64");
2608     Builder.defineMacro("__x86_64__");
2609   } else {
2610     DefineStd(Builder, "i386", Opts);
2611   }
2612
2613   // Subtarget options.
2614   // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2615   // truly should be based on -mtune options.
2616   switch (CPU) {
2617   case CK_Generic:
2618     break;
2619   case CK_i386:
2620     // The rest are coming from the i386 define above.
2621     Builder.defineMacro("__tune_i386__");
2622     break;
2623   case CK_i486:
2624   case CK_WinChipC6:
2625   case CK_WinChip2:
2626   case CK_C3:
2627     defineCPUMacros(Builder, "i486");
2628     break;
2629   case CK_PentiumMMX:
2630     Builder.defineMacro("__pentium_mmx__");
2631     Builder.defineMacro("__tune_pentium_mmx__");
2632     // Fallthrough
2633   case CK_i586:
2634   case CK_Pentium:
2635     defineCPUMacros(Builder, "i586");
2636     defineCPUMacros(Builder, "pentium");
2637     break;
2638   case CK_Pentium3:
2639   case CK_Pentium3M:
2640   case CK_PentiumM:
2641     Builder.defineMacro("__tune_pentium3__");
2642     // Fallthrough
2643   case CK_Pentium2:
2644   case CK_C3_2:
2645     Builder.defineMacro("__tune_pentium2__");
2646     // Fallthrough
2647   case CK_PentiumPro:
2648     Builder.defineMacro("__tune_i686__");
2649     Builder.defineMacro("__tune_pentiumpro__");
2650     // Fallthrough
2651   case CK_i686:
2652     Builder.defineMacro("__i686");
2653     Builder.defineMacro("__i686__");
2654     // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2655     Builder.defineMacro("__pentiumpro");
2656     Builder.defineMacro("__pentiumpro__");
2657     break;
2658   case CK_Pentium4:
2659   case CK_Pentium4M:
2660     defineCPUMacros(Builder, "pentium4");
2661     break;
2662   case CK_Yonah:
2663   case CK_Prescott:
2664   case CK_Nocona:
2665     defineCPUMacros(Builder, "nocona");
2666     break;
2667   case CK_Core2:
2668   case CK_Penryn:
2669     defineCPUMacros(Builder, "core2");
2670     break;
2671   case CK_Atom:
2672     defineCPUMacros(Builder, "atom");
2673     break;
2674   case CK_Silvermont:
2675     defineCPUMacros(Builder, "slm");
2676     break;
2677   case CK_Corei7:
2678   case CK_Corei7AVX:
2679   case CK_CoreAVXi:
2680   case CK_CoreAVX2:
2681     defineCPUMacros(Builder, "corei7");
2682     break;
2683   case CK_KNL:
2684     defineCPUMacros(Builder, "knl");
2685     break;
2686   case CK_K6_2:
2687     Builder.defineMacro("__k6_2__");
2688     Builder.defineMacro("__tune_k6_2__");
2689     // Fallthrough
2690   case CK_K6_3:
2691     if (CPU != CK_K6_2) {  // In case of fallthrough
2692       // FIXME: GCC may be enabling these in cases where some other k6
2693       // architecture is specified but -m3dnow is explicitly provided. The
2694       // exact semantics need to be determined and emulated here.
2695       Builder.defineMacro("__k6_3__");
2696       Builder.defineMacro("__tune_k6_3__");
2697     }
2698     // Fallthrough
2699   case CK_K6:
2700     defineCPUMacros(Builder, "k6");
2701     break;
2702   case CK_Athlon:
2703   case CK_AthlonThunderbird:
2704   case CK_Athlon4:
2705   case CK_AthlonXP:
2706   case CK_AthlonMP:
2707     defineCPUMacros(Builder, "athlon");
2708     if (SSELevel != NoSSE) {
2709       Builder.defineMacro("__athlon_sse__");
2710       Builder.defineMacro("__tune_athlon_sse__");
2711     }
2712     break;
2713   case CK_K8:
2714   case CK_K8SSE3:
2715   case CK_x86_64:
2716   case CK_Opteron:
2717   case CK_OpteronSSE3:
2718   case CK_Athlon64:
2719   case CK_Athlon64SSE3:
2720   case CK_AthlonFX:
2721     defineCPUMacros(Builder, "k8");
2722     break;
2723   case CK_AMDFAM10:
2724     defineCPUMacros(Builder, "amdfam10");
2725     break;
2726   case CK_BTVER1:
2727     defineCPUMacros(Builder, "btver1");
2728     break;
2729   case CK_BTVER2:
2730     defineCPUMacros(Builder, "btver2");
2731     break;
2732   case CK_BDVER1:
2733     defineCPUMacros(Builder, "bdver1");
2734     break;
2735   case CK_BDVER2:
2736     defineCPUMacros(Builder, "bdver2");
2737     break;
2738   case CK_BDVER3:
2739     defineCPUMacros(Builder, "bdver3");
2740     break;
2741   case CK_BDVER4:
2742     defineCPUMacros(Builder, "bdver4");
2743     break;
2744   case CK_Geode:
2745     defineCPUMacros(Builder, "geode");
2746     break;
2747   }
2748
2749   // Target properties.
2750   Builder.defineMacro("__REGISTER_PREFIX__", "");
2751
2752   // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2753   // functions in glibc header files that use FP Stack inline asm which the
2754   // backend can't deal with (PR879).
2755   Builder.defineMacro("__NO_MATH_INLINES");
2756
2757   if (HasAES)
2758     Builder.defineMacro("__AES__");
2759
2760   if (HasPCLMUL)
2761     Builder.defineMacro("__PCLMUL__");
2762
2763   if (HasLZCNT)
2764     Builder.defineMacro("__LZCNT__");
2765
2766   if (HasRDRND)
2767     Builder.defineMacro("__RDRND__");
2768
2769   if (HasBMI)
2770     Builder.defineMacro("__BMI__");
2771
2772   if (HasBMI2)
2773     Builder.defineMacro("__BMI2__");
2774
2775   if (HasPOPCNT)
2776     Builder.defineMacro("__POPCNT__");
2777
2778   if (HasRTM)
2779     Builder.defineMacro("__RTM__");
2780
2781   if (HasPRFCHW)
2782     Builder.defineMacro("__PRFCHW__");
2783
2784   if (HasRDSEED)
2785     Builder.defineMacro("__RDSEED__");
2786
2787   if (HasTBM)
2788     Builder.defineMacro("__TBM__");
2789
2790   switch (XOPLevel) {
2791   case XOP:
2792     Builder.defineMacro("__XOP__");
2793   case FMA4:
2794     Builder.defineMacro("__FMA4__");
2795   case SSE4A:
2796     Builder.defineMacro("__SSE4A__");
2797   case NoXOP:
2798     break;
2799   }
2800
2801   if (HasFMA)
2802     Builder.defineMacro("__FMA__");
2803
2804   if (HasF16C)
2805     Builder.defineMacro("__F16C__");
2806
2807   if (HasAVX512CD)
2808     Builder.defineMacro("__AVX512CD__");
2809   if (HasAVX512ER)
2810     Builder.defineMacro("__AVX512ER__");
2811   if (HasAVX512PF)
2812     Builder.defineMacro("__AVX512PF__");
2813
2814   if (HasSHA)
2815     Builder.defineMacro("__SHA__");
2816
2817   if (HasCX16)
2818     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
2819
2820   // Each case falls through to the previous one here.
2821   switch (SSELevel) {
2822   case AVX512F:
2823     Builder.defineMacro("__AVX512F__");
2824   case AVX2:
2825     Builder.defineMacro("__AVX2__");
2826   case AVX:
2827     Builder.defineMacro("__AVX__");
2828   case SSE42:
2829     Builder.defineMacro("__SSE4_2__");
2830   case SSE41:
2831     Builder.defineMacro("__SSE4_1__");
2832   case SSSE3:
2833     Builder.defineMacro("__SSSE3__");
2834   case SSE3:
2835     Builder.defineMacro("__SSE3__");
2836   case SSE2:
2837     Builder.defineMacro("__SSE2__");
2838     Builder.defineMacro("__SSE2_MATH__");  // -mfp-math=sse always implied.
2839   case SSE1:
2840     Builder.defineMacro("__SSE__");
2841     Builder.defineMacro("__SSE_MATH__");   // -mfp-math=sse always implied.
2842   case NoSSE:
2843     break;
2844   }
2845
2846   if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
2847     switch (SSELevel) {
2848     case AVX512F:
2849     case AVX2:
2850     case AVX:
2851     case SSE42:
2852     case SSE41:
2853     case SSSE3:
2854     case SSE3:
2855     case SSE2:
2856       Builder.defineMacro("_M_IX86_FP", Twine(2));
2857       break;
2858     case SSE1:
2859       Builder.defineMacro("_M_IX86_FP", Twine(1));
2860       break;
2861     default:
2862       Builder.defineMacro("_M_IX86_FP", Twine(0));
2863     }
2864   }
2865
2866   // Each case falls through to the previous one here.
2867   switch (MMX3DNowLevel) {
2868   case AMD3DNowAthlon:
2869     Builder.defineMacro("__3dNOW_A__");
2870   case AMD3DNow:
2871     Builder.defineMacro("__3dNOW__");
2872   case MMX:
2873     Builder.defineMacro("__MMX__");
2874   case NoMMX3DNow:
2875     break;
2876   }
2877
2878   if (CPU >= CK_i486) {
2879     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
2880     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
2881     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
2882   }
2883   if (CPU >= CK_i586)
2884     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
2885 }
2886
2887 bool X86TargetInfo::hasFeature(StringRef Feature) const {
2888   return llvm::StringSwitch<bool>(Feature)
2889       .Case("aes", HasAES)
2890       .Case("avx", SSELevel >= AVX)
2891       .Case("avx2", SSELevel >= AVX2)
2892       .Case("avx512f", SSELevel >= AVX512F)
2893       .Case("avx512cd", HasAVX512CD)
2894       .Case("avx512er", HasAVX512ER)
2895       .Case("avx512pf", HasAVX512PF)
2896       .Case("bmi", HasBMI)
2897       .Case("bmi2", HasBMI2)
2898       .Case("cx16", HasCX16)
2899       .Case("f16c", HasF16C)
2900       .Case("fma", HasFMA)
2901       .Case("fma4", XOPLevel >= FMA4)
2902       .Case("tbm", HasTBM)
2903       .Case("lzcnt", HasLZCNT)
2904       .Case("rdrnd", HasRDRND)
2905       .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2906       .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2907       .Case("mmx", MMX3DNowLevel >= MMX)
2908       .Case("pclmul", HasPCLMUL)
2909       .Case("popcnt", HasPOPCNT)
2910       .Case("rtm", HasRTM)
2911       .Case("prfchw", HasPRFCHW)
2912       .Case("rdseed", HasRDSEED)
2913       .Case("sha", HasSHA)
2914       .Case("sse", SSELevel >= SSE1)
2915       .Case("sse2", SSELevel >= SSE2)
2916       .Case("sse3", SSELevel >= SSE3)
2917       .Case("ssse3", SSELevel >= SSSE3)
2918       .Case("sse4.1", SSELevel >= SSE41)
2919       .Case("sse4.2", SSELevel >= SSE42)
2920       .Case("sse4a", XOPLevel >= SSE4A)
2921       .Case("x86", true)
2922       .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
2923       .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
2924       .Case("xop", XOPLevel >= XOP)
2925       .Default(false);
2926 }
2927
2928 bool
2929 X86TargetInfo::validateAsmConstraint(const char *&Name,
2930                                      TargetInfo::ConstraintInfo &Info) const {
2931   switch (*Name) {
2932   default: return false;
2933   case 'Y': // first letter of a pair:
2934     switch (*(Name+1)) {
2935     default: return false;
2936     case '0':  // First SSE register.
2937     case 't':  // Any SSE register, when SSE2 is enabled.
2938     case 'i':  // Any SSE register, when SSE2 and inter-unit moves enabled.
2939     case 'm':  // any MMX register, when inter-unit moves enabled.
2940       break;   // falls through to setAllowsRegister.
2941   }
2942   case 'f': // any x87 floating point stack register.
2943     // Constraint 'f' cannot be used for output operands.
2944     if (Info.ConstraintStr[0] == '=')
2945       return false;
2946
2947     Info.setAllowsRegister();
2948     return true;
2949   case 'a': // eax.
2950   case 'b': // ebx.
2951   case 'c': // ecx.
2952   case 'd': // edx.
2953   case 'S': // esi.
2954   case 'D': // edi.
2955   case 'A': // edx:eax.
2956   case 't': // top of floating point stack.
2957   case 'u': // second from top of floating point stack.
2958   case 'q': // Any register accessible as [r]l: a, b, c, and d.
2959   case 'y': // Any MMX register.
2960   case 'x': // Any SSE register.
2961   case 'Q': // Any register accessible as [r]h: a, b, c, and d.
2962   case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2963   case 'l': // "Index" registers: any general register that can be used as an
2964             // index in a base+index memory access.
2965     Info.setAllowsRegister();
2966     return true;
2967   case 'C': // SSE floating point constant.
2968   case 'G': // x87 floating point constant.
2969   case 'e': // 32-bit signed integer constant for use with zero-extending
2970             // x86_64 instructions.
2971   case 'Z': // 32-bit unsigned integer constant for use with zero-extending
2972             // x86_64 instructions.
2973     return true;
2974   }
2975 }
2976
2977
2978 std::string
2979 X86TargetInfo::convertConstraint(const char *&Constraint) const {
2980   switch (*Constraint) {
2981   case 'a': return std::string("{ax}");
2982   case 'b': return std::string("{bx}");
2983   case 'c': return std::string("{cx}");
2984   case 'd': return std::string("{dx}");
2985   case 'S': return std::string("{si}");
2986   case 'D': return std::string("{di}");
2987   case 'p': // address
2988     return std::string("im");
2989   case 't': // top of floating point stack.
2990     return std::string("{st}");
2991   case 'u': // second from top of floating point stack.
2992     return std::string("{st(1)}"); // second from top of floating point stack.
2993   default:
2994     return std::string(1, *Constraint);
2995   }
2996 }
2997 } // end anonymous namespace
2998
2999 namespace {
3000 // X86-32 generic target
3001 class X86_32TargetInfo : public X86TargetInfo {
3002 public:
3003   X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
3004     DoubleAlign = LongLongAlign = 32;
3005     LongDoubleWidth = 96;
3006     LongDoubleAlign = 32;
3007     SuitableAlign = 128;
3008     DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
3009     SizeType = UnsignedInt;
3010     PtrDiffType = SignedInt;
3011     IntPtrType = SignedInt;
3012     RegParmMax = 3;
3013
3014     // Use fpret for all types.
3015     RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3016                              (1 << TargetInfo::Double) |
3017                              (1 << TargetInfo::LongDouble));
3018
3019     // x86-32 has atomics up to 8 bytes
3020     // FIXME: Check that we actually have cmpxchg8b before setting
3021     // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3022     MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
3023   }
3024   BuiltinVaListKind getBuiltinVaListKind() const override {
3025     return TargetInfo::CharPtrBuiltinVaList;
3026   }
3027
3028   int getEHDataRegisterNumber(unsigned RegNo) const override {
3029     if (RegNo == 0) return 0;
3030     if (RegNo == 1) return 2;
3031     return -1;
3032   }
3033   bool validateInputSize(StringRef Constraint,
3034                          unsigned Size) const override {
3035     switch (Constraint[0]) {
3036     default: break;
3037     case 'a':
3038     case 'b':
3039     case 'c':
3040     case 'd':
3041       return Size <= 32;
3042     }
3043
3044     return true;
3045   }
3046 };
3047 } // end anonymous namespace
3048
3049 namespace {
3050 class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3051 public:
3052   NetBSDI386TargetInfo(const llvm::Triple &Triple)
3053       : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
3054
3055   unsigned getFloatEvalMethod() const override {
3056     unsigned Major, Minor, Micro;
3057     getTriple().getOSVersion(Major, Minor, Micro);
3058     // New NetBSD uses the default rounding mode.
3059     if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3060       return X86_32TargetInfo::getFloatEvalMethod();
3061     // NetBSD before 6.99.26 defaults to "double" rounding.
3062     return 1;
3063   }
3064 };
3065 } // end anonymous namespace
3066
3067 namespace {
3068 class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3069 public:
3070   OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3071       : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
3072     SizeType = UnsignedLong;
3073     IntPtrType = SignedLong;
3074     PtrDiffType = SignedLong;
3075   }
3076 };
3077 } // end anonymous namespace
3078
3079 namespace {
3080 class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3081 public:
3082   BitrigI386TargetInfo(const llvm::Triple &Triple)
3083       : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
3084     SizeType = UnsignedLong;
3085     IntPtrType = SignedLong;
3086     PtrDiffType = SignedLong;
3087   }
3088 };
3089 } // end anonymous namespace
3090
3091 namespace {
3092 class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
3093 public:
3094   DarwinI386TargetInfo(const llvm::Triple &Triple)
3095       : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
3096     LongDoubleWidth = 128;
3097     LongDoubleAlign = 128;
3098     SuitableAlign = 128;
3099     MaxVectorAlign = 256;
3100     SizeType = UnsignedLong;
3101     IntPtrType = SignedLong;
3102     DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
3103     HasAlignMac68kSupport = true;
3104   }
3105
3106 };
3107 } // end anonymous namespace
3108
3109 namespace {
3110 // x86-32 Windows target
3111 class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
3112 public:
3113   WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3114       : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
3115     WCharType = UnsignedShort;
3116     DoubleAlign = LongLongAlign = 64;
3117     DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
3118   }
3119   void getTargetDefines(const LangOptions &Opts,
3120                         MacroBuilder &Builder) const override {
3121     WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3122   }
3123 };
3124
3125 // x86-32 Windows Visual Studio target
3126 class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
3127 public:
3128   MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
3129       : WindowsX86_32TargetInfo(Triple) {
3130     LongDoubleWidth = LongDoubleAlign = 64;
3131     LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3132   }
3133   void getTargetDefines(const LangOptions &Opts,
3134                         MacroBuilder &Builder) const override {
3135     WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3136     WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3137     // The value of the following reflects processor type.
3138     // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3139     // We lost the original triple, so we use the default.
3140     Builder.defineMacro("_M_IX86", "600");
3141   }
3142 };
3143 } // end anonymous namespace
3144
3145 static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3146   Builder.defineMacro("__MSVCRT__");
3147   Builder.defineMacro("__MINGW32__");
3148
3149   // Mingw defines __declspec(a) to __attribute__((a)).  Clang supports
3150   // __declspec natively under -fms-extensions, but we define a no-op __declspec
3151   // macro anyway for pre-processor compatibility.
3152   if (Opts.MicrosoftExt)
3153     Builder.defineMacro("__declspec", "__declspec");
3154   else
3155     Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3156
3157   if (!Opts.MicrosoftExt) {
3158     // Provide macros for all the calling convention keywords.  Provide both
3159     // single and double underscore prefixed variants.  These are available on
3160     // x64 as well as x86, even though they have no effect.
3161     const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3162     for (const char *CC : CCs) {
3163       std::string GCCSpelling = "__attribute__((__";
3164       GCCSpelling += CC;
3165       GCCSpelling += "__))";
3166       Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3167       Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3168     }
3169   }
3170 }
3171
3172 namespace {
3173 // x86-32 MinGW target
3174 class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3175 public:
3176   MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3177       : WindowsX86_32TargetInfo(Triple) {}
3178   void getTargetDefines(const LangOptions &Opts,
3179                         MacroBuilder &Builder) const override {
3180     WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3181     DefineStd(Builder, "WIN32", Opts);
3182     DefineStd(Builder, "WINNT", Opts);
3183     Builder.defineMacro("_X86_");
3184     addMinGWDefines(Opts, Builder);
3185   }
3186 };
3187 } // end anonymous namespace
3188
3189 namespace {
3190 // x86-32 Cygwin target
3191 class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3192 public:
3193   CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3194       : X86_32TargetInfo(Triple) {
3195     TLSSupported = false;
3196     WCharType = UnsignedShort;
3197     DoubleAlign = LongLongAlign = 64;
3198     DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
3199   }
3200   void getTargetDefines(const LangOptions &Opts,
3201                         MacroBuilder &Builder) const override {
3202     X86_32TargetInfo::getTargetDefines(Opts, Builder);
3203     Builder.defineMacro("_X86_");
3204     Builder.defineMacro("__CYGWIN__");
3205     Builder.defineMacro("__CYGWIN32__");
3206     DefineStd(Builder, "unix", Opts);
3207     if (Opts.CPlusPlus)
3208       Builder.defineMacro("_GNU_SOURCE");
3209   }
3210 };
3211 } // end anonymous namespace
3212
3213 namespace {
3214 // x86-32 Haiku target
3215 class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3216 public:
3217   HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
3218     SizeType = UnsignedLong;
3219     IntPtrType = SignedLong;
3220     PtrDiffType = SignedLong;
3221     ProcessIDType = SignedLong;
3222     this->UserLabelPrefix = "";
3223     this->TLSSupported = false;
3224   }
3225   void getTargetDefines(const LangOptions &Opts,
3226                         MacroBuilder &Builder) const override {
3227     X86_32TargetInfo::getTargetDefines(Opts, Builder);
3228     Builder.defineMacro("__INTEL__");
3229     Builder.defineMacro("__HAIKU__");
3230   }
3231 };
3232 } // end anonymous namespace
3233
3234 // RTEMS Target
3235 template<typename Target>
3236 class RTEMSTargetInfo : public OSTargetInfo<Target> {
3237 protected:
3238   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3239                     MacroBuilder &Builder) const override {
3240     // RTEMS defines; list based off of gcc output
3241
3242     Builder.defineMacro("__rtems__");
3243     Builder.defineMacro("__ELF__");
3244   }
3245
3246 public:
3247   RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3248     this->UserLabelPrefix = "";
3249
3250     switch (Triple.getArch()) {
3251     default:
3252     case llvm::Triple::x86:
3253       // this->MCountName = ".mcount";
3254       break;
3255     case llvm::Triple::mips:
3256     case llvm::Triple::mipsel:
3257     case llvm::Triple::ppc:
3258     case llvm::Triple::ppc64:
3259     case llvm::Triple::ppc64le:
3260       // this->MCountName = "_mcount";
3261       break;
3262     case llvm::Triple::arm:
3263       // this->MCountName = "__mcount";
3264       break;
3265     }
3266   }
3267 };
3268
3269 namespace {
3270 // x86-32 RTEMS target
3271 class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3272 public:
3273   RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
3274     SizeType = UnsignedLong;
3275     IntPtrType = SignedLong;
3276     PtrDiffType = SignedLong;
3277     this->UserLabelPrefix = "";
3278   }
3279   void getTargetDefines(const LangOptions &Opts,
3280                         MacroBuilder &Builder) const override {
3281     X86_32TargetInfo::getTargetDefines(Opts, Builder);
3282     Builder.defineMacro("__INTEL__");
3283     Builder.defineMacro("__rtems__");
3284   }
3285 };
3286 } // end anonymous namespace
3287
3288 namespace {
3289 // x86-64 generic target
3290 class X86_64TargetInfo : public X86TargetInfo {
3291 public:
3292   X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
3293     const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
3294     LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
3295     LongDoubleWidth = 128;
3296     LongDoubleAlign = 128;
3297     LargeArrayMinWidth = 128;
3298     LargeArrayAlign = 128;
3299     SuitableAlign = 128;
3300     SizeType    = IsX32 ? UnsignedInt      : UnsignedLong;
3301     PtrDiffType = IsX32 ? SignedInt        : SignedLong;
3302     IntPtrType  = IsX32 ? SignedInt        : SignedLong;
3303     IntMaxType  = IsX32 ? SignedLongLong   : SignedLong;
3304     Int64Type   = IsX32 ? SignedLongLong   : SignedLong;
3305     RegParmMax = 6;
3306
3307     DescriptionString = (IsX32)
3308                             ? "e-m:e-" "p:32:32-" "i64:64-f80:128-n8:16:32:64-S128"
3309                             : "e-m:e-"            "i64:64-f80:128-n8:16:32:64-S128";
3310
3311     // Use fpret only for long double.
3312     RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
3313
3314     // Use fp2ret for _Complex long double.
3315     ComplexLongDoubleUsesFP2Ret = true;
3316
3317     // x86-64 has atomics up to 16 bytes.
3318     MaxAtomicPromoteWidth = 128;
3319     MaxAtomicInlineWidth = 128;
3320   }
3321   BuiltinVaListKind getBuiltinVaListKind() const override {
3322     return TargetInfo::X86_64ABIBuiltinVaList;
3323   }
3324
3325   int getEHDataRegisterNumber(unsigned RegNo) const override {
3326     if (RegNo == 0) return 0;
3327     if (RegNo == 1) return 1;
3328     return -1;
3329   }
3330
3331   CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
3332     return (CC == CC_C ||
3333             CC == CC_IntelOclBicc ||
3334             CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
3335   }
3336
3337   CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
3338     return CC_C;
3339   }
3340
3341 };
3342 } // end anonymous namespace
3343
3344 namespace {
3345 // x86-64 Windows target
3346 class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
3347 public:
3348   WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3349       : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
3350     WCharType = UnsignedShort;
3351     LongWidth = LongAlign = 32;
3352     DoubleAlign = LongLongAlign = 64;
3353     IntMaxType = SignedLongLong;
3354     Int64Type = SignedLongLong;
3355     SizeType = UnsignedLongLong;
3356     PtrDiffType = SignedLongLong;
3357     IntPtrType = SignedLongLong;
3358     this->UserLabelPrefix = "";
3359   }
3360   void getTargetDefines(const LangOptions &Opts,
3361                                 MacroBuilder &Builder) const override {
3362     WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
3363     Builder.defineMacro("_WIN64");
3364   }
3365   BuiltinVaListKind getBuiltinVaListKind() const override {
3366     return TargetInfo::CharPtrBuiltinVaList;
3367   }
3368   CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
3369     return (CC == CC_C ||
3370             CC == CC_IntelOclBicc ||
3371             CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3372   }
3373 };
3374 } // end anonymous namespace
3375
3376 namespace {
3377 // x86-64 Windows Visual Studio target
3378 class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
3379 public:
3380   MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
3381       : WindowsX86_64TargetInfo(Triple) {
3382     LongDoubleWidth = LongDoubleAlign = 64;
3383     LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3384   }
3385   void getTargetDefines(const LangOptions &Opts,
3386                         MacroBuilder &Builder) const override {
3387     WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3388     WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
3389     Builder.defineMacro("_M_X64");
3390     Builder.defineMacro("_M_AMD64");
3391   }
3392 };
3393 } // end anonymous namespace
3394
3395 namespace {
3396 // x86-64 MinGW target
3397 class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3398 public:
3399   MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3400       : WindowsX86_64TargetInfo(Triple) {}
3401   void getTargetDefines(const LangOptions &Opts,
3402                         MacroBuilder &Builder) const override {
3403     WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3404     DefineStd(Builder, "WIN64", Opts);
3405     Builder.defineMacro("__MINGW64__");
3406     addMinGWDefines(Opts, Builder);
3407   }
3408 };
3409 } // end anonymous namespace
3410
3411 namespace {
3412 class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3413 public:
3414   DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3415       : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
3416     Int64Type = SignedLongLong;
3417     MaxVectorAlign = 256;
3418     // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3419     llvm::Triple T = llvm::Triple(Triple);
3420     if (T.getOS() == llvm::Triple::IOS)
3421       UseSignedCharForObjCBool = false;
3422     DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
3423   }
3424 };
3425 } // end anonymous namespace
3426
3427 namespace {
3428 class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3429 public:
3430   OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3431       : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
3432     IntMaxType = SignedLongLong;
3433     Int64Type = SignedLongLong;
3434   }
3435 };
3436 } // end anonymous namespace
3437
3438 namespace {
3439 class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3440 public:
3441   BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3442       : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3443     IntMaxType = SignedLongLong;
3444     Int64Type = SignedLongLong;
3445   }
3446 };
3447 }
3448
3449
3450 namespace {
3451 class ARMTargetInfo : public TargetInfo {
3452   // Possible FPU choices.
3453   enum FPUMode {
3454     VFP2FPU = (1 << 0),
3455     VFP3FPU = (1 << 1),
3456     VFP4FPU = (1 << 2),
3457     NeonFPU = (1 << 3),
3458     FPARMV8 = (1 << 4)
3459   };
3460
3461   // Possible HWDiv features.
3462   enum HWDivMode {
3463     HWDivThumb = (1 << 0),
3464     HWDivARM = (1 << 1)
3465   };
3466
3467   static bool FPUModeIsVFP(FPUMode Mode) {
3468     return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
3469   }
3470
3471   static const TargetInfo::GCCRegAlias GCCRegAliases[];
3472   static const char * const GCCRegNames[];
3473
3474   std::string ABI, CPU;
3475
3476   enum {
3477     FP_Default,
3478     FP_VFP,
3479     FP_Neon
3480   } FPMath;
3481
3482   unsigned FPU : 5;
3483
3484   unsigned IsAAPCS : 1;
3485   unsigned IsThumb : 1;
3486   unsigned HWDiv : 2;
3487
3488   // Initialized via features.
3489   unsigned SoftFloat : 1;
3490   unsigned SoftFloatABI : 1;
3491
3492   unsigned CRC : 1;
3493   unsigned Crypto : 1;
3494
3495   static const Builtin::Info BuiltinInfo[];
3496
3497   static bool shouldUseInlineAtomic(const llvm::Triple &T) {
3498     StringRef ArchName = T.getArchName();
3499     if (T.getArch() == llvm::Triple::arm ||
3500         T.getArch() == llvm::Triple::armeb) {
3501       StringRef VersionStr;
3502       if (ArchName.startswith("armv"))
3503         VersionStr = ArchName.substr(4, 1);
3504       else if (ArchName.startswith("armebv"))
3505         VersionStr = ArchName.substr(6, 1);
3506       else
3507         return false;
3508       unsigned Version;
3509       if (VersionStr.getAsInteger(10, Version))
3510         return false;
3511       return Version >= 6;
3512     }
3513     assert(T.getArch() == llvm::Triple::thumb ||
3514            T.getArch() == llvm::Triple::thumbeb);
3515     StringRef VersionStr;
3516     if (ArchName.startswith("thumbv"))
3517       VersionStr = ArchName.substr(6, 1);
3518     else if (ArchName.startswith("thumbebv"))
3519       VersionStr = ArchName.substr(8, 1);
3520     else
3521       return false;
3522     unsigned Version;
3523     if (VersionStr.getAsInteger(10, Version))
3524       return false;
3525     return Version >= 7;
3526   }
3527
3528   void setABIAAPCS() {
3529     IsAAPCS = true;
3530
3531     DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
3532     const llvm::Triple &T = getTriple();
3533
3534     // size_t is unsigned long on Darwin and NetBSD.
3535     if (T.isOSDarwin() || T.getOS() == llvm::Triple::NetBSD)
3536       SizeType = UnsignedLong;
3537     else
3538       SizeType = UnsignedInt;
3539
3540     switch (T.getOS()) {
3541     case llvm::Triple::NetBSD:
3542       WCharType = SignedInt;
3543       break;
3544     case llvm::Triple::Win32:
3545       WCharType = UnsignedShort;
3546       break;
3547     case llvm::Triple::Linux:
3548     default:
3549       // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3550       WCharType = UnsignedInt;
3551       break;
3552     }
3553
3554     UseBitFieldTypeAlignment = true;
3555
3556     ZeroLengthBitfieldBoundary = 0;
3557
3558     if (IsThumb) {
3559       // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3560       // so set preferred for small types to 32.
3561       if (T.isOSBinFormatMachO()) {
3562         DescriptionString = BigEndian ?
3563                               "E-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3564                               "v128:64:128-a:0:32-n32-S64" :
3565                               "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3566                               "v128:64:128-a:0:32-n32-S64";
3567       } else if (T.isOSWindows()) {
3568         // FIXME: this is invalid for WindowsCE
3569         assert(!BigEndian && "Windows on ARM does not support big endian");
3570         DescriptionString = "e"
3571                             "-m:e"
3572                             "-p:32:32"
3573                             "-i1:8:32-i8:8:32-i16:16:32-i64:64"
3574                             "-v128:64:128"
3575                             "-a:0:32"
3576                             "-n32"
3577                             "-S64";
3578       } else {
3579         DescriptionString = BigEndian ?
3580                               "E-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3581                               "v128:64:128-a:0:32-n32-S64" :
3582                               "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3583                               "v128:64:128-a:0:32-n32-S64";
3584       }
3585     } else {
3586       if (T.isOSBinFormatMachO())
3587         DescriptionString = BigEndian ?
3588                               "E-m:o-p:32:32-i64:64-v128:64:128-n32-S64" :
3589                               "e-m:o-p:32:32-i64:64-v128:64:128-n32-S64";
3590       else
3591         DescriptionString = BigEndian ?
3592                               "E-m:e-p:32:32-i64:64-v128:64:128-n32-S64" :
3593                               "e-m:e-p:32:32-i64:64-v128:64:128-n32-S64";
3594     }
3595
3596     // FIXME: Enumerated types are variable width in straight AAPCS.
3597   }
3598
3599   void setABIAPCS() {
3600     const llvm::Triple &T = getTriple();
3601
3602     IsAAPCS = false;
3603
3604     DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
3605
3606     // size_t is unsigned int on FreeBSD.
3607     if (T.getOS() == llvm::Triple::FreeBSD)
3608       SizeType = UnsignedInt;
3609     else
3610       SizeType = UnsignedLong;
3611
3612     // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3613     WCharType = SignedInt;
3614
3615     // Do not respect the alignment of bit-field types when laying out
3616     // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3617     UseBitFieldTypeAlignment = false;
3618
3619     /// gcc forces the alignment to 4 bytes, regardless of the type of the
3620     /// zero length bitfield.  This corresponds to EMPTY_FIELD_BOUNDARY in
3621     /// gcc.
3622     ZeroLengthBitfieldBoundary = 32;
3623
3624     if (IsThumb) {
3625       // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3626       // so set preferred for small types to 32.
3627       if (T.isOSBinFormatMachO())
3628         DescriptionString = BigEndian ?
3629             "E-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3630             "-v64:32:64-v128:32:128-a:0:32-n32-S32" :
3631             "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3632             "-v64:32:64-v128:32:128-a:0:32-n32-S32";
3633       else
3634         DescriptionString = BigEndian ?
3635             "E-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3636             "-v64:32:64-v128:32:128-a:0:32-n32-S32" :
3637             "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3638             "-v64:32:64-v128:32:128-a:0:32-n32-S32";
3639     } else {
3640       if (T.isOSBinFormatMachO())
3641         DescriptionString = BigEndian ?
3642             "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32" :
3643             "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3644       else
3645         DescriptionString = BigEndian ?
3646             "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32" :
3647             "e-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3648     }
3649
3650     // FIXME: Override "preferred align" for double and long long.
3651   }
3652
3653 public:
3654   ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
3655       : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
3656         IsAAPCS(true) {
3657     BigEndian = IsBigEndian;
3658
3659     switch (getTriple().getOS()) {
3660     case llvm::Triple::NetBSD:
3661       PtrDiffType = SignedLong;
3662       break;
3663     default:
3664       PtrDiffType = SignedInt;
3665       break;
3666     }
3667
3668     // {} in inline assembly are neon specifiers, not assembly variant
3669     // specifiers.
3670     NoAsmVariants = true;
3671
3672     // FIXME: Should we just treat this as a feature?
3673     IsThumb = getTriple().getArchName().startswith("thumb");
3674
3675     setABI("aapcs-linux");
3676
3677     // ARM targets default to using the ARM C++ ABI.
3678     TheCXXABI.set(TargetCXXABI::GenericARM);
3679
3680     // ARM has atomics up to 8 bytes
3681     MaxAtomicPromoteWidth = 64;
3682     if (shouldUseInlineAtomic(getTriple()))
3683       MaxAtomicInlineWidth = 64;
3684
3685     // Do force alignment of members that follow zero length bitfields.  If
3686     // the alignment of the zero-length bitfield is greater than the member 
3687     // that follows it, `bar', `bar' will be aligned as the  type of the 
3688     // zero length bitfield.
3689     UseZeroLengthBitfieldAlignment = true;
3690   }
3691   StringRef getABI() const override { return ABI; }
3692   bool setABI(const std::string &Name) override {
3693     ABI = Name;
3694
3695     // The defaults (above) are for AAPCS, check if we need to change them.
3696     //
3697     // FIXME: We need support for -meabi... we could just mangle it into the
3698     // name.
3699     if (Name == "apcs-gnu") {
3700       setABIAPCS();
3701       return true;
3702     }
3703     if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3704       setABIAAPCS();
3705       return true;
3706     }
3707     return false;
3708   }
3709
3710   void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
3711     if (IsAAPCS)
3712       Features["aapcs"] = true;
3713     else
3714       Features["apcs"] = true;
3715
3716     StringRef ArchName = getTriple().getArchName();
3717     if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3718       Features["vfp2"] = true;
3719     else if (CPU == "cortex-a8" || CPU == "cortex-a9" ||
3720              CPU == "cortex-a9-mp") {
3721       Features["vfp3"] = true;
3722       Features["neon"] = true;
3723     }
3724     else if (CPU == "cortex-a5") {
3725       Features["vfp4"] = true;
3726       Features["neon"] = true;
3727     } else if (CPU == "swift" || CPU == "cortex-a7" ||
3728                CPU == "cortex-a12" || CPU == "cortex-a15" ||
3729                CPU == "krait") {
3730       Features["vfp4"] = true;
3731       Features["neon"] = true;
3732       Features["hwdiv"] = true;
3733       Features["hwdiv-arm"] = true;
3734     } else if (CPU == "cyclone") {
3735       Features["v8fp"] = true;
3736       Features["neon"] = true;
3737       Features["hwdiv"] = true;
3738       Features["hwdiv-arm"] = true;
3739     } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
3740       Features["fp-armv8"] = true;
3741       Features["neon"] = true;
3742       Features["hwdiv"] = true;
3743       Features["hwdiv-arm"] = true;
3744       Features["crc"] = true;
3745       Features["crypto"] = true;
3746     } else if (CPU == "cortex-r5" ||
3747                // Enable the hwdiv extension for all v8a AArch32 cores by
3748                // default.
3749                ArchName == "armv8a" || ArchName == "armv8" ||
3750                ArchName == "armebv8a" || ArchName == "armebv8" ||
3751                ArchName == "thumbv8a" || ArchName == "thumbv8" ||
3752                ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
3753       Features["hwdiv"] = true;
3754       Features["hwdiv-arm"] = true;
3755     } else if (CPU == "cortex-m3" || CPU == "cortex-m4") {
3756       Features["hwdiv"] = true;
3757     }
3758   }
3759
3760   bool handleTargetFeatures(std::vector<std::string> &Features,
3761                             DiagnosticsEngine &Diags) override {
3762     FPU = 0;
3763     CRC = 0;
3764     Crypto = 0;
3765     SoftFloat = SoftFloatABI = false;
3766     HWDiv = 0;
3767     for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3768       if (Features[i] == "+soft-float")
3769         SoftFloat = true;
3770       else if (Features[i] == "+soft-float-abi")
3771         SoftFloatABI = true;
3772       else if (Features[i] == "+vfp2")
3773         FPU |= VFP2FPU;
3774       else if (Features[i] == "+vfp3")
3775         FPU |= VFP3FPU;
3776       else if (Features[i] == "+vfp4")
3777         FPU |= VFP4FPU;
3778       else if (Features[i] == "+fp-armv8")
3779         FPU |= FPARMV8;
3780       else if (Features[i] == "+neon")
3781         FPU |= NeonFPU;
3782       else if (Features[i] == "+hwdiv")
3783         HWDiv |= HWDivThumb;
3784       else if (Features[i] == "+hwdiv-arm")
3785         HWDiv |= HWDivARM;
3786       else if (Features[i] == "+crc")
3787         CRC = 1;
3788       else if (Features[i] == "+crypto")
3789         Crypto = 1;
3790     }
3791
3792     if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
3793       Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
3794       return false;
3795     }
3796
3797     if (FPMath == FP_Neon)
3798       Features.push_back("+neonfp");
3799     else if (FPMath == FP_VFP)
3800       Features.push_back("-neonfp");
3801
3802     // Remove front-end specific options which the backend handles differently.
3803     std::vector<std::string>::iterator it;
3804     it = std::find(Features.begin(), Features.end(), "+soft-float");
3805     if (it != Features.end())
3806       Features.erase(it);
3807     it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
3808     if (it != Features.end())
3809       Features.erase(it);
3810     return true;
3811   }
3812
3813   bool hasFeature(StringRef Feature) const override {
3814     return llvm::StringSwitch<bool>(Feature)
3815         .Case("arm", true)
3816         .Case("softfloat", SoftFloat)
3817         .Case("thumb", IsThumb)
3818         .Case("neon", (FPU & NeonFPU) && !SoftFloat)
3819         .Case("hwdiv", HWDiv & HWDivThumb)
3820         .Case("hwdiv-arm", HWDiv & HWDivARM)
3821         .Default(false);
3822   }
3823   // FIXME: Should we actually have some table instead of these switches?
3824   static const char *getCPUDefineSuffix(StringRef Name) {
3825     return llvm::StringSwitch<const char*>(Name)
3826       .Cases("arm8", "arm810", "4")
3827       .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
3828       .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3829       .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3830       .Case("ep9312", "4T")
3831       .Cases("arm10tdmi", "arm1020t", "5T")
3832       .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3833       .Case("arm926ej-s", "5TEJ")
3834       .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3835       .Cases("xscale", "iwmmxt", "5TE")
3836       .Case("arm1136j-s", "6J")
3837       .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
3838       .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
3839       .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
3840       .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "7A")
3841       .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "7A")
3842       .Cases("cortex-r4", "cortex-r5", "7R")
3843       .Case("swift", "7S")
3844       .Case("cyclone", "8A")
3845       .Case("cortex-m3", "7M")
3846       .Case("cortex-m4", "7EM")
3847       .Case("cortex-m0", "6M")
3848       .Cases("cortex-a53", "cortex-a57", "8A")
3849       .Default(nullptr);
3850   }
3851   static const char *getCPUProfile(StringRef Name) {
3852     return llvm::StringSwitch<const char*>(Name)
3853       .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
3854       .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "A")
3855       .Cases("cortex-a53", "cortex-a57", "A")
3856       .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
3857       .Cases("cortex-r4", "cortex-r5", "R")
3858       .Default("");
3859   }
3860   bool setCPU(const std::string &Name) override {
3861     if (!getCPUDefineSuffix(Name))
3862       return false;
3863
3864     // Cortex M does not support 8 byte atomics, while general Thumb2 does.
3865     StringRef Profile = getCPUProfile(Name);
3866     if (Profile == "M" && MaxAtomicInlineWidth) {
3867       MaxAtomicPromoteWidth = 32;
3868       MaxAtomicInlineWidth = 32;
3869     }
3870
3871     CPU = Name;
3872     return true;
3873   }
3874   bool setFPMath(StringRef Name) override;
3875   bool supportsThumb(StringRef ArchName, StringRef CPUArch,
3876                      unsigned CPUArchVer) const {
3877     return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
3878            (CPUArch.find('M') != StringRef::npos);
3879   }
3880   bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
3881                       unsigned CPUArchVer) const {
3882     // We check both CPUArchVer and ArchName because when only triple is
3883     // specified, the default CPU is arm1136j-s.
3884     return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
3885            ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
3886   }
3887   void getTargetDefines(const LangOptions &Opts,
3888                         MacroBuilder &Builder) const override {
3889     // Target identification.
3890     Builder.defineMacro("__arm");
3891     Builder.defineMacro("__arm__");
3892
3893     // Target properties.
3894     Builder.defineMacro("__REGISTER_PREFIX__", "");
3895
3896     StringRef CPUArch = getCPUDefineSuffix(CPU);
3897     unsigned int CPUArchVer;
3898     if(CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer)) {
3899       llvm_unreachable("Invalid char for architecture version number");
3900     }
3901     Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
3902
3903     // ACLE 6.4.1 ARM/Thumb instruction set architecture
3904     StringRef CPUProfile = getCPUProfile(CPU);
3905     StringRef ArchName = getTriple().getArchName();
3906
3907     // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
3908     Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
3909
3910     // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA.  It
3911     // is not defined for the M-profile.
3912     // NOTE that the deffault profile is assumed to be 'A'
3913     if (CPUProfile.empty() || CPUProfile != "M")
3914       Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
3915
3916     // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
3917     // Thumb ISA (including v6-M).  It is set to 2 if the core supports the
3918     // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
3919     if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
3920       Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
3921     else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
3922       Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
3923
3924     // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
3925     // instruction set such as ARM or Thumb.
3926     Builder.defineMacro("__ARM_32BIT_STATE", "1");
3927
3928     // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
3929
3930     // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
3931     if (!CPUProfile.empty())
3932       Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
3933
3934     // ACLE predefines.
3935     Builder.defineMacro("__ARM_ACLE", "200");
3936
3937     // Subtarget options.
3938
3939     // FIXME: It's more complicated than this and we don't really support
3940     // interworking.
3941     // Windows on ARM does not "support" interworking
3942     if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
3943       Builder.defineMacro("__THUMB_INTERWORK__");
3944
3945     if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
3946       // Embedded targets on Darwin follow AAPCS, but not EABI.
3947       // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
3948       if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
3949         Builder.defineMacro("__ARM_EABI__");
3950       Builder.defineMacro("__ARM_PCS", "1");
3951
3952       if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
3953         Builder.defineMacro("__ARM_PCS_VFP", "1");
3954     }
3955
3956     if (SoftFloat)
3957       Builder.defineMacro("__SOFTFP__");
3958
3959     if (CPU == "xscale")
3960       Builder.defineMacro("__XSCALE__");
3961
3962     if (IsThumb) {
3963       Builder.defineMacro("__THUMBEL__");
3964       Builder.defineMacro("__thumb__");
3965       if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
3966         Builder.defineMacro("__thumb2__");
3967     }
3968     if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
3969       Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
3970
3971     // Note, this is always on in gcc, even though it doesn't make sense.
3972     Builder.defineMacro("__APCS_32__");
3973
3974     if (FPUModeIsVFP((FPUMode) FPU)) {
3975       Builder.defineMacro("__VFP_FP__");
3976       if (FPU & VFP2FPU)
3977         Builder.defineMacro("__ARM_VFPV2__");
3978       if (FPU & VFP3FPU)
3979         Builder.defineMacro("__ARM_VFPV3__");
3980       if (FPU & VFP4FPU)
3981         Builder.defineMacro("__ARM_VFPV4__");
3982     }
3983
3984     // This only gets set when Neon instructions are actually available, unlike
3985     // the VFP define, hence the soft float and arch check. This is subtly
3986     // different from gcc, we follow the intent which was that it should be set
3987     // when Neon instructions are actually available.
3988     if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
3989       Builder.defineMacro("__ARM_NEON");
3990       Builder.defineMacro("__ARM_NEON__");
3991     }
3992
3993     Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
3994                         Opts.ShortWChar ? "2" : "4");
3995
3996     Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
3997                         Opts.ShortEnums ? "1" : "4");
3998
3999     if (CRC)
4000       Builder.defineMacro("__ARM_FEATURE_CRC32");
4001
4002     if (Crypto)
4003       Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4004
4005     if (CPUArchVer >= 6 && CPUArch != "6M") {
4006       Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4007       Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4008       Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4009       Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4010     }
4011   }
4012   void getTargetBuiltins(const Builtin::Info *&Records,
4013                          unsigned &NumRecords) const override {
4014     Records = BuiltinInfo;
4015     NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
4016   }
4017   bool isCLZForZeroUndef() const override { return false; }
4018   BuiltinVaListKind getBuiltinVaListKind() const override {
4019     return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
4020   }
4021   void getGCCRegNames(const char * const *&Names,
4022                       unsigned &NumNames) const override;
4023   void getGCCRegAliases(const GCCRegAlias *&Aliases,
4024                         unsigned &NumAliases) const override;
4025   bool validateAsmConstraint(const char *&Name,
4026                              TargetInfo::ConstraintInfo &Info) const override {
4027     switch (*Name) {
4028     default: break;
4029     case 'l': // r0-r7
4030     case 'h': // r8-r15
4031     case 'w': // VFP Floating point register single precision
4032     case 'P': // VFP Floating point register double precision
4033       Info.setAllowsRegister();
4034       return true;
4035     case 'Q': // A memory address that is a single base register.
4036       Info.setAllowsMemory();
4037       return true;
4038     case 'U': // a memory reference...
4039       switch (Name[1]) {
4040       case 'q': // ...ARMV4 ldrsb
4041       case 'v': // ...VFP load/store (reg+constant offset)
4042       case 'y': // ...iWMMXt load/store
4043       case 't': // address valid for load/store opaque types wider
4044                 // than 128-bits
4045       case 'n': // valid address for Neon doubleword vector load/store
4046       case 'm': // valid address for Neon element and structure load/store
4047       case 's': // valid address for non-offset loads/stores of quad-word
4048                 // values in four ARM registers
4049         Info.setAllowsMemory();
4050         Name++;
4051         return true;
4052       }
4053     }
4054     return false;
4055   }
4056   std::string convertConstraint(const char *&Constraint) const override {
4057     std::string R;
4058     switch (*Constraint) {
4059     case 'U':   // Two-character constraint; add "^" hint for later parsing.
4060       R = std::string("^") + std::string(Constraint, 2);
4061       Constraint++;
4062       break;
4063     case 'p': // 'p' should be translated to 'r' by default.
4064       R = std::string("r");
4065       break;
4066     default:
4067       return std::string(1, *Constraint);
4068     }
4069     return R;
4070   }
4071   bool validateConstraintModifier(StringRef Constraint, const char Modifier,
4072                                   unsigned Size) const override {
4073     bool isOutput = (Constraint[0] == '=');
4074     bool isInOut = (Constraint[0] == '+');
4075
4076     // Strip off constraint modifiers.
4077     while (Constraint[0] == '=' ||
4078            Constraint[0] == '+' ||
4079            Constraint[0] == '&')
4080       Constraint = Constraint.substr(1);
4081
4082     switch (Constraint[0]) {
4083     default: break;
4084     case 'r': {
4085       switch (Modifier) {
4086       default:
4087         return (isInOut || isOutput || Size <= 64);
4088       case 'q':
4089         // A register of size 32 cannot fit a vector type.
4090         return false;
4091       }
4092     }
4093     }
4094
4095     return true;
4096   }
4097   const char *getClobbers() const override {
4098     // FIXME: Is this really right?
4099     return "";
4100   }
4101
4102   CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4103     return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4104   }
4105
4106   int getEHDataRegisterNumber(unsigned RegNo) const override {
4107     if (RegNo == 0) return 0;
4108     if (RegNo == 1) return 1;
4109     return -1;
4110   }
4111 };
4112
4113 bool ARMTargetInfo::setFPMath(StringRef Name) {
4114   if (Name == "neon") {
4115     FPMath = FP_Neon;
4116     return true;
4117   } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4118              Name == "vfp4") {
4119     FPMath = FP_VFP;
4120     return true;
4121   }
4122   return false;
4123 }
4124
4125 const char * const ARMTargetInfo::GCCRegNames[] = {
4126   // Integer registers
4127   "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4128   "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4129
4130   // Float registers
4131   "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4132   "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4133   "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
4134   "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4135
4136   // Double registers
4137   "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4138   "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
4139   "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4140   "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4141
4142   // Quad registers
4143   "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4144   "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
4145 };
4146
4147 void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
4148                                    unsigned &NumNames) const {
4149   Names = GCCRegNames;
4150   NumNames = llvm::array_lengthof(GCCRegNames);
4151 }
4152
4153 const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
4154   { { "a1" }, "r0" },
4155   { { "a2" }, "r1" },
4156   { { "a3" }, "r2" },
4157   { { "a4" }, "r3" },
4158   { { "v1" }, "r4" },
4159   { { "v2" }, "r5" },
4160   { { "v3" }, "r6" },
4161   { { "v4" }, "r7" },
4162   { { "v5" }, "r8" },
4163   { { "v6", "rfp" }, "r9" },
4164   { { "sl" }, "r10" },
4165   { { "fp" }, "r11" },
4166   { { "ip" }, "r12" },
4167   { { "r13" }, "sp" },
4168   { { "r14" }, "lr" },
4169   { { "r15" }, "pc" },
4170   // The S, D and Q registers overlap, but aren't really aliases; we
4171   // don't want to substitute one of these for a different-sized one.
4172 };
4173
4174 void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4175                                        unsigned &NumAliases) const {
4176   Aliases = GCCRegAliases;
4177   NumAliases = llvm::array_lengthof(GCCRegAliases);
4178 }
4179
4180 const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
4181 #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4182 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4183                                               ALL_LANGUAGES },
4184 #include "clang/Basic/BuiltinsNEON.def"
4185
4186 #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4187 #define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
4188 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4189                                               ALL_LANGUAGES },
4190 #include "clang/Basic/BuiltinsARM.def"
4191 };
4192
4193 class ARMleTargetInfo : public ARMTargetInfo {
4194 public:
4195   ARMleTargetInfo(const llvm::Triple &Triple)
4196     : ARMTargetInfo(Triple, false) { }
4197   virtual void getTargetDefines(const LangOptions &Opts,
4198                                 MacroBuilder &Builder) const {
4199     Builder.defineMacro("__ARMEL__");
4200     ARMTargetInfo::getTargetDefines(Opts, Builder);
4201   }
4202 };
4203
4204 class ARMbeTargetInfo : public ARMTargetInfo {
4205 public:
4206   ARMbeTargetInfo(const llvm::Triple &Triple)
4207     : ARMTargetInfo(Triple, true) { }
4208   virtual void getTargetDefines(const LangOptions &Opts,
4209                                 MacroBuilder &Builder) const {
4210     Builder.defineMacro("__ARMEB__");
4211     Builder.defineMacro("__ARM_BIG_ENDIAN");
4212     ARMTargetInfo::getTargetDefines(Opts, Builder);
4213   }
4214 };
4215 } // end anonymous namespace.
4216
4217 namespace {
4218 class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4219   const llvm::Triple Triple;
4220 public:
4221   WindowsARMTargetInfo(const llvm::Triple &Triple)
4222     : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4223     TLSSupported = false;
4224     WCharType = UnsignedShort;
4225     SizeType = UnsignedInt;
4226     UserLabelPrefix = "";
4227   }
4228   void getVisualStudioDefines(const LangOptions &Opts,
4229                               MacroBuilder &Builder) const {
4230     WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4231
4232     // FIXME: this is invalid for WindowsCE
4233     Builder.defineMacro("_M_ARM_NT", "1");
4234     Builder.defineMacro("_M_ARMT", "_M_ARM");
4235     Builder.defineMacro("_M_THUMB", "_M_ARM");
4236
4237     assert((Triple.getArch() == llvm::Triple::arm ||
4238             Triple.getArch() == llvm::Triple::thumb) &&
4239            "invalid architecture for Windows ARM target info");
4240     unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4241     Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4242
4243     // TODO map the complete set of values
4244     // 31: VFPv3 40: VFPv4
4245     Builder.defineMacro("_M_ARM_FP", "31");
4246   }
4247   BuiltinVaListKind getBuiltinVaListKind() const override {
4248     return TargetInfo::CharPtrBuiltinVaList;
4249   }
4250 };
4251
4252 // Windows ARM + Itanium C++ ABI Target
4253 class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4254 public:
4255   ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4256     : WindowsARMTargetInfo(Triple) {
4257     TheCXXABI.set(TargetCXXABI::GenericARM);
4258   }
4259
4260   void getTargetDefines(const LangOptions &Opts,
4261                         MacroBuilder &Builder) const override {
4262     WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4263
4264     if (Opts.MSVCCompat)
4265       WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4266   }
4267 };
4268
4269 // Windows ARM, MS (C++) ABI
4270 class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4271 public:
4272   MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4273     : WindowsARMTargetInfo(Triple) {
4274     TheCXXABI.set(TargetCXXABI::Microsoft);
4275   }
4276
4277   void getTargetDefines(const LangOptions &Opts,
4278                         MacroBuilder &Builder) const override {
4279     WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4280     WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4281   }
4282 };
4283 }
4284
4285
4286 namespace {
4287 class DarwinARMTargetInfo :
4288   public DarwinTargetInfo<ARMleTargetInfo> {
4289 protected:
4290   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4291                     MacroBuilder &Builder) const override {
4292     getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
4293   }
4294
4295 public:
4296   DarwinARMTargetInfo(const llvm::Triple &Triple)
4297       : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
4298     HasAlignMac68kSupport = true;
4299     // iOS always has 64-bit atomic instructions.
4300     // FIXME: This should be based off of the target features in ARMleTargetInfo.
4301     MaxAtomicInlineWidth = 64;
4302
4303     // Darwin on iOS uses a variant of the ARM C++ ABI.
4304     TheCXXABI.set(TargetCXXABI::iOS);
4305   }
4306 };
4307 } // end anonymous namespace.
4308
4309
4310 namespace {
4311 class AArch64TargetInfo : public TargetInfo {
4312   virtual void setDescriptionString() = 0;
4313   static const TargetInfo::GCCRegAlias GCCRegAliases[];
4314   static const char *const GCCRegNames[];
4315
4316   enum FPUModeEnum {
4317     FPUMode,
4318     NeonMode
4319   };
4320
4321   unsigned FPU;
4322   unsigned CRC;
4323   unsigned Crypto;
4324
4325   static const Builtin::Info BuiltinInfo[];
4326
4327   std::string ABI;
4328
4329 public:
4330   AArch64TargetInfo(const llvm::Triple &Triple)
4331       : TargetInfo(Triple), ABI("aapcs") {
4332
4333     if (getTriple().getOS() == llvm::Triple::NetBSD) {
4334       WCharType = SignedInt;
4335
4336       // NetBSD apparently prefers consistency across ARM targets to consistency
4337       // across 64-bit targets.
4338       Int64Type = SignedLongLong;
4339       IntMaxType = SignedLongLong;
4340     } else {
4341       WCharType = UnsignedInt;
4342       Int64Type = SignedLong;
4343       IntMaxType = SignedLong;
4344     }
4345
4346     LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
4347     MaxVectorAlign = 128;
4348     RegParmMax = 8;
4349     MaxAtomicInlineWidth = 128;
4350     MaxAtomicPromoteWidth = 128;
4351
4352     LongDoubleWidth = LongDoubleAlign = 128;
4353     LongDoubleFormat = &llvm::APFloat::IEEEquad;
4354
4355     // {} in inline assembly are neon specifiers, not assembly variant
4356     // specifiers.
4357     NoAsmVariants = true;
4358
4359     // AArch64 targets default to using the ARM C++ ABI.
4360     TheCXXABI.set(TargetCXXABI::GenericAArch64);
4361   }
4362
4363   StringRef getABI() const override { return ABI; }
4364   virtual bool setABI(const std::string &Name) {
4365     if (Name != "aapcs" && Name != "darwinpcs")
4366       return false;
4367
4368     ABI = Name;
4369     return true;
4370   }
4371
4372   virtual bool setCPU(const std::string &Name) {
4373     bool CPUKnown = llvm::StringSwitch<bool>(Name)
4374                         .Case("generic", true)
4375                         .Cases("cortex-a53", "cortex-a57", true)
4376                         .Case("cyclone", true)
4377                         .Default(false);
4378     return CPUKnown;
4379   }
4380
4381   virtual void getTargetDefines(const LangOptions &Opts,
4382                                 MacroBuilder &Builder) const {
4383     // Target identification.
4384     Builder.defineMacro("__aarch64__");
4385
4386     // Target properties.
4387     Builder.defineMacro("_LP64");
4388     Builder.defineMacro("__LP64__");
4389
4390     // ACLE predefines. Many can only have one possible value on v8 AArch64.
4391     Builder.defineMacro("__ARM_ACLE", "200");
4392     Builder.defineMacro("__ARM_ARCH", "8");
4393     Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4394
4395     Builder.defineMacro("__ARM_64BIT_STATE");
4396     Builder.defineMacro("__ARM_PCS_AAPCS64");
4397     Builder.defineMacro("__ARM_ARCH_ISA_A64");
4398
4399     Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4400     Builder.defineMacro("__ARM_FEATURE_CLZ");
4401     Builder.defineMacro("__ARM_FEATURE_FMA");
4402     Builder.defineMacro("__ARM_FEATURE_DIV");
4403
4404     Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4405
4406     // 0xe implies support for half, single and double precision operations.
4407     Builder.defineMacro("__ARM_FP", "0xe");
4408
4409     // PCS specifies this for SysV variants, which is all we support. Other ABIs
4410     // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4411     Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4412
4413     if (Opts.FastMath || Opts.FiniteMathOnly)
4414       Builder.defineMacro("__ARM_FP_FAST");
4415
4416     if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
4417       Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4418
4419     Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4420
4421     Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4422                         Opts.ShortEnums ? "1" : "4");
4423
4424     if (FPU == NeonMode) {
4425       Builder.defineMacro("__ARM_NEON");
4426       // 64-bit NEON supports half, single and double precision operations.
4427       Builder.defineMacro("__ARM_NEON_FP", "0xe");
4428     }
4429
4430     if (CRC)
4431       Builder.defineMacro("__ARM_FEATURE_CRC32");
4432
4433     if (Crypto)
4434       Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4435   }
4436
4437   virtual void getTargetBuiltins(const Builtin::Info *&Records,
4438                                  unsigned &NumRecords) const {
4439     Records = BuiltinInfo;
4440     NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
4441   }
4442
4443   virtual bool hasFeature(StringRef Feature) const {
4444     return Feature == "aarch64" ||
4445       Feature == "arm64" ||
4446       (Feature == "neon" && FPU == NeonMode);
4447   }
4448
4449   bool handleTargetFeatures(std::vector<std::string> &Features,
4450                             DiagnosticsEngine &Diags) override {
4451     FPU = FPUMode;
4452     CRC = 0;
4453     Crypto = 0;
4454     for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4455       if (Features[i] == "+neon")
4456         FPU = NeonMode;
4457       if (Features[i] == "+crc")
4458         CRC = 1;
4459       if (Features[i] == "+crypto")
4460         Crypto = 1;
4461     }
4462
4463     setDescriptionString();
4464
4465     return true;
4466   }
4467
4468   virtual bool isCLZForZeroUndef() const { return false; }
4469
4470   virtual BuiltinVaListKind getBuiltinVaListKind() const {
4471     return TargetInfo::AArch64ABIBuiltinVaList;
4472   }
4473
4474   virtual void getGCCRegNames(const char *const *&Names,
4475                               unsigned &NumNames) const;
4476   virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4477                                 unsigned &NumAliases) const;
4478
4479   virtual bool validateAsmConstraint(const char *&Name,
4480                                      TargetInfo::ConstraintInfo &Info) const {
4481     switch (*Name) {
4482     default:
4483       return false;
4484     case 'w': // Floating point and SIMD registers (V0-V31)
4485       Info.setAllowsRegister();
4486       return true;
4487     case 'I': // Constant that can be used with an ADD instruction
4488     case 'J': // Constant that can be used with a SUB instruction
4489     case 'K': // Constant that can be used with a 32-bit logical instruction
4490     case 'L': // Constant that can be used with a 64-bit logical instruction
4491     case 'M': // Constant that can be used as a 32-bit MOV immediate
4492     case 'N': // Constant that can be used as a 64-bit MOV immediate
4493     case 'Y': // Floating point constant zero
4494     case 'Z': // Integer constant zero
4495       return true;
4496     case 'Q': // A memory reference with base register and no offset
4497       Info.setAllowsMemory();
4498       return true;
4499     case 'S': // A symbolic address
4500       Info.setAllowsRegister();
4501       return true;
4502     case 'U':
4503       // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
4504       // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
4505       // Usa: An absolute symbolic address
4506       // Ush: The high part (bits 32:12) of a pc-relative symbolic address
4507       llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
4508     case 'z': // Zero register, wzr or xzr
4509       Info.setAllowsRegister();
4510       return true;
4511     case 'x': // Floating point and SIMD registers (V0-V15)
4512       Info.setAllowsRegister();
4513       return true;
4514     }
4515     return false;
4516   }
4517
4518   virtual const char *getClobbers() const { return ""; }
4519
4520   int getEHDataRegisterNumber(unsigned RegNo) const {
4521     if (RegNo == 0)
4522       return 0;
4523     if (RegNo == 1)
4524       return 1;
4525     return -1;
4526   }
4527 };
4528
4529 const char *const AArch64TargetInfo::GCCRegNames[] = {
4530   // 32-bit Integer registers
4531   "w0",  "w1",  "w2",  "w3",  "w4",  "w5",  "w6",  "w7",  "w8",  "w9",  "w10",
4532   "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4533   "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4534
4535   // 64-bit Integer registers
4536   "x0",  "x1",  "x2",  "x3",  "x4",  "x5",  "x6",  "x7",  "x8",  "x9",  "x10",
4537   "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4538   "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp",  "lr",  "sp",
4539
4540   // 32-bit floating point regsisters
4541   "s0",  "s1",  "s2",  "s3",  "s4",  "s5",  "s6",  "s7",  "s8",  "s9",  "s10",
4542   "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4543   "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4544
4545   // 64-bit floating point regsisters
4546   "d0",  "d1",  "d2",  "d3",  "d4",  "d5",  "d6",  "d7",  "d8",  "d9",  "d10",
4547   "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4548   "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4549
4550   // Vector registers
4551   "v0",  "v1",  "v2",  "v3",  "v4",  "v5",  "v6",  "v7",  "v8",  "v9",  "v10",
4552   "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4553   "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4554 };
4555
4556 void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
4557                                      unsigned &NumNames) const {
4558   Names = GCCRegNames;
4559   NumNames = llvm::array_lengthof(GCCRegNames);
4560 }
4561
4562 const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
4563   { { "w31" }, "wsp" },
4564   { { "x29" }, "fp" },
4565   { { "x30" }, "lr" },
4566   { { "x31" }, "sp" },
4567   // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4568   // don't want to substitute one of these for a different-sized one.
4569 };
4570
4571 void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4572                                        unsigned &NumAliases) const {
4573   Aliases = GCCRegAliases;
4574   NumAliases = llvm::array_lengthof(GCCRegAliases);
4575 }
4576
4577 const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
4578 #define BUILTIN(ID, TYPE, ATTRS)                                               \
4579   { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4580 #include "clang/Basic/BuiltinsNEON.def"
4581
4582 #define BUILTIN(ID, TYPE, ATTRS)                                               \
4583   { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4584 #include "clang/Basic/BuiltinsAArch64.def"
4585 };
4586
4587 class AArch64leTargetInfo : public AArch64TargetInfo {
4588   void setDescriptionString() override {
4589     if (getTriple().isOSBinFormatMachO())
4590       DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4591     else
4592       DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4593   }
4594
4595 public:
4596   AArch64leTargetInfo(const llvm::Triple &Triple)
4597     : AArch64TargetInfo(Triple) {
4598     BigEndian = false;
4599     }
4600   void getTargetDefines(const LangOptions &Opts,
4601                         MacroBuilder &Builder) const override {
4602     Builder.defineMacro("__AARCH64EL__");
4603     AArch64TargetInfo::getTargetDefines(Opts, Builder);
4604   }
4605 };
4606
4607 class AArch64beTargetInfo : public AArch64TargetInfo {
4608   void setDescriptionString() override {
4609     assert(!getTriple().isOSBinFormatMachO());
4610     DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
4611   }
4612
4613 public:
4614   AArch64beTargetInfo(const llvm::Triple &Triple)
4615     : AArch64TargetInfo(Triple) { }
4616   void getTargetDefines(const LangOptions &Opts,
4617                         MacroBuilder &Builder) const override {
4618     Builder.defineMacro("__AARCH64EB__");
4619     Builder.defineMacro("__AARCH_BIG_ENDIAN");
4620     Builder.defineMacro("__ARM_BIG_ENDIAN");
4621     AArch64TargetInfo::getTargetDefines(Opts, Builder);
4622   }
4623 };
4624 } // end anonymous namespace.
4625
4626 namespace {
4627 class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
4628 protected:
4629   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4630                     MacroBuilder &Builder) const override {
4631     Builder.defineMacro("__AARCH64_SIMD__");
4632     Builder.defineMacro("__ARM64_ARCH_8__");
4633     Builder.defineMacro("__ARM_NEON__");
4634     Builder.defineMacro("__LITTLE_ENDIAN__");
4635     Builder.defineMacro("__REGISTER_PREFIX__", "");
4636     Builder.defineMacro("__arm64", "1");
4637     Builder.defineMacro("__arm64__", "1");
4638
4639     getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
4640   }
4641
4642 public:
4643   DarwinAArch64TargetInfo(const llvm::Triple &Triple)
4644       : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
4645     Int64Type = SignedLongLong;
4646     WCharType = SignedInt;
4647     UseSignedCharForObjCBool = false;
4648
4649     LongDoubleWidth = LongDoubleAlign = 64;
4650     LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4651
4652     TheCXXABI.set(TargetCXXABI::iOS64);
4653   }
4654
4655   virtual BuiltinVaListKind getBuiltinVaListKind() const {
4656     return TargetInfo::CharPtrBuiltinVaList;
4657   }
4658 };
4659 } // end anonymous namespace
4660
4661 namespace {
4662 // Hexagon abstract base class
4663 class HexagonTargetInfo : public TargetInfo {
4664   static const Builtin::Info BuiltinInfo[];
4665   static const char * const GCCRegNames[];
4666   static const TargetInfo::GCCRegAlias GCCRegAliases[];
4667   std::string CPU;
4668 public:
4669   HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
4670     BigEndian = false;
4671     DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
4672
4673     // {} in inline assembly are packet specifiers, not assembly variant
4674     // specifiers.
4675     NoAsmVariants = true;
4676   }
4677
4678   void getTargetBuiltins(const Builtin::Info *&Records,
4679                          unsigned &NumRecords) const override {
4680     Records = BuiltinInfo;
4681     NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
4682   }
4683
4684   bool validateAsmConstraint(const char *&Name,
4685                              TargetInfo::ConstraintInfo &Info) const override {
4686     return true;
4687   }
4688
4689   void getTargetDefines(const LangOptions &Opts,
4690                         MacroBuilder &Builder) const override;
4691
4692   bool hasFeature(StringRef Feature) const override {
4693     return Feature == "hexagon";
4694   }
4695
4696   BuiltinVaListKind getBuiltinVaListKind() const override {
4697     return TargetInfo::CharPtrBuiltinVaList;
4698   }
4699   void getGCCRegNames(const char * const *&Names,
4700                       unsigned &NumNames) const override;
4701   void getGCCRegAliases(const GCCRegAlias *&Aliases,
4702                         unsigned &NumAliases) const override;
4703   const char *getClobbers() const override {
4704     return "";
4705   }
4706
4707   static const char *getHexagonCPUSuffix(StringRef Name) {
4708     return llvm::StringSwitch<const char*>(Name)
4709       .Case("hexagonv4", "4")
4710       .Case("hexagonv5", "5")
4711       .Default(nullptr);
4712   }
4713
4714   bool setCPU(const std::string &Name) override {
4715     if (!getHexagonCPUSuffix(Name))
4716       return false;
4717
4718     CPU = Name;
4719     return true;
4720   }
4721 };
4722
4723 void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4724                                 MacroBuilder &Builder) const {
4725   Builder.defineMacro("qdsp6");
4726   Builder.defineMacro("__qdsp6", "1");
4727   Builder.defineMacro("__qdsp6__", "1");
4728
4729   Builder.defineMacro("hexagon");
4730   Builder.defineMacro("__hexagon", "1");
4731   Builder.defineMacro("__hexagon__", "1");
4732
4733   if(CPU == "hexagonv1") {
4734     Builder.defineMacro("__HEXAGON_V1__");
4735     Builder.defineMacro("__HEXAGON_ARCH__", "1");
4736     if(Opts.HexagonQdsp6Compat) {
4737       Builder.defineMacro("__QDSP6_V1__");
4738       Builder.defineMacro("__QDSP6_ARCH__", "1");
4739     }
4740   }
4741   else if(CPU == "hexagonv2") {
4742     Builder.defineMacro("__HEXAGON_V2__");
4743     Builder.defineMacro("__HEXAGON_ARCH__", "2");
4744     if(Opts.HexagonQdsp6Compat) {
4745       Builder.defineMacro("__QDSP6_V2__");
4746       Builder.defineMacro("__QDSP6_ARCH__", "2");
4747     }
4748   }
4749   else if(CPU == "hexagonv3") {
4750     Builder.defineMacro("__HEXAGON_V3__");
4751     Builder.defineMacro("__HEXAGON_ARCH__", "3");
4752     if(Opts.HexagonQdsp6Compat) {
4753       Builder.defineMacro("__QDSP6_V3__");
4754       Builder.defineMacro("__QDSP6_ARCH__", "3");
4755     }
4756   }
4757   else if(CPU == "hexagonv4") {
4758     Builder.defineMacro("__HEXAGON_V4__");
4759     Builder.defineMacro("__HEXAGON_ARCH__", "4");
4760     if(Opts.HexagonQdsp6Compat) {
4761       Builder.defineMacro("__QDSP6_V4__");
4762       Builder.defineMacro("__QDSP6_ARCH__", "4");
4763     }
4764   }
4765   else if(CPU == "hexagonv5") {
4766     Builder.defineMacro("__HEXAGON_V5__");
4767     Builder.defineMacro("__HEXAGON_ARCH__", "5");
4768     if(Opts.HexagonQdsp6Compat) {
4769       Builder.defineMacro("__QDSP6_V5__");
4770       Builder.defineMacro("__QDSP6_ARCH__", "5");
4771     }
4772   }
4773 }
4774
4775 const char * const HexagonTargetInfo::GCCRegNames[] = {
4776   "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4777   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4778   "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4779   "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4780   "p0", "p1", "p2", "p3",
4781   "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4782 };
4783
4784 void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4785                                    unsigned &NumNames) const {
4786   Names = GCCRegNames;
4787   NumNames = llvm::array_lengthof(GCCRegNames);
4788 }
4789
4790
4791 const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4792   { { "sp" }, "r29" },
4793   { { "fp" }, "r30" },
4794   { { "lr" }, "r31" },
4795  };
4796
4797 void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4798                                      unsigned &NumAliases) const {
4799   Aliases = GCCRegAliases;
4800   NumAliases = llvm::array_lengthof(GCCRegAliases);
4801 }
4802
4803
4804 const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4805 #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4806 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4807                                               ALL_LANGUAGES },
4808 #include "clang/Basic/BuiltinsHexagon.def"
4809 };
4810 }
4811
4812
4813 namespace {
4814 // Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
4815 class SparcTargetInfo : public TargetInfo {
4816   static const TargetInfo::GCCRegAlias GCCRegAliases[];
4817   static const char * const GCCRegNames[];
4818   bool SoftFloat;
4819 public:
4820   SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
4821
4822   bool handleTargetFeatures(std::vector<std::string> &Features,
4823                             DiagnosticsEngine &Diags) override {
4824     SoftFloat = false;
4825     for (unsigned i = 0, e = Features.size(); i != e; ++i)
4826       if (Features[i] == "+soft-float")
4827         SoftFloat = true;
4828     return true;
4829   }
4830   void getTargetDefines(const LangOptions &Opts,
4831                         MacroBuilder &Builder) const override {
4832     DefineStd(Builder, "sparc", Opts);
4833     Builder.defineMacro("__REGISTER_PREFIX__", "");
4834
4835     if (SoftFloat)
4836       Builder.defineMacro("SOFT_FLOAT", "1");
4837   }
4838
4839   bool hasFeature(StringRef Feature) const override {
4840     return llvm::StringSwitch<bool>(Feature)
4841              .Case("softfloat", SoftFloat)
4842              .Case("sparc", true)
4843              .Default(false);
4844   }
4845
4846   void getTargetBuiltins(const Builtin::Info *&Records,
4847                          unsigned &NumRecords) const override {
4848     // FIXME: Implement!
4849   }
4850   BuiltinVaListKind getBuiltinVaListKind() const override {
4851     return TargetInfo::VoidPtrBuiltinVaList;
4852   }
4853   void getGCCRegNames(const char * const *&Names,
4854                       unsigned &NumNames) const override;
4855   void getGCCRegAliases(const GCCRegAlias *&Aliases,
4856                         unsigned &NumAliases) const override;
4857   bool validateAsmConstraint(const char *&Name,
4858                              TargetInfo::ConstraintInfo &info) const override {
4859     // FIXME: Implement!
4860     return false;
4861   }
4862   const char *getClobbers() const override {
4863     // FIXME: Implement!
4864     return "";
4865   }
4866 };
4867
4868 const char * const SparcTargetInfo::GCCRegNames[] = {
4869   "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4870   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4871   "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4872   "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
4873 };
4874
4875 void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
4876                                      unsigned &NumNames) const {
4877   Names = GCCRegNames;
4878   NumNames = llvm::array_lengthof(GCCRegNames);
4879 }
4880
4881 const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
4882   { { "g0" }, "r0" },
4883   { { "g1" }, "r1" },
4884   { { "g2" }, "r2" },
4885   { { "g3" }, "r3" },
4886   { { "g4" }, "r4" },
4887   { { "g5" }, "r5" },
4888   { { "g6" }, "r6" },
4889   { { "g7" }, "r7" },
4890   { { "o0" }, "r8" },
4891   { { "o1" }, "r9" },
4892   { { "o2" }, "r10" },
4893   { { "o3" }, "r11" },
4894   { { "o4" }, "r12" },
4895   { { "o5" }, "r13" },
4896   { { "o6", "sp" }, "r14" },
4897   { { "o7" }, "r15" },
4898   { { "l0" }, "r16" },
4899   { { "l1" }, "r17" },
4900   { { "l2" }, "r18" },
4901   { { "l3" }, "r19" },
4902   { { "l4" }, "r20" },
4903   { { "l5" }, "r21" },
4904   { { "l6" }, "r22" },
4905   { { "l7" }, "r23" },
4906   { { "i0" }, "r24" },
4907   { { "i1" }, "r25" },
4908   { { "i2" }, "r26" },
4909   { { "i3" }, "r27" },
4910   { { "i4" }, "r28" },
4911   { { "i5" }, "r29" },
4912   { { "i6", "fp" }, "r30" },
4913   { { "i7" }, "r31" },
4914 };
4915
4916 void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4917                                        unsigned &NumAliases) const {
4918   Aliases = GCCRegAliases;
4919   NumAliases = llvm::array_lengthof(GCCRegAliases);
4920 }
4921
4922 // SPARC v8 is the 32-bit mode selected by Triple::sparc.
4923 class SparcV8TargetInfo : public SparcTargetInfo {
4924 public:
4925   SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
4926     DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
4927   }
4928
4929   void getTargetDefines(const LangOptions &Opts,
4930                         MacroBuilder &Builder) const override {
4931     SparcTargetInfo::getTargetDefines(Opts, Builder);
4932     Builder.defineMacro("__sparcv8");
4933   }
4934 };
4935
4936 // SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
4937 class SparcV9TargetInfo : public SparcTargetInfo {
4938 public:
4939   SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
4940     // FIXME: Support Sparc quad-precision long double?
4941     DescriptionString = "E-m:e-i64:64-n32:64-S128";
4942     // This is an LP64 platform.
4943     LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
4944
4945     // OpenBSD uses long long for int64_t and intmax_t.
4946     if (getTriple().getOS() == llvm::Triple::OpenBSD)
4947       IntMaxType = SignedLongLong;
4948     else
4949       IntMaxType = SignedLong;
4950     Int64Type = IntMaxType;
4951
4952     // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
4953     // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
4954     LongDoubleWidth = 128;
4955     LongDoubleAlign = 128;
4956     LongDoubleFormat = &llvm::APFloat::IEEEquad;
4957     MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
4958   }
4959
4960   void getTargetDefines(const LangOptions &Opts,
4961                         MacroBuilder &Builder) const override {
4962     SparcTargetInfo::getTargetDefines(Opts, Builder);
4963     Builder.defineMacro("__sparcv9");
4964     Builder.defineMacro("__arch64__");
4965     // Solaris and its derivative AuroraUX don't need these variants, but the
4966     // BSDs do.
4967     if (getTriple().getOS() != llvm::Triple::Solaris &&
4968         getTriple().getOS() != llvm::Triple::AuroraUX) {
4969       Builder.defineMacro("__sparc64__");
4970       Builder.defineMacro("__sparc_v9__");
4971       Builder.defineMacro("__sparcv9__");
4972     }
4973   }
4974
4975   bool setCPU(const std::string &Name) override {
4976     bool CPUKnown = llvm::StringSwitch<bool>(Name)
4977       .Case("v9", true)
4978       .Case("ultrasparc", true)
4979       .Case("ultrasparc3", true)
4980       .Case("niagara", true)
4981       .Case("niagara2", true)
4982       .Case("niagara3", true)
4983       .Case("niagara4", true)
4984       .Default(false);
4985
4986     // No need to store the CPU yet.  There aren't any CPU-specific
4987     // macros to define.
4988     return CPUKnown;
4989   }
4990 };
4991
4992 } // end anonymous namespace.
4993
4994 namespace {
4995 class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
4996 public:
4997   AuroraUXSparcV8TargetInfo(const llvm::Triple &Triple)
4998       : AuroraUXTargetInfo<SparcV8TargetInfo>(Triple) {
4999     SizeType = UnsignedInt;
5000     PtrDiffType = SignedInt;
5001   }
5002 };
5003 class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
5004 public:
5005   SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5006       : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
5007     SizeType = UnsignedInt;
5008     PtrDiffType = SignedInt;
5009   }
5010 };
5011 } // end anonymous namespace.
5012
5013 namespace {
5014 class SystemZTargetInfo : public TargetInfo {
5015   static const char *const GCCRegNames[];
5016
5017 public:
5018   SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5019     TLSSupported = true;
5020     IntWidth = IntAlign = 32;
5021     LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5022     PointerWidth = PointerAlign = 64;
5023     LongDoubleWidth = 128;
5024     LongDoubleAlign = 64;
5025     LongDoubleFormat = &llvm::APFloat::IEEEquad;
5026     MinGlobalAlign = 16;
5027     DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5028     MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5029   }
5030   void getTargetDefines(const LangOptions &Opts,
5031                         MacroBuilder &Builder) const override {
5032     Builder.defineMacro("__s390__");
5033     Builder.defineMacro("__s390x__");
5034     Builder.defineMacro("__zarch__");
5035     Builder.defineMacro("__LONG_DOUBLE_128__");
5036   }
5037   void getTargetBuiltins(const Builtin::Info *&Records,
5038                          unsigned &NumRecords) const override {
5039     // FIXME: Implement.
5040     Records = nullptr;
5041     NumRecords = 0;
5042   }
5043
5044   void getGCCRegNames(const char *const *&Names,
5045                       unsigned &NumNames) const override;
5046   void getGCCRegAliases(const GCCRegAlias *&Aliases,
5047                         unsigned &NumAliases) const override {
5048     // No aliases.
5049     Aliases = nullptr;
5050     NumAliases = 0;
5051   }
5052   bool validateAsmConstraint(const char *&Name,
5053                              TargetInfo::ConstraintInfo &info) const override;
5054   const char *getClobbers() const override {
5055     // FIXME: Is this really right?
5056     return "";
5057   }
5058   BuiltinVaListKind getBuiltinVaListKind() const override {
5059     return TargetInfo::SystemZBuiltinVaList;
5060   }
5061   bool setCPU(const std::string &Name) override {
5062     bool CPUKnown = llvm::StringSwitch<bool>(Name)
5063       .Case("z10", true)
5064       .Case("z196", true)
5065       .Case("zEC12", true)
5066       .Default(false);
5067
5068     // No need to store the CPU yet.  There aren't any CPU-specific
5069     // macros to define.
5070     return CPUKnown;
5071   }
5072 };
5073
5074 const char *const SystemZTargetInfo::GCCRegNames[] = {
5075   "r0",  "r1",  "r2",  "r3",  "r4",  "r5",  "r6",  "r7",
5076   "r8",  "r9",  "r10", "r11", "r12", "r13", "r14", "r15",
5077   "f0",  "f2",  "f4",  "f6",  "f1",  "f3",  "f5",  "f7",
5078   "f8",  "f10", "f12", "f14", "f9",  "f11", "f13", "f15"
5079 };
5080
5081 void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5082                                        unsigned &NumNames) const {
5083   Names = GCCRegNames;
5084   NumNames = llvm::array_lengthof(GCCRegNames);
5085 }
5086
5087 bool SystemZTargetInfo::
5088 validateAsmConstraint(const char *&Name,
5089                       TargetInfo::ConstraintInfo &Info) const {
5090   switch (*Name) {
5091   default:
5092     return false;
5093
5094   case 'a': // Address register
5095   case 'd': // Data register (equivalent to 'r')
5096   case 'f': // Floating-point register
5097     Info.setAllowsRegister();
5098     return true;
5099
5100   case 'I': // Unsigned 8-bit constant
5101   case 'J': // Unsigned 12-bit constant
5102   case 'K': // Signed 16-bit constant
5103   case 'L': // Signed 20-bit displacement (on all targets we support)
5104   case 'M': // 0x7fffffff
5105     return true;
5106
5107   case 'Q': // Memory with base and unsigned 12-bit displacement
5108   case 'R': // Likewise, plus an index
5109   case 'S': // Memory with base and signed 20-bit displacement
5110   case 'T': // Likewise, plus an index
5111     Info.setAllowsMemory();
5112     return true;
5113   }
5114 }
5115 }
5116
5117 namespace {
5118   class MSP430TargetInfo : public TargetInfo {
5119     static const char * const GCCRegNames[];
5120   public:
5121     MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5122       BigEndian = false;
5123       TLSSupported = false;
5124       IntWidth = 16; IntAlign = 16;
5125       LongWidth = 32; LongLongWidth = 64;
5126       LongAlign = LongLongAlign = 16;
5127       PointerWidth = 16; PointerAlign = 16;
5128       SuitableAlign = 16;
5129       SizeType = UnsignedInt;
5130       IntMaxType = SignedLongLong;
5131       IntPtrType = SignedInt;
5132       PtrDiffType = SignedInt;
5133       SigAtomicType = SignedLong;
5134       DescriptionString = "e-m:e-p:16:16-i32:16:32-n8:16";
5135     }
5136     void getTargetDefines(const LangOptions &Opts,
5137                           MacroBuilder &Builder) const override {
5138       Builder.defineMacro("MSP430");
5139       Builder.defineMacro("__MSP430__");
5140       // FIXME: defines for different 'flavours' of MCU
5141     }
5142     void getTargetBuiltins(const Builtin::Info *&Records,
5143                            unsigned &NumRecords) const override {
5144       // FIXME: Implement.
5145       Records = nullptr;
5146       NumRecords = 0;
5147     }
5148     bool hasFeature(StringRef Feature) const override {
5149       return Feature == "msp430";
5150     }
5151     void getGCCRegNames(const char * const *&Names,
5152                         unsigned &NumNames) const override;
5153     void getGCCRegAliases(const GCCRegAlias *&Aliases,
5154                           unsigned &NumAliases) const override {
5155       // No aliases.
5156       Aliases = nullptr;
5157       NumAliases = 0;
5158     }
5159     bool validateAsmConstraint(const char *&Name,
5160                                TargetInfo::ConstraintInfo &info) const override {
5161       // No target constraints for now.
5162       return false;
5163     }
5164     const char *getClobbers() const override {
5165       // FIXME: Is this really right?
5166       return "";
5167     }
5168     BuiltinVaListKind getBuiltinVaListKind() const override {
5169       // FIXME: implement
5170       return TargetInfo::CharPtrBuiltinVaList;
5171    }
5172   };
5173
5174   const char * const MSP430TargetInfo::GCCRegNames[] = {
5175     "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5176     "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5177   };
5178
5179   void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5180                                         unsigned &NumNames) const {
5181     Names = GCCRegNames;
5182     NumNames = llvm::array_lengthof(GCCRegNames);
5183   }
5184 }
5185
5186 namespace {
5187
5188   // LLVM and Clang cannot be used directly to output native binaries for
5189   // target, but is used to compile C code to llvm bitcode with correct
5190   // type and alignment information.
5191   //
5192   // TCE uses the llvm bitcode as input and uses it for generating customized
5193   // target processor and program binary. TCE co-design environment is
5194   // publicly available in http://tce.cs.tut.fi
5195
5196   static const unsigned TCEOpenCLAddrSpaceMap[] = {
5197       3, // opencl_global
5198       4, // opencl_local
5199       5, // opencl_constant
5200       0, // cuda_device
5201       0, // cuda_constant
5202       0  // cuda_shared
5203   };
5204
5205   class TCETargetInfo : public TargetInfo{
5206   public:
5207     TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5208       TLSSupported = false;
5209       IntWidth = 32;
5210       LongWidth = LongLongWidth = 32;
5211       PointerWidth = 32;
5212       IntAlign = 32;
5213       LongAlign = LongLongAlign = 32;
5214       PointerAlign = 32;
5215       SuitableAlign = 32;
5216       SizeType = UnsignedInt;
5217       IntMaxType = SignedLong;
5218       IntPtrType = SignedInt;
5219       PtrDiffType = SignedInt;
5220       FloatWidth = 32;
5221       FloatAlign = 32;
5222       DoubleWidth = 32;
5223       DoubleAlign = 32;
5224       LongDoubleWidth = 32;
5225       LongDoubleAlign = 32;
5226       FloatFormat = &llvm::APFloat::IEEEsingle;
5227       DoubleFormat = &llvm::APFloat::IEEEsingle;
5228       LongDoubleFormat = &llvm::APFloat::IEEEsingle;
5229       DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5230                           "-f64:32-v64:32-v128:32-a:0:32-n32";
5231       AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
5232       UseAddrSpaceMapMangling = true;
5233     }
5234
5235     void getTargetDefines(const LangOptions &Opts,
5236                           MacroBuilder &Builder) const override {
5237       DefineStd(Builder, "tce", Opts);
5238       Builder.defineMacro("__TCE__");
5239       Builder.defineMacro("__TCE_V1__");
5240     }
5241     bool hasFeature(StringRef Feature) const override {
5242       return Feature == "tce";
5243     }
5244
5245     void getTargetBuiltins(const Builtin::Info *&Records,
5246                            unsigned &NumRecords) const override {}
5247     const char *getClobbers() const override {
5248       return "";
5249     }
5250     BuiltinVaListKind getBuiltinVaListKind() const override {
5251       return TargetInfo::VoidPtrBuiltinVaList;
5252     }
5253     void getGCCRegNames(const char * const *&Names,
5254                         unsigned &NumNames) const override {}
5255     bool validateAsmConstraint(const char *&Name,
5256                                TargetInfo::ConstraintInfo &info) const override{
5257       return true;
5258     }
5259     void getGCCRegAliases(const GCCRegAlias *&Aliases,
5260                           unsigned &NumAliases) const override {}
5261   };
5262 }
5263
5264 namespace {
5265 class MipsTargetInfoBase : public TargetInfo {
5266   virtual void setDescriptionString() = 0;
5267
5268   static const Builtin::Info BuiltinInfo[];
5269   std::string CPU;
5270   bool IsMips16;
5271   bool IsMicromips;
5272   bool IsNan2008;
5273   bool IsSingleFloat;
5274   enum MipsFloatABI {
5275     HardFloat, SoftFloat
5276   } FloatABI;
5277   enum DspRevEnum {
5278     NoDSP, DSP1, DSP2
5279   } DspRev;
5280   bool HasMSA;
5281
5282 protected:
5283   bool HasFP64;
5284   std::string ABI;
5285
5286 public:
5287   MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5288                      const std::string &CPUStr)
5289       : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
5290         IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
5291         DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
5292
5293   bool isNaN2008Default() const {
5294     return CPU == "mips32r6" || CPU == "mips64r6";
5295   }
5296
5297   bool isFP64Default() const {
5298     return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5299   }
5300
5301   StringRef getABI() const override { return ABI; }
5302   bool setCPU(const std::string &Name) override {
5303     bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5304                     getTriple().getArch() == llvm::Triple::mipsel;
5305     CPU = Name;
5306     return llvm::StringSwitch<bool>(Name)
5307         .Case("mips1", IsMips32)
5308         .Case("mips2", IsMips32)
5309         .Case("mips3", true)
5310         .Case("mips4", true)
5311         .Case("mips5", true)
5312         .Case("mips32", IsMips32)
5313         .Case("mips32r2", IsMips32)
5314         .Case("mips32r6", IsMips32)
5315         .Case("mips64", true)
5316         .Case("mips64r2", true)
5317         .Case("mips64r6", true)
5318         .Case("octeon", true)
5319         .Default(false);
5320   }
5321   const std::string& getCPU() const { return CPU; }
5322   void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
5323     // The backend enables certain ABI's by default according to the
5324     // architecture.
5325     // Disable both possible defaults so that we don't end up with multiple
5326     // ABI's selected and trigger an assertion.
5327     Features["o32"] = false;
5328     Features["n64"] = false;
5329
5330     Features[ABI] = true;
5331     if (CPU == "octeon")
5332       Features["mips64r2"] = Features["cnmips"] = true;
5333     else
5334       Features[CPU] = true;
5335   }
5336
5337   void getTargetDefines(const LangOptions &Opts,
5338                         MacroBuilder &Builder) const override {
5339     Builder.defineMacro("__mips__");
5340     Builder.defineMacro("_mips");
5341     if (Opts.GNUMode)
5342       Builder.defineMacro("mips");
5343
5344     Builder.defineMacro("__REGISTER_PREFIX__", "");
5345
5346     switch (FloatABI) {
5347     case HardFloat:
5348       Builder.defineMacro("__mips_hard_float", Twine(1));
5349       break;
5350     case SoftFloat:
5351       Builder.defineMacro("__mips_soft_float", Twine(1));
5352       break;
5353     }
5354
5355     if (IsSingleFloat)
5356       Builder.defineMacro("__mips_single_float", Twine(1));
5357
5358     Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5359     Builder.defineMacro("_MIPS_FPSET",
5360                         Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5361
5362     if (IsMips16)
5363       Builder.defineMacro("__mips16", Twine(1));
5364
5365     if (IsMicromips)
5366       Builder.defineMacro("__mips_micromips", Twine(1));
5367
5368     if (IsNan2008)
5369       Builder.defineMacro("__mips_nan2008", Twine(1));
5370
5371     switch (DspRev) {
5372     default:
5373       break;
5374     case DSP1:
5375       Builder.defineMacro("__mips_dsp_rev", Twine(1));
5376       Builder.defineMacro("__mips_dsp", Twine(1));
5377       break;
5378     case DSP2:
5379       Builder.defineMacro("__mips_dsp_rev", Twine(2));
5380       Builder.defineMacro("__mips_dspr2", Twine(1));
5381       Builder.defineMacro("__mips_dsp", Twine(1));
5382       break;
5383     }
5384
5385     if (HasMSA)
5386       Builder.defineMacro("__mips_msa", Twine(1));
5387
5388     Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5389     Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5390     Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
5391
5392     Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5393     Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
5394   }
5395
5396   void getTargetBuiltins(const Builtin::Info *&Records,
5397                          unsigned &NumRecords) const override {
5398     Records = BuiltinInfo;
5399     NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
5400   }
5401   bool hasFeature(StringRef Feature) const override {
5402     return llvm::StringSwitch<bool>(Feature)
5403       .Case("mips", true)
5404       .Case("fp64", HasFP64)
5405       .Default(false);
5406   }
5407   BuiltinVaListKind getBuiltinVaListKind() const override {
5408     return TargetInfo::VoidPtrBuiltinVaList;
5409   }
5410   void getGCCRegNames(const char * const *&Names,
5411                       unsigned &NumNames) const override {
5412     static const char *const GCCRegNames[] = {
5413       // CPU register names
5414       // Must match second column of GCCRegAliases
5415       "$0",   "$1",   "$2",   "$3",   "$4",   "$5",   "$6",   "$7",
5416       "$8",   "$9",   "$10",  "$11",  "$12",  "$13",  "$14",  "$15",
5417       "$16",  "$17",  "$18",  "$19",  "$20",  "$21",  "$22",  "$23",
5418       "$24",  "$25",  "$26",  "$27",  "$28",  "$29",  "$30",  "$31",
5419       // Floating point register names
5420       "$f0",  "$f1",  "$f2",  "$f3",  "$f4",  "$f5",  "$f6",  "$f7",
5421       "$f8",  "$f9",  "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5422       "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5423       "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
5424       // Hi/lo and condition register names
5425       "hi",   "lo",   "",     "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
5426       "$fcc5","$fcc6","$fcc7",
5427       // MSA register names
5428       "$w0",  "$w1",  "$w2",  "$w3",  "$w4",  "$w5",  "$w6",  "$w7",
5429       "$w8",  "$w9",  "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5430       "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5431       "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5432       // MSA control register names
5433       "$msair",      "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5434       "$msarequest", "$msamap", "$msaunmap"
5435     };
5436     Names = GCCRegNames;
5437     NumNames = llvm::array_lengthof(GCCRegNames);
5438   }
5439   void getGCCRegAliases(const GCCRegAlias *&Aliases,
5440                         unsigned &NumAliases) const override = 0;
5441   bool validateAsmConstraint(const char *&Name,
5442                              TargetInfo::ConstraintInfo &Info) const override {
5443     switch (*Name) {
5444     default:
5445       return false;
5446         
5447     case 'r': // CPU registers.
5448     case 'd': // Equivalent to "r" unless generating MIPS16 code.
5449     case 'y': // Equivalent to "r", backward compatibility only.
5450     case 'f': // floating-point registers.
5451     case 'c': // $25 for indirect jumps
5452     case 'l': // lo register
5453     case 'x': // hilo register pair
5454       Info.setAllowsRegister();
5455       return true;
5456     case 'R': // An address that can be used in a non-macro load or store
5457       Info.setAllowsMemory();
5458       return true;
5459     }
5460   }
5461
5462   const char *getClobbers() const override {
5463     // FIXME: Implement!
5464     return "";
5465   }
5466
5467   bool handleTargetFeatures(std::vector<std::string> &Features,
5468                             DiagnosticsEngine &Diags) override {
5469     IsMips16 = false;
5470     IsMicromips = false;
5471     IsNan2008 = isNaN2008Default();
5472     IsSingleFloat = false;
5473     FloatABI = HardFloat;
5474     DspRev = NoDSP;
5475     HasFP64 = isFP64Default();
5476
5477     for (std::vector<std::string>::iterator it = Features.begin(),
5478          ie = Features.end(); it != ie; ++it) {
5479       if (*it == "+single-float")
5480         IsSingleFloat = true;
5481       else if (*it == "+soft-float")
5482         FloatABI = SoftFloat;
5483       else if (*it == "+mips16")
5484         IsMips16 = true;
5485       else if (*it == "+micromips")
5486         IsMicromips = true;
5487       else if (*it == "+dsp")
5488         DspRev = std::max(DspRev, DSP1);
5489       else if (*it == "+dspr2")
5490         DspRev = std::max(DspRev, DSP2);
5491       else if (*it == "+msa")
5492         HasMSA = true;
5493       else if (*it == "+fp64")
5494         HasFP64 = true;
5495       else if (*it == "-fp64")
5496         HasFP64 = false;
5497       else if (*it == "+nan2008")
5498         IsNan2008 = true;
5499       else if (*it == "-nan2008")
5500         IsNan2008 = false;
5501     }
5502
5503     // Remove front-end specific options.
5504     std::vector<std::string>::iterator it =
5505       std::find(Features.begin(), Features.end(), "+soft-float");
5506     if (it != Features.end())
5507       Features.erase(it);
5508
5509     setDescriptionString();
5510
5511     return true;
5512   }
5513
5514   int getEHDataRegisterNumber(unsigned RegNo) const override {
5515     if (RegNo == 0) return 4;
5516     if (RegNo == 1) return 5;
5517     return -1;
5518   }
5519
5520   bool isCLZForZeroUndef() const override { return false; }
5521 };
5522
5523 const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5524 #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5525 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5526                                               ALL_LANGUAGES },
5527 #include "clang/Basic/BuiltinsMips.def"
5528 };
5529
5530 class Mips32TargetInfoBase : public MipsTargetInfoBase {
5531 public:
5532   Mips32TargetInfoBase(const llvm::Triple &Triple)
5533       : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
5534     SizeType = UnsignedInt;
5535     PtrDiffType = SignedInt;
5536     MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
5537   }
5538   bool setABI(const std::string &Name) override {
5539     if (Name == "o32" || Name == "eabi") {
5540       ABI = Name;
5541       return true;
5542     }
5543     return false;
5544   }
5545   void getTargetDefines(const LangOptions &Opts,
5546                         MacroBuilder &Builder) const override {
5547     MipsTargetInfoBase::getTargetDefines(Opts, Builder);
5548
5549     Builder.defineMacro("__mips", "32");
5550     Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
5551
5552     const std::string& CPUStr = getCPU();
5553     if (CPUStr == "mips32")
5554       Builder.defineMacro("__mips_isa_rev", "1");
5555     else if (CPUStr == "mips32r2")
5556       Builder.defineMacro("__mips_isa_rev", "2");
5557
5558     if (ABI == "o32") {
5559       Builder.defineMacro("__mips_o32");
5560       Builder.defineMacro("_ABIO32", "1");
5561       Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5562     }
5563     else if (ABI == "eabi")
5564       Builder.defineMacro("__mips_eabi");
5565     else
5566       llvm_unreachable("Invalid ABI for Mips32.");
5567   }
5568   void getGCCRegAliases(const GCCRegAlias *&Aliases,
5569                         unsigned &NumAliases) const override {
5570     static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5571       { { "at" },  "$1" },
5572       { { "v0" },  "$2" },
5573       { { "v1" },  "$3" },
5574       { { "a0" },  "$4" },
5575       { { "a1" },  "$5" },
5576       { { "a2" },  "$6" },
5577       { { "a3" },  "$7" },
5578       { { "t0" },  "$8" },
5579       { { "t1" },  "$9" },
5580       { { "t2" }, "$10" },
5581       { { "t3" }, "$11" },
5582       { { "t4" }, "$12" },
5583       { { "t5" }, "$13" },
5584       { { "t6" }, "$14" },
5585       { { "t7" }, "$15" },
5586       { { "s0" }, "$16" },
5587       { { "s1" }, "$17" },
5588       { { "s2" }, "$18" },
5589       { { "s3" }, "$19" },
5590       { { "s4" }, "$20" },
5591       { { "s5" }, "$21" },
5592       { { "s6" }, "$22" },
5593       { { "s7" }, "$23" },
5594       { { "t8" }, "$24" },
5595       { { "t9" }, "$25" },
5596       { { "k0" }, "$26" },
5597       { { "k1" }, "$27" },
5598       { { "gp" }, "$28" },
5599       { { "sp","$sp" }, "$29" },
5600       { { "fp","$fp" }, "$30" },
5601       { { "ra" }, "$31" }
5602     };
5603     Aliases = GCCRegAliases;
5604     NumAliases = llvm::array_lengthof(GCCRegAliases);
5605   }
5606 };
5607
5608 class Mips32EBTargetInfo : public Mips32TargetInfoBase {
5609   void setDescriptionString() override {
5610     DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
5611   }
5612
5613 public:
5614   Mips32EBTargetInfo(const llvm::Triple &Triple)
5615       : Mips32TargetInfoBase(Triple) {
5616   }
5617   void getTargetDefines(const LangOptions &Opts,
5618                         MacroBuilder &Builder) const override {
5619     DefineStd(Builder, "MIPSEB", Opts);
5620     Builder.defineMacro("_MIPSEB");
5621     Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
5622   }
5623 };
5624
5625 class Mips32ELTargetInfo : public Mips32TargetInfoBase {
5626   void setDescriptionString() override {
5627     DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
5628   }
5629
5630 public:
5631   Mips32ELTargetInfo(const llvm::Triple &Triple)
5632       : Mips32TargetInfoBase(Triple) {
5633     BigEndian = false;
5634   }
5635   void getTargetDefines(const LangOptions &Opts,
5636                         MacroBuilder &Builder) const override {
5637     DefineStd(Builder, "MIPSEL", Opts);
5638     Builder.defineMacro("_MIPSEL");
5639     Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
5640   }
5641 };
5642
5643 class Mips64TargetInfoBase : public MipsTargetInfoBase {
5644 public:
5645   Mips64TargetInfoBase(const llvm::Triple &Triple)
5646       : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
5647     LongDoubleWidth = LongDoubleAlign = 128;
5648     LongDoubleFormat = &llvm::APFloat::IEEEquad;
5649     if (getTriple().getOS() == llvm::Triple::FreeBSD) {
5650       LongDoubleWidth = LongDoubleAlign = 64;
5651       LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5652     }
5653     setN64ABITypes();
5654     SuitableAlign = 128;
5655     MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5656   }
5657
5658   void setN64ABITypes() {
5659     LongWidth = LongAlign = 64;
5660     PointerWidth = PointerAlign = 64;
5661     SizeType = UnsignedLong;
5662     PtrDiffType = SignedLong;
5663   }
5664
5665   void setN32ABITypes() {
5666     LongWidth = LongAlign = 32;
5667     PointerWidth = PointerAlign = 32;
5668     SizeType = UnsignedInt;
5669     PtrDiffType = SignedInt;
5670   }
5671
5672   bool setABI(const std::string &Name) override {
5673     if (Name == "n32") {
5674       setN32ABITypes();
5675       ABI = Name;
5676       return true;
5677     }
5678     if (Name == "n64") {
5679       setN64ABITypes();
5680       ABI = Name;
5681       return true;
5682     }
5683     return false;
5684   }
5685
5686   void getTargetDefines(const LangOptions &Opts,
5687                         MacroBuilder &Builder) const override {
5688     MipsTargetInfoBase::getTargetDefines(Opts, Builder);
5689
5690     Builder.defineMacro("__mips", "64");
5691     Builder.defineMacro("__mips64");
5692     Builder.defineMacro("__mips64__");
5693     Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
5694
5695     const std::string& CPUStr = getCPU();
5696     if (CPUStr == "mips64")
5697       Builder.defineMacro("__mips_isa_rev", "1");
5698     else if (CPUStr == "mips64r2")
5699       Builder.defineMacro("__mips_isa_rev", "2");
5700
5701     if (ABI == "n32") {
5702       Builder.defineMacro("__mips_n32");
5703       Builder.defineMacro("_ABIN32", "2");
5704       Builder.defineMacro("_MIPS_SIM", "_ABIN32");
5705     }
5706     else if (ABI == "n64") {
5707       Builder.defineMacro("__mips_n64");
5708       Builder.defineMacro("_ABI64", "3");
5709       Builder.defineMacro("_MIPS_SIM", "_ABI64");
5710     }
5711     else
5712       llvm_unreachable("Invalid ABI for Mips64.");
5713   }
5714   void getGCCRegAliases(const GCCRegAlias *&Aliases,
5715                         unsigned &NumAliases) const override {
5716     static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5717       { { "at" },  "$1" },
5718       { { "v0" },  "$2" },
5719       { { "v1" },  "$3" },
5720       { { "a0" },  "$4" },
5721       { { "a1" },  "$5" },
5722       { { "a2" },  "$6" },
5723       { { "a3" },  "$7" },
5724       { { "a4" },  "$8" },
5725       { { "a5" },  "$9" },
5726       { { "a6" }, "$10" },
5727       { { "a7" }, "$11" },
5728       { { "t0" }, "$12" },
5729       { { "t1" }, "$13" },
5730       { { "t2" }, "$14" },
5731       { { "t3" }, "$15" },
5732       { { "s0" }, "$16" },
5733       { { "s1" }, "$17" },
5734       { { "s2" }, "$18" },
5735       { { "s3" }, "$19" },
5736       { { "s4" }, "$20" },
5737       { { "s5" }, "$21" },
5738       { { "s6" }, "$22" },
5739       { { "s7" }, "$23" },
5740       { { "t8" }, "$24" },
5741       { { "t9" }, "$25" },
5742       { { "k0" }, "$26" },
5743       { { "k1" }, "$27" },
5744       { { "gp" }, "$28" },
5745       { { "sp","$sp" }, "$29" },
5746       { { "fp","$fp" }, "$30" },
5747       { { "ra" }, "$31" }
5748     };
5749     Aliases = GCCRegAliases;
5750     NumAliases = llvm::array_lengthof(GCCRegAliases);
5751   }
5752
5753   bool hasInt128Type() const override { return true; }
5754 };
5755
5756 class Mips64EBTargetInfo : public Mips64TargetInfoBase {
5757   void setDescriptionString() override {
5758     if (ABI == "n32")
5759       DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
5760     else
5761       DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
5762
5763   }
5764
5765 public:
5766   Mips64EBTargetInfo(const llvm::Triple &Triple)
5767       : Mips64TargetInfoBase(Triple) {}
5768   void getTargetDefines(const LangOptions &Opts,
5769                         MacroBuilder &Builder) const override {
5770     DefineStd(Builder, "MIPSEB", Opts);
5771     Builder.defineMacro("_MIPSEB");
5772     Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
5773   }
5774 };
5775
5776 class Mips64ELTargetInfo : public Mips64TargetInfoBase {
5777   void setDescriptionString() override {
5778     if (ABI == "n32")
5779       DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
5780     else
5781       DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
5782   }
5783 public:
5784   Mips64ELTargetInfo(const llvm::Triple &Triple)
5785       : Mips64TargetInfoBase(Triple) {
5786     // Default ABI is n64.
5787     BigEndian = false;
5788   }
5789   void getTargetDefines(const LangOptions &Opts,
5790                         MacroBuilder &Builder) const override {
5791     DefineStd(Builder, "MIPSEL", Opts);
5792     Builder.defineMacro("_MIPSEL");
5793     Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
5794   }
5795 };
5796 } // end anonymous namespace.
5797
5798 namespace {
5799 class PNaClTargetInfo : public TargetInfo {
5800 public:
5801   PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5802     BigEndian = false;
5803     this->UserLabelPrefix = "";
5804     this->LongAlign = 32;
5805     this->LongWidth = 32;
5806     this->PointerAlign = 32;
5807     this->PointerWidth = 32;
5808     this->IntMaxType = TargetInfo::SignedLongLong;
5809     this->Int64Type = TargetInfo::SignedLongLong;
5810     this->DoubleAlign = 64;
5811     this->LongDoubleWidth = 64;
5812     this->LongDoubleAlign = 64;
5813     this->SizeType = TargetInfo::UnsignedInt;
5814     this->PtrDiffType = TargetInfo::SignedInt;
5815     this->IntPtrType = TargetInfo::SignedInt;
5816     this->RegParmMax = 0; // Disallow regparm
5817   }
5818
5819   void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
5820   }
5821   void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
5822     Builder.defineMacro("__le32__");
5823     Builder.defineMacro("__pnacl__");
5824   }
5825   void getTargetDefines(const LangOptions &Opts,
5826                         MacroBuilder &Builder) const override {
5827     getArchDefines(Opts, Builder);
5828   }
5829   bool hasFeature(StringRef Feature) const override {
5830     return Feature == "pnacl";
5831   }
5832   void getTargetBuiltins(const Builtin::Info *&Records,
5833                          unsigned &NumRecords) const override {
5834   }
5835   BuiltinVaListKind getBuiltinVaListKind() const override {
5836     return TargetInfo::PNaClABIBuiltinVaList;
5837   }
5838   void getGCCRegNames(const char * const *&Names,
5839                       unsigned &NumNames) const override;
5840   void getGCCRegAliases(const GCCRegAlias *&Aliases,
5841                         unsigned &NumAliases) const override;
5842   bool validateAsmConstraint(const char *&Name,
5843                              TargetInfo::ConstraintInfo &Info) const override {
5844     return false;
5845   }
5846
5847   const char *getClobbers() const override {
5848     return "";
5849   }
5850 };
5851
5852 void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
5853                                      unsigned &NumNames) const {
5854   Names = nullptr;
5855   NumNames = 0;
5856 }
5857
5858 void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5859                                        unsigned &NumAliases) const {
5860   Aliases = nullptr;
5861   NumAliases = 0;
5862 }
5863 } // end anonymous namespace.
5864
5865 namespace {
5866   static const unsigned SPIRAddrSpaceMap[] = {
5867     1,    // opencl_global
5868     3,    // opencl_local
5869     2,    // opencl_constant
5870     0,    // cuda_device
5871     0,    // cuda_constant
5872     0     // cuda_shared
5873   };
5874   class SPIRTargetInfo : public TargetInfo {
5875   public:
5876     SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5877       assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
5878         "SPIR target must use unknown OS");
5879       assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
5880         "SPIR target must use unknown environment type");
5881       BigEndian = false;
5882       TLSSupported = false;
5883       LongWidth = LongAlign = 64;
5884       AddrSpaceMap = &SPIRAddrSpaceMap;
5885       UseAddrSpaceMapMangling = true;
5886       // Define available target features
5887       // These must be defined in sorted order!
5888       NoAsmVariants = true;
5889     }
5890     void getTargetDefines(const LangOptions &Opts,
5891                           MacroBuilder &Builder) const override {
5892       DefineStd(Builder, "SPIR", Opts);
5893     }
5894     bool hasFeature(StringRef Feature) const override {
5895       return Feature == "spir";
5896     }
5897
5898     void getTargetBuiltins(const Builtin::Info *&Records,
5899                            unsigned &NumRecords) const override {}
5900     const char *getClobbers() const override {
5901       return "";
5902     }
5903     void getGCCRegNames(const char * const *&Names,
5904                         unsigned &NumNames) const override {}
5905     bool validateAsmConstraint(const char *&Name,
5906                                TargetInfo::ConstraintInfo &info) const override {
5907       return true;
5908     }
5909     void getGCCRegAliases(const GCCRegAlias *&Aliases,
5910                           unsigned &NumAliases) const override {}
5911     BuiltinVaListKind getBuiltinVaListKind() const override {
5912       return TargetInfo::VoidPtrBuiltinVaList;
5913     }
5914   };
5915
5916
5917   class SPIR32TargetInfo : public SPIRTargetInfo {
5918   public:
5919     SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
5920       PointerWidth = PointerAlign = 32;
5921       SizeType     = TargetInfo::UnsignedInt;
5922       PtrDiffType = IntPtrType = TargetInfo::SignedInt;
5923       DescriptionString
5924         = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
5925           "v96:128-v192:256-v256:256-v512:512-v1024:1024";
5926     }
5927     void getTargetDefines(const LangOptions &Opts,
5928                           MacroBuilder &Builder) const override {
5929       DefineStd(Builder, "SPIR32", Opts);
5930     }
5931   };
5932
5933   class SPIR64TargetInfo : public SPIRTargetInfo {
5934   public:
5935     SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
5936       PointerWidth = PointerAlign = 64;
5937       SizeType     = TargetInfo::UnsignedLong;
5938       PtrDiffType = IntPtrType = TargetInfo::SignedLong;
5939       DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
5940                           "v96:128-v192:256-v256:256-v512:512-v1024:1024";
5941     }
5942     void getTargetDefines(const LangOptions &Opts,
5943                           MacroBuilder &Builder) const override {
5944       DefineStd(Builder, "SPIR64", Opts);
5945     }
5946   };
5947 }
5948
5949 namespace {
5950 class XCoreTargetInfo : public TargetInfo {
5951   static const Builtin::Info BuiltinInfo[];
5952 public:
5953   XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5954     BigEndian = false;
5955     NoAsmVariants = true;
5956     LongLongAlign = 32;
5957     SuitableAlign = 32;
5958     DoubleAlign = LongDoubleAlign = 32;
5959     SizeType = UnsignedInt;
5960     PtrDiffType = SignedInt;
5961     IntPtrType = SignedInt;
5962     WCharType = UnsignedChar;
5963     WIntType = UnsignedInt;
5964     UseZeroLengthBitfieldAlignment = true;
5965     DescriptionString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
5966                         "-f64:32-a:0:32-n32";
5967   }
5968   void getTargetDefines(const LangOptions &Opts,
5969                         MacroBuilder &Builder) const override {
5970     Builder.defineMacro("__XS1B__");
5971   }
5972   void getTargetBuiltins(const Builtin::Info *&Records,
5973                          unsigned &NumRecords) const override {
5974     Records = BuiltinInfo;
5975     NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
5976   }
5977   BuiltinVaListKind getBuiltinVaListKind() const override {
5978     return TargetInfo::VoidPtrBuiltinVaList;
5979   }
5980   const char *getClobbers() const override {
5981     return "";
5982   }
5983   void getGCCRegNames(const char * const *&Names,
5984                       unsigned &NumNames) const override {
5985     static const char * const GCCRegNames[] = {
5986       "r0",   "r1",   "r2",   "r3",   "r4",   "r5",   "r6",   "r7",
5987       "r8",   "r9",   "r10",  "r11",  "cp",   "dp",   "sp",   "lr"
5988     };
5989     Names = GCCRegNames;
5990     NumNames = llvm::array_lengthof(GCCRegNames);
5991   }
5992   void getGCCRegAliases(const GCCRegAlias *&Aliases,
5993                         unsigned &NumAliases) const override {
5994     Aliases = nullptr;
5995     NumAliases = 0;
5996   }
5997   bool validateAsmConstraint(const char *&Name,
5998                              TargetInfo::ConstraintInfo &Info) const override {
5999     return false;
6000   }
6001   int getEHDataRegisterNumber(unsigned RegNo) const override {
6002     // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6003     return (RegNo < 2)? RegNo : -1;
6004   }
6005 };
6006
6007 const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6008 #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6009 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6010                                               ALL_LANGUAGES },
6011 #include "clang/Basic/BuiltinsXCore.def"
6012 };
6013 } // end anonymous namespace.
6014
6015
6016 //===----------------------------------------------------------------------===//
6017 // Driver code
6018 //===----------------------------------------------------------------------===//
6019
6020 static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
6021   llvm::Triple::OSType os = Triple.getOS();
6022
6023   switch (Triple.getArch()) {
6024   default:
6025     return nullptr;
6026
6027   case llvm::Triple::xcore:
6028     return new XCoreTargetInfo(Triple);
6029
6030   case llvm::Triple::hexagon:
6031     return new HexagonTargetInfo(Triple);
6032
6033   case llvm::Triple::aarch64:
6034   case llvm::Triple::arm64:
6035     if (Triple.isOSDarwin())
6036       return new DarwinAArch64TargetInfo(Triple);
6037
6038     switch (os) {
6039     case llvm::Triple::FreeBSD:
6040       return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
6041     case llvm::Triple::Linux:
6042       return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
6043     case llvm::Triple::NetBSD:
6044       return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
6045     default:
6046       return new AArch64leTargetInfo(Triple);
6047     }
6048
6049   case llvm::Triple::aarch64_be:
6050   case llvm::Triple::arm64_be:
6051     switch (os) {
6052     case llvm::Triple::FreeBSD:
6053       return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
6054     case llvm::Triple::Linux:
6055       return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
6056     case llvm::Triple::NetBSD:
6057       return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
6058     default:
6059       return new AArch64beTargetInfo(Triple);
6060     }
6061
6062   case llvm::Triple::arm:
6063   case llvm::Triple::thumb:
6064     if (Triple.isOSBinFormatMachO())
6065       return new DarwinARMTargetInfo(Triple);
6066
6067     switch (os) {
6068     case llvm::Triple::Linux:
6069       return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
6070     case llvm::Triple::FreeBSD:
6071       return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
6072     case llvm::Triple::NetBSD:
6073       return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
6074     case llvm::Triple::OpenBSD:
6075       return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
6076     case llvm::Triple::Bitrig:
6077       return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
6078     case llvm::Triple::RTEMS:
6079       return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
6080     case llvm::Triple::NaCl:
6081       return new NaClTargetInfo<ARMleTargetInfo>(Triple);
6082     case llvm::Triple::Win32:
6083       switch (Triple.getEnvironment()) {
6084       default:
6085         return new ARMleTargetInfo(Triple);
6086       case llvm::Triple::Itanium:
6087         return new ItaniumWindowsARMleTargetInfo(Triple);
6088       case llvm::Triple::MSVC:
6089         return new MicrosoftARMleTargetInfo(Triple);
6090       }
6091     default:
6092       return new ARMleTargetInfo(Triple);
6093     }
6094
6095   case llvm::Triple::armeb:
6096   case llvm::Triple::thumbeb:
6097     if (Triple.isOSDarwin())
6098       return new DarwinARMTargetInfo(Triple);
6099
6100     switch (os) {
6101     case llvm::Triple::Linux:
6102       return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6103     case llvm::Triple::FreeBSD:
6104       return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6105     case llvm::Triple::NetBSD:
6106       return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6107     case llvm::Triple::OpenBSD:
6108       return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6109     case llvm::Triple::Bitrig:
6110       return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6111     case llvm::Triple::RTEMS:
6112       return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6113     case llvm::Triple::NaCl:
6114       return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6115     default:
6116       return new ARMbeTargetInfo(Triple);
6117     }
6118
6119   case llvm::Triple::msp430:
6120     return new MSP430TargetInfo(Triple);
6121
6122   case llvm::Triple::mips:
6123     switch (os) {
6124     case llvm::Triple::Linux:
6125       return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
6126     case llvm::Triple::RTEMS:
6127       return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
6128     case llvm::Triple::FreeBSD:
6129       return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
6130     case llvm::Triple::NetBSD:
6131       return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
6132     default:
6133       return new Mips32EBTargetInfo(Triple);
6134     }
6135
6136   case llvm::Triple::mipsel:
6137     switch (os) {
6138     case llvm::Triple::Linux:
6139       return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
6140     case llvm::Triple::RTEMS:
6141       return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
6142     case llvm::Triple::FreeBSD:
6143       return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
6144     case llvm::Triple::NetBSD:
6145       return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
6146     case llvm::Triple::NaCl:
6147       return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
6148     default:
6149       return new Mips32ELTargetInfo(Triple);
6150     }
6151
6152   case llvm::Triple::mips64:
6153     switch (os) {
6154     case llvm::Triple::Linux:
6155       return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
6156     case llvm::Triple::RTEMS:
6157       return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
6158     case llvm::Triple::FreeBSD:
6159       return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
6160     case llvm::Triple::NetBSD:
6161       return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
6162     case llvm::Triple::OpenBSD:
6163       return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
6164     default:
6165       return new Mips64EBTargetInfo(Triple);
6166     }
6167
6168   case llvm::Triple::mips64el:
6169     switch (os) {
6170     case llvm::Triple::Linux:
6171       return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
6172     case llvm::Triple::RTEMS:
6173       return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
6174     case llvm::Triple::FreeBSD:
6175       return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
6176     case llvm::Triple::NetBSD:
6177       return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
6178     case llvm::Triple::OpenBSD:
6179       return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
6180     default:
6181       return new Mips64ELTargetInfo(Triple);
6182     }
6183
6184   case llvm::Triple::le32:
6185     switch (os) {
6186       case llvm::Triple::NaCl:
6187         return new NaClTargetInfo<PNaClTargetInfo>(Triple);
6188       default:
6189         return nullptr;
6190     }
6191
6192   case llvm::Triple::ppc:
6193     if (Triple.isOSDarwin())
6194       return new DarwinPPC32TargetInfo(Triple);
6195     switch (os) {
6196     case llvm::Triple::Linux:
6197       return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
6198     case llvm::Triple::FreeBSD:
6199       return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
6200     case llvm::Triple::NetBSD:
6201       return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
6202     case llvm::Triple::OpenBSD:
6203       return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
6204     case llvm::Triple::RTEMS:
6205       return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
6206     default:
6207       return new PPC32TargetInfo(Triple);
6208     }
6209
6210   case llvm::Triple::ppc64:
6211     if (Triple.isOSDarwin())
6212       return new DarwinPPC64TargetInfo(Triple);
6213     switch (os) {
6214     case llvm::Triple::Linux:
6215       return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6216     case llvm::Triple::Lv2:
6217       return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
6218     case llvm::Triple::FreeBSD:
6219       return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
6220     case llvm::Triple::NetBSD:
6221       return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
6222     default:
6223       return new PPC64TargetInfo(Triple);
6224     }
6225
6226   case llvm::Triple::ppc64le:
6227     switch (os) {
6228     case llvm::Triple::Linux:
6229       return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6230     default:
6231       return new PPC64TargetInfo(Triple);
6232     }
6233
6234   case llvm::Triple::nvptx:
6235     return new NVPTX32TargetInfo(Triple);
6236   case llvm::Triple::nvptx64:
6237     return new NVPTX64TargetInfo(Triple);
6238
6239   case llvm::Triple::r600:
6240     return new R600TargetInfo(Triple);
6241
6242   case llvm::Triple::sparc:
6243     switch (os) {
6244     case llvm::Triple::Linux:
6245       return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
6246     case llvm::Triple::AuroraUX:
6247       return new AuroraUXSparcV8TargetInfo(Triple);
6248     case llvm::Triple::Solaris:
6249       return new SolarisSparcV8TargetInfo(Triple);
6250     case llvm::Triple::NetBSD:
6251       return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
6252     case llvm::Triple::OpenBSD:
6253       return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
6254     case llvm::Triple::RTEMS:
6255       return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
6256     default:
6257       return new SparcV8TargetInfo(Triple);
6258     }
6259
6260   case llvm::Triple::sparcv9:
6261     switch (os) {
6262     case llvm::Triple::Linux:
6263       return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
6264     case llvm::Triple::AuroraUX:
6265       return new AuroraUXTargetInfo<SparcV9TargetInfo>(Triple);
6266     case llvm::Triple::Solaris:
6267       return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
6268     case llvm::Triple::NetBSD:
6269       return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
6270     case llvm::Triple::OpenBSD:
6271       return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
6272     case llvm::Triple::FreeBSD:
6273       return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
6274     default:
6275       return new SparcV9TargetInfo(Triple);
6276     }
6277
6278   case llvm::Triple::systemz:
6279     switch (os) {
6280     case llvm::Triple::Linux:
6281       return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
6282     default:
6283       return new SystemZTargetInfo(Triple);
6284     }
6285
6286   case llvm::Triple::tce:
6287     return new TCETargetInfo(Triple);
6288
6289   case llvm::Triple::x86:
6290     if (Triple.isOSDarwin())
6291       return new DarwinI386TargetInfo(Triple);
6292
6293     switch (os) {
6294     case llvm::Triple::AuroraUX:
6295       return new AuroraUXTargetInfo<X86_32TargetInfo>(Triple);
6296     case llvm::Triple::Linux:
6297       return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
6298     case llvm::Triple::DragonFly:
6299       return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
6300     case llvm::Triple::NetBSD:
6301       return new NetBSDI386TargetInfo(Triple);
6302     case llvm::Triple::OpenBSD:
6303       return new OpenBSDI386TargetInfo(Triple);
6304     case llvm::Triple::Bitrig:
6305       return new BitrigI386TargetInfo(Triple);
6306     case llvm::Triple::FreeBSD:
6307       return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
6308     case llvm::Triple::KFreeBSD:
6309       return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
6310     case llvm::Triple::Minix:
6311       return new MinixTargetInfo<X86_32TargetInfo>(Triple);
6312     case llvm::Triple::Solaris:
6313       return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
6314     case llvm::Triple::Win32: {
6315       switch (Triple.getEnvironment()) {
6316       default:
6317         return new X86_32TargetInfo(Triple);
6318       case llvm::Triple::Cygnus:
6319         return new CygwinX86_32TargetInfo(Triple);
6320       case llvm::Triple::GNU:
6321         return new MinGWX86_32TargetInfo(Triple);
6322       case llvm::Triple::Itanium:
6323       case llvm::Triple::MSVC:
6324         return new MicrosoftX86_32TargetInfo(Triple);
6325       }
6326     }
6327     case llvm::Triple::Haiku:
6328       return new HaikuX86_32TargetInfo(Triple);
6329     case llvm::Triple::RTEMS:
6330       return new RTEMSX86_32TargetInfo(Triple);
6331     case llvm::Triple::NaCl:
6332       return new NaClTargetInfo<X86_32TargetInfo>(Triple);
6333     default:
6334       return new X86_32TargetInfo(Triple);
6335     }
6336
6337   case llvm::Triple::x86_64:
6338     if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
6339       return new DarwinX86_64TargetInfo(Triple);
6340
6341     switch (os) {
6342     case llvm::Triple::AuroraUX:
6343       return new AuroraUXTargetInfo<X86_64TargetInfo>(Triple);
6344     case llvm::Triple::Linux:
6345       return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
6346     case llvm::Triple::DragonFly:
6347       return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
6348     case llvm::Triple::NetBSD:
6349       return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
6350     case llvm::Triple::OpenBSD:
6351       return new OpenBSDX86_64TargetInfo(Triple);
6352     case llvm::Triple::Bitrig:
6353       return new BitrigX86_64TargetInfo(Triple);
6354     case llvm::Triple::FreeBSD:
6355       return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
6356     case llvm::Triple::KFreeBSD:
6357       return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
6358     case llvm::Triple::Solaris:
6359       return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
6360     case llvm::Triple::Win32: {
6361       switch (Triple.getEnvironment()) {
6362       default:
6363         return new X86_64TargetInfo(Triple);
6364       case llvm::Triple::GNU:
6365         return new MinGWX86_64TargetInfo(Triple);
6366       case llvm::Triple::MSVC:
6367         return new MicrosoftX86_64TargetInfo(Triple);
6368       }
6369     }
6370     case llvm::Triple::NaCl:
6371       return new NaClTargetInfo<X86_64TargetInfo>(Triple);
6372     default:
6373       return new X86_64TargetInfo(Triple);
6374     }
6375
6376     case llvm::Triple::spir: {
6377       if (Triple.getOS() != llvm::Triple::UnknownOS ||
6378           Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
6379         return nullptr;
6380       return new SPIR32TargetInfo(Triple);
6381     }
6382     case llvm::Triple::spir64: {
6383       if (Triple.getOS() != llvm::Triple::UnknownOS ||
6384           Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
6385         return nullptr;
6386       return new SPIR64TargetInfo(Triple);
6387     }
6388   }
6389 }
6390
6391 /// CreateTargetInfo - Return the target info object for the specified target
6392 /// triple.
6393 TargetInfo *
6394 TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
6395                              const std::shared_ptr<TargetOptions> &Opts) {
6396   llvm::Triple Triple(Opts->Triple);
6397
6398   // Construct the target
6399   std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
6400   if (!Target) {
6401     Diags.Report(diag::err_target_unknown_triple) << Triple.str();
6402     return nullptr;
6403   }
6404   Target->TargetOpts = Opts;
6405
6406   // Set the target CPU if specified.
6407   if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6408     Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
6409     return nullptr;
6410   }
6411
6412   // Set the target ABI if specified.
6413   if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6414     Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
6415     return nullptr;
6416   }
6417
6418   // Set the fp math unit.
6419   if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6420     Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
6421     return nullptr;
6422   }
6423
6424   // Compute the default target features, we need the target to handle this
6425   // because features may have dependencies on one another.
6426   llvm::StringMap<bool> Features;
6427   Target->getDefaultFeatures(Features);
6428
6429   // Apply the user specified deltas.
6430   for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6431        I < N; ++I) {
6432     const char *Name = Opts->FeaturesAsWritten[I].c_str();
6433     // Apply the feature via the target.
6434     bool Enabled = Name[0] == '+';
6435     Target->setFeatureEnabled(Features, Name + 1, Enabled);
6436   }
6437
6438   // Add the features to the compile options.
6439   //
6440   // FIXME: If we are completely confident that we have the right set, we only
6441   // need to pass the minuses.
6442   Opts->Features.clear();
6443   for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6444          ie = Features.end(); it != ie; ++it)
6445     Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
6446   if (!Target->handleTargetFeatures(Opts->Features, Diags))
6447     return nullptr;
6448
6449   return Target.release();
6450 }