clang API Documentation

Targets.cpp
Go to the documentation of this file.
00001 //===--- Targets.cpp - Implement -arch option and targets -----------------===//
00002 //
00003 //                     The LLVM Compiler Infrastructure
00004 //
00005 // This file is distributed under the University of Illinois Open Source
00006 // License. See LICENSE.TXT for details.
00007 //
00008 //===----------------------------------------------------------------------===//
00009 //
00010 // This file implements construction of a TargetInfo object from a
00011 // target triple.
00012 //
00013 //===----------------------------------------------------------------------===//
00014 
00015 #include "clang/Basic/TargetInfo.h"
00016 #include "clang/Basic/Builtins.h"
00017 #include "clang/Basic/Diagnostic.h"
00018 #include "clang/Basic/LangOptions.h"
00019 #include "clang/Basic/MacroBuilder.h"
00020 #include "clang/Basic/TargetBuiltins.h"
00021 #include "clang/Basic/TargetOptions.h"
00022 #include "llvm/ADT/APFloat.h"
00023 #include "llvm/ADT/OwningPtr.h"
00024 #include "llvm/ADT/STLExtras.h"
00025 #include "llvm/ADT/StringRef.h"
00026 #include "llvm/ADT/StringSwitch.h"
00027 #include "llvm/ADT/Triple.h"
00028 #include "llvm/MC/MCSectionMachO.h"
00029 #include "llvm/Support/ErrorHandling.h"
00030 #include "llvm/Type.h"
00031 #include <algorithm>
00032 using namespace clang;
00033 
00034 //===----------------------------------------------------------------------===//
00035 //  Common code shared among targets.
00036 //===----------------------------------------------------------------------===//
00037 
00038 /// DefineStd - Define a macro name and standard variants.  For example if
00039 /// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
00040 /// when in GNU mode.
00041 static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
00042                       const LangOptions &Opts) {
00043   assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
00044 
00045   // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
00046   // in the user's namespace.
00047   if (Opts.GNUMode)
00048     Builder.defineMacro(MacroName);
00049 
00050   // Define __unix.
00051   Builder.defineMacro("__" + MacroName);
00052 
00053   // Define __unix__.
00054   Builder.defineMacro("__" + MacroName + "__");
00055 }
00056 
00057 static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
00058                             bool Tuning = true) {
00059   Builder.defineMacro("__" + CPUName);
00060   Builder.defineMacro("__" + CPUName + "__");
00061   if (Tuning)
00062     Builder.defineMacro("__tune_" + CPUName + "__");
00063 }
00064 
00065 //===----------------------------------------------------------------------===//
00066 // Defines specific to certain operating systems.
00067 //===----------------------------------------------------------------------===//
00068 
00069 namespace {
00070 template<typename TgtInfo>
00071 class OSTargetInfo : public TgtInfo {
00072 protected:
00073   virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
00074                             MacroBuilder &Builder) const=0;
00075 public:
00076   OSTargetInfo(const std::string& triple) : TgtInfo(triple) {}
00077   virtual void getTargetDefines(const LangOptions &Opts,
00078                                 MacroBuilder &Builder) const {
00079     TgtInfo::getTargetDefines(Opts, Builder);
00080     getOSDefines(Opts, TgtInfo::getTriple(), Builder);
00081   }
00082 
00083 };
00084 } // end anonymous namespace
00085 
00086 
00087 static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
00088                              const llvm::Triple &Triple,
00089                              StringRef &PlatformName,
00090                              VersionTuple &PlatformMinVersion) {
00091   Builder.defineMacro("__APPLE_CC__", "5621");
00092   Builder.defineMacro("__APPLE__");
00093   Builder.defineMacro("__MACH__");
00094   Builder.defineMacro("OBJC_NEW_PROPERTIES");
00095 
00096   if (!Opts.ObjCAutoRefCount) {
00097     // __weak is always defined, for use in blocks and with objc pointers.
00098     Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
00099 
00100     // Darwin defines __strong even in C mode (just to nothing).
00101     if (Opts.getGC() != LangOptions::NonGC)
00102       Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
00103     else
00104       Builder.defineMacro("__strong", "");
00105 
00106     // __unsafe_unretained is defined to nothing in non-ARC mode. We even
00107     // allow this in C, since one might have block pointers in structs that
00108     // are used in pure C code and in Objective-C ARC.
00109     Builder.defineMacro("__unsafe_unretained", "");
00110   }
00111 
00112   if (Opts.Static)
00113     Builder.defineMacro("__STATIC__");
00114   else
00115     Builder.defineMacro("__DYNAMIC__");
00116 
00117   if (Opts.POSIXThreads)
00118     Builder.defineMacro("_REENTRANT");
00119 
00120   // Get the platform type and version number from the triple.
00121   unsigned Maj, Min, Rev;
00122   if (Triple.isMacOSX()) {
00123     Triple.getMacOSXVersion(Maj, Min, Rev);
00124     PlatformName = "macosx";
00125   } else {
00126     Triple.getOSVersion(Maj, Min, Rev);
00127     PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
00128   }
00129 
00130   // If -target arch-pc-win32-macho option specified, we're
00131   // generating code for Win32 ABI. No need to emit
00132   // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
00133   if (PlatformName == "win32") {
00134     PlatformMinVersion = VersionTuple(Maj, Min, Rev);
00135     return;
00136   }
00137 
00138   // Set the appropriate OS version define.
00139   if (Triple.getOS() == llvm::Triple::IOS) {
00140     assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
00141     char Str[6];
00142     Str[0] = '0' + Maj;
00143     Str[1] = '0' + (Min / 10);
00144     Str[2] = '0' + (Min % 10);
00145     Str[3] = '0' + (Rev / 10);
00146     Str[4] = '0' + (Rev % 10);
00147     Str[5] = '\0';
00148     Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
00149   } else {
00150     // Note that the Driver allows versions which aren't representable in the
00151     // define (because we only get a single digit for the minor and micro
00152     // revision numbers). So, we limit them to the maximum representable
00153     // version.
00154     assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
00155     assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
00156     char Str[5];
00157     Str[0] = '0' + (Maj / 10);
00158     Str[1] = '0' + (Maj % 10);
00159     Str[2] = '0' + std::min(Min, 9U);
00160     Str[3] = '0' + std::min(Rev, 9U);
00161     Str[4] = '\0';
00162     Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
00163   }
00164 
00165   PlatformMinVersion = VersionTuple(Maj, Min, Rev);
00166 }
00167 
00168 namespace {
00169 template<typename Target>
00170 class DarwinTargetInfo : public OSTargetInfo<Target> {
00171 protected:
00172   virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
00173                             MacroBuilder &Builder) const {
00174     getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
00175                      this->PlatformMinVersion);
00176   }
00177 
00178 public:
00179   DarwinTargetInfo(const std::string& triple) :
00180     OSTargetInfo<Target>(triple) {
00181       llvm::Triple T = llvm::Triple(triple);
00182       this->TLSSupported = T.isMacOSX() && !T.isMacOSXVersionLT(10,7);
00183       this->MCountName = "\01mcount";
00184     }
00185 
00186   virtual std::string isValidSectionSpecifier(StringRef SR) const {
00187     // Let MCSectionMachO validate this.
00188     StringRef Segment, Section;
00189     unsigned TAA, StubSize;
00190     bool HasTAA;
00191     return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
00192                                                        TAA, HasTAA, StubSize);
00193   }
00194 
00195   virtual const char *getStaticInitSectionSpecifier() const {
00196     // FIXME: We should return 0 when building kexts.
00197     return "__TEXT,__StaticInit,regular,pure_instructions";
00198   }
00199 
00200   /// Darwin does not support protected visibility.  Darwin's "default"
00201   /// is very similar to ELF's "protected";  Darwin requires a "weak"
00202   /// attribute on declarations that can be dynamically replaced.
00203   virtual bool hasProtectedVisibility() const {
00204     return false;
00205   }
00206 };
00207 
00208 
00209 // DragonFlyBSD Target
00210 template<typename Target>
00211 class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
00212 protected:
00213   virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
00214                             MacroBuilder &Builder) const {
00215     // DragonFly defines; list based off of gcc output
00216     Builder.defineMacro("__DragonFly__");
00217     Builder.defineMacro("__DragonFly_cc_version", "100001");
00218     Builder.defineMacro("__ELF__");
00219     Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
00220     Builder.defineMacro("__tune_i386__");
00221     DefineStd(Builder, "unix", Opts);
00222   }
00223 public:
00224   DragonFlyBSDTargetInfo(const std::string &triple)
00225     : OSTargetInfo<Target>(triple) {
00226       this->UserLabelPrefix = "";
00227 
00228       llvm::Triple Triple(triple);
00229       switch (Triple.getArch()) {
00230         default:
00231         case llvm::Triple::x86:
00232         case llvm::Triple::x86_64:
00233           this->MCountName = ".mcount";
00234           break;
00235       }
00236   }
00237 };
00238 
00239 // FreeBSD Target
00240 template<typename Target>
00241 class FreeBSDTargetInfo : public OSTargetInfo<Target> {
00242 protected:
00243   virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
00244                             MacroBuilder &Builder) const {
00245     // FreeBSD defines; list based off of gcc output
00246 
00247     unsigned Release = Triple.getOSMajorVersion();
00248     if (Release == 0U)
00249       Release = 8;
00250 
00251     Builder.defineMacro("__FreeBSD__", Twine(Release));
00252     Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
00253     Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
00254     DefineStd(Builder, "unix", Opts);
00255     Builder.defineMacro("__ELF__");
00256   }
00257 public:
00258   FreeBSDTargetInfo(const std::string &triple)
00259     : OSTargetInfo<Target>(triple) {
00260       this->UserLabelPrefix = "";
00261 
00262       llvm::Triple Triple(triple);
00263       switch (Triple.getArch()) {
00264         default:
00265         case llvm::Triple::x86:
00266         case llvm::Triple::x86_64:
00267           this->MCountName = ".mcount";
00268           break;
00269         case llvm::Triple::mips:
00270         case llvm::Triple::mipsel:
00271         case llvm::Triple::ppc:
00272         case llvm::Triple::ppc64:
00273           this->MCountName = "_mcount";
00274           break;
00275         case llvm::Triple::arm:
00276           this->MCountName = "__mcount";
00277           break;
00278       }
00279 
00280     }
00281 };
00282 
00283 // Minix Target
00284 template<typename Target>
00285 class MinixTargetInfo : public OSTargetInfo<Target> {
00286 protected:
00287   virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
00288                             MacroBuilder &Builder) const {
00289     // Minix defines
00290 
00291     Builder.defineMacro("__minix", "3");
00292     Builder.defineMacro("_EM_WSIZE", "4");
00293     Builder.defineMacro("_EM_PSIZE", "4");
00294     Builder.defineMacro("_EM_SSIZE", "2");
00295     Builder.defineMacro("_EM_LSIZE", "4");
00296     Builder.defineMacro("_EM_FSIZE", "4");
00297     Builder.defineMacro("_EM_DSIZE", "8");
00298     Builder.defineMacro("__ELF__");
00299     DefineStd(Builder, "unix", Opts);
00300   }
00301 public:
00302   MinixTargetInfo(const std::string &triple)
00303     : OSTargetInfo<Target>(triple) {
00304       this->UserLabelPrefix = "";
00305     }
00306 };
00307 
00308 // Linux target
00309 template<typename Target>
00310 class LinuxTargetInfo : public OSTargetInfo<Target> {
00311 protected:
00312   virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
00313                             MacroBuilder &Builder) const {
00314     // Linux defines; list based off of gcc output
00315     DefineStd(Builder, "unix", Opts);
00316     DefineStd(Builder, "linux", Opts);
00317     Builder.defineMacro("__gnu_linux__");
00318     Builder.defineMacro("__ELF__");
00319     if (Triple.getEnvironment() == llvm::Triple::ANDROIDEABI)
00320       Builder.defineMacro("__ANDROID__", "1");
00321     if (Opts.POSIXThreads)
00322       Builder.defineMacro("_REENTRANT");
00323     if (Opts.CPlusPlus)
00324       Builder.defineMacro("_GNU_SOURCE");
00325   }
00326 public:
00327   LinuxTargetInfo(const std::string& triple)
00328     : OSTargetInfo<Target>(triple) {
00329     this->UserLabelPrefix = "";
00330     this->WIntType = TargetInfo::UnsignedInt;
00331   }
00332 
00333   virtual const char *getStaticInitSectionSpecifier() const {
00334     return ".text.startup";
00335   }
00336 };
00337 
00338 // NetBSD Target
00339 template<typename Target>
00340 class NetBSDTargetInfo : public OSTargetInfo<Target> {
00341 protected:
00342   virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
00343                             MacroBuilder &Builder) const {
00344     // NetBSD defines; list based off of gcc output
00345     Builder.defineMacro("__NetBSD__");
00346     Builder.defineMacro("__unix__");
00347     Builder.defineMacro("__ELF__");
00348     if (Opts.POSIXThreads)
00349       Builder.defineMacro("_POSIX_THREADS");
00350   }
00351 public:
00352   NetBSDTargetInfo(const std::string &triple)
00353     : OSTargetInfo<Target>(triple) {
00354       this->UserLabelPrefix = "";
00355     }
00356 };
00357 
00358 // OpenBSD Target
00359 template<typename Target>
00360 class OpenBSDTargetInfo : public OSTargetInfo<Target> {
00361 protected:
00362   virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
00363                             MacroBuilder &Builder) const {
00364     // OpenBSD defines; list based off of gcc output
00365 
00366     Builder.defineMacro("__OpenBSD__");
00367     DefineStd(Builder, "unix", Opts);
00368     Builder.defineMacro("__ELF__");
00369     if (Opts.POSIXThreads)
00370       Builder.defineMacro("_REENTRANT");
00371   }
00372 public:
00373   OpenBSDTargetInfo(const std::string &triple)
00374     : OSTargetInfo<Target>(triple) {
00375       this->UserLabelPrefix = "";
00376 
00377       llvm::Triple Triple(triple);
00378       switch (Triple.getArch()) {
00379         default:
00380         case llvm::Triple::x86:
00381         case llvm::Triple::x86_64:
00382         case llvm::Triple::arm:
00383   case llvm::Triple::sparc:
00384           this->MCountName = "__mcount";
00385           break;
00386         case llvm::Triple::mips64:
00387         case llvm::Triple::mips64el:
00388         case llvm::Triple::ppc:
00389   case llvm::Triple::sparcv9:
00390           this->MCountName = "_mcount";
00391           break;
00392       }
00393   }
00394 };
00395 
00396 // PSP Target
00397 template<typename Target>
00398 class PSPTargetInfo : public OSTargetInfo<Target> {
00399 protected:
00400   virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
00401                             MacroBuilder &Builder) const {
00402     // PSP defines; list based on the output of the pspdev gcc toolchain.
00403     Builder.defineMacro("PSP");
00404     Builder.defineMacro("_PSP");
00405     Builder.defineMacro("__psp__");
00406     Builder.defineMacro("__ELF__");
00407   }
00408 public:
00409   PSPTargetInfo(const std::string& triple)
00410     : OSTargetInfo<Target>(triple) {
00411     this->UserLabelPrefix = "";
00412   }
00413 };
00414 
00415 // PS3 PPU Target
00416 template<typename Target>
00417 class PS3PPUTargetInfo : public OSTargetInfo<Target> {
00418 protected:
00419   virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
00420                             MacroBuilder &Builder) const {
00421     // PS3 PPU defines.
00422     Builder.defineMacro("__PPC__");
00423     Builder.defineMacro("__PPU__");
00424     Builder.defineMacro("__CELLOS_LV2__");
00425     Builder.defineMacro("__ELF__");
00426     Builder.defineMacro("__LP32__");
00427     Builder.defineMacro("_ARCH_PPC64");
00428     Builder.defineMacro("__powerpc64__");
00429   }
00430 public:
00431   PS3PPUTargetInfo(const std::string& triple)
00432     : OSTargetInfo<Target>(triple) {
00433     this->UserLabelPrefix = "";
00434     this->LongWidth = this->LongAlign = 32;
00435     this->PointerWidth = this->PointerAlign = 32;
00436     this->IntMaxType = TargetInfo::SignedLongLong;
00437     this->UIntMaxType = TargetInfo::UnsignedLongLong;
00438     this->Int64Type = TargetInfo::SignedLongLong;
00439     this->SizeType = TargetInfo::UnsignedInt;
00440     this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
00441                               "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
00442   }
00443 };
00444 
00445 // FIXME: Need a real SPU target.
00446 // PS3 SPU Target
00447 template<typename Target>
00448 class PS3SPUTargetInfo : public OSTargetInfo<Target> {
00449 protected:
00450   virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
00451                             MacroBuilder &Builder) const {
00452     // PS3 PPU defines.
00453     Builder.defineMacro("__SPU__");
00454     Builder.defineMacro("__ELF__");
00455   }
00456 public:
00457   PS3SPUTargetInfo(const std::string& triple)
00458     : OSTargetInfo<Target>(triple) {
00459     this->UserLabelPrefix = "";
00460   }
00461 };
00462 
00463 // AuroraUX target
00464 template<typename Target>
00465 class AuroraUXTargetInfo : public OSTargetInfo<Target> {
00466 protected:
00467   virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
00468                             MacroBuilder &Builder) const {
00469     DefineStd(Builder, "sun", Opts);
00470     DefineStd(Builder, "unix", Opts);
00471     Builder.defineMacro("__ELF__");
00472     Builder.defineMacro("__svr4__");
00473     Builder.defineMacro("__SVR4");
00474   }
00475 public:
00476   AuroraUXTargetInfo(const std::string& triple)
00477     : OSTargetInfo<Target>(triple) {
00478     this->UserLabelPrefix = "";
00479     this->WCharType = this->SignedLong;
00480     // FIXME: WIntType should be SignedLong
00481   }
00482 };
00483 
00484 // Solaris target
00485 template<typename Target>
00486 class SolarisTargetInfo : public OSTargetInfo<Target> {
00487 protected:
00488   virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
00489                             MacroBuilder &Builder) const {
00490     DefineStd(Builder, "sun", Opts);
00491     DefineStd(Builder, "unix", Opts);
00492     Builder.defineMacro("__ELF__");
00493     Builder.defineMacro("__svr4__");
00494     Builder.defineMacro("__SVR4");
00495     // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
00496     // newer, but to 500 for everything else.  feature_test.h has a check to
00497     // ensure that you are not using C99 with an old version of X/Open or C89
00498     // with a new version.  
00499     if (Opts.C99 || Opts.C11)
00500       Builder.defineMacro("_XOPEN_SOURCE", "600");
00501     else
00502       Builder.defineMacro("_XOPEN_SOURCE", "500");
00503     if (Opts.CPlusPlus)
00504       Builder.defineMacro("__C99FEATURES__");
00505     Builder.defineMacro("_LARGEFILE_SOURCE");
00506     Builder.defineMacro("_LARGEFILE64_SOURCE");
00507     Builder.defineMacro("__EXTENSIONS__");
00508     Builder.defineMacro("_REENTRANT");
00509   }
00510 public:
00511   SolarisTargetInfo(const std::string& triple)
00512     : OSTargetInfo<Target>(triple) {
00513     this->UserLabelPrefix = "";
00514     this->WCharType = this->SignedInt;
00515     // FIXME: WIntType should be SignedLong
00516   }
00517 };
00518 
00519 // Windows target
00520 template<typename Target>
00521 class WindowsTargetInfo : public OSTargetInfo<Target> {
00522 protected:
00523   virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
00524                             MacroBuilder &Builder) const {
00525     Builder.defineMacro("_WIN32");
00526   }
00527   void getVisualStudioDefines(const LangOptions &Opts,
00528                               MacroBuilder &Builder) const {
00529     if (Opts.CPlusPlus) {
00530       if (Opts.RTTI)
00531         Builder.defineMacro("_CPPRTTI");
00532 
00533       if (Opts.Exceptions)
00534         Builder.defineMacro("_CPPUNWIND");
00535     }
00536 
00537     if (!Opts.CharIsSigned)
00538       Builder.defineMacro("_CHAR_UNSIGNED");
00539 
00540     // FIXME: POSIXThreads isn't exactly the option this should be defined for,
00541     //        but it works for now.
00542     if (Opts.POSIXThreads)
00543       Builder.defineMacro("_MT");
00544 
00545     if (Opts.MSCVersion != 0)
00546       Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion));
00547 
00548     if (Opts.MicrosoftExt) {
00549       Builder.defineMacro("_MSC_EXTENSIONS");
00550 
00551       if (Opts.CPlusPlus0x) {
00552         Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
00553         Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
00554         Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
00555       }
00556     }
00557 
00558     Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
00559   }
00560 
00561 public:
00562   WindowsTargetInfo(const std::string &triple)
00563     : OSTargetInfo<Target>(triple) {}
00564 };
00565 
00566 } // end anonymous namespace.
00567 
00568 //===----------------------------------------------------------------------===//
00569 // Specific target implementations.
00570 //===----------------------------------------------------------------------===//
00571 
00572 namespace {
00573 // PPC abstract base class
00574 class PPCTargetInfo : public TargetInfo {
00575   static const Builtin::Info BuiltinInfo[];
00576   static const char * const GCCRegNames[];
00577   static const TargetInfo::GCCRegAlias GCCRegAliases[];
00578 public:
00579   PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {
00580     LongDoubleWidth = LongDoubleAlign = 128;
00581     LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
00582   }
00583 
00584   virtual void getTargetBuiltins(const Builtin::Info *&Records,
00585                                  unsigned &NumRecords) const {
00586     Records = BuiltinInfo;
00587     NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
00588   }
00589 
00590   virtual bool isCLZForZeroUndef() const { return false; }
00591 
00592   virtual void getTargetDefines(const LangOptions &Opts,
00593                                 MacroBuilder &Builder) const;
00594 
00595   virtual bool hasFeature(StringRef Feature) const;
00596   
00597   virtual void getGCCRegNames(const char * const *&Names,
00598                               unsigned &NumNames) const;
00599   virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
00600                                 unsigned &NumAliases) const;
00601   virtual bool validateAsmConstraint(const char *&Name,
00602                                      TargetInfo::ConstraintInfo &Info) const {
00603     switch (*Name) {
00604     default: return false;
00605     case 'O': // Zero
00606       break;
00607     case 'b': // Base register
00608     case 'f': // Floating point register
00609       Info.setAllowsRegister();
00610       break;
00611     // FIXME: The following are added to allow parsing.
00612     // I just took a guess at what the actions should be.
00613     // Also, is more specific checking needed?  I.e. specific registers?
00614     case 'd': // Floating point register (containing 64-bit value)
00615     case 'v': // Altivec vector register
00616       Info.setAllowsRegister();
00617       break;
00618     case 'w':
00619       switch (Name[1]) {
00620         case 'd':// VSX vector register to hold vector double data
00621         case 'f':// VSX vector register to hold vector float data
00622         case 's':// VSX vector register to hold scalar float data
00623         case 'a':// Any VSX register
00624           break;
00625         default:
00626           return false;
00627       }
00628       Info.setAllowsRegister();
00629       Name++; // Skip over 'w'.
00630       break;
00631     case 'h': // `MQ', `CTR', or `LINK' register
00632     case 'q': // `MQ' register
00633     case 'c': // `CTR' register
00634     case 'l': // `LINK' register
00635     case 'x': // `CR' register (condition register) number 0
00636     case 'y': // `CR' register (condition register)
00637     case 'z': // `XER[CA]' carry bit (part of the XER register)
00638       Info.setAllowsRegister();
00639       break;
00640     case 'I': // Signed 16-bit constant
00641     case 'J': // Unsigned 16-bit constant shifted left 16 bits
00642               //  (use `L' instead for SImode constants)
00643     case 'K': // Unsigned 16-bit constant
00644     case 'L': // Signed 16-bit constant shifted left 16 bits
00645     case 'M': // Constant larger than 31
00646     case 'N': // Exact power of 2
00647     case 'P': // Constant whose negation is a signed 16-bit constant
00648     case 'G': // Floating point constant that can be loaded into a
00649               // register with one instruction per word
00650     case 'H': // Integer/Floating point constant that can be loaded
00651               // into a register using three instructions
00652       break;
00653     case 'm': // Memory operand. Note that on PowerPC targets, m can
00654               // include addresses that update the base register. It
00655               // is therefore only safe to use `m' in an asm statement
00656               // if that asm statement accesses the operand exactly once.
00657               // The asm statement must also use `%U<opno>' as a
00658               // placeholder for the "update" flag in the corresponding
00659               // load or store instruction. For example:
00660               // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
00661               // is correct but:
00662               // asm ("st %1,%0" : "=m" (mem) : "r" (val));
00663               // is not. Use es rather than m if you don't want the base
00664               // register to be updated.
00665     case 'e':
00666       if (Name[1] != 's')
00667           return false;
00668               // es: A "stable" memory operand; that is, one which does not
00669               // include any automodification of the base register. Unlike
00670               // `m', this constraint can be used in asm statements that
00671               // might access the operand several times, or that might not
00672               // access it at all.
00673       Info.setAllowsMemory();
00674       Name++; // Skip over 'e'.
00675       break;
00676     case 'Q': // Memory operand that is an offset from a register (it is
00677               // usually better to use `m' or `es' in asm statements)
00678     case 'Z': // Memory operand that is an indexed or indirect from a
00679               // register (it is usually better to use `m' or `es' in
00680               // asm statements)
00681       Info.setAllowsMemory();
00682       Info.setAllowsRegister();
00683       break;
00684     case 'R': // AIX TOC entry
00685     case 'a': // Address operand that is an indexed or indirect from a
00686               // register (`p' is preferable for asm statements)
00687     case 'S': // Constant suitable as a 64-bit mask operand
00688     case 'T': // Constant suitable as a 32-bit mask operand
00689     case 'U': // System V Release 4 small data area reference
00690     case 't': // AND masks that can be performed by two rldic{l, r}
00691               // instructions
00692     case 'W': // Vector constant that does not require memory
00693     case 'j': // Vector constant that is all zeros.
00694       break;
00695     // End FIXME.
00696     }
00697     return true;
00698   }
00699   virtual const char *getClobbers() const {
00700     return "";
00701   }
00702 };
00703 
00704 const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
00705 #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
00706 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
00707                                               ALL_LANGUAGES },
00708 #include "clang/Basic/BuiltinsPPC.def"
00709 };
00710 
00711 
00712 /// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
00713 /// #defines that are not tied to a specific subtarget.
00714 void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
00715                                      MacroBuilder &Builder) const {
00716   // Target identification.
00717   Builder.defineMacro("__ppc__");
00718   Builder.defineMacro("_ARCH_PPC");
00719   Builder.defineMacro("__powerpc__");
00720   Builder.defineMacro("__POWERPC__");
00721   if (PointerWidth == 64) {
00722     Builder.defineMacro("_ARCH_PPC64");
00723     Builder.defineMacro("_LP64");
00724     Builder.defineMacro("__LP64__");
00725     Builder.defineMacro("__powerpc64__");
00726     Builder.defineMacro("__ppc64__");
00727   } else {
00728     Builder.defineMacro("__ppc__");
00729   }
00730 
00731   // Target properties.
00732   if (getTriple().getOS() != llvm::Triple::NetBSD)
00733     Builder.defineMacro("_BIG_ENDIAN");
00734   Builder.defineMacro("__BIG_ENDIAN__");
00735 
00736   // Subtarget options.
00737   Builder.defineMacro("__NATURAL_ALIGNMENT__");
00738   Builder.defineMacro("__REGISTER_PREFIX__", "");
00739 
00740   // FIXME: Should be controlled by command line option.
00741   Builder.defineMacro("__LONG_DOUBLE_128__");
00742 
00743   if (Opts.AltiVec) {
00744     Builder.defineMacro("__VEC__", "10206");
00745     Builder.defineMacro("__ALTIVEC__");
00746   }
00747 }
00748 
00749 bool PPCTargetInfo::hasFeature(StringRef Feature) const {
00750   return Feature == "powerpc";
00751 }
00752 
00753   
00754 const char * const PPCTargetInfo::GCCRegNames[] = {
00755   "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
00756   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
00757   "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
00758   "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
00759   "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
00760   "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
00761   "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
00762   "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
00763   "mq", "lr", "ctr", "ap",
00764   "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
00765   "xer",
00766   "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
00767   "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
00768   "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
00769   "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
00770   "vrsave", "vscr",
00771   "spe_acc", "spefscr",
00772   "sfp"
00773 };
00774 
00775 void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
00776                                    unsigned &NumNames) const {
00777   Names = GCCRegNames;
00778   NumNames = llvm::array_lengthof(GCCRegNames);
00779 }
00780 
00781 const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
00782   // While some of these aliases do map to different registers
00783   // they still share the same register name.
00784   { { "0" }, "r0" },
00785   { { "1"}, "r1" },
00786   { { "2" }, "r2" },
00787   { { "3" }, "r3" },
00788   { { "4" }, "r4" },
00789   { { "5" }, "r5" },
00790   { { "6" }, "r6" },
00791   { { "7" }, "r7" },
00792   { { "8" }, "r8" },
00793   { { "9" }, "r9" },
00794   { { "10" }, "r10" },
00795   { { "11" }, "r11" },
00796   { { "12" }, "r12" },
00797   { { "13" }, "r13" },
00798   { { "14" }, "r14" },
00799   { { "15" }, "r15" },
00800   { { "16" }, "r16" },
00801   { { "17" }, "r17" },
00802   { { "18" }, "r18" },
00803   { { "19" }, "r19" },
00804   { { "20" }, "r20" },
00805   { { "21" }, "r21" },
00806   { { "22" }, "r22" },
00807   { { "23" }, "r23" },
00808   { { "24" }, "r24" },
00809   { { "25" }, "r25" },
00810   { { "26" }, "r26" },
00811   { { "27" }, "r27" },
00812   { { "28" }, "r28" },
00813   { { "29" }, "r29" },
00814   { { "30" }, "r30" },
00815   { { "31" }, "r31" },
00816   { { "fr0" }, "f0" },
00817   { { "fr1" }, "f1" },
00818   { { "fr2" }, "f2" },
00819   { { "fr3" }, "f3" },
00820   { { "fr4" }, "f4" },
00821   { { "fr5" }, "f5" },
00822   { { "fr6" }, "f6" },
00823   { { "fr7" }, "f7" },
00824   { { "fr8" }, "f8" },
00825   { { "fr9" }, "f9" },
00826   { { "fr10" }, "f10" },
00827   { { "fr11" }, "f11" },
00828   { { "fr12" }, "f12" },
00829   { { "fr13" }, "f13" },
00830   { { "fr14" }, "f14" },
00831   { { "fr15" }, "f15" },
00832   { { "fr16" }, "f16" },
00833   { { "fr17" }, "f17" },
00834   { { "fr18" }, "f18" },
00835   { { "fr19" }, "f19" },
00836   { { "fr20" }, "f20" },
00837   { { "fr21" }, "f21" },
00838   { { "fr22" }, "f22" },
00839   { { "fr23" }, "f23" },
00840   { { "fr24" }, "f24" },
00841   { { "fr25" }, "f25" },
00842   { { "fr26" }, "f26" },
00843   { { "fr27" }, "f27" },
00844   { { "fr28" }, "f28" },
00845   { { "fr29" }, "f29" },
00846   { { "fr30" }, "f30" },
00847   { { "fr31" }, "f31" },
00848   { { "cc" }, "cr0" },
00849 };
00850 
00851 void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
00852                                      unsigned &NumAliases) const {
00853   Aliases = GCCRegAliases;
00854   NumAliases = llvm::array_lengthof(GCCRegAliases);
00855 }
00856 } // end anonymous namespace.
00857 
00858 namespace {
00859 class PPC32TargetInfo : public PPCTargetInfo {
00860 public:
00861   PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
00862     DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
00863                         "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
00864 
00865     switch (getTriple().getOS()) {
00866     case llvm::Triple::Linux:
00867     case llvm::Triple::FreeBSD:
00868     case llvm::Triple::NetBSD:
00869       SizeType = UnsignedInt;
00870       PtrDiffType = SignedInt;
00871       IntPtrType = SignedInt;
00872       break;
00873     default:
00874       break;
00875     }
00876 
00877     if (getTriple().getOS() == llvm::Triple::FreeBSD) {
00878       LongDoubleWidth = LongDoubleAlign = 64;
00879       LongDoubleFormat = &llvm::APFloat::IEEEdouble;
00880     }
00881   }
00882 
00883   virtual const char *getVAListDeclaration() const {
00884     // This is the ELF definition, and is overridden by the Darwin sub-target
00885     return "typedef struct __va_list_tag {"
00886            "  unsigned char gpr;"
00887            "  unsigned char fpr;"
00888            "  unsigned short reserved;"
00889            "  void* overflow_arg_area;"
00890            "  void* reg_save_area;"
00891            "} __builtin_va_list[1];";
00892   }
00893 };
00894 } // end anonymous namespace.
00895 
00896 namespace {
00897 class PPC64TargetInfo : public PPCTargetInfo {
00898 public:
00899   PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
00900     LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
00901     IntMaxType = SignedLong;
00902     UIntMaxType = UnsignedLong;
00903     Int64Type = SignedLong;
00904     DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
00905                         "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
00906 
00907     if (getTriple().getOS() == llvm::Triple::FreeBSD) {
00908       LongDoubleWidth = LongDoubleAlign = 64;
00909       LongDoubleFormat = &llvm::APFloat::IEEEdouble;
00910     }
00911   }
00912   virtual const char *getVAListDeclaration() const {
00913     return "typedef char* __builtin_va_list;";
00914   }
00915 };
00916 } // end anonymous namespace.
00917 
00918 
00919 namespace {
00920 class DarwinPPC32TargetInfo :
00921   public DarwinTargetInfo<PPC32TargetInfo> {
00922 public:
00923   DarwinPPC32TargetInfo(const std::string& triple)
00924     : DarwinTargetInfo<PPC32TargetInfo>(triple) {
00925     HasAlignMac68kSupport = true;
00926     BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
00927     LongLongAlign = 32;
00928     SuitableAlign = 128;
00929     DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
00930                         "i64:32:64-f32:32:32-f64:64:64-v128:128:128-n32";
00931   }
00932   virtual const char *getVAListDeclaration() const {
00933     return "typedef char* __builtin_va_list;";
00934   }
00935 };
00936 
00937 class DarwinPPC64TargetInfo :
00938   public DarwinTargetInfo<PPC64TargetInfo> {
00939 public:
00940   DarwinPPC64TargetInfo(const std::string& triple)
00941     : DarwinTargetInfo<PPC64TargetInfo>(triple) {
00942     HasAlignMac68kSupport = true;
00943     SuitableAlign = 128;
00944   }
00945 };
00946 } // end anonymous namespace.
00947 
00948 namespace {
00949   static const unsigned PTXAddrSpaceMap[] = {
00950     0,    // opencl_global
00951     4,    // opencl_local
00952     1,    // opencl_constant
00953     0,    // cuda_device
00954     1,    // cuda_constant
00955     4,    // cuda_shared
00956   };
00957   class PTXTargetInfo : public TargetInfo {
00958     static const char * const GCCRegNames[];
00959     static const Builtin::Info BuiltinInfo[];
00960     std::vector<llvm::StringRef> AvailableFeatures;
00961   public:
00962     PTXTargetInfo(const std::string& triple) : TargetInfo(triple) {
00963       BigEndian = false;
00964       TLSSupported = false;
00965       LongWidth = LongAlign = 64;
00966       AddrSpaceMap = &PTXAddrSpaceMap;
00967       // Define available target features
00968       // These must be defined in sorted order!      
00969       AvailableFeatures.push_back("compute10");
00970       AvailableFeatures.push_back("compute11");
00971       AvailableFeatures.push_back("compute12");
00972       AvailableFeatures.push_back("compute13");
00973       AvailableFeatures.push_back("compute20");
00974       AvailableFeatures.push_back("double");
00975       AvailableFeatures.push_back("no-fma");
00976       AvailableFeatures.push_back("ptx20");
00977       AvailableFeatures.push_back("ptx21");
00978       AvailableFeatures.push_back("ptx22");
00979       AvailableFeatures.push_back("ptx23");
00980       AvailableFeatures.push_back("sm10");
00981       AvailableFeatures.push_back("sm11");
00982       AvailableFeatures.push_back("sm12");
00983       AvailableFeatures.push_back("sm13");
00984       AvailableFeatures.push_back("sm20");
00985       AvailableFeatures.push_back("sm21");
00986       AvailableFeatures.push_back("sm22");
00987       AvailableFeatures.push_back("sm23");
00988     }
00989     virtual void getTargetDefines(const LangOptions &Opts,
00990                                   MacroBuilder &Builder) const {
00991       Builder.defineMacro("__PTX__");
00992     }
00993     virtual void getTargetBuiltins(const Builtin::Info *&Records,
00994                                    unsigned &NumRecords) const {
00995       Records = BuiltinInfo;
00996       NumRecords = clang::PTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
00997     }
00998     virtual bool hasFeature(StringRef Feature) const {
00999       return Feature == "ptx";
01000     }
01001     
01002     virtual void getGCCRegNames(const char * const *&Names,
01003                                 unsigned &NumNames) const;
01004     virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
01005                                   unsigned &NumAliases) const {
01006       // No aliases.
01007       Aliases = 0;
01008       NumAliases = 0;
01009     }
01010     virtual bool validateAsmConstraint(const char *&Name,
01011                                        TargetInfo::ConstraintInfo &info) const {
01012       // FIXME: implement
01013       return true;
01014     }
01015     virtual const char *getClobbers() const {
01016       // FIXME: Is this really right?
01017       return "";
01018     }
01019     virtual const char *getVAListDeclaration() const {
01020       // FIXME: implement
01021       return "typedef char* __builtin_va_list;";
01022     }
01023 
01024     virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
01025                                    StringRef Name,
01026                                    bool Enabled) const;
01027   };
01028 
01029   const Builtin::Info PTXTargetInfo::BuiltinInfo[] = {
01030 #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
01031 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
01032                                               ALL_LANGUAGES },
01033 #include "clang/Basic/BuiltinsPTX.def"
01034   };
01035 
01036   const char * const PTXTargetInfo::GCCRegNames[] = {
01037     "r0"
01038   };
01039 
01040   void PTXTargetInfo::getGCCRegNames(const char * const *&Names,
01041                                      unsigned &NumNames) const {
01042     Names = GCCRegNames;
01043     NumNames = llvm::array_lengthof(GCCRegNames);
01044   }
01045 
01046   bool PTXTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
01047                                         StringRef Name,
01048                                         bool Enabled) const {
01049     if(std::binary_search(AvailableFeatures.begin(), AvailableFeatures.end(),
01050                           Name)) {
01051       Features[Name] = Enabled;
01052       return true;
01053     } else {
01054       return false;
01055     }
01056   }
01057 
01058   class PTX32TargetInfo : public PTXTargetInfo {
01059   public:
01060   PTX32TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
01061       PointerWidth = PointerAlign = 32;
01062       SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
01063       DescriptionString
01064         = "e-p:32:32-i64:64:64-f64:64:64-n1:8:16:32:64";
01065     }
01066   };
01067 
01068   class PTX64TargetInfo : public PTXTargetInfo {
01069   public:
01070   PTX64TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
01071       PointerWidth = PointerAlign = 64;
01072       SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
01073       DescriptionString
01074         = "e-p:64:64-i64:64:64-f64:64:64-n1:8:16:32:64";
01075     }
01076   };
01077 }
01078 
01079 namespace {
01080   static const unsigned NVPTXAddrSpaceMap[] = {
01081     1,    // opencl_global
01082     3,    // opencl_local
01083     4,    // opencl_constant
01084     1,    // cuda_device
01085     4,    // cuda_constant
01086     3,    // cuda_shared
01087   };
01088   class NVPTXTargetInfo : public TargetInfo {
01089     static const char * const GCCRegNames[];
01090   public:
01091     NVPTXTargetInfo(const std::string& triple) : TargetInfo(triple) {
01092       BigEndian = false;
01093       TLSSupported = false;
01094       LongWidth = LongAlign = 64;
01095       AddrSpaceMap = &NVPTXAddrSpaceMap;
01096     }
01097     virtual void getTargetDefines(const LangOptions &Opts,
01098                                   MacroBuilder &Builder) const {
01099       Builder.defineMacro("__PTX__");
01100     }
01101     virtual void getTargetBuiltins(const Builtin::Info *&Records,
01102                                    unsigned &NumRecords) const {
01103       // FIXME: implement.
01104       Records = 0;
01105       NumRecords = 0;
01106     }
01107     virtual bool hasFeature(StringRef Feature) const {
01108       return Feature == "nvptx";
01109     }
01110     
01111     virtual void getGCCRegNames(const char * const *&Names,
01112                                 unsigned &NumNames) const;
01113     virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
01114                                   unsigned &NumAliases) const {
01115       // No aliases.
01116       Aliases = 0;
01117       NumAliases = 0;
01118     }
01119     virtual bool validateAsmConstraint(const char *&Name,
01120                                        TargetInfo::ConstraintInfo &info) const {
01121       // FIXME: implement
01122       return true;
01123     }
01124     virtual const char *getClobbers() const {
01125       // FIXME: Is this really right?
01126       return "";
01127     }
01128     virtual const char *getVAListDeclaration() const {
01129       // FIXME: implement
01130       return "typedef char* __builtin_va_list;";
01131     }
01132     virtual bool setCPU(const std::string &Name) {
01133       return Name == "sm_10";
01134     }
01135   };
01136 
01137   const char * const NVPTXTargetInfo::GCCRegNames[] = {
01138     "r0"
01139   };
01140 
01141   void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
01142                                      unsigned &NumNames) const {
01143     Names = GCCRegNames;
01144     NumNames = llvm::array_lengthof(GCCRegNames);
01145   }
01146 
01147   class NVPTX32TargetInfo : public NVPTXTargetInfo {
01148   public:
01149   NVPTX32TargetInfo(const std::string& triple) : NVPTXTargetInfo(triple) {
01150       PointerWidth = PointerAlign = 32;
01151       SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
01152       DescriptionString
01153         = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
01154           "f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-"
01155           "n16:32:64";
01156     }
01157   };
01158 
01159   class NVPTX64TargetInfo : public NVPTXTargetInfo {
01160   public:
01161   NVPTX64TargetInfo(const std::string& triple) : NVPTXTargetInfo(triple) {
01162       PointerWidth = PointerAlign = 64;
01163       SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
01164       DescriptionString
01165         = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
01166           "f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-"
01167           "n16:32:64";
01168     }
01169   };
01170 }
01171 
01172 namespace {
01173 // MBlaze abstract base class
01174 class MBlazeTargetInfo : public TargetInfo {
01175   static const char * const GCCRegNames[];
01176   static const TargetInfo::GCCRegAlias GCCRegAliases[];
01177 
01178 public:
01179   MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
01180     DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
01181   }
01182 
01183   virtual void getTargetBuiltins(const Builtin::Info *&Records,
01184                                  unsigned &NumRecords) const {
01185     // FIXME: Implement.
01186     Records = 0;
01187     NumRecords = 0;
01188   }
01189 
01190   virtual void getTargetDefines(const LangOptions &Opts,
01191                                 MacroBuilder &Builder) const;
01192 
01193   virtual bool hasFeature(StringRef Feature) const {
01194     return Feature == "mblaze";
01195   }
01196   
01197   virtual const char *getVAListDeclaration() const {
01198     return "typedef char* __builtin_va_list;";
01199   }
01200   virtual const char *getTargetPrefix() const {
01201     return "mblaze";
01202   }
01203   virtual void getGCCRegNames(const char * const *&Names,
01204                               unsigned &NumNames) const;
01205   virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
01206                                 unsigned &NumAliases) const;
01207   virtual bool validateAsmConstraint(const char *&Name,
01208                                      TargetInfo::ConstraintInfo &Info) const {
01209     switch (*Name) {
01210     default: return false;
01211     case 'O': // Zero
01212       return true;
01213     case 'b': // Base register
01214     case 'f': // Floating point register
01215       Info.setAllowsRegister();
01216       return true;
01217     }
01218   }
01219   virtual const char *getClobbers() const {
01220     return "";
01221   }
01222 };
01223 
01224 /// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
01225 /// #defines that are not tied to a specific subtarget.
01226 void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
01227                                      MacroBuilder &Builder) const {
01228   // Target identification.
01229   Builder.defineMacro("__microblaze__");
01230   Builder.defineMacro("_ARCH_MICROBLAZE");
01231   Builder.defineMacro("__MICROBLAZE__");
01232 
01233   // Target properties.
01234   Builder.defineMacro("_BIG_ENDIAN");
01235   Builder.defineMacro("__BIG_ENDIAN__");
01236 
01237   // Subtarget options.
01238   Builder.defineMacro("__REGISTER_PREFIX__", "");
01239 }
01240 
01241 
01242 const char * const MBlazeTargetInfo::GCCRegNames[] = {
01243   "r0",   "r1",   "r2",   "r3",   "r4",   "r5",   "r6",   "r7",
01244   "r8",   "r9",   "r10",  "r11",  "r12",  "r13",  "r14",  "r15",
01245   "r16",  "r17",  "r18",  "r19",  "r20",  "r21",  "r22",  "r23",
01246   "r24",  "r25",  "r26",  "r27",  "r28",  "r29",  "r30",  "r31",
01247   "$f0",  "$f1",  "$f2",  "$f3",  "$f4",  "$f5",  "$f6",  "$f7",
01248   "$f8",  "$f9",  "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
01249   "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
01250   "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
01251   "hi",   "lo",   "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
01252   "$fcc5","$fcc6","$fcc7","$ap",  "$rap", "$frp"
01253 };
01254 
01255 void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
01256                                    unsigned &NumNames) const {
01257   Names = GCCRegNames;
01258   NumNames = llvm::array_lengthof(GCCRegNames);
01259 }
01260 
01261 const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
01262   { {"f0"},  "r0" },
01263   { {"f1"},  "r1" },
01264   { {"f2"},  "r2" },
01265   { {"f3"},  "r3" },
01266   { {"f4"},  "r4" },
01267   { {"f5"},  "r5" },
01268   { {"f6"},  "r6" },
01269   { {"f7"},  "r7" },
01270   { {"f8"},  "r8" },
01271   { {"f9"},  "r9" },
01272   { {"f10"}, "r10" },
01273   { {"f11"}, "r11" },
01274   { {"f12"}, "r12" },
01275   { {"f13"}, "r13" },
01276   { {"f14"}, "r14" },
01277   { {"f15"}, "r15" },
01278   { {"f16"}, "r16" },
01279   { {"f17"}, "r17" },
01280   { {"f18"}, "r18" },
01281   { {"f19"}, "r19" },
01282   { {"f20"}, "r20" },
01283   { {"f21"}, "r21" },
01284   { {"f22"}, "r22" },
01285   { {"f23"}, "r23" },
01286   { {"f24"}, "r24" },
01287   { {"f25"}, "r25" },
01288   { {"f26"}, "r26" },
01289   { {"f27"}, "r27" },
01290   { {"f28"}, "r28" },
01291   { {"f29"}, "r29" },
01292   { {"f30"}, "r30" },
01293   { {"f31"}, "r31" },
01294 };
01295 
01296 void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
01297                                      unsigned &NumAliases) const {
01298   Aliases = GCCRegAliases;
01299   NumAliases = llvm::array_lengthof(GCCRegAliases);
01300 }
01301 } // end anonymous namespace.
01302 
01303 namespace {
01304 // Namespace for x86 abstract base class
01305 const Builtin::Info BuiltinInfo[] = {
01306 #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
01307 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
01308                                               ALL_LANGUAGES },
01309 #include "clang/Basic/BuiltinsX86.def"
01310 };
01311 
01312 static const char* const GCCRegNames[] = {
01313   "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
01314   "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
01315   "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
01316   "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
01317   "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
01318   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
01319   "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
01320   "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
01321   "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
01322 };
01323 
01324 const TargetInfo::AddlRegName AddlRegNames[] = {
01325   { { "al", "ah", "eax", "rax" }, 0 },
01326   { { "bl", "bh", "ebx", "rbx" }, 3 },
01327   { { "cl", "ch", "ecx", "rcx" }, 2 },
01328   { { "dl", "dh", "edx", "rdx" }, 1 },
01329   { { "esi", "rsi" }, 4 },
01330   { { "edi", "rdi" }, 5 },
01331   { { "esp", "rsp" }, 7 },
01332   { { "ebp", "rbp" }, 6 },
01333 };
01334 
01335 // X86 target abstract base class; x86-32 and x86-64 are very close, so
01336 // most of the implementation can be shared.
01337 class X86TargetInfo : public TargetInfo {
01338   enum X86SSEEnum {
01339     NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2
01340   } SSELevel;
01341   enum MMX3DNowEnum {
01342     NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
01343   } MMX3DNowLevel;
01344 
01345   bool HasAES;
01346   bool HasLZCNT;
01347   bool HasBMI;
01348   bool HasBMI2;
01349   bool HasPOPCNT;
01350   bool HasFMA4;
01351 
01352   /// \brief Enumeration of all of the X86 CPUs supported by Clang.
01353   ///
01354   /// Each enumeration represents a particular CPU supported by Clang. These
01355   /// loosely correspond to the options passed to '-march' or '-mtune' flags.
01356   enum CPUKind {
01357     CK_Generic,
01358 
01359     /// \name i386
01360     /// i386-generation processors.
01361     //@{
01362     CK_i386,
01363     //@}
01364 
01365     /// \name i486
01366     /// i486-generation processors.
01367     //@{
01368     CK_i486,
01369     CK_WinChipC6,
01370     CK_WinChip2,
01371     CK_C3,
01372     //@}
01373 
01374     /// \name i586
01375     /// i586-generation processors, P5 microarchitecture based.
01376     //@{
01377     CK_i586,
01378     CK_Pentium,
01379     CK_PentiumMMX,
01380     //@}
01381 
01382     /// \name i686
01383     /// i686-generation processors, P6 / Pentium M microarchitecture based.
01384     //@{
01385     CK_i686,
01386     CK_PentiumPro,
01387     CK_Pentium2,
01388     CK_Pentium3,
01389     CK_Pentium3M,
01390     CK_PentiumM,
01391     CK_C3_2,
01392 
01393     /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
01394     /// Clang however has some logic to suport this.
01395     // FIXME: Warn, deprecate, and potentially remove this.
01396     CK_Yonah,
01397     //@}
01398 
01399     /// \name Netburst
01400     /// Netburst microarchitecture based processors.
01401     //@{
01402     CK_Pentium4,
01403     CK_Pentium4M,
01404     CK_Prescott,
01405     CK_Nocona,
01406     //@}
01407 
01408     /// \name Core
01409     /// Core microarchitecture based processors.
01410     //@{
01411     CK_Core2,
01412 
01413     /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
01414     /// codename which GCC no longer accepts as an option to -march, but Clang
01415     /// has some logic for recognizing it.
01416     // FIXME: Warn, deprecate, and potentially remove this.
01417     CK_Penryn,
01418     //@}
01419 
01420     /// \name Atom
01421     /// Atom processors
01422     //@{
01423     CK_Atom,
01424     //@}
01425 
01426     /// \name Nehalem
01427     /// Nehalem microarchitecture based processors.
01428     //@{
01429     CK_Corei7,
01430     CK_Corei7AVX,
01431     CK_CoreAVXi,
01432     CK_CoreAVX2,
01433     //@}
01434 
01435     /// \name K6
01436     /// K6 architecture processors.
01437     //@{
01438     CK_K6,
01439     CK_K6_2,
01440     CK_K6_3,
01441     //@}
01442 
01443     /// \name K7
01444     /// K7 architecture processors.
01445     //@{
01446     CK_Athlon,
01447     CK_AthlonThunderbird,
01448     CK_Athlon4,
01449     CK_AthlonXP,
01450     CK_AthlonMP,
01451     //@}
01452 
01453     /// \name K8
01454     /// K8 architecture processors.
01455     //@{
01456     CK_Athlon64,
01457     CK_Athlon64SSE3,
01458     CK_AthlonFX,
01459     CK_K8,
01460     CK_K8SSE3,
01461     CK_Opteron,
01462     CK_OpteronSSE3,
01463     CK_AMDFAM10,
01464     //@}
01465 
01466     /// \name Bobcat
01467     /// Bobcat architecture processors.
01468     //@{
01469     CK_BTVER1,
01470     //@}
01471 
01472     /// \name Bulldozer
01473     /// Bulldozer architecture processors.
01474     //@{
01475     CK_BDVER1,
01476     CK_BDVER2,
01477     //@}
01478 
01479     /// This specification is deprecated and will be removed in the future.
01480     /// Users should prefer \see CK_K8.
01481     // FIXME: Warn on this when the CPU is set to it.
01482     CK_x86_64,
01483     //@}
01484 
01485     /// \name Geode
01486     /// Geode processors.
01487     //@{
01488     CK_Geode
01489     //@}
01490   } CPU;
01491 
01492 public:
01493   X86TargetInfo(const std::string& triple)
01494     : TargetInfo(triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
01495       HasAES(false), HasLZCNT(false), HasBMI(false), HasBMI2(false),
01496       HasPOPCNT(false), HasFMA4(false), CPU(CK_Generic) {
01497     BigEndian = false;
01498     LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
01499   }
01500   virtual unsigned getFloatEvalMethod() const {
01501     // X87 evaluates with 80 bits "long double" precision.
01502     return SSELevel == NoSSE ? 2 : 0;
01503   }
01504   virtual void getTargetBuiltins(const Builtin::Info *&Records,
01505                                  unsigned &NumRecords) const {
01506     Records = BuiltinInfo;
01507     NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
01508   }
01509   virtual void getGCCRegNames(const char * const *&Names,
01510                               unsigned &NumNames) const {
01511     Names = GCCRegNames;
01512     NumNames = llvm::array_lengthof(GCCRegNames);
01513   }
01514   virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
01515                                 unsigned &NumAliases) const {
01516     Aliases = 0;
01517     NumAliases = 0;
01518   }
01519   virtual void getGCCAddlRegNames(const AddlRegName *&Names,
01520           unsigned &NumNames) const {
01521     Names = AddlRegNames;
01522     NumNames = llvm::array_lengthof(AddlRegNames);
01523   }
01524   virtual bool validateAsmConstraint(const char *&Name,
01525                                      TargetInfo::ConstraintInfo &info) const;
01526   virtual std::string convertConstraint(const char *&Constraint) const;
01527   virtual const char *getClobbers() const {
01528     return "~{dirflag},~{fpsr},~{flags}";
01529   }
01530   virtual void getTargetDefines(const LangOptions &Opts,
01531                                 MacroBuilder &Builder) const;
01532   virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
01533                                  StringRef Name,
01534                                  bool Enabled) const;
01535   virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
01536   virtual bool hasFeature(StringRef Feature) const;
01537   virtual void HandleTargetFeatures(std::vector<std::string> &Features);
01538   virtual const char* getABI() const {
01539     if (PointerWidth == 64 && SSELevel >= AVX)
01540       return "avx";
01541     else if (PointerWidth == 32 && MMX3DNowLevel == NoMMX3DNow)
01542       return "no-mmx";
01543     return "";
01544   }
01545   virtual bool setCPU(const std::string &Name) {
01546     CPU = llvm::StringSwitch<CPUKind>(Name)
01547       .Case("i386", CK_i386)
01548       .Case("i486", CK_i486)
01549       .Case("winchip-c6", CK_WinChipC6)
01550       .Case("winchip2", CK_WinChip2)
01551       .Case("c3", CK_C3)
01552       .Case("i586", CK_i586)
01553       .Case("pentium", CK_Pentium)
01554       .Case("pentium-mmx", CK_PentiumMMX)
01555       .Case("i686", CK_i686)
01556       .Case("pentiumpro", CK_PentiumPro)
01557       .Case("pentium2", CK_Pentium2)
01558       .Case("pentium3", CK_Pentium3)
01559       .Case("pentium3m", CK_Pentium3M)
01560       .Case("pentium-m", CK_PentiumM)
01561       .Case("c3-2", CK_C3_2)
01562       .Case("yonah", CK_Yonah)
01563       .Case("pentium4", CK_Pentium4)
01564       .Case("pentium4m", CK_Pentium4M)
01565       .Case("prescott", CK_Prescott)
01566       .Case("nocona", CK_Nocona)
01567       .Case("core2", CK_Core2)
01568       .Case("penryn", CK_Penryn)
01569       .Case("atom", CK_Atom)
01570       .Case("corei7", CK_Corei7)
01571       .Case("corei7-avx", CK_Corei7AVX)
01572       .Case("core-avx-i", CK_CoreAVXi)
01573       .Case("core-avx2", CK_CoreAVX2)
01574       .Case("k6", CK_K6)
01575       .Case("k6-2", CK_K6_2)
01576       .Case("k6-3", CK_K6_3)
01577       .Case("athlon", CK_Athlon)
01578       .Case("athlon-tbird", CK_AthlonThunderbird)
01579       .Case("athlon-4", CK_Athlon4)
01580       .Case("athlon-xp", CK_AthlonXP)
01581       .Case("athlon-mp", CK_AthlonMP)
01582       .Case("athlon64", CK_Athlon64)
01583       .Case("athlon64-sse3", CK_Athlon64SSE3)
01584       .Case("athlon-fx", CK_AthlonFX)
01585       .Case("k8", CK_K8)
01586       .Case("k8-sse3", CK_K8SSE3)
01587       .Case("opteron", CK_Opteron)
01588       .Case("opteron-sse3", CK_OpteronSSE3)
01589       .Case("amdfam10", CK_AMDFAM10)
01590       .Case("btver1", CK_BTVER1)
01591       .Case("bdver1", CK_BDVER1)
01592       .Case("bdver2", CK_BDVER2)
01593       .Case("x86-64", CK_x86_64)
01594       .Case("geode", CK_Geode)
01595       .Default(CK_Generic);
01596 
01597     // Perform any per-CPU checks necessary to determine if this CPU is
01598     // acceptable.
01599     // FIXME: This results in terrible diagnostics. Clang just says the CPU is
01600     // invalid without explaining *why*.
01601     switch (CPU) {
01602     case CK_Generic:
01603       // No processor selected!
01604       return false;
01605 
01606     case CK_i386:
01607     case CK_i486:
01608     case CK_WinChipC6:
01609     case CK_WinChip2:
01610     case CK_C3:
01611     case CK_i586:
01612     case CK_Pentium:
01613     case CK_PentiumMMX:
01614     case CK_i686:
01615     case CK_PentiumPro:
01616     case CK_Pentium2:
01617     case CK_Pentium3:
01618     case CK_Pentium3M:
01619     case CK_PentiumM:
01620     case CK_Yonah:
01621     case CK_C3_2:
01622     case CK_Pentium4:
01623     case CK_Pentium4M:
01624     case CK_Prescott:
01625     case CK_K6:
01626     case CK_K6_2:
01627     case CK_K6_3:
01628     case CK_Athlon:
01629     case CK_AthlonThunderbird:
01630     case CK_Athlon4:
01631     case CK_AthlonXP:
01632     case CK_AthlonMP:
01633     case CK_Geode:
01634       // Only accept certain architectures when compiling in 32-bit mode.
01635       if (PointerWidth != 32)
01636         return false;
01637 
01638       // Fallthrough
01639     case CK_Nocona:
01640     case CK_Core2:
01641     case CK_Penryn:
01642     case CK_Atom:
01643     case CK_Corei7:
01644     case CK_Corei7AVX:
01645     case CK_CoreAVXi:
01646     case CK_CoreAVX2:
01647     case CK_Athlon64:
01648     case CK_Athlon64SSE3:
01649     case CK_AthlonFX:
01650     case CK_K8:
01651     case CK_K8SSE3:
01652     case CK_Opteron:
01653     case CK_OpteronSSE3:
01654     case CK_AMDFAM10:
01655     case CK_BTVER1:
01656     case CK_BDVER1:
01657     case CK_BDVER2:
01658     case CK_x86_64:
01659       return true;
01660     }
01661     llvm_unreachable("Unhandled CPU kind");
01662   }
01663 };
01664 
01665 void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
01666   // FIXME: This should not be here.
01667   Features["3dnow"] = false;
01668   Features["3dnowa"] = false;
01669   Features["mmx"] = false;
01670   Features["sse"] = false;
01671   Features["sse2"] = false;
01672   Features["sse3"] = false;
01673   Features["ssse3"] = false;
01674   Features["sse41"] = false;
01675   Features["sse42"] = false;
01676   Features["sse4a"] = false;
01677   Features["aes"] = false;
01678   Features["avx"] = false;
01679   Features["avx2"] = false;
01680   Features["lzcnt"] = false;
01681   Features["bmi"] = false;
01682   Features["bmi2"] = false;
01683   Features["popcnt"] = false;
01684   Features["fma4"] = false;
01685 
01686   // FIXME: This *really* should not be here.
01687 
01688   // X86_64 always has SSE2.
01689   if (PointerWidth == 64)
01690     Features["sse2"] = Features["sse"] = Features["mmx"] = true;
01691 
01692   switch (CPU) {
01693   case CK_Generic:
01694   case CK_i386:
01695   case CK_i486:
01696   case CK_i586:
01697   case CK_Pentium:
01698   case CK_i686:
01699   case CK_PentiumPro:
01700     break;
01701   case CK_PentiumMMX:
01702   case CK_Pentium2:
01703     setFeatureEnabled(Features, "mmx", true);
01704     break;
01705   case CK_Pentium3:
01706   case CK_Pentium3M:
01707     setFeatureEnabled(Features, "mmx", true);
01708     setFeatureEnabled(Features, "sse", true);
01709     break;
01710   case CK_PentiumM:
01711   case CK_Pentium4:
01712   case CK_Pentium4M:
01713   case CK_x86_64:
01714     setFeatureEnabled(Features, "mmx", true);
01715     setFeatureEnabled(Features, "sse2", true);
01716     break;
01717   case CK_Yonah:
01718   case CK_Prescott:
01719   case CK_Nocona:
01720     setFeatureEnabled(Features, "mmx", true);
01721     setFeatureEnabled(Features, "sse3", true);
01722     break;
01723   case CK_Core2:
01724     setFeatureEnabled(Features, "mmx", true);
01725     setFeatureEnabled(Features, "ssse3", true);
01726     break;
01727   case CK_Penryn:
01728     setFeatureEnabled(Features, "mmx", true);
01729     setFeatureEnabled(Features, "sse4.1", true);
01730     break;
01731   case CK_Atom:
01732     setFeatureEnabled(Features, "mmx", true);
01733     setFeatureEnabled(Features, "ssse3", true);
01734     break;
01735   case CK_Corei7:
01736     setFeatureEnabled(Features, "mmx", true);
01737     setFeatureEnabled(Features, "sse4", true);
01738     setFeatureEnabled(Features, "aes", true);
01739     break;
01740   case CK_Corei7AVX:
01741   case CK_CoreAVXi:
01742     setFeatureEnabled(Features, "mmx", true);
01743     setFeatureEnabled(Features, "avx", true);
01744     setFeatureEnabled(Features, "aes", true);
01745     break;
01746   case CK_CoreAVX2:
01747     setFeatureEnabled(Features, "mmx", true);
01748     setFeatureEnabled(Features, "avx2", true);
01749     setFeatureEnabled(Features, "aes", true);
01750     setFeatureEnabled(Features, "lzcnt", true);
01751     setFeatureEnabled(Features, "bmi", true);
01752     setFeatureEnabled(Features, "bmi2", true);
01753     break;
01754   case CK_K6:
01755   case CK_WinChipC6:
01756     setFeatureEnabled(Features, "mmx", true);
01757     break;
01758   case CK_K6_2:
01759   case CK_K6_3:
01760   case CK_WinChip2:
01761   case CK_C3:
01762     setFeatureEnabled(Features, "3dnow", true);
01763     break;
01764   case CK_Athlon:
01765   case CK_AthlonThunderbird:
01766   case CK_Geode:
01767     setFeatureEnabled(Features, "3dnowa", true);
01768     break;
01769   case CK_Athlon4:
01770   case CK_AthlonXP:
01771   case CK_AthlonMP:
01772     setFeatureEnabled(Features, "sse", true);
01773     setFeatureEnabled(Features, "3dnowa", true);
01774     break;
01775   case CK_K8:
01776   case CK_Opteron:
01777   case CK_Athlon64:
01778   case CK_AthlonFX:
01779     setFeatureEnabled(Features, "sse2", true);
01780     setFeatureEnabled(Features, "3dnowa", true);
01781     break;
01782   case CK_K8SSE3:
01783   case CK_OpteronSSE3:
01784   case CK_Athlon64SSE3:
01785     setFeatureEnabled(Features, "sse3", true);
01786     setFeatureEnabled(Features, "3dnowa", true);
01787     break;
01788   case CK_AMDFAM10:
01789     setFeatureEnabled(Features, "sse3", true);
01790     setFeatureEnabled(Features, "sse4a", true);
01791     setFeatureEnabled(Features, "3dnowa", true);
01792     break;
01793   case CK_BTVER1:
01794     setFeatureEnabled(Features, "ssse3", true);
01795     setFeatureEnabled(Features, "sse4a", true);
01796   case CK_BDVER1:
01797   case CK_BDVER2:
01798     setFeatureEnabled(Features, "avx", true);
01799     setFeatureEnabled(Features, "sse4a", true);
01800     setFeatureEnabled(Features, "aes", true);
01801     break;
01802   case CK_C3_2:
01803     setFeatureEnabled(Features, "mmx", true);
01804     setFeatureEnabled(Features, "sse", true);
01805     break;
01806   }
01807 }
01808 
01809 bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
01810                                       StringRef Name,
01811                                       bool Enabled) const {
01812   // FIXME: This *really* should not be here.  We need some way of translating
01813   // options into llvm subtarget features.
01814   if (!Features.count(Name) &&
01815       (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1"))
01816     return false;
01817 
01818   // FIXME: this should probably use a switch with fall through.
01819 
01820   if (Enabled) {
01821     if (Name == "mmx")
01822       Features["mmx"] = true;
01823     else if (Name == "sse")
01824       Features["mmx"] = Features["sse"] = true;
01825     else if (Name == "sse2")
01826       Features["mmx"] = Features["sse"] = Features["sse2"] = true;
01827     else if (Name == "sse3")
01828       Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
01829         true;
01830     else if (Name == "ssse3")
01831       Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
01832         Features["ssse3"] = true;
01833     else if (Name == "sse4" || Name == "sse4.2")
01834       Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
01835         Features["ssse3"] = Features["sse41"] = Features["sse42"] =
01836         Features["popcnt"] = true;
01837     else if (Name == "sse4.1")
01838       Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
01839         Features["ssse3"] = Features["sse41"] = true;
01840     else if (Name == "3dnow")
01841       Features["mmx"] = Features["3dnow"] = true;
01842     else if (Name == "3dnowa")
01843       Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = true;
01844     else if (Name == "aes")
01845       Features["aes"] = true;
01846     else if (Name == "avx")
01847       Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
01848         Features["ssse3"] = Features["sse41"] = Features["sse42"] =
01849         Features["popcnt"] = Features["avx"] = true;
01850     else if (Name == "avx2")
01851       Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
01852         Features["ssse3"] = Features["sse41"] = Features["sse42"] =
01853         Features["popcnt"] = Features["avx"] = Features["avx2"] = true;
01854     else if (Name == "fma4")
01855         Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
01856         Features["ssse3"] = Features["sse41"] = Features["sse42"] =
01857         Features["popcnt"] = Features["avx"] = Features["fma4"] = true;
01858     else if (Name == "sse4a")
01859       Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
01860         Features["lzcnt"] = Features["popcnt"] = Features["sse4a"] = true;
01861     else if (Name == "lzcnt")
01862       Features["lzcnt"] = true;
01863     else if (Name == "bmi")
01864       Features["bmi"] = true;
01865     else if (Name == "bmi2")
01866       Features["bmi2"] = true;
01867     else if (Name == "popcnt")
01868       Features["popcnt"] = true;
01869   } else {
01870     if (Name == "mmx")
01871       Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = false;
01872     else if (Name == "sse")
01873       Features["sse"] = Features["sse2"] = Features["sse3"] =
01874         Features["ssse3"] = Features["sse41"] = Features["sse42"] =
01875         Features["sse4a"] = false;
01876     else if (Name == "sse2")
01877       Features["sse2"] = Features["sse3"] = Features["ssse3"] =
01878         Features["sse41"] = Features["sse42"] = Features["sse4a"] = false;
01879     else if (Name == "sse3")
01880       Features["sse3"] = Features["ssse3"] = Features["sse41"] =
01881         Features["sse42"] = Features["sse4a"] = false;
01882     else if (Name == "ssse3")
01883       Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
01884     else if (Name == "sse4" || Name == "sse4.1")
01885       Features["sse41"] = Features["sse42"] = false;
01886     else if (Name == "sse4.2")
01887       Features["sse42"] = false;
01888     else if (Name == "3dnow")
01889       Features["3dnow"] = Features["3dnowa"] = false;
01890     else if (Name == "3dnowa")
01891       Features["3dnowa"] = false;
01892     else if (Name == "aes")
01893       Features["aes"] = false;
01894     else if (Name == "avx")
01895       Features["avx"] = Features["avx2"] = Features["fma4"] = false;
01896     else if (Name == "avx2")
01897       Features["avx2"] = false;
01898     else if (Name == "sse4a")
01899       Features["sse4a"] = false;
01900     else if (Name == "lzcnt")
01901       Features["lzcnt"] = false;
01902     else if (Name == "bmi")
01903       Features["bmi"] = false;
01904     else if (Name == "bmi2")
01905       Features["bmi2"] = false;
01906     else if (Name == "popcnt")
01907       Features["popcnt"] = false;
01908     else if (Name == "fma4")
01909       Features["fma4"] = false;
01910   }
01911 
01912   return true;
01913 }
01914 
01915 /// HandleTargetOptions - Perform initialization based on the user
01916 /// configured set of features.
01917 void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
01918   // Remember the maximum enabled sselevel.
01919   for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
01920     // Ignore disabled features.
01921     if (Features[i][0] == '-')
01922       continue;
01923 
01924     StringRef Feature = StringRef(Features[i]).substr(1);
01925 
01926     if (Feature == "aes") {
01927       HasAES = true;
01928       continue;
01929     }
01930 
01931     if (Feature == "lzcnt") {
01932       HasLZCNT = true;
01933       continue;
01934     }
01935 
01936     if (Feature == "bmi") {
01937       HasBMI = true;
01938       continue;
01939     }
01940 
01941     if (Feature == "bmi2") {
01942       HasBMI2 = true;
01943       continue;
01944     }
01945 
01946     if (Feature == "popcnt") {
01947       HasPOPCNT = true;
01948       continue;
01949     }
01950 
01951     if (Feature == "fma4") {
01952       HasFMA4 = true;
01953       continue;
01954     }
01955 
01956     assert(Features[i][0] == '+' && "Invalid target feature!");
01957     X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
01958       .Case("avx2", AVX2)
01959       .Case("avx", AVX)
01960       .Case("sse42", SSE42)
01961       .Case("sse41", SSE41)
01962       .Case("ssse3", SSSE3)
01963       .Case("sse3", SSE3)
01964       .Case("sse2", SSE2)
01965       .Case("sse", SSE1)
01966       .Default(NoSSE);
01967     SSELevel = std::max(SSELevel, Level);
01968 
01969     MMX3DNowEnum ThreeDNowLevel =
01970       llvm::StringSwitch<MMX3DNowEnum>(Feature)
01971         .Case("3dnowa", AMD3DNowAthlon)
01972         .Case("3dnow", AMD3DNow)
01973         .Case("mmx", MMX)
01974         .Default(NoMMX3DNow);
01975 
01976     MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
01977   }
01978 
01979   // Don't tell the backend if we're turning off mmx; it will end up disabling
01980   // SSE, which we don't want.
01981   std::vector<std::string>::iterator it;
01982   it = std::find(Features.begin(), Features.end(), "-mmx");
01983   if (it != Features.end())
01984     Features.erase(it);
01985 }
01986 
01987 /// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
01988 /// definitions for this particular subtarget.
01989 void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
01990                                      MacroBuilder &Builder) const {
01991   // Target identification.
01992   if (PointerWidth == 64) {
01993     if (getLongWidth() == 64) {
01994       Builder.defineMacro("_LP64");
01995       Builder.defineMacro("__LP64__");
01996     }
01997     Builder.defineMacro("__amd64__");
01998     Builder.defineMacro("__amd64");
01999     Builder.defineMacro("__x86_64");
02000     Builder.defineMacro("__x86_64__");
02001   } else {
02002     DefineStd(Builder, "i386", Opts);
02003   }
02004 
02005   // Subtarget options.
02006   // FIXME: We are hard-coding the tune parameters based on the CPU, but they
02007   // truly should be based on -mtune options.
02008   switch (CPU) {
02009   case CK_Generic:
02010     break;
02011   case CK_i386:
02012     // The rest are coming from the i386 define above.
02013     Builder.defineMacro("__tune_i386__");
02014     break;
02015   case CK_i486:
02016   case CK_WinChipC6:
02017   case CK_WinChip2:
02018   case CK_C3:
02019     defineCPUMacros(Builder, "i486");
02020     break;
02021   case CK_PentiumMMX:
02022     Builder.defineMacro("__pentium_mmx__");
02023     Builder.defineMacro("__tune_pentium_mmx__");
02024     // Fallthrough
02025   case CK_i586:
02026   case CK_Pentium:
02027     defineCPUMacros(Builder, "i586");
02028     defineCPUMacros(Builder, "pentium");
02029     break;
02030   case CK_Pentium3:
02031   case CK_Pentium3M:
02032   case CK_PentiumM:
02033     Builder.defineMacro("__tune_pentium3__");
02034     // Fallthrough
02035   case CK_Pentium2:
02036   case CK_C3_2:
02037     Builder.defineMacro("__tune_pentium2__");
02038     // Fallthrough
02039   case CK_PentiumPro:
02040     Builder.defineMacro("__tune_i686__");
02041     Builder.defineMacro("__tune_pentiumpro__");
02042     // Fallthrough
02043   case CK_i686:
02044     Builder.defineMacro("__i686");
02045     Builder.defineMacro("__i686__");
02046     // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
02047     Builder.defineMacro("__pentiumpro");
02048     Builder.defineMacro("__pentiumpro__");
02049     break;
02050   case CK_Pentium4:
02051   case CK_Pentium4M:
02052     defineCPUMacros(Builder, "pentium4");
02053     break;
02054   case CK_Yonah:
02055   case CK_Prescott:
02056   case CK_Nocona:
02057     defineCPUMacros(Builder, "nocona");
02058     break;
02059   case CK_Core2:
02060   case CK_Penryn:
02061     defineCPUMacros(Builder, "core2");
02062     break;
02063   case CK_Atom:
02064     defineCPUMacros(Builder, "atom");
02065     break;
02066   case CK_Corei7:
02067   case CK_Corei7AVX:
02068   case CK_CoreAVXi:
02069   case CK_CoreAVX2:
02070     defineCPUMacros(Builder, "corei7");
02071     break;
02072   case CK_K6_2:
02073     Builder.defineMacro("__k6_2__");
02074     Builder.defineMacro("__tune_k6_2__");
02075     // Fallthrough
02076   case CK_K6_3:
02077     if (CPU != CK_K6_2) {  // In case of fallthrough
02078       // FIXME: GCC may be enabling these in cases where some other k6
02079       // architecture is specified but -m3dnow is explicitly provided. The
02080       // exact semantics need to be determined and emulated here.
02081       Builder.defineMacro("__k6_3__");
02082       Builder.defineMacro("__tune_k6_3__");
02083     }
02084     // Fallthrough
02085   case CK_K6:
02086     defineCPUMacros(Builder, "k6");
02087     break;
02088   case CK_Athlon:
02089   case CK_AthlonThunderbird:
02090   case CK_Athlon4:
02091   case CK_AthlonXP:
02092   case CK_AthlonMP:
02093     defineCPUMacros(Builder, "athlon");
02094     if (SSELevel != NoSSE) {
02095       Builder.defineMacro("__athlon_sse__");
02096       Builder.defineMacro("__tune_athlon_sse__");
02097     }
02098     break;
02099   case CK_K8:
02100   case CK_K8SSE3:
02101   case CK_x86_64:
02102   case CK_Opteron:
02103   case CK_OpteronSSE3:
02104   case CK_Athlon64:
02105   case CK_Athlon64SSE3:
02106   case CK_AthlonFX:
02107     defineCPUMacros(Builder, "k8");
02108     break;
02109   case CK_AMDFAM10:
02110     defineCPUMacros(Builder, "amdfam10");
02111     break;
02112   case CK_BTVER1:
02113     defineCPUMacros(Builder, "btver1");
02114     break;
02115   case CK_BDVER1:
02116     defineCPUMacros(Builder, "bdver1");
02117     break;
02118   case CK_BDVER2:
02119     defineCPUMacros(Builder, "bdver2");
02120     break;
02121   case CK_Geode:
02122     defineCPUMacros(Builder, "geode");
02123     break;
02124   }
02125 
02126   // Target properties.
02127   Builder.defineMacro("__LITTLE_ENDIAN__");
02128   Builder.defineMacro("__REGISTER_PREFIX__", "");
02129 
02130   // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
02131   // functions in glibc header files that use FP Stack inline asm which the
02132   // backend can't deal with (PR879).
02133   Builder.defineMacro("__NO_MATH_INLINES");
02134 
02135   if (HasAES)
02136     Builder.defineMacro("__AES__");
02137 
02138   if (HasLZCNT)
02139     Builder.defineMacro("__LZCNT__");
02140 
02141   if (HasBMI)
02142     Builder.defineMacro("__BMI__");
02143 
02144   if (HasBMI2)
02145     Builder.defineMacro("__BMI2__");
02146 
02147   if (HasPOPCNT)
02148     Builder.defineMacro("__POPCNT__");
02149 
02150   if (HasFMA4)
02151     Builder.defineMacro("__FMA4__");
02152 
02153   // Each case falls through to the previous one here.
02154   switch (SSELevel) {
02155   case AVX2:
02156     Builder.defineMacro("__AVX2__");
02157   case AVX:
02158     Builder.defineMacro("__AVX__");
02159   case SSE42:
02160     Builder.defineMacro("__SSE4_2__");
02161   case SSE41:
02162     Builder.defineMacro("__SSE4_1__");
02163   case SSSE3:
02164     Builder.defineMacro("__SSSE3__");
02165   case SSE3:
02166     Builder.defineMacro("__SSE3__");
02167   case SSE2:
02168     Builder.defineMacro("__SSE2__");
02169     Builder.defineMacro("__SSE2_MATH__");  // -mfp-math=sse always implied.
02170   case SSE1:
02171     Builder.defineMacro("__SSE__");
02172     Builder.defineMacro("__SSE_MATH__");   // -mfp-math=sse always implied.
02173   case NoSSE:
02174     break;
02175   }
02176 
02177   if (Opts.MicrosoftExt && PointerWidth == 32) {
02178     switch (SSELevel) {
02179     case AVX2:
02180     case AVX:
02181     case SSE42:
02182     case SSE41:
02183     case SSSE3:
02184     case SSE3:
02185     case SSE2:
02186       Builder.defineMacro("_M_IX86_FP", Twine(2));
02187       break;
02188     case SSE1:
02189       Builder.defineMacro("_M_IX86_FP", Twine(1));
02190       break;
02191     default:
02192       Builder.defineMacro("_M_IX86_FP", Twine(0));
02193     }
02194   }
02195 
02196   // Each case falls through to the previous one here.
02197   switch (MMX3DNowLevel) {
02198   case AMD3DNowAthlon:
02199     Builder.defineMacro("__3dNOW_A__");
02200   case AMD3DNow:
02201     Builder.defineMacro("__3dNOW__");
02202   case MMX:
02203     Builder.defineMacro("__MMX__");
02204   case NoMMX3DNow:
02205     break;
02206   }
02207 }
02208 
02209 bool X86TargetInfo::hasFeature(StringRef Feature) const {
02210   return llvm::StringSwitch<bool>(Feature)
02211       .Case("aes", HasAES)
02212       .Case("avx", SSELevel >= AVX)
02213       .Case("avx2", SSELevel >= AVX2)
02214       .Case("bmi", HasBMI)
02215       .Case("bmi2", HasBMI2)
02216       .Case("fma4", HasFMA4)
02217       .Case("lzcnt", HasLZCNT)
02218       .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
02219       .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
02220       .Case("mmx", MMX3DNowLevel >= MMX)
02221       .Case("popcnt", HasPOPCNT)
02222       .Case("sse", SSELevel >= SSE1)
02223       .Case("sse2", SSELevel >= SSE2)
02224       .Case("sse3", SSELevel >= SSE3)
02225       .Case("ssse3", SSELevel >= SSSE3)
02226       .Case("sse41", SSELevel >= SSE41)
02227       .Case("sse42", SSELevel >= SSE42)
02228       .Case("x86", true)
02229       .Case("x86_32", PointerWidth == 32)
02230       .Case("x86_64", PointerWidth == 64)
02231       .Default(false);
02232 }
02233 
02234 bool
02235 X86TargetInfo::validateAsmConstraint(const char *&Name,
02236                                      TargetInfo::ConstraintInfo &Info) const {
02237   switch (*Name) {
02238   default: return false;
02239   case 'Y': // first letter of a pair:
02240     switch (*(Name+1)) {
02241     default: return false;
02242     case '0':  // First SSE register.
02243     case 't':  // Any SSE register, when SSE2 is enabled.
02244     case 'i':  // Any SSE register, when SSE2 and inter-unit moves enabled.
02245     case 'm':  // any MMX register, when inter-unit moves enabled.
02246       break;   // falls through to setAllowsRegister.
02247   }
02248   case 'a': // eax.
02249   case 'b': // ebx.
02250   case 'c': // ecx.
02251   case 'd': // edx.
02252   case 'S': // esi.
02253   case 'D': // edi.
02254   case 'A': // edx:eax.
02255   case 'f': // any x87 floating point stack register.
02256   case 't': // top of floating point stack.
02257   case 'u': // second from top of floating point stack.
02258   case 'q': // Any register accessible as [r]l: a, b, c, and d.
02259   case 'y': // Any MMX register.
02260   case 'x': // Any SSE register.
02261   case 'Q': // Any register accessible as [r]h: a, b, c, and d.
02262   case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
02263   case 'l': // "Index" registers: any general register that can be used as an
02264             // index in a base+index memory access.
02265     Info.setAllowsRegister();
02266     return true;
02267   case 'C': // SSE floating point constant.
02268   case 'G': // x87 floating point constant.
02269   case 'e': // 32-bit signed integer constant for use with zero-extending
02270             // x86_64 instructions.
02271   case 'Z': // 32-bit unsigned integer constant for use with zero-extending
02272             // x86_64 instructions.
02273     return true;
02274   }
02275 }
02276 
02277 
02278 std::string
02279 X86TargetInfo::convertConstraint(const char *&Constraint) const {
02280   switch (*Constraint) {
02281   case 'a': return std::string("{ax}");
02282   case 'b': return std::string("{bx}");
02283   case 'c': return std::string("{cx}");
02284   case 'd': return std::string("{dx}");
02285   case 'S': return std::string("{si}");
02286   case 'D': return std::string("{di}");
02287   case 'p': // address
02288     return std::string("im");
02289   case 't': // top of floating point stack.
02290     return std::string("{st}");
02291   case 'u': // second from top of floating point stack.
02292     return std::string("{st(1)}"); // second from top of floating point stack.
02293   default:
02294     return std::string(1, *Constraint);
02295   }
02296 }
02297 } // end anonymous namespace
02298 
02299 namespace {
02300 // X86-32 generic target
02301 class X86_32TargetInfo : public X86TargetInfo {
02302 public:
02303   X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
02304     DoubleAlign = LongLongAlign = 32;
02305     LongDoubleWidth = 96;
02306     LongDoubleAlign = 32;
02307     SuitableAlign = 128;
02308     DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
02309                         "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
02310                         "a0:0:64-f80:32:32-n8:16:32-S128";
02311     SizeType = UnsignedInt;
02312     PtrDiffType = SignedInt;
02313     IntPtrType = SignedInt;
02314     RegParmMax = 3;
02315 
02316     // Use fpret for all types.
02317     RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
02318                              (1 << TargetInfo::Double) |
02319                              (1 << TargetInfo::LongDouble));
02320 
02321     // x86-32 has atomics up to 8 bytes
02322     // FIXME: Check that we actually have cmpxchg8b before setting
02323     // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
02324     MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
02325   }
02326   virtual const char *getVAListDeclaration() const {
02327     return "typedef char* __builtin_va_list;";
02328   }
02329 
02330   int getEHDataRegisterNumber(unsigned RegNo) const {
02331     if (RegNo == 0) return 0;
02332     if (RegNo == 1) return 2;
02333     return -1;
02334   }
02335 };
02336 } // end anonymous namespace
02337 
02338 namespace {
02339 class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
02340 public:
02341   NetBSDI386TargetInfo(const std::string &triple) :
02342     NetBSDTargetInfo<X86_32TargetInfo>(triple) {
02343   }
02344 
02345   virtual unsigned getFloatEvalMethod() const {
02346     // NetBSD defaults to "double" rounding
02347     return 1;
02348   }
02349 };
02350 } // end anonymous namespace
02351 
02352 namespace {
02353 class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
02354 public:
02355   OpenBSDI386TargetInfo(const std::string& triple) :
02356     OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
02357     SizeType = UnsignedLong;
02358     IntPtrType = SignedLong;
02359     PtrDiffType = SignedLong;
02360   }
02361 };
02362 } // end anonymous namespace
02363 
02364 namespace {
02365 class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
02366 public:
02367   DarwinI386TargetInfo(const std::string& triple) :
02368     DarwinTargetInfo<X86_32TargetInfo>(triple) {
02369     LongDoubleWidth = 128;
02370     LongDoubleAlign = 128;
02371     SuitableAlign = 128;
02372     SizeType = UnsignedLong;
02373     IntPtrType = SignedLong;
02374     DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
02375                         "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
02376                         "a0:0:64-f80:128:128-n8:16:32-S128";
02377     HasAlignMac68kSupport = true;
02378   }
02379 
02380 };
02381 } // end anonymous namespace
02382 
02383 namespace {
02384 // x86-32 Windows target
02385 class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
02386 public:
02387   WindowsX86_32TargetInfo(const std::string& triple)
02388     : WindowsTargetInfo<X86_32TargetInfo>(triple) {
02389     TLSSupported = false;
02390     WCharType = UnsignedShort;
02391     DoubleAlign = LongLongAlign = 64;
02392     DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
02393                         "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
02394                         "v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32";
02395   }
02396   virtual void getTargetDefines(const LangOptions &Opts,
02397                                 MacroBuilder &Builder) const {
02398     WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
02399   }
02400 };
02401 } // end anonymous namespace
02402 
02403 namespace {
02404 
02405 // x86-32 Windows Visual Studio target
02406 class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
02407 public:
02408   VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
02409     : WindowsX86_32TargetInfo(triple) {
02410     LongDoubleWidth = LongDoubleAlign = 64;
02411     LongDoubleFormat = &llvm::APFloat::IEEEdouble;
02412   }
02413   virtual void getTargetDefines(const LangOptions &Opts,
02414                                 MacroBuilder &Builder) const {
02415     WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
02416     WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
02417     // The value of the following reflects processor type.
02418     // 300=386, 400=486, 500=Pentium, 600=Blend (default)
02419     // We lost the original triple, so we use the default.
02420     Builder.defineMacro("_M_IX86", "600");
02421   }
02422 };
02423 } // end anonymous namespace
02424 
02425 namespace {
02426 // x86-32 MinGW target
02427 class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
02428 public:
02429   MinGWX86_32TargetInfo(const std::string& triple)
02430     : WindowsX86_32TargetInfo(triple) {
02431   }
02432   virtual void getTargetDefines(const LangOptions &Opts,
02433                                 MacroBuilder &Builder) const {
02434     WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
02435     DefineStd(Builder, "WIN32", Opts);
02436     DefineStd(Builder, "WINNT", Opts);
02437     Builder.defineMacro("_X86_");
02438     Builder.defineMacro("__MSVCRT__");
02439     Builder.defineMacro("__MINGW32__");
02440 
02441     // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
02442     // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
02443     if (Opts.MicrosoftExt)
02444       // Provide "as-is" __declspec.
02445       Builder.defineMacro("__declspec", "__declspec");
02446     else
02447       // Provide alias of __attribute__ like mingw32-gcc.
02448       Builder.defineMacro("__declspec(a)", "__attribute__((a))");
02449   }
02450 };
02451 } // end anonymous namespace
02452 
02453 namespace {
02454 // x86-32 Cygwin target
02455 class CygwinX86_32TargetInfo : public X86_32TargetInfo {
02456 public:
02457   CygwinX86_32TargetInfo(const std::string& triple)
02458     : X86_32TargetInfo(triple) {
02459     TLSSupported = false;
02460     WCharType = UnsignedShort;
02461     DoubleAlign = LongLongAlign = 64;
02462     DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
02463                         "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
02464                         "a0:0:64-f80:32:32-n8:16:32-S32";
02465   }
02466   virtual void getTargetDefines(const LangOptions &Opts,
02467                                 MacroBuilder &Builder) const {
02468     X86_32TargetInfo::getTargetDefines(Opts, Builder);
02469     Builder.defineMacro("__CYGWIN__");
02470     Builder.defineMacro("__CYGWIN32__");
02471     DefineStd(Builder, "unix", Opts);
02472     if (Opts.CPlusPlus)
02473       Builder.defineMacro("_GNU_SOURCE");
02474   }
02475 };
02476 } // end anonymous namespace
02477 
02478 namespace {
02479 // x86-32 Haiku target
02480 class HaikuX86_32TargetInfo : public X86_32TargetInfo {
02481 public:
02482   HaikuX86_32TargetInfo(const std::string& triple)
02483     : X86_32TargetInfo(triple) {
02484     SizeType = UnsignedLong;
02485     IntPtrType = SignedLong;
02486     PtrDiffType = SignedLong;
02487     this->UserLabelPrefix = "";
02488   }
02489   virtual void getTargetDefines(const LangOptions &Opts,
02490                                 MacroBuilder &Builder) const {
02491     X86_32TargetInfo::getTargetDefines(Opts, Builder);
02492     Builder.defineMacro("__INTEL__");
02493     Builder.defineMacro("__HAIKU__");
02494   }
02495 };
02496 } // end anonymous namespace
02497 
02498 // RTEMS Target
02499 template<typename Target>
02500 class RTEMSTargetInfo : public OSTargetInfo<Target> {
02501 protected:
02502   virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
02503                             MacroBuilder &Builder) const {
02504     // RTEMS defines; list based off of gcc output
02505 
02506     Builder.defineMacro("__rtems__");
02507     Builder.defineMacro("__ELF__");
02508   }
02509 public:
02510   RTEMSTargetInfo(const std::string &triple)
02511     : OSTargetInfo<Target>(triple) {
02512       this->UserLabelPrefix = "";
02513 
02514       llvm::Triple Triple(triple);
02515       switch (Triple.getArch()) {
02516         default:
02517         case llvm::Triple::x86:
02518           // this->MCountName = ".mcount";
02519           break;
02520         case llvm::Triple::mips:
02521         case llvm::Triple::mipsel:
02522         case llvm::Triple::ppc:
02523         case llvm::Triple::ppc64:
02524           // this->MCountName = "_mcount";
02525           break;
02526         case llvm::Triple::arm:
02527           // this->MCountName = "__mcount";
02528           break;
02529       }
02530 
02531     }
02532 };
02533 
02534 namespace {
02535 // x86-32 RTEMS target
02536 class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
02537 public:
02538   RTEMSX86_32TargetInfo(const std::string& triple)
02539     : X86_32TargetInfo(triple) {
02540     SizeType = UnsignedLong;
02541     IntPtrType = SignedLong;
02542     PtrDiffType = SignedLong;
02543     this->UserLabelPrefix = "";
02544   }
02545   virtual void getTargetDefines(const LangOptions &Opts,
02546                                 MacroBuilder &Builder) const {
02547     X86_32TargetInfo::getTargetDefines(Opts, Builder);
02548     Builder.defineMacro("__INTEL__");
02549     Builder.defineMacro("__rtems__");
02550   }
02551 };
02552 } // end anonymous namespace
02553 
02554 namespace {
02555 // x86-64 generic target
02556 class X86_64TargetInfo : public X86TargetInfo {
02557 public:
02558   X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
02559     LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
02560     LongDoubleWidth = 128;
02561     LongDoubleAlign = 128;
02562     LargeArrayMinWidth = 128;
02563     LargeArrayAlign = 128;
02564     SuitableAlign = 128;
02565     IntMaxType = SignedLong;
02566     UIntMaxType = UnsignedLong;
02567     Int64Type = SignedLong;
02568     RegParmMax = 6;
02569 
02570     DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
02571                         "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
02572                         "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128";
02573 
02574     // Use fpret only for long double.
02575     RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
02576 
02577     // Use fp2ret for _Complex long double.
02578     ComplexLongDoubleUsesFP2Ret = true;
02579 
02580     // x86-64 has atomics up to 16 bytes.
02581     // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
02582     // on CPUs with cmpxchg16b
02583     MaxAtomicPromoteWidth = 128;
02584     MaxAtomicInlineWidth = 64;
02585   }
02586   virtual const char *getVAListDeclaration() const {
02587     return "typedef struct __va_list_tag {"
02588            "  unsigned gp_offset;"
02589            "  unsigned fp_offset;"
02590            "  void* overflow_arg_area;"
02591            "  void* reg_save_area;"
02592            "} __va_list_tag;"
02593            "typedef __va_list_tag __builtin_va_list[1];";
02594   }
02595 
02596   int getEHDataRegisterNumber(unsigned RegNo) const {
02597     if (RegNo == 0) return 0;
02598     if (RegNo == 1) return 1;
02599     return -1;
02600   }
02601 };
02602 } // end anonymous namespace
02603 
02604 namespace {
02605 // x86-64 Windows target
02606 class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
02607 public:
02608   WindowsX86_64TargetInfo(const std::string& triple)
02609     : WindowsTargetInfo<X86_64TargetInfo>(triple) {
02610     TLSSupported = false;
02611     WCharType = UnsignedShort;
02612     LongWidth = LongAlign = 32;
02613     DoubleAlign = LongLongAlign = 64;
02614     IntMaxType = SignedLongLong;
02615     UIntMaxType = UnsignedLongLong;
02616     Int64Type = SignedLongLong;
02617     SizeType = UnsignedLongLong;
02618     PtrDiffType = SignedLongLong;
02619     IntPtrType = SignedLongLong;
02620     this->UserLabelPrefix = "";
02621   }
02622   virtual void getTargetDefines(const LangOptions &Opts,
02623                                 MacroBuilder &Builder) const {
02624     WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
02625     Builder.defineMacro("_WIN64");
02626   }
02627   virtual const char *getVAListDeclaration() const {
02628     return "typedef char* __builtin_va_list;";
02629   }
02630 };
02631 } // end anonymous namespace
02632 
02633 namespace {
02634 // x86-64 Windows Visual Studio target
02635 class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
02636 public:
02637   VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
02638     : WindowsX86_64TargetInfo(triple) {
02639     LongDoubleWidth = LongDoubleAlign = 64;
02640     LongDoubleFormat = &llvm::APFloat::IEEEdouble;
02641   }
02642   virtual void getTargetDefines(const LangOptions &Opts,
02643                                 MacroBuilder &Builder) const {
02644     WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
02645     WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
02646     Builder.defineMacro("_M_X64");
02647     Builder.defineMacro("_M_AMD64");
02648   }
02649 };
02650 } // end anonymous namespace
02651 
02652 namespace {
02653 // x86-64 MinGW target
02654 class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
02655 public:
02656   MinGWX86_64TargetInfo(const std::string& triple)
02657     : WindowsX86_64TargetInfo(triple) {
02658   }
02659   virtual void getTargetDefines(const LangOptions &Opts,
02660                                 MacroBuilder &Builder) const {
02661     WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
02662     DefineStd(Builder, "WIN64", Opts);
02663     Builder.defineMacro("__MSVCRT__");
02664     Builder.defineMacro("__MINGW32__");
02665     Builder.defineMacro("__MINGW64__");
02666 
02667     // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
02668     // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
02669     if (Opts.MicrosoftExt)
02670       // Provide "as-is" __declspec.
02671       Builder.defineMacro("__declspec", "__declspec");
02672     else
02673       // Provide alias of __attribute__ like mingw32-gcc.
02674       Builder.defineMacro("__declspec(a)", "__attribute__((a))");
02675   }
02676 };
02677 } // end anonymous namespace
02678 
02679 namespace {
02680 class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
02681 public:
02682   DarwinX86_64TargetInfo(const std::string& triple)
02683       : DarwinTargetInfo<X86_64TargetInfo>(triple) {
02684     Int64Type = SignedLongLong;
02685   }
02686 };
02687 } // end anonymous namespace
02688 
02689 namespace {
02690 class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
02691 public:
02692   OpenBSDX86_64TargetInfo(const std::string& triple)
02693       : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
02694     IntMaxType = SignedLongLong;
02695     UIntMaxType = UnsignedLongLong;
02696     Int64Type = SignedLongLong;
02697   }
02698 };
02699 } // end anonymous namespace
02700 
02701 namespace {
02702 class ARMTargetInfo : public TargetInfo {
02703   // Possible FPU choices.
02704   enum FPUMode {
02705     NoFPU,
02706     VFP2FPU,
02707     VFP3FPU,
02708     NeonFPU
02709   };
02710 
02711   static bool FPUModeIsVFP(FPUMode Mode) {
02712     return Mode >= VFP2FPU && Mode <= NeonFPU;
02713   }
02714 
02715   static const TargetInfo::GCCRegAlias GCCRegAliases[];
02716   static const char * const GCCRegNames[];
02717 
02718   std::string ABI, CPU;
02719 
02720   unsigned FPU : 3;
02721 
02722   unsigned IsThumb : 1;
02723 
02724   // Initialized via features.
02725   unsigned SoftFloat : 1;
02726   unsigned SoftFloatABI : 1;
02727 
02728   static const Builtin::Info BuiltinInfo[];
02729 
02730 public:
02731   ARMTargetInfo(const std::string &TripleStr)
02732     : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
02733   {
02734     BigEndian = false;
02735     SizeType = UnsignedInt;
02736     PtrDiffType = SignedInt;
02737     // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
02738     WCharType = UnsignedInt;
02739 
02740     // {} in inline assembly are neon specifiers, not assembly variant
02741     // specifiers.
02742     NoAsmVariants = true;
02743 
02744     // FIXME: Should we just treat this as a feature?
02745     IsThumb = getTriple().getArchName().startswith("thumb");
02746     if (IsThumb) {
02747       // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
02748       // so set preferred for small types to 32.
02749       DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
02750                            "i64:64:64-f32:32:32-f64:64:64-"
02751                            "v64:64:64-v128:64:128-a0:0:32-n32-S64");
02752     } else {
02753       DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
02754                            "i64:64:64-f32:32:32-f64:64:64-"
02755                            "v64:64:64-v128:64:128-a0:0:64-n32-S64");
02756     }
02757 
02758     // ARM targets default to using the ARM C++ ABI.
02759     CXXABI = CXXABI_ARM;
02760 
02761     // ARM has atomics up to 8 bytes
02762     // FIXME: Set MaxAtomicInlineWidth if we have the feature v6e
02763     MaxAtomicPromoteWidth = 64;
02764 
02765     // Do force alignment of members that follow zero length bitfields.  If
02766     // the alignment of the zero-length bitfield is greater than the member 
02767     // that follows it, `bar', `bar' will be aligned as the  type of the 
02768     // zero length bitfield.
02769     UseZeroLengthBitfieldAlignment = true;
02770   }
02771   virtual const char *getABI() const { return ABI.c_str(); }
02772   virtual bool setABI(const std::string &Name) {
02773     ABI = Name;
02774 
02775     // The defaults (above) are for AAPCS, check if we need to change them.
02776     //
02777     // FIXME: We need support for -meabi... we could just mangle it into the
02778     // name.
02779     if (Name == "apcs-gnu") {
02780       DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
02781       SizeType = UnsignedLong;
02782 
02783       // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
02784       WCharType = SignedInt;
02785 
02786       // Do not respect the alignment of bit-field types when laying out
02787       // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
02788       UseBitFieldTypeAlignment = false;
02789 
02790       /// gcc forces the alignment to 4 bytes, regardless of the type of the
02791       /// zero length bitfield.  This corresponds to EMPTY_FIELD_BOUNDARY in
02792       /// gcc.
02793       ZeroLengthBitfieldBoundary = 32;
02794 
02795       if (IsThumb) {
02796         // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
02797         // so set preferred for small types to 32.
02798         DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
02799                              "i64:32:64-f32:32:32-f64:32:64-"
02800                              "v64:32:64-v128:32:128-a0:0:32-n32-S32");
02801       } else {
02802         DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
02803                              "i64:32:64-f32:32:32-f64:32:64-"
02804                              "v64:32:64-v128:32:128-a0:0:32-n32-S32");
02805       }
02806 
02807       // FIXME: Override "preferred align" for double and long long.
02808     } else if (Name == "aapcs") {
02809       // FIXME: Enumerated types are variable width in straight AAPCS.
02810     } else if (Name == "aapcs-linux") {
02811       ;
02812     } else
02813       return false;
02814 
02815     return true;
02816   }
02817 
02818   void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
02819     if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
02820       Features["vfp2"] = true;
02821     else if (CPU == "cortex-a8" || CPU == "cortex-a9")
02822       Features["neon"] = true;
02823   }
02824 
02825   virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
02826                                  StringRef Name,
02827                                  bool Enabled) const {
02828     if (Name == "soft-float" || Name == "soft-float-abi" ||
02829         Name == "vfp2" || Name == "vfp3" || Name == "neon" || Name == "d16" ||
02830         Name == "neonfp") {
02831       Features[Name] = Enabled;
02832     } else
02833       return false;
02834 
02835     return true;
02836   }
02837 
02838   virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
02839     FPU = NoFPU;
02840     SoftFloat = SoftFloatABI = false;
02841     for (unsigned i = 0, e = Features.size(); i != e; ++i) {
02842       if (Features[i] == "+soft-float")
02843         SoftFloat = true;
02844       else if (Features[i] == "+soft-float-abi")
02845         SoftFloatABI = true;
02846       else if (Features[i] == "+vfp2")
02847         FPU = VFP2FPU;
02848       else if (Features[i] == "+vfp3")
02849         FPU = VFP3FPU;
02850       else if (Features[i] == "+neon")
02851         FPU = NeonFPU;
02852     }
02853 
02854     // Remove front-end specific options which the backend handles differently.
02855     std::vector<std::string>::iterator it;
02856     it = std::find(Features.begin(), Features.end(), "+soft-float");
02857     if (it != Features.end())
02858       Features.erase(it);
02859     it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
02860     if (it != Features.end())
02861       Features.erase(it);
02862   }
02863 
02864   virtual bool hasFeature(StringRef Feature) const {
02865     return llvm::StringSwitch<bool>(Feature)
02866         .Case("arm", true)
02867         .Case("softfloat", SoftFloat)
02868         .Case("thumb", IsThumb)
02869         .Case("neon", FPU == NeonFPU && !SoftFloat && 
02870               StringRef(getCPUDefineSuffix(CPU)).startswith("7"))    
02871         .Default(false);
02872   }
02873   static const char *getCPUDefineSuffix(StringRef Name) {
02874     return llvm::StringSwitch<const char*>(Name)
02875       .Cases("arm8", "arm810", "4")
02876       .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
02877       .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
02878       .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
02879       .Case("ep9312", "4T")
02880       .Cases("arm10tdmi", "arm1020t", "5T")
02881       .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
02882       .Case("arm926ej-s", "5TEJ")
02883       .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
02884       .Cases("xscale", "iwmmxt", "5TE")
02885       .Case("arm1136j-s", "6J")
02886       .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
02887       .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
02888       .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
02889       .Cases("cortex-a8", "cortex-a9", "7A")
02890       .Case("cortex-m3", "7M")
02891       .Case("cortex-m4", "7M")
02892       .Case("cortex-m0", "6M")
02893       .Default(0);
02894   }
02895   virtual bool setCPU(const std::string &Name) {
02896     if (!getCPUDefineSuffix(Name))
02897       return false;
02898 
02899     CPU = Name;
02900     return true;
02901   }
02902   virtual void getTargetDefines(const LangOptions &Opts,
02903                                 MacroBuilder &Builder) const {
02904     // Target identification.
02905     Builder.defineMacro("__arm");
02906     Builder.defineMacro("__arm__");
02907 
02908     // Target properties.
02909     Builder.defineMacro("__ARMEL__");
02910     Builder.defineMacro("__LITTLE_ENDIAN__");
02911     Builder.defineMacro("__REGISTER_PREFIX__", "");
02912 
02913     StringRef CPUArch = getCPUDefineSuffix(CPU);
02914     Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
02915 
02916     // Subtarget options.
02917 
02918     // FIXME: It's more complicated than this and we don't really support
02919     // interworking.
02920     if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
02921       Builder.defineMacro("__THUMB_INTERWORK__");
02922 
02923     if (ABI == "aapcs" || ABI == "aapcs-linux")
02924       Builder.defineMacro("__ARM_EABI__");
02925 
02926     if (SoftFloat)
02927       Builder.defineMacro("__SOFTFP__");
02928 
02929     if (CPU == "xscale")
02930       Builder.defineMacro("__XSCALE__");
02931 
02932     bool IsARMv7 = CPUArch.startswith("7");
02933     if (IsThumb) {
02934       Builder.defineMacro("__THUMBEL__");
02935       Builder.defineMacro("__thumb__");
02936       if (CPUArch == "6T2" || IsARMv7)
02937         Builder.defineMacro("__thumb2__");
02938     }
02939 
02940     // Note, this is always on in gcc, even though it doesn't make sense.
02941     Builder.defineMacro("__APCS_32__");
02942 
02943     if (FPUModeIsVFP((FPUMode) FPU))
02944       Builder.defineMacro("__VFP_FP__");
02945 
02946     // This only gets set when Neon instructions are actually available, unlike
02947     // the VFP define, hence the soft float and arch check. This is subtly
02948     // different from gcc, we follow the intent which was that it should be set
02949     // when Neon instructions are actually available.
02950     if (FPU == NeonFPU && !SoftFloat && IsARMv7)
02951       Builder.defineMacro("__ARM_NEON__");
02952   }
02953   virtual void getTargetBuiltins(const Builtin::Info *&Records,
02954                                  unsigned &NumRecords) const {
02955     Records = BuiltinInfo;
02956     NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
02957   }
02958   virtual bool isCLZForZeroUndef() const { return false; }
02959   virtual const char *getVAListDeclaration() const {
02960     return "typedef void* __builtin_va_list;";
02961   }
02962   virtual void getGCCRegNames(const char * const *&Names,
02963                               unsigned &NumNames) const;
02964   virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
02965                                 unsigned &NumAliases) const;
02966   virtual bool validateAsmConstraint(const char *&Name,
02967                                      TargetInfo::ConstraintInfo &Info) const {
02968     // FIXME: Check if this is complete
02969     switch (*Name) {
02970     default:
02971     case 'l': // r0-r7
02972     case 'h': // r8-r15
02973     case 'w': // VFP Floating point register single precision
02974     case 'P': // VFP Floating point register double precision
02975       Info.setAllowsRegister();
02976       return true;
02977     case 'Q': // A memory address that is a single base register.
02978       Info.setAllowsMemory();
02979       return true;
02980     case 'U': // a memory reference...
02981       switch (Name[1]) {
02982       case 'q': // ...ARMV4 ldrsb
02983       case 'v': // ...VFP load/store (reg+constant offset)
02984       case 'y': // ...iWMMXt load/store
02985       case 't': // address valid for load/store opaque types wider
02986           // than 128-bits
02987       case 'n': // valid address for Neon doubleword vector load/store
02988       case 'm': // valid address for Neon element and structure load/store
02989       case 's': // valid address for non-offset loads/stores of quad-word
02990           // values in four ARM registers
02991         Info.setAllowsMemory();
02992         Name++;
02993         return true;
02994       }
02995     }
02996     return false;
02997   }
02998   virtual std::string convertConstraint(const char *&Constraint) const {
02999     std::string R;
03000     switch (*Constraint) {
03001     case 'U':   // Two-character constraint; add "^" hint for later parsing.
03002       R = std::string("^") + std::string(Constraint, 2);
03003       Constraint++;
03004       break;
03005     case 'p': // 'p' should be translated to 'r' by default.
03006       R = std::string("r");
03007       break;
03008     default:
03009       return std::string(1, *Constraint);
03010     }
03011     return R;
03012   }
03013   virtual const char *getClobbers() const {
03014     // FIXME: Is this really right?
03015     return "";
03016   }
03017 };
03018 
03019 const char * const ARMTargetInfo::GCCRegNames[] = {
03020   // Integer registers
03021   "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
03022   "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
03023 
03024   // Float registers
03025   "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
03026   "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
03027   "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
03028   "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
03029 
03030   // Double registers
03031   "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
03032   "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
03033   "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
03034   "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
03035 
03036   // Quad registers
03037   "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
03038   "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
03039 };
03040 
03041 void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
03042                                    unsigned &NumNames) const {
03043   Names = GCCRegNames;
03044   NumNames = llvm::array_lengthof(GCCRegNames);
03045 }
03046 
03047 const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
03048   { { "a1" }, "r0" },
03049   { { "a2" }, "r1" },
03050   { { "a3" }, "r2" },
03051   { { "a4" }, "r3" },
03052   { { "v1" }, "r4" },
03053   { { "v2" }, "r5" },
03054   { { "v3" }, "r6" },
03055   { { "v4" }, "r7" },
03056   { { "v5" }, "r8" },
03057   { { "v6", "rfp" }, "r9" },
03058   { { "sl" }, "r10" },
03059   { { "fp" }, "r11" },
03060   { { "ip" }, "r12" },
03061   { { "r13" }, "sp" },
03062   { { "r14" }, "lr" },
03063   { { "r15" }, "pc" },
03064   // The S, D and Q registers overlap, but aren't really aliases; we
03065   // don't want to substitute one of these for a different-sized one.
03066 };
03067 
03068 void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
03069                                        unsigned &NumAliases) const {
03070   Aliases = GCCRegAliases;
03071   NumAliases = llvm::array_lengthof(GCCRegAliases);
03072 }
03073 
03074 const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
03075 #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
03076 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
03077                                               ALL_LANGUAGES },
03078 #include "clang/Basic/BuiltinsARM.def"
03079 };
03080 } // end anonymous namespace.
03081 
03082 namespace {
03083 class DarwinARMTargetInfo :
03084   public DarwinTargetInfo<ARMTargetInfo> {
03085 protected:
03086   virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
03087                             MacroBuilder &Builder) const {
03088     getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
03089   }
03090 
03091 public:
03092   DarwinARMTargetInfo(const std::string& triple)
03093     : DarwinTargetInfo<ARMTargetInfo>(triple) {
03094     HasAlignMac68kSupport = true;
03095     // iOS always has 64-bit atomic instructions.
03096     // FIXME: This should be based off of the target features in ARMTargetInfo.
03097     MaxAtomicInlineWidth = 64;
03098   }
03099 };
03100 } // end anonymous namespace.
03101 
03102 
03103 namespace {
03104 // Hexagon abstract base class
03105 class HexagonTargetInfo : public TargetInfo {
03106   static const Builtin::Info BuiltinInfo[];
03107   static const char * const GCCRegNames[];
03108   static const TargetInfo::GCCRegAlias GCCRegAliases[];
03109   std::string CPU;
03110 public:
03111   HexagonTargetInfo(const std::string& triple) : TargetInfo(triple)  {
03112     BigEndian = false;
03113     DescriptionString = ("e-p:32:32:32-"
03114                          "i64:64:64-i32:32:32-i16:16:16-i1:32:32"
03115                          "f64:64:64-f32:32:32-a0:0-n32");
03116 
03117     // {} in inline assembly are packet specifiers, not assembly variant
03118     // specifiers.
03119     NoAsmVariants = true;
03120   }
03121 
03122   virtual void getTargetBuiltins(const Builtin::Info *&Records,
03123                                  unsigned &NumRecords) const {
03124     Records = BuiltinInfo;
03125     NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
03126   }
03127 
03128   virtual bool validateAsmConstraint(const char *&Name,
03129                                      TargetInfo::ConstraintInfo &Info) const {
03130     return true;
03131   }
03132 
03133   virtual void getTargetDefines(const LangOptions &Opts,
03134                                 MacroBuilder &Builder) const;
03135 
03136   virtual bool hasFeature(StringRef Feature) const {
03137     return Feature == "hexagon";
03138   }
03139   
03140   virtual const char *getVAListDeclaration() const {
03141     return "typedef char* __builtin_va_list;";
03142   }
03143   virtual void getGCCRegNames(const char * const *&Names,
03144                               unsigned &NumNames) const;
03145   virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
03146                                 unsigned &NumAliases) const;
03147   virtual const char *getClobbers() const {
03148     return "";
03149   }
03150 
03151   static const char *getHexagonCPUSuffix(StringRef Name) {
03152     return llvm::StringSwitch<const char*>(Name)
03153       .Case("hexagonv2", "2")
03154       .Case("hexagonv3", "3")
03155       .Case("hexagonv4", "4")
03156       .Case("hexagonv5", "5")
03157       .Default(0);
03158   }
03159 
03160   virtual bool setCPU(const std::string &Name) {
03161     if (!getHexagonCPUSuffix(Name))
03162       return false;
03163 
03164     CPU = Name;
03165     return true;
03166   }
03167 };
03168 
03169 void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
03170                                 MacroBuilder &Builder) const {
03171   Builder.defineMacro("qdsp6");
03172   Builder.defineMacro("__qdsp6", "1");
03173   Builder.defineMacro("__qdsp6__", "1");
03174 
03175   Builder.defineMacro("hexagon");
03176   Builder.defineMacro("__hexagon", "1");
03177   Builder.defineMacro("__hexagon__", "1");
03178 
03179   if(CPU == "hexagonv1") {
03180     Builder.defineMacro("__HEXAGON_V1__");
03181     Builder.defineMacro("__HEXAGON_ARCH__", "1");
03182     if(Opts.HexagonQdsp6Compat) {
03183       Builder.defineMacro("__QDSP6_V1__");
03184       Builder.defineMacro("__QDSP6_ARCH__", "1");
03185     }
03186   }
03187   else if(CPU == "hexagonv2") {
03188     Builder.defineMacro("__HEXAGON_V2__");
03189     Builder.defineMacro("__HEXAGON_ARCH__", "2");
03190     if(Opts.HexagonQdsp6Compat) {
03191       Builder.defineMacro("__QDSP6_V2__");
03192       Builder.defineMacro("__QDSP6_ARCH__", "2");
03193     }
03194   }
03195   else if(CPU == "hexagonv3") {
03196     Builder.defineMacro("__HEXAGON_V3__");
03197     Builder.defineMacro("__HEXAGON_ARCH__", "3");
03198     if(Opts.HexagonQdsp6Compat) {
03199       Builder.defineMacro("__QDSP6_V3__");
03200       Builder.defineMacro("__QDSP6_ARCH__", "3");
03201     }
03202   }
03203   else if(CPU == "hexagonv4") {
03204     Builder.defineMacro("__HEXAGON_V4__");
03205     Builder.defineMacro("__HEXAGON_ARCH__", "4");
03206     if(Opts.HexagonQdsp6Compat) {
03207       Builder.defineMacro("__QDSP6_V4__");
03208       Builder.defineMacro("__QDSP6_ARCH__", "4");
03209     }
03210   }
03211   else if(CPU == "hexagonv5") {
03212     Builder.defineMacro("__HEXAGON_V5__");
03213     Builder.defineMacro("__HEXAGON_ARCH__", "5");
03214     if(Opts.HexagonQdsp6Compat) {
03215       Builder.defineMacro("__QDSP6_V5__");
03216       Builder.defineMacro("__QDSP6_ARCH__", "5");
03217     }
03218   }
03219 }
03220 
03221 const char * const HexagonTargetInfo::GCCRegNames[] = {
03222   "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
03223   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
03224   "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
03225   "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
03226   "p0", "p1", "p2", "p3",
03227   "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
03228 };
03229 
03230 void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
03231                                    unsigned &NumNames) const {
03232   Names = GCCRegNames;
03233   NumNames = llvm::array_lengthof(GCCRegNames);
03234 }
03235 
03236 
03237 const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
03238   { { "sp" }, "r29" },
03239   { { "fp" }, "r30" },
03240   { { "lr" }, "r31" },
03241  };
03242 
03243 void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
03244                                      unsigned &NumAliases) const {
03245   Aliases = GCCRegAliases;
03246   NumAliases = llvm::array_lengthof(GCCRegAliases);
03247 }
03248 
03249 
03250 const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
03251 #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
03252 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
03253                                               ALL_LANGUAGES },
03254 #include "clang/Basic/BuiltinsHexagon.def"
03255 };
03256 }
03257 
03258 
03259 namespace {
03260 class SparcV8TargetInfo : public TargetInfo {
03261   static const TargetInfo::GCCRegAlias GCCRegAliases[];
03262   static const char * const GCCRegNames[];
03263   bool SoftFloat;
03264 public:
03265   SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
03266     // FIXME: Support Sparc quad-precision long double?
03267     BigEndian = false;
03268     DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
03269                         "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
03270   }
03271   virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
03272                                  StringRef Name,
03273                                  bool Enabled) const {
03274     if (Name == "soft-float")
03275       Features[Name] = Enabled;
03276     else
03277       return false;
03278 
03279     return true;
03280   }
03281   virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
03282     SoftFloat = false;
03283     for (unsigned i = 0, e = Features.size(); i != e; ++i)
03284       if (Features[i] == "+soft-float")
03285         SoftFloat = true;
03286   }
03287   virtual void getTargetDefines(const LangOptions &Opts,
03288                                 MacroBuilder &Builder) const {
03289     DefineStd(Builder, "sparc", Opts);
03290     Builder.defineMacro("__sparcv8");
03291     Builder.defineMacro("__REGISTER_PREFIX__", "");
03292 
03293     if (SoftFloat)
03294       Builder.defineMacro("SOFT_FLOAT", "1");
03295   }
03296   
03297   virtual bool hasFeature(StringRef Feature) const {
03298     return llvm::StringSwitch<bool>(Feature)
03299              .Case("softfloat", SoftFloat)
03300              .Case("sparc", true)
03301              .Default(false);
03302   }
03303   
03304   virtual void getTargetBuiltins(const Builtin::Info *&Records,
03305                                  unsigned &NumRecords) const {
03306     // FIXME: Implement!
03307   }
03308   virtual const char *getVAListDeclaration() const {
03309     return "typedef void* __builtin_va_list;";
03310   }
03311   virtual void getGCCRegNames(const char * const *&Names,
03312                               unsigned &NumNames) const;
03313   virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
03314                                 unsigned &NumAliases) const;
03315   virtual bool validateAsmConstraint(const char *&Name,
03316                                      TargetInfo::ConstraintInfo &info) const {
03317     // FIXME: Implement!
03318     return false;
03319   }
03320   virtual const char *getClobbers() const {
03321     // FIXME: Implement!
03322     return "";
03323   }
03324 };
03325 
03326 const char * const SparcV8TargetInfo::GCCRegNames[] = {
03327   "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
03328   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
03329   "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
03330   "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
03331 };
03332 
03333 void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
03334                                        unsigned &NumNames) const {
03335   Names = GCCRegNames;
03336   NumNames = llvm::array_lengthof(GCCRegNames);
03337 }
03338 
03339 const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
03340   { { "g0" }, "r0" },
03341   { { "g1" }, "r1" },
03342   { { "g2" }, "r2" },
03343   { { "g3" }, "r3" },
03344   { { "g4" }, "r4" },
03345   { { "g5" }, "r5" },
03346   { { "g6" }, "r6" },
03347   { { "g7" }, "r7" },
03348   { { "o0" }, "r8" },
03349   { { "o1" }, "r9" },
03350   { { "o2" }, "r10" },
03351   { { "o3" }, "r11" },
03352   { { "o4" }, "r12" },
03353   { { "o5" }, "r13" },
03354   { { "o6", "sp" }, "r14" },
03355   { { "o7" }, "r15" },
03356   { { "l0" }, "r16" },
03357   { { "l1" }, "r17" },
03358   { { "l2" }, "r18" },
03359   { { "l3" }, "r19" },
03360   { { "l4" }, "r20" },
03361   { { "l5" }, "r21" },
03362   { { "l6" }, "r22" },
03363   { { "l7" }, "r23" },
03364   { { "i0" }, "r24" },
03365   { { "i1" }, "r25" },
03366   { { "i2" }, "r26" },
03367   { { "i3" }, "r27" },
03368   { { "i4" }, "r28" },
03369   { { "i5" }, "r29" },
03370   { { "i6", "fp" }, "r30" },
03371   { { "i7" }, "r31" },
03372 };
03373 
03374 void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
03375                                          unsigned &NumAliases) const {
03376   Aliases = GCCRegAliases;
03377   NumAliases = llvm::array_lengthof(GCCRegAliases);
03378 }
03379 } // end anonymous namespace.
03380 
03381 namespace {
03382 class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
03383 public:
03384   AuroraUXSparcV8TargetInfo(const std::string& triple) :
03385       AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
03386     SizeType = UnsignedInt;
03387     PtrDiffType = SignedInt;
03388   }
03389 };
03390 class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
03391 public:
03392   SolarisSparcV8TargetInfo(const std::string& triple) :
03393       SolarisTargetInfo<SparcV8TargetInfo>(triple) {
03394     SizeType = UnsignedInt;
03395     PtrDiffType = SignedInt;
03396   }
03397 };
03398 } // end anonymous namespace.
03399 
03400 namespace {
03401   class MSP430TargetInfo : public TargetInfo {
03402     static const char * const GCCRegNames[];
03403   public:
03404     MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
03405       BigEndian = false;
03406       TLSSupported = false;
03407       IntWidth = 16; IntAlign = 16;
03408       LongWidth = 32; LongLongWidth = 64;
03409       LongAlign = LongLongAlign = 16;
03410       PointerWidth = 16; PointerAlign = 16;
03411       SuitableAlign = 16;
03412       SizeType = UnsignedInt;
03413       IntMaxType = SignedLong;
03414       UIntMaxType = UnsignedLong;
03415       IntPtrType = SignedShort;
03416       PtrDiffType = SignedInt;
03417       SigAtomicType = SignedLong;
03418       DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
03419    }
03420     virtual void getTargetDefines(const LangOptions &Opts,
03421                                   MacroBuilder &Builder) const {
03422       Builder.defineMacro("MSP430");
03423       Builder.defineMacro("__MSP430__");
03424       // FIXME: defines for different 'flavours' of MCU
03425     }
03426     virtual void getTargetBuiltins(const Builtin::Info *&Records,
03427                                    unsigned &NumRecords) const {
03428      // FIXME: Implement.
03429       Records = 0;
03430       NumRecords = 0;
03431     }
03432     virtual bool hasFeature(StringRef Feature) const {
03433       return Feature == "msp430";
03434     }
03435     virtual void getGCCRegNames(const char * const *&Names,
03436                                 unsigned &NumNames) const;
03437     virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
03438                                   unsigned &NumAliases) const {
03439       // No aliases.
03440       Aliases = 0;
03441       NumAliases = 0;
03442     }
03443     virtual bool validateAsmConstraint(const char *&Name,
03444                                        TargetInfo::ConstraintInfo &info) const {
03445       // No target constraints for now.
03446       return false;
03447     }
03448     virtual const char *getClobbers() const {
03449       // FIXME: Is this really right?
03450       return "";
03451     }
03452     virtual const char *getVAListDeclaration() const {
03453       // FIXME: implement
03454       return "typedef char* __builtin_va_list;";
03455    }
03456   };
03457 
03458   const char * const MSP430TargetInfo::GCCRegNames[] = {
03459     "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
03460     "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
03461   };
03462 
03463   void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
03464                                         unsigned &NumNames) const {
03465     Names = GCCRegNames;
03466     NumNames = llvm::array_lengthof(GCCRegNames);
03467   }
03468 }
03469 
03470 namespace {
03471 
03472   // LLVM and Clang cannot be used directly to output native binaries for
03473   // target, but is used to compile C code to llvm bitcode with correct
03474   // type and alignment information.
03475   //
03476   // TCE uses the llvm bitcode as input and uses it for generating customized
03477   // target processor and program binary. TCE co-design environment is
03478   // publicly available in http://tce.cs.tut.fi
03479 
03480   static const unsigned TCEOpenCLAddrSpaceMap[] = {
03481       3, // opencl_global
03482       4, // opencl_local
03483       5, // opencl_constant
03484       0, // cuda_device
03485       0, // cuda_constant
03486       0  // cuda_shared
03487   };
03488 
03489   class TCETargetInfo : public TargetInfo{
03490   public:
03491     TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
03492       TLSSupported = false;
03493       IntWidth = 32;
03494       LongWidth = LongLongWidth = 32;
03495       PointerWidth = 32;
03496       IntAlign = 32;
03497       LongAlign = LongLongAlign = 32;
03498       PointerAlign = 32;
03499       SuitableAlign = 32;
03500       SizeType = UnsignedInt;
03501       IntMaxType = SignedLong;
03502       UIntMaxType = UnsignedLong;
03503       IntPtrType = SignedInt;
03504       PtrDiffType = SignedInt;
03505       FloatWidth = 32;
03506       FloatAlign = 32;
03507       DoubleWidth = 32;
03508       DoubleAlign = 32;
03509       LongDoubleWidth = 32;
03510       LongDoubleAlign = 32;
03511       FloatFormat = &llvm::APFloat::IEEEsingle;
03512       DoubleFormat = &llvm::APFloat::IEEEsingle;
03513       LongDoubleFormat = &llvm::APFloat::IEEEsingle;
03514       DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
03515                           "i16:16:32-i32:32:32-i64:32:32-"
03516                           "f32:32:32-f64:32:32-v64:32:32-"
03517                           "v128:32:32-a0:0:32-n32";
03518       AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
03519     }
03520 
03521     virtual void getTargetDefines(const LangOptions &Opts,
03522                                   MacroBuilder &Builder) const {
03523       DefineStd(Builder, "tce", Opts);
03524       Builder.defineMacro("__TCE__");
03525       Builder.defineMacro("__TCE_V1__");
03526     }
03527     virtual bool hasFeature(StringRef Feature) const {
03528       return Feature == "tce";
03529     }
03530     
03531     virtual void getTargetBuiltins(const Builtin::Info *&Records,
03532                                    unsigned &NumRecords) const {}
03533     virtual const char *getClobbers() const {
03534       return "";
03535     }
03536     virtual const char *getVAListDeclaration() const {
03537       return "typedef void* __builtin_va_list;";
03538     }
03539     virtual void getGCCRegNames(const char * const *&Names,
03540                                 unsigned &NumNames) const {}
03541     virtual bool validateAsmConstraint(const char *&Name,
03542                                        TargetInfo::ConstraintInfo &info) const {
03543       return true;
03544     }
03545     virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
03546                                   unsigned &NumAliases) const {}
03547   };
03548 }
03549 
03550 namespace {
03551 class MipsTargetInfoBase : public TargetInfo {
03552   std::string CPU;
03553   bool SoftFloat;
03554   bool SingleFloat;
03555 
03556 protected:
03557   std::string ABI;
03558 
03559 public:
03560   MipsTargetInfoBase(const std::string& triple,
03561                      const std::string& ABIStr,
03562                      const std::string& CPUStr)
03563     : TargetInfo(triple),
03564       CPU(CPUStr),
03565       SoftFloat(false), SingleFloat(false),
03566       ABI(ABIStr)
03567   {}
03568 
03569   virtual const char *getABI() const { return ABI.c_str(); }
03570   virtual bool setABI(const std::string &Name) = 0;
03571   virtual bool setCPU(const std::string &Name) {
03572     CPU = Name;
03573     return true;
03574   }
03575   void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
03576     Features[ABI] = true;
03577     Features[CPU] = true;
03578   }
03579 
03580   virtual void getArchDefines(const LangOptions &Opts,
03581                               MacroBuilder &Builder) const {
03582     if (SoftFloat)
03583       Builder.defineMacro("__mips_soft_float", Twine(1));
03584     else if (SingleFloat)
03585       Builder.defineMacro("__mips_single_float", Twine(1));
03586     else if (!SoftFloat && !SingleFloat)
03587       Builder.defineMacro("__mips_hard_float", Twine(1));
03588     else
03589       llvm_unreachable("Invalid float ABI for Mips.");
03590 
03591     Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
03592     Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
03593     Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
03594   }
03595 
03596   virtual void getTargetDefines(const LangOptions &Opts,
03597                                 MacroBuilder &Builder) const = 0;
03598   virtual void getTargetBuiltins(const Builtin::Info *&Records,
03599                                  unsigned &NumRecords) const {
03600     // FIXME: Implement!
03601   }
03602   virtual bool hasFeature(StringRef Feature) const {
03603     return Feature == "mips";
03604   }
03605   virtual const char *getVAListDeclaration() const {
03606     return "typedef void* __builtin_va_list;";
03607   }
03608   virtual void getGCCRegNames(const char * const *&Names,
03609                               unsigned &NumNames) const {
03610     static const char * const GCCRegNames[] = {
03611       // CPU register names
03612       // Must match second column of GCCRegAliases
03613       "$0",   "$1",   "$2",   "$3",   "$4",   "$5",   "$6",   "$7",
03614       "$8",   "$9",   "$10",  "$11",  "$12",  "$13",  "$14",  "$15",
03615       "$16",  "$17",  "$18",  "$19",  "$20",  "$21",  "$22",  "$23",
03616       "$24",  "$25",  "$26",  "$27",  "$28",  "$29",  "$30",  "$31",
03617       // Floating point register names
03618       "$f0",  "$f1",  "$f2",  "$f3",  "$f4",  "$f5",  "$f6",  "$f7",
03619       "$f8",  "$f9",  "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
03620       "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
03621       "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
03622       // Hi/lo and condition register names
03623       "hi",   "lo",   "",     "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
03624       "$fcc5","$fcc6","$fcc7"
03625     };
03626     Names = GCCRegNames;
03627     NumNames = llvm::array_lengthof(GCCRegNames);
03628   }
03629   virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
03630                                 unsigned &NumAliases) const = 0;
03631   virtual bool validateAsmConstraint(const char *&Name,
03632                                      TargetInfo::ConstraintInfo &Info) const {
03633     switch (*Name) {
03634     default:
03635       return false;
03636         
03637     case 'r': // CPU registers.
03638     case 'd': // Equivalent to "r" unless generating MIPS16 code.
03639     case 'y': // Equivalent to "r", backwards compatibility only.
03640     case 'f': // floating-point registers.
03641     case 'c': // $25 for indirect jumps
03642     case 'l': // lo register
03643     case 'x': // hilo register pair
03644       Info.setAllowsRegister();
03645       return true;
03646     }
03647   }
03648 
03649   virtual const char *getClobbers() const {
03650     // FIXME: Implement!
03651     return "";
03652   }
03653 
03654   virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
03655                                  StringRef Name,
03656                                  bool Enabled) const {
03657     if (Name == "soft-float" || Name == "single-float" ||
03658         Name == "o32" || Name == "n32" || Name == "n64" || Name == "eabi" ||
03659         Name == "mips32" || Name == "mips32r2" ||
03660         Name == "mips64" || Name == "mips64r2") {
03661       Features[Name] = Enabled;
03662       return true;
03663     }
03664     return false;
03665   }
03666 
03667   virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
03668     SoftFloat = false;
03669     SingleFloat = false;
03670 
03671     for (std::vector<std::string>::iterator it = Features.begin(),
03672          ie = Features.end(); it != ie; ++it) {
03673       if (*it == "+single-float") {
03674         SingleFloat = true;
03675         break;
03676       }
03677 
03678       if (*it == "+soft-float") {
03679         SoftFloat = true;
03680         // This option is front-end specific.
03681         // Do not need to pass it to the backend.
03682         Features.erase(it);
03683         break;
03684       }
03685     }
03686   }
03687 };
03688 
03689 class Mips32TargetInfoBase : public MipsTargetInfoBase {
03690 public:
03691   Mips32TargetInfoBase(const std::string& triple) :
03692     MipsTargetInfoBase(triple, "o32", "mips32") {
03693     SizeType = UnsignedInt;
03694     PtrDiffType = SignedInt;
03695   }
03696   virtual bool setABI(const std::string &Name) {
03697     if ((Name == "o32") || (Name == "eabi")) {
03698       ABI = Name;
03699       return true;
03700     } else
03701       return false;
03702   }
03703   virtual void getArchDefines(const LangOptions &Opts,
03704                               MacroBuilder &Builder) const {
03705     MipsTargetInfoBase::getArchDefines(Opts, Builder);
03706 
03707     if (ABI == "o32") {
03708       Builder.defineMacro("__mips_o32");
03709       Builder.defineMacro("_ABIO32", "1");
03710       Builder.defineMacro("_MIPS_SIM", "_ABIO32");
03711     }
03712     else if (ABI == "eabi")
03713       Builder.defineMacro("__mips_eabi");
03714     else
03715       llvm_unreachable("Invalid ABI for Mips32.");
03716   }
03717   virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
03718                                 unsigned &NumAliases) const {
03719     static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
03720       { { "at" },  "$1" },
03721       { { "v0" },  "$2" },
03722       { { "v1" },  "$3" },
03723       { { "a0" },  "$4" },
03724       { { "a1" },  "$5" },
03725       { { "a2" },  "$6" },
03726       { { "a3" },  "$7" },
03727       { { "t0" },  "$8" },
03728       { { "t1" },  "$9" },
03729       { { "t2" }, "$10" },
03730       { { "t3" }, "$11" },
03731       { { "t4" }, "$12" },
03732       { { "t5" }, "$13" },
03733       { { "t6" }, "$14" },
03734       { { "t7" }, "$15" },
03735       { { "s0" }, "$16" },
03736       { { "s1" }, "$17" },
03737       { { "s2" }, "$18" },
03738       { { "s3" }, "$19" },
03739       { { "s4" }, "$20" },
03740       { { "s5" }, "$21" },
03741       { { "s6" }, "$22" },
03742       { { "s7" }, "$23" },
03743       { { "t8" }, "$24" },
03744       { { "t9" }, "$25" },
03745       { { "k0" }, "$26" },
03746       { { "k1" }, "$27" },
03747       { { "gp" }, "$28" },
03748       { { "sp","$sp" }, "$29" },
03749       { { "fp","$fp" }, "$30" },
03750       { { "ra" }, "$31" }
03751     };
03752     Aliases = GCCRegAliases;
03753     NumAliases = llvm::array_lengthof(GCCRegAliases);
03754   }
03755 };
03756 
03757 class Mips32EBTargetInfo : public Mips32TargetInfoBase {
03758 public:
03759   Mips32EBTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
03760     DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
03761                         "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
03762   }
03763   virtual void getTargetDefines(const LangOptions &Opts,
03764                                 MacroBuilder &Builder) const {
03765     DefineStd(Builder, "mips", Opts);
03766     Builder.defineMacro("_mips");
03767     DefineStd(Builder, "MIPSEB", Opts);
03768     Builder.defineMacro("_MIPSEB");
03769     Builder.defineMacro("__REGISTER_PREFIX__", "");
03770     getArchDefines(Opts, Builder);
03771   }
03772 };
03773 
03774 class Mips32ELTargetInfo : public Mips32TargetInfoBase {
03775 public:
03776   Mips32ELTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
03777     BigEndian = false;
03778     DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
03779                         "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
03780   }
03781   virtual void getTargetDefines(const LangOptions &Opts,
03782                                 MacroBuilder &Builder) const {
03783     DefineStd(Builder, "mips", Opts);
03784     Builder.defineMacro("_mips");
03785     DefineStd(Builder, "MIPSEL", Opts);
03786     Builder.defineMacro("_MIPSEL");
03787     Builder.defineMacro("__REGISTER_PREFIX__", "");
03788     getArchDefines(Opts, Builder);
03789   }
03790 };
03791 
03792 class Mips64TargetInfoBase : public MipsTargetInfoBase {
03793   virtual void SetDescriptionString(const std::string &Name) = 0;
03794 public:
03795   Mips64TargetInfoBase(const std::string& triple) :
03796     MipsTargetInfoBase(triple, "n64", "mips64") {
03797     LongWidth = LongAlign = 64;
03798     PointerWidth = PointerAlign = 64;
03799     LongDoubleWidth = LongDoubleAlign = 128;
03800     LongDoubleFormat = &llvm::APFloat::IEEEquad;
03801     SuitableAlign = 128;
03802   }
03803   virtual bool setABI(const std::string &Name) {
03804     SetDescriptionString(Name);
03805 
03806     if (Name != "n32" && Name != "n64")
03807       return false;
03808 
03809     ABI = Name;
03810 
03811     if (Name == "n32") {
03812       LongWidth = LongAlign = 32;
03813       PointerWidth = PointerAlign = 32;
03814     }
03815 
03816     return true;
03817   }
03818   virtual void getArchDefines(const LangOptions &Opts,
03819                               MacroBuilder &Builder) const {
03820     MipsTargetInfoBase::getArchDefines(Opts, Builder);
03821 
03822     if (ABI == "n32") {
03823       Builder.defineMacro("__mips_n32");
03824       Builder.defineMacro("_ABIN32", "2");
03825       Builder.defineMacro("_MIPS_SIM", "_ABIN32");
03826     }
03827     else if (ABI == "n64") {
03828       Builder.defineMacro("__mips_n64");
03829       Builder.defineMacro("_ABI64", "3");
03830       Builder.defineMacro("_MIPS_SIM", "_ABI64");
03831     }
03832     else
03833       llvm_unreachable("Invalid ABI for Mips64.");
03834   }
03835   virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
03836                                 unsigned &NumAliases) const {
03837     static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
03838       { { "at" },  "$1" },
03839       { { "v0" },  "$2" },
03840       { { "v1" },  "$3" },
03841       { { "a0" },  "$4" },
03842       { { "a1" },  "$5" },
03843       { { "a2" },  "$6" },
03844       { { "a3" },  "$7" },
03845       { { "a4" },  "$8" },
03846       { { "a5" },  "$9" },
03847       { { "a6" }, "$10" },
03848       { { "a7" }, "$11" },
03849       { { "t0" }, "$12" },
03850       { { "t1" }, "$13" },
03851       { { "t2" }, "$14" },
03852       { { "t3" }, "$15" },
03853       { { "s0" }, "$16" },
03854       { { "s1" }, "$17" },
03855       { { "s2" }, "$18" },
03856       { { "s3" }, "$19" },
03857       { { "s4" }, "$20" },
03858       { { "s5" }, "$21" },
03859       { { "s6" }, "$22" },
03860       { { "s7" }, "$23" },
03861       { { "t8" }, "$24" },
03862       { { "t9" }, "$25" },
03863       { { "k0" }, "$26" },
03864       { { "k1" }, "$27" },
03865       { { "gp" }, "$28" },
03866       { { "sp","$sp" }, "$29" },
03867       { { "fp","$fp" }, "$30" },
03868       { { "ra" }, "$31" }
03869     };
03870     Aliases = GCCRegAliases;
03871     NumAliases = llvm::array_lengthof(GCCRegAliases);
03872   }
03873 };
03874 
03875 class Mips64EBTargetInfo : public Mips64TargetInfoBase {
03876   virtual void SetDescriptionString(const std::string &Name) {
03877     // Change DescriptionString only if ABI is n32.  
03878     if (Name == "n32")
03879       DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
03880                           "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
03881                           "v64:64:64-n32";      
03882   }
03883 public:
03884   Mips64EBTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
03885     // Default ABI is n64.  
03886     DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
03887                         "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
03888                         "v64:64:64-n32";
03889   }
03890   virtual void getTargetDefines(const LangOptions &Opts,
03891                                 MacroBuilder &Builder) const {
03892     DefineStd(Builder, "mips", Opts);
03893     Builder.defineMacro("_mips");
03894     DefineStd(Builder, "MIPSEB", Opts);
03895     Builder.defineMacro("_MIPSEB");
03896     Builder.defineMacro("__REGISTER_PREFIX__", "");
03897     getArchDefines(Opts, Builder);
03898   }
03899 };
03900 
03901 class Mips64ELTargetInfo : public Mips64TargetInfoBase {
03902   virtual void SetDescriptionString(const std::string &Name) {
03903     // Change DescriptionString only if ABI is n32.  
03904     if (Name == "n32")
03905       DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
03906                           "i64:64:64-f32:32:32-f64:64:64-f128:128:128"
03907                           "-v64:64:64-n32";      
03908   }
03909 public:
03910   Mips64ELTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
03911     // Default ABI is n64.
03912     BigEndian = false;
03913     DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
03914                         "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
03915                         "v64:64:64-n32";
03916   }
03917   virtual void getTargetDefines(const LangOptions &Opts,
03918                                 MacroBuilder &Builder) const {
03919     DefineStd(Builder, "mips", Opts);
03920     Builder.defineMacro("_mips");
03921     DefineStd(Builder, "MIPSEL", Opts);
03922     Builder.defineMacro("_MIPSEL");
03923     Builder.defineMacro("__REGISTER_PREFIX__", "");
03924     getArchDefines(Opts, Builder);
03925   }
03926 };
03927 } // end anonymous namespace.
03928 
03929 namespace {
03930 class PNaClTargetInfo : public TargetInfo {
03931 public:
03932   PNaClTargetInfo(const std::string& triple) : TargetInfo(triple) {
03933     BigEndian = false;
03934     this->UserLabelPrefix = "";
03935     this->LongAlign = 32;
03936     this->LongWidth = 32;
03937     this->PointerAlign = 32;
03938     this->PointerWidth = 32;
03939     this->IntMaxType = TargetInfo::SignedLongLong;
03940     this->UIntMaxType = TargetInfo::UnsignedLongLong;
03941     this->Int64Type = TargetInfo::SignedLongLong;
03942     this->DoubleAlign = 64;
03943     this->LongDoubleWidth = 64;
03944     this->LongDoubleAlign = 64;
03945     this->SizeType = TargetInfo::UnsignedInt;
03946     this->PtrDiffType = TargetInfo::SignedInt;
03947     this->IntPtrType = TargetInfo::SignedInt;
03948     this->RegParmMax = 2;
03949     DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
03950                         "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
03951   }
03952 
03953   void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
03954   }
03955   virtual void getArchDefines(const LangOptions &Opts,
03956                               MacroBuilder &Builder) const {
03957     Builder.defineMacro("__le32__");
03958     Builder.defineMacro("__pnacl__");
03959   }
03960   virtual void getTargetDefines(const LangOptions &Opts,
03961                                 MacroBuilder &Builder) const {
03962     DefineStd(Builder, "unix", Opts);
03963     Builder.defineMacro("__ELF__");
03964     if (Opts.POSIXThreads)
03965       Builder.defineMacro("_REENTRANT");
03966     if (Opts.CPlusPlus)
03967       Builder.defineMacro("_GNU_SOURCE");
03968 
03969     Builder.defineMacro("__LITTLE_ENDIAN__");
03970     Builder.defineMacro("__native_client__");
03971     getArchDefines(Opts, Builder);
03972   }
03973   virtual bool hasFeature(StringRef Feature) const {
03974     return Feature == "pnacl";
03975   }
03976   virtual void getTargetBuiltins(const Builtin::Info *&Records,
03977                                  unsigned &NumRecords) const {
03978   }
03979   virtual const char *getVAListDeclaration() const {
03980     return "typedef int __builtin_va_list[4];";
03981   }
03982   virtual void getGCCRegNames(const char * const *&Names,
03983                               unsigned &NumNames) const;
03984   virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
03985                                 unsigned &NumAliases) const;
03986   virtual bool validateAsmConstraint(const char *&Name,
03987                                      TargetInfo::ConstraintInfo &Info) const {
03988     return false;
03989   }
03990 
03991   virtual const char *getClobbers() const {
03992     return "";
03993   }
03994 };
03995 
03996 void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
03997                                      unsigned &NumNames) const {
03998   Names = NULL;
03999   NumNames = 0;
04000 }
04001 
04002 void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
04003                                        unsigned &NumAliases) const {
04004   Aliases = NULL;
04005   NumAliases = 0;
04006 }
04007 } // end anonymous namespace.
04008 
04009 
04010 //===----------------------------------------------------------------------===//
04011 // Driver code
04012 //===----------------------------------------------------------------------===//
04013 
04014 static TargetInfo *AllocateTarget(const std::string &T) {
04015   llvm::Triple Triple(T);
04016   llvm::Triple::OSType os = Triple.getOS();
04017 
04018   switch (Triple.getArch()) {
04019   default:
04020     return NULL;
04021 
04022   case llvm::Triple::hexagon:
04023     return new HexagonTargetInfo(T);
04024 
04025   case llvm::Triple::arm:
04026   case llvm::Triple::thumb:
04027     if (Triple.isOSDarwin())
04028       return new DarwinARMTargetInfo(T);
04029 
04030     switch (os) {
04031     case llvm::Triple::Linux:
04032       return new LinuxTargetInfo<ARMTargetInfo>(T);
04033     case llvm::Triple::FreeBSD:
04034       return new FreeBSDTargetInfo<ARMTargetInfo>(T);
04035     case llvm::Triple::NetBSD:
04036       return new NetBSDTargetInfo<ARMTargetInfo>(T);
04037     case llvm::Triple::RTEMS:
04038       return new RTEMSTargetInfo<ARMTargetInfo>(T);
04039     default:
04040       return new ARMTargetInfo(T);
04041     }
04042 
04043   case llvm::Triple::msp430:
04044     return new MSP430TargetInfo(T);
04045 
04046   case llvm::Triple::mips:
04047     switch (os) {
04048     case llvm::Triple::Linux:
04049       return new LinuxTargetInfo<Mips32EBTargetInfo>(T);
04050     case llvm::Triple::RTEMS:
04051       return new RTEMSTargetInfo<Mips32EBTargetInfo>(T);
04052     case llvm::Triple::FreeBSD:
04053       return new FreeBSDTargetInfo<Mips32EBTargetInfo>(T);
04054     case llvm::Triple::NetBSD:
04055       return new NetBSDTargetInfo<Mips32EBTargetInfo>(T);
04056     default:
04057       return new Mips32EBTargetInfo(T);
04058     }
04059 
04060   case llvm::Triple::mipsel:
04061     switch (os) {
04062     case llvm::Triple::Linux:
04063       return new LinuxTargetInfo<Mips32ELTargetInfo>(T);
04064     case llvm::Triple::RTEMS:
04065       return new RTEMSTargetInfo<Mips32ELTargetInfo>(T);
04066     case llvm::Triple::FreeBSD:
04067       return new FreeBSDTargetInfo<Mips32ELTargetInfo>(T);
04068     case llvm::Triple::NetBSD:
04069       return new NetBSDTargetInfo<Mips32ELTargetInfo>(T);
04070     default:
04071       return new Mips32ELTargetInfo(T);
04072     }
04073 
04074   case llvm::Triple::mips64:
04075     switch (os) {
04076     case llvm::Triple::Linux:
04077       return new LinuxTargetInfo<Mips64EBTargetInfo>(T);
04078     case llvm::Triple::RTEMS:
04079       return new RTEMSTargetInfo<Mips64EBTargetInfo>(T);
04080     case llvm::Triple::FreeBSD:
04081       return new FreeBSDTargetInfo<Mips64EBTargetInfo>(T);
04082     case llvm::Triple::NetBSD:
04083       return new NetBSDTargetInfo<Mips64EBTargetInfo>(T);
04084     default:
04085       return new Mips64EBTargetInfo(T);
04086     }
04087 
04088   case llvm::Triple::mips64el:
04089     switch (os) {
04090     case llvm::Triple::Linux:
04091       return new LinuxTargetInfo<Mips64ELTargetInfo>(T);
04092     case llvm::Triple::RTEMS:
04093       return new RTEMSTargetInfo<Mips64ELTargetInfo>(T);
04094     case llvm::Triple::FreeBSD:
04095       return new FreeBSDTargetInfo<Mips64ELTargetInfo>(T);
04096     case llvm::Triple::NetBSD:
04097       return new NetBSDTargetInfo<Mips64ELTargetInfo>(T);
04098     default:
04099       return new Mips64ELTargetInfo(T);
04100     }
04101 
04102   case llvm::Triple::le32:
04103     switch (os) {
04104       case llvm::Triple::NativeClient:
04105         return new PNaClTargetInfo(T);
04106       default:
04107         return NULL;
04108     }
04109 
04110   case llvm::Triple::ppc:
04111     if (Triple.isOSDarwin())
04112       return new DarwinPPC32TargetInfo(T);
04113     switch (os) {
04114     case llvm::Triple::Linux:
04115       return new LinuxTargetInfo<PPC32TargetInfo>(T);
04116     case llvm::Triple::FreeBSD:
04117       return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
04118     case llvm::Triple::NetBSD:
04119       return new NetBSDTargetInfo<PPC32TargetInfo>(T);
04120     case llvm::Triple::RTEMS:
04121       return new RTEMSTargetInfo<PPC32TargetInfo>(T);
04122     default:
04123       return new PPC32TargetInfo(T);
04124     }
04125 
04126   case llvm::Triple::ppc64:
04127     if (Triple.isOSDarwin())
04128       return new DarwinPPC64TargetInfo(T);
04129     switch (os) {
04130     case llvm::Triple::Linux:
04131       return new LinuxTargetInfo<PPC64TargetInfo>(T);
04132     case llvm::Triple::Lv2:
04133       return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
04134     case llvm::Triple::FreeBSD:
04135       return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
04136     case llvm::Triple::NetBSD:
04137       return new NetBSDTargetInfo<PPC64TargetInfo>(T);
04138     default:
04139       return new PPC64TargetInfo(T);
04140     }
04141 
04142   case llvm::Triple::ptx32:
04143     return new PTX32TargetInfo(T);
04144   case llvm::Triple::ptx64:
04145     return new PTX64TargetInfo(T);
04146 
04147   case llvm::Triple::nvptx:
04148     return new NVPTX32TargetInfo(T);
04149   case llvm::Triple::nvptx64:
04150     return new NVPTX64TargetInfo(T);
04151 
04152   case llvm::Triple::mblaze:
04153     return new MBlazeTargetInfo(T);
04154 
04155   case llvm::Triple::sparc:
04156     switch (os) {
04157     case llvm::Triple::Linux:
04158       return new LinuxTargetInfo<SparcV8TargetInfo>(T);
04159     case llvm::Triple::AuroraUX:
04160       return new AuroraUXSparcV8TargetInfo(T);
04161     case llvm::Triple::Solaris:
04162       return new SolarisSparcV8TargetInfo(T);
04163     case llvm::Triple::NetBSD:
04164       return new NetBSDTargetInfo<SparcV8TargetInfo>(T);
04165     case llvm::Triple::RTEMS:
04166       return new RTEMSTargetInfo<SparcV8TargetInfo>(T);
04167     default:
04168       return new SparcV8TargetInfo(T);
04169     }
04170 
04171   // FIXME: Need a real SPU target.
04172   case llvm::Triple::cellspu:
04173     return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
04174 
04175   case llvm::Triple::tce:
04176     return new TCETargetInfo(T);
04177 
04178   case llvm::Triple::x86:
04179     if (Triple.isOSDarwin())
04180       return new DarwinI386TargetInfo(T);
04181 
04182     switch (os) {
04183     case llvm::Triple::AuroraUX:
04184       return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
04185     case llvm::Triple::Linux:
04186       return new LinuxTargetInfo<X86_32TargetInfo>(T);
04187     case llvm::Triple::DragonFly:
04188       return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
04189     case llvm::Triple::NetBSD:
04190       return new NetBSDI386TargetInfo(T);
04191     case llvm::Triple::OpenBSD:
04192       return new OpenBSDI386TargetInfo(T);
04193     case llvm::Triple::FreeBSD:
04194       return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
04195     case llvm::Triple::Minix:
04196       return new MinixTargetInfo<X86_32TargetInfo>(T);
04197     case llvm::Triple::Solaris:
04198       return new SolarisTargetInfo<X86_32TargetInfo>(T);
04199     case llvm::Triple::Cygwin:
04200       return new CygwinX86_32TargetInfo(T);
04201     case llvm::Triple::MinGW32:
04202       return new MinGWX86_32TargetInfo(T);
04203     case llvm::Triple::Win32:
04204       return new VisualStudioWindowsX86_32TargetInfo(T);
04205     case llvm::Triple::Haiku:
04206       return new HaikuX86_32TargetInfo(T);
04207     case llvm::Triple::RTEMS:
04208       return new RTEMSX86_32TargetInfo(T);
04209     default:
04210       return new X86_32TargetInfo(T);
04211     }
04212 
04213   case llvm::Triple::x86_64:
04214     if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
04215       return new DarwinX86_64TargetInfo(T);
04216 
04217     switch (os) {
04218     case llvm::Triple::AuroraUX:
04219       return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
04220     case llvm::Triple::Linux:
04221       return new LinuxTargetInfo<X86_64TargetInfo>(T);
04222     case llvm::Triple::DragonFly:
04223       return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
04224     case llvm::Triple::NetBSD:
04225       return new NetBSDTargetInfo<X86_64TargetInfo>(T);
04226     case llvm::Triple::OpenBSD:
04227       return new OpenBSDX86_64TargetInfo(T);
04228     case llvm::Triple::FreeBSD:
04229       return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
04230     case llvm::Triple::Solaris:
04231       return new SolarisTargetInfo<X86_64TargetInfo>(T);
04232     case llvm::Triple::MinGW32:
04233       return new MinGWX86_64TargetInfo(T);
04234     case llvm::Triple::Win32:   // This is what Triple.h supports now.
04235       return new VisualStudioWindowsX86_64TargetInfo(T);
04236     default:
04237       return new X86_64TargetInfo(T);
04238     }
04239   }
04240 }
04241 
04242 /// CreateTargetInfo - Return the target info object for the specified target
04243 /// triple.
04244 TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
04245                                          TargetOptions &Opts) {
04246   llvm::Triple Triple(Opts.Triple);
04247 
04248   // Construct the target
04249   OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
04250   if (!Target) {
04251     Diags.Report(diag::err_target_unknown_triple) << Triple.str();
04252     return 0;
04253   }
04254 
04255   // Set the target CPU if specified.
04256   if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
04257     Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
04258     return 0;
04259   }
04260 
04261   // Set the target ABI if specified.
04262   if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
04263     Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
04264     return 0;
04265   }
04266 
04267   // Set the target C++ ABI.
04268   if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
04269     Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
04270     return 0;
04271   }
04272 
04273   // Compute the default target features, we need the target to handle this
04274   // because features may have dependencies on one another.
04275   llvm::StringMap<bool> Features;
04276   Target->getDefaultFeatures(Features);
04277 
04278   // Apply the user specified deltas.
04279   // First the enables.
04280   for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
04281          ie = Opts.Features.end(); it != ie; ++it) {
04282     const char *Name = it->c_str();
04283 
04284     if (Name[0] != '+')
04285       continue;
04286 
04287     // Apply the feature via the target.
04288     if (!Target->setFeatureEnabled(Features, Name + 1, true)) {
04289       Diags.Report(diag::err_target_invalid_feature) << Name;
04290       return 0;
04291     }
04292   }
04293 
04294   // Then the disables.
04295   for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
04296          ie = Opts.Features.end(); it != ie; ++it) {
04297     const char *Name = it->c_str();
04298 
04299     if (Name[0] == '+')
04300       continue;
04301 
04302     // Apply the feature via the target.
04303     if (Name[0] != '-' ||
04304         !Target->setFeatureEnabled(Features, Name + 1, false)) {
04305       Diags.Report(diag::err_target_invalid_feature) << Name;
04306       return 0;
04307     }
04308   }
04309 
04310   // Add the features to the compile options.
04311   //
04312   // FIXME: If we are completely confident that we have the right set, we only
04313   // need to pass the minuses.
04314   Opts.Features.clear();
04315   for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
04316          ie = Features.end(); it != ie; ++it)
04317     Opts.Features.push_back((it->second ? "+" : "-") + it->first().str());
04318   Target->HandleTargetFeatures(Opts.Features);
04319 
04320   return Target.take();
04321 }