clang API Documentation
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 }