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/Builtins.h"
16 #include "clang/Basic/Cuda.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/TargetInfo.h"
22 #include "clang/Basic/TargetOptions.h"
23 #include "clang/Basic/Version.h"
24 #include "clang/Frontend/CodeGenOptions.h"
25 #include "llvm/ADT/APFloat.h"
26 #include "llvm/ADT/STLExtras.h"
27 #include "llvm/ADT/StringExtras.h"
28 #include "llvm/ADT/StringRef.h"
29 #include "llvm/ADT/StringSwitch.h"
30 #include "llvm/ADT/Triple.h"
31 #include "llvm/MC/MCSectionMachO.h"
32 #include "llvm/Support/ErrorHandling.h"
33 #include "llvm/Support/TargetParser.h"
34 #include <algorithm>
35 #include <memory>
36 
37 using namespace clang;
38 
39 //===----------------------------------------------------------------------===//
40 //  Common code shared among targets.
41 //===----------------------------------------------------------------------===//
42 
43 /// DefineStd - Define a macro name and standard variants.  For example if
44 /// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
45 /// when in GNU mode.
46 static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
47                       const LangOptions &Opts) {
48   assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
49 
50   // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
51   // in the user's namespace.
52   if (Opts.GNUMode)
53     Builder.defineMacro(MacroName);
54 
55   // Define __unix.
56   Builder.defineMacro("__" + MacroName);
57 
58   // Define __unix__.
59   Builder.defineMacro("__" + MacroName + "__");
60 }
61 
62 static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
63                             bool Tuning = true) {
64   Builder.defineMacro("__" + CPUName);
65   Builder.defineMacro("__" + CPUName + "__");
66   if (Tuning)
67     Builder.defineMacro("__tune_" + CPUName + "__");
68 }
69 
70 static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
71                                   const TargetOptions &Opts);
72 
73 //===----------------------------------------------------------------------===//
74 // Defines specific to certain operating systems.
75 //===----------------------------------------------------------------------===//
76 
77 namespace {
78 template<typename TgtInfo>
79 class OSTargetInfo : public TgtInfo {
80 protected:
81   virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
82                             MacroBuilder &Builder) const=0;
83 public:
84   OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
85       : TgtInfo(Triple, Opts) {}
86   void getTargetDefines(const LangOptions &Opts,
87                         MacroBuilder &Builder) const override {
88     TgtInfo::getTargetDefines(Opts, Builder);
89     getOSDefines(Opts, TgtInfo::getTriple(), Builder);
90   }
91 
92 };
93 
94 // CloudABI Target
95 template <typename Target>
96 class CloudABITargetInfo : public OSTargetInfo<Target> {
97 protected:
98   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
99                     MacroBuilder &Builder) const override {
100     Builder.defineMacro("__CloudABI__");
101     Builder.defineMacro("__ELF__");
102 
103     // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
104     Builder.defineMacro("__STDC_ISO_10646__", "201206L");
105     Builder.defineMacro("__STDC_UTF_16__");
106     Builder.defineMacro("__STDC_UTF_32__");
107   }
108 
109 public:
110   CloudABITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
111       : OSTargetInfo<Target>(Triple, Opts) {}
112 };
113 
114 static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
115                              const llvm::Triple &Triple,
116                              StringRef &PlatformName,
117                              VersionTuple &PlatformMinVersion) {
118   Builder.defineMacro("__APPLE_CC__", "6000");
119   Builder.defineMacro("__APPLE__");
120   Builder.defineMacro("OBJC_NEW_PROPERTIES");
121   // AddressSanitizer doesn't play well with source fortification, which is on
122   // by default on Darwin.
123   if (Opts.Sanitize.has(SanitizerKind::Address))
124     Builder.defineMacro("_FORTIFY_SOURCE", "0");
125 
126   // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
127   if (!Opts.ObjC1) {
128     // __weak is always defined, for use in blocks and with objc pointers.
129     Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
130     Builder.defineMacro("__strong", "");
131     Builder.defineMacro("__unsafe_unretained", "");
132   }
133 
134   if (Opts.Static)
135     Builder.defineMacro("__STATIC__");
136   else
137     Builder.defineMacro("__DYNAMIC__");
138 
139   if (Opts.POSIXThreads)
140     Builder.defineMacro("_REENTRANT");
141 
142   // Get the platform type and version number from the triple.
143   unsigned Maj, Min, Rev;
144   if (Triple.isMacOSX()) {
145     Triple.getMacOSXVersion(Maj, Min, Rev);
146     PlatformName = "macos";
147   } else {
148     Triple.getOSVersion(Maj, Min, Rev);
149     PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
150   }
151 
152   // If -target arch-pc-win32-macho option specified, we're
153   // generating code for Win32 ABI. No need to emit
154   // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
155   if (PlatformName == "win32") {
156     PlatformMinVersion = VersionTuple(Maj, Min, Rev);
157     return;
158   }
159 
160   // Set the appropriate OS version define.
161   if (Triple.isiOS()) {
162     assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
163     char Str[7];
164     if (Maj < 10) {
165       Str[0] = '0' + Maj;
166       Str[1] = '0' + (Min / 10);
167       Str[2] = '0' + (Min % 10);
168       Str[3] = '0' + (Rev / 10);
169       Str[4] = '0' + (Rev % 10);
170       Str[5] = '\0';
171     } else {
172       // Handle versions >= 10.
173       Str[0] = '0' + (Maj / 10);
174       Str[1] = '0' + (Maj % 10);
175       Str[2] = '0' + (Min / 10);
176       Str[3] = '0' + (Min % 10);
177       Str[4] = '0' + (Rev / 10);
178       Str[5] = '0' + (Rev % 10);
179       Str[6] = '\0';
180     }
181     if (Triple.isTvOS())
182       Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
183     else
184       Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
185                           Str);
186 
187   } else if (Triple.isWatchOS()) {
188     assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
189     char Str[6];
190     Str[0] = '0' + Maj;
191     Str[1] = '0' + (Min / 10);
192     Str[2] = '0' + (Min % 10);
193     Str[3] = '0' + (Rev / 10);
194     Str[4] = '0' + (Rev % 10);
195     Str[5] = '\0';
196     Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
197   } else if (Triple.isMacOSX()) {
198     // Note that the Driver allows versions which aren't representable in the
199     // define (because we only get a single digit for the minor and micro
200     // revision numbers). So, we limit them to the maximum representable
201     // version.
202     assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
203     char Str[7];
204     if (Maj < 10 || (Maj == 10 && Min < 10)) {
205       Str[0] = '0' + (Maj / 10);
206       Str[1] = '0' + (Maj % 10);
207       Str[2] = '0' + std::min(Min, 9U);
208       Str[3] = '0' + std::min(Rev, 9U);
209       Str[4] = '\0';
210     } else {
211       // Handle versions > 10.9.
212       Str[0] = '0' + (Maj / 10);
213       Str[1] = '0' + (Maj % 10);
214       Str[2] = '0' + (Min / 10);
215       Str[3] = '0' + (Min % 10);
216       Str[4] = '0' + (Rev / 10);
217       Str[5] = '0' + (Rev % 10);
218       Str[6] = '\0';
219     }
220     Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
221   }
222 
223   // Tell users about the kernel if there is one.
224   if (Triple.isOSDarwin())
225     Builder.defineMacro("__MACH__");
226 
227   // The Watch ABI uses Dwarf EH.
228   if(Triple.isWatchABI())
229     Builder.defineMacro("__ARM_DWARF_EH__");
230 
231   PlatformMinVersion = VersionTuple(Maj, Min, Rev);
232 }
233 
234 template<typename Target>
235 class DarwinTargetInfo : public OSTargetInfo<Target> {
236 protected:
237   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
238                     MacroBuilder &Builder) const override {
239     getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
240                      this->PlatformMinVersion);
241   }
242 
243 public:
244   DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
245       : OSTargetInfo<Target>(Triple, Opts) {
246     // By default, no TLS, and we whitelist permitted architecture/OS
247     // combinations.
248     this->TLSSupported = false;
249 
250     if (Triple.isMacOSX())
251       this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
252     else if (Triple.isiOS()) {
253       // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
254       if (Triple.getArch() == llvm::Triple::x86_64 ||
255           Triple.getArch() == llvm::Triple::aarch64)
256         this->TLSSupported = !Triple.isOSVersionLT(8);
257       else if (Triple.getArch() == llvm::Triple::x86 ||
258                Triple.getArch() == llvm::Triple::arm ||
259                Triple.getArch() == llvm::Triple::thumb)
260         this->TLSSupported = !Triple.isOSVersionLT(9);
261     } else if (Triple.isWatchOS())
262       this->TLSSupported = !Triple.isOSVersionLT(2);
263 
264     this->MCountName = "\01mcount";
265   }
266 
267   std::string isValidSectionSpecifier(StringRef SR) const override {
268     // Let MCSectionMachO validate this.
269     StringRef Segment, Section;
270     unsigned TAA, StubSize;
271     bool HasTAA;
272     return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
273                                                        TAA, HasTAA, StubSize);
274   }
275 
276   const char *getStaticInitSectionSpecifier() const override {
277     // FIXME: We should return 0 when building kexts.
278     return "__TEXT,__StaticInit,regular,pure_instructions";
279   }
280 
281   /// Darwin does not support protected visibility.  Darwin's "default"
282   /// is very similar to ELF's "protected";  Darwin requires a "weak"
283   /// attribute on declarations that can be dynamically replaced.
284   bool hasProtectedVisibility() const override {
285     return false;
286   }
287 
288   unsigned getExnObjectAlignment() const override {
289     // The alignment of an exception object is 8-bytes for darwin since
290     // libc++abi doesn't declare _Unwind_Exception with __attribute__((aligned))
291     // and therefore doesn't guarantee 16-byte alignment.
292     return  64;
293   }
294 };
295 
296 
297 // DragonFlyBSD Target
298 template<typename Target>
299 class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
300 protected:
301   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
302                     MacroBuilder &Builder) const override {
303     // DragonFly defines; list based off of gcc output
304     Builder.defineMacro("__DragonFly__");
305     Builder.defineMacro("__DragonFly_cc_version", "100001");
306     Builder.defineMacro("__ELF__");
307     Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
308     Builder.defineMacro("__tune_i386__");
309     DefineStd(Builder, "unix", Opts);
310   }
311 public:
312   DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
313       : OSTargetInfo<Target>(Triple, Opts) {
314     switch (Triple.getArch()) {
315     default:
316     case llvm::Triple::x86:
317     case llvm::Triple::x86_64:
318       this->MCountName = ".mcount";
319       break;
320     }
321   }
322 };
323 
324 #ifndef FREEBSD_CC_VERSION
325 #define FREEBSD_CC_VERSION 0U
326 #endif
327 
328 // FreeBSD Target
329 template<typename Target>
330 class FreeBSDTargetInfo : public OSTargetInfo<Target> {
331 protected:
332   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
333                     MacroBuilder &Builder) const override {
334     // FreeBSD defines; list based off of gcc output
335 
336     unsigned Release = Triple.getOSMajorVersion();
337     if (Release == 0U)
338       Release = 8U;
339     unsigned CCVersion = FREEBSD_CC_VERSION;
340     if (CCVersion == 0U)
341       CCVersion = Release * 100000U + 1U;
342 
343     Builder.defineMacro("__FreeBSD__", Twine(Release));
344     Builder.defineMacro("__FreeBSD_cc_version", Twine(CCVersion));
345     Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
346     DefineStd(Builder, "unix", Opts);
347     Builder.defineMacro("__ELF__");
348 
349     // On FreeBSD, wchar_t contains the number of the code point as
350     // used by the character set of the locale. These character sets are
351     // not necessarily a superset of ASCII.
352     //
353     // FIXME: This is wrong; the macro refers to the numerical values
354     // of wchar_t *literals*, which are not locale-dependent. However,
355     // FreeBSD systems apparently depend on us getting this wrong, and
356     // setting this to 1 is conforming even if all the basic source
357     // character literals have the same encoding as char and wchar_t.
358     Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
359   }
360 public:
361   FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
362       : OSTargetInfo<Target>(Triple, Opts) {
363     switch (Triple.getArch()) {
364     default:
365     case llvm::Triple::x86:
366     case llvm::Triple::x86_64:
367       this->MCountName = ".mcount";
368       break;
369     case llvm::Triple::mips:
370     case llvm::Triple::mipsel:
371     case llvm::Triple::ppc:
372     case llvm::Triple::ppc64:
373     case llvm::Triple::ppc64le:
374       this->MCountName = "_mcount";
375       break;
376     case llvm::Triple::arm:
377       this->MCountName = "__mcount";
378       break;
379     }
380   }
381 };
382 
383 // GNU/kFreeBSD Target
384 template<typename Target>
385 class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
386 protected:
387   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
388                     MacroBuilder &Builder) const override {
389     // GNU/kFreeBSD defines; list based off of gcc output
390 
391     DefineStd(Builder, "unix", Opts);
392     Builder.defineMacro("__FreeBSD_kernel__");
393     Builder.defineMacro("__GLIBC__");
394     Builder.defineMacro("__ELF__");
395     if (Opts.POSIXThreads)
396       Builder.defineMacro("_REENTRANT");
397     if (Opts.CPlusPlus)
398       Builder.defineMacro("_GNU_SOURCE");
399   }
400 public:
401   KFreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
402       : OSTargetInfo<Target>(Triple, Opts) {}
403 };
404 
405 // Haiku Target
406 template<typename Target>
407 class HaikuTargetInfo : public OSTargetInfo<Target> {
408 protected:
409   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
410                     MacroBuilder &Builder) const override {
411     // Haiku defines; list based off of gcc output
412     Builder.defineMacro("__HAIKU__");
413     Builder.defineMacro("__ELF__");
414     DefineStd(Builder, "unix", Opts);
415   }
416 public:
417   HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
418       : OSTargetInfo<Target>(Triple, Opts) {
419     this->SizeType = TargetInfo::UnsignedLong;
420     this->IntPtrType = TargetInfo::SignedLong;
421     this->PtrDiffType = TargetInfo::SignedLong;
422     this->ProcessIDType = TargetInfo::SignedLong;
423     this->TLSSupported = false;
424 
425   }
426 };
427 
428 // Minix Target
429 template<typename Target>
430 class MinixTargetInfo : public OSTargetInfo<Target> {
431 protected:
432   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
433                     MacroBuilder &Builder) const override {
434     // Minix defines
435 
436     Builder.defineMacro("__minix", "3");
437     Builder.defineMacro("_EM_WSIZE", "4");
438     Builder.defineMacro("_EM_PSIZE", "4");
439     Builder.defineMacro("_EM_SSIZE", "2");
440     Builder.defineMacro("_EM_LSIZE", "4");
441     Builder.defineMacro("_EM_FSIZE", "4");
442     Builder.defineMacro("_EM_DSIZE", "8");
443     Builder.defineMacro("__ELF__");
444     DefineStd(Builder, "unix", Opts);
445   }
446 public:
447   MinixTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
448       : OSTargetInfo<Target>(Triple, Opts) {}
449 };
450 
451 // Linux target
452 template<typename Target>
453 class LinuxTargetInfo : public OSTargetInfo<Target> {
454 protected:
455   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
456                     MacroBuilder &Builder) const override {
457     // Linux defines; list based off of gcc output
458     DefineStd(Builder, "unix", Opts);
459     DefineStd(Builder, "linux", Opts);
460     Builder.defineMacro("__gnu_linux__");
461     Builder.defineMacro("__ELF__");
462     if (Triple.isAndroid()) {
463       Builder.defineMacro("__ANDROID__", "1");
464       unsigned Maj, Min, Rev;
465       Triple.getEnvironmentVersion(Maj, Min, Rev);
466       this->PlatformName = "android";
467       this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
468       if (Maj)
469         Builder.defineMacro("__ANDROID_API__", Twine(Maj));
470     }
471     if (Opts.POSIXThreads)
472       Builder.defineMacro("_REENTRANT");
473     if (Opts.CPlusPlus)
474       Builder.defineMacro("_GNU_SOURCE");
475     if (this->HasFloat128)
476       Builder.defineMacro("__FLOAT128__");
477   }
478 public:
479   LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
480       : OSTargetInfo<Target>(Triple, Opts) {
481     this->WIntType = TargetInfo::UnsignedInt;
482 
483     switch (Triple.getArch()) {
484     default:
485       break;
486     case llvm::Triple::ppc:
487     case llvm::Triple::ppc64:
488     case llvm::Triple::ppc64le:
489       this->MCountName = "_mcount";
490       break;
491     case llvm::Triple::x86:
492     case llvm::Triple::x86_64:
493     case llvm::Triple::systemz:
494       this->HasFloat128 = true;
495       break;
496     }
497   }
498 
499   const char *getStaticInitSectionSpecifier() const override {
500     return ".text.startup";
501   }
502 };
503 
504 // NetBSD Target
505 template<typename Target>
506 class NetBSDTargetInfo : public OSTargetInfo<Target> {
507 protected:
508   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
509                     MacroBuilder &Builder) const override {
510     // NetBSD defines; list based off of gcc output
511     Builder.defineMacro("__NetBSD__");
512     Builder.defineMacro("__unix__");
513     Builder.defineMacro("__ELF__");
514     if (Opts.POSIXThreads)
515       Builder.defineMacro("_REENTRANT");
516 
517     switch (Triple.getArch()) {
518     default:
519       break;
520     case llvm::Triple::arm:
521     case llvm::Triple::armeb:
522     case llvm::Triple::thumb:
523     case llvm::Triple::thumbeb:
524       Builder.defineMacro("__ARM_DWARF_EH__");
525       break;
526     }
527   }
528 public:
529   NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
530       : OSTargetInfo<Target>(Triple, Opts) {
531     this->MCountName = "_mcount";
532   }
533 };
534 
535 // OpenBSD Target
536 template<typename Target>
537 class OpenBSDTargetInfo : public OSTargetInfo<Target> {
538 protected:
539   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
540                     MacroBuilder &Builder) const override {
541     // OpenBSD defines; list based off of gcc output
542 
543     Builder.defineMacro("__OpenBSD__");
544     DefineStd(Builder, "unix", Opts);
545     Builder.defineMacro("__ELF__");
546     if (Opts.POSIXThreads)
547       Builder.defineMacro("_REENTRANT");
548   }
549 public:
550   OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
551       : OSTargetInfo<Target>(Triple, Opts) {
552     this->TLSSupported = false;
553 
554       switch (Triple.getArch()) {
555         default:
556         case llvm::Triple::x86:
557         case llvm::Triple::x86_64:
558         case llvm::Triple::arm:
559         case llvm::Triple::sparc:
560           this->MCountName = "__mcount";
561           break;
562         case llvm::Triple::mips64:
563         case llvm::Triple::mips64el:
564         case llvm::Triple::ppc:
565         case llvm::Triple::sparcv9:
566           this->MCountName = "_mcount";
567           break;
568       }
569   }
570 };
571 
572 // Bitrig Target
573 template<typename Target>
574 class BitrigTargetInfo : public OSTargetInfo<Target> {
575 protected:
576   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
577                     MacroBuilder &Builder) const override {
578     // Bitrig defines; list based off of gcc output
579 
580     Builder.defineMacro("__Bitrig__");
581     DefineStd(Builder, "unix", Opts);
582     Builder.defineMacro("__ELF__");
583     if (Opts.POSIXThreads)
584       Builder.defineMacro("_REENTRANT");
585 
586     switch (Triple.getArch()) {
587     default:
588       break;
589     case llvm::Triple::arm:
590     case llvm::Triple::armeb:
591     case llvm::Triple::thumb:
592     case llvm::Triple::thumbeb:
593       Builder.defineMacro("__ARM_DWARF_EH__");
594       break;
595     }
596   }
597 public:
598   BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
599       : OSTargetInfo<Target>(Triple, Opts) {
600     this->MCountName = "__mcount";
601   }
602 };
603 
604 // PSP Target
605 template<typename Target>
606 class PSPTargetInfo : public OSTargetInfo<Target> {
607 protected:
608   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
609                     MacroBuilder &Builder) const override {
610     // PSP defines; list based on the output of the pspdev gcc toolchain.
611     Builder.defineMacro("PSP");
612     Builder.defineMacro("_PSP");
613     Builder.defineMacro("__psp__");
614     Builder.defineMacro("__ELF__");
615   }
616 public:
617   PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
618 };
619 
620 // PS3 PPU Target
621 template<typename Target>
622 class PS3PPUTargetInfo : public OSTargetInfo<Target> {
623 protected:
624   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
625                     MacroBuilder &Builder) const override {
626     // PS3 PPU defines.
627     Builder.defineMacro("__PPC__");
628     Builder.defineMacro("__PPU__");
629     Builder.defineMacro("__CELLOS_LV2__");
630     Builder.defineMacro("__ELF__");
631     Builder.defineMacro("__LP32__");
632     Builder.defineMacro("_ARCH_PPC64");
633     Builder.defineMacro("__powerpc64__");
634   }
635 public:
636   PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
637       : OSTargetInfo<Target>(Triple, Opts) {
638     this->LongWidth = this->LongAlign = 32;
639     this->PointerWidth = this->PointerAlign = 32;
640     this->IntMaxType = TargetInfo::SignedLongLong;
641     this->Int64Type = TargetInfo::SignedLongLong;
642     this->SizeType = TargetInfo::UnsignedInt;
643     this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
644   }
645 };
646 
647 template <typename Target>
648 class PS4OSTargetInfo : public OSTargetInfo<Target> {
649 protected:
650   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
651                     MacroBuilder &Builder) const override {
652     Builder.defineMacro("__FreeBSD__", "9");
653     Builder.defineMacro("__FreeBSD_cc_version", "900001");
654     Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
655     DefineStd(Builder, "unix", Opts);
656     Builder.defineMacro("__ELF__");
657     Builder.defineMacro("__ORBIS__");
658   }
659 public:
660   PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
661       : OSTargetInfo<Target>(Triple, Opts) {
662     this->WCharType = this->UnsignedShort;
663 
664     // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
665     this->MaxTLSAlign = 256;
666 
667     // On PS4, do not honor explicit bit field alignment,
668     // as in "__attribute__((aligned(2))) int b : 1;".
669     this->UseExplicitBitFieldAlignment = false;
670 
671     switch (Triple.getArch()) {
672     default:
673     case llvm::Triple::x86_64:
674       this->MCountName = ".mcount";
675       break;
676     }
677   }
678 };
679 
680 // Solaris target
681 template<typename Target>
682 class SolarisTargetInfo : public OSTargetInfo<Target> {
683 protected:
684   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
685                     MacroBuilder &Builder) const override {
686     DefineStd(Builder, "sun", Opts);
687     DefineStd(Builder, "unix", Opts);
688     Builder.defineMacro("__ELF__");
689     Builder.defineMacro("__svr4__");
690     Builder.defineMacro("__SVR4");
691     // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
692     // newer, but to 500 for everything else.  feature_test.h has a check to
693     // ensure that you are not using C99 with an old version of X/Open or C89
694     // with a new version.
695     if (Opts.C99)
696       Builder.defineMacro("_XOPEN_SOURCE", "600");
697     else
698       Builder.defineMacro("_XOPEN_SOURCE", "500");
699     if (Opts.CPlusPlus)
700       Builder.defineMacro("__C99FEATURES__");
701     Builder.defineMacro("_LARGEFILE_SOURCE");
702     Builder.defineMacro("_LARGEFILE64_SOURCE");
703     Builder.defineMacro("__EXTENSIONS__");
704     Builder.defineMacro("_REENTRANT");
705   }
706 public:
707   SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
708       : OSTargetInfo<Target>(Triple, Opts) {
709     this->WCharType = this->SignedInt;
710     // FIXME: WIntType should be SignedLong
711   }
712 };
713 
714 // Windows target
715 template<typename Target>
716 class WindowsTargetInfo : public OSTargetInfo<Target> {
717 protected:
718   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
719                     MacroBuilder &Builder) const override {
720     Builder.defineMacro("_WIN32");
721   }
722   void getVisualStudioDefines(const LangOptions &Opts,
723                               MacroBuilder &Builder) const {
724     if (Opts.CPlusPlus) {
725       if (Opts.RTTIData)
726         Builder.defineMacro("_CPPRTTI");
727 
728       if (Opts.CXXExceptions)
729         Builder.defineMacro("_CPPUNWIND");
730     }
731 
732     if (Opts.Bool)
733       Builder.defineMacro("__BOOL_DEFINED");
734 
735     if (!Opts.CharIsSigned)
736       Builder.defineMacro("_CHAR_UNSIGNED");
737 
738     // FIXME: POSIXThreads isn't exactly the option this should be defined for,
739     //        but it works for now.
740     if (Opts.POSIXThreads)
741       Builder.defineMacro("_MT");
742 
743     if (Opts.MSCompatibilityVersion) {
744       Builder.defineMacro("_MSC_VER",
745                           Twine(Opts.MSCompatibilityVersion / 100000));
746       Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
747       // FIXME We cannot encode the revision information into 32-bits
748       Builder.defineMacro("_MSC_BUILD", Twine(1));
749 
750       if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
751         Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
752 
753       if (Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) {
754         if (Opts.CPlusPlus1z)
755           Builder.defineMacro("_MSVC_LANG", "201403L");
756         else if (Opts.CPlusPlus14)
757           Builder.defineMacro("_MSVC_LANG", "201402L");
758       }
759     }
760 
761     if (Opts.MicrosoftExt) {
762       Builder.defineMacro("_MSC_EXTENSIONS");
763 
764       if (Opts.CPlusPlus11) {
765         Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
766         Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
767         Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
768       }
769     }
770 
771     Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
772   }
773 
774 public:
775   WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
776       : OSTargetInfo<Target>(Triple, Opts) {}
777 };
778 
779 template <typename Target>
780 class NaClTargetInfo : public OSTargetInfo<Target> {
781 protected:
782   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
783                     MacroBuilder &Builder) const override {
784     if (Opts.POSIXThreads)
785       Builder.defineMacro("_REENTRANT");
786     if (Opts.CPlusPlus)
787       Builder.defineMacro("_GNU_SOURCE");
788 
789     DefineStd(Builder, "unix", Opts);
790     Builder.defineMacro("__ELF__");
791     Builder.defineMacro("__native_client__");
792   }
793 
794 public:
795   NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
796       : OSTargetInfo<Target>(Triple, Opts) {
797     this->LongAlign = 32;
798     this->LongWidth = 32;
799     this->PointerAlign = 32;
800     this->PointerWidth = 32;
801     this->IntMaxType = TargetInfo::SignedLongLong;
802     this->Int64Type = TargetInfo::SignedLongLong;
803     this->DoubleAlign = 64;
804     this->LongDoubleWidth = 64;
805     this->LongDoubleAlign = 64;
806     this->LongLongWidth = 64;
807     this->LongLongAlign = 64;
808     this->SizeType = TargetInfo::UnsignedInt;
809     this->PtrDiffType = TargetInfo::SignedInt;
810     this->IntPtrType = TargetInfo::SignedInt;
811     // RegParmMax is inherited from the underlying architecture.
812     this->LongDoubleFormat = &llvm::APFloat::IEEEdouble();
813     if (Triple.getArch() == llvm::Triple::arm) {
814       // Handled in ARM's setABI().
815     } else if (Triple.getArch() == llvm::Triple::x86) {
816       this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
817     } else if (Triple.getArch() == llvm::Triple::x86_64) {
818       this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
819     } else if (Triple.getArch() == llvm::Triple::mipsel) {
820       // Handled on mips' setDataLayout.
821     } else {
822       assert(Triple.getArch() == llvm::Triple::le32);
823       this->resetDataLayout("e-p:32:32-i64:64");
824     }
825   }
826 };
827 
828 // Fuchsia Target
829 template<typename Target>
830 class FuchsiaTargetInfo : public OSTargetInfo<Target> {
831 protected:
832   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
833                     MacroBuilder &Builder) const override {
834     Builder.defineMacro("__Fuchsia__");
835     Builder.defineMacro("__ELF__");
836     if (Opts.POSIXThreads)
837       Builder.defineMacro("_REENTRANT");
838     // Required by the libc++ locale support.
839     if (Opts.CPlusPlus)
840       Builder.defineMacro("_GNU_SOURCE");
841   }
842 public:
843   FuchsiaTargetInfo(const llvm::Triple &Triple,
844                     const TargetOptions &Opts)
845       : OSTargetInfo<Target>(Triple, Opts) {
846     this->MCountName = "__mcount";
847   }
848 };
849 
850 // WebAssembly target
851 template <typename Target>
852 class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
853   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
854                     MacroBuilder &Builder) const final {
855     // A common platform macro.
856     if (Opts.POSIXThreads)
857       Builder.defineMacro("_REENTRANT");
858     // Follow g++ convention and predefine _GNU_SOURCE for C++.
859     if (Opts.CPlusPlus)
860       Builder.defineMacro("_GNU_SOURCE");
861   }
862 
863   // As an optimization, group static init code together in a section.
864   const char *getStaticInitSectionSpecifier() const final {
865     return ".text.__startup";
866   }
867 
868 public:
869   explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
870                                    const TargetOptions &Opts)
871       : OSTargetInfo<Target>(Triple, Opts) {
872     this->MCountName = "__mcount";
873     this->TheCXXABI.set(TargetCXXABI::WebAssembly);
874   }
875 };
876 
877 //===----------------------------------------------------------------------===//
878 // Specific target implementations.
879 //===----------------------------------------------------------------------===//
880 
881 // PPC abstract base class
882 class PPCTargetInfo : public TargetInfo {
883   static const Builtin::Info BuiltinInfo[];
884   static const char * const GCCRegNames[];
885   static const TargetInfo::GCCRegAlias GCCRegAliases[];
886   std::string CPU;
887 
888   // Target cpu features.
889   bool HasVSX;
890   bool HasP8Vector;
891   bool HasP8Crypto;
892   bool HasDirectMove;
893   bool HasQPX;
894   bool HasHTM;
895   bool HasBPERMD;
896   bool HasExtDiv;
897   bool HasP9Vector;
898 
899 protected:
900   std::string ABI;
901 
902 public:
903   PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
904     : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
905       HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
906       HasBPERMD(false), HasExtDiv(false), HasP9Vector(false) {
907     SimdDefaultAlign = 128;
908     LongDoubleWidth = LongDoubleAlign = 128;
909     LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble();
910   }
911 
912   /// \brief Flags for architecture specific defines.
913   typedef enum {
914     ArchDefineNone  = 0,
915     ArchDefineName  = 1 << 0, // <name> is substituted for arch name.
916     ArchDefinePpcgr = 1 << 1,
917     ArchDefinePpcsq = 1 << 2,
918     ArchDefine440   = 1 << 3,
919     ArchDefine603   = 1 << 4,
920     ArchDefine604   = 1 << 5,
921     ArchDefinePwr4  = 1 << 6,
922     ArchDefinePwr5  = 1 << 7,
923     ArchDefinePwr5x = 1 << 8,
924     ArchDefinePwr6  = 1 << 9,
925     ArchDefinePwr6x = 1 << 10,
926     ArchDefinePwr7  = 1 << 11,
927     ArchDefinePwr8  = 1 << 12,
928     ArchDefinePwr9  = 1 << 13,
929     ArchDefineA2    = 1 << 14,
930     ArchDefineA2q   = 1 << 15
931   } ArchDefineTypes;
932 
933   // Note: GCC recognizes the following additional cpus:
934   //  401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
935   //  821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
936   //  titan, rs64.
937   bool setCPU(const std::string &Name) override {
938     bool CPUKnown = llvm::StringSwitch<bool>(Name)
939       .Case("generic", true)
940       .Case("440", true)
941       .Case("450", true)
942       .Case("601", true)
943       .Case("602", true)
944       .Case("603", true)
945       .Case("603e", true)
946       .Case("603ev", true)
947       .Case("604", true)
948       .Case("604e", true)
949       .Case("620", true)
950       .Case("630", true)
951       .Case("g3", true)
952       .Case("7400", true)
953       .Case("g4", true)
954       .Case("7450", true)
955       .Case("g4+", true)
956       .Case("750", true)
957       .Case("970", true)
958       .Case("g5", true)
959       .Case("a2", true)
960       .Case("a2q", true)
961       .Case("e500mc", true)
962       .Case("e5500", true)
963       .Case("power3", true)
964       .Case("pwr3", true)
965       .Case("power4", true)
966       .Case("pwr4", true)
967       .Case("power5", true)
968       .Case("pwr5", true)
969       .Case("power5x", true)
970       .Case("pwr5x", true)
971       .Case("power6", true)
972       .Case("pwr6", true)
973       .Case("power6x", true)
974       .Case("pwr6x", true)
975       .Case("power7", true)
976       .Case("pwr7", true)
977       .Case("power8", true)
978       .Case("pwr8", true)
979       .Case("power9", true)
980       .Case("pwr9", true)
981       .Case("powerpc", true)
982       .Case("ppc", true)
983       .Case("powerpc64", true)
984       .Case("ppc64", true)
985       .Case("powerpc64le", true)
986       .Case("ppc64le", true)
987       .Default(false);
988 
989     if (CPUKnown)
990       CPU = Name;
991 
992     return CPUKnown;
993   }
994 
995 
996   StringRef getABI() const override { return ABI; }
997 
998   ArrayRef<Builtin::Info> getTargetBuiltins() const override {
999     return llvm::makeArrayRef(BuiltinInfo,
1000                              clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
1001   }
1002 
1003   bool isCLZForZeroUndef() const override { return false; }
1004 
1005   void getTargetDefines(const LangOptions &Opts,
1006                         MacroBuilder &Builder) const override;
1007 
1008   bool
1009   initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1010                  StringRef CPU,
1011                  const std::vector<std::string> &FeaturesVec) const override;
1012 
1013   bool handleTargetFeatures(std::vector<std::string> &Features,
1014                             DiagnosticsEngine &Diags) override;
1015   bool hasFeature(StringRef Feature) const override;
1016   void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
1017                          bool Enabled) const override;
1018 
1019   ArrayRef<const char *> getGCCRegNames() const override;
1020   ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
1021   bool validateAsmConstraint(const char *&Name,
1022                              TargetInfo::ConstraintInfo &Info) const override {
1023     switch (*Name) {
1024     default: return false;
1025     case 'O': // Zero
1026       break;
1027     case 'b': // Base register
1028     case 'f': // Floating point register
1029       Info.setAllowsRegister();
1030       break;
1031     // FIXME: The following are added to allow parsing.
1032     // I just took a guess at what the actions should be.
1033     // Also, is more specific checking needed?  I.e. specific registers?
1034     case 'd': // Floating point register (containing 64-bit value)
1035     case 'v': // Altivec vector register
1036       Info.setAllowsRegister();
1037       break;
1038     case 'w':
1039       switch (Name[1]) {
1040         case 'd':// VSX vector register to hold vector double data
1041         case 'f':// VSX vector register to hold vector float data
1042         case 's':// VSX vector register to hold scalar float data
1043         case 'a':// Any VSX register
1044         case 'c':// An individual CR bit
1045           break;
1046         default:
1047           return false;
1048       }
1049       Info.setAllowsRegister();
1050       Name++; // Skip over 'w'.
1051       break;
1052     case 'h': // `MQ', `CTR', or `LINK' register
1053     case 'q': // `MQ' register
1054     case 'c': // `CTR' register
1055     case 'l': // `LINK' register
1056     case 'x': // `CR' register (condition register) number 0
1057     case 'y': // `CR' register (condition register)
1058     case 'z': // `XER[CA]' carry bit (part of the XER register)
1059       Info.setAllowsRegister();
1060       break;
1061     case 'I': // Signed 16-bit constant
1062     case 'J': // Unsigned 16-bit constant shifted left 16 bits
1063               //  (use `L' instead for SImode constants)
1064     case 'K': // Unsigned 16-bit constant
1065     case 'L': // Signed 16-bit constant shifted left 16 bits
1066     case 'M': // Constant larger than 31
1067     case 'N': // Exact power of 2
1068     case 'P': // Constant whose negation is a signed 16-bit constant
1069     case 'G': // Floating point constant that can be loaded into a
1070               // register with one instruction per word
1071     case 'H': // Integer/Floating point constant that can be loaded
1072               // into a register using three instructions
1073       break;
1074     case 'm': // Memory operand. Note that on PowerPC targets, m can
1075               // include addresses that update the base register. It
1076               // is therefore only safe to use `m' in an asm statement
1077               // if that asm statement accesses the operand exactly once.
1078               // The asm statement must also use `%U<opno>' as a
1079               // placeholder for the "update" flag in the corresponding
1080               // load or store instruction. For example:
1081               // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
1082               // is correct but:
1083               // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1084               // is not. Use es rather than m if you don't want the base
1085               // register to be updated.
1086     case 'e':
1087       if (Name[1] != 's')
1088           return false;
1089               // es: A "stable" memory operand; that is, one which does not
1090               // include any automodification of the base register. Unlike
1091               // `m', this constraint can be used in asm statements that
1092               // might access the operand several times, or that might not
1093               // access it at all.
1094       Info.setAllowsMemory();
1095       Name++; // Skip over 'e'.
1096       break;
1097     case 'Q': // Memory operand that is an offset from a register (it is
1098               // usually better to use `m' or `es' in asm statements)
1099     case 'Z': // Memory operand that is an indexed or indirect from a
1100               // register (it is usually better to use `m' or `es' in
1101               // asm statements)
1102       Info.setAllowsMemory();
1103       Info.setAllowsRegister();
1104       break;
1105     case 'R': // AIX TOC entry
1106     case 'a': // Address operand that is an indexed or indirect from a
1107               // register (`p' is preferable for asm statements)
1108     case 'S': // Constant suitable as a 64-bit mask operand
1109     case 'T': // Constant suitable as a 32-bit mask operand
1110     case 'U': // System V Release 4 small data area reference
1111     case 't': // AND masks that can be performed by two rldic{l, r}
1112               // instructions
1113     case 'W': // Vector constant that does not require memory
1114     case 'j': // Vector constant that is all zeros.
1115       break;
1116     // End FIXME.
1117     }
1118     return true;
1119   }
1120   std::string convertConstraint(const char *&Constraint) const override {
1121     std::string R;
1122     switch (*Constraint) {
1123     case 'e':
1124     case 'w':
1125       // Two-character constraint; add "^" hint for later parsing.
1126       R = std::string("^") + std::string(Constraint, 2);
1127       Constraint++;
1128       break;
1129     default:
1130       return TargetInfo::convertConstraint(Constraint);
1131     }
1132     return R;
1133   }
1134   const char *getClobbers() const override {
1135     return "";
1136   }
1137   int getEHDataRegisterNumber(unsigned RegNo) const override {
1138     if (RegNo == 0) return 3;
1139     if (RegNo == 1) return 4;
1140     return -1;
1141   }
1142 
1143   bool hasSjLjLowering() const override {
1144     return true;
1145   }
1146 
1147   bool useFloat128ManglingForLongDouble() const override {
1148     return LongDoubleWidth == 128 &&
1149            LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble() &&
1150            getTriple().isOSBinFormatELF();
1151   }
1152 };
1153 
1154 const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
1155 #define BUILTIN(ID, TYPE, ATTRS) \
1156   { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1157 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1158   { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1159 #include "clang/Basic/BuiltinsPPC.def"
1160 };
1161 
1162 /// handleTargetFeatures - Perform initialization based on the user
1163 /// configured set of features.
1164 bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
1165                                          DiagnosticsEngine &Diags) {
1166   for (const auto &Feature : Features) {
1167     if (Feature == "+vsx") {
1168       HasVSX = true;
1169     } else if (Feature == "+bpermd") {
1170       HasBPERMD = true;
1171     } else if (Feature == "+extdiv") {
1172       HasExtDiv = true;
1173     } else if (Feature == "+power8-vector") {
1174       HasP8Vector = true;
1175     } else if (Feature == "+crypto") {
1176       HasP8Crypto = true;
1177     } else if (Feature == "+direct-move") {
1178       HasDirectMove = true;
1179     } else if (Feature == "+qpx") {
1180       HasQPX = true;
1181     } else if (Feature == "+htm") {
1182       HasHTM = true;
1183     } else if (Feature == "+float128") {
1184       HasFloat128 = true;
1185     } else if (Feature == "+power9-vector") {
1186       HasP9Vector = true;
1187     }
1188     // TODO: Finish this list and add an assert that we've handled them
1189     // all.
1190   }
1191 
1192   return true;
1193 }
1194 
1195 /// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1196 /// #defines that are not tied to a specific subtarget.
1197 void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
1198                                      MacroBuilder &Builder) const {
1199   // Target identification.
1200   Builder.defineMacro("__ppc__");
1201   Builder.defineMacro("__PPC__");
1202   Builder.defineMacro("_ARCH_PPC");
1203   Builder.defineMacro("__powerpc__");
1204   Builder.defineMacro("__POWERPC__");
1205   if (PointerWidth == 64) {
1206     Builder.defineMacro("_ARCH_PPC64");
1207     Builder.defineMacro("__powerpc64__");
1208     Builder.defineMacro("__ppc64__");
1209     Builder.defineMacro("__PPC64__");
1210   }
1211 
1212   // Target properties.
1213   if (getTriple().getArch() == llvm::Triple::ppc64le) {
1214     Builder.defineMacro("_LITTLE_ENDIAN");
1215   } else {
1216     if (getTriple().getOS() != llvm::Triple::NetBSD &&
1217         getTriple().getOS() != llvm::Triple::OpenBSD)
1218       Builder.defineMacro("_BIG_ENDIAN");
1219   }
1220 
1221   // ABI options.
1222   if (ABI == "elfv1" || ABI == "elfv1-qpx")
1223     Builder.defineMacro("_CALL_ELF", "1");
1224   if (ABI == "elfv2")
1225     Builder.defineMacro("_CALL_ELF", "2");
1226 
1227   // Subtarget options.
1228   Builder.defineMacro("__NATURAL_ALIGNMENT__");
1229   Builder.defineMacro("__REGISTER_PREFIX__", "");
1230 
1231   // FIXME: Should be controlled by command line option.
1232   if (LongDoubleWidth == 128)
1233     Builder.defineMacro("__LONG_DOUBLE_128__");
1234 
1235   if (Opts.AltiVec) {
1236     Builder.defineMacro("__VEC__", "10206");
1237     Builder.defineMacro("__ALTIVEC__");
1238   }
1239 
1240   // CPU identification.
1241   ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1242     .Case("440",   ArchDefineName)
1243     .Case("450",   ArchDefineName | ArchDefine440)
1244     .Case("601",   ArchDefineName)
1245     .Case("602",   ArchDefineName | ArchDefinePpcgr)
1246     .Case("603",   ArchDefineName | ArchDefinePpcgr)
1247     .Case("603e",  ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1248     .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1249     .Case("604",   ArchDefineName | ArchDefinePpcgr)
1250     .Case("604e",  ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1251     .Case("620",   ArchDefineName | ArchDefinePpcgr)
1252     .Case("630",   ArchDefineName | ArchDefinePpcgr)
1253     .Case("7400",  ArchDefineName | ArchDefinePpcgr)
1254     .Case("7450",  ArchDefineName | ArchDefinePpcgr)
1255     .Case("750",   ArchDefineName | ArchDefinePpcgr)
1256     .Case("970",   ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1257                      | ArchDefinePpcsq)
1258     .Case("a2",    ArchDefineA2)
1259     .Case("a2q",   ArchDefineName | ArchDefineA2 | ArchDefineA2q)
1260     .Case("pwr3",  ArchDefinePpcgr)
1261     .Case("pwr4",  ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1262     .Case("pwr5",  ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1263                      | ArchDefinePpcsq)
1264     .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1265                      | ArchDefinePpcgr | ArchDefinePpcsq)
1266     .Case("pwr6",  ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1267                      | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1268     .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1269                      | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1270                      | ArchDefinePpcsq)
1271     .Case("pwr7",  ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1272                      | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1273                      | ArchDefinePpcgr | ArchDefinePpcsq)
1274     .Case("pwr8",  ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1275                      | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1276                      | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1277     .Case("pwr9",  ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1278                      | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1279                      | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1280                      | ArchDefinePpcsq)
1281     .Case("power3",  ArchDefinePpcgr)
1282     .Case("power4",  ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1283     .Case("power5",  ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1284                        | ArchDefinePpcsq)
1285     .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1286                        | ArchDefinePpcgr | ArchDefinePpcsq)
1287     .Case("power6",  ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1288                        | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1289     .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1290                        | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1291                        | ArchDefinePpcsq)
1292     .Case("power7",  ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1293                        | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1294                        | ArchDefinePpcgr | ArchDefinePpcsq)
1295     .Case("power8",  ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1296                        | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1297                        | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1298     .Case("power9",  ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1299                        | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1300                        | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1301                        | ArchDefinePpcsq)
1302     .Default(ArchDefineNone);
1303 
1304   if (defs & ArchDefineName)
1305     Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1306   if (defs & ArchDefinePpcgr)
1307     Builder.defineMacro("_ARCH_PPCGR");
1308   if (defs & ArchDefinePpcsq)
1309     Builder.defineMacro("_ARCH_PPCSQ");
1310   if (defs & ArchDefine440)
1311     Builder.defineMacro("_ARCH_440");
1312   if (defs & ArchDefine603)
1313     Builder.defineMacro("_ARCH_603");
1314   if (defs & ArchDefine604)
1315     Builder.defineMacro("_ARCH_604");
1316   if (defs & ArchDefinePwr4)
1317     Builder.defineMacro("_ARCH_PWR4");
1318   if (defs & ArchDefinePwr5)
1319     Builder.defineMacro("_ARCH_PWR5");
1320   if (defs & ArchDefinePwr5x)
1321     Builder.defineMacro("_ARCH_PWR5X");
1322   if (defs & ArchDefinePwr6)
1323     Builder.defineMacro("_ARCH_PWR6");
1324   if (defs & ArchDefinePwr6x)
1325     Builder.defineMacro("_ARCH_PWR6X");
1326   if (defs & ArchDefinePwr7)
1327     Builder.defineMacro("_ARCH_PWR7");
1328   if (defs & ArchDefinePwr8)
1329     Builder.defineMacro("_ARCH_PWR8");
1330   if (defs & ArchDefinePwr9)
1331     Builder.defineMacro("_ARCH_PWR9");
1332   if (defs & ArchDefineA2)
1333     Builder.defineMacro("_ARCH_A2");
1334   if (defs & ArchDefineA2q) {
1335     Builder.defineMacro("_ARCH_A2Q");
1336     Builder.defineMacro("_ARCH_QP");
1337   }
1338 
1339   if (getTriple().getVendor() == llvm::Triple::BGQ) {
1340     Builder.defineMacro("__bg__");
1341     Builder.defineMacro("__THW_BLUEGENE__");
1342     Builder.defineMacro("__bgq__");
1343     Builder.defineMacro("__TOS_BGQ__");
1344   }
1345 
1346   if (HasVSX)
1347     Builder.defineMacro("__VSX__");
1348   if (HasP8Vector)
1349     Builder.defineMacro("__POWER8_VECTOR__");
1350   if (HasP8Crypto)
1351     Builder.defineMacro("__CRYPTO__");
1352   if (HasHTM)
1353     Builder.defineMacro("__HTM__");
1354   if (HasFloat128)
1355     Builder.defineMacro("__FLOAT128__");
1356   if (HasP9Vector)
1357     Builder.defineMacro("__POWER9_VECTOR__");
1358 
1359   Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1360   Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1361   Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1362   if (PointerWidth == 64)
1363     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
1364 
1365   // FIXME: The following are not yet generated here by Clang, but are
1366   //        generated by GCC:
1367   //
1368   //   _SOFT_FLOAT_
1369   //   __RECIP_PRECISION__
1370   //   __APPLE_ALTIVEC__
1371   //   __RECIP__
1372   //   __RECIPF__
1373   //   __RSQRTE__
1374   //   __RSQRTEF__
1375   //   _SOFT_DOUBLE_
1376   //   __NO_LWSYNC__
1377   //   __HAVE_BSWAP__
1378   //   __LONGDOUBLE128
1379   //   __CMODEL_MEDIUM__
1380   //   __CMODEL_LARGE__
1381   //   _CALL_SYSV
1382   //   _CALL_DARWIN
1383   //   __NO_FPRS__
1384 }
1385 
1386 // Handle explicit options being passed to the compiler here: if we've
1387 // explicitly turned off vsx and turned on any of:
1388 // - power8-vector
1389 // - direct-move
1390 // - float128
1391 // - power9-vector
1392 // then go ahead and error since the customer has expressed an incompatible
1393 // set of options.
1394 static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
1395                                  const std::vector<std::string> &FeaturesVec) {
1396 
1397   if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1398       FeaturesVec.end()) {
1399     if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1400         FeaturesVec.end()) {
1401       Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1402                                                      << "-mno-vsx";
1403       return false;
1404     }
1405 
1406     if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1407         FeaturesVec.end()) {
1408       Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1409                                                      << "-mno-vsx";
1410       return false;
1411     }
1412 
1413     if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1414         FeaturesVec.end()) {
1415       Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1416                                                      << "-mno-vsx";
1417       return false;
1418     }
1419 
1420     if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power9-vector") !=
1421         FeaturesVec.end()) {
1422       Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower9-vector"
1423                                                      << "-mno-vsx";
1424       return false;
1425     }
1426   }
1427 
1428   return true;
1429 }
1430 
1431 bool PPCTargetInfo::initFeatureMap(
1432     llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1433     const std::vector<std::string> &FeaturesVec) const {
1434   Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1435     .Case("7400", true)
1436     .Case("g4", true)
1437     .Case("7450", true)
1438     .Case("g4+", true)
1439     .Case("970", true)
1440     .Case("g5", true)
1441     .Case("pwr6", true)
1442     .Case("pwr7", true)
1443     .Case("pwr8", true)
1444     .Case("pwr9", true)
1445     .Case("ppc64", true)
1446     .Case("ppc64le", true)
1447     .Default(false);
1448 
1449   Features["qpx"] = (CPU == "a2q");
1450   Features["power9-vector"] = (CPU == "pwr9");
1451   Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1452     .Case("ppc64le", true)
1453     .Case("pwr9", true)
1454     .Case("pwr8", true)
1455     .Default(false);
1456   Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1457     .Case("ppc64le", true)
1458     .Case("pwr9", true)
1459     .Case("pwr8", true)
1460     .Default(false);
1461   Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1462     .Case("ppc64le", true)
1463     .Case("pwr9", true)
1464     .Case("pwr8", true)
1465     .Case("pwr7", true)
1466     .Default(false);
1467   Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1468     .Case("ppc64le", true)
1469     .Case("pwr9", true)
1470     .Case("pwr8", true)
1471     .Case("pwr7", true)
1472     .Default(false);
1473   Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1474     .Case("ppc64le", true)
1475     .Case("pwr9", true)
1476     .Case("pwr8", true)
1477     .Default(false);
1478   Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1479     .Case("ppc64le", true)
1480     .Case("pwr9", true)
1481     .Case("pwr8", true)
1482     .Case("pwr7", true)
1483     .Default(false);
1484 
1485   if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1486     return false;
1487 
1488   return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
1489 }
1490 
1491 bool PPCTargetInfo::hasFeature(StringRef Feature) const {
1492   return llvm::StringSwitch<bool>(Feature)
1493     .Case("powerpc", true)
1494     .Case("vsx", HasVSX)
1495     .Case("power8-vector", HasP8Vector)
1496     .Case("crypto", HasP8Crypto)
1497     .Case("direct-move", HasDirectMove)
1498     .Case("qpx", HasQPX)
1499     .Case("htm", HasHTM)
1500     .Case("bpermd", HasBPERMD)
1501     .Case("extdiv", HasExtDiv)
1502     .Case("float128", HasFloat128)
1503     .Case("power9-vector", HasP9Vector)
1504     .Default(false);
1505 }
1506 
1507 void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1508                                       StringRef Name, bool Enabled) const {
1509   // If we're enabling direct-move or power8-vector go ahead and enable vsx
1510   // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1511   // incompatible options.
1512   if (Enabled) {
1513     if (Name == "direct-move" ||
1514         Name == "power8-vector" ||
1515         Name == "float128" ||
1516         Name == "power9-vector") {
1517       // power9-vector is really a superset of power8-vector so encode that.
1518       Features[Name] = Features["vsx"] = true;
1519       if (Name == "power9-vector")
1520         Features["power8-vector"] = true;
1521     } else {
1522       Features[Name] = true;
1523     }
1524   } else {
1525     if (Name == "vsx") {
1526       Features[Name] = Features["direct-move"] = Features["power8-vector"] =
1527           Features["float128"] = Features["power9-vector"] = false;
1528     } else {
1529       Features[Name] = false;
1530     }
1531   }
1532 }
1533 
1534 const char * const PPCTargetInfo::GCCRegNames[] = {
1535   "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1536   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1537   "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1538   "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1539   "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1540   "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1541   "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1542   "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
1543   "mq", "lr", "ctr", "ap",
1544   "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
1545   "xer",
1546   "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1547   "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1548   "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1549   "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1550   "vrsave", "vscr",
1551   "spe_acc", "spefscr",
1552   "sfp"
1553 };
1554 
1555 ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1556   return llvm::makeArrayRef(GCCRegNames);
1557 }
1558 
1559 const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1560   // While some of these aliases do map to different registers
1561   // they still share the same register name.
1562   { { "0" }, "r0" },
1563   { { "1"}, "r1" },
1564   { { "2" }, "r2" },
1565   { { "3" }, "r3" },
1566   { { "4" }, "r4" },
1567   { { "5" }, "r5" },
1568   { { "6" }, "r6" },
1569   { { "7" }, "r7" },
1570   { { "8" }, "r8" },
1571   { { "9" }, "r9" },
1572   { { "10" }, "r10" },
1573   { { "11" }, "r11" },
1574   { { "12" }, "r12" },
1575   { { "13" }, "r13" },
1576   { { "14" }, "r14" },
1577   { { "15" }, "r15" },
1578   { { "16" }, "r16" },
1579   { { "17" }, "r17" },
1580   { { "18" }, "r18" },
1581   { { "19" }, "r19" },
1582   { { "20" }, "r20" },
1583   { { "21" }, "r21" },
1584   { { "22" }, "r22" },
1585   { { "23" }, "r23" },
1586   { { "24" }, "r24" },
1587   { { "25" }, "r25" },
1588   { { "26" }, "r26" },
1589   { { "27" }, "r27" },
1590   { { "28" }, "r28" },
1591   { { "29" }, "r29" },
1592   { { "30" }, "r30" },
1593   { { "31" }, "r31" },
1594   { { "fr0" }, "f0" },
1595   { { "fr1" }, "f1" },
1596   { { "fr2" }, "f2" },
1597   { { "fr3" }, "f3" },
1598   { { "fr4" }, "f4" },
1599   { { "fr5" }, "f5" },
1600   { { "fr6" }, "f6" },
1601   { { "fr7" }, "f7" },
1602   { { "fr8" }, "f8" },
1603   { { "fr9" }, "f9" },
1604   { { "fr10" }, "f10" },
1605   { { "fr11" }, "f11" },
1606   { { "fr12" }, "f12" },
1607   { { "fr13" }, "f13" },
1608   { { "fr14" }, "f14" },
1609   { { "fr15" }, "f15" },
1610   { { "fr16" }, "f16" },
1611   { { "fr17" }, "f17" },
1612   { { "fr18" }, "f18" },
1613   { { "fr19" }, "f19" },
1614   { { "fr20" }, "f20" },
1615   { { "fr21" }, "f21" },
1616   { { "fr22" }, "f22" },
1617   { { "fr23" }, "f23" },
1618   { { "fr24" }, "f24" },
1619   { { "fr25" }, "f25" },
1620   { { "fr26" }, "f26" },
1621   { { "fr27" }, "f27" },
1622   { { "fr28" }, "f28" },
1623   { { "fr29" }, "f29" },
1624   { { "fr30" }, "f30" },
1625   { { "fr31" }, "f31" },
1626   { { "cc" }, "cr0" },
1627 };
1628 
1629 ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1630   return llvm::makeArrayRef(GCCRegAliases);
1631 }
1632 
1633 class PPC32TargetInfo : public PPCTargetInfo {
1634 public:
1635   PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1636       : PPCTargetInfo(Triple, Opts) {
1637     resetDataLayout("E-m:e-p:32:32-i64:64-n32");
1638 
1639     switch (getTriple().getOS()) {
1640     case llvm::Triple::Linux:
1641     case llvm::Triple::FreeBSD:
1642     case llvm::Triple::NetBSD:
1643       SizeType = UnsignedInt;
1644       PtrDiffType = SignedInt;
1645       IntPtrType = SignedInt;
1646       break;
1647     default:
1648       break;
1649     }
1650 
1651     if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1652       LongDoubleWidth = LongDoubleAlign = 64;
1653       LongDoubleFormat = &llvm::APFloat::IEEEdouble();
1654     }
1655 
1656     // PPC32 supports atomics up to 4 bytes.
1657     MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
1658   }
1659 
1660   BuiltinVaListKind getBuiltinVaListKind() const override {
1661     // This is the ELF definition, and is overridden by the Darwin sub-target
1662     return TargetInfo::PowerABIBuiltinVaList;
1663   }
1664 };
1665 
1666 // Note: ABI differences may eventually require us to have a separate
1667 // TargetInfo for little endian.
1668 class PPC64TargetInfo : public PPCTargetInfo {
1669 public:
1670   PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1671       : PPCTargetInfo(Triple, Opts) {
1672     LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
1673     IntMaxType = SignedLong;
1674     Int64Type = SignedLong;
1675 
1676     if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1677       resetDataLayout("e-m:e-i64:64-n32:64");
1678       ABI = "elfv2";
1679     } else {
1680       resetDataLayout("E-m:e-i64:64-n32:64");
1681       ABI = "elfv1";
1682     }
1683 
1684     switch (getTriple().getOS()) {
1685     case llvm::Triple::FreeBSD:
1686       LongDoubleWidth = LongDoubleAlign = 64;
1687       LongDoubleFormat = &llvm::APFloat::IEEEdouble();
1688       break;
1689     case llvm::Triple::NetBSD:
1690       IntMaxType = SignedLongLong;
1691       Int64Type = SignedLongLong;
1692       break;
1693     default:
1694       break;
1695     }
1696 
1697     // PPC64 supports atomics up to 8 bytes.
1698     MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
1699   }
1700   BuiltinVaListKind getBuiltinVaListKind() const override {
1701     return TargetInfo::CharPtrBuiltinVaList;
1702   }
1703   // PPC64 Linux-specific ABI options.
1704   bool setABI(const std::string &Name) override {
1705     if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
1706       ABI = Name;
1707       return true;
1708     }
1709     return false;
1710   }
1711 };
1712 
1713 class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
1714 public:
1715   DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1716       : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
1717     HasAlignMac68kSupport = true;
1718     BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
1719     PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
1720     LongLongAlign = 32;
1721     SuitableAlign = 128;
1722     resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
1723   }
1724   BuiltinVaListKind getBuiltinVaListKind() const override {
1725     return TargetInfo::CharPtrBuiltinVaList;
1726   }
1727 };
1728 
1729 class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
1730 public:
1731   DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1732       : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
1733     HasAlignMac68kSupport = true;
1734     SuitableAlign = 128;
1735     resetDataLayout("E-m:o-i64:64-n32:64");
1736   }
1737 };
1738 
1739 static const unsigned NVPTXAddrSpaceMap[] = {
1740     1, // opencl_global
1741     3, // opencl_local
1742     4, // opencl_constant
1743     // FIXME: generic has to be added to the target
1744     0, // opencl_generic
1745     1, // cuda_device
1746     4, // cuda_constant
1747     3, // cuda_shared
1748 };
1749 
1750 class NVPTXTargetInfo : public TargetInfo {
1751   static const char *const GCCRegNames[];
1752   static const Builtin::Info BuiltinInfo[];
1753   CudaArch GPU;
1754   std::unique_ptr<TargetInfo> HostTarget;
1755 
1756 public:
1757   NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
1758                   unsigned TargetPointerWidth)
1759       : TargetInfo(Triple) {
1760     assert((TargetPointerWidth == 32 || TargetPointerWidth == 64) &&
1761            "NVPTX only supports 32- and 64-bit modes.");
1762 
1763     TLSSupported = false;
1764     AddrSpaceMap = &NVPTXAddrSpaceMap;
1765     UseAddrSpaceMapMangling = true;
1766 
1767     // Define available target features
1768     // These must be defined in sorted order!
1769     NoAsmVariants = true;
1770     GPU = CudaArch::SM_20;
1771 
1772     if (TargetPointerWidth == 32)
1773       resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
1774     else
1775       resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
1776 
1777     // If possible, get a TargetInfo for our host triple, so we can match its
1778     // types.
1779     llvm::Triple HostTriple(Opts.HostTriple);
1780     if (!HostTriple.isNVPTX())
1781       HostTarget.reset(AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1782 
1783     // If no host target, make some guesses about the data layout and return.
1784     if (!HostTarget) {
1785       LongWidth = LongAlign = TargetPointerWidth;
1786       PointerWidth = PointerAlign = TargetPointerWidth;
1787       switch (TargetPointerWidth) {
1788       case 32:
1789         SizeType = TargetInfo::UnsignedInt;
1790         PtrDiffType = TargetInfo::SignedInt;
1791         IntPtrType = TargetInfo::SignedInt;
1792         break;
1793       case 64:
1794         SizeType = TargetInfo::UnsignedLong;
1795         PtrDiffType = TargetInfo::SignedLong;
1796         IntPtrType = TargetInfo::SignedLong;
1797         break;
1798       default:
1799         llvm_unreachable("TargetPointerWidth must be 32 or 64");
1800       }
1801       return;
1802     }
1803 
1804     // Copy properties from host target.
1805     PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1806     PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1807     BoolWidth = HostTarget->getBoolWidth();
1808     BoolAlign = HostTarget->getBoolAlign();
1809     IntWidth = HostTarget->getIntWidth();
1810     IntAlign = HostTarget->getIntAlign();
1811     HalfWidth = HostTarget->getHalfWidth();
1812     HalfAlign = HostTarget->getHalfAlign();
1813     FloatWidth = HostTarget->getFloatWidth();
1814     FloatAlign = HostTarget->getFloatAlign();
1815     DoubleWidth = HostTarget->getDoubleWidth();
1816     DoubleAlign = HostTarget->getDoubleAlign();
1817     LongWidth = HostTarget->getLongWidth();
1818     LongAlign = HostTarget->getLongAlign();
1819     LongLongWidth = HostTarget->getLongLongWidth();
1820     LongLongAlign = HostTarget->getLongLongAlign();
1821     MinGlobalAlign = HostTarget->getMinGlobalAlign();
1822     NewAlign = HostTarget->getNewAlign();
1823     DefaultAlignForAttributeAligned =
1824         HostTarget->getDefaultAlignForAttributeAligned();
1825     SizeType = HostTarget->getSizeType();
1826     IntMaxType = HostTarget->getIntMaxType();
1827     PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1828     IntPtrType = HostTarget->getIntPtrType();
1829     WCharType = HostTarget->getWCharType();
1830     WIntType = HostTarget->getWIntType();
1831     Char16Type = HostTarget->getChar16Type();
1832     Char32Type = HostTarget->getChar32Type();
1833     Int64Type = HostTarget->getInt64Type();
1834     SigAtomicType = HostTarget->getSigAtomicType();
1835     ProcessIDType = HostTarget->getProcessIDType();
1836 
1837     UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1838     UseZeroLengthBitfieldAlignment =
1839         HostTarget->useZeroLengthBitfieldAlignment();
1840     UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1841     ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1842 
1843     // This is a bit of a lie, but it controls __GCC_ATOMIC_XXX_LOCK_FREE, and
1844     // we need those macros to be identical on host and device, because (among
1845     // other things) they affect which standard library classes are defined, and
1846     // we need all classes to be defined on both the host and device.
1847     MaxAtomicInlineWidth = HostTarget->getMaxAtomicInlineWidth();
1848 
1849     // Properties intentionally not copied from host:
1850     // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1851     //   host/device boundary.
1852     // - SuitableAlign: Not visible across the host/device boundary, and may
1853     //   correctly be different on host/device, e.g. if host has wider vector
1854     //   types than device.
1855     // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1856     //   as its double type, but that's not necessarily true on the host.
1857     //   TODO: nvcc emits a warning when using long double on device; we should
1858     //   do the same.
1859   }
1860   void getTargetDefines(const LangOptions &Opts,
1861                         MacroBuilder &Builder) const override {
1862     Builder.defineMacro("__PTX__");
1863     Builder.defineMacro("__NVPTX__");
1864     if (Opts.CUDAIsDevice) {
1865       // Set __CUDA_ARCH__ for the GPU specified.
1866       std::string CUDAArchCode = [this] {
1867         switch (GPU) {
1868         case CudaArch::UNKNOWN:
1869           assert(false && "No GPU arch when compiling CUDA device code.");
1870           return "";
1871         case CudaArch::SM_20:
1872           return "200";
1873         case CudaArch::SM_21:
1874           return "210";
1875         case CudaArch::SM_30:
1876           return "300";
1877         case CudaArch::SM_32:
1878           return "320";
1879         case CudaArch::SM_35:
1880           return "350";
1881         case CudaArch::SM_37:
1882           return "370";
1883         case CudaArch::SM_50:
1884           return "500";
1885         case CudaArch::SM_52:
1886           return "520";
1887         case CudaArch::SM_53:
1888           return "530";
1889         case CudaArch::SM_60:
1890           return "600";
1891         case CudaArch::SM_61:
1892           return "610";
1893         case CudaArch::SM_62:
1894           return "620";
1895         }
1896         llvm_unreachable("unhandled CudaArch");
1897       }();
1898       Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
1899     }
1900   }
1901   ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1902     return llvm::makeArrayRef(BuiltinInfo,
1903                          clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
1904   }
1905   bool
1906   initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1907                  StringRef CPU,
1908                  const std::vector<std::string> &FeaturesVec) const override {
1909     Features["satom"] = GPU >= CudaArch::SM_60;
1910     return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
1911   }
1912 
1913   bool hasFeature(StringRef Feature) const override {
1914     return llvm::StringSwitch<bool>(Feature)
1915         .Cases("ptx", "nvptx", true)
1916         .Case("satom", GPU >= CudaArch::SM_60)  // Atomics w/ scope.
1917         .Default(false);
1918   }
1919 
1920   ArrayRef<const char *> getGCCRegNames() const override;
1921   ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
1922     // No aliases.
1923     return None;
1924   }
1925   bool validateAsmConstraint(const char *&Name,
1926                              TargetInfo::ConstraintInfo &Info) const override {
1927     switch (*Name) {
1928     default:
1929       return false;
1930     case 'c':
1931     case 'h':
1932     case 'r':
1933     case 'l':
1934     case 'f':
1935     case 'd':
1936       Info.setAllowsRegister();
1937       return true;
1938     }
1939   }
1940   const char *getClobbers() const override {
1941     // FIXME: Is this really right?
1942     return "";
1943   }
1944   BuiltinVaListKind getBuiltinVaListKind() const override {
1945     // FIXME: implement
1946     return TargetInfo::CharPtrBuiltinVaList;
1947   }
1948   bool setCPU(const std::string &Name) override {
1949     GPU = StringToCudaArch(Name);
1950     return GPU != CudaArch::UNKNOWN;
1951   }
1952   void setSupportedOpenCLOpts() override {
1953     auto &Opts = getSupportedOpenCLOpts();
1954     Opts.support("cl_clang_storage_class_specifiers");
1955     Opts.support("cl_khr_gl_sharing");
1956     Opts.support("cl_khr_icd");
1957 
1958     Opts.support("cl_khr_fp64");
1959     Opts.support("cl_khr_byte_addressable_store");
1960     Opts.support("cl_khr_global_int32_base_atomics");
1961     Opts.support("cl_khr_global_int32_extended_atomics");
1962     Opts.support("cl_khr_local_int32_base_atomics");
1963     Opts.support("cl_khr_local_int32_extended_atomics");
1964   }
1965 
1966   CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
1967     // CUDA compilations support all of the host's calling conventions.
1968     //
1969     // TODO: We should warn if you apply a non-default CC to anything other than
1970     // a host function.
1971     if (HostTarget)
1972       return HostTarget->checkCallingConvention(CC);
1973     return CCCR_Warning;
1974   }
1975 };
1976 
1977 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1978 #define BUILTIN(ID, TYPE, ATTRS)                                               \
1979   { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1980 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER)                                    \
1981   { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1982 #define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE)                               \
1983   { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
1984 #include "clang/Basic/BuiltinsNVPTX.def"
1985 };
1986 
1987 const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1988 
1989 ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1990   return llvm::makeArrayRef(GCCRegNames);
1991 }
1992 
1993 static const unsigned AMDGPUAddrSpaceMap[] = {
1994   1,    // opencl_global
1995   3,    // opencl_local
1996   2,    // opencl_constant
1997   4,    // opencl_generic
1998   1,    // cuda_device
1999   2,    // cuda_constant
2000   3     // cuda_shared
2001 };
2002 
2003 // If you edit the description strings, make sure you update
2004 // getPointerWidthV().
2005 
2006 static const char *const DataLayoutStringR600 =
2007   "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2008   "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
2009 
2010 static const char *const DataLayoutStringSI =
2011   "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32"
2012   "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2013   "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
2014 
2015 class AMDGPUTargetInfo final : public TargetInfo {
2016   static const Builtin::Info BuiltinInfo[];
2017   static const char * const GCCRegNames[];
2018 
2019   /// \brief The GPU profiles supported by the AMDGPU target.
2020   enum GPUKind {
2021     GK_NONE,
2022     GK_R600,
2023     GK_R600_DOUBLE_OPS,
2024     GK_R700,
2025     GK_R700_DOUBLE_OPS,
2026     GK_EVERGREEN,
2027     GK_EVERGREEN_DOUBLE_OPS,
2028     GK_NORTHERN_ISLANDS,
2029     GK_CAYMAN,
2030     GK_GFX6,
2031     GK_GFX7,
2032     GK_GFX8
2033   } GPU;
2034 
2035   bool hasFP64:1;
2036   bool hasFMAF:1;
2037   bool hasLDEXPF:1;
2038   bool hasFullSpeedFP32Denorms:1;
2039 
2040   static bool isAMDGCN(const llvm::Triple &TT) {
2041     return TT.getArch() == llvm::Triple::amdgcn;
2042   }
2043 
2044 public:
2045   AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
2046     : TargetInfo(Triple) ,
2047       GPU(isAMDGCN(Triple) ? GK_GFX6 : GK_R600),
2048       hasFP64(false),
2049       hasFMAF(false),
2050       hasLDEXPF(false),
2051       hasFullSpeedFP32Denorms(false){
2052     if (getTriple().getArch() == llvm::Triple::amdgcn) {
2053       hasFP64 = true;
2054       hasFMAF = true;
2055       hasLDEXPF = true;
2056     }
2057 
2058     resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
2059                     DataLayoutStringSI : DataLayoutStringR600);
2060 
2061     AddrSpaceMap = &AMDGPUAddrSpaceMap;
2062     UseAddrSpaceMapMangling = true;
2063   }
2064 
2065   uint64_t getPointerWidthV(unsigned AddrSpace) const override {
2066     if (GPU <= GK_CAYMAN)
2067       return 32;
2068 
2069     switch(AddrSpace) {
2070       default:
2071         return 64;
2072       case 0:
2073       case 3:
2074       case 5:
2075         return 32;
2076     }
2077   }
2078 
2079   uint64_t getMaxPointerWidth() const override {
2080     return getTriple().getArch() == llvm::Triple::amdgcn ? 64 : 32;
2081   }
2082 
2083   const char * getClobbers() const override {
2084     return "";
2085   }
2086 
2087   ArrayRef<const char *> getGCCRegNames() const override;
2088 
2089   ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2090     return None;
2091   }
2092 
2093   bool validateAsmConstraint(const char *&Name,
2094                              TargetInfo::ConstraintInfo &Info) const override {
2095     switch (*Name) {
2096     default: break;
2097     case 'v': // vgpr
2098     case 's': // sgpr
2099       Info.setAllowsRegister();
2100       return true;
2101     }
2102     return false;
2103   }
2104 
2105   bool initFeatureMap(llvm::StringMap<bool> &Features,
2106                       DiagnosticsEngine &Diags, StringRef CPU,
2107                       const std::vector<std::string> &FeatureVec) const override;
2108 
2109   void adjustTargetOptions(const CodeGenOptions &CGOpts,
2110                            TargetOptions &TargetOpts) const override {
2111     bool hasFP32Denormals = false;
2112     bool hasFP64Denormals = false;
2113     for (auto &I : TargetOpts.FeaturesAsWritten) {
2114       if (I == "+fp32-denormals" || I == "-fp32-denormals")
2115         hasFP32Denormals = true;
2116       if (I == "+fp64-fp16-denormals" || I == "-fp64-fp16-denormals")
2117         hasFP64Denormals = true;
2118     }
2119     if (!hasFP32Denormals)
2120       TargetOpts.Features.push_back((Twine(hasFullSpeedFP32Denorms &&
2121           !CGOpts.FlushDenorm ? '+' : '-') + Twine("fp32-denormals")).str());
2122     // Always do not flush fp64 or fp16 denorms.
2123     if (!hasFP64Denormals && hasFP64)
2124       TargetOpts.Features.push_back("+fp64-fp16-denormals");
2125   }
2126 
2127   ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2128     return llvm::makeArrayRef(BuiltinInfo,
2129                         clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
2130   }
2131 
2132   void getTargetDefines(const LangOptions &Opts,
2133                         MacroBuilder &Builder) const override {
2134     if (getTriple().getArch() == llvm::Triple::amdgcn)
2135       Builder.defineMacro("__AMDGCN__");
2136     else
2137       Builder.defineMacro("__R600__");
2138 
2139     if (hasFMAF)
2140       Builder.defineMacro("__HAS_FMAF__");
2141     if (hasLDEXPF)
2142       Builder.defineMacro("__HAS_LDEXPF__");
2143     if (hasFP64)
2144       Builder.defineMacro("__HAS_FP64__");
2145   }
2146 
2147   BuiltinVaListKind getBuiltinVaListKind() const override {
2148     return TargetInfo::CharPtrBuiltinVaList;
2149   }
2150 
2151   static GPUKind parseR600Name(StringRef Name) {
2152     return llvm::StringSwitch<GPUKind>(Name)
2153       .Case("r600" ,    GK_R600)
2154       .Case("rv610",    GK_R600)
2155       .Case("rv620",    GK_R600)
2156       .Case("rv630",    GK_R600)
2157       .Case("rv635",    GK_R600)
2158       .Case("rs780",    GK_R600)
2159       .Case("rs880",    GK_R600)
2160       .Case("rv670",    GK_R600_DOUBLE_OPS)
2161       .Case("rv710",    GK_R700)
2162       .Case("rv730",    GK_R700)
2163       .Case("rv740",    GK_R700_DOUBLE_OPS)
2164       .Case("rv770",    GK_R700_DOUBLE_OPS)
2165       .Case("palm",     GK_EVERGREEN)
2166       .Case("cedar",    GK_EVERGREEN)
2167       .Case("sumo",     GK_EVERGREEN)
2168       .Case("sumo2",    GK_EVERGREEN)
2169       .Case("redwood",  GK_EVERGREEN)
2170       .Case("juniper",  GK_EVERGREEN)
2171       .Case("hemlock",  GK_EVERGREEN_DOUBLE_OPS)
2172       .Case("cypress",  GK_EVERGREEN_DOUBLE_OPS)
2173       .Case("barts",    GK_NORTHERN_ISLANDS)
2174       .Case("turks",    GK_NORTHERN_ISLANDS)
2175       .Case("caicos",   GK_NORTHERN_ISLANDS)
2176       .Case("cayman",   GK_CAYMAN)
2177       .Case("aruba",    GK_CAYMAN)
2178       .Default(GK_NONE);
2179   }
2180 
2181   static GPUKind parseAMDGCNName(StringRef Name) {
2182     return llvm::StringSwitch<GPUKind>(Name)
2183       .Case("tahiti",    GK_GFX6)
2184       .Case("pitcairn",  GK_GFX6)
2185       .Case("verde",     GK_GFX6)
2186       .Case("oland",     GK_GFX6)
2187       .Case("hainan",    GK_GFX6)
2188       .Case("bonaire",   GK_GFX7)
2189       .Case("kabini",    GK_GFX7)
2190       .Case("kaveri",    GK_GFX7)
2191       .Case("hawaii",    GK_GFX7)
2192       .Case("mullins",   GK_GFX7)
2193       .Case("gfx700",    GK_GFX7)
2194       .Case("gfx701",    GK_GFX7)
2195       .Case("gfx702",    GK_GFX7)
2196       .Case("tonga",     GK_GFX8)
2197       .Case("iceland",   GK_GFX8)
2198       .Case("carrizo",   GK_GFX8)
2199       .Case("fiji",      GK_GFX8)
2200       .Case("stoney",    GK_GFX8)
2201       .Case("polaris10", GK_GFX8)
2202       .Case("polaris11", GK_GFX8)
2203       .Case("gfx800",    GK_GFX8)
2204       .Case("gfx801",    GK_GFX8)
2205       .Case("gfx802",    GK_GFX8)
2206       .Case("gfx803",    GK_GFX8)
2207       .Case("gfx804",    GK_GFX8)
2208       .Case("gfx810",    GK_GFX8)
2209       .Default(GK_NONE);
2210   }
2211 
2212   bool setCPU(const std::string &Name) override {
2213     if (getTriple().getArch() == llvm::Triple::amdgcn)
2214       GPU = parseAMDGCNName(Name);
2215     else
2216       GPU = parseR600Name(Name);
2217 
2218     return GPU != GK_NONE;
2219   }
2220 
2221   void setSupportedOpenCLOpts() override {
2222     auto &Opts = getSupportedOpenCLOpts();
2223     Opts.support("cl_clang_storage_class_specifiers");
2224     Opts.support("cl_khr_icd");
2225 
2226     if (hasFP64)
2227       Opts.support("cl_khr_fp64");
2228     if (GPU >= GK_EVERGREEN) {
2229       Opts.support("cl_khr_byte_addressable_store");
2230       Opts.support("cl_khr_global_int32_base_atomics");
2231       Opts.support("cl_khr_global_int32_extended_atomics");
2232       Opts.support("cl_khr_local_int32_base_atomics");
2233       Opts.support("cl_khr_local_int32_extended_atomics");
2234     }
2235     if (GPU >= GK_GFX6) {
2236       Opts.support("cl_khr_fp16");
2237       Opts.support("cl_khr_int64_base_atomics");
2238       Opts.support("cl_khr_int64_extended_atomics");
2239       Opts.support("cl_khr_mipmap_image");
2240       Opts.support("cl_khr_subgroups");
2241       Opts.support("cl_khr_3d_image_writes");
2242       Opts.support("cl_amd_media_ops");
2243       Opts.support("cl_amd_media_ops2");
2244     }
2245   }
2246 
2247   LangAS::ID getOpenCLImageAddrSpace() const override {
2248     return LangAS::opencl_constant;
2249   }
2250 
2251   CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2252     switch (CC) {
2253       default:
2254         return CCCR_Warning;
2255       case CC_C:
2256       case CC_OpenCLKernel:
2257         return CCCR_OK;
2258     }
2259   }
2260 
2261   // In amdgcn target the null pointer in global, constant, and generic
2262   // address space has value 0 but in private and local address space has
2263   // value ~0.
2264   uint64_t getNullPointerValue(unsigned AS) const override {
2265     return AS != LangAS::opencl_local && AS != 0 ? 0 : ~0;
2266   }
2267 };
2268 
2269 const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
2270 #define BUILTIN(ID, TYPE, ATTRS)                \
2271   { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
2272 #define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE)                               \
2273   { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
2274 #include "clang/Basic/BuiltinsAMDGPU.def"
2275 };
2276 const char * const AMDGPUTargetInfo::GCCRegNames[] = {
2277   "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2278   "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2279   "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2280   "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2281   "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2282   "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2283   "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2284   "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2285   "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2286   "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2287   "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2288   "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2289   "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2290   "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2291   "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2292   "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2293   "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2294   "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2295   "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2296   "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2297   "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2298   "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2299   "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2300   "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2301   "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2302   "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2303   "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2304   "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2305   "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2306   "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2307   "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2308   "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2309   "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2310   "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2311   "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2312   "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2313   "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2314   "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2315   "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2316   "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2317   "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2318   "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2319   "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2320   "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2321   "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2322   "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2323   "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
2324   "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
2325   "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2326   "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
2327 };
2328 
2329 ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2330   return llvm::makeArrayRef(GCCRegNames);
2331 }
2332 
2333 bool AMDGPUTargetInfo::initFeatureMap(
2334   llvm::StringMap<bool> &Features,
2335   DiagnosticsEngine &Diags, StringRef CPU,
2336   const std::vector<std::string> &FeatureVec) const {
2337 
2338   // XXX - What does the member GPU mean if device name string passed here?
2339   if (getTriple().getArch() == llvm::Triple::amdgcn) {
2340     if (CPU.empty())
2341       CPU = "tahiti";
2342 
2343     switch (parseAMDGCNName(CPU)) {
2344     case GK_GFX6:
2345     case GK_GFX7:
2346       break;
2347 
2348     case GK_GFX8:
2349       Features["s-memrealtime"] = true;
2350       Features["16-bit-insts"] = true;
2351       break;
2352 
2353     case GK_NONE:
2354       return false;
2355     default:
2356       llvm_unreachable("unhandled subtarget");
2357     }
2358   } else {
2359     if (CPU.empty())
2360       CPU = "r600";
2361 
2362     switch (parseR600Name(CPU)) {
2363     case GK_R600:
2364     case GK_R700:
2365     case GK_EVERGREEN:
2366     case GK_NORTHERN_ISLANDS:
2367       break;
2368     case GK_R600_DOUBLE_OPS:
2369     case GK_R700_DOUBLE_OPS:
2370     case GK_EVERGREEN_DOUBLE_OPS:
2371     case GK_CAYMAN:
2372       Features["fp64"] = true;
2373       break;
2374     case GK_NONE:
2375       return false;
2376     default:
2377       llvm_unreachable("unhandled subtarget");
2378     }
2379   }
2380 
2381   return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2382 }
2383 
2384 const Builtin::Info BuiltinInfoX86[] = {
2385 #define BUILTIN(ID, TYPE, ATTRS)                                               \
2386   { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
2387 #define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE)                               \
2388   { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
2389 #define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE)         \
2390   { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
2391 #include "clang/Basic/BuiltinsX86.def"
2392 
2393 #define BUILTIN(ID, TYPE, ATTRS)                                               \
2394   { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
2395 #define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE)         \
2396   { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
2397 #define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE)         \
2398   { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
2399 #include "clang/Basic/BuiltinsX86_64.def"
2400 };
2401 
2402 
2403 static const char* const GCCRegNames[] = {
2404   "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2405   "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
2406   "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
2407   "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2408   "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2409   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
2410   "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
2411   "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2412   "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
2413   "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2414   "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2415   "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2416   "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2417   "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2418   "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2419   "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2420   "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
2421   "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7",
2422 };
2423 
2424 const TargetInfo::AddlRegName AddlRegNames[] = {
2425   { { "al", "ah", "eax", "rax" }, 0 },
2426   { { "bl", "bh", "ebx", "rbx" }, 3 },
2427   { { "cl", "ch", "ecx", "rcx" }, 2 },
2428   { { "dl", "dh", "edx", "rdx" }, 1 },
2429   { { "esi", "rsi" }, 4 },
2430   { { "edi", "rdi" }, 5 },
2431   { { "esp", "rsp" }, 7 },
2432   { { "ebp", "rbp" }, 6 },
2433   { { "r8d", "r8w", "r8b" }, 38 },
2434   { { "r9d", "r9w", "r9b" }, 39 },
2435   { { "r10d", "r10w", "r10b" }, 40 },
2436   { { "r11d", "r11w", "r11b" }, 41 },
2437   { { "r12d", "r12w", "r12b" }, 42 },
2438   { { "r13d", "r13w", "r13b" }, 43 },
2439   { { "r14d", "r14w", "r14b" }, 44 },
2440   { { "r15d", "r15w", "r15b" }, 45 },
2441 };
2442 
2443 // X86 target abstract base class; x86-32 and x86-64 are very close, so
2444 // most of the implementation can be shared.
2445 class X86TargetInfo : public TargetInfo {
2446   enum X86SSEEnum {
2447     NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
2448   } SSELevel = NoSSE;
2449   enum MMX3DNowEnum {
2450     NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
2451   } MMX3DNowLevel = NoMMX3DNow;
2452   enum XOPEnum {
2453     NoXOP,
2454     SSE4A,
2455     FMA4,
2456     XOP
2457   } XOPLevel = NoXOP;
2458 
2459   bool HasAES = false;
2460   bool HasPCLMUL = false;
2461   bool HasLZCNT = false;
2462   bool HasRDRND = false;
2463   bool HasFSGSBASE = false;
2464   bool HasBMI = false;
2465   bool HasBMI2 = false;
2466   bool HasPOPCNT = false;
2467   bool HasRTM = false;
2468   bool HasPRFCHW = false;
2469   bool HasRDSEED = false;
2470   bool HasADX = false;
2471   bool HasTBM = false;
2472   bool HasFMA = false;
2473   bool HasF16C = false;
2474   bool HasAVX512CD = false;
2475   bool HasAVX512ER = false;
2476   bool HasAVX512PF = false;
2477   bool HasAVX512DQ = false;
2478   bool HasAVX512BW = false;
2479   bool HasAVX512VL = false;
2480   bool HasAVX512VBMI = false;
2481   bool HasAVX512IFMA = false;
2482   bool HasSHA = false;
2483   bool HasMPX = false;
2484   bool HasSGX = false;
2485   bool HasCX16 = false;
2486   bool HasFXSR = false;
2487   bool HasXSAVE = false;
2488   bool HasXSAVEOPT = false;
2489   bool HasXSAVEC = false;
2490   bool HasXSAVES = false;
2491   bool HasMWAITX = false;
2492   bool HasCLZERO = false;
2493   bool HasPKU = false;
2494   bool HasCLFLUSHOPT = false;
2495   bool HasCLWB = false;
2496   bool HasMOVBE = false;
2497   bool HasPREFETCHWT1 = false;
2498 
2499   /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2500   ///
2501   /// Each enumeration represents a particular CPU supported by Clang. These
2502   /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2503   enum CPUKind {
2504     CK_Generic,
2505 
2506     /// \name i386
2507     /// i386-generation processors.
2508     //@{
2509     CK_i386,
2510     //@}
2511 
2512     /// \name i486
2513     /// i486-generation processors.
2514     //@{
2515     CK_i486,
2516     CK_WinChipC6,
2517     CK_WinChip2,
2518     CK_C3,
2519     //@}
2520 
2521     /// \name i586
2522     /// i586-generation processors, P5 microarchitecture based.
2523     //@{
2524     CK_i586,
2525     CK_Pentium,
2526     CK_PentiumMMX,
2527     //@}
2528 
2529     /// \name i686
2530     /// i686-generation processors, P6 / Pentium M microarchitecture based.
2531     //@{
2532     CK_i686,
2533     CK_PentiumPro,
2534     CK_Pentium2,
2535     CK_Pentium3,
2536     CK_Pentium3M,
2537     CK_PentiumM,
2538     CK_C3_2,
2539 
2540     /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2541     /// Clang however has some logic to suport this.
2542     // FIXME: Warn, deprecate, and potentially remove this.
2543     CK_Yonah,
2544     //@}
2545 
2546     /// \name Netburst
2547     /// Netburst microarchitecture based processors.
2548     //@{
2549     CK_Pentium4,
2550     CK_Pentium4M,
2551     CK_Prescott,
2552     CK_Nocona,
2553     //@}
2554 
2555     /// \name Core
2556     /// Core microarchitecture based processors.
2557     //@{
2558     CK_Core2,
2559 
2560     /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2561     /// codename which GCC no longer accepts as an option to -march, but Clang
2562     /// has some logic for recognizing it.
2563     // FIXME: Warn, deprecate, and potentially remove this.
2564     CK_Penryn,
2565     //@}
2566 
2567     /// \name Atom
2568     /// Atom processors
2569     //@{
2570     CK_Bonnell,
2571     CK_Silvermont,
2572     //@}
2573 
2574     /// \name Nehalem
2575     /// Nehalem microarchitecture based processors.
2576     CK_Nehalem,
2577 
2578     /// \name Westmere
2579     /// Westmere microarchitecture based processors.
2580     CK_Westmere,
2581 
2582     /// \name Sandy Bridge
2583     /// Sandy Bridge microarchitecture based processors.
2584     CK_SandyBridge,
2585 
2586     /// \name Ivy Bridge
2587     /// Ivy Bridge microarchitecture based processors.
2588     CK_IvyBridge,
2589 
2590     /// \name Haswell
2591     /// Haswell microarchitecture based processors.
2592     CK_Haswell,
2593 
2594     /// \name Broadwell
2595     /// Broadwell microarchitecture based processors.
2596     CK_Broadwell,
2597 
2598     /// \name Skylake Client
2599     /// Skylake client microarchitecture based processors.
2600     CK_SkylakeClient,
2601 
2602     /// \name Skylake Server
2603     /// Skylake server microarchitecture based processors.
2604     CK_SkylakeServer,
2605 
2606     /// \name Cannonlake Client
2607     /// Cannonlake client microarchitecture based processors.
2608     CK_Cannonlake,
2609 
2610     /// \name Knights Landing
2611     /// Knights Landing processor.
2612     CK_KNL,
2613 
2614     /// \name Lakemont
2615     /// Lakemont microarchitecture based processors.
2616     CK_Lakemont,
2617 
2618     /// \name K6
2619     /// K6 architecture processors.
2620     //@{
2621     CK_K6,
2622     CK_K6_2,
2623     CK_K6_3,
2624     //@}
2625 
2626     /// \name K7
2627     /// K7 architecture processors.
2628     //@{
2629     CK_Athlon,
2630     CK_AthlonThunderbird,
2631     CK_Athlon4,
2632     CK_AthlonXP,
2633     CK_AthlonMP,
2634     //@}
2635 
2636     /// \name K8
2637     /// K8 architecture processors.
2638     //@{
2639     CK_Athlon64,
2640     CK_Athlon64SSE3,
2641     CK_AthlonFX,
2642     CK_K8,
2643     CK_K8SSE3,
2644     CK_Opteron,
2645     CK_OpteronSSE3,
2646     CK_AMDFAM10,
2647     //@}
2648 
2649     /// \name Bobcat
2650     /// Bobcat architecture processors.
2651     //@{
2652     CK_BTVER1,
2653     CK_BTVER2,
2654     //@}
2655 
2656     /// \name Bulldozer
2657     /// Bulldozer architecture processors.
2658     //@{
2659     CK_BDVER1,
2660     CK_BDVER2,
2661     CK_BDVER3,
2662     CK_BDVER4,
2663     //@}
2664 
2665     /// \name zen
2666     /// Zen architecture processors.
2667     //@{
2668     CK_ZNVER1,
2669     //@}
2670 
2671     /// This specification is deprecated and will be removed in the future.
2672     /// Users should prefer \see CK_K8.
2673     // FIXME: Warn on this when the CPU is set to it.
2674     //@{
2675     CK_x86_64,
2676     //@}
2677 
2678     /// \name Geode
2679     /// Geode processors.
2680     //@{
2681     CK_Geode
2682     //@}
2683   } CPU = CK_Generic;
2684 
2685   CPUKind getCPUKind(StringRef CPU) const {
2686     return llvm::StringSwitch<CPUKind>(CPU)
2687         .Case("i386", CK_i386)
2688         .Case("i486", CK_i486)
2689         .Case("winchip-c6", CK_WinChipC6)
2690         .Case("winchip2", CK_WinChip2)
2691         .Case("c3", CK_C3)
2692         .Case("i586", CK_i586)
2693         .Case("pentium", CK_Pentium)
2694         .Case("pentium-mmx", CK_PentiumMMX)
2695         .Case("i686", CK_i686)
2696         .Case("pentiumpro", CK_PentiumPro)
2697         .Case("pentium2", CK_Pentium2)
2698         .Case("pentium3", CK_Pentium3)
2699         .Case("pentium3m", CK_Pentium3M)
2700         .Case("pentium-m", CK_PentiumM)
2701         .Case("c3-2", CK_C3_2)
2702         .Case("yonah", CK_Yonah)
2703         .Case("pentium4", CK_Pentium4)
2704         .Case("pentium4m", CK_Pentium4M)
2705         .Case("prescott", CK_Prescott)
2706         .Case("nocona", CK_Nocona)
2707         .Case("core2", CK_Core2)
2708         .Case("penryn", CK_Penryn)
2709         .Case("bonnell", CK_Bonnell)
2710         .Case("atom", CK_Bonnell) // Legacy name.
2711         .Case("silvermont", CK_Silvermont)
2712         .Case("slm", CK_Silvermont) // Legacy name.
2713         .Case("nehalem", CK_Nehalem)
2714         .Case("corei7", CK_Nehalem) // Legacy name.
2715         .Case("westmere", CK_Westmere)
2716         .Case("sandybridge", CK_SandyBridge)
2717         .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2718         .Case("ivybridge", CK_IvyBridge)
2719         .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2720         .Case("haswell", CK_Haswell)
2721         .Case("core-avx2", CK_Haswell) // Legacy name.
2722         .Case("broadwell", CK_Broadwell)
2723         .Case("skylake", CK_SkylakeClient)
2724         .Case("skylake-avx512", CK_SkylakeServer)
2725         .Case("skx", CK_SkylakeServer) // Legacy name.
2726         .Case("cannonlake", CK_Cannonlake)
2727         .Case("knl", CK_KNL)
2728         .Case("lakemont", CK_Lakemont)
2729         .Case("k6", CK_K6)
2730         .Case("k6-2", CK_K6_2)
2731         .Case("k6-3", CK_K6_3)
2732         .Case("athlon", CK_Athlon)
2733         .Case("athlon-tbird", CK_AthlonThunderbird)
2734         .Case("athlon-4", CK_Athlon4)
2735         .Case("athlon-xp", CK_AthlonXP)
2736         .Case("athlon-mp", CK_AthlonMP)
2737         .Case("athlon64", CK_Athlon64)
2738         .Case("athlon64-sse3", CK_Athlon64SSE3)
2739         .Case("athlon-fx", CK_AthlonFX)
2740         .Case("k8", CK_K8)
2741         .Case("k8-sse3", CK_K8SSE3)
2742         .Case("opteron", CK_Opteron)
2743         .Case("opteron-sse3", CK_OpteronSSE3)
2744         .Case("barcelona", CK_AMDFAM10)
2745         .Case("amdfam10", CK_AMDFAM10)
2746         .Case("btver1", CK_BTVER1)
2747         .Case("btver2", CK_BTVER2)
2748         .Case("bdver1", CK_BDVER1)
2749         .Case("bdver2", CK_BDVER2)
2750         .Case("bdver3", CK_BDVER3)
2751         .Case("bdver4", CK_BDVER4)
2752         .Case("znver1", CK_ZNVER1)
2753         .Case("x86-64", CK_x86_64)
2754         .Case("geode", CK_Geode)
2755         .Default(CK_Generic);
2756   }
2757 
2758   enum FPMathKind {
2759     FP_Default,
2760     FP_SSE,
2761     FP_387
2762   } FPMath = FP_Default;
2763 
2764 public:
2765   X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2766       : TargetInfo(Triple) {
2767     LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
2768   }
2769   unsigned getFloatEvalMethod() const override {
2770     // X87 evaluates with 80 bits "long double" precision.
2771     return SSELevel == NoSSE ? 2 : 0;
2772   }
2773   ArrayRef<const char *> getGCCRegNames() const override {
2774     return llvm::makeArrayRef(GCCRegNames);
2775   }
2776   ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2777     return None;
2778   }
2779   ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2780     return llvm::makeArrayRef(AddlRegNames);
2781   }
2782   bool validateCpuSupports(StringRef Name) const override;
2783   bool validateAsmConstraint(const char *&Name,
2784                              TargetInfo::ConstraintInfo &info) const override;
2785 
2786   bool validateGlobalRegisterVariable(StringRef RegName,
2787                                       unsigned RegSize,
2788                                       bool &HasSizeMismatch) const override {
2789     // esp and ebp are the only 32-bit registers the x86 backend can currently
2790     // handle.
2791     if (RegName.equals("esp") || RegName.equals("ebp")) {
2792       // Check that the register size is 32-bit.
2793       HasSizeMismatch = RegSize != 32;
2794       return true;
2795     }
2796 
2797     return false;
2798   }
2799 
2800   bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2801 
2802   bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2803 
2804   virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2805 
2806   std::string convertConstraint(const char *&Constraint) const override;
2807   const char *getClobbers() const override {
2808     return "~{dirflag},~{fpsr},~{flags}";
2809   }
2810 
2811   StringRef getConstraintRegister(const StringRef &Constraint,
2812                                   const StringRef &Expression) const override {
2813     StringRef::iterator I, E;
2814     for (I = Constraint.begin(), E = Constraint.end(); I != E; ++I) {
2815       if (isalpha(*I))
2816         break;
2817     }
2818     if (I == E)
2819       return "";
2820     switch (*I) {
2821     // For the register constraints, return the matching register name
2822     case 'a':
2823       return "ax";
2824     case 'b':
2825       return "bx";
2826     case 'c':
2827       return "cx";
2828     case 'd':
2829       return "dx";
2830     case 'S':
2831       return "si";
2832     case 'D':
2833       return "di";
2834     // In case the constraint is 'r' we need to return Expression
2835     case 'r':
2836       return Expression;
2837     default:
2838       // Default value if there is no constraint for the register
2839       return "";
2840     }
2841     return "";
2842   }
2843 
2844   void getTargetDefines(const LangOptions &Opts,
2845                         MacroBuilder &Builder) const override;
2846   static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2847                           bool Enabled);
2848   static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2849                           bool Enabled);
2850   static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2851                           bool Enabled);
2852   void setFeatureEnabled(llvm::StringMap<bool> &Features,
2853                          StringRef Name, bool Enabled) const override {
2854     setFeatureEnabledImpl(Features, Name, Enabled);
2855   }
2856   // This exists purely to cut down on the number of virtual calls in
2857   // initFeatureMap which calls this repeatedly.
2858   static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2859                                     StringRef Name, bool Enabled);
2860   bool
2861   initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2862                  StringRef CPU,
2863                  const std::vector<std::string> &FeaturesVec) const override;
2864   bool hasFeature(StringRef Feature) const override;
2865   bool handleTargetFeatures(std::vector<std::string> &Features,
2866                             DiagnosticsEngine &Diags) override;
2867   StringRef getABI() const override {
2868     if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2869       return "avx512";
2870     if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
2871       return "avx";
2872     if (getTriple().getArch() == llvm::Triple::x86 &&
2873              MMX3DNowLevel == NoMMX3DNow)
2874       return "no-mmx";
2875     return "";
2876   }
2877   bool setCPU(const std::string &Name) override {
2878     CPU = getCPUKind(Name);
2879 
2880     // Perform any per-CPU checks necessary to determine if this CPU is
2881     // acceptable.
2882     // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2883     // invalid without explaining *why*.
2884     switch (CPU) {
2885     case CK_Generic:
2886       // No processor selected!
2887       return false;
2888 
2889     case CK_i386:
2890     case CK_i486:
2891     case CK_WinChipC6:
2892     case CK_WinChip2:
2893     case CK_C3:
2894     case CK_i586:
2895     case CK_Pentium:
2896     case CK_PentiumMMX:
2897     case CK_i686:
2898     case CK_PentiumPro:
2899     case CK_Pentium2:
2900     case CK_Pentium3:
2901     case CK_Pentium3M:
2902     case CK_PentiumM:
2903     case CK_Yonah:
2904     case CK_C3_2:
2905     case CK_Pentium4:
2906     case CK_Pentium4M:
2907     case CK_Lakemont:
2908     case CK_Prescott:
2909     case CK_K6:
2910     case CK_K6_2:
2911     case CK_K6_3:
2912     case CK_Athlon:
2913     case CK_AthlonThunderbird:
2914     case CK_Athlon4:
2915     case CK_AthlonXP:
2916     case CK_AthlonMP:
2917     case CK_Geode:
2918       // Only accept certain architectures when compiling in 32-bit mode.
2919       if (getTriple().getArch() != llvm::Triple::x86)
2920         return false;
2921 
2922       // Fallthrough
2923     case CK_Nocona:
2924     case CK_Core2:
2925     case CK_Penryn:
2926     case CK_Bonnell:
2927     case CK_Silvermont:
2928     case CK_Nehalem:
2929     case CK_Westmere:
2930     case CK_SandyBridge:
2931     case CK_IvyBridge:
2932     case CK_Haswell:
2933     case CK_Broadwell:
2934     case CK_SkylakeClient:
2935     case CK_SkylakeServer:
2936     case CK_Cannonlake:
2937     case CK_KNL:
2938     case CK_Athlon64:
2939     case CK_Athlon64SSE3:
2940     case CK_AthlonFX:
2941     case CK_K8:
2942     case CK_K8SSE3:
2943     case CK_Opteron:
2944     case CK_OpteronSSE3:
2945     case CK_AMDFAM10:
2946     case CK_BTVER1:
2947     case CK_BTVER2:
2948     case CK_BDVER1:
2949     case CK_BDVER2:
2950     case CK_BDVER3:
2951     case CK_BDVER4:
2952     case CK_ZNVER1:
2953     case CK_x86_64:
2954       return true;
2955     }
2956     llvm_unreachable("Unhandled CPU kind");
2957   }
2958 
2959   bool setFPMath(StringRef Name) override;
2960 
2961   CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2962     // Most of the non-ARM calling conventions are i386 conventions.
2963     switch (CC) {
2964     case CC_X86ThisCall:
2965     case CC_X86FastCall:
2966     case CC_X86StdCall:
2967     case CC_X86VectorCall:
2968     case CC_X86RegCall:
2969     case CC_C:
2970     case CC_Swift:
2971     case CC_X86Pascal:
2972     case CC_IntelOclBicc:
2973       return CCCR_OK;
2974     default:
2975       return CCCR_Warning;
2976     }
2977   }
2978 
2979   CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
2980     return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
2981   }
2982 
2983   bool hasSjLjLowering() const override {
2984     return true;
2985   }
2986 
2987   void setSupportedOpenCLOpts() override {
2988     getSupportedOpenCLOpts().supportAll();
2989   }
2990 };
2991 
2992 bool X86TargetInfo::setFPMath(StringRef Name) {
2993   if (Name == "387") {
2994     FPMath = FP_387;
2995     return true;
2996   }
2997   if (Name == "sse") {
2998     FPMath = FP_SSE;
2999     return true;
3000   }
3001   return false;
3002 }
3003 
3004 bool X86TargetInfo::initFeatureMap(
3005     llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
3006     const std::vector<std::string> &FeaturesVec) const {
3007   // FIXME: This *really* should not be here.
3008   // X86_64 always has SSE2.
3009   if (getTriple().getArch() == llvm::Triple::x86_64)
3010     setFeatureEnabledImpl(Features, "sse2", true);
3011 
3012   const CPUKind Kind = getCPUKind(CPU);
3013 
3014   // Enable X87 for all X86 processors but Lakemont.
3015   if (Kind != CK_Lakemont)
3016     setFeatureEnabledImpl(Features, "x87", true);
3017 
3018   switch (Kind) {
3019   case CK_Generic:
3020   case CK_i386:
3021   case CK_i486:
3022   case CK_i586:
3023   case CK_Pentium:
3024   case CK_i686:
3025   case CK_PentiumPro:
3026   case CK_Lakemont:
3027     break;
3028   case CK_PentiumMMX:
3029   case CK_Pentium2:
3030   case CK_K6:
3031   case CK_WinChipC6:
3032     setFeatureEnabledImpl(Features, "mmx", true);
3033     break;
3034   case CK_Pentium3:
3035   case CK_Pentium3M:
3036   case CK_C3_2:
3037     setFeatureEnabledImpl(Features, "sse", true);
3038     setFeatureEnabledImpl(Features, "fxsr", true);
3039     break;
3040   case CK_PentiumM:
3041   case CK_Pentium4:
3042   case CK_Pentium4M:
3043   case CK_x86_64:
3044     setFeatureEnabledImpl(Features, "sse2", true);
3045     setFeatureEnabledImpl(Features, "fxsr", true);
3046     break;
3047   case CK_Yonah:
3048   case CK_Prescott:
3049   case CK_Nocona:
3050     setFeatureEnabledImpl(Features, "sse3", true);
3051     setFeatureEnabledImpl(Features, "fxsr", true);
3052     setFeatureEnabledImpl(Features, "cx16", true);
3053     break;
3054   case CK_Core2:
3055   case CK_Bonnell:
3056     setFeatureEnabledImpl(Features, "ssse3", true);
3057     setFeatureEnabledImpl(Features, "fxsr", true);
3058     setFeatureEnabledImpl(Features, "cx16", true);
3059     break;
3060   case CK_Penryn:
3061     setFeatureEnabledImpl(Features, "sse4.1", true);
3062     setFeatureEnabledImpl(Features, "fxsr", true);
3063     setFeatureEnabledImpl(Features, "cx16", true);
3064     break;
3065   case CK_Cannonlake:
3066     setFeatureEnabledImpl(Features, "avx512ifma", true);
3067     setFeatureEnabledImpl(Features, "avx512vbmi", true);
3068     setFeatureEnabledImpl(Features, "sha", true);
3069     LLVM_FALLTHROUGH;
3070   case CK_SkylakeServer:
3071     setFeatureEnabledImpl(Features, "avx512f", true);
3072     setFeatureEnabledImpl(Features, "avx512cd", true);
3073     setFeatureEnabledImpl(Features, "avx512dq", true);
3074     setFeatureEnabledImpl(Features, "avx512bw", true);
3075     setFeatureEnabledImpl(Features, "avx512vl", true);
3076     setFeatureEnabledImpl(Features, "pku", true);
3077     setFeatureEnabledImpl(Features, "clwb", true);
3078     LLVM_FALLTHROUGH;
3079   case CK_SkylakeClient:
3080     setFeatureEnabledImpl(Features, "xsavec", true);
3081     setFeatureEnabledImpl(Features, "xsaves", true);
3082     setFeatureEnabledImpl(Features, "mpx", true);
3083     setFeatureEnabledImpl(Features, "sgx", true);
3084     setFeatureEnabledImpl(Features, "clflushopt", true);
3085     LLVM_FALLTHROUGH;
3086   case CK_Broadwell:
3087     setFeatureEnabledImpl(Features, "rdseed", true);
3088     setFeatureEnabledImpl(Features, "adx", true);
3089     LLVM_FALLTHROUGH;
3090   case CK_Haswell:
3091     setFeatureEnabledImpl(Features, "avx2", true);
3092     setFeatureEnabledImpl(Features, "lzcnt", true);
3093     setFeatureEnabledImpl(Features, "bmi", true);
3094     setFeatureEnabledImpl(Features, "bmi2", true);
3095     setFeatureEnabledImpl(Features, "rtm", true);
3096     setFeatureEnabledImpl(Features, "fma", true);
3097     setFeatureEnabledImpl(Features, "movbe", true);
3098     LLVM_FALLTHROUGH;
3099   case CK_IvyBridge:
3100     setFeatureEnabledImpl(Features, "rdrnd", true);
3101     setFeatureEnabledImpl(Features, "f16c", true);
3102     setFeatureEnabledImpl(Features, "fsgsbase", true);
3103     LLVM_FALLTHROUGH;
3104   case CK_SandyBridge:
3105     setFeatureEnabledImpl(Features, "avx", true);
3106     setFeatureEnabledImpl(Features, "xsave", true);
3107     setFeatureEnabledImpl(Features, "xsaveopt", true);
3108     LLVM_FALLTHROUGH;
3109   case CK_Westmere:
3110   case CK_Silvermont:
3111     setFeatureEnabledImpl(Features, "aes", true);
3112     setFeatureEnabledImpl(Features, "pclmul", true);
3113     LLVM_FALLTHROUGH;
3114   case CK_Nehalem:
3115     setFeatureEnabledImpl(Features, "sse4.2", true);
3116     setFeatureEnabledImpl(Features, "fxsr", true);
3117     setFeatureEnabledImpl(Features, "cx16", true);
3118     break;
3119   case CK_KNL:
3120     setFeatureEnabledImpl(Features, "avx512f", true);
3121     setFeatureEnabledImpl(Features, "avx512cd", true);
3122     setFeatureEnabledImpl(Features, "avx512er", true);
3123     setFeatureEnabledImpl(Features, "avx512pf", true);
3124     setFeatureEnabledImpl(Features, "prefetchwt1", true);
3125     setFeatureEnabledImpl(Features, "fxsr", true);
3126     setFeatureEnabledImpl(Features, "rdseed", true);
3127     setFeatureEnabledImpl(Features, "adx", true);
3128     setFeatureEnabledImpl(Features, "lzcnt", true);
3129     setFeatureEnabledImpl(Features, "bmi", true);
3130     setFeatureEnabledImpl(Features, "bmi2", true);
3131     setFeatureEnabledImpl(Features, "rtm", true);
3132     setFeatureEnabledImpl(Features, "fma", true);
3133     setFeatureEnabledImpl(Features, "rdrnd", true);
3134     setFeatureEnabledImpl(Features, "f16c", true);
3135     setFeatureEnabledImpl(Features, "fsgsbase", true);
3136     setFeatureEnabledImpl(Features, "aes", true);
3137     setFeatureEnabledImpl(Features, "pclmul", true);
3138     setFeatureEnabledImpl(Features, "cx16", true);
3139     setFeatureEnabledImpl(Features, "xsaveopt", true);
3140     setFeatureEnabledImpl(Features, "xsave", true);
3141     setFeatureEnabledImpl(Features, "movbe", true);
3142     break;
3143   case CK_K6_2:
3144   case CK_K6_3:
3145   case CK_WinChip2:
3146   case CK_C3:
3147     setFeatureEnabledImpl(Features, "3dnow", true);
3148     break;
3149   case CK_Athlon:
3150   case CK_AthlonThunderbird:
3151   case CK_Geode:
3152     setFeatureEnabledImpl(Features, "3dnowa", true);
3153     break;
3154   case CK_Athlon4:
3155   case CK_AthlonXP:
3156   case CK_AthlonMP:
3157     setFeatureEnabledImpl(Features, "sse", true);
3158     setFeatureEnabledImpl(Features, "3dnowa", true);
3159     setFeatureEnabledImpl(Features, "fxsr", true);
3160     break;
3161   case CK_K8:
3162   case CK_Opteron:
3163   case CK_Athlon64:
3164   case CK_AthlonFX:
3165     setFeatureEnabledImpl(Features, "sse2", true);
3166     setFeatureEnabledImpl(Features, "3dnowa", true);
3167     setFeatureEnabledImpl(Features, "fxsr", true);
3168     break;
3169   case CK_AMDFAM10:
3170     setFeatureEnabledImpl(Features, "sse4a", true);
3171     setFeatureEnabledImpl(Features, "lzcnt", true);
3172     setFeatureEnabledImpl(Features, "popcnt", true);
3173     LLVM_FALLTHROUGH;
3174   case CK_K8SSE3:
3175   case CK_OpteronSSE3:
3176   case CK_Athlon64SSE3:
3177     setFeatureEnabledImpl(Features, "sse3", true);
3178     setFeatureEnabledImpl(Features, "3dnowa", true);
3179     setFeatureEnabledImpl(Features, "fxsr", true);
3180     break;
3181   case CK_BTVER2:
3182     setFeatureEnabledImpl(Features, "avx", true);
3183     setFeatureEnabledImpl(Features, "aes", true);
3184     setFeatureEnabledImpl(Features, "pclmul", true);
3185     setFeatureEnabledImpl(Features, "bmi", true);
3186     setFeatureEnabledImpl(Features, "f16c", true);
3187     setFeatureEnabledImpl(Features, "xsaveopt", true);
3188     LLVM_FALLTHROUGH;
3189   case CK_BTVER1:
3190     setFeatureEnabledImpl(Features, "ssse3", true);
3191     setFeatureEnabledImpl(Features, "sse4a", true);
3192     setFeatureEnabledImpl(Features, "lzcnt", true);
3193     setFeatureEnabledImpl(Features, "popcnt", true);
3194     setFeatureEnabledImpl(Features, "prfchw", true);
3195     setFeatureEnabledImpl(Features, "cx16", true);
3196     setFeatureEnabledImpl(Features, "fxsr", true);
3197     break;
3198   case CK_ZNVER1:
3199     setFeatureEnabledImpl(Features, "adx", true);
3200     setFeatureEnabledImpl(Features, "aes", true);
3201     setFeatureEnabledImpl(Features, "avx2", true);
3202     setFeatureEnabledImpl(Features, "bmi", true);
3203     setFeatureEnabledImpl(Features, "bmi2", true);
3204     setFeatureEnabledImpl(Features, "clflushopt", true);
3205     setFeatureEnabledImpl(Features, "clzero", true);
3206     setFeatureEnabledImpl(Features, "cx16", true);
3207     setFeatureEnabledImpl(Features, "f16c", true);
3208     setFeatureEnabledImpl(Features, "fma", true);
3209     setFeatureEnabledImpl(Features, "fsgsbase", true);
3210     setFeatureEnabledImpl(Features, "fxsr", true);
3211     setFeatureEnabledImpl(Features, "lzcnt", true);
3212     setFeatureEnabledImpl(Features, "mwaitx", true);
3213     setFeatureEnabledImpl(Features, "movbe", true);
3214     setFeatureEnabledImpl(Features, "pclmul", true);
3215     setFeatureEnabledImpl(Features, "popcnt", true);
3216     setFeatureEnabledImpl(Features, "prfchw", true);
3217     setFeatureEnabledImpl(Features, "rdrnd", true);
3218     setFeatureEnabledImpl(Features, "rdseed", true);
3219     setFeatureEnabledImpl(Features, "sha", true);
3220     setFeatureEnabledImpl(Features, "sse4a", true);
3221     setFeatureEnabledImpl(Features, "xsave", true);
3222     setFeatureEnabledImpl(Features, "xsavec", true);
3223     setFeatureEnabledImpl(Features, "xsaveopt", true);
3224     setFeatureEnabledImpl(Features, "xsaves", true);
3225     break;
3226   case CK_BDVER4:
3227     setFeatureEnabledImpl(Features, "avx2", true);
3228     setFeatureEnabledImpl(Features, "bmi2", true);
3229     setFeatureEnabledImpl(Features, "mwaitx", true);
3230     LLVM_FALLTHROUGH;
3231   case CK_BDVER3:
3232     setFeatureEnabledImpl(Features, "fsgsbase", true);
3233     setFeatureEnabledImpl(Features, "xsaveopt", true);
3234     LLVM_FALLTHROUGH;
3235   case CK_BDVER2:
3236     setFeatureEnabledImpl(Features, "bmi", true);
3237     setFeatureEnabledImpl(Features, "fma", true);
3238     setFeatureEnabledImpl(Features, "f16c", true);
3239     setFeatureEnabledImpl(Features, "tbm", true);
3240     LLVM_FALLTHROUGH;
3241   case CK_BDVER1:
3242     // xop implies avx, sse4a and fma4.
3243     setFeatureEnabledImpl(Features, "xop", true);
3244     setFeatureEnabledImpl(Features, "lzcnt", true);
3245     setFeatureEnabledImpl(Features, "aes", true);
3246     setFeatureEnabledImpl(Features, "pclmul", true);
3247     setFeatureEnabledImpl(Features, "prfchw", true);
3248     setFeatureEnabledImpl(Features, "cx16", true);
3249     setFeatureEnabledImpl(Features, "fxsr", true);
3250     setFeatureEnabledImpl(Features, "xsave", true);
3251     break;
3252   }
3253   if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3254     return false;
3255 
3256   // Can't do this earlier because we need to be able to explicitly enable
3257   // or disable these features and the things that they depend upon.
3258 
3259   // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3260   auto I = Features.find("sse4.2");
3261   if (I != Features.end() && I->getValue() &&
3262       std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3263           FeaturesVec.end())
3264     Features["popcnt"] = true;
3265 
3266   // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3267   I = Features.find("3dnow");
3268   if (I != Features.end() && I->getValue() &&
3269       std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3270           FeaturesVec.end())
3271     Features["prfchw"] = true;
3272 
3273   // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3274   // then enable MMX.
3275   I = Features.find("sse");
3276   if (I != Features.end() && I->getValue() &&
3277       std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3278           FeaturesVec.end())
3279     Features["mmx"] = true;
3280 
3281   return true;
3282 }
3283 
3284 void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
3285                                 X86SSEEnum Level, bool Enabled) {
3286   if (Enabled) {
3287     switch (Level) {
3288     case AVX512F:
3289       Features["avx512f"] = true;
3290     case AVX2:
3291       Features["avx2"] = true;
3292     case AVX:
3293       Features["avx"] = true;
3294       Features["xsave"] = true;
3295     case SSE42:
3296       Features["sse4.2"] = true;
3297     case SSE41:
3298       Features["sse4.1"] = true;
3299     case SSSE3:
3300       Features["ssse3"] = true;
3301     case SSE3:
3302       Features["sse3"] = true;
3303     case SSE2:
3304       Features["sse2"] = true;
3305     case SSE1:
3306       Features["sse"] = true;
3307     case NoSSE:
3308       break;
3309     }
3310     return;
3311   }
3312 
3313   switch (Level) {
3314   case NoSSE:
3315   case SSE1:
3316     Features["sse"] = false;
3317   case SSE2:
3318     Features["sse2"] = Features["pclmul"] = Features["aes"] =
3319       Features["sha"] = false;
3320   case SSE3:
3321     Features["sse3"] = false;
3322     setXOPLevel(Features, NoXOP, false);
3323   case SSSE3:
3324     Features["ssse3"] = false;
3325   case SSE41:
3326     Features["sse4.1"] = false;
3327   case SSE42:
3328     Features["sse4.2"] = false;
3329   case AVX:
3330     Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3331       Features["xsaveopt"] = false;
3332     setXOPLevel(Features, FMA4, false);
3333   case AVX2:
3334     Features["avx2"] = false;
3335   case AVX512F:
3336     Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
3337       Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
3338       Features["avx512vl"] = Features["avx512vbmi"] =
3339       Features["avx512ifma"] = false;
3340   }
3341 }
3342 
3343 void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
3344                                 MMX3DNowEnum Level, bool Enabled) {
3345   if (Enabled) {
3346     switch (Level) {
3347     case AMD3DNowAthlon:
3348       Features["3dnowa"] = true;
3349     case AMD3DNow:
3350       Features["3dnow"] = true;
3351     case MMX:
3352       Features["mmx"] = true;
3353     case NoMMX3DNow:
3354       break;
3355     }
3356     return;
3357   }
3358 
3359   switch (Level) {
3360   case NoMMX3DNow:
3361   case MMX:
3362     Features["mmx"] = false;
3363   case AMD3DNow:
3364     Features["3dnow"] = false;
3365   case AMD3DNowAthlon:
3366     Features["3dnowa"] = false;
3367   }
3368 }
3369 
3370 void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
3371                                 bool Enabled) {
3372   if (Enabled) {
3373     switch (Level) {
3374     case XOP:
3375       Features["xop"] = true;
3376     case FMA4:
3377       Features["fma4"] = true;
3378       setSSELevel(Features, AVX, true);
3379     case SSE4A:
3380       Features["sse4a"] = true;
3381       setSSELevel(Features, SSE3, true);
3382     case NoXOP:
3383       break;
3384     }
3385     return;
3386   }
3387 
3388   switch (Level) {
3389   case NoXOP:
3390   case SSE4A:
3391     Features["sse4a"] = false;
3392   case FMA4:
3393     Features["fma4"] = false;
3394   case XOP:
3395     Features["xop"] = false;
3396   }
3397 }
3398 
3399 void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3400                                           StringRef Name, bool Enabled) {
3401   // This is a bit of a hack to deal with the sse4 target feature when used
3402   // as part of the target attribute. We handle sse4 correctly everywhere
3403   // else. See below for more information on how we handle the sse4 options.
3404   if (Name != "sse4")
3405     Features[Name] = Enabled;
3406 
3407   if (Name == "mmx") {
3408     setMMXLevel(Features, MMX, Enabled);
3409   } else if (Name == "sse") {
3410     setSSELevel(Features, SSE1, Enabled);
3411   } else if (Name == "sse2") {
3412     setSSELevel(Features, SSE2, Enabled);
3413   } else if (Name == "sse3") {
3414     setSSELevel(Features, SSE3, Enabled);
3415   } else if (Name == "ssse3") {
3416     setSSELevel(Features, SSSE3, Enabled);
3417   } else if (Name == "sse4.2") {
3418     setSSELevel(Features, SSE42, Enabled);
3419   } else if (Name == "sse4.1") {
3420     setSSELevel(Features, SSE41, Enabled);
3421   } else if (Name == "3dnow") {
3422     setMMXLevel(Features, AMD3DNow, Enabled);
3423   } else if (Name == "3dnowa") {
3424     setMMXLevel(Features, AMD3DNowAthlon, Enabled);
3425   } else if (Name == "aes") {
3426     if (Enabled)
3427       setSSELevel(Features, SSE2, Enabled);
3428   } else if (Name == "pclmul") {
3429     if (Enabled)
3430       setSSELevel(Features, SSE2, Enabled);
3431   } else if (Name == "avx") {
3432     setSSELevel(Features, AVX, Enabled);
3433   } else if (Name == "avx2") {
3434     setSSELevel(Features, AVX2, Enabled);
3435   } else if (Name == "avx512f") {
3436     setSSELevel(Features, AVX512F, Enabled);
3437   } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3438              Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3439              Name == "avx512vbmi" || Name == "avx512ifma") {
3440     if (Enabled)
3441       setSSELevel(Features, AVX512F, Enabled);
3442     // Enable BWI instruction if VBMI is being enabled.
3443     if (Name == "avx512vbmi" && Enabled)
3444       Features["avx512bw"] = true;
3445     // Also disable VBMI if BWI is being disabled.
3446     if (Name == "avx512bw" && !Enabled)
3447       Features["avx512vbmi"] = false;
3448   } else if (Name == "fma") {
3449     if (Enabled)
3450       setSSELevel(Features, AVX, Enabled);
3451   } else if (Name == "fma4") {
3452     setXOPLevel(Features, FMA4, Enabled);
3453   } else if (Name == "xop") {
3454     setXOPLevel(Features, XOP, Enabled);
3455   } else if (Name == "sse4a") {
3456     setXOPLevel(Features, SSE4A, Enabled);
3457   } else if (Name == "f16c") {
3458     if (Enabled)
3459       setSSELevel(Features, AVX, Enabled);
3460   } else if (Name == "sha") {
3461     if (Enabled)
3462       setSSELevel(Features, SSE2, Enabled);
3463   } else if (Name == "sse4") {
3464     // We can get here via the __target__ attribute since that's not controlled
3465     // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3466     // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3467     // disabled.
3468     if (Enabled)
3469       setSSELevel(Features, SSE42, Enabled);
3470     else
3471       setSSELevel(Features, SSE41, Enabled);
3472   } else if (Name == "xsave") {
3473     if (!Enabled)
3474       Features["xsaveopt"] = false;
3475   } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
3476     if (Enabled)
3477       Features["xsave"] = true;
3478   }
3479 }
3480 
3481 /// handleTargetFeatures - Perform initialization based on the user
3482 /// configured set of features.
3483 bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
3484                                          DiagnosticsEngine &Diags) {
3485   for (const auto &Feature : Features) {
3486     if (Feature[0] != '+')
3487       continue;
3488 
3489     if (Feature == "+aes") {
3490       HasAES = true;
3491     } else if (Feature == "+pclmul") {
3492       HasPCLMUL = true;
3493     } else if (Feature == "+lzcnt") {
3494       HasLZCNT = true;
3495     } else if (Feature == "+rdrnd") {
3496       HasRDRND = true;
3497     } else if (Feature == "+fsgsbase") {
3498       HasFSGSBASE = true;
3499     } else if (Feature == "+bmi") {
3500       HasBMI = true;
3501     } else if (Feature == "+bmi2") {
3502       HasBMI2 = true;
3503     } else if (Feature == "+popcnt") {
3504       HasPOPCNT = true;
3505     } else if (Feature == "+rtm") {
3506       HasRTM = true;
3507     } else if (Feature == "+prfchw") {
3508       HasPRFCHW = true;
3509     } else if (Feature == "+rdseed") {
3510       HasRDSEED = true;
3511     } else if (Feature == "+adx") {
3512       HasADX = true;
3513     } else if (Feature == "+tbm") {
3514       HasTBM = true;
3515     } else if (Feature == "+fma") {
3516       HasFMA = true;
3517     } else if (Feature == "+f16c") {
3518       HasF16C = true;
3519     } else if (Feature == "+avx512cd") {
3520       HasAVX512CD = true;
3521     } else if (Feature == "+avx512er") {
3522       HasAVX512ER = true;
3523     } else if (Feature == "+avx512pf") {
3524       HasAVX512PF = true;
3525     } else if (Feature == "+avx512dq") {
3526       HasAVX512DQ = true;
3527     } else if (Feature == "+avx512bw") {
3528       HasAVX512BW = true;
3529     } else if (Feature == "+avx512vl") {
3530       HasAVX512VL = true;
3531     } else if (Feature == "+avx512vbmi") {
3532       HasAVX512VBMI = true;
3533     } else if (Feature == "+avx512ifma") {
3534       HasAVX512IFMA = true;
3535     } else if (Feature == "+sha") {
3536       HasSHA = true;
3537     } else if (Feature == "+mpx") {
3538       HasMPX = true;
3539     } else if (Feature == "+movbe") {
3540       HasMOVBE = true;
3541     } else if (Feature == "+sgx") {
3542       HasSGX = true;
3543     } else if (Feature == "+cx16") {
3544       HasCX16 = true;
3545     } else if (Feature == "+fxsr") {
3546       HasFXSR = true;
3547     } else if (Feature == "+xsave") {
3548       HasXSAVE = true;
3549     } else if (Feature == "+xsaveopt") {
3550       HasXSAVEOPT = true;
3551     } else if (Feature == "+xsavec") {
3552       HasXSAVEC = true;
3553     } else if (Feature == "+xsaves") {
3554       HasXSAVES = true;
3555     } else if (Feature == "+mwaitx") {
3556       HasMWAITX = true;
3557     } else if (Feature == "+pku") {
3558       HasPKU = true;
3559     } else if (Feature == "+clflushopt") {
3560       HasCLFLUSHOPT = true;
3561     } else if (Feature == "+clwb") {
3562       HasCLWB = true;
3563     } else if (Feature == "+prefetchwt1") {
3564       HasPREFETCHWT1 = true;
3565     } else if (Feature == "+clzero") {
3566       HasCLZERO = true;
3567     }
3568 
3569     X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
3570       .Case("+avx512f", AVX512F)
3571       .Case("+avx2", AVX2)
3572       .Case("+avx", AVX)
3573       .Case("+sse4.2", SSE42)
3574       .Case("+sse4.1", SSE41)
3575       .Case("+ssse3", SSSE3)
3576       .Case("+sse3", SSE3)
3577       .Case("+sse2", SSE2)
3578       .Case("+sse", SSE1)
3579       .Default(NoSSE);
3580     SSELevel = std::max(SSELevel, Level);
3581 
3582     MMX3DNowEnum ThreeDNowLevel =
3583       llvm::StringSwitch<MMX3DNowEnum>(Feature)
3584         .Case("+3dnowa", AMD3DNowAthlon)
3585         .Case("+3dnow", AMD3DNow)
3586         .Case("+mmx", MMX)
3587         .Default(NoMMX3DNow);
3588     MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
3589 
3590     XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
3591         .Case("+xop", XOP)
3592         .Case("+fma4", FMA4)
3593         .Case("+sse4a", SSE4A)
3594         .Default(NoXOP);
3595     XOPLevel = std::max(XOPLevel, XLevel);
3596   }
3597 
3598   // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3599   // matches the selected sse level.
3600   if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3601       (FPMath == FP_387 && SSELevel >= SSE1)) {
3602     Diags.Report(diag::err_target_unsupported_fpmath) <<
3603       (FPMath == FP_SSE ? "sse" : "387");
3604     return false;
3605   }
3606 
3607   SimdDefaultAlign =
3608       hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
3609   return true;
3610 }
3611 
3612 /// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3613 /// definitions for this particular subtarget.
3614 void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
3615                                      MacroBuilder &Builder) const {
3616   // Target identification.
3617   if (getTriple().getArch() == llvm::Triple::x86_64) {
3618     Builder.defineMacro("__amd64__");
3619     Builder.defineMacro("__amd64");
3620     Builder.defineMacro("__x86_64");
3621     Builder.defineMacro("__x86_64__");
3622     if (getTriple().getArchName() == "x86_64h") {
3623       Builder.defineMacro("__x86_64h");
3624       Builder.defineMacro("__x86_64h__");
3625     }
3626   } else {
3627     DefineStd(Builder, "i386", Opts);
3628   }
3629 
3630   // Subtarget options.
3631   // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3632   // truly should be based on -mtune options.
3633   switch (CPU) {
3634   case CK_Generic:
3635     break;
3636   case CK_i386:
3637     // The rest are coming from the i386 define above.
3638     Builder.defineMacro("__tune_i386__");
3639     break;
3640   case CK_i486:
3641   case CK_WinChipC6:
3642   case CK_WinChip2:
3643   case CK_C3:
3644     defineCPUMacros(Builder, "i486");
3645     break;
3646   case CK_PentiumMMX:
3647     Builder.defineMacro("__pentium_mmx__");
3648     Builder.defineMacro("__tune_pentium_mmx__");
3649     // Fallthrough
3650   case CK_i586:
3651   case CK_Pentium:
3652     defineCPUMacros(Builder, "i586");
3653     defineCPUMacros(Builder, "pentium");
3654     break;
3655   case CK_Pentium3:
3656   case CK_Pentium3M:
3657   case CK_PentiumM:
3658     Builder.defineMacro("__tune_pentium3__");
3659     // Fallthrough
3660   case CK_Pentium2:
3661   case CK_C3_2:
3662     Builder.defineMacro("__tune_pentium2__");
3663     // Fallthrough
3664   case CK_PentiumPro:
3665     Builder.defineMacro("__tune_i686__");
3666     Builder.defineMacro("__tune_pentiumpro__");
3667     // Fallthrough
3668   case CK_i686:
3669     Builder.defineMacro("__i686");
3670     Builder.defineMacro("__i686__");
3671     // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3672     Builder.defineMacro("__pentiumpro");
3673     Builder.defineMacro("__pentiumpro__");
3674     break;
3675   case CK_Pentium4:
3676   case CK_Pentium4M:
3677     defineCPUMacros(Builder, "pentium4");
3678     break;
3679   case CK_Yonah:
3680   case CK_Prescott:
3681   case CK_Nocona:
3682     defineCPUMacros(Builder, "nocona");
3683     break;
3684   case CK_Core2:
3685   case CK_Penryn:
3686     defineCPUMacros(Builder, "core2");
3687     break;
3688   case CK_Bonnell:
3689     defineCPUMacros(Builder, "atom");
3690     break;
3691   case CK_Silvermont:
3692     defineCPUMacros(Builder, "slm");
3693     break;
3694   case CK_Nehalem:
3695   case CK_Westmere:
3696   case CK_SandyBridge:
3697   case CK_IvyBridge:
3698   case CK_Haswell:
3699   case CK_Broadwell:
3700   case CK_SkylakeClient:
3701     // FIXME: Historically, we defined this legacy name, it would be nice to
3702     // remove it at some point. We've never exposed fine-grained names for
3703     // recent primary x86 CPUs, and we should keep it that way.
3704     defineCPUMacros(Builder, "corei7");
3705     break;
3706   case CK_SkylakeServer:
3707     defineCPUMacros(Builder, "skx");
3708     break;
3709   case CK_Cannonlake:
3710     break;
3711   case CK_KNL:
3712     defineCPUMacros(Builder, "knl");
3713     break;
3714   case CK_Lakemont:
3715     Builder.defineMacro("__tune_lakemont__");
3716     break;
3717   case CK_K6_2:
3718     Builder.defineMacro("__k6_2__");
3719     Builder.defineMacro("__tune_k6_2__");
3720     // Fallthrough
3721   case CK_K6_3:
3722     if (CPU != CK_K6_2) {  // In case of fallthrough
3723       // FIXME: GCC may be enabling these in cases where some other k6
3724       // architecture is specified but -m3dnow is explicitly provided. The
3725       // exact semantics need to be determined and emulated here.
3726       Builder.defineMacro("__k6_3__");
3727       Builder.defineMacro("__tune_k6_3__");
3728     }
3729     // Fallthrough
3730   case CK_K6:
3731     defineCPUMacros(Builder, "k6");
3732     break;
3733   case CK_Athlon:
3734   case CK_AthlonThunderbird:
3735   case CK_Athlon4:
3736   case CK_AthlonXP:
3737   case CK_AthlonMP:
3738     defineCPUMacros(Builder, "athlon");
3739     if (SSELevel != NoSSE) {
3740       Builder.defineMacro("__athlon_sse__");
3741       Builder.defineMacro("__tune_athlon_sse__");
3742     }
3743     break;
3744   case CK_K8:
3745   case CK_K8SSE3:
3746   case CK_x86_64:
3747   case CK_Opteron:
3748   case CK_OpteronSSE3:
3749   case CK_Athlon64:
3750   case CK_Athlon64SSE3:
3751   case CK_AthlonFX:
3752     defineCPUMacros(Builder, "k8");
3753     break;
3754   case CK_AMDFAM10:
3755     defineCPUMacros(Builder, "amdfam10");
3756     break;
3757   case CK_BTVER1:
3758     defineCPUMacros(Builder, "btver1");
3759     break;
3760   case CK_BTVER2:
3761     defineCPUMacros(Builder, "btver2");
3762     break;
3763   case CK_BDVER1:
3764     defineCPUMacros(Builder, "bdver1");
3765     break;
3766   case CK_BDVER2:
3767     defineCPUMacros(Builder, "bdver2");
3768     break;
3769   case CK_BDVER3:
3770     defineCPUMacros(Builder, "bdver3");
3771     break;
3772   case CK_BDVER4:
3773     defineCPUMacros(Builder, "bdver4");
3774     break;
3775   case CK_ZNVER1:
3776     defineCPUMacros(Builder, "znver1");
3777     break;
3778   case CK_Geode:
3779     defineCPUMacros(Builder, "geode");
3780     break;
3781   }
3782 
3783   // Target properties.
3784   Builder.defineMacro("__REGISTER_PREFIX__", "");
3785 
3786   // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3787   // functions in glibc header files that use FP Stack inline asm which the
3788   // backend can't deal with (PR879).
3789   Builder.defineMacro("__NO_MATH_INLINES");
3790 
3791   if (HasAES)
3792     Builder.defineMacro("__AES__");
3793 
3794   if (HasPCLMUL)
3795     Builder.defineMacro("__PCLMUL__");
3796 
3797   if (HasLZCNT)
3798     Builder.defineMacro("__LZCNT__");
3799 
3800   if (HasRDRND)
3801     Builder.defineMacro("__RDRND__");
3802 
3803   if (HasFSGSBASE)
3804     Builder.defineMacro("__FSGSBASE__");
3805 
3806   if (HasBMI)
3807     Builder.defineMacro("__BMI__");
3808 
3809   if (HasBMI2)
3810     Builder.defineMacro("__BMI2__");
3811 
3812   if (HasPOPCNT)
3813     Builder.defineMacro("__POPCNT__");
3814 
3815   if (HasRTM)
3816     Builder.defineMacro("__RTM__");
3817 
3818   if (HasPRFCHW)
3819     Builder.defineMacro("__PRFCHW__");
3820 
3821   if (HasRDSEED)
3822     Builder.defineMacro("__RDSEED__");
3823 
3824   if (HasADX)
3825     Builder.defineMacro("__ADX__");
3826 
3827   if (HasTBM)
3828     Builder.defineMacro("__TBM__");
3829 
3830   if (HasMWAITX)
3831     Builder.defineMacro("__MWAITX__");
3832 
3833   switch (XOPLevel) {
3834   case XOP:
3835     Builder.defineMacro("__XOP__");
3836   case FMA4:
3837     Builder.defineMacro("__FMA4__");
3838   case SSE4A:
3839     Builder.defineMacro("__SSE4A__");
3840   case NoXOP:
3841     break;
3842   }
3843 
3844   if (HasFMA)
3845     Builder.defineMacro("__FMA__");
3846 
3847   if (HasF16C)
3848     Builder.defineMacro("__F16C__");
3849 
3850   if (HasAVX512CD)
3851     Builder.defineMacro("__AVX512CD__");
3852   if (HasAVX512ER)
3853     Builder.defineMacro("__AVX512ER__");
3854   if (HasAVX512PF)
3855     Builder.defineMacro("__AVX512PF__");
3856   if (HasAVX512DQ)
3857     Builder.defineMacro("__AVX512DQ__");
3858   if (HasAVX512BW)
3859     Builder.defineMacro("__AVX512BW__");
3860   if (HasAVX512VL)
3861     Builder.defineMacro("__AVX512VL__");
3862   if (HasAVX512VBMI)
3863     Builder.defineMacro("__AVX512VBMI__");
3864   if (HasAVX512IFMA)
3865     Builder.defineMacro("__AVX512IFMA__");
3866 
3867   if (HasSHA)
3868     Builder.defineMacro("__SHA__");
3869 
3870   if (HasFXSR)
3871     Builder.defineMacro("__FXSR__");
3872   if (HasXSAVE)
3873     Builder.defineMacro("__XSAVE__");
3874   if (HasXSAVEOPT)
3875     Builder.defineMacro("__XSAVEOPT__");
3876   if (HasXSAVEC)
3877     Builder.defineMacro("__XSAVEC__");
3878   if (HasXSAVES)
3879     Builder.defineMacro("__XSAVES__");
3880   if (HasPKU)
3881     Builder.defineMacro("__PKU__");
3882   if (HasCX16)
3883     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3884   if (HasCLFLUSHOPT)
3885     Builder.defineMacro("__CLFLUSHOPT__");
3886   if (HasCLWB)
3887     Builder.defineMacro("__CLWB__");
3888   if (HasMPX)
3889     Builder.defineMacro("__MPX__");
3890   if (HasSGX)
3891     Builder.defineMacro("__SGX__");
3892   if (HasPREFETCHWT1)
3893     Builder.defineMacro("__PREFETCHWT1__");
3894   if (HasCLZERO)
3895     Builder.defineMacro("__CLZERO__");
3896 
3897   // Each case falls through to the previous one here.
3898   switch (SSELevel) {
3899   case AVX512F:
3900     Builder.defineMacro("__AVX512F__");
3901   case AVX2:
3902     Builder.defineMacro("__AVX2__");
3903   case AVX:
3904     Builder.defineMacro("__AVX__");
3905   case SSE42:
3906     Builder.defineMacro("__SSE4_2__");
3907   case SSE41:
3908     Builder.defineMacro("__SSE4_1__");
3909   case SSSE3:
3910     Builder.defineMacro("__SSSE3__");
3911   case SSE3:
3912     Builder.defineMacro("__SSE3__");
3913   case SSE2:
3914     Builder.defineMacro("__SSE2__");
3915     Builder.defineMacro("__SSE2_MATH__");  // -mfp-math=sse always implied.
3916   case SSE1:
3917     Builder.defineMacro("__SSE__");
3918     Builder.defineMacro("__SSE_MATH__");   // -mfp-math=sse always implied.
3919   case NoSSE:
3920     break;
3921   }
3922 
3923   if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
3924     switch (SSELevel) {
3925     case AVX512F:
3926     case AVX2:
3927     case AVX:
3928     case SSE42:
3929     case SSE41:
3930     case SSSE3:
3931     case SSE3:
3932     case SSE2:
3933       Builder.defineMacro("_M_IX86_FP", Twine(2));
3934       break;
3935     case SSE1:
3936       Builder.defineMacro("_M_IX86_FP", Twine(1));
3937       break;
3938     default:
3939       Builder.defineMacro("_M_IX86_FP", Twine(0));
3940     }
3941   }
3942 
3943   // Each case falls through to the previous one here.
3944   switch (MMX3DNowLevel) {
3945   case AMD3DNowAthlon:
3946     Builder.defineMacro("__3dNOW_A__");
3947   case AMD3DNow:
3948     Builder.defineMacro("__3dNOW__");
3949   case MMX:
3950     Builder.defineMacro("__MMX__");
3951   case NoMMX3DNow:
3952     break;
3953   }
3954 
3955   if (CPU >= CK_i486) {
3956     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3957     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3958     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3959   }
3960   if (CPU >= CK_i586)
3961     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
3962 }
3963 
3964 bool X86TargetInfo::hasFeature(StringRef Feature) const {
3965   return llvm::StringSwitch<bool>(Feature)
3966       .Case("aes", HasAES)
3967       .Case("avx", SSELevel >= AVX)
3968       .Case("avx2", SSELevel >= AVX2)
3969       .Case("avx512f", SSELevel >= AVX512F)
3970       .Case("avx512cd", HasAVX512CD)
3971       .Case("avx512er", HasAVX512ER)
3972       .Case("avx512pf", HasAVX512PF)
3973       .Case("avx512dq", HasAVX512DQ)
3974       .Case("avx512bw", HasAVX512BW)
3975       .Case("avx512vl", HasAVX512VL)
3976       .Case("avx512vbmi", HasAVX512VBMI)
3977       .Case("avx512ifma", HasAVX512IFMA)
3978       .Case("bmi", HasBMI)
3979       .Case("bmi2", HasBMI2)
3980       .Case("clflushopt", HasCLFLUSHOPT)
3981       .Case("clwb", HasCLWB)
3982       .Case("clzero", HasCLZERO)
3983       .Case("cx16", HasCX16)
3984       .Case("f16c", HasF16C)
3985       .Case("fma", HasFMA)
3986       .Case("fma4", XOPLevel >= FMA4)
3987       .Case("fsgsbase", HasFSGSBASE)
3988       .Case("fxsr", HasFXSR)
3989       .Case("lzcnt", HasLZCNT)
3990       .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3991       .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3992       .Case("mmx", MMX3DNowLevel >= MMX)
3993       .Case("movbe", HasMOVBE)
3994       .Case("mpx", HasMPX)
3995       .Case("pclmul", HasPCLMUL)
3996       .Case("pku", HasPKU)
3997       .Case("popcnt", HasPOPCNT)
3998       .Case("prefetchwt1", HasPREFETCHWT1)
3999       .Case("prfchw", HasPRFCHW)
4000       .Case("rdrnd", HasRDRND)
4001       .Case("rdseed", HasRDSEED)
4002       .Case("rtm", HasRTM)
4003       .Case("sgx", HasSGX)
4004       .Case("sha", HasSHA)
4005       .Case("sse", SSELevel >= SSE1)
4006       .Case("sse2", SSELevel >= SSE2)
4007       .Case("sse3", SSELevel >= SSE3)
4008       .Case("ssse3", SSELevel >= SSSE3)
4009       .Case("sse4.1", SSELevel >= SSE41)
4010       .Case("sse4.2", SSELevel >= SSE42)
4011       .Case("sse4a", XOPLevel >= SSE4A)
4012       .Case("tbm", HasTBM)
4013       .Case("x86", true)
4014       .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
4015       .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
4016       .Case("xop", XOPLevel >= XOP)
4017       .Case("xsave", HasXSAVE)
4018       .Case("xsavec", HasXSAVEC)
4019       .Case("xsaves", HasXSAVES)
4020       .Case("xsaveopt", HasXSAVEOPT)
4021       .Default(false);
4022 }
4023 
4024 // We can't use a generic validation scheme for the features accepted here
4025 // versus subtarget features accepted in the target attribute because the
4026 // bitfield structure that's initialized in the runtime only supports the
4027 // below currently rather than the full range of subtarget features. (See
4028 // X86TargetInfo::hasFeature for a somewhat comprehensive list).
4029 bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
4030   return llvm::StringSwitch<bool>(FeatureStr)
4031       .Case("cmov", true)
4032       .Case("mmx", true)
4033       .Case("popcnt", true)
4034       .Case("sse", true)
4035       .Case("sse2", true)
4036       .Case("sse3", true)
4037       .Case("ssse3", true)
4038       .Case("sse4.1", true)
4039       .Case("sse4.2", true)
4040       .Case("avx", true)
4041       .Case("avx2", true)
4042       .Case("sse4a", true)
4043       .Case("fma4", true)
4044       .Case("xop", true)
4045       .Case("fma", true)
4046       .Case("avx512f", true)
4047       .Case("bmi", true)
4048       .Case("bmi2", true)
4049       .Case("aes", true)
4050       .Case("pclmul", true)
4051       .Case("avx512vl", true)
4052       .Case("avx512bw", true)
4053       .Case("avx512dq", true)
4054       .Case("avx512cd", true)
4055       .Case("avx512er", true)
4056       .Case("avx512pf", true)
4057       .Case("avx512vbmi", true)
4058       .Case("avx512ifma", true)
4059       .Default(false);
4060 }
4061 
4062 bool
4063 X86TargetInfo::validateAsmConstraint(const char *&Name,
4064                                      TargetInfo::ConstraintInfo &Info) const {
4065   switch (*Name) {
4066   default: return false;
4067   // Constant constraints.
4068   case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
4069             // instructions.
4070   case 'Z': // 32-bit unsigned integer constant for use with zero-extending
4071             // x86_64 instructions.
4072   case 's':
4073     Info.setRequiresImmediate();
4074     return true;
4075   case 'I':
4076     Info.setRequiresImmediate(0, 31);
4077     return true;
4078   case 'J':
4079     Info.setRequiresImmediate(0, 63);
4080     return true;
4081   case 'K':
4082     Info.setRequiresImmediate(-128, 127);
4083     return true;
4084   case 'L':
4085     Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
4086     return true;
4087   case 'M':
4088     Info.setRequiresImmediate(0, 3);
4089     return true;
4090   case 'N':
4091     Info.setRequiresImmediate(0, 255);
4092     return true;
4093   case 'O':
4094     Info.setRequiresImmediate(0, 127);
4095     return true;
4096   // Register constraints.
4097   case 'Y': // 'Y' is the first character for several 2-character constraints.
4098     // Shift the pointer to the second character of the constraint.
4099     Name++;
4100     switch (*Name) {
4101     default:
4102       return false;
4103     case '0': // First SSE register.
4104     case 't': // Any SSE register, when SSE2 is enabled.
4105     case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
4106     case 'm': // Any MMX register, when inter-unit moves enabled.
4107     case 'k': // AVX512 arch mask registers: k1-k7.
4108       Info.setAllowsRegister();
4109       return true;
4110     }
4111   case 'f': // Any x87 floating point stack register.
4112     // Constraint 'f' cannot be used for output operands.
4113     if (Info.ConstraintStr[0] == '=')
4114       return false;
4115     Info.setAllowsRegister();
4116     return true;
4117   case 'a': // eax.
4118   case 'b': // ebx.
4119   case 'c': // ecx.
4120   case 'd': // edx.
4121   case 'S': // esi.
4122   case 'D': // edi.
4123   case 'A': // edx:eax.
4124   case 't': // Top of floating point stack.
4125   case 'u': // Second from top of floating point stack.
4126   case 'q': // Any register accessible as [r]l: a, b, c, and d.
4127   case 'y': // Any MMX register.
4128   case 'v': // Any {X,Y,Z}MM register (Arch & context dependent)
4129   case 'x': // Any SSE register.
4130   case 'k': // Any AVX512 mask register (same as Yk, additionaly allows k0
4131             // for intermideate k reg operations).
4132   case 'Q': // Any register accessible as [r]h: a, b, c, and d.
4133   case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
4134   case 'l': // "Index" registers: any general register that can be used as an
4135             // index in a base+index memory access.
4136     Info.setAllowsRegister();
4137     return true;
4138   // Floating point constant constraints.
4139   case 'C': // SSE floating point constant.
4140   case 'G': // x87 floating point constant.
4141     return true;
4142   }
4143 }
4144 
4145 bool X86TargetInfo::validateOutputSize(StringRef Constraint,
4146                                        unsigned Size) const {
4147   // Strip off constraint modifiers.
4148   while (Constraint[0] == '=' ||
4149          Constraint[0] == '+' ||
4150          Constraint[0] == '&')
4151     Constraint = Constraint.substr(1);
4152 
4153   return validateOperandSize(Constraint, Size);
4154 }
4155 
4156 bool X86TargetInfo::validateInputSize(StringRef Constraint,
4157                                       unsigned Size) const {
4158   return validateOperandSize(Constraint, Size);
4159 }
4160 
4161 bool X86TargetInfo::validateOperandSize(StringRef Constraint,
4162                                         unsigned Size) const {
4163   switch (Constraint[0]) {
4164   default: break;
4165   case 'k':
4166   // Registers k0-k7 (AVX512) size limit is 64 bit.
4167   case 'y':
4168     return Size <= 64;
4169   case 'f':
4170   case 't':
4171   case 'u':
4172     return Size <= 128;
4173   case 'v':
4174   case 'x':
4175     if (SSELevel >= AVX512F)
4176       // 512-bit zmm registers can be used if target supports AVX512F.
4177       return Size <= 512U;
4178     else if (SSELevel >= AVX)
4179       // 256-bit ymm registers can be used if target supports AVX.
4180       return Size <= 256U;
4181     return Size <= 128U;
4182   case 'Y':
4183     // 'Y' is the first character for several 2-character constraints.
4184     switch (Constraint[1]) {
4185     default: break;
4186     case 'm':
4187       // 'Ym' is synonymous with 'y'.
4188     case 'k':
4189       return Size <= 64;
4190     case 'i':
4191     case 't':
4192       // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4193       if (SSELevel >= AVX512F)
4194         return Size <= 512U;
4195       else if (SSELevel >= AVX)
4196         return Size <= 256U;
4197       return SSELevel >= SSE2 && Size <= 128U;
4198     }
4199 
4200   }
4201 
4202   return true;
4203 }
4204 
4205 std::string
4206 X86TargetInfo::convertConstraint(const char *&Constraint) const {
4207   switch (*Constraint) {
4208   case 'a': return std::string("{ax}");
4209   case 'b': return std::string("{bx}");
4210   case 'c': return std::string("{cx}");
4211   case 'd': return std::string("{dx}");
4212   case 'S': return std::string("{si}");
4213   case 'D': return std::string("{di}");
4214   case 'p': // address
4215     return std::string("im");
4216   case 't': // top of floating point stack.
4217     return std::string("{st}");
4218   case 'u': // second from top of floating point stack.
4219     return std::string("{st(1)}"); // second from top of floating point stack.
4220   case 'Y':
4221     switch (Constraint[1]) {
4222     default:
4223       // Break from inner switch and fall through (copy single char),
4224       // continue parsing after copying the current constraint into
4225       // the return string.
4226       break;
4227     case 'k':
4228       // "^" hints llvm that this is a 2 letter constraint.
4229       // "Constraint++" is used to promote the string iterator
4230       // to the next constraint.
4231       return std::string("^") + std::string(Constraint++, 2);
4232     }
4233     LLVM_FALLTHROUGH;
4234   default:
4235     return std::string(1, *Constraint);
4236   }
4237 }
4238 
4239 // X86-32 generic target
4240 class X86_32TargetInfo : public X86TargetInfo {
4241 public:
4242   X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4243       : X86TargetInfo(Triple, Opts) {
4244     DoubleAlign = LongLongAlign = 32;
4245     LongDoubleWidth = 96;
4246     LongDoubleAlign = 32;
4247     SuitableAlign = 128;
4248     resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
4249     SizeType = UnsignedInt;
4250     PtrDiffType = SignedInt;
4251     IntPtrType = SignedInt;
4252     RegParmMax = 3;
4253 
4254     // Use fpret for all types.
4255     RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4256                              (1 << TargetInfo::Double) |
4257                              (1 << TargetInfo::LongDouble));
4258 
4259     // x86-32 has atomics up to 8 bytes
4260     // FIXME: Check that we actually have cmpxchg8b before setting
4261     // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4262     MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
4263   }
4264   BuiltinVaListKind getBuiltinVaListKind() const override {
4265     return TargetInfo::CharPtrBuiltinVaList;
4266   }
4267 
4268   int getEHDataRegisterNumber(unsigned RegNo) const override {
4269     if (RegNo == 0) return 0;
4270     if (RegNo == 1) return 2;
4271     return -1;
4272   }
4273   bool validateOperandSize(StringRef Constraint,
4274                            unsigned Size) const override {
4275     switch (Constraint[0]) {
4276     default: break;
4277     case 'R':
4278     case 'q':
4279     case 'Q':
4280     case 'a':
4281     case 'b':
4282     case 'c':
4283     case 'd':
4284     case 'S':
4285     case 'D':
4286       return Size <= 32;
4287     case 'A':
4288       return Size <= 64;
4289     }
4290 
4291     return X86TargetInfo::validateOperandSize(Constraint, Size);
4292   }
4293   ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4294     return llvm::makeArrayRef(BuiltinInfoX86, clang::X86::LastX86CommonBuiltin -
4295                                                   Builtin::FirstTSBuiltin + 1);
4296   }
4297 };
4298 
4299 class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4300 public:
4301   NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4302       : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
4303 
4304   unsigned getFloatEvalMethod() const override {
4305     unsigned Major, Minor, Micro;
4306     getTriple().getOSVersion(Major, Minor, Micro);
4307     // New NetBSD uses the default rounding mode.
4308     if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4309       return X86_32TargetInfo::getFloatEvalMethod();
4310     // NetBSD before 6.99.26 defaults to "double" rounding.
4311     return 1;
4312   }
4313 };
4314 
4315 class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4316 public:
4317   OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4318       : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
4319     SizeType = UnsignedLong;
4320     IntPtrType = SignedLong;
4321     PtrDiffType = SignedLong;
4322   }
4323 };
4324 
4325 class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4326 public:
4327   BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4328       : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
4329     SizeType = UnsignedLong;
4330     IntPtrType = SignedLong;
4331     PtrDiffType = SignedLong;
4332   }
4333 };
4334 
4335 class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
4336 public:
4337   DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4338       : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
4339     LongDoubleWidth = 128;
4340     LongDoubleAlign = 128;
4341     SuitableAlign = 128;
4342     MaxVectorAlign = 256;
4343     // The watchOS simulator uses the builtin bool type for Objective-C.
4344     llvm::Triple T = llvm::Triple(Triple);
4345     if (T.isWatchOS())
4346       UseSignedCharForObjCBool = false;
4347     SizeType = UnsignedLong;
4348     IntPtrType = SignedLong;
4349     resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
4350     HasAlignMac68kSupport = true;
4351   }
4352 
4353   bool handleTargetFeatures(std::vector<std::string> &Features,
4354                             DiagnosticsEngine &Diags) override {
4355     if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4356                                                                   Diags))
4357       return false;
4358     // We now know the features we have: we can decide how to align vectors.
4359     MaxVectorAlign =
4360         hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
4361     return true;
4362   }
4363 };
4364 
4365 // x86-32 Windows target
4366 class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
4367 public:
4368   WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4369       : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
4370     WCharType = UnsignedShort;
4371     DoubleAlign = LongLongAlign = 64;
4372     bool IsWinCOFF =
4373         getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
4374     resetDataLayout(IsWinCOFF
4375                         ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4376                         : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
4377   }
4378   void getTargetDefines(const LangOptions &Opts,
4379                         MacroBuilder &Builder) const override {
4380     WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4381   }
4382 };
4383 
4384 // x86-32 Windows Visual Studio target
4385 class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
4386 public:
4387   MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4388                             const TargetOptions &Opts)
4389       : WindowsX86_32TargetInfo(Triple, Opts) {
4390     LongDoubleWidth = LongDoubleAlign = 64;
4391     LongDoubleFormat = &llvm::APFloat::IEEEdouble();
4392   }
4393   void getTargetDefines(const LangOptions &Opts,
4394                         MacroBuilder &Builder) const override {
4395     WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4396     WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4397     // The value of the following reflects processor type.
4398     // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4399     // We lost the original triple, so we use the default.
4400     Builder.defineMacro("_M_IX86", "600");
4401   }
4402 };
4403 
4404 static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4405   // Mingw and cygwin define __declspec(a) to __attribute__((a)).  Clang
4406   // supports __declspec natively under -fms-extensions, but we define a no-op
4407   // __declspec macro anyway for pre-processor compatibility.
4408   if (Opts.MicrosoftExt)
4409     Builder.defineMacro("__declspec", "__declspec");
4410   else
4411     Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4412 
4413   if (!Opts.MicrosoftExt) {
4414     // Provide macros for all the calling convention keywords.  Provide both
4415     // single and double underscore prefixed variants.  These are available on
4416     // x64 as well as x86, even though they have no effect.
4417     const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4418     for (const char *CC : CCs) {
4419       std::string GCCSpelling = "__attribute__((__";
4420       GCCSpelling += CC;
4421       GCCSpelling += "__))";
4422       Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4423       Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4424     }
4425   }
4426 }
4427 
4428 static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4429   Builder.defineMacro("__MSVCRT__");
4430   Builder.defineMacro("__MINGW32__");
4431   addCygMingDefines(Opts, Builder);
4432 }
4433 
4434 // x86-32 MinGW target
4435 class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4436 public:
4437   MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4438       : WindowsX86_32TargetInfo(Triple, Opts) {}
4439   void getTargetDefines(const LangOptions &Opts,
4440                         MacroBuilder &Builder) const override {
4441     WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4442     DefineStd(Builder, "WIN32", Opts);
4443     DefineStd(Builder, "WINNT", Opts);
4444     Builder.defineMacro("_X86_");
4445     addMinGWDefines(Opts, Builder);
4446   }
4447 };
4448 
4449 // x86-32 Cygwin target
4450 class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4451 public:
4452   CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4453       : X86_32TargetInfo(Triple, Opts) {
4454     WCharType = UnsignedShort;
4455     DoubleAlign = LongLongAlign = 64;
4456     resetDataLayout("e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
4457   }
4458   void getTargetDefines(const LangOptions &Opts,
4459                         MacroBuilder &Builder) const override {
4460     X86_32TargetInfo::getTargetDefines(Opts, Builder);
4461     Builder.defineMacro("_X86_");
4462     Builder.defineMacro("__CYGWIN__");
4463     Builder.defineMacro("__CYGWIN32__");
4464     addCygMingDefines(Opts, Builder);
4465     DefineStd(Builder, "unix", Opts);
4466     if (Opts.CPlusPlus)
4467       Builder.defineMacro("_GNU_SOURCE");
4468   }
4469 };
4470 
4471 // x86-32 Haiku target
4472 class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
4473 public:
4474   HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4475     : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
4476   }
4477   void getTargetDefines(const LangOptions &Opts,
4478                         MacroBuilder &Builder) const override {
4479     HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4480     Builder.defineMacro("__INTEL__");
4481   }
4482 };
4483 
4484 // X86-32 MCU target
4485 class MCUX86_32TargetInfo : public X86_32TargetInfo {
4486 public:
4487   MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4488       : X86_32TargetInfo(Triple, Opts) {
4489     LongDoubleWidth = 64;
4490     LongDoubleFormat = &llvm::APFloat::IEEEdouble();
4491     resetDataLayout("e-m:e-p:32:32-i64:32-f64:32-f128:32-n8:16:32-a:0:32-S32");
4492     WIntType = UnsignedInt;
4493   }
4494 
4495   CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4496     // On MCU we support only C calling convention.
4497     return CC == CC_C ? CCCR_OK : CCCR_Warning;
4498   }
4499 
4500   void getTargetDefines(const LangOptions &Opts,
4501                         MacroBuilder &Builder) const override {
4502     X86_32TargetInfo::getTargetDefines(Opts, Builder);
4503     Builder.defineMacro("__iamcu");
4504     Builder.defineMacro("__iamcu__");
4505   }
4506 
4507   bool allowsLargerPreferedTypeAlignment() const override {
4508     return false;
4509   }
4510 };
4511 
4512 // RTEMS Target
4513 template<typename Target>
4514 class RTEMSTargetInfo : public OSTargetInfo<Target> {
4515 protected:
4516   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4517                     MacroBuilder &Builder) const override {
4518     // RTEMS defines; list based off of gcc output
4519 
4520     Builder.defineMacro("__rtems__");
4521     Builder.defineMacro("__ELF__");
4522   }
4523 
4524 public:
4525   RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4526       : OSTargetInfo<Target>(Triple, Opts) {
4527     switch (Triple.getArch()) {
4528     default:
4529     case llvm::Triple::x86:
4530       // this->MCountName = ".mcount";
4531       break;
4532     case llvm::Triple::mips:
4533     case llvm::Triple::mipsel:
4534     case llvm::Triple::ppc:
4535     case llvm::Triple::ppc64:
4536     case llvm::Triple::ppc64le:
4537       // this->MCountName = "_mcount";
4538       break;
4539     case llvm::Triple::arm:
4540       // this->MCountName = "__mcount";
4541       break;
4542     }
4543   }
4544 };
4545 
4546 // x86-32 RTEMS target
4547 class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4548 public:
4549   RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4550       : X86_32TargetInfo(Triple, Opts) {
4551     SizeType = UnsignedLong;
4552     IntPtrType = SignedLong;
4553     PtrDiffType = SignedLong;
4554   }
4555   void getTargetDefines(const LangOptions &Opts,
4556                         MacroBuilder &Builder) const override {
4557     X86_32TargetInfo::getTargetDefines(Opts, Builder);
4558     Builder.defineMacro("__INTEL__");
4559     Builder.defineMacro("__rtems__");
4560   }
4561 };
4562 
4563 // x86-64 generic target
4564 class X86_64TargetInfo : public X86TargetInfo {
4565 public:
4566   X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4567       : X86TargetInfo(Triple, Opts) {
4568     const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
4569     bool IsWinCOFF =
4570         getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
4571     LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
4572     LongDoubleWidth = 128;
4573     LongDoubleAlign = 128;
4574     LargeArrayMinWidth = 128;
4575     LargeArrayAlign = 128;
4576     SuitableAlign = 128;
4577     SizeType    = IsX32 ? UnsignedInt      : UnsignedLong;
4578     PtrDiffType = IsX32 ? SignedInt        : SignedLong;
4579     IntPtrType  = IsX32 ? SignedInt        : SignedLong;
4580     IntMaxType  = IsX32 ? SignedLongLong   : SignedLong;
4581     Int64Type   = IsX32 ? SignedLongLong   : SignedLong;
4582     RegParmMax = 6;
4583 
4584     // Pointers are 32-bit in x32.
4585     resetDataLayout(IsX32
4586                         ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4587                         : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4588                                     : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
4589 
4590     // Use fpret only for long double.
4591     RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
4592 
4593     // Use fp2ret for _Complex long double.
4594     ComplexLongDoubleUsesFP2Ret = true;
4595 
4596     // Make __builtin_ms_va_list available.
4597     HasBuiltinMSVaList = true;
4598 
4599     // x86-64 has atomics up to 16 bytes.
4600     MaxAtomicPromoteWidth = 128;
4601     MaxAtomicInlineWidth = 128;
4602   }
4603   BuiltinVaListKind getBuiltinVaListKind() const override {
4604     return TargetInfo::X86_64ABIBuiltinVaList;
4605   }
4606 
4607   int getEHDataRegisterNumber(unsigned RegNo) const override {
4608     if (RegNo == 0) return 0;
4609     if (RegNo == 1) return 1;
4610     return -1;
4611   }
4612 
4613   CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4614     switch (CC) {
4615     case CC_C:
4616     case CC_Swift:
4617     case CC_X86VectorCall:
4618     case CC_IntelOclBicc:
4619     case CC_X86_64Win64:
4620     case CC_PreserveMost:
4621     case CC_PreserveAll:
4622     case CC_X86RegCall:
4623       return CCCR_OK;
4624     default:
4625       return CCCR_Warning;
4626     }
4627   }
4628 
4629   CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
4630     return CC_C;
4631   }
4632 
4633   // for x32 we need it here explicitly
4634   bool hasInt128Type() const override { return true; }
4635   unsigned getUnwindWordWidth() const override { return 64; }
4636   unsigned getRegisterWidth() const override { return 64; }
4637 
4638   bool validateGlobalRegisterVariable(StringRef RegName,
4639                                       unsigned RegSize,
4640                                       bool &HasSizeMismatch) const override {
4641     // rsp and rbp are the only 64-bit registers the x86 backend can currently
4642     // handle.
4643     if (RegName.equals("rsp") || RegName.equals("rbp")) {
4644       // Check that the register size is 64-bit.
4645       HasSizeMismatch = RegSize != 64;
4646       return true;
4647     }
4648 
4649     // Check if the register is a 32-bit register the backend can handle.
4650     return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4651                                                          HasSizeMismatch);
4652   }
4653   ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4654     return llvm::makeArrayRef(BuiltinInfoX86,
4655                               X86::LastTSBuiltin - Builtin::FirstTSBuiltin);
4656   }
4657 };
4658 
4659 // x86-64 Windows target
4660 class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
4661 public:
4662   WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4663       : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
4664     WCharType = UnsignedShort;
4665     LongWidth = LongAlign = 32;
4666     DoubleAlign = LongLongAlign = 64;
4667     IntMaxType = SignedLongLong;
4668     Int64Type = SignedLongLong;
4669     SizeType = UnsignedLongLong;
4670     PtrDiffType = SignedLongLong;
4671     IntPtrType = SignedLongLong;
4672   }
4673 
4674   void getTargetDefines(const LangOptions &Opts,
4675                                 MacroBuilder &Builder) const override {
4676     WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
4677     Builder.defineMacro("_WIN64");
4678   }
4679 
4680   BuiltinVaListKind getBuiltinVaListKind() const override {
4681     return TargetInfo::CharPtrBuiltinVaList;
4682   }
4683 
4684   CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4685     switch (CC) {
4686     case CC_X86StdCall:
4687     case CC_X86ThisCall:
4688     case CC_X86FastCall:
4689       return CCCR_Ignore;
4690     case CC_C:
4691     case CC_X86VectorCall:
4692     case CC_IntelOclBicc:
4693     case CC_X86_64SysV:
4694     case CC_Swift:
4695     case CC_X86RegCall:
4696       return CCCR_OK;
4697     default:
4698       return CCCR_Warning;
4699     }
4700   }
4701 };
4702 
4703 // x86-64 Windows Visual Studio target
4704 class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
4705 public:
4706   MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4707                             const TargetOptions &Opts)
4708       : WindowsX86_64TargetInfo(Triple, Opts) {
4709     LongDoubleWidth = LongDoubleAlign = 64;
4710     LongDoubleFormat = &llvm::APFloat::IEEEdouble();
4711   }
4712   void getTargetDefines(const LangOptions &Opts,
4713                         MacroBuilder &Builder) const override {
4714     WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4715     WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
4716     Builder.defineMacro("_M_X64", "100");
4717     Builder.defineMacro("_M_AMD64", "100");
4718   }
4719 };
4720 
4721 // x86-64 MinGW target
4722 class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4723 public:
4724   MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4725       : WindowsX86_64TargetInfo(Triple, Opts) {
4726     // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4727     // with x86 FP ops. Weird.
4728     LongDoubleWidth = LongDoubleAlign = 128;
4729     LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
4730   }
4731 
4732   void getTargetDefines(const LangOptions &Opts,
4733                         MacroBuilder &Builder) const override {
4734     WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4735     DefineStd(Builder, "WIN64", Opts);
4736     Builder.defineMacro("__MINGW64__");
4737     addMinGWDefines(Opts, Builder);
4738 
4739     // GCC defines this macro when it is using __gxx_personality_seh0.
4740     if (!Opts.SjLjExceptions)
4741       Builder.defineMacro("__SEH__");
4742   }
4743 };
4744 
4745 // x86-64 Cygwin target
4746 class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4747 public:
4748   CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4749       : X86_64TargetInfo(Triple, Opts) {
4750     TLSSupported = false;
4751     WCharType = UnsignedShort;
4752   }
4753   void getTargetDefines(const LangOptions &Opts,
4754                         MacroBuilder &Builder) const override {
4755     X86_64TargetInfo::getTargetDefines(Opts, Builder);
4756     Builder.defineMacro("__x86_64__");
4757     Builder.defineMacro("__CYGWIN__");
4758     Builder.defineMacro("__CYGWIN64__");
4759     addCygMingDefines(Opts, Builder);
4760     DefineStd(Builder, "unix", Opts);
4761     if (Opts.CPlusPlus)
4762       Builder.defineMacro("_GNU_SOURCE");
4763 
4764     // GCC defines this macro when it is using __gxx_personality_seh0.
4765     if (!Opts.SjLjExceptions)
4766       Builder.defineMacro("__SEH__");
4767   }
4768 };
4769 
4770 class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4771 public:
4772   DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4773       : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
4774     Int64Type = SignedLongLong;
4775     // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4776     llvm::Triple T = llvm::Triple(Triple);
4777     if (T.isiOS())
4778       UseSignedCharForObjCBool = false;
4779     resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
4780   }
4781 
4782   bool handleTargetFeatures(std::vector<std::string> &Features,
4783                             DiagnosticsEngine &Diags) override {
4784     if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4785                                                                   Diags))
4786       return false;
4787     // We now know the features we have: we can decide how to align vectors.
4788     MaxVectorAlign =
4789         hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
4790     return true;
4791   }
4792 };
4793 
4794 class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4795 public:
4796   OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4797       : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
4798     IntMaxType = SignedLongLong;
4799     Int64Type = SignedLongLong;
4800   }
4801 };
4802 
4803 class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4804 public:
4805   BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4806       : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
4807     IntMaxType = SignedLongLong;
4808     Int64Type = SignedLongLong;
4809   }
4810 };
4811 
4812 class ARMTargetInfo : public TargetInfo {
4813   // Possible FPU choices.
4814   enum FPUMode {
4815     VFP2FPU = (1 << 0),
4816     VFP3FPU = (1 << 1),
4817     VFP4FPU = (1 << 2),
4818     NeonFPU = (1 << 3),
4819     FPARMV8 = (1 << 4)
4820   };
4821 
4822   // Possible HWDiv features.
4823   enum HWDivMode {
4824     HWDivThumb = (1 << 0),
4825     HWDivARM = (1 << 1)
4826   };
4827 
4828   static bool FPUModeIsVFP(FPUMode Mode) {
4829     return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
4830   }
4831 
4832   static const TargetInfo::GCCRegAlias GCCRegAliases[];
4833   static const char * const GCCRegNames[];
4834 
4835   std::string ABI, CPU;
4836 
4837   StringRef CPUProfile;
4838   StringRef CPUAttr;
4839 
4840   enum {
4841     FP_Default,
4842     FP_VFP,
4843     FP_Neon
4844   } FPMath;
4845 
4846   unsigned ArchISA;
4847   unsigned ArchKind = llvm::ARM::AK_ARMV4T;
4848   unsigned ArchProfile;
4849   unsigned ArchVersion;
4850 
4851   unsigned FPU : 5;
4852 
4853   unsigned IsAAPCS : 1;
4854   unsigned HWDiv : 2;
4855 
4856   // Initialized via features.
4857   unsigned SoftFloat : 1;
4858   unsigned SoftFloatABI : 1;
4859 
4860   unsigned CRC : 1;
4861   unsigned Crypto : 1;
4862   unsigned DSP : 1;
4863   unsigned Unaligned : 1;
4864 
4865   enum {
4866     LDREX_B = (1 << 0), /// byte (8-bit)
4867     LDREX_H = (1 << 1), /// half (16-bit)
4868     LDREX_W = (1 << 2), /// word (32-bit)
4869     LDREX_D = (1 << 3), /// double (64-bit)
4870   };
4871 
4872   uint32_t LDREX;
4873 
4874   // ACLE 6.5.1 Hardware floating point
4875   enum {
4876     HW_FP_HP = (1 << 1), /// half (16-bit)
4877     HW_FP_SP = (1 << 2), /// single (32-bit)
4878     HW_FP_DP = (1 << 3), /// double (64-bit)
4879   };
4880   uint32_t HW_FP;
4881 
4882   static const Builtin::Info BuiltinInfo[];
4883 
4884   void setABIAAPCS() {
4885     IsAAPCS = true;
4886 
4887     DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4888     const llvm::Triple &T = getTriple();
4889 
4890     // size_t is unsigned long on MachO-derived environments, NetBSD,
4891     // OpenBSD and Bitrig.
4892     if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4893         T.getOS() == llvm::Triple::OpenBSD ||
4894         T.getOS() == llvm::Triple::Bitrig)
4895       SizeType = UnsignedLong;
4896     else
4897       SizeType = UnsignedInt;
4898 
4899     switch (T.getOS()) {
4900     case llvm::Triple::NetBSD:
4901     case llvm::Triple::OpenBSD:
4902       WCharType = SignedInt;
4903       break;
4904     case llvm::Triple::Win32:
4905       WCharType = UnsignedShort;
4906       break;
4907     case llvm::Triple::Linux:
4908     default:
4909       // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4910       WCharType = UnsignedInt;
4911       break;
4912     }
4913 
4914     UseBitFieldTypeAlignment = true;
4915 
4916     ZeroLengthBitfieldBoundary = 0;
4917 
4918     // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4919     // so set preferred for small types to 32.
4920     if (T.isOSBinFormatMachO()) {
4921       resetDataLayout(BigEndian
4922                           ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4923                           : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
4924     } else if (T.isOSWindows()) {
4925       assert(!BigEndian && "Windows on ARM does not support big endian");
4926       resetDataLayout("e"
4927                       "-m:w"
4928                       "-p:32:32"
4929                       "-i64:64"
4930                       "-v128:64:128"
4931                       "-a:0:32"
4932                       "-n32"
4933                       "-S64");
4934     } else if (T.isOSNaCl()) {
4935       assert(!BigEndian && "NaCl on ARM does not support big endian");
4936       resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
4937     } else {
4938       resetDataLayout(BigEndian
4939                           ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4940                           : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
4941     }
4942 
4943     // FIXME: Enumerated types are variable width in straight AAPCS.
4944   }
4945 
4946   void setABIAPCS(bool IsAAPCS16) {
4947     const llvm::Triple &T = getTriple();
4948 
4949     IsAAPCS = false;
4950 
4951     if (IsAAPCS16)
4952       DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4953     else
4954       DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
4955 
4956     // size_t is unsigned int on FreeBSD.
4957     if (T.getOS() == llvm::Triple::FreeBSD)
4958       SizeType = UnsignedInt;
4959     else
4960       SizeType = UnsignedLong;
4961 
4962     // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4963     WCharType = SignedInt;
4964 
4965     // Do not respect the alignment of bit-field types when laying out
4966     // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4967     UseBitFieldTypeAlignment = false;
4968 
4969     /// gcc forces the alignment to 4 bytes, regardless of the type of the
4970     /// zero length bitfield.  This corresponds to EMPTY_FIELD_BOUNDARY in
4971     /// gcc.
4972     ZeroLengthBitfieldBoundary = 32;
4973 
4974     if (T.isOSBinFormatMachO() && IsAAPCS16) {
4975       assert(!BigEndian && "AAPCS16 does not support big-endian");
4976       resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
4977     } else if (T.isOSBinFormatMachO())
4978       resetDataLayout(
4979           BigEndian
4980               ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4981               : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32");
4982     else
4983       resetDataLayout(
4984           BigEndian
4985               ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4986               : "e-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32");
4987 
4988     // FIXME: Override "preferred align" for double and long long.
4989   }
4990 
4991   void setArchInfo() {
4992     StringRef ArchName = getTriple().getArchName();
4993 
4994     ArchISA     = llvm::ARM::parseArchISA(ArchName);
4995     CPU         = llvm::ARM::getDefaultCPU(ArchName);
4996     unsigned AK = llvm::ARM::parseArch(ArchName);
4997     if (AK != llvm::ARM::AK_INVALID)
4998       ArchKind = AK;
4999     setArchInfo(ArchKind);
5000   }
5001 
5002   void setArchInfo(unsigned Kind) {
5003     StringRef SubArch;
5004 
5005     // cache TargetParser info
5006     ArchKind    = Kind;
5007     SubArch     = llvm::ARM::getSubArch(ArchKind);
5008     ArchProfile = llvm::ARM::parseArchProfile(SubArch);
5009     ArchVersion = llvm::ARM::parseArchVersion(SubArch);
5010 
5011     // cache CPU related strings
5012     CPUAttr    = getCPUAttr();
5013     CPUProfile = getCPUProfile();
5014   }
5015 
5016   void setAtomic() {
5017     // when triple does not specify a sub arch,
5018     // then we are not using inline atomics
5019     bool ShouldUseInlineAtomic =
5020                    (ArchISA == llvm::ARM::IK_ARM   && ArchVersion >= 6) ||
5021                    (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
5022     // Cortex M does not support 8 byte atomics, while general Thumb2 does.
5023     if (ArchProfile == llvm::ARM::PK_M) {
5024       MaxAtomicPromoteWidth = 32;
5025       if (ShouldUseInlineAtomic)
5026         MaxAtomicInlineWidth = 32;
5027     }
5028     else {
5029       MaxAtomicPromoteWidth = 64;
5030       if (ShouldUseInlineAtomic)
5031         MaxAtomicInlineWidth = 64;
5032     }
5033   }
5034 
5035   bool isThumb() const {
5036     return (ArchISA == llvm::ARM::IK_THUMB);
5037   }
5038 
5039   bool supportsThumb() const {
5040     return CPUAttr.count('T') || ArchVersion >= 6;
5041   }
5042 
5043   bool supportsThumb2() const {
5044     return CPUAttr.equals("6T2") ||
5045            (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
5046   }
5047 
5048   StringRef getCPUAttr() const {
5049     // For most sub-arches, the build attribute CPU name is enough.
5050     // For Cortex variants, it's slightly different.
5051     switch(ArchKind) {
5052     default:
5053       return llvm::ARM::getCPUAttr(ArchKind);
5054     case llvm::ARM::AK_ARMV6M:
5055       return "6M";
5056     case llvm::ARM::AK_ARMV7S:
5057       return "7S";
5058     case llvm::ARM::AK_ARMV7A:
5059       return "7A";
5060     case llvm::ARM::AK_ARMV7R:
5061       return "7R";
5062     case llvm::ARM::AK_ARMV7M:
5063       return "7M";
5064     case llvm::ARM::AK_ARMV7EM:
5065       return "7EM";
5066     case llvm::ARM::AK_ARMV7VE:
5067       return "7VE";
5068     case llvm::ARM::AK_ARMV8A:
5069       return "8A";
5070     case llvm::ARM::AK_ARMV8_1A:
5071       return "8_1A";
5072     case llvm::ARM::AK_ARMV8_2A:
5073       return "8_2A";
5074     case llvm::ARM::AK_ARMV8MBaseline:
5075       return "8M_BASE";
5076     case llvm::ARM::AK_ARMV8MMainline:
5077       return "8M_MAIN";
5078     case llvm::ARM::AK_ARMV8R:
5079       return "8R";
5080     }
5081   }
5082 
5083   StringRef getCPUProfile() const {
5084     switch(ArchProfile) {
5085     case llvm::ARM::PK_A:
5086       return "A";
5087     case llvm::ARM::PK_R:
5088       return "R";
5089     case llvm::ARM::PK_M:
5090       return "M";
5091     default:
5092       return "";
5093     }
5094   }
5095 
5096 public:
5097   ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5098       : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
5099         HW_FP(0) {
5100 
5101     switch (getTriple().getOS()) {
5102     case llvm::Triple::NetBSD:
5103     case llvm::Triple::OpenBSD:
5104       PtrDiffType = SignedLong;
5105       break;
5106     default:
5107       PtrDiffType = SignedInt;
5108       break;
5109     }
5110 
5111     // Cache arch related info.
5112     setArchInfo();
5113 
5114     // {} in inline assembly are neon specifiers, not assembly variant
5115     // specifiers.
5116     NoAsmVariants = true;
5117 
5118     // FIXME: This duplicates code from the driver that sets the -target-abi
5119     // option - this code is used if -target-abi isn't passed and should
5120     // be unified in some way.
5121     if (Triple.isOSBinFormatMachO()) {
5122       // The backend is hardwired to assume AAPCS for M-class processors, ensure
5123       // the frontend matches that.
5124       if (Triple.getEnvironment() == llvm::Triple::EABI ||
5125           Triple.getOS() == llvm::Triple::UnknownOS ||
5126           ArchProfile == llvm::ARM::PK_M) {
5127         setABI("aapcs");
5128       } else if (Triple.isWatchABI()) {
5129         setABI("aapcs16");
5130       } else {
5131         setABI("apcs-gnu");
5132       }
5133     } else if (Triple.isOSWindows()) {
5134       // FIXME: this is invalid for WindowsCE
5135       setABI("aapcs");
5136     } else {
5137       // Select the default based on the platform.
5138       switch (Triple.getEnvironment()) {
5139       case llvm::Triple::Android:
5140       case llvm::Triple::GNUEABI:
5141       case llvm::Triple::GNUEABIHF:
5142       case llvm::Triple::MuslEABI:
5143       case llvm::Triple::MuslEABIHF:
5144         setABI("aapcs-linux");
5145         break;
5146       case llvm::Triple::EABIHF:
5147       case llvm::Triple::EABI:
5148         setABI("aapcs");
5149         break;
5150       case llvm::Triple::GNU:
5151         setABI("apcs-gnu");
5152       break;
5153       default:
5154         if (Triple.getOS() == llvm::Triple::NetBSD)
5155           setABI("apcs-gnu");
5156         else
5157           setABI("aapcs");
5158         break;
5159       }
5160     }
5161 
5162     // ARM targets default to using the ARM C++ ABI.
5163     TheCXXABI.set(TargetCXXABI::GenericARM);
5164 
5165     // ARM has atomics up to 8 bytes
5166     setAtomic();
5167 
5168     // Do force alignment of members that follow zero length bitfields.  If
5169     // the alignment of the zero-length bitfield is greater than the member
5170     // that follows it, `bar', `bar' will be aligned as the  type of the
5171     // zero length bitfield.
5172     UseZeroLengthBitfieldAlignment = true;
5173 
5174     if (Triple.getOS() == llvm::Triple::Linux ||
5175         Triple.getOS() == llvm::Triple::UnknownOS)
5176       this->MCountName =
5177           Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
5178   }
5179 
5180   StringRef getABI() const override { return ABI; }
5181 
5182   bool setABI(const std::string &Name) override {
5183     ABI = Name;
5184 
5185     // The defaults (above) are for AAPCS, check if we need to change them.
5186     //
5187     // FIXME: We need support for -meabi... we could just mangle it into the
5188     // name.
5189     if (Name == "apcs-gnu" || Name == "aapcs16") {
5190       setABIAPCS(Name == "aapcs16");
5191       return true;
5192     }
5193     if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
5194       setABIAAPCS();
5195       return true;
5196     }
5197     return false;
5198   }
5199 
5200   // FIXME: This should be based on Arch attributes, not CPU names.
5201   bool
5202   initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5203                  StringRef CPU,
5204                  const std::vector<std::string> &FeaturesVec) const override {
5205 
5206     std::vector<StringRef> TargetFeatures;
5207     unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
5208 
5209     // get default FPU features
5210     unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
5211     llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
5212 
5213     // get default Extension features
5214     unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
5215     llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
5216 
5217     for (auto Feature : TargetFeatures)
5218       if (Feature[0] == '+')
5219         Features[Feature.drop_front(1)] = true;
5220 
5221     return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
5222   }
5223 
5224   bool handleTargetFeatures(std::vector<std::string> &Features,
5225                             DiagnosticsEngine &Diags) override {
5226     FPU = 0;
5227     CRC = 0;
5228     Crypto = 0;
5229     DSP = 0;
5230     Unaligned = 1;
5231     SoftFloat = SoftFloatABI = false;
5232     HWDiv = 0;
5233 
5234     // This does not diagnose illegal cases like having both
5235     // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5236     uint32_t HW_FP_remove = 0;
5237     for (const auto &Feature : Features) {
5238       if (Feature == "+soft-float") {
5239         SoftFloat = true;
5240       } else if (Feature == "+soft-float-abi") {
5241         SoftFloatABI = true;
5242       } else if (Feature == "+vfp2") {
5243         FPU |= VFP2FPU;
5244         HW_FP |= HW_FP_SP | HW_FP_DP;
5245       } else if (Feature == "+vfp3") {
5246         FPU |= VFP3FPU;
5247         HW_FP |= HW_FP_SP | HW_FP_DP;
5248       } else if (Feature == "+vfp4") {
5249         FPU |= VFP4FPU;
5250         HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
5251       } else if (Feature == "+fp-armv8") {
5252         FPU |= FPARMV8;
5253         HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
5254       } else if (Feature == "+neon") {
5255         FPU |= NeonFPU;
5256         HW_FP |= HW_FP_SP | HW_FP_DP;
5257       } else if (Feature == "+hwdiv") {
5258         HWDiv |= HWDivThumb;
5259       } else if (Feature == "+hwdiv-arm") {
5260         HWDiv |= HWDivARM;
5261       } else if (Feature == "+crc") {
5262         CRC = 1;
5263       } else if (Feature == "+crypto") {
5264         Crypto = 1;
5265       } else if (Feature == "+dsp") {
5266         DSP = 1;
5267       } else if (Feature == "+fp-only-sp") {
5268         HW_FP_remove |= HW_FP_DP;
5269       } else if (Feature == "+strict-align") {
5270         Unaligned = 0;
5271       } else if (Feature == "+fp16") {
5272         HW_FP |= HW_FP_HP;
5273       }
5274     }
5275     HW_FP &= ~HW_FP_remove;
5276 
5277     switch (ArchVersion) {
5278     case 6:
5279       if (ArchProfile == llvm::ARM::PK_M)
5280         LDREX = 0;
5281       else if (ArchKind == llvm::ARM::AK_ARMV6K)
5282         LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5283       else
5284         LDREX = LDREX_W;
5285       break;
5286     case 7:
5287       if (ArchProfile == llvm::ARM::PK_M)
5288         LDREX = LDREX_W | LDREX_H | LDREX_B ;
5289       else
5290         LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5291       break;
5292     case 8:
5293       LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5294     }
5295 
5296     if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5297       Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5298       return false;
5299     }
5300 
5301     if (FPMath == FP_Neon)
5302       Features.push_back("+neonfp");
5303     else if (FPMath == FP_VFP)
5304       Features.push_back("-neonfp");
5305 
5306     // Remove front-end specific options which the backend handles differently.
5307     auto Feature =
5308         std::find(Features.begin(), Features.end(), "+soft-float-abi");
5309     if (Feature != Features.end())
5310       Features.erase(Feature);
5311 
5312     return true;
5313   }
5314 
5315   bool hasFeature(StringRef Feature) const override {
5316     return llvm::StringSwitch<bool>(Feature)
5317         .Case("arm", true)
5318         .Case("aarch32", true)
5319         .Case("softfloat", SoftFloat)
5320         .Case("thumb", isThumb())
5321         .Case("neon", (FPU & NeonFPU) && !SoftFloat)
5322         .Case("hwdiv", HWDiv & HWDivThumb)
5323         .Case("hwdiv-arm", HWDiv & HWDivARM)
5324         .Default(false);
5325   }
5326 
5327   bool setCPU(const std::string &Name) override {
5328     if (Name != "generic")
5329       setArchInfo(llvm::ARM::parseCPUArch(Name));
5330 
5331     if (ArchKind == llvm::ARM::AK_INVALID)
5332       return false;
5333     setAtomic();
5334     CPU = Name;
5335     return true;
5336   }
5337 
5338   bool setFPMath(StringRef Name) override;
5339 
5340   void getTargetDefines(const LangOptions &Opts,
5341                         MacroBuilder &Builder) const override {
5342     // Target identification.
5343     Builder.defineMacro("__arm");
5344     Builder.defineMacro("__arm__");
5345     // For bare-metal none-eabi.
5346     if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5347         getTriple().getEnvironment() == llvm::Triple::EABI)
5348       Builder.defineMacro("__ELF__");
5349 
5350     // Target properties.
5351     Builder.defineMacro("__REGISTER_PREFIX__", "");
5352 
5353     // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5354     // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
5355     if (getTriple().isWatchABI())
5356       Builder.defineMacro("__ARM_ARCH_7K__", "2");
5357 
5358     if (!CPUAttr.empty())
5359       Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
5360 
5361     // ACLE 6.4.1 ARM/Thumb instruction set architecture
5362     // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
5363     Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
5364 
5365     if (ArchVersion >= 8) {
5366       // ACLE 6.5.7 Crypto Extension
5367       if (Crypto)
5368         Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5369       // ACLE 6.5.8 CRC32 Extension
5370       if (CRC)
5371         Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5372       // ACLE 6.5.10 Numeric Maximum and Minimum
5373       Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5374       // ACLE 6.5.9 Directed Rounding
5375       Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
5376     }
5377 
5378     // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA.  It
5379     // is not defined for the M-profile.
5380     // NOTE that the default profile is assumed to be 'A'
5381     if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
5382       Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5383 
5384     // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5385     // Thumb ISA (including v6-M and v8-M Baseline).  It is set to 2 if the
5386     // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5387     // v7 and v8 architectures excluding v8-M Baseline.
5388     if (supportsThumb2())
5389       Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
5390     else if (supportsThumb())
5391       Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5392 
5393     // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5394     // instruction set such as ARM or Thumb.
5395     Builder.defineMacro("__ARM_32BIT_STATE", "1");
5396 
5397     // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5398 
5399     // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
5400     if (!CPUProfile.empty())
5401       Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
5402 
5403     // ACLE 6.4.3 Unaligned access supported in hardware
5404     if (Unaligned)
5405       Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
5406 
5407     // ACLE 6.4.4 LDREX/STREX
5408     if (LDREX)
5409       Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5410 
5411     // ACLE 6.4.5 CLZ
5412     if (ArchVersion == 5 ||
5413        (ArchVersion == 6 && CPUProfile != "M") ||
5414         ArchVersion >  6)
5415       Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5416 
5417     // ACLE 6.5.1 Hardware Floating Point
5418     if (HW_FP)
5419       Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
5420 
5421     // ACLE predefines.
5422     Builder.defineMacro("__ARM_ACLE", "200");
5423 
5424     // FP16 support (we currently only support IEEE format).
5425     Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5426     Builder.defineMacro("__ARM_FP16_ARGS", "1");
5427 
5428     // ACLE 6.5.3 Fused multiply-accumulate (FMA)
5429     if (ArchVersion >= 7 && (FPU & VFP4FPU))
5430       Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5431 
5432     // Subtarget options.
5433 
5434     // FIXME: It's more complicated than this and we don't really support
5435     // interworking.
5436     // Windows on ARM does not "support" interworking
5437     if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
5438       Builder.defineMacro("__THUMB_INTERWORK__");
5439 
5440     if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
5441       // Embedded targets on Darwin follow AAPCS, but not EABI.
5442       // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
5443       if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
5444         Builder.defineMacro("__ARM_EABI__");
5445       Builder.defineMacro("__ARM_PCS", "1");
5446     }
5447 
5448     if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5449         ABI == "aapcs16")
5450       Builder.defineMacro("__ARM_PCS_VFP", "1");
5451 
5452     if (SoftFloat)
5453       Builder.defineMacro("__SOFTFP__");
5454 
5455     if (ArchKind == llvm::ARM::AK_XSCALE)
5456       Builder.defineMacro("__XSCALE__");
5457 
5458     if (isThumb()) {
5459       Builder.defineMacro("__THUMBEL__");
5460       Builder.defineMacro("__thumb__");
5461       if (supportsThumb2())
5462         Builder.defineMacro("__thumb2__");
5463     }
5464 
5465     // ACLE 6.4.9 32-bit SIMD instructions
5466     if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5467       Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5468 
5469     // ACLE 6.4.10 Hardware Integer Divide
5470     if (((HWDiv & HWDivThumb) && isThumb()) ||
5471         ((HWDiv & HWDivARM) && !isThumb())) {
5472       Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
5473       Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
5474     }
5475 
5476     // Note, this is always on in gcc, even though it doesn't make sense.
5477     Builder.defineMacro("__APCS_32__");
5478 
5479     if (FPUModeIsVFP((FPUMode) FPU)) {
5480       Builder.defineMacro("__VFP_FP__");
5481       if (FPU & VFP2FPU)
5482         Builder.defineMacro("__ARM_VFPV2__");
5483       if (FPU & VFP3FPU)
5484         Builder.defineMacro("__ARM_VFPV3__");
5485       if (FPU & VFP4FPU)
5486         Builder.defineMacro("__ARM_VFPV4__");
5487       if (FPU & FPARMV8)
5488         Builder.defineMacro("__ARM_FPV5__");
5489     }
5490 
5491     // This only gets set when Neon instructions are actually available, unlike
5492     // the VFP define, hence the soft float and arch check. This is subtly
5493     // different from gcc, we follow the intent which was that it should be set
5494     // when Neon instructions are actually available.
5495     if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
5496       Builder.defineMacro("__ARM_NEON", "1");
5497       Builder.defineMacro("__ARM_NEON__");
5498       // current AArch32 NEON implementations do not support double-precision
5499       // floating-point even when it is present in VFP.
5500       Builder.defineMacro("__ARM_NEON_FP",
5501                           "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
5502     }
5503 
5504     Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5505                         Opts.ShortWChar ? "2" : "4");
5506 
5507     Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5508                         Opts.ShortEnums ? "1" : "4");
5509 
5510     if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
5511       Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5512       Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5513       Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5514       Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5515     }
5516 
5517     // ACLE 6.4.7 DSP instructions
5518     if (DSP) {
5519       Builder.defineMacro("__ARM_FEATURE_DSP", "1");
5520     }
5521 
5522     // ACLE 6.4.8 Saturation instructions
5523     bool SAT = false;
5524     if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5525       Builder.defineMacro("__ARM_FEATURE_SAT", "1");
5526       SAT = true;
5527     }
5528 
5529     // ACLE 6.4.6 Q (saturation) flag
5530     if (DSP || SAT)
5531       Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
5532 
5533     if (Opts.UnsafeFPMath)
5534       Builder.defineMacro("__ARM_FP_FAST", "1");
5535 
5536     if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5537       Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5538   }
5539 
5540   ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5541     return llvm::makeArrayRef(BuiltinInfo,
5542                              clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
5543   }
5544   bool isCLZForZeroUndef() const override { return false; }
5545   BuiltinVaListKind getBuiltinVaListKind() const override {
5546     return IsAAPCS
5547                ? AAPCSABIBuiltinVaList
5548                : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5549                                            : TargetInfo::VoidPtrBuiltinVaList);
5550   }
5551   ArrayRef<const char *> getGCCRegNames() const override;
5552   ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
5553   bool validateAsmConstraint(const char *&Name,
5554                              TargetInfo::ConstraintInfo &Info) const override {
5555     switch (*Name) {
5556     default: break;
5557     case 'l': // r0-r7
5558     case 'h': // r8-r15
5559     case 't': // VFP Floating point register single precision
5560     case 'w': // VFP Floating point register double precision
5561       Info.setAllowsRegister();
5562       return true;
5563     case 'I':
5564     case 'J':
5565     case 'K':
5566     case 'L':
5567     case 'M':
5568       // FIXME
5569       return true;
5570     case 'Q': // A memory address that is a single base register.
5571       Info.setAllowsMemory();
5572       return true;
5573     case 'U': // a memory reference...
5574       switch (Name[1]) {
5575       case 'q': // ...ARMV4 ldrsb
5576       case 'v': // ...VFP load/store (reg+constant offset)
5577       case 'y': // ...iWMMXt load/store
5578       case 't': // address valid for load/store opaque types wider
5579                 // than 128-bits
5580       case 'n': // valid address for Neon doubleword vector load/store
5581       case 'm': // valid address for Neon element and structure load/store
5582       case 's': // valid address for non-offset loads/stores of quad-word
5583                 // values in four ARM registers
5584         Info.setAllowsMemory();
5585         Name++;
5586         return true;
5587       }
5588     }
5589     return false;
5590   }
5591   std::string convertConstraint(const char *&Constraint) const override {
5592     std::string R;
5593     switch (*Constraint) {
5594     case 'U':   // Two-character constraint; add "^" hint for later parsing.
5595       R = std::string("^") + std::string(Constraint, 2);
5596       Constraint++;
5597       break;
5598     case 'p': // 'p' should be translated to 'r' by default.
5599       R = std::string("r");
5600       break;
5601     default:
5602       return std::string(1, *Constraint);
5603     }
5604     return R;
5605   }
5606   bool
5607   validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
5608                              std::string &SuggestedModifier) const override {
5609     bool isOutput = (Constraint[0] == '=');
5610     bool isInOut = (Constraint[0] == '+');
5611 
5612     // Strip off constraint modifiers.
5613     while (Constraint[0] == '=' ||
5614            Constraint[0] == '+' ||
5615            Constraint[0] == '&')
5616       Constraint = Constraint.substr(1);
5617 
5618     switch (Constraint[0]) {
5619     default: break;
5620     case 'r': {
5621       switch (Modifier) {
5622       default:
5623         return (isInOut || isOutput || Size <= 64);
5624       case 'q':
5625         // A register of size 32 cannot fit a vector type.
5626         return false;
5627       }
5628     }
5629     }
5630 
5631     return true;
5632   }
5633   const char *getClobbers() const override {
5634     // FIXME: Is this really right?
5635     return "";
5636   }
5637 
5638   CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5639     switch (CC) {
5640     case CC_AAPCS:
5641     case CC_AAPCS_VFP:
5642     case CC_Swift:
5643       return CCCR_OK;
5644     default:
5645       return CCCR_Warning;
5646     }
5647   }
5648 
5649   int getEHDataRegisterNumber(unsigned RegNo) const override {
5650     if (RegNo == 0) return 0;
5651     if (RegNo == 1) return 1;
5652     return -1;
5653   }
5654 
5655   bool hasSjLjLowering() const override {
5656     return true;
5657   }
5658 };
5659 
5660 bool ARMTargetInfo::setFPMath(StringRef Name) {
5661   if (Name == "neon") {
5662     FPMath = FP_Neon;
5663     return true;
5664   } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5665              Name == "vfp4") {
5666     FPMath = FP_VFP;
5667     return true;
5668   }
5669   return false;
5670 }
5671 
5672 const char * const ARMTargetInfo::GCCRegNames[] = {
5673   // Integer registers
5674   "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5675   "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5676 
5677   // Float registers
5678   "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5679   "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5680   "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
5681   "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5682 
5683   // Double registers
5684   "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5685   "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
5686   "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5687   "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5688 
5689   // Quad registers
5690   "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5691   "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
5692 };
5693 
5694 ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5695   return llvm::makeArrayRef(GCCRegNames);
5696 }
5697 
5698 const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
5699   { { "a1" }, "r0" },
5700   { { "a2" }, "r1" },
5701   { { "a3" }, "r2" },
5702   { { "a4" }, "r3" },
5703   { { "v1" }, "r4" },
5704   { { "v2" }, "r5" },
5705   { { "v3" }, "r6" },
5706   { { "v4" }, "r7" },
5707   { { "v5" }, "r8" },
5708   { { "v6", "rfp" }, "r9" },
5709   { { "sl" }, "r10" },
5710   { { "fp" }, "r11" },
5711   { { "ip" }, "r12" },
5712   { { "r13" }, "sp" },
5713   { { "r14" }, "lr" },
5714   { { "r15" }, "pc" },
5715   // The S, D and Q registers overlap, but aren't really aliases; we
5716   // don't want to substitute one of these for a different-sized one.
5717 };
5718 
5719 ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5720   return llvm::makeArrayRef(GCCRegAliases);
5721 }
5722 
5723 const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
5724 #define BUILTIN(ID, TYPE, ATTRS) \
5725   { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
5726 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5727   { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
5728 #include "clang/Basic/BuiltinsNEON.def"
5729 
5730 #define BUILTIN(ID, TYPE, ATTRS) \
5731   { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
5732 #define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
5733   { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
5734 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5735   { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
5736 #define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
5737   { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
5738 #include "clang/Basic/BuiltinsARM.def"
5739 };
5740 
5741 class ARMleTargetInfo : public ARMTargetInfo {
5742 public:
5743   ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5744       : ARMTargetInfo(Triple, Opts) {}
5745   void getTargetDefines(const LangOptions &Opts,
5746                         MacroBuilder &Builder) const override {
5747     Builder.defineMacro("__ARMEL__");
5748     ARMTargetInfo::getTargetDefines(Opts, Builder);
5749   }
5750 };
5751 
5752 class ARMbeTargetInfo : public ARMTargetInfo {
5753 public:
5754   ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5755       : ARMTargetInfo(Triple, Opts) {}
5756   void getTargetDefines(const LangOptions &Opts,
5757                         MacroBuilder &Builder) const override {
5758     Builder.defineMacro("__ARMEB__");
5759     Builder.defineMacro("__ARM_BIG_ENDIAN");
5760     ARMTargetInfo::getTargetDefines(Opts, Builder);
5761   }
5762 };
5763 
5764 class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5765   const llvm::Triple Triple;
5766 public:
5767   WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5768       : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
5769     WCharType = UnsignedShort;
5770     SizeType = UnsignedInt;
5771   }
5772   void getVisualStudioDefines(const LangOptions &Opts,
5773                               MacroBuilder &Builder) const {
5774     WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5775 
5776     // FIXME: this is invalid for WindowsCE
5777     Builder.defineMacro("_M_ARM_NT", "1");
5778     Builder.defineMacro("_M_ARMT", "_M_ARM");
5779     Builder.defineMacro("_M_THUMB", "_M_ARM");
5780 
5781     assert((Triple.getArch() == llvm::Triple::arm ||
5782             Triple.getArch() == llvm::Triple::thumb) &&
5783            "invalid architecture for Windows ARM target info");
5784     unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5785     Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5786 
5787     // TODO map the complete set of values
5788     // 31: VFPv3 40: VFPv4
5789     Builder.defineMacro("_M_ARM_FP", "31");
5790   }
5791   BuiltinVaListKind getBuiltinVaListKind() const override {
5792     return TargetInfo::CharPtrBuiltinVaList;
5793   }
5794   CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5795     switch (CC) {
5796     case CC_X86StdCall:
5797     case CC_X86ThisCall:
5798     case CC_X86FastCall:
5799     case CC_X86VectorCall:
5800       return CCCR_Ignore;
5801     case CC_C:
5802       return CCCR_OK;
5803     default:
5804       return CCCR_Warning;
5805     }
5806   }
5807 };
5808 
5809 // Windows ARM + Itanium C++ ABI Target
5810 class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5811 public:
5812   ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5813                                 const TargetOptions &Opts)
5814       : WindowsARMTargetInfo(Triple, Opts) {
5815     TheCXXABI.set(TargetCXXABI::GenericARM);
5816   }
5817 
5818   void getTargetDefines(const LangOptions &Opts,
5819                         MacroBuilder &Builder) const override {
5820     WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5821 
5822     if (Opts.MSVCCompat)
5823       WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5824   }
5825 };
5826 
5827 // Windows ARM, MS (C++) ABI
5828 class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5829 public:
5830   MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5831                            const TargetOptions &Opts)
5832       : WindowsARMTargetInfo(Triple, Opts) {
5833     TheCXXABI.set(TargetCXXABI::Microsoft);
5834   }
5835 
5836   void getTargetDefines(const LangOptions &Opts,
5837                         MacroBuilder &Builder) const override {
5838     WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5839     WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5840   }
5841 };
5842 
5843 // ARM MinGW target
5844 class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5845 public:
5846   MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5847       : WindowsARMTargetInfo(Triple, Opts) {
5848     TheCXXABI.set(TargetCXXABI::GenericARM);
5849   }
5850 
5851   void getTargetDefines(const LangOptions &Opts,
5852                         MacroBuilder &Builder) const override {
5853     WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5854     DefineStd(Builder, "WIN32", Opts);
5855     DefineStd(Builder, "WINNT", Opts);
5856     Builder.defineMacro("_ARM_");
5857     addMinGWDefines(Opts, Builder);
5858   }
5859 };
5860 
5861 // ARM Cygwin target
5862 class CygwinARMTargetInfo : public ARMleTargetInfo {
5863 public:
5864   CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5865       : ARMleTargetInfo(Triple, Opts) {
5866     TLSSupported = false;
5867     WCharType = UnsignedShort;
5868     DoubleAlign = LongLongAlign = 64;
5869     resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
5870   }
5871   void getTargetDefines(const LangOptions &Opts,
5872                         MacroBuilder &Builder) const override {
5873     ARMleTargetInfo::getTargetDefines(Opts, Builder);
5874     Builder.defineMacro("_ARM_");
5875     Builder.defineMacro("__CYGWIN__");
5876     Builder.defineMacro("__CYGWIN32__");
5877     DefineStd(Builder, "unix", Opts);
5878     if (Opts.CPlusPlus)
5879       Builder.defineMacro("_GNU_SOURCE");
5880   }
5881 };
5882 
5883 class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
5884 protected:
5885   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5886                     MacroBuilder &Builder) const override {
5887     getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5888   }
5889 
5890 public:
5891   DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5892       : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
5893     HasAlignMac68kSupport = true;
5894     // iOS always has 64-bit atomic instructions.
5895     // FIXME: This should be based off of the target features in
5896     // ARMleTargetInfo.
5897     MaxAtomicInlineWidth = 64;
5898 
5899     if (Triple.isWatchABI()) {
5900       // Darwin on iOS uses a variant of the ARM C++ ABI.
5901       TheCXXABI.set(TargetCXXABI::WatchOS);
5902 
5903       // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5904       // size_t is long, it's a bit weird for it to be int.
5905       PtrDiffType = SignedLong;
5906 
5907       // BOOL should be a real boolean on the new ABI
5908       UseSignedCharForObjCBool = false;
5909     } else
5910       TheCXXABI.set(TargetCXXABI::iOS);
5911   }
5912 };
5913 
5914 class AArch64TargetInfo : public TargetInfo {
5915   virtual void setDataLayout() = 0;
5916   static const TargetInfo::GCCRegAlias GCCRegAliases[];
5917   static const char *const GCCRegNames[];
5918 
5919   enum FPUModeEnum {
5920     FPUMode,
5921     NeonMode
5922   };
5923 
5924   unsigned FPU;
5925   unsigned CRC;
5926   unsigned Crypto;
5927   unsigned Unaligned;
5928   unsigned V8_1A;
5929 
5930   static const Builtin::Info BuiltinInfo[];
5931 
5932   std::string ABI;
5933 
5934 public:
5935   AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5936       : TargetInfo(Triple), ABI("aapcs") {
5937     if (getTriple().getOS() == llvm::Triple::NetBSD) {
5938       WCharType = SignedInt;
5939 
5940       // NetBSD apparently prefers consistency across ARM targets to consistency
5941       // across 64-bit targets.
5942       Int64Type = SignedLongLong;
5943       IntMaxType = SignedLongLong;
5944     } else {
5945       WCharType = UnsignedInt;
5946       Int64Type = SignedLong;
5947       IntMaxType = SignedLong;
5948     }
5949 
5950     LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
5951     MaxVectorAlign = 128;
5952     MaxAtomicInlineWidth = 128;
5953     MaxAtomicPromoteWidth = 128;
5954 
5955     LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
5956     LongDoubleFormat = &llvm::APFloat::IEEEquad();
5957 
5958     // {} in inline assembly are neon specifiers, not assembly variant
5959     // specifiers.
5960     NoAsmVariants = true;
5961 
5962     // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5963     // contributes to the alignment of the containing aggregate in the same way
5964     // a plain (non bit-field) member of that type would, without exception for
5965     // zero-sized or anonymous bit-fields."
5966     assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
5967     UseZeroLengthBitfieldAlignment = true;
5968 
5969     // AArch64 targets default to using the ARM C++ ABI.
5970     TheCXXABI.set(TargetCXXABI::GenericAArch64);
5971 
5972     if (Triple.getOS() == llvm::Triple::Linux ||
5973         Triple.getOS() == llvm::Triple::UnknownOS)
5974       this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
5975   }
5976 
5977   StringRef getABI() const override { return ABI; }
5978   bool setABI(const std::string &Name) override {
5979     if (Name != "aapcs" && Name != "darwinpcs")
5980       return false;
5981 
5982     ABI = Name;
5983     return true;
5984   }
5985 
5986   bool setCPU(const std::string &Name) override {
5987     return Name == "generic" ||
5988            llvm::AArch64::parseCPUArch(Name) !=
5989            static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
5990   }
5991 
5992   void getTargetDefines(const LangOptions &Opts,
5993                         MacroBuilder &Builder) const override {
5994     // Target identification.
5995     Builder.defineMacro("__aarch64__");
5996 
5997     // Target properties.
5998     Builder.defineMacro("_LP64");
5999     Builder.defineMacro("__LP64__");
6000 
6001     // ACLE predefines. Many can only have one possible value on v8 AArch64.
6002     Builder.defineMacro("__ARM_ACLE", "200");
6003     Builder.defineMacro("__ARM_ARCH", "8");
6004     Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
6005 
6006     Builder.defineMacro("__ARM_64BIT_STATE", "1");
6007     Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
6008     Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
6009 
6010     Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
6011     Builder.defineMacro("__ARM_FEATURE_FMA", "1");
6012     Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
6013     Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
6014     Builder.defineMacro("__ARM_FEATURE_DIV");  // For backwards compatibility
6015     Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
6016     Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
6017 
6018     Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
6019 
6020     // 0xe implies support for half, single and double precision operations.
6021     Builder.defineMacro("__ARM_FP", "0xE");
6022 
6023     // PCS specifies this for SysV variants, which is all we support. Other ABIs
6024     // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
6025     Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
6026     Builder.defineMacro("__ARM_FP16_ARGS", "1");
6027 
6028     if (Opts.UnsafeFPMath)
6029       Builder.defineMacro("__ARM_FP_FAST", "1");
6030 
6031     Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
6032 
6033     Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
6034                         Opts.ShortEnums ? "1" : "4");
6035 
6036     if (FPU == NeonMode) {
6037       Builder.defineMacro("__ARM_NEON", "1");
6038       // 64-bit NEON supports half, single and double precision operations.
6039       Builder.defineMacro("__ARM_NEON_FP", "0xE");
6040     }
6041 
6042     if (CRC)
6043       Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
6044 
6045     if (Crypto)
6046       Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
6047 
6048     if (Unaligned)
6049       Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
6050 
6051     if (V8_1A)
6052       Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
6053 
6054     // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
6055     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6056     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6057     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6058     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6059   }
6060 
6061   ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6062     return llvm::makeArrayRef(BuiltinInfo,
6063                        clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
6064   }
6065 
6066   bool hasFeature(StringRef Feature) const override {
6067     return Feature == "aarch64" ||
6068       Feature == "arm64" ||
6069       Feature == "arm" ||
6070       (Feature == "neon" && FPU == NeonMode);
6071   }
6072 
6073   bool handleTargetFeatures(std::vector<std::string> &Features,
6074                             DiagnosticsEngine &Diags) override {
6075     FPU = FPUMode;
6076     CRC = 0;
6077     Crypto = 0;
6078     Unaligned = 1;
6079     V8_1A = 0;
6080 
6081     for (const auto &Feature : Features) {
6082       if (Feature == "+neon")
6083         FPU = NeonMode;
6084       if (Feature == "+crc")
6085         CRC = 1;
6086       if (Feature == "+crypto")
6087         Crypto = 1;
6088       if (Feature == "+strict-align")
6089         Unaligned = 0;
6090       if (Feature == "+v8.1a")
6091         V8_1A = 1;
6092     }
6093 
6094     setDataLayout();
6095 
6096     return true;
6097   }
6098 
6099   CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6100     switch (CC) {
6101     case CC_C:
6102     case CC_Swift:
6103     case CC_PreserveMost:
6104     case CC_PreserveAll:
6105       return CCCR_OK;
6106     default:
6107       return CCCR_Warning;
6108     }
6109   }
6110 
6111   bool isCLZForZeroUndef() const override { return false; }
6112 
6113   BuiltinVaListKind getBuiltinVaListKind() const override {
6114     return TargetInfo::AArch64ABIBuiltinVaList;
6115   }
6116 
6117   ArrayRef<const char *> getGCCRegNames() const override;
6118   ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6119 
6120   bool validateAsmConstraint(const char *&Name,
6121                              TargetInfo::ConstraintInfo &Info) const override {
6122     switch (*Name) {
6123     default:
6124       return false;
6125     case 'w': // Floating point and SIMD registers (V0-V31)
6126       Info.setAllowsRegister();
6127       return true;
6128     case 'I': // Constant that can be used with an ADD instruction
6129     case 'J': // Constant that can be used with a SUB instruction
6130     case 'K': // Constant that can be used with a 32-bit logical instruction
6131     case 'L': // Constant that can be used with a 64-bit logical instruction
6132     case 'M': // Constant that can be used as a 32-bit MOV immediate
6133     case 'N': // Constant that can be used as a 64-bit MOV immediate
6134     case 'Y': // Floating point constant zero
6135     case 'Z': // Integer constant zero
6136       return true;
6137     case 'Q': // A memory reference with base register and no offset
6138       Info.setAllowsMemory();
6139       return true;
6140     case 'S': // A symbolic address
6141       Info.setAllowsRegister();
6142       return true;
6143     case 'U':
6144       // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
6145       // Utf: A memory address suitable for ldp/stp in TF mode.
6146       // Usa: An absolute symbolic address.
6147       // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
6148       llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
6149     case 'z': // Zero register, wzr or xzr
6150       Info.setAllowsRegister();
6151       return true;
6152     case 'x': // Floating point and SIMD registers (V0-V15)
6153       Info.setAllowsRegister();
6154       return true;
6155     }
6156     return false;
6157   }
6158 
6159   bool
6160   validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
6161                              std::string &SuggestedModifier) const override {
6162     // Strip off constraint modifiers.
6163     while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
6164       Constraint = Constraint.substr(1);
6165 
6166     switch (Constraint[0]) {
6167     default:
6168       return true;
6169     case 'z':
6170     case 'r': {
6171       switch (Modifier) {
6172       case 'x':
6173       case 'w':
6174         // For now assume that the person knows what they're
6175         // doing with the modifier.
6176         return true;
6177       default:
6178         // By default an 'r' constraint will be in the 'x'
6179         // registers.
6180         if (Size == 64)
6181           return true;
6182 
6183         SuggestedModifier = "w";
6184         return false;
6185       }
6186     }
6187     }
6188   }
6189 
6190   const char *getClobbers() const override { return ""; }
6191 
6192   int getEHDataRegisterNumber(unsigned RegNo) const override {
6193     if (RegNo == 0)
6194       return 0;
6195     if (RegNo == 1)
6196       return 1;
6197     return -1;
6198   }
6199 };
6200 
6201 const char *const AArch64TargetInfo::GCCRegNames[] = {
6202   // 32-bit Integer registers
6203   "w0",  "w1",  "w2",  "w3",  "w4",  "w5",  "w6",  "w7",  "w8",  "w9",  "w10",
6204   "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
6205   "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
6206 
6207   // 64-bit Integer registers
6208   "x0",  "x1",  "x2",  "x3",  "x4",  "x5",  "x6",  "x7",  "x8",  "x9",  "x10",
6209   "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
6210   "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp",  "lr",  "sp",
6211 
6212   // 32-bit floating point regsisters
6213   "s0",  "s1",  "s2",  "s3",  "s4",  "s5",  "s6",  "s7",  "s8",  "s9",  "s10",
6214   "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
6215   "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
6216 
6217   // 64-bit floating point regsisters
6218   "d0",  "d1",  "d2",  "d3",  "d4",  "d5",  "d6",  "d7",  "d8",  "d9",  "d10",
6219   "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
6220   "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
6221 
6222   // Vector registers
6223   "v0",  "v1",  "v2",  "v3",  "v4",  "v5",  "v6",  "v7",  "v8",  "v9",  "v10",
6224   "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6225   "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6226 };
6227 
6228 ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6229   return llvm::makeArrayRef(GCCRegNames);
6230 }
6231 
6232 const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
6233   { { "w31" }, "wsp" },
6234   { { "x29" }, "fp" },
6235   { { "x30" }, "lr" },
6236   { { "x31" }, "sp" },
6237   // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6238   // don't want to substitute one of these for a different-sized one.
6239 };
6240 
6241 ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6242   return llvm::makeArrayRef(GCCRegAliases);
6243 }
6244 
6245 const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
6246 #define BUILTIN(ID, TYPE, ATTRS)                                               \
6247   { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6248 #include "clang/Basic/BuiltinsNEON.def"
6249 
6250 #define BUILTIN(ID, TYPE, ATTRS)                                               \
6251   { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6252 #include "clang/Basic/BuiltinsAArch64.def"
6253 };
6254 
6255 class AArch64leTargetInfo : public AArch64TargetInfo {
6256   void setDataLayout() override {
6257     if (getTriple().isOSBinFormatMachO())
6258       resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
6259     else
6260       resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
6261   }
6262 
6263 public:
6264   AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6265       : AArch64TargetInfo(Triple, Opts) {
6266   }
6267   void getTargetDefines(const LangOptions &Opts,
6268                         MacroBuilder &Builder) const override {
6269     Builder.defineMacro("__AARCH64EL__");
6270     AArch64TargetInfo::getTargetDefines(Opts, Builder);
6271   }
6272 };
6273 
6274 class AArch64beTargetInfo : public AArch64TargetInfo {
6275   void setDataLayout() override {
6276     assert(!getTriple().isOSBinFormatMachO());
6277     resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
6278   }
6279 
6280 public:
6281   AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6282       : AArch64TargetInfo(Triple, Opts) {}
6283   void getTargetDefines(const LangOptions &Opts,
6284                         MacroBuilder &Builder) const override {
6285     Builder.defineMacro("__AARCH64EB__");
6286     Builder.defineMacro("__AARCH_BIG_ENDIAN");
6287     Builder.defineMacro("__ARM_BIG_ENDIAN");
6288     AArch64TargetInfo::getTargetDefines(Opts, Builder);
6289   }
6290 };
6291 
6292 class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
6293 protected:
6294   void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6295                     MacroBuilder &Builder) const override {
6296     Builder.defineMacro("__AARCH64_SIMD__");
6297     Builder.defineMacro("__ARM64_ARCH_8__");
6298     Builder.defineMacro("__ARM_NEON__");
6299     Builder.defineMacro("__LITTLE_ENDIAN__");
6300     Builder.defineMacro("__REGISTER_PREFIX__", "");
6301     Builder.defineMacro("__arm64", "1");
6302     Builder.defineMacro("__arm64__", "1");
6303 
6304     getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6305   }
6306 
6307 public:
6308   DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6309       : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
6310     Int64Type = SignedLongLong;
6311     WCharType = SignedInt;
6312     UseSignedCharForObjCBool = false;
6313 
6314     LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
6315     LongDoubleFormat = &llvm::APFloat::IEEEdouble();
6316 
6317     TheCXXABI.set(TargetCXXABI::iOS64);
6318   }
6319 
6320   BuiltinVaListKind getBuiltinVaListKind() const override {
6321     return TargetInfo::CharPtrBuiltinVaList;
6322   }
6323 };
6324 
6325 // Hexagon abstract base class
6326 class HexagonTargetInfo : public TargetInfo {
6327   static const Builtin::Info BuiltinInfo[];
6328   static const char * const GCCRegNames[];
6329   static const TargetInfo::GCCRegAlias GCCRegAliases[];
6330   std::string CPU;
6331   bool HasHVX, HasHVXDouble;
6332   bool UseLongCalls;
6333 
6334 public:
6335   HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6336       : TargetInfo(Triple) {
6337     // Specify the vector alignment explicitly. For v512x1, the calculated
6338     // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6339     // the required minimum of 64 bytes.
6340     resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
6341         "i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-"
6342         "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
6343     SizeType    = UnsignedInt;
6344     PtrDiffType = SignedInt;
6345     IntPtrType  = SignedInt;
6346 
6347     // {} in inline assembly are packet specifiers, not assembly variant
6348     // specifiers.
6349     NoAsmVariants = true;
6350 
6351     LargeArrayMinWidth = 64;
6352     LargeArrayAlign = 64;
6353     UseBitFieldTypeAlignment = true;
6354     ZeroLengthBitfieldBoundary = 32;
6355     HasHVX = HasHVXDouble = false;
6356     UseLongCalls = false;
6357   }
6358 
6359   ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6360     return llvm::makeArrayRef(BuiltinInfo,
6361                          clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
6362   }
6363 
6364   bool validateAsmConstraint(const char *&Name,
6365                              TargetInfo::ConstraintInfo &Info) const override {
6366     switch (*Name) {
6367       case 'v':
6368       case 'q':
6369         if (HasHVX) {
6370           Info.setAllowsRegister();
6371           return true;
6372         }
6373         break;
6374       case 's':
6375         // Relocatable constant.
6376         return true;
6377     }
6378     return false;
6379   }
6380 
6381   void getTargetDefines(const LangOptions &Opts,
6382                         MacroBuilder &Builder) const override;
6383 
6384   bool isCLZForZeroUndef() const override { return false; }
6385 
6386   bool hasFeature(StringRef Feature) const override {
6387     return llvm::StringSwitch<bool>(Feature)
6388       .Case("hexagon", true)
6389       .Case("hvx", HasHVX)
6390       .Case("hvx-double", HasHVXDouble)
6391       .Case("long-calls", UseLongCalls)
6392       .Default(false);
6393   }
6394 
6395   bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6396         StringRef CPU, const std::vector<std::string> &FeaturesVec)
6397         const override;
6398 
6399   bool handleTargetFeatures(std::vector<std::string> &Features,
6400                             DiagnosticsEngine &Diags) override;
6401 
6402   void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
6403                          bool Enabled) const override;
6404 
6405   BuiltinVaListKind getBuiltinVaListKind() const override {
6406     return TargetInfo::CharPtrBuiltinVaList;
6407   }
6408   ArrayRef<const char *> getGCCRegNames() const override;
6409   ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6410   const char *getClobbers() const override {
6411     return "";
6412   }
6413 
6414   static const char *getHexagonCPUSuffix(StringRef Name) {
6415     return llvm::StringSwitch<const char*>(Name)
6416       .Case("hexagonv4", "4")
6417       .Case("hexagonv5", "5")
6418       .Case("hexagonv55", "55")
6419       .Case("hexagonv60", "60")
6420       .Default(nullptr);
6421   }
6422 
6423   bool setCPU(const std::string &Name) override {
6424     if (!getHexagonCPUSuffix(Name))
6425       return false;
6426     CPU = Name;
6427     return true;
6428   }
6429 
6430   int getEHDataRegisterNumber(unsigned RegNo) const override {
6431     return RegNo < 2 ? RegNo : -1;
6432   }
6433 };
6434 
6435 void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
6436                                          MacroBuilder &Builder) const {
6437   Builder.defineMacro("__qdsp6__", "1");
6438   Builder.defineMacro("__hexagon__", "1");
6439 
6440   if (CPU == "hexagonv4") {
6441     Builder.defineMacro("__HEXAGON_V4__");
6442     Builder.defineMacro("__HEXAGON_ARCH__", "4");
6443     if (Opts.HexagonQdsp6Compat) {
6444       Builder.defineMacro("__QDSP6_V4__");
6445       Builder.defineMacro("__QDSP6_ARCH__", "4");
6446     }
6447   } else if (CPU == "hexagonv5") {
6448     Builder.defineMacro("__HEXAGON_V5__");
6449     Builder.defineMacro("__HEXAGON_ARCH__", "5");
6450     if(Opts.HexagonQdsp6Compat) {
6451       Builder.defineMacro("__QDSP6_V5__");
6452       Builder.defineMacro("__QDSP6_ARCH__", "5");
6453     }
6454   } else if (CPU == "hexagonv55") {
6455     Builder.defineMacro("__HEXAGON_V55__");
6456     Builder.defineMacro("__HEXAGON_ARCH__", "55");
6457     Builder.defineMacro("__QDSP6_V55__");
6458     Builder.defineMacro("__QDSP6_ARCH__", "55");
6459   } else if (CPU == "hexagonv60") {
6460     Builder.defineMacro("__HEXAGON_V60__");
6461     Builder.defineMacro("__HEXAGON_ARCH__", "60");
6462     Builder.defineMacro("__QDSP6_V60__");
6463     Builder.defineMacro("__QDSP6_ARCH__", "60");
6464   }
6465 
6466   if (hasFeature("hvx")) {
6467     Builder.defineMacro("__HVX__");
6468     if (hasFeature("hvx-double"))
6469       Builder.defineMacro("__HVXDBL__");
6470   }
6471 }
6472 
6473 bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6474       DiagnosticsEngine &Diags, StringRef CPU,
6475       const std::vector<std::string> &FeaturesVec) const {
6476   // Default for v60: -hvx, -hvx-double.
6477   Features["hvx"] = false;
6478   Features["hvx-double"] = false;
6479   Features["long-calls"] = false;
6480 
6481   return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6482 }
6483 
6484 bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6485                                              DiagnosticsEngine &Diags) {
6486   for (auto &F : Features) {
6487     if (F == "+hvx")
6488       HasHVX = true;
6489     else if (F == "-hvx")
6490       HasHVX = HasHVXDouble = false;
6491     else if (F == "+hvx-double")
6492       HasHVX = HasHVXDouble = true;
6493     else if (F == "-hvx-double")
6494       HasHVXDouble = false;
6495 
6496     if (F == "+long-calls")
6497       UseLongCalls = true;
6498     else if (F == "-long-calls")
6499       UseLongCalls = false;
6500   }
6501   return true;
6502 }
6503 
6504 void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
6505       StringRef Name, bool Enabled) const {
6506   if (Enabled) {
6507     if (Name == "hvx-double")
6508       Features["hvx"] = true;
6509   } else {
6510     if (Name == "hvx")
6511       Features["hvx-double"] = false;
6512   }
6513   Features[Name] = Enabled;
6514 }
6515 
6516 const char *const HexagonTargetInfo::GCCRegNames[] = {
6517   "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6518   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6519   "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6520   "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6521   "p0", "p1", "p2", "p3",
6522   "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6523 };
6524 
6525 ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
6526   return llvm::makeArrayRef(GCCRegNames);
6527 }
6528 
6529 const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6530   { { "sp" }, "r29" },
6531   { { "fp" }, "r30" },
6532   { { "lr" }, "r31" },
6533 };
6534 
6535 ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6536   return llvm::makeArrayRef(GCCRegAliases);
6537 }
6538 
6539 
6540 const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
6541 #define BUILTIN(ID, TYPE, ATTRS) \
6542   { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6543 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6544   { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
6545 #include "clang/Basic/BuiltinsHexagon.def"
6546 };
6547 
6548 class LanaiTargetInfo : public TargetInfo {
6549   // Class for Lanai (32-bit).
6550   // The CPU profiles supported by the Lanai backend
6551   enum CPUKind {
6552     CK_NONE,
6553     CK_V11,
6554   } CPU;
6555 
6556   static const TargetInfo::GCCRegAlias GCCRegAliases[];
6557   static const char *const GCCRegNames[];
6558 
6559 public:
6560   LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6561       : TargetInfo(Triple) {
6562     // Description string has to be kept in sync with backend.
6563     resetDataLayout("E"        // Big endian
6564                     "-m:e"     // ELF name manging
6565                     "-p:32:32" // 32 bit pointers, 32 bit aligned
6566                     "-i64:64"  // 64 bit integers, 64 bit aligned
6567                     "-a:0:32"  // 32 bit alignment of objects of aggregate type
6568                     "-n32"     // 32 bit native integer width
6569                     "-S64"     // 64 bit natural stack alignment
6570                     );
6571 
6572     // Setting RegParmMax equal to what mregparm was set to in the old
6573     // toolchain
6574     RegParmMax = 4;
6575 
6576     // Set the default CPU to V11
6577     CPU = CK_V11;
6578 
6579     // Temporary approach to make everything at least word-aligned and allow for
6580     // safely casting between pointers with different alignment requirements.
6581     // TODO: Remove this when there are no more cast align warnings on the
6582     // firmware.
6583     MinGlobalAlign = 32;
6584   }
6585 
6586   void getTargetDefines(const LangOptions &Opts,
6587                         MacroBuilder &Builder) const override {
6588     // Define __lanai__ when building for target lanai.
6589     Builder.defineMacro("__lanai__");
6590 
6591     // Set define for the CPU specified.
6592     switch (CPU) {
6593     case CK_V11:
6594       Builder.defineMacro("__LANAI_V11__");
6595       break;
6596     case CK_NONE:
6597       llvm_unreachable("Unhandled target CPU");
6598     }
6599   }
6600 
6601   bool setCPU(const std::string &Name) override {
6602     CPU = llvm::StringSwitch<CPUKind>(Name)
6603               .Case("v11", CK_V11)
6604               .Default(CK_NONE);
6605 
6606     return CPU != CK_NONE;
6607   }
6608 
6609   bool hasFeature(StringRef Feature) const override {
6610     return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6611   }
6612 
6613   ArrayRef<const char *> getGCCRegNames() const override;
6614 
6615   ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6616 
6617   BuiltinVaListKind getBuiltinVaListKind() const override {
6618     return TargetInfo::VoidPtrBuiltinVaList;
6619   }
6620 
6621   ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6622 
6623   bool validateAsmConstraint(const char *&Name,
6624                              TargetInfo::ConstraintInfo &info) const override {
6625     return false;
6626   }
6627 
6628   const char *getClobbers() const override { return ""; }
6629 };
6630 
6631 const char *const LanaiTargetInfo::GCCRegNames[] = {
6632     "r0",  "r1",  "r2",  "r3",  "r4",  "r5",  "r6",  "r7",  "r8",  "r9",  "r10",
6633     "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6634     "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6635 
6636 ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6637   return llvm::makeArrayRef(GCCRegNames);
6638 }
6639 
6640 const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6641     {{"pc"}, "r2"},
6642     {{"sp"}, "r4"},
6643     {{"fp"}, "r5"},
6644     {{"rv"}, "r8"},
6645     {{"rr1"}, "r10"},
6646     {{"rr2"}, "r11"},
6647     {{"rca"}, "r15"},
6648 };
6649 
6650 ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6651   return llvm::makeArrayRef(GCCRegAliases);
6652 }
6653 
6654 // Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6655 class SparcTargetInfo : public TargetInfo {
6656   static const TargetInfo::GCCRegAlias GCCRegAliases[];
6657   static const char * const GCCRegNames[];
6658   bool SoftFloat;
6659 public:
6660   SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6661       : TargetInfo(Triple), SoftFloat(false) {}
6662 
6663   int getEHDataRegisterNumber(unsigned RegNo) const override {
6664     if (RegNo == 0) return 24;
6665     if (RegNo == 1) return 25;
6666     return -1;
6667   }
6668 
6669   bool handleTargetFeatures(std::vector<std::string> &Features,
6670                             DiagnosticsEngine &Diags) override {
6671     // Check if software floating point is enabled
6672     auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6673     if (Feature != Features.end()) {
6674       SoftFloat = true;
6675     }
6676     return true;
6677   }
6678   void getTargetDefines(const LangOptions &Opts,
6679                         MacroBuilder &Builder) const override {
6680     DefineStd(Builder, "sparc", Opts);
6681     Builder.defineMacro("__REGISTER_PREFIX__", "");
6682 
6683     if (SoftFloat)
6684       Builder.defineMacro("SOFT_FLOAT", "1");
6685   }
6686 
6687   bool hasFeature(StringRef Feature) const override {
6688     return llvm::StringSwitch<bool>(Feature)
6689              .Case("softfloat", SoftFloat)
6690              .Case("sparc", true)
6691              .Default(false);
6692   }
6693 
6694   bool hasSjLjLowering() const override {
6695     return true;
6696   }
6697 
6698   ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6699     // FIXME: Implement!
6700     return None;
6701   }
6702   BuiltinVaListKind getBuiltinVaListKind() const override {
6703     return TargetInfo::VoidPtrBuiltinVaList;
6704   }
6705   ArrayRef<const char *> getGCCRegNames() const override;
6706   ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6707   bool validateAsmConstraint(const char *&Name,
6708                              TargetInfo::ConstraintInfo &info) const override {
6709     // FIXME: Implement!
6710     switch (*Name) {
6711     case 'I': // Signed 13-bit constant
6712     case 'J': // Zero
6713     case 'K': // 32-bit constant with the low 12 bits clear
6714     case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6715     case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6716     case 'N': // Same as 'K' but zext (required for SIMode)
6717     case 'O': // The constant 4096
6718       return true;
6719     }
6720     return false;
6721   }
6722   const char *getClobbers() const override {
6723     // FIXME: Implement!
6724     return "";
6725   }
6726 
6727   // No Sparc V7 for now, the backend doesn't support it anyway.
6728   enum CPUKind {
6729     CK_GENERIC,
6730     CK_V8,
6731     CK_SUPERSPARC,
6732     CK_SPARCLITE,
6733     CK_F934,
6734     CK_HYPERSPARC,
6735     CK_SPARCLITE86X,
6736     CK_SPARCLET,
6737     CK_TSC701,
6738     CK_V9,
6739     CK_ULTRASPARC,
6740     CK_ULTRASPARC3,
6741     CK_NIAGARA,
6742     CK_NIAGARA2,
6743     CK_NIAGARA3,
6744     CK_NIAGARA4,
6745     CK_MYRIAD2100,
6746     CK_MYRIAD2150,
6747     CK_MYRIAD2450,
6748     CK_LEON2,
6749     CK_LEON2_AT697E,
6750     CK_LEON2_AT697F,
6751     CK_LEON3,
6752     CK_LEON3_UT699,
6753     CK_LEON3_GR712RC,
6754     CK_LEON4,
6755     CK_LEON4_GR740
6756   } CPU = CK_GENERIC;
6757 
6758   enum CPUGeneration {
6759     CG_V8,
6760     CG_V9,
6761   };
6762 
6763   CPUGeneration getCPUGeneration(CPUKind Kind) const {
6764     switch (Kind) {
6765     case CK_GENERIC:
6766     case CK_V8:
6767     case CK_SUPERSPARC:
6768     case CK_SPARCLITE:
6769     case CK_F934:
6770     case CK_HYPERSPARC:
6771     case CK_SPARCLITE86X:
6772     case CK_SPARCLET:
6773     case CK_TSC701:
6774     case CK_MYRIAD2100:
6775     case CK_MYRIAD2150:
6776     case CK_MYRIAD2450:
6777     case CK_LEON2:
6778     case CK_LEON2_AT697E:
6779     case CK_LEON2_AT697F:
6780     case CK_LEON3:
6781     case CK_LEON3_UT699:
6782     case CK_LEON3_GR712RC:
6783     case CK_LEON4:
6784     case CK_LEON4_GR740:
6785       return CG_V8;
6786     case CK_V9:
6787     case CK_ULTRASPARC:
6788     case CK_ULTRASPARC3:
6789     case CK_NIAGARA:
6790     case CK_NIAGARA2:
6791     case CK_NIAGARA3:
6792     case CK_NIAGARA4:
6793       return CG_V9;
6794     }
6795     llvm_unreachable("Unexpected CPU kind");
6796   }
6797 
6798   CPUKind getCPUKind(StringRef Name) const {
6799     return llvm::StringSwitch<CPUKind>(Name)
6800         .Case("v8", CK_V8)
6801         .Case("supersparc", CK_SUPERSPARC)
6802         .Case("sparclite", CK_SPARCLITE)
6803         .Case("f934", CK_F934)
6804         .Case("hypersparc", CK_HYPERSPARC)
6805         .Case("sparclite86x", CK_SPARCLITE86X)
6806         .Case("sparclet", CK_SPARCLET)
6807         .Case("tsc701", CK_TSC701)
6808         .Case("v9", CK_V9)
6809         .Case("ultrasparc", CK_ULTRASPARC)
6810         .Case("ultrasparc3", CK_ULTRASPARC3)
6811         .Case("niagara", CK_NIAGARA)
6812         .Case("niagara2", CK_NIAGARA2)
6813         .Case("niagara3", CK_NIAGARA3)
6814         .Case("niagara4", CK_NIAGARA4)
6815         .Case("ma2100", CK_MYRIAD2100)
6816         .Case("ma2150", CK_MYRIAD2150)
6817         .Case("ma2450", CK_MYRIAD2450)
6818         // FIXME: the myriad2[.n] spellings are obsolete,
6819         // but a grace period is needed to allow updating dependent builds.
6820         .Case("myriad2", CK_MYRIAD2100)
6821         .Case("myriad2.1", CK_MYRIAD2100)
6822         .Case("myriad2.2", CK_MYRIAD2150)
6823         .Case("leon2", CK_LEON2)
6824         .Case("at697e", CK_LEON2_AT697E)
6825         .Case("at697f", CK_LEON2_AT697F)
6826         .Case("leon3", CK_LEON3)
6827         .Case("ut699", CK_LEON3_UT699)
6828         .Case("gr712rc", CK_LEON3_GR712RC)
6829         .Case("leon4", CK_LEON4)
6830         .Case("gr740", CK_LEON4_GR740)
6831         .Default(CK_GENERIC);
6832   }
6833 
6834   bool setCPU(const std::string &Name) override {
6835     CPU = getCPUKind(Name);
6836     return CPU != CK_GENERIC;
6837   }
6838 };
6839 
6840 const char * const SparcTargetInfo::GCCRegNames[] = {
6841   "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6842   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6843   "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6844   "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6845 };
6846 
6847 ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6848   return llvm::makeArrayRef(GCCRegNames);
6849 }
6850 
6851 const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
6852   { { "g0" }, "r0" },
6853   { { "g1" }, "r1" },
6854   { { "g2" }, "r2" },
6855   { { "g3" }, "r3" },
6856   { { "g4" }, "r4" },
6857   { { "g5" }, "r5" },
6858   { { "g6" }, "r6" },
6859   { { "g7" }, "r7" },
6860   { { "o0" }, "r8" },
6861   { { "o1" }, "r9" },
6862   { { "o2" }, "r10" },
6863   { { "o3" }, "r11" },
6864   { { "o4" }, "r12" },
6865   { { "o5" }, "r13" },
6866   { { "o6", "sp" }, "r14" },
6867   { { "o7" }, "r15" },
6868   { { "l0" }, "r16" },
6869   { { "l1" }, "r17" },
6870   { { "l2" }, "r18" },
6871   { { "l3" }, "r19" },
6872   { { "l4" }, "r20" },
6873   { { "l5" }, "r21" },
6874   { { "l6" }, "r22" },
6875   { { "l7" }, "r23" },
6876   { { "i0" }, "r24" },
6877   { { "i1" }, "r25" },
6878   { { "i2" }, "r26" },
6879   { { "i3" }, "r27" },
6880   { { "i4" }, "r28" },
6881   { { "i5" }, "r29" },
6882   { { "i6", "fp" }, "r30" },
6883   { { "i7" }, "r31" },
6884 };
6885 
6886 ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6887   return llvm::makeArrayRef(GCCRegAliases);
6888 }
6889 
6890 // SPARC v8 is the 32-bit mode selected by Triple::sparc.
6891 class SparcV8TargetInfo : public SparcTargetInfo {
6892 public:
6893   SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6894       : SparcTargetInfo(Triple, Opts) {
6895     resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
6896     // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6897     switch (getTriple().getOS()) {
6898     default:
6899       SizeType = UnsignedInt;
6900       IntPtrType = SignedInt;
6901       PtrDiffType = SignedInt;
6902       break;
6903     case llvm::Triple::NetBSD:
6904     case llvm::Triple::OpenBSD:
6905       SizeType = UnsignedLong;
6906       IntPtrType = SignedLong;
6907       PtrDiffType = SignedLong;
6908       break;
6909     }
6910     // Up to 32 bits are lock-free atomic, but we're willing to do atomic ops
6911     // on up to 64 bits.
6912     MaxAtomicPromoteWidth = 64;
6913     MaxAtomicInlineWidth = 32;
6914   }
6915 
6916   void getTargetDefines(const LangOptions &Opts,
6917                         MacroBuilder &Builder) const override {
6918     SparcTargetInfo::getTargetDefines(Opts, Builder);
6919     switch (getCPUGeneration(CPU)) {
6920     case CG_V8:
6921       Builder.defineMacro("__sparcv8");
6922       if (getTriple().getOS() != llvm::Triple::Solaris)
6923         Builder.defineMacro("__sparcv8__");
6924       break;
6925     case CG_V9:
6926       Builder.defineMacro("__sparcv9");
6927       if (getTriple().getOS() != llvm::Triple::Solaris) {
6928         Builder.defineMacro("__sparcv9__");
6929         Builder.defineMacro("__sparc_v9__");
6930       }
6931       break;
6932     }
6933     if (getTriple().getVendor() == llvm::Triple::Myriad) {
6934       std::string MyriadArchValue, Myriad2Value;
6935       Builder.defineMacro("__sparc_v8__");
6936       Builder.defineMacro("__leon__");
6937       switch (CPU) {
6938       case CK_MYRIAD2150:
6939         MyriadArchValue = "__ma2150";
6940         Myriad2Value = "2";
6941         break;
6942       case CK_MYRIAD2450:
6943         MyriadArchValue = "__ma2450";
6944         Myriad2Value = "2";
6945         break;
6946       default:
6947         MyriadArchValue = "__ma2100";
6948         Myriad2Value = "1";
6949         break;
6950       }
6951       Builder.defineMacro(MyriadArchValue, "1");
6952       Builder.defineMacro(MyriadArchValue+"__", "1");
6953       Builder.defineMacro("__myriad2__", Myriad2Value);
6954       Builder.defineMacro("__myriad2", Myriad2Value);
6955     }
6956   }
6957 
6958   bool hasSjLjLowering() const override {
6959     return true;
6960   }
6961 };
6962 
6963 // SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6964 class SparcV8elTargetInfo : public SparcV8TargetInfo {
6965  public:
6966    SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6967        : SparcV8TargetInfo(Triple, Opts) {
6968      resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
6969   }
6970 };
6971 
6972 // SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6973 class SparcV9TargetInfo : public SparcTargetInfo {
6974 public:
6975   SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6976       : SparcTargetInfo(Triple, Opts) {
6977     // FIXME: Support Sparc quad-precision long double?
6978     resetDataLayout("E-m:e-i64:64-n32:64-S128");
6979     // This is an LP64 platform.
6980     LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6981 
6982     // OpenBSD uses long long for int64_t and intmax_t.
6983     if (getTriple().getOS() == llvm::Triple::OpenBSD)
6984       IntMaxType = SignedLongLong;
6985     else
6986       IntMaxType = SignedLong;
6987     Int64Type = IntMaxType;
6988 
6989     // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6990     // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6991     LongDoubleWidth = 128;
6992     LongDoubleAlign = 128;
6993     LongDoubleFormat = &llvm::APFloat::IEEEquad();
6994     MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6995   }
6996 
6997   void getTargetDefines(const LangOptions &Opts,
6998                         MacroBuilder &Builder) const override {
6999     SparcTargetInfo::getTargetDefines(Opts, Builder);
7000     Builder.defineMacro("__sparcv9");
7001     Builder.defineMacro("__arch64__");
7002     // Solaris doesn't need these variants, but the BSDs do.
7003     if (getTriple().getOS() != llvm::Triple::Solaris) {
7004       Builder.defineMacro("__sparc64__");
7005       Builder.defineMacro("__sparc_v9__");
7006       Builder.defineMacro("__sparcv9__");
7007     }
7008   }
7009 
7010   bool setCPU(const std::string &Name) override {
7011     if (!SparcTargetInfo::setCPU(Name))
7012       return false;
7013     return getCPUGeneration(CPU) == CG_V9;
7014   }
7015 };
7016 
7017 class SystemZTargetInfo : public TargetInfo {
7018   static const Builtin::Info BuiltinInfo[];
7019   static const char *const GCCRegNames[];
7020   std::string CPU;
7021   bool HasTransactionalExecution;
7022   bool HasVector;
7023 
7024 public:
7025   SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7026       : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
7027         HasVector(false) {
7028     IntMaxType = SignedLong;
7029     Int64Type = SignedLong;
7030     TLSSupported = true;
7031     IntWidth = IntAlign = 32;
7032     LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
7033     PointerWidth = PointerAlign = 64;
7034     LongDoubleWidth = 128;
7035     LongDoubleAlign = 64;
7036     LongDoubleFormat = &llvm::APFloat::IEEEquad();
7037     DefaultAlignForAttributeAligned = 64;
7038     MinGlobalAlign = 16;
7039     resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64");
7040     MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7041   }
7042   void getTargetDefines(const LangOptions &Opts,
7043                         MacroBuilder &Builder) const override {
7044     Builder.defineMacro("__s390__");
7045     Builder.defineMacro("__s390x__");
7046     Builder.defineMacro("__zarch__");
7047     Builder.defineMacro("__LONG_DOUBLE_128__");
7048 
7049     const std::string ISARev = llvm::StringSwitch<std::string>(CPU)
7050                                    .Cases("arch8", "z10", "8")
7051                                    .Cases("arch9", "z196", "9")
7052                                    .Cases("arch10", "zEC12", "10")
7053                                    .Cases("arch11", "z13", "11")
7054                                    .Default("");
7055     if (!ISARev.empty())
7056       Builder.defineMacro("__ARCH__", ISARev);
7057 
7058     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7059     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7060     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
7061     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
7062 
7063     if (HasTransactionalExecution)
7064       Builder.defineMacro("__HTM__");
7065     if (HasVector)
7066       Builder.defineMacro("__VX__");
7067     if (Opts.ZVector)
7068       Builder.defineMacro("__VEC__", "10301");
7069   }
7070   ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7071     return llvm::makeArrayRef(BuiltinInfo,
7072                          clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
7073   }
7074 
7075   ArrayRef<const char *> getGCCRegNames() const override;
7076   ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7077     // No aliases.
7078     return None;
7079   }
7080   bool validateAsmConstraint(const char *&Name,
7081                              TargetInfo::ConstraintInfo &info) const override;
7082   const char *getClobbers() const override {
7083     // FIXME: Is this really right?
7084     return "";
7085   }
7086   BuiltinVaListKind getBuiltinVaListKind() const override {
7087     return TargetInfo::SystemZBuiltinVaList;
7088   }
7089   bool setCPU(const std::string &Name) override {
7090     CPU = Name;
7091     bool CPUKnown = llvm::StringSwitch<bool>(Name)
7092       .Case("z10", true)
7093       .Case("arch8", true)
7094       .Case("z196", true)
7095       .Case("arch9", true)
7096       .Case("zEC12", true)
7097       .Case("arch10", true)
7098       .Case("z13", true)
7099       .Case("arch11", true)
7100       .Default(false);
7101 
7102     return CPUKnown;
7103   }
7104   bool
7105   initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7106                  StringRef CPU,
7107                  const std::vector<std::string> &FeaturesVec) const override {
7108     if (CPU == "zEC12" || CPU == "arch10")
7109       Features["transactional-execution"] = true;
7110     if (CPU == "z13" || CPU == "arch11") {
7111       Features["transactional-execution"] = true;
7112       Features["vector"] = true;
7113     }
7114     return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7115   }
7116 
7117   bool handleTargetFeatures(std::vector<std::string> &Features,
7118                             DiagnosticsEngine &Diags) override {
7119     HasTransactionalExecution = false;
7120     for (const auto &Feature : Features) {
7121       if (Feature == "+transactional-execution")
7122         HasTransactionalExecution = true;
7123       else if (Feature == "+vector")
7124         HasVector = true;
7125     }
7126     // If we use the vector ABI, vector types are 64-bit aligned.
7127     if (HasVector) {
7128       MaxVectorAlign = 64;
7129       resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
7130                       "-v128:64-a:8:16-n32:64");
7131     }
7132     return true;
7133   }
7134 
7135   bool hasFeature(StringRef Feature) const override {
7136     return llvm::StringSwitch<bool>(Feature)
7137         .Case("systemz", true)
7138         .Case("htm", HasTransactionalExecution)
7139         .Case("vx", HasVector)
7140         .Default(false);
7141   }
7142 
7143   CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7144     switch (CC) {
7145     case CC_C:
7146     case CC_Swift:
7147       return CCCR_OK;
7148     default:
7149       return CCCR_Warning;
7150     }
7151   }
7152 
7153   StringRef getABI() const override {
7154     if (HasVector)
7155       return "vector";
7156     return "";
7157   }
7158 
7159   bool useFloat128ManglingForLongDouble() const override {
7160     return true;
7161   }
7162 };
7163 
7164 const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
7165 #define BUILTIN(ID, TYPE, ATTRS)                                               \
7166   { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7167 #define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE)                               \
7168   { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
7169 #include "clang/Basic/BuiltinsSystemZ.def"
7170 };
7171 
7172 const char *const SystemZTargetInfo::GCCRegNames[] = {
7173   "r0",  "r1",  "r2",  "r3",  "r4",  "r5",  "r6",  "r7",
7174   "r8",  "r9",  "r10", "r11", "r12", "r13", "r14", "r15",
7175   "f0",  "f2",  "f4",  "f6",  "f1",  "f3",  "f5",  "f7",
7176   "f8",  "f10", "f12", "f14", "f9",  "f11", "f13", "f15"
7177 };
7178 
7179 ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
7180   return llvm::makeArrayRef(GCCRegNames);
7181 }
7182 
7183 bool SystemZTargetInfo::
7184 validateAsmConstraint(const char *&Name,
7185                       TargetInfo::ConstraintInfo &Info) const {
7186   switch (*Name) {
7187   default:
7188     return false;
7189 
7190   case 'a': // Address register
7191   case 'd': // Data register (equivalent to 'r')
7192   case 'f': // Floating-point register
7193     Info.setAllowsRegister();
7194     return true;
7195 
7196   case 'I': // Unsigned 8-bit constant
7197   case 'J': // Unsigned 12-bit constant
7198   case 'K': // Signed 16-bit constant
7199   case 'L': // Signed 20-bit displacement (on all targets we support)
7200   case 'M': // 0x7fffffff
7201     return true;
7202 
7203   case 'Q': // Memory with base and unsigned 12-bit displacement
7204   case 'R': // Likewise, plus an index
7205   case 'S': // Memory with base and signed 20-bit displacement
7206   case 'T': // Likewise, plus an index
7207     Info.setAllowsMemory();
7208     return true;
7209   }
7210 }
7211 
7212 class MSP430TargetInfo : public TargetInfo {
7213   static const char *const GCCRegNames[];
7214 
7215 public:
7216   MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7217       : TargetInfo(Triple) {
7218     TLSSupported = false;
7219     IntWidth = 16;
7220     IntAlign = 16;
7221     LongWidth = 32;
7222     LongLongWidth = 64;
7223     LongAlign = LongLongAlign = 16;
7224     PointerWidth = 16;
7225     PointerAlign = 16;
7226     SuitableAlign = 16;
7227     SizeType = UnsignedInt;
7228     IntMaxType = SignedLongLong;
7229     IntPtrType = SignedInt;
7230     PtrDiffType = SignedInt;
7231     SigAtomicType = SignedLong;
7232     resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
7233   }
7234   void getTargetDefines(const LangOptions &Opts,
7235                         MacroBuilder &Builder) const override {
7236     Builder.defineMacro("MSP430");
7237     Builder.defineMacro("__MSP430__");
7238     // FIXME: defines for different 'flavours' of MCU
7239   }
7240   ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7241     // FIXME: Implement.
7242     return None;
7243   }
7244   bool hasFeature(StringRef Feature) const override {
7245     return Feature == "msp430";
7246   }
7247   ArrayRef<const char *> getGCCRegNames() const override;
7248   ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7249     // No aliases.
7250     return None;
7251   }
7252   bool validateAsmConstraint(const char *&Name,
7253                              TargetInfo::ConstraintInfo &info) const override {
7254     // FIXME: implement
7255     switch (*Name) {
7256     case 'K': // the constant 1
7257     case 'L': // constant -1^20 .. 1^19
7258     case 'M': // constant 1-4:
7259       return true;
7260     }
7261     // No target constraints for now.
7262     return false;
7263   }
7264   const char *getClobbers() const override {
7265     // FIXME: Is this really right?
7266     return "";
7267   }
7268   BuiltinVaListKind getBuiltinVaListKind() const override {
7269     // FIXME: implement
7270     return TargetInfo::CharPtrBuiltinVaList;
7271   }
7272 };
7273 
7274 const char *const MSP430TargetInfo::GCCRegNames[] = {
7275     "r0", "r1", "r2",  "r3",  "r4",  "r5",  "r6",  "r7",
7276     "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7277 
7278 ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7279   return llvm::makeArrayRef(GCCRegNames);
7280 }
7281 
7282 // LLVM and Clang cannot be used directly to output native binaries for
7283 // target, but is used to compile C code to llvm bitcode with correct
7284 // type and alignment information.
7285 //
7286 // TCE uses the llvm bitcode as input and uses it for generating customized
7287 // target processor and program binary. TCE co-design environment is
7288 // publicly available in http://tce.cs.tut.fi
7289 
7290 static const unsigned TCEOpenCLAddrSpaceMap[] = {
7291     3, // opencl_global
7292     4, // opencl_local
7293     5, // opencl_constant
7294     // FIXME: generic has to be added to the target
7295     0, // opencl_generic
7296     0, // cuda_device
7297     0, // cuda_constant
7298     0  // cuda_shared
7299 };
7300 
7301 class TCETargetInfo : public TargetInfo {
7302 public:
7303   TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7304       : TargetInfo(Triple) {
7305     TLSSupported = false;
7306     IntWidth = 32;
7307     LongWidth = LongLongWidth = 32;
7308     PointerWidth = 32;
7309     IntAlign = 32;
7310     LongAlign = LongLongAlign = 32;
7311     PointerAlign = 32;
7312     SuitableAlign = 32;
7313     SizeType = UnsignedInt;
7314     IntMaxType = SignedLong;
7315     IntPtrType = SignedInt;
7316     PtrDiffType = SignedInt;
7317     FloatWidth = 32;
7318     FloatAlign = 32;
7319     DoubleWidth = 32;
7320     DoubleAlign = 32;
7321     LongDoubleWidth = 32;
7322     LongDoubleAlign = 32;
7323     FloatFormat = &llvm::APFloat::IEEEsingle();
7324     DoubleFormat = &llvm::APFloat::IEEEsingle();
7325     LongDoubleFormat = &llvm::APFloat::IEEEsingle();
7326     resetDataLayout("E-p:32:32:32-i1:8:8-i8:8:32-"
7327                     "i16:16:32-i32:32:32-i64:32:32-"
7328                     "f32:32:32-f64:32:32-v64:32:32-"
7329                     "v128:32:32-v256:32:32-v512:32:32-"
7330                     "v1024:32:32-a0:0:32-n32");
7331     AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7332     UseAddrSpaceMapMangling = true;
7333   }
7334 
7335   void getTargetDefines(const LangOptions &Opts,
7336                         MacroBuilder &Builder) const override {
7337     DefineStd(Builder, "tce", Opts);
7338     Builder.defineMacro("__TCE__");
7339     Builder.defineMacro("__TCE_V1__");
7340   }
7341   bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7342 
7343   ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
7344   const char *getClobbers() const override { return ""; }
7345   BuiltinVaListKind getBuiltinVaListKind() const override {
7346     return TargetInfo::VoidPtrBuiltinVaList;
7347   }
7348   ArrayRef<const char *> getGCCRegNames() const override { return None; }
7349   bool validateAsmConstraint(const char *&Name,
7350                              TargetInfo::ConstraintInfo &info) const override {
7351     return true;
7352   }
7353   ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7354     return None;
7355   }
7356 };
7357 
7358 class TCELETargetInfo : public TCETargetInfo {
7359 public:
7360   TCELETargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7361       : TCETargetInfo(Triple, Opts) {
7362     BigEndian = false;
7363 
7364     resetDataLayout("e-p:32:32:32-i1:8:8-i8:8:32-"
7365                     "i16:16:32-i32:32:32-i64:32:32-"
7366                     "f32:32:32-f64:32:32-v64:32:32-"
7367                     "v128:32:32-v256:32:32-v512:32:32-"
7368                     "v1024:32:32-a0:0:32-n32");
7369 
7370   }
7371 
7372   virtual void getTargetDefines(const LangOptions &Opts,
7373                                 MacroBuilder &Builder) const {
7374     DefineStd(Builder, "tcele", Opts);
7375     Builder.defineMacro("__TCE__");
7376     Builder.defineMacro("__TCE_V1__");
7377     Builder.defineMacro("__TCELE__");
7378     Builder.defineMacro("__TCELE_V1__");
7379   }
7380 
7381 };
7382 
7383 class BPFTargetInfo : public TargetInfo {
7384 public:
7385   BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7386       : TargetInfo(Triple) {
7387     LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7388     SizeType    = UnsignedLong;
7389     PtrDiffType = SignedLong;
7390     IntPtrType  = SignedLong;
7391     IntMaxType  = SignedLong;
7392     Int64Type   = SignedLong;
7393     RegParmMax = 5;
7394     if (Triple.getArch() == llvm::Triple::bpfeb) {
7395       resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
7396     } else {
7397       resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
7398     }
7399     MaxAtomicPromoteWidth = 64;
7400     MaxAtomicInlineWidth = 64;
7401     TLSSupported = false;
7402   }
7403   void getTargetDefines(const LangOptions &Opts,
7404                         MacroBuilder &Builder) const override {
7405     DefineStd(Builder, "bpf", Opts);
7406     Builder.defineMacro("__BPF__");
7407   }
7408   bool hasFeature(StringRef Feature) const override {
7409     return Feature == "bpf";
7410   }
7411 
7412   ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
7413   const char *getClobbers() const override {
7414     return "";
7415   }
7416   BuiltinVaListKind getBuiltinVaListKind() const override {
7417     return TargetInfo::VoidPtrBuiltinVaList;
7418   }
7419   ArrayRef<const char *> getGCCRegNames() const override {
7420     return None;
7421   }
7422   bool validateAsmConstraint(const char *&Name,
7423                              TargetInfo::ConstraintInfo &info) const override {
7424     return true;
7425   }
7426   ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7427     return None;
7428   }
7429 };
7430 
7431 class MipsTargetInfo : public TargetInfo {
7432   void setDataLayout() {
7433     StringRef Layout;
7434 
7435     if (ABI == "o32")
7436       Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7437     else if (ABI == "n32")
7438       Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
7439     else if (ABI == "n64")
7440       Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
7441     else
7442       llvm_unreachable("Invalid ABI");
7443 
7444     if (BigEndian)
7445       resetDataLayout(("E-" + Layout).str());
7446     else
7447       resetDataLayout(("e-" + Layout).str());
7448   }
7449 
7450 
7451   static const Builtin::Info BuiltinInfo[];
7452   std::string CPU;
7453   bool IsMips16;
7454   bool IsMicromips;
7455   bool IsNan2008;
7456   bool IsSingleFloat;
7457   enum MipsFloatABI {
7458     HardFloat, SoftFloat
7459   } FloatABI;
7460   enum DspRevEnum {
7461     NoDSP, DSP1, DSP2
7462   } DspRev;
7463   bool HasMSA;
7464 
7465 protected:
7466   bool HasFP64;
7467   std::string ABI;
7468 
7469 public:
7470   MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7471       : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
7472         IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
7473         DspRev(NoDSP), HasMSA(false), HasFP64(false) {
7474     TheCXXABI.set(TargetCXXABI::GenericMIPS);
7475 
7476     setABI((getTriple().getArch() == llvm::Triple::mips ||
7477             getTriple().getArch() == llvm::Triple::mipsel)
7478                ? "o32"
7479                : "n64");
7480 
7481     CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
7482   }
7483 
7484   bool isNaN2008Default() const {
7485     return CPU == "mips32r6" || CPU == "mips64r6";
7486   }
7487 
7488   bool isFP64Default() const {
7489     return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7490   }
7491 
7492   bool isNan2008() const override {
7493     return IsNan2008;
7494   }
7495 
7496   bool processorSupportsGPR64() const {
7497     return llvm::StringSwitch<bool>(CPU)
7498         .Case("mips3", true)
7499         .Case("mips4", true)
7500         .Case("mips5", true)
7501         .Case("mips64", true)
7502         .Case("mips64r2", true)
7503         .Case("mips64r3", true)
7504         .Case("mips64r5", true)
7505         .Case("mips64r6", true)
7506         .Case("octeon", true)
7507         .Default(false);
7508     return false;
7509   }
7510 
7511   StringRef getABI() const override { return ABI; }
7512   bool setABI(const std::string &Name) override {
7513     if (Name == "o32") {
7514       setO32ABITypes();
7515       ABI = Name;
7516       return true;
7517     }
7518 
7519     if (Name == "n32") {
7520       setN32ABITypes();
7521       ABI = Name;
7522       return true;
7523     }
7524     if (Name == "n64") {
7525       setN64ABITypes();
7526       ABI = Name;
7527       return true;
7528     }
7529     return false;
7530   }
7531 
7532   void setO32ABITypes() {
7533     Int64Type = SignedLongLong;
7534     IntMaxType = Int64Type;
7535     LongDoubleFormat = &llvm::APFloat::IEEEdouble();
7536     LongDoubleWidth = LongDoubleAlign = 64;
7537     LongWidth = LongAlign = 32;
7538     MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7539     PointerWidth = PointerAlign = 32;
7540     PtrDiffType = SignedInt;
7541     SizeType = UnsignedInt;
7542     SuitableAlign = 64;
7543   }
7544 
7545   void setN32N64ABITypes() {
7546     LongDoubleWidth = LongDoubleAlign = 128;
7547     LongDoubleFormat = &llvm::APFloat::IEEEquad();
7548     if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7549       LongDoubleWidth = LongDoubleAlign = 64;
7550       LongDoubleFormat = &llvm::APFloat::IEEEdouble();
7551     }
7552     MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7553     SuitableAlign = 128;
7554   }
7555 
7556   void setN64ABITypes() {
7557     setN32N64ABITypes();
7558     Int64Type = SignedLong;
7559     IntMaxType = Int64Type;
7560     LongWidth = LongAlign = 64;
7561     PointerWidth = PointerAlign = 64;
7562     PtrDiffType = SignedLong;
7563     SizeType = UnsignedLong;
7564   }
7565 
7566   void setN32ABITypes() {
7567     setN32N64ABITypes();
7568     Int64Type = SignedLongLong;
7569     IntMaxType = Int64Type;
7570     LongWidth = LongAlign = 32;
7571     PointerWidth = PointerAlign = 32;
7572     PtrDiffType = SignedInt;
7573     SizeType = UnsignedInt;
7574   }
7575 
7576   bool setCPU(const std::string &Name) override {
7577     CPU = Name;
7578     return llvm::StringSwitch<bool>(Name)
7579         .Case("mips1", true)
7580         .Case("mips2", true)
7581         .Case("mips3", true)
7582         .Case("mips4", true)
7583         .Case("mips5", true)
7584         .Case("mips32", true)
7585         .Case("mips32r2", true)
7586         .Case("mips32r3", true)
7587         .Case("mips32r5", true)
7588         .Case("mips32r6", true)
7589         .Case("mips64", true)
7590         .Case("mips64r2", true)
7591         .Case("mips64r3", true)
7592         .Case("mips64r5", true)
7593         .Case("mips64r6", true)
7594         .Case("octeon", true)
7595         .Case("p5600", true)
7596         .Default(false);
7597   }
7598   const std::string& getCPU() const { return CPU; }
7599   bool
7600   initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7601                  StringRef CPU,
7602                  const std::vector<std::string> &FeaturesVec) const override {
7603     if (CPU.empty())
7604       CPU = getCPU();
7605     if (CPU == "octeon")
7606       Features["mips64r2"] = Features["cnmips"] = true;
7607     else
7608       Features[CPU] = true;
7609     return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7610   }
7611 
7612   void getTargetDefines(const LangOptions &Opts,
7613                         MacroBuilder &Builder) const override {
7614     if (BigEndian) {
7615       DefineStd(Builder, "MIPSEB", Opts);
7616       Builder.defineMacro("_MIPSEB");
7617     } else {
7618       DefineStd(Builder, "MIPSEL", Opts);
7619       Builder.defineMacro("_MIPSEL");
7620     }
7621 
7622     Builder.defineMacro("__mips__");
7623     Builder.defineMacro("_mips");
7624     if (Opts.GNUMode)
7625       Builder.defineMacro("mips");
7626 
7627     if (ABI == "o32") {
7628       Builder.defineMacro("__mips", "32");
7629       Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7630     } else {
7631       Builder.defineMacro("__mips", "64");
7632       Builder.defineMacro("__mips64");
7633       Builder.defineMacro("__mips64__");
7634       Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7635     }
7636 
7637     const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7638                                    .Cases("mips32", "mips64", "1")
7639                                    .Cases("mips32r2", "mips64r2", "2")
7640                                    .Cases("mips32r3", "mips64r3", "3")
7641                                    .Cases("mips32r5", "mips64r5", "5")
7642                                    .Cases("mips32r6", "mips64r6", "6")
7643                                    .Default("");
7644     if (!ISARev.empty())
7645       Builder.defineMacro("__mips_isa_rev", ISARev);
7646 
7647     if (ABI == "o32") {
7648       Builder.defineMacro("__mips_o32");
7649       Builder.defineMacro("_ABIO32", "1");
7650       Builder.defineMacro("_MIPS_SIM", "_ABIO32");
7651     } else if (ABI == "n32") {
7652       Builder.defineMacro("__mips_n32");
7653       Builder.defineMacro("_ABIN32", "2");
7654       Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7655     } else if (ABI == "n64") {
7656       Builder.defineMacro("__mips_n64");
7657       Builder.defineMacro("_ABI64", "3");
7658       Builder.defineMacro("_MIPS_SIM", "_ABI64");
7659     } else
7660       llvm_unreachable("Invalid ABI.");
7661 
7662     Builder.defineMacro("__REGISTER_PREFIX__", "");
7663 
7664     switch (FloatABI) {
7665     case HardFloat:
7666       Builder.defineMacro("__mips_hard_float", Twine(1));
7667       break;
7668     case SoftFloat:
7669       Builder.defineMacro("__mips_soft_float", Twine(1));
7670       break;
7671     }
7672 
7673     if (IsSingleFloat)
7674       Builder.defineMacro("__mips_single_float", Twine(1));
7675 
7676     Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7677     Builder.defineMacro("_MIPS_FPSET",
7678                         Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7679 
7680     if (IsMips16)
7681       Builder.defineMacro("__mips16", Twine(1));
7682 
7683     if (IsMicromips)
7684       Builder.defineMacro("__mips_micromips", Twine(1));
7685 
7686     if (IsNan2008)
7687       Builder.defineMacro("__mips_nan2008", Twine(1));
7688 
7689     switch (DspRev) {
7690     default:
7691       break;
7692     case DSP1:
7693       Builder.defineMacro("__mips_dsp_rev", Twine(1));
7694       Builder.defineMacro("__mips_dsp", Twine(1));
7695       break;
7696     case DSP2:
7697       Builder.defineMacro("__mips_dsp_rev", Twine(2));
7698       Builder.defineMacro("__mips_dspr2", Twine(1));
7699       Builder.defineMacro("__mips_dsp", Twine(1));
7700       break;
7701     }
7702 
7703     if (HasMSA)
7704       Builder.defineMacro("__mips_msa", Twine(1));
7705 
7706     Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7707     Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7708     Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
7709 
7710     Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7711     Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
7712 
7713     // These shouldn't be defined for MIPS-I but there's no need to check
7714     // for that since MIPS-I isn't supported.
7715     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7716     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7717     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
7718 
7719     // 32-bit MIPS processors don't have the necessary lld/scd instructions
7720     // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7721     // the instructions exist but using them violates the ABI since they
7722     // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7723     if (ABI == "n32" || ABI == "n64")
7724       Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
7725   }
7726 
7727   ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7728     return llvm::makeArrayRef(BuiltinInfo,
7729                           clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
7730   }
7731   bool hasFeature(StringRef Feature) const override {
7732     return llvm::StringSwitch<bool>(Feature)
7733       .Case("mips", true)
7734       .Case("fp64", HasFP64)
7735       .Default(false);
7736   }
7737   BuiltinVaListKind getBuiltinVaListKind() const override {
7738     return TargetInfo::VoidPtrBuiltinVaList;
7739   }
7740   ArrayRef<const char *> getGCCRegNames() const override {
7741     static const char *const GCCRegNames[] = {
7742       // CPU register names
7743       // Must match second column of GCCRegAliases
7744       "$0",   "$1",   "$2",   "$3",   "$4",   "$5",   "$6",   "$7",
7745       "$8",   "$9",   "$10",  "$11",  "$12",  "$13",  "$14",  "$15",
7746       "$16",  "$17",  "$18",  "$19",  "$20",  "$21",  "$22",  "$23",
7747       "$24",  "$25",  "$26",  "$27",  "$28",  "$29",  "$30",  "$31",
7748       // Floating point register names
7749       "$f0",  "$f1",  "$f2",  "$f3",  "$f4",  "$f5",  "$f6",  "$f7",
7750       "$f8",  "$f9",  "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7751       "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7752       "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
7753       // Hi/lo and condition register names
7754       "hi",   "lo",   "",     "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
7755       "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7756       "$ac3hi","$ac3lo",
7757       // MSA register names
7758       "$w0",  "$w1",  "$w2",  "$w3",  "$w4",  "$w5",  "$w6",  "$w7",
7759       "$w8",  "$w9",  "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7760       "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7761       "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7762       // MSA control register names
7763       "$msair",      "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7764       "$msarequest", "$msamap", "$msaunmap"
7765     };
7766     return llvm::makeArrayRef(GCCRegNames);
7767   }
7768   bool validateAsmConstraint(const char *&Name,
7769                              TargetInfo::ConstraintInfo &Info) const override {
7770     switch (*Name) {
7771     default:
7772       return false;
7773     case 'r': // CPU registers.
7774     case 'd': // Equivalent to "r" unless generating MIPS16 code.
7775     case 'y': // Equivalent to "r", backward compatibility only.
7776     case 'f': // floating-point registers.
7777     case 'c': // $25 for indirect jumps
7778     case 'l': // lo register
7779     case 'x': // hilo register pair
7780       Info.setAllowsRegister();
7781       return true;
7782     case 'I': // Signed 16-bit constant
7783     case 'J': // Integer 0
7784     case 'K': // Unsigned 16-bit constant
7785     case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7786     case 'M': // Constants not loadable via lui, addiu, or ori
7787     case 'N': // Constant -1 to -65535
7788     case 'O': // A signed 15-bit constant
7789     case 'P': // A constant between 1 go 65535
7790       return true;
7791     case 'R': // An address that can be used in a non-macro load or store
7792       Info.setAllowsMemory();
7793       return true;
7794     case 'Z':
7795       if (Name[1] == 'C') { // An address usable by ll, and sc.
7796         Info.setAllowsMemory();
7797         Name++; // Skip over 'Z'.
7798         return true;
7799       }
7800       return false;
7801     }
7802   }
7803 
7804   std::string convertConstraint(const char *&Constraint) const override {
7805     std::string R;
7806     switch (*Constraint) {
7807     case 'Z': // Two-character constraint; add "^" hint for later parsing.
7808       if (Constraint[1] == 'C') {
7809         R = std::string("^") + std::string(Constraint, 2);
7810         Constraint++;
7811         return R;
7812       }
7813       break;
7814     }
7815     return TargetInfo::convertConstraint(Constraint);
7816   }
7817 
7818   const char *getClobbers() const override {
7819     // In GCC, $1 is not widely used in generated code (it's used only in a few
7820     // specific situations), so there is no real need for users to add it to
7821     // the clobbers list if they want to use it in their inline assembly code.
7822     //
7823     // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7824     // code generation, so using it in inline assembly without adding it to the
7825     // clobbers list can cause conflicts between the inline assembly code and
7826     // the surrounding generated code.
7827     //
7828     // Another problem is that LLVM is allowed to choose $1 for inline assembly
7829     // operands, which will conflict with the ".set at" assembler option (which
7830     // we use only for inline assembly, in order to maintain compatibility with
7831     // GCC) and will also conflict with the user's usage of $1.
7832     //
7833     // The easiest way to avoid these conflicts and keep $1 as an allocatable
7834     // register for generated code is to automatically clobber $1 for all inline
7835     // assembly code.
7836     //
7837     // FIXME: We should automatically clobber $1 only for inline assembly code
7838     // which actually uses it. This would allow LLVM to use $1 for inline
7839     // assembly operands if the user's assembly code doesn't use it.
7840     return "~{$1}";
7841   }
7842 
7843   bool handleTargetFeatures(std::vector<std::string> &Features,
7844                             DiagnosticsEngine &Diags) override {
7845     IsMips16 = false;
7846     IsMicromips = false;
7847     IsNan2008 = isNaN2008Default();
7848     IsSingleFloat = false;
7849     FloatABI = HardFloat;
7850     DspRev = NoDSP;
7851     HasFP64 = isFP64Default();
7852 
7853     for (const auto &Feature : Features) {
7854       if (Feature == "+single-float")
7855         IsSingleFloat = true;
7856       else if (Feature == "+soft-float")
7857         FloatABI = SoftFloat;
7858       else if (Feature == "+mips16")
7859         IsMips16 = true;
7860       else if (Feature == "+micromips")
7861         IsMicromips = true;
7862       else if (Feature == "+dsp")
7863         DspRev = std::max(DspRev, DSP1);
7864       else if (Feature == "+dspr2")
7865         DspRev = std::max(DspRev, DSP2);
7866       else if (Feature == "+msa")
7867         HasMSA = true;
7868       else if (Feature == "+fp64")
7869         HasFP64 = true;
7870       else if (Feature == "-fp64")
7871         HasFP64 = false;
7872       else if (Feature == "+nan2008")
7873         IsNan2008 = true;
7874       else if (Feature == "-nan2008")
7875         IsNan2008 = false;
7876     }
7877 
7878     setDataLayout();
7879 
7880     return true;
7881   }
7882 
7883   int getEHDataRegisterNumber(unsigned RegNo) const override {
7884     if (RegNo == 0) return 4;
7885     if (RegNo == 1) return 5;
7886     return -1;
7887   }
7888 
7889   bool isCLZForZeroUndef() const override { return false; }
7890 
7891   ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7892     static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7893         {{"at"}, "$1"},  {{"v0"}, "$2"},         {{"v1"}, "$3"},
7894         {{"a0"}, "$4"},  {{"a1"}, "$5"},         {{"a2"}, "$6"},
7895         {{"a3"}, "$7"},  {{"t0"}, "$8"},         {{"t1"}, "$9"},
7896         {{"t2"}, "$10"}, {{"t3"}, "$11"},        {{"t4"}, "$12"},
7897         {{"t5"}, "$13"}, {{"t6"}, "$14"},        {{"t7"}, "$15"},
7898         {{"s0"}, "$16"}, {{"s1"}, "$17"},        {{"s2"}, "$18"},
7899         {{"s3"}, "$19"}, {{"s4"}, "$20"},        {{"s5"}, "$21"},
7900         {{"s6"}, "$22"}, {{"s7"}, "$23"},        {{"t8"}, "$24"},
7901         {{"t9"}, "$25"}, {{"k0"}, "$26"},        {{"k1"}, "$27"},
7902         {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7903         {{"ra"}, "$31"}};
7904     static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7905         {{"at"}, "$1"},  {{"v0"}, "$2"},         {{"v1"}, "$3"},
7906         {{"a0"}, "$4"},  {{"a1"}, "$5"},         {{"a2"}, "$6"},
7907         {{"a3"}, "$7"},  {{"a4"}, "$8"},         {{"a5"}, "$9"},
7908         {{"a6"}, "$10"}, {{"a7"}, "$11"},        {{"t0"}, "$12"},
7909         {{"t1"}, "$13"}, {{"t2"}, "$14"},        {{"t3"}, "$15"},
7910         {{"s0"}, "$16"}, {{"s1"}, "$17"},        {{"s2"}, "$18"},
7911         {{"s3"}, "$19"}, {{"s4"}, "$20"},        {{"s5"}, "$21"},
7912         {{"s6"}, "$22"}, {{"s7"}, "$23"},        {{"t8"}, "$24"},
7913         {{"t9"}, "$25"}, {{"k0"}, "$26"},        {{"k1"}, "$27"},
7914         {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7915         {{"ra"}, "$31"}};
7916     if (ABI == "o32")
7917       return llvm::makeArrayRef(O32RegAliases);
7918     return llvm::makeArrayRef(NewABIRegAliases);
7919   }
7920 
7921   bool hasInt128Type() const override {
7922     return ABI == "n32" || ABI == "n64";
7923   }
7924 
7925   bool validateTarget(DiagnosticsEngine &Diags) const override {
7926     // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
7927     //        this yet. It's better to fail here than on the backend assertion.
7928     if (processorSupportsGPR64() && ABI == "o32") {
7929       Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7930       return false;
7931     }
7932 
7933     // 64-bit ABI's require 64-bit CPU's.
7934     if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
7935       Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7936       return false;
7937     }
7938 
7939     // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
7940     //        can't handle this yet. It's better to fail here than on the
7941     //        backend assertion.
7942     if ((getTriple().getArch() == llvm::Triple::mips64 ||
7943          getTriple().getArch() == llvm::Triple::mips64el) &&
7944         ABI == "o32") {
7945       Diags.Report(diag::err_target_unsupported_abi_for_triple)
7946           << ABI << getTriple().str();
7947       return false;
7948     }
7949 
7950     // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
7951     //        can't handle this yet. It's better to fail here than on the
7952     //        backend assertion.
7953     if ((getTriple().getArch() == llvm::Triple::mips ||
7954          getTriple().getArch() == llvm::Triple::mipsel) &&
7955         (ABI == "n32" || ABI == "n64")) {
7956       Diags.Report(diag::err_target_unsupported_abi_for_triple)
7957           << ABI << getTriple().str();
7958       return false;
7959     }
7960 
7961     return true;
7962   }
7963 };
7964 
7965 const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
7966 #define BUILTIN(ID, TYPE, ATTRS) \
7967   { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7968 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7969   { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7970 #include "clang/Basic/BuiltinsMips.def"
7971 };
7972 
7973 class PNaClTargetInfo : public TargetInfo {
7974 public:
7975   PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7976       : TargetInfo(Triple) {
7977     this->LongAlign = 32;
7978     this->LongWidth = 32;
7979     this->PointerAlign = 32;
7980     this->PointerWidth = 32;
7981     this->IntMaxType = TargetInfo::SignedLongLong;
7982     this->Int64Type = TargetInfo::SignedLongLong;
7983     this->DoubleAlign = 64;
7984     this->LongDoubleWidth = 64;
7985     this->LongDoubleAlign = 64;
7986     this->SizeType = TargetInfo::UnsignedInt;
7987     this->PtrDiffType = TargetInfo::SignedInt;
7988     this->IntPtrType = TargetInfo::SignedInt;
7989     this->RegParmMax = 0; // Disallow regparm
7990   }
7991 
7992   void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
7993     Builder.defineMacro("__le32__");
7994     Builder.defineMacro("__pnacl__");
7995   }
7996   void getTargetDefines(const LangOptions &Opts,
7997                         MacroBuilder &Builder) const override {
7998     getArchDefines(Opts, Builder);
7999   }
8000   bool hasFeature(StringRef Feature) const override {
8001     return Feature == "pnacl";
8002   }
8003   ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
8004   BuiltinVaListKind getBuiltinVaListKind() const override {
8005     return TargetInfo::PNaClABIBuiltinVaList;
8006   }
8007   ArrayRef<const char *> getGCCRegNames() const override;
8008   ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
8009   bool validateAsmConstraint(const char *&Name,
8010                              TargetInfo::ConstraintInfo &Info) const override {
8011     return false;
8012   }
8013 
8014   const char *getClobbers() const override {
8015     return "";
8016   }
8017 };
8018 
8019 ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
8020   return None;
8021 }
8022 
8023 ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
8024   return None;
8025 }
8026 
8027 // We attempt to use PNaCl (le32) frontend and Mips32EL backend.
8028 class NaClMips32TargetInfo : public MipsTargetInfo {
8029 public:
8030   NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8031       : MipsTargetInfo(Triple, Opts) {}
8032 
8033   BuiltinVaListKind getBuiltinVaListKind() const override {
8034     return TargetInfo::PNaClABIBuiltinVaList;
8035   }
8036 };
8037 
8038 class Le64TargetInfo : public TargetInfo {
8039   static const Builtin::Info BuiltinInfo[];
8040 
8041 public:
8042   Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8043       : TargetInfo(Triple) {
8044     NoAsmVariants = true;
8045     LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
8046     MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
8047     resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
8048   }
8049 
8050   void getTargetDefines(const LangOptions &Opts,
8051                         MacroBuilder &Builder) const override {
8052     DefineStd(Builder, "unix", Opts);
8053     defineCPUMacros(Builder, "le64", /*Tuning=*/false);
8054     Builder.defineMacro("__ELF__");
8055   }
8056   ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8057     return llvm::makeArrayRef(BuiltinInfo,
8058                           clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
8059   }
8060   BuiltinVaListKind getBuiltinVaListKind() const override {
8061     return TargetInfo::PNaClABIBuiltinVaList;
8062   }
8063   const char *getClobbers() const override { return ""; }
8064   ArrayRef<const char *> getGCCRegNames() const override {
8065     return None;
8066   }
8067   ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8068     return None;
8069   }
8070   bool validateAsmConstraint(const char *&Name,
8071                              TargetInfo::ConstraintInfo &Info) const override {
8072     return false;
8073   }
8074 
8075   bool hasProtectedVisibility() const override { return false; }
8076 };
8077 
8078 class WebAssemblyTargetInfo : public TargetInfo {
8079   static const Builtin::Info BuiltinInfo[];
8080 
8081   enum SIMDEnum {
8082     NoSIMD,
8083     SIMD128,
8084   } SIMDLevel;
8085 
8086 public:
8087   explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
8088       : TargetInfo(T), SIMDLevel(NoSIMD) {
8089     NoAsmVariants = true;
8090     SuitableAlign = 128;
8091     LargeArrayMinWidth = 128;
8092     LargeArrayAlign = 128;
8093     SimdDefaultAlign = 128;
8094     SigAtomicType = SignedLong;
8095     LongDoubleWidth = LongDoubleAlign = 128;
8096     LongDoubleFormat = &llvm::APFloat::IEEEquad();
8097     SizeType = UnsignedInt;
8098     PtrDiffType = SignedInt;
8099     IntPtrType = SignedInt;
8100   }
8101 
8102 protected:
8103   void getTargetDefines(const LangOptions &Opts,
8104                         MacroBuilder &Builder) const override {
8105     defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
8106     if (SIMDLevel >= SIMD128)
8107       Builder.defineMacro("__wasm_simd128__");
8108   }
8109 
8110 private:
8111   bool
8112   initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
8113                  StringRef CPU,
8114                  const std::vector<std::string> &FeaturesVec) const override {
8115     if (CPU == "bleeding-edge")
8116       Features["simd128"] = true;
8117     return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
8118   }
8119   bool hasFeature(StringRef Feature) const final {
8120     return llvm::StringSwitch<bool>(Feature)
8121         .Case("simd128", SIMDLevel >= SIMD128)
8122         .Default(false);
8123   }
8124   bool handleTargetFeatures(std::vector<std::string> &Features,
8125                             DiagnosticsEngine &Diags) final {
8126     for (const auto &Feature : Features) {
8127       if (Feature == "+simd128") {
8128         SIMDLevel = std::max(SIMDLevel, SIMD128);
8129         continue;
8130       }
8131       if (Feature == "-simd128") {
8132         SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
8133         continue;
8134       }
8135 
8136       Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
8137                                                      << "-target-feature";
8138       return false;
8139     }
8140     return true;
8141   }
8142   bool setCPU(const std::string &Name) final {
8143     return llvm::StringSwitch<bool>(Name)
8144               .Case("mvp",           true)
8145               .Case("bleeding-edge", true)
8146               .Case("generic",       true)
8147               .Default(false);
8148   }
8149   ArrayRef<Builtin::Info> getTargetBuiltins() const final {
8150     return llvm::makeArrayRef(BuiltinInfo,
8151                    clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
8152   }
8153   BuiltinVaListKind getBuiltinVaListKind() const final {
8154     return VoidPtrBuiltinVaList;
8155   }
8156   ArrayRef<const char *> getGCCRegNames() const final {
8157     return None;
8158   }
8159   ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
8160     return None;
8161   }
8162   bool
8163   validateAsmConstraint(const char *&Name,
8164                         TargetInfo::ConstraintInfo &Info) const final {
8165     return false;
8166   }
8167   const char *getClobbers() const final { return ""; }
8168   bool isCLZForZeroUndef() const final { return false; }
8169   bool hasInt128Type() const final { return true; }
8170   IntType getIntTypeByWidth(unsigned BitWidth,
8171                             bool IsSigned) const final {
8172     // WebAssembly prefers long long for explicitly 64-bit integers.
8173     return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8174                           : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8175   }
8176   IntType getLeastIntTypeByWidth(unsigned BitWidth,
8177                                  bool IsSigned) const final {
8178     // WebAssembly uses long long for int_least64_t and int_fast64_t.
8179     return BitWidth == 64
8180                ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8181                : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8182   }
8183 };
8184 
8185 const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
8186 #define BUILTIN(ID, TYPE, ATTRS) \
8187   { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8188 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8189   { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
8190 #include "clang/Basic/BuiltinsWebAssembly.def"
8191 };
8192 
8193 class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
8194 public:
8195   explicit WebAssembly32TargetInfo(const llvm::Triple &T,
8196                                    const TargetOptions &Opts)
8197       : WebAssemblyTargetInfo(T, Opts) {
8198     MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
8199     resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
8200   }
8201 
8202 protected:
8203   void getTargetDefines(const LangOptions &Opts,
8204                         MacroBuilder &Builder) const override {
8205     WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8206     defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
8207   }
8208 };
8209 
8210 class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
8211 public:
8212   explicit WebAssembly64TargetInfo(const llvm::Triple &T,
8213                                    const TargetOptions &Opts)
8214       : WebAssemblyTargetInfo(T, Opts) {
8215     LongAlign = LongWidth = 64;
8216     PointerAlign = PointerWidth = 64;
8217     MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
8218     SizeType = UnsignedLong;
8219     PtrDiffType = SignedLong;
8220     IntPtrType = SignedLong;
8221     resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
8222   }
8223 
8224 protected:
8225   void getTargetDefines(const LangOptions &Opts,
8226                         MacroBuilder &Builder) const override {
8227     WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8228     defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
8229   }
8230 };
8231 
8232 const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
8233 #define BUILTIN(ID, TYPE, ATTRS)                                               \
8234   { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8235 #include "clang/Basic/BuiltinsLe64.def"
8236 };
8237 
8238 static const unsigned SPIRAddrSpaceMap[] = {
8239     1, // opencl_global
8240     3, // opencl_local
8241     2, // opencl_constant
8242     4, // opencl_generic
8243     0, // cuda_device
8244     0, // cuda_constant
8245     0  // cuda_shared
8246 };
8247 class SPIRTargetInfo : public TargetInfo {
8248 public:
8249   SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8250       : TargetInfo(Triple) {
8251     assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
8252            "SPIR target must use unknown OS");
8253     assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
8254            "SPIR target must use unknown environment type");
8255     TLSSupported = false;
8256     LongWidth = LongAlign = 64;
8257     AddrSpaceMap = &SPIRAddrSpaceMap;
8258     UseAddrSpaceMapMangling = true;
8259     // Define available target features
8260     // These must be defined in sorted order!
8261     NoAsmVariants = true;
8262   }
8263   void getTargetDefines(const LangOptions &Opts,
8264                         MacroBuilder &Builder) const override {
8265     DefineStd(Builder, "SPIR", Opts);
8266   }
8267   bool hasFeature(StringRef Feature) const override {
8268     return Feature == "spir";
8269   }
8270 
8271   ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
8272   const char *getClobbers() const override { return ""; }
8273   ArrayRef<const char *> getGCCRegNames() const override { return None; }
8274   bool validateAsmConstraint(const char *&Name,
8275                              TargetInfo::ConstraintInfo &info) const override {
8276     return true;
8277   }
8278   ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8279     return None;
8280   }
8281   BuiltinVaListKind getBuiltinVaListKind() const override {
8282     return TargetInfo::VoidPtrBuiltinVaList;
8283   }
8284 
8285   CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
8286     return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8287                                                             : CCCR_Warning;
8288   }
8289 
8290   CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8291     return CC_SpirFunction;
8292   }
8293 
8294   void setSupportedOpenCLOpts() override {
8295     // Assume all OpenCL extensions and optional core features are supported
8296     // for SPIR since it is a generic target.
8297     getSupportedOpenCLOpts().supportAll();
8298   }
8299 };
8300 
8301 class SPIR32TargetInfo : public SPIRTargetInfo {
8302 public:
8303   SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8304       : SPIRTargetInfo(Triple, Opts) {
8305     PointerWidth = PointerAlign = 32;
8306     SizeType = TargetInfo::UnsignedInt;
8307     PtrDiffType = IntPtrType = TargetInfo::SignedInt;
8308     resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8309                     "v96:128-v192:256-v256:256-v512:512-v1024:1024");
8310   }
8311   void getTargetDefines(const LangOptions &Opts,
8312                         MacroBuilder &Builder) const override {
8313     DefineStd(Builder, "SPIR32", Opts);
8314   }
8315 };
8316 
8317 class SPIR64TargetInfo : public SPIRTargetInfo {
8318 public:
8319   SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8320       : SPIRTargetInfo(Triple, Opts) {
8321     PointerWidth = PointerAlign = 64;
8322     SizeType = TargetInfo::UnsignedLong;
8323     PtrDiffType = IntPtrType = TargetInfo::SignedLong;
8324     resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8325                     "v96:128-v192:256-v256:256-v512:512-v1024:1024");
8326   }
8327   void getTargetDefines(const LangOptions &Opts,
8328                         MacroBuilder &Builder) const override {
8329     DefineStd(Builder, "SPIR64", Opts);
8330   }
8331 };
8332 
8333 class XCoreTargetInfo : public TargetInfo {
8334   static const Builtin::Info BuiltinInfo[];
8335 public:
8336   XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8337       : TargetInfo(Triple) {
8338     NoAsmVariants = true;
8339     LongLongAlign = 32;
8340     SuitableAlign = 32;
8341     DoubleAlign = LongDoubleAlign = 32;
8342     SizeType = UnsignedInt;
8343     PtrDiffType = SignedInt;
8344     IntPtrType = SignedInt;
8345     WCharType = UnsignedChar;
8346     WIntType = UnsignedInt;
8347     UseZeroLengthBitfieldAlignment = true;
8348     resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8349                     "-f64:32-a:0:32-n32");
8350   }
8351   void getTargetDefines(const LangOptions &Opts,
8352                         MacroBuilder &Builder) const override {
8353     Builder.defineMacro("__XS1B__");
8354   }
8355   ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8356     return llvm::makeArrayRef(BuiltinInfo,
8357                            clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
8358   }
8359   BuiltinVaListKind getBuiltinVaListKind() const override {
8360     return TargetInfo::VoidPtrBuiltinVaList;
8361   }
8362   const char *getClobbers() const override {
8363     return "";
8364   }
8365   ArrayRef<const char *> getGCCRegNames() const override {
8366     static const char * const GCCRegNames[] = {
8367       "r0",   "r1",   "r2",   "r3",   "r4",   "r5",   "r6",   "r7",
8368       "r8",   "r9",   "r10",  "r11",  "cp",   "dp",   "sp",   "lr"
8369     };
8370     return llvm::makeArrayRef(GCCRegNames);
8371   }
8372   ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8373     return None;
8374   }
8375   bool validateAsmConstraint(const char *&Name,
8376                              TargetInfo::ConstraintInfo &Info) const override {
8377     return false;
8378   }
8379   int getEHDataRegisterNumber(unsigned RegNo) const override {
8380     // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8381     return (RegNo < 2)? RegNo : -1;
8382   }
8383   bool allowsLargerPreferedTypeAlignment() const override {
8384     return false;
8385   }
8386 };
8387 
8388 const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
8389 #define BUILTIN(ID, TYPE, ATTRS) \
8390   { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8391 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8392   { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
8393 #include "clang/Basic/BuiltinsXCore.def"
8394 };
8395 
8396 // x86_32 Android target
8397 class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8398 public:
8399   AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8400       : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
8401     SuitableAlign = 32;
8402     LongDoubleWidth = 64;
8403     LongDoubleFormat = &llvm::APFloat::IEEEdouble();
8404   }
8405 };
8406 
8407 // x86_64 Android target
8408 class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8409 public:
8410   AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8411       : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
8412     LongDoubleFormat = &llvm::APFloat::IEEEquad();
8413   }
8414 
8415   bool useFloat128ManglingForLongDouble() const override {
8416     return true;
8417   }
8418 };
8419 
8420 // 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8421 class RenderScript32TargetInfo : public ARMleTargetInfo {
8422 public:
8423   RenderScript32TargetInfo(const llvm::Triple &Triple,
8424                            const TargetOptions &Opts)
8425       : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8426                                      Triple.getOSName(),
8427                                      Triple.getEnvironmentName()),
8428                         Opts) {
8429     IsRenderScriptTarget = true;
8430     LongWidth = LongAlign = 64;
8431   }
8432   void getTargetDefines(const LangOptions &Opts,
8433                         MacroBuilder &Builder) const override {
8434     Builder.defineMacro("__RENDERSCRIPT__");
8435     ARMleTargetInfo::getTargetDefines(Opts, Builder);
8436   }
8437 };
8438 
8439 // 64-bit RenderScript is aarch64
8440 class RenderScript64TargetInfo : public AArch64leTargetInfo {
8441 public:
8442   RenderScript64TargetInfo(const llvm::Triple &Triple,
8443                            const TargetOptions &Opts)
8444       : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8445                                          Triple.getOSName(),
8446                                          Triple.getEnvironmentName()),
8447                             Opts) {
8448     IsRenderScriptTarget = true;
8449   }
8450 
8451   void getTargetDefines(const LangOptions &Opts,
8452                         MacroBuilder &Builder) const override {
8453     Builder.defineMacro("__RENDERSCRIPT__");
8454     AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8455   }
8456 };
8457 
8458 /// Information about a specific microcontroller.
8459 struct MCUInfo {
8460   const char *Name;
8461   const char *DefineName;
8462 };
8463 
8464 // This list should be kept up-to-date with AVRDevices.td in LLVM.
8465 static ArrayRef<MCUInfo> AVRMcus = {
8466   { "at90s1200", "__AVR_AT90S1200__" },
8467   { "attiny11", "__AVR_ATtiny11__" },
8468   { "attiny12", "__AVR_ATtiny12__" },
8469   { "attiny15", "__AVR_ATtiny15__" },
8470   { "attiny28", "__AVR_ATtiny28__" },
8471   { "at90s2313", "__AVR_AT90S2313__" },
8472   { "at90s2323", "__AVR_AT90S2323__" },
8473   { "at90s2333", "__AVR_AT90S2333__" },
8474   { "at90s2343", "__AVR_AT90S2343__" },
8475   { "attiny22", "__AVR_ATtiny22__" },
8476   { "attiny26", "__AVR_ATtiny26__" },
8477   { "at86rf401", "__AVR_AT86RF401__" },
8478   { "at90s4414", "__AVR_AT90S4414__" },
8479   { "at90s4433", "__AVR_AT90S4433__" },
8480   { "at90s4434", "__AVR_AT90S4434__" },
8481   { "at90s8515", "__AVR_AT90S8515__" },
8482   { "at90c8534", "__AVR_AT90c8534__" },
8483   { "at90s8535", "__AVR_AT90S8535__" },
8484   { "ata5272", "__AVR_ATA5272__" },
8485   { "attiny13", "__AVR_ATtiny13__" },
8486   { "attiny13a", "__AVR_ATtiny13A__" },
8487   { "attiny2313", "__AVR_ATtiny2313__" },
8488   { "attiny2313a", "__AVR_ATtiny2313A__" },
8489   { "attiny24", "__AVR_ATtiny24__" },
8490   { "attiny24a", "__AVR_ATtiny24A__" },
8491   { "attiny4313", "__AVR_ATtiny4313__" },
8492   { "attiny44", "__AVR_ATtiny44__" },
8493   { "attiny44a", "__AVR_ATtiny44A__" },
8494   { "attiny84", "__AVR_ATtiny84__" },
8495   { "attiny84a", "__AVR_ATtiny84A__" },
8496   { "attiny25", "__AVR_ATtiny25__" },
8497   { "attiny45", "__AVR_ATtiny45__" },
8498   { "attiny85", "__AVR_ATtiny85__" },
8499   { "attiny261", "__AVR_ATtiny261__" },
8500   { "attiny261a", "__AVR_ATtiny261A__" },
8501   { "attiny461", "__AVR_ATtiny461__" },
8502   { "attiny461a", "__AVR_ATtiny461A__" },
8503   { "attiny861", "__AVR_ATtiny861__" },
8504   { "attiny861a", "__AVR_ATtiny861A__" },
8505   { "attiny87", "__AVR_ATtiny87__" },
8506   { "attiny43u", "__AVR_ATtiny43U__" },
8507   { "attiny48", "__AVR_ATtiny48__" },
8508   { "attiny88", "__AVR_ATtiny88__" },
8509   { "attiny828", "__AVR_ATtiny828__" },
8510   { "at43usb355", "__AVR_AT43USB355__" },
8511   { "at76c711", "__AVR_AT76C711__" },
8512   { "atmega103", "__AVR_ATmega103__" },
8513   { "at43usb320", "__AVR_AT43USB320__" },
8514   { "attiny167", "__AVR_ATtiny167__" },
8515   { "at90usb82", "__AVR_AT90USB82__" },
8516   { "at90usb162", "__AVR_AT90USB162__" },
8517   { "ata5505", "__AVR_ATA5505__" },
8518   { "atmega8u2", "__AVR_ATmega8U2__" },
8519   { "atmega16u2", "__AVR_ATmega16U2__" },
8520   { "atmega32u2", "__AVR_ATmega32U2__" },
8521   { "attiny1634", "__AVR_ATtiny1634__" },
8522   { "atmega8", "__AVR_ATmega8__" },
8523   { "ata6289", "__AVR_ATA6289__" },
8524   { "atmega8a", "__AVR_ATmega8A__" },
8525   { "ata6285", "__AVR_ATA6285__" },
8526   { "ata6286", "__AVR_ATA6286__" },
8527   { "atmega48", "__AVR_ATmega48__" },
8528   { "atmega48a", "__AVR_ATmega48A__" },
8529   { "atmega48pa", "__AVR_ATmega48PA__" },
8530   { "atmega48p", "__AVR_ATmega48P__" },
8531   { "atmega88", "__AVR_ATmega88__" },
8532   { "atmega88a", "__AVR_ATmega88A__" },
8533   { "atmega88p", "__AVR_ATmega88P__" },
8534   { "atmega88pa", "__AVR_ATmega88PA__" },
8535   { "atmega8515", "__AVR_ATmega8515__" },
8536   { "atmega8535", "__AVR_ATmega8535__" },
8537   { "atmega8hva", "__AVR_ATmega8HVA__" },
8538   { "at90pwm1", "__AVR_AT90PWM1__" },
8539   { "at90pwm2", "__AVR_AT90PWM2__" },
8540   { "at90pwm2b", "__AVR_AT90PWM2B__" },
8541   { "at90pwm3", "__AVR_AT90PWM3__" },
8542   { "at90pwm3b", "__AVR_AT90PWM3B__" },
8543   { "at90pwm81", "__AVR_AT90PWM81__" },
8544   { "ata5790", "__AVR_ATA5790__" },
8545   { "ata5795", "__AVR_ATA5795__" },
8546   { "atmega16", "__AVR_ATmega16__" },
8547   { "atmega16a", "__AVR_ATmega16A__" },
8548   { "atmega161", "__AVR_ATmega161__" },
8549   { "atmega162", "__AVR_ATmega162__" },
8550   { "atmega163", "__AVR_ATmega163__" },
8551   { "atmega164a", "__AVR_ATmega164A__" },
8552   { "atmega164p", "__AVR_ATmega164P__" },
8553   { "atmega164pa", "__AVR_ATmega164PA__" },
8554   { "atmega165", "__AVR_ATmega165__" },
8555   { "atmega165a", "__AVR_ATmega165A__" },
8556   { "atmega165p", "__AVR_ATmega165P__" },
8557   { "atmega165pa", "__AVR_ATmega165PA__" },
8558   { "atmega168", "__AVR_ATmega168__" },
8559   { "atmega168a", "__AVR_ATmega168A__" },
8560   { "atmega168p", "__AVR_ATmega168P__" },
8561   { "atmega168pa", "__AVR_ATmega168PA__" },
8562   { "atmega169", "__AVR_ATmega169__" },
8563   { "atmega169a", "__AVR_ATmega169A__" },
8564   { "atmega169p", "__AVR_ATmega169P__" },
8565   { "atmega169pa", "__AVR_ATmega169PA__" },
8566   { "atmega32", "__AVR_ATmega32__" },
8567   { "atmega32a", "__AVR_ATmega32A__" },
8568   { "atmega323", "__AVR_ATmega323__" },
8569   { "atmega324a", "__AVR_ATmega324A__" },
8570   { "atmega324p", "__AVR_ATmega324P__" },
8571   { "atmega324pa", "__AVR_ATmega324PA__" },
8572   { "atmega325", "__AVR_ATmega325__" },
8573   { "atmega325a", "__AVR_ATmega325A__" },
8574   { "atmega325p", "__AVR_ATmega325P__" },
8575   { "atmega325pa", "__AVR_ATmega325PA__" },
8576   { "atmega3250", "__AVR_ATmega3250__" },
8577   { "atmega3250a", "__AVR_ATmega3250A__" },
8578   { "atmega3250p", "__AVR_ATmega3250P__" },
8579   { "atmega3250pa", "__AVR_ATmega3250PA__" },
8580   { "atmega328", "__AVR_ATmega328__" },
8581   { "atmega328p", "__AVR_ATmega328P__" },
8582   { "atmega329", "__AVR_ATmega329__" },
8583   { "atmega329a", "__AVR_ATmega329A__" },
8584   { "atmega329p", "__AVR_ATmega329P__" },
8585   { "atmega329pa", "__AVR_ATmega329PA__" },
8586   { "atmega3290", "__AVR_ATmega3290__" },
8587   { "atmega3290a", "__AVR_ATmega3290A__" },
8588   { "atmega3290p", "__AVR_ATmega3290P__" },
8589   { "atmega3290pa", "__AVR_ATmega3290PA__" },
8590   { "atmega406", "__AVR_ATmega406__" },
8591   { "atmega64", "__AVR_ATmega64__" },
8592   { "atmega64a", "__AVR_ATmega64A__" },
8593   { "atmega640", "__AVR_ATmega640__" },
8594   { "atmega644", "__AVR_ATmega644__" },
8595   { "atmega644a", "__AVR_ATmega644A__" },
8596   { "atmega644p", "__AVR_ATmega644P__" },
8597   { "atmega644pa", "__AVR_ATmega644PA__" },
8598   { "atmega645", "__AVR_ATmega645__" },
8599   { "atmega645a", "__AVR_ATmega645A__" },
8600   { "atmega645p", "__AVR_ATmega645P__" },
8601   { "atmega649", "__AVR_ATmega649__" },
8602   { "atmega649a", "__AVR_ATmega649A__" },
8603   { "atmega649p", "__AVR_ATmega649P__" },
8604   { "atmega6450", "__AVR_ATmega6450__" },
8605   { "atmega6450a", "__AVR_ATmega6450A__" },
8606   { "atmega6450p", "__AVR_ATmega6450P__" },
8607   { "atmega6490", "__AVR_ATmega6490__" },
8608   { "atmega6490a", "__AVR_ATmega6490A__" },
8609   { "atmega6490p", "__AVR_ATmega6490P__" },
8610   { "atmega64rfr2", "__AVR_ATmega64RFR2__" },
8611   { "atmega644rfr2", "__AVR_ATmega644RFR2__" },
8612   { "atmega16hva", "__AVR_ATmega16HVA__" },
8613   { "atmega16hva2", "__AVR_ATmega16HVA2__" },
8614   { "atmega16hvb", "__AVR_ATmega16HVB__" },
8615   { "atmega16hvbrevb", "__AVR_ATmega16HVBREVB__" },
8616   { "atmega32hvb", "__AVR_ATmega32HVB__" },
8617   { "atmega32hvbrevb", "__AVR_ATmega32HVBREVB__" },
8618   { "atmega64hve", "__AVR_ATmega64HVE__" },
8619   { "at90can32", "__AVR_AT90CAN32__" },
8620   { "at90can64", "__AVR_AT90CAN64__" },
8621   { "at90pwm161", "__AVR_AT90PWM161__" },
8622   { "at90pwm216", "__AVR_AT90PWM216__" },
8623   { "at90pwm316", "__AVR_AT90PWM316__" },
8624   { "atmega32c1", "__AVR_ATmega32C1__" },
8625   { "atmega64c1", "__AVR_ATmega64C1__" },
8626   { "atmega16m1", "__AVR_ATmega16M1__" },
8627   { "atmega32m1", "__AVR_ATmega32M1__" },
8628   { "atmega64m1", "__AVR_ATmega64M1__" },
8629   { "atmega16u4", "__AVR_ATmega16U4__" },
8630   { "atmega32u4", "__AVR_ATmega32U4__" },
8631   { "atmega32u6", "__AVR_ATmega32U6__" },
8632   { "at90usb646", "__AVR_AT90USB646__" },
8633   { "at90usb647", "__AVR_AT90USB647__" },
8634   { "at90scr100", "__AVR_AT90SCR100__" },
8635   { "at94k", "__AVR_AT94K__" },
8636   { "m3000", "__AVR_AT000__" },
8637   { "atmega128", "__AVR_ATmega128__" },
8638   { "atmega128a", "__AVR_ATmega128A__" },
8639   { "atmega1280", "__AVR_ATmega1280__" },
8640   { "atmega1281", "__AVR_ATmega1281__" },
8641   { "atmega1284", "__AVR_ATmega1284__" },
8642   { "atmega1284p", "__AVR_ATmega1284P__" },
8643   { "atmega128rfa1", "__AVR_ATmega128RFA1__" },
8644   { "atmega128rfr2", "__AVR_ATmega128RFR2__" },
8645   { "atmega1284rfr2", "__AVR_ATmega1284RFR2__" },
8646   { "at90can128", "__AVR_AT90CAN128__" },
8647   { "at90usb1286", "__AVR_AT90USB1286__" },
8648   { "at90usb1287", "__AVR_AT90USB1287__" },
8649   { "atmega2560", "__AVR_ATmega2560__" },
8650   { "atmega2561", "__AVR_ATmega2561__" },
8651   { "atmega256rfr2", "__AVR_ATmega256RFR2__" },
8652   { "atmega2564rfr2", "__AVR_ATmega2564RFR2__" },
8653   { "atxmega16a4", "__AVR_ATxmega16A4__" },
8654   { "atxmega16a4u", "__AVR_ATxmega16a4U__" },
8655   { "atxmega16c4", "__AVR_ATxmega16C4__" },
8656   { "atxmega16d4", "__AVR_ATxmega16D4__" },
8657   { "atxmega32a4", "__AVR_ATxmega32A4__" },
8658   { "atxmega32a4u", "__AVR_ATxmega32A4U__" },
8659   { "atxmega32c4", "__AVR_ATxmega32C4__" },
8660   { "atxmega32d4", "__AVR_ATxmega32D4__" },
8661   { "atxmega32e5", "__AVR_ATxmega32E5__" },
8662   { "atxmega16e5", "__AVR_ATxmega16E5__" },
8663   { "atxmega8e5", "__AVR_ATxmega8E5__" },
8664   { "atxmega32x1", "__AVR_ATxmega32X1__" },
8665   { "atxmega64a3", "__AVR_ATxmega64A3__" },
8666   { "atxmega64a3u", "__AVR_ATxmega64A3U__" },
8667   { "atxmega64a4u", "__AVR_ATxmega64A4U__" },
8668   { "atxmega64b1", "__AVR_ATxmega64B1__" },
8669   { "atxmega64b3", "__AVR_ATxmega64B3__" },
8670   { "atxmega64c3", "__AVR_ATxmega64C3__" },
8671   { "atxmega64d3", "__AVR_ATxmega64D3__" },
8672   { "atxmega64d4", "__AVR_ATxmega64D4__" },
8673   { "atxmega64a1", "__AVR_ATxmega64A1__" },
8674   { "atxmega64a1u", "__AVR_ATxmega64A1U__" },
8675   { "atxmega128a3", "__AVR_ATxmega128A3__" },
8676   { "atxmega128a3u", "__AVR_ATxmega128A3U__" },
8677   { "atxmega128b1", "__AVR_ATxmega128B1__" },
8678   { "atxmega128b3", "__AVR_ATxmega128B3__" },
8679   { "atxmega128c3", "__AVR_ATxmega128C3__" },
8680   { "atxmega128d3", "__AVR_ATxmega128D3__" },
8681   { "atxmega128d4", "__AVR_ATxmega128D4__" },
8682   { "atxmega192a3", "__AVR_ATxmega192A3__" },
8683   { "atxmega192a3u", "__AVR_ATxmega192A3U__" },
8684   { "atxmega192c3", "__AVR_ATxmega192C3__" },
8685   { "atxmega192d3", "__AVR_ATxmega192D3__" },
8686   { "atxmega256a3", "__AVR_ATxmega256A3__" },
8687   { "atxmega256a3u", "__AVR_ATxmega256A3U__" },
8688   { "atxmega256a3b", "__AVR_ATxmega256A3B__" },
8689   { "atxmega256a3bu", "__AVR_ATxmega256A3BU__" },
8690   { "atxmega256c3", "__AVR_ATxmega256C3__" },
8691   { "atxmega256d3", "__AVR_ATxmega256D3__" },
8692   { "atxmega384c3", "__AVR_ATxmega384C3__" },
8693   { "atxmega384d3", "__AVR_ATxmega384D3__" },
8694   { "atxmega128a1", "__AVR_ATxmega128A1__" },
8695   { "atxmega128a1u", "__AVR_ATxmega128A1U__" },
8696   { "atxmega128a4u", "__AVR_ATxmega128a4U__" },
8697   { "attiny4", "__AVR_ATtiny4__" },
8698   { "attiny5", "__AVR_ATtiny5__" },
8699   { "attiny9", "__AVR_ATtiny9__" },
8700   { "attiny10", "__AVR_ATtiny10__" },
8701   { "attiny20", "__AVR_ATtiny20__" },
8702   { "attiny40", "__AVR_ATtiny40__" },
8703   { "attiny102", "__AVR_ATtiny102__" },
8704   { "attiny104", "__AVR_ATtiny104__" },
8705 };
8706 
8707 // AVR Target
8708 class AVRTargetInfo : public TargetInfo {
8709 public:
8710   AVRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8711       : TargetInfo(Triple) {
8712     TLSSupported = false;
8713     PointerWidth = 16;
8714     PointerAlign = 8;
8715     IntWidth = 16;
8716     IntAlign = 8;
8717     LongWidth = 32;
8718     LongAlign = 8;
8719     LongLongWidth = 64;
8720     LongLongAlign = 8;
8721     SuitableAlign = 8;
8722     DefaultAlignForAttributeAligned = 8;
8723     HalfWidth = 16;
8724     HalfAlign = 8;
8725     FloatWidth = 32;
8726     FloatAlign = 8;
8727     DoubleWidth = 32;
8728     DoubleAlign = 8;
8729     DoubleFormat = &llvm::APFloat::IEEEsingle();
8730     LongDoubleWidth = 32;
8731     LongDoubleAlign = 8;
8732     LongDoubleFormat = &llvm::APFloat::IEEEsingle();
8733     SizeType = UnsignedInt;
8734     PtrDiffType = SignedInt;
8735     IntPtrType = SignedInt;
8736     Char16Type = UnsignedInt;
8737     WCharType = SignedInt;
8738     WIntType = SignedInt;
8739     Char32Type = UnsignedLong;
8740     SigAtomicType = SignedChar;
8741     resetDataLayout("e-p:16:16:16-i8:8:8-i16:16:16-i32:32:32-i64:64:64"
8742 		    "-f32:32:32-f64:64:64-n8");
8743   }
8744 
8745   void getTargetDefines(const LangOptions &Opts,
8746                         MacroBuilder &Builder) const override {
8747     Builder.defineMacro("AVR");
8748     Builder.defineMacro("__AVR");
8749     Builder.defineMacro("__AVR__");
8750 
8751     if (!this->CPU.empty()) {
8752       auto It = std::find_if(AVRMcus.begin(), AVRMcus.end(),
8753         [&](const MCUInfo &Info) { return Info.Name == this->CPU; });
8754 
8755       if (It != AVRMcus.end())
8756         Builder.defineMacro(It->DefineName);
8757     }
8758   }
8759 
8760   ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8761     return None;
8762   }
8763 
8764   BuiltinVaListKind getBuiltinVaListKind() const override {
8765     return TargetInfo::VoidPtrBuiltinVaList;
8766   }
8767 
8768   const char *getClobbers() const override {
8769     return "";
8770   }
8771 
8772   ArrayRef<const char *> getGCCRegNames() const override {
8773     static const char * const GCCRegNames[] = {
8774       "r0",   "r1",   "r2",   "r3",   "r4",   "r5",   "r6",   "r7",
8775       "r8",   "r9",   "r10",  "r11",  "r12",  "r13",  "r14",  "r15",
8776       "r16",  "r17",  "r18",  "r19",  "r20",  "r21",  "r22",  "r23",
8777       "r24",  "r25",  "X",    "Y",    "Z",    "SP"
8778     };
8779     return llvm::makeArrayRef(GCCRegNames);
8780   }
8781 
8782   ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8783     return None;
8784   }
8785 
8786   ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
8787     static const TargetInfo::AddlRegName AddlRegNames[] = {
8788       { { "r26", "r27"}, 26 },
8789       { { "r28", "r29"}, 27 },
8790       { { "r30", "r31"}, 28 },
8791       { { "SPL", "SPH"}, 29 },
8792     };
8793     return llvm::makeArrayRef(AddlRegNames);
8794   }
8795 
8796   bool validateAsmConstraint(const char *&Name,
8797                              TargetInfo::ConstraintInfo &Info) const override {
8798     // There aren't any multi-character AVR specific constraints.
8799     if (StringRef(Name).size() > 1) return false;
8800 
8801     switch (*Name) {
8802       default: return false;
8803       case 'a': // Simple upper registers
8804       case 'b': // Base pointer registers pairs
8805       case 'd': // Upper register
8806       case 'l': // Lower registers
8807       case 'e': // Pointer register pairs
8808       case 'q': // Stack pointer register
8809       case 'r': // Any register
8810       case 'w': // Special upper register pairs
8811       case 't': // Temporary register
8812       case 'x': case 'X': // Pointer register pair X
8813       case 'y': case 'Y': // Pointer register pair Y
8814       case 'z': case 'Z': // Pointer register pair Z
8815         Info.setAllowsRegister();
8816         return true;
8817       case 'I': // 6-bit positive integer constant
8818         Info.setRequiresImmediate(0, 63);
8819         return true;
8820       case 'J': // 6-bit negative integer constant
8821         Info.setRequiresImmediate(-63, 0);
8822         return true;
8823       case 'K': // Integer constant (Range: 2)
8824         Info.setRequiresImmediate(2);
8825         return true;
8826       case 'L': // Integer constant (Range: 0)
8827         Info.setRequiresImmediate(0);
8828         return true;
8829       case 'M': // 8-bit integer constant
8830         Info.setRequiresImmediate(0, 0xff);
8831         return true;
8832       case 'N': // Integer constant (Range: -1)
8833         Info.setRequiresImmediate(-1);
8834         return true;
8835       case 'O': // Integer constant (Range: 8, 16, 24)
8836         Info.setRequiresImmediate({8, 16, 24});
8837         return true;
8838       case 'P': // Integer constant (Range: 1)
8839         Info.setRequiresImmediate(1);
8840         return true;
8841       case 'R': // Integer constant (Range: -6 to 5)
8842         Info.setRequiresImmediate(-6, 5);
8843         return true;
8844       case 'G': // Floating point constant
8845       case 'Q': // A memory address based on Y or Z pointer with displacement.
8846         return true;
8847     }
8848 
8849     return false;
8850   }
8851 
8852   IntType getIntTypeByWidth(unsigned BitWidth,
8853                             bool IsSigned) const final {
8854     // AVR prefers int for 16-bit integers.
8855     return BitWidth == 16 ? (IsSigned ? SignedInt : UnsignedInt)
8856                           : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8857   }
8858 
8859   IntType getLeastIntTypeByWidth(unsigned BitWidth,
8860                                  bool IsSigned) const final {
8861     // AVR uses int for int_least16_t and int_fast16_t.
8862     return BitWidth == 16
8863                ? (IsSigned ? SignedInt : UnsignedInt)
8864                : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8865   }
8866 
8867   bool setCPU(const std::string &Name) override {
8868     bool IsFamily = llvm::StringSwitch<bool>(Name)
8869       .Case("avr1", true)
8870       .Case("avr2", true)
8871       .Case("avr25", true)
8872       .Case("avr3", true)
8873       .Case("avr31", true)
8874       .Case("avr35", true)
8875       .Case("avr4", true)
8876       .Case("avr5", true)
8877       .Case("avr51", true)
8878       .Case("avr6", true)
8879       .Case("avrxmega1", true)
8880       .Case("avrxmega2", true)
8881       .Case("avrxmega3", true)
8882       .Case("avrxmega4", true)
8883       .Case("avrxmega5", true)
8884       .Case("avrxmega6", true)
8885       .Case("avrxmega7", true)
8886       .Case("avrtiny", true)
8887       .Default(false);
8888 
8889     if (IsFamily) this->CPU = Name;
8890 
8891     bool IsMCU = std::find_if(AVRMcus.begin(), AVRMcus.end(),
8892       [&](const MCUInfo &Info) { return Info.Name == Name; }) != AVRMcus.end();
8893 
8894     if (IsMCU) this->CPU = Name;
8895 
8896     return IsFamily || IsMCU;
8897   }
8898 
8899 protected:
8900   std::string CPU;
8901 };
8902 
8903 } // end anonymous namespace
8904 
8905 //===----------------------------------------------------------------------===//
8906 // Driver code
8907 //===----------------------------------------------------------------------===//
8908 
8909 static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8910                                   const TargetOptions &Opts) {
8911   llvm::Triple::OSType os = Triple.getOS();
8912 
8913   switch (Triple.getArch()) {
8914   default:
8915     return nullptr;
8916 
8917   case llvm::Triple::xcore:
8918     return new XCoreTargetInfo(Triple, Opts);
8919 
8920   case llvm::Triple::hexagon:
8921     return new HexagonTargetInfo(Triple, Opts);
8922 
8923   case llvm::Triple::lanai:
8924     return new LanaiTargetInfo(Triple, Opts);
8925 
8926   case llvm::Triple::aarch64:
8927     if (Triple.isOSDarwin())
8928       return new DarwinAArch64TargetInfo(Triple, Opts);
8929 
8930     switch (os) {
8931     case llvm::Triple::CloudABI:
8932       return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
8933     case llvm::Triple::FreeBSD:
8934       return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
8935     case llvm::Triple::Fuchsia:
8936       return new FuchsiaTargetInfo<AArch64leTargetInfo>(Triple, Opts);
8937     case llvm::Triple::Linux:
8938       return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
8939     case llvm::Triple::NetBSD:
8940       return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
8941     default:
8942       return new AArch64leTargetInfo(Triple, Opts);
8943     }
8944 
8945   case llvm::Triple::aarch64_be:
8946     switch (os) {
8947     case llvm::Triple::FreeBSD:
8948       return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
8949     case llvm::Triple::Fuchsia:
8950       return new FuchsiaTargetInfo<AArch64beTargetInfo>(Triple, Opts);
8951     case llvm::Triple::Linux:
8952       return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
8953     case llvm::Triple::NetBSD:
8954       return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
8955     default:
8956       return new AArch64beTargetInfo(Triple, Opts);
8957     }
8958 
8959   case llvm::Triple::arm:
8960   case llvm::Triple::thumb:
8961     if (Triple.isOSBinFormatMachO())
8962       return new DarwinARMTargetInfo(Triple, Opts);
8963 
8964     switch (os) {
8965     case llvm::Triple::CloudABI:
8966       return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
8967     case llvm::Triple::Linux:
8968       return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
8969     case llvm::Triple::FreeBSD:
8970       return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
8971     case llvm::Triple::NetBSD:
8972       return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
8973     case llvm::Triple::OpenBSD:
8974       return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
8975     case llvm::Triple::Bitrig:
8976       return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
8977     case llvm::Triple::RTEMS:
8978       return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
8979     case llvm::Triple::NaCl:
8980       return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
8981     case llvm::Triple::Win32:
8982       switch (Triple.getEnvironment()) {
8983       case llvm::Triple::Cygnus:
8984         return new CygwinARMTargetInfo(Triple, Opts);
8985       case llvm::Triple::GNU:
8986         return new MinGWARMTargetInfo(Triple, Opts);
8987       case llvm::Triple::Itanium:
8988         return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
8989       case llvm::Triple::MSVC:
8990       default: // Assume MSVC for unknown environments
8991         return new MicrosoftARMleTargetInfo(Triple, Opts);
8992       }
8993     default:
8994       return new ARMleTargetInfo(Triple, Opts);
8995     }
8996 
8997   case llvm::Triple::armeb:
8998   case llvm::Triple::thumbeb:
8999     if (Triple.isOSDarwin())
9000       return new DarwinARMTargetInfo(Triple, Opts);
9001 
9002     switch (os) {
9003     case llvm::Triple::Linux:
9004       return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
9005     case llvm::Triple::FreeBSD:
9006       return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
9007     case llvm::Triple::NetBSD:
9008       return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
9009     case llvm::Triple::OpenBSD:
9010       return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
9011     case llvm::Triple::Bitrig:
9012       return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
9013     case llvm::Triple::RTEMS:
9014       return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
9015     case llvm::Triple::NaCl:
9016       return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
9017     default:
9018       return new ARMbeTargetInfo(Triple, Opts);
9019     }
9020 
9021   case llvm::Triple::avr:
9022     return new AVRTargetInfo(Triple, Opts);
9023   case llvm::Triple::bpfeb:
9024   case llvm::Triple::bpfel:
9025     return new BPFTargetInfo(Triple, Opts);
9026 
9027   case llvm::Triple::msp430:
9028     return new MSP430TargetInfo(Triple, Opts);
9029 
9030   case llvm::Triple::mips:
9031     switch (os) {
9032     case llvm::Triple::Linux:
9033       return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
9034     case llvm::Triple::RTEMS:
9035       return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
9036     case llvm::Triple::FreeBSD:
9037       return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
9038     case llvm::Triple::NetBSD:
9039       return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
9040     default:
9041       return new MipsTargetInfo(Triple, Opts);
9042     }
9043 
9044   case llvm::Triple::mipsel:
9045     switch (os) {
9046     case llvm::Triple::Linux:
9047       return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
9048     case llvm::Triple::RTEMS:
9049       return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
9050     case llvm::Triple::FreeBSD:
9051       return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
9052     case llvm::Triple::NetBSD:
9053       return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
9054     case llvm::Triple::NaCl:
9055       return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
9056     default:
9057       return new MipsTargetInfo(Triple, Opts);
9058     }
9059 
9060   case llvm::Triple::mips64:
9061     switch (os) {
9062     case llvm::Triple::Linux:
9063       return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
9064     case llvm::Triple::RTEMS:
9065       return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
9066     case llvm::Triple::FreeBSD:
9067       return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
9068     case llvm::Triple::NetBSD:
9069       return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
9070     case llvm::Triple::OpenBSD:
9071       return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
9072     default:
9073       return new MipsTargetInfo(Triple, Opts);
9074     }
9075 
9076   case llvm::Triple::mips64el:
9077     switch (os) {
9078     case llvm::Triple::Linux:
9079       return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
9080     case llvm::Triple::RTEMS:
9081       return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
9082     case llvm::Triple::FreeBSD:
9083       return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
9084     case llvm::Triple::NetBSD:
9085       return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
9086     case llvm::Triple::OpenBSD:
9087       return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
9088     default:
9089       return new MipsTargetInfo(Triple, Opts);
9090     }
9091 
9092   case llvm::Triple::le32:
9093     switch (os) {
9094     case llvm::Triple::NaCl:
9095       return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
9096     default:
9097       return nullptr;
9098     }
9099 
9100   case llvm::Triple::le64:
9101     return new Le64TargetInfo(Triple, Opts);
9102 
9103   case llvm::Triple::ppc:
9104     if (Triple.isOSDarwin())
9105       return new DarwinPPC32TargetInfo(Triple, Opts);
9106     switch (os) {
9107     case llvm::Triple::Linux:
9108       return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
9109     case llvm::Triple::FreeBSD:
9110       return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
9111     case llvm::Triple::NetBSD:
9112       return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
9113     case llvm::Triple::OpenBSD:
9114       return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
9115     case llvm::Triple::RTEMS:
9116       return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
9117     default:
9118       return new PPC32TargetInfo(Triple, Opts);
9119     }
9120 
9121   case llvm::Triple::ppc64:
9122     if (Triple.isOSDarwin())
9123       return new DarwinPPC64TargetInfo(Triple, Opts);
9124     switch (os) {
9125     case llvm::Triple::Linux:
9126       return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
9127     case llvm::Triple::Lv2:
9128       return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
9129     case llvm::Triple::FreeBSD:
9130       return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
9131     case llvm::Triple::NetBSD:
9132       return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
9133     default:
9134       return new PPC64TargetInfo(Triple, Opts);
9135     }
9136 
9137   case llvm::Triple::ppc64le:
9138     switch (os) {
9139     case llvm::Triple::Linux:
9140       return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
9141     case llvm::Triple::NetBSD:
9142       return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
9143     default:
9144       return new PPC64TargetInfo(Triple, Opts);
9145     }
9146 
9147   case llvm::Triple::nvptx:
9148     return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/32);
9149   case llvm::Triple::nvptx64:
9150     return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/64);
9151 
9152   case llvm::Triple::amdgcn:
9153   case llvm::Triple::r600:
9154     return new AMDGPUTargetInfo(Triple, Opts);
9155 
9156   case llvm::Triple::sparc:
9157     switch (os) {
9158     case llvm::Triple::Linux:
9159       return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
9160     case llvm::Triple::Solaris:
9161       return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
9162     case llvm::Triple::NetBSD:
9163       return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
9164     case llvm::Triple::OpenBSD:
9165       return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
9166     case llvm::Triple::RTEMS:
9167       return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
9168     default:
9169       return new SparcV8TargetInfo(Triple, Opts);
9170     }
9171 
9172   // The 'sparcel' architecture copies all the above cases except for Solaris.
9173   case llvm::Triple::sparcel:
9174     switch (os) {
9175     case llvm::Triple::Linux:
9176       return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
9177     case llvm::Triple::NetBSD:
9178       return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
9179     case llvm::Triple::OpenBSD:
9180       return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
9181     case llvm::Triple::RTEMS:
9182       return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
9183     default:
9184       return new SparcV8elTargetInfo(Triple, Opts);
9185     }
9186 
9187   case llvm::Triple::sparcv9:
9188     switch (os) {
9189     case llvm::Triple::Linux:
9190       return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
9191     case llvm::Triple::Solaris:
9192       return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
9193     case llvm::Triple::NetBSD:
9194       return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
9195     case llvm::Triple::OpenBSD:
9196       return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
9197     case llvm::Triple::FreeBSD:
9198       return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
9199     default:
9200       return new SparcV9TargetInfo(Triple, Opts);
9201     }
9202 
9203   case llvm::Triple::systemz:
9204     switch (os) {
9205     case llvm::Triple::Linux:
9206       return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
9207     default:
9208       return new SystemZTargetInfo(Triple, Opts);
9209     }
9210 
9211   case llvm::Triple::tce:
9212     return new TCETargetInfo(Triple, Opts);
9213 
9214   case llvm::Triple::tcele:
9215     return new TCELETargetInfo(Triple, Opts);
9216 
9217   case llvm::Triple::x86:
9218     if (Triple.isOSDarwin())
9219       return new DarwinI386TargetInfo(Triple, Opts);
9220 
9221     switch (os) {
9222     case llvm::Triple::CloudABI:
9223       return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
9224     case llvm::Triple::Linux: {
9225       switch (Triple.getEnvironment()) {
9226       default:
9227         return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
9228       case llvm::Triple::Android:
9229         return new AndroidX86_32TargetInfo(Triple, Opts);
9230       }
9231     }
9232     case llvm::Triple::DragonFly:
9233       return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
9234     case llvm::Triple::NetBSD:
9235       return new NetBSDI386TargetInfo(Triple, Opts);
9236     case llvm::Triple::OpenBSD:
9237       return new OpenBSDI386TargetInfo(Triple, Opts);
9238     case llvm::Triple::Bitrig:
9239       return new BitrigI386TargetInfo(Triple, Opts);
9240     case llvm::Triple::FreeBSD:
9241       return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
9242     case llvm::Triple::KFreeBSD:
9243       return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
9244     case llvm::Triple::Minix:
9245       return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
9246     case llvm::Triple::Solaris:
9247       return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
9248     case llvm::Triple::Win32: {
9249       switch (Triple.getEnvironment()) {
9250       case llvm::Triple::Cygnus:
9251         return new CygwinX86_32TargetInfo(Triple, Opts);
9252       case llvm::Triple::GNU:
9253         return new MinGWX86_32TargetInfo(Triple, Opts);
9254       case llvm::Triple::Itanium:
9255       case llvm::Triple::MSVC:
9256       default: // Assume MSVC for unknown environments
9257         return new MicrosoftX86_32TargetInfo(Triple, Opts);
9258       }
9259     }
9260     case llvm::Triple::Haiku:
9261       return new HaikuX86_32TargetInfo(Triple, Opts);
9262     case llvm::Triple::RTEMS:
9263       return new RTEMSX86_32TargetInfo(Triple, Opts);
9264     case llvm::Triple::NaCl:
9265       return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
9266     case llvm::Triple::ELFIAMCU:
9267       return new MCUX86_32TargetInfo(Triple, Opts);
9268     default:
9269       return new X86_32TargetInfo(Triple, Opts);
9270     }
9271 
9272   case llvm::Triple::x86_64:
9273     if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
9274       return new DarwinX86_64TargetInfo(Triple, Opts);
9275 
9276     switch (os) {
9277     case llvm::Triple::CloudABI:
9278       return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
9279     case llvm::Triple::Linux: {
9280       switch (Triple.getEnvironment()) {
9281       default:
9282         return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
9283       case llvm::Triple::Android:
9284         return new AndroidX86_64TargetInfo(Triple, Opts);
9285       }
9286     }
9287     case llvm::Triple::DragonFly:
9288       return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
9289     case llvm::Triple::NetBSD:
9290       return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
9291     case llvm::Triple::OpenBSD:
9292       return new OpenBSDX86_64TargetInfo(Triple, Opts);
9293     case llvm::Triple::Bitrig:
9294       return new BitrigX86_64TargetInfo(Triple, Opts);
9295     case llvm::Triple::FreeBSD:
9296       return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
9297     case llvm::Triple::Fuchsia:
9298       return new FuchsiaTargetInfo<X86_64TargetInfo>(Triple, Opts);
9299     case llvm::Triple::KFreeBSD:
9300       return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
9301     case llvm::Triple::Solaris:
9302       return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
9303     case llvm::Triple::Win32: {
9304       switch (Triple.getEnvironment()) {
9305       case llvm::Triple::Cygnus:
9306         return new CygwinX86_64TargetInfo(Triple, Opts);
9307       case llvm::Triple::GNU:
9308         return new MinGWX86_64TargetInfo(Triple, Opts);
9309       case llvm::Triple::MSVC:
9310       default: // Assume MSVC for unknown environments
9311         return new MicrosoftX86_64TargetInfo(Triple, Opts);
9312       }
9313     }
9314     case llvm::Triple::Haiku:
9315       return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
9316     case llvm::Triple::NaCl:
9317       return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
9318     case llvm::Triple::PS4:
9319       return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
9320     default:
9321       return new X86_64TargetInfo(Triple, Opts);
9322     }
9323 
9324   case llvm::Triple::spir: {
9325     if (Triple.getOS() != llvm::Triple::UnknownOS ||
9326         Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9327       return nullptr;
9328     return new SPIR32TargetInfo(Triple, Opts);
9329   }
9330   case llvm::Triple::spir64: {
9331     if (Triple.getOS() != llvm::Triple::UnknownOS ||
9332         Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9333       return nullptr;
9334     return new SPIR64TargetInfo(Triple, Opts);
9335   }
9336   case llvm::Triple::wasm32:
9337     if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9338         Triple.getVendor() != llvm::Triple::UnknownVendor ||
9339         Triple.getOS() != llvm::Triple::UnknownOS ||
9340         Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9341         !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
9342       return nullptr;
9343     return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
9344   case llvm::Triple::wasm64:
9345     if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9346         Triple.getVendor() != llvm::Triple::UnknownVendor ||
9347         Triple.getOS() != llvm::Triple::UnknownOS ||
9348         Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9349         !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
9350       return nullptr;
9351     return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
9352 
9353   case llvm::Triple::renderscript32:
9354     return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
9355   case llvm::Triple::renderscript64:
9356     return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
9357   }
9358 }
9359 
9360 /// CreateTargetInfo - Return the target info object for the specified target
9361 /// options.
9362 TargetInfo *
9363 TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
9364                              const std::shared_ptr<TargetOptions> &Opts) {
9365   llvm::Triple Triple(Opts->Triple);
9366 
9367   // Construct the target
9368   std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
9369   if (!Target) {
9370     Diags.Report(diag::err_target_unknown_triple) << Triple.str();
9371     return nullptr;
9372   }
9373   Target->TargetOpts = Opts;
9374 
9375   // Set the target CPU if specified.
9376   if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
9377     Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
9378     return nullptr;
9379   }
9380 
9381   // Set the target ABI if specified.
9382   if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
9383     Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
9384     return nullptr;
9385   }
9386 
9387   // Set the fp math unit.
9388   if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
9389     Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
9390     return nullptr;
9391   }
9392 
9393   // Compute the default target features, we need the target to handle this
9394   // because features may have dependencies on one another.
9395   llvm::StringMap<bool> Features;
9396   if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
9397                               Opts->FeaturesAsWritten))
9398       return nullptr;
9399 
9400   // Add the features to the compile options.
9401   Opts->Features.clear();
9402   for (const auto &F : Features)
9403     Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
9404 
9405   if (!Target->handleTargetFeatures(Opts->Features, Diags))
9406     return nullptr;
9407 
9408   Target->setSupportedOpenCLOpts();
9409   Target->setOpenCLExtensionOpts();
9410 
9411   if (!Target->validateTarget(Diags))
9412     return nullptr;
9413 
9414   return Target.release();
9415 }
9416