1 //===--- Targets.cpp - Implement target feature support -------------------===//
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/StringExtras.h"
25 #include "llvm/ADT/StringRef.h"
26 #include "llvm/ADT/StringSwitch.h"
27 #include "llvm/ADT/Triple.h"
28 #include "llvm/MC/MCSectionMachO.h"
29 #include "llvm/Support/ErrorHandling.h"
30 #include "llvm/Support/TargetParser.h"
31 #include <algorithm>
32 #include <memory>
33 
34 using namespace clang;
35 
36 //===----------------------------------------------------------------------===//
37 //  Common code shared among targets.
38 //===----------------------------------------------------------------------===//
39 
40 /// DefineStd - Define a macro name and standard variants.  For example if
41 /// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
42 /// when in GNU mode.
43 static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
44                       const LangOptions &Opts) {
45   assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
46 
47   // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
48   // in the user's namespace.
49   if (Opts.GNUMode)
50     Builder.defineMacro(MacroName);
51 
52   // Define __unix.
53   Builder.defineMacro("__" + MacroName);
54 
55   // Define __unix__.
56   Builder.defineMacro("__" + MacroName + "__");
57 }
58 
59 static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
60                             bool Tuning = true) {
61   Builder.defineMacro("__" + CPUName);
62   Builder.defineMacro("__" + CPUName + "__");
63   if (Tuning)
64     Builder.defineMacro("__tune_" + CPUName + "__");
65 }
66 
67 //===----------------------------------------------------------------------===//
68 // Defines specific to certain operating systems.
69 //===----------------------------------------------------------------------===//
70 
71 namespace {
72 template<typename TgtInfo>
73 class OSTargetInfo : public TgtInfo {
74 protected:
75   virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
76                             MacroBuilder &Builder) const=0;
77 public:
78   OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
79   void getTargetDefines(const LangOptions &Opts,
80                         MacroBuilder &Builder) const override {
81     TgtInfo::getTargetDefines(Opts, Builder);
82     getOSDefines(Opts, TgtInfo::getTriple(), Builder);
83   }
84 
85 };
86 
87 // CloudABI Target
88 template <typename Target>
89 class CloudABITargetInfo : public OSTargetInfo<Target> {
90 protected:
91   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
92                     MacroBuilder &Builder) const override {
93     Builder.defineMacro("__CloudABI__");
94     Builder.defineMacro("__ELF__");
95 
96     // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
97     Builder.defineMacro("__STDC_ISO_10646__", "201206L");
98     Builder.defineMacro("__STDC_UTF_16__");
99     Builder.defineMacro("__STDC_UTF_32__");
100   }
101 
102 public:
103   CloudABITargetInfo(const llvm::Triple &Triple)
104       : OSTargetInfo<Target>(Triple) {
105     this->UserLabelPrefix = "";
106   }
107 };
108 
109 static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
110                              const llvm::Triple &Triple,
111                              StringRef &PlatformName,
112                              VersionTuple &PlatformMinVersion) {
113   Builder.defineMacro("__APPLE_CC__", "6000");
114   Builder.defineMacro("__APPLE__");
115   Builder.defineMacro("OBJC_NEW_PROPERTIES");
116   // AddressSanitizer doesn't play well with source fortification, which is on
117   // by default on Darwin.
118   if (Opts.Sanitize.has(SanitizerKind::Address))
119     Builder.defineMacro("_FORTIFY_SOURCE", "0");
120 
121   if (!Opts.ObjCAutoRefCount) {
122     // __weak is always defined, for use in blocks and with objc pointers.
123     Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
124 
125     // Darwin defines __strong even in C mode (just to nothing).
126     if (Opts.getGC() != LangOptions::NonGC)
127       Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
128     else
129       Builder.defineMacro("__strong", "");
130 
131     // __unsafe_unretained is defined to nothing in non-ARC mode. We even
132     // allow this in C, since one might have block pointers in structs that
133     // are used in pure C code and in Objective-C ARC.
134     Builder.defineMacro("__unsafe_unretained", "");
135   }
136 
137   if (Opts.Static)
138     Builder.defineMacro("__STATIC__");
139   else
140     Builder.defineMacro("__DYNAMIC__");
141 
142   if (Opts.POSIXThreads)
143     Builder.defineMacro("_REENTRANT");
144 
145   // Get the platform type and version number from the triple.
146   unsigned Maj, Min, Rev;
147   if (Triple.isMacOSX()) {
148     Triple.getMacOSXVersion(Maj, Min, Rev);
149     PlatformName = "macosx";
150   } else {
151     Triple.getOSVersion(Maj, Min, Rev);
152     PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
153   }
154 
155   // If -target arch-pc-win32-macho option specified, we're
156   // generating code for Win32 ABI. No need to emit
157   // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
158   if (PlatformName == "win32") {
159     PlatformMinVersion = VersionTuple(Maj, Min, Rev);
160     return;
161   }
162 
163   // Set the appropriate OS version define.
164   if (Triple.isiOS()) {
165     assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
166     char Str[6];
167     Str[0] = '0' + Maj;
168     Str[1] = '0' + (Min / 10);
169     Str[2] = '0' + (Min % 10);
170     Str[3] = '0' + (Rev / 10);
171     Str[4] = '0' + (Rev % 10);
172     Str[5] = '\0';
173     Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
174   } else if (Triple.isMacOSX()) {
175     // Note that the Driver allows versions which aren't representable in the
176     // define (because we only get a single digit for the minor and micro
177     // revision numbers). So, we limit them to the maximum representable
178     // version.
179     assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
180     char Str[7];
181     if (Maj < 10 || (Maj == 10 && Min < 10)) {
182       Str[0] = '0' + (Maj / 10);
183       Str[1] = '0' + (Maj % 10);
184       Str[2] = '0' + std::min(Min, 9U);
185       Str[3] = '0' + std::min(Rev, 9U);
186       Str[4] = '\0';
187     } else {
188       // Handle versions > 10.9.
189       Str[0] = '0' + (Maj / 10);
190       Str[1] = '0' + (Maj % 10);
191       Str[2] = '0' + (Min / 10);
192       Str[3] = '0' + (Min % 10);
193       Str[4] = '0' + (Rev / 10);
194       Str[5] = '0' + (Rev % 10);
195       Str[6] = '\0';
196     }
197     Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
198   }
199 
200   // Tell users about the kernel if there is one.
201   if (Triple.isOSDarwin())
202     Builder.defineMacro("__MACH__");
203 
204   PlatformMinVersion = VersionTuple(Maj, Min, Rev);
205 }
206 
207 template<typename Target>
208 class DarwinTargetInfo : public OSTargetInfo<Target> {
209 protected:
210   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
211                     MacroBuilder &Builder) const override {
212     getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
213                      this->PlatformMinVersion);
214   }
215 
216 public:
217   DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
218     this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
219     this->MCountName = "\01mcount";
220   }
221 
222   std::string isValidSectionSpecifier(StringRef SR) const override {
223     // Let MCSectionMachO validate this.
224     StringRef Segment, Section;
225     unsigned TAA, StubSize;
226     bool HasTAA;
227     return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
228                                                        TAA, HasTAA, StubSize);
229   }
230 
231   const char *getStaticInitSectionSpecifier() const override {
232     // FIXME: We should return 0 when building kexts.
233     return "__TEXT,__StaticInit,regular,pure_instructions";
234   }
235 
236   /// Darwin does not support protected visibility.  Darwin's "default"
237   /// is very similar to ELF's "protected";  Darwin requires a "weak"
238   /// attribute on declarations that can be dynamically replaced.
239   bool hasProtectedVisibility() const override {
240     return false;
241   }
242 };
243 
244 
245 // DragonFlyBSD Target
246 template<typename Target>
247 class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
248 protected:
249   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
250                     MacroBuilder &Builder) const override {
251     // DragonFly defines; list based off of gcc output
252     Builder.defineMacro("__DragonFly__");
253     Builder.defineMacro("__DragonFly_cc_version", "100001");
254     Builder.defineMacro("__ELF__");
255     Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
256     Builder.defineMacro("__tune_i386__");
257     DefineStd(Builder, "unix", Opts);
258   }
259 public:
260   DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
261       : OSTargetInfo<Target>(Triple) {
262     this->UserLabelPrefix = "";
263 
264     switch (Triple.getArch()) {
265     default:
266     case llvm::Triple::x86:
267     case llvm::Triple::x86_64:
268       this->MCountName = ".mcount";
269       break;
270     }
271   }
272 };
273 
274 // FreeBSD Target
275 template<typename Target>
276 class FreeBSDTargetInfo : public OSTargetInfo<Target> {
277 protected:
278   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
279                     MacroBuilder &Builder) const override {
280     // FreeBSD defines; list based off of gcc output
281 
282     unsigned Release = Triple.getOSMajorVersion();
283     if (Release == 0U)
284       Release = 8;
285 
286     Builder.defineMacro("__FreeBSD__", Twine(Release));
287     Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
288     Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
289     DefineStd(Builder, "unix", Opts);
290     Builder.defineMacro("__ELF__");
291 
292     // On FreeBSD, wchar_t contains the number of the code point as
293     // used by the character set of the locale. These character sets are
294     // not necessarily a superset of ASCII.
295     //
296     // FIXME: This is wrong; the macro refers to the numerical values
297     // of wchar_t *literals*, which are not locale-dependent. However,
298     // FreeBSD systems apparently depend on us getting this wrong, and
299     // setting this to 1 is conforming even if all the basic source
300     // character literals have the same encoding as char and wchar_t.
301     Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
302   }
303 public:
304   FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
305     this->UserLabelPrefix = "";
306 
307     switch (Triple.getArch()) {
308     default:
309     case llvm::Triple::x86:
310     case llvm::Triple::x86_64:
311       this->MCountName = ".mcount";
312       break;
313     case llvm::Triple::mips:
314     case llvm::Triple::mipsel:
315     case llvm::Triple::ppc:
316     case llvm::Triple::ppc64:
317     case llvm::Triple::ppc64le:
318       this->MCountName = "_mcount";
319       break;
320     case llvm::Triple::arm:
321       this->MCountName = "__mcount";
322       break;
323     }
324   }
325 };
326 
327 // GNU/kFreeBSD Target
328 template<typename Target>
329 class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
330 protected:
331   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
332                     MacroBuilder &Builder) const override {
333     // GNU/kFreeBSD defines; list based off of gcc output
334 
335     DefineStd(Builder, "unix", Opts);
336     Builder.defineMacro("__FreeBSD_kernel__");
337     Builder.defineMacro("__GLIBC__");
338     Builder.defineMacro("__ELF__");
339     if (Opts.POSIXThreads)
340       Builder.defineMacro("_REENTRANT");
341     if (Opts.CPlusPlus)
342       Builder.defineMacro("_GNU_SOURCE");
343   }
344 public:
345   KFreeBSDTargetInfo(const llvm::Triple &Triple)
346       : OSTargetInfo<Target>(Triple) {
347     this->UserLabelPrefix = "";
348   }
349 };
350 
351 // Minix Target
352 template<typename Target>
353 class MinixTargetInfo : public OSTargetInfo<Target> {
354 protected:
355   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
356                     MacroBuilder &Builder) const override {
357     // Minix defines
358 
359     Builder.defineMacro("__minix", "3");
360     Builder.defineMacro("_EM_WSIZE", "4");
361     Builder.defineMacro("_EM_PSIZE", "4");
362     Builder.defineMacro("_EM_SSIZE", "2");
363     Builder.defineMacro("_EM_LSIZE", "4");
364     Builder.defineMacro("_EM_FSIZE", "4");
365     Builder.defineMacro("_EM_DSIZE", "8");
366     Builder.defineMacro("__ELF__");
367     DefineStd(Builder, "unix", Opts);
368   }
369 public:
370   MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
371     this->UserLabelPrefix = "";
372   }
373 };
374 
375 // Linux target
376 template<typename Target>
377 class LinuxTargetInfo : public OSTargetInfo<Target> {
378 protected:
379   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
380                     MacroBuilder &Builder) const override {
381     // Linux defines; list based off of gcc output
382     DefineStd(Builder, "unix", Opts);
383     DefineStd(Builder, "linux", Opts);
384     Builder.defineMacro("__gnu_linux__");
385     Builder.defineMacro("__ELF__");
386     if (Triple.getEnvironment() == llvm::Triple::Android) {
387       Builder.defineMacro("__ANDROID__", "1");
388       unsigned Maj, Min, Rev;
389       Triple.getEnvironmentVersion(Maj, Min, Rev);
390       this->PlatformName = "android";
391       this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
392     }
393     if (Opts.POSIXThreads)
394       Builder.defineMacro("_REENTRANT");
395     if (Opts.CPlusPlus)
396       Builder.defineMacro("_GNU_SOURCE");
397   }
398 public:
399   LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
400     this->UserLabelPrefix = "";
401     this->WIntType = TargetInfo::UnsignedInt;
402 
403     switch (Triple.getArch()) {
404     default:
405       break;
406     case llvm::Triple::ppc:
407     case llvm::Triple::ppc64:
408     case llvm::Triple::ppc64le:
409       this->MCountName = "_mcount";
410       break;
411     }
412   }
413 
414   const char *getStaticInitSectionSpecifier() const override {
415     return ".text.startup";
416   }
417 };
418 
419 // NetBSD Target
420 template<typename Target>
421 class NetBSDTargetInfo : public OSTargetInfo<Target> {
422 protected:
423   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
424                     MacroBuilder &Builder) const override {
425     // NetBSD defines; list based off of gcc output
426     Builder.defineMacro("__NetBSD__");
427     Builder.defineMacro("__unix__");
428     Builder.defineMacro("__ELF__");
429     if (Opts.POSIXThreads)
430       Builder.defineMacro("_POSIX_THREADS");
431 
432     switch (Triple.getArch()) {
433     default:
434       break;
435     case llvm::Triple::arm:
436     case llvm::Triple::armeb:
437     case llvm::Triple::thumb:
438     case llvm::Triple::thumbeb:
439       Builder.defineMacro("__ARM_DWARF_EH__");
440       break;
441     }
442   }
443 public:
444   NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
445     this->UserLabelPrefix = "";
446     this->MCountName = "_mcount";
447   }
448 };
449 
450 // OpenBSD Target
451 template<typename Target>
452 class OpenBSDTargetInfo : public OSTargetInfo<Target> {
453 protected:
454   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
455                     MacroBuilder &Builder) const override {
456     // OpenBSD defines; list based off of gcc output
457 
458     Builder.defineMacro("__OpenBSD__");
459     DefineStd(Builder, "unix", Opts);
460     Builder.defineMacro("__ELF__");
461     if (Opts.POSIXThreads)
462       Builder.defineMacro("_REENTRANT");
463   }
464 public:
465   OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
466     this->UserLabelPrefix = "";
467     this->TLSSupported = false;
468 
469       switch (Triple.getArch()) {
470         default:
471         case llvm::Triple::x86:
472         case llvm::Triple::x86_64:
473         case llvm::Triple::arm:
474         case llvm::Triple::sparc:
475           this->MCountName = "__mcount";
476           break;
477         case llvm::Triple::mips64:
478         case llvm::Triple::mips64el:
479         case llvm::Triple::ppc:
480         case llvm::Triple::sparcv9:
481           this->MCountName = "_mcount";
482           break;
483       }
484   }
485 };
486 
487 // Bitrig Target
488 template<typename Target>
489 class BitrigTargetInfo : public OSTargetInfo<Target> {
490 protected:
491   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
492                     MacroBuilder &Builder) const override {
493     // Bitrig defines; list based off of gcc output
494 
495     Builder.defineMacro("__Bitrig__");
496     DefineStd(Builder, "unix", Opts);
497     Builder.defineMacro("__ELF__");
498     if (Opts.POSIXThreads)
499       Builder.defineMacro("_REENTRANT");
500 
501     switch (Triple.getArch()) {
502     default:
503       break;
504     case llvm::Triple::arm:
505     case llvm::Triple::armeb:
506     case llvm::Triple::thumb:
507     case llvm::Triple::thumbeb:
508       Builder.defineMacro("__ARM_DWARF_EH__");
509       break;
510     }
511   }
512 public:
513   BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
514     this->UserLabelPrefix = "";
515     this->MCountName = "__mcount";
516   }
517 };
518 
519 // PSP Target
520 template<typename Target>
521 class PSPTargetInfo : public OSTargetInfo<Target> {
522 protected:
523   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
524                     MacroBuilder &Builder) const override {
525     // PSP defines; list based on the output of the pspdev gcc toolchain.
526     Builder.defineMacro("PSP");
527     Builder.defineMacro("_PSP");
528     Builder.defineMacro("__psp__");
529     Builder.defineMacro("__ELF__");
530   }
531 public:
532   PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
533     this->UserLabelPrefix = "";
534   }
535 };
536 
537 // PS3 PPU Target
538 template<typename Target>
539 class PS3PPUTargetInfo : public OSTargetInfo<Target> {
540 protected:
541   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
542                     MacroBuilder &Builder) const override {
543     // PS3 PPU defines.
544     Builder.defineMacro("__PPC__");
545     Builder.defineMacro("__PPU__");
546     Builder.defineMacro("__CELLOS_LV2__");
547     Builder.defineMacro("__ELF__");
548     Builder.defineMacro("__LP32__");
549     Builder.defineMacro("_ARCH_PPC64");
550     Builder.defineMacro("__powerpc64__");
551   }
552 public:
553   PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
554     this->UserLabelPrefix = "";
555     this->LongWidth = this->LongAlign = 32;
556     this->PointerWidth = this->PointerAlign = 32;
557     this->IntMaxType = TargetInfo::SignedLongLong;
558     this->Int64Type = TargetInfo::SignedLongLong;
559     this->SizeType = TargetInfo::UnsignedInt;
560     this->DataLayoutString = "E-m:e-p:32:32-i64:64-n32:64";
561   }
562 };
563 
564 template <typename Target>
565 class PS4OSTargetInfo : public OSTargetInfo<Target> {
566 protected:
567   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
568                     MacroBuilder &Builder) const override {
569     Builder.defineMacro("__FreeBSD__", "9");
570     Builder.defineMacro("__FreeBSD_cc_version", "900001");
571     Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
572     DefineStd(Builder, "unix", Opts);
573     Builder.defineMacro("__ELF__");
574     Builder.defineMacro("__PS4__");
575   }
576 public:
577   PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
578     this->WCharType = this->UnsignedShort;
579 
580     // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
581     this->MaxTLSAlign = 256;
582     this->UserLabelPrefix = "";
583 
584     switch (Triple.getArch()) {
585     default:
586     case llvm::Triple::x86_64:
587       this->MCountName = ".mcount";
588       break;
589     }
590   }
591 };
592 
593 // Solaris target
594 template<typename Target>
595 class SolarisTargetInfo : public OSTargetInfo<Target> {
596 protected:
597   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
598                     MacroBuilder &Builder) const override {
599     DefineStd(Builder, "sun", Opts);
600     DefineStd(Builder, "unix", Opts);
601     Builder.defineMacro("__ELF__");
602     Builder.defineMacro("__svr4__");
603     Builder.defineMacro("__SVR4");
604     // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
605     // newer, but to 500 for everything else.  feature_test.h has a check to
606     // ensure that you are not using C99 with an old version of X/Open or C89
607     // with a new version.
608     if (Opts.C99)
609       Builder.defineMacro("_XOPEN_SOURCE", "600");
610     else
611       Builder.defineMacro("_XOPEN_SOURCE", "500");
612     if (Opts.CPlusPlus)
613       Builder.defineMacro("__C99FEATURES__");
614     Builder.defineMacro("_LARGEFILE_SOURCE");
615     Builder.defineMacro("_LARGEFILE64_SOURCE");
616     Builder.defineMacro("__EXTENSIONS__");
617     Builder.defineMacro("_REENTRANT");
618   }
619 public:
620   SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
621     this->UserLabelPrefix = "";
622     this->WCharType = this->SignedInt;
623     // FIXME: WIntType should be SignedLong
624   }
625 };
626 
627 // Windows target
628 template<typename Target>
629 class WindowsTargetInfo : public OSTargetInfo<Target> {
630 protected:
631   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
632                     MacroBuilder &Builder) const override {
633     Builder.defineMacro("_WIN32");
634   }
635   void getVisualStudioDefines(const LangOptions &Opts,
636                               MacroBuilder &Builder) const {
637     if (Opts.CPlusPlus) {
638       if (Opts.RTTIData)
639         Builder.defineMacro("_CPPRTTI");
640 
641       if (Opts.CXXExceptions)
642         Builder.defineMacro("_CPPUNWIND");
643     }
644 
645     if (Opts.Bool)
646       Builder.defineMacro("__BOOL_DEFINED");
647 
648     if (!Opts.CharIsSigned)
649       Builder.defineMacro("_CHAR_UNSIGNED");
650 
651     // FIXME: POSIXThreads isn't exactly the option this should be defined for,
652     //        but it works for now.
653     if (Opts.POSIXThreads)
654       Builder.defineMacro("_MT");
655 
656     if (Opts.MSCompatibilityVersion) {
657       Builder.defineMacro("_MSC_VER",
658                           Twine(Opts.MSCompatibilityVersion / 100000));
659       Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
660       // FIXME We cannot encode the revision information into 32-bits
661       Builder.defineMacro("_MSC_BUILD", Twine(1));
662 
663       if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
664         Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
665     }
666 
667     if (Opts.MicrosoftExt) {
668       Builder.defineMacro("_MSC_EXTENSIONS");
669 
670       if (Opts.CPlusPlus11) {
671         Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
672         Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
673         Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
674       }
675     }
676 
677     Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
678   }
679 
680 public:
681   WindowsTargetInfo(const llvm::Triple &Triple)
682       : OSTargetInfo<Target>(Triple) {}
683 };
684 
685 template <typename Target>
686 class NaClTargetInfo : public OSTargetInfo<Target> {
687 protected:
688   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
689                     MacroBuilder &Builder) const override {
690     if (Opts.POSIXThreads)
691       Builder.defineMacro("_REENTRANT");
692     if (Opts.CPlusPlus)
693       Builder.defineMacro("_GNU_SOURCE");
694 
695     DefineStd(Builder, "unix", Opts);
696     Builder.defineMacro("__ELF__");
697     Builder.defineMacro("__native_client__");
698   }
699 
700 public:
701   NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
702     this->UserLabelPrefix = "";
703     this->LongAlign = 32;
704     this->LongWidth = 32;
705     this->PointerAlign = 32;
706     this->PointerWidth = 32;
707     this->IntMaxType = TargetInfo::SignedLongLong;
708     this->Int64Type = TargetInfo::SignedLongLong;
709     this->DoubleAlign = 64;
710     this->LongDoubleWidth = 64;
711     this->LongDoubleAlign = 64;
712     this->LongLongWidth = 64;
713     this->LongLongAlign = 64;
714     this->SizeType = TargetInfo::UnsignedInt;
715     this->PtrDiffType = TargetInfo::SignedInt;
716     this->IntPtrType = TargetInfo::SignedInt;
717     // RegParmMax is inherited from the underlying architecture
718     this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
719     if (Triple.getArch() == llvm::Triple::arm) {
720       // Handled in ARM's setABI().
721     } else if (Triple.getArch() == llvm::Triple::x86) {
722       this->DataLayoutString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
723     } else if (Triple.getArch() == llvm::Triple::x86_64) {
724       this->DataLayoutString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
725     } else if (Triple.getArch() == llvm::Triple::mipsel) {
726       // Handled on mips' setDataLayoutString.
727     } else {
728       assert(Triple.getArch() == llvm::Triple::le32);
729       this->DataLayoutString = "e-p:32:32-i64:64";
730     }
731   }
732 };
733 
734 // WebAssembly target
735 template <typename Target>
736 class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
737   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
738                     MacroBuilder &Builder) const final {
739     // A common platform macro.
740     if (Opts.POSIXThreads)
741       Builder.defineMacro("_REENTRANT");
742     // Follow g++ convention and predefine _GNU_SOURCE for C++.
743     if (Opts.CPlusPlus)
744       Builder.defineMacro("_GNU_SOURCE");
745   }
746 
747   // As an optimization, group static init code together in a section.
748   const char *getStaticInitSectionSpecifier() const final {
749     return ".text.__startup";
750   }
751 
752 public:
753   explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple)
754       : OSTargetInfo<Target>(Triple) {
755     this->MCountName = "__mcount";
756     this->UserLabelPrefix = "";
757     this->TheCXXABI.set(TargetCXXABI::WebAssembly);
758   }
759 };
760 
761 //===----------------------------------------------------------------------===//
762 // Specific target implementations.
763 //===----------------------------------------------------------------------===//
764 
765 // PPC abstract base class
766 class PPCTargetInfo : public TargetInfo {
767   static const Builtin::Info BuiltinInfo[];
768   static const char * const GCCRegNames[];
769   static const TargetInfo::GCCRegAlias GCCRegAliases[];
770   std::string CPU;
771 
772   // Target cpu features.
773   bool HasVSX;
774   bool HasP8Vector;
775   bool HasP8Crypto;
776   bool HasDirectMove;
777   bool HasQPX;
778   bool HasHTM;
779   bool HasBPERMD;
780   bool HasExtDiv;
781 
782 protected:
783   std::string ABI;
784 
785 public:
786   PPCTargetInfo(const llvm::Triple &Triple)
787     : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
788       HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
789       HasBPERMD(false), HasExtDiv(false) {
790     BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
791     SimdDefaultAlign = 128;
792     LongDoubleWidth = LongDoubleAlign = 128;
793     LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
794   }
795 
796   /// \brief Flags for architecture specific defines.
797   typedef enum {
798     ArchDefineNone  = 0,
799     ArchDefineName  = 1 << 0, // <name> is substituted for arch name.
800     ArchDefinePpcgr = 1 << 1,
801     ArchDefinePpcsq = 1 << 2,
802     ArchDefine440   = 1 << 3,
803     ArchDefine603   = 1 << 4,
804     ArchDefine604   = 1 << 5,
805     ArchDefinePwr4  = 1 << 6,
806     ArchDefinePwr5  = 1 << 7,
807     ArchDefinePwr5x = 1 << 8,
808     ArchDefinePwr6  = 1 << 9,
809     ArchDefinePwr6x = 1 << 10,
810     ArchDefinePwr7  = 1 << 11,
811     ArchDefinePwr8  = 1 << 12,
812     ArchDefineA2    = 1 << 13,
813     ArchDefineA2q   = 1 << 14
814   } ArchDefineTypes;
815 
816   // Note: GCC recognizes the following additional cpus:
817   //  401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
818   //  821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
819   //  titan, rs64.
820   bool setCPU(const std::string &Name) override {
821     bool CPUKnown = llvm::StringSwitch<bool>(Name)
822       .Case("generic", true)
823       .Case("440", true)
824       .Case("450", true)
825       .Case("601", true)
826       .Case("602", true)
827       .Case("603", true)
828       .Case("603e", true)
829       .Case("603ev", true)
830       .Case("604", true)
831       .Case("604e", true)
832       .Case("620", true)
833       .Case("630", true)
834       .Case("g3", true)
835       .Case("7400", true)
836       .Case("g4", true)
837       .Case("7450", true)
838       .Case("g4+", true)
839       .Case("750", true)
840       .Case("970", true)
841       .Case("g5", true)
842       .Case("a2", true)
843       .Case("a2q", true)
844       .Case("e500mc", true)
845       .Case("e5500", true)
846       .Case("power3", true)
847       .Case("pwr3", true)
848       .Case("power4", true)
849       .Case("pwr4", true)
850       .Case("power5", true)
851       .Case("pwr5", true)
852       .Case("power5x", true)
853       .Case("pwr5x", true)
854       .Case("power6", true)
855       .Case("pwr6", true)
856       .Case("power6x", true)
857       .Case("pwr6x", true)
858       .Case("power7", true)
859       .Case("pwr7", true)
860       .Case("power8", true)
861       .Case("pwr8", true)
862       .Case("powerpc", true)
863       .Case("ppc", true)
864       .Case("powerpc64", true)
865       .Case("ppc64", true)
866       .Case("powerpc64le", true)
867       .Case("ppc64le", true)
868       .Default(false);
869 
870     if (CPUKnown)
871       CPU = Name;
872 
873     return CPUKnown;
874   }
875 
876 
877   StringRef getABI() const override { return ABI; }
878 
879   void getTargetBuiltins(const Builtin::Info *&Records,
880                          unsigned &NumRecords) const override {
881     Records = BuiltinInfo;
882     NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
883   }
884 
885   bool isCLZForZeroUndef() const override { return false; }
886 
887   void getTargetDefines(const LangOptions &Opts,
888                         MacroBuilder &Builder) const override;
889 
890   bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
891                       StringRef CPU,
892                       std::vector<std::string> &FeaturesVec) const override;
893 
894   bool handleTargetFeatures(std::vector<std::string> &Features,
895                             DiagnosticsEngine &Diags) override;
896   bool hasFeature(StringRef Feature) const override;
897   void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
898                          bool Enabled) const override;
899 
900   void getGCCRegNames(const char * const *&Names,
901                       unsigned &NumNames) const override;
902   void getGCCRegAliases(const GCCRegAlias *&Aliases,
903                         unsigned &NumAliases) const override;
904   bool validateAsmConstraint(const char *&Name,
905                              TargetInfo::ConstraintInfo &Info) const override {
906     switch (*Name) {
907     default: return false;
908     case 'O': // Zero
909       break;
910     case 'b': // Base register
911     case 'f': // Floating point register
912       Info.setAllowsRegister();
913       break;
914     // FIXME: The following are added to allow parsing.
915     // I just took a guess at what the actions should be.
916     // Also, is more specific checking needed?  I.e. specific registers?
917     case 'd': // Floating point register (containing 64-bit value)
918     case 'v': // Altivec vector register
919       Info.setAllowsRegister();
920       break;
921     case 'w':
922       switch (Name[1]) {
923         case 'd':// VSX vector register to hold vector double data
924         case 'f':// VSX vector register to hold vector float data
925         case 's':// VSX vector register to hold scalar float data
926         case 'a':// Any VSX register
927         case 'c':// An individual CR bit
928           break;
929         default:
930           return false;
931       }
932       Info.setAllowsRegister();
933       Name++; // Skip over 'w'.
934       break;
935     case 'h': // `MQ', `CTR', or `LINK' register
936     case 'q': // `MQ' register
937     case 'c': // `CTR' register
938     case 'l': // `LINK' register
939     case 'x': // `CR' register (condition register) number 0
940     case 'y': // `CR' register (condition register)
941     case 'z': // `XER[CA]' carry bit (part of the XER register)
942       Info.setAllowsRegister();
943       break;
944     case 'I': // Signed 16-bit constant
945     case 'J': // Unsigned 16-bit constant shifted left 16 bits
946               //  (use `L' instead for SImode constants)
947     case 'K': // Unsigned 16-bit constant
948     case 'L': // Signed 16-bit constant shifted left 16 bits
949     case 'M': // Constant larger than 31
950     case 'N': // Exact power of 2
951     case 'P': // Constant whose negation is a signed 16-bit constant
952     case 'G': // Floating point constant that can be loaded into a
953               // register with one instruction per word
954     case 'H': // Integer/Floating point constant that can be loaded
955               // into a register using three instructions
956       break;
957     case 'm': // Memory operand. Note that on PowerPC targets, m can
958               // include addresses that update the base register. It
959               // is therefore only safe to use `m' in an asm statement
960               // if that asm statement accesses the operand exactly once.
961               // The asm statement must also use `%U<opno>' as a
962               // placeholder for the "update" flag in the corresponding
963               // load or store instruction. For example:
964               // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
965               // is correct but:
966               // asm ("st %1,%0" : "=m" (mem) : "r" (val));
967               // is not. Use es rather than m if you don't want the base
968               // register to be updated.
969     case 'e':
970       if (Name[1] != 's')
971           return false;
972               // es: A "stable" memory operand; that is, one which does not
973               // include any automodification of the base register. Unlike
974               // `m', this constraint can be used in asm statements that
975               // might access the operand several times, or that might not
976               // access it at all.
977       Info.setAllowsMemory();
978       Name++; // Skip over 'e'.
979       break;
980     case 'Q': // Memory operand that is an offset from a register (it is
981               // usually better to use `m' or `es' in asm statements)
982     case 'Z': // Memory operand that is an indexed or indirect from a
983               // register (it is usually better to use `m' or `es' in
984               // asm statements)
985       Info.setAllowsMemory();
986       Info.setAllowsRegister();
987       break;
988     case 'R': // AIX TOC entry
989     case 'a': // Address operand that is an indexed or indirect from a
990               // register (`p' is preferable for asm statements)
991     case 'S': // Constant suitable as a 64-bit mask operand
992     case 'T': // Constant suitable as a 32-bit mask operand
993     case 'U': // System V Release 4 small data area reference
994     case 't': // AND masks that can be performed by two rldic{l, r}
995               // instructions
996     case 'W': // Vector constant that does not require memory
997     case 'j': // Vector constant that is all zeros.
998       break;
999     // End FIXME.
1000     }
1001     return true;
1002   }
1003   std::string convertConstraint(const char *&Constraint) const override {
1004     std::string R;
1005     switch (*Constraint) {
1006     case 'e':
1007     case 'w':
1008       // Two-character constraint; add "^" hint for later parsing.
1009       R = std::string("^") + std::string(Constraint, 2);
1010       Constraint++;
1011       break;
1012     default:
1013       return TargetInfo::convertConstraint(Constraint);
1014     }
1015     return R;
1016   }
1017   const char *getClobbers() const override {
1018     return "";
1019   }
1020   int getEHDataRegisterNumber(unsigned RegNo) const override {
1021     if (RegNo == 0) return 3;
1022     if (RegNo == 1) return 4;
1023     return -1;
1024   }
1025 
1026   bool hasSjLjLowering() const override {
1027     return true;
1028   }
1029 
1030   bool useFloat128ManglingForLongDouble() const override {
1031     return LongDoubleWidth == 128 &&
1032            LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1033            getTriple().isOSBinFormatELF();
1034   }
1035 };
1036 
1037 const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
1038 #define BUILTIN(ID, TYPE, ATTRS) \
1039   { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1040 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1041   { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1042 #include "clang/Basic/BuiltinsPPC.def"
1043 };
1044 
1045 /// handleTargetFeatures - Perform initialization based on the user
1046 /// configured set of features.
1047 bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
1048                                          DiagnosticsEngine &Diags) {
1049   for (const auto &Feature : Features) {
1050     if (Feature == "+vsx") {
1051       HasVSX = true;
1052     } else if (Feature == "+bpermd") {
1053       HasBPERMD = true;
1054     } else if (Feature == "+extdiv") {
1055       HasExtDiv = true;
1056     } else if (Feature == "+power8-vector") {
1057       HasP8Vector = true;
1058     } else if (Feature == "+crypto") {
1059       HasP8Crypto = true;
1060     } else if (Feature == "+direct-move") {
1061       HasDirectMove = true;
1062     } else if (Feature == "+qpx") {
1063       HasQPX = true;
1064     } else if (Feature == "+htm") {
1065       HasHTM = true;
1066     }
1067     // TODO: Finish this list and add an assert that we've handled them
1068     // all.
1069   }
1070 
1071   return true;
1072 }
1073 
1074 /// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1075 /// #defines that are not tied to a specific subtarget.
1076 void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
1077                                      MacroBuilder &Builder) const {
1078   // Target identification.
1079   Builder.defineMacro("__ppc__");
1080   Builder.defineMacro("__PPC__");
1081   Builder.defineMacro("_ARCH_PPC");
1082   Builder.defineMacro("__powerpc__");
1083   Builder.defineMacro("__POWERPC__");
1084   if (PointerWidth == 64) {
1085     Builder.defineMacro("_ARCH_PPC64");
1086     Builder.defineMacro("__powerpc64__");
1087     Builder.defineMacro("__ppc64__");
1088     Builder.defineMacro("__PPC64__");
1089   }
1090 
1091   // Target properties.
1092   if (getTriple().getArch() == llvm::Triple::ppc64le) {
1093     Builder.defineMacro("_LITTLE_ENDIAN");
1094   } else {
1095     if (getTriple().getOS() != llvm::Triple::NetBSD &&
1096         getTriple().getOS() != llvm::Triple::OpenBSD)
1097       Builder.defineMacro("_BIG_ENDIAN");
1098   }
1099 
1100   // ABI options.
1101   if (ABI == "elfv1" || ABI == "elfv1-qpx")
1102     Builder.defineMacro("_CALL_ELF", "1");
1103   if (ABI == "elfv2")
1104     Builder.defineMacro("_CALL_ELF", "2");
1105 
1106   // Subtarget options.
1107   Builder.defineMacro("__NATURAL_ALIGNMENT__");
1108   Builder.defineMacro("__REGISTER_PREFIX__", "");
1109 
1110   // FIXME: Should be controlled by command line option.
1111   if (LongDoubleWidth == 128)
1112     Builder.defineMacro("__LONG_DOUBLE_128__");
1113 
1114   if (Opts.AltiVec) {
1115     Builder.defineMacro("__VEC__", "10206");
1116     Builder.defineMacro("__ALTIVEC__");
1117   }
1118 
1119   // CPU identification.
1120   ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1121     .Case("440",   ArchDefineName)
1122     .Case("450",   ArchDefineName | ArchDefine440)
1123     .Case("601",   ArchDefineName)
1124     .Case("602",   ArchDefineName | ArchDefinePpcgr)
1125     .Case("603",   ArchDefineName | ArchDefinePpcgr)
1126     .Case("603e",  ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1127     .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1128     .Case("604",   ArchDefineName | ArchDefinePpcgr)
1129     .Case("604e",  ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1130     .Case("620",   ArchDefineName | ArchDefinePpcgr)
1131     .Case("630",   ArchDefineName | ArchDefinePpcgr)
1132     .Case("7400",  ArchDefineName | ArchDefinePpcgr)
1133     .Case("7450",  ArchDefineName | ArchDefinePpcgr)
1134     .Case("750",   ArchDefineName | ArchDefinePpcgr)
1135     .Case("970",   ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1136                      | ArchDefinePpcsq)
1137     .Case("a2",    ArchDefineA2)
1138     .Case("a2q",   ArchDefineName | ArchDefineA2 | ArchDefineA2q)
1139     .Case("pwr3",  ArchDefinePpcgr)
1140     .Case("pwr4",  ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1141     .Case("pwr5",  ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1142                      | ArchDefinePpcsq)
1143     .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1144                      | ArchDefinePpcgr | ArchDefinePpcsq)
1145     .Case("pwr6",  ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1146                      | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1147     .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1148                      | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1149                      | ArchDefinePpcsq)
1150     .Case("pwr7",  ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1151                      | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1152                      | ArchDefinePpcgr | ArchDefinePpcsq)
1153     .Case("pwr8",  ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1154                      | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1155                      | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1156     .Case("power3",  ArchDefinePpcgr)
1157     .Case("power4",  ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1158     .Case("power5",  ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1159                        | ArchDefinePpcsq)
1160     .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1161                        | ArchDefinePpcgr | ArchDefinePpcsq)
1162     .Case("power6",  ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1163                        | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1164     .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1165                        | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1166                        | ArchDefinePpcsq)
1167     .Case("power7",  ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1168                        | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1169                        | ArchDefinePpcgr | ArchDefinePpcsq)
1170     .Case("power8",  ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1171                        | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1172                        | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1173     .Default(ArchDefineNone);
1174 
1175   if (defs & ArchDefineName)
1176     Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1177   if (defs & ArchDefinePpcgr)
1178     Builder.defineMacro("_ARCH_PPCGR");
1179   if (defs & ArchDefinePpcsq)
1180     Builder.defineMacro("_ARCH_PPCSQ");
1181   if (defs & ArchDefine440)
1182     Builder.defineMacro("_ARCH_440");
1183   if (defs & ArchDefine603)
1184     Builder.defineMacro("_ARCH_603");
1185   if (defs & ArchDefine604)
1186     Builder.defineMacro("_ARCH_604");
1187   if (defs & ArchDefinePwr4)
1188     Builder.defineMacro("_ARCH_PWR4");
1189   if (defs & ArchDefinePwr5)
1190     Builder.defineMacro("_ARCH_PWR5");
1191   if (defs & ArchDefinePwr5x)
1192     Builder.defineMacro("_ARCH_PWR5X");
1193   if (defs & ArchDefinePwr6)
1194     Builder.defineMacro("_ARCH_PWR6");
1195   if (defs & ArchDefinePwr6x)
1196     Builder.defineMacro("_ARCH_PWR6X");
1197   if (defs & ArchDefinePwr7)
1198     Builder.defineMacro("_ARCH_PWR7");
1199   if (defs & ArchDefinePwr8)
1200     Builder.defineMacro("_ARCH_PWR8");
1201   if (defs & ArchDefineA2)
1202     Builder.defineMacro("_ARCH_A2");
1203   if (defs & ArchDefineA2q) {
1204     Builder.defineMacro("_ARCH_A2Q");
1205     Builder.defineMacro("_ARCH_QP");
1206   }
1207 
1208   if (getTriple().getVendor() == llvm::Triple::BGQ) {
1209     Builder.defineMacro("__bg__");
1210     Builder.defineMacro("__THW_BLUEGENE__");
1211     Builder.defineMacro("__bgq__");
1212     Builder.defineMacro("__TOS_BGQ__");
1213   }
1214 
1215   if (HasVSX)
1216     Builder.defineMacro("__VSX__");
1217   if (HasP8Vector)
1218     Builder.defineMacro("__POWER8_VECTOR__");
1219   if (HasP8Crypto)
1220     Builder.defineMacro("__CRYPTO__");
1221   if (HasHTM)
1222     Builder.defineMacro("__HTM__");
1223 
1224   Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1225   Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1226   Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1227   if (PointerWidth == 64)
1228     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
1229 
1230   // FIXME: The following are not yet generated here by Clang, but are
1231   //        generated by GCC:
1232   //
1233   //   _SOFT_FLOAT_
1234   //   __RECIP_PRECISION__
1235   //   __APPLE_ALTIVEC__
1236   //   __RECIP__
1237   //   __RECIPF__
1238   //   __RSQRTE__
1239   //   __RSQRTEF__
1240   //   _SOFT_DOUBLE_
1241   //   __NO_LWSYNC__
1242   //   __HAVE_BSWAP__
1243   //   __LONGDOUBLE128
1244   //   __CMODEL_MEDIUM__
1245   //   __CMODEL_LARGE__
1246   //   _CALL_SYSV
1247   //   _CALL_DARWIN
1248   //   __NO_FPRS__
1249 }
1250 
1251 // Handle explicit options being passed to the compiler here: if we've
1252 // explicitly turned off vsx and turned on power8-vector or direct-move then
1253 // go ahead and error since the customer has expressed a somewhat incompatible
1254 // set of options.
1255 static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
1256                                  std::vector<std::string> &FeaturesVec) {
1257 
1258   if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1259       FeaturesVec.end()) {
1260     if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1261         FeaturesVec.end()) {
1262       Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1263                                                      << "-mno-vsx";
1264       return false;
1265     }
1266 
1267     if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1268         FeaturesVec.end()) {
1269       Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1270                                                      << "-mno-vsx";
1271       return false;
1272     }
1273   }
1274 
1275   return true;
1276 }
1277 
1278 bool PPCTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
1279                                    DiagnosticsEngine &Diags, StringRef CPU,
1280                                    std::vector<std::string> &FeaturesVec) const {
1281   Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1282     .Case("7400", true)
1283     .Case("g4", true)
1284     .Case("7450", true)
1285     .Case("g4+", true)
1286     .Case("970", true)
1287     .Case("g5", true)
1288     .Case("pwr6", true)
1289     .Case("pwr7", true)
1290     .Case("pwr8", true)
1291     .Case("ppc64", true)
1292     .Case("ppc64le", true)
1293     .Default(false);
1294 
1295   Features["qpx"] = (CPU == "a2q");
1296   Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1297     .Case("ppc64le", true)
1298     .Case("pwr8", true)
1299     .Default(false);
1300   Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1301     .Case("ppc64le", true)
1302     .Case("pwr8", true)
1303     .Default(false);
1304   Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1305     .Case("ppc64le", true)
1306     .Case("pwr8", true)
1307     .Case("pwr7", true)
1308     .Default(false);
1309   Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1310     .Case("ppc64le", true)
1311     .Case("pwr8", true)
1312     .Case("pwr7", true)
1313     .Default(false);
1314   Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1315     .Case("ppc64le", true)
1316     .Case("pwr8", true)
1317     .Default(false);
1318   Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1319     .Case("ppc64le", true)
1320     .Case("pwr8", true)
1321     .Case("pwr7", true)
1322     .Default(false);
1323 
1324   if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1325     return false;
1326 
1327   return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
1328 }
1329 
1330 bool PPCTargetInfo::hasFeature(StringRef Feature) const {
1331   return llvm::StringSwitch<bool>(Feature)
1332     .Case("powerpc", true)
1333     .Case("vsx", HasVSX)
1334     .Case("power8-vector", HasP8Vector)
1335     .Case("crypto", HasP8Crypto)
1336     .Case("direct-move", HasDirectMove)
1337     .Case("qpx", HasQPX)
1338     .Case("htm", HasHTM)
1339     .Case("bpermd", HasBPERMD)
1340     .Case("extdiv", HasExtDiv)
1341     .Default(false);
1342 }
1343 
1344 void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1345                                       StringRef Name, bool Enabled) const {
1346   // If we're enabling direct-move or power8-vector go ahead and enable vsx
1347   // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1348   // incompatible options.
1349   if (Enabled) {
1350     if (Name == "vsx") {
1351      Features[Name] = true;
1352     } else if (Name == "direct-move") {
1353       Features[Name] = Features["vsx"] = true;
1354     } else if (Name == "power8-vector") {
1355       Features[Name] = Features["vsx"] = true;
1356     } else {
1357       Features[Name] = true;
1358     }
1359   } else {
1360     if (Name == "vsx") {
1361       Features[Name] = Features["direct-move"] = Features["power8-vector"] =
1362           false;
1363     } else {
1364       Features[Name] = false;
1365     }
1366   }
1367 }
1368 
1369 const char * const PPCTargetInfo::GCCRegNames[] = {
1370   "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1371   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1372   "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1373   "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1374   "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1375   "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1376   "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1377   "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
1378   "mq", "lr", "ctr", "ap",
1379   "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
1380   "xer",
1381   "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1382   "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1383   "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1384   "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1385   "vrsave", "vscr",
1386   "spe_acc", "spefscr",
1387   "sfp"
1388 };
1389 
1390 void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
1391                                    unsigned &NumNames) const {
1392   Names = GCCRegNames;
1393   NumNames = llvm::array_lengthof(GCCRegNames);
1394 }
1395 
1396 const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1397   // While some of these aliases do map to different registers
1398   // they still share the same register name.
1399   { { "0" }, "r0" },
1400   { { "1"}, "r1" },
1401   { { "2" }, "r2" },
1402   { { "3" }, "r3" },
1403   { { "4" }, "r4" },
1404   { { "5" }, "r5" },
1405   { { "6" }, "r6" },
1406   { { "7" }, "r7" },
1407   { { "8" }, "r8" },
1408   { { "9" }, "r9" },
1409   { { "10" }, "r10" },
1410   { { "11" }, "r11" },
1411   { { "12" }, "r12" },
1412   { { "13" }, "r13" },
1413   { { "14" }, "r14" },
1414   { { "15" }, "r15" },
1415   { { "16" }, "r16" },
1416   { { "17" }, "r17" },
1417   { { "18" }, "r18" },
1418   { { "19" }, "r19" },
1419   { { "20" }, "r20" },
1420   { { "21" }, "r21" },
1421   { { "22" }, "r22" },
1422   { { "23" }, "r23" },
1423   { { "24" }, "r24" },
1424   { { "25" }, "r25" },
1425   { { "26" }, "r26" },
1426   { { "27" }, "r27" },
1427   { { "28" }, "r28" },
1428   { { "29" }, "r29" },
1429   { { "30" }, "r30" },
1430   { { "31" }, "r31" },
1431   { { "fr0" }, "f0" },
1432   { { "fr1" }, "f1" },
1433   { { "fr2" }, "f2" },
1434   { { "fr3" }, "f3" },
1435   { { "fr4" }, "f4" },
1436   { { "fr5" }, "f5" },
1437   { { "fr6" }, "f6" },
1438   { { "fr7" }, "f7" },
1439   { { "fr8" }, "f8" },
1440   { { "fr9" }, "f9" },
1441   { { "fr10" }, "f10" },
1442   { { "fr11" }, "f11" },
1443   { { "fr12" }, "f12" },
1444   { { "fr13" }, "f13" },
1445   { { "fr14" }, "f14" },
1446   { { "fr15" }, "f15" },
1447   { { "fr16" }, "f16" },
1448   { { "fr17" }, "f17" },
1449   { { "fr18" }, "f18" },
1450   { { "fr19" }, "f19" },
1451   { { "fr20" }, "f20" },
1452   { { "fr21" }, "f21" },
1453   { { "fr22" }, "f22" },
1454   { { "fr23" }, "f23" },
1455   { { "fr24" }, "f24" },
1456   { { "fr25" }, "f25" },
1457   { { "fr26" }, "f26" },
1458   { { "fr27" }, "f27" },
1459   { { "fr28" }, "f28" },
1460   { { "fr29" }, "f29" },
1461   { { "fr30" }, "f30" },
1462   { { "fr31" }, "f31" },
1463   { { "cc" }, "cr0" },
1464 };
1465 
1466 void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1467                                      unsigned &NumAliases) const {
1468   Aliases = GCCRegAliases;
1469   NumAliases = llvm::array_lengthof(GCCRegAliases);
1470 }
1471 
1472 class PPC32TargetInfo : public PPCTargetInfo {
1473 public:
1474   PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
1475     DataLayoutString = "E-m:e-p:32:32-i64:64-n32";
1476 
1477     switch (getTriple().getOS()) {
1478     case llvm::Triple::Linux:
1479     case llvm::Triple::FreeBSD:
1480     case llvm::Triple::NetBSD:
1481       SizeType = UnsignedInt;
1482       PtrDiffType = SignedInt;
1483       IntPtrType = SignedInt;
1484       break;
1485     default:
1486       break;
1487     }
1488 
1489     if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1490       LongDoubleWidth = LongDoubleAlign = 64;
1491       LongDoubleFormat = &llvm::APFloat::IEEEdouble;
1492     }
1493 
1494     // PPC32 supports atomics up to 4 bytes.
1495     MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
1496   }
1497 
1498   BuiltinVaListKind getBuiltinVaListKind() const override {
1499     // This is the ELF definition, and is overridden by the Darwin sub-target
1500     return TargetInfo::PowerABIBuiltinVaList;
1501   }
1502 };
1503 
1504 // Note: ABI differences may eventually require us to have a separate
1505 // TargetInfo for little endian.
1506 class PPC64TargetInfo : public PPCTargetInfo {
1507 public:
1508   PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
1509     LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
1510     IntMaxType = SignedLong;
1511     Int64Type = SignedLong;
1512 
1513     if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1514       DataLayoutString = "e-m:e-i64:64-n32:64";
1515       ABI = "elfv2";
1516     } else {
1517       DataLayoutString = "E-m:e-i64:64-n32:64";
1518       ABI = "elfv1";
1519     }
1520 
1521     switch (getTriple().getOS()) {
1522     case llvm::Triple::FreeBSD:
1523       LongDoubleWidth = LongDoubleAlign = 64;
1524       LongDoubleFormat = &llvm::APFloat::IEEEdouble;
1525       break;
1526     case llvm::Triple::NetBSD:
1527       IntMaxType = SignedLongLong;
1528       Int64Type = SignedLongLong;
1529       break;
1530     default:
1531       break;
1532     }
1533 
1534     // PPC64 supports atomics up to 8 bytes.
1535     MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
1536   }
1537   BuiltinVaListKind getBuiltinVaListKind() const override {
1538     return TargetInfo::CharPtrBuiltinVaList;
1539   }
1540   // PPC64 Linux-specific ABI options.
1541   bool setABI(const std::string &Name) override {
1542     if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
1543       ABI = Name;
1544       return true;
1545     }
1546     return false;
1547   }
1548 };
1549 
1550 class DarwinPPC32TargetInfo :
1551   public DarwinTargetInfo<PPC32TargetInfo> {
1552 public:
1553   DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1554       : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
1555     HasAlignMac68kSupport = true;
1556     BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
1557     PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
1558     LongLongAlign = 32;
1559     SuitableAlign = 128;
1560     DataLayoutString = "E-m:o-p:32:32-f64:32:64-n32";
1561   }
1562   BuiltinVaListKind getBuiltinVaListKind() const override {
1563     return TargetInfo::CharPtrBuiltinVaList;
1564   }
1565 };
1566 
1567 class DarwinPPC64TargetInfo :
1568   public DarwinTargetInfo<PPC64TargetInfo> {
1569 public:
1570   DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1571       : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
1572     HasAlignMac68kSupport = true;
1573     SuitableAlign = 128;
1574     DataLayoutString = "E-m:o-i64:64-n32:64";
1575   }
1576 };
1577 
1578 static const unsigned NVPTXAddrSpaceMap[] = {
1579     1, // opencl_global
1580     3, // opencl_local
1581     4, // opencl_constant
1582     // FIXME: generic has to be added to the target
1583     0, // opencl_generic
1584     1, // cuda_device
1585     4, // cuda_constant
1586     3, // cuda_shared
1587 };
1588 
1589 class NVPTXTargetInfo : public TargetInfo {
1590   static const char *const GCCRegNames[];
1591   static const Builtin::Info BuiltinInfo[];
1592 
1593   // The GPU profiles supported by the NVPTX backend
1594   enum GPUKind {
1595     GK_NONE,
1596     GK_SM20,
1597     GK_SM21,
1598     GK_SM30,
1599     GK_SM35,
1600     GK_SM37,
1601   } GPU;
1602 
1603 public:
1604   NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
1605     BigEndian = false;
1606     TLSSupported = false;
1607     LongWidth = LongAlign = 64;
1608     AddrSpaceMap = &NVPTXAddrSpaceMap;
1609     UseAddrSpaceMapMangling = true;
1610     // Define available target features
1611     // These must be defined in sorted order!
1612     NoAsmVariants = true;
1613     // Set the default GPU to sm20
1614     GPU = GK_SM20;
1615   }
1616   void getTargetDefines(const LangOptions &Opts,
1617                         MacroBuilder &Builder) const override {
1618     Builder.defineMacro("__PTX__");
1619     Builder.defineMacro("__NVPTX__");
1620     if (Opts.CUDAIsDevice) {
1621       // Set __CUDA_ARCH__ for the GPU specified.
1622       std::string CUDAArchCode;
1623       switch (GPU) {
1624       case GK_SM20:
1625         CUDAArchCode = "200";
1626         break;
1627       case GK_SM21:
1628         CUDAArchCode = "210";
1629         break;
1630       case GK_SM30:
1631         CUDAArchCode = "300";
1632         break;
1633       case GK_SM35:
1634         CUDAArchCode = "350";
1635         break;
1636       case GK_SM37:
1637         CUDAArchCode = "370";
1638         break;
1639       default:
1640         llvm_unreachable("Unhandled target CPU");
1641       }
1642       Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
1643     }
1644   }
1645   void getTargetBuiltins(const Builtin::Info *&Records,
1646                          unsigned &NumRecords) const override {
1647     Records = BuiltinInfo;
1648     NumRecords = clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin;
1649   }
1650   bool hasFeature(StringRef Feature) const override {
1651     return Feature == "ptx" || Feature == "nvptx";
1652   }
1653 
1654   void getGCCRegNames(const char *const *&Names,
1655                       unsigned &NumNames) const override;
1656   void getGCCRegAliases(const GCCRegAlias *&Aliases,
1657                         unsigned &NumAliases) const override {
1658     // No aliases.
1659     Aliases = nullptr;
1660     NumAliases = 0;
1661   }
1662   bool validateAsmConstraint(const char *&Name,
1663                              TargetInfo::ConstraintInfo &Info) const override {
1664     switch (*Name) {
1665     default:
1666       return false;
1667     case 'c':
1668     case 'h':
1669     case 'r':
1670     case 'l':
1671     case 'f':
1672     case 'd':
1673       Info.setAllowsRegister();
1674       return true;
1675     }
1676   }
1677   const char *getClobbers() const override {
1678     // FIXME: Is this really right?
1679     return "";
1680   }
1681   BuiltinVaListKind getBuiltinVaListKind() const override {
1682     // FIXME: implement
1683     return TargetInfo::CharPtrBuiltinVaList;
1684   }
1685   bool setCPU(const std::string &Name) override {
1686     GPU = llvm::StringSwitch<GPUKind>(Name)
1687               .Case("sm_20", GK_SM20)
1688               .Case("sm_21", GK_SM21)
1689               .Case("sm_30", GK_SM30)
1690               .Case("sm_35", GK_SM35)
1691               .Case("sm_37", GK_SM37)
1692               .Default(GK_NONE);
1693 
1694     return GPU != GK_NONE;
1695   }
1696 };
1697 
1698 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1699 #define BUILTIN(ID, TYPE, ATTRS)                                               \
1700   { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1701 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER)                                    \
1702   { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1703 #include "clang/Basic/BuiltinsNVPTX.def"
1704 };
1705 
1706 const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1707 
1708 void NVPTXTargetInfo::getGCCRegNames(const char *const *&Names,
1709                                      unsigned &NumNames) const {
1710   Names = GCCRegNames;
1711   NumNames = llvm::array_lengthof(GCCRegNames);
1712 }
1713 
1714 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1715 public:
1716   NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
1717     LongWidth = LongAlign = 32;
1718     PointerWidth = PointerAlign = 32;
1719     SizeType = TargetInfo::UnsignedInt;
1720     PtrDiffType = TargetInfo::SignedInt;
1721     IntPtrType = TargetInfo::SignedInt;
1722     DataLayoutString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
1723   }
1724 };
1725 
1726 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1727 public:
1728   NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
1729     PointerWidth = PointerAlign = 64;
1730     SizeType = TargetInfo::UnsignedLong;
1731     PtrDiffType = TargetInfo::SignedLong;
1732     IntPtrType = TargetInfo::SignedLong;
1733     DataLayoutString = "e-i64:64-v16:16-v32:32-n16:32:64";
1734   }
1735 };
1736 
1737 static const unsigned AMDGPUAddrSpaceMap[] = {
1738   1,    // opencl_global
1739   3,    // opencl_local
1740   2,    // opencl_constant
1741   4,    // opencl_generic
1742   1,    // cuda_device
1743   2,    // cuda_constant
1744   3     // cuda_shared
1745 };
1746 
1747 // If you edit the description strings, make sure you update
1748 // getPointerWidthV().
1749 
1750 static const char *DataLayoutStringR600 =
1751   "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1752   "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
1753 
1754 static const char *DataLayoutStringR600DoubleOps =
1755   "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1756   "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
1757 
1758 static const char *DataLayoutStringSI =
1759   "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32-p24:64:64"
1760   "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1761   "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
1762 
1763 class AMDGPUTargetInfo : public TargetInfo {
1764   static const Builtin::Info BuiltinInfo[];
1765   static const char * const GCCRegNames[];
1766 
1767   /// \brief The GPU profiles supported by the AMDGPU target.
1768   enum GPUKind {
1769     GK_NONE,
1770     GK_R600,
1771     GK_R600_DOUBLE_OPS,
1772     GK_R700,
1773     GK_R700_DOUBLE_OPS,
1774     GK_EVERGREEN,
1775     GK_EVERGREEN_DOUBLE_OPS,
1776     GK_NORTHERN_ISLANDS,
1777     GK_CAYMAN,
1778     GK_SOUTHERN_ISLANDS,
1779     GK_SEA_ISLANDS,
1780     GK_VOLCANIC_ISLANDS
1781   } GPU;
1782 
1783   bool hasFP64:1;
1784   bool hasFMAF:1;
1785   bool hasLDEXPF:1;
1786 
1787 public:
1788   AMDGPUTargetInfo(const llvm::Triple &Triple)
1789     : TargetInfo(Triple) {
1790 
1791     if (Triple.getArch() == llvm::Triple::amdgcn) {
1792       DataLayoutString = DataLayoutStringSI;
1793       GPU = GK_SOUTHERN_ISLANDS;
1794       hasFP64 = true;
1795       hasFMAF = true;
1796       hasLDEXPF = true;
1797     } else {
1798       DataLayoutString = DataLayoutStringR600;
1799       GPU = GK_R600;
1800       hasFP64 = false;
1801       hasFMAF = false;
1802       hasLDEXPF = false;
1803     }
1804     AddrSpaceMap = &AMDGPUAddrSpaceMap;
1805     UseAddrSpaceMapMangling = true;
1806   }
1807 
1808   uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1809     if (GPU <= GK_CAYMAN)
1810       return 32;
1811 
1812     switch(AddrSpace) {
1813       default:
1814         return 64;
1815       case 0:
1816       case 3:
1817       case 5:
1818         return 32;
1819     }
1820   }
1821 
1822   const char * getClobbers() const override {
1823     return "";
1824   }
1825 
1826   void getGCCRegNames(const char * const *&Names,
1827                       unsigned &NumNames) const override;
1828 
1829   void getGCCRegAliases(const GCCRegAlias *&Aliases,
1830                         unsigned &NumAliases) const override {
1831     Aliases = nullptr;
1832     NumAliases = 0;
1833   }
1834 
1835   bool validateAsmConstraint(const char *&Name,
1836                              TargetInfo::ConstraintInfo &info) const override {
1837     return true;
1838   }
1839 
1840   void getTargetBuiltins(const Builtin::Info *&Records,
1841                          unsigned &NumRecords) const override {
1842     Records = BuiltinInfo;
1843     NumRecords = clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin;
1844   }
1845 
1846   void getTargetDefines(const LangOptions &Opts,
1847                         MacroBuilder &Builder) const override {
1848     Builder.defineMacro("__R600__");
1849     if (hasFMAF)
1850       Builder.defineMacro("__HAS_FMAF__");
1851     if (hasLDEXPF)
1852       Builder.defineMacro("__HAS_LDEXPF__");
1853     if (hasFP64 && Opts.OpenCL)
1854       Builder.defineMacro("cl_khr_fp64");
1855     if (Opts.OpenCL) {
1856       if (GPU >= GK_NORTHERN_ISLANDS) {
1857         Builder.defineMacro("cl_khr_byte_addressable_store");
1858         Builder.defineMacro("cl_khr_global_int32_base_atomics");
1859         Builder.defineMacro("cl_khr_global_int32_extended_atomics");
1860         Builder.defineMacro("cl_khr_local_int32_base_atomics");
1861         Builder.defineMacro("cl_khr_local_int32_extended_atomics");
1862       }
1863     }
1864   }
1865 
1866   BuiltinVaListKind getBuiltinVaListKind() const override {
1867     return TargetInfo::CharPtrBuiltinVaList;
1868   }
1869 
1870   bool setCPU(const std::string &Name) override {
1871     GPU = llvm::StringSwitch<GPUKind>(Name)
1872       .Case("r600" ,    GK_R600)
1873       .Case("rv610",    GK_R600)
1874       .Case("rv620",    GK_R600)
1875       .Case("rv630",    GK_R600)
1876       .Case("rv635",    GK_R600)
1877       .Case("rs780",    GK_R600)
1878       .Case("rs880",    GK_R600)
1879       .Case("rv670",    GK_R600_DOUBLE_OPS)
1880       .Case("rv710",    GK_R700)
1881       .Case("rv730",    GK_R700)
1882       .Case("rv740",    GK_R700_DOUBLE_OPS)
1883       .Case("rv770",    GK_R700_DOUBLE_OPS)
1884       .Case("palm",     GK_EVERGREEN)
1885       .Case("cedar",    GK_EVERGREEN)
1886       .Case("sumo",     GK_EVERGREEN)
1887       .Case("sumo2",    GK_EVERGREEN)
1888       .Case("redwood",  GK_EVERGREEN)
1889       .Case("juniper",  GK_EVERGREEN)
1890       .Case("hemlock",  GK_EVERGREEN_DOUBLE_OPS)
1891       .Case("cypress",  GK_EVERGREEN_DOUBLE_OPS)
1892       .Case("barts",    GK_NORTHERN_ISLANDS)
1893       .Case("turks",    GK_NORTHERN_ISLANDS)
1894       .Case("caicos",   GK_NORTHERN_ISLANDS)
1895       .Case("cayman",   GK_CAYMAN)
1896       .Case("aruba",    GK_CAYMAN)
1897       .Case("tahiti",   GK_SOUTHERN_ISLANDS)
1898       .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1899       .Case("verde",    GK_SOUTHERN_ISLANDS)
1900       .Case("oland",    GK_SOUTHERN_ISLANDS)
1901       .Case("hainan",   GK_SOUTHERN_ISLANDS)
1902       .Case("bonaire",  GK_SEA_ISLANDS)
1903       .Case("kabini",   GK_SEA_ISLANDS)
1904       .Case("kaveri",   GK_SEA_ISLANDS)
1905       .Case("hawaii",   GK_SEA_ISLANDS)
1906       .Case("mullins",  GK_SEA_ISLANDS)
1907       .Case("tonga",    GK_VOLCANIC_ISLANDS)
1908       .Case("iceland",  GK_VOLCANIC_ISLANDS)
1909       .Case("carrizo",  GK_VOLCANIC_ISLANDS)
1910       .Default(GK_NONE);
1911 
1912     if (GPU == GK_NONE) {
1913       return false;
1914     }
1915 
1916     // Set the correct data layout
1917     switch (GPU) {
1918     case GK_NONE:
1919     case GK_R600:
1920     case GK_R700:
1921     case GK_EVERGREEN:
1922     case GK_NORTHERN_ISLANDS:
1923       DataLayoutString = DataLayoutStringR600;
1924       hasFP64 = false;
1925       hasFMAF = false;
1926       hasLDEXPF = false;
1927       break;
1928     case GK_R600_DOUBLE_OPS:
1929     case GK_R700_DOUBLE_OPS:
1930     case GK_EVERGREEN_DOUBLE_OPS:
1931     case GK_CAYMAN:
1932       DataLayoutString = DataLayoutStringR600DoubleOps;
1933       hasFP64 = true;
1934       hasFMAF = true;
1935       hasLDEXPF = false;
1936       break;
1937     case GK_SOUTHERN_ISLANDS:
1938     case GK_SEA_ISLANDS:
1939     case GK_VOLCANIC_ISLANDS:
1940       DataLayoutString = DataLayoutStringSI;
1941       hasFP64 = true;
1942       hasFMAF = true;
1943       hasLDEXPF = true;
1944       break;
1945     }
1946 
1947     return true;
1948   }
1949 };
1950 
1951 const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
1952 #define BUILTIN(ID, TYPE, ATTRS)                \
1953   { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1954 #include "clang/Basic/BuiltinsAMDGPU.def"
1955 };
1956 const char * const AMDGPUTargetInfo::GCCRegNames[] = {
1957   "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1958   "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1959   "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1960   "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1961   "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
1962   "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
1963   "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
1964   "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
1965   "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
1966   "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
1967   "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
1968   "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
1969   "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
1970   "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
1971   "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
1972   "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
1973   "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
1974   "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
1975   "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
1976   "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
1977   "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
1978   "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
1979   "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
1980   "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
1981   "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
1982   "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
1983   "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
1984   "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
1985   "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
1986   "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
1987   "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
1988   "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
1989   "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1990   "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1991   "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
1992   "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
1993   "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
1994   "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
1995   "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
1996   "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
1997   "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
1998   "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
1999   "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2000   "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2001   "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2002   "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2003   "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
2004   "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127"
2005   "exec", "vcc", "scc", "m0", "flat_scr", "exec_lo", "exec_hi",
2006   "vcc_lo", "vcc_hi", "flat_scr_lo", "flat_scr_hi"
2007 };
2008 
2009 void AMDGPUTargetInfo::getGCCRegNames(const char * const *&Names,
2010                                       unsigned &NumNames) const {
2011   Names = GCCRegNames;
2012   NumNames = llvm::array_lengthof(GCCRegNames);
2013 }
2014 
2015 // Namespace for x86 abstract base class
2016 const Builtin::Info BuiltinInfo[] = {
2017 #define BUILTIN(ID, TYPE, ATTRS)                                               \
2018   { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
2019 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER)                                    \
2020   { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
2021 #define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE)                               \
2022   { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
2023 #include "clang/Basic/BuiltinsX86.def"
2024 };
2025 
2026 static const char* const GCCRegNames[] = {
2027   "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2028   "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
2029   "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
2030   "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2031   "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2032   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
2033   "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
2034   "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2035   "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
2036 };
2037 
2038 const TargetInfo::AddlRegName AddlRegNames[] = {
2039   { { "al", "ah", "eax", "rax" }, 0 },
2040   { { "bl", "bh", "ebx", "rbx" }, 3 },
2041   { { "cl", "ch", "ecx", "rcx" }, 2 },
2042   { { "dl", "dh", "edx", "rdx" }, 1 },
2043   { { "esi", "rsi" }, 4 },
2044   { { "edi", "rdi" }, 5 },
2045   { { "esp", "rsp" }, 7 },
2046   { { "ebp", "rbp" }, 6 },
2047   { { "r8d", "r8w", "r8b" }, 38 },
2048   { { "r9d", "r9w", "r9b" }, 39 },
2049   { { "r10d", "r10w", "r10b" }, 40 },
2050   { { "r11d", "r11w", "r11b" }, 41 },
2051   { { "r12d", "r12w", "r12b" }, 42 },
2052   { { "r13d", "r13w", "r13b" }, 43 },
2053   { { "r14d", "r14w", "r14b" }, 44 },
2054   { { "r15d", "r15w", "r15b" }, 45 },
2055 };
2056 
2057 // X86 target abstract base class; x86-32 and x86-64 are very close, so
2058 // most of the implementation can be shared.
2059 class X86TargetInfo : public TargetInfo {
2060   enum X86SSEEnum {
2061     NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
2062   } SSELevel;
2063   enum MMX3DNowEnum {
2064     NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
2065   } MMX3DNowLevel;
2066   enum XOPEnum {
2067     NoXOP,
2068     SSE4A,
2069     FMA4,
2070     XOP
2071   } XOPLevel;
2072 
2073   bool HasAES;
2074   bool HasPCLMUL;
2075   bool HasLZCNT;
2076   bool HasRDRND;
2077   bool HasFSGSBASE;
2078   bool HasBMI;
2079   bool HasBMI2;
2080   bool HasPOPCNT;
2081   bool HasRTM;
2082   bool HasPRFCHW;
2083   bool HasRDSEED;
2084   bool HasADX;
2085   bool HasTBM;
2086   bool HasFMA;
2087   bool HasF16C;
2088   bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
2089       HasAVX512VL;
2090   bool HasSHA;
2091   bool HasCX16;
2092 
2093   /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2094   ///
2095   /// Each enumeration represents a particular CPU supported by Clang. These
2096   /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2097   enum CPUKind {
2098     CK_Generic,
2099 
2100     /// \name i386
2101     /// i386-generation processors.
2102     //@{
2103     CK_i386,
2104     //@}
2105 
2106     /// \name i486
2107     /// i486-generation processors.
2108     //@{
2109     CK_i486,
2110     CK_WinChipC6,
2111     CK_WinChip2,
2112     CK_C3,
2113     //@}
2114 
2115     /// \name i586
2116     /// i586-generation processors, P5 microarchitecture based.
2117     //@{
2118     CK_i586,
2119     CK_Pentium,
2120     CK_PentiumMMX,
2121     //@}
2122 
2123     /// \name i686
2124     /// i686-generation processors, P6 / Pentium M microarchitecture based.
2125     //@{
2126     CK_i686,
2127     CK_PentiumPro,
2128     CK_Pentium2,
2129     CK_Pentium3,
2130     CK_Pentium3M,
2131     CK_PentiumM,
2132     CK_C3_2,
2133 
2134     /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2135     /// Clang however has some logic to suport this.
2136     // FIXME: Warn, deprecate, and potentially remove this.
2137     CK_Yonah,
2138     //@}
2139 
2140     /// \name Netburst
2141     /// Netburst microarchitecture based processors.
2142     //@{
2143     CK_Pentium4,
2144     CK_Pentium4M,
2145     CK_Prescott,
2146     CK_Nocona,
2147     //@}
2148 
2149     /// \name Core
2150     /// Core microarchitecture based processors.
2151     //@{
2152     CK_Core2,
2153 
2154     /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2155     /// codename which GCC no longer accepts as an option to -march, but Clang
2156     /// has some logic for recognizing it.
2157     // FIXME: Warn, deprecate, and potentially remove this.
2158     CK_Penryn,
2159     //@}
2160 
2161     /// \name Atom
2162     /// Atom processors
2163     //@{
2164     CK_Bonnell,
2165     CK_Silvermont,
2166     //@}
2167 
2168     /// \name Nehalem
2169     /// Nehalem microarchitecture based processors.
2170     CK_Nehalem,
2171 
2172     /// \name Westmere
2173     /// Westmere microarchitecture based processors.
2174     CK_Westmere,
2175 
2176     /// \name Sandy Bridge
2177     /// Sandy Bridge microarchitecture based processors.
2178     CK_SandyBridge,
2179 
2180     /// \name Ivy Bridge
2181     /// Ivy Bridge microarchitecture based processors.
2182     CK_IvyBridge,
2183 
2184     /// \name Haswell
2185     /// Haswell microarchitecture based processors.
2186     CK_Haswell,
2187 
2188     /// \name Broadwell
2189     /// Broadwell microarchitecture based processors.
2190     CK_Broadwell,
2191 
2192     /// \name Skylake
2193     /// Skylake microarchitecture based processors.
2194     CK_Skylake,
2195 
2196     /// \name Knights Landing
2197     /// Knights Landing processor.
2198     CK_KNL,
2199 
2200     /// \name K6
2201     /// K6 architecture processors.
2202     //@{
2203     CK_K6,
2204     CK_K6_2,
2205     CK_K6_3,
2206     //@}
2207 
2208     /// \name K7
2209     /// K7 architecture processors.
2210     //@{
2211     CK_Athlon,
2212     CK_AthlonThunderbird,
2213     CK_Athlon4,
2214     CK_AthlonXP,
2215     CK_AthlonMP,
2216     //@}
2217 
2218     /// \name K8
2219     /// K8 architecture processors.
2220     //@{
2221     CK_Athlon64,
2222     CK_Athlon64SSE3,
2223     CK_AthlonFX,
2224     CK_K8,
2225     CK_K8SSE3,
2226     CK_Opteron,
2227     CK_OpteronSSE3,
2228     CK_AMDFAM10,
2229     //@}
2230 
2231     /// \name Bobcat
2232     /// Bobcat architecture processors.
2233     //@{
2234     CK_BTVER1,
2235     CK_BTVER2,
2236     //@}
2237 
2238     /// \name Bulldozer
2239     /// Bulldozer architecture processors.
2240     //@{
2241     CK_BDVER1,
2242     CK_BDVER2,
2243     CK_BDVER3,
2244     CK_BDVER4,
2245     //@}
2246 
2247     /// This specification is deprecated and will be removed in the future.
2248     /// Users should prefer \see CK_K8.
2249     // FIXME: Warn on this when the CPU is set to it.
2250     //@{
2251     CK_x86_64,
2252     //@}
2253 
2254     /// \name Geode
2255     /// Geode processors.
2256     //@{
2257     CK_Geode
2258     //@}
2259   } CPU;
2260 
2261   CPUKind getCPUKind(StringRef CPU) const {
2262     return llvm::StringSwitch<CPUKind>(CPU)
2263         .Case("i386", CK_i386)
2264         .Case("i486", CK_i486)
2265         .Case("winchip-c6", CK_WinChipC6)
2266         .Case("winchip2", CK_WinChip2)
2267         .Case("c3", CK_C3)
2268         .Case("i586", CK_i586)
2269         .Case("pentium", CK_Pentium)
2270         .Case("pentium-mmx", CK_PentiumMMX)
2271         .Case("i686", CK_i686)
2272         .Case("pentiumpro", CK_PentiumPro)
2273         .Case("pentium2", CK_Pentium2)
2274         .Case("pentium3", CK_Pentium3)
2275         .Case("pentium3m", CK_Pentium3M)
2276         .Case("pentium-m", CK_PentiumM)
2277         .Case("c3-2", CK_C3_2)
2278         .Case("yonah", CK_Yonah)
2279         .Case("pentium4", CK_Pentium4)
2280         .Case("pentium4m", CK_Pentium4M)
2281         .Case("prescott", CK_Prescott)
2282         .Case("nocona", CK_Nocona)
2283         .Case("core2", CK_Core2)
2284         .Case("penryn", CK_Penryn)
2285         .Case("bonnell", CK_Bonnell)
2286         .Case("atom", CK_Bonnell) // Legacy name.
2287         .Case("silvermont", CK_Silvermont)
2288         .Case("slm", CK_Silvermont) // Legacy name.
2289         .Case("nehalem", CK_Nehalem)
2290         .Case("corei7", CK_Nehalem) // Legacy name.
2291         .Case("westmere", CK_Westmere)
2292         .Case("sandybridge", CK_SandyBridge)
2293         .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2294         .Case("ivybridge", CK_IvyBridge)
2295         .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2296         .Case("haswell", CK_Haswell)
2297         .Case("core-avx2", CK_Haswell) // Legacy name.
2298         .Case("broadwell", CK_Broadwell)
2299         .Case("skylake", CK_Skylake)
2300         .Case("skx", CK_Skylake) // Legacy name.
2301         .Case("knl", CK_KNL)
2302         .Case("k6", CK_K6)
2303         .Case("k6-2", CK_K6_2)
2304         .Case("k6-3", CK_K6_3)
2305         .Case("athlon", CK_Athlon)
2306         .Case("athlon-tbird", CK_AthlonThunderbird)
2307         .Case("athlon-4", CK_Athlon4)
2308         .Case("athlon-xp", CK_AthlonXP)
2309         .Case("athlon-mp", CK_AthlonMP)
2310         .Case("athlon64", CK_Athlon64)
2311         .Case("athlon64-sse3", CK_Athlon64SSE3)
2312         .Case("athlon-fx", CK_AthlonFX)
2313         .Case("k8", CK_K8)
2314         .Case("k8-sse3", CK_K8SSE3)
2315         .Case("opteron", CK_Opteron)
2316         .Case("opteron-sse3", CK_OpteronSSE3)
2317         .Case("barcelona", CK_AMDFAM10)
2318         .Case("amdfam10", CK_AMDFAM10)
2319         .Case("btver1", CK_BTVER1)
2320         .Case("btver2", CK_BTVER2)
2321         .Case("bdver1", CK_BDVER1)
2322         .Case("bdver2", CK_BDVER2)
2323         .Case("bdver3", CK_BDVER3)
2324         .Case("bdver4", CK_BDVER4)
2325         .Case("x86-64", CK_x86_64)
2326         .Case("geode", CK_Geode)
2327         .Default(CK_Generic);
2328   }
2329 
2330   enum FPMathKind {
2331     FP_Default,
2332     FP_SSE,
2333     FP_387
2334   } FPMath;
2335 
2336 public:
2337   X86TargetInfo(const llvm::Triple &Triple)
2338       : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
2339         XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
2340         HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
2341         HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
2342         HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
2343         HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
2344         HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
2345         HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
2346     BigEndian = false;
2347     LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
2348   }
2349   unsigned getFloatEvalMethod() const override {
2350     // X87 evaluates with 80 bits "long double" precision.
2351     return SSELevel == NoSSE ? 2 : 0;
2352   }
2353   void getTargetBuiltins(const Builtin::Info *&Records,
2354                                  unsigned &NumRecords) const override {
2355     Records = BuiltinInfo;
2356     NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
2357   }
2358   void getGCCRegNames(const char * const *&Names,
2359                       unsigned &NumNames) const override {
2360     Names = GCCRegNames;
2361     NumNames = llvm::array_lengthof(GCCRegNames);
2362   }
2363   void getGCCRegAliases(const GCCRegAlias *&Aliases,
2364                         unsigned &NumAliases) const override {
2365     Aliases = nullptr;
2366     NumAliases = 0;
2367   }
2368   void getGCCAddlRegNames(const AddlRegName *&Names,
2369                           unsigned &NumNames) const override {
2370     Names = AddlRegNames;
2371     NumNames = llvm::array_lengthof(AddlRegNames);
2372   }
2373   bool validateCpuSupports(StringRef Name) const override;
2374   bool validateAsmConstraint(const char *&Name,
2375                              TargetInfo::ConstraintInfo &info) const override;
2376 
2377   bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2378 
2379   bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2380 
2381   virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2382 
2383   std::string convertConstraint(const char *&Constraint) const override;
2384   const char *getClobbers() const override {
2385     return "~{dirflag},~{fpsr},~{flags}";
2386   }
2387   void getTargetDefines(const LangOptions &Opts,
2388                         MacroBuilder &Builder) const override;
2389   static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2390                           bool Enabled);
2391   static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2392                           bool Enabled);
2393   static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2394                           bool Enabled);
2395   void setFeatureEnabled(llvm::StringMap<bool> &Features,
2396                          StringRef Name, bool Enabled) const override {
2397     setFeatureEnabledImpl(Features, Name, Enabled);
2398   }
2399   // This exists purely to cut down on the number of virtual calls in
2400   // initFeatureMap which calls this repeatedly.
2401   static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2402                                     StringRef Name, bool Enabled);
2403   bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2404                       StringRef CPU,
2405                       std::vector<std::string> &FeaturesVec) const override;
2406   bool hasFeature(StringRef Feature) const override;
2407   bool handleTargetFeatures(std::vector<std::string> &Features,
2408                             DiagnosticsEngine &Diags) override;
2409   StringRef getABI() const override {
2410     if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2411       return "avx512";
2412     else if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
2413       return "avx";
2414     else if (getTriple().getArch() == llvm::Triple::x86 &&
2415              MMX3DNowLevel == NoMMX3DNow)
2416       return "no-mmx";
2417     return "";
2418   }
2419   bool setCPU(const std::string &Name) override {
2420     CPU = getCPUKind(Name);
2421 
2422     // Perform any per-CPU checks necessary to determine if this CPU is
2423     // acceptable.
2424     // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2425     // invalid without explaining *why*.
2426     switch (CPU) {
2427     case CK_Generic:
2428       // No processor selected!
2429       return false;
2430 
2431     case CK_i386:
2432     case CK_i486:
2433     case CK_WinChipC6:
2434     case CK_WinChip2:
2435     case CK_C3:
2436     case CK_i586:
2437     case CK_Pentium:
2438     case CK_PentiumMMX:
2439     case CK_i686:
2440     case CK_PentiumPro:
2441     case CK_Pentium2:
2442     case CK_Pentium3:
2443     case CK_Pentium3M:
2444     case CK_PentiumM:
2445     case CK_Yonah:
2446     case CK_C3_2:
2447     case CK_Pentium4:
2448     case CK_Pentium4M:
2449     case CK_Prescott:
2450     case CK_K6:
2451     case CK_K6_2:
2452     case CK_K6_3:
2453     case CK_Athlon:
2454     case CK_AthlonThunderbird:
2455     case CK_Athlon4:
2456     case CK_AthlonXP:
2457     case CK_AthlonMP:
2458     case CK_Geode:
2459       // Only accept certain architectures when compiling in 32-bit mode.
2460       if (getTriple().getArch() != llvm::Triple::x86)
2461         return false;
2462 
2463       // Fallthrough
2464     case CK_Nocona:
2465     case CK_Core2:
2466     case CK_Penryn:
2467     case CK_Bonnell:
2468     case CK_Silvermont:
2469     case CK_Nehalem:
2470     case CK_Westmere:
2471     case CK_SandyBridge:
2472     case CK_IvyBridge:
2473     case CK_Haswell:
2474     case CK_Broadwell:
2475     case CK_Skylake:
2476     case CK_KNL:
2477     case CK_Athlon64:
2478     case CK_Athlon64SSE3:
2479     case CK_AthlonFX:
2480     case CK_K8:
2481     case CK_K8SSE3:
2482     case CK_Opteron:
2483     case CK_OpteronSSE3:
2484     case CK_AMDFAM10:
2485     case CK_BTVER1:
2486     case CK_BTVER2:
2487     case CK_BDVER1:
2488     case CK_BDVER2:
2489     case CK_BDVER3:
2490     case CK_BDVER4:
2491     case CK_x86_64:
2492       return true;
2493     }
2494     llvm_unreachable("Unhandled CPU kind");
2495   }
2496 
2497   bool setFPMath(StringRef Name) override;
2498 
2499   CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2500     // We accept all non-ARM calling conventions
2501     return (CC == CC_X86ThisCall ||
2502             CC == CC_X86FastCall ||
2503             CC == CC_X86StdCall ||
2504             CC == CC_X86VectorCall ||
2505             CC == CC_C ||
2506             CC == CC_X86Pascal ||
2507             CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
2508   }
2509 
2510   CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
2511     return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
2512   }
2513 
2514   bool hasSjLjLowering() const override {
2515     return true;
2516   }
2517 };
2518 
2519 bool X86TargetInfo::setFPMath(StringRef Name) {
2520   if (Name == "387") {
2521     FPMath = FP_387;
2522     return true;
2523   }
2524   if (Name == "sse") {
2525     FPMath = FP_SSE;
2526     return true;
2527   }
2528   return false;
2529 }
2530 
2531 bool X86TargetInfo::initFeatureMap(
2532     llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
2533     std::vector<std::string> &FeaturesVec) const {
2534   // FIXME: This *really* should not be here.
2535   // X86_64 always has SSE2.
2536   if (getTriple().getArch() == llvm::Triple::x86_64)
2537     setFeatureEnabledImpl(Features, "sse2", true);
2538 
2539   switch (getCPUKind(CPU)) {
2540   case CK_Generic:
2541   case CK_i386:
2542   case CK_i486:
2543   case CK_i586:
2544   case CK_Pentium:
2545   case CK_i686:
2546   case CK_PentiumPro:
2547     break;
2548   case CK_PentiumMMX:
2549   case CK_Pentium2:
2550   case CK_K6:
2551   case CK_WinChipC6:
2552     setFeatureEnabledImpl(Features, "mmx", true);
2553     break;
2554   case CK_Pentium3:
2555   case CK_Pentium3M:
2556   case CK_C3_2:
2557     setFeatureEnabledImpl(Features, "sse", true);
2558     break;
2559   case CK_PentiumM:
2560   case CK_Pentium4:
2561   case CK_Pentium4M:
2562   case CK_x86_64:
2563     setFeatureEnabledImpl(Features, "sse2", true);
2564     break;
2565   case CK_Yonah:
2566   case CK_Prescott:
2567   case CK_Nocona:
2568     setFeatureEnabledImpl(Features, "sse3", true);
2569     setFeatureEnabledImpl(Features, "cx16", true);
2570     break;
2571   case CK_Core2:
2572   case CK_Bonnell:
2573     setFeatureEnabledImpl(Features, "ssse3", true);
2574     setFeatureEnabledImpl(Features, "cx16", true);
2575     break;
2576   case CK_Penryn:
2577     setFeatureEnabledImpl(Features, "sse4.1", true);
2578     setFeatureEnabledImpl(Features, "cx16", true);
2579     break;
2580   case CK_Skylake:
2581     setFeatureEnabledImpl(Features, "avx512f", true);
2582     setFeatureEnabledImpl(Features, "avx512cd", true);
2583     setFeatureEnabledImpl(Features, "avx512dq", true);
2584     setFeatureEnabledImpl(Features, "avx512bw", true);
2585     setFeatureEnabledImpl(Features, "avx512vl", true);
2586     // FALLTHROUGH
2587   case CK_Broadwell:
2588     setFeatureEnabledImpl(Features, "rdseed", true);
2589     setFeatureEnabledImpl(Features, "adx", true);
2590     // FALLTHROUGH
2591   case CK_Haswell:
2592     setFeatureEnabledImpl(Features, "avx2", true);
2593     setFeatureEnabledImpl(Features, "lzcnt", true);
2594     setFeatureEnabledImpl(Features, "bmi", true);
2595     setFeatureEnabledImpl(Features, "bmi2", true);
2596     setFeatureEnabledImpl(Features, "rtm", true);
2597     setFeatureEnabledImpl(Features, "fma", true);
2598     // FALLTHROUGH
2599   case CK_IvyBridge:
2600     setFeatureEnabledImpl(Features, "rdrnd", true);
2601     setFeatureEnabledImpl(Features, "f16c", true);
2602     setFeatureEnabledImpl(Features, "fsgsbase", true);
2603     // FALLTHROUGH
2604   case CK_SandyBridge:
2605     setFeatureEnabledImpl(Features, "avx", true);
2606     // FALLTHROUGH
2607   case CK_Westmere:
2608   case CK_Silvermont:
2609     setFeatureEnabledImpl(Features, "aes", true);
2610     setFeatureEnabledImpl(Features, "pclmul", true);
2611     // FALLTHROUGH
2612   case CK_Nehalem:
2613     setFeatureEnabledImpl(Features, "sse4.2", true);
2614     setFeatureEnabledImpl(Features, "cx16", true);
2615     break;
2616   case CK_KNL:
2617     setFeatureEnabledImpl(Features, "avx512f", true);
2618     setFeatureEnabledImpl(Features, "avx512cd", true);
2619     setFeatureEnabledImpl(Features, "avx512er", true);
2620     setFeatureEnabledImpl(Features, "avx512pf", true);
2621     setFeatureEnabledImpl(Features, "rdseed", true);
2622     setFeatureEnabledImpl(Features, "adx", true);
2623     setFeatureEnabledImpl(Features, "lzcnt", true);
2624     setFeatureEnabledImpl(Features, "bmi", true);
2625     setFeatureEnabledImpl(Features, "bmi2", true);
2626     setFeatureEnabledImpl(Features, "rtm", true);
2627     setFeatureEnabledImpl(Features, "fma", true);
2628     setFeatureEnabledImpl(Features, "rdrnd", true);
2629     setFeatureEnabledImpl(Features, "f16c", true);
2630     setFeatureEnabledImpl(Features, "fsgsbase", true);
2631     setFeatureEnabledImpl(Features, "aes", true);
2632     setFeatureEnabledImpl(Features, "pclmul", true);
2633     setFeatureEnabledImpl(Features, "cx16", true);
2634     break;
2635   case CK_K6_2:
2636   case CK_K6_3:
2637   case CK_WinChip2:
2638   case CK_C3:
2639     setFeatureEnabledImpl(Features, "3dnow", true);
2640     break;
2641   case CK_Athlon:
2642   case CK_AthlonThunderbird:
2643   case CK_Geode:
2644     setFeatureEnabledImpl(Features, "3dnowa", true);
2645     break;
2646   case CK_Athlon4:
2647   case CK_AthlonXP:
2648   case CK_AthlonMP:
2649     setFeatureEnabledImpl(Features, "sse", true);
2650     setFeatureEnabledImpl(Features, "3dnowa", true);
2651     break;
2652   case CK_K8:
2653   case CK_Opteron:
2654   case CK_Athlon64:
2655   case CK_AthlonFX:
2656     setFeatureEnabledImpl(Features, "sse2", true);
2657     setFeatureEnabledImpl(Features, "3dnowa", true);
2658     break;
2659   case CK_AMDFAM10:
2660     setFeatureEnabledImpl(Features, "sse4a", true);
2661     setFeatureEnabledImpl(Features, "lzcnt", true);
2662     setFeatureEnabledImpl(Features, "popcnt", true);
2663     // FALLTHROUGH
2664   case CK_K8SSE3:
2665   case CK_OpteronSSE3:
2666   case CK_Athlon64SSE3:
2667     setFeatureEnabledImpl(Features, "sse3", true);
2668     setFeatureEnabledImpl(Features, "3dnowa", true);
2669     break;
2670   case CK_BTVER2:
2671     setFeatureEnabledImpl(Features, "avx", true);
2672     setFeatureEnabledImpl(Features, "aes", true);
2673     setFeatureEnabledImpl(Features, "pclmul", true);
2674     setFeatureEnabledImpl(Features, "bmi", true);
2675     setFeatureEnabledImpl(Features, "f16c", true);
2676     // FALLTHROUGH
2677   case CK_BTVER1:
2678     setFeatureEnabledImpl(Features, "ssse3", true);
2679     setFeatureEnabledImpl(Features, "sse4a", true);
2680     setFeatureEnabledImpl(Features, "lzcnt", true);
2681     setFeatureEnabledImpl(Features, "popcnt", true);
2682     setFeatureEnabledImpl(Features, "prfchw", true);
2683     setFeatureEnabledImpl(Features, "cx16", true);
2684     break;
2685   case CK_BDVER4:
2686     setFeatureEnabledImpl(Features, "avx2", true);
2687     setFeatureEnabledImpl(Features, "bmi2", true);
2688     // FALLTHROUGH
2689   case CK_BDVER3:
2690     setFeatureEnabledImpl(Features, "fsgsbase", true);
2691     // FALLTHROUGH
2692   case CK_BDVER2:
2693     setFeatureEnabledImpl(Features, "bmi", true);
2694     setFeatureEnabledImpl(Features, "fma", true);
2695     setFeatureEnabledImpl(Features, "f16c", true);
2696     setFeatureEnabledImpl(Features, "tbm", true);
2697     // FALLTHROUGH
2698   case CK_BDVER1:
2699     // xop implies avx, sse4a and fma4.
2700     setFeatureEnabledImpl(Features, "xop", true);
2701     setFeatureEnabledImpl(Features, "lzcnt", true);
2702     setFeatureEnabledImpl(Features, "aes", true);
2703     setFeatureEnabledImpl(Features, "pclmul", true);
2704     setFeatureEnabledImpl(Features, "prfchw", true);
2705     setFeatureEnabledImpl(Features, "cx16", true);
2706     break;
2707   }
2708   return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
2709 }
2710 
2711 void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
2712                                 X86SSEEnum Level, bool Enabled) {
2713   if (Enabled) {
2714     switch (Level) {
2715     case AVX512F:
2716       Features["avx512f"] = true;
2717     case AVX2:
2718       Features["avx2"] = true;
2719     case AVX:
2720       Features["avx"] = true;
2721     case SSE42:
2722       Features["sse4.2"] = true;
2723     case SSE41:
2724       Features["sse4.1"] = true;
2725     case SSSE3:
2726       Features["ssse3"] = true;
2727     case SSE3:
2728       Features["sse3"] = true;
2729     case SSE2:
2730       Features["sse2"] = true;
2731     case SSE1:
2732       Features["sse"] = true;
2733     case NoSSE:
2734       break;
2735     }
2736     return;
2737   }
2738 
2739   switch (Level) {
2740   case NoSSE:
2741   case SSE1:
2742     Features["sse"] = false;
2743   case SSE2:
2744     Features["sse2"] = Features["pclmul"] = Features["aes"] =
2745       Features["sha"] = false;
2746   case SSE3:
2747     Features["sse3"] = false;
2748     setXOPLevel(Features, NoXOP, false);
2749   case SSSE3:
2750     Features["ssse3"] = false;
2751   case SSE41:
2752     Features["sse4.1"] = false;
2753   case SSE42:
2754     Features["sse4.2"] = false;
2755   case AVX:
2756     Features["fma"] = Features["avx"] = Features["f16c"] = false;
2757     setXOPLevel(Features, FMA4, false);
2758   case AVX2:
2759     Features["avx2"] = false;
2760   case AVX512F:
2761     Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
2762       Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2763       Features["avx512vl"] = false;
2764   }
2765 }
2766 
2767 void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
2768                                 MMX3DNowEnum Level, bool Enabled) {
2769   if (Enabled) {
2770     switch (Level) {
2771     case AMD3DNowAthlon:
2772       Features["3dnowa"] = true;
2773     case AMD3DNow:
2774       Features["3dnow"] = true;
2775     case MMX:
2776       Features["mmx"] = true;
2777     case NoMMX3DNow:
2778       break;
2779     }
2780     return;
2781   }
2782 
2783   switch (Level) {
2784   case NoMMX3DNow:
2785   case MMX:
2786     Features["mmx"] = false;
2787   case AMD3DNow:
2788     Features["3dnow"] = false;
2789   case AMD3DNowAthlon:
2790     Features["3dnowa"] = false;
2791   }
2792 }
2793 
2794 void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2795                                 bool Enabled) {
2796   if (Enabled) {
2797     switch (Level) {
2798     case XOP:
2799       Features["xop"] = true;
2800     case FMA4:
2801       Features["fma4"] = true;
2802       setSSELevel(Features, AVX, true);
2803     case SSE4A:
2804       Features["sse4a"] = true;
2805       setSSELevel(Features, SSE3, true);
2806     case NoXOP:
2807       break;
2808     }
2809     return;
2810   }
2811 
2812   switch (Level) {
2813   case NoXOP:
2814   case SSE4A:
2815     Features["sse4a"] = false;
2816   case FMA4:
2817     Features["fma4"] = false;
2818   case XOP:
2819     Features["xop"] = false;
2820   }
2821 }
2822 
2823 void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2824                                           StringRef Name, bool Enabled) {
2825   // This is a bit of a hack to deal with the sse4 target feature when used
2826   // as part of the target attribute. We handle sse4 correctly everywhere
2827   // else. See below for more information on how we handle the sse4 options.
2828   if (Name != "sse4")
2829     Features[Name] = Enabled;
2830 
2831   if (Name == "mmx") {
2832     setMMXLevel(Features, MMX, Enabled);
2833   } else if (Name == "sse") {
2834     setSSELevel(Features, SSE1, Enabled);
2835   } else if (Name == "sse2") {
2836     setSSELevel(Features, SSE2, Enabled);
2837   } else if (Name == "sse3") {
2838     setSSELevel(Features, SSE3, Enabled);
2839   } else if (Name == "ssse3") {
2840     setSSELevel(Features, SSSE3, Enabled);
2841   } else if (Name == "sse4.2") {
2842     setSSELevel(Features, SSE42, Enabled);
2843   } else if (Name == "sse4.1") {
2844     setSSELevel(Features, SSE41, Enabled);
2845   } else if (Name == "3dnow") {
2846     setMMXLevel(Features, AMD3DNow, Enabled);
2847   } else if (Name == "3dnowa") {
2848     setMMXLevel(Features, AMD3DNowAthlon, Enabled);
2849   } else if (Name == "aes") {
2850     if (Enabled)
2851       setSSELevel(Features, SSE2, Enabled);
2852   } else if (Name == "pclmul") {
2853     if (Enabled)
2854       setSSELevel(Features, SSE2, Enabled);
2855   } else if (Name == "avx") {
2856     setSSELevel(Features, AVX, Enabled);
2857   } else if (Name == "avx2") {
2858     setSSELevel(Features, AVX2, Enabled);
2859   } else if (Name == "avx512f") {
2860     setSSELevel(Features, AVX512F, Enabled);
2861   } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2862           || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
2863     if (Enabled)
2864       setSSELevel(Features, AVX512F, Enabled);
2865   } else if (Name == "fma") {
2866     if (Enabled)
2867       setSSELevel(Features, AVX, Enabled);
2868   } else if (Name == "fma4") {
2869     setXOPLevel(Features, FMA4, Enabled);
2870   } else if (Name == "xop") {
2871     setXOPLevel(Features, XOP, Enabled);
2872   } else if (Name == "sse4a") {
2873     setXOPLevel(Features, SSE4A, Enabled);
2874   } else if (Name == "f16c") {
2875     if (Enabled)
2876       setSSELevel(Features, AVX, Enabled);
2877   } else if (Name == "sha") {
2878     if (Enabled)
2879       setSSELevel(Features, SSE2, Enabled);
2880   } else if (Name == "sse4") {
2881     // We can get here via the __target__ attribute since that's not controlled
2882     // via the -msse4/-mno-sse4 command line alias. Handle this the same way
2883     // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
2884     // disabled.
2885     if (Enabled)
2886       setSSELevel(Features, SSE42, Enabled);
2887     else
2888       setSSELevel(Features, SSE41, Enabled);
2889   }
2890 }
2891 
2892 /// handleTargetFeatures - Perform initialization based on the user
2893 /// configured set of features.
2894 bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
2895                                          DiagnosticsEngine &Diags) {
2896   for (const auto &Feature : Features) {
2897     if (Feature[0] != '+')
2898       continue;
2899 
2900     if (Feature == "+aes") {
2901       HasAES = true;
2902     } else if (Feature == "+pclmul") {
2903       HasPCLMUL = true;
2904     } else if (Feature == "+lzcnt") {
2905       HasLZCNT = true;
2906     } else if (Feature == "+rdrnd") {
2907       HasRDRND = true;
2908     } else if (Feature == "+fsgsbase") {
2909       HasFSGSBASE = true;
2910     } else if (Feature == "+bmi") {
2911       HasBMI = true;
2912     } else if (Feature == "+bmi2") {
2913       HasBMI2 = true;
2914     } else if (Feature == "+popcnt") {
2915       HasPOPCNT = true;
2916     } else if (Feature == "+rtm") {
2917       HasRTM = true;
2918     } else if (Feature == "+prfchw") {
2919       HasPRFCHW = true;
2920     } else if (Feature == "+rdseed") {
2921       HasRDSEED = true;
2922     } else if (Feature == "+adx") {
2923       HasADX = true;
2924     } else if (Feature == "+tbm") {
2925       HasTBM = true;
2926     } else if (Feature == "+fma") {
2927       HasFMA = true;
2928     } else if (Feature == "+f16c") {
2929       HasF16C = true;
2930     } else if (Feature == "+avx512cd") {
2931       HasAVX512CD = true;
2932     } else if (Feature == "+avx512er") {
2933       HasAVX512ER = true;
2934     } else if (Feature == "+avx512pf") {
2935       HasAVX512PF = true;
2936     } else if (Feature == "+avx512dq") {
2937       HasAVX512DQ = true;
2938     } else if (Feature == "+avx512bw") {
2939       HasAVX512BW = true;
2940     } else if (Feature == "+avx512vl") {
2941       HasAVX512VL = true;
2942     } else if (Feature == "+sha") {
2943       HasSHA = true;
2944     } else if (Feature == "+cx16") {
2945       HasCX16 = true;
2946     }
2947 
2948     X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
2949       .Case("+avx512f", AVX512F)
2950       .Case("+avx2", AVX2)
2951       .Case("+avx", AVX)
2952       .Case("+sse4.2", SSE42)
2953       .Case("+sse4.1", SSE41)
2954       .Case("+ssse3", SSSE3)
2955       .Case("+sse3", SSE3)
2956       .Case("+sse2", SSE2)
2957       .Case("+sse", SSE1)
2958       .Default(NoSSE);
2959     SSELevel = std::max(SSELevel, Level);
2960 
2961     MMX3DNowEnum ThreeDNowLevel =
2962       llvm::StringSwitch<MMX3DNowEnum>(Feature)
2963         .Case("+3dnowa", AMD3DNowAthlon)
2964         .Case("+3dnow", AMD3DNow)
2965         .Case("+mmx", MMX)
2966         .Default(NoMMX3DNow);
2967     MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
2968 
2969     XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2970         .Case("+xop", XOP)
2971         .Case("+fma4", FMA4)
2972         .Case("+sse4a", SSE4A)
2973         .Default(NoXOP);
2974     XOPLevel = std::max(XOPLevel, XLevel);
2975   }
2976 
2977   // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2978   // Can't do this earlier because we need to be able to explicitly enable
2979   // popcnt and still disable sse4.2.
2980   if (!HasPOPCNT && SSELevel >= SSE42 &&
2981       std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2982     HasPOPCNT = true;
2983     Features.push_back("+popcnt");
2984   }
2985 
2986   // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2987   if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2988       std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2989     HasPRFCHW = true;
2990     Features.push_back("+prfchw");
2991   }
2992 
2993   // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2994   // matches the selected sse level.
2995   if (FPMath == FP_SSE && SSELevel < SSE1) {
2996     Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2997     return false;
2998   } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2999     Diags.Report(diag::err_target_unsupported_fpmath) << "387";
3000     return false;
3001   }
3002 
3003   // Don't tell the backend if we're turning off mmx; it will end up disabling
3004   // SSE, which we don't want.
3005   // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3006   // then enable MMX.
3007   std::vector<std::string>::iterator it;
3008   it = std::find(Features.begin(), Features.end(), "-mmx");
3009   if (it != Features.end())
3010     Features.erase(it);
3011   else if (SSELevel > NoSSE)
3012     MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
3013 
3014   SimdDefaultAlign =
3015       hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
3016   return true;
3017 }
3018 
3019 /// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3020 /// definitions for this particular subtarget.
3021 void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
3022                                      MacroBuilder &Builder) const {
3023   // Target identification.
3024   if (getTriple().getArch() == llvm::Triple::x86_64) {
3025     Builder.defineMacro("__amd64__");
3026     Builder.defineMacro("__amd64");
3027     Builder.defineMacro("__x86_64");
3028     Builder.defineMacro("__x86_64__");
3029     if (getTriple().getArchName() == "x86_64h") {
3030       Builder.defineMacro("__x86_64h");
3031       Builder.defineMacro("__x86_64h__");
3032     }
3033   } else {
3034     DefineStd(Builder, "i386", Opts);
3035   }
3036 
3037   // Subtarget options.
3038   // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3039   // truly should be based on -mtune options.
3040   switch (CPU) {
3041   case CK_Generic:
3042     break;
3043   case CK_i386:
3044     // The rest are coming from the i386 define above.
3045     Builder.defineMacro("__tune_i386__");
3046     break;
3047   case CK_i486:
3048   case CK_WinChipC6:
3049   case CK_WinChip2:
3050   case CK_C3:
3051     defineCPUMacros(Builder, "i486");
3052     break;
3053   case CK_PentiumMMX:
3054     Builder.defineMacro("__pentium_mmx__");
3055     Builder.defineMacro("__tune_pentium_mmx__");
3056     // Fallthrough
3057   case CK_i586:
3058   case CK_Pentium:
3059     defineCPUMacros(Builder, "i586");
3060     defineCPUMacros(Builder, "pentium");
3061     break;
3062   case CK_Pentium3:
3063   case CK_Pentium3M:
3064   case CK_PentiumM:
3065     Builder.defineMacro("__tune_pentium3__");
3066     // Fallthrough
3067   case CK_Pentium2:
3068   case CK_C3_2:
3069     Builder.defineMacro("__tune_pentium2__");
3070     // Fallthrough
3071   case CK_PentiumPro:
3072     Builder.defineMacro("__tune_i686__");
3073     Builder.defineMacro("__tune_pentiumpro__");
3074     // Fallthrough
3075   case CK_i686:
3076     Builder.defineMacro("__i686");
3077     Builder.defineMacro("__i686__");
3078     // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3079     Builder.defineMacro("__pentiumpro");
3080     Builder.defineMacro("__pentiumpro__");
3081     break;
3082   case CK_Pentium4:
3083   case CK_Pentium4M:
3084     defineCPUMacros(Builder, "pentium4");
3085     break;
3086   case CK_Yonah:
3087   case CK_Prescott:
3088   case CK_Nocona:
3089     defineCPUMacros(Builder, "nocona");
3090     break;
3091   case CK_Core2:
3092   case CK_Penryn:
3093     defineCPUMacros(Builder, "core2");
3094     break;
3095   case CK_Bonnell:
3096     defineCPUMacros(Builder, "atom");
3097     break;
3098   case CK_Silvermont:
3099     defineCPUMacros(Builder, "slm");
3100     break;
3101   case CK_Nehalem:
3102   case CK_Westmere:
3103   case CK_SandyBridge:
3104   case CK_IvyBridge:
3105   case CK_Haswell:
3106   case CK_Broadwell:
3107     // FIXME: Historically, we defined this legacy name, it would be nice to
3108     // remove it at some point. We've never exposed fine-grained names for
3109     // recent primary x86 CPUs, and we should keep it that way.
3110     defineCPUMacros(Builder, "corei7");
3111     break;
3112   case CK_Skylake:
3113     // FIXME: Historically, we defined this legacy name, it would be nice to
3114     // remove it at some point. This is the only fine-grained CPU macro in the
3115     // main intel CPU line, and it would be better to not have these and force
3116     // people to use ISA macros.
3117     defineCPUMacros(Builder, "skx");
3118     break;
3119   case CK_KNL:
3120     defineCPUMacros(Builder, "knl");
3121     break;
3122   case CK_K6_2:
3123     Builder.defineMacro("__k6_2__");
3124     Builder.defineMacro("__tune_k6_2__");
3125     // Fallthrough
3126   case CK_K6_3:
3127     if (CPU != CK_K6_2) {  // In case of fallthrough
3128       // FIXME: GCC may be enabling these in cases where some other k6
3129       // architecture is specified but -m3dnow is explicitly provided. The
3130       // exact semantics need to be determined and emulated here.
3131       Builder.defineMacro("__k6_3__");
3132       Builder.defineMacro("__tune_k6_3__");
3133     }
3134     // Fallthrough
3135   case CK_K6:
3136     defineCPUMacros(Builder, "k6");
3137     break;
3138   case CK_Athlon:
3139   case CK_AthlonThunderbird:
3140   case CK_Athlon4:
3141   case CK_AthlonXP:
3142   case CK_AthlonMP:
3143     defineCPUMacros(Builder, "athlon");
3144     if (SSELevel != NoSSE) {
3145       Builder.defineMacro("__athlon_sse__");
3146       Builder.defineMacro("__tune_athlon_sse__");
3147     }
3148     break;
3149   case CK_K8:
3150   case CK_K8SSE3:
3151   case CK_x86_64:
3152   case CK_Opteron:
3153   case CK_OpteronSSE3:
3154   case CK_Athlon64:
3155   case CK_Athlon64SSE3:
3156   case CK_AthlonFX:
3157     defineCPUMacros(Builder, "k8");
3158     break;
3159   case CK_AMDFAM10:
3160     defineCPUMacros(Builder, "amdfam10");
3161     break;
3162   case CK_BTVER1:
3163     defineCPUMacros(Builder, "btver1");
3164     break;
3165   case CK_BTVER2:
3166     defineCPUMacros(Builder, "btver2");
3167     break;
3168   case CK_BDVER1:
3169     defineCPUMacros(Builder, "bdver1");
3170     break;
3171   case CK_BDVER2:
3172     defineCPUMacros(Builder, "bdver2");
3173     break;
3174   case CK_BDVER3:
3175     defineCPUMacros(Builder, "bdver3");
3176     break;
3177   case CK_BDVER4:
3178     defineCPUMacros(Builder, "bdver4");
3179     break;
3180   case CK_Geode:
3181     defineCPUMacros(Builder, "geode");
3182     break;
3183   }
3184 
3185   // Target properties.
3186   Builder.defineMacro("__REGISTER_PREFIX__", "");
3187 
3188   // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3189   // functions in glibc header files that use FP Stack inline asm which the
3190   // backend can't deal with (PR879).
3191   Builder.defineMacro("__NO_MATH_INLINES");
3192 
3193   if (HasAES)
3194     Builder.defineMacro("__AES__");
3195 
3196   if (HasPCLMUL)
3197     Builder.defineMacro("__PCLMUL__");
3198 
3199   if (HasLZCNT)
3200     Builder.defineMacro("__LZCNT__");
3201 
3202   if (HasRDRND)
3203     Builder.defineMacro("__RDRND__");
3204 
3205   if (HasFSGSBASE)
3206     Builder.defineMacro("__FSGSBASE__");
3207 
3208   if (HasBMI)
3209     Builder.defineMacro("__BMI__");
3210 
3211   if (HasBMI2)
3212     Builder.defineMacro("__BMI2__");
3213 
3214   if (HasPOPCNT)
3215     Builder.defineMacro("__POPCNT__");
3216 
3217   if (HasRTM)
3218     Builder.defineMacro("__RTM__");
3219 
3220   if (HasPRFCHW)
3221     Builder.defineMacro("__PRFCHW__");
3222 
3223   if (HasRDSEED)
3224     Builder.defineMacro("__RDSEED__");
3225 
3226   if (HasADX)
3227     Builder.defineMacro("__ADX__");
3228 
3229   if (HasTBM)
3230     Builder.defineMacro("__TBM__");
3231 
3232   switch (XOPLevel) {
3233   case XOP:
3234     Builder.defineMacro("__XOP__");
3235   case FMA4:
3236     Builder.defineMacro("__FMA4__");
3237   case SSE4A:
3238     Builder.defineMacro("__SSE4A__");
3239   case NoXOP:
3240     break;
3241   }
3242 
3243   if (HasFMA)
3244     Builder.defineMacro("__FMA__");
3245 
3246   if (HasF16C)
3247     Builder.defineMacro("__F16C__");
3248 
3249   if (HasAVX512CD)
3250     Builder.defineMacro("__AVX512CD__");
3251   if (HasAVX512ER)
3252     Builder.defineMacro("__AVX512ER__");
3253   if (HasAVX512PF)
3254     Builder.defineMacro("__AVX512PF__");
3255   if (HasAVX512DQ)
3256     Builder.defineMacro("__AVX512DQ__");
3257   if (HasAVX512BW)
3258     Builder.defineMacro("__AVX512BW__");
3259   if (HasAVX512VL)
3260     Builder.defineMacro("__AVX512VL__");
3261 
3262   if (HasSHA)
3263     Builder.defineMacro("__SHA__");
3264 
3265   if (HasCX16)
3266     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3267 
3268   // Each case falls through to the previous one here.
3269   switch (SSELevel) {
3270   case AVX512F:
3271     Builder.defineMacro("__AVX512F__");
3272   case AVX2:
3273     Builder.defineMacro("__AVX2__");
3274   case AVX:
3275     Builder.defineMacro("__AVX__");
3276   case SSE42:
3277     Builder.defineMacro("__SSE4_2__");
3278   case SSE41:
3279     Builder.defineMacro("__SSE4_1__");
3280   case SSSE3:
3281     Builder.defineMacro("__SSSE3__");
3282   case SSE3:
3283     Builder.defineMacro("__SSE3__");
3284   case SSE2:
3285     Builder.defineMacro("__SSE2__");
3286     Builder.defineMacro("__SSE2_MATH__");  // -mfp-math=sse always implied.
3287   case SSE1:
3288     Builder.defineMacro("__SSE__");
3289     Builder.defineMacro("__SSE_MATH__");   // -mfp-math=sse always implied.
3290   case NoSSE:
3291     break;
3292   }
3293 
3294   if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
3295     switch (SSELevel) {
3296     case AVX512F:
3297     case AVX2:
3298     case AVX:
3299     case SSE42:
3300     case SSE41:
3301     case SSSE3:
3302     case SSE3:
3303     case SSE2:
3304       Builder.defineMacro("_M_IX86_FP", Twine(2));
3305       break;
3306     case SSE1:
3307       Builder.defineMacro("_M_IX86_FP", Twine(1));
3308       break;
3309     default:
3310       Builder.defineMacro("_M_IX86_FP", Twine(0));
3311     }
3312   }
3313 
3314   // Each case falls through to the previous one here.
3315   switch (MMX3DNowLevel) {
3316   case AMD3DNowAthlon:
3317     Builder.defineMacro("__3dNOW_A__");
3318   case AMD3DNow:
3319     Builder.defineMacro("__3dNOW__");
3320   case MMX:
3321     Builder.defineMacro("__MMX__");
3322   case NoMMX3DNow:
3323     break;
3324   }
3325 
3326   if (CPU >= CK_i486) {
3327     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3328     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3329     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3330   }
3331   if (CPU >= CK_i586)
3332     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
3333 }
3334 
3335 bool X86TargetInfo::hasFeature(StringRef Feature) const {
3336   return llvm::StringSwitch<bool>(Feature)
3337       .Case("aes", HasAES)
3338       .Case("avx", SSELevel >= AVX)
3339       .Case("avx2", SSELevel >= AVX2)
3340       .Case("avx512f", SSELevel >= AVX512F)
3341       .Case("avx512cd", HasAVX512CD)
3342       .Case("avx512er", HasAVX512ER)
3343       .Case("avx512pf", HasAVX512PF)
3344       .Case("avx512dq", HasAVX512DQ)
3345       .Case("avx512bw", HasAVX512BW)
3346       .Case("avx512vl", HasAVX512VL)
3347       .Case("bmi", HasBMI)
3348       .Case("bmi2", HasBMI2)
3349       .Case("cx16", HasCX16)
3350       .Case("f16c", HasF16C)
3351       .Case("fma", HasFMA)
3352       .Case("fma4", XOPLevel >= FMA4)
3353       .Case("fsgsbase", HasFSGSBASE)
3354       .Case("lzcnt", HasLZCNT)
3355       .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3356       .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3357       .Case("mmx", MMX3DNowLevel >= MMX)
3358       .Case("pclmul", HasPCLMUL)
3359       .Case("popcnt", HasPOPCNT)
3360       .Case("prfchw", HasPRFCHW)
3361       .Case("rdrnd", HasRDRND)
3362       .Case("rdseed", HasRDSEED)
3363       .Case("rtm", HasRTM)
3364       .Case("sha", HasSHA)
3365       .Case("sse", SSELevel >= SSE1)
3366       .Case("sse2", SSELevel >= SSE2)
3367       .Case("sse3", SSELevel >= SSE3)
3368       .Case("ssse3", SSELevel >= SSSE3)
3369       .Case("sse4.1", SSELevel >= SSE41)
3370       .Case("sse4.2", SSELevel >= SSE42)
3371       .Case("sse4a", XOPLevel >= SSE4A)
3372       .Case("tbm", HasTBM)
3373       .Case("x86", true)
3374       .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3375       .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
3376       .Case("xop", XOPLevel >= XOP)
3377       .Default(false);
3378 }
3379 
3380 // We can't use a generic validation scheme for the features accepted here
3381 // versus subtarget features accepted in the target attribute because the
3382 // bitfield structure that's initialized in the runtime only supports the
3383 // below currently rather than the full range of subtarget features. (See
3384 // X86TargetInfo::hasFeature for a somewhat comprehensive list).
3385 bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3386   return llvm::StringSwitch<bool>(FeatureStr)
3387       .Case("cmov", true)
3388       .Case("mmx", true)
3389       .Case("popcnt", true)
3390       .Case("sse", true)
3391       .Case("sse2", true)
3392       .Case("sse3", true)
3393       .Case("sse4.1", true)
3394       .Case("sse4.2", true)
3395       .Case("avx", true)
3396       .Case("avx2", true)
3397       .Case("sse4a", true)
3398       .Case("fma4", true)
3399       .Case("xop", true)
3400       .Case("fma", true)
3401       .Case("avx512f", true)
3402       .Case("bmi", true)
3403       .Case("bmi2", true)
3404       .Default(false);
3405 }
3406 
3407 bool
3408 X86TargetInfo::validateAsmConstraint(const char *&Name,
3409                                      TargetInfo::ConstraintInfo &Info) const {
3410   switch (*Name) {
3411   default: return false;
3412   // Constant constraints.
3413   case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3414             // instructions.
3415   case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3416             // x86_64 instructions.
3417   case 's':
3418     Info.setRequiresImmediate();
3419     return true;
3420   case 'I':
3421     Info.setRequiresImmediate(0, 31);
3422     return true;
3423   case 'J':
3424     Info.setRequiresImmediate(0, 63);
3425     return true;
3426   case 'K':
3427     Info.setRequiresImmediate(-128, 127);
3428     return true;
3429   case 'L':
3430     Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
3431     return true;
3432   case 'M':
3433     Info.setRequiresImmediate(0, 3);
3434     return true;
3435   case 'N':
3436     Info.setRequiresImmediate(0, 255);
3437     return true;
3438   case 'O':
3439     Info.setRequiresImmediate(0, 127);
3440     return true;
3441   // Register constraints.
3442   case 'Y': // 'Y' is the first character for several 2-character constraints.
3443     // Shift the pointer to the second character of the constraint.
3444     Name++;
3445     switch (*Name) {
3446     default:
3447       return false;
3448     case '0': // First SSE register.
3449     case 't': // Any SSE register, when SSE2 is enabled.
3450     case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3451     case 'm': // Any MMX register, when inter-unit moves enabled.
3452       Info.setAllowsRegister();
3453       return true;
3454     }
3455   case 'f': // Any x87 floating point stack register.
3456     // Constraint 'f' cannot be used for output operands.
3457     if (Info.ConstraintStr[0] == '=')
3458       return false;
3459     Info.setAllowsRegister();
3460     return true;
3461   case 'a': // eax.
3462   case 'b': // ebx.
3463   case 'c': // ecx.
3464   case 'd': // edx.
3465   case 'S': // esi.
3466   case 'D': // edi.
3467   case 'A': // edx:eax.
3468   case 't': // Top of floating point stack.
3469   case 'u': // Second from top of floating point stack.
3470   case 'q': // Any register accessible as [r]l: a, b, c, and d.
3471   case 'y': // Any MMX register.
3472   case 'x': // Any SSE register.
3473   case 'Q': // Any register accessible as [r]h: a, b, c, and d.
3474   case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3475   case 'l': // "Index" registers: any general register that can be used as an
3476             // index in a base+index memory access.
3477     Info.setAllowsRegister();
3478     return true;
3479   // Floating point constant constraints.
3480   case 'C': // SSE floating point constant.
3481   case 'G': // x87 floating point constant.
3482     return true;
3483   }
3484 }
3485 
3486 bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3487                                        unsigned Size) const {
3488   // Strip off constraint modifiers.
3489   while (Constraint[0] == '=' ||
3490          Constraint[0] == '+' ||
3491          Constraint[0] == '&')
3492     Constraint = Constraint.substr(1);
3493 
3494   return validateOperandSize(Constraint, Size);
3495 }
3496 
3497 bool X86TargetInfo::validateInputSize(StringRef Constraint,
3498                                       unsigned Size) const {
3499   return validateOperandSize(Constraint, Size);
3500 }
3501 
3502 bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3503                                         unsigned Size) const {
3504   switch (Constraint[0]) {
3505   default: break;
3506   case 'y':
3507     return Size <= 64;
3508   case 'f':
3509   case 't':
3510   case 'u':
3511     return Size <= 128;
3512   case 'x':
3513     if (SSELevel >= AVX512F)
3514       // 512-bit zmm registers can be used if target supports AVX512F.
3515       return Size <= 512U;
3516     else if (SSELevel >= AVX)
3517       // 256-bit ymm registers can be used if target supports AVX.
3518       return Size <= 256U;
3519     return Size <= 128U;
3520   case 'Y':
3521     // 'Y' is the first character for several 2-character constraints.
3522     switch (Constraint[1]) {
3523     default: break;
3524     case 'm':
3525       // 'Ym' is synonymous with 'y'.
3526       return Size <= 64;
3527     case 'i':
3528     case 't':
3529       // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3530       if (SSELevel >= AVX512F)
3531         return Size <= 512U;
3532       else if (SSELevel >= AVX)
3533         return Size <= 256U;
3534       return SSELevel >= SSE2 && Size <= 128U;
3535     }
3536 
3537   }
3538 
3539   return true;
3540 }
3541 
3542 std::string
3543 X86TargetInfo::convertConstraint(const char *&Constraint) const {
3544   switch (*Constraint) {
3545   case 'a': return std::string("{ax}");
3546   case 'b': return std::string("{bx}");
3547   case 'c': return std::string("{cx}");
3548   case 'd': return std::string("{dx}");
3549   case 'S': return std::string("{si}");
3550   case 'D': return std::string("{di}");
3551   case 'p': // address
3552     return std::string("im");
3553   case 't': // top of floating point stack.
3554     return std::string("{st}");
3555   case 'u': // second from top of floating point stack.
3556     return std::string("{st(1)}"); // second from top of floating point stack.
3557   default:
3558     return std::string(1, *Constraint);
3559   }
3560 }
3561 
3562 // X86-32 generic target
3563 class X86_32TargetInfo : public X86TargetInfo {
3564 public:
3565   X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
3566     DoubleAlign = LongLongAlign = 32;
3567     LongDoubleWidth = 96;
3568     LongDoubleAlign = 32;
3569     SuitableAlign = 128;
3570     DataLayoutString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
3571     SizeType = UnsignedInt;
3572     PtrDiffType = SignedInt;
3573     IntPtrType = SignedInt;
3574     RegParmMax = 3;
3575 
3576     // Use fpret for all types.
3577     RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3578                              (1 << TargetInfo::Double) |
3579                              (1 << TargetInfo::LongDouble));
3580 
3581     // x86-32 has atomics up to 8 bytes
3582     // FIXME: Check that we actually have cmpxchg8b before setting
3583     // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3584     MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
3585   }
3586   BuiltinVaListKind getBuiltinVaListKind() const override {
3587     return TargetInfo::CharPtrBuiltinVaList;
3588   }
3589 
3590   int getEHDataRegisterNumber(unsigned RegNo) const override {
3591     if (RegNo == 0) return 0;
3592     if (RegNo == 1) return 2;
3593     return -1;
3594   }
3595   bool validateOperandSize(StringRef Constraint,
3596                            unsigned Size) const override {
3597     switch (Constraint[0]) {
3598     default: break;
3599     case 'R':
3600     case 'q':
3601     case 'Q':
3602     case 'a':
3603     case 'b':
3604     case 'c':
3605     case 'd':
3606     case 'S':
3607     case 'D':
3608       return Size <= 32;
3609     case 'A':
3610       return Size <= 64;
3611     }
3612 
3613     return X86TargetInfo::validateOperandSize(Constraint, Size);
3614   }
3615 };
3616 
3617 class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3618 public:
3619   NetBSDI386TargetInfo(const llvm::Triple &Triple)
3620       : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
3621 
3622   unsigned getFloatEvalMethod() const override {
3623     unsigned Major, Minor, Micro;
3624     getTriple().getOSVersion(Major, Minor, Micro);
3625     // New NetBSD uses the default rounding mode.
3626     if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3627       return X86_32TargetInfo::getFloatEvalMethod();
3628     // NetBSD before 6.99.26 defaults to "double" rounding.
3629     return 1;
3630   }
3631 };
3632 
3633 class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3634 public:
3635   OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3636       : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
3637     SizeType = UnsignedLong;
3638     IntPtrType = SignedLong;
3639     PtrDiffType = SignedLong;
3640   }
3641 };
3642 
3643 class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3644 public:
3645   BitrigI386TargetInfo(const llvm::Triple &Triple)
3646       : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
3647     SizeType = UnsignedLong;
3648     IntPtrType = SignedLong;
3649     PtrDiffType = SignedLong;
3650   }
3651 };
3652 
3653 class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
3654 public:
3655   DarwinI386TargetInfo(const llvm::Triple &Triple)
3656       : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
3657     LongDoubleWidth = 128;
3658     LongDoubleAlign = 128;
3659     SuitableAlign = 128;
3660     SizeType = UnsignedLong;
3661     IntPtrType = SignedLong;
3662     DataLayoutString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
3663     HasAlignMac68kSupport = true;
3664   }
3665 
3666   bool handleTargetFeatures(std::vector<std::string> &Features,
3667                             DiagnosticsEngine &Diags) override {
3668     if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
3669                                                                   Diags))
3670       return false;
3671     // We now know the features we have: we can decide how to align vectors.
3672     MaxVectorAlign =
3673         hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
3674     return true;
3675   }
3676 };
3677 
3678 // x86-32 Windows target
3679 class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
3680 public:
3681   WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3682       : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
3683     WCharType = UnsignedShort;
3684     DoubleAlign = LongLongAlign = 64;
3685     bool IsWinCOFF =
3686         getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
3687     DataLayoutString = IsWinCOFF
3688                            ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3689                            : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
3690   }
3691   void getTargetDefines(const LangOptions &Opts,
3692                         MacroBuilder &Builder) const override {
3693     WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3694   }
3695 };
3696 
3697 // x86-32 Windows Visual Studio target
3698 class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
3699 public:
3700   MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
3701       : WindowsX86_32TargetInfo(Triple) {
3702     LongDoubleWidth = LongDoubleAlign = 64;
3703     LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3704   }
3705   void getTargetDefines(const LangOptions &Opts,
3706                         MacroBuilder &Builder) const override {
3707     WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3708     WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3709     // The value of the following reflects processor type.
3710     // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3711     // We lost the original triple, so we use the default.
3712     Builder.defineMacro("_M_IX86", "600");
3713   }
3714 };
3715 
3716 static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3717   // Mingw and cygwin define __declspec(a) to __attribute__((a)).  Clang supports
3718   // __declspec natively under -fms-extensions, but we define a no-op __declspec
3719   // macro anyway for pre-processor compatibility.
3720   if (Opts.MicrosoftExt)
3721     Builder.defineMacro("__declspec", "__declspec");
3722   else
3723     Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3724 
3725   if (!Opts.MicrosoftExt) {
3726     // Provide macros for all the calling convention keywords.  Provide both
3727     // single and double underscore prefixed variants.  These are available on
3728     // x64 as well as x86, even though they have no effect.
3729     const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3730     for (const char *CC : CCs) {
3731       std::string GCCSpelling = "__attribute__((__";
3732       GCCSpelling += CC;
3733       GCCSpelling += "__))";
3734       Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3735       Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3736     }
3737   }
3738 }
3739 
3740 static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3741   Builder.defineMacro("__MSVCRT__");
3742   Builder.defineMacro("__MINGW32__");
3743   addCygMingDefines(Opts, Builder);
3744 }
3745 
3746 // x86-32 MinGW target
3747 class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3748 public:
3749   MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3750       : WindowsX86_32TargetInfo(Triple) {}
3751   void getTargetDefines(const LangOptions &Opts,
3752                         MacroBuilder &Builder) const override {
3753     WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3754     DefineStd(Builder, "WIN32", Opts);
3755     DefineStd(Builder, "WINNT", Opts);
3756     Builder.defineMacro("_X86_");
3757     addMinGWDefines(Opts, Builder);
3758   }
3759 };
3760 
3761 // x86-32 Cygwin target
3762 class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3763 public:
3764   CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3765       : X86_32TargetInfo(Triple) {
3766     TLSSupported = false;
3767     WCharType = UnsignedShort;
3768     DoubleAlign = LongLongAlign = 64;
3769     DataLayoutString = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
3770   }
3771   void getTargetDefines(const LangOptions &Opts,
3772                         MacroBuilder &Builder) const override {
3773     X86_32TargetInfo::getTargetDefines(Opts, Builder);
3774     Builder.defineMacro("_X86_");
3775     Builder.defineMacro("__CYGWIN__");
3776     Builder.defineMacro("__CYGWIN32__");
3777     addCygMingDefines(Opts, Builder);
3778     DefineStd(Builder, "unix", Opts);
3779     if (Opts.CPlusPlus)
3780       Builder.defineMacro("_GNU_SOURCE");
3781   }
3782 };
3783 
3784 // x86-32 Haiku target
3785 class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3786 public:
3787   HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
3788     SizeType = UnsignedLong;
3789     IntPtrType = SignedLong;
3790     PtrDiffType = SignedLong;
3791     ProcessIDType = SignedLong;
3792     this->UserLabelPrefix = "";
3793     this->TLSSupported = false;
3794   }
3795   void getTargetDefines(const LangOptions &Opts,
3796                         MacroBuilder &Builder) const override {
3797     X86_32TargetInfo::getTargetDefines(Opts, Builder);
3798     Builder.defineMacro("__INTEL__");
3799     Builder.defineMacro("__HAIKU__");
3800   }
3801 };
3802 
3803 // RTEMS Target
3804 template<typename Target>
3805 class RTEMSTargetInfo : public OSTargetInfo<Target> {
3806 protected:
3807   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3808                     MacroBuilder &Builder) const override {
3809     // RTEMS defines; list based off of gcc output
3810 
3811     Builder.defineMacro("__rtems__");
3812     Builder.defineMacro("__ELF__");
3813   }
3814 
3815 public:
3816   RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3817     this->UserLabelPrefix = "";
3818 
3819     switch (Triple.getArch()) {
3820     default:
3821     case llvm::Triple::x86:
3822       // this->MCountName = ".mcount";
3823       break;
3824     case llvm::Triple::mips:
3825     case llvm::Triple::mipsel:
3826     case llvm::Triple::ppc:
3827     case llvm::Triple::ppc64:
3828     case llvm::Triple::ppc64le:
3829       // this->MCountName = "_mcount";
3830       break;
3831     case llvm::Triple::arm:
3832       // this->MCountName = "__mcount";
3833       break;
3834     }
3835   }
3836 };
3837 
3838 // x86-32 RTEMS target
3839 class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3840 public:
3841   RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
3842     SizeType = UnsignedLong;
3843     IntPtrType = SignedLong;
3844     PtrDiffType = SignedLong;
3845     this->UserLabelPrefix = "";
3846   }
3847   void getTargetDefines(const LangOptions &Opts,
3848                         MacroBuilder &Builder) const override {
3849     X86_32TargetInfo::getTargetDefines(Opts, Builder);
3850     Builder.defineMacro("__INTEL__");
3851     Builder.defineMacro("__rtems__");
3852   }
3853 };
3854 
3855 // x86-64 generic target
3856 class X86_64TargetInfo : public X86TargetInfo {
3857 public:
3858   X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
3859     const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
3860     bool IsWinCOFF =
3861         getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
3862     LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
3863     LongDoubleWidth = 128;
3864     LongDoubleAlign = 128;
3865     LargeArrayMinWidth = 128;
3866     LargeArrayAlign = 128;
3867     SuitableAlign = 128;
3868     SizeType    = IsX32 ? UnsignedInt      : UnsignedLong;
3869     PtrDiffType = IsX32 ? SignedInt        : SignedLong;
3870     IntPtrType  = IsX32 ? SignedInt        : SignedLong;
3871     IntMaxType  = IsX32 ? SignedLongLong   : SignedLong;
3872     Int64Type   = IsX32 ? SignedLongLong   : SignedLong;
3873     RegParmMax = 6;
3874 
3875     // Pointers are 32-bit in x32.
3876     DataLayoutString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3877                              : IsWinCOFF
3878                                    ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
3879                                    : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
3880 
3881     // Use fpret only for long double.
3882     RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
3883 
3884     // Use fp2ret for _Complex long double.
3885     ComplexLongDoubleUsesFP2Ret = true;
3886 
3887     // Make __builtin_ms_va_list available.
3888     HasBuiltinMSVaList = true;
3889 
3890     // x86-64 has atomics up to 16 bytes.
3891     MaxAtomicPromoteWidth = 128;
3892     MaxAtomicInlineWidth = 128;
3893   }
3894   BuiltinVaListKind getBuiltinVaListKind() const override {
3895     return TargetInfo::X86_64ABIBuiltinVaList;
3896   }
3897 
3898   int getEHDataRegisterNumber(unsigned RegNo) const override {
3899     if (RegNo == 0) return 0;
3900     if (RegNo == 1) return 1;
3901     return -1;
3902   }
3903 
3904   CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
3905     return (CC == CC_C ||
3906             CC == CC_X86VectorCall ||
3907             CC == CC_IntelOclBicc ||
3908             CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
3909   }
3910 
3911   CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
3912     return CC_C;
3913   }
3914 
3915   // for x32 we need it here explicitly
3916   bool hasInt128Type() const override { return true; }
3917 };
3918 
3919 // x86-64 Windows target
3920 class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
3921 public:
3922   WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3923       : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
3924     WCharType = UnsignedShort;
3925     LongWidth = LongAlign = 32;
3926     DoubleAlign = LongLongAlign = 64;
3927     IntMaxType = SignedLongLong;
3928     Int64Type = SignedLongLong;
3929     SizeType = UnsignedLongLong;
3930     PtrDiffType = SignedLongLong;
3931     IntPtrType = SignedLongLong;
3932     this->UserLabelPrefix = "";
3933   }
3934 
3935   void getTargetDefines(const LangOptions &Opts,
3936                                 MacroBuilder &Builder) const override {
3937     WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
3938     Builder.defineMacro("_WIN64");
3939   }
3940 
3941   BuiltinVaListKind getBuiltinVaListKind() const override {
3942     return TargetInfo::CharPtrBuiltinVaList;
3943   }
3944 
3945   CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
3946     switch (CC) {
3947     case CC_X86StdCall:
3948     case CC_X86ThisCall:
3949     case CC_X86FastCall:
3950       return CCCR_Ignore;
3951     case CC_C:
3952     case CC_X86VectorCall:
3953     case CC_IntelOclBicc:
3954     case CC_X86_64SysV:
3955       return CCCR_OK;
3956     default:
3957       return CCCR_Warning;
3958     }
3959   }
3960 };
3961 
3962 // x86-64 Windows Visual Studio target
3963 class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
3964 public:
3965   MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
3966       : WindowsX86_64TargetInfo(Triple) {
3967     LongDoubleWidth = LongDoubleAlign = 64;
3968     LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3969   }
3970   void getTargetDefines(const LangOptions &Opts,
3971                         MacroBuilder &Builder) const override {
3972     WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3973     WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
3974     Builder.defineMacro("_M_X64", "100");
3975     Builder.defineMacro("_M_AMD64", "100");
3976   }
3977 };
3978 
3979 // x86-64 MinGW target
3980 class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3981 public:
3982   MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3983       : WindowsX86_64TargetInfo(Triple) {}
3984   void getTargetDefines(const LangOptions &Opts,
3985                         MacroBuilder &Builder) const override {
3986     WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3987     DefineStd(Builder, "WIN64", Opts);
3988     Builder.defineMacro("__MINGW64__");
3989     addMinGWDefines(Opts, Builder);
3990 
3991     // GCC defines this macro when it is using __gxx_personality_seh0.
3992     if (!Opts.SjLjExceptions)
3993       Builder.defineMacro("__SEH__");
3994   }
3995 };
3996 
3997 // x86-64 Cygwin target
3998 class CygwinX86_64TargetInfo : public X86_64TargetInfo {
3999 public:
4000   CygwinX86_64TargetInfo(const llvm::Triple &Triple)
4001       : X86_64TargetInfo(Triple) {
4002     TLSSupported = false;
4003     WCharType = UnsignedShort;
4004   }
4005   void getTargetDefines(const LangOptions &Opts,
4006                         MacroBuilder &Builder) const override {
4007     X86_64TargetInfo::getTargetDefines(Opts, Builder);
4008     Builder.defineMacro("__x86_64__");
4009     Builder.defineMacro("__CYGWIN__");
4010     Builder.defineMacro("__CYGWIN64__");
4011     addCygMingDefines(Opts, Builder);
4012     DefineStd(Builder, "unix", Opts);
4013     if (Opts.CPlusPlus)
4014       Builder.defineMacro("_GNU_SOURCE");
4015 
4016     // GCC defines this macro when it is using __gxx_personality_seh0.
4017     if (!Opts.SjLjExceptions)
4018       Builder.defineMacro("__SEH__");
4019   }
4020 };
4021 
4022 class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4023 public:
4024   DarwinX86_64TargetInfo(const llvm::Triple &Triple)
4025       : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
4026     Int64Type = SignedLongLong;
4027     // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4028     llvm::Triple T = llvm::Triple(Triple);
4029     if (T.isiOS())
4030       UseSignedCharForObjCBool = false;
4031     DataLayoutString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
4032   }
4033 
4034   bool handleTargetFeatures(std::vector<std::string> &Features,
4035                             DiagnosticsEngine &Diags) override {
4036     if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4037                                                                   Diags))
4038       return false;
4039     // We now know the features we have: we can decide how to align vectors.
4040     MaxVectorAlign =
4041         hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
4042     return true;
4043   }
4044 };
4045 
4046 class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4047 public:
4048   OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
4049       : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
4050     IntMaxType = SignedLongLong;
4051     Int64Type = SignedLongLong;
4052   }
4053 };
4054 
4055 class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4056 public:
4057   BitrigX86_64TargetInfo(const llvm::Triple &Triple)
4058       : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
4059     IntMaxType = SignedLongLong;
4060     Int64Type = SignedLongLong;
4061   }
4062 };
4063 
4064 class ARMTargetInfo : public TargetInfo {
4065   // Possible FPU choices.
4066   enum FPUMode {
4067     VFP2FPU = (1 << 0),
4068     VFP3FPU = (1 << 1),
4069     VFP4FPU = (1 << 2),
4070     NeonFPU = (1 << 3),
4071     FPARMV8 = (1 << 4)
4072   };
4073 
4074   // Possible HWDiv features.
4075   enum HWDivMode {
4076     HWDivThumb = (1 << 0),
4077     HWDivARM = (1 << 1)
4078   };
4079 
4080   static bool FPUModeIsVFP(FPUMode Mode) {
4081     return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
4082   }
4083 
4084   static const TargetInfo::GCCRegAlias GCCRegAliases[];
4085   static const char * const GCCRegNames[];
4086 
4087   std::string ABI, CPU;
4088 
4089   StringRef DefaultCPU;
4090   StringRef CPUProfile;
4091   StringRef CPUAttr;
4092 
4093   enum {
4094     FP_Default,
4095     FP_VFP,
4096     FP_Neon
4097   } FPMath;
4098 
4099   unsigned ArchISA;
4100   unsigned ArchKind;
4101   unsigned ArchProfile;
4102   unsigned ArchVersion;
4103 
4104   unsigned FPU : 5;
4105 
4106   unsigned IsAAPCS : 1;
4107   unsigned HWDiv : 2;
4108 
4109   // Initialized via features.
4110   unsigned SoftFloat : 1;
4111   unsigned SoftFloatABI : 1;
4112 
4113   unsigned CRC : 1;
4114   unsigned Crypto : 1;
4115   unsigned DSP : 1;
4116   unsigned Unaligned : 1;
4117 
4118   enum {
4119     LDREX_B = (1 << 0), /// byte (8-bit)
4120     LDREX_H = (1 << 1), /// half (16-bit)
4121     LDREX_W = (1 << 2), /// word (32-bit)
4122     LDREX_D = (1 << 3), /// double (64-bit)
4123   };
4124 
4125   uint32_t LDREX;
4126 
4127   // ACLE 6.5.1 Hardware floating point
4128   enum {
4129     HW_FP_HP = (1 << 1), /// half (16-bit)
4130     HW_FP_SP = (1 << 2), /// single (32-bit)
4131     HW_FP_DP = (1 << 3), /// double (64-bit)
4132   };
4133   uint32_t HW_FP;
4134 
4135   static const Builtin::Info BuiltinInfo[];
4136 
4137   void setABIAAPCS() {
4138     IsAAPCS = true;
4139 
4140     DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4141     const llvm::Triple &T = getTriple();
4142 
4143     // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4144     if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4145         T.getOS() == llvm::Triple::Bitrig)
4146       SizeType = UnsignedLong;
4147     else
4148       SizeType = UnsignedInt;
4149 
4150     switch (T.getOS()) {
4151     case llvm::Triple::NetBSD:
4152       WCharType = SignedInt;
4153       break;
4154     case llvm::Triple::Win32:
4155       WCharType = UnsignedShort;
4156       break;
4157     case llvm::Triple::Linux:
4158     default:
4159       // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4160       WCharType = UnsignedInt;
4161       break;
4162     }
4163 
4164     UseBitFieldTypeAlignment = true;
4165 
4166     ZeroLengthBitfieldBoundary = 0;
4167 
4168     // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4169     // so set preferred for small types to 32.
4170     if (T.isOSBinFormatMachO()) {
4171       DataLayoutString =
4172           BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4173                     : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
4174     } else if (T.isOSWindows()) {
4175       assert(!BigEndian && "Windows on ARM does not support big endian");
4176       DataLayoutString = "e"
4177                          "-m:w"
4178                          "-p:32:32"
4179                          "-i64:64"
4180                          "-v128:64:128"
4181                          "-a:0:32"
4182                          "-n32"
4183                          "-S64";
4184     } else if (T.isOSNaCl()) {
4185       assert(!BigEndian && "NaCl on ARM does not support big endian");
4186       DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
4187     } else {
4188       DataLayoutString =
4189           BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4190                     : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
4191     }
4192 
4193     // FIXME: Enumerated types are variable width in straight AAPCS.
4194   }
4195 
4196   void setABIAPCS() {
4197     const llvm::Triple &T = getTriple();
4198 
4199     IsAAPCS = false;
4200 
4201     DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
4202 
4203     // size_t is unsigned int on FreeBSD.
4204     if (T.getOS() == llvm::Triple::FreeBSD)
4205       SizeType = UnsignedInt;
4206     else
4207       SizeType = UnsignedLong;
4208 
4209     // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4210     WCharType = SignedInt;
4211 
4212     // Do not respect the alignment of bit-field types when laying out
4213     // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4214     UseBitFieldTypeAlignment = false;
4215 
4216     /// gcc forces the alignment to 4 bytes, regardless of the type of the
4217     /// zero length bitfield.  This corresponds to EMPTY_FIELD_BOUNDARY in
4218     /// gcc.
4219     ZeroLengthBitfieldBoundary = 32;
4220 
4221     if (T.isOSBinFormatMachO())
4222       DataLayoutString =
4223           BigEndian
4224               ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4225               : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
4226     else
4227       DataLayoutString =
4228           BigEndian
4229               ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4230               : "e-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
4231 
4232     // FIXME: Override "preferred align" for double and long long.
4233   }
4234 
4235   void setArchInfo() {
4236     StringRef ArchName = getTriple().getArchName();
4237 
4238     ArchISA    = llvm::ARM::parseArchISA(ArchName);
4239     DefaultCPU = getDefaultCPU(ArchName);
4240 
4241     unsigned ArchKind = llvm::ARM::parseArch(ArchName);
4242     if (ArchKind == llvm::ARM::AK_INVALID)
4243       // set arch of the CPU, either provided explicitly or hardcoded default
4244       ArchKind = llvm::ARM::parseCPUArch(CPU);
4245     setArchInfo(ArchKind);
4246   }
4247 
4248   void setArchInfo(unsigned Kind) {
4249     StringRef SubArch;
4250 
4251     // cache TargetParser info
4252     ArchKind    = Kind;
4253     SubArch     = llvm::ARM::getSubArch(ArchKind);
4254     ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4255     ArchVersion = llvm::ARM::parseArchVersion(SubArch);
4256 
4257     // cache CPU related strings
4258     CPUAttr    = getCPUAttr();
4259     CPUProfile = getCPUProfile();
4260   }
4261 
4262   void setAtomic() {
4263     // when triple does not specify a sub arch,
4264     // then we are not using inline atomics
4265     bool ShouldUseInlineAtomic = DefaultCPU.empty() ?
4266                                  false :
4267                    (ArchISA == llvm::ARM::IK_ARM   && ArchVersion >= 6) ||
4268                    (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
4269     // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4270     if (ArchProfile == llvm::ARM::PK_M) {
4271       MaxAtomicPromoteWidth = 32;
4272       if (ShouldUseInlineAtomic)
4273         MaxAtomicInlineWidth = 32;
4274     }
4275     else {
4276       MaxAtomicPromoteWidth = 64;
4277       if (ShouldUseInlineAtomic)
4278         MaxAtomicInlineWidth = 64;
4279     }
4280   }
4281 
4282   bool isThumb() const {
4283     return (ArchISA == llvm::ARM::IK_THUMB);
4284   }
4285 
4286   bool supportsThumb() const {
4287     return CPUAttr.count('T') || ArchVersion >= 6;
4288   }
4289 
4290   bool supportsThumb2() const {
4291     return CPUAttr.equals("6T2") || ArchVersion >= 7;
4292   }
4293 
4294   StringRef getDefaultCPU(StringRef ArchName) const {
4295     return llvm::ARM::getDefaultCPU(ArchName);
4296   }
4297 
4298   StringRef getCPUAttr() const {
4299     // For most sub-arches, the build attribute CPU name is enough.
4300     // For Cortex variants, it's slightly different.
4301     switch(ArchKind) {
4302     default:
4303       return llvm::ARM::getCPUAttr(ArchKind);
4304     case llvm::ARM::AK_ARMV6M:
4305     case llvm::ARM::AK_ARMV6SM:
4306     case llvm::ARM::AK_ARMV6HL:
4307       return "6M";
4308     case llvm::ARM::AK_ARMV7S:
4309       return "7S";
4310     case llvm::ARM::AK_ARMV7:
4311     case llvm::ARM::AK_ARMV7A:
4312     case llvm::ARM::AK_ARMV7L:
4313     case llvm::ARM::AK_ARMV7HL:
4314       return "7A";
4315     case llvm::ARM::AK_ARMV7R:
4316       return "7R";
4317     case llvm::ARM::AK_ARMV7M:
4318       return "7M";
4319     case llvm::ARM::AK_ARMV7EM:
4320       return "7EM";
4321     case llvm::ARM::AK_ARMV8A:
4322       return "8A";
4323     case llvm::ARM::AK_ARMV8_1A:
4324       return "8_1A";
4325     }
4326   }
4327 
4328   StringRef getCPUProfile() const {
4329     switch(ArchProfile) {
4330     case llvm::ARM::PK_A:
4331       return "A";
4332     case llvm::ARM::PK_R:
4333       return "R";
4334     case llvm::ARM::PK_M:
4335       return "M";
4336     default:
4337       return "";
4338     }
4339   }
4340 
4341 public:
4342   ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
4343       : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
4344         IsAAPCS(true), LDREX(0), HW_FP(0) {
4345     BigEndian = IsBigEndian;
4346 
4347     switch (getTriple().getOS()) {
4348     case llvm::Triple::NetBSD:
4349       PtrDiffType = SignedLong;
4350       break;
4351     default:
4352       PtrDiffType = SignedInt;
4353       break;
4354     }
4355 
4356     // cache arch related info
4357     setArchInfo();
4358 
4359     // {} in inline assembly are neon specifiers, not assembly variant
4360     // specifiers.
4361     NoAsmVariants = true;
4362 
4363     // FIXME: This duplicates code from the driver that sets the -target-abi
4364     // option - this code is used if -target-abi isn't passed and should
4365     // be unified in some way.
4366     if (Triple.isOSBinFormatMachO()) {
4367       // The backend is hardwired to assume AAPCS for M-class processors, ensure
4368       // the frontend matches that.
4369       if (Triple.getEnvironment() == llvm::Triple::EABI ||
4370           Triple.getOS() == llvm::Triple::UnknownOS ||
4371           StringRef(CPU).startswith("cortex-m")) {
4372         setABI("aapcs");
4373       } else {
4374         setABI("apcs-gnu");
4375       }
4376     } else if (Triple.isOSWindows()) {
4377       // FIXME: this is invalid for WindowsCE
4378       setABI("aapcs");
4379     } else {
4380       // Select the default based on the platform.
4381       switch (Triple.getEnvironment()) {
4382       case llvm::Triple::Android:
4383       case llvm::Triple::GNUEABI:
4384       case llvm::Triple::GNUEABIHF:
4385         setABI("aapcs-linux");
4386         break;
4387       case llvm::Triple::EABIHF:
4388       case llvm::Triple::EABI:
4389         setABI("aapcs");
4390         break;
4391       case llvm::Triple::GNU:
4392 	setABI("apcs-gnu");
4393 	break;
4394       default:
4395         if (Triple.getOS() == llvm::Triple::NetBSD)
4396           setABI("apcs-gnu");
4397         else
4398           setABI("aapcs");
4399         break;
4400       }
4401     }
4402 
4403     // ARM targets default to using the ARM C++ ABI.
4404     TheCXXABI.set(TargetCXXABI::GenericARM);
4405 
4406     // ARM has atomics up to 8 bytes
4407     setAtomic();
4408 
4409     // Do force alignment of members that follow zero length bitfields.  If
4410     // the alignment of the zero-length bitfield is greater than the member
4411     // that follows it, `bar', `bar' will be aligned as the  type of the
4412     // zero length bitfield.
4413     UseZeroLengthBitfieldAlignment = true;
4414   }
4415 
4416   StringRef getABI() const override { return ABI; }
4417 
4418   bool setABI(const std::string &Name) override {
4419     ABI = Name;
4420 
4421     // The defaults (above) are for AAPCS, check if we need to change them.
4422     //
4423     // FIXME: We need support for -meabi... we could just mangle it into the
4424     // name.
4425     if (Name == "apcs-gnu") {
4426       setABIAPCS();
4427       return true;
4428     }
4429     if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4430       setABIAAPCS();
4431       return true;
4432     }
4433     return false;
4434   }
4435 
4436   // FIXME: This should be based on Arch attributes, not CPU names.
4437   bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4438                       StringRef CPU,
4439                       std::vector<std::string> &FeaturesVec) const override {
4440 
4441     std::vector<const char*> TargetFeatures;
4442 
4443     // get default FPU features
4444     unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU);
4445     llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4446 
4447     // get default Extension features
4448     unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU);
4449     llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4450 
4451     for (const char *Feature : TargetFeatures)
4452       if (Feature[0] == '+')
4453         Features[Feature+1] = true;
4454 
4455     return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
4456   }
4457 
4458   bool handleTargetFeatures(std::vector<std::string> &Features,
4459                             DiagnosticsEngine &Diags) override {
4460     FPU = 0;
4461     CRC = 0;
4462     Crypto = 0;
4463     DSP = 0;
4464     Unaligned = 1;
4465     SoftFloat = SoftFloatABI = false;
4466     HWDiv = 0;
4467 
4468     // This does not diagnose illegal cases like having both
4469     // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4470     uint32_t HW_FP_remove = 0;
4471     for (const auto &Feature : Features) {
4472       if (Feature == "+soft-float") {
4473         SoftFloat = true;
4474       } else if (Feature == "+soft-float-abi") {
4475         SoftFloatABI = true;
4476       } else if (Feature == "+vfp2") {
4477         FPU |= VFP2FPU;
4478         HW_FP |= HW_FP_SP | HW_FP_DP;
4479       } else if (Feature == "+vfp3") {
4480         FPU |= VFP3FPU;
4481         HW_FP |= HW_FP_SP | HW_FP_DP;
4482       } else if (Feature == "+vfp4") {
4483         FPU |= VFP4FPU;
4484         HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
4485       } else if (Feature == "+fp-armv8") {
4486         FPU |= FPARMV8;
4487         HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
4488       } else if (Feature == "+neon") {
4489         FPU |= NeonFPU;
4490         HW_FP |= HW_FP_SP | HW_FP_DP;
4491       } else if (Feature == "+hwdiv") {
4492         HWDiv |= HWDivThumb;
4493       } else if (Feature == "+hwdiv-arm") {
4494         HWDiv |= HWDivARM;
4495       } else if (Feature == "+crc") {
4496         CRC = 1;
4497       } else if (Feature == "+crypto") {
4498         Crypto = 1;
4499       } else if (Feature == "+t2dsp") {
4500         DSP = 1;
4501       } else if (Feature == "+fp-only-sp") {
4502         HW_FP_remove |= HW_FP_DP | HW_FP_HP;
4503       } else if (Feature == "+strict-align") {
4504         Unaligned = 0;
4505       } else if (Feature == "+fp16") {
4506         HW_FP |= HW_FP_HP;
4507       }
4508     }
4509     HW_FP &= ~HW_FP_remove;
4510 
4511     switch (ArchVersion) {
4512     case 6:
4513       if (ArchProfile == llvm::ARM::PK_M)
4514         LDREX = 0;
4515       else if (ArchKind == llvm::ARM::AK_ARMV6K)
4516         LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4517       else
4518         LDREX = LDREX_W;
4519       break;
4520     case 7:
4521       if (ArchProfile == llvm::ARM::PK_M)
4522         LDREX = LDREX_W | LDREX_H | LDREX_B ;
4523       else
4524         LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4525       break;
4526     case 8:
4527       LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4528     }
4529 
4530     if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4531       Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4532       return false;
4533     }
4534 
4535     if (FPMath == FP_Neon)
4536       Features.push_back("+neonfp");
4537     else if (FPMath == FP_VFP)
4538       Features.push_back("-neonfp");
4539 
4540     // Remove front-end specific options which the backend handles differently.
4541     auto Feature =
4542         std::find(Features.begin(), Features.end(), "+soft-float-abi");
4543     if (Feature != Features.end())
4544       Features.erase(Feature);
4545 
4546     return true;
4547   }
4548 
4549   bool hasFeature(StringRef Feature) const override {
4550     return llvm::StringSwitch<bool>(Feature)
4551         .Case("arm", true)
4552         .Case("aarch32", true)
4553         .Case("softfloat", SoftFloat)
4554         .Case("thumb", isThumb())
4555         .Case("neon", (FPU & NeonFPU) && !SoftFloat)
4556         .Case("hwdiv", HWDiv & HWDivThumb)
4557         .Case("hwdiv-arm", HWDiv & HWDivARM)
4558         .Default(false);
4559   }
4560 
4561   bool setCPU(const std::string &Name) override {
4562     if (Name != "generic")
4563       setArchInfo(llvm::ARM::parseCPUArch(Name));
4564 
4565     if (ArchKind == llvm::ARM::AK_INVALID)
4566       return false;
4567     setAtomic();
4568     CPU = Name;
4569     return true;
4570   }
4571 
4572   bool setFPMath(StringRef Name) override;
4573 
4574   void getTargetDefines(const LangOptions &Opts,
4575                         MacroBuilder &Builder) const override {
4576     // Target identification.
4577     Builder.defineMacro("__arm");
4578     Builder.defineMacro("__arm__");
4579 
4580     // Target properties.
4581     Builder.defineMacro("__REGISTER_PREFIX__", "");
4582     if (!CPUAttr.empty())
4583       Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
4584 
4585     // ACLE 6.4.1 ARM/Thumb instruction set architecture
4586     // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4587     Builder.defineMacro("__ARM_ARCH", llvm::utostr(ArchVersion));
4588 
4589     if (ArchVersion >= 8) {
4590       // ACLE 6.5.7 Crypto Extension
4591       if (Crypto)
4592         Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
4593       // ACLE 6.5.8 CRC32 Extension
4594       if (CRC)
4595         Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
4596       // ACLE 6.5.10 Numeric Maximum and Minimum
4597       Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
4598       // ACLE 6.5.9 Directed Rounding
4599       Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
4600     }
4601 
4602     // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA.  It
4603     // is not defined for the M-profile.
4604     // NOTE that the deffault profile is assumed to be 'A'
4605     if (CPUProfile.empty() || CPUProfile != "M")
4606       Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4607 
4608     // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4609     // Thumb ISA (including v6-M).  It is set to 2 if the core supports the
4610     // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4611     if (supportsThumb2())
4612       Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4613     else if (supportsThumb())
4614       Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4615 
4616     // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4617     // instruction set such as ARM or Thumb.
4618     Builder.defineMacro("__ARM_32BIT_STATE", "1");
4619 
4620     // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4621 
4622     // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
4623     if (!CPUProfile.empty())
4624       Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
4625 
4626     // ACLE 6.4.3 Unaligned access supported in hardware
4627     if (Unaligned)
4628       Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
4629 
4630     // ACLE 6.4.4 LDREX/STREX
4631     if (LDREX)
4632       Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
4633 
4634     // ACLE 6.4.5 CLZ
4635     if (ArchVersion == 5 ||
4636        (ArchVersion == 6 && CPUProfile != "M") ||
4637         ArchVersion >  6)
4638       Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
4639 
4640     // ACLE 6.5.1 Hardware Floating Point
4641     if (HW_FP)
4642       Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
4643 
4644     // ACLE predefines.
4645     Builder.defineMacro("__ARM_ACLE", "200");
4646 
4647     // FP16 support (we currently only support IEEE format).
4648     Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
4649     Builder.defineMacro("__ARM_FP16_ARGS", "1");
4650 
4651     // ACLE 6.5.3 Fused multiply-accumulate (FMA)
4652     if (ArchVersion >= 7 && (CPUProfile != "M" || CPUAttr == "7EM"))
4653       Builder.defineMacro("__ARM_FEATURE_FMA", "1");
4654 
4655     // Subtarget options.
4656 
4657     // FIXME: It's more complicated than this and we don't really support
4658     // interworking.
4659     // Windows on ARM does not "support" interworking
4660     if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
4661       Builder.defineMacro("__THUMB_INTERWORK__");
4662 
4663     if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
4664       // Embedded targets on Darwin follow AAPCS, but not EABI.
4665       // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4666       if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
4667         Builder.defineMacro("__ARM_EABI__");
4668       Builder.defineMacro("__ARM_PCS", "1");
4669 
4670       if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
4671         Builder.defineMacro("__ARM_PCS_VFP", "1");
4672     }
4673 
4674     if (SoftFloat)
4675       Builder.defineMacro("__SOFTFP__");
4676 
4677     if (CPU == "xscale")
4678       Builder.defineMacro("__XSCALE__");
4679 
4680     if (isThumb()) {
4681       Builder.defineMacro("__THUMBEL__");
4682       Builder.defineMacro("__thumb__");
4683       if (supportsThumb2())
4684         Builder.defineMacro("__thumb2__");
4685     }
4686 
4687     // ACLE 6.4.9 32-bit SIMD instructions
4688     if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
4689       Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
4690 
4691     // ACLE 6.4.10 Hardware Integer Divide
4692     if (((HWDiv & HWDivThumb) && isThumb()) || ((HWDiv & HWDivARM) && !isThumb())) {
4693       Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
4694       Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
4695     }
4696 
4697     // Note, this is always on in gcc, even though it doesn't make sense.
4698     Builder.defineMacro("__APCS_32__");
4699 
4700     if (FPUModeIsVFP((FPUMode) FPU)) {
4701       Builder.defineMacro("__VFP_FP__");
4702       if (FPU & VFP2FPU)
4703         Builder.defineMacro("__ARM_VFPV2__");
4704       if (FPU & VFP3FPU)
4705         Builder.defineMacro("__ARM_VFPV3__");
4706       if (FPU & VFP4FPU)
4707         Builder.defineMacro("__ARM_VFPV4__");
4708     }
4709 
4710     // This only gets set when Neon instructions are actually available, unlike
4711     // the VFP define, hence the soft float and arch check. This is subtly
4712     // different from gcc, we follow the intent which was that it should be set
4713     // when Neon instructions are actually available.
4714     if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
4715       Builder.defineMacro("__ARM_NEON", "1");
4716       Builder.defineMacro("__ARM_NEON__");
4717       // current AArch32 NEON implementations do not support double-precision
4718       // floating-point even when it is present in VFP.
4719       Builder.defineMacro("__ARM_NEON_FP", "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
4720     }
4721 
4722     Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4723                         Opts.ShortWChar ? "2" : "4");
4724 
4725     Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4726                         Opts.ShortEnums ? "1" : "4");
4727 
4728     if (ArchVersion >= 6 && CPUAttr != "6M") {
4729       Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4730       Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4731       Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4732       Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4733     }
4734 
4735     // ACLE 6.4.7 DSP instructions
4736     if (DSP) {
4737       Builder.defineMacro("__ARM_FEATURE_DSP", "1");
4738     }
4739 
4740     // ACLE 6.4.8 Saturation instructions
4741     bool SAT = false;
4742     if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
4743       Builder.defineMacro("__ARM_FEATURE_SAT", "1");
4744       SAT = true;
4745     }
4746 
4747     // ACLE 6.4.6 Q (saturation) flag
4748     if (DSP || SAT)
4749       Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
4750 
4751     if (Opts.UnsafeFPMath)
4752       Builder.defineMacro("__ARM_FP_FAST", "1");
4753   }
4754 
4755   void getTargetBuiltins(const Builtin::Info *&Records,
4756                          unsigned &NumRecords) const override {
4757     Records = BuiltinInfo;
4758     NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
4759   }
4760   bool isCLZForZeroUndef() const override { return false; }
4761   BuiltinVaListKind getBuiltinVaListKind() const override {
4762     return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
4763   }
4764   void getGCCRegNames(const char * const *&Names,
4765                       unsigned &NumNames) const override;
4766   void getGCCRegAliases(const GCCRegAlias *&Aliases,
4767                         unsigned &NumAliases) const override;
4768   bool validateAsmConstraint(const char *&Name,
4769                              TargetInfo::ConstraintInfo &Info) const override {
4770     switch (*Name) {
4771     default: break;
4772     case 'l': // r0-r7
4773     case 'h': // r8-r15
4774     case 'w': // VFP Floating point register single precision
4775     case 'P': // VFP Floating point register double precision
4776       Info.setAllowsRegister();
4777       return true;
4778     case 'I':
4779     case 'J':
4780     case 'K':
4781     case 'L':
4782     case 'M':
4783       // FIXME
4784       return true;
4785     case 'Q': // A memory address that is a single base register.
4786       Info.setAllowsMemory();
4787       return true;
4788     case 'U': // a memory reference...
4789       switch (Name[1]) {
4790       case 'q': // ...ARMV4 ldrsb
4791       case 'v': // ...VFP load/store (reg+constant offset)
4792       case 'y': // ...iWMMXt load/store
4793       case 't': // address valid for load/store opaque types wider
4794                 // than 128-bits
4795       case 'n': // valid address for Neon doubleword vector load/store
4796       case 'm': // valid address for Neon element and structure load/store
4797       case 's': // valid address for non-offset loads/stores of quad-word
4798                 // values in four ARM registers
4799         Info.setAllowsMemory();
4800         Name++;
4801         return true;
4802       }
4803     }
4804     return false;
4805   }
4806   std::string convertConstraint(const char *&Constraint) const override {
4807     std::string R;
4808     switch (*Constraint) {
4809     case 'U':   // Two-character constraint; add "^" hint for later parsing.
4810       R = std::string("^") + std::string(Constraint, 2);
4811       Constraint++;
4812       break;
4813     case 'p': // 'p' should be translated to 'r' by default.
4814       R = std::string("r");
4815       break;
4816     default:
4817       return std::string(1, *Constraint);
4818     }
4819     return R;
4820   }
4821   bool
4822   validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
4823                              std::string &SuggestedModifier) const override {
4824     bool isOutput = (Constraint[0] == '=');
4825     bool isInOut = (Constraint[0] == '+');
4826 
4827     // Strip off constraint modifiers.
4828     while (Constraint[0] == '=' ||
4829            Constraint[0] == '+' ||
4830            Constraint[0] == '&')
4831       Constraint = Constraint.substr(1);
4832 
4833     switch (Constraint[0]) {
4834     default: break;
4835     case 'r': {
4836       switch (Modifier) {
4837       default:
4838         return (isInOut || isOutput || Size <= 64);
4839       case 'q':
4840         // A register of size 32 cannot fit a vector type.
4841         return false;
4842       }
4843     }
4844     }
4845 
4846     return true;
4847   }
4848   const char *getClobbers() const override {
4849     // FIXME: Is this really right?
4850     return "";
4851   }
4852 
4853   CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4854     return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4855   }
4856 
4857   int getEHDataRegisterNumber(unsigned RegNo) const override {
4858     if (RegNo == 0) return 0;
4859     if (RegNo == 1) return 1;
4860     return -1;
4861   }
4862 
4863   bool hasSjLjLowering() const override {
4864     return true;
4865   }
4866 };
4867 
4868 bool ARMTargetInfo::setFPMath(StringRef Name) {
4869   if (Name == "neon") {
4870     FPMath = FP_Neon;
4871     return true;
4872   } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4873              Name == "vfp4") {
4874     FPMath = FP_VFP;
4875     return true;
4876   }
4877   return false;
4878 }
4879 
4880 const char * const ARMTargetInfo::GCCRegNames[] = {
4881   // Integer registers
4882   "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4883   "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4884 
4885   // Float registers
4886   "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4887   "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4888   "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
4889   "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4890 
4891   // Double registers
4892   "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4893   "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
4894   "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4895   "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4896 
4897   // Quad registers
4898   "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4899   "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
4900 };
4901 
4902 void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
4903                                    unsigned &NumNames) const {
4904   Names = GCCRegNames;
4905   NumNames = llvm::array_lengthof(GCCRegNames);
4906 }
4907 
4908 const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
4909   { { "a1" }, "r0" },
4910   { { "a2" }, "r1" },
4911   { { "a3" }, "r2" },
4912   { { "a4" }, "r3" },
4913   { { "v1" }, "r4" },
4914   { { "v2" }, "r5" },
4915   { { "v3" }, "r6" },
4916   { { "v4" }, "r7" },
4917   { { "v5" }, "r8" },
4918   { { "v6", "rfp" }, "r9" },
4919   { { "sl" }, "r10" },
4920   { { "fp" }, "r11" },
4921   { { "ip" }, "r12" },
4922   { { "r13" }, "sp" },
4923   { { "r14" }, "lr" },
4924   { { "r15" }, "pc" },
4925   // The S, D and Q registers overlap, but aren't really aliases; we
4926   // don't want to substitute one of these for a different-sized one.
4927 };
4928 
4929 void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4930                                        unsigned &NumAliases) const {
4931   Aliases = GCCRegAliases;
4932   NumAliases = llvm::array_lengthof(GCCRegAliases);
4933 }
4934 
4935 const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
4936 #define BUILTIN(ID, TYPE, ATTRS) \
4937   { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
4938 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
4939   { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
4940 #include "clang/Basic/BuiltinsNEON.def"
4941 
4942 #define BUILTIN(ID, TYPE, ATTRS) \
4943   { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
4944 #define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
4945   { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
4946 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
4947   { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
4948 #include "clang/Basic/BuiltinsARM.def"
4949 };
4950 
4951 class ARMleTargetInfo : public ARMTargetInfo {
4952 public:
4953   ARMleTargetInfo(const llvm::Triple &Triple)
4954     : ARMTargetInfo(Triple, false) { }
4955   void getTargetDefines(const LangOptions &Opts,
4956                         MacroBuilder &Builder) const override {
4957     Builder.defineMacro("__ARMEL__");
4958     ARMTargetInfo::getTargetDefines(Opts, Builder);
4959   }
4960 };
4961 
4962 class ARMbeTargetInfo : public ARMTargetInfo {
4963 public:
4964   ARMbeTargetInfo(const llvm::Triple &Triple)
4965     : ARMTargetInfo(Triple, true) { }
4966   void getTargetDefines(const LangOptions &Opts,
4967                         MacroBuilder &Builder) const override {
4968     Builder.defineMacro("__ARMEB__");
4969     Builder.defineMacro("__ARM_BIG_ENDIAN");
4970     ARMTargetInfo::getTargetDefines(Opts, Builder);
4971   }
4972 };
4973 
4974 class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4975   const llvm::Triple Triple;
4976 public:
4977   WindowsARMTargetInfo(const llvm::Triple &Triple)
4978     : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4979     TLSSupported = false;
4980     WCharType = UnsignedShort;
4981     SizeType = UnsignedInt;
4982     UserLabelPrefix = "";
4983   }
4984   void getVisualStudioDefines(const LangOptions &Opts,
4985                               MacroBuilder &Builder) const {
4986     WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4987 
4988     // FIXME: this is invalid for WindowsCE
4989     Builder.defineMacro("_M_ARM_NT", "1");
4990     Builder.defineMacro("_M_ARMT", "_M_ARM");
4991     Builder.defineMacro("_M_THUMB", "_M_ARM");
4992 
4993     assert((Triple.getArch() == llvm::Triple::arm ||
4994             Triple.getArch() == llvm::Triple::thumb) &&
4995            "invalid architecture for Windows ARM target info");
4996     unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4997     Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4998 
4999     // TODO map the complete set of values
5000     // 31: VFPv3 40: VFPv4
5001     Builder.defineMacro("_M_ARM_FP", "31");
5002   }
5003   BuiltinVaListKind getBuiltinVaListKind() const override {
5004     return TargetInfo::CharPtrBuiltinVaList;
5005   }
5006   CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5007     switch (CC) {
5008     case CC_X86StdCall:
5009     case CC_X86ThisCall:
5010     case CC_X86FastCall:
5011     case CC_X86VectorCall:
5012       return CCCR_Ignore;
5013     case CC_C:
5014       return CCCR_OK;
5015     default:
5016       return CCCR_Warning;
5017     }
5018   }
5019 };
5020 
5021 // Windows ARM + Itanium C++ ABI Target
5022 class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5023 public:
5024   ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
5025     : WindowsARMTargetInfo(Triple) {
5026     TheCXXABI.set(TargetCXXABI::GenericARM);
5027   }
5028 
5029   void getTargetDefines(const LangOptions &Opts,
5030                         MacroBuilder &Builder) const override {
5031     WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5032 
5033     if (Opts.MSVCCompat)
5034       WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5035   }
5036 };
5037 
5038 // Windows ARM, MS (C++) ABI
5039 class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5040 public:
5041   MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
5042     : WindowsARMTargetInfo(Triple) {
5043     TheCXXABI.set(TargetCXXABI::Microsoft);
5044   }
5045 
5046   void getTargetDefines(const LangOptions &Opts,
5047                         MacroBuilder &Builder) const override {
5048     WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5049     WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5050   }
5051 };
5052 
5053 // ARM MinGW target
5054 class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5055 public:
5056   MinGWARMTargetInfo(const llvm::Triple &Triple)
5057       : WindowsARMTargetInfo(Triple) {
5058     TheCXXABI.set(TargetCXXABI::GenericARM);
5059   }
5060 
5061   void getTargetDefines(const LangOptions &Opts,
5062                         MacroBuilder &Builder) const override {
5063     WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5064     DefineStd(Builder, "WIN32", Opts);
5065     DefineStd(Builder, "WINNT", Opts);
5066     Builder.defineMacro("_ARM_");
5067     addMinGWDefines(Opts, Builder);
5068   }
5069 };
5070 
5071 // ARM Cygwin target
5072 class CygwinARMTargetInfo : public ARMleTargetInfo {
5073 public:
5074   CygwinARMTargetInfo(const llvm::Triple &Triple) : ARMleTargetInfo(Triple) {
5075     TLSSupported = false;
5076     WCharType = UnsignedShort;
5077     DoubleAlign = LongLongAlign = 64;
5078     DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
5079   }
5080   void getTargetDefines(const LangOptions &Opts,
5081                         MacroBuilder &Builder) const override {
5082     ARMleTargetInfo::getTargetDefines(Opts, Builder);
5083     Builder.defineMacro("_ARM_");
5084     Builder.defineMacro("__CYGWIN__");
5085     Builder.defineMacro("__CYGWIN32__");
5086     DefineStd(Builder, "unix", Opts);
5087     if (Opts.CPlusPlus)
5088       Builder.defineMacro("_GNU_SOURCE");
5089   }
5090 };
5091 
5092 class DarwinARMTargetInfo :
5093   public DarwinTargetInfo<ARMleTargetInfo> {
5094 protected:
5095   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5096                     MacroBuilder &Builder) const override {
5097     getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5098   }
5099 
5100 public:
5101   DarwinARMTargetInfo(const llvm::Triple &Triple)
5102       : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
5103     HasAlignMac68kSupport = true;
5104     // iOS always has 64-bit atomic instructions.
5105     // FIXME: This should be based off of the target features in
5106     // ARMleTargetInfo.
5107     MaxAtomicInlineWidth = 64;
5108 
5109     // Darwin on iOS uses a variant of the ARM C++ ABI.
5110     TheCXXABI.set(TargetCXXABI::iOS);
5111   }
5112 };
5113 
5114 class AArch64TargetInfo : public TargetInfo {
5115   virtual void setDataLayoutString() = 0;
5116   static const TargetInfo::GCCRegAlias GCCRegAliases[];
5117   static const char *const GCCRegNames[];
5118 
5119   enum FPUModeEnum {
5120     FPUMode,
5121     NeonMode
5122   };
5123 
5124   unsigned FPU;
5125   unsigned CRC;
5126   unsigned Crypto;
5127   unsigned Unaligned;
5128 
5129   static const Builtin::Info BuiltinInfo[];
5130 
5131   std::string ABI;
5132 
5133 public:
5134   AArch64TargetInfo(const llvm::Triple &Triple)
5135       : TargetInfo(Triple), ABI("aapcs") {
5136 
5137     if (getTriple().getOS() == llvm::Triple::NetBSD) {
5138       WCharType = SignedInt;
5139 
5140       // NetBSD apparently prefers consistency across ARM targets to consistency
5141       // across 64-bit targets.
5142       Int64Type = SignedLongLong;
5143       IntMaxType = SignedLongLong;
5144     } else {
5145       WCharType = UnsignedInt;
5146       Int64Type = SignedLong;
5147       IntMaxType = SignedLong;
5148     }
5149 
5150     LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
5151     MaxVectorAlign = 128;
5152     MaxAtomicInlineWidth = 128;
5153     MaxAtomicPromoteWidth = 128;
5154 
5155     LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
5156     LongDoubleFormat = &llvm::APFloat::IEEEquad;
5157 
5158     // {} in inline assembly are neon specifiers, not assembly variant
5159     // specifiers.
5160     NoAsmVariants = true;
5161 
5162     // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5163     // contributes to the alignment of the containing aggregate in the same way
5164     // a plain (non bit-field) member of that type would, without exception for
5165     // zero-sized or anonymous bit-fields."
5166     UseBitFieldTypeAlignment = true;
5167     UseZeroLengthBitfieldAlignment = true;
5168 
5169     // AArch64 targets default to using the ARM C++ ABI.
5170     TheCXXABI.set(TargetCXXABI::GenericAArch64);
5171   }
5172 
5173   StringRef getABI() const override { return ABI; }
5174   bool setABI(const std::string &Name) override {
5175     if (Name != "aapcs" && Name != "darwinpcs")
5176       return false;
5177 
5178     ABI = Name;
5179     return true;
5180   }
5181 
5182   bool setCPU(const std::string &Name) override {
5183     bool CPUKnown = llvm::StringSwitch<bool>(Name)
5184                         .Case("generic", true)
5185                         .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
5186                         .Case("cyclone", true)
5187                         .Default(false);
5188     return CPUKnown;
5189   }
5190 
5191   void getTargetDefines(const LangOptions &Opts,
5192                         MacroBuilder &Builder) const override {
5193     // Target identification.
5194     Builder.defineMacro("__aarch64__");
5195 
5196     // Target properties.
5197     Builder.defineMacro("_LP64");
5198     Builder.defineMacro("__LP64__");
5199 
5200     // ACLE predefines. Many can only have one possible value on v8 AArch64.
5201     Builder.defineMacro("__ARM_ACLE", "200");
5202     Builder.defineMacro("__ARM_ARCH", "8");
5203     Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5204 
5205     Builder.defineMacro("__ARM_64BIT_STATE", "1");
5206     Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
5207     Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
5208 
5209     Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5210     Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5211     Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5212     Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
5213     Builder.defineMacro("__ARM_FEATURE_DIV");  // For backwards compatibility
5214     Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5215     Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
5216 
5217     Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5218 
5219     // 0xe implies support for half, single and double precision operations.
5220     Builder.defineMacro("__ARM_FP", "0xE");
5221 
5222     // PCS specifies this for SysV variants, which is all we support. Other ABIs
5223     // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
5224     Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5225     Builder.defineMacro("__ARM_FP16_ARGS", "1");
5226 
5227     if (Opts.UnsafeFPMath)
5228       Builder.defineMacro("__ARM_FP_FAST", "1");
5229 
5230     Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5231 
5232     Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5233                         Opts.ShortEnums ? "1" : "4");
5234 
5235     if (FPU == NeonMode) {
5236       Builder.defineMacro("__ARM_NEON", "1");
5237       // 64-bit NEON supports half, single and double precision operations.
5238       Builder.defineMacro("__ARM_NEON_FP", "0xE");
5239     }
5240 
5241     if (CRC)
5242       Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5243 
5244     if (Crypto)
5245       Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5246 
5247     if (Unaligned)
5248       Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
5249 
5250     // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5251     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5252     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5253     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5254     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5255   }
5256 
5257   void getTargetBuiltins(const Builtin::Info *&Records,
5258                          unsigned &NumRecords) const override {
5259     Records = BuiltinInfo;
5260     NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
5261   }
5262 
5263   bool hasFeature(StringRef Feature) const override {
5264     return Feature == "aarch64" ||
5265       Feature == "arm64" ||
5266       Feature == "arm" ||
5267       (Feature == "neon" && FPU == NeonMode);
5268   }
5269 
5270   bool handleTargetFeatures(std::vector<std::string> &Features,
5271                             DiagnosticsEngine &Diags) override {
5272     FPU = FPUMode;
5273     CRC = 0;
5274     Crypto = 0;
5275     Unaligned = 1;
5276 
5277     for (const auto &Feature : Features) {
5278       if (Feature == "+neon")
5279         FPU = NeonMode;
5280       if (Feature == "+crc")
5281         CRC = 1;
5282       if (Feature == "+crypto")
5283         Crypto = 1;
5284       if (Feature == "+strict-align")
5285         Unaligned = 0;
5286     }
5287 
5288     setDataLayoutString();
5289 
5290     return true;
5291   }
5292 
5293   bool isCLZForZeroUndef() const override { return false; }
5294 
5295   BuiltinVaListKind getBuiltinVaListKind() const override {
5296     return TargetInfo::AArch64ABIBuiltinVaList;
5297   }
5298 
5299   void getGCCRegNames(const char *const *&Names,
5300                       unsigned &NumNames) const override;
5301   void getGCCRegAliases(const GCCRegAlias *&Aliases,
5302                         unsigned &NumAliases) const override;
5303 
5304   bool validateAsmConstraint(const char *&Name,
5305                              TargetInfo::ConstraintInfo &Info) const override {
5306     switch (*Name) {
5307     default:
5308       return false;
5309     case 'w': // Floating point and SIMD registers (V0-V31)
5310       Info.setAllowsRegister();
5311       return true;
5312     case 'I': // Constant that can be used with an ADD instruction
5313     case 'J': // Constant that can be used with a SUB instruction
5314     case 'K': // Constant that can be used with a 32-bit logical instruction
5315     case 'L': // Constant that can be used with a 64-bit logical instruction
5316     case 'M': // Constant that can be used as a 32-bit MOV immediate
5317     case 'N': // Constant that can be used as a 64-bit MOV immediate
5318     case 'Y': // Floating point constant zero
5319     case 'Z': // Integer constant zero
5320       return true;
5321     case 'Q': // A memory reference with base register and no offset
5322       Info.setAllowsMemory();
5323       return true;
5324     case 'S': // A symbolic address
5325       Info.setAllowsRegister();
5326       return true;
5327     case 'U':
5328       // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5329       // Utf: A memory address suitable for ldp/stp in TF mode.
5330       // Usa: An absolute symbolic address.
5331       // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5332       llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
5333     case 'z': // Zero register, wzr or xzr
5334       Info.setAllowsRegister();
5335       return true;
5336     case 'x': // Floating point and SIMD registers (V0-V15)
5337       Info.setAllowsRegister();
5338       return true;
5339     }
5340     return false;
5341   }
5342 
5343   bool
5344   validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
5345                              std::string &SuggestedModifier) const override {
5346     // Strip off constraint modifiers.
5347     while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5348       Constraint = Constraint.substr(1);
5349 
5350     switch (Constraint[0]) {
5351     default:
5352       return true;
5353     case 'z':
5354     case 'r': {
5355       switch (Modifier) {
5356       case 'x':
5357       case 'w':
5358         // For now assume that the person knows what they're
5359         // doing with the modifier.
5360         return true;
5361       default:
5362         // By default an 'r' constraint will be in the 'x'
5363         // registers.
5364         if (Size == 64)
5365           return true;
5366 
5367         SuggestedModifier = "w";
5368         return false;
5369       }
5370     }
5371     }
5372   }
5373 
5374   const char *getClobbers() const override { return ""; }
5375 
5376   int getEHDataRegisterNumber(unsigned RegNo) const override {
5377     if (RegNo == 0)
5378       return 0;
5379     if (RegNo == 1)
5380       return 1;
5381     return -1;
5382   }
5383 };
5384 
5385 const char *const AArch64TargetInfo::GCCRegNames[] = {
5386   // 32-bit Integer registers
5387   "w0",  "w1",  "w2",  "w3",  "w4",  "w5",  "w6",  "w7",  "w8",  "w9",  "w10",
5388   "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5389   "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5390 
5391   // 64-bit Integer registers
5392   "x0",  "x1",  "x2",  "x3",  "x4",  "x5",  "x6",  "x7",  "x8",  "x9",  "x10",
5393   "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5394   "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp",  "lr",  "sp",
5395 
5396   // 32-bit floating point regsisters
5397   "s0",  "s1",  "s2",  "s3",  "s4",  "s5",  "s6",  "s7",  "s8",  "s9",  "s10",
5398   "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5399   "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5400 
5401   // 64-bit floating point regsisters
5402   "d0",  "d1",  "d2",  "d3",  "d4",  "d5",  "d6",  "d7",  "d8",  "d9",  "d10",
5403   "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5404   "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5405 
5406   // Vector registers
5407   "v0",  "v1",  "v2",  "v3",  "v4",  "v5",  "v6",  "v7",  "v8",  "v9",  "v10",
5408   "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5409   "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5410 };
5411 
5412 void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
5413                                      unsigned &NumNames) const {
5414   Names = GCCRegNames;
5415   NumNames = llvm::array_lengthof(GCCRegNames);
5416 }
5417 
5418 const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
5419   { { "w31" }, "wsp" },
5420   { { "x29" }, "fp" },
5421   { { "x30" }, "lr" },
5422   { { "x31" }, "sp" },
5423   // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5424   // don't want to substitute one of these for a different-sized one.
5425 };
5426 
5427 void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5428                                        unsigned &NumAliases) const {
5429   Aliases = GCCRegAliases;
5430   NumAliases = llvm::array_lengthof(GCCRegAliases);
5431 }
5432 
5433 const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
5434 #define BUILTIN(ID, TYPE, ATTRS)                                               \
5435   { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
5436 #include "clang/Basic/BuiltinsNEON.def"
5437 
5438 #define BUILTIN(ID, TYPE, ATTRS)                                               \
5439   { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
5440 #include "clang/Basic/BuiltinsAArch64.def"
5441 };
5442 
5443 class AArch64leTargetInfo : public AArch64TargetInfo {
5444   void setDataLayoutString() override {
5445     if (getTriple().isOSBinFormatMachO())
5446       DataLayoutString = "e-m:o-i64:64-i128:128-n32:64-S128";
5447     else
5448       DataLayoutString = "e-m:e-i64:64-i128:128-n32:64-S128";
5449   }
5450 
5451 public:
5452   AArch64leTargetInfo(const llvm::Triple &Triple)
5453     : AArch64TargetInfo(Triple) {
5454     BigEndian = false;
5455     }
5456   void getTargetDefines(const LangOptions &Opts,
5457                         MacroBuilder &Builder) const override {
5458     Builder.defineMacro("__AARCH64EL__");
5459     AArch64TargetInfo::getTargetDefines(Opts, Builder);
5460   }
5461 };
5462 
5463 class AArch64beTargetInfo : public AArch64TargetInfo {
5464   void setDataLayoutString() override {
5465     assert(!getTriple().isOSBinFormatMachO());
5466     DataLayoutString = "E-m:e-i64:64-i128:128-n32:64-S128";
5467   }
5468 
5469 public:
5470   AArch64beTargetInfo(const llvm::Triple &Triple)
5471     : AArch64TargetInfo(Triple) { }
5472   void getTargetDefines(const LangOptions &Opts,
5473                         MacroBuilder &Builder) const override {
5474     Builder.defineMacro("__AARCH64EB__");
5475     Builder.defineMacro("__AARCH_BIG_ENDIAN");
5476     Builder.defineMacro("__ARM_BIG_ENDIAN");
5477     AArch64TargetInfo::getTargetDefines(Opts, Builder);
5478   }
5479 };
5480 
5481 class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
5482 protected:
5483   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5484                     MacroBuilder &Builder) const override {
5485     Builder.defineMacro("__AARCH64_SIMD__");
5486     Builder.defineMacro("__ARM64_ARCH_8__");
5487     Builder.defineMacro("__ARM_NEON__");
5488     Builder.defineMacro("__LITTLE_ENDIAN__");
5489     Builder.defineMacro("__REGISTER_PREFIX__", "");
5490     Builder.defineMacro("__arm64", "1");
5491     Builder.defineMacro("__arm64__", "1");
5492 
5493     getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5494   }
5495 
5496 public:
5497   DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5498       : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
5499     Int64Type = SignedLongLong;
5500     WCharType = SignedInt;
5501     UseSignedCharForObjCBool = false;
5502 
5503     LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
5504     LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5505 
5506     TheCXXABI.set(TargetCXXABI::iOS64);
5507   }
5508 
5509   BuiltinVaListKind getBuiltinVaListKind() const override {
5510     return TargetInfo::CharPtrBuiltinVaList;
5511   }
5512 };
5513 
5514 // Hexagon abstract base class
5515 class HexagonTargetInfo : public TargetInfo {
5516   static const Builtin::Info BuiltinInfo[];
5517   static const char * const GCCRegNames[];
5518   static const TargetInfo::GCCRegAlias GCCRegAliases[];
5519   std::string CPU;
5520 public:
5521   HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5522     BigEndian = false;
5523     DataLayoutString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
5524 
5525     // {} in inline assembly are packet specifiers, not assembly variant
5526     // specifiers.
5527     NoAsmVariants = true;
5528   }
5529 
5530   void getTargetBuiltins(const Builtin::Info *&Records,
5531                          unsigned &NumRecords) const override {
5532     Records = BuiltinInfo;
5533     NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5534   }
5535 
5536   bool validateAsmConstraint(const char *&Name,
5537                              TargetInfo::ConstraintInfo &Info) const override {
5538     return true;
5539   }
5540 
5541   void getTargetDefines(const LangOptions &Opts,
5542                         MacroBuilder &Builder) const override;
5543 
5544   bool hasFeature(StringRef Feature) const override {
5545     return Feature == "hexagon";
5546   }
5547 
5548   BuiltinVaListKind getBuiltinVaListKind() const override {
5549     return TargetInfo::CharPtrBuiltinVaList;
5550   }
5551   void getGCCRegNames(const char * const *&Names,
5552                       unsigned &NumNames) const override;
5553   void getGCCRegAliases(const GCCRegAlias *&Aliases,
5554                         unsigned &NumAliases) const override;
5555   const char *getClobbers() const override {
5556     return "";
5557   }
5558 
5559   static const char *getHexagonCPUSuffix(StringRef Name) {
5560     return llvm::StringSwitch<const char*>(Name)
5561       .Case("hexagonv4", "4")
5562       .Case("hexagonv5", "5")
5563       .Default(nullptr);
5564   }
5565 
5566   bool setCPU(const std::string &Name) override {
5567     if (!getHexagonCPUSuffix(Name))
5568       return false;
5569 
5570     CPU = Name;
5571     return true;
5572   }
5573 };
5574 
5575 void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5576                                 MacroBuilder &Builder) const {
5577   Builder.defineMacro("qdsp6");
5578   Builder.defineMacro("__qdsp6", "1");
5579   Builder.defineMacro("__qdsp6__", "1");
5580 
5581   Builder.defineMacro("hexagon");
5582   Builder.defineMacro("__hexagon", "1");
5583   Builder.defineMacro("__hexagon__", "1");
5584 
5585   if(CPU == "hexagonv1") {
5586     Builder.defineMacro("__HEXAGON_V1__");
5587     Builder.defineMacro("__HEXAGON_ARCH__", "1");
5588     if(Opts.HexagonQdsp6Compat) {
5589       Builder.defineMacro("__QDSP6_V1__");
5590       Builder.defineMacro("__QDSP6_ARCH__", "1");
5591     }
5592   }
5593   else if(CPU == "hexagonv2") {
5594     Builder.defineMacro("__HEXAGON_V2__");
5595     Builder.defineMacro("__HEXAGON_ARCH__", "2");
5596     if(Opts.HexagonQdsp6Compat) {
5597       Builder.defineMacro("__QDSP6_V2__");
5598       Builder.defineMacro("__QDSP6_ARCH__", "2");
5599     }
5600   }
5601   else if(CPU == "hexagonv3") {
5602     Builder.defineMacro("__HEXAGON_V3__");
5603     Builder.defineMacro("__HEXAGON_ARCH__", "3");
5604     if(Opts.HexagonQdsp6Compat) {
5605       Builder.defineMacro("__QDSP6_V3__");
5606       Builder.defineMacro("__QDSP6_ARCH__", "3");
5607     }
5608   }
5609   else if(CPU == "hexagonv4") {
5610     Builder.defineMacro("__HEXAGON_V4__");
5611     Builder.defineMacro("__HEXAGON_ARCH__", "4");
5612     if(Opts.HexagonQdsp6Compat) {
5613       Builder.defineMacro("__QDSP6_V4__");
5614       Builder.defineMacro("__QDSP6_ARCH__", "4");
5615     }
5616   }
5617   else if(CPU == "hexagonv5") {
5618     Builder.defineMacro("__HEXAGON_V5__");
5619     Builder.defineMacro("__HEXAGON_ARCH__", "5");
5620     if(Opts.HexagonQdsp6Compat) {
5621       Builder.defineMacro("__QDSP6_V5__");
5622       Builder.defineMacro("__QDSP6_ARCH__", "5");
5623     }
5624   }
5625 }
5626 
5627 const char * const HexagonTargetInfo::GCCRegNames[] = {
5628   "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5629   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5630   "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5631   "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5632   "p0", "p1", "p2", "p3",
5633   "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5634 };
5635 
5636 void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5637                                    unsigned &NumNames) const {
5638   Names = GCCRegNames;
5639   NumNames = llvm::array_lengthof(GCCRegNames);
5640 }
5641 
5642 
5643 const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5644   { { "sp" }, "r29" },
5645   { { "fp" }, "r30" },
5646   { { "lr" }, "r31" },
5647  };
5648 
5649 void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5650                                      unsigned &NumAliases) const {
5651   Aliases = GCCRegAliases;
5652   NumAliases = llvm::array_lengthof(GCCRegAliases);
5653 }
5654 
5655 
5656 const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5657 #define BUILTIN(ID, TYPE, ATTRS) \
5658   { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
5659 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5660   { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
5661 #include "clang/Basic/BuiltinsHexagon.def"
5662 };
5663 
5664 // Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5665 class SparcTargetInfo : public TargetInfo {
5666   static const TargetInfo::GCCRegAlias GCCRegAliases[];
5667   static const char * const GCCRegNames[];
5668   bool SoftFloat;
5669 public:
5670   SparcTargetInfo(const llvm::Triple &Triple)
5671       : TargetInfo(Triple), SoftFloat(false) {}
5672 
5673   bool handleTargetFeatures(std::vector<std::string> &Features,
5674                             DiagnosticsEngine &Diags) override {
5675     // The backend doesn't actually handle soft float yet, but in case someone
5676     // is using the support for the front end continue to support it.
5677     auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
5678     if (Feature != Features.end()) {
5679       SoftFloat = true;
5680       Features.erase(Feature);
5681     }
5682     return true;
5683   }
5684   void getTargetDefines(const LangOptions &Opts,
5685                         MacroBuilder &Builder) const override {
5686     DefineStd(Builder, "sparc", Opts);
5687     Builder.defineMacro("__REGISTER_PREFIX__", "");
5688 
5689     if (SoftFloat)
5690       Builder.defineMacro("SOFT_FLOAT", "1");
5691   }
5692 
5693   bool hasFeature(StringRef Feature) const override {
5694     return llvm::StringSwitch<bool>(Feature)
5695              .Case("softfloat", SoftFloat)
5696              .Case("sparc", true)
5697              .Default(false);
5698   }
5699 
5700   void getTargetBuiltins(const Builtin::Info *&Records,
5701                          unsigned &NumRecords) const override {
5702     // FIXME: Implement!
5703   }
5704   BuiltinVaListKind getBuiltinVaListKind() const override {
5705     return TargetInfo::VoidPtrBuiltinVaList;
5706   }
5707   void getGCCRegNames(const char * const *&Names,
5708                       unsigned &NumNames) const override;
5709   void getGCCRegAliases(const GCCRegAlias *&Aliases,
5710                         unsigned &NumAliases) const override;
5711   bool validateAsmConstraint(const char *&Name,
5712                              TargetInfo::ConstraintInfo &info) const override {
5713     // FIXME: Implement!
5714     switch (*Name) {
5715     case 'I': // Signed 13-bit constant
5716     case 'J': // Zero
5717     case 'K': // 32-bit constant with the low 12 bits clear
5718     case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5719     case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5720     case 'N': // Same as 'K' but zext (required for SIMode)
5721     case 'O': // The constant 4096
5722       return true;
5723     }
5724     return false;
5725   }
5726   const char *getClobbers() const override {
5727     // FIXME: Implement!
5728     return "";
5729   }
5730 };
5731 
5732 const char * const SparcTargetInfo::GCCRegNames[] = {
5733   "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5734   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5735   "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5736   "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5737 };
5738 
5739 void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5740                                      unsigned &NumNames) const {
5741   Names = GCCRegNames;
5742   NumNames = llvm::array_lengthof(GCCRegNames);
5743 }
5744 
5745 const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
5746   { { "g0" }, "r0" },
5747   { { "g1" }, "r1" },
5748   { { "g2" }, "r2" },
5749   { { "g3" }, "r3" },
5750   { { "g4" }, "r4" },
5751   { { "g5" }, "r5" },
5752   { { "g6" }, "r6" },
5753   { { "g7" }, "r7" },
5754   { { "o0" }, "r8" },
5755   { { "o1" }, "r9" },
5756   { { "o2" }, "r10" },
5757   { { "o3" }, "r11" },
5758   { { "o4" }, "r12" },
5759   { { "o5" }, "r13" },
5760   { { "o6", "sp" }, "r14" },
5761   { { "o7" }, "r15" },
5762   { { "l0" }, "r16" },
5763   { { "l1" }, "r17" },
5764   { { "l2" }, "r18" },
5765   { { "l3" }, "r19" },
5766   { { "l4" }, "r20" },
5767   { { "l5" }, "r21" },
5768   { { "l6" }, "r22" },
5769   { { "l7" }, "r23" },
5770   { { "i0" }, "r24" },
5771   { { "i1" }, "r25" },
5772   { { "i2" }, "r26" },
5773   { { "i3" }, "r27" },
5774   { { "i4" }, "r28" },
5775   { { "i5" }, "r29" },
5776   { { "i6", "fp" }, "r30" },
5777   { { "i7" }, "r31" },
5778 };
5779 
5780 void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5781                                        unsigned &NumAliases) const {
5782   Aliases = GCCRegAliases;
5783   NumAliases = llvm::array_lengthof(GCCRegAliases);
5784 }
5785 
5786 // SPARC v8 is the 32-bit mode selected by Triple::sparc.
5787 class SparcV8TargetInfo : public SparcTargetInfo {
5788 public:
5789   SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
5790     DataLayoutString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
5791     // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
5792     switch (getTriple().getOS()) {
5793     default:
5794       SizeType = UnsignedInt;
5795       IntPtrType = SignedInt;
5796       PtrDiffType = SignedInt;
5797       break;
5798     case llvm::Triple::NetBSD:
5799     case llvm::Triple::OpenBSD:
5800       SizeType = UnsignedLong;
5801       IntPtrType = SignedLong;
5802       PtrDiffType = SignedLong;
5803       break;
5804     }
5805   }
5806 
5807   void getTargetDefines(const LangOptions &Opts,
5808                         MacroBuilder &Builder) const override {
5809     SparcTargetInfo::getTargetDefines(Opts, Builder);
5810     Builder.defineMacro("__sparcv8");
5811   }
5812 };
5813 
5814 // SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
5815 class SparcV8elTargetInfo : public SparcV8TargetInfo {
5816  public:
5817   SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
5818     DataLayoutString = "e-m:e-p:32:32-i64:64-f128:64-n32-S64";
5819     BigEndian = false;
5820   }
5821 };
5822 
5823 // SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5824 class SparcV9TargetInfo : public SparcTargetInfo {
5825 public:
5826   SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
5827     // FIXME: Support Sparc quad-precision long double?
5828     DataLayoutString = "E-m:e-i64:64-n32:64-S128";
5829     // This is an LP64 platform.
5830     LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
5831 
5832     // OpenBSD uses long long for int64_t and intmax_t.
5833     if (getTriple().getOS() == llvm::Triple::OpenBSD)
5834       IntMaxType = SignedLongLong;
5835     else
5836       IntMaxType = SignedLong;
5837     Int64Type = IntMaxType;
5838 
5839     // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5840     // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5841     LongDoubleWidth = 128;
5842     LongDoubleAlign = 128;
5843     LongDoubleFormat = &llvm::APFloat::IEEEquad;
5844     MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5845   }
5846 
5847   void getTargetDefines(const LangOptions &Opts,
5848                         MacroBuilder &Builder) const override {
5849     SparcTargetInfo::getTargetDefines(Opts, Builder);
5850     Builder.defineMacro("__sparcv9");
5851     Builder.defineMacro("__arch64__");
5852     // Solaris doesn't need these variants, but the BSDs do.
5853     if (getTriple().getOS() != llvm::Triple::Solaris) {
5854       Builder.defineMacro("__sparc64__");
5855       Builder.defineMacro("__sparc_v9__");
5856       Builder.defineMacro("__sparcv9__");
5857     }
5858   }
5859 
5860   bool setCPU(const std::string &Name) override {
5861     bool CPUKnown = llvm::StringSwitch<bool>(Name)
5862       .Case("v9", true)
5863       .Case("ultrasparc", true)
5864       .Case("ultrasparc3", true)
5865       .Case("niagara", true)
5866       .Case("niagara2", true)
5867       .Case("niagara3", true)
5868       .Case("niagara4", true)
5869       .Default(false);
5870 
5871     // No need to store the CPU yet.  There aren't any CPU-specific
5872     // macros to define.
5873     return CPUKnown;
5874   }
5875 };
5876 
5877 class SystemZTargetInfo : public TargetInfo {
5878   static const Builtin::Info BuiltinInfo[];
5879   static const char *const GCCRegNames[];
5880   std::string CPU;
5881   bool HasTransactionalExecution;
5882   bool HasVector;
5883 
5884 public:
5885   SystemZTargetInfo(const llvm::Triple &Triple)
5886     : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false), HasVector(false) {
5887     IntMaxType = SignedLong;
5888     Int64Type = SignedLong;
5889     TLSSupported = true;
5890     IntWidth = IntAlign = 32;
5891     LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5892     PointerWidth = PointerAlign = 64;
5893     LongDoubleWidth = 128;
5894     LongDoubleAlign = 64;
5895     LongDoubleFormat = &llvm::APFloat::IEEEquad;
5896     DefaultAlignForAttributeAligned = 64;
5897     MinGlobalAlign = 16;
5898     DataLayoutString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5899     MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5900   }
5901   void getTargetDefines(const LangOptions &Opts,
5902                         MacroBuilder &Builder) const override {
5903     Builder.defineMacro("__s390__");
5904     Builder.defineMacro("__s390x__");
5905     Builder.defineMacro("__zarch__");
5906     Builder.defineMacro("__LONG_DOUBLE_128__");
5907     if (HasTransactionalExecution)
5908       Builder.defineMacro("__HTM__");
5909     if (Opts.ZVector)
5910       Builder.defineMacro("__VEC__", "10301");
5911   }
5912   void getTargetBuiltins(const Builtin::Info *&Records,
5913                          unsigned &NumRecords) const override {
5914     Records = BuiltinInfo;
5915     NumRecords = clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin;
5916   }
5917 
5918   void getGCCRegNames(const char *const *&Names,
5919                       unsigned &NumNames) const override;
5920   void getGCCRegAliases(const GCCRegAlias *&Aliases,
5921                         unsigned &NumAliases) const override {
5922     // No aliases.
5923     Aliases = nullptr;
5924     NumAliases = 0;
5925   }
5926   bool validateAsmConstraint(const char *&Name,
5927                              TargetInfo::ConstraintInfo &info) const override;
5928   const char *getClobbers() const override {
5929     // FIXME: Is this really right?
5930     return "";
5931   }
5932   BuiltinVaListKind getBuiltinVaListKind() const override {
5933     return TargetInfo::SystemZBuiltinVaList;
5934   }
5935   bool setCPU(const std::string &Name) override {
5936     CPU = Name;
5937     bool CPUKnown = llvm::StringSwitch<bool>(Name)
5938       .Case("z10", true)
5939       .Case("z196", true)
5940       .Case("zEC12", true)
5941       .Case("z13", true)
5942       .Default(false);
5943 
5944     return CPUKnown;
5945   }
5946   bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5947                       StringRef CPU,
5948                       std::vector<std::string> &FeaturesVec) const override {
5949     if (CPU == "zEC12")
5950       Features["transactional-execution"] = true;
5951     if (CPU == "z13") {
5952       Features["transactional-execution"] = true;
5953       Features["vector"] = true;
5954     }
5955     return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
5956   }
5957 
5958   bool handleTargetFeatures(std::vector<std::string> &Features,
5959                             DiagnosticsEngine &Diags) override {
5960     HasTransactionalExecution = false;
5961     for (const auto &Feature : Features) {
5962       if (Feature == "+transactional-execution")
5963         HasTransactionalExecution = true;
5964       else if (Feature == "+vector")
5965         HasVector = true;
5966     }
5967     // If we use the vector ABI, vector types are 64-bit aligned.
5968     if (HasVector) {
5969       MaxVectorAlign = 64;
5970       DataLayoutString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
5971                          "-v128:64-a:8:16-n32:64";
5972     }
5973     return true;
5974   }
5975 
5976   bool hasFeature(StringRef Feature) const override {
5977     return llvm::StringSwitch<bool>(Feature)
5978         .Case("systemz", true)
5979         .Case("htm", HasTransactionalExecution)
5980         .Case("vx", HasVector)
5981         .Default(false);
5982   }
5983 
5984   StringRef getABI() const override {
5985     if (HasVector)
5986       return "vector";
5987     return "";
5988   }
5989 
5990   bool useFloat128ManglingForLongDouble() const override {
5991     return true;
5992   }
5993 };
5994 
5995 const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
5996 #define BUILTIN(ID, TYPE, ATTRS)                                               \
5997   { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
5998 #include "clang/Basic/BuiltinsSystemZ.def"
5999 };
6000 
6001 const char *const SystemZTargetInfo::GCCRegNames[] = {
6002   "r0",  "r1",  "r2",  "r3",  "r4",  "r5",  "r6",  "r7",
6003   "r8",  "r9",  "r10", "r11", "r12", "r13", "r14", "r15",
6004   "f0",  "f2",  "f4",  "f6",  "f1",  "f3",  "f5",  "f7",
6005   "f8",  "f10", "f12", "f14", "f9",  "f11", "f13", "f15"
6006 };
6007 
6008 void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
6009                                        unsigned &NumNames) const {
6010   Names = GCCRegNames;
6011   NumNames = llvm::array_lengthof(GCCRegNames);
6012 }
6013 
6014 bool SystemZTargetInfo::
6015 validateAsmConstraint(const char *&Name,
6016                       TargetInfo::ConstraintInfo &Info) const {
6017   switch (*Name) {
6018   default:
6019     return false;
6020 
6021   case 'a': // Address register
6022   case 'd': // Data register (equivalent to 'r')
6023   case 'f': // Floating-point register
6024     Info.setAllowsRegister();
6025     return true;
6026 
6027   case 'I': // Unsigned 8-bit constant
6028   case 'J': // Unsigned 12-bit constant
6029   case 'K': // Signed 16-bit constant
6030   case 'L': // Signed 20-bit displacement (on all targets we support)
6031   case 'M': // 0x7fffffff
6032     return true;
6033 
6034   case 'Q': // Memory with base and unsigned 12-bit displacement
6035   case 'R': // Likewise, plus an index
6036   case 'S': // Memory with base and signed 20-bit displacement
6037   case 'T': // Likewise, plus an index
6038     Info.setAllowsMemory();
6039     return true;
6040   }
6041 }
6042 
6043 class MSP430TargetInfo : public TargetInfo {
6044   static const char *const GCCRegNames[];
6045 
6046 public:
6047   MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6048     BigEndian = false;
6049     TLSSupported = false;
6050     IntWidth = 16;
6051     IntAlign = 16;
6052     LongWidth = 32;
6053     LongLongWidth = 64;
6054     LongAlign = LongLongAlign = 16;
6055     PointerWidth = 16;
6056     PointerAlign = 16;
6057     SuitableAlign = 16;
6058     SizeType = UnsignedInt;
6059     IntMaxType = SignedLongLong;
6060     IntPtrType = SignedInt;
6061     PtrDiffType = SignedInt;
6062     SigAtomicType = SignedLong;
6063     DataLayoutString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
6064   }
6065   void getTargetDefines(const LangOptions &Opts,
6066                         MacroBuilder &Builder) const override {
6067     Builder.defineMacro("MSP430");
6068     Builder.defineMacro("__MSP430__");
6069     // FIXME: defines for different 'flavours' of MCU
6070   }
6071   void getTargetBuiltins(const Builtin::Info *&Records,
6072                          unsigned &NumRecords) const override {
6073     // FIXME: Implement.
6074     Records = nullptr;
6075     NumRecords = 0;
6076   }
6077   bool hasFeature(StringRef Feature) const override {
6078     return Feature == "msp430";
6079   }
6080   void getGCCRegNames(const char *const *&Names,
6081                       unsigned &NumNames) const override;
6082   void getGCCRegAliases(const GCCRegAlias *&Aliases,
6083                         unsigned &NumAliases) const override {
6084     // No aliases.
6085     Aliases = nullptr;
6086     NumAliases = 0;
6087   }
6088   bool validateAsmConstraint(const char *&Name,
6089                              TargetInfo::ConstraintInfo &info) const override {
6090     // FIXME: implement
6091     switch (*Name) {
6092     case 'K': // the constant 1
6093     case 'L': // constant -1^20 .. 1^19
6094     case 'M': // constant 1-4:
6095       return true;
6096     }
6097     // No target constraints for now.
6098     return false;
6099   }
6100   const char *getClobbers() const override {
6101     // FIXME: Is this really right?
6102     return "";
6103   }
6104   BuiltinVaListKind getBuiltinVaListKind() const override {
6105     // FIXME: implement
6106     return TargetInfo::CharPtrBuiltinVaList;
6107   }
6108 };
6109 
6110 const char *const MSP430TargetInfo::GCCRegNames[] = {
6111     "r0", "r1", "r2",  "r3",  "r4",  "r5",  "r6",  "r7",
6112     "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6113 
6114 void MSP430TargetInfo::getGCCRegNames(const char *const *&Names,
6115                                       unsigned &NumNames) const {
6116   Names = GCCRegNames;
6117   NumNames = llvm::array_lengthof(GCCRegNames);
6118 }
6119 
6120 // LLVM and Clang cannot be used directly to output native binaries for
6121 // target, but is used to compile C code to llvm bitcode with correct
6122 // type and alignment information.
6123 //
6124 // TCE uses the llvm bitcode as input and uses it for generating customized
6125 // target processor and program binary. TCE co-design environment is
6126 // publicly available in http://tce.cs.tut.fi
6127 
6128 static const unsigned TCEOpenCLAddrSpaceMap[] = {
6129     3, // opencl_global
6130     4, // opencl_local
6131     5, // opencl_constant
6132     // FIXME: generic has to be added to the target
6133     0, // opencl_generic
6134     0, // cuda_device
6135     0, // cuda_constant
6136     0  // cuda_shared
6137 };
6138 
6139 class TCETargetInfo : public TargetInfo {
6140 public:
6141   TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6142     TLSSupported = false;
6143     IntWidth = 32;
6144     LongWidth = LongLongWidth = 32;
6145     PointerWidth = 32;
6146     IntAlign = 32;
6147     LongAlign = LongLongAlign = 32;
6148     PointerAlign = 32;
6149     SuitableAlign = 32;
6150     SizeType = UnsignedInt;
6151     IntMaxType = SignedLong;
6152     IntPtrType = SignedInt;
6153     PtrDiffType = SignedInt;
6154     FloatWidth = 32;
6155     FloatAlign = 32;
6156     DoubleWidth = 32;
6157     DoubleAlign = 32;
6158     LongDoubleWidth = 32;
6159     LongDoubleAlign = 32;
6160     FloatFormat = &llvm::APFloat::IEEEsingle;
6161     DoubleFormat = &llvm::APFloat::IEEEsingle;
6162     LongDoubleFormat = &llvm::APFloat::IEEEsingle;
6163     DataLayoutString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
6164                        "-f64:32-v64:32-v128:32-a:0:32-n32";
6165     AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6166     UseAddrSpaceMapMangling = true;
6167   }
6168 
6169   void getTargetDefines(const LangOptions &Opts,
6170                         MacroBuilder &Builder) const override {
6171     DefineStd(Builder, "tce", Opts);
6172     Builder.defineMacro("__TCE__");
6173     Builder.defineMacro("__TCE_V1__");
6174   }
6175   bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6176 
6177   void getTargetBuiltins(const Builtin::Info *&Records,
6178                          unsigned &NumRecords) const override {}
6179   const char *getClobbers() const override { return ""; }
6180   BuiltinVaListKind getBuiltinVaListKind() const override {
6181     return TargetInfo::VoidPtrBuiltinVaList;
6182   }
6183   void getGCCRegNames(const char *const *&Names,
6184                       unsigned &NumNames) const override {}
6185   bool validateAsmConstraint(const char *&Name,
6186                              TargetInfo::ConstraintInfo &info) const override {
6187     return true;
6188   }
6189   void getGCCRegAliases(const GCCRegAlias *&Aliases,
6190                         unsigned &NumAliases) const override {}
6191 };
6192 
6193 class BPFTargetInfo : public TargetInfo {
6194 public:
6195   BPFTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6196     LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6197     SizeType    = UnsignedLong;
6198     PtrDiffType = SignedLong;
6199     IntPtrType  = SignedLong;
6200     IntMaxType  = SignedLong;
6201     Int64Type   = SignedLong;
6202     RegParmMax = 5;
6203     if (Triple.getArch() == llvm::Triple::bpfeb) {
6204       BigEndian = true;
6205       DataLayoutString = "E-m:e-p:64:64-i64:64-n32:64-S128";
6206     } else {
6207       BigEndian = false;
6208       DataLayoutString = "e-m:e-p:64:64-i64:64-n32:64-S128";
6209     }
6210     MaxAtomicPromoteWidth = 64;
6211     MaxAtomicInlineWidth = 64;
6212     TLSSupported = false;
6213   }
6214   void getTargetDefines(const LangOptions &Opts,
6215                         MacroBuilder &Builder) const override {
6216     DefineStd(Builder, "bpf", Opts);
6217     Builder.defineMacro("__BPF__");
6218   }
6219   bool hasFeature(StringRef Feature) const override {
6220     return Feature == "bpf";
6221   }
6222 
6223   void getTargetBuiltins(const Builtin::Info *&Records,
6224                          unsigned &NumRecords) const override {}
6225   const char *getClobbers() const override {
6226     return "";
6227   }
6228   BuiltinVaListKind getBuiltinVaListKind() const override {
6229     return TargetInfo::VoidPtrBuiltinVaList;
6230   }
6231   void getGCCRegNames(const char * const *&Names,
6232                       unsigned &NumNames) const override {
6233     Names = nullptr;
6234     NumNames = 0;
6235   }
6236   bool validateAsmConstraint(const char *&Name,
6237                              TargetInfo::ConstraintInfo &info) const override {
6238     return true;
6239   }
6240   void getGCCRegAliases(const GCCRegAlias *&Aliases,
6241                         unsigned &NumAliases) const override {
6242     Aliases = nullptr;
6243     NumAliases = 0;
6244   }
6245 };
6246 
6247 class MipsTargetInfoBase : public TargetInfo {
6248   virtual void setDataLayoutString() = 0;
6249 
6250   static const Builtin::Info BuiltinInfo[];
6251   std::string CPU;
6252   bool IsMips16;
6253   bool IsMicromips;
6254   bool IsNan2008;
6255   bool IsSingleFloat;
6256   enum MipsFloatABI {
6257     HardFloat, SoftFloat
6258   } FloatABI;
6259   enum DspRevEnum {
6260     NoDSP, DSP1, DSP2
6261   } DspRev;
6262   bool HasMSA;
6263 
6264 protected:
6265   bool HasFP64;
6266   std::string ABI;
6267 
6268 public:
6269   MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
6270                      const std::string &CPUStr)
6271       : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
6272         IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
6273         DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6274     TheCXXABI.set(TargetCXXABI::GenericMIPS);
6275   }
6276 
6277   bool isNaN2008Default() const {
6278     return CPU == "mips32r6" || CPU == "mips64r6";
6279   }
6280 
6281   bool isFP64Default() const {
6282     return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6283   }
6284 
6285   bool isNan2008() const override {
6286     return IsNan2008;
6287   }
6288 
6289   StringRef getABI() const override { return ABI; }
6290   bool setCPU(const std::string &Name) override {
6291     bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6292                     getTriple().getArch() == llvm::Triple::mipsel;
6293     CPU = Name;
6294     return llvm::StringSwitch<bool>(Name)
6295         .Case("mips1", IsMips32)
6296         .Case("mips2", IsMips32)
6297         .Case("mips3", true)
6298         .Case("mips4", true)
6299         .Case("mips5", true)
6300         .Case("mips32", IsMips32)
6301         .Case("mips32r2", IsMips32)
6302         .Case("mips32r3", IsMips32)
6303         .Case("mips32r5", IsMips32)
6304         .Case("mips32r6", IsMips32)
6305         .Case("mips64", true)
6306         .Case("mips64r2", true)
6307         .Case("mips64r3", true)
6308         .Case("mips64r5", true)
6309         .Case("mips64r6", true)
6310         .Case("octeon", true)
6311         .Case("p5600", true)
6312         .Default(false);
6313   }
6314   const std::string& getCPU() const { return CPU; }
6315   bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6316                       StringRef CPU,
6317                       std::vector<std::string> &FeaturesVec) const override {
6318     if (CPU == "octeon")
6319       Features["mips64r2"] = Features["cnmips"] = true;
6320     else
6321       Features[CPU] = true;
6322     return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6323   }
6324 
6325   void getTargetDefines(const LangOptions &Opts,
6326                         MacroBuilder &Builder) const override {
6327     Builder.defineMacro("__mips__");
6328     Builder.defineMacro("_mips");
6329     if (Opts.GNUMode)
6330       Builder.defineMacro("mips");
6331 
6332     Builder.defineMacro("__REGISTER_PREFIX__", "");
6333 
6334     switch (FloatABI) {
6335     case HardFloat:
6336       Builder.defineMacro("__mips_hard_float", Twine(1));
6337       break;
6338     case SoftFloat:
6339       Builder.defineMacro("__mips_soft_float", Twine(1));
6340       break;
6341     }
6342 
6343     if (IsSingleFloat)
6344       Builder.defineMacro("__mips_single_float", Twine(1));
6345 
6346     Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6347     Builder.defineMacro("_MIPS_FPSET",
6348                         Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6349 
6350     if (IsMips16)
6351       Builder.defineMacro("__mips16", Twine(1));
6352 
6353     if (IsMicromips)
6354       Builder.defineMacro("__mips_micromips", Twine(1));
6355 
6356     if (IsNan2008)
6357       Builder.defineMacro("__mips_nan2008", Twine(1));
6358 
6359     switch (DspRev) {
6360     default:
6361       break;
6362     case DSP1:
6363       Builder.defineMacro("__mips_dsp_rev", Twine(1));
6364       Builder.defineMacro("__mips_dsp", Twine(1));
6365       break;
6366     case DSP2:
6367       Builder.defineMacro("__mips_dsp_rev", Twine(2));
6368       Builder.defineMacro("__mips_dspr2", Twine(1));
6369       Builder.defineMacro("__mips_dsp", Twine(1));
6370       break;
6371     }
6372 
6373     if (HasMSA)
6374       Builder.defineMacro("__mips_msa", Twine(1));
6375 
6376     Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6377     Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6378     Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
6379 
6380     Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6381     Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
6382   }
6383 
6384   void getTargetBuiltins(const Builtin::Info *&Records,
6385                          unsigned &NumRecords) const override {
6386     Records = BuiltinInfo;
6387     NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
6388   }
6389   bool hasFeature(StringRef Feature) const override {
6390     return llvm::StringSwitch<bool>(Feature)
6391       .Case("mips", true)
6392       .Case("fp64", HasFP64)
6393       .Default(false);
6394   }
6395   BuiltinVaListKind getBuiltinVaListKind() const override {
6396     return TargetInfo::VoidPtrBuiltinVaList;
6397   }
6398   void getGCCRegNames(const char * const *&Names,
6399                       unsigned &NumNames) const override {
6400     static const char *const GCCRegNames[] = {
6401       // CPU register names
6402       // Must match second column of GCCRegAliases
6403       "$0",   "$1",   "$2",   "$3",   "$4",   "$5",   "$6",   "$7",
6404       "$8",   "$9",   "$10",  "$11",  "$12",  "$13",  "$14",  "$15",
6405       "$16",  "$17",  "$18",  "$19",  "$20",  "$21",  "$22",  "$23",
6406       "$24",  "$25",  "$26",  "$27",  "$28",  "$29",  "$30",  "$31",
6407       // Floating point register names
6408       "$f0",  "$f1",  "$f2",  "$f3",  "$f4",  "$f5",  "$f6",  "$f7",
6409       "$f8",  "$f9",  "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6410       "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6411       "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
6412       // Hi/lo and condition register names
6413       "hi",   "lo",   "",     "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
6414       "$fcc5","$fcc6","$fcc7",
6415       // MSA register names
6416       "$w0",  "$w1",  "$w2",  "$w3",  "$w4",  "$w5",  "$w6",  "$w7",
6417       "$w8",  "$w9",  "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6418       "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6419       "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6420       // MSA control register names
6421       "$msair",      "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6422       "$msarequest", "$msamap", "$msaunmap"
6423     };
6424     Names = GCCRegNames;
6425     NumNames = llvm::array_lengthof(GCCRegNames);
6426   }
6427   void getGCCRegAliases(const GCCRegAlias *&Aliases,
6428                         unsigned &NumAliases) const override = 0;
6429   bool validateAsmConstraint(const char *&Name,
6430                              TargetInfo::ConstraintInfo &Info) const override {
6431     switch (*Name) {
6432     default:
6433       return false;
6434     case 'r': // CPU registers.
6435     case 'd': // Equivalent to "r" unless generating MIPS16 code.
6436     case 'y': // Equivalent to "r", backward compatibility only.
6437     case 'f': // floating-point registers.
6438     case 'c': // $25 for indirect jumps
6439     case 'l': // lo register
6440     case 'x': // hilo register pair
6441       Info.setAllowsRegister();
6442       return true;
6443     case 'I': // Signed 16-bit constant
6444     case 'J': // Integer 0
6445     case 'K': // Unsigned 16-bit constant
6446     case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6447     case 'M': // Constants not loadable via lui, addiu, or ori
6448     case 'N': // Constant -1 to -65535
6449     case 'O': // A signed 15-bit constant
6450     case 'P': // A constant between 1 go 65535
6451       return true;
6452     case 'R': // An address that can be used in a non-macro load or store
6453       Info.setAllowsMemory();
6454       return true;
6455     case 'Z':
6456       if (Name[1] == 'C') { // An address usable by ll, and sc.
6457         Info.setAllowsMemory();
6458         Name++; // Skip over 'Z'.
6459         return true;
6460       }
6461       return false;
6462     }
6463   }
6464 
6465   std::string convertConstraint(const char *&Constraint) const override {
6466     std::string R;
6467     switch (*Constraint) {
6468     case 'Z': // Two-character constraint; add "^" hint for later parsing.
6469       if (Constraint[1] == 'C') {
6470         R = std::string("^") + std::string(Constraint, 2);
6471         Constraint++;
6472         return R;
6473       }
6474       break;
6475     }
6476     return TargetInfo::convertConstraint(Constraint);
6477   }
6478 
6479   const char *getClobbers() const override {
6480     // In GCC, $1 is not widely used in generated code (it's used only in a few
6481     // specific situations), so there is no real need for users to add it to
6482     // the clobbers list if they want to use it in their inline assembly code.
6483     //
6484     // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6485     // code generation, so using it in inline assembly without adding it to the
6486     // clobbers list can cause conflicts between the inline assembly code and
6487     // the surrounding generated code.
6488     //
6489     // Another problem is that LLVM is allowed to choose $1 for inline assembly
6490     // operands, which will conflict with the ".set at" assembler option (which
6491     // we use only for inline assembly, in order to maintain compatibility with
6492     // GCC) and will also conflict with the user's usage of $1.
6493     //
6494     // The easiest way to avoid these conflicts and keep $1 as an allocatable
6495     // register for generated code is to automatically clobber $1 for all inline
6496     // assembly code.
6497     //
6498     // FIXME: We should automatically clobber $1 only for inline assembly code
6499     // which actually uses it. This would allow LLVM to use $1 for inline
6500     // assembly operands if the user's assembly code doesn't use it.
6501     return "~{$1}";
6502   }
6503 
6504   bool handleTargetFeatures(std::vector<std::string> &Features,
6505                             DiagnosticsEngine &Diags) override {
6506     IsMips16 = false;
6507     IsMicromips = false;
6508     IsNan2008 = isNaN2008Default();
6509     IsSingleFloat = false;
6510     FloatABI = HardFloat;
6511     DspRev = NoDSP;
6512     HasFP64 = isFP64Default();
6513 
6514     for (const auto &Feature : Features) {
6515       if (Feature == "+single-float")
6516         IsSingleFloat = true;
6517       else if (Feature == "+soft-float")
6518         FloatABI = SoftFloat;
6519       else if (Feature == "+mips16")
6520         IsMips16 = true;
6521       else if (Feature == "+micromips")
6522         IsMicromips = true;
6523       else if (Feature == "+dsp")
6524         DspRev = std::max(DspRev, DSP1);
6525       else if (Feature == "+dspr2")
6526         DspRev = std::max(DspRev, DSP2);
6527       else if (Feature == "+msa")
6528         HasMSA = true;
6529       else if (Feature == "+fp64")
6530         HasFP64 = true;
6531       else if (Feature == "-fp64")
6532         HasFP64 = false;
6533       else if (Feature == "+nan2008")
6534         IsNan2008 = true;
6535       else if (Feature == "-nan2008")
6536         IsNan2008 = false;
6537     }
6538 
6539     setDataLayoutString();
6540 
6541     return true;
6542   }
6543 
6544   int getEHDataRegisterNumber(unsigned RegNo) const override {
6545     if (RegNo == 0) return 4;
6546     if (RegNo == 1) return 5;
6547     return -1;
6548   }
6549 
6550   bool isCLZForZeroUndef() const override { return false; }
6551 };
6552 
6553 const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
6554 #define BUILTIN(ID, TYPE, ATTRS) \
6555   { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6556 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6557   { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
6558 #include "clang/Basic/BuiltinsMips.def"
6559 };
6560 
6561 class Mips32TargetInfoBase : public MipsTargetInfoBase {
6562 public:
6563   Mips32TargetInfoBase(const llvm::Triple &Triple)
6564       : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
6565     SizeType = UnsignedInt;
6566     PtrDiffType = SignedInt;
6567     Int64Type = SignedLongLong;
6568     IntMaxType = Int64Type;
6569     MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
6570   }
6571   bool setABI(const std::string &Name) override {
6572     if (Name == "o32" || Name == "eabi") {
6573       ABI = Name;
6574       return true;
6575     }
6576     return false;
6577   }
6578   void getTargetDefines(const LangOptions &Opts,
6579                         MacroBuilder &Builder) const override {
6580     MipsTargetInfoBase::getTargetDefines(Opts, Builder);
6581 
6582     Builder.defineMacro("__mips", "32");
6583     Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6584 
6585     const std::string& CPUStr = getCPU();
6586     if (CPUStr == "mips32")
6587       Builder.defineMacro("__mips_isa_rev", "1");
6588     else if (CPUStr == "mips32r2")
6589       Builder.defineMacro("__mips_isa_rev", "2");
6590     else if (CPUStr == "mips32r3")
6591       Builder.defineMacro("__mips_isa_rev", "3");
6592     else if (CPUStr == "mips32r5")
6593       Builder.defineMacro("__mips_isa_rev", "5");
6594     else if (CPUStr == "mips32r6")
6595       Builder.defineMacro("__mips_isa_rev", "6");
6596 
6597     if (ABI == "o32") {
6598       Builder.defineMacro("__mips_o32");
6599       Builder.defineMacro("_ABIO32", "1");
6600       Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6601     }
6602     else if (ABI == "eabi")
6603       Builder.defineMacro("__mips_eabi");
6604     else
6605       llvm_unreachable("Invalid ABI for Mips32.");
6606   }
6607   void getGCCRegAliases(const GCCRegAlias *&Aliases,
6608                         unsigned &NumAliases) const override {
6609     static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6610       { { "at" },  "$1" },
6611       { { "v0" },  "$2" },
6612       { { "v1" },  "$3" },
6613       { { "a0" },  "$4" },
6614       { { "a1" },  "$5" },
6615       { { "a2" },  "$6" },
6616       { { "a3" },  "$7" },
6617       { { "t0" },  "$8" },
6618       { { "t1" },  "$9" },
6619       { { "t2" }, "$10" },
6620       { { "t3" }, "$11" },
6621       { { "t4" }, "$12" },
6622       { { "t5" }, "$13" },
6623       { { "t6" }, "$14" },
6624       { { "t7" }, "$15" },
6625       { { "s0" }, "$16" },
6626       { { "s1" }, "$17" },
6627       { { "s2" }, "$18" },
6628       { { "s3" }, "$19" },
6629       { { "s4" }, "$20" },
6630       { { "s5" }, "$21" },
6631       { { "s6" }, "$22" },
6632       { { "s7" }, "$23" },
6633       { { "t8" }, "$24" },
6634       { { "t9" }, "$25" },
6635       { { "k0" }, "$26" },
6636       { { "k1" }, "$27" },
6637       { { "gp" }, "$28" },
6638       { { "sp","$sp" }, "$29" },
6639       { { "fp","$fp" }, "$30" },
6640       { { "ra" }, "$31" }
6641     };
6642     Aliases = GCCRegAliases;
6643     NumAliases = llvm::array_lengthof(GCCRegAliases);
6644   }
6645 };
6646 
6647 class Mips32EBTargetInfo : public Mips32TargetInfoBase {
6648   void setDataLayoutString() override {
6649     DataLayoutString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
6650   }
6651 
6652 public:
6653   Mips32EBTargetInfo(const llvm::Triple &Triple)
6654       : Mips32TargetInfoBase(Triple) {
6655   }
6656   void getTargetDefines(const LangOptions &Opts,
6657                         MacroBuilder &Builder) const override {
6658     DefineStd(Builder, "MIPSEB", Opts);
6659     Builder.defineMacro("_MIPSEB");
6660     Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
6661   }
6662 };
6663 
6664 class Mips32ELTargetInfo : public Mips32TargetInfoBase {
6665   void setDataLayoutString() override {
6666     DataLayoutString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
6667   }
6668 
6669 public:
6670   Mips32ELTargetInfo(const llvm::Triple &Triple)
6671       : Mips32TargetInfoBase(Triple) {
6672     BigEndian = false;
6673   }
6674   void getTargetDefines(const LangOptions &Opts,
6675                         MacroBuilder &Builder) const override {
6676     DefineStd(Builder, "MIPSEL", Opts);
6677     Builder.defineMacro("_MIPSEL");
6678     Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
6679   }
6680 };
6681 
6682 class Mips64TargetInfoBase : public MipsTargetInfoBase {
6683 public:
6684   Mips64TargetInfoBase(const llvm::Triple &Triple)
6685       : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
6686     LongDoubleWidth = LongDoubleAlign = 128;
6687     LongDoubleFormat = &llvm::APFloat::IEEEquad;
6688     if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6689       LongDoubleWidth = LongDoubleAlign = 64;
6690       LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6691     }
6692     setN64ABITypes();
6693     SuitableAlign = 128;
6694     MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6695   }
6696 
6697   void setN64ABITypes() {
6698     LongWidth = LongAlign = 64;
6699     PointerWidth = PointerAlign = 64;
6700     SizeType = UnsignedLong;
6701     PtrDiffType = SignedLong;
6702     Int64Type = SignedLong;
6703     IntMaxType = Int64Type;
6704   }
6705 
6706   void setN32ABITypes() {
6707     LongWidth = LongAlign = 32;
6708     PointerWidth = PointerAlign = 32;
6709     SizeType = UnsignedInt;
6710     PtrDiffType = SignedInt;
6711     Int64Type = SignedLongLong;
6712     IntMaxType = Int64Type;
6713   }
6714 
6715   bool setABI(const std::string &Name) override {
6716     if (Name == "n32") {
6717       setN32ABITypes();
6718       ABI = Name;
6719       return true;
6720     }
6721     if (Name == "n64") {
6722       setN64ABITypes();
6723       ABI = Name;
6724       return true;
6725     }
6726     return false;
6727   }
6728 
6729   void getTargetDefines(const LangOptions &Opts,
6730                         MacroBuilder &Builder) const override {
6731     MipsTargetInfoBase::getTargetDefines(Opts, Builder);
6732 
6733     Builder.defineMacro("__mips", "64");
6734     Builder.defineMacro("__mips64");
6735     Builder.defineMacro("__mips64__");
6736     Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6737 
6738     const std::string& CPUStr = getCPU();
6739     if (CPUStr == "mips64")
6740       Builder.defineMacro("__mips_isa_rev", "1");
6741     else if (CPUStr == "mips64r2")
6742       Builder.defineMacro("__mips_isa_rev", "2");
6743     else if (CPUStr == "mips64r3")
6744       Builder.defineMacro("__mips_isa_rev", "3");
6745     else if (CPUStr == "mips64r5")
6746       Builder.defineMacro("__mips_isa_rev", "5");
6747     else if (CPUStr == "mips64r6")
6748       Builder.defineMacro("__mips_isa_rev", "6");
6749 
6750     if (ABI == "n32") {
6751       Builder.defineMacro("__mips_n32");
6752       Builder.defineMacro("_ABIN32", "2");
6753       Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6754     }
6755     else if (ABI == "n64") {
6756       Builder.defineMacro("__mips_n64");
6757       Builder.defineMacro("_ABI64", "3");
6758       Builder.defineMacro("_MIPS_SIM", "_ABI64");
6759     }
6760     else
6761       llvm_unreachable("Invalid ABI for Mips64.");
6762   }
6763   void getGCCRegAliases(const GCCRegAlias *&Aliases,
6764                         unsigned &NumAliases) const override {
6765     static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6766       { { "at" },  "$1" },
6767       { { "v0" },  "$2" },
6768       { { "v1" },  "$3" },
6769       { { "a0" },  "$4" },
6770       { { "a1" },  "$5" },
6771       { { "a2" },  "$6" },
6772       { { "a3" },  "$7" },
6773       { { "a4" },  "$8" },
6774       { { "a5" },  "$9" },
6775       { { "a6" }, "$10" },
6776       { { "a7" }, "$11" },
6777       { { "t0" }, "$12" },
6778       { { "t1" }, "$13" },
6779       { { "t2" }, "$14" },
6780       { { "t3" }, "$15" },
6781       { { "s0" }, "$16" },
6782       { { "s1" }, "$17" },
6783       { { "s2" }, "$18" },
6784       { { "s3" }, "$19" },
6785       { { "s4" }, "$20" },
6786       { { "s5" }, "$21" },
6787       { { "s6" }, "$22" },
6788       { { "s7" }, "$23" },
6789       { { "t8" }, "$24" },
6790       { { "t9" }, "$25" },
6791       { { "k0" }, "$26" },
6792       { { "k1" }, "$27" },
6793       { { "gp" }, "$28" },
6794       { { "sp","$sp" }, "$29" },
6795       { { "fp","$fp" }, "$30" },
6796       { { "ra" }, "$31" }
6797     };
6798     Aliases = GCCRegAliases;
6799     NumAliases = llvm::array_lengthof(GCCRegAliases);
6800   }
6801 
6802   bool hasInt128Type() const override { return true; }
6803 };
6804 
6805 class Mips64EBTargetInfo : public Mips64TargetInfoBase {
6806   void setDataLayoutString() override {
6807     if (ABI == "n32")
6808       DataLayoutString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
6809     else
6810       DataLayoutString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
6811 
6812   }
6813 
6814 public:
6815   Mips64EBTargetInfo(const llvm::Triple &Triple)
6816       : Mips64TargetInfoBase(Triple) {}
6817   void getTargetDefines(const LangOptions &Opts,
6818                         MacroBuilder &Builder) const override {
6819     DefineStd(Builder, "MIPSEB", Opts);
6820     Builder.defineMacro("_MIPSEB");
6821     Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
6822   }
6823 };
6824 
6825 class Mips64ELTargetInfo : public Mips64TargetInfoBase {
6826   void setDataLayoutString() override {
6827     if (ABI == "n32")
6828       DataLayoutString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
6829     else
6830       DataLayoutString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
6831   }
6832 public:
6833   Mips64ELTargetInfo(const llvm::Triple &Triple)
6834       : Mips64TargetInfoBase(Triple) {
6835     // Default ABI is n64.
6836     BigEndian = false;
6837   }
6838   void getTargetDefines(const LangOptions &Opts,
6839                         MacroBuilder &Builder) const override {
6840     DefineStd(Builder, "MIPSEL", Opts);
6841     Builder.defineMacro("_MIPSEL");
6842     Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
6843   }
6844 };
6845 
6846 class PNaClTargetInfo : public TargetInfo {
6847 public:
6848   PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6849     BigEndian = false;
6850     this->UserLabelPrefix = "";
6851     this->LongAlign = 32;
6852     this->LongWidth = 32;
6853     this->PointerAlign = 32;
6854     this->PointerWidth = 32;
6855     this->IntMaxType = TargetInfo::SignedLongLong;
6856     this->Int64Type = TargetInfo::SignedLongLong;
6857     this->DoubleAlign = 64;
6858     this->LongDoubleWidth = 64;
6859     this->LongDoubleAlign = 64;
6860     this->SizeType = TargetInfo::UnsignedInt;
6861     this->PtrDiffType = TargetInfo::SignedInt;
6862     this->IntPtrType = TargetInfo::SignedInt;
6863     this->RegParmMax = 0; // Disallow regparm
6864   }
6865 
6866   void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
6867     Builder.defineMacro("__le32__");
6868     Builder.defineMacro("__pnacl__");
6869   }
6870   void getTargetDefines(const LangOptions &Opts,
6871                         MacroBuilder &Builder) const override {
6872     getArchDefines(Opts, Builder);
6873   }
6874   bool hasFeature(StringRef Feature) const override {
6875     return Feature == "pnacl";
6876   }
6877   void getTargetBuiltins(const Builtin::Info *&Records,
6878                          unsigned &NumRecords) const override {
6879   }
6880   BuiltinVaListKind getBuiltinVaListKind() const override {
6881     return TargetInfo::PNaClABIBuiltinVaList;
6882   }
6883   void getGCCRegNames(const char * const *&Names,
6884                       unsigned &NumNames) const override;
6885   void getGCCRegAliases(const GCCRegAlias *&Aliases,
6886                         unsigned &NumAliases) const override;
6887   bool validateAsmConstraint(const char *&Name,
6888                              TargetInfo::ConstraintInfo &Info) const override {
6889     return false;
6890   }
6891 
6892   const char *getClobbers() const override {
6893     return "";
6894   }
6895 };
6896 
6897 void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6898                                      unsigned &NumNames) const {
6899   Names = nullptr;
6900   NumNames = 0;
6901 }
6902 
6903 void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6904                                        unsigned &NumAliases) const {
6905   Aliases = nullptr;
6906   NumAliases = 0;
6907 }
6908 
6909 // We attempt to use PNaCl (le32) frontend and Mips32EL backend.
6910 class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
6911 public:
6912   NaClMips32ELTargetInfo(const llvm::Triple &Triple) :
6913     Mips32ELTargetInfo(Triple) {
6914   }
6915 
6916   BuiltinVaListKind getBuiltinVaListKind() const override {
6917     return TargetInfo::PNaClABIBuiltinVaList;
6918   }
6919 };
6920 
6921 class Le64TargetInfo : public TargetInfo {
6922   static const Builtin::Info BuiltinInfo[];
6923 
6924 public:
6925   Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6926     BigEndian = false;
6927     NoAsmVariants = true;
6928     LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6929     MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6930     DataLayoutString = "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
6931   }
6932 
6933   void getTargetDefines(const LangOptions &Opts,
6934                         MacroBuilder &Builder) const override {
6935     DefineStd(Builder, "unix", Opts);
6936     defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6937     Builder.defineMacro("__ELF__");
6938   }
6939   void getTargetBuiltins(const Builtin::Info *&Records,
6940                          unsigned &NumRecords) const override {
6941     Records = BuiltinInfo;
6942     NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6943   }
6944   BuiltinVaListKind getBuiltinVaListKind() const override {
6945     return TargetInfo::PNaClABIBuiltinVaList;
6946   }
6947   const char *getClobbers() const override { return ""; }
6948   void getGCCRegNames(const char *const *&Names,
6949                       unsigned &NumNames) const override {
6950     Names = nullptr;
6951     NumNames = 0;
6952   }
6953   void getGCCRegAliases(const GCCRegAlias *&Aliases,
6954                         unsigned &NumAliases) const override {
6955     Aliases = nullptr;
6956     NumAliases = 0;
6957   }
6958   bool validateAsmConstraint(const char *&Name,
6959                              TargetInfo::ConstraintInfo &Info) const override {
6960     return false;
6961   }
6962 
6963   bool hasProtectedVisibility() const override { return false; }
6964 };
6965 
6966 class WebAssemblyTargetInfo : public TargetInfo {
6967   static const Builtin::Info BuiltinInfo[];
6968 
6969   enum SIMDEnum {
6970     NoSIMD,
6971     SIMD128,
6972   } SIMDLevel;
6973 
6974 public:
6975   explicit WebAssemblyTargetInfo(const llvm::Triple &T)
6976       : TargetInfo(T), SIMDLevel(NoSIMD) {
6977     BigEndian = false;
6978     NoAsmVariants = true;
6979     SuitableAlign = 128;
6980     LargeArrayMinWidth = 128;
6981     LargeArrayAlign = 128;
6982     SimdDefaultAlign = 128;
6983     SigAtomicType = SignedLong;
6984   }
6985 
6986 protected:
6987   void getTargetDefines(const LangOptions &Opts,
6988                         MacroBuilder &Builder) const override {
6989     defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
6990     if (SIMDLevel >= SIMD128)
6991       Builder.defineMacro("__wasm_simd128__");
6992   }
6993 
6994 private:
6995   bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6996                       StringRef CPU,
6997                       std::vector<std::string> &FeaturesVec) const override {
6998     if (CPU == "bleeding-edge")
6999       Features["simd128"] = true;
7000     return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7001   }
7002   bool hasFeature(StringRef Feature) const final {
7003     return llvm::StringSwitch<bool>(Feature)
7004         .Case("simd128", SIMDLevel >= SIMD128)
7005         .Default(false);
7006   }
7007   bool handleTargetFeatures(std::vector<std::string> &Features,
7008                             DiagnosticsEngine &Diags) final {
7009     for (const auto &Feature : Features) {
7010       if (Feature == "+simd128") {
7011         SIMDLevel = std::max(SIMDLevel, SIMD128);
7012         continue;
7013       }
7014       if (Feature == "-simd128") {
7015         SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7016         continue;
7017       }
7018 
7019       Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7020                                                      << "-target-feature";
7021       return false;
7022     }
7023     return true;
7024   }
7025   bool setCPU(const std::string &Name) final {
7026     return llvm::StringSwitch<bool>(Name)
7027               .Case("mvp",           true)
7028               .Case("bleeding-edge", true)
7029               .Case("generic",       true)
7030               .Default(false);
7031   }
7032   void getTargetBuiltins(const Builtin::Info *&Records,
7033                          unsigned &NumRecords) const final {
7034     Records = BuiltinInfo;
7035     NumRecords = clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin;
7036   }
7037   BuiltinVaListKind getBuiltinVaListKind() const final {
7038     // TODO: Implement va_list properly.
7039     return VoidPtrBuiltinVaList;
7040   }
7041   void getGCCRegNames(const char *const *&Names,
7042                       unsigned &NumNames) const final {
7043     Names = nullptr;
7044     NumNames = 0;
7045   }
7046   void getGCCRegAliases(const GCCRegAlias *&Aliases,
7047                         unsigned &NumAliases) const final {
7048     Aliases = nullptr;
7049     NumAliases = 0;
7050   }
7051   bool
7052   validateAsmConstraint(const char *&Name,
7053                         TargetInfo::ConstraintInfo &Info) const final {
7054     return false;
7055   }
7056   const char *getClobbers() const final { return ""; }
7057   bool isCLZForZeroUndef() const final { return false; }
7058   bool hasInt128Type() const final { return true; }
7059   IntType getIntTypeByWidth(unsigned BitWidth,
7060                             bool IsSigned) const final {
7061     // WebAssembly prefers long long for explicitly 64-bit integers.
7062     return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7063                           : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7064   }
7065   IntType getLeastIntTypeByWidth(unsigned BitWidth,
7066                                  bool IsSigned) const final {
7067     // WebAssembly uses long long for int_least64_t and int_fast64_t.
7068     return BitWidth == 64
7069                ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7070                : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7071   }
7072 };
7073 
7074 const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7075 #define BUILTIN(ID, TYPE, ATTRS) \
7076   { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7077 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7078   { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7079 #include "clang/Basic/BuiltinsWebAssembly.def"
7080 };
7081 
7082 class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7083 public:
7084   explicit WebAssembly32TargetInfo(const llvm::Triple &T)
7085       : WebAssemblyTargetInfo(T) {
7086     MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7087     DataLayoutString = "e-p:32:32-i64:64-n32:64-S128";
7088   }
7089 
7090 protected:
7091   void getTargetDefines(const LangOptions &Opts,
7092                         MacroBuilder &Builder) const override {
7093     WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7094     defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7095   }
7096 };
7097 
7098 class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7099 public:
7100   explicit WebAssembly64TargetInfo(const llvm::Triple &T)
7101       : WebAssemblyTargetInfo(T) {
7102     LongAlign = LongWidth = 64;
7103     PointerAlign = PointerWidth = 64;
7104     MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7105     DataLayoutString = "e-p:64:64-i64:64-n32:64-S128";
7106   }
7107 
7108 protected:
7109   void getTargetDefines(const LangOptions &Opts,
7110                         MacroBuilder &Builder) const override {
7111     WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7112     defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7113   }
7114 };
7115 
7116 const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7117 #define BUILTIN(ID, TYPE, ATTRS)                                               \
7118   { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7119 #include "clang/Basic/BuiltinsLe64.def"
7120 };
7121 
7122 static const unsigned SPIRAddrSpaceMap[] = {
7123     1, // opencl_global
7124     3, // opencl_local
7125     2, // opencl_constant
7126     4, // opencl_generic
7127     0, // cuda_device
7128     0, // cuda_constant
7129     0  // cuda_shared
7130 };
7131 class SPIRTargetInfo : public TargetInfo {
7132 public:
7133   SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7134     assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7135            "SPIR target must use unknown OS");
7136     assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7137            "SPIR target must use unknown environment type");
7138     BigEndian = false;
7139     TLSSupported = false;
7140     LongWidth = LongAlign = 64;
7141     AddrSpaceMap = &SPIRAddrSpaceMap;
7142     UseAddrSpaceMapMangling = true;
7143     // Define available target features
7144     // These must be defined in sorted order!
7145     NoAsmVariants = true;
7146   }
7147   void getTargetDefines(const LangOptions &Opts,
7148                         MacroBuilder &Builder) const override {
7149     DefineStd(Builder, "SPIR", Opts);
7150   }
7151   bool hasFeature(StringRef Feature) const override {
7152     return Feature == "spir";
7153   }
7154 
7155   void getTargetBuiltins(const Builtin::Info *&Records,
7156                          unsigned &NumRecords) const override {}
7157   const char *getClobbers() const override { return ""; }
7158   void getGCCRegNames(const char *const *&Names,
7159                       unsigned &NumNames) const override {}
7160   bool validateAsmConstraint(const char *&Name,
7161                              TargetInfo::ConstraintInfo &info) const override {
7162     return true;
7163   }
7164   void getGCCRegAliases(const GCCRegAlias *&Aliases,
7165                         unsigned &NumAliases) const override {}
7166   BuiltinVaListKind getBuiltinVaListKind() const override {
7167     return TargetInfo::VoidPtrBuiltinVaList;
7168   }
7169 
7170   CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7171     return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7172                                                           : CCCR_Warning;
7173   }
7174 
7175   CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7176     return CC_SpirFunction;
7177   }
7178 };
7179 
7180 class SPIR32TargetInfo : public SPIRTargetInfo {
7181 public:
7182   SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7183     PointerWidth = PointerAlign = 32;
7184     SizeType = TargetInfo::UnsignedInt;
7185     PtrDiffType = IntPtrType = TargetInfo::SignedInt;
7186     DataLayoutString = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7187                        "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7188   }
7189   void getTargetDefines(const LangOptions &Opts,
7190                         MacroBuilder &Builder) const override {
7191     DefineStd(Builder, "SPIR32", Opts);
7192   }
7193 };
7194 
7195 class SPIR64TargetInfo : public SPIRTargetInfo {
7196 public:
7197   SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7198     PointerWidth = PointerAlign = 64;
7199     SizeType = TargetInfo::UnsignedLong;
7200     PtrDiffType = IntPtrType = TargetInfo::SignedLong;
7201     DataLayoutString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7202                        "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7203   }
7204   void getTargetDefines(const LangOptions &Opts,
7205                         MacroBuilder &Builder) const override {
7206     DefineStd(Builder, "SPIR64", Opts);
7207   }
7208 };
7209 
7210 class XCoreTargetInfo : public TargetInfo {
7211   static const Builtin::Info BuiltinInfo[];
7212 public:
7213   XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7214     BigEndian = false;
7215     NoAsmVariants = true;
7216     LongLongAlign = 32;
7217     SuitableAlign = 32;
7218     DoubleAlign = LongDoubleAlign = 32;
7219     SizeType = UnsignedInt;
7220     PtrDiffType = SignedInt;
7221     IntPtrType = SignedInt;
7222     WCharType = UnsignedChar;
7223     WIntType = UnsignedInt;
7224     UseZeroLengthBitfieldAlignment = true;
7225     DataLayoutString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7226                        "-f64:32-a:0:32-n32";
7227   }
7228   void getTargetDefines(const LangOptions &Opts,
7229                         MacroBuilder &Builder) const override {
7230     Builder.defineMacro("__XS1B__");
7231   }
7232   void getTargetBuiltins(const Builtin::Info *&Records,
7233                          unsigned &NumRecords) const override {
7234     Records = BuiltinInfo;
7235     NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
7236   }
7237   BuiltinVaListKind getBuiltinVaListKind() const override {
7238     return TargetInfo::VoidPtrBuiltinVaList;
7239   }
7240   const char *getClobbers() const override {
7241     return "";
7242   }
7243   void getGCCRegNames(const char * const *&Names,
7244                       unsigned &NumNames) const override {
7245     static const char * const GCCRegNames[] = {
7246       "r0",   "r1",   "r2",   "r3",   "r4",   "r5",   "r6",   "r7",
7247       "r8",   "r9",   "r10",  "r11",  "cp",   "dp",   "sp",   "lr"
7248     };
7249     Names = GCCRegNames;
7250     NumNames = llvm::array_lengthof(GCCRegNames);
7251   }
7252   void getGCCRegAliases(const GCCRegAlias *&Aliases,
7253                         unsigned &NumAliases) const override {
7254     Aliases = nullptr;
7255     NumAliases = 0;
7256   }
7257   bool validateAsmConstraint(const char *&Name,
7258                              TargetInfo::ConstraintInfo &Info) const override {
7259     return false;
7260   }
7261   int getEHDataRegisterNumber(unsigned RegNo) const override {
7262     // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7263     return (RegNo < 2)? RegNo : -1;
7264   }
7265 };
7266 
7267 const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
7268 #define BUILTIN(ID, TYPE, ATTRS) \
7269   { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7270 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7271   { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7272 #include "clang/Basic/BuiltinsXCore.def"
7273 };
7274 
7275 // x86_32 Android target
7276 class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7277 public:
7278   AndroidX86_32TargetInfo(const llvm::Triple &Triple)
7279       : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
7280     SuitableAlign = 32;
7281     LongDoubleWidth = 64;
7282     LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7283   }
7284 };
7285 
7286 // x86_64 Android target
7287 class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7288 public:
7289   AndroidX86_64TargetInfo(const llvm::Triple &Triple)
7290       : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
7291     LongDoubleFormat = &llvm::APFloat::IEEEquad;
7292   }
7293 
7294   bool useFloat128ManglingForLongDouble() const override {
7295     return true;
7296   }
7297 };
7298 } // end anonymous namespace
7299 
7300 //===----------------------------------------------------------------------===//
7301 // Driver code
7302 //===----------------------------------------------------------------------===//
7303 
7304 static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
7305   llvm::Triple::OSType os = Triple.getOS();
7306 
7307   switch (Triple.getArch()) {
7308   default:
7309     return nullptr;
7310 
7311   case llvm::Triple::xcore:
7312     return new XCoreTargetInfo(Triple);
7313 
7314   case llvm::Triple::hexagon:
7315     return new HexagonTargetInfo(Triple);
7316 
7317   case llvm::Triple::aarch64:
7318     if (Triple.isOSDarwin())
7319       return new DarwinAArch64TargetInfo(Triple);
7320 
7321     switch (os) {
7322     case llvm::Triple::FreeBSD:
7323       return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
7324     case llvm::Triple::Linux:
7325       return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
7326     case llvm::Triple::NetBSD:
7327       return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
7328     default:
7329       return new AArch64leTargetInfo(Triple);
7330     }
7331 
7332   case llvm::Triple::aarch64_be:
7333     switch (os) {
7334     case llvm::Triple::FreeBSD:
7335       return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
7336     case llvm::Triple::Linux:
7337       return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
7338     case llvm::Triple::NetBSD:
7339       return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
7340     default:
7341       return new AArch64beTargetInfo(Triple);
7342     }
7343 
7344   case llvm::Triple::arm:
7345   case llvm::Triple::thumb:
7346     if (Triple.isOSBinFormatMachO())
7347       return new DarwinARMTargetInfo(Triple);
7348 
7349     switch (os) {
7350     case llvm::Triple::Linux:
7351       return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
7352     case llvm::Triple::FreeBSD:
7353       return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
7354     case llvm::Triple::NetBSD:
7355       return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
7356     case llvm::Triple::OpenBSD:
7357       return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
7358     case llvm::Triple::Bitrig:
7359       return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
7360     case llvm::Triple::RTEMS:
7361       return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
7362     case llvm::Triple::NaCl:
7363       return new NaClTargetInfo<ARMleTargetInfo>(Triple);
7364     case llvm::Triple::Win32:
7365       switch (Triple.getEnvironment()) {
7366       case llvm::Triple::Cygnus:
7367         return new CygwinARMTargetInfo(Triple);
7368       case llvm::Triple::GNU:
7369         return new MinGWARMTargetInfo(Triple);
7370       case llvm::Triple::Itanium:
7371         return new ItaniumWindowsARMleTargetInfo(Triple);
7372       case llvm::Triple::MSVC:
7373       default: // Assume MSVC for unknown environments
7374         return new MicrosoftARMleTargetInfo(Triple);
7375       }
7376     default:
7377       return new ARMleTargetInfo(Triple);
7378     }
7379 
7380   case llvm::Triple::armeb:
7381   case llvm::Triple::thumbeb:
7382     if (Triple.isOSDarwin())
7383       return new DarwinARMTargetInfo(Triple);
7384 
7385     switch (os) {
7386     case llvm::Triple::Linux:
7387       return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
7388     case llvm::Triple::FreeBSD:
7389       return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
7390     case llvm::Triple::NetBSD:
7391       return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
7392     case llvm::Triple::OpenBSD:
7393       return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
7394     case llvm::Triple::Bitrig:
7395       return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
7396     case llvm::Triple::RTEMS:
7397       return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
7398     case llvm::Triple::NaCl:
7399       return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
7400     default:
7401       return new ARMbeTargetInfo(Triple);
7402     }
7403 
7404   case llvm::Triple::bpfeb:
7405   case llvm::Triple::bpfel:
7406     return new BPFTargetInfo(Triple);
7407 
7408   case llvm::Triple::msp430:
7409     return new MSP430TargetInfo(Triple);
7410 
7411   case llvm::Triple::mips:
7412     switch (os) {
7413     case llvm::Triple::Linux:
7414       return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
7415     case llvm::Triple::RTEMS:
7416       return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
7417     case llvm::Triple::FreeBSD:
7418       return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
7419     case llvm::Triple::NetBSD:
7420       return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
7421     default:
7422       return new Mips32EBTargetInfo(Triple);
7423     }
7424 
7425   case llvm::Triple::mipsel:
7426     switch (os) {
7427     case llvm::Triple::Linux:
7428       return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
7429     case llvm::Triple::RTEMS:
7430       return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
7431     case llvm::Triple::FreeBSD:
7432       return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
7433     case llvm::Triple::NetBSD:
7434       return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
7435     case llvm::Triple::NaCl:
7436       return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple);
7437     default:
7438       return new Mips32ELTargetInfo(Triple);
7439     }
7440 
7441   case llvm::Triple::mips64:
7442     switch (os) {
7443     case llvm::Triple::Linux:
7444       return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
7445     case llvm::Triple::RTEMS:
7446       return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
7447     case llvm::Triple::FreeBSD:
7448       return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
7449     case llvm::Triple::NetBSD:
7450       return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
7451     case llvm::Triple::OpenBSD:
7452       return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
7453     default:
7454       return new Mips64EBTargetInfo(Triple);
7455     }
7456 
7457   case llvm::Triple::mips64el:
7458     switch (os) {
7459     case llvm::Triple::Linux:
7460       return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
7461     case llvm::Triple::RTEMS:
7462       return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
7463     case llvm::Triple::FreeBSD:
7464       return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
7465     case llvm::Triple::NetBSD:
7466       return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
7467     case llvm::Triple::OpenBSD:
7468       return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
7469     default:
7470       return new Mips64ELTargetInfo(Triple);
7471     }
7472 
7473   case llvm::Triple::le32:
7474     switch (os) {
7475     case llvm::Triple::NaCl:
7476       return new NaClTargetInfo<PNaClTargetInfo>(Triple);
7477     default:
7478       return nullptr;
7479     }
7480 
7481   case llvm::Triple::le64:
7482     return new Le64TargetInfo(Triple);
7483 
7484   case llvm::Triple::ppc:
7485     if (Triple.isOSDarwin())
7486       return new DarwinPPC32TargetInfo(Triple);
7487     switch (os) {
7488     case llvm::Triple::Linux:
7489       return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
7490     case llvm::Triple::FreeBSD:
7491       return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
7492     case llvm::Triple::NetBSD:
7493       return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
7494     case llvm::Triple::OpenBSD:
7495       return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
7496     case llvm::Triple::RTEMS:
7497       return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
7498     default:
7499       return new PPC32TargetInfo(Triple);
7500     }
7501 
7502   case llvm::Triple::ppc64:
7503     if (Triple.isOSDarwin())
7504       return new DarwinPPC64TargetInfo(Triple);
7505     switch (os) {
7506     case llvm::Triple::Linux:
7507       return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
7508     case llvm::Triple::Lv2:
7509       return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
7510     case llvm::Triple::FreeBSD:
7511       return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
7512     case llvm::Triple::NetBSD:
7513       return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
7514     default:
7515       return new PPC64TargetInfo(Triple);
7516     }
7517 
7518   case llvm::Triple::ppc64le:
7519     switch (os) {
7520     case llvm::Triple::Linux:
7521       return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
7522     case llvm::Triple::NetBSD:
7523       return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
7524     default:
7525       return new PPC64TargetInfo(Triple);
7526     }
7527 
7528   case llvm::Triple::nvptx:
7529     return new NVPTX32TargetInfo(Triple);
7530   case llvm::Triple::nvptx64:
7531     return new NVPTX64TargetInfo(Triple);
7532 
7533   case llvm::Triple::amdgcn:
7534   case llvm::Triple::r600:
7535     return new AMDGPUTargetInfo(Triple);
7536 
7537   case llvm::Triple::sparc:
7538     switch (os) {
7539     case llvm::Triple::Linux:
7540       return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
7541     case llvm::Triple::Solaris:
7542       return new SolarisTargetInfo<SparcV8TargetInfo>(Triple);
7543     case llvm::Triple::NetBSD:
7544       return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
7545     case llvm::Triple::OpenBSD:
7546       return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
7547     case llvm::Triple::RTEMS:
7548       return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
7549     default:
7550       return new SparcV8TargetInfo(Triple);
7551     }
7552 
7553   // The 'sparcel' architecture copies all the above cases except for Solaris.
7554   case llvm::Triple::sparcel:
7555     switch (os) {
7556     case llvm::Triple::Linux:
7557       return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
7558     case llvm::Triple::NetBSD:
7559       return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7560     case llvm::Triple::OpenBSD:
7561       return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7562     case llvm::Triple::RTEMS:
7563       return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
7564     default:
7565       return new SparcV8elTargetInfo(Triple);
7566     }
7567 
7568   case llvm::Triple::sparcv9:
7569     switch (os) {
7570     case llvm::Triple::Linux:
7571       return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
7572     case llvm::Triple::Solaris:
7573       return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
7574     case llvm::Triple::NetBSD:
7575       return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
7576     case llvm::Triple::OpenBSD:
7577       return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
7578     case llvm::Triple::FreeBSD:
7579       return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
7580     default:
7581       return new SparcV9TargetInfo(Triple);
7582     }
7583 
7584   case llvm::Triple::systemz:
7585     switch (os) {
7586     case llvm::Triple::Linux:
7587       return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
7588     default:
7589       return new SystemZTargetInfo(Triple);
7590     }
7591 
7592   case llvm::Triple::tce:
7593     return new TCETargetInfo(Triple);
7594 
7595   case llvm::Triple::x86:
7596     if (Triple.isOSDarwin())
7597       return new DarwinI386TargetInfo(Triple);
7598 
7599     switch (os) {
7600     case llvm::Triple::CloudABI:
7601       return new CloudABITargetInfo<X86_32TargetInfo>(Triple);
7602     case llvm::Triple::Linux: {
7603       switch (Triple.getEnvironment()) {
7604       default:
7605         return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
7606       case llvm::Triple::Android:
7607         return new AndroidX86_32TargetInfo(Triple);
7608       }
7609     }
7610     case llvm::Triple::DragonFly:
7611       return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
7612     case llvm::Triple::NetBSD:
7613       return new NetBSDI386TargetInfo(Triple);
7614     case llvm::Triple::OpenBSD:
7615       return new OpenBSDI386TargetInfo(Triple);
7616     case llvm::Triple::Bitrig:
7617       return new BitrigI386TargetInfo(Triple);
7618     case llvm::Triple::FreeBSD:
7619       return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
7620     case llvm::Triple::KFreeBSD:
7621       return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
7622     case llvm::Triple::Minix:
7623       return new MinixTargetInfo<X86_32TargetInfo>(Triple);
7624     case llvm::Triple::Solaris:
7625       return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
7626     case llvm::Triple::Win32: {
7627       switch (Triple.getEnvironment()) {
7628       case llvm::Triple::Cygnus:
7629         return new CygwinX86_32TargetInfo(Triple);
7630       case llvm::Triple::GNU:
7631         return new MinGWX86_32TargetInfo(Triple);
7632       case llvm::Triple::Itanium:
7633       case llvm::Triple::MSVC:
7634       default: // Assume MSVC for unknown environments
7635         return new MicrosoftX86_32TargetInfo(Triple);
7636       }
7637     }
7638     case llvm::Triple::Haiku:
7639       return new HaikuX86_32TargetInfo(Triple);
7640     case llvm::Triple::RTEMS:
7641       return new RTEMSX86_32TargetInfo(Triple);
7642     case llvm::Triple::NaCl:
7643       return new NaClTargetInfo<X86_32TargetInfo>(Triple);
7644     default:
7645       return new X86_32TargetInfo(Triple);
7646     }
7647 
7648   case llvm::Triple::x86_64:
7649     if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
7650       return new DarwinX86_64TargetInfo(Triple);
7651 
7652     switch (os) {
7653     case llvm::Triple::CloudABI:
7654       return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
7655     case llvm::Triple::Linux: {
7656       switch (Triple.getEnvironment()) {
7657       default:
7658         return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
7659       case llvm::Triple::Android:
7660         return new AndroidX86_64TargetInfo(Triple);
7661       }
7662     }
7663     case llvm::Triple::DragonFly:
7664       return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
7665     case llvm::Triple::NetBSD:
7666       return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
7667     case llvm::Triple::OpenBSD:
7668       return new OpenBSDX86_64TargetInfo(Triple);
7669     case llvm::Triple::Bitrig:
7670       return new BitrigX86_64TargetInfo(Triple);
7671     case llvm::Triple::FreeBSD:
7672       return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
7673     case llvm::Triple::KFreeBSD:
7674       return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
7675     case llvm::Triple::Solaris:
7676       return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
7677     case llvm::Triple::Win32: {
7678       switch (Triple.getEnvironment()) {
7679       case llvm::Triple::Cygnus:
7680         return new CygwinX86_64TargetInfo(Triple);
7681       case llvm::Triple::GNU:
7682         return new MinGWX86_64TargetInfo(Triple);
7683       case llvm::Triple::MSVC:
7684       default: // Assume MSVC for unknown environments
7685         return new MicrosoftX86_64TargetInfo(Triple);
7686       }
7687     }
7688     case llvm::Triple::NaCl:
7689       return new NaClTargetInfo<X86_64TargetInfo>(Triple);
7690     case llvm::Triple::PS4:
7691       return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
7692     default:
7693       return new X86_64TargetInfo(Triple);
7694     }
7695 
7696   case llvm::Triple::spir: {
7697     if (Triple.getOS() != llvm::Triple::UnknownOS ||
7698         Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7699       return nullptr;
7700     return new SPIR32TargetInfo(Triple);
7701   }
7702   case llvm::Triple::spir64: {
7703     if (Triple.getOS() != llvm::Triple::UnknownOS ||
7704         Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7705       return nullptr;
7706     return new SPIR64TargetInfo(Triple);
7707   }
7708   case llvm::Triple::wasm32:
7709     if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
7710       return nullptr;
7711     return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple);
7712   case llvm::Triple::wasm64:
7713     if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
7714       return nullptr;
7715     return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple);
7716   }
7717 }
7718 
7719 /// CreateTargetInfo - Return the target info object for the specified target
7720 /// options.
7721 TargetInfo *
7722 TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
7723                              const std::shared_ptr<TargetOptions> &Opts) {
7724   llvm::Triple Triple(Opts->Triple);
7725 
7726   // Construct the target
7727   std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
7728   if (!Target) {
7729     Diags.Report(diag::err_target_unknown_triple) << Triple.str();
7730     return nullptr;
7731   }
7732   Target->TargetOpts = Opts;
7733 
7734   // Set the target CPU if specified.
7735   if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
7736     Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
7737     return nullptr;
7738   }
7739 
7740   // Set the target ABI if specified.
7741   if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
7742     Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
7743     return nullptr;
7744   }
7745 
7746   // Set the fp math unit.
7747   if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
7748     Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
7749     return nullptr;
7750   }
7751 
7752   // Compute the default target features, we need the target to handle this
7753   // because features may have dependencies on one another.
7754   llvm::StringMap<bool> Features;
7755   if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
7756                               Opts->FeaturesAsWritten))
7757       return nullptr;
7758 
7759   // Add the features to the compile options.
7760   Opts->Features.clear();
7761   for (const auto &F : Features)
7762     Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
7763 
7764   if (!Target->handleTargetFeatures(Opts->Features, Diags))
7765     return nullptr;
7766 
7767   return Target.release();
7768 }
7769