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