Targets.cpp revision babaf31d401310464db93627ef6b195a7ffb1029
1//===--- Targets.cpp - Implement -arch option and targets -----------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file implements construction of a TargetInfo object from a 11// target triple. 12// 13//===----------------------------------------------------------------------===// 14 15#include "clang/Basic/TargetInfo.h" 16#include "clang/Basic/Builtins.h" 17#include "clang/Basic/Diagnostic.h" 18#include "clang/Basic/LangOptions.h" 19#include "clang/Basic/MacroBuilder.h" 20#include "clang/Basic/TargetBuiltins.h" 21#include "clang/Basic/TargetOptions.h" 22#include "llvm/ADT/APFloat.h" 23#include "llvm/ADT/OwningPtr.h" 24#include "llvm/ADT/STLExtras.h" 25#include "llvm/ADT/StringRef.h" 26#include "llvm/ADT/StringSwitch.h" 27#include "llvm/ADT/Triple.h" 28#include "llvm/MC/MCSectionMachO.h" 29#include "llvm/Support/ErrorHandling.h" 30#include "llvm/Type.h" 31#include <algorithm> 32using namespace clang; 33 34//===----------------------------------------------------------------------===// 35// Common code shared among targets. 36//===----------------------------------------------------------------------===// 37 38/// DefineStd - Define a macro name and standard variants. For example if 39/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix" 40/// when in GNU mode. 41static void DefineStd(MacroBuilder &Builder, StringRef MacroName, 42 const LangOptions &Opts) { 43 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace"); 44 45 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier 46 // in the user's namespace. 47 if (Opts.GNUMode) 48 Builder.defineMacro(MacroName); 49 50 // Define __unix. 51 Builder.defineMacro("__" + MacroName); 52 53 // Define __unix__. 54 Builder.defineMacro("__" + MacroName + "__"); 55} 56 57static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName, 58 bool Tuning = true) { 59 Builder.defineMacro("__" + CPUName); 60 Builder.defineMacro("__" + CPUName + "__"); 61 if (Tuning) 62 Builder.defineMacro("__tune_" + CPUName + "__"); 63} 64 65//===----------------------------------------------------------------------===// 66// Defines specific to certain operating systems. 67//===----------------------------------------------------------------------===// 68 69namespace { 70template<typename TgtInfo> 71class OSTargetInfo : public TgtInfo { 72protected: 73 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 74 MacroBuilder &Builder) const=0; 75public: 76 OSTargetInfo(const std::string& triple) : TgtInfo(triple) {} 77 virtual void getTargetDefines(const LangOptions &Opts, 78 MacroBuilder &Builder) const { 79 TgtInfo::getTargetDefines(Opts, Builder); 80 getOSDefines(Opts, TgtInfo::getTriple(), Builder); 81 } 82 83}; 84} // end anonymous namespace 85 86 87static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts, 88 const llvm::Triple &Triple, 89 StringRef &PlatformName, 90 VersionTuple &PlatformMinVersion) { 91 Builder.defineMacro("__APPLE_CC__", "5621"); 92 Builder.defineMacro("__APPLE__"); 93 Builder.defineMacro("__MACH__"); 94 Builder.defineMacro("OBJC_NEW_PROPERTIES"); 95 // AddressSanitizer doesn't play well with source fortification, which is on 96 // by default on Darwin. 97 if (Opts.AddressSanitizer) Builder.defineMacro("_FORTIFY_SOURCE", "0"); 98 99 if (!Opts.ObjCAutoRefCount) { 100 // __weak is always defined, for use in blocks and with objc pointers. 101 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))"); 102 103 // Darwin defines __strong even in C mode (just to nothing). 104 if (Opts.getGC() != LangOptions::NonGC) 105 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))"); 106 else 107 Builder.defineMacro("__strong", ""); 108 109 // __unsafe_unretained is defined to nothing in non-ARC mode. We even 110 // allow this in C, since one might have block pointers in structs that 111 // are used in pure C code and in Objective-C ARC. 112 Builder.defineMacro("__unsafe_unretained", ""); 113 } 114 115 if (Opts.Static) 116 Builder.defineMacro("__STATIC__"); 117 else 118 Builder.defineMacro("__DYNAMIC__"); 119 120 if (Opts.POSIXThreads) 121 Builder.defineMacro("_REENTRANT"); 122 123 // Get the platform type and version number from the triple. 124 unsigned Maj, Min, Rev; 125 if (Triple.isMacOSX()) { 126 Triple.getMacOSXVersion(Maj, Min, Rev); 127 PlatformName = "macosx"; 128 } else { 129 Triple.getOSVersion(Maj, Min, Rev); 130 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS()); 131 } 132 133 // If -target arch-pc-win32-macho option specified, we're 134 // generating code for Win32 ABI. No need to emit 135 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__. 136 if (PlatformName == "win32") { 137 PlatformMinVersion = VersionTuple(Maj, Min, Rev); 138 return; 139 } 140 141 // Set the appropriate OS version define. 142 if (Triple.getOS() == llvm::Triple::IOS) { 143 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!"); 144 char Str[6]; 145 Str[0] = '0' + Maj; 146 Str[1] = '0' + (Min / 10); 147 Str[2] = '0' + (Min % 10); 148 Str[3] = '0' + (Rev / 10); 149 Str[4] = '0' + (Rev % 10); 150 Str[5] = '\0'; 151 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str); 152 } else { 153 // Note that the Driver allows versions which aren't representable in the 154 // define (because we only get a single digit for the minor and micro 155 // revision numbers). So, we limit them to the maximum representable 156 // version. 157 assert(Triple.getEnvironmentName().empty() && "Invalid environment!"); 158 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!"); 159 char Str[5]; 160 Str[0] = '0' + (Maj / 10); 161 Str[1] = '0' + (Maj % 10); 162 Str[2] = '0' + std::min(Min, 9U); 163 Str[3] = '0' + std::min(Rev, 9U); 164 Str[4] = '\0'; 165 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str); 166 } 167 168 PlatformMinVersion = VersionTuple(Maj, Min, Rev); 169} 170 171namespace { 172template<typename Target> 173class DarwinTargetInfo : public OSTargetInfo<Target> { 174protected: 175 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 176 MacroBuilder &Builder) const { 177 getDarwinDefines(Builder, Opts, Triple, this->PlatformName, 178 this->PlatformMinVersion); 179 } 180 181public: 182 DarwinTargetInfo(const std::string& triple) : 183 OSTargetInfo<Target>(triple) { 184 llvm::Triple T = llvm::Triple(triple); 185 this->TLSSupported = T.isMacOSX() && !T.isMacOSXVersionLT(10,7); 186 this->MCountName = "\01mcount"; 187 } 188 189 virtual std::string isValidSectionSpecifier(StringRef SR) const { 190 // Let MCSectionMachO validate this. 191 StringRef Segment, Section; 192 unsigned TAA, StubSize; 193 bool HasTAA; 194 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section, 195 TAA, HasTAA, StubSize); 196 } 197 198 virtual const char *getStaticInitSectionSpecifier() const { 199 // FIXME: We should return 0 when building kexts. 200 return "__TEXT,__StaticInit,regular,pure_instructions"; 201 } 202 203 /// Darwin does not support protected visibility. Darwin's "default" 204 /// is very similar to ELF's "protected"; Darwin requires a "weak" 205 /// attribute on declarations that can be dynamically replaced. 206 virtual bool hasProtectedVisibility() const { 207 return false; 208 } 209}; 210 211 212// DragonFlyBSD Target 213template<typename Target> 214class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> { 215protected: 216 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 217 MacroBuilder &Builder) const { 218 // DragonFly defines; list based off of gcc output 219 Builder.defineMacro("__DragonFly__"); 220 Builder.defineMacro("__DragonFly_cc_version", "100001"); 221 Builder.defineMacro("__ELF__"); 222 Builder.defineMacro("__KPRINTF_ATTRIBUTE__"); 223 Builder.defineMacro("__tune_i386__"); 224 DefineStd(Builder, "unix", Opts); 225 } 226public: 227 DragonFlyBSDTargetInfo(const std::string &triple) 228 : OSTargetInfo<Target>(triple) { 229 this->UserLabelPrefix = ""; 230 231 llvm::Triple Triple(triple); 232 switch (Triple.getArch()) { 233 default: 234 case llvm::Triple::x86: 235 case llvm::Triple::x86_64: 236 this->MCountName = ".mcount"; 237 break; 238 } 239 } 240}; 241 242// FreeBSD Target 243template<typename Target> 244class FreeBSDTargetInfo : public OSTargetInfo<Target> { 245protected: 246 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 247 MacroBuilder &Builder) const { 248 // FreeBSD defines; list based off of gcc output 249 250 unsigned Release = Triple.getOSMajorVersion(); 251 if (Release == 0U) 252 Release = 8; 253 254 Builder.defineMacro("__FreeBSD__", Twine(Release)); 255 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U)); 256 Builder.defineMacro("__KPRINTF_ATTRIBUTE__"); 257 DefineStd(Builder, "unix", Opts); 258 Builder.defineMacro("__ELF__"); 259 } 260public: 261 FreeBSDTargetInfo(const std::string &triple) 262 : OSTargetInfo<Target>(triple) { 263 this->UserLabelPrefix = ""; 264 265 llvm::Triple Triple(triple); 266 switch (Triple.getArch()) { 267 default: 268 case llvm::Triple::x86: 269 case llvm::Triple::x86_64: 270 this->MCountName = ".mcount"; 271 break; 272 case llvm::Triple::mips: 273 case llvm::Triple::mipsel: 274 case llvm::Triple::ppc: 275 case llvm::Triple::ppc64: 276 this->MCountName = "_mcount"; 277 break; 278 case llvm::Triple::arm: 279 this->MCountName = "__mcount"; 280 break; 281 } 282 283 } 284}; 285 286// Minix Target 287template<typename Target> 288class MinixTargetInfo : public OSTargetInfo<Target> { 289protected: 290 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 291 MacroBuilder &Builder) const { 292 // Minix defines 293 294 Builder.defineMacro("__minix", "3"); 295 Builder.defineMacro("_EM_WSIZE", "4"); 296 Builder.defineMacro("_EM_PSIZE", "4"); 297 Builder.defineMacro("_EM_SSIZE", "2"); 298 Builder.defineMacro("_EM_LSIZE", "4"); 299 Builder.defineMacro("_EM_FSIZE", "4"); 300 Builder.defineMacro("_EM_DSIZE", "8"); 301 Builder.defineMacro("__ELF__"); 302 DefineStd(Builder, "unix", Opts); 303 } 304public: 305 MinixTargetInfo(const std::string &triple) 306 : OSTargetInfo<Target>(triple) { 307 this->UserLabelPrefix = ""; 308 } 309}; 310 311// Linux target 312template<typename Target> 313class LinuxTargetInfo : public OSTargetInfo<Target> { 314protected: 315 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 316 MacroBuilder &Builder) const { 317 // Linux defines; list based off of gcc output 318 DefineStd(Builder, "unix", Opts); 319 DefineStd(Builder, "linux", Opts); 320 Builder.defineMacro("__gnu_linux__"); 321 Builder.defineMacro("__ELF__"); 322 if (Triple.getEnvironment() == llvm::Triple::Android) 323 Builder.defineMacro("__ANDROID__", "1"); 324 if (Opts.POSIXThreads) 325 Builder.defineMacro("_REENTRANT"); 326 if (Opts.CPlusPlus) 327 Builder.defineMacro("_GNU_SOURCE"); 328 } 329public: 330 LinuxTargetInfo(const std::string& triple) 331 : OSTargetInfo<Target>(triple) { 332 this->UserLabelPrefix = ""; 333 this->WIntType = TargetInfo::UnsignedInt; 334 } 335 336 virtual const char *getStaticInitSectionSpecifier() const { 337 return ".text.startup"; 338 } 339}; 340 341// NetBSD Target 342template<typename Target> 343class NetBSDTargetInfo : public OSTargetInfo<Target> { 344protected: 345 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 346 MacroBuilder &Builder) const { 347 // NetBSD defines; list based off of gcc output 348 Builder.defineMacro("__NetBSD__"); 349 Builder.defineMacro("__unix__"); 350 Builder.defineMacro("__ELF__"); 351 if (Opts.POSIXThreads) 352 Builder.defineMacro("_POSIX_THREADS"); 353 } 354public: 355 NetBSDTargetInfo(const std::string &triple) 356 : OSTargetInfo<Target>(triple) { 357 this->UserLabelPrefix = ""; 358 } 359}; 360 361// OpenBSD Target 362template<typename Target> 363class OpenBSDTargetInfo : public OSTargetInfo<Target> { 364protected: 365 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 366 MacroBuilder &Builder) const { 367 // OpenBSD defines; list based off of gcc output 368 369 Builder.defineMacro("__OpenBSD__"); 370 DefineStd(Builder, "unix", Opts); 371 Builder.defineMacro("__ELF__"); 372 if (Opts.POSIXThreads) 373 Builder.defineMacro("_REENTRANT"); 374 } 375public: 376 OpenBSDTargetInfo(const std::string &triple) 377 : OSTargetInfo<Target>(triple) { 378 this->UserLabelPrefix = ""; 379 this->TLSSupported = false; 380 381 llvm::Triple Triple(triple); 382 switch (Triple.getArch()) { 383 default: 384 case llvm::Triple::x86: 385 case llvm::Triple::x86_64: 386 case llvm::Triple::arm: 387 case llvm::Triple::sparc: 388 this->MCountName = "__mcount"; 389 break; 390 case llvm::Triple::mips64: 391 case llvm::Triple::mips64el: 392 case llvm::Triple::ppc: 393 case llvm::Triple::sparcv9: 394 this->MCountName = "_mcount"; 395 break; 396 } 397 } 398}; 399 400// Bitrig Target 401template<typename Target> 402class BitrigTargetInfo : public OSTargetInfo<Target> { 403protected: 404 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 405 MacroBuilder &Builder) const { 406 // Bitrig defines; list based off of gcc output 407 408 Builder.defineMacro("__Bitrig__"); 409 DefineStd(Builder, "unix", Opts); 410 Builder.defineMacro("__ELF__"); 411 if (Opts.POSIXThreads) 412 Builder.defineMacro("_REENTRANT"); 413 } 414public: 415 BitrigTargetInfo(const std::string &triple) 416 : OSTargetInfo<Target>(triple) { 417 this->UserLabelPrefix = ""; 418 this->TLSSupported = false; 419 this->MCountName = "__mcount"; 420 } 421}; 422 423// PSP Target 424template<typename Target> 425class PSPTargetInfo : public OSTargetInfo<Target> { 426protected: 427 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 428 MacroBuilder &Builder) const { 429 // PSP defines; list based on the output of the pspdev gcc toolchain. 430 Builder.defineMacro("PSP"); 431 Builder.defineMacro("_PSP"); 432 Builder.defineMacro("__psp__"); 433 Builder.defineMacro("__ELF__"); 434 } 435public: 436 PSPTargetInfo(const std::string& triple) 437 : OSTargetInfo<Target>(triple) { 438 this->UserLabelPrefix = ""; 439 } 440}; 441 442// PS3 PPU Target 443template<typename Target> 444class PS3PPUTargetInfo : public OSTargetInfo<Target> { 445protected: 446 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 447 MacroBuilder &Builder) const { 448 // PS3 PPU defines. 449 Builder.defineMacro("__PPC__"); 450 Builder.defineMacro("__PPU__"); 451 Builder.defineMacro("__CELLOS_LV2__"); 452 Builder.defineMacro("__ELF__"); 453 Builder.defineMacro("__LP32__"); 454 Builder.defineMacro("_ARCH_PPC64"); 455 Builder.defineMacro("__powerpc64__"); 456 } 457public: 458 PS3PPUTargetInfo(const std::string& triple) 459 : OSTargetInfo<Target>(triple) { 460 this->UserLabelPrefix = ""; 461 this->LongWidth = this->LongAlign = 32; 462 this->PointerWidth = this->PointerAlign = 32; 463 this->IntMaxType = TargetInfo::SignedLongLong; 464 this->UIntMaxType = TargetInfo::UnsignedLongLong; 465 this->Int64Type = TargetInfo::SignedLongLong; 466 this->SizeType = TargetInfo::UnsignedInt; 467 this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 468 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32"; 469 } 470}; 471 472// FIXME: Need a real SPU target. 473// PS3 SPU Target 474template<typename Target> 475class PS3SPUTargetInfo : public OSTargetInfo<Target> { 476protected: 477 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 478 MacroBuilder &Builder) const { 479 // PS3 PPU defines. 480 Builder.defineMacro("__SPU__"); 481 Builder.defineMacro("__ELF__"); 482 } 483public: 484 PS3SPUTargetInfo(const std::string& triple) 485 : OSTargetInfo<Target>(triple) { 486 this->UserLabelPrefix = ""; 487 } 488}; 489 490// AuroraUX target 491template<typename Target> 492class AuroraUXTargetInfo : public OSTargetInfo<Target> { 493protected: 494 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 495 MacroBuilder &Builder) const { 496 DefineStd(Builder, "sun", Opts); 497 DefineStd(Builder, "unix", Opts); 498 Builder.defineMacro("__ELF__"); 499 Builder.defineMacro("__svr4__"); 500 Builder.defineMacro("__SVR4"); 501 } 502public: 503 AuroraUXTargetInfo(const std::string& triple) 504 : OSTargetInfo<Target>(triple) { 505 this->UserLabelPrefix = ""; 506 this->WCharType = this->SignedLong; 507 // FIXME: WIntType should be SignedLong 508 } 509}; 510 511// Solaris target 512template<typename Target> 513class SolarisTargetInfo : public OSTargetInfo<Target> { 514protected: 515 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 516 MacroBuilder &Builder) const { 517 DefineStd(Builder, "sun", Opts); 518 DefineStd(Builder, "unix", Opts); 519 Builder.defineMacro("__ELF__"); 520 Builder.defineMacro("__svr4__"); 521 Builder.defineMacro("__SVR4"); 522 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and 523 // newer, but to 500 for everything else. feature_test.h has a check to 524 // ensure that you are not using C99 with an old version of X/Open or C89 525 // with a new version. 526 if (Opts.C99 || Opts.C11) 527 Builder.defineMacro("_XOPEN_SOURCE", "600"); 528 else 529 Builder.defineMacro("_XOPEN_SOURCE", "500"); 530 if (Opts.CPlusPlus) 531 Builder.defineMacro("__C99FEATURES__"); 532 Builder.defineMacro("_LARGEFILE_SOURCE"); 533 Builder.defineMacro("_LARGEFILE64_SOURCE"); 534 Builder.defineMacro("__EXTENSIONS__"); 535 Builder.defineMacro("_REENTRANT"); 536 } 537public: 538 SolarisTargetInfo(const std::string& triple) 539 : OSTargetInfo<Target>(triple) { 540 this->UserLabelPrefix = ""; 541 this->WCharType = this->SignedInt; 542 // FIXME: WIntType should be SignedLong 543 } 544}; 545 546// Windows target 547template<typename Target> 548class WindowsTargetInfo : public OSTargetInfo<Target> { 549protected: 550 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 551 MacroBuilder &Builder) const { 552 Builder.defineMacro("_WIN32"); 553 } 554 void getVisualStudioDefines(const LangOptions &Opts, 555 MacroBuilder &Builder) const { 556 if (Opts.CPlusPlus) { 557 if (Opts.RTTI) 558 Builder.defineMacro("_CPPRTTI"); 559 560 if (Opts.Exceptions) 561 Builder.defineMacro("_CPPUNWIND"); 562 } 563 564 if (!Opts.CharIsSigned) 565 Builder.defineMacro("_CHAR_UNSIGNED"); 566 567 // FIXME: POSIXThreads isn't exactly the option this should be defined for, 568 // but it works for now. 569 if (Opts.POSIXThreads) 570 Builder.defineMacro("_MT"); 571 572 if (Opts.MSCVersion != 0) 573 Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion)); 574 575 if (Opts.MicrosoftExt) { 576 Builder.defineMacro("_MSC_EXTENSIONS"); 577 578 if (Opts.CPlusPlus0x) { 579 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED"); 580 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED"); 581 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED"); 582 } 583 } 584 585 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64"); 586 } 587 588public: 589 WindowsTargetInfo(const std::string &triple) 590 : OSTargetInfo<Target>(triple) {} 591}; 592 593} // end anonymous namespace. 594 595//===----------------------------------------------------------------------===// 596// Specific target implementations. 597//===----------------------------------------------------------------------===// 598 599namespace { 600// PPC abstract base class 601class PPCTargetInfo : public TargetInfo { 602 static const Builtin::Info BuiltinInfo[]; 603 static const char * const GCCRegNames[]; 604 static const TargetInfo::GCCRegAlias GCCRegAliases[]; 605 std::string CPU; 606public: 607 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) { 608 LongDoubleWidth = LongDoubleAlign = 128; 609 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble; 610 } 611 612 /// \brief Flags for architecture specific defines. 613 typedef enum { 614 ArchDefineNone = 0, 615 ArchDefineName = 1 << 0, // <name> is substituted for arch name. 616 ArchDefinePpcgr = 1 << 1, 617 ArchDefinePpcsq = 1 << 2, 618 ArchDefine440 = 1 << 3, 619 ArchDefine603 = 1 << 4, 620 ArchDefine604 = 1 << 5, 621 ArchDefinePwr4 = 1 << 6, 622 ArchDefinePwr6 = 1 << 7 623 } ArchDefineTypes; 624 625 virtual bool setCPU(const std::string &Name) { 626 bool CPUKnown = llvm::StringSwitch<bool>(Name) 627 .Case("generic", true) 628 .Case("440", true) 629 .Case("450", true) 630 .Case("601", true) 631 .Case("602", true) 632 .Case("603", true) 633 .Case("603e", true) 634 .Case("603ev", true) 635 .Case("604", true) 636 .Case("604e", true) 637 .Case("620", true) 638 .Case("g3", true) 639 .Case("7400", true) 640 .Case("g4", true) 641 .Case("7450", true) 642 .Case("g4+", true) 643 .Case("750", true) 644 .Case("970", true) 645 .Case("g5", true) 646 .Case("a2", true) 647 .Case("e500mc", true) 648 .Case("e5500", true) 649 .Case("pwr6", true) 650 .Case("pwr7", true) 651 .Case("ppc", true) 652 .Case("ppc64", true) 653 .Default(false); 654 655 if (CPUKnown) 656 CPU = Name; 657 658 return CPUKnown; 659 } 660 661 virtual void getTargetBuiltins(const Builtin::Info *&Records, 662 unsigned &NumRecords) const { 663 Records = BuiltinInfo; 664 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin; 665 } 666 667 virtual bool isCLZForZeroUndef() const { return false; } 668 669 virtual void getTargetDefines(const LangOptions &Opts, 670 MacroBuilder &Builder) const; 671 672 virtual bool hasFeature(StringRef Feature) const; 673 674 virtual void getGCCRegNames(const char * const *&Names, 675 unsigned &NumNames) const; 676 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 677 unsigned &NumAliases) const; 678 virtual bool validateAsmConstraint(const char *&Name, 679 TargetInfo::ConstraintInfo &Info) const { 680 switch (*Name) { 681 default: return false; 682 case 'O': // Zero 683 break; 684 case 'b': // Base register 685 case 'f': // Floating point register 686 Info.setAllowsRegister(); 687 break; 688 // FIXME: The following are added to allow parsing. 689 // I just took a guess at what the actions should be. 690 // Also, is more specific checking needed? I.e. specific registers? 691 case 'd': // Floating point register (containing 64-bit value) 692 case 'v': // Altivec vector register 693 Info.setAllowsRegister(); 694 break; 695 case 'w': 696 switch (Name[1]) { 697 case 'd':// VSX vector register to hold vector double data 698 case 'f':// VSX vector register to hold vector float data 699 case 's':// VSX vector register to hold scalar float data 700 case 'a':// Any VSX register 701 break; 702 default: 703 return false; 704 } 705 Info.setAllowsRegister(); 706 Name++; // Skip over 'w'. 707 break; 708 case 'h': // `MQ', `CTR', or `LINK' register 709 case 'q': // `MQ' register 710 case 'c': // `CTR' register 711 case 'l': // `LINK' register 712 case 'x': // `CR' register (condition register) number 0 713 case 'y': // `CR' register (condition register) 714 case 'z': // `XER[CA]' carry bit (part of the XER register) 715 Info.setAllowsRegister(); 716 break; 717 case 'I': // Signed 16-bit constant 718 case 'J': // Unsigned 16-bit constant shifted left 16 bits 719 // (use `L' instead for SImode constants) 720 case 'K': // Unsigned 16-bit constant 721 case 'L': // Signed 16-bit constant shifted left 16 bits 722 case 'M': // Constant larger than 31 723 case 'N': // Exact power of 2 724 case 'P': // Constant whose negation is a signed 16-bit constant 725 case 'G': // Floating point constant that can be loaded into a 726 // register with one instruction per word 727 case 'H': // Integer/Floating point constant that can be loaded 728 // into a register using three instructions 729 break; 730 case 'm': // Memory operand. Note that on PowerPC targets, m can 731 // include addresses that update the base register. It 732 // is therefore only safe to use `m' in an asm statement 733 // if that asm statement accesses the operand exactly once. 734 // The asm statement must also use `%U<opno>' as a 735 // placeholder for the "update" flag in the corresponding 736 // load or store instruction. For example: 737 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val)); 738 // is correct but: 739 // asm ("st %1,%0" : "=m" (mem) : "r" (val)); 740 // is not. Use es rather than m if you don't want the base 741 // register to be updated. 742 case 'e': 743 if (Name[1] != 's') 744 return false; 745 // es: A "stable" memory operand; that is, one which does not 746 // include any automodification of the base register. Unlike 747 // `m', this constraint can be used in asm statements that 748 // might access the operand several times, or that might not 749 // access it at all. 750 Info.setAllowsMemory(); 751 Name++; // Skip over 'e'. 752 break; 753 case 'Q': // Memory operand that is an offset from a register (it is 754 // usually better to use `m' or `es' in asm statements) 755 case 'Z': // Memory operand that is an indexed or indirect from a 756 // register (it is usually better to use `m' or `es' in 757 // asm statements) 758 Info.setAllowsMemory(); 759 Info.setAllowsRegister(); 760 break; 761 case 'R': // AIX TOC entry 762 case 'a': // Address operand that is an indexed or indirect from a 763 // register (`p' is preferable for asm statements) 764 case 'S': // Constant suitable as a 64-bit mask operand 765 case 'T': // Constant suitable as a 32-bit mask operand 766 case 'U': // System V Release 4 small data area reference 767 case 't': // AND masks that can be performed by two rldic{l, r} 768 // instructions 769 case 'W': // Vector constant that does not require memory 770 case 'j': // Vector constant that is all zeros. 771 break; 772 // End FIXME. 773 } 774 return true; 775 } 776 virtual const char *getClobbers() const { 777 return ""; 778 } 779}; 780 781const Builtin::Info PPCTargetInfo::BuiltinInfo[] = { 782#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES }, 783#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\ 784 ALL_LANGUAGES }, 785#include "clang/Basic/BuiltinsPPC.def" 786}; 787 788 789/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific 790/// #defines that are not tied to a specific subtarget. 791void PPCTargetInfo::getTargetDefines(const LangOptions &Opts, 792 MacroBuilder &Builder) const { 793 // Target identification. 794 Builder.defineMacro("__ppc__"); 795 Builder.defineMacro("_ARCH_PPC"); 796 Builder.defineMacro("__powerpc__"); 797 Builder.defineMacro("__POWERPC__"); 798 if (PointerWidth == 64) { 799 Builder.defineMacro("_ARCH_PPC64"); 800 Builder.defineMacro("__powerpc64__"); 801 Builder.defineMacro("__ppc64__"); 802 } else { 803 Builder.defineMacro("__ppc__"); 804 } 805 806 // Target properties. 807 if (getTriple().getOS() != llvm::Triple::NetBSD && 808 getTriple().getOS() != llvm::Triple::OpenBSD) 809 Builder.defineMacro("_BIG_ENDIAN"); 810 Builder.defineMacro("__BIG_ENDIAN__"); 811 812 // Subtarget options. 813 Builder.defineMacro("__NATURAL_ALIGNMENT__"); 814 Builder.defineMacro("__REGISTER_PREFIX__", ""); 815 816 // FIXME: Should be controlled by command line option. 817 Builder.defineMacro("__LONG_DOUBLE_128__"); 818 819 if (Opts.AltiVec) { 820 Builder.defineMacro("__VEC__", "10206"); 821 Builder.defineMacro("__ALTIVEC__"); 822 } 823 824 // CPU identification. 825 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU) 826 .Case("440", ArchDefineName) 827 .Case("450", ArchDefineName | ArchDefine440) 828 .Case("601", ArchDefineName) 829 .Case("602", ArchDefineName | ArchDefinePpcgr) 830 .Case("603", ArchDefineName | ArchDefinePpcgr) 831 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr) 832 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr) 833 .Case("604", ArchDefineName | ArchDefinePpcgr) 834 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr) 835 .Case("620", ArchDefineName | ArchDefinePpcgr) 836 .Case("7400", ArchDefineName | ArchDefinePpcgr) 837 .Case("7450", ArchDefineName | ArchDefinePpcgr) 838 .Case("750", ArchDefineName | ArchDefinePpcgr) 839 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr 840 | ArchDefinePpcsq) 841 .Case("pwr6", ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq) 842 .Case("pwr7", ArchDefineName | ArchDefinePwr6 | ArchDefinePpcgr 843 | ArchDefinePpcsq) 844 .Default(ArchDefineNone); 845 846 if (defs & ArchDefineName) 847 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper())); 848 if (defs & ArchDefinePpcgr) 849 Builder.defineMacro("_ARCH_PPCGR"); 850 if (defs & ArchDefinePpcsq) 851 Builder.defineMacro("_ARCH_PPCSQ"); 852 if (defs & ArchDefine440) 853 Builder.defineMacro("_ARCH_440"); 854 if (defs & ArchDefine603) 855 Builder.defineMacro("_ARCH_603"); 856 if (defs & ArchDefine604) 857 Builder.defineMacro("_ARCH_604"); 858 if (defs & (ArchDefinePwr4 | ArchDefinePwr6)) 859 Builder.defineMacro("_ARCH_PWR4"); 860 if (defs & ArchDefinePwr6) { 861 Builder.defineMacro("_ARCH_PWR5"); 862 Builder.defineMacro("_ARCH_PWR6"); 863 } 864} 865 866bool PPCTargetInfo::hasFeature(StringRef Feature) const { 867 return Feature == "powerpc"; 868} 869 870 871const char * const PPCTargetInfo::GCCRegNames[] = { 872 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", 873 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", 874 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", 875 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31", 876 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", 877 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", 878 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", 879 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", 880 "mq", "lr", "ctr", "ap", 881 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", 882 "xer", 883 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", 884 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", 885 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", 886 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31", 887 "vrsave", "vscr", 888 "spe_acc", "spefscr", 889 "sfp" 890}; 891 892void PPCTargetInfo::getGCCRegNames(const char * const *&Names, 893 unsigned &NumNames) const { 894 Names = GCCRegNames; 895 NumNames = llvm::array_lengthof(GCCRegNames); 896} 897 898const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = { 899 // While some of these aliases do map to different registers 900 // they still share the same register name. 901 { { "0" }, "r0" }, 902 { { "1"}, "r1" }, 903 { { "2" }, "r2" }, 904 { { "3" }, "r3" }, 905 { { "4" }, "r4" }, 906 { { "5" }, "r5" }, 907 { { "6" }, "r6" }, 908 { { "7" }, "r7" }, 909 { { "8" }, "r8" }, 910 { { "9" }, "r9" }, 911 { { "10" }, "r10" }, 912 { { "11" }, "r11" }, 913 { { "12" }, "r12" }, 914 { { "13" }, "r13" }, 915 { { "14" }, "r14" }, 916 { { "15" }, "r15" }, 917 { { "16" }, "r16" }, 918 { { "17" }, "r17" }, 919 { { "18" }, "r18" }, 920 { { "19" }, "r19" }, 921 { { "20" }, "r20" }, 922 { { "21" }, "r21" }, 923 { { "22" }, "r22" }, 924 { { "23" }, "r23" }, 925 { { "24" }, "r24" }, 926 { { "25" }, "r25" }, 927 { { "26" }, "r26" }, 928 { { "27" }, "r27" }, 929 { { "28" }, "r28" }, 930 { { "29" }, "r29" }, 931 { { "30" }, "r30" }, 932 { { "31" }, "r31" }, 933 { { "fr0" }, "f0" }, 934 { { "fr1" }, "f1" }, 935 { { "fr2" }, "f2" }, 936 { { "fr3" }, "f3" }, 937 { { "fr4" }, "f4" }, 938 { { "fr5" }, "f5" }, 939 { { "fr6" }, "f6" }, 940 { { "fr7" }, "f7" }, 941 { { "fr8" }, "f8" }, 942 { { "fr9" }, "f9" }, 943 { { "fr10" }, "f10" }, 944 { { "fr11" }, "f11" }, 945 { { "fr12" }, "f12" }, 946 { { "fr13" }, "f13" }, 947 { { "fr14" }, "f14" }, 948 { { "fr15" }, "f15" }, 949 { { "fr16" }, "f16" }, 950 { { "fr17" }, "f17" }, 951 { { "fr18" }, "f18" }, 952 { { "fr19" }, "f19" }, 953 { { "fr20" }, "f20" }, 954 { { "fr21" }, "f21" }, 955 { { "fr22" }, "f22" }, 956 { { "fr23" }, "f23" }, 957 { { "fr24" }, "f24" }, 958 { { "fr25" }, "f25" }, 959 { { "fr26" }, "f26" }, 960 { { "fr27" }, "f27" }, 961 { { "fr28" }, "f28" }, 962 { { "fr29" }, "f29" }, 963 { { "fr30" }, "f30" }, 964 { { "fr31" }, "f31" }, 965 { { "cc" }, "cr0" }, 966}; 967 968void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases, 969 unsigned &NumAliases) const { 970 Aliases = GCCRegAliases; 971 NumAliases = llvm::array_lengthof(GCCRegAliases); 972} 973} // end anonymous namespace. 974 975namespace { 976class PPC32TargetInfo : public PPCTargetInfo { 977public: 978 PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) { 979 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 980 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32"; 981 982 switch (getTriple().getOS()) { 983 case llvm::Triple::Linux: 984 case llvm::Triple::FreeBSD: 985 case llvm::Triple::NetBSD: 986 SizeType = UnsignedInt; 987 PtrDiffType = SignedInt; 988 IntPtrType = SignedInt; 989 break; 990 default: 991 break; 992 } 993 994 if (getTriple().getOS() == llvm::Triple::FreeBSD) { 995 LongDoubleWidth = LongDoubleAlign = 64; 996 LongDoubleFormat = &llvm::APFloat::IEEEdouble; 997 } 998 } 999 1000 virtual BuiltinVaListKind getBuiltinVaListKind() const { 1001 // This is the ELF definition, and is overridden by the Darwin sub-target 1002 return TargetInfo::PowerABIBuiltinVaList; 1003 } 1004}; 1005} // end anonymous namespace. 1006 1007namespace { 1008class PPC64TargetInfo : public PPCTargetInfo { 1009public: 1010 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) { 1011 LongWidth = LongAlign = PointerWidth = PointerAlign = 64; 1012 IntMaxType = SignedLong; 1013 UIntMaxType = UnsignedLong; 1014 Int64Type = SignedLong; 1015 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 1016 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64"; 1017 1018 if (getTriple().getOS() == llvm::Triple::FreeBSD) { 1019 LongDoubleWidth = LongDoubleAlign = 64; 1020 LongDoubleFormat = &llvm::APFloat::IEEEdouble; 1021 } 1022 } 1023 virtual BuiltinVaListKind getBuiltinVaListKind() const { 1024 return TargetInfo::CharPtrBuiltinVaList; 1025 } 1026}; 1027} // end anonymous namespace. 1028 1029 1030namespace { 1031class DarwinPPC32TargetInfo : 1032 public DarwinTargetInfo<PPC32TargetInfo> { 1033public: 1034 DarwinPPC32TargetInfo(const std::string& triple) 1035 : DarwinTargetInfo<PPC32TargetInfo>(triple) { 1036 HasAlignMac68kSupport = true; 1037 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool? 1038 LongLongAlign = 32; 1039 SuitableAlign = 128; 1040 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 1041 "i64:32:64-f32:32:32-f64:64:64-v128:128:128-n32"; 1042 } 1043 virtual BuiltinVaListKind getBuiltinVaListKind() const { 1044 return TargetInfo::CharPtrBuiltinVaList; 1045 } 1046}; 1047 1048class DarwinPPC64TargetInfo : 1049 public DarwinTargetInfo<PPC64TargetInfo> { 1050public: 1051 DarwinPPC64TargetInfo(const std::string& triple) 1052 : DarwinTargetInfo<PPC64TargetInfo>(triple) { 1053 HasAlignMac68kSupport = true; 1054 SuitableAlign = 128; 1055 } 1056}; 1057} // end anonymous namespace. 1058 1059namespace { 1060 static const unsigned NVPTXAddrSpaceMap[] = { 1061 1, // opencl_global 1062 3, // opencl_local 1063 4, // opencl_constant 1064 1, // cuda_device 1065 4, // cuda_constant 1066 3, // cuda_shared 1067 }; 1068 class NVPTXTargetInfo : public TargetInfo { 1069 static const char * const GCCRegNames[]; 1070 static const Builtin::Info BuiltinInfo[]; 1071 std::vector<llvm::StringRef> AvailableFeatures; 1072 public: 1073 NVPTXTargetInfo(const std::string& triple) : TargetInfo(triple) { 1074 BigEndian = false; 1075 TLSSupported = false; 1076 LongWidth = LongAlign = 64; 1077 AddrSpaceMap = &NVPTXAddrSpaceMap; 1078 // Define available target features 1079 // These must be defined in sorted order! 1080 NoAsmVariants = true; 1081 } 1082 virtual void getTargetDefines(const LangOptions &Opts, 1083 MacroBuilder &Builder) const { 1084 Builder.defineMacro("__PTX__"); 1085 Builder.defineMacro("__NVPTX__"); 1086 } 1087 virtual void getTargetBuiltins(const Builtin::Info *&Records, 1088 unsigned &NumRecords) const { 1089 Records = BuiltinInfo; 1090 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin; 1091 } 1092 virtual bool hasFeature(StringRef Feature) const { 1093 return Feature == "ptx" || Feature == "nvptx"; 1094 } 1095 1096 virtual void getGCCRegNames(const char * const *&Names, 1097 unsigned &NumNames) const; 1098 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 1099 unsigned &NumAliases) const { 1100 // No aliases. 1101 Aliases = 0; 1102 NumAliases = 0; 1103 } 1104 virtual bool validateAsmConstraint(const char *&Name, 1105 TargetInfo::ConstraintInfo &info) const { 1106 // FIXME: implement 1107 return true; 1108 } 1109 virtual const char *getClobbers() const { 1110 // FIXME: Is this really right? 1111 return ""; 1112 } 1113 virtual BuiltinVaListKind getBuiltinVaListKind() const { 1114 // FIXME: implement 1115 return TargetInfo::CharPtrBuiltinVaList; 1116 } 1117 virtual bool setCPU(const std::string &Name) { 1118 return Name == "sm_10" || Name == "sm_13" || Name == "sm_20"; 1119 } 1120 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features, 1121 StringRef Name, 1122 bool Enabled) const; 1123 }; 1124 1125 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = { 1126#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES }, 1127#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\ 1128 ALL_LANGUAGES }, 1129#include "clang/Basic/BuiltinsNVPTX.def" 1130 }; 1131 1132 const char * const NVPTXTargetInfo::GCCRegNames[] = { 1133 "r0" 1134 }; 1135 1136 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names, 1137 unsigned &NumNames) const { 1138 Names = GCCRegNames; 1139 NumNames = llvm::array_lengthof(GCCRegNames); 1140 } 1141 1142 bool NVPTXTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features, 1143 StringRef Name, 1144 bool Enabled) const { 1145 if(std::binary_search(AvailableFeatures.begin(), AvailableFeatures.end(), 1146 Name)) { 1147 Features[Name] = Enabled; 1148 return true; 1149 } else { 1150 return false; 1151 } 1152 } 1153 1154 class NVPTX32TargetInfo : public NVPTXTargetInfo { 1155 public: 1156 NVPTX32TargetInfo(const std::string& triple) : NVPTXTargetInfo(triple) { 1157 PointerWidth = PointerAlign = 32; 1158 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt; 1159 DescriptionString 1160 = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-" 1161 "f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-" 1162 "n16:32:64"; 1163 } 1164 }; 1165 1166 class NVPTX64TargetInfo : public NVPTXTargetInfo { 1167 public: 1168 NVPTX64TargetInfo(const std::string& triple) : NVPTXTargetInfo(triple) { 1169 PointerWidth = PointerAlign = 64; 1170 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong; 1171 DescriptionString 1172 = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-" 1173 "f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-" 1174 "n16:32:64"; 1175 } 1176 }; 1177} 1178 1179namespace { 1180// MBlaze abstract base class 1181class MBlazeTargetInfo : public TargetInfo { 1182 static const char * const GCCRegNames[]; 1183 static const TargetInfo::GCCRegAlias GCCRegAliases[]; 1184 1185public: 1186 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) { 1187 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16"; 1188 } 1189 1190 virtual void getTargetBuiltins(const Builtin::Info *&Records, 1191 unsigned &NumRecords) const { 1192 // FIXME: Implement. 1193 Records = 0; 1194 NumRecords = 0; 1195 } 1196 1197 virtual void getTargetDefines(const LangOptions &Opts, 1198 MacroBuilder &Builder) const; 1199 1200 virtual bool hasFeature(StringRef Feature) const { 1201 return Feature == "mblaze"; 1202 } 1203 1204 virtual BuiltinVaListKind getBuiltinVaListKind() const { 1205 return TargetInfo::CharPtrBuiltinVaList; 1206 } 1207 virtual const char *getTargetPrefix() const { 1208 return "mblaze"; 1209 } 1210 virtual void getGCCRegNames(const char * const *&Names, 1211 unsigned &NumNames) const; 1212 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 1213 unsigned &NumAliases) const; 1214 virtual bool validateAsmConstraint(const char *&Name, 1215 TargetInfo::ConstraintInfo &Info) const { 1216 switch (*Name) { 1217 default: return false; 1218 case 'O': // Zero 1219 return true; 1220 case 'b': // Base register 1221 case 'f': // Floating point register 1222 Info.setAllowsRegister(); 1223 return true; 1224 } 1225 } 1226 virtual const char *getClobbers() const { 1227 return ""; 1228 } 1229}; 1230 1231/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific 1232/// #defines that are not tied to a specific subtarget. 1233void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts, 1234 MacroBuilder &Builder) const { 1235 // Target identification. 1236 Builder.defineMacro("__microblaze__"); 1237 Builder.defineMacro("_ARCH_MICROBLAZE"); 1238 Builder.defineMacro("__MICROBLAZE__"); 1239 1240 // Target properties. 1241 Builder.defineMacro("_BIG_ENDIAN"); 1242 Builder.defineMacro("__BIG_ENDIAN__"); 1243 1244 // Subtarget options. 1245 Builder.defineMacro("__REGISTER_PREFIX__", ""); 1246} 1247 1248 1249const char * const MBlazeTargetInfo::GCCRegNames[] = { 1250 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", 1251 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", 1252 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", 1253 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31", 1254 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7", 1255 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15", 1256 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23", 1257 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31", 1258 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4", 1259 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp" 1260}; 1261 1262void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names, 1263 unsigned &NumNames) const { 1264 Names = GCCRegNames; 1265 NumNames = llvm::array_lengthof(GCCRegNames); 1266} 1267 1268const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = { 1269 { {"f0"}, "r0" }, 1270 { {"f1"}, "r1" }, 1271 { {"f2"}, "r2" }, 1272 { {"f3"}, "r3" }, 1273 { {"f4"}, "r4" }, 1274 { {"f5"}, "r5" }, 1275 { {"f6"}, "r6" }, 1276 { {"f7"}, "r7" }, 1277 { {"f8"}, "r8" }, 1278 { {"f9"}, "r9" }, 1279 { {"f10"}, "r10" }, 1280 { {"f11"}, "r11" }, 1281 { {"f12"}, "r12" }, 1282 { {"f13"}, "r13" }, 1283 { {"f14"}, "r14" }, 1284 { {"f15"}, "r15" }, 1285 { {"f16"}, "r16" }, 1286 { {"f17"}, "r17" }, 1287 { {"f18"}, "r18" }, 1288 { {"f19"}, "r19" }, 1289 { {"f20"}, "r20" }, 1290 { {"f21"}, "r21" }, 1291 { {"f22"}, "r22" }, 1292 { {"f23"}, "r23" }, 1293 { {"f24"}, "r24" }, 1294 { {"f25"}, "r25" }, 1295 { {"f26"}, "r26" }, 1296 { {"f27"}, "r27" }, 1297 { {"f28"}, "r28" }, 1298 { {"f29"}, "r29" }, 1299 { {"f30"}, "r30" }, 1300 { {"f31"}, "r31" }, 1301}; 1302 1303void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases, 1304 unsigned &NumAliases) const { 1305 Aliases = GCCRegAliases; 1306 NumAliases = llvm::array_lengthof(GCCRegAliases); 1307} 1308} // end anonymous namespace. 1309 1310namespace { 1311// Namespace for x86 abstract base class 1312const Builtin::Info BuiltinInfo[] = { 1313#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES }, 1314#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\ 1315 ALL_LANGUAGES }, 1316#include "clang/Basic/BuiltinsX86.def" 1317}; 1318 1319static const char* const GCCRegNames[] = { 1320 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp", 1321 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)", 1322 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame", 1323 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7", 1324 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7", 1325 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", 1326 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15", 1327 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7", 1328 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15", 1329}; 1330 1331const TargetInfo::AddlRegName AddlRegNames[] = { 1332 { { "al", "ah", "eax", "rax" }, 0 }, 1333 { { "bl", "bh", "ebx", "rbx" }, 3 }, 1334 { { "cl", "ch", "ecx", "rcx" }, 2 }, 1335 { { "dl", "dh", "edx", "rdx" }, 1 }, 1336 { { "esi", "rsi" }, 4 }, 1337 { { "edi", "rdi" }, 5 }, 1338 { { "esp", "rsp" }, 7 }, 1339 { { "ebp", "rbp" }, 6 }, 1340}; 1341 1342// X86 target abstract base class; x86-32 and x86-64 are very close, so 1343// most of the implementation can be shared. 1344class X86TargetInfo : public TargetInfo { 1345 enum X86SSEEnum { 1346 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2 1347 } SSELevel; 1348 enum MMX3DNowEnum { 1349 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon 1350 } MMX3DNowLevel; 1351 1352 bool HasAES; 1353 bool HasPCLMUL; 1354 bool HasLZCNT; 1355 bool HasRDRND; 1356 bool HasBMI; 1357 bool HasBMI2; 1358 bool HasPOPCNT; 1359 bool HasSSE4a; 1360 bool HasFMA4; 1361 bool HasFMA; 1362 bool HasXOP; 1363 bool HasF16C; 1364 1365 /// \brief Enumeration of all of the X86 CPUs supported by Clang. 1366 /// 1367 /// Each enumeration represents a particular CPU supported by Clang. These 1368 /// loosely correspond to the options passed to '-march' or '-mtune' flags. 1369 enum CPUKind { 1370 CK_Generic, 1371 1372 /// \name i386 1373 /// i386-generation processors. 1374 //@{ 1375 CK_i386, 1376 //@} 1377 1378 /// \name i486 1379 /// i486-generation processors. 1380 //@{ 1381 CK_i486, 1382 CK_WinChipC6, 1383 CK_WinChip2, 1384 CK_C3, 1385 //@} 1386 1387 /// \name i586 1388 /// i586-generation processors, P5 microarchitecture based. 1389 //@{ 1390 CK_i586, 1391 CK_Pentium, 1392 CK_PentiumMMX, 1393 //@} 1394 1395 /// \name i686 1396 /// i686-generation processors, P6 / Pentium M microarchitecture based. 1397 //@{ 1398 CK_i686, 1399 CK_PentiumPro, 1400 CK_Pentium2, 1401 CK_Pentium3, 1402 CK_Pentium3M, 1403 CK_PentiumM, 1404 CK_C3_2, 1405 1406 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah. 1407 /// Clang however has some logic to suport this. 1408 // FIXME: Warn, deprecate, and potentially remove this. 1409 CK_Yonah, 1410 //@} 1411 1412 /// \name Netburst 1413 /// Netburst microarchitecture based processors. 1414 //@{ 1415 CK_Pentium4, 1416 CK_Pentium4M, 1417 CK_Prescott, 1418 CK_Nocona, 1419 //@} 1420 1421 /// \name Core 1422 /// Core microarchitecture based processors. 1423 //@{ 1424 CK_Core2, 1425 1426 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another 1427 /// codename which GCC no longer accepts as an option to -march, but Clang 1428 /// has some logic for recognizing it. 1429 // FIXME: Warn, deprecate, and potentially remove this. 1430 CK_Penryn, 1431 //@} 1432 1433 /// \name Atom 1434 /// Atom processors 1435 //@{ 1436 CK_Atom, 1437 //@} 1438 1439 /// \name Nehalem 1440 /// Nehalem microarchitecture based processors. 1441 //@{ 1442 CK_Corei7, 1443 CK_Corei7AVX, 1444 CK_CoreAVXi, 1445 CK_CoreAVX2, 1446 //@} 1447 1448 /// \name K6 1449 /// K6 architecture processors. 1450 //@{ 1451 CK_K6, 1452 CK_K6_2, 1453 CK_K6_3, 1454 //@} 1455 1456 /// \name K7 1457 /// K7 architecture processors. 1458 //@{ 1459 CK_Athlon, 1460 CK_AthlonThunderbird, 1461 CK_Athlon4, 1462 CK_AthlonXP, 1463 CK_AthlonMP, 1464 //@} 1465 1466 /// \name K8 1467 /// K8 architecture processors. 1468 //@{ 1469 CK_Athlon64, 1470 CK_Athlon64SSE3, 1471 CK_AthlonFX, 1472 CK_K8, 1473 CK_K8SSE3, 1474 CK_Opteron, 1475 CK_OpteronSSE3, 1476 CK_AMDFAM10, 1477 //@} 1478 1479 /// \name Bobcat 1480 /// Bobcat architecture processors. 1481 //@{ 1482 CK_BTVER1, 1483 //@} 1484 1485 /// \name Bulldozer 1486 /// Bulldozer architecture processors. 1487 //@{ 1488 CK_BDVER1, 1489 CK_BDVER2, 1490 //@} 1491 1492 /// This specification is deprecated and will be removed in the future. 1493 /// Users should prefer \see CK_K8. 1494 // FIXME: Warn on this when the CPU is set to it. 1495 CK_x86_64, 1496 //@} 1497 1498 /// \name Geode 1499 /// Geode processors. 1500 //@{ 1501 CK_Geode 1502 //@} 1503 } CPU; 1504 1505public: 1506 X86TargetInfo(const std::string& triple) 1507 : TargetInfo(triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow), 1508 HasAES(false), HasPCLMUL(false), HasLZCNT(false), HasRDRND(false), 1509 HasBMI(false), HasBMI2(false), HasPOPCNT(false), HasSSE4a(false), 1510 HasFMA4(false), HasFMA(false), HasXOP(false), HasF16C(false), 1511 CPU(CK_Generic) { 1512 BigEndian = false; 1513 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended; 1514 } 1515 virtual unsigned getFloatEvalMethod() const { 1516 // X87 evaluates with 80 bits "long double" precision. 1517 return SSELevel == NoSSE ? 2 : 0; 1518 } 1519 virtual void getTargetBuiltins(const Builtin::Info *&Records, 1520 unsigned &NumRecords) const { 1521 Records = BuiltinInfo; 1522 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin; 1523 } 1524 virtual void getGCCRegNames(const char * const *&Names, 1525 unsigned &NumNames) const { 1526 Names = GCCRegNames; 1527 NumNames = llvm::array_lengthof(GCCRegNames); 1528 } 1529 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 1530 unsigned &NumAliases) const { 1531 Aliases = 0; 1532 NumAliases = 0; 1533 } 1534 virtual void getGCCAddlRegNames(const AddlRegName *&Names, 1535 unsigned &NumNames) const { 1536 Names = AddlRegNames; 1537 NumNames = llvm::array_lengthof(AddlRegNames); 1538 } 1539 virtual bool validateAsmConstraint(const char *&Name, 1540 TargetInfo::ConstraintInfo &info) const; 1541 virtual std::string convertConstraint(const char *&Constraint) const; 1542 virtual const char *getClobbers() const { 1543 return "~{dirflag},~{fpsr},~{flags}"; 1544 } 1545 virtual void getTargetDefines(const LangOptions &Opts, 1546 MacroBuilder &Builder) const; 1547 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features, 1548 StringRef Name, 1549 bool Enabled) const; 1550 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const; 1551 virtual bool hasFeature(StringRef Feature) const; 1552 virtual void HandleTargetFeatures(std::vector<std::string> &Features); 1553 virtual const char* getABI() const { 1554 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX) 1555 return "avx"; 1556 else if (getTriple().getArch() == llvm::Triple::x86 && 1557 MMX3DNowLevel == NoMMX3DNow) 1558 return "no-mmx"; 1559 return ""; 1560 } 1561 virtual bool setCPU(const std::string &Name) { 1562 CPU = llvm::StringSwitch<CPUKind>(Name) 1563 .Case("i386", CK_i386) 1564 .Case("i486", CK_i486) 1565 .Case("winchip-c6", CK_WinChipC6) 1566 .Case("winchip2", CK_WinChip2) 1567 .Case("c3", CK_C3) 1568 .Case("i586", CK_i586) 1569 .Case("pentium", CK_Pentium) 1570 .Case("pentium-mmx", CK_PentiumMMX) 1571 .Case("i686", CK_i686) 1572 .Case("pentiumpro", CK_PentiumPro) 1573 .Case("pentium2", CK_Pentium2) 1574 .Case("pentium3", CK_Pentium3) 1575 .Case("pentium3m", CK_Pentium3M) 1576 .Case("pentium-m", CK_PentiumM) 1577 .Case("c3-2", CK_C3_2) 1578 .Case("yonah", CK_Yonah) 1579 .Case("pentium4", CK_Pentium4) 1580 .Case("pentium4m", CK_Pentium4M) 1581 .Case("prescott", CK_Prescott) 1582 .Case("nocona", CK_Nocona) 1583 .Case("core2", CK_Core2) 1584 .Case("penryn", CK_Penryn) 1585 .Case("atom", CK_Atom) 1586 .Case("corei7", CK_Corei7) 1587 .Case("corei7-avx", CK_Corei7AVX) 1588 .Case("core-avx-i", CK_CoreAVXi) 1589 .Case("core-avx2", CK_CoreAVX2) 1590 .Case("k6", CK_K6) 1591 .Case("k6-2", CK_K6_2) 1592 .Case("k6-3", CK_K6_3) 1593 .Case("athlon", CK_Athlon) 1594 .Case("athlon-tbird", CK_AthlonThunderbird) 1595 .Case("athlon-4", CK_Athlon4) 1596 .Case("athlon-xp", CK_AthlonXP) 1597 .Case("athlon-mp", CK_AthlonMP) 1598 .Case("athlon64", CK_Athlon64) 1599 .Case("athlon64-sse3", CK_Athlon64SSE3) 1600 .Case("athlon-fx", CK_AthlonFX) 1601 .Case("k8", CK_K8) 1602 .Case("k8-sse3", CK_K8SSE3) 1603 .Case("opteron", CK_Opteron) 1604 .Case("opteron-sse3", CK_OpteronSSE3) 1605 .Case("amdfam10", CK_AMDFAM10) 1606 .Case("btver1", CK_BTVER1) 1607 .Case("bdver1", CK_BDVER1) 1608 .Case("bdver2", CK_BDVER2) 1609 .Case("x86-64", CK_x86_64) 1610 .Case("geode", CK_Geode) 1611 .Default(CK_Generic); 1612 1613 // Perform any per-CPU checks necessary to determine if this CPU is 1614 // acceptable. 1615 // FIXME: This results in terrible diagnostics. Clang just says the CPU is 1616 // invalid without explaining *why*. 1617 switch (CPU) { 1618 case CK_Generic: 1619 // No processor selected! 1620 return false; 1621 1622 case CK_i386: 1623 case CK_i486: 1624 case CK_WinChipC6: 1625 case CK_WinChip2: 1626 case CK_C3: 1627 case CK_i586: 1628 case CK_Pentium: 1629 case CK_PentiumMMX: 1630 case CK_i686: 1631 case CK_PentiumPro: 1632 case CK_Pentium2: 1633 case CK_Pentium3: 1634 case CK_Pentium3M: 1635 case CK_PentiumM: 1636 case CK_Yonah: 1637 case CK_C3_2: 1638 case CK_Pentium4: 1639 case CK_Pentium4M: 1640 case CK_Prescott: 1641 case CK_K6: 1642 case CK_K6_2: 1643 case CK_K6_3: 1644 case CK_Athlon: 1645 case CK_AthlonThunderbird: 1646 case CK_Athlon4: 1647 case CK_AthlonXP: 1648 case CK_AthlonMP: 1649 case CK_Geode: 1650 // Only accept certain architectures when compiling in 32-bit mode. 1651 if (getTriple().getArch() != llvm::Triple::x86) 1652 return false; 1653 1654 // Fallthrough 1655 case CK_Nocona: 1656 case CK_Core2: 1657 case CK_Penryn: 1658 case CK_Atom: 1659 case CK_Corei7: 1660 case CK_Corei7AVX: 1661 case CK_CoreAVXi: 1662 case CK_CoreAVX2: 1663 case CK_Athlon64: 1664 case CK_Athlon64SSE3: 1665 case CK_AthlonFX: 1666 case CK_K8: 1667 case CK_K8SSE3: 1668 case CK_Opteron: 1669 case CK_OpteronSSE3: 1670 case CK_AMDFAM10: 1671 case CK_BTVER1: 1672 case CK_BDVER1: 1673 case CK_BDVER2: 1674 case CK_x86_64: 1675 return true; 1676 } 1677 llvm_unreachable("Unhandled CPU kind"); 1678 } 1679 1680 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const { 1681 // We accept all non-ARM calling conventions 1682 return (CC == CC_X86ThisCall || 1683 CC == CC_X86FastCall || 1684 CC == CC_X86StdCall || 1685 CC == CC_C || 1686 CC == CC_X86Pascal) ? CCCR_OK : CCCR_Warning; 1687 } 1688 1689 virtual CallingConv getDefaultCallingConv() const { 1690 return CC_C; 1691 } 1692}; 1693 1694void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const { 1695 // FIXME: This should not be here. 1696 Features["3dnow"] = false; 1697 Features["3dnowa"] = false; 1698 Features["mmx"] = false; 1699 Features["sse"] = false; 1700 Features["sse2"] = false; 1701 Features["sse3"] = false; 1702 Features["ssse3"] = false; 1703 Features["sse41"] = false; 1704 Features["sse42"] = false; 1705 Features["sse4a"] = false; 1706 Features["aes"] = false; 1707 Features["pclmul"] = false; 1708 Features["avx"] = false; 1709 Features["avx2"] = false; 1710 Features["lzcnt"] = false; 1711 Features["rdrand"] = false; 1712 Features["bmi"] = false; 1713 Features["bmi2"] = false; 1714 Features["popcnt"] = false; 1715 Features["fma4"] = false; 1716 Features["fma"] = false; 1717 Features["xop"] = false; 1718 Features["f16c"] = false; 1719 1720 // FIXME: This *really* should not be here. 1721 1722 // X86_64 always has SSE2. 1723 if (getTriple().getArch() == llvm::Triple::x86_64) 1724 Features["sse2"] = Features["sse"] = Features["mmx"] = true; 1725 1726 switch (CPU) { 1727 case CK_Generic: 1728 case CK_i386: 1729 case CK_i486: 1730 case CK_i586: 1731 case CK_Pentium: 1732 case CK_i686: 1733 case CK_PentiumPro: 1734 break; 1735 case CK_PentiumMMX: 1736 case CK_Pentium2: 1737 setFeatureEnabled(Features, "mmx", true); 1738 break; 1739 case CK_Pentium3: 1740 case CK_Pentium3M: 1741 setFeatureEnabled(Features, "mmx", true); 1742 setFeatureEnabled(Features, "sse", true); 1743 break; 1744 case CK_PentiumM: 1745 case CK_Pentium4: 1746 case CK_Pentium4M: 1747 case CK_x86_64: 1748 setFeatureEnabled(Features, "mmx", true); 1749 setFeatureEnabled(Features, "sse2", true); 1750 break; 1751 case CK_Yonah: 1752 case CK_Prescott: 1753 case CK_Nocona: 1754 setFeatureEnabled(Features, "mmx", true); 1755 setFeatureEnabled(Features, "sse3", true); 1756 break; 1757 case CK_Core2: 1758 setFeatureEnabled(Features, "mmx", true); 1759 setFeatureEnabled(Features, "ssse3", true); 1760 break; 1761 case CK_Penryn: 1762 setFeatureEnabled(Features, "mmx", true); 1763 setFeatureEnabled(Features, "sse4.1", true); 1764 break; 1765 case CK_Atom: 1766 setFeatureEnabled(Features, "mmx", true); 1767 setFeatureEnabled(Features, "ssse3", true); 1768 break; 1769 case CK_Corei7: 1770 setFeatureEnabled(Features, "mmx", true); 1771 setFeatureEnabled(Features, "sse4", true); 1772 break; 1773 case CK_Corei7AVX: 1774 setFeatureEnabled(Features, "mmx", true); 1775 setFeatureEnabled(Features, "avx", true); 1776 setFeatureEnabled(Features, "aes", true); 1777 setFeatureEnabled(Features, "pclmul", true); 1778 break; 1779 case CK_CoreAVXi: 1780 setFeatureEnabled(Features, "mmx", true); 1781 setFeatureEnabled(Features, "avx", true); 1782 setFeatureEnabled(Features, "aes", true); 1783 setFeatureEnabled(Features, "pclmul", true); 1784 setFeatureEnabled(Features, "rdrnd", true); 1785 break; 1786 case CK_CoreAVX2: 1787 setFeatureEnabled(Features, "mmx", true); 1788 setFeatureEnabled(Features, "avx2", true); 1789 setFeatureEnabled(Features, "aes", true); 1790 setFeatureEnabled(Features, "pclmul", true); 1791 setFeatureEnabled(Features, "lzcnt", true); 1792 setFeatureEnabled(Features, "rdrnd", true); 1793 setFeatureEnabled(Features, "bmi", true); 1794 setFeatureEnabled(Features, "bmi2", true); 1795 setFeatureEnabled(Features, "fma", true); 1796 break; 1797 case CK_K6: 1798 case CK_WinChipC6: 1799 setFeatureEnabled(Features, "mmx", true); 1800 break; 1801 case CK_K6_2: 1802 case CK_K6_3: 1803 case CK_WinChip2: 1804 case CK_C3: 1805 setFeatureEnabled(Features, "3dnow", true); 1806 break; 1807 case CK_Athlon: 1808 case CK_AthlonThunderbird: 1809 case CK_Geode: 1810 setFeatureEnabled(Features, "3dnowa", true); 1811 break; 1812 case CK_Athlon4: 1813 case CK_AthlonXP: 1814 case CK_AthlonMP: 1815 setFeatureEnabled(Features, "sse", true); 1816 setFeatureEnabled(Features, "3dnowa", true); 1817 break; 1818 case CK_K8: 1819 case CK_Opteron: 1820 case CK_Athlon64: 1821 case CK_AthlonFX: 1822 setFeatureEnabled(Features, "sse2", true); 1823 setFeatureEnabled(Features, "3dnowa", true); 1824 break; 1825 case CK_K8SSE3: 1826 case CK_OpteronSSE3: 1827 case CK_Athlon64SSE3: 1828 setFeatureEnabled(Features, "sse3", true); 1829 setFeatureEnabled(Features, "3dnowa", true); 1830 break; 1831 case CK_AMDFAM10: 1832 setFeatureEnabled(Features, "sse3", true); 1833 setFeatureEnabled(Features, "sse4a", true); 1834 setFeatureEnabled(Features, "3dnowa", true); 1835 break; 1836 case CK_BTVER1: 1837 setFeatureEnabled(Features, "ssse3", true); 1838 setFeatureEnabled(Features, "sse4a", true); 1839 break; 1840 case CK_BDVER1: 1841 case CK_BDVER2: 1842 setFeatureEnabled(Features, "avx", true); 1843 setFeatureEnabled(Features, "xop", true); 1844 setFeatureEnabled(Features, "aes", true); 1845 setFeatureEnabled(Features, "pclmul", true); 1846 break; 1847 case CK_C3_2: 1848 setFeatureEnabled(Features, "mmx", true); 1849 setFeatureEnabled(Features, "sse", true); 1850 break; 1851 } 1852} 1853 1854bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features, 1855 StringRef Name, 1856 bool Enabled) const { 1857 // FIXME: This *really* should not be here. We need some way of translating 1858 // options into llvm subtarget features. 1859 if (!Features.count(Name) && 1860 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1" && 1861 Name != "rdrnd")) 1862 return false; 1863 1864 // FIXME: this should probably use a switch with fall through. 1865 1866 if (Enabled) { 1867 if (Name == "mmx") 1868 Features["mmx"] = true; 1869 else if (Name == "sse") 1870 Features["mmx"] = Features["sse"] = true; 1871 else if (Name == "sse2") 1872 Features["mmx"] = Features["sse"] = Features["sse2"] = true; 1873 else if (Name == "sse3") 1874 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] = 1875 true; 1876 else if (Name == "ssse3") 1877 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] = 1878 Features["ssse3"] = true; 1879 else if (Name == "sse4" || Name == "sse4.2") 1880 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] = 1881 Features["ssse3"] = Features["sse41"] = Features["sse42"] = 1882 Features["popcnt"] = true; 1883 else if (Name == "sse4.1") 1884 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] = 1885 Features["ssse3"] = Features["sse41"] = true; 1886 else if (Name == "3dnow") 1887 Features["mmx"] = Features["3dnow"] = true; 1888 else if (Name == "3dnowa") 1889 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = true; 1890 else if (Name == "aes") 1891 Features["sse"] = Features["sse2"] = Features["aes"] = true; 1892 else if (Name == "pclmul") 1893 Features["sse"] = Features["sse2"] = Features["pclmul"] = true; 1894 else if (Name == "avx") 1895 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] = 1896 Features["ssse3"] = Features["sse41"] = Features["sse42"] = 1897 Features["popcnt"] = Features["avx"] = true; 1898 else if (Name == "avx2") 1899 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] = 1900 Features["ssse3"] = Features["sse41"] = Features["sse42"] = 1901 Features["popcnt"] = Features["avx"] = Features["avx2"] = true; 1902 else if (Name == "fma") 1903 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] = 1904 Features["ssse3"] = Features["sse41"] = Features["sse42"] = 1905 Features["popcnt"] = Features["avx"] = Features["fma"] = true; 1906 else if (Name == "fma4") 1907 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] = 1908 Features["ssse3"] = Features["sse41"] = Features["sse42"] = 1909 Features["popcnt"] = Features["avx"] = Features["sse4a"] = 1910 Features["fma4"] = true; 1911 else if (Name == "xop") 1912 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] = 1913 Features["ssse3"] = Features["sse41"] = Features["sse42"] = 1914 Features["popcnt"] = Features["avx"] = Features["sse4a"] = 1915 Features["fma4"] = Features["xop"] = true; 1916 else if (Name == "sse4a") 1917 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] = 1918 Features["sse4a"] = true; 1919 else if (Name == "lzcnt") 1920 Features["lzcnt"] = true; 1921 else if (Name == "rdrnd") 1922 Features["rdrand"] = true; 1923 else if (Name == "bmi") 1924 Features["bmi"] = true; 1925 else if (Name == "bmi2") 1926 Features["bmi2"] = true; 1927 else if (Name == "popcnt") 1928 Features["popcnt"] = true; 1929 else if (Name == "f16c") 1930 Features["f16c"] = true; 1931 } else { 1932 if (Name == "mmx") 1933 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = false; 1934 else if (Name == "sse") 1935 Features["sse"] = Features["sse2"] = Features["sse3"] = 1936 Features["ssse3"] = Features["sse41"] = Features["sse42"] = 1937 Features["sse4a"] = Features["avx"] = Features["avx2"] = 1938 Features["fma"] = Features["fma4"] = Features["aes"] = 1939 Features["pclmul"] = Features["xop"] = false; 1940 else if (Name == "sse2") 1941 Features["sse2"] = Features["sse3"] = Features["ssse3"] = 1942 Features["sse41"] = Features["sse42"] = Features["sse4a"] = 1943 Features["avx"] = Features["avx2"] = Features["fma"] = 1944 Features["fma4"] = Features["aes"] = Features["pclmul"] = 1945 Features["xop"] = false; 1946 else if (Name == "sse3") 1947 Features["sse3"] = Features["ssse3"] = Features["sse41"] = 1948 Features["sse42"] = Features["sse4a"] = Features["avx"] = 1949 Features["avx2"] = Features["fma"] = Features["fma4"] = 1950 Features["xop"] = false; 1951 else if (Name == "ssse3") 1952 Features["ssse3"] = Features["sse41"] = Features["sse42"] = 1953 Features["avx"] = Features["avx2"] = Features["fma"] = false; 1954 else if (Name == "sse4" || Name == "sse4.1") 1955 Features["sse41"] = Features["sse42"] = Features["avx"] = 1956 Features["avx2"] = Features["fma"] = false; 1957 else if (Name == "sse4.2") 1958 Features["sse42"] = Features["avx"] = Features["avx2"] = 1959 Features["fma"] = false; 1960 else if (Name == "3dnow") 1961 Features["3dnow"] = Features["3dnowa"] = false; 1962 else if (Name == "3dnowa") 1963 Features["3dnowa"] = false; 1964 else if (Name == "aes") 1965 Features["aes"] = false; 1966 else if (Name == "pclmul") 1967 Features["pclmul"] = false; 1968 else if (Name == "avx") 1969 Features["avx"] = Features["avx2"] = Features["fma"] = 1970 Features["fma4"] = Features["xop"] = false; 1971 else if (Name == "avx2") 1972 Features["avx2"] = false; 1973 else if (Name == "fma") 1974 Features["fma"] = false; 1975 else if (Name == "sse4a") 1976 Features["sse4a"] = Features["fma4"] = Features["xop"] = false; 1977 else if (Name == "lzcnt") 1978 Features["lzcnt"] = false; 1979 else if (Name == "rdrnd") 1980 Features["rdrand"] = false; 1981 else if (Name == "bmi") 1982 Features["bmi"] = false; 1983 else if (Name == "bmi2") 1984 Features["bmi2"] = false; 1985 else if (Name == "popcnt") 1986 Features["popcnt"] = false; 1987 else if (Name == "fma4") 1988 Features["fma4"] = Features["xop"] = false; 1989 else if (Name == "xop") 1990 Features["xop"] = false; 1991 else if (Name == "f16c") 1992 Features["f16c"] = false; 1993 } 1994 1995 return true; 1996} 1997 1998/// HandleTargetOptions - Perform initialization based on the user 1999/// configured set of features. 2000void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) { 2001 // Remember the maximum enabled sselevel. 2002 for (unsigned i = 0, e = Features.size(); i !=e; ++i) { 2003 // Ignore disabled features. 2004 if (Features[i][0] == '-') 2005 continue; 2006 2007 StringRef Feature = StringRef(Features[i]).substr(1); 2008 2009 if (Feature == "aes") { 2010 HasAES = true; 2011 continue; 2012 } 2013 2014 if (Feature == "pclmul") { 2015 HasPCLMUL = true; 2016 continue; 2017 } 2018 2019 if (Feature == "lzcnt") { 2020 HasLZCNT = true; 2021 continue; 2022 } 2023 2024 if (Feature == "rdrand") { 2025 HasRDRND = true; 2026 continue; 2027 } 2028 2029 if (Feature == "bmi") { 2030 HasBMI = true; 2031 continue; 2032 } 2033 2034 if (Feature == "bmi2") { 2035 HasBMI2 = true; 2036 continue; 2037 } 2038 2039 if (Feature == "popcnt") { 2040 HasPOPCNT = true; 2041 continue; 2042 } 2043 2044 if (Feature == "sse4a") { 2045 HasSSE4a = true; 2046 continue; 2047 } 2048 2049 if (Feature == "fma4") { 2050 HasFMA4 = true; 2051 continue; 2052 } 2053 2054 if (Feature == "fma") { 2055 HasFMA = true; 2056 continue; 2057 } 2058 2059 if (Feature == "xop") { 2060 HasXOP = true; 2061 continue; 2062 } 2063 2064 if (Feature == "f16c") { 2065 HasF16C = true; 2066 continue; 2067 } 2068 2069 assert(Features[i][0] == '+' && "Invalid target feature!"); 2070 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature) 2071 .Case("avx2", AVX2) 2072 .Case("avx", AVX) 2073 .Case("sse42", SSE42) 2074 .Case("sse41", SSE41) 2075 .Case("ssse3", SSSE3) 2076 .Case("sse3", SSE3) 2077 .Case("sse2", SSE2) 2078 .Case("sse", SSE1) 2079 .Default(NoSSE); 2080 SSELevel = std::max(SSELevel, Level); 2081 2082 MMX3DNowEnum ThreeDNowLevel = 2083 llvm::StringSwitch<MMX3DNowEnum>(Feature) 2084 .Case("3dnowa", AMD3DNowAthlon) 2085 .Case("3dnow", AMD3DNow) 2086 .Case("mmx", MMX) 2087 .Default(NoMMX3DNow); 2088 2089 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel); 2090 } 2091 2092 // Don't tell the backend if we're turning off mmx; it will end up disabling 2093 // SSE, which we don't want. 2094 std::vector<std::string>::iterator it; 2095 it = std::find(Features.begin(), Features.end(), "-mmx"); 2096 if (it != Features.end()) 2097 Features.erase(it); 2098} 2099 2100/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro 2101/// definitions for this particular subtarget. 2102void X86TargetInfo::getTargetDefines(const LangOptions &Opts, 2103 MacroBuilder &Builder) const { 2104 // Target identification. 2105 if (getTriple().getArch() == llvm::Triple::x86_64) { 2106 Builder.defineMacro("__amd64__"); 2107 Builder.defineMacro("__amd64"); 2108 Builder.defineMacro("__x86_64"); 2109 Builder.defineMacro("__x86_64__"); 2110 } else { 2111 DefineStd(Builder, "i386", Opts); 2112 } 2113 2114 // Subtarget options. 2115 // FIXME: We are hard-coding the tune parameters based on the CPU, but they 2116 // truly should be based on -mtune options. 2117 switch (CPU) { 2118 case CK_Generic: 2119 break; 2120 case CK_i386: 2121 // The rest are coming from the i386 define above. 2122 Builder.defineMacro("__tune_i386__"); 2123 break; 2124 case CK_i486: 2125 case CK_WinChipC6: 2126 case CK_WinChip2: 2127 case CK_C3: 2128 defineCPUMacros(Builder, "i486"); 2129 break; 2130 case CK_PentiumMMX: 2131 Builder.defineMacro("__pentium_mmx__"); 2132 Builder.defineMacro("__tune_pentium_mmx__"); 2133 // Fallthrough 2134 case CK_i586: 2135 case CK_Pentium: 2136 defineCPUMacros(Builder, "i586"); 2137 defineCPUMacros(Builder, "pentium"); 2138 break; 2139 case CK_Pentium3: 2140 case CK_Pentium3M: 2141 case CK_PentiumM: 2142 Builder.defineMacro("__tune_pentium3__"); 2143 // Fallthrough 2144 case CK_Pentium2: 2145 case CK_C3_2: 2146 Builder.defineMacro("__tune_pentium2__"); 2147 // Fallthrough 2148 case CK_PentiumPro: 2149 Builder.defineMacro("__tune_i686__"); 2150 Builder.defineMacro("__tune_pentiumpro__"); 2151 // Fallthrough 2152 case CK_i686: 2153 Builder.defineMacro("__i686"); 2154 Builder.defineMacro("__i686__"); 2155 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686. 2156 Builder.defineMacro("__pentiumpro"); 2157 Builder.defineMacro("__pentiumpro__"); 2158 break; 2159 case CK_Pentium4: 2160 case CK_Pentium4M: 2161 defineCPUMacros(Builder, "pentium4"); 2162 break; 2163 case CK_Yonah: 2164 case CK_Prescott: 2165 case CK_Nocona: 2166 defineCPUMacros(Builder, "nocona"); 2167 break; 2168 case CK_Core2: 2169 case CK_Penryn: 2170 defineCPUMacros(Builder, "core2"); 2171 break; 2172 case CK_Atom: 2173 defineCPUMacros(Builder, "atom"); 2174 break; 2175 case CK_Corei7: 2176 case CK_Corei7AVX: 2177 case CK_CoreAVXi: 2178 case CK_CoreAVX2: 2179 defineCPUMacros(Builder, "corei7"); 2180 break; 2181 case CK_K6_2: 2182 Builder.defineMacro("__k6_2__"); 2183 Builder.defineMacro("__tune_k6_2__"); 2184 // Fallthrough 2185 case CK_K6_3: 2186 if (CPU != CK_K6_2) { // In case of fallthrough 2187 // FIXME: GCC may be enabling these in cases where some other k6 2188 // architecture is specified but -m3dnow is explicitly provided. The 2189 // exact semantics need to be determined and emulated here. 2190 Builder.defineMacro("__k6_3__"); 2191 Builder.defineMacro("__tune_k6_3__"); 2192 } 2193 // Fallthrough 2194 case CK_K6: 2195 defineCPUMacros(Builder, "k6"); 2196 break; 2197 case CK_Athlon: 2198 case CK_AthlonThunderbird: 2199 case CK_Athlon4: 2200 case CK_AthlonXP: 2201 case CK_AthlonMP: 2202 defineCPUMacros(Builder, "athlon"); 2203 if (SSELevel != NoSSE) { 2204 Builder.defineMacro("__athlon_sse__"); 2205 Builder.defineMacro("__tune_athlon_sse__"); 2206 } 2207 break; 2208 case CK_K8: 2209 case CK_K8SSE3: 2210 case CK_x86_64: 2211 case CK_Opteron: 2212 case CK_OpteronSSE3: 2213 case CK_Athlon64: 2214 case CK_Athlon64SSE3: 2215 case CK_AthlonFX: 2216 defineCPUMacros(Builder, "k8"); 2217 break; 2218 case CK_AMDFAM10: 2219 defineCPUMacros(Builder, "amdfam10"); 2220 break; 2221 case CK_BTVER1: 2222 defineCPUMacros(Builder, "btver1"); 2223 break; 2224 case CK_BDVER1: 2225 defineCPUMacros(Builder, "bdver1"); 2226 break; 2227 case CK_BDVER2: 2228 defineCPUMacros(Builder, "bdver2"); 2229 break; 2230 case CK_Geode: 2231 defineCPUMacros(Builder, "geode"); 2232 break; 2233 } 2234 2235 // Target properties. 2236 Builder.defineMacro("__LITTLE_ENDIAN__"); 2237 Builder.defineMacro("__REGISTER_PREFIX__", ""); 2238 2239 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline 2240 // functions in glibc header files that use FP Stack inline asm which the 2241 // backend can't deal with (PR879). 2242 Builder.defineMacro("__NO_MATH_INLINES"); 2243 2244 if (HasAES) 2245 Builder.defineMacro("__AES__"); 2246 2247 if (HasPCLMUL) 2248 Builder.defineMacro("__PCLMUL__"); 2249 2250 if (HasLZCNT) 2251 Builder.defineMacro("__LZCNT__"); 2252 2253 if (HasRDRND) 2254 Builder.defineMacro("__RDRND__"); 2255 2256 if (HasBMI) 2257 Builder.defineMacro("__BMI__"); 2258 2259 if (HasBMI2) 2260 Builder.defineMacro("__BMI2__"); 2261 2262 if (HasPOPCNT) 2263 Builder.defineMacro("__POPCNT__"); 2264 2265 if (HasSSE4a) 2266 Builder.defineMacro("__SSE4A__"); 2267 2268 if (HasFMA4) 2269 Builder.defineMacro("__FMA4__"); 2270 2271 if (HasFMA) 2272 Builder.defineMacro("__FMA__"); 2273 2274 if (HasXOP) 2275 Builder.defineMacro("__XOP__"); 2276 2277 if (HasF16C) 2278 Builder.defineMacro("__F16C__"); 2279 2280 // Each case falls through to the previous one here. 2281 switch (SSELevel) { 2282 case AVX2: 2283 Builder.defineMacro("__AVX2__"); 2284 case AVX: 2285 Builder.defineMacro("__AVX__"); 2286 case SSE42: 2287 Builder.defineMacro("__SSE4_2__"); 2288 case SSE41: 2289 Builder.defineMacro("__SSE4_1__"); 2290 case SSSE3: 2291 Builder.defineMacro("__SSSE3__"); 2292 case SSE3: 2293 Builder.defineMacro("__SSE3__"); 2294 case SSE2: 2295 Builder.defineMacro("__SSE2__"); 2296 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied. 2297 case SSE1: 2298 Builder.defineMacro("__SSE__"); 2299 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied. 2300 case NoSSE: 2301 break; 2302 } 2303 2304 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) { 2305 switch (SSELevel) { 2306 case AVX2: 2307 case AVX: 2308 case SSE42: 2309 case SSE41: 2310 case SSSE3: 2311 case SSE3: 2312 case SSE2: 2313 Builder.defineMacro("_M_IX86_FP", Twine(2)); 2314 break; 2315 case SSE1: 2316 Builder.defineMacro("_M_IX86_FP", Twine(1)); 2317 break; 2318 default: 2319 Builder.defineMacro("_M_IX86_FP", Twine(0)); 2320 } 2321 } 2322 2323 // Each case falls through to the previous one here. 2324 switch (MMX3DNowLevel) { 2325 case AMD3DNowAthlon: 2326 Builder.defineMacro("__3dNOW_A__"); 2327 case AMD3DNow: 2328 Builder.defineMacro("__3dNOW__"); 2329 case MMX: 2330 Builder.defineMacro("__MMX__"); 2331 case NoMMX3DNow: 2332 break; 2333 } 2334} 2335 2336bool X86TargetInfo::hasFeature(StringRef Feature) const { 2337 return llvm::StringSwitch<bool>(Feature) 2338 .Case("aes", HasAES) 2339 .Case("avx", SSELevel >= AVX) 2340 .Case("avx2", SSELevel >= AVX2) 2341 .Case("bmi", HasBMI) 2342 .Case("bmi2", HasBMI2) 2343 .Case("fma", HasFMA) 2344 .Case("fma4", HasFMA4) 2345 .Case("lzcnt", HasLZCNT) 2346 .Case("rdrnd", HasRDRND) 2347 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow) 2348 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon) 2349 .Case("mmx", MMX3DNowLevel >= MMX) 2350 .Case("pclmul", HasPCLMUL) 2351 .Case("popcnt", HasPOPCNT) 2352 .Case("sse", SSELevel >= SSE1) 2353 .Case("sse2", SSELevel >= SSE2) 2354 .Case("sse3", SSELevel >= SSE3) 2355 .Case("ssse3", SSELevel >= SSSE3) 2356 .Case("sse41", SSELevel >= SSE41) 2357 .Case("sse42", SSELevel >= SSE42) 2358 .Case("sse4a", HasSSE4a) 2359 .Case("x86", true) 2360 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86) 2361 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64) 2362 .Case("xop", HasXOP) 2363 .Case("f16c", HasF16C) 2364 .Default(false); 2365} 2366 2367bool 2368X86TargetInfo::validateAsmConstraint(const char *&Name, 2369 TargetInfo::ConstraintInfo &Info) const { 2370 switch (*Name) { 2371 default: return false; 2372 case 'Y': // first letter of a pair: 2373 switch (*(Name+1)) { 2374 default: return false; 2375 case '0': // First SSE register. 2376 case 't': // Any SSE register, when SSE2 is enabled. 2377 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled. 2378 case 'm': // any MMX register, when inter-unit moves enabled. 2379 break; // falls through to setAllowsRegister. 2380 } 2381 case 'a': // eax. 2382 case 'b': // ebx. 2383 case 'c': // ecx. 2384 case 'd': // edx. 2385 case 'S': // esi. 2386 case 'D': // edi. 2387 case 'A': // edx:eax. 2388 case 'f': // any x87 floating point stack register. 2389 case 't': // top of floating point stack. 2390 case 'u': // second from top of floating point stack. 2391 case 'q': // Any register accessible as [r]l: a, b, c, and d. 2392 case 'y': // Any MMX register. 2393 case 'x': // Any SSE register. 2394 case 'Q': // Any register accessible as [r]h: a, b, c, and d. 2395 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp. 2396 case 'l': // "Index" registers: any general register that can be used as an 2397 // index in a base+index memory access. 2398 Info.setAllowsRegister(); 2399 return true; 2400 case 'C': // SSE floating point constant. 2401 case 'G': // x87 floating point constant. 2402 case 'e': // 32-bit signed integer constant for use with zero-extending 2403 // x86_64 instructions. 2404 case 'Z': // 32-bit unsigned integer constant for use with zero-extending 2405 // x86_64 instructions. 2406 return true; 2407 } 2408} 2409 2410 2411std::string 2412X86TargetInfo::convertConstraint(const char *&Constraint) const { 2413 switch (*Constraint) { 2414 case 'a': return std::string("{ax}"); 2415 case 'b': return std::string("{bx}"); 2416 case 'c': return std::string("{cx}"); 2417 case 'd': return std::string("{dx}"); 2418 case 'S': return std::string("{si}"); 2419 case 'D': return std::string("{di}"); 2420 case 'p': // address 2421 return std::string("im"); 2422 case 't': // top of floating point stack. 2423 return std::string("{st}"); 2424 case 'u': // second from top of floating point stack. 2425 return std::string("{st(1)}"); // second from top of floating point stack. 2426 default: 2427 return std::string(1, *Constraint); 2428 } 2429} 2430} // end anonymous namespace 2431 2432namespace { 2433// X86-32 generic target 2434class X86_32TargetInfo : public X86TargetInfo { 2435public: 2436 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) { 2437 DoubleAlign = LongLongAlign = 32; 2438 LongDoubleWidth = 96; 2439 LongDoubleAlign = 32; 2440 SuitableAlign = 128; 2441 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 2442 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-" 2443 "a0:0:64-f80:32:32-n8:16:32-S128"; 2444 SizeType = UnsignedInt; 2445 PtrDiffType = SignedInt; 2446 IntPtrType = SignedInt; 2447 RegParmMax = 3; 2448 2449 // Use fpret for all types. 2450 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) | 2451 (1 << TargetInfo::Double) | 2452 (1 << TargetInfo::LongDouble)); 2453 2454 // x86-32 has atomics up to 8 bytes 2455 // FIXME: Check that we actually have cmpxchg8b before setting 2456 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.) 2457 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64; 2458 } 2459 virtual BuiltinVaListKind getBuiltinVaListKind() const { 2460 return TargetInfo::CharPtrBuiltinVaList; 2461 } 2462 2463 int getEHDataRegisterNumber(unsigned RegNo) const { 2464 if (RegNo == 0) return 0; 2465 if (RegNo == 1) return 2; 2466 return -1; 2467 } 2468}; 2469} // end anonymous namespace 2470 2471namespace { 2472class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> { 2473public: 2474 NetBSDI386TargetInfo(const std::string &triple) : 2475 NetBSDTargetInfo<X86_32TargetInfo>(triple) { 2476 } 2477 2478 virtual unsigned getFloatEvalMethod() const { 2479 // NetBSD defaults to "double" rounding 2480 return 1; 2481 } 2482}; 2483} // end anonymous namespace 2484 2485namespace { 2486class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> { 2487public: 2488 OpenBSDI386TargetInfo(const std::string& triple) : 2489 OpenBSDTargetInfo<X86_32TargetInfo>(triple) { 2490 SizeType = UnsignedLong; 2491 IntPtrType = SignedLong; 2492 PtrDiffType = SignedLong; 2493 } 2494}; 2495} // end anonymous namespace 2496 2497namespace { 2498class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> { 2499public: 2500 BitrigI386TargetInfo(const std::string& triple) : 2501 BitrigTargetInfo<X86_32TargetInfo>(triple) { 2502 SizeType = UnsignedLong; 2503 IntPtrType = SignedLong; 2504 PtrDiffType = SignedLong; 2505 } 2506}; 2507} // end anonymous namespace 2508 2509namespace { 2510class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> { 2511public: 2512 DarwinI386TargetInfo(const std::string& triple) : 2513 DarwinTargetInfo<X86_32TargetInfo>(triple) { 2514 LongDoubleWidth = 128; 2515 LongDoubleAlign = 128; 2516 SuitableAlign = 128; 2517 MaxVectorAlign = 256; 2518 SizeType = UnsignedLong; 2519 IntPtrType = SignedLong; 2520 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 2521 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-" 2522 "a0:0:64-f80:128:128-n8:16:32-S128"; 2523 HasAlignMac68kSupport = true; 2524 } 2525 2526}; 2527} // end anonymous namespace 2528 2529namespace { 2530// x86-32 Windows target 2531class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> { 2532public: 2533 WindowsX86_32TargetInfo(const std::string& triple) 2534 : WindowsTargetInfo<X86_32TargetInfo>(triple) { 2535 TLSSupported = false; 2536 WCharType = UnsignedShort; 2537 DoubleAlign = LongLongAlign = 64; 2538 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 2539 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-" 2540 "v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32"; 2541 } 2542 virtual void getTargetDefines(const LangOptions &Opts, 2543 MacroBuilder &Builder) const { 2544 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder); 2545 } 2546}; 2547} // end anonymous namespace 2548 2549namespace { 2550 2551// x86-32 Windows Visual Studio target 2552class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo { 2553public: 2554 VisualStudioWindowsX86_32TargetInfo(const std::string& triple) 2555 : WindowsX86_32TargetInfo(triple) { 2556 LongDoubleWidth = LongDoubleAlign = 64; 2557 LongDoubleFormat = &llvm::APFloat::IEEEdouble; 2558 } 2559 virtual void getTargetDefines(const LangOptions &Opts, 2560 MacroBuilder &Builder) const { 2561 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder); 2562 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder); 2563 // The value of the following reflects processor type. 2564 // 300=386, 400=486, 500=Pentium, 600=Blend (default) 2565 // We lost the original triple, so we use the default. 2566 Builder.defineMacro("_M_IX86", "600"); 2567 } 2568}; 2569} // end anonymous namespace 2570 2571namespace { 2572// x86-32 MinGW target 2573class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo { 2574public: 2575 MinGWX86_32TargetInfo(const std::string& triple) 2576 : WindowsX86_32TargetInfo(triple) { 2577 } 2578 virtual void getTargetDefines(const LangOptions &Opts, 2579 MacroBuilder &Builder) const { 2580 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder); 2581 DefineStd(Builder, "WIN32", Opts); 2582 DefineStd(Builder, "WINNT", Opts); 2583 Builder.defineMacro("_X86_"); 2584 Builder.defineMacro("__MSVCRT__"); 2585 Builder.defineMacro("__MINGW32__"); 2586 2587 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)). 2588 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions. 2589 if (Opts.MicrosoftExt) 2590 // Provide "as-is" __declspec. 2591 Builder.defineMacro("__declspec", "__declspec"); 2592 else 2593 // Provide alias of __attribute__ like mingw32-gcc. 2594 Builder.defineMacro("__declspec(a)", "__attribute__((a))"); 2595 } 2596}; 2597} // end anonymous namespace 2598 2599namespace { 2600// x86-32 Cygwin target 2601class CygwinX86_32TargetInfo : public X86_32TargetInfo { 2602public: 2603 CygwinX86_32TargetInfo(const std::string& triple) 2604 : X86_32TargetInfo(triple) { 2605 TLSSupported = false; 2606 WCharType = UnsignedShort; 2607 DoubleAlign = LongLongAlign = 64; 2608 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 2609 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-" 2610 "a0:0:64-f80:32:32-n8:16:32-S32"; 2611 } 2612 virtual void getTargetDefines(const LangOptions &Opts, 2613 MacroBuilder &Builder) const { 2614 X86_32TargetInfo::getTargetDefines(Opts, Builder); 2615 Builder.defineMacro("__CYGWIN__"); 2616 Builder.defineMacro("__CYGWIN32__"); 2617 DefineStd(Builder, "unix", Opts); 2618 if (Opts.CPlusPlus) 2619 Builder.defineMacro("_GNU_SOURCE"); 2620 } 2621}; 2622} // end anonymous namespace 2623 2624namespace { 2625// x86-32 Haiku target 2626class HaikuX86_32TargetInfo : public X86_32TargetInfo { 2627public: 2628 HaikuX86_32TargetInfo(const std::string& triple) 2629 : X86_32TargetInfo(triple) { 2630 SizeType = UnsignedLong; 2631 IntPtrType = SignedLong; 2632 PtrDiffType = SignedLong; 2633 this->UserLabelPrefix = ""; 2634 } 2635 virtual void getTargetDefines(const LangOptions &Opts, 2636 MacroBuilder &Builder) const { 2637 X86_32TargetInfo::getTargetDefines(Opts, Builder); 2638 Builder.defineMacro("__INTEL__"); 2639 Builder.defineMacro("__HAIKU__"); 2640 } 2641}; 2642} // end anonymous namespace 2643 2644// RTEMS Target 2645template<typename Target> 2646class RTEMSTargetInfo : public OSTargetInfo<Target> { 2647protected: 2648 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 2649 MacroBuilder &Builder) const { 2650 // RTEMS defines; list based off of gcc output 2651 2652 Builder.defineMacro("__rtems__"); 2653 Builder.defineMacro("__ELF__"); 2654 } 2655public: 2656 RTEMSTargetInfo(const std::string &triple) 2657 : OSTargetInfo<Target>(triple) { 2658 this->UserLabelPrefix = ""; 2659 2660 llvm::Triple Triple(triple); 2661 switch (Triple.getArch()) { 2662 default: 2663 case llvm::Triple::x86: 2664 // this->MCountName = ".mcount"; 2665 break; 2666 case llvm::Triple::mips: 2667 case llvm::Triple::mipsel: 2668 case llvm::Triple::ppc: 2669 case llvm::Triple::ppc64: 2670 // this->MCountName = "_mcount"; 2671 break; 2672 case llvm::Triple::arm: 2673 // this->MCountName = "__mcount"; 2674 break; 2675 } 2676 2677 } 2678}; 2679 2680namespace { 2681// x86-32 RTEMS target 2682class RTEMSX86_32TargetInfo : public X86_32TargetInfo { 2683public: 2684 RTEMSX86_32TargetInfo(const std::string& triple) 2685 : X86_32TargetInfo(triple) { 2686 SizeType = UnsignedLong; 2687 IntPtrType = SignedLong; 2688 PtrDiffType = SignedLong; 2689 this->UserLabelPrefix = ""; 2690 } 2691 virtual void getTargetDefines(const LangOptions &Opts, 2692 MacroBuilder &Builder) const { 2693 X86_32TargetInfo::getTargetDefines(Opts, Builder); 2694 Builder.defineMacro("__INTEL__"); 2695 Builder.defineMacro("__rtems__"); 2696 } 2697}; 2698} // end anonymous namespace 2699 2700namespace { 2701// x86-64 generic target 2702class X86_64TargetInfo : public X86TargetInfo { 2703public: 2704 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) { 2705 LongWidth = LongAlign = PointerWidth = PointerAlign = 64; 2706 LongDoubleWidth = 128; 2707 LongDoubleAlign = 128; 2708 LargeArrayMinWidth = 128; 2709 LargeArrayAlign = 128; 2710 SuitableAlign = 128; 2711 IntMaxType = SignedLong; 2712 UIntMaxType = UnsignedLong; 2713 Int64Type = SignedLong; 2714 RegParmMax = 6; 2715 2716 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 2717 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-" 2718 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"; 2719 2720 // Use fpret only for long double. 2721 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble); 2722 2723 // Use fp2ret for _Complex long double. 2724 ComplexLongDoubleUsesFP2Ret = true; 2725 2726 // x86-64 has atomics up to 16 bytes. 2727 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128 2728 // on CPUs with cmpxchg16b 2729 MaxAtomicPromoteWidth = 128; 2730 MaxAtomicInlineWidth = 64; 2731 } 2732 virtual BuiltinVaListKind getBuiltinVaListKind() const { 2733 return TargetInfo::X86_64ABIBuiltinVaList; 2734 } 2735 2736 int getEHDataRegisterNumber(unsigned RegNo) const { 2737 if (RegNo == 0) return 0; 2738 if (RegNo == 1) return 1; 2739 return -1; 2740 } 2741 2742 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const { 2743 return TargetInfo::checkCallingConvention(CC); 2744 } 2745 2746 virtual CallingConv getDefaultCallingConv() const { 2747 return CC_Default; 2748 } 2749 2750}; 2751} // end anonymous namespace 2752 2753namespace { 2754// x86-64 Windows target 2755class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> { 2756public: 2757 WindowsX86_64TargetInfo(const std::string& triple) 2758 : WindowsTargetInfo<X86_64TargetInfo>(triple) { 2759 TLSSupported = false; 2760 WCharType = UnsignedShort; 2761 LongWidth = LongAlign = 32; 2762 DoubleAlign = LongLongAlign = 64; 2763 IntMaxType = SignedLongLong; 2764 UIntMaxType = UnsignedLongLong; 2765 Int64Type = SignedLongLong; 2766 SizeType = UnsignedLongLong; 2767 PtrDiffType = SignedLongLong; 2768 IntPtrType = SignedLongLong; 2769 this->UserLabelPrefix = ""; 2770 } 2771 virtual void getTargetDefines(const LangOptions &Opts, 2772 MacroBuilder &Builder) const { 2773 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder); 2774 Builder.defineMacro("_WIN64"); 2775 } 2776 virtual BuiltinVaListKind getBuiltinVaListKind() const { 2777 return TargetInfo::CharPtrBuiltinVaList; 2778 } 2779}; 2780} // end anonymous namespace 2781 2782namespace { 2783// x86-64 Windows Visual Studio target 2784class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo { 2785public: 2786 VisualStudioWindowsX86_64TargetInfo(const std::string& triple) 2787 : WindowsX86_64TargetInfo(triple) { 2788 LongDoubleWidth = LongDoubleAlign = 64; 2789 LongDoubleFormat = &llvm::APFloat::IEEEdouble; 2790 } 2791 virtual void getTargetDefines(const LangOptions &Opts, 2792 MacroBuilder &Builder) const { 2793 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder); 2794 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder); 2795 Builder.defineMacro("_M_X64"); 2796 Builder.defineMacro("_M_AMD64"); 2797 } 2798}; 2799} // end anonymous namespace 2800 2801namespace { 2802// x86-64 MinGW target 2803class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo { 2804public: 2805 MinGWX86_64TargetInfo(const std::string& triple) 2806 : WindowsX86_64TargetInfo(triple) { 2807 } 2808 virtual void getTargetDefines(const LangOptions &Opts, 2809 MacroBuilder &Builder) const { 2810 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder); 2811 DefineStd(Builder, "WIN64", Opts); 2812 Builder.defineMacro("__MSVCRT__"); 2813 Builder.defineMacro("__MINGW32__"); 2814 Builder.defineMacro("__MINGW64__"); 2815 2816 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)). 2817 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions. 2818 if (Opts.MicrosoftExt) 2819 // Provide "as-is" __declspec. 2820 Builder.defineMacro("__declspec", "__declspec"); 2821 else 2822 // Provide alias of __attribute__ like mingw32-gcc. 2823 Builder.defineMacro("__declspec(a)", "__attribute__((a))"); 2824 } 2825}; 2826} // end anonymous namespace 2827 2828namespace { 2829class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> { 2830public: 2831 DarwinX86_64TargetInfo(const std::string& triple) 2832 : DarwinTargetInfo<X86_64TargetInfo>(triple) { 2833 Int64Type = SignedLongLong; 2834 MaxVectorAlign = 256; 2835 } 2836}; 2837} // end anonymous namespace 2838 2839namespace { 2840class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> { 2841public: 2842 OpenBSDX86_64TargetInfo(const std::string& triple) 2843 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) { 2844 IntMaxType = SignedLongLong; 2845 UIntMaxType = UnsignedLongLong; 2846 Int64Type = SignedLongLong; 2847 } 2848}; 2849} // end anonymous namespace 2850 2851namespace { 2852class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> { 2853public: 2854 BitrigX86_64TargetInfo(const std::string& triple) 2855 : BitrigTargetInfo<X86_64TargetInfo>(triple) { 2856 IntMaxType = SignedLongLong; 2857 UIntMaxType = UnsignedLongLong; 2858 Int64Type = SignedLongLong; 2859 } 2860}; 2861} // end anonymous namespace 2862 2863namespace { 2864class ARMTargetInfo : public TargetInfo { 2865 // Possible FPU choices. 2866 enum FPUMode { 2867 VFP2FPU = (1 << 0), 2868 VFP3FPU = (1 << 1), 2869 VFP4FPU = (1 << 2), 2870 NeonFPU = (1 << 3) 2871 }; 2872 2873 static bool FPUModeIsVFP(FPUMode Mode) { 2874 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU); 2875 } 2876 2877 static const TargetInfo::GCCRegAlias GCCRegAliases[]; 2878 static const char * const GCCRegNames[]; 2879 2880 std::string ABI, CPU; 2881 2882 unsigned FPU : 4; 2883 2884 unsigned IsAAPCS : 1; 2885 unsigned IsThumb : 1; 2886 2887 // Initialized via features. 2888 unsigned SoftFloat : 1; 2889 unsigned SoftFloatABI : 1; 2890 2891 static const Builtin::Info BuiltinInfo[]; 2892 2893public: 2894 ARMTargetInfo(const std::string &TripleStr) 2895 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s"), IsAAPCS(true) 2896 { 2897 BigEndian = false; 2898 SizeType = UnsignedInt; 2899 PtrDiffType = SignedInt; 2900 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int. 2901 WCharType = UnsignedInt; 2902 2903 // {} in inline assembly are neon specifiers, not assembly variant 2904 // specifiers. 2905 NoAsmVariants = true; 2906 2907 // FIXME: Should we just treat this as a feature? 2908 IsThumb = getTriple().getArchName().startswith("thumb"); 2909 if (IsThumb) { 2910 // Thumb1 add sp, #imm requires the immediate value be multiple of 4, 2911 // so set preferred for small types to 32. 2912 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-" 2913 "i64:64:64-f32:32:32-f64:64:64-" 2914 "v64:64:64-v128:64:128-a0:0:32-n32-S64"); 2915 } else { 2916 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 2917 "i64:64:64-f32:32:32-f64:64:64-" 2918 "v64:64:64-v128:64:128-a0:0:64-n32-S64"); 2919 } 2920 2921 // ARM targets default to using the ARM C++ ABI. 2922 CXXABI = CXXABI_ARM; 2923 2924 // ARM has atomics up to 8 bytes 2925 // FIXME: Set MaxAtomicInlineWidth if we have the feature v6e 2926 MaxAtomicPromoteWidth = 64; 2927 2928 // Do force alignment of members that follow zero length bitfields. If 2929 // the alignment of the zero-length bitfield is greater than the member 2930 // that follows it, `bar', `bar' will be aligned as the type of the 2931 // zero length bitfield. 2932 UseZeroLengthBitfieldAlignment = true; 2933 } 2934 virtual const char *getABI() const { return ABI.c_str(); } 2935 virtual bool setABI(const std::string &Name) { 2936 ABI = Name; 2937 2938 // The defaults (above) are for AAPCS, check if we need to change them. 2939 // 2940 // FIXME: We need support for -meabi... we could just mangle it into the 2941 // name. 2942 if (Name == "apcs-gnu") { 2943 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32; 2944 SizeType = UnsignedLong; 2945 2946 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour. 2947 WCharType = SignedInt; 2948 2949 // Do not respect the alignment of bit-field types when laying out 2950 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc. 2951 UseBitFieldTypeAlignment = false; 2952 2953 /// gcc forces the alignment to 4 bytes, regardless of the type of the 2954 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in 2955 /// gcc. 2956 ZeroLengthBitfieldBoundary = 32; 2957 2958 IsAAPCS = false; 2959 2960 if (IsThumb) { 2961 // Thumb1 add sp, #imm requires the immediate value be multiple of 4, 2962 // so set preferred for small types to 32. 2963 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-" 2964 "i64:32:64-f32:32:32-f64:32:64-" 2965 "v64:32:64-v128:32:128-a0:0:32-n32-S32"); 2966 } else { 2967 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 2968 "i64:32:64-f32:32:32-f64:32:64-" 2969 "v64:32:64-v128:32:128-a0:0:32-n32-S32"); 2970 } 2971 2972 // FIXME: Override "preferred align" for double and long long. 2973 } else if (Name == "aapcs") { 2974 IsAAPCS = true; 2975 // FIXME: Enumerated types are variable width in straight AAPCS. 2976 } else if (Name == "aapcs-linux") { 2977 IsAAPCS = true; 2978 } else 2979 return false; 2980 2981 return true; 2982 } 2983 2984 void getDefaultFeatures(llvm::StringMap<bool> &Features) const { 2985 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore") 2986 Features["vfp2"] = true; 2987 else if (CPU == "cortex-a8" || CPU == "cortex-a15" || 2988 CPU == "cortex-a9" || CPU == "cortex-a9-mp") 2989 Features["neon"] = true; 2990 else if (CPU == "swift") { 2991 Features["vfp4"] = true; 2992 Features["neon"] = true; 2993 } 2994 } 2995 2996 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features, 2997 StringRef Name, 2998 bool Enabled) const { 2999 if (Name == "soft-float" || Name == "soft-float-abi" || 3000 Name == "vfp2" || Name == "vfp3" || Name == "vfp4" || Name == "neon" || 3001 Name == "d16" || Name == "neonfp") { 3002 Features[Name] = Enabled; 3003 } else 3004 return false; 3005 3006 return true; 3007 } 3008 3009 virtual void HandleTargetFeatures(std::vector<std::string> &Features) { 3010 FPU = 0; 3011 SoftFloat = SoftFloatABI = false; 3012 for (unsigned i = 0, e = Features.size(); i != e; ++i) { 3013 if (Features[i] == "+soft-float") 3014 SoftFloat = true; 3015 else if (Features[i] == "+soft-float-abi") 3016 SoftFloatABI = true; 3017 else if (Features[i] == "+vfp2") 3018 FPU |= VFP2FPU; 3019 else if (Features[i] == "+vfp3") 3020 FPU |= VFP3FPU; 3021 else if (Features[i] == "+vfp4") 3022 FPU |= VFP4FPU; 3023 else if (Features[i] == "+neon") 3024 FPU |= NeonFPU; 3025 } 3026 3027 // Remove front-end specific options which the backend handles differently. 3028 std::vector<std::string>::iterator it; 3029 it = std::find(Features.begin(), Features.end(), "+soft-float"); 3030 if (it != Features.end()) 3031 Features.erase(it); 3032 it = std::find(Features.begin(), Features.end(), "+soft-float-abi"); 3033 if (it != Features.end()) 3034 Features.erase(it); 3035 } 3036 3037 virtual bool hasFeature(StringRef Feature) const { 3038 return llvm::StringSwitch<bool>(Feature) 3039 .Case("arm", true) 3040 .Case("softfloat", SoftFloat) 3041 .Case("thumb", IsThumb) 3042 .Case("neon", FPU == NeonFPU && !SoftFloat && 3043 StringRef(getCPUDefineSuffix(CPU)).startswith("7")) 3044 .Default(false); 3045 } 3046 // FIXME: Should we actually have some table instead of these switches? 3047 static const char *getCPUDefineSuffix(StringRef Name) { 3048 return llvm::StringSwitch<const char*>(Name) 3049 .Cases("arm8", "arm810", "4") 3050 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4") 3051 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T") 3052 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T") 3053 .Case("ep9312", "4T") 3054 .Cases("arm10tdmi", "arm1020t", "5T") 3055 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE") 3056 .Case("arm926ej-s", "5TEJ") 3057 .Cases("arm10e", "arm1020e", "arm1022e", "5TE") 3058 .Cases("xscale", "iwmmxt", "5TE") 3059 .Case("arm1136j-s", "6J") 3060 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK") 3061 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K") 3062 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2") 3063 .Cases("cortex-a8", "cortex-a9", "cortex-a15", "7A") 3064 .Case("cortex-a9-mp", "7F") 3065 .Case("swift", "7S") 3066 .Cases("cortex-m3", "cortex-m4", "7M") 3067 .Case("cortex-m0", "6M") 3068 .Default(0); 3069 } 3070 static const char *getCPUProfile(StringRef Name) { 3071 return llvm::StringSwitch<const char*>(Name) 3072 .Cases("cortex-a8", "cortex-a9", "A") 3073 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M") 3074 .Default(""); 3075 } 3076 virtual bool setCPU(const std::string &Name) { 3077 if (!getCPUDefineSuffix(Name)) 3078 return false; 3079 3080 CPU = Name; 3081 return true; 3082 } 3083 virtual void getTargetDefines(const LangOptions &Opts, 3084 MacroBuilder &Builder) const { 3085 // Target identification. 3086 Builder.defineMacro("__arm"); 3087 Builder.defineMacro("__arm__"); 3088 3089 // Target properties. 3090 Builder.defineMacro("__ARMEL__"); 3091 Builder.defineMacro("__LITTLE_ENDIAN__"); 3092 Builder.defineMacro("__REGISTER_PREFIX__", ""); 3093 3094 StringRef CPUArch = getCPUDefineSuffix(CPU); 3095 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__"); 3096 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1)); 3097 StringRef CPUProfile = getCPUProfile(CPU); 3098 if (!CPUProfile.empty()) 3099 Builder.defineMacro("__ARM_ARCH_PROFILE", CPUProfile); 3100 3101 // Subtarget options. 3102 3103 // FIXME: It's more complicated than this and we don't really support 3104 // interworking. 3105 if ('5' <= CPUArch[0] && CPUArch[0] <= '7') 3106 Builder.defineMacro("__THUMB_INTERWORK__"); 3107 3108 if (ABI == "aapcs" || ABI == "aapcs-linux") { 3109 Builder.defineMacro("__ARM_EABI__"); 3110 Builder.defineMacro("__ARM_PCS", "1"); 3111 3112 if (!SoftFloat && !SoftFloatABI) 3113 Builder.defineMacro("__ARM_PCS_VFP", "1"); 3114 } 3115 3116 if (SoftFloat) 3117 Builder.defineMacro("__SOFTFP__"); 3118 3119 if (CPU == "xscale") 3120 Builder.defineMacro("__XSCALE__"); 3121 3122 bool IsARMv7 = CPUArch.startswith("7"); 3123 if (IsThumb) { 3124 Builder.defineMacro("__THUMBEL__"); 3125 Builder.defineMacro("__thumb__"); 3126 if (CPUArch == "6T2" || IsARMv7) 3127 Builder.defineMacro("__thumb2__"); 3128 } 3129 3130 // Note, this is always on in gcc, even though it doesn't make sense. 3131 Builder.defineMacro("__APCS_32__"); 3132 3133 if (FPUModeIsVFP((FPUMode) FPU)) { 3134 Builder.defineMacro("__VFP_FP__"); 3135 if (FPU & VFP2FPU) 3136 Builder.defineMacro("__ARM_VFPV2__"); 3137 if (FPU & VFP3FPU) 3138 Builder.defineMacro("__ARM_VFPV3__"); 3139 if (FPU & VFP4FPU) 3140 Builder.defineMacro("__ARM_VFPV4__"); 3141 } 3142 3143 // This only gets set when Neon instructions are actually available, unlike 3144 // the VFP define, hence the soft float and arch check. This is subtly 3145 // different from gcc, we follow the intent which was that it should be set 3146 // when Neon instructions are actually available. 3147 if ((FPU & NeonFPU) && !SoftFloat && IsARMv7) 3148 Builder.defineMacro("__ARM_NEON__"); 3149 } 3150 virtual void getTargetBuiltins(const Builtin::Info *&Records, 3151 unsigned &NumRecords) const { 3152 Records = BuiltinInfo; 3153 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin; 3154 } 3155 virtual bool isCLZForZeroUndef() const { return false; } 3156 virtual BuiltinVaListKind getBuiltinVaListKind() const { 3157 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList; 3158 } 3159 virtual void getGCCRegNames(const char * const *&Names, 3160 unsigned &NumNames) const; 3161 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 3162 unsigned &NumAliases) const; 3163 virtual bool validateAsmConstraint(const char *&Name, 3164 TargetInfo::ConstraintInfo &Info) const { 3165 switch (*Name) { 3166 default: break; 3167 case 'l': // r0-r7 3168 case 'h': // r8-r15 3169 case 'w': // VFP Floating point register single precision 3170 case 'P': // VFP Floating point register double precision 3171 Info.setAllowsRegister(); 3172 return true; 3173 case 'Q': // A memory address that is a single base register. 3174 Info.setAllowsMemory(); 3175 return true; 3176 case 'U': // a memory reference... 3177 switch (Name[1]) { 3178 case 'q': // ...ARMV4 ldrsb 3179 case 'v': // ...VFP load/store (reg+constant offset) 3180 case 'y': // ...iWMMXt load/store 3181 case 't': // address valid for load/store opaque types wider 3182 // than 128-bits 3183 case 'n': // valid address for Neon doubleword vector load/store 3184 case 'm': // valid address for Neon element and structure load/store 3185 case 's': // valid address for non-offset loads/stores of quad-word 3186 // values in four ARM registers 3187 Info.setAllowsMemory(); 3188 Name++; 3189 return true; 3190 } 3191 } 3192 return false; 3193 } 3194 virtual std::string convertConstraint(const char *&Constraint) const { 3195 std::string R; 3196 switch (*Constraint) { 3197 case 'U': // Two-character constraint; add "^" hint for later parsing. 3198 R = std::string("^") + std::string(Constraint, 2); 3199 Constraint++; 3200 break; 3201 case 'p': // 'p' should be translated to 'r' by default. 3202 R = std::string("r"); 3203 break; 3204 default: 3205 return std::string(1, *Constraint); 3206 } 3207 return R; 3208 } 3209 virtual const char *getClobbers() const { 3210 // FIXME: Is this really right? 3211 return ""; 3212 } 3213 3214 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const { 3215 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning; 3216 } 3217}; 3218 3219const char * const ARMTargetInfo::GCCRegNames[] = { 3220 // Integer registers 3221 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", 3222 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc", 3223 3224 // Float registers 3225 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", 3226 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15", 3227 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23", 3228 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31", 3229 3230 // Double registers 3231 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", 3232 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15", 3233 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23", 3234 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31", 3235 3236 // Quad registers 3237 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", 3238 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" 3239}; 3240 3241void ARMTargetInfo::getGCCRegNames(const char * const *&Names, 3242 unsigned &NumNames) const { 3243 Names = GCCRegNames; 3244 NumNames = llvm::array_lengthof(GCCRegNames); 3245} 3246 3247const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = { 3248 { { "a1" }, "r0" }, 3249 { { "a2" }, "r1" }, 3250 { { "a3" }, "r2" }, 3251 { { "a4" }, "r3" }, 3252 { { "v1" }, "r4" }, 3253 { { "v2" }, "r5" }, 3254 { { "v3" }, "r6" }, 3255 { { "v4" }, "r7" }, 3256 { { "v5" }, "r8" }, 3257 { { "v6", "rfp" }, "r9" }, 3258 { { "sl" }, "r10" }, 3259 { { "fp" }, "r11" }, 3260 { { "ip" }, "r12" }, 3261 { { "r13" }, "sp" }, 3262 { { "r14" }, "lr" }, 3263 { { "r15" }, "pc" }, 3264 // The S, D and Q registers overlap, but aren't really aliases; we 3265 // don't want to substitute one of these for a different-sized one. 3266}; 3267 3268void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases, 3269 unsigned &NumAliases) const { 3270 Aliases = GCCRegAliases; 3271 NumAliases = llvm::array_lengthof(GCCRegAliases); 3272} 3273 3274const Builtin::Info ARMTargetInfo::BuiltinInfo[] = { 3275#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES }, 3276#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\ 3277 ALL_LANGUAGES }, 3278#include "clang/Basic/BuiltinsARM.def" 3279}; 3280} // end anonymous namespace. 3281 3282namespace { 3283class DarwinARMTargetInfo : 3284 public DarwinTargetInfo<ARMTargetInfo> { 3285protected: 3286 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 3287 MacroBuilder &Builder) const { 3288 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion); 3289 } 3290 3291public: 3292 DarwinARMTargetInfo(const std::string& triple) 3293 : DarwinTargetInfo<ARMTargetInfo>(triple) { 3294 HasAlignMac68kSupport = true; 3295 // iOS always has 64-bit atomic instructions. 3296 // FIXME: This should be based off of the target features in ARMTargetInfo. 3297 MaxAtomicInlineWidth = 64; 3298 } 3299}; 3300} // end anonymous namespace. 3301 3302 3303namespace { 3304// Hexagon abstract base class 3305class HexagonTargetInfo : public TargetInfo { 3306 static const Builtin::Info BuiltinInfo[]; 3307 static const char * const GCCRegNames[]; 3308 static const TargetInfo::GCCRegAlias GCCRegAliases[]; 3309 std::string CPU; 3310public: 3311 HexagonTargetInfo(const std::string& triple) : TargetInfo(triple) { 3312 BigEndian = false; 3313 DescriptionString = ("e-p:32:32:32-" 3314 "i64:64:64-i32:32:32-i16:16:16-i1:32:32" 3315 "f64:64:64-f32:32:32-a0:0-n32"); 3316 3317 // {} in inline assembly are packet specifiers, not assembly variant 3318 // specifiers. 3319 NoAsmVariants = true; 3320 } 3321 3322 virtual void getTargetBuiltins(const Builtin::Info *&Records, 3323 unsigned &NumRecords) const { 3324 Records = BuiltinInfo; 3325 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin; 3326 } 3327 3328 virtual bool validateAsmConstraint(const char *&Name, 3329 TargetInfo::ConstraintInfo &Info) const { 3330 return true; 3331 } 3332 3333 virtual void getTargetDefines(const LangOptions &Opts, 3334 MacroBuilder &Builder) const; 3335 3336 virtual bool hasFeature(StringRef Feature) const { 3337 return Feature == "hexagon"; 3338 } 3339 3340 virtual BuiltinVaListKind getBuiltinVaListKind() const { 3341 return TargetInfo::CharPtrBuiltinVaList; 3342 } 3343 virtual void getGCCRegNames(const char * const *&Names, 3344 unsigned &NumNames) const; 3345 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 3346 unsigned &NumAliases) const; 3347 virtual const char *getClobbers() const { 3348 return ""; 3349 } 3350 3351 static const char *getHexagonCPUSuffix(StringRef Name) { 3352 return llvm::StringSwitch<const char*>(Name) 3353 .Case("hexagonv2", "2") 3354 .Case("hexagonv3", "3") 3355 .Case("hexagonv4", "4") 3356 .Case("hexagonv5", "5") 3357 .Default(0); 3358 } 3359 3360 virtual bool setCPU(const std::string &Name) { 3361 if (!getHexagonCPUSuffix(Name)) 3362 return false; 3363 3364 CPU = Name; 3365 return true; 3366 } 3367}; 3368 3369void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts, 3370 MacroBuilder &Builder) const { 3371 Builder.defineMacro("qdsp6"); 3372 Builder.defineMacro("__qdsp6", "1"); 3373 Builder.defineMacro("__qdsp6__", "1"); 3374 3375 Builder.defineMacro("hexagon"); 3376 Builder.defineMacro("__hexagon", "1"); 3377 Builder.defineMacro("__hexagon__", "1"); 3378 3379 if(CPU == "hexagonv1") { 3380 Builder.defineMacro("__HEXAGON_V1__"); 3381 Builder.defineMacro("__HEXAGON_ARCH__", "1"); 3382 if(Opts.HexagonQdsp6Compat) { 3383 Builder.defineMacro("__QDSP6_V1__"); 3384 Builder.defineMacro("__QDSP6_ARCH__", "1"); 3385 } 3386 } 3387 else if(CPU == "hexagonv2") { 3388 Builder.defineMacro("__HEXAGON_V2__"); 3389 Builder.defineMacro("__HEXAGON_ARCH__", "2"); 3390 if(Opts.HexagonQdsp6Compat) { 3391 Builder.defineMacro("__QDSP6_V2__"); 3392 Builder.defineMacro("__QDSP6_ARCH__", "2"); 3393 } 3394 } 3395 else if(CPU == "hexagonv3") { 3396 Builder.defineMacro("__HEXAGON_V3__"); 3397 Builder.defineMacro("__HEXAGON_ARCH__", "3"); 3398 if(Opts.HexagonQdsp6Compat) { 3399 Builder.defineMacro("__QDSP6_V3__"); 3400 Builder.defineMacro("__QDSP6_ARCH__", "3"); 3401 } 3402 } 3403 else if(CPU == "hexagonv4") { 3404 Builder.defineMacro("__HEXAGON_V4__"); 3405 Builder.defineMacro("__HEXAGON_ARCH__", "4"); 3406 if(Opts.HexagonQdsp6Compat) { 3407 Builder.defineMacro("__QDSP6_V4__"); 3408 Builder.defineMacro("__QDSP6_ARCH__", "4"); 3409 } 3410 } 3411 else if(CPU == "hexagonv5") { 3412 Builder.defineMacro("__HEXAGON_V5__"); 3413 Builder.defineMacro("__HEXAGON_ARCH__", "5"); 3414 if(Opts.HexagonQdsp6Compat) { 3415 Builder.defineMacro("__QDSP6_V5__"); 3416 Builder.defineMacro("__QDSP6_ARCH__", "5"); 3417 } 3418 } 3419} 3420 3421const char * const HexagonTargetInfo::GCCRegNames[] = { 3422 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", 3423 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", 3424 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", 3425 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31", 3426 "p0", "p1", "p2", "p3", 3427 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp" 3428}; 3429 3430void HexagonTargetInfo::getGCCRegNames(const char * const *&Names, 3431 unsigned &NumNames) const { 3432 Names = GCCRegNames; 3433 NumNames = llvm::array_lengthof(GCCRegNames); 3434} 3435 3436 3437const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = { 3438 { { "sp" }, "r29" }, 3439 { { "fp" }, "r30" }, 3440 { { "lr" }, "r31" }, 3441 }; 3442 3443void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases, 3444 unsigned &NumAliases) const { 3445 Aliases = GCCRegAliases; 3446 NumAliases = llvm::array_lengthof(GCCRegAliases); 3447} 3448 3449 3450const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = { 3451#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES }, 3452#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\ 3453 ALL_LANGUAGES }, 3454#include "clang/Basic/BuiltinsHexagon.def" 3455}; 3456} 3457 3458 3459namespace { 3460class SparcV8TargetInfo : public TargetInfo { 3461 static const TargetInfo::GCCRegAlias GCCRegAliases[]; 3462 static const char * const GCCRegNames[]; 3463 bool SoftFloat; 3464public: 3465 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) { 3466 // FIXME: Support Sparc quad-precision long double? 3467 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 3468 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32"; 3469 } 3470 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features, 3471 StringRef Name, 3472 bool Enabled) const { 3473 if (Name == "soft-float") 3474 Features[Name] = Enabled; 3475 else 3476 return false; 3477 3478 return true; 3479 } 3480 virtual void HandleTargetFeatures(std::vector<std::string> &Features) { 3481 SoftFloat = false; 3482 for (unsigned i = 0, e = Features.size(); i != e; ++i) 3483 if (Features[i] == "+soft-float") 3484 SoftFloat = true; 3485 } 3486 virtual void getTargetDefines(const LangOptions &Opts, 3487 MacroBuilder &Builder) const { 3488 DefineStd(Builder, "sparc", Opts); 3489 Builder.defineMacro("__sparcv8"); 3490 Builder.defineMacro("__REGISTER_PREFIX__", ""); 3491 3492 if (SoftFloat) 3493 Builder.defineMacro("SOFT_FLOAT", "1"); 3494 } 3495 3496 virtual bool hasFeature(StringRef Feature) const { 3497 return llvm::StringSwitch<bool>(Feature) 3498 .Case("softfloat", SoftFloat) 3499 .Case("sparc", true) 3500 .Default(false); 3501 } 3502 3503 virtual void getTargetBuiltins(const Builtin::Info *&Records, 3504 unsigned &NumRecords) const { 3505 // FIXME: Implement! 3506 } 3507 virtual BuiltinVaListKind getBuiltinVaListKind() const { 3508 return TargetInfo::VoidPtrBuiltinVaList; 3509 } 3510 virtual void getGCCRegNames(const char * const *&Names, 3511 unsigned &NumNames) const; 3512 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 3513 unsigned &NumAliases) const; 3514 virtual bool validateAsmConstraint(const char *&Name, 3515 TargetInfo::ConstraintInfo &info) const { 3516 // FIXME: Implement! 3517 return false; 3518 } 3519 virtual const char *getClobbers() const { 3520 // FIXME: Implement! 3521 return ""; 3522 } 3523}; 3524 3525const char * const SparcV8TargetInfo::GCCRegNames[] = { 3526 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", 3527 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", 3528 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", 3529 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31" 3530}; 3531 3532void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names, 3533 unsigned &NumNames) const { 3534 Names = GCCRegNames; 3535 NumNames = llvm::array_lengthof(GCCRegNames); 3536} 3537 3538const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = { 3539 { { "g0" }, "r0" }, 3540 { { "g1" }, "r1" }, 3541 { { "g2" }, "r2" }, 3542 { { "g3" }, "r3" }, 3543 { { "g4" }, "r4" }, 3544 { { "g5" }, "r5" }, 3545 { { "g6" }, "r6" }, 3546 { { "g7" }, "r7" }, 3547 { { "o0" }, "r8" }, 3548 { { "o1" }, "r9" }, 3549 { { "o2" }, "r10" }, 3550 { { "o3" }, "r11" }, 3551 { { "o4" }, "r12" }, 3552 { { "o5" }, "r13" }, 3553 { { "o6", "sp" }, "r14" }, 3554 { { "o7" }, "r15" }, 3555 { { "l0" }, "r16" }, 3556 { { "l1" }, "r17" }, 3557 { { "l2" }, "r18" }, 3558 { { "l3" }, "r19" }, 3559 { { "l4" }, "r20" }, 3560 { { "l5" }, "r21" }, 3561 { { "l6" }, "r22" }, 3562 { { "l7" }, "r23" }, 3563 { { "i0" }, "r24" }, 3564 { { "i1" }, "r25" }, 3565 { { "i2" }, "r26" }, 3566 { { "i3" }, "r27" }, 3567 { { "i4" }, "r28" }, 3568 { { "i5" }, "r29" }, 3569 { { "i6", "fp" }, "r30" }, 3570 { { "i7" }, "r31" }, 3571}; 3572 3573void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases, 3574 unsigned &NumAliases) const { 3575 Aliases = GCCRegAliases; 3576 NumAliases = llvm::array_lengthof(GCCRegAliases); 3577} 3578} // end anonymous namespace. 3579 3580namespace { 3581class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> { 3582public: 3583 AuroraUXSparcV8TargetInfo(const std::string& triple) : 3584 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) { 3585 SizeType = UnsignedInt; 3586 PtrDiffType = SignedInt; 3587 } 3588}; 3589class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> { 3590public: 3591 SolarisSparcV8TargetInfo(const std::string& triple) : 3592 SolarisTargetInfo<SparcV8TargetInfo>(triple) { 3593 SizeType = UnsignedInt; 3594 PtrDiffType = SignedInt; 3595 } 3596}; 3597} // end anonymous namespace. 3598 3599namespace { 3600 class MSP430TargetInfo : public TargetInfo { 3601 static const char * const GCCRegNames[]; 3602 public: 3603 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) { 3604 BigEndian = false; 3605 TLSSupported = false; 3606 IntWidth = 16; IntAlign = 16; 3607 LongWidth = 32; LongLongWidth = 64; 3608 LongAlign = LongLongAlign = 16; 3609 PointerWidth = 16; PointerAlign = 16; 3610 SuitableAlign = 16; 3611 SizeType = UnsignedInt; 3612 IntMaxType = SignedLong; 3613 UIntMaxType = UnsignedLong; 3614 IntPtrType = SignedShort; 3615 PtrDiffType = SignedInt; 3616 SigAtomicType = SignedLong; 3617 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16"; 3618 } 3619 virtual void getTargetDefines(const LangOptions &Opts, 3620 MacroBuilder &Builder) const { 3621 Builder.defineMacro("MSP430"); 3622 Builder.defineMacro("__MSP430__"); 3623 // FIXME: defines for different 'flavours' of MCU 3624 } 3625 virtual void getTargetBuiltins(const Builtin::Info *&Records, 3626 unsigned &NumRecords) const { 3627 // FIXME: Implement. 3628 Records = 0; 3629 NumRecords = 0; 3630 } 3631 virtual bool hasFeature(StringRef Feature) const { 3632 return Feature == "msp430"; 3633 } 3634 virtual void getGCCRegNames(const char * const *&Names, 3635 unsigned &NumNames) const; 3636 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 3637 unsigned &NumAliases) const { 3638 // No aliases. 3639 Aliases = 0; 3640 NumAliases = 0; 3641 } 3642 virtual bool validateAsmConstraint(const char *&Name, 3643 TargetInfo::ConstraintInfo &info) const { 3644 // No target constraints for now. 3645 return false; 3646 } 3647 virtual const char *getClobbers() const { 3648 // FIXME: Is this really right? 3649 return ""; 3650 } 3651 virtual BuiltinVaListKind getBuiltinVaListKind() const { 3652 // FIXME: implement 3653 return TargetInfo::CharPtrBuiltinVaList; 3654 } 3655 }; 3656 3657 const char * const MSP430TargetInfo::GCCRegNames[] = { 3658 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", 3659 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15" 3660 }; 3661 3662 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names, 3663 unsigned &NumNames) const { 3664 Names = GCCRegNames; 3665 NumNames = llvm::array_lengthof(GCCRegNames); 3666 } 3667} 3668 3669namespace { 3670 3671 // LLVM and Clang cannot be used directly to output native binaries for 3672 // target, but is used to compile C code to llvm bitcode with correct 3673 // type and alignment information. 3674 // 3675 // TCE uses the llvm bitcode as input and uses it for generating customized 3676 // target processor and program binary. TCE co-design environment is 3677 // publicly available in http://tce.cs.tut.fi 3678 3679 static const unsigned TCEOpenCLAddrSpaceMap[] = { 3680 3, // opencl_global 3681 4, // opencl_local 3682 5, // opencl_constant 3683 0, // cuda_device 3684 0, // cuda_constant 3685 0 // cuda_shared 3686 }; 3687 3688 class TCETargetInfo : public TargetInfo{ 3689 public: 3690 TCETargetInfo(const std::string& triple) : TargetInfo(triple) { 3691 TLSSupported = false; 3692 IntWidth = 32; 3693 LongWidth = LongLongWidth = 32; 3694 PointerWidth = 32; 3695 IntAlign = 32; 3696 LongAlign = LongLongAlign = 32; 3697 PointerAlign = 32; 3698 SuitableAlign = 32; 3699 SizeType = UnsignedInt; 3700 IntMaxType = SignedLong; 3701 UIntMaxType = UnsignedLong; 3702 IntPtrType = SignedInt; 3703 PtrDiffType = SignedInt; 3704 FloatWidth = 32; 3705 FloatAlign = 32; 3706 DoubleWidth = 32; 3707 DoubleAlign = 32; 3708 LongDoubleWidth = 32; 3709 LongDoubleAlign = 32; 3710 FloatFormat = &llvm::APFloat::IEEEsingle; 3711 DoubleFormat = &llvm::APFloat::IEEEsingle; 3712 LongDoubleFormat = &llvm::APFloat::IEEEsingle; 3713 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-" 3714 "i16:16:32-i32:32:32-i64:32:32-" 3715 "f32:32:32-f64:32:32-v64:32:32-" 3716 "v128:32:32-a0:0:32-n32"; 3717 AddrSpaceMap = &TCEOpenCLAddrSpaceMap; 3718 } 3719 3720 virtual void getTargetDefines(const LangOptions &Opts, 3721 MacroBuilder &Builder) const { 3722 DefineStd(Builder, "tce", Opts); 3723 Builder.defineMacro("__TCE__"); 3724 Builder.defineMacro("__TCE_V1__"); 3725 } 3726 virtual bool hasFeature(StringRef Feature) const { 3727 return Feature == "tce"; 3728 } 3729 3730 virtual void getTargetBuiltins(const Builtin::Info *&Records, 3731 unsigned &NumRecords) const {} 3732 virtual const char *getClobbers() const { 3733 return ""; 3734 } 3735 virtual BuiltinVaListKind getBuiltinVaListKind() const { 3736 return TargetInfo::VoidPtrBuiltinVaList; 3737 } 3738 virtual void getGCCRegNames(const char * const *&Names, 3739 unsigned &NumNames) const {} 3740 virtual bool validateAsmConstraint(const char *&Name, 3741 TargetInfo::ConstraintInfo &info) const { 3742 return true; 3743 } 3744 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 3745 unsigned &NumAliases) const {} 3746 }; 3747} 3748 3749namespace { 3750class MipsTargetInfoBase : public TargetInfo { 3751 static const Builtin::Info BuiltinInfo[]; 3752 std::string CPU; 3753 bool IsMips16; 3754 enum MipsFloatABI { 3755 HardFloat, SingleFloat, SoftFloat 3756 } FloatABI; 3757 enum DspRevEnum { 3758 NoDSP, DSP1, DSP2 3759 } DspRev; 3760 3761protected: 3762 std::string ABI; 3763 3764public: 3765 MipsTargetInfoBase(const std::string& triple, 3766 const std::string& ABIStr, 3767 const std::string& CPUStr) 3768 : TargetInfo(triple), 3769 CPU(CPUStr), 3770 IsMips16(false), 3771 FloatABI(HardFloat), 3772 DspRev(NoDSP), 3773 ABI(ABIStr) 3774 {} 3775 3776 virtual const char *getABI() const { return ABI.c_str(); } 3777 virtual bool setABI(const std::string &Name) = 0; 3778 virtual bool setCPU(const std::string &Name) { 3779 CPU = Name; 3780 return true; 3781 } 3782 void getDefaultFeatures(llvm::StringMap<bool> &Features) const { 3783 Features[ABI] = true; 3784 Features[CPU] = true; 3785 } 3786 3787 virtual void getTargetDefines(const LangOptions &Opts, 3788 MacroBuilder &Builder) const { 3789 DefineStd(Builder, "mips", Opts); 3790 Builder.defineMacro("_mips"); 3791 Builder.defineMacro("__REGISTER_PREFIX__", ""); 3792 3793 switch (FloatABI) { 3794 case HardFloat: 3795 Builder.defineMacro("__mips_hard_float", Twine(1)); 3796 break; 3797 case SingleFloat: 3798 Builder.defineMacro("__mips_hard_float", Twine(1)); 3799 Builder.defineMacro("__mips_single_float", Twine(1)); 3800 break; 3801 case SoftFloat: 3802 Builder.defineMacro("__mips_soft_float", Twine(1)); 3803 break; 3804 } 3805 3806 if (IsMips16) 3807 Builder.defineMacro("__mips16", Twine(1)); 3808 3809 switch (DspRev) { 3810 default: 3811 break; 3812 case DSP1: 3813 Builder.defineMacro("__mips_dsp_rev", Twine(1)); 3814 Builder.defineMacro("__mips_dsp", Twine(1)); 3815 break; 3816 case DSP2: 3817 Builder.defineMacro("__mips_dsp_rev", Twine(2)); 3818 Builder.defineMacro("__mips_dspr2", Twine(1)); 3819 Builder.defineMacro("__mips_dsp", Twine(1)); 3820 break; 3821 } 3822 3823 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0))); 3824 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth())); 3825 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth())); 3826 3827 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\""); 3828 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper()); 3829 } 3830 3831 virtual void getTargetBuiltins(const Builtin::Info *&Records, 3832 unsigned &NumRecords) const { 3833 Records = BuiltinInfo; 3834 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin; 3835 } 3836 virtual bool hasFeature(StringRef Feature) const { 3837 return Feature == "mips"; 3838 } 3839 virtual BuiltinVaListKind getBuiltinVaListKind() const { 3840 return TargetInfo::VoidPtrBuiltinVaList; 3841 } 3842 virtual void getGCCRegNames(const char * const *&Names, 3843 unsigned &NumNames) const { 3844 static const char * const GCCRegNames[] = { 3845 // CPU register names 3846 // Must match second column of GCCRegAliases 3847 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7", 3848 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", 3849 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23", 3850 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31", 3851 // Floating point register names 3852 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7", 3853 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15", 3854 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23", 3855 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31", 3856 // Hi/lo and condition register names 3857 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4", 3858 "$fcc5","$fcc6","$fcc7" 3859 }; 3860 Names = GCCRegNames; 3861 NumNames = llvm::array_lengthof(GCCRegNames); 3862 } 3863 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 3864 unsigned &NumAliases) const = 0; 3865 virtual bool validateAsmConstraint(const char *&Name, 3866 TargetInfo::ConstraintInfo &Info) const { 3867 switch (*Name) { 3868 default: 3869 return false; 3870 3871 case 'r': // CPU registers. 3872 case 'd': // Equivalent to "r" unless generating MIPS16 code. 3873 case 'y': // Equivalent to "r", backwards compatibility only. 3874 case 'f': // floating-point registers. 3875 case 'c': // $25 for indirect jumps 3876 case 'l': // lo register 3877 case 'x': // hilo register pair 3878 Info.setAllowsRegister(); 3879 return true; 3880 } 3881 } 3882 3883 virtual const char *getClobbers() const { 3884 // FIXME: Implement! 3885 return ""; 3886 } 3887 3888 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features, 3889 StringRef Name, 3890 bool Enabled) const { 3891 if (Name == "soft-float" || Name == "single-float" || 3892 Name == "o32" || Name == "n32" || Name == "n64" || Name == "eabi" || 3893 Name == "mips32" || Name == "mips32r2" || 3894 Name == "mips64" || Name == "mips64r2" || 3895 Name == "mips16" || Name == "dsp" || Name == "dspr2") { 3896 Features[Name] = Enabled; 3897 return true; 3898 } 3899 return false; 3900 } 3901 3902 virtual void HandleTargetFeatures(std::vector<std::string> &Features) { 3903 IsMips16 = false; 3904 FloatABI = HardFloat; 3905 DspRev = NoDSP; 3906 3907 for (std::vector<std::string>::iterator it = Features.begin(), 3908 ie = Features.end(); it != ie; ++it) { 3909 if (*it == "+single-float") 3910 FloatABI = SingleFloat; 3911 else if (*it == "+soft-float") 3912 FloatABI = SoftFloat; 3913 else if (*it == "+mips16") 3914 IsMips16 = true; 3915 else if (*it == "+dsp") 3916 DspRev = std::max(DspRev, DSP1); 3917 else if (*it == "+dspr2") 3918 DspRev = std::max(DspRev, DSP2); 3919 } 3920 3921 // Remove front-end specific option. 3922 std::vector<std::string>::iterator it = 3923 std::find(Features.begin(), Features.end(), "+soft-float"); 3924 if (it != Features.end()) 3925 Features.erase(it); 3926 } 3927}; 3928 3929const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = { 3930#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES }, 3931#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\ 3932 ALL_LANGUAGES }, 3933#include "clang/Basic/BuiltinsMips.def" 3934}; 3935 3936class Mips32TargetInfoBase : public MipsTargetInfoBase { 3937public: 3938 Mips32TargetInfoBase(const std::string& triple) : 3939 MipsTargetInfoBase(triple, "o32", "mips32") { 3940 SizeType = UnsignedInt; 3941 PtrDiffType = SignedInt; 3942 } 3943 virtual bool setABI(const std::string &Name) { 3944 if ((Name == "o32") || (Name == "eabi")) { 3945 ABI = Name; 3946 return true; 3947 } else 3948 return false; 3949 } 3950 virtual void getTargetDefines(const LangOptions &Opts, 3951 MacroBuilder &Builder) const { 3952 MipsTargetInfoBase::getTargetDefines(Opts, Builder); 3953 3954 if (ABI == "o32") { 3955 Builder.defineMacro("__mips_o32"); 3956 Builder.defineMacro("_ABIO32", "1"); 3957 Builder.defineMacro("_MIPS_SIM", "_ABIO32"); 3958 } 3959 else if (ABI == "eabi") 3960 Builder.defineMacro("__mips_eabi"); 3961 else 3962 llvm_unreachable("Invalid ABI for Mips32."); 3963 } 3964 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 3965 unsigned &NumAliases) const { 3966 static const TargetInfo::GCCRegAlias GCCRegAliases[] = { 3967 { { "at" }, "$1" }, 3968 { { "v0" }, "$2" }, 3969 { { "v1" }, "$3" }, 3970 { { "a0" }, "$4" }, 3971 { { "a1" }, "$5" }, 3972 { { "a2" }, "$6" }, 3973 { { "a3" }, "$7" }, 3974 { { "t0" }, "$8" }, 3975 { { "t1" }, "$9" }, 3976 { { "t2" }, "$10" }, 3977 { { "t3" }, "$11" }, 3978 { { "t4" }, "$12" }, 3979 { { "t5" }, "$13" }, 3980 { { "t6" }, "$14" }, 3981 { { "t7" }, "$15" }, 3982 { { "s0" }, "$16" }, 3983 { { "s1" }, "$17" }, 3984 { { "s2" }, "$18" }, 3985 { { "s3" }, "$19" }, 3986 { { "s4" }, "$20" }, 3987 { { "s5" }, "$21" }, 3988 { { "s6" }, "$22" }, 3989 { { "s7" }, "$23" }, 3990 { { "t8" }, "$24" }, 3991 { { "t9" }, "$25" }, 3992 { { "k0" }, "$26" }, 3993 { { "k1" }, "$27" }, 3994 { { "gp" }, "$28" }, 3995 { { "sp","$sp" }, "$29" }, 3996 { { "fp","$fp" }, "$30" }, 3997 { { "ra" }, "$31" } 3998 }; 3999 Aliases = GCCRegAliases; 4000 NumAliases = llvm::array_lengthof(GCCRegAliases); 4001 } 4002}; 4003 4004class Mips32EBTargetInfo : public Mips32TargetInfoBase { 4005public: 4006 Mips32EBTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) { 4007 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-" 4008 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32"; 4009 } 4010 virtual void getTargetDefines(const LangOptions &Opts, 4011 MacroBuilder &Builder) const { 4012 DefineStd(Builder, "MIPSEB", Opts); 4013 Builder.defineMacro("_MIPSEB"); 4014 Mips32TargetInfoBase::getTargetDefines(Opts, Builder); 4015 } 4016}; 4017 4018class Mips32ELTargetInfo : public Mips32TargetInfoBase { 4019public: 4020 Mips32ELTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) { 4021 BigEndian = false; 4022 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-" 4023 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32"; 4024 } 4025 virtual void getTargetDefines(const LangOptions &Opts, 4026 MacroBuilder &Builder) const { 4027 DefineStd(Builder, "MIPSEL", Opts); 4028 Builder.defineMacro("_MIPSEL"); 4029 Mips32TargetInfoBase::getTargetDefines(Opts, Builder); 4030 } 4031}; 4032 4033class Mips64TargetInfoBase : public MipsTargetInfoBase { 4034 virtual void SetDescriptionString(const std::string &Name) = 0; 4035public: 4036 Mips64TargetInfoBase(const std::string& triple) : 4037 MipsTargetInfoBase(triple, "n64", "mips64") { 4038 LongWidth = LongAlign = 64; 4039 PointerWidth = PointerAlign = 64; 4040 LongDoubleWidth = LongDoubleAlign = 128; 4041 LongDoubleFormat = &llvm::APFloat::IEEEquad; 4042 SuitableAlign = 128; 4043 } 4044 virtual bool setABI(const std::string &Name) { 4045 SetDescriptionString(Name); 4046 4047 if (Name != "n32" && Name != "n64") 4048 return false; 4049 4050 ABI = Name; 4051 4052 if (Name == "n32") { 4053 LongWidth = LongAlign = 32; 4054 PointerWidth = PointerAlign = 32; 4055 } 4056 4057 return true; 4058 } 4059 virtual void getTargetDefines(const LangOptions &Opts, 4060 MacroBuilder &Builder) const { 4061 MipsTargetInfoBase::getTargetDefines(Opts, Builder); 4062 4063 Builder.defineMacro("__mips64"); 4064 Builder.defineMacro("__mips64__"); 4065 4066 if (ABI == "n32") { 4067 Builder.defineMacro("__mips_n32"); 4068 Builder.defineMacro("_ABIN32", "2"); 4069 Builder.defineMacro("_MIPS_SIM", "_ABIN32"); 4070 } 4071 else if (ABI == "n64") { 4072 Builder.defineMacro("__mips_n64"); 4073 Builder.defineMacro("_ABI64", "3"); 4074 Builder.defineMacro("_MIPS_SIM", "_ABI64"); 4075 } 4076 else 4077 llvm_unreachable("Invalid ABI for Mips64."); 4078 } 4079 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 4080 unsigned &NumAliases) const { 4081 static const TargetInfo::GCCRegAlias GCCRegAliases[] = { 4082 { { "at" }, "$1" }, 4083 { { "v0" }, "$2" }, 4084 { { "v1" }, "$3" }, 4085 { { "a0" }, "$4" }, 4086 { { "a1" }, "$5" }, 4087 { { "a2" }, "$6" }, 4088 { { "a3" }, "$7" }, 4089 { { "a4" }, "$8" }, 4090 { { "a5" }, "$9" }, 4091 { { "a6" }, "$10" }, 4092 { { "a7" }, "$11" }, 4093 { { "t0" }, "$12" }, 4094 { { "t1" }, "$13" }, 4095 { { "t2" }, "$14" }, 4096 { { "t3" }, "$15" }, 4097 { { "s0" }, "$16" }, 4098 { { "s1" }, "$17" }, 4099 { { "s2" }, "$18" }, 4100 { { "s3" }, "$19" }, 4101 { { "s4" }, "$20" }, 4102 { { "s5" }, "$21" }, 4103 { { "s6" }, "$22" }, 4104 { { "s7" }, "$23" }, 4105 { { "t8" }, "$24" }, 4106 { { "t9" }, "$25" }, 4107 { { "k0" }, "$26" }, 4108 { { "k1" }, "$27" }, 4109 { { "gp" }, "$28" }, 4110 { { "sp","$sp" }, "$29" }, 4111 { { "fp","$fp" }, "$30" }, 4112 { { "ra" }, "$31" } 4113 }; 4114 Aliases = GCCRegAliases; 4115 NumAliases = llvm::array_lengthof(GCCRegAliases); 4116 } 4117}; 4118 4119class Mips64EBTargetInfo : public Mips64TargetInfoBase { 4120 virtual void SetDescriptionString(const std::string &Name) { 4121 // Change DescriptionString only if ABI is n32. 4122 if (Name == "n32") 4123 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-" 4124 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-" 4125 "v64:64:64-n32"; 4126 } 4127public: 4128 Mips64EBTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) { 4129 // Default ABI is n64. 4130 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:32-i16:16:32-i32:32:32-" 4131 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-" 4132 "v64:64:64-n32"; 4133 } 4134 virtual void getTargetDefines(const LangOptions &Opts, 4135 MacroBuilder &Builder) const { 4136 DefineStd(Builder, "MIPSEB", Opts); 4137 Builder.defineMacro("_MIPSEB"); 4138 Mips64TargetInfoBase::getTargetDefines(Opts, Builder); 4139 } 4140}; 4141 4142class Mips64ELTargetInfo : public Mips64TargetInfoBase { 4143 virtual void SetDescriptionString(const std::string &Name) { 4144 // Change DescriptionString only if ABI is n32. 4145 if (Name == "n32") 4146 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-" 4147 "i64:64:64-f32:32:32-f64:64:64-f128:128:128" 4148 "-v64:64:64-n32"; 4149 } 4150public: 4151 Mips64ELTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) { 4152 // Default ABI is n64. 4153 BigEndian = false; 4154 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:32-i16:16:32-i32:32:32-" 4155 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-" 4156 "v64:64:64-n32"; 4157 } 4158 virtual void getTargetDefines(const LangOptions &Opts, 4159 MacroBuilder &Builder) const { 4160 DefineStd(Builder, "MIPSEL", Opts); 4161 Builder.defineMacro("_MIPSEL"); 4162 Mips64TargetInfoBase::getTargetDefines(Opts, Builder); 4163 } 4164}; 4165} // end anonymous namespace. 4166 4167namespace { 4168class PNaClTargetInfo : public TargetInfo { 4169public: 4170 PNaClTargetInfo(const std::string& triple) : TargetInfo(triple) { 4171 BigEndian = false; 4172 this->UserLabelPrefix = ""; 4173 this->LongAlign = 32; 4174 this->LongWidth = 32; 4175 this->PointerAlign = 32; 4176 this->PointerWidth = 32; 4177 this->IntMaxType = TargetInfo::SignedLongLong; 4178 this->UIntMaxType = TargetInfo::UnsignedLongLong; 4179 this->Int64Type = TargetInfo::SignedLongLong; 4180 this->DoubleAlign = 64; 4181 this->LongDoubleWidth = 64; 4182 this->LongDoubleAlign = 64; 4183 this->SizeType = TargetInfo::UnsignedInt; 4184 this->PtrDiffType = TargetInfo::SignedInt; 4185 this->IntPtrType = TargetInfo::SignedInt; 4186 this->RegParmMax = 2; 4187 DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-" 4188 "f32:32:32-f64:64:64-p:32:32:32-v128:32:32"; 4189 } 4190 4191 void getDefaultFeatures(llvm::StringMap<bool> &Features) const { 4192 } 4193 virtual void getArchDefines(const LangOptions &Opts, 4194 MacroBuilder &Builder) const { 4195 Builder.defineMacro("__le32__"); 4196 Builder.defineMacro("__pnacl__"); 4197 } 4198 virtual void getTargetDefines(const LangOptions &Opts, 4199 MacroBuilder &Builder) const { 4200 DefineStd(Builder, "unix", Opts); 4201 Builder.defineMacro("__ELF__"); 4202 if (Opts.POSIXThreads) 4203 Builder.defineMacro("_REENTRANT"); 4204 if (Opts.CPlusPlus) 4205 Builder.defineMacro("_GNU_SOURCE"); 4206 4207 Builder.defineMacro("__LITTLE_ENDIAN__"); 4208 Builder.defineMacro("__native_client__"); 4209 getArchDefines(Opts, Builder); 4210 } 4211 virtual bool hasFeature(StringRef Feature) const { 4212 return Feature == "pnacl"; 4213 } 4214 virtual void getTargetBuiltins(const Builtin::Info *&Records, 4215 unsigned &NumRecords) const { 4216 } 4217 virtual BuiltinVaListKind getBuiltinVaListKind() const { 4218 return TargetInfo::PNaClABIBuiltinVaList; 4219 } 4220 virtual void getGCCRegNames(const char * const *&Names, 4221 unsigned &NumNames) const; 4222 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 4223 unsigned &NumAliases) const; 4224 virtual bool validateAsmConstraint(const char *&Name, 4225 TargetInfo::ConstraintInfo &Info) const { 4226 return false; 4227 } 4228 4229 virtual const char *getClobbers() const { 4230 return ""; 4231 } 4232}; 4233 4234void PNaClTargetInfo::getGCCRegNames(const char * const *&Names, 4235 unsigned &NumNames) const { 4236 Names = NULL; 4237 NumNames = 0; 4238} 4239 4240void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases, 4241 unsigned &NumAliases) const { 4242 Aliases = NULL; 4243 NumAliases = 0; 4244} 4245} // end anonymous namespace. 4246 4247 4248//===----------------------------------------------------------------------===// 4249// Driver code 4250//===----------------------------------------------------------------------===// 4251 4252static TargetInfo *AllocateTarget(const std::string &T) { 4253 llvm::Triple Triple(T); 4254 llvm::Triple::OSType os = Triple.getOS(); 4255 4256 switch (Triple.getArch()) { 4257 default: 4258 return NULL; 4259 4260 case llvm::Triple::hexagon: 4261 return new HexagonTargetInfo(T); 4262 4263 case llvm::Triple::arm: 4264 case llvm::Triple::thumb: 4265 if (Triple.isOSDarwin()) 4266 return new DarwinARMTargetInfo(T); 4267 4268 switch (os) { 4269 case llvm::Triple::Linux: 4270 return new LinuxTargetInfo<ARMTargetInfo>(T); 4271 case llvm::Triple::FreeBSD: 4272 return new FreeBSDTargetInfo<ARMTargetInfo>(T); 4273 case llvm::Triple::NetBSD: 4274 return new NetBSDTargetInfo<ARMTargetInfo>(T); 4275 case llvm::Triple::OpenBSD: 4276 return new OpenBSDTargetInfo<ARMTargetInfo>(T); 4277 case llvm::Triple::Bitrig: 4278 return new BitrigTargetInfo<ARMTargetInfo>(T); 4279 case llvm::Triple::RTEMS: 4280 return new RTEMSTargetInfo<ARMTargetInfo>(T); 4281 default: 4282 return new ARMTargetInfo(T); 4283 } 4284 4285 case llvm::Triple::msp430: 4286 return new MSP430TargetInfo(T); 4287 4288 case llvm::Triple::mips: 4289 switch (os) { 4290 case llvm::Triple::Linux: 4291 return new LinuxTargetInfo<Mips32EBTargetInfo>(T); 4292 case llvm::Triple::RTEMS: 4293 return new RTEMSTargetInfo<Mips32EBTargetInfo>(T); 4294 case llvm::Triple::FreeBSD: 4295 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(T); 4296 case llvm::Triple::NetBSD: 4297 return new NetBSDTargetInfo<Mips32EBTargetInfo>(T); 4298 default: 4299 return new Mips32EBTargetInfo(T); 4300 } 4301 4302 case llvm::Triple::mipsel: 4303 switch (os) { 4304 case llvm::Triple::Linux: 4305 return new LinuxTargetInfo<Mips32ELTargetInfo>(T); 4306 case llvm::Triple::RTEMS: 4307 return new RTEMSTargetInfo<Mips32ELTargetInfo>(T); 4308 case llvm::Triple::FreeBSD: 4309 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(T); 4310 case llvm::Triple::NetBSD: 4311 return new NetBSDTargetInfo<Mips32ELTargetInfo>(T); 4312 default: 4313 return new Mips32ELTargetInfo(T); 4314 } 4315 4316 case llvm::Triple::mips64: 4317 switch (os) { 4318 case llvm::Triple::Linux: 4319 return new LinuxTargetInfo<Mips64EBTargetInfo>(T); 4320 case llvm::Triple::RTEMS: 4321 return new RTEMSTargetInfo<Mips64EBTargetInfo>(T); 4322 case llvm::Triple::FreeBSD: 4323 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(T); 4324 case llvm::Triple::NetBSD: 4325 return new NetBSDTargetInfo<Mips64EBTargetInfo>(T); 4326 case llvm::Triple::OpenBSD: 4327 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(T); 4328 default: 4329 return new Mips64EBTargetInfo(T); 4330 } 4331 4332 case llvm::Triple::mips64el: 4333 switch (os) { 4334 case llvm::Triple::Linux: 4335 return new LinuxTargetInfo<Mips64ELTargetInfo>(T); 4336 case llvm::Triple::RTEMS: 4337 return new RTEMSTargetInfo<Mips64ELTargetInfo>(T); 4338 case llvm::Triple::FreeBSD: 4339 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(T); 4340 case llvm::Triple::NetBSD: 4341 return new NetBSDTargetInfo<Mips64ELTargetInfo>(T); 4342 case llvm::Triple::OpenBSD: 4343 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(T); 4344 default: 4345 return new Mips64ELTargetInfo(T); 4346 } 4347 4348 case llvm::Triple::le32: 4349 switch (os) { 4350 case llvm::Triple::NativeClient: 4351 return new PNaClTargetInfo(T); 4352 default: 4353 return NULL; 4354 } 4355 4356 case llvm::Triple::ppc: 4357 if (Triple.isOSDarwin()) 4358 return new DarwinPPC32TargetInfo(T); 4359 switch (os) { 4360 case llvm::Triple::Linux: 4361 return new LinuxTargetInfo<PPC32TargetInfo>(T); 4362 case llvm::Triple::FreeBSD: 4363 return new FreeBSDTargetInfo<PPC32TargetInfo>(T); 4364 case llvm::Triple::NetBSD: 4365 return new NetBSDTargetInfo<PPC32TargetInfo>(T); 4366 case llvm::Triple::OpenBSD: 4367 return new OpenBSDTargetInfo<PPC32TargetInfo>(T); 4368 case llvm::Triple::RTEMS: 4369 return new RTEMSTargetInfo<PPC32TargetInfo>(T); 4370 default: 4371 return new PPC32TargetInfo(T); 4372 } 4373 4374 case llvm::Triple::ppc64: 4375 if (Triple.isOSDarwin()) 4376 return new DarwinPPC64TargetInfo(T); 4377 switch (os) { 4378 case llvm::Triple::Linux: 4379 return new LinuxTargetInfo<PPC64TargetInfo>(T); 4380 case llvm::Triple::Lv2: 4381 return new PS3PPUTargetInfo<PPC64TargetInfo>(T); 4382 case llvm::Triple::FreeBSD: 4383 return new FreeBSDTargetInfo<PPC64TargetInfo>(T); 4384 case llvm::Triple::NetBSD: 4385 return new NetBSDTargetInfo<PPC64TargetInfo>(T); 4386 default: 4387 return new PPC64TargetInfo(T); 4388 } 4389 4390 case llvm::Triple::nvptx: 4391 return new NVPTX32TargetInfo(T); 4392 case llvm::Triple::nvptx64: 4393 return new NVPTX64TargetInfo(T); 4394 4395 case llvm::Triple::mblaze: 4396 return new MBlazeTargetInfo(T); 4397 4398 case llvm::Triple::sparc: 4399 switch (os) { 4400 case llvm::Triple::Linux: 4401 return new LinuxTargetInfo<SparcV8TargetInfo>(T); 4402 case llvm::Triple::AuroraUX: 4403 return new AuroraUXSparcV8TargetInfo(T); 4404 case llvm::Triple::Solaris: 4405 return new SolarisSparcV8TargetInfo(T); 4406 case llvm::Triple::NetBSD: 4407 return new NetBSDTargetInfo<SparcV8TargetInfo>(T); 4408 case llvm::Triple::OpenBSD: 4409 return new OpenBSDTargetInfo<SparcV8TargetInfo>(T); 4410 case llvm::Triple::RTEMS: 4411 return new RTEMSTargetInfo<SparcV8TargetInfo>(T); 4412 default: 4413 return new SparcV8TargetInfo(T); 4414 } 4415 4416 // FIXME: Need a real SPU target. 4417 case llvm::Triple::cellspu: 4418 return new PS3SPUTargetInfo<PPC64TargetInfo>(T); 4419 4420 case llvm::Triple::tce: 4421 return new TCETargetInfo(T); 4422 4423 case llvm::Triple::x86: 4424 if (Triple.isOSDarwin()) 4425 return new DarwinI386TargetInfo(T); 4426 4427 switch (os) { 4428 case llvm::Triple::AuroraUX: 4429 return new AuroraUXTargetInfo<X86_32TargetInfo>(T); 4430 case llvm::Triple::Linux: 4431 return new LinuxTargetInfo<X86_32TargetInfo>(T); 4432 case llvm::Triple::DragonFly: 4433 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T); 4434 case llvm::Triple::NetBSD: 4435 return new NetBSDI386TargetInfo(T); 4436 case llvm::Triple::OpenBSD: 4437 return new OpenBSDI386TargetInfo(T); 4438 case llvm::Triple::Bitrig: 4439 return new BitrigI386TargetInfo(T); 4440 case llvm::Triple::FreeBSD: 4441 return new FreeBSDTargetInfo<X86_32TargetInfo>(T); 4442 case llvm::Triple::Minix: 4443 return new MinixTargetInfo<X86_32TargetInfo>(T); 4444 case llvm::Triple::Solaris: 4445 return new SolarisTargetInfo<X86_32TargetInfo>(T); 4446 case llvm::Triple::Cygwin: 4447 return new CygwinX86_32TargetInfo(T); 4448 case llvm::Triple::MinGW32: 4449 return new MinGWX86_32TargetInfo(T); 4450 case llvm::Triple::Win32: 4451 return new VisualStudioWindowsX86_32TargetInfo(T); 4452 case llvm::Triple::Haiku: 4453 return new HaikuX86_32TargetInfo(T); 4454 case llvm::Triple::RTEMS: 4455 return new RTEMSX86_32TargetInfo(T); 4456 default: 4457 return new X86_32TargetInfo(T); 4458 } 4459 4460 case llvm::Triple::x86_64: 4461 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO) 4462 return new DarwinX86_64TargetInfo(T); 4463 4464 switch (os) { 4465 case llvm::Triple::AuroraUX: 4466 return new AuroraUXTargetInfo<X86_64TargetInfo>(T); 4467 case llvm::Triple::Linux: 4468 return new LinuxTargetInfo<X86_64TargetInfo>(T); 4469 case llvm::Triple::DragonFly: 4470 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T); 4471 case llvm::Triple::NetBSD: 4472 return new NetBSDTargetInfo<X86_64TargetInfo>(T); 4473 case llvm::Triple::OpenBSD: 4474 return new OpenBSDX86_64TargetInfo(T); 4475 case llvm::Triple::Bitrig: 4476 return new BitrigX86_64TargetInfo(T); 4477 case llvm::Triple::FreeBSD: 4478 return new FreeBSDTargetInfo<X86_64TargetInfo>(T); 4479 case llvm::Triple::Solaris: 4480 return new SolarisTargetInfo<X86_64TargetInfo>(T); 4481 case llvm::Triple::MinGW32: 4482 return new MinGWX86_64TargetInfo(T); 4483 case llvm::Triple::Win32: // This is what Triple.h supports now. 4484 return new VisualStudioWindowsX86_64TargetInfo(T); 4485 default: 4486 return new X86_64TargetInfo(T); 4487 } 4488 } 4489} 4490 4491/// CreateTargetInfo - Return the target info object for the specified target 4492/// triple. 4493TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags, 4494 TargetOptions &Opts) { 4495 llvm::Triple Triple(Opts.Triple); 4496 4497 // Construct the target 4498 OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str())); 4499 if (!Target) { 4500 Diags.Report(diag::err_target_unknown_triple) << Triple.str(); 4501 return 0; 4502 } 4503 4504 // Set the target CPU if specified. 4505 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) { 4506 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU; 4507 return 0; 4508 } 4509 4510 // Set the target ABI if specified. 4511 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) { 4512 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI; 4513 return 0; 4514 } 4515 4516 // Set the target C++ ABI. 4517 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) { 4518 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI; 4519 return 0; 4520 } 4521 4522 // Compute the default target features, we need the target to handle this 4523 // because features may have dependencies on one another. 4524 llvm::StringMap<bool> Features; 4525 Target->getDefaultFeatures(Features); 4526 4527 // Apply the user specified deltas. 4528 // First the enables. 4529 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(), 4530 ie = Opts.Features.end(); it != ie; ++it) { 4531 const char *Name = it->c_str(); 4532 4533 if (Name[0] != '+') 4534 continue; 4535 4536 // Apply the feature via the target. 4537 if (!Target->setFeatureEnabled(Features, Name + 1, true)) { 4538 Diags.Report(diag::err_target_invalid_feature) << Name; 4539 return 0; 4540 } 4541 } 4542 4543 // Then the disables. 4544 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(), 4545 ie = Opts.Features.end(); it != ie; ++it) { 4546 const char *Name = it->c_str(); 4547 4548 if (Name[0] == '+') 4549 continue; 4550 4551 // Apply the feature via the target. 4552 if (Name[0] != '-' || 4553 !Target->setFeatureEnabled(Features, Name + 1, false)) { 4554 Diags.Report(diag::err_target_invalid_feature) << Name; 4555 return 0; 4556 } 4557 } 4558 4559 // Add the features to the compile options. 4560 // 4561 // FIXME: If we are completely confident that we have the right set, we only 4562 // need to pass the minuses. 4563 Opts.Features.clear(); 4564 for (llvm::StringMap<bool>::const_iterator it = Features.begin(), 4565 ie = Features.end(); it != ie; ++it) 4566 Opts.Features.push_back((it->second ? "+" : "-") + it->first().str()); 4567 Target->HandleTargetFeatures(Opts.Features); 4568 4569 return Target.take(); 4570} 4571