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