Targets.cpp revision 82bfa19fe3be324b13fdbcda46304b52c500f0d4
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 1364 /// \brief Enumeration of all of the X86 CPUs supported by Clang. 1365 /// 1366 /// Each enumeration represents a particular CPU supported by Clang. These 1367 /// loosely correspond to the options passed to '-march' or '-mtune' flags. 1368 enum CPUKind { 1369 CK_Generic, 1370 1371 /// \name i386 1372 /// i386-generation processors. 1373 //@{ 1374 CK_i386, 1375 //@} 1376 1377 /// \name i486 1378 /// i486-generation processors. 1379 //@{ 1380 CK_i486, 1381 CK_WinChipC6, 1382 CK_WinChip2, 1383 CK_C3, 1384 //@} 1385 1386 /// \name i586 1387 /// i586-generation processors, P5 microarchitecture based. 1388 //@{ 1389 CK_i586, 1390 CK_Pentium, 1391 CK_PentiumMMX, 1392 //@} 1393 1394 /// \name i686 1395 /// i686-generation processors, P6 / Pentium M microarchitecture based. 1396 //@{ 1397 CK_i686, 1398 CK_PentiumPro, 1399 CK_Pentium2, 1400 CK_Pentium3, 1401 CK_Pentium3M, 1402 CK_PentiumM, 1403 CK_C3_2, 1404 1405 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah. 1406 /// Clang however has some logic to suport this. 1407 // FIXME: Warn, deprecate, and potentially remove this. 1408 CK_Yonah, 1409 //@} 1410 1411 /// \name Netburst 1412 /// Netburst microarchitecture based processors. 1413 //@{ 1414 CK_Pentium4, 1415 CK_Pentium4M, 1416 CK_Prescott, 1417 CK_Nocona, 1418 //@} 1419 1420 /// \name Core 1421 /// Core microarchitecture based processors. 1422 //@{ 1423 CK_Core2, 1424 1425 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another 1426 /// codename which GCC no longer accepts as an option to -march, but Clang 1427 /// has some logic for recognizing it. 1428 // FIXME: Warn, deprecate, and potentially remove this. 1429 CK_Penryn, 1430 //@} 1431 1432 /// \name Atom 1433 /// Atom processors 1434 //@{ 1435 CK_Atom, 1436 //@} 1437 1438 /// \name Nehalem 1439 /// Nehalem microarchitecture based processors. 1440 //@{ 1441 CK_Corei7, 1442 CK_Corei7AVX, 1443 CK_CoreAVXi, 1444 CK_CoreAVX2, 1445 //@} 1446 1447 /// \name K6 1448 /// K6 architecture processors. 1449 //@{ 1450 CK_K6, 1451 CK_K6_2, 1452 CK_K6_3, 1453 //@} 1454 1455 /// \name K7 1456 /// K7 architecture processors. 1457 //@{ 1458 CK_Athlon, 1459 CK_AthlonThunderbird, 1460 CK_Athlon4, 1461 CK_AthlonXP, 1462 CK_AthlonMP, 1463 //@} 1464 1465 /// \name K8 1466 /// K8 architecture processors. 1467 //@{ 1468 CK_Athlon64, 1469 CK_Athlon64SSE3, 1470 CK_AthlonFX, 1471 CK_K8, 1472 CK_K8SSE3, 1473 CK_Opteron, 1474 CK_OpteronSSE3, 1475 CK_AMDFAM10, 1476 //@} 1477 1478 /// \name Bobcat 1479 /// Bobcat architecture processors. 1480 //@{ 1481 CK_BTVER1, 1482 //@} 1483 1484 /// \name Bulldozer 1485 /// Bulldozer architecture processors. 1486 //@{ 1487 CK_BDVER1, 1488 CK_BDVER2, 1489 //@} 1490 1491 /// This specification is deprecated and will be removed in the future. 1492 /// Users should prefer \see CK_K8. 1493 // FIXME: Warn on this when the CPU is set to it. 1494 CK_x86_64, 1495 //@} 1496 1497 /// \name Geode 1498 /// Geode processors. 1499 //@{ 1500 CK_Geode 1501 //@} 1502 } CPU; 1503 1504public: 1505 X86TargetInfo(const std::string& triple) 1506 : TargetInfo(triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow), 1507 HasAES(false), HasPCLMUL(false), HasLZCNT(false), HasRDRND(false), 1508 HasBMI(false), HasBMI2(false), HasPOPCNT(false), HasSSE4a(false), 1509 HasFMA4(false), HasFMA(false), HasXOP(false), CPU(CK_Generic) { 1510 BigEndian = false; 1511 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended; 1512 } 1513 virtual unsigned getFloatEvalMethod() const { 1514 // X87 evaluates with 80 bits "long double" precision. 1515 return SSELevel == NoSSE ? 2 : 0; 1516 } 1517 virtual void getTargetBuiltins(const Builtin::Info *&Records, 1518 unsigned &NumRecords) const { 1519 Records = BuiltinInfo; 1520 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin; 1521 } 1522 virtual void getGCCRegNames(const char * const *&Names, 1523 unsigned &NumNames) const { 1524 Names = GCCRegNames; 1525 NumNames = llvm::array_lengthof(GCCRegNames); 1526 } 1527 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 1528 unsigned &NumAliases) const { 1529 Aliases = 0; 1530 NumAliases = 0; 1531 } 1532 virtual void getGCCAddlRegNames(const AddlRegName *&Names, 1533 unsigned &NumNames) const { 1534 Names = AddlRegNames; 1535 NumNames = llvm::array_lengthof(AddlRegNames); 1536 } 1537 virtual bool validateAsmConstraint(const char *&Name, 1538 TargetInfo::ConstraintInfo &info) const; 1539 virtual std::string convertConstraint(const char *&Constraint) const; 1540 virtual const char *getClobbers() const { 1541 return "~{dirflag},~{fpsr},~{flags}"; 1542 } 1543 virtual void getTargetDefines(const LangOptions &Opts, 1544 MacroBuilder &Builder) const; 1545 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features, 1546 StringRef Name, 1547 bool Enabled) const; 1548 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const; 1549 virtual bool hasFeature(StringRef Feature) const; 1550 virtual void HandleTargetFeatures(std::vector<std::string> &Features); 1551 virtual const char* getABI() const { 1552 if (PointerWidth == 64 && SSELevel >= AVX) 1553 return "avx"; 1554 else if (PointerWidth == 32 && MMX3DNowLevel == NoMMX3DNow) 1555 return "no-mmx"; 1556 return ""; 1557 } 1558 virtual bool setCPU(const std::string &Name) { 1559 CPU = llvm::StringSwitch<CPUKind>(Name) 1560 .Case("i386", CK_i386) 1561 .Case("i486", CK_i486) 1562 .Case("winchip-c6", CK_WinChipC6) 1563 .Case("winchip2", CK_WinChip2) 1564 .Case("c3", CK_C3) 1565 .Case("i586", CK_i586) 1566 .Case("pentium", CK_Pentium) 1567 .Case("pentium-mmx", CK_PentiumMMX) 1568 .Case("i686", CK_i686) 1569 .Case("pentiumpro", CK_PentiumPro) 1570 .Case("pentium2", CK_Pentium2) 1571 .Case("pentium3", CK_Pentium3) 1572 .Case("pentium3m", CK_Pentium3M) 1573 .Case("pentium-m", CK_PentiumM) 1574 .Case("c3-2", CK_C3_2) 1575 .Case("yonah", CK_Yonah) 1576 .Case("pentium4", CK_Pentium4) 1577 .Case("pentium4m", CK_Pentium4M) 1578 .Case("prescott", CK_Prescott) 1579 .Case("nocona", CK_Nocona) 1580 .Case("core2", CK_Core2) 1581 .Case("penryn", CK_Penryn) 1582 .Case("atom", CK_Atom) 1583 .Case("corei7", CK_Corei7) 1584 .Case("corei7-avx", CK_Corei7AVX) 1585 .Case("core-avx-i", CK_CoreAVXi) 1586 .Case("core-avx2", CK_CoreAVX2) 1587 .Case("k6", CK_K6) 1588 .Case("k6-2", CK_K6_2) 1589 .Case("k6-3", CK_K6_3) 1590 .Case("athlon", CK_Athlon) 1591 .Case("athlon-tbird", CK_AthlonThunderbird) 1592 .Case("athlon-4", CK_Athlon4) 1593 .Case("athlon-xp", CK_AthlonXP) 1594 .Case("athlon-mp", CK_AthlonMP) 1595 .Case("athlon64", CK_Athlon64) 1596 .Case("athlon64-sse3", CK_Athlon64SSE3) 1597 .Case("athlon-fx", CK_AthlonFX) 1598 .Case("k8", CK_K8) 1599 .Case("k8-sse3", CK_K8SSE3) 1600 .Case("opteron", CK_Opteron) 1601 .Case("opteron-sse3", CK_OpteronSSE3) 1602 .Case("amdfam10", CK_AMDFAM10) 1603 .Case("btver1", CK_BTVER1) 1604 .Case("bdver1", CK_BDVER1) 1605 .Case("bdver2", CK_BDVER2) 1606 .Case("x86-64", CK_x86_64) 1607 .Case("geode", CK_Geode) 1608 .Default(CK_Generic); 1609 1610 // Perform any per-CPU checks necessary to determine if this CPU is 1611 // acceptable. 1612 // FIXME: This results in terrible diagnostics. Clang just says the CPU is 1613 // invalid without explaining *why*. 1614 switch (CPU) { 1615 case CK_Generic: 1616 // No processor selected! 1617 return false; 1618 1619 case CK_i386: 1620 case CK_i486: 1621 case CK_WinChipC6: 1622 case CK_WinChip2: 1623 case CK_C3: 1624 case CK_i586: 1625 case CK_Pentium: 1626 case CK_PentiumMMX: 1627 case CK_i686: 1628 case CK_PentiumPro: 1629 case CK_Pentium2: 1630 case CK_Pentium3: 1631 case CK_Pentium3M: 1632 case CK_PentiumM: 1633 case CK_Yonah: 1634 case CK_C3_2: 1635 case CK_Pentium4: 1636 case CK_Pentium4M: 1637 case CK_Prescott: 1638 case CK_K6: 1639 case CK_K6_2: 1640 case CK_K6_3: 1641 case CK_Athlon: 1642 case CK_AthlonThunderbird: 1643 case CK_Athlon4: 1644 case CK_AthlonXP: 1645 case CK_AthlonMP: 1646 case CK_Geode: 1647 // Only accept certain architectures when compiling in 32-bit mode. 1648 if (PointerWidth != 32) 1649 return false; 1650 1651 // Fallthrough 1652 case CK_Nocona: 1653 case CK_Core2: 1654 case CK_Penryn: 1655 case CK_Atom: 1656 case CK_Corei7: 1657 case CK_Corei7AVX: 1658 case CK_CoreAVXi: 1659 case CK_CoreAVX2: 1660 case CK_Athlon64: 1661 case CK_Athlon64SSE3: 1662 case CK_AthlonFX: 1663 case CK_K8: 1664 case CK_K8SSE3: 1665 case CK_Opteron: 1666 case CK_OpteronSSE3: 1667 case CK_AMDFAM10: 1668 case CK_BTVER1: 1669 case CK_BDVER1: 1670 case CK_BDVER2: 1671 case CK_x86_64: 1672 return true; 1673 } 1674 llvm_unreachable("Unhandled CPU kind"); 1675 } 1676 1677 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const { 1678 // We accept all non-ARM calling conventions 1679 return (CC == CC_X86ThisCall || 1680 CC == CC_X86FastCall || 1681 CC == CC_X86StdCall || 1682 CC == CC_C || 1683 CC == CC_X86Pascal) ? CCCR_OK : CCCR_Warning; 1684 } 1685 1686 virtual CallingConv getDefaultCallingConv() const { 1687 return CC_C; 1688 } 1689}; 1690 1691void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const { 1692 // FIXME: This should not be here. 1693 Features["3dnow"] = false; 1694 Features["3dnowa"] = false; 1695 Features["mmx"] = false; 1696 Features["sse"] = false; 1697 Features["sse2"] = false; 1698 Features["sse3"] = false; 1699 Features["ssse3"] = false; 1700 Features["sse41"] = false; 1701 Features["sse42"] = false; 1702 Features["sse4a"] = false; 1703 Features["aes"] = false; 1704 Features["pclmul"] = false; 1705 Features["avx"] = false; 1706 Features["avx2"] = false; 1707 Features["lzcnt"] = false; 1708 Features["rdrand"] = false; 1709 Features["bmi"] = false; 1710 Features["bmi2"] = false; 1711 Features["popcnt"] = false; 1712 Features["fma4"] = false; 1713 Features["fma"] = false; 1714 Features["xop"] = false; 1715 1716 // FIXME: This *really* should not be here. 1717 1718 // X86_64 always has SSE2. 1719 if (PointerWidth == 64) 1720 Features["sse2"] = Features["sse"] = Features["mmx"] = true; 1721 1722 switch (CPU) { 1723 case CK_Generic: 1724 case CK_i386: 1725 case CK_i486: 1726 case CK_i586: 1727 case CK_Pentium: 1728 case CK_i686: 1729 case CK_PentiumPro: 1730 break; 1731 case CK_PentiumMMX: 1732 case CK_Pentium2: 1733 setFeatureEnabled(Features, "mmx", true); 1734 break; 1735 case CK_Pentium3: 1736 case CK_Pentium3M: 1737 setFeatureEnabled(Features, "mmx", true); 1738 setFeatureEnabled(Features, "sse", true); 1739 break; 1740 case CK_PentiumM: 1741 case CK_Pentium4: 1742 case CK_Pentium4M: 1743 case CK_x86_64: 1744 setFeatureEnabled(Features, "mmx", true); 1745 setFeatureEnabled(Features, "sse2", true); 1746 break; 1747 case CK_Yonah: 1748 case CK_Prescott: 1749 case CK_Nocona: 1750 setFeatureEnabled(Features, "mmx", true); 1751 setFeatureEnabled(Features, "sse3", true); 1752 break; 1753 case CK_Core2: 1754 setFeatureEnabled(Features, "mmx", true); 1755 setFeatureEnabled(Features, "ssse3", true); 1756 break; 1757 case CK_Penryn: 1758 setFeatureEnabled(Features, "mmx", true); 1759 setFeatureEnabled(Features, "sse4.1", true); 1760 break; 1761 case CK_Atom: 1762 setFeatureEnabled(Features, "mmx", true); 1763 setFeatureEnabled(Features, "ssse3", true); 1764 break; 1765 case CK_Corei7: 1766 setFeatureEnabled(Features, "mmx", true); 1767 setFeatureEnabled(Features, "sse4", true); 1768 break; 1769 case CK_Corei7AVX: 1770 setFeatureEnabled(Features, "mmx", true); 1771 setFeatureEnabled(Features, "avx", true); 1772 setFeatureEnabled(Features, "aes", true); 1773 setFeatureEnabled(Features, "pclmul", true); 1774 break; 1775 case CK_CoreAVXi: 1776 setFeatureEnabled(Features, "mmx", true); 1777 setFeatureEnabled(Features, "avx", true); 1778 setFeatureEnabled(Features, "aes", true); 1779 setFeatureEnabled(Features, "pclmul", true); 1780 setFeatureEnabled(Features, "rdrnd", true); 1781 break; 1782 case CK_CoreAVX2: 1783 setFeatureEnabled(Features, "mmx", true); 1784 setFeatureEnabled(Features, "avx2", true); 1785 setFeatureEnabled(Features, "aes", true); 1786 setFeatureEnabled(Features, "pclmul", true); 1787 setFeatureEnabled(Features, "lzcnt", true); 1788 setFeatureEnabled(Features, "rdrnd", true); 1789 setFeatureEnabled(Features, "bmi", true); 1790 setFeatureEnabled(Features, "bmi2", true); 1791 setFeatureEnabled(Features, "fma", true); 1792 break; 1793 case CK_K6: 1794 case CK_WinChipC6: 1795 setFeatureEnabled(Features, "mmx", true); 1796 break; 1797 case CK_K6_2: 1798 case CK_K6_3: 1799 case CK_WinChip2: 1800 case CK_C3: 1801 setFeatureEnabled(Features, "3dnow", true); 1802 break; 1803 case CK_Athlon: 1804 case CK_AthlonThunderbird: 1805 case CK_Geode: 1806 setFeatureEnabled(Features, "3dnowa", true); 1807 break; 1808 case CK_Athlon4: 1809 case CK_AthlonXP: 1810 case CK_AthlonMP: 1811 setFeatureEnabled(Features, "sse", true); 1812 setFeatureEnabled(Features, "3dnowa", true); 1813 break; 1814 case CK_K8: 1815 case CK_Opteron: 1816 case CK_Athlon64: 1817 case CK_AthlonFX: 1818 setFeatureEnabled(Features, "sse2", true); 1819 setFeatureEnabled(Features, "3dnowa", true); 1820 break; 1821 case CK_K8SSE3: 1822 case CK_OpteronSSE3: 1823 case CK_Athlon64SSE3: 1824 setFeatureEnabled(Features, "sse3", true); 1825 setFeatureEnabled(Features, "3dnowa", true); 1826 break; 1827 case CK_AMDFAM10: 1828 setFeatureEnabled(Features, "sse3", true); 1829 setFeatureEnabled(Features, "sse4a", true); 1830 setFeatureEnabled(Features, "3dnowa", true); 1831 break; 1832 case CK_BTVER1: 1833 setFeatureEnabled(Features, "ssse3", true); 1834 setFeatureEnabled(Features, "sse4a", true); 1835 break; 1836 case CK_BDVER1: 1837 case CK_BDVER2: 1838 setFeatureEnabled(Features, "avx", true); 1839 setFeatureEnabled(Features, "xop", true); 1840 setFeatureEnabled(Features, "aes", true); 1841 setFeatureEnabled(Features, "pclmul", true); 1842 break; 1843 case CK_C3_2: 1844 setFeatureEnabled(Features, "mmx", true); 1845 setFeatureEnabled(Features, "sse", true); 1846 break; 1847 } 1848} 1849 1850bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features, 1851 StringRef Name, 1852 bool Enabled) const { 1853 // FIXME: This *really* should not be here. We need some way of translating 1854 // options into llvm subtarget features. 1855 if (!Features.count(Name) && 1856 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1" && 1857 Name != "rdrnd")) 1858 return false; 1859 1860 // FIXME: this should probably use a switch with fall through. 1861 1862 if (Enabled) { 1863 if (Name == "mmx") 1864 Features["mmx"] = true; 1865 else if (Name == "sse") 1866 Features["mmx"] = Features["sse"] = true; 1867 else if (Name == "sse2") 1868 Features["mmx"] = Features["sse"] = Features["sse2"] = true; 1869 else if (Name == "sse3") 1870 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] = 1871 true; 1872 else if (Name == "ssse3") 1873 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] = 1874 Features["ssse3"] = true; 1875 else if (Name == "sse4" || Name == "sse4.2") 1876 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] = 1877 Features["ssse3"] = Features["sse41"] = Features["sse42"] = 1878 Features["popcnt"] = true; 1879 else if (Name == "sse4.1") 1880 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] = 1881 Features["ssse3"] = Features["sse41"] = true; 1882 else if (Name == "3dnow") 1883 Features["mmx"] = Features["3dnow"] = true; 1884 else if (Name == "3dnowa") 1885 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = true; 1886 else if (Name == "aes") 1887 Features["sse"] = Features["sse2"] = Features["aes"] = true; 1888 else if (Name == "pclmul") 1889 Features["sse"] = Features["sse2"] = Features["pclmul"] = true; 1890 else if (Name == "avx") 1891 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] = 1892 Features["ssse3"] = Features["sse41"] = Features["sse42"] = 1893 Features["popcnt"] = Features["avx"] = true; 1894 else if (Name == "avx2") 1895 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] = 1896 Features["ssse3"] = Features["sse41"] = Features["sse42"] = 1897 Features["popcnt"] = Features["avx"] = Features["avx2"] = true; 1898 else if (Name == "fma") 1899 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] = 1900 Features["ssse3"] = Features["sse41"] = Features["sse42"] = 1901 Features["popcnt"] = Features["avx"] = Features["fma"] = true; 1902 else if (Name == "fma4") 1903 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] = 1904 Features["ssse3"] = Features["sse41"] = Features["sse42"] = 1905 Features["popcnt"] = Features["avx"] = Features["sse4a"] = 1906 Features["fma4"] = true; 1907 else if (Name == "xop") 1908 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] = 1909 Features["ssse3"] = Features["sse41"] = Features["sse42"] = 1910 Features["popcnt"] = Features["avx"] = Features["sse4a"] = 1911 Features["fma4"] = Features["xop"] = true; 1912 else if (Name == "sse4a") 1913 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] = 1914 Features["sse4a"] = true; 1915 else if (Name == "lzcnt") 1916 Features["lzcnt"] = true; 1917 else if (Name == "rdrnd") 1918 Features["rdrand"] = true; 1919 else if (Name == "bmi") 1920 Features["bmi"] = true; 1921 else if (Name == "bmi2") 1922 Features["bmi2"] = true; 1923 else if (Name == "popcnt") 1924 Features["popcnt"] = true; 1925 } else { 1926 if (Name == "mmx") 1927 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = false; 1928 else if (Name == "sse") 1929 Features["sse"] = Features["sse2"] = Features["sse3"] = 1930 Features["ssse3"] = Features["sse41"] = Features["sse42"] = 1931 Features["sse4a"] = Features["avx"] = Features["avx2"] = 1932 Features["fma"] = Features["fma4"] = Features["aes"] = 1933 Features["pclmul"] = Features["xop"] = false; 1934 else if (Name == "sse2") 1935 Features["sse2"] = Features["sse3"] = Features["ssse3"] = 1936 Features["sse41"] = Features["sse42"] = Features["sse4a"] = 1937 Features["avx"] = Features["avx2"] = Features["fma"] = 1938 Features["fma4"] = Features["aes"] = Features["pclmul"] = 1939 Features["xop"] = false; 1940 else if (Name == "sse3") 1941 Features["sse3"] = Features["ssse3"] = Features["sse41"] = 1942 Features["sse42"] = Features["sse4a"] = Features["avx"] = 1943 Features["avx2"] = Features["fma"] = Features["fma4"] = 1944 Features["xop"] = false; 1945 else if (Name == "ssse3") 1946 Features["ssse3"] = Features["sse41"] = Features["sse42"] = 1947 Features["avx"] = Features["avx2"] = Features["fma"] = false; 1948 else if (Name == "sse4" || Name == "sse4.1") 1949 Features["sse41"] = Features["sse42"] = Features["avx"] = 1950 Features["avx2"] = Features["fma"] = false; 1951 else if (Name == "sse4.2") 1952 Features["sse42"] = Features["avx"] = Features["avx2"] = 1953 Features["fma"] = false; 1954 else if (Name == "3dnow") 1955 Features["3dnow"] = Features["3dnowa"] = false; 1956 else if (Name == "3dnowa") 1957 Features["3dnowa"] = false; 1958 else if (Name == "aes") 1959 Features["aes"] = false; 1960 else if (Name == "pclmul") 1961 Features["pclmul"] = false; 1962 else if (Name == "avx") 1963 Features["avx"] = Features["avx2"] = Features["fma"] = 1964 Features["fma4"] = Features["xop"] = false; 1965 else if (Name == "avx2") 1966 Features["avx2"] = false; 1967 else if (Name == "fma") 1968 Features["fma"] = false; 1969 else if (Name == "sse4a") 1970 Features["sse4a"] = Features["fma4"] = Features["xop"] = false; 1971 else if (Name == "lzcnt") 1972 Features["lzcnt"] = false; 1973 else if (Name == "rdrnd") 1974 Features["rdrand"] = false; 1975 else if (Name == "bmi") 1976 Features["bmi"] = false; 1977 else if (Name == "bmi2") 1978 Features["bmi2"] = false; 1979 else if (Name == "popcnt") 1980 Features["popcnt"] = false; 1981 else if (Name == "fma4") 1982 Features["fma4"] = Features["xop"] = false; 1983 else if (Name == "xop") 1984 Features["xop"] = false; 1985 } 1986 1987 return true; 1988} 1989 1990/// HandleTargetOptions - Perform initialization based on the user 1991/// configured set of features. 1992void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) { 1993 // Remember the maximum enabled sselevel. 1994 for (unsigned i = 0, e = Features.size(); i !=e; ++i) { 1995 // Ignore disabled features. 1996 if (Features[i][0] == '-') 1997 continue; 1998 1999 StringRef Feature = StringRef(Features[i]).substr(1); 2000 2001 if (Feature == "aes") { 2002 HasAES = true; 2003 continue; 2004 } 2005 2006 if (Feature == "pclmul") { 2007 HasPCLMUL = true; 2008 continue; 2009 } 2010 2011 if (Feature == "lzcnt") { 2012 HasLZCNT = true; 2013 continue; 2014 } 2015 2016 if (Feature == "rdrand") { 2017 HasRDRND = true; 2018 continue; 2019 } 2020 2021 if (Feature == "bmi") { 2022 HasBMI = true; 2023 continue; 2024 } 2025 2026 if (Feature == "bmi2") { 2027 HasBMI2 = true; 2028 continue; 2029 } 2030 2031 if (Feature == "popcnt") { 2032 HasPOPCNT = true; 2033 continue; 2034 } 2035 2036 if (Feature == "sse4a") { 2037 HasSSE4a = true; 2038 continue; 2039 } 2040 2041 if (Feature == "fma4") { 2042 HasFMA4 = true; 2043 continue; 2044 } 2045 2046 if (Feature == "fma") { 2047 HasFMA = true; 2048 continue; 2049 } 2050 2051 if (Feature == "xop") { 2052 HasXOP = true; 2053 continue; 2054 } 2055 2056 assert(Features[i][0] == '+' && "Invalid target feature!"); 2057 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature) 2058 .Case("avx2", AVX2) 2059 .Case("avx", AVX) 2060 .Case("sse42", SSE42) 2061 .Case("sse41", SSE41) 2062 .Case("ssse3", SSSE3) 2063 .Case("sse3", SSE3) 2064 .Case("sse2", SSE2) 2065 .Case("sse", SSE1) 2066 .Default(NoSSE); 2067 SSELevel = std::max(SSELevel, Level); 2068 2069 MMX3DNowEnum ThreeDNowLevel = 2070 llvm::StringSwitch<MMX3DNowEnum>(Feature) 2071 .Case("3dnowa", AMD3DNowAthlon) 2072 .Case("3dnow", AMD3DNow) 2073 .Case("mmx", MMX) 2074 .Default(NoMMX3DNow); 2075 2076 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel); 2077 } 2078 2079 // Don't tell the backend if we're turning off mmx; it will end up disabling 2080 // SSE, which we don't want. 2081 std::vector<std::string>::iterator it; 2082 it = std::find(Features.begin(), Features.end(), "-mmx"); 2083 if (it != Features.end()) 2084 Features.erase(it); 2085} 2086 2087/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro 2088/// definitions for this particular subtarget. 2089void X86TargetInfo::getTargetDefines(const LangOptions &Opts, 2090 MacroBuilder &Builder) const { 2091 // Target identification. 2092 if (PointerWidth == 64) { 2093 Builder.defineMacro("__amd64__"); 2094 Builder.defineMacro("__amd64"); 2095 Builder.defineMacro("__x86_64"); 2096 Builder.defineMacro("__x86_64__"); 2097 } else { 2098 DefineStd(Builder, "i386", Opts); 2099 } 2100 2101 // Subtarget options. 2102 // FIXME: We are hard-coding the tune parameters based on the CPU, but they 2103 // truly should be based on -mtune options. 2104 switch (CPU) { 2105 case CK_Generic: 2106 break; 2107 case CK_i386: 2108 // The rest are coming from the i386 define above. 2109 Builder.defineMacro("__tune_i386__"); 2110 break; 2111 case CK_i486: 2112 case CK_WinChipC6: 2113 case CK_WinChip2: 2114 case CK_C3: 2115 defineCPUMacros(Builder, "i486"); 2116 break; 2117 case CK_PentiumMMX: 2118 Builder.defineMacro("__pentium_mmx__"); 2119 Builder.defineMacro("__tune_pentium_mmx__"); 2120 // Fallthrough 2121 case CK_i586: 2122 case CK_Pentium: 2123 defineCPUMacros(Builder, "i586"); 2124 defineCPUMacros(Builder, "pentium"); 2125 break; 2126 case CK_Pentium3: 2127 case CK_Pentium3M: 2128 case CK_PentiumM: 2129 Builder.defineMacro("__tune_pentium3__"); 2130 // Fallthrough 2131 case CK_Pentium2: 2132 case CK_C3_2: 2133 Builder.defineMacro("__tune_pentium2__"); 2134 // Fallthrough 2135 case CK_PentiumPro: 2136 Builder.defineMacro("__tune_i686__"); 2137 Builder.defineMacro("__tune_pentiumpro__"); 2138 // Fallthrough 2139 case CK_i686: 2140 Builder.defineMacro("__i686"); 2141 Builder.defineMacro("__i686__"); 2142 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686. 2143 Builder.defineMacro("__pentiumpro"); 2144 Builder.defineMacro("__pentiumpro__"); 2145 break; 2146 case CK_Pentium4: 2147 case CK_Pentium4M: 2148 defineCPUMacros(Builder, "pentium4"); 2149 break; 2150 case CK_Yonah: 2151 case CK_Prescott: 2152 case CK_Nocona: 2153 defineCPUMacros(Builder, "nocona"); 2154 break; 2155 case CK_Core2: 2156 case CK_Penryn: 2157 defineCPUMacros(Builder, "core2"); 2158 break; 2159 case CK_Atom: 2160 defineCPUMacros(Builder, "atom"); 2161 break; 2162 case CK_Corei7: 2163 case CK_Corei7AVX: 2164 case CK_CoreAVXi: 2165 case CK_CoreAVX2: 2166 defineCPUMacros(Builder, "corei7"); 2167 break; 2168 case CK_K6_2: 2169 Builder.defineMacro("__k6_2__"); 2170 Builder.defineMacro("__tune_k6_2__"); 2171 // Fallthrough 2172 case CK_K6_3: 2173 if (CPU != CK_K6_2) { // In case of fallthrough 2174 // FIXME: GCC may be enabling these in cases where some other k6 2175 // architecture is specified but -m3dnow is explicitly provided. The 2176 // exact semantics need to be determined and emulated here. 2177 Builder.defineMacro("__k6_3__"); 2178 Builder.defineMacro("__tune_k6_3__"); 2179 } 2180 // Fallthrough 2181 case CK_K6: 2182 defineCPUMacros(Builder, "k6"); 2183 break; 2184 case CK_Athlon: 2185 case CK_AthlonThunderbird: 2186 case CK_Athlon4: 2187 case CK_AthlonXP: 2188 case CK_AthlonMP: 2189 defineCPUMacros(Builder, "athlon"); 2190 if (SSELevel != NoSSE) { 2191 Builder.defineMacro("__athlon_sse__"); 2192 Builder.defineMacro("__tune_athlon_sse__"); 2193 } 2194 break; 2195 case CK_K8: 2196 case CK_K8SSE3: 2197 case CK_x86_64: 2198 case CK_Opteron: 2199 case CK_OpteronSSE3: 2200 case CK_Athlon64: 2201 case CK_Athlon64SSE3: 2202 case CK_AthlonFX: 2203 defineCPUMacros(Builder, "k8"); 2204 break; 2205 case CK_AMDFAM10: 2206 defineCPUMacros(Builder, "amdfam10"); 2207 break; 2208 case CK_BTVER1: 2209 defineCPUMacros(Builder, "btver1"); 2210 break; 2211 case CK_BDVER1: 2212 defineCPUMacros(Builder, "bdver1"); 2213 break; 2214 case CK_BDVER2: 2215 defineCPUMacros(Builder, "bdver2"); 2216 break; 2217 case CK_Geode: 2218 defineCPUMacros(Builder, "geode"); 2219 break; 2220 } 2221 2222 // Target properties. 2223 Builder.defineMacro("__LITTLE_ENDIAN__"); 2224 Builder.defineMacro("__REGISTER_PREFIX__", ""); 2225 2226 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline 2227 // functions in glibc header files that use FP Stack inline asm which the 2228 // backend can't deal with (PR879). 2229 Builder.defineMacro("__NO_MATH_INLINES"); 2230 2231 if (HasAES) 2232 Builder.defineMacro("__AES__"); 2233 2234 if (HasPCLMUL) 2235 Builder.defineMacro("__PCLMUL__"); 2236 2237 if (HasLZCNT) 2238 Builder.defineMacro("__LZCNT__"); 2239 2240 if (HasRDRND) 2241 Builder.defineMacro("__RDRND__"); 2242 2243 if (HasBMI) 2244 Builder.defineMacro("__BMI__"); 2245 2246 if (HasBMI2) 2247 Builder.defineMacro("__BMI2__"); 2248 2249 if (HasPOPCNT) 2250 Builder.defineMacro("__POPCNT__"); 2251 2252 if (HasSSE4a) 2253 Builder.defineMacro("__SSE4A__"); 2254 2255 if (HasFMA4) 2256 Builder.defineMacro("__FMA4__"); 2257 2258 if (HasFMA) 2259 Builder.defineMacro("__FMA__"); 2260 2261 if (HasXOP) 2262 Builder.defineMacro("__XOP__"); 2263 2264 // Each case falls through to the previous one here. 2265 switch (SSELevel) { 2266 case AVX2: 2267 Builder.defineMacro("__AVX2__"); 2268 case AVX: 2269 Builder.defineMacro("__AVX__"); 2270 case SSE42: 2271 Builder.defineMacro("__SSE4_2__"); 2272 case SSE41: 2273 Builder.defineMacro("__SSE4_1__"); 2274 case SSSE3: 2275 Builder.defineMacro("__SSSE3__"); 2276 case SSE3: 2277 Builder.defineMacro("__SSE3__"); 2278 case SSE2: 2279 Builder.defineMacro("__SSE2__"); 2280 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied. 2281 case SSE1: 2282 Builder.defineMacro("__SSE__"); 2283 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied. 2284 case NoSSE: 2285 break; 2286 } 2287 2288 if (Opts.MicrosoftExt && PointerWidth == 32) { 2289 switch (SSELevel) { 2290 case AVX2: 2291 case AVX: 2292 case SSE42: 2293 case SSE41: 2294 case SSSE3: 2295 case SSE3: 2296 case SSE2: 2297 Builder.defineMacro("_M_IX86_FP", Twine(2)); 2298 break; 2299 case SSE1: 2300 Builder.defineMacro("_M_IX86_FP", Twine(1)); 2301 break; 2302 default: 2303 Builder.defineMacro("_M_IX86_FP", Twine(0)); 2304 } 2305 } 2306 2307 // Each case falls through to the previous one here. 2308 switch (MMX3DNowLevel) { 2309 case AMD3DNowAthlon: 2310 Builder.defineMacro("__3dNOW_A__"); 2311 case AMD3DNow: 2312 Builder.defineMacro("__3dNOW__"); 2313 case MMX: 2314 Builder.defineMacro("__MMX__"); 2315 case NoMMX3DNow: 2316 break; 2317 } 2318} 2319 2320bool X86TargetInfo::hasFeature(StringRef Feature) const { 2321 return llvm::StringSwitch<bool>(Feature) 2322 .Case("aes", HasAES) 2323 .Case("avx", SSELevel >= AVX) 2324 .Case("avx2", SSELevel >= AVX2) 2325 .Case("bmi", HasBMI) 2326 .Case("bmi2", HasBMI2) 2327 .Case("fma", HasFMA) 2328 .Case("fma4", HasFMA4) 2329 .Case("lzcnt", HasLZCNT) 2330 .Case("rdrnd", HasRDRND) 2331 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow) 2332 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon) 2333 .Case("mmx", MMX3DNowLevel >= MMX) 2334 .Case("pclmul", HasPCLMUL) 2335 .Case("popcnt", HasPOPCNT) 2336 .Case("sse", SSELevel >= SSE1) 2337 .Case("sse2", SSELevel >= SSE2) 2338 .Case("sse3", SSELevel >= SSE3) 2339 .Case("ssse3", SSELevel >= SSSE3) 2340 .Case("sse41", SSELevel >= SSE41) 2341 .Case("sse42", SSELevel >= SSE42) 2342 .Case("sse4a", HasSSE4a) 2343 .Case("x86", true) 2344 .Case("x86_32", PointerWidth == 32) 2345 .Case("x86_64", PointerWidth == 64) 2346 .Case("xop", HasXOP) 2347 .Default(false); 2348} 2349 2350bool 2351X86TargetInfo::validateAsmConstraint(const char *&Name, 2352 TargetInfo::ConstraintInfo &Info) const { 2353 switch (*Name) { 2354 default: return false; 2355 case 'Y': // first letter of a pair: 2356 switch (*(Name+1)) { 2357 default: return false; 2358 case '0': // First SSE register. 2359 case 't': // Any SSE register, when SSE2 is enabled. 2360 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled. 2361 case 'm': // any MMX register, when inter-unit moves enabled. 2362 break; // falls through to setAllowsRegister. 2363 } 2364 case 'a': // eax. 2365 case 'b': // ebx. 2366 case 'c': // ecx. 2367 case 'd': // edx. 2368 case 'S': // esi. 2369 case 'D': // edi. 2370 case 'A': // edx:eax. 2371 case 'f': // any x87 floating point stack register. 2372 case 't': // top of floating point stack. 2373 case 'u': // second from top of floating point stack. 2374 case 'q': // Any register accessible as [r]l: a, b, c, and d. 2375 case 'y': // Any MMX register. 2376 case 'x': // Any SSE register. 2377 case 'Q': // Any register accessible as [r]h: a, b, c, and d. 2378 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp. 2379 case 'l': // "Index" registers: any general register that can be used as an 2380 // index in a base+index memory access. 2381 Info.setAllowsRegister(); 2382 return true; 2383 case 'C': // SSE floating point constant. 2384 case 'G': // x87 floating point constant. 2385 case 'e': // 32-bit signed integer constant for use with zero-extending 2386 // x86_64 instructions. 2387 case 'Z': // 32-bit unsigned integer constant for use with zero-extending 2388 // x86_64 instructions. 2389 return true; 2390 } 2391} 2392 2393 2394std::string 2395X86TargetInfo::convertConstraint(const char *&Constraint) const { 2396 switch (*Constraint) { 2397 case 'a': return std::string("{ax}"); 2398 case 'b': return std::string("{bx}"); 2399 case 'c': return std::string("{cx}"); 2400 case 'd': return std::string("{dx}"); 2401 case 'S': return std::string("{si}"); 2402 case 'D': return std::string("{di}"); 2403 case 'p': // address 2404 return std::string("im"); 2405 case 't': // top of floating point stack. 2406 return std::string("{st}"); 2407 case 'u': // second from top of floating point stack. 2408 return std::string("{st(1)}"); // second from top of floating point stack. 2409 default: 2410 return std::string(1, *Constraint); 2411 } 2412} 2413} // end anonymous namespace 2414 2415namespace { 2416// X86-32 generic target 2417class X86_32TargetInfo : public X86TargetInfo { 2418public: 2419 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) { 2420 DoubleAlign = LongLongAlign = 32; 2421 LongDoubleWidth = 96; 2422 LongDoubleAlign = 32; 2423 SuitableAlign = 128; 2424 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 2425 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-" 2426 "a0:0:64-f80:32:32-n8:16:32-S128"; 2427 SizeType = UnsignedInt; 2428 PtrDiffType = SignedInt; 2429 IntPtrType = SignedInt; 2430 RegParmMax = 3; 2431 2432 // Use fpret for all types. 2433 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) | 2434 (1 << TargetInfo::Double) | 2435 (1 << TargetInfo::LongDouble)); 2436 2437 // x86-32 has atomics up to 8 bytes 2438 // FIXME: Check that we actually have cmpxchg8b before setting 2439 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.) 2440 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64; 2441 } 2442 virtual BuiltinVaListKind getBuiltinVaListKind() const { 2443 return TargetInfo::CharPtrBuiltinVaList; 2444 } 2445 2446 int getEHDataRegisterNumber(unsigned RegNo) const { 2447 if (RegNo == 0) return 0; 2448 if (RegNo == 1) return 2; 2449 return -1; 2450 } 2451}; 2452} // end anonymous namespace 2453 2454namespace { 2455class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> { 2456public: 2457 NetBSDI386TargetInfo(const std::string &triple) : 2458 NetBSDTargetInfo<X86_32TargetInfo>(triple) { 2459 } 2460 2461 virtual unsigned getFloatEvalMethod() const { 2462 // NetBSD defaults to "double" rounding 2463 return 1; 2464 } 2465}; 2466} // end anonymous namespace 2467 2468namespace { 2469class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> { 2470public: 2471 OpenBSDI386TargetInfo(const std::string& triple) : 2472 OpenBSDTargetInfo<X86_32TargetInfo>(triple) { 2473 SizeType = UnsignedLong; 2474 IntPtrType = SignedLong; 2475 PtrDiffType = SignedLong; 2476 } 2477}; 2478} // end anonymous namespace 2479 2480namespace { 2481class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> { 2482public: 2483 BitrigI386TargetInfo(const std::string& triple) : 2484 BitrigTargetInfo<X86_32TargetInfo>(triple) { 2485 SizeType = UnsignedLong; 2486 IntPtrType = SignedLong; 2487 PtrDiffType = SignedLong; 2488 } 2489}; 2490} // end anonymous namespace 2491 2492namespace { 2493class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> { 2494public: 2495 DarwinI386TargetInfo(const std::string& triple) : 2496 DarwinTargetInfo<X86_32TargetInfo>(triple) { 2497 LongDoubleWidth = 128; 2498 LongDoubleAlign = 128; 2499 SuitableAlign = 128; 2500 MaxVectorAlign = 256; 2501 SizeType = UnsignedLong; 2502 IntPtrType = SignedLong; 2503 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 2504 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-" 2505 "a0:0:64-f80:128:128-n8:16:32-S128"; 2506 HasAlignMac68kSupport = true; 2507 } 2508 2509}; 2510} // end anonymous namespace 2511 2512namespace { 2513// x86-32 Windows target 2514class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> { 2515public: 2516 WindowsX86_32TargetInfo(const std::string& triple) 2517 : WindowsTargetInfo<X86_32TargetInfo>(triple) { 2518 TLSSupported = false; 2519 WCharType = UnsignedShort; 2520 DoubleAlign = LongLongAlign = 64; 2521 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 2522 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-" 2523 "v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32"; 2524 } 2525 virtual void getTargetDefines(const LangOptions &Opts, 2526 MacroBuilder &Builder) const { 2527 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder); 2528 } 2529}; 2530} // end anonymous namespace 2531 2532namespace { 2533 2534// x86-32 Windows Visual Studio target 2535class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo { 2536public: 2537 VisualStudioWindowsX86_32TargetInfo(const std::string& triple) 2538 : WindowsX86_32TargetInfo(triple) { 2539 LongDoubleWidth = LongDoubleAlign = 64; 2540 LongDoubleFormat = &llvm::APFloat::IEEEdouble; 2541 } 2542 virtual void getTargetDefines(const LangOptions &Opts, 2543 MacroBuilder &Builder) const { 2544 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder); 2545 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder); 2546 // The value of the following reflects processor type. 2547 // 300=386, 400=486, 500=Pentium, 600=Blend (default) 2548 // We lost the original triple, so we use the default. 2549 Builder.defineMacro("_M_IX86", "600"); 2550 } 2551}; 2552} // end anonymous namespace 2553 2554namespace { 2555// x86-32 MinGW target 2556class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo { 2557public: 2558 MinGWX86_32TargetInfo(const std::string& triple) 2559 : WindowsX86_32TargetInfo(triple) { 2560 } 2561 virtual void getTargetDefines(const LangOptions &Opts, 2562 MacroBuilder &Builder) const { 2563 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder); 2564 DefineStd(Builder, "WIN32", Opts); 2565 DefineStd(Builder, "WINNT", Opts); 2566 Builder.defineMacro("_X86_"); 2567 Builder.defineMacro("__MSVCRT__"); 2568 Builder.defineMacro("__MINGW32__"); 2569 2570 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)). 2571 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions. 2572 if (Opts.MicrosoftExt) 2573 // Provide "as-is" __declspec. 2574 Builder.defineMacro("__declspec", "__declspec"); 2575 else 2576 // Provide alias of __attribute__ like mingw32-gcc. 2577 Builder.defineMacro("__declspec(a)", "__attribute__((a))"); 2578 } 2579}; 2580} // end anonymous namespace 2581 2582namespace { 2583// x86-32 Cygwin target 2584class CygwinX86_32TargetInfo : public X86_32TargetInfo { 2585public: 2586 CygwinX86_32TargetInfo(const std::string& triple) 2587 : X86_32TargetInfo(triple) { 2588 TLSSupported = false; 2589 WCharType = UnsignedShort; 2590 DoubleAlign = LongLongAlign = 64; 2591 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 2592 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-" 2593 "a0:0:64-f80:32:32-n8:16:32-S32"; 2594 } 2595 virtual void getTargetDefines(const LangOptions &Opts, 2596 MacroBuilder &Builder) const { 2597 X86_32TargetInfo::getTargetDefines(Opts, Builder); 2598 Builder.defineMacro("__CYGWIN__"); 2599 Builder.defineMacro("__CYGWIN32__"); 2600 DefineStd(Builder, "unix", Opts); 2601 if (Opts.CPlusPlus) 2602 Builder.defineMacro("_GNU_SOURCE"); 2603 } 2604}; 2605} // end anonymous namespace 2606 2607namespace { 2608// x86-32 Haiku target 2609class HaikuX86_32TargetInfo : public X86_32TargetInfo { 2610public: 2611 HaikuX86_32TargetInfo(const std::string& triple) 2612 : X86_32TargetInfo(triple) { 2613 SizeType = UnsignedLong; 2614 IntPtrType = SignedLong; 2615 PtrDiffType = SignedLong; 2616 this->UserLabelPrefix = ""; 2617 } 2618 virtual void getTargetDefines(const LangOptions &Opts, 2619 MacroBuilder &Builder) const { 2620 X86_32TargetInfo::getTargetDefines(Opts, Builder); 2621 Builder.defineMacro("__INTEL__"); 2622 Builder.defineMacro("__HAIKU__"); 2623 } 2624}; 2625} // end anonymous namespace 2626 2627// RTEMS Target 2628template<typename Target> 2629class RTEMSTargetInfo : public OSTargetInfo<Target> { 2630protected: 2631 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 2632 MacroBuilder &Builder) const { 2633 // RTEMS defines; list based off of gcc output 2634 2635 Builder.defineMacro("__rtems__"); 2636 Builder.defineMacro("__ELF__"); 2637 } 2638public: 2639 RTEMSTargetInfo(const std::string &triple) 2640 : OSTargetInfo<Target>(triple) { 2641 this->UserLabelPrefix = ""; 2642 2643 llvm::Triple Triple(triple); 2644 switch (Triple.getArch()) { 2645 default: 2646 case llvm::Triple::x86: 2647 // this->MCountName = ".mcount"; 2648 break; 2649 case llvm::Triple::mips: 2650 case llvm::Triple::mipsel: 2651 case llvm::Triple::ppc: 2652 case llvm::Triple::ppc64: 2653 // this->MCountName = "_mcount"; 2654 break; 2655 case llvm::Triple::arm: 2656 // this->MCountName = "__mcount"; 2657 break; 2658 } 2659 2660 } 2661}; 2662 2663namespace { 2664// x86-32 RTEMS target 2665class RTEMSX86_32TargetInfo : public X86_32TargetInfo { 2666public: 2667 RTEMSX86_32TargetInfo(const std::string& triple) 2668 : X86_32TargetInfo(triple) { 2669 SizeType = UnsignedLong; 2670 IntPtrType = SignedLong; 2671 PtrDiffType = SignedLong; 2672 this->UserLabelPrefix = ""; 2673 } 2674 virtual void getTargetDefines(const LangOptions &Opts, 2675 MacroBuilder &Builder) const { 2676 X86_32TargetInfo::getTargetDefines(Opts, Builder); 2677 Builder.defineMacro("__INTEL__"); 2678 Builder.defineMacro("__rtems__"); 2679 } 2680}; 2681} // end anonymous namespace 2682 2683namespace { 2684// x86-64 generic target 2685class X86_64TargetInfo : public X86TargetInfo { 2686public: 2687 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) { 2688 LongWidth = LongAlign = PointerWidth = PointerAlign = 64; 2689 LongDoubleWidth = 128; 2690 LongDoubleAlign = 128; 2691 LargeArrayMinWidth = 128; 2692 LargeArrayAlign = 128; 2693 SuitableAlign = 128; 2694 IntMaxType = SignedLong; 2695 UIntMaxType = UnsignedLong; 2696 Int64Type = SignedLong; 2697 RegParmMax = 6; 2698 2699 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 2700 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-" 2701 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"; 2702 2703 // Use fpret only for long double. 2704 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble); 2705 2706 // Use fp2ret for _Complex long double. 2707 ComplexLongDoubleUsesFP2Ret = true; 2708 2709 // x86-64 has atomics up to 16 bytes. 2710 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128 2711 // on CPUs with cmpxchg16b 2712 MaxAtomicPromoteWidth = 128; 2713 MaxAtomicInlineWidth = 64; 2714 } 2715 virtual BuiltinVaListKind getBuiltinVaListKind() const { 2716 return TargetInfo::X86_64ABIBuiltinVaList; 2717 } 2718 2719 int getEHDataRegisterNumber(unsigned RegNo) const { 2720 if (RegNo == 0) return 0; 2721 if (RegNo == 1) return 1; 2722 return -1; 2723 } 2724 2725 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const { 2726 return TargetInfo::checkCallingConvention(CC); 2727 } 2728 2729 virtual CallingConv getDefaultCallingConv() const { 2730 return CC_Default; 2731 } 2732 2733}; 2734} // end anonymous namespace 2735 2736namespace { 2737// x86-64 Windows target 2738class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> { 2739public: 2740 WindowsX86_64TargetInfo(const std::string& triple) 2741 : WindowsTargetInfo<X86_64TargetInfo>(triple) { 2742 TLSSupported = false; 2743 WCharType = UnsignedShort; 2744 LongWidth = LongAlign = 32; 2745 DoubleAlign = LongLongAlign = 64; 2746 IntMaxType = SignedLongLong; 2747 UIntMaxType = UnsignedLongLong; 2748 Int64Type = SignedLongLong; 2749 SizeType = UnsignedLongLong; 2750 PtrDiffType = SignedLongLong; 2751 IntPtrType = SignedLongLong; 2752 this->UserLabelPrefix = ""; 2753 } 2754 virtual void getTargetDefines(const LangOptions &Opts, 2755 MacroBuilder &Builder) const { 2756 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder); 2757 Builder.defineMacro("_WIN64"); 2758 } 2759 virtual BuiltinVaListKind getBuiltinVaListKind() const { 2760 return TargetInfo::CharPtrBuiltinVaList; 2761 } 2762}; 2763} // end anonymous namespace 2764 2765namespace { 2766// x86-64 Windows Visual Studio target 2767class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo { 2768public: 2769 VisualStudioWindowsX86_64TargetInfo(const std::string& triple) 2770 : WindowsX86_64TargetInfo(triple) { 2771 LongDoubleWidth = LongDoubleAlign = 64; 2772 LongDoubleFormat = &llvm::APFloat::IEEEdouble; 2773 } 2774 virtual void getTargetDefines(const LangOptions &Opts, 2775 MacroBuilder &Builder) const { 2776 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder); 2777 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder); 2778 Builder.defineMacro("_M_X64"); 2779 Builder.defineMacro("_M_AMD64"); 2780 } 2781}; 2782} // end anonymous namespace 2783 2784namespace { 2785// x86-64 MinGW target 2786class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo { 2787public: 2788 MinGWX86_64TargetInfo(const std::string& triple) 2789 : WindowsX86_64TargetInfo(triple) { 2790 } 2791 virtual void getTargetDefines(const LangOptions &Opts, 2792 MacroBuilder &Builder) const { 2793 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder); 2794 DefineStd(Builder, "WIN64", Opts); 2795 Builder.defineMacro("__MSVCRT__"); 2796 Builder.defineMacro("__MINGW32__"); 2797 Builder.defineMacro("__MINGW64__"); 2798 2799 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)). 2800 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions. 2801 if (Opts.MicrosoftExt) 2802 // Provide "as-is" __declspec. 2803 Builder.defineMacro("__declspec", "__declspec"); 2804 else 2805 // Provide alias of __attribute__ like mingw32-gcc. 2806 Builder.defineMacro("__declspec(a)", "__attribute__((a))"); 2807 } 2808}; 2809} // end anonymous namespace 2810 2811namespace { 2812class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> { 2813public: 2814 DarwinX86_64TargetInfo(const std::string& triple) 2815 : DarwinTargetInfo<X86_64TargetInfo>(triple) { 2816 Int64Type = SignedLongLong; 2817 MaxVectorAlign = 256; 2818 } 2819}; 2820} // end anonymous namespace 2821 2822namespace { 2823class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> { 2824public: 2825 OpenBSDX86_64TargetInfo(const std::string& triple) 2826 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) { 2827 IntMaxType = SignedLongLong; 2828 UIntMaxType = UnsignedLongLong; 2829 Int64Type = SignedLongLong; 2830 } 2831}; 2832} // end anonymous namespace 2833 2834namespace { 2835class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> { 2836public: 2837 BitrigX86_64TargetInfo(const std::string& triple) 2838 : BitrigTargetInfo<X86_64TargetInfo>(triple) { 2839 IntMaxType = SignedLongLong; 2840 UIntMaxType = UnsignedLongLong; 2841 Int64Type = SignedLongLong; 2842 } 2843}; 2844} // end anonymous namespace 2845 2846namespace { 2847class ARMTargetInfo : public TargetInfo { 2848 // Possible FPU choices. 2849 enum FPUMode { 2850 VFP2FPU = (1 << 0), 2851 VFP3FPU = (1 << 1), 2852 VFP4FPU = (1 << 2), 2853 NeonFPU = (1 << 3) 2854 }; 2855 2856 static bool FPUModeIsVFP(FPUMode Mode) { 2857 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU); 2858 } 2859 2860 static const TargetInfo::GCCRegAlias GCCRegAliases[]; 2861 static const char * const GCCRegNames[]; 2862 2863 std::string ABI, CPU; 2864 2865 unsigned FPU : 4; 2866 2867 unsigned IsThumb : 1; 2868 2869 // Initialized via features. 2870 unsigned SoftFloat : 1; 2871 unsigned SoftFloatABI : 1; 2872 2873 static const Builtin::Info BuiltinInfo[]; 2874 2875public: 2876 ARMTargetInfo(const std::string &TripleStr) 2877 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s") 2878 { 2879 BigEndian = false; 2880 SizeType = UnsignedInt; 2881 PtrDiffType = SignedInt; 2882 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int. 2883 WCharType = UnsignedInt; 2884 2885 // {} in inline assembly are neon specifiers, not assembly variant 2886 // specifiers. 2887 NoAsmVariants = true; 2888 2889 // FIXME: Should we just treat this as a feature? 2890 IsThumb = getTriple().getArchName().startswith("thumb"); 2891 if (IsThumb) { 2892 // Thumb1 add sp, #imm requires the immediate value be multiple of 4, 2893 // so set preferred for small types to 32. 2894 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-" 2895 "i64:64:64-f32:32:32-f64:64:64-" 2896 "v64:64:64-v128:64:128-a0:0:32-n32-S64"); 2897 } else { 2898 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 2899 "i64:64:64-f32:32:32-f64:64:64-" 2900 "v64:64:64-v128:64:128-a0:0:64-n32-S64"); 2901 } 2902 2903 // ARM targets default to using the ARM C++ ABI. 2904 CXXABI = CXXABI_ARM; 2905 2906 // ARM has atomics up to 8 bytes 2907 // FIXME: Set MaxAtomicInlineWidth if we have the feature v6e 2908 MaxAtomicPromoteWidth = 64; 2909 2910 // Do force alignment of members that follow zero length bitfields. If 2911 // the alignment of the zero-length bitfield is greater than the member 2912 // that follows it, `bar', `bar' will be aligned as the type of the 2913 // zero length bitfield. 2914 UseZeroLengthBitfieldAlignment = true; 2915 } 2916 virtual const char *getABI() const { return ABI.c_str(); } 2917 virtual bool setABI(const std::string &Name) { 2918 ABI = Name; 2919 2920 // The defaults (above) are for AAPCS, check if we need to change them. 2921 // 2922 // FIXME: We need support for -meabi... we could just mangle it into the 2923 // name. 2924 if (Name == "apcs-gnu") { 2925 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32; 2926 SizeType = UnsignedLong; 2927 2928 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour. 2929 WCharType = SignedInt; 2930 2931 // Do not respect the alignment of bit-field types when laying out 2932 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc. 2933 UseBitFieldTypeAlignment = false; 2934 2935 /// gcc forces the alignment to 4 bytes, regardless of the type of the 2936 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in 2937 /// gcc. 2938 ZeroLengthBitfieldBoundary = 32; 2939 2940 if (IsThumb) { 2941 // Thumb1 add sp, #imm requires the immediate value be multiple of 4, 2942 // so set preferred for small types to 32. 2943 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-" 2944 "i64:32:64-f32:32:32-f64:32:64-" 2945 "v64:32:64-v128:32:128-a0:0:32-n32-S32"); 2946 } else { 2947 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 2948 "i64:32:64-f32:32:32-f64:32:64-" 2949 "v64:32:64-v128:32:128-a0:0:32-n32-S32"); 2950 } 2951 2952 // FIXME: Override "preferred align" for double and long long. 2953 } else if (Name == "aapcs") { 2954 // FIXME: Enumerated types are variable width in straight AAPCS. 2955 } else if (Name == "aapcs-linux") { 2956 ; 2957 } else 2958 return false; 2959 2960 return true; 2961 } 2962 2963 void getDefaultFeatures(llvm::StringMap<bool> &Features) const { 2964 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore") 2965 Features["vfp2"] = true; 2966 else if (CPU == "cortex-a8" || CPU == "cortex-a15" || 2967 CPU == "cortex-a9" || CPU == "cortex-a9-mp") 2968 Features["neon"] = true; 2969 else if (CPU == "swift") { 2970 Features["vfp4"] = true; 2971 Features["neon"] = true; 2972 } 2973 } 2974 2975 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features, 2976 StringRef Name, 2977 bool Enabled) const { 2978 if (Name == "soft-float" || Name == "soft-float-abi" || 2979 Name == "vfp2" || Name == "vfp3" || Name == "vfp4" || Name == "neon" || 2980 Name == "d16" || Name == "neonfp") { 2981 Features[Name] = Enabled; 2982 } else 2983 return false; 2984 2985 return true; 2986 } 2987 2988 virtual void HandleTargetFeatures(std::vector<std::string> &Features) { 2989 FPU = 0; 2990 SoftFloat = SoftFloatABI = false; 2991 for (unsigned i = 0, e = Features.size(); i != e; ++i) { 2992 if (Features[i] == "+soft-float") 2993 SoftFloat = true; 2994 else if (Features[i] == "+soft-float-abi") 2995 SoftFloatABI = true; 2996 else if (Features[i] == "+vfp2") 2997 FPU |= VFP2FPU; 2998 else if (Features[i] == "+vfp3") 2999 FPU |= VFP3FPU; 3000 else if (Features[i] == "+vfp4") 3001 FPU |= VFP4FPU; 3002 else if (Features[i] == "+neon") 3003 FPU |= NeonFPU; 3004 } 3005 3006 // Remove front-end specific options which the backend handles differently. 3007 std::vector<std::string>::iterator it; 3008 it = std::find(Features.begin(), Features.end(), "+soft-float"); 3009 if (it != Features.end()) 3010 Features.erase(it); 3011 it = std::find(Features.begin(), Features.end(), "+soft-float-abi"); 3012 if (it != Features.end()) 3013 Features.erase(it); 3014 } 3015 3016 virtual bool hasFeature(StringRef Feature) const { 3017 return llvm::StringSwitch<bool>(Feature) 3018 .Case("arm", true) 3019 .Case("softfloat", SoftFloat) 3020 .Case("thumb", IsThumb) 3021 .Case("neon", FPU == NeonFPU && !SoftFloat && 3022 StringRef(getCPUDefineSuffix(CPU)).startswith("7")) 3023 .Default(false); 3024 } 3025 // FIXME: Should we actually have some table instead of these switches? 3026 static const char *getCPUDefineSuffix(StringRef Name) { 3027 return llvm::StringSwitch<const char*>(Name) 3028 .Cases("arm8", "arm810", "4") 3029 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4") 3030 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T") 3031 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T") 3032 .Case("ep9312", "4T") 3033 .Cases("arm10tdmi", "arm1020t", "5T") 3034 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE") 3035 .Case("arm926ej-s", "5TEJ") 3036 .Cases("arm10e", "arm1020e", "arm1022e", "5TE") 3037 .Cases("xscale", "iwmmxt", "5TE") 3038 .Case("arm1136j-s", "6J") 3039 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK") 3040 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K") 3041 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2") 3042 .Cases("cortex-a8", "cortex-a9", "cortex-a15", "7A") 3043 .Case("cortex-a9-mp", "7F") 3044 .Case("swift", "7S") 3045 .Cases("cortex-m3", "cortex-m4", "7M") 3046 .Case("cortex-m0", "6M") 3047 .Default(0); 3048 } 3049 static const char *getCPUProfile(StringRef Name) { 3050 return llvm::StringSwitch<const char*>(Name) 3051 .Cases("cortex-a8", "cortex-a9", "A") 3052 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M") 3053 .Default(""); 3054 } 3055 virtual bool setCPU(const std::string &Name) { 3056 if (!getCPUDefineSuffix(Name)) 3057 return false; 3058 3059 CPU = Name; 3060 return true; 3061 } 3062 virtual void getTargetDefines(const LangOptions &Opts, 3063 MacroBuilder &Builder) const { 3064 // Target identification. 3065 Builder.defineMacro("__arm"); 3066 Builder.defineMacro("__arm__"); 3067 3068 // Target properties. 3069 Builder.defineMacro("__ARMEL__"); 3070 Builder.defineMacro("__LITTLE_ENDIAN__"); 3071 Builder.defineMacro("__REGISTER_PREFIX__", ""); 3072 3073 StringRef CPUArch = getCPUDefineSuffix(CPU); 3074 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__"); 3075 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1)); 3076 StringRef CPUProfile = getCPUProfile(CPU); 3077 if (!CPUProfile.empty()) 3078 Builder.defineMacro("__ARM_ARCH_PROFILE", CPUProfile); 3079 3080 // Subtarget options. 3081 3082 // FIXME: It's more complicated than this and we don't really support 3083 // interworking. 3084 if ('5' <= CPUArch[0] && CPUArch[0] <= '7') 3085 Builder.defineMacro("__THUMB_INTERWORK__"); 3086 3087 if (ABI == "aapcs" || ABI == "aapcs-linux") { 3088 Builder.defineMacro("__ARM_EABI__"); 3089 Builder.defineMacro("__ARM_PCS", "1"); 3090 3091 if (!SoftFloat && !SoftFloatABI) 3092 Builder.defineMacro("__ARM_PCS_VFP", "1"); 3093 } 3094 3095 if (SoftFloat) 3096 Builder.defineMacro("__SOFTFP__"); 3097 3098 if (CPU == "xscale") 3099 Builder.defineMacro("__XSCALE__"); 3100 3101 bool IsARMv7 = CPUArch.startswith("7"); 3102 if (IsThumb) { 3103 Builder.defineMacro("__THUMBEL__"); 3104 Builder.defineMacro("__thumb__"); 3105 if (CPUArch == "6T2" || IsARMv7) 3106 Builder.defineMacro("__thumb2__"); 3107 } 3108 3109 // Note, this is always on in gcc, even though it doesn't make sense. 3110 Builder.defineMacro("__APCS_32__"); 3111 3112 if (FPUModeIsVFP((FPUMode) FPU)) { 3113 Builder.defineMacro("__VFP_FP__"); 3114 if (FPU & VFP2FPU) 3115 Builder.defineMacro("__ARM_VFPV2__"); 3116 if (FPU & VFP3FPU) 3117 Builder.defineMacro("__ARM_VFPV3__"); 3118 if (FPU & VFP4FPU) 3119 Builder.defineMacro("__ARM_VFPV4__"); 3120 } 3121 3122 // This only gets set when Neon instructions are actually available, unlike 3123 // the VFP define, hence the soft float and arch check. This is subtly 3124 // different from gcc, we follow the intent which was that it should be set 3125 // when Neon instructions are actually available. 3126 if ((FPU & NeonFPU) && !SoftFloat && IsARMv7) 3127 Builder.defineMacro("__ARM_NEON__"); 3128 } 3129 virtual void getTargetBuiltins(const Builtin::Info *&Records, 3130 unsigned &NumRecords) const { 3131 Records = BuiltinInfo; 3132 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin; 3133 } 3134 virtual bool isCLZForZeroUndef() const { return false; } 3135 virtual BuiltinVaListKind getBuiltinVaListKind() const { 3136 return TargetInfo::VoidPtrBuiltinVaList; 3137 } 3138 virtual void getGCCRegNames(const char * const *&Names, 3139 unsigned &NumNames) const; 3140 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 3141 unsigned &NumAliases) const; 3142 virtual bool validateAsmConstraint(const char *&Name, 3143 TargetInfo::ConstraintInfo &Info) const { 3144 switch (*Name) { 3145 default: break; 3146 case 'l': // r0-r7 3147 case 'h': // r8-r15 3148 case 'w': // VFP Floating point register single precision 3149 case 'P': // VFP Floating point register double precision 3150 Info.setAllowsRegister(); 3151 return true; 3152 case 'Q': // A memory address that is a single base register. 3153 Info.setAllowsMemory(); 3154 return true; 3155 case 'U': // a memory reference... 3156 switch (Name[1]) { 3157 case 'q': // ...ARMV4 ldrsb 3158 case 'v': // ...VFP load/store (reg+constant offset) 3159 case 'y': // ...iWMMXt load/store 3160 case 't': // address valid for load/store opaque types wider 3161 // than 128-bits 3162 case 'n': // valid address for Neon doubleword vector load/store 3163 case 'm': // valid address for Neon element and structure load/store 3164 case 's': // valid address for non-offset loads/stores of quad-word 3165 // values in four ARM registers 3166 Info.setAllowsMemory(); 3167 Name++; 3168 return true; 3169 } 3170 } 3171 return false; 3172 } 3173 virtual std::string convertConstraint(const char *&Constraint) const { 3174 std::string R; 3175 switch (*Constraint) { 3176 case 'U': // Two-character constraint; add "^" hint for later parsing. 3177 R = std::string("^") + std::string(Constraint, 2); 3178 Constraint++; 3179 break; 3180 case 'p': // 'p' should be translated to 'r' by default. 3181 R = std::string("r"); 3182 break; 3183 default: 3184 return std::string(1, *Constraint); 3185 } 3186 return R; 3187 } 3188 virtual const char *getClobbers() const { 3189 // FIXME: Is this really right? 3190 return ""; 3191 } 3192 3193 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const { 3194 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning; 3195 } 3196}; 3197 3198const char * const ARMTargetInfo::GCCRegNames[] = { 3199 // Integer registers 3200 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", 3201 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc", 3202 3203 // Float registers 3204 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", 3205 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15", 3206 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23", 3207 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31", 3208 3209 // Double registers 3210 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", 3211 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15", 3212 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23", 3213 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31", 3214 3215 // Quad registers 3216 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", 3217 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" 3218}; 3219 3220void ARMTargetInfo::getGCCRegNames(const char * const *&Names, 3221 unsigned &NumNames) const { 3222 Names = GCCRegNames; 3223 NumNames = llvm::array_lengthof(GCCRegNames); 3224} 3225 3226const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = { 3227 { { "a1" }, "r0" }, 3228 { { "a2" }, "r1" }, 3229 { { "a3" }, "r2" }, 3230 { { "a4" }, "r3" }, 3231 { { "v1" }, "r4" }, 3232 { { "v2" }, "r5" }, 3233 { { "v3" }, "r6" }, 3234 { { "v4" }, "r7" }, 3235 { { "v5" }, "r8" }, 3236 { { "v6", "rfp" }, "r9" }, 3237 { { "sl" }, "r10" }, 3238 { { "fp" }, "r11" }, 3239 { { "ip" }, "r12" }, 3240 { { "r13" }, "sp" }, 3241 { { "r14" }, "lr" }, 3242 { { "r15" }, "pc" }, 3243 // The S, D and Q registers overlap, but aren't really aliases; we 3244 // don't want to substitute one of these for a different-sized one. 3245}; 3246 3247void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases, 3248 unsigned &NumAliases) const { 3249 Aliases = GCCRegAliases; 3250 NumAliases = llvm::array_lengthof(GCCRegAliases); 3251} 3252 3253const Builtin::Info ARMTargetInfo::BuiltinInfo[] = { 3254#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES }, 3255#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\ 3256 ALL_LANGUAGES }, 3257#include "clang/Basic/BuiltinsARM.def" 3258}; 3259} // end anonymous namespace. 3260 3261namespace { 3262class DarwinARMTargetInfo : 3263 public DarwinTargetInfo<ARMTargetInfo> { 3264protected: 3265 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 3266 MacroBuilder &Builder) const { 3267 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion); 3268 } 3269 3270public: 3271 DarwinARMTargetInfo(const std::string& triple) 3272 : DarwinTargetInfo<ARMTargetInfo>(triple) { 3273 HasAlignMac68kSupport = true; 3274 // iOS always has 64-bit atomic instructions. 3275 // FIXME: This should be based off of the target features in ARMTargetInfo. 3276 MaxAtomicInlineWidth = 64; 3277 } 3278}; 3279} // end anonymous namespace. 3280 3281 3282namespace { 3283// Hexagon abstract base class 3284class HexagonTargetInfo : public TargetInfo { 3285 static const Builtin::Info BuiltinInfo[]; 3286 static const char * const GCCRegNames[]; 3287 static const TargetInfo::GCCRegAlias GCCRegAliases[]; 3288 std::string CPU; 3289public: 3290 HexagonTargetInfo(const std::string& triple) : TargetInfo(triple) { 3291 BigEndian = false; 3292 DescriptionString = ("e-p:32:32:32-" 3293 "i64:64:64-i32:32:32-i16:16:16-i1:32:32" 3294 "f64:64:64-f32:32:32-a0:0-n32"); 3295 3296 // {} in inline assembly are packet specifiers, not assembly variant 3297 // specifiers. 3298 NoAsmVariants = true; 3299 } 3300 3301 virtual void getTargetBuiltins(const Builtin::Info *&Records, 3302 unsigned &NumRecords) const { 3303 Records = BuiltinInfo; 3304 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin; 3305 } 3306 3307 virtual bool validateAsmConstraint(const char *&Name, 3308 TargetInfo::ConstraintInfo &Info) const { 3309 return true; 3310 } 3311 3312 virtual void getTargetDefines(const LangOptions &Opts, 3313 MacroBuilder &Builder) const; 3314 3315 virtual bool hasFeature(StringRef Feature) const { 3316 return Feature == "hexagon"; 3317 } 3318 3319 virtual BuiltinVaListKind getBuiltinVaListKind() const { 3320 return TargetInfo::CharPtrBuiltinVaList; 3321 } 3322 virtual void getGCCRegNames(const char * const *&Names, 3323 unsigned &NumNames) const; 3324 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 3325 unsigned &NumAliases) const; 3326 virtual const char *getClobbers() const { 3327 return ""; 3328 } 3329 3330 static const char *getHexagonCPUSuffix(StringRef Name) { 3331 return llvm::StringSwitch<const char*>(Name) 3332 .Case("hexagonv2", "2") 3333 .Case("hexagonv3", "3") 3334 .Case("hexagonv4", "4") 3335 .Case("hexagonv5", "5") 3336 .Default(0); 3337 } 3338 3339 virtual bool setCPU(const std::string &Name) { 3340 if (!getHexagonCPUSuffix(Name)) 3341 return false; 3342 3343 CPU = Name; 3344 return true; 3345 } 3346}; 3347 3348void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts, 3349 MacroBuilder &Builder) const { 3350 Builder.defineMacro("qdsp6"); 3351 Builder.defineMacro("__qdsp6", "1"); 3352 Builder.defineMacro("__qdsp6__", "1"); 3353 3354 Builder.defineMacro("hexagon"); 3355 Builder.defineMacro("__hexagon", "1"); 3356 Builder.defineMacro("__hexagon__", "1"); 3357 3358 if(CPU == "hexagonv1") { 3359 Builder.defineMacro("__HEXAGON_V1__"); 3360 Builder.defineMacro("__HEXAGON_ARCH__", "1"); 3361 if(Opts.HexagonQdsp6Compat) { 3362 Builder.defineMacro("__QDSP6_V1__"); 3363 Builder.defineMacro("__QDSP6_ARCH__", "1"); 3364 } 3365 } 3366 else if(CPU == "hexagonv2") { 3367 Builder.defineMacro("__HEXAGON_V2__"); 3368 Builder.defineMacro("__HEXAGON_ARCH__", "2"); 3369 if(Opts.HexagonQdsp6Compat) { 3370 Builder.defineMacro("__QDSP6_V2__"); 3371 Builder.defineMacro("__QDSP6_ARCH__", "2"); 3372 } 3373 } 3374 else if(CPU == "hexagonv3") { 3375 Builder.defineMacro("__HEXAGON_V3__"); 3376 Builder.defineMacro("__HEXAGON_ARCH__", "3"); 3377 if(Opts.HexagonQdsp6Compat) { 3378 Builder.defineMacro("__QDSP6_V3__"); 3379 Builder.defineMacro("__QDSP6_ARCH__", "3"); 3380 } 3381 } 3382 else if(CPU == "hexagonv4") { 3383 Builder.defineMacro("__HEXAGON_V4__"); 3384 Builder.defineMacro("__HEXAGON_ARCH__", "4"); 3385 if(Opts.HexagonQdsp6Compat) { 3386 Builder.defineMacro("__QDSP6_V4__"); 3387 Builder.defineMacro("__QDSP6_ARCH__", "4"); 3388 } 3389 } 3390 else if(CPU == "hexagonv5") { 3391 Builder.defineMacro("__HEXAGON_V5__"); 3392 Builder.defineMacro("__HEXAGON_ARCH__", "5"); 3393 if(Opts.HexagonQdsp6Compat) { 3394 Builder.defineMacro("__QDSP6_V5__"); 3395 Builder.defineMacro("__QDSP6_ARCH__", "5"); 3396 } 3397 } 3398} 3399 3400const char * const HexagonTargetInfo::GCCRegNames[] = { 3401 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", 3402 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", 3403 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", 3404 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31", 3405 "p0", "p1", "p2", "p3", 3406 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp" 3407}; 3408 3409void HexagonTargetInfo::getGCCRegNames(const char * const *&Names, 3410 unsigned &NumNames) const { 3411 Names = GCCRegNames; 3412 NumNames = llvm::array_lengthof(GCCRegNames); 3413} 3414 3415 3416const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = { 3417 { { "sp" }, "r29" }, 3418 { { "fp" }, "r30" }, 3419 { { "lr" }, "r31" }, 3420 }; 3421 3422void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases, 3423 unsigned &NumAliases) const { 3424 Aliases = GCCRegAliases; 3425 NumAliases = llvm::array_lengthof(GCCRegAliases); 3426} 3427 3428 3429const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = { 3430#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES }, 3431#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\ 3432 ALL_LANGUAGES }, 3433#include "clang/Basic/BuiltinsHexagon.def" 3434}; 3435} 3436 3437 3438namespace { 3439class SparcV8TargetInfo : public TargetInfo { 3440 static const TargetInfo::GCCRegAlias GCCRegAliases[]; 3441 static const char * const GCCRegNames[]; 3442 bool SoftFloat; 3443public: 3444 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) { 3445 // FIXME: Support Sparc quad-precision long double? 3446 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 3447 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32"; 3448 } 3449 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features, 3450 StringRef Name, 3451 bool Enabled) const { 3452 if (Name == "soft-float") 3453 Features[Name] = Enabled; 3454 else 3455 return false; 3456 3457 return true; 3458 } 3459 virtual void HandleTargetFeatures(std::vector<std::string> &Features) { 3460 SoftFloat = false; 3461 for (unsigned i = 0, e = Features.size(); i != e; ++i) 3462 if (Features[i] == "+soft-float") 3463 SoftFloat = true; 3464 } 3465 virtual void getTargetDefines(const LangOptions &Opts, 3466 MacroBuilder &Builder) const { 3467 DefineStd(Builder, "sparc", Opts); 3468 Builder.defineMacro("__sparcv8"); 3469 Builder.defineMacro("__REGISTER_PREFIX__", ""); 3470 3471 if (SoftFloat) 3472 Builder.defineMacro("SOFT_FLOAT", "1"); 3473 } 3474 3475 virtual bool hasFeature(StringRef Feature) const { 3476 return llvm::StringSwitch<bool>(Feature) 3477 .Case("softfloat", SoftFloat) 3478 .Case("sparc", true) 3479 .Default(false); 3480 } 3481 3482 virtual void getTargetBuiltins(const Builtin::Info *&Records, 3483 unsigned &NumRecords) const { 3484 // FIXME: Implement! 3485 } 3486 virtual BuiltinVaListKind getBuiltinVaListKind() const { 3487 return TargetInfo::VoidPtrBuiltinVaList; 3488 } 3489 virtual void getGCCRegNames(const char * const *&Names, 3490 unsigned &NumNames) const; 3491 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 3492 unsigned &NumAliases) const; 3493 virtual bool validateAsmConstraint(const char *&Name, 3494 TargetInfo::ConstraintInfo &info) const { 3495 // FIXME: Implement! 3496 return false; 3497 } 3498 virtual const char *getClobbers() const { 3499 // FIXME: Implement! 3500 return ""; 3501 } 3502}; 3503 3504const char * const SparcV8TargetInfo::GCCRegNames[] = { 3505 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", 3506 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", 3507 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", 3508 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31" 3509}; 3510 3511void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names, 3512 unsigned &NumNames) const { 3513 Names = GCCRegNames; 3514 NumNames = llvm::array_lengthof(GCCRegNames); 3515} 3516 3517const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = { 3518 { { "g0" }, "r0" }, 3519 { { "g1" }, "r1" }, 3520 { { "g2" }, "r2" }, 3521 { { "g3" }, "r3" }, 3522 { { "g4" }, "r4" }, 3523 { { "g5" }, "r5" }, 3524 { { "g6" }, "r6" }, 3525 { { "g7" }, "r7" }, 3526 { { "o0" }, "r8" }, 3527 { { "o1" }, "r9" }, 3528 { { "o2" }, "r10" }, 3529 { { "o3" }, "r11" }, 3530 { { "o4" }, "r12" }, 3531 { { "o5" }, "r13" }, 3532 { { "o6", "sp" }, "r14" }, 3533 { { "o7" }, "r15" }, 3534 { { "l0" }, "r16" }, 3535 { { "l1" }, "r17" }, 3536 { { "l2" }, "r18" }, 3537 { { "l3" }, "r19" }, 3538 { { "l4" }, "r20" }, 3539 { { "l5" }, "r21" }, 3540 { { "l6" }, "r22" }, 3541 { { "l7" }, "r23" }, 3542 { { "i0" }, "r24" }, 3543 { { "i1" }, "r25" }, 3544 { { "i2" }, "r26" }, 3545 { { "i3" }, "r27" }, 3546 { { "i4" }, "r28" }, 3547 { { "i5" }, "r29" }, 3548 { { "i6", "fp" }, "r30" }, 3549 { { "i7" }, "r31" }, 3550}; 3551 3552void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases, 3553 unsigned &NumAliases) const { 3554 Aliases = GCCRegAliases; 3555 NumAliases = llvm::array_lengthof(GCCRegAliases); 3556} 3557} // end anonymous namespace. 3558 3559namespace { 3560class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> { 3561public: 3562 AuroraUXSparcV8TargetInfo(const std::string& triple) : 3563 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) { 3564 SizeType = UnsignedInt; 3565 PtrDiffType = SignedInt; 3566 } 3567}; 3568class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> { 3569public: 3570 SolarisSparcV8TargetInfo(const std::string& triple) : 3571 SolarisTargetInfo<SparcV8TargetInfo>(triple) { 3572 SizeType = UnsignedInt; 3573 PtrDiffType = SignedInt; 3574 } 3575}; 3576} // end anonymous namespace. 3577 3578namespace { 3579 class MSP430TargetInfo : public TargetInfo { 3580 static const char * const GCCRegNames[]; 3581 public: 3582 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) { 3583 BigEndian = false; 3584 TLSSupported = false; 3585 IntWidth = 16; IntAlign = 16; 3586 LongWidth = 32; LongLongWidth = 64; 3587 LongAlign = LongLongAlign = 16; 3588 PointerWidth = 16; PointerAlign = 16; 3589 SuitableAlign = 16; 3590 SizeType = UnsignedInt; 3591 IntMaxType = SignedLong; 3592 UIntMaxType = UnsignedLong; 3593 IntPtrType = SignedShort; 3594 PtrDiffType = SignedInt; 3595 SigAtomicType = SignedLong; 3596 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16"; 3597 } 3598 virtual void getTargetDefines(const LangOptions &Opts, 3599 MacroBuilder &Builder) const { 3600 Builder.defineMacro("MSP430"); 3601 Builder.defineMacro("__MSP430__"); 3602 // FIXME: defines for different 'flavours' of MCU 3603 } 3604 virtual void getTargetBuiltins(const Builtin::Info *&Records, 3605 unsigned &NumRecords) const { 3606 // FIXME: Implement. 3607 Records = 0; 3608 NumRecords = 0; 3609 } 3610 virtual bool hasFeature(StringRef Feature) const { 3611 return Feature == "msp430"; 3612 } 3613 virtual void getGCCRegNames(const char * const *&Names, 3614 unsigned &NumNames) const; 3615 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 3616 unsigned &NumAliases) const { 3617 // No aliases. 3618 Aliases = 0; 3619 NumAliases = 0; 3620 } 3621 virtual bool validateAsmConstraint(const char *&Name, 3622 TargetInfo::ConstraintInfo &info) const { 3623 // No target constraints for now. 3624 return false; 3625 } 3626 virtual const char *getClobbers() const { 3627 // FIXME: Is this really right? 3628 return ""; 3629 } 3630 virtual BuiltinVaListKind getBuiltinVaListKind() const { 3631 // FIXME: implement 3632 return TargetInfo::CharPtrBuiltinVaList; 3633 } 3634 }; 3635 3636 const char * const MSP430TargetInfo::GCCRegNames[] = { 3637 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", 3638 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15" 3639 }; 3640 3641 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names, 3642 unsigned &NumNames) const { 3643 Names = GCCRegNames; 3644 NumNames = llvm::array_lengthof(GCCRegNames); 3645 } 3646} 3647 3648namespace { 3649 3650 // LLVM and Clang cannot be used directly to output native binaries for 3651 // target, but is used to compile C code to llvm bitcode with correct 3652 // type and alignment information. 3653 // 3654 // TCE uses the llvm bitcode as input and uses it for generating customized 3655 // target processor and program binary. TCE co-design environment is 3656 // publicly available in http://tce.cs.tut.fi 3657 3658 static const unsigned TCEOpenCLAddrSpaceMap[] = { 3659 3, // opencl_global 3660 4, // opencl_local 3661 5, // opencl_constant 3662 0, // cuda_device 3663 0, // cuda_constant 3664 0 // cuda_shared 3665 }; 3666 3667 class TCETargetInfo : public TargetInfo{ 3668 public: 3669 TCETargetInfo(const std::string& triple) : TargetInfo(triple) { 3670 TLSSupported = false; 3671 IntWidth = 32; 3672 LongWidth = LongLongWidth = 32; 3673 PointerWidth = 32; 3674 IntAlign = 32; 3675 LongAlign = LongLongAlign = 32; 3676 PointerAlign = 32; 3677 SuitableAlign = 32; 3678 SizeType = UnsignedInt; 3679 IntMaxType = SignedLong; 3680 UIntMaxType = UnsignedLong; 3681 IntPtrType = SignedInt; 3682 PtrDiffType = SignedInt; 3683 FloatWidth = 32; 3684 FloatAlign = 32; 3685 DoubleWidth = 32; 3686 DoubleAlign = 32; 3687 LongDoubleWidth = 32; 3688 LongDoubleAlign = 32; 3689 FloatFormat = &llvm::APFloat::IEEEsingle; 3690 DoubleFormat = &llvm::APFloat::IEEEsingle; 3691 LongDoubleFormat = &llvm::APFloat::IEEEsingle; 3692 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-" 3693 "i16:16:32-i32:32:32-i64:32:32-" 3694 "f32:32:32-f64:32:32-v64:32:32-" 3695 "v128:32:32-a0:0:32-n32"; 3696 AddrSpaceMap = &TCEOpenCLAddrSpaceMap; 3697 } 3698 3699 virtual void getTargetDefines(const LangOptions &Opts, 3700 MacroBuilder &Builder) const { 3701 DefineStd(Builder, "tce", Opts); 3702 Builder.defineMacro("__TCE__"); 3703 Builder.defineMacro("__TCE_V1__"); 3704 } 3705 virtual bool hasFeature(StringRef Feature) const { 3706 return Feature == "tce"; 3707 } 3708 3709 virtual void getTargetBuiltins(const Builtin::Info *&Records, 3710 unsigned &NumRecords) const {} 3711 virtual const char *getClobbers() const { 3712 return ""; 3713 } 3714 virtual BuiltinVaListKind getBuiltinVaListKind() const { 3715 return TargetInfo::VoidPtrBuiltinVaList; 3716 } 3717 virtual void getGCCRegNames(const char * const *&Names, 3718 unsigned &NumNames) const {} 3719 virtual bool validateAsmConstraint(const char *&Name, 3720 TargetInfo::ConstraintInfo &info) const { 3721 return true; 3722 } 3723 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 3724 unsigned &NumAliases) const {} 3725 }; 3726} 3727 3728namespace { 3729class MipsTargetInfoBase : public TargetInfo { 3730 static const Builtin::Info BuiltinInfo[]; 3731 std::string CPU; 3732 bool IsMips16; 3733 enum MipsFloatABI { 3734 HardFloat, SingleFloat, SoftFloat 3735 } FloatABI; 3736 enum DspRevEnum { 3737 NoDSP, DSP1, DSP2 3738 } DspRev; 3739 3740protected: 3741 std::string ABI; 3742 3743public: 3744 MipsTargetInfoBase(const std::string& triple, 3745 const std::string& ABIStr, 3746 const std::string& CPUStr) 3747 : TargetInfo(triple), 3748 CPU(CPUStr), 3749 IsMips16(false), 3750 FloatABI(HardFloat), 3751 DspRev(NoDSP), 3752 ABI(ABIStr) 3753 {} 3754 3755 virtual const char *getABI() const { return ABI.c_str(); } 3756 virtual bool setABI(const std::string &Name) = 0; 3757 virtual bool setCPU(const std::string &Name) { 3758 CPU = Name; 3759 return true; 3760 } 3761 void getDefaultFeatures(llvm::StringMap<bool> &Features) const { 3762 Features[ABI] = true; 3763 Features[CPU] = true; 3764 } 3765 3766 virtual void getTargetDefines(const LangOptions &Opts, 3767 MacroBuilder &Builder) const { 3768 DefineStd(Builder, "mips", Opts); 3769 Builder.defineMacro("_mips"); 3770 Builder.defineMacro("__REGISTER_PREFIX__", ""); 3771 3772 switch (FloatABI) { 3773 case HardFloat: 3774 Builder.defineMacro("__mips_hard_float", Twine(1)); 3775 break; 3776 case SingleFloat: 3777 Builder.defineMacro("__mips_hard_float", Twine(1)); 3778 Builder.defineMacro("__mips_single_float", Twine(1)); 3779 break; 3780 case SoftFloat: 3781 Builder.defineMacro("__mips_soft_float", Twine(1)); 3782 break; 3783 } 3784 3785 if (IsMips16) 3786 Builder.defineMacro("__mips16", Twine(1)); 3787 3788 switch (DspRev) { 3789 default: 3790 break; 3791 case DSP1: 3792 Builder.defineMacro("__mips_dsp_rev", Twine(1)); 3793 Builder.defineMacro("__mips_dsp", Twine(1)); 3794 break; 3795 case DSP2: 3796 Builder.defineMacro("__mips_dsp_rev", Twine(2)); 3797 Builder.defineMacro("__mips_dspr2", Twine(1)); 3798 Builder.defineMacro("__mips_dsp", Twine(1)); 3799 break; 3800 } 3801 3802 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0))); 3803 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth())); 3804 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth())); 3805 3806 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\""); 3807 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper()); 3808 } 3809 3810 virtual void getTargetBuiltins(const Builtin::Info *&Records, 3811 unsigned &NumRecords) const { 3812 Records = BuiltinInfo; 3813 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin; 3814 } 3815 virtual bool hasFeature(StringRef Feature) const { 3816 return Feature == "mips"; 3817 } 3818 virtual BuiltinVaListKind getBuiltinVaListKind() const { 3819 return TargetInfo::VoidPtrBuiltinVaList; 3820 } 3821 virtual void getGCCRegNames(const char * const *&Names, 3822 unsigned &NumNames) const { 3823 static const char * const GCCRegNames[] = { 3824 // CPU register names 3825 // Must match second column of GCCRegAliases 3826 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7", 3827 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", 3828 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23", 3829 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31", 3830 // Floating point register names 3831 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7", 3832 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15", 3833 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23", 3834 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31", 3835 // Hi/lo and condition register names 3836 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4", 3837 "$fcc5","$fcc6","$fcc7" 3838 }; 3839 Names = GCCRegNames; 3840 NumNames = llvm::array_lengthof(GCCRegNames); 3841 } 3842 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 3843 unsigned &NumAliases) const = 0; 3844 virtual bool validateAsmConstraint(const char *&Name, 3845 TargetInfo::ConstraintInfo &Info) const { 3846 switch (*Name) { 3847 default: 3848 return false; 3849 3850 case 'r': // CPU registers. 3851 case 'd': // Equivalent to "r" unless generating MIPS16 code. 3852 case 'y': // Equivalent to "r", backwards compatibility only. 3853 case 'f': // floating-point registers. 3854 case 'c': // $25 for indirect jumps 3855 case 'l': // lo register 3856 case 'x': // hilo register pair 3857 Info.setAllowsRegister(); 3858 return true; 3859 } 3860 } 3861 3862 virtual const char *getClobbers() const { 3863 // FIXME: Implement! 3864 return ""; 3865 } 3866 3867 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features, 3868 StringRef Name, 3869 bool Enabled) const { 3870 if (Name == "soft-float" || Name == "single-float" || 3871 Name == "o32" || Name == "n32" || Name == "n64" || Name == "eabi" || 3872 Name == "mips32" || Name == "mips32r2" || 3873 Name == "mips64" || Name == "mips64r2" || 3874 Name == "mips16" || Name == "dsp" || Name == "dspr2") { 3875 Features[Name] = Enabled; 3876 return true; 3877 } 3878 return false; 3879 } 3880 3881 virtual void HandleTargetFeatures(std::vector<std::string> &Features) { 3882 IsMips16 = false; 3883 FloatABI = HardFloat; 3884 DspRev = NoDSP; 3885 3886 for (std::vector<std::string>::iterator it = Features.begin(), 3887 ie = Features.end(); it != ie; ++it) { 3888 if (*it == "+single-float") 3889 FloatABI = SingleFloat; 3890 else if (*it == "+soft-float") 3891 FloatABI = SoftFloat; 3892 else if (*it == "+mips16") 3893 IsMips16 = true; 3894 else if (*it == "+dsp") 3895 DspRev = std::max(DspRev, DSP1); 3896 else if (*it == "+dspr2") 3897 DspRev = std::max(DspRev, DSP2); 3898 } 3899 3900 // Remove front-end specific option. 3901 std::vector<std::string>::iterator it = 3902 std::find(Features.begin(), Features.end(), "+soft-float"); 3903 if (it != Features.end()) 3904 Features.erase(it); 3905 } 3906}; 3907 3908const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = { 3909#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES }, 3910#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\ 3911 ALL_LANGUAGES }, 3912#include "clang/Basic/BuiltinsMips.def" 3913}; 3914 3915class Mips32TargetInfoBase : public MipsTargetInfoBase { 3916public: 3917 Mips32TargetInfoBase(const std::string& triple) : 3918 MipsTargetInfoBase(triple, "o32", "mips32") { 3919 SizeType = UnsignedInt; 3920 PtrDiffType = SignedInt; 3921 } 3922 virtual bool setABI(const std::string &Name) { 3923 if ((Name == "o32") || (Name == "eabi")) { 3924 ABI = Name; 3925 return true; 3926 } else 3927 return false; 3928 } 3929 virtual void getTargetDefines(const LangOptions &Opts, 3930 MacroBuilder &Builder) const { 3931 MipsTargetInfoBase::getTargetDefines(Opts, Builder); 3932 3933 if (ABI == "o32") { 3934 Builder.defineMacro("__mips_o32"); 3935 Builder.defineMacro("_ABIO32", "1"); 3936 Builder.defineMacro("_MIPS_SIM", "_ABIO32"); 3937 } 3938 else if (ABI == "eabi") 3939 Builder.defineMacro("__mips_eabi"); 3940 else 3941 llvm_unreachable("Invalid ABI for Mips32."); 3942 } 3943 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 3944 unsigned &NumAliases) const { 3945 static const TargetInfo::GCCRegAlias GCCRegAliases[] = { 3946 { { "at" }, "$1" }, 3947 { { "v0" }, "$2" }, 3948 { { "v1" }, "$3" }, 3949 { { "a0" }, "$4" }, 3950 { { "a1" }, "$5" }, 3951 { { "a2" }, "$6" }, 3952 { { "a3" }, "$7" }, 3953 { { "t0" }, "$8" }, 3954 { { "t1" }, "$9" }, 3955 { { "t2" }, "$10" }, 3956 { { "t3" }, "$11" }, 3957 { { "t4" }, "$12" }, 3958 { { "t5" }, "$13" }, 3959 { { "t6" }, "$14" }, 3960 { { "t7" }, "$15" }, 3961 { { "s0" }, "$16" }, 3962 { { "s1" }, "$17" }, 3963 { { "s2" }, "$18" }, 3964 { { "s3" }, "$19" }, 3965 { { "s4" }, "$20" }, 3966 { { "s5" }, "$21" }, 3967 { { "s6" }, "$22" }, 3968 { { "s7" }, "$23" }, 3969 { { "t8" }, "$24" }, 3970 { { "t9" }, "$25" }, 3971 { { "k0" }, "$26" }, 3972 { { "k1" }, "$27" }, 3973 { { "gp" }, "$28" }, 3974 { { "sp","$sp" }, "$29" }, 3975 { { "fp","$fp" }, "$30" }, 3976 { { "ra" }, "$31" } 3977 }; 3978 Aliases = GCCRegAliases; 3979 NumAliases = llvm::array_lengthof(GCCRegAliases); 3980 } 3981}; 3982 3983class Mips32EBTargetInfo : public Mips32TargetInfoBase { 3984public: 3985 Mips32EBTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) { 3986 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-" 3987 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32"; 3988 } 3989 virtual void getTargetDefines(const LangOptions &Opts, 3990 MacroBuilder &Builder) const { 3991 DefineStd(Builder, "MIPSEB", Opts); 3992 Builder.defineMacro("_MIPSEB"); 3993 Mips32TargetInfoBase::getTargetDefines(Opts, Builder); 3994 } 3995}; 3996 3997class Mips32ELTargetInfo : public Mips32TargetInfoBase { 3998public: 3999 Mips32ELTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) { 4000 BigEndian = false; 4001 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-" 4002 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32"; 4003 } 4004 virtual void getTargetDefines(const LangOptions &Opts, 4005 MacroBuilder &Builder) const { 4006 DefineStd(Builder, "MIPSEL", Opts); 4007 Builder.defineMacro("_MIPSEL"); 4008 Mips32TargetInfoBase::getTargetDefines(Opts, Builder); 4009 } 4010}; 4011 4012class Mips64TargetInfoBase : public MipsTargetInfoBase { 4013 virtual void SetDescriptionString(const std::string &Name) = 0; 4014public: 4015 Mips64TargetInfoBase(const std::string& triple) : 4016 MipsTargetInfoBase(triple, "n64", "mips64") { 4017 LongWidth = LongAlign = 64; 4018 PointerWidth = PointerAlign = 64; 4019 LongDoubleWidth = LongDoubleAlign = 128; 4020 LongDoubleFormat = &llvm::APFloat::IEEEquad; 4021 SuitableAlign = 128; 4022 } 4023 virtual bool setABI(const std::string &Name) { 4024 SetDescriptionString(Name); 4025 4026 if (Name != "n32" && Name != "n64") 4027 return false; 4028 4029 ABI = Name; 4030 4031 if (Name == "n32") { 4032 LongWidth = LongAlign = 32; 4033 PointerWidth = PointerAlign = 32; 4034 } 4035 4036 return true; 4037 } 4038 virtual void getTargetDefines(const LangOptions &Opts, 4039 MacroBuilder &Builder) const { 4040 MipsTargetInfoBase::getTargetDefines(Opts, Builder); 4041 4042 Builder.defineMacro("__mips64"); 4043 Builder.defineMacro("__mips64__"); 4044 4045 if (ABI == "n32") { 4046 Builder.defineMacro("__mips_n32"); 4047 Builder.defineMacro("_ABIN32", "2"); 4048 Builder.defineMacro("_MIPS_SIM", "_ABIN32"); 4049 } 4050 else if (ABI == "n64") { 4051 Builder.defineMacro("__mips_n64"); 4052 Builder.defineMacro("_ABI64", "3"); 4053 Builder.defineMacro("_MIPS_SIM", "_ABI64"); 4054 } 4055 else 4056 llvm_unreachable("Invalid ABI for Mips64."); 4057 } 4058 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 4059 unsigned &NumAliases) const { 4060 static const TargetInfo::GCCRegAlias GCCRegAliases[] = { 4061 { { "at" }, "$1" }, 4062 { { "v0" }, "$2" }, 4063 { { "v1" }, "$3" }, 4064 { { "a0" }, "$4" }, 4065 { { "a1" }, "$5" }, 4066 { { "a2" }, "$6" }, 4067 { { "a3" }, "$7" }, 4068 { { "a4" }, "$8" }, 4069 { { "a5" }, "$9" }, 4070 { { "a6" }, "$10" }, 4071 { { "a7" }, "$11" }, 4072 { { "t0" }, "$12" }, 4073 { { "t1" }, "$13" }, 4074 { { "t2" }, "$14" }, 4075 { { "t3" }, "$15" }, 4076 { { "s0" }, "$16" }, 4077 { { "s1" }, "$17" }, 4078 { { "s2" }, "$18" }, 4079 { { "s3" }, "$19" }, 4080 { { "s4" }, "$20" }, 4081 { { "s5" }, "$21" }, 4082 { { "s6" }, "$22" }, 4083 { { "s7" }, "$23" }, 4084 { { "t8" }, "$24" }, 4085 { { "t9" }, "$25" }, 4086 { { "k0" }, "$26" }, 4087 { { "k1" }, "$27" }, 4088 { { "gp" }, "$28" }, 4089 { { "sp","$sp" }, "$29" }, 4090 { { "fp","$fp" }, "$30" }, 4091 { { "ra" }, "$31" } 4092 }; 4093 Aliases = GCCRegAliases; 4094 NumAliases = llvm::array_lengthof(GCCRegAliases); 4095 } 4096}; 4097 4098class Mips64EBTargetInfo : public Mips64TargetInfoBase { 4099 virtual void SetDescriptionString(const std::string &Name) { 4100 // Change DescriptionString only if ABI is n32. 4101 if (Name == "n32") 4102 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-" 4103 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-" 4104 "v64:64:64-n32"; 4105 } 4106public: 4107 Mips64EBTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) { 4108 // Default ABI is n64. 4109 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:32-i16:16:32-i32:32:32-" 4110 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-" 4111 "v64:64:64-n32"; 4112 } 4113 virtual void getTargetDefines(const LangOptions &Opts, 4114 MacroBuilder &Builder) const { 4115 DefineStd(Builder, "MIPSEB", Opts); 4116 Builder.defineMacro("_MIPSEB"); 4117 Mips64TargetInfoBase::getTargetDefines(Opts, Builder); 4118 } 4119}; 4120 4121class Mips64ELTargetInfo : public Mips64TargetInfoBase { 4122 virtual void SetDescriptionString(const std::string &Name) { 4123 // Change DescriptionString only if ABI is n32. 4124 if (Name == "n32") 4125 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-" 4126 "i64:64:64-f32:32:32-f64:64:64-f128:128:128" 4127 "-v64:64:64-n32"; 4128 } 4129public: 4130 Mips64ELTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) { 4131 // Default ABI is n64. 4132 BigEndian = false; 4133 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:32-i16:16:32-i32:32:32-" 4134 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-" 4135 "v64:64:64-n32"; 4136 } 4137 virtual void getTargetDefines(const LangOptions &Opts, 4138 MacroBuilder &Builder) const { 4139 DefineStd(Builder, "MIPSEL", Opts); 4140 Builder.defineMacro("_MIPSEL"); 4141 Mips64TargetInfoBase::getTargetDefines(Opts, Builder); 4142 } 4143}; 4144} // end anonymous namespace. 4145 4146namespace { 4147class PNaClTargetInfo : public TargetInfo { 4148public: 4149 PNaClTargetInfo(const std::string& triple) : TargetInfo(triple) { 4150 BigEndian = false; 4151 this->UserLabelPrefix = ""; 4152 this->LongAlign = 32; 4153 this->LongWidth = 32; 4154 this->PointerAlign = 32; 4155 this->PointerWidth = 32; 4156 this->IntMaxType = TargetInfo::SignedLongLong; 4157 this->UIntMaxType = TargetInfo::UnsignedLongLong; 4158 this->Int64Type = TargetInfo::SignedLongLong; 4159 this->DoubleAlign = 64; 4160 this->LongDoubleWidth = 64; 4161 this->LongDoubleAlign = 64; 4162 this->SizeType = TargetInfo::UnsignedInt; 4163 this->PtrDiffType = TargetInfo::SignedInt; 4164 this->IntPtrType = TargetInfo::SignedInt; 4165 this->RegParmMax = 2; 4166 DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-" 4167 "f32:32:32-f64:64:64-p:32:32:32-v128:32:32"; 4168 } 4169 4170 void getDefaultFeatures(llvm::StringMap<bool> &Features) const { 4171 } 4172 virtual void getArchDefines(const LangOptions &Opts, 4173 MacroBuilder &Builder) const { 4174 Builder.defineMacro("__le32__"); 4175 Builder.defineMacro("__pnacl__"); 4176 } 4177 virtual void getTargetDefines(const LangOptions &Opts, 4178 MacroBuilder &Builder) const { 4179 DefineStd(Builder, "unix", Opts); 4180 Builder.defineMacro("__ELF__"); 4181 if (Opts.POSIXThreads) 4182 Builder.defineMacro("_REENTRANT"); 4183 if (Opts.CPlusPlus) 4184 Builder.defineMacro("_GNU_SOURCE"); 4185 4186 Builder.defineMacro("__LITTLE_ENDIAN__"); 4187 Builder.defineMacro("__native_client__"); 4188 getArchDefines(Opts, Builder); 4189 } 4190 virtual bool hasFeature(StringRef Feature) const { 4191 return Feature == "pnacl"; 4192 } 4193 virtual void getTargetBuiltins(const Builtin::Info *&Records, 4194 unsigned &NumRecords) const { 4195 } 4196 virtual BuiltinVaListKind getBuiltinVaListKind() const { 4197 return TargetInfo::PNaClABIBuiltinVaList; 4198 } 4199 virtual void getGCCRegNames(const char * const *&Names, 4200 unsigned &NumNames) const; 4201 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, 4202 unsigned &NumAliases) const; 4203 virtual bool validateAsmConstraint(const char *&Name, 4204 TargetInfo::ConstraintInfo &Info) const { 4205 return false; 4206 } 4207 4208 virtual const char *getClobbers() const { 4209 return ""; 4210 } 4211}; 4212 4213void PNaClTargetInfo::getGCCRegNames(const char * const *&Names, 4214 unsigned &NumNames) const { 4215 Names = NULL; 4216 NumNames = 0; 4217} 4218 4219void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases, 4220 unsigned &NumAliases) const { 4221 Aliases = NULL; 4222 NumAliases = 0; 4223} 4224} // end anonymous namespace. 4225 4226 4227//===----------------------------------------------------------------------===// 4228// Driver code 4229//===----------------------------------------------------------------------===// 4230 4231static TargetInfo *AllocateTarget(const std::string &T) { 4232 llvm::Triple Triple(T); 4233 llvm::Triple::OSType os = Triple.getOS(); 4234 4235 switch (Triple.getArch()) { 4236 default: 4237 return NULL; 4238 4239 case llvm::Triple::hexagon: 4240 return new HexagonTargetInfo(T); 4241 4242 case llvm::Triple::arm: 4243 case llvm::Triple::thumb: 4244 if (Triple.isOSDarwin()) 4245 return new DarwinARMTargetInfo(T); 4246 4247 switch (os) { 4248 case llvm::Triple::Linux: 4249 return new LinuxTargetInfo<ARMTargetInfo>(T); 4250 case llvm::Triple::FreeBSD: 4251 return new FreeBSDTargetInfo<ARMTargetInfo>(T); 4252 case llvm::Triple::NetBSD: 4253 return new NetBSDTargetInfo<ARMTargetInfo>(T); 4254 case llvm::Triple::OpenBSD: 4255 return new OpenBSDTargetInfo<ARMTargetInfo>(T); 4256 case llvm::Triple::Bitrig: 4257 return new BitrigTargetInfo<ARMTargetInfo>(T); 4258 case llvm::Triple::RTEMS: 4259 return new RTEMSTargetInfo<ARMTargetInfo>(T); 4260 default: 4261 return new ARMTargetInfo(T); 4262 } 4263 4264 case llvm::Triple::msp430: 4265 return new MSP430TargetInfo(T); 4266 4267 case llvm::Triple::mips: 4268 switch (os) { 4269 case llvm::Triple::Linux: 4270 return new LinuxTargetInfo<Mips32EBTargetInfo>(T); 4271 case llvm::Triple::RTEMS: 4272 return new RTEMSTargetInfo<Mips32EBTargetInfo>(T); 4273 case llvm::Triple::FreeBSD: 4274 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(T); 4275 case llvm::Triple::NetBSD: 4276 return new NetBSDTargetInfo<Mips32EBTargetInfo>(T); 4277 default: 4278 return new Mips32EBTargetInfo(T); 4279 } 4280 4281 case llvm::Triple::mipsel: 4282 switch (os) { 4283 case llvm::Triple::Linux: 4284 return new LinuxTargetInfo<Mips32ELTargetInfo>(T); 4285 case llvm::Triple::RTEMS: 4286 return new RTEMSTargetInfo<Mips32ELTargetInfo>(T); 4287 case llvm::Triple::FreeBSD: 4288 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(T); 4289 case llvm::Triple::NetBSD: 4290 return new NetBSDTargetInfo<Mips32ELTargetInfo>(T); 4291 default: 4292 return new Mips32ELTargetInfo(T); 4293 } 4294 4295 case llvm::Triple::mips64: 4296 switch (os) { 4297 case llvm::Triple::Linux: 4298 return new LinuxTargetInfo<Mips64EBTargetInfo>(T); 4299 case llvm::Triple::RTEMS: 4300 return new RTEMSTargetInfo<Mips64EBTargetInfo>(T); 4301 case llvm::Triple::FreeBSD: 4302 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(T); 4303 case llvm::Triple::NetBSD: 4304 return new NetBSDTargetInfo<Mips64EBTargetInfo>(T); 4305 case llvm::Triple::OpenBSD: 4306 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(T); 4307 default: 4308 return new Mips64EBTargetInfo(T); 4309 } 4310 4311 case llvm::Triple::mips64el: 4312 switch (os) { 4313 case llvm::Triple::Linux: 4314 return new LinuxTargetInfo<Mips64ELTargetInfo>(T); 4315 case llvm::Triple::RTEMS: 4316 return new RTEMSTargetInfo<Mips64ELTargetInfo>(T); 4317 case llvm::Triple::FreeBSD: 4318 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(T); 4319 case llvm::Triple::NetBSD: 4320 return new NetBSDTargetInfo<Mips64ELTargetInfo>(T); 4321 case llvm::Triple::OpenBSD: 4322 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(T); 4323 default: 4324 return new Mips64ELTargetInfo(T); 4325 } 4326 4327 case llvm::Triple::le32: 4328 switch (os) { 4329 case llvm::Triple::NativeClient: 4330 return new PNaClTargetInfo(T); 4331 default: 4332 return NULL; 4333 } 4334 4335 case llvm::Triple::ppc: 4336 if (Triple.isOSDarwin()) 4337 return new DarwinPPC32TargetInfo(T); 4338 switch (os) { 4339 case llvm::Triple::Linux: 4340 return new LinuxTargetInfo<PPC32TargetInfo>(T); 4341 case llvm::Triple::FreeBSD: 4342 return new FreeBSDTargetInfo<PPC32TargetInfo>(T); 4343 case llvm::Triple::NetBSD: 4344 return new NetBSDTargetInfo<PPC32TargetInfo>(T); 4345 case llvm::Triple::OpenBSD: 4346 return new OpenBSDTargetInfo<PPC32TargetInfo>(T); 4347 case llvm::Triple::RTEMS: 4348 return new RTEMSTargetInfo<PPC32TargetInfo>(T); 4349 default: 4350 return new PPC32TargetInfo(T); 4351 } 4352 4353 case llvm::Triple::ppc64: 4354 if (Triple.isOSDarwin()) 4355 return new DarwinPPC64TargetInfo(T); 4356 switch (os) { 4357 case llvm::Triple::Linux: 4358 return new LinuxTargetInfo<PPC64TargetInfo>(T); 4359 case llvm::Triple::Lv2: 4360 return new PS3PPUTargetInfo<PPC64TargetInfo>(T); 4361 case llvm::Triple::FreeBSD: 4362 return new FreeBSDTargetInfo<PPC64TargetInfo>(T); 4363 case llvm::Triple::NetBSD: 4364 return new NetBSDTargetInfo<PPC64TargetInfo>(T); 4365 default: 4366 return new PPC64TargetInfo(T); 4367 } 4368 4369 case llvm::Triple::nvptx: 4370 return new NVPTX32TargetInfo(T); 4371 case llvm::Triple::nvptx64: 4372 return new NVPTX64TargetInfo(T); 4373 4374 case llvm::Triple::mblaze: 4375 return new MBlazeTargetInfo(T); 4376 4377 case llvm::Triple::sparc: 4378 switch (os) { 4379 case llvm::Triple::Linux: 4380 return new LinuxTargetInfo<SparcV8TargetInfo>(T); 4381 case llvm::Triple::AuroraUX: 4382 return new AuroraUXSparcV8TargetInfo(T); 4383 case llvm::Triple::Solaris: 4384 return new SolarisSparcV8TargetInfo(T); 4385 case llvm::Triple::NetBSD: 4386 return new NetBSDTargetInfo<SparcV8TargetInfo>(T); 4387 case llvm::Triple::OpenBSD: 4388 return new OpenBSDTargetInfo<SparcV8TargetInfo>(T); 4389 case llvm::Triple::RTEMS: 4390 return new RTEMSTargetInfo<SparcV8TargetInfo>(T); 4391 default: 4392 return new SparcV8TargetInfo(T); 4393 } 4394 4395 // FIXME: Need a real SPU target. 4396 case llvm::Triple::cellspu: 4397 return new PS3SPUTargetInfo<PPC64TargetInfo>(T); 4398 4399 case llvm::Triple::tce: 4400 return new TCETargetInfo(T); 4401 4402 case llvm::Triple::x86: 4403 if (Triple.isOSDarwin()) 4404 return new DarwinI386TargetInfo(T); 4405 4406 switch (os) { 4407 case llvm::Triple::AuroraUX: 4408 return new AuroraUXTargetInfo<X86_32TargetInfo>(T); 4409 case llvm::Triple::Linux: 4410 return new LinuxTargetInfo<X86_32TargetInfo>(T); 4411 case llvm::Triple::DragonFly: 4412 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T); 4413 case llvm::Triple::NetBSD: 4414 return new NetBSDI386TargetInfo(T); 4415 case llvm::Triple::OpenBSD: 4416 return new OpenBSDI386TargetInfo(T); 4417 case llvm::Triple::Bitrig: 4418 return new BitrigI386TargetInfo(T); 4419 case llvm::Triple::FreeBSD: 4420 return new FreeBSDTargetInfo<X86_32TargetInfo>(T); 4421 case llvm::Triple::Minix: 4422 return new MinixTargetInfo<X86_32TargetInfo>(T); 4423 case llvm::Triple::Solaris: 4424 return new SolarisTargetInfo<X86_32TargetInfo>(T); 4425 case llvm::Triple::Cygwin: 4426 return new CygwinX86_32TargetInfo(T); 4427 case llvm::Triple::MinGW32: 4428 return new MinGWX86_32TargetInfo(T); 4429 case llvm::Triple::Win32: 4430 return new VisualStudioWindowsX86_32TargetInfo(T); 4431 case llvm::Triple::Haiku: 4432 return new HaikuX86_32TargetInfo(T); 4433 case llvm::Triple::RTEMS: 4434 return new RTEMSX86_32TargetInfo(T); 4435 default: 4436 return new X86_32TargetInfo(T); 4437 } 4438 4439 case llvm::Triple::x86_64: 4440 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO) 4441 return new DarwinX86_64TargetInfo(T); 4442 4443 switch (os) { 4444 case llvm::Triple::AuroraUX: 4445 return new AuroraUXTargetInfo<X86_64TargetInfo>(T); 4446 case llvm::Triple::Linux: 4447 return new LinuxTargetInfo<X86_64TargetInfo>(T); 4448 case llvm::Triple::DragonFly: 4449 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T); 4450 case llvm::Triple::NetBSD: 4451 return new NetBSDTargetInfo<X86_64TargetInfo>(T); 4452 case llvm::Triple::OpenBSD: 4453 return new OpenBSDX86_64TargetInfo(T); 4454 case llvm::Triple::Bitrig: 4455 return new BitrigX86_64TargetInfo(T); 4456 case llvm::Triple::FreeBSD: 4457 return new FreeBSDTargetInfo<X86_64TargetInfo>(T); 4458 case llvm::Triple::Solaris: 4459 return new SolarisTargetInfo<X86_64TargetInfo>(T); 4460 case llvm::Triple::MinGW32: 4461 return new MinGWX86_64TargetInfo(T); 4462 case llvm::Triple::Win32: // This is what Triple.h supports now. 4463 return new VisualStudioWindowsX86_64TargetInfo(T); 4464 default: 4465 return new X86_64TargetInfo(T); 4466 } 4467 } 4468} 4469 4470/// CreateTargetInfo - Return the target info object for the specified target 4471/// triple. 4472TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags, 4473 TargetOptions &Opts) { 4474 llvm::Triple Triple(Opts.Triple); 4475 4476 // Construct the target 4477 OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str())); 4478 if (!Target) { 4479 Diags.Report(diag::err_target_unknown_triple) << Triple.str(); 4480 return 0; 4481 } 4482 4483 // Set the target CPU if specified. 4484 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) { 4485 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU; 4486 return 0; 4487 } 4488 4489 // Set the target ABI if specified. 4490 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) { 4491 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI; 4492 return 0; 4493 } 4494 4495 // Set the target C++ ABI. 4496 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) { 4497 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI; 4498 return 0; 4499 } 4500 4501 // Compute the default target features, we need the target to handle this 4502 // because features may have dependencies on one another. 4503 llvm::StringMap<bool> Features; 4504 Target->getDefaultFeatures(Features); 4505 4506 // Apply the user specified deltas. 4507 // First the enables. 4508 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(), 4509 ie = Opts.Features.end(); it != ie; ++it) { 4510 const char *Name = it->c_str(); 4511 4512 if (Name[0] != '+') 4513 continue; 4514 4515 // Apply the feature via the target. 4516 if (!Target->setFeatureEnabled(Features, Name + 1, true)) { 4517 Diags.Report(diag::err_target_invalid_feature) << Name; 4518 return 0; 4519 } 4520 } 4521 4522 // Then the disables. 4523 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(), 4524 ie = Opts.Features.end(); it != ie; ++it) { 4525 const char *Name = it->c_str(); 4526 4527 if (Name[0] == '+') 4528 continue; 4529 4530 // Apply the feature via the target. 4531 if (Name[0] != '-' || 4532 !Target->setFeatureEnabled(Features, Name + 1, false)) { 4533 Diags.Report(diag::err_target_invalid_feature) << Name; 4534 return 0; 4535 } 4536 } 4537 4538 // Add the features to the compile options. 4539 // 4540 // FIXME: If we are completely confident that we have the right set, we only 4541 // need to pass the minuses. 4542 Opts.Features.clear(); 4543 for (llvm::StringMap<bool>::const_iterator it = Features.begin(), 4544 ie = Features.end(); it != ie; ++it) 4545 Opts.Features.push_back((it->second ? "+" : "-") + it->first().str()); 4546 Target->HandleTargetFeatures(Opts.Features); 4547 4548 return Target.take(); 4549} 4550