1 //===--- Targets.cpp - Implement target feature support -------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file implements construction of a TargetInfo object from a 11 // target triple. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #include "clang/Basic/TargetInfo.h" 16 #include "clang/Basic/Builtins.h" 17 #include "clang/Basic/Diagnostic.h" 18 #include "clang/Basic/LangOptions.h" 19 #include "clang/Basic/MacroBuilder.h" 20 #include "clang/Basic/TargetBuiltins.h" 21 #include "clang/Basic/TargetOptions.h" 22 #include "llvm/ADT/APFloat.h" 23 #include "llvm/ADT/STLExtras.h" 24 #include "llvm/ADT/StringExtras.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/Support/TargetParser.h" 31 #include <algorithm> 32 #include <memory> 33 34 using namespace clang; 35 36 //===----------------------------------------------------------------------===// 37 // Common code shared among targets. 38 //===----------------------------------------------------------------------===// 39 40 /// DefineStd - Define a macro name and standard variants. For example if 41 /// MacroName is "unix", then this will define "__unix", "__unix__", and "unix" 42 /// when in GNU mode. 43 static void DefineStd(MacroBuilder &Builder, StringRef MacroName, 44 const LangOptions &Opts) { 45 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace"); 46 47 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier 48 // in the user's namespace. 49 if (Opts.GNUMode) 50 Builder.defineMacro(MacroName); 51 52 // Define __unix. 53 Builder.defineMacro("__" + MacroName); 54 55 // Define __unix__. 56 Builder.defineMacro("__" + MacroName + "__"); 57 } 58 59 static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName, 60 bool Tuning = true) { 61 Builder.defineMacro("__" + CPUName); 62 Builder.defineMacro("__" + CPUName + "__"); 63 if (Tuning) 64 Builder.defineMacro("__tune_" + CPUName + "__"); 65 } 66 67 //===----------------------------------------------------------------------===// 68 // Defines specific to certain operating systems. 69 //===----------------------------------------------------------------------===// 70 71 namespace { 72 template<typename TgtInfo> 73 class OSTargetInfo : public TgtInfo { 74 protected: 75 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 76 MacroBuilder &Builder) const=0; 77 public: 78 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {} 79 void getTargetDefines(const LangOptions &Opts, 80 MacroBuilder &Builder) const override { 81 TgtInfo::getTargetDefines(Opts, Builder); 82 getOSDefines(Opts, TgtInfo::getTriple(), Builder); 83 } 84 85 }; 86 87 // CloudABI Target 88 template <typename Target> 89 class CloudABITargetInfo : public OSTargetInfo<Target> { 90 protected: 91 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 92 MacroBuilder &Builder) const override { 93 Builder.defineMacro("__CloudABI__"); 94 Builder.defineMacro("__ELF__"); 95 96 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t. 97 Builder.defineMacro("__STDC_ISO_10646__", "201206L"); 98 Builder.defineMacro("__STDC_UTF_16__"); 99 Builder.defineMacro("__STDC_UTF_32__"); 100 } 101 102 public: 103 CloudABITargetInfo(const llvm::Triple &Triple) 104 : OSTargetInfo<Target>(Triple) { 105 this->UserLabelPrefix = ""; 106 } 107 }; 108 109 static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts, 110 const llvm::Triple &Triple, 111 StringRef &PlatformName, 112 VersionTuple &PlatformMinVersion) { 113 Builder.defineMacro("__APPLE_CC__", "6000"); 114 Builder.defineMacro("__APPLE__"); 115 Builder.defineMacro("OBJC_NEW_PROPERTIES"); 116 // AddressSanitizer doesn't play well with source fortification, which is on 117 // by default on Darwin. 118 if (Opts.Sanitize.has(SanitizerKind::Address)) 119 Builder.defineMacro("_FORTIFY_SOURCE", "0"); 120 121 if (!Opts.ObjCAutoRefCount) { 122 // __weak is always defined, for use in blocks and with objc pointers. 123 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))"); 124 125 // Darwin defines __strong even in C mode (just to nothing). 126 if (Opts.getGC() != LangOptions::NonGC) 127 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))"); 128 else 129 Builder.defineMacro("__strong", ""); 130 131 // __unsafe_unretained is defined to nothing in non-ARC mode. We even 132 // allow this in C, since one might have block pointers in structs that 133 // are used in pure C code and in Objective-C ARC. 134 Builder.defineMacro("__unsafe_unretained", ""); 135 } 136 137 if (Opts.Static) 138 Builder.defineMacro("__STATIC__"); 139 else 140 Builder.defineMacro("__DYNAMIC__"); 141 142 if (Opts.POSIXThreads) 143 Builder.defineMacro("_REENTRANT"); 144 145 // Get the platform type and version number from the triple. 146 unsigned Maj, Min, Rev; 147 if (Triple.isMacOSX()) { 148 Triple.getMacOSXVersion(Maj, Min, Rev); 149 PlatformName = "macosx"; 150 } else { 151 Triple.getOSVersion(Maj, Min, Rev); 152 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS()); 153 } 154 155 // If -target arch-pc-win32-macho option specified, we're 156 // generating code for Win32 ABI. No need to emit 157 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__. 158 if (PlatformName == "win32") { 159 PlatformMinVersion = VersionTuple(Maj, Min, Rev); 160 return; 161 } 162 163 // Set the appropriate OS version define. 164 if (Triple.isiOS()) { 165 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!"); 166 char Str[6]; 167 Str[0] = '0' + Maj; 168 Str[1] = '0' + (Min / 10); 169 Str[2] = '0' + (Min % 10); 170 Str[3] = '0' + (Rev / 10); 171 Str[4] = '0' + (Rev % 10); 172 Str[5] = '\0'; 173 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str); 174 } else if (Triple.isMacOSX()) { 175 // Note that the Driver allows versions which aren't representable in the 176 // define (because we only get a single digit for the minor and micro 177 // revision numbers). So, we limit them to the maximum representable 178 // version. 179 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!"); 180 char Str[7]; 181 if (Maj < 10 || (Maj == 10 && Min < 10)) { 182 Str[0] = '0' + (Maj / 10); 183 Str[1] = '0' + (Maj % 10); 184 Str[2] = '0' + std::min(Min, 9U); 185 Str[3] = '0' + std::min(Rev, 9U); 186 Str[4] = '\0'; 187 } else { 188 // Handle versions > 10.9. 189 Str[0] = '0' + (Maj / 10); 190 Str[1] = '0' + (Maj % 10); 191 Str[2] = '0' + (Min / 10); 192 Str[3] = '0' + (Min % 10); 193 Str[4] = '0' + (Rev / 10); 194 Str[5] = '0' + (Rev % 10); 195 Str[6] = '\0'; 196 } 197 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str); 198 } 199 200 // Tell users about the kernel if there is one. 201 if (Triple.isOSDarwin()) 202 Builder.defineMacro("__MACH__"); 203 204 PlatformMinVersion = VersionTuple(Maj, Min, Rev); 205 } 206 207 template<typename Target> 208 class DarwinTargetInfo : public OSTargetInfo<Target> { 209 protected: 210 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 211 MacroBuilder &Builder) const override { 212 getDarwinDefines(Builder, Opts, Triple, this->PlatformName, 213 this->PlatformMinVersion); 214 } 215 216 public: 217 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) { 218 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7); 219 this->MCountName = "\01mcount"; 220 } 221 222 std::string isValidSectionSpecifier(StringRef SR) const override { 223 // Let MCSectionMachO validate this. 224 StringRef Segment, Section; 225 unsigned TAA, StubSize; 226 bool HasTAA; 227 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section, 228 TAA, HasTAA, StubSize); 229 } 230 231 const char *getStaticInitSectionSpecifier() const override { 232 // FIXME: We should return 0 when building kexts. 233 return "__TEXT,__StaticInit,regular,pure_instructions"; 234 } 235 236 /// Darwin does not support protected visibility. Darwin's "default" 237 /// is very similar to ELF's "protected"; Darwin requires a "weak" 238 /// attribute on declarations that can be dynamically replaced. 239 bool hasProtectedVisibility() const override { 240 return false; 241 } 242 }; 243 244 245 // DragonFlyBSD Target 246 template<typename Target> 247 class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> { 248 protected: 249 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 250 MacroBuilder &Builder) const override { 251 // DragonFly defines; list based off of gcc output 252 Builder.defineMacro("__DragonFly__"); 253 Builder.defineMacro("__DragonFly_cc_version", "100001"); 254 Builder.defineMacro("__ELF__"); 255 Builder.defineMacro("__KPRINTF_ATTRIBUTE__"); 256 Builder.defineMacro("__tune_i386__"); 257 DefineStd(Builder, "unix", Opts); 258 } 259 public: 260 DragonFlyBSDTargetInfo(const llvm::Triple &Triple) 261 : OSTargetInfo<Target>(Triple) { 262 this->UserLabelPrefix = ""; 263 264 switch (Triple.getArch()) { 265 default: 266 case llvm::Triple::x86: 267 case llvm::Triple::x86_64: 268 this->MCountName = ".mcount"; 269 break; 270 } 271 } 272 }; 273 274 // FreeBSD Target 275 template<typename Target> 276 class FreeBSDTargetInfo : public OSTargetInfo<Target> { 277 protected: 278 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 279 MacroBuilder &Builder) const override { 280 // FreeBSD defines; list based off of gcc output 281 282 unsigned Release = Triple.getOSMajorVersion(); 283 if (Release == 0U) 284 Release = 8; 285 286 Builder.defineMacro("__FreeBSD__", Twine(Release)); 287 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U)); 288 Builder.defineMacro("__KPRINTF_ATTRIBUTE__"); 289 DefineStd(Builder, "unix", Opts); 290 Builder.defineMacro("__ELF__"); 291 292 // On FreeBSD, wchar_t contains the number of the code point as 293 // used by the character set of the locale. These character sets are 294 // not necessarily a superset of ASCII. 295 // 296 // FIXME: This is wrong; the macro refers to the numerical values 297 // of wchar_t *literals*, which are not locale-dependent. However, 298 // FreeBSD systems apparently depend on us getting this wrong, and 299 // setting this to 1 is conforming even if all the basic source 300 // character literals have the same encoding as char and wchar_t. 301 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1"); 302 } 303 public: 304 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) { 305 this->UserLabelPrefix = ""; 306 307 switch (Triple.getArch()) { 308 default: 309 case llvm::Triple::x86: 310 case llvm::Triple::x86_64: 311 this->MCountName = ".mcount"; 312 break; 313 case llvm::Triple::mips: 314 case llvm::Triple::mipsel: 315 case llvm::Triple::ppc: 316 case llvm::Triple::ppc64: 317 case llvm::Triple::ppc64le: 318 this->MCountName = "_mcount"; 319 break; 320 case llvm::Triple::arm: 321 this->MCountName = "__mcount"; 322 break; 323 } 324 } 325 }; 326 327 // GNU/kFreeBSD Target 328 template<typename Target> 329 class KFreeBSDTargetInfo : public OSTargetInfo<Target> { 330 protected: 331 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 332 MacroBuilder &Builder) const override { 333 // GNU/kFreeBSD defines; list based off of gcc output 334 335 DefineStd(Builder, "unix", Opts); 336 Builder.defineMacro("__FreeBSD_kernel__"); 337 Builder.defineMacro("__GLIBC__"); 338 Builder.defineMacro("__ELF__"); 339 if (Opts.POSIXThreads) 340 Builder.defineMacro("_REENTRANT"); 341 if (Opts.CPlusPlus) 342 Builder.defineMacro("_GNU_SOURCE"); 343 } 344 public: 345 KFreeBSDTargetInfo(const llvm::Triple &Triple) 346 : OSTargetInfo<Target>(Triple) { 347 this->UserLabelPrefix = ""; 348 } 349 }; 350 351 // Minix Target 352 template<typename Target> 353 class MinixTargetInfo : public OSTargetInfo<Target> { 354 protected: 355 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 356 MacroBuilder &Builder) const override { 357 // Minix defines 358 359 Builder.defineMacro("__minix", "3"); 360 Builder.defineMacro("_EM_WSIZE", "4"); 361 Builder.defineMacro("_EM_PSIZE", "4"); 362 Builder.defineMacro("_EM_SSIZE", "2"); 363 Builder.defineMacro("_EM_LSIZE", "4"); 364 Builder.defineMacro("_EM_FSIZE", "4"); 365 Builder.defineMacro("_EM_DSIZE", "8"); 366 Builder.defineMacro("__ELF__"); 367 DefineStd(Builder, "unix", Opts); 368 } 369 public: 370 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) { 371 this->UserLabelPrefix = ""; 372 } 373 }; 374 375 // Linux target 376 template<typename Target> 377 class LinuxTargetInfo : public OSTargetInfo<Target> { 378 protected: 379 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 380 MacroBuilder &Builder) const override { 381 // Linux defines; list based off of gcc output 382 DefineStd(Builder, "unix", Opts); 383 DefineStd(Builder, "linux", Opts); 384 Builder.defineMacro("__gnu_linux__"); 385 Builder.defineMacro("__ELF__"); 386 if (Triple.getEnvironment() == llvm::Triple::Android) { 387 Builder.defineMacro("__ANDROID__", "1"); 388 unsigned Maj, Min, Rev; 389 Triple.getEnvironmentVersion(Maj, Min, Rev); 390 this->PlatformName = "android"; 391 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev); 392 } 393 if (Opts.POSIXThreads) 394 Builder.defineMacro("_REENTRANT"); 395 if (Opts.CPlusPlus) 396 Builder.defineMacro("_GNU_SOURCE"); 397 } 398 public: 399 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) { 400 this->UserLabelPrefix = ""; 401 this->WIntType = TargetInfo::UnsignedInt; 402 403 switch (Triple.getArch()) { 404 default: 405 break; 406 case llvm::Triple::ppc: 407 case llvm::Triple::ppc64: 408 case llvm::Triple::ppc64le: 409 this->MCountName = "_mcount"; 410 break; 411 } 412 } 413 414 const char *getStaticInitSectionSpecifier() const override { 415 return ".text.startup"; 416 } 417 }; 418 419 // NetBSD Target 420 template<typename Target> 421 class NetBSDTargetInfo : public OSTargetInfo<Target> { 422 protected: 423 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 424 MacroBuilder &Builder) const override { 425 // NetBSD defines; list based off of gcc output 426 Builder.defineMacro("__NetBSD__"); 427 Builder.defineMacro("__unix__"); 428 Builder.defineMacro("__ELF__"); 429 if (Opts.POSIXThreads) 430 Builder.defineMacro("_POSIX_THREADS"); 431 432 switch (Triple.getArch()) { 433 default: 434 break; 435 case llvm::Triple::arm: 436 case llvm::Triple::armeb: 437 case llvm::Triple::thumb: 438 case llvm::Triple::thumbeb: 439 Builder.defineMacro("__ARM_DWARF_EH__"); 440 break; 441 } 442 } 443 public: 444 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) { 445 this->UserLabelPrefix = ""; 446 this->MCountName = "_mcount"; 447 } 448 }; 449 450 // OpenBSD Target 451 template<typename Target> 452 class OpenBSDTargetInfo : public OSTargetInfo<Target> { 453 protected: 454 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 455 MacroBuilder &Builder) const override { 456 // OpenBSD defines; list based off of gcc output 457 458 Builder.defineMacro("__OpenBSD__"); 459 DefineStd(Builder, "unix", Opts); 460 Builder.defineMacro("__ELF__"); 461 if (Opts.POSIXThreads) 462 Builder.defineMacro("_REENTRANT"); 463 } 464 public: 465 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) { 466 this->UserLabelPrefix = ""; 467 this->TLSSupported = false; 468 469 switch (Triple.getArch()) { 470 default: 471 case llvm::Triple::x86: 472 case llvm::Triple::x86_64: 473 case llvm::Triple::arm: 474 case llvm::Triple::sparc: 475 this->MCountName = "__mcount"; 476 break; 477 case llvm::Triple::mips64: 478 case llvm::Triple::mips64el: 479 case llvm::Triple::ppc: 480 case llvm::Triple::sparcv9: 481 this->MCountName = "_mcount"; 482 break; 483 } 484 } 485 }; 486 487 // Bitrig Target 488 template<typename Target> 489 class BitrigTargetInfo : public OSTargetInfo<Target> { 490 protected: 491 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 492 MacroBuilder &Builder) const override { 493 // Bitrig defines; list based off of gcc output 494 495 Builder.defineMacro("__Bitrig__"); 496 DefineStd(Builder, "unix", Opts); 497 Builder.defineMacro("__ELF__"); 498 if (Opts.POSIXThreads) 499 Builder.defineMacro("_REENTRANT"); 500 501 switch (Triple.getArch()) { 502 default: 503 break; 504 case llvm::Triple::arm: 505 case llvm::Triple::armeb: 506 case llvm::Triple::thumb: 507 case llvm::Triple::thumbeb: 508 Builder.defineMacro("__ARM_DWARF_EH__"); 509 break; 510 } 511 } 512 public: 513 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) { 514 this->UserLabelPrefix = ""; 515 this->MCountName = "__mcount"; 516 } 517 }; 518 519 // PSP Target 520 template<typename Target> 521 class PSPTargetInfo : public OSTargetInfo<Target> { 522 protected: 523 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 524 MacroBuilder &Builder) const override { 525 // PSP defines; list based on the output of the pspdev gcc toolchain. 526 Builder.defineMacro("PSP"); 527 Builder.defineMacro("_PSP"); 528 Builder.defineMacro("__psp__"); 529 Builder.defineMacro("__ELF__"); 530 } 531 public: 532 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) { 533 this->UserLabelPrefix = ""; 534 } 535 }; 536 537 // PS3 PPU Target 538 template<typename Target> 539 class PS3PPUTargetInfo : public OSTargetInfo<Target> { 540 protected: 541 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 542 MacroBuilder &Builder) const override { 543 // PS3 PPU defines. 544 Builder.defineMacro("__PPC__"); 545 Builder.defineMacro("__PPU__"); 546 Builder.defineMacro("__CELLOS_LV2__"); 547 Builder.defineMacro("__ELF__"); 548 Builder.defineMacro("__LP32__"); 549 Builder.defineMacro("_ARCH_PPC64"); 550 Builder.defineMacro("__powerpc64__"); 551 } 552 public: 553 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) { 554 this->UserLabelPrefix = ""; 555 this->LongWidth = this->LongAlign = 32; 556 this->PointerWidth = this->PointerAlign = 32; 557 this->IntMaxType = TargetInfo::SignedLongLong; 558 this->Int64Type = TargetInfo::SignedLongLong; 559 this->SizeType = TargetInfo::UnsignedInt; 560 this->DataLayoutString = "E-m:e-p:32:32-i64:64-n32:64"; 561 } 562 }; 563 564 template <typename Target> 565 class PS4OSTargetInfo : public OSTargetInfo<Target> { 566 protected: 567 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 568 MacroBuilder &Builder) const override { 569 Builder.defineMacro("__FreeBSD__", "9"); 570 Builder.defineMacro("__FreeBSD_cc_version", "900001"); 571 Builder.defineMacro("__KPRINTF_ATTRIBUTE__"); 572 DefineStd(Builder, "unix", Opts); 573 Builder.defineMacro("__ELF__"); 574 Builder.defineMacro("__PS4__"); 575 } 576 public: 577 PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) { 578 this->WCharType = this->UnsignedShort; 579 580 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits). 581 this->MaxTLSAlign = 256; 582 this->UserLabelPrefix = ""; 583 584 switch (Triple.getArch()) { 585 default: 586 case llvm::Triple::x86_64: 587 this->MCountName = ".mcount"; 588 break; 589 } 590 } 591 }; 592 593 // Solaris target 594 template<typename Target> 595 class SolarisTargetInfo : public OSTargetInfo<Target> { 596 protected: 597 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 598 MacroBuilder &Builder) const override { 599 DefineStd(Builder, "sun", Opts); 600 DefineStd(Builder, "unix", Opts); 601 Builder.defineMacro("__ELF__"); 602 Builder.defineMacro("__svr4__"); 603 Builder.defineMacro("__SVR4"); 604 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and 605 // newer, but to 500 for everything else. feature_test.h has a check to 606 // ensure that you are not using C99 with an old version of X/Open or C89 607 // with a new version. 608 if (Opts.C99) 609 Builder.defineMacro("_XOPEN_SOURCE", "600"); 610 else 611 Builder.defineMacro("_XOPEN_SOURCE", "500"); 612 if (Opts.CPlusPlus) 613 Builder.defineMacro("__C99FEATURES__"); 614 Builder.defineMacro("_LARGEFILE_SOURCE"); 615 Builder.defineMacro("_LARGEFILE64_SOURCE"); 616 Builder.defineMacro("__EXTENSIONS__"); 617 Builder.defineMacro("_REENTRANT"); 618 } 619 public: 620 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) { 621 this->UserLabelPrefix = ""; 622 this->WCharType = this->SignedInt; 623 // FIXME: WIntType should be SignedLong 624 } 625 }; 626 627 // Windows target 628 template<typename Target> 629 class WindowsTargetInfo : public OSTargetInfo<Target> { 630 protected: 631 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 632 MacroBuilder &Builder) const override { 633 Builder.defineMacro("_WIN32"); 634 } 635 void getVisualStudioDefines(const LangOptions &Opts, 636 MacroBuilder &Builder) const { 637 if (Opts.CPlusPlus) { 638 if (Opts.RTTIData) 639 Builder.defineMacro("_CPPRTTI"); 640 641 if (Opts.CXXExceptions) 642 Builder.defineMacro("_CPPUNWIND"); 643 } 644 645 if (Opts.Bool) 646 Builder.defineMacro("__BOOL_DEFINED"); 647 648 if (!Opts.CharIsSigned) 649 Builder.defineMacro("_CHAR_UNSIGNED"); 650 651 // FIXME: POSIXThreads isn't exactly the option this should be defined for, 652 // but it works for now. 653 if (Opts.POSIXThreads) 654 Builder.defineMacro("_MT"); 655 656 if (Opts.MSCompatibilityVersion) { 657 Builder.defineMacro("_MSC_VER", 658 Twine(Opts.MSCompatibilityVersion / 100000)); 659 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion)); 660 // FIXME We cannot encode the revision information into 32-bits 661 Builder.defineMacro("_MSC_BUILD", Twine(1)); 662 663 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) 664 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1)); 665 } 666 667 if (Opts.MicrosoftExt) { 668 Builder.defineMacro("_MSC_EXTENSIONS"); 669 670 if (Opts.CPlusPlus11) { 671 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED"); 672 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED"); 673 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED"); 674 } 675 } 676 677 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64"); 678 } 679 680 public: 681 WindowsTargetInfo(const llvm::Triple &Triple) 682 : OSTargetInfo<Target>(Triple) {} 683 }; 684 685 template <typename Target> 686 class NaClTargetInfo : public OSTargetInfo<Target> { 687 protected: 688 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 689 MacroBuilder &Builder) const override { 690 if (Opts.POSIXThreads) 691 Builder.defineMacro("_REENTRANT"); 692 if (Opts.CPlusPlus) 693 Builder.defineMacro("_GNU_SOURCE"); 694 695 DefineStd(Builder, "unix", Opts); 696 Builder.defineMacro("__ELF__"); 697 Builder.defineMacro("__native_client__"); 698 } 699 700 public: 701 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) { 702 this->UserLabelPrefix = ""; 703 this->LongAlign = 32; 704 this->LongWidth = 32; 705 this->PointerAlign = 32; 706 this->PointerWidth = 32; 707 this->IntMaxType = TargetInfo::SignedLongLong; 708 this->Int64Type = TargetInfo::SignedLongLong; 709 this->DoubleAlign = 64; 710 this->LongDoubleWidth = 64; 711 this->LongDoubleAlign = 64; 712 this->LongLongWidth = 64; 713 this->LongLongAlign = 64; 714 this->SizeType = TargetInfo::UnsignedInt; 715 this->PtrDiffType = TargetInfo::SignedInt; 716 this->IntPtrType = TargetInfo::SignedInt; 717 // RegParmMax is inherited from the underlying architecture 718 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble; 719 if (Triple.getArch() == llvm::Triple::arm) { 720 // Handled in ARM's setABI(). 721 } else if (Triple.getArch() == llvm::Triple::x86) { 722 this->DataLayoutString = "e-m:e-p:32:32-i64:64-n8:16:32-S128"; 723 } else if (Triple.getArch() == llvm::Triple::x86_64) { 724 this->DataLayoutString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128"; 725 } else if (Triple.getArch() == llvm::Triple::mipsel) { 726 // Handled on mips' setDataLayoutString. 727 } else { 728 assert(Triple.getArch() == llvm::Triple::le32); 729 this->DataLayoutString = "e-p:32:32-i64:64"; 730 } 731 } 732 }; 733 734 // WebAssembly target 735 template <typename Target> 736 class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> { 737 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 738 MacroBuilder &Builder) const final { 739 // A common platform macro. 740 if (Opts.POSIXThreads) 741 Builder.defineMacro("_REENTRANT"); 742 // Follow g++ convention and predefine _GNU_SOURCE for C++. 743 if (Opts.CPlusPlus) 744 Builder.defineMacro("_GNU_SOURCE"); 745 } 746 747 // As an optimization, group static init code together in a section. 748 const char *getStaticInitSectionSpecifier() const final { 749 return ".text.__startup"; 750 } 751 752 public: 753 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple) 754 : OSTargetInfo<Target>(Triple) { 755 this->MCountName = "__mcount"; 756 this->UserLabelPrefix = ""; 757 this->TheCXXABI.set(TargetCXXABI::WebAssembly); 758 } 759 }; 760 761 //===----------------------------------------------------------------------===// 762 // Specific target implementations. 763 //===----------------------------------------------------------------------===// 764 765 // PPC abstract base class 766 class PPCTargetInfo : public TargetInfo { 767 static const Builtin::Info BuiltinInfo[]; 768 static const char * const GCCRegNames[]; 769 static const TargetInfo::GCCRegAlias GCCRegAliases[]; 770 std::string CPU; 771 772 // Target cpu features. 773 bool HasVSX; 774 bool HasP8Vector; 775 bool HasP8Crypto; 776 bool HasDirectMove; 777 bool HasQPX; 778 bool HasHTM; 779 bool HasBPERMD; 780 bool HasExtDiv; 781 782 protected: 783 std::string ABI; 784 785 public: 786 PPCTargetInfo(const llvm::Triple &Triple) 787 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false), 788 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false), 789 HasBPERMD(false), HasExtDiv(false) { 790 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le); 791 SimdDefaultAlign = 128; 792 LongDoubleWidth = LongDoubleAlign = 128; 793 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble; 794 } 795 796 /// \brief Flags for architecture specific defines. 797 typedef enum { 798 ArchDefineNone = 0, 799 ArchDefineName = 1 << 0, // <name> is substituted for arch name. 800 ArchDefinePpcgr = 1 << 1, 801 ArchDefinePpcsq = 1 << 2, 802 ArchDefine440 = 1 << 3, 803 ArchDefine603 = 1 << 4, 804 ArchDefine604 = 1 << 5, 805 ArchDefinePwr4 = 1 << 6, 806 ArchDefinePwr5 = 1 << 7, 807 ArchDefinePwr5x = 1 << 8, 808 ArchDefinePwr6 = 1 << 9, 809 ArchDefinePwr6x = 1 << 10, 810 ArchDefinePwr7 = 1 << 11, 811 ArchDefinePwr8 = 1 << 12, 812 ArchDefineA2 = 1 << 13, 813 ArchDefineA2q = 1 << 14 814 } ArchDefineTypes; 815 816 // Note: GCC recognizes the following additional cpus: 817 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801, 818 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell, 819 // titan, rs64. 820 bool setCPU(const std::string &Name) override { 821 bool CPUKnown = llvm::StringSwitch<bool>(Name) 822 .Case("generic", true) 823 .Case("440", true) 824 .Case("450", true) 825 .Case("601", true) 826 .Case("602", true) 827 .Case("603", true) 828 .Case("603e", true) 829 .Case("603ev", true) 830 .Case("604", true) 831 .Case("604e", true) 832 .Case("620", true) 833 .Case("630", true) 834 .Case("g3", true) 835 .Case("7400", true) 836 .Case("g4", true) 837 .Case("7450", true) 838 .Case("g4+", true) 839 .Case("750", true) 840 .Case("970", true) 841 .Case("g5", true) 842 .Case("a2", true) 843 .Case("a2q", true) 844 .Case("e500mc", true) 845 .Case("e5500", true) 846 .Case("power3", true) 847 .Case("pwr3", true) 848 .Case("power4", true) 849 .Case("pwr4", true) 850 .Case("power5", true) 851 .Case("pwr5", true) 852 .Case("power5x", true) 853 .Case("pwr5x", true) 854 .Case("power6", true) 855 .Case("pwr6", true) 856 .Case("power6x", true) 857 .Case("pwr6x", true) 858 .Case("power7", true) 859 .Case("pwr7", true) 860 .Case("power8", true) 861 .Case("pwr8", true) 862 .Case("powerpc", true) 863 .Case("ppc", true) 864 .Case("powerpc64", true) 865 .Case("ppc64", true) 866 .Case("powerpc64le", true) 867 .Case("ppc64le", true) 868 .Default(false); 869 870 if (CPUKnown) 871 CPU = Name; 872 873 return CPUKnown; 874 } 875 876 877 StringRef getABI() const override { return ABI; } 878 879 void getTargetBuiltins(const Builtin::Info *&Records, 880 unsigned &NumRecords) const override { 881 Records = BuiltinInfo; 882 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin; 883 } 884 885 bool isCLZForZeroUndef() const override { return false; } 886 887 void getTargetDefines(const LangOptions &Opts, 888 MacroBuilder &Builder) const override; 889 890 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, 891 StringRef CPU, 892 std::vector<std::string> &FeaturesVec) const override; 893 894 bool handleTargetFeatures(std::vector<std::string> &Features, 895 DiagnosticsEngine &Diags) override; 896 bool hasFeature(StringRef Feature) const override; 897 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name, 898 bool Enabled) const override; 899 900 void getGCCRegNames(const char * const *&Names, 901 unsigned &NumNames) const override; 902 void getGCCRegAliases(const GCCRegAlias *&Aliases, 903 unsigned &NumAliases) const override; 904 bool validateAsmConstraint(const char *&Name, 905 TargetInfo::ConstraintInfo &Info) const override { 906 switch (*Name) { 907 default: return false; 908 case 'O': // Zero 909 break; 910 case 'b': // Base register 911 case 'f': // Floating point register 912 Info.setAllowsRegister(); 913 break; 914 // FIXME: The following are added to allow parsing. 915 // I just took a guess at what the actions should be. 916 // Also, is more specific checking needed? I.e. specific registers? 917 case 'd': // Floating point register (containing 64-bit value) 918 case 'v': // Altivec vector register 919 Info.setAllowsRegister(); 920 break; 921 case 'w': 922 switch (Name[1]) { 923 case 'd':// VSX vector register to hold vector double data 924 case 'f':// VSX vector register to hold vector float data 925 case 's':// VSX vector register to hold scalar float data 926 case 'a':// Any VSX register 927 case 'c':// An individual CR bit 928 break; 929 default: 930 return false; 931 } 932 Info.setAllowsRegister(); 933 Name++; // Skip over 'w'. 934 break; 935 case 'h': // `MQ', `CTR', or `LINK' register 936 case 'q': // `MQ' register 937 case 'c': // `CTR' register 938 case 'l': // `LINK' register 939 case 'x': // `CR' register (condition register) number 0 940 case 'y': // `CR' register (condition register) 941 case 'z': // `XER[CA]' carry bit (part of the XER register) 942 Info.setAllowsRegister(); 943 break; 944 case 'I': // Signed 16-bit constant 945 case 'J': // Unsigned 16-bit constant shifted left 16 bits 946 // (use `L' instead for SImode constants) 947 case 'K': // Unsigned 16-bit constant 948 case 'L': // Signed 16-bit constant shifted left 16 bits 949 case 'M': // Constant larger than 31 950 case 'N': // Exact power of 2 951 case 'P': // Constant whose negation is a signed 16-bit constant 952 case 'G': // Floating point constant that can be loaded into a 953 // register with one instruction per word 954 case 'H': // Integer/Floating point constant that can be loaded 955 // into a register using three instructions 956 break; 957 case 'm': // Memory operand. Note that on PowerPC targets, m can 958 // include addresses that update the base register. It 959 // is therefore only safe to use `m' in an asm statement 960 // if that asm statement accesses the operand exactly once. 961 // The asm statement must also use `%U<opno>' as a 962 // placeholder for the "update" flag in the corresponding 963 // load or store instruction. For example: 964 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val)); 965 // is correct but: 966 // asm ("st %1,%0" : "=m" (mem) : "r" (val)); 967 // is not. Use es rather than m if you don't want the base 968 // register to be updated. 969 case 'e': 970 if (Name[1] != 's') 971 return false; 972 // es: A "stable" memory operand; that is, one which does not 973 // include any automodification of the base register. Unlike 974 // `m', this constraint can be used in asm statements that 975 // might access the operand several times, or that might not 976 // access it at all. 977 Info.setAllowsMemory(); 978 Name++; // Skip over 'e'. 979 break; 980 case 'Q': // Memory operand that is an offset from a register (it is 981 // usually better to use `m' or `es' in asm statements) 982 case 'Z': // Memory operand that is an indexed or indirect from a 983 // register (it is usually better to use `m' or `es' in 984 // asm statements) 985 Info.setAllowsMemory(); 986 Info.setAllowsRegister(); 987 break; 988 case 'R': // AIX TOC entry 989 case 'a': // Address operand that is an indexed or indirect from a 990 // register (`p' is preferable for asm statements) 991 case 'S': // Constant suitable as a 64-bit mask operand 992 case 'T': // Constant suitable as a 32-bit mask operand 993 case 'U': // System V Release 4 small data area reference 994 case 't': // AND masks that can be performed by two rldic{l, r} 995 // instructions 996 case 'W': // Vector constant that does not require memory 997 case 'j': // Vector constant that is all zeros. 998 break; 999 // End FIXME. 1000 } 1001 return true; 1002 } 1003 std::string convertConstraint(const char *&Constraint) const override { 1004 std::string R; 1005 switch (*Constraint) { 1006 case 'e': 1007 case 'w': 1008 // Two-character constraint; add "^" hint for later parsing. 1009 R = std::string("^") + std::string(Constraint, 2); 1010 Constraint++; 1011 break; 1012 default: 1013 return TargetInfo::convertConstraint(Constraint); 1014 } 1015 return R; 1016 } 1017 const char *getClobbers() const override { 1018 return ""; 1019 } 1020 int getEHDataRegisterNumber(unsigned RegNo) const override { 1021 if (RegNo == 0) return 3; 1022 if (RegNo == 1) return 4; 1023 return -1; 1024 } 1025 1026 bool hasSjLjLowering() const override { 1027 return true; 1028 } 1029 1030 bool useFloat128ManglingForLongDouble() const override { 1031 return LongDoubleWidth == 128 && 1032 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble && 1033 getTriple().isOSBinFormatELF(); 1034 } 1035 }; 1036 1037 const Builtin::Info PPCTargetInfo::BuiltinInfo[] = { 1038 #define BUILTIN(ID, TYPE, ATTRS) \ 1039 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr }, 1040 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \ 1041 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr }, 1042 #include "clang/Basic/BuiltinsPPC.def" 1043 }; 1044 1045 /// handleTargetFeatures - Perform initialization based on the user 1046 /// configured set of features. 1047 bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features, 1048 DiagnosticsEngine &Diags) { 1049 for (const auto &Feature : Features) { 1050 if (Feature == "+vsx") { 1051 HasVSX = true; 1052 } else if (Feature == "+bpermd") { 1053 HasBPERMD = true; 1054 } else if (Feature == "+extdiv") { 1055 HasExtDiv = true; 1056 } else if (Feature == "+power8-vector") { 1057 HasP8Vector = true; 1058 } else if (Feature == "+crypto") { 1059 HasP8Crypto = true; 1060 } else if (Feature == "+direct-move") { 1061 HasDirectMove = true; 1062 } else if (Feature == "+qpx") { 1063 HasQPX = true; 1064 } else if (Feature == "+htm") { 1065 HasHTM = true; 1066 } 1067 // TODO: Finish this list and add an assert that we've handled them 1068 // all. 1069 } 1070 1071 return true; 1072 } 1073 1074 /// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific 1075 /// #defines that are not tied to a specific subtarget. 1076 void PPCTargetInfo::getTargetDefines(const LangOptions &Opts, 1077 MacroBuilder &Builder) const { 1078 // Target identification. 1079 Builder.defineMacro("__ppc__"); 1080 Builder.defineMacro("__PPC__"); 1081 Builder.defineMacro("_ARCH_PPC"); 1082 Builder.defineMacro("__powerpc__"); 1083 Builder.defineMacro("__POWERPC__"); 1084 if (PointerWidth == 64) { 1085 Builder.defineMacro("_ARCH_PPC64"); 1086 Builder.defineMacro("__powerpc64__"); 1087 Builder.defineMacro("__ppc64__"); 1088 Builder.defineMacro("__PPC64__"); 1089 } 1090 1091 // Target properties. 1092 if (getTriple().getArch() == llvm::Triple::ppc64le) { 1093 Builder.defineMacro("_LITTLE_ENDIAN"); 1094 } else { 1095 if (getTriple().getOS() != llvm::Triple::NetBSD && 1096 getTriple().getOS() != llvm::Triple::OpenBSD) 1097 Builder.defineMacro("_BIG_ENDIAN"); 1098 } 1099 1100 // ABI options. 1101 if (ABI == "elfv1" || ABI == "elfv1-qpx") 1102 Builder.defineMacro("_CALL_ELF", "1"); 1103 if (ABI == "elfv2") 1104 Builder.defineMacro("_CALL_ELF", "2"); 1105 1106 // Subtarget options. 1107 Builder.defineMacro("__NATURAL_ALIGNMENT__"); 1108 Builder.defineMacro("__REGISTER_PREFIX__", ""); 1109 1110 // FIXME: Should be controlled by command line option. 1111 if (LongDoubleWidth == 128) 1112 Builder.defineMacro("__LONG_DOUBLE_128__"); 1113 1114 if (Opts.AltiVec) { 1115 Builder.defineMacro("__VEC__", "10206"); 1116 Builder.defineMacro("__ALTIVEC__"); 1117 } 1118 1119 // CPU identification. 1120 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU) 1121 .Case("440", ArchDefineName) 1122 .Case("450", ArchDefineName | ArchDefine440) 1123 .Case("601", ArchDefineName) 1124 .Case("602", ArchDefineName | ArchDefinePpcgr) 1125 .Case("603", ArchDefineName | ArchDefinePpcgr) 1126 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr) 1127 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr) 1128 .Case("604", ArchDefineName | ArchDefinePpcgr) 1129 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr) 1130 .Case("620", ArchDefineName | ArchDefinePpcgr) 1131 .Case("630", ArchDefineName | ArchDefinePpcgr) 1132 .Case("7400", ArchDefineName | ArchDefinePpcgr) 1133 .Case("7450", ArchDefineName | ArchDefinePpcgr) 1134 .Case("750", ArchDefineName | ArchDefinePpcgr) 1135 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr 1136 | ArchDefinePpcsq) 1137 .Case("a2", ArchDefineA2) 1138 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q) 1139 .Case("pwr3", ArchDefinePpcgr) 1140 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq) 1141 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr 1142 | ArchDefinePpcsq) 1143 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4 1144 | ArchDefinePpcgr | ArchDefinePpcsq) 1145 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5 1146 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq) 1147 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x 1148 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr 1149 | ArchDefinePpcsq) 1150 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6 1151 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4 1152 | ArchDefinePpcgr | ArchDefinePpcsq) 1153 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x 1154 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5 1155 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq) 1156 .Case("power3", ArchDefinePpcgr) 1157 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq) 1158 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr 1159 | ArchDefinePpcsq) 1160 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4 1161 | ArchDefinePpcgr | ArchDefinePpcsq) 1162 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5 1163 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq) 1164 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x 1165 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr 1166 | ArchDefinePpcsq) 1167 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6 1168 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4 1169 | ArchDefinePpcgr | ArchDefinePpcsq) 1170 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x 1171 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5 1172 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq) 1173 .Default(ArchDefineNone); 1174 1175 if (defs & ArchDefineName) 1176 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper())); 1177 if (defs & ArchDefinePpcgr) 1178 Builder.defineMacro("_ARCH_PPCGR"); 1179 if (defs & ArchDefinePpcsq) 1180 Builder.defineMacro("_ARCH_PPCSQ"); 1181 if (defs & ArchDefine440) 1182 Builder.defineMacro("_ARCH_440"); 1183 if (defs & ArchDefine603) 1184 Builder.defineMacro("_ARCH_603"); 1185 if (defs & ArchDefine604) 1186 Builder.defineMacro("_ARCH_604"); 1187 if (defs & ArchDefinePwr4) 1188 Builder.defineMacro("_ARCH_PWR4"); 1189 if (defs & ArchDefinePwr5) 1190 Builder.defineMacro("_ARCH_PWR5"); 1191 if (defs & ArchDefinePwr5x) 1192 Builder.defineMacro("_ARCH_PWR5X"); 1193 if (defs & ArchDefinePwr6) 1194 Builder.defineMacro("_ARCH_PWR6"); 1195 if (defs & ArchDefinePwr6x) 1196 Builder.defineMacro("_ARCH_PWR6X"); 1197 if (defs & ArchDefinePwr7) 1198 Builder.defineMacro("_ARCH_PWR7"); 1199 if (defs & ArchDefinePwr8) 1200 Builder.defineMacro("_ARCH_PWR8"); 1201 if (defs & ArchDefineA2) 1202 Builder.defineMacro("_ARCH_A2"); 1203 if (defs & ArchDefineA2q) { 1204 Builder.defineMacro("_ARCH_A2Q"); 1205 Builder.defineMacro("_ARCH_QP"); 1206 } 1207 1208 if (getTriple().getVendor() == llvm::Triple::BGQ) { 1209 Builder.defineMacro("__bg__"); 1210 Builder.defineMacro("__THW_BLUEGENE__"); 1211 Builder.defineMacro("__bgq__"); 1212 Builder.defineMacro("__TOS_BGQ__"); 1213 } 1214 1215 if (HasVSX) 1216 Builder.defineMacro("__VSX__"); 1217 if (HasP8Vector) 1218 Builder.defineMacro("__POWER8_VECTOR__"); 1219 if (HasP8Crypto) 1220 Builder.defineMacro("__CRYPTO__"); 1221 if (HasHTM) 1222 Builder.defineMacro("__HTM__"); 1223 if (getTriple().getArch() == llvm::Triple::ppc64le || 1224 (defs & ArchDefinePwr8) || (CPU == "pwr8")) { 1225 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1"); 1226 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2"); 1227 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4"); 1228 if (PointerWidth == 64) 1229 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8"); 1230 } 1231 1232 // FIXME: The following are not yet generated here by Clang, but are 1233 // generated by GCC: 1234 // 1235 // _SOFT_FLOAT_ 1236 // __RECIP_PRECISION__ 1237 // __APPLE_ALTIVEC__ 1238 // __RECIP__ 1239 // __RECIPF__ 1240 // __RSQRTE__ 1241 // __RSQRTEF__ 1242 // _SOFT_DOUBLE_ 1243 // __NO_LWSYNC__ 1244 // __HAVE_BSWAP__ 1245 // __LONGDOUBLE128 1246 // __CMODEL_MEDIUM__ 1247 // __CMODEL_LARGE__ 1248 // _CALL_SYSV 1249 // _CALL_DARWIN 1250 // __NO_FPRS__ 1251 } 1252 1253 // Handle explicit options being passed to the compiler here: if we've 1254 // explicitly turned off vsx and turned on power8-vector or direct-move then 1255 // go ahead and error since the customer has expressed a somewhat incompatible 1256 // set of options. 1257 static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags, 1258 std::vector<std::string> &FeaturesVec) { 1259 1260 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") != 1261 FeaturesVec.end()) { 1262 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") != 1263 FeaturesVec.end()) { 1264 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector" 1265 << "-mno-vsx"; 1266 return false; 1267 } 1268 1269 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") != 1270 FeaturesVec.end()) { 1271 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move" 1272 << "-mno-vsx"; 1273 return false; 1274 } 1275 } 1276 1277 return true; 1278 } 1279 1280 bool PPCTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features, 1281 DiagnosticsEngine &Diags, StringRef CPU, 1282 std::vector<std::string> &FeaturesVec) const { 1283 Features["altivec"] = llvm::StringSwitch<bool>(CPU) 1284 .Case("7400", true) 1285 .Case("g4", true) 1286 .Case("7450", true) 1287 .Case("g4+", true) 1288 .Case("970", true) 1289 .Case("g5", true) 1290 .Case("pwr6", true) 1291 .Case("pwr7", true) 1292 .Case("pwr8", true) 1293 .Case("ppc64", true) 1294 .Case("ppc64le", true) 1295 .Default(false); 1296 1297 Features["qpx"] = (CPU == "a2q"); 1298 Features["crypto"] = llvm::StringSwitch<bool>(CPU) 1299 .Case("ppc64le", true) 1300 .Case("pwr8", true) 1301 .Default(false); 1302 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU) 1303 .Case("ppc64le", true) 1304 .Case("pwr8", true) 1305 .Default(false); 1306 Features["bpermd"] = llvm::StringSwitch<bool>(CPU) 1307 .Case("ppc64le", true) 1308 .Case("pwr8", true) 1309 .Case("pwr7", true) 1310 .Default(false); 1311 Features["extdiv"] = llvm::StringSwitch<bool>(CPU) 1312 .Case("ppc64le", true) 1313 .Case("pwr8", true) 1314 .Case("pwr7", true) 1315 .Default(false); 1316 Features["direct-move"] = llvm::StringSwitch<bool>(CPU) 1317 .Case("ppc64le", true) 1318 .Case("pwr8", true) 1319 .Default(false); 1320 Features["vsx"] = llvm::StringSwitch<bool>(CPU) 1321 .Case("ppc64le", true) 1322 .Case("pwr8", true) 1323 .Case("pwr7", true) 1324 .Default(false); 1325 1326 if (!ppcUserFeaturesCheck(Diags, FeaturesVec)) 1327 return false; 1328 1329 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec); 1330 } 1331 1332 bool PPCTargetInfo::hasFeature(StringRef Feature) const { 1333 return llvm::StringSwitch<bool>(Feature) 1334 .Case("powerpc", true) 1335 .Case("vsx", HasVSX) 1336 .Case("power8-vector", HasP8Vector) 1337 .Case("crypto", HasP8Crypto) 1338 .Case("direct-move", HasDirectMove) 1339 .Case("qpx", HasQPX) 1340 .Case("htm", HasHTM) 1341 .Case("bpermd", HasBPERMD) 1342 .Case("extdiv", HasExtDiv) 1343 .Default(false); 1344 } 1345 1346 void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features, 1347 StringRef Name, bool Enabled) const { 1348 // If we're enabling direct-move or power8-vector go ahead and enable vsx 1349 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user 1350 // incompatible options. 1351 if (Enabled) { 1352 if (Name == "vsx") { 1353 Features[Name] = true; 1354 } else if (Name == "direct-move") { 1355 Features[Name] = Features["vsx"] = true; 1356 } else if (Name == "power8-vector") { 1357 Features[Name] = Features["vsx"] = true; 1358 } else { 1359 Features[Name] = true; 1360 } 1361 } else { 1362 if (Name == "vsx") { 1363 Features[Name] = Features["direct-move"] = Features["power8-vector"] = 1364 false; 1365 } else { 1366 Features[Name] = false; 1367 } 1368 } 1369 } 1370 1371 const char * const PPCTargetInfo::GCCRegNames[] = { 1372 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", 1373 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", 1374 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", 1375 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31", 1376 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", 1377 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", 1378 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", 1379 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", 1380 "mq", "lr", "ctr", "ap", 1381 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", 1382 "xer", 1383 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", 1384 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", 1385 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", 1386 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31", 1387 "vrsave", "vscr", 1388 "spe_acc", "spefscr", 1389 "sfp" 1390 }; 1391 1392 void PPCTargetInfo::getGCCRegNames(const char * const *&Names, 1393 unsigned &NumNames) const { 1394 Names = GCCRegNames; 1395 NumNames = llvm::array_lengthof(GCCRegNames); 1396 } 1397 1398 const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = { 1399 // While some of these aliases do map to different registers 1400 // they still share the same register name. 1401 { { "0" }, "r0" }, 1402 { { "1"}, "r1" }, 1403 { { "2" }, "r2" }, 1404 { { "3" }, "r3" }, 1405 { { "4" }, "r4" }, 1406 { { "5" }, "r5" }, 1407 { { "6" }, "r6" }, 1408 { { "7" }, "r7" }, 1409 { { "8" }, "r8" }, 1410 { { "9" }, "r9" }, 1411 { { "10" }, "r10" }, 1412 { { "11" }, "r11" }, 1413 { { "12" }, "r12" }, 1414 { { "13" }, "r13" }, 1415 { { "14" }, "r14" }, 1416 { { "15" }, "r15" }, 1417 { { "16" }, "r16" }, 1418 { { "17" }, "r17" }, 1419 { { "18" }, "r18" }, 1420 { { "19" }, "r19" }, 1421 { { "20" }, "r20" }, 1422 { { "21" }, "r21" }, 1423 { { "22" }, "r22" }, 1424 { { "23" }, "r23" }, 1425 { { "24" }, "r24" }, 1426 { { "25" }, "r25" }, 1427 { { "26" }, "r26" }, 1428 { { "27" }, "r27" }, 1429 { { "28" }, "r28" }, 1430 { { "29" }, "r29" }, 1431 { { "30" }, "r30" }, 1432 { { "31" }, "r31" }, 1433 { { "fr0" }, "f0" }, 1434 { { "fr1" }, "f1" }, 1435 { { "fr2" }, "f2" }, 1436 { { "fr3" }, "f3" }, 1437 { { "fr4" }, "f4" }, 1438 { { "fr5" }, "f5" }, 1439 { { "fr6" }, "f6" }, 1440 { { "fr7" }, "f7" }, 1441 { { "fr8" }, "f8" }, 1442 { { "fr9" }, "f9" }, 1443 { { "fr10" }, "f10" }, 1444 { { "fr11" }, "f11" }, 1445 { { "fr12" }, "f12" }, 1446 { { "fr13" }, "f13" }, 1447 { { "fr14" }, "f14" }, 1448 { { "fr15" }, "f15" }, 1449 { { "fr16" }, "f16" }, 1450 { { "fr17" }, "f17" }, 1451 { { "fr18" }, "f18" }, 1452 { { "fr19" }, "f19" }, 1453 { { "fr20" }, "f20" }, 1454 { { "fr21" }, "f21" }, 1455 { { "fr22" }, "f22" }, 1456 { { "fr23" }, "f23" }, 1457 { { "fr24" }, "f24" }, 1458 { { "fr25" }, "f25" }, 1459 { { "fr26" }, "f26" }, 1460 { { "fr27" }, "f27" }, 1461 { { "fr28" }, "f28" }, 1462 { { "fr29" }, "f29" }, 1463 { { "fr30" }, "f30" }, 1464 { { "fr31" }, "f31" }, 1465 { { "cc" }, "cr0" }, 1466 }; 1467 1468 void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases, 1469 unsigned &NumAliases) const { 1470 Aliases = GCCRegAliases; 1471 NumAliases = llvm::array_lengthof(GCCRegAliases); 1472 } 1473 1474 class PPC32TargetInfo : public PPCTargetInfo { 1475 public: 1476 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) { 1477 DataLayoutString = "E-m:e-p:32:32-i64:64-n32"; 1478 1479 switch (getTriple().getOS()) { 1480 case llvm::Triple::Linux: 1481 case llvm::Triple::FreeBSD: 1482 case llvm::Triple::NetBSD: 1483 SizeType = UnsignedInt; 1484 PtrDiffType = SignedInt; 1485 IntPtrType = SignedInt; 1486 break; 1487 default: 1488 break; 1489 } 1490 1491 if (getTriple().getOS() == llvm::Triple::FreeBSD) { 1492 LongDoubleWidth = LongDoubleAlign = 64; 1493 LongDoubleFormat = &llvm::APFloat::IEEEdouble; 1494 } 1495 1496 // PPC32 supports atomics up to 4 bytes. 1497 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32; 1498 } 1499 1500 BuiltinVaListKind getBuiltinVaListKind() const override { 1501 // This is the ELF definition, and is overridden by the Darwin sub-target 1502 return TargetInfo::PowerABIBuiltinVaList; 1503 } 1504 }; 1505 1506 // Note: ABI differences may eventually require us to have a separate 1507 // TargetInfo for little endian. 1508 class PPC64TargetInfo : public PPCTargetInfo { 1509 public: 1510 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) { 1511 LongWidth = LongAlign = PointerWidth = PointerAlign = 64; 1512 IntMaxType = SignedLong; 1513 Int64Type = SignedLong; 1514 1515 if ((Triple.getArch() == llvm::Triple::ppc64le)) { 1516 DataLayoutString = "e-m:e-i64:64-n32:64"; 1517 ABI = "elfv2"; 1518 } else { 1519 DataLayoutString = "E-m:e-i64:64-n32:64"; 1520 ABI = "elfv1"; 1521 } 1522 1523 switch (getTriple().getOS()) { 1524 case llvm::Triple::FreeBSD: 1525 LongDoubleWidth = LongDoubleAlign = 64; 1526 LongDoubleFormat = &llvm::APFloat::IEEEdouble; 1527 break; 1528 case llvm::Triple::NetBSD: 1529 IntMaxType = SignedLongLong; 1530 Int64Type = SignedLongLong; 1531 break; 1532 default: 1533 break; 1534 } 1535 1536 // PPC64 supports atomics up to 8 bytes. 1537 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64; 1538 } 1539 BuiltinVaListKind getBuiltinVaListKind() const override { 1540 return TargetInfo::CharPtrBuiltinVaList; 1541 } 1542 // PPC64 Linux-specific ABI options. 1543 bool setABI(const std::string &Name) override { 1544 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") { 1545 ABI = Name; 1546 return true; 1547 } 1548 return false; 1549 } 1550 }; 1551 1552 class DarwinPPC32TargetInfo : 1553 public DarwinTargetInfo<PPC32TargetInfo> { 1554 public: 1555 DarwinPPC32TargetInfo(const llvm::Triple &Triple) 1556 : DarwinTargetInfo<PPC32TargetInfo>(Triple) { 1557 HasAlignMac68kSupport = true; 1558 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool? 1559 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726 1560 LongLongAlign = 32; 1561 SuitableAlign = 128; 1562 DataLayoutString = "E-m:o-p:32:32-f64:32:64-n32"; 1563 } 1564 BuiltinVaListKind getBuiltinVaListKind() const override { 1565 return TargetInfo::CharPtrBuiltinVaList; 1566 } 1567 }; 1568 1569 class DarwinPPC64TargetInfo : 1570 public DarwinTargetInfo<PPC64TargetInfo> { 1571 public: 1572 DarwinPPC64TargetInfo(const llvm::Triple &Triple) 1573 : DarwinTargetInfo<PPC64TargetInfo>(Triple) { 1574 HasAlignMac68kSupport = true; 1575 SuitableAlign = 128; 1576 DataLayoutString = "E-m:o-i64:64-n32:64"; 1577 } 1578 }; 1579 1580 static const unsigned NVPTXAddrSpaceMap[] = { 1581 1, // opencl_global 1582 3, // opencl_local 1583 4, // opencl_constant 1584 // FIXME: generic has to be added to the target 1585 0, // opencl_generic 1586 1, // cuda_device 1587 4, // cuda_constant 1588 3, // cuda_shared 1589 }; 1590 1591 class NVPTXTargetInfo : public TargetInfo { 1592 static const char *const GCCRegNames[]; 1593 static const Builtin::Info BuiltinInfo[]; 1594 1595 // The GPU profiles supported by the NVPTX backend 1596 enum GPUKind { 1597 GK_NONE, 1598 GK_SM20, 1599 GK_SM21, 1600 GK_SM30, 1601 GK_SM35, 1602 GK_SM37, 1603 } GPU; 1604 1605 public: 1606 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) { 1607 BigEndian = false; 1608 TLSSupported = false; 1609 LongWidth = LongAlign = 64; 1610 AddrSpaceMap = &NVPTXAddrSpaceMap; 1611 UseAddrSpaceMapMangling = true; 1612 // Define available target features 1613 // These must be defined in sorted order! 1614 NoAsmVariants = true; 1615 // Set the default GPU to sm20 1616 GPU = GK_SM20; 1617 } 1618 void getTargetDefines(const LangOptions &Opts, 1619 MacroBuilder &Builder) const override { 1620 Builder.defineMacro("__PTX__"); 1621 Builder.defineMacro("__NVPTX__"); 1622 if (Opts.CUDAIsDevice) { 1623 // Set __CUDA_ARCH__ for the GPU specified. 1624 std::string CUDAArchCode; 1625 switch (GPU) { 1626 case GK_SM20: 1627 CUDAArchCode = "200"; 1628 break; 1629 case GK_SM21: 1630 CUDAArchCode = "210"; 1631 break; 1632 case GK_SM30: 1633 CUDAArchCode = "300"; 1634 break; 1635 case GK_SM35: 1636 CUDAArchCode = "350"; 1637 break; 1638 case GK_SM37: 1639 CUDAArchCode = "370"; 1640 break; 1641 default: 1642 llvm_unreachable("Unhandled target CPU"); 1643 } 1644 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode); 1645 } 1646 } 1647 void getTargetBuiltins(const Builtin::Info *&Records, 1648 unsigned &NumRecords) const override { 1649 Records = BuiltinInfo; 1650 NumRecords = clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin; 1651 } 1652 bool hasFeature(StringRef Feature) const override { 1653 return Feature == "ptx" || Feature == "nvptx"; 1654 } 1655 1656 void getGCCRegNames(const char *const *&Names, 1657 unsigned &NumNames) const override; 1658 void getGCCRegAliases(const GCCRegAlias *&Aliases, 1659 unsigned &NumAliases) const override { 1660 // No aliases. 1661 Aliases = nullptr; 1662 NumAliases = 0; 1663 } 1664 bool validateAsmConstraint(const char *&Name, 1665 TargetInfo::ConstraintInfo &Info) const override { 1666 switch (*Name) { 1667 default: 1668 return false; 1669 case 'c': 1670 case 'h': 1671 case 'r': 1672 case 'l': 1673 case 'f': 1674 case 'd': 1675 Info.setAllowsRegister(); 1676 return true; 1677 } 1678 } 1679 const char *getClobbers() const override { 1680 // FIXME: Is this really right? 1681 return ""; 1682 } 1683 BuiltinVaListKind getBuiltinVaListKind() const override { 1684 // FIXME: implement 1685 return TargetInfo::CharPtrBuiltinVaList; 1686 } 1687 bool setCPU(const std::string &Name) override { 1688 GPU = llvm::StringSwitch<GPUKind>(Name) 1689 .Case("sm_20", GK_SM20) 1690 .Case("sm_21", GK_SM21) 1691 .Case("sm_30", GK_SM30) 1692 .Case("sm_35", GK_SM35) 1693 .Case("sm_37", GK_SM37) 1694 .Default(GK_NONE); 1695 1696 return GPU != GK_NONE; 1697 } 1698 }; 1699 1700 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = { 1701 #define BUILTIN(ID, TYPE, ATTRS) \ 1702 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr }, 1703 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \ 1704 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr }, 1705 #include "clang/Basic/BuiltinsNVPTX.def" 1706 }; 1707 1708 const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"}; 1709 1710 void NVPTXTargetInfo::getGCCRegNames(const char *const *&Names, 1711 unsigned &NumNames) const { 1712 Names = GCCRegNames; 1713 NumNames = llvm::array_lengthof(GCCRegNames); 1714 } 1715 1716 class NVPTX32TargetInfo : public NVPTXTargetInfo { 1717 public: 1718 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) { 1719 LongWidth = LongAlign = 32; 1720 PointerWidth = PointerAlign = 32; 1721 SizeType = TargetInfo::UnsignedInt; 1722 PtrDiffType = TargetInfo::SignedInt; 1723 IntPtrType = TargetInfo::SignedInt; 1724 DataLayoutString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64"; 1725 } 1726 }; 1727 1728 class NVPTX64TargetInfo : public NVPTXTargetInfo { 1729 public: 1730 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) { 1731 PointerWidth = PointerAlign = 64; 1732 SizeType = TargetInfo::UnsignedLong; 1733 PtrDiffType = TargetInfo::SignedLong; 1734 IntPtrType = TargetInfo::SignedLong; 1735 DataLayoutString = "e-i64:64-v16:16-v32:32-n16:32:64"; 1736 } 1737 }; 1738 1739 static const unsigned AMDGPUAddrSpaceMap[] = { 1740 1, // opencl_global 1741 3, // opencl_local 1742 2, // opencl_constant 1743 4, // opencl_generic 1744 1, // cuda_device 1745 2, // cuda_constant 1746 3 // cuda_shared 1747 }; 1748 1749 // If you edit the description strings, make sure you update 1750 // getPointerWidthV(). 1751 1752 static const char *DataLayoutStringR600 = 1753 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128" 1754 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64"; 1755 1756 static const char *DataLayoutStringR600DoubleOps = 1757 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128" 1758 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64"; 1759 1760 static const char *DataLayoutStringSI = 1761 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32-p24:64:64" 1762 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128" 1763 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64"; 1764 1765 class AMDGPUTargetInfo : public TargetInfo { 1766 static const Builtin::Info BuiltinInfo[]; 1767 static const char * const GCCRegNames[]; 1768 1769 /// \brief The GPU profiles supported by the AMDGPU target. 1770 enum GPUKind { 1771 GK_NONE, 1772 GK_R600, 1773 GK_R600_DOUBLE_OPS, 1774 GK_R700, 1775 GK_R700_DOUBLE_OPS, 1776 GK_EVERGREEN, 1777 GK_EVERGREEN_DOUBLE_OPS, 1778 GK_NORTHERN_ISLANDS, 1779 GK_CAYMAN, 1780 GK_SOUTHERN_ISLANDS, 1781 GK_SEA_ISLANDS, 1782 GK_VOLCANIC_ISLANDS 1783 } GPU; 1784 1785 bool hasFP64:1; 1786 bool hasFMAF:1; 1787 bool hasLDEXPF:1; 1788 1789 public: 1790 AMDGPUTargetInfo(const llvm::Triple &Triple) 1791 : TargetInfo(Triple) { 1792 1793 if (Triple.getArch() == llvm::Triple::amdgcn) { 1794 DataLayoutString = DataLayoutStringSI; 1795 GPU = GK_SOUTHERN_ISLANDS; 1796 hasFP64 = true; 1797 hasFMAF = true; 1798 hasLDEXPF = true; 1799 } else { 1800 DataLayoutString = DataLayoutStringR600; 1801 GPU = GK_R600; 1802 hasFP64 = false; 1803 hasFMAF = false; 1804 hasLDEXPF = false; 1805 } 1806 AddrSpaceMap = &AMDGPUAddrSpaceMap; 1807 UseAddrSpaceMapMangling = true; 1808 } 1809 1810 uint64_t getPointerWidthV(unsigned AddrSpace) const override { 1811 if (GPU <= GK_CAYMAN) 1812 return 32; 1813 1814 switch(AddrSpace) { 1815 default: 1816 return 64; 1817 case 0: 1818 case 3: 1819 case 5: 1820 return 32; 1821 } 1822 } 1823 1824 const char * getClobbers() const override { 1825 return ""; 1826 } 1827 1828 void getGCCRegNames(const char * const *&Names, 1829 unsigned &NumNames) const override; 1830 1831 void getGCCRegAliases(const GCCRegAlias *&Aliases, 1832 unsigned &NumAliases) const override { 1833 Aliases = nullptr; 1834 NumAliases = 0; 1835 } 1836 1837 bool validateAsmConstraint(const char *&Name, 1838 TargetInfo::ConstraintInfo &info) const override { 1839 return true; 1840 } 1841 1842 void getTargetBuiltins(const Builtin::Info *&Records, 1843 unsigned &NumRecords) const override { 1844 Records = BuiltinInfo; 1845 NumRecords = clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin; 1846 } 1847 1848 void getTargetDefines(const LangOptions &Opts, 1849 MacroBuilder &Builder) const override { 1850 Builder.defineMacro("__R600__"); 1851 if (hasFMAF) 1852 Builder.defineMacro("__HAS_FMAF__"); 1853 if (hasLDEXPF) 1854 Builder.defineMacro("__HAS_LDEXPF__"); 1855 if (hasFP64 && Opts.OpenCL) 1856 Builder.defineMacro("cl_khr_fp64"); 1857 if (Opts.OpenCL) { 1858 if (GPU >= GK_NORTHERN_ISLANDS) { 1859 Builder.defineMacro("cl_khr_byte_addressable_store"); 1860 Builder.defineMacro("cl_khr_global_int32_base_atomics"); 1861 Builder.defineMacro("cl_khr_global_int32_extended_atomics"); 1862 Builder.defineMacro("cl_khr_local_int32_base_atomics"); 1863 Builder.defineMacro("cl_khr_local_int32_extended_atomics"); 1864 } 1865 } 1866 } 1867 1868 BuiltinVaListKind getBuiltinVaListKind() const override { 1869 return TargetInfo::CharPtrBuiltinVaList; 1870 } 1871 1872 bool setCPU(const std::string &Name) override { 1873 GPU = llvm::StringSwitch<GPUKind>(Name) 1874 .Case("r600" , GK_R600) 1875 .Case("rv610", GK_R600) 1876 .Case("rv620", GK_R600) 1877 .Case("rv630", GK_R600) 1878 .Case("rv635", GK_R600) 1879 .Case("rs780", GK_R600) 1880 .Case("rs880", GK_R600) 1881 .Case("rv670", GK_R600_DOUBLE_OPS) 1882 .Case("rv710", GK_R700) 1883 .Case("rv730", GK_R700) 1884 .Case("rv740", GK_R700_DOUBLE_OPS) 1885 .Case("rv770", GK_R700_DOUBLE_OPS) 1886 .Case("palm", GK_EVERGREEN) 1887 .Case("cedar", GK_EVERGREEN) 1888 .Case("sumo", GK_EVERGREEN) 1889 .Case("sumo2", GK_EVERGREEN) 1890 .Case("redwood", GK_EVERGREEN) 1891 .Case("juniper", GK_EVERGREEN) 1892 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS) 1893 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS) 1894 .Case("barts", GK_NORTHERN_ISLANDS) 1895 .Case("turks", GK_NORTHERN_ISLANDS) 1896 .Case("caicos", GK_NORTHERN_ISLANDS) 1897 .Case("cayman", GK_CAYMAN) 1898 .Case("aruba", GK_CAYMAN) 1899 .Case("tahiti", GK_SOUTHERN_ISLANDS) 1900 .Case("pitcairn", GK_SOUTHERN_ISLANDS) 1901 .Case("verde", GK_SOUTHERN_ISLANDS) 1902 .Case("oland", GK_SOUTHERN_ISLANDS) 1903 .Case("hainan", GK_SOUTHERN_ISLANDS) 1904 .Case("bonaire", GK_SEA_ISLANDS) 1905 .Case("kabini", GK_SEA_ISLANDS) 1906 .Case("kaveri", GK_SEA_ISLANDS) 1907 .Case("hawaii", GK_SEA_ISLANDS) 1908 .Case("mullins", GK_SEA_ISLANDS) 1909 .Case("tonga", GK_VOLCANIC_ISLANDS) 1910 .Case("iceland", GK_VOLCANIC_ISLANDS) 1911 .Case("carrizo", GK_VOLCANIC_ISLANDS) 1912 .Default(GK_NONE); 1913 1914 if (GPU == GK_NONE) { 1915 return false; 1916 } 1917 1918 // Set the correct data layout 1919 switch (GPU) { 1920 case GK_NONE: 1921 case GK_R600: 1922 case GK_R700: 1923 case GK_EVERGREEN: 1924 case GK_NORTHERN_ISLANDS: 1925 DataLayoutString = DataLayoutStringR600; 1926 hasFP64 = false; 1927 hasFMAF = false; 1928 hasLDEXPF = false; 1929 break; 1930 case GK_R600_DOUBLE_OPS: 1931 case GK_R700_DOUBLE_OPS: 1932 case GK_EVERGREEN_DOUBLE_OPS: 1933 case GK_CAYMAN: 1934 DataLayoutString = DataLayoutStringR600DoubleOps; 1935 hasFP64 = true; 1936 hasFMAF = true; 1937 hasLDEXPF = false; 1938 break; 1939 case GK_SOUTHERN_ISLANDS: 1940 case GK_SEA_ISLANDS: 1941 case GK_VOLCANIC_ISLANDS: 1942 DataLayoutString = DataLayoutStringSI; 1943 hasFP64 = true; 1944 hasFMAF = true; 1945 hasLDEXPF = true; 1946 break; 1947 } 1948 1949 return true; 1950 } 1951 }; 1952 1953 const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = { 1954 #define BUILTIN(ID, TYPE, ATTRS) \ 1955 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr }, 1956 #include "clang/Basic/BuiltinsAMDGPU.def" 1957 }; 1958 const char * const AMDGPUTargetInfo::GCCRegNames[] = { 1959 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", 1960 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", 1961 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", 1962 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31", 1963 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39", 1964 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47", 1965 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55", 1966 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63", 1967 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71", 1968 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79", 1969 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87", 1970 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95", 1971 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103", 1972 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111", 1973 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119", 1974 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127", 1975 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135", 1976 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143", 1977 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151", 1978 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159", 1979 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167", 1980 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175", 1981 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183", 1982 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191", 1983 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199", 1984 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207", 1985 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215", 1986 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223", 1987 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231", 1988 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239", 1989 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247", 1990 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255", 1991 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", 1992 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15", 1993 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23", 1994 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31", 1995 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39", 1996 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47", 1997 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55", 1998 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63", 1999 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71", 2000 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79", 2001 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87", 2002 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95", 2003 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103", 2004 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111", 2005 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119", 2006 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127" 2007 "exec", "vcc", "scc", "m0", "flat_scr", "exec_lo", "exec_hi", 2008 "vcc_lo", "vcc_hi", "flat_scr_lo", "flat_scr_hi" 2009 }; 2010 2011 void AMDGPUTargetInfo::getGCCRegNames(const char * const *&Names, 2012 unsigned &NumNames) const { 2013 Names = GCCRegNames; 2014 NumNames = llvm::array_lengthof(GCCRegNames); 2015 } 2016 2017 // Namespace for x86 abstract base class 2018 const Builtin::Info BuiltinInfo[] = { 2019 #define BUILTIN(ID, TYPE, ATTRS) \ 2020 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr }, 2021 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \ 2022 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr }, 2023 #define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \ 2024 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE }, 2025 #include "clang/Basic/BuiltinsX86.def" 2026 }; 2027 2028 static const char* const GCCRegNames[] = { 2029 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp", 2030 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)", 2031 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame", 2032 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7", 2033 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7", 2034 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", 2035 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15", 2036 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7", 2037 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15", 2038 }; 2039 2040 const TargetInfo::AddlRegName AddlRegNames[] = { 2041 { { "al", "ah", "eax", "rax" }, 0 }, 2042 { { "bl", "bh", "ebx", "rbx" }, 3 }, 2043 { { "cl", "ch", "ecx", "rcx" }, 2 }, 2044 { { "dl", "dh", "edx", "rdx" }, 1 }, 2045 { { "esi", "rsi" }, 4 }, 2046 { { "edi", "rdi" }, 5 }, 2047 { { "esp", "rsp" }, 7 }, 2048 { { "ebp", "rbp" }, 6 }, 2049 { { "r8d", "r8w", "r8b" }, 38 }, 2050 { { "r9d", "r9w", "r9b" }, 39 }, 2051 { { "r10d", "r10w", "r10b" }, 40 }, 2052 { { "r11d", "r11w", "r11b" }, 41 }, 2053 { { "r12d", "r12w", "r12b" }, 42 }, 2054 { { "r13d", "r13w", "r13b" }, 43 }, 2055 { { "r14d", "r14w", "r14b" }, 44 }, 2056 { { "r15d", "r15w", "r15b" }, 45 }, 2057 }; 2058 2059 // X86 target abstract base class; x86-32 and x86-64 are very close, so 2060 // most of the implementation can be shared. 2061 class X86TargetInfo : public TargetInfo { 2062 enum X86SSEEnum { 2063 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F 2064 } SSELevel; 2065 enum MMX3DNowEnum { 2066 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon 2067 } MMX3DNowLevel; 2068 enum XOPEnum { 2069 NoXOP, 2070 SSE4A, 2071 FMA4, 2072 XOP 2073 } XOPLevel; 2074 2075 bool HasAES; 2076 bool HasPCLMUL; 2077 bool HasLZCNT; 2078 bool HasRDRND; 2079 bool HasFSGSBASE; 2080 bool HasBMI; 2081 bool HasBMI2; 2082 bool HasPOPCNT; 2083 bool HasRTM; 2084 bool HasPRFCHW; 2085 bool HasRDSEED; 2086 bool HasADX; 2087 bool HasTBM; 2088 bool HasFMA; 2089 bool HasF16C; 2090 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW, 2091 HasAVX512VL; 2092 bool HasSHA; 2093 bool HasCX16; 2094 2095 /// \brief Enumeration of all of the X86 CPUs supported by Clang. 2096 /// 2097 /// Each enumeration represents a particular CPU supported by Clang. These 2098 /// loosely correspond to the options passed to '-march' or '-mtune' flags. 2099 enum CPUKind { 2100 CK_Generic, 2101 2102 /// \name i386 2103 /// i386-generation processors. 2104 //@{ 2105 CK_i386, 2106 //@} 2107 2108 /// \name i486 2109 /// i486-generation processors. 2110 //@{ 2111 CK_i486, 2112 CK_WinChipC6, 2113 CK_WinChip2, 2114 CK_C3, 2115 //@} 2116 2117 /// \name i586 2118 /// i586-generation processors, P5 microarchitecture based. 2119 //@{ 2120 CK_i586, 2121 CK_Pentium, 2122 CK_PentiumMMX, 2123 //@} 2124 2125 /// \name i686 2126 /// i686-generation processors, P6 / Pentium M microarchitecture based. 2127 //@{ 2128 CK_i686, 2129 CK_PentiumPro, 2130 CK_Pentium2, 2131 CK_Pentium3, 2132 CK_Pentium3M, 2133 CK_PentiumM, 2134 CK_C3_2, 2135 2136 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah. 2137 /// Clang however has some logic to suport this. 2138 // FIXME: Warn, deprecate, and potentially remove this. 2139 CK_Yonah, 2140 //@} 2141 2142 /// \name Netburst 2143 /// Netburst microarchitecture based processors. 2144 //@{ 2145 CK_Pentium4, 2146 CK_Pentium4M, 2147 CK_Prescott, 2148 CK_Nocona, 2149 //@} 2150 2151 /// \name Core 2152 /// Core microarchitecture based processors. 2153 //@{ 2154 CK_Core2, 2155 2156 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another 2157 /// codename which GCC no longer accepts as an option to -march, but Clang 2158 /// has some logic for recognizing it. 2159 // FIXME: Warn, deprecate, and potentially remove this. 2160 CK_Penryn, 2161 //@} 2162 2163 /// \name Atom 2164 /// Atom processors 2165 //@{ 2166 CK_Bonnell, 2167 CK_Silvermont, 2168 //@} 2169 2170 /// \name Nehalem 2171 /// Nehalem microarchitecture based processors. 2172 CK_Nehalem, 2173 2174 /// \name Westmere 2175 /// Westmere microarchitecture based processors. 2176 CK_Westmere, 2177 2178 /// \name Sandy Bridge 2179 /// Sandy Bridge microarchitecture based processors. 2180 CK_SandyBridge, 2181 2182 /// \name Ivy Bridge 2183 /// Ivy Bridge microarchitecture based processors. 2184 CK_IvyBridge, 2185 2186 /// \name Haswell 2187 /// Haswell microarchitecture based processors. 2188 CK_Haswell, 2189 2190 /// \name Broadwell 2191 /// Broadwell microarchitecture based processors. 2192 CK_Broadwell, 2193 2194 /// \name Skylake 2195 /// Skylake microarchitecture based processors. 2196 CK_Skylake, 2197 2198 /// \name Knights Landing 2199 /// Knights Landing processor. 2200 CK_KNL, 2201 2202 /// \name K6 2203 /// K6 architecture processors. 2204 //@{ 2205 CK_K6, 2206 CK_K6_2, 2207 CK_K6_3, 2208 //@} 2209 2210 /// \name K7 2211 /// K7 architecture processors. 2212 //@{ 2213 CK_Athlon, 2214 CK_AthlonThunderbird, 2215 CK_Athlon4, 2216 CK_AthlonXP, 2217 CK_AthlonMP, 2218 //@} 2219 2220 /// \name K8 2221 /// K8 architecture processors. 2222 //@{ 2223 CK_Athlon64, 2224 CK_Athlon64SSE3, 2225 CK_AthlonFX, 2226 CK_K8, 2227 CK_K8SSE3, 2228 CK_Opteron, 2229 CK_OpteronSSE3, 2230 CK_AMDFAM10, 2231 //@} 2232 2233 /// \name Bobcat 2234 /// Bobcat architecture processors. 2235 //@{ 2236 CK_BTVER1, 2237 CK_BTVER2, 2238 //@} 2239 2240 /// \name Bulldozer 2241 /// Bulldozer architecture processors. 2242 //@{ 2243 CK_BDVER1, 2244 CK_BDVER2, 2245 CK_BDVER3, 2246 CK_BDVER4, 2247 //@} 2248 2249 /// This specification is deprecated and will be removed in the future. 2250 /// Users should prefer \see CK_K8. 2251 // FIXME: Warn on this when the CPU is set to it. 2252 //@{ 2253 CK_x86_64, 2254 //@} 2255 2256 /// \name Geode 2257 /// Geode processors. 2258 //@{ 2259 CK_Geode 2260 //@} 2261 } CPU; 2262 2263 CPUKind getCPUKind(StringRef CPU) const { 2264 return llvm::StringSwitch<CPUKind>(CPU) 2265 .Case("i386", CK_i386) 2266 .Case("i486", CK_i486) 2267 .Case("winchip-c6", CK_WinChipC6) 2268 .Case("winchip2", CK_WinChip2) 2269 .Case("c3", CK_C3) 2270 .Case("i586", CK_i586) 2271 .Case("pentium", CK_Pentium) 2272 .Case("pentium-mmx", CK_PentiumMMX) 2273 .Case("i686", CK_i686) 2274 .Case("pentiumpro", CK_PentiumPro) 2275 .Case("pentium2", CK_Pentium2) 2276 .Case("pentium3", CK_Pentium3) 2277 .Case("pentium3m", CK_Pentium3M) 2278 .Case("pentium-m", CK_PentiumM) 2279 .Case("c3-2", CK_C3_2) 2280 .Case("yonah", CK_Yonah) 2281 .Case("pentium4", CK_Pentium4) 2282 .Case("pentium4m", CK_Pentium4M) 2283 .Case("prescott", CK_Prescott) 2284 .Case("nocona", CK_Nocona) 2285 .Case("core2", CK_Core2) 2286 .Case("penryn", CK_Penryn) 2287 .Case("bonnell", CK_Bonnell) 2288 .Case("atom", CK_Bonnell) // Legacy name. 2289 .Case("silvermont", CK_Silvermont) 2290 .Case("slm", CK_Silvermont) // Legacy name. 2291 .Case("nehalem", CK_Nehalem) 2292 .Case("corei7", CK_Nehalem) // Legacy name. 2293 .Case("westmere", CK_Westmere) 2294 .Case("sandybridge", CK_SandyBridge) 2295 .Case("corei7-avx", CK_SandyBridge) // Legacy name. 2296 .Case("ivybridge", CK_IvyBridge) 2297 .Case("core-avx-i", CK_IvyBridge) // Legacy name. 2298 .Case("haswell", CK_Haswell) 2299 .Case("core-avx2", CK_Haswell) // Legacy name. 2300 .Case("broadwell", CK_Broadwell) 2301 .Case("skylake", CK_Skylake) 2302 .Case("skx", CK_Skylake) // Legacy name. 2303 .Case("knl", CK_KNL) 2304 .Case("k6", CK_K6) 2305 .Case("k6-2", CK_K6_2) 2306 .Case("k6-3", CK_K6_3) 2307 .Case("athlon", CK_Athlon) 2308 .Case("athlon-tbird", CK_AthlonThunderbird) 2309 .Case("athlon-4", CK_Athlon4) 2310 .Case("athlon-xp", CK_AthlonXP) 2311 .Case("athlon-mp", CK_AthlonMP) 2312 .Case("athlon64", CK_Athlon64) 2313 .Case("athlon64-sse3", CK_Athlon64SSE3) 2314 .Case("athlon-fx", CK_AthlonFX) 2315 .Case("k8", CK_K8) 2316 .Case("k8-sse3", CK_K8SSE3) 2317 .Case("opteron", CK_Opteron) 2318 .Case("opteron-sse3", CK_OpteronSSE3) 2319 .Case("barcelona", CK_AMDFAM10) 2320 .Case("amdfam10", CK_AMDFAM10) 2321 .Case("btver1", CK_BTVER1) 2322 .Case("btver2", CK_BTVER2) 2323 .Case("bdver1", CK_BDVER1) 2324 .Case("bdver2", CK_BDVER2) 2325 .Case("bdver3", CK_BDVER3) 2326 .Case("bdver4", CK_BDVER4) 2327 .Case("x86-64", CK_x86_64) 2328 .Case("geode", CK_Geode) 2329 .Default(CK_Generic); 2330 } 2331 2332 enum FPMathKind { 2333 FP_Default, 2334 FP_SSE, 2335 FP_387 2336 } FPMath; 2337 2338 public: 2339 X86TargetInfo(const llvm::Triple &Triple) 2340 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow), 2341 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false), 2342 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false), 2343 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false), 2344 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false), 2345 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false), 2346 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false), 2347 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) { 2348 BigEndian = false; 2349 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended; 2350 } 2351 unsigned getFloatEvalMethod() const override { 2352 // X87 evaluates with 80 bits "long double" precision. 2353 return SSELevel == NoSSE ? 2 : 0; 2354 } 2355 void getTargetBuiltins(const Builtin::Info *&Records, 2356 unsigned &NumRecords) const override { 2357 Records = BuiltinInfo; 2358 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin; 2359 } 2360 void getGCCRegNames(const char * const *&Names, 2361 unsigned &NumNames) const override { 2362 Names = GCCRegNames; 2363 NumNames = llvm::array_lengthof(GCCRegNames); 2364 } 2365 void getGCCRegAliases(const GCCRegAlias *&Aliases, 2366 unsigned &NumAliases) const override { 2367 Aliases = nullptr; 2368 NumAliases = 0; 2369 } 2370 void getGCCAddlRegNames(const AddlRegName *&Names, 2371 unsigned &NumNames) const override { 2372 Names = AddlRegNames; 2373 NumNames = llvm::array_lengthof(AddlRegNames); 2374 } 2375 bool validateCpuSupports(StringRef Name) const override; 2376 bool validateAsmConstraint(const char *&Name, 2377 TargetInfo::ConstraintInfo &info) const override; 2378 2379 bool validateOutputSize(StringRef Constraint, unsigned Size) const override; 2380 2381 bool validateInputSize(StringRef Constraint, unsigned Size) const override; 2382 2383 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const; 2384 2385 std::string convertConstraint(const char *&Constraint) const override; 2386 const char *getClobbers() const override { 2387 return "~{dirflag},~{fpsr},~{flags}"; 2388 } 2389 void getTargetDefines(const LangOptions &Opts, 2390 MacroBuilder &Builder) const override; 2391 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level, 2392 bool Enabled); 2393 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level, 2394 bool Enabled); 2395 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level, 2396 bool Enabled); 2397 void setFeatureEnabled(llvm::StringMap<bool> &Features, 2398 StringRef Name, bool Enabled) const override { 2399 setFeatureEnabledImpl(Features, Name, Enabled); 2400 } 2401 // This exists purely to cut down on the number of virtual calls in 2402 // initFeatureMap which calls this repeatedly. 2403 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features, 2404 StringRef Name, bool Enabled); 2405 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, 2406 StringRef CPU, 2407 std::vector<std::string> &FeaturesVec) const override; 2408 bool hasFeature(StringRef Feature) const override; 2409 bool handleTargetFeatures(std::vector<std::string> &Features, 2410 DiagnosticsEngine &Diags) override; 2411 StringRef getABI() const override { 2412 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F) 2413 return "avx512"; 2414 else if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX) 2415 return "avx"; 2416 else if (getTriple().getArch() == llvm::Triple::x86 && 2417 MMX3DNowLevel == NoMMX3DNow) 2418 return "no-mmx"; 2419 return ""; 2420 } 2421 bool setCPU(const std::string &Name) override { 2422 CPU = getCPUKind(Name); 2423 2424 // Perform any per-CPU checks necessary to determine if this CPU is 2425 // acceptable. 2426 // FIXME: This results in terrible diagnostics. Clang just says the CPU is 2427 // invalid without explaining *why*. 2428 switch (CPU) { 2429 case CK_Generic: 2430 // No processor selected! 2431 return false; 2432 2433 case CK_i386: 2434 case CK_i486: 2435 case CK_WinChipC6: 2436 case CK_WinChip2: 2437 case CK_C3: 2438 case CK_i586: 2439 case CK_Pentium: 2440 case CK_PentiumMMX: 2441 case CK_i686: 2442 case CK_PentiumPro: 2443 case CK_Pentium2: 2444 case CK_Pentium3: 2445 case CK_Pentium3M: 2446 case CK_PentiumM: 2447 case CK_Yonah: 2448 case CK_C3_2: 2449 case CK_Pentium4: 2450 case CK_Pentium4M: 2451 case CK_Prescott: 2452 case CK_K6: 2453 case CK_K6_2: 2454 case CK_K6_3: 2455 case CK_Athlon: 2456 case CK_AthlonThunderbird: 2457 case CK_Athlon4: 2458 case CK_AthlonXP: 2459 case CK_AthlonMP: 2460 case CK_Geode: 2461 // Only accept certain architectures when compiling in 32-bit mode. 2462 if (getTriple().getArch() != llvm::Triple::x86) 2463 return false; 2464 2465 // Fallthrough 2466 case CK_Nocona: 2467 case CK_Core2: 2468 case CK_Penryn: 2469 case CK_Bonnell: 2470 case CK_Silvermont: 2471 case CK_Nehalem: 2472 case CK_Westmere: 2473 case CK_SandyBridge: 2474 case CK_IvyBridge: 2475 case CK_Haswell: 2476 case CK_Broadwell: 2477 case CK_Skylake: 2478 case CK_KNL: 2479 case CK_Athlon64: 2480 case CK_Athlon64SSE3: 2481 case CK_AthlonFX: 2482 case CK_K8: 2483 case CK_K8SSE3: 2484 case CK_Opteron: 2485 case CK_OpteronSSE3: 2486 case CK_AMDFAM10: 2487 case CK_BTVER1: 2488 case CK_BTVER2: 2489 case CK_BDVER1: 2490 case CK_BDVER2: 2491 case CK_BDVER3: 2492 case CK_BDVER4: 2493 case CK_x86_64: 2494 return true; 2495 } 2496 llvm_unreachable("Unhandled CPU kind"); 2497 } 2498 2499 bool setFPMath(StringRef Name) override; 2500 2501 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override { 2502 // We accept all non-ARM calling conventions 2503 return (CC == CC_X86ThisCall || 2504 CC == CC_X86FastCall || 2505 CC == CC_X86StdCall || 2506 CC == CC_X86VectorCall || 2507 CC == CC_C || 2508 CC == CC_X86Pascal || 2509 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning; 2510 } 2511 2512 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override { 2513 return MT == CCMT_Member ? CC_X86ThisCall : CC_C; 2514 } 2515 2516 bool hasSjLjLowering() const override { 2517 return true; 2518 } 2519 }; 2520 2521 bool X86TargetInfo::setFPMath(StringRef Name) { 2522 if (Name == "387") { 2523 FPMath = FP_387; 2524 return true; 2525 } 2526 if (Name == "sse") { 2527 FPMath = FP_SSE; 2528 return true; 2529 } 2530 return false; 2531 } 2532 2533 bool X86TargetInfo::initFeatureMap( 2534 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU, 2535 std::vector<std::string> &FeaturesVec) const { 2536 // FIXME: This *really* should not be here. 2537 // X86_64 always has SSE2. 2538 if (getTriple().getArch() == llvm::Triple::x86_64) 2539 setFeatureEnabledImpl(Features, "sse2", true); 2540 2541 switch (getCPUKind(CPU)) { 2542 case CK_Generic: 2543 case CK_i386: 2544 case CK_i486: 2545 case CK_i586: 2546 case CK_Pentium: 2547 case CK_i686: 2548 case CK_PentiumPro: 2549 break; 2550 case CK_PentiumMMX: 2551 case CK_Pentium2: 2552 case CK_K6: 2553 case CK_WinChipC6: 2554 setFeatureEnabledImpl(Features, "mmx", true); 2555 break; 2556 case CK_Pentium3: 2557 case CK_Pentium3M: 2558 case CK_C3_2: 2559 setFeatureEnabledImpl(Features, "sse", true); 2560 break; 2561 case CK_PentiumM: 2562 case CK_Pentium4: 2563 case CK_Pentium4M: 2564 case CK_x86_64: 2565 setFeatureEnabledImpl(Features, "sse2", true); 2566 break; 2567 case CK_Yonah: 2568 case CK_Prescott: 2569 case CK_Nocona: 2570 setFeatureEnabledImpl(Features, "sse3", true); 2571 setFeatureEnabledImpl(Features, "cx16", true); 2572 break; 2573 case CK_Core2: 2574 case CK_Bonnell: 2575 setFeatureEnabledImpl(Features, "ssse3", true); 2576 setFeatureEnabledImpl(Features, "cx16", true); 2577 break; 2578 case CK_Penryn: 2579 setFeatureEnabledImpl(Features, "sse4.1", true); 2580 setFeatureEnabledImpl(Features, "cx16", true); 2581 break; 2582 case CK_Skylake: 2583 setFeatureEnabledImpl(Features, "avx512f", true); 2584 setFeatureEnabledImpl(Features, "avx512cd", true); 2585 setFeatureEnabledImpl(Features, "avx512dq", true); 2586 setFeatureEnabledImpl(Features, "avx512bw", true); 2587 setFeatureEnabledImpl(Features, "avx512vl", true); 2588 // FALLTHROUGH 2589 case CK_Broadwell: 2590 setFeatureEnabledImpl(Features, "rdseed", true); 2591 setFeatureEnabledImpl(Features, "adx", true); 2592 // FALLTHROUGH 2593 case CK_Haswell: 2594 setFeatureEnabledImpl(Features, "avx2", true); 2595 setFeatureEnabledImpl(Features, "lzcnt", true); 2596 setFeatureEnabledImpl(Features, "bmi", true); 2597 setFeatureEnabledImpl(Features, "bmi2", true); 2598 setFeatureEnabledImpl(Features, "rtm", true); 2599 setFeatureEnabledImpl(Features, "fma", true); 2600 // FALLTHROUGH 2601 case CK_IvyBridge: 2602 setFeatureEnabledImpl(Features, "rdrnd", true); 2603 setFeatureEnabledImpl(Features, "f16c", true); 2604 setFeatureEnabledImpl(Features, "fsgsbase", true); 2605 // FALLTHROUGH 2606 case CK_SandyBridge: 2607 setFeatureEnabledImpl(Features, "avx", true); 2608 // FALLTHROUGH 2609 case CK_Westmere: 2610 case CK_Silvermont: 2611 setFeatureEnabledImpl(Features, "aes", true); 2612 setFeatureEnabledImpl(Features, "pclmul", true); 2613 // FALLTHROUGH 2614 case CK_Nehalem: 2615 setFeatureEnabledImpl(Features, "sse4.2", true); 2616 setFeatureEnabledImpl(Features, "cx16", true); 2617 break; 2618 case CK_KNL: 2619 setFeatureEnabledImpl(Features, "avx512f", true); 2620 setFeatureEnabledImpl(Features, "avx512cd", true); 2621 setFeatureEnabledImpl(Features, "avx512er", true); 2622 setFeatureEnabledImpl(Features, "avx512pf", true); 2623 setFeatureEnabledImpl(Features, "rdseed", true); 2624 setFeatureEnabledImpl(Features, "adx", true); 2625 setFeatureEnabledImpl(Features, "lzcnt", true); 2626 setFeatureEnabledImpl(Features, "bmi", true); 2627 setFeatureEnabledImpl(Features, "bmi2", true); 2628 setFeatureEnabledImpl(Features, "rtm", true); 2629 setFeatureEnabledImpl(Features, "fma", true); 2630 setFeatureEnabledImpl(Features, "rdrnd", true); 2631 setFeatureEnabledImpl(Features, "f16c", true); 2632 setFeatureEnabledImpl(Features, "fsgsbase", true); 2633 setFeatureEnabledImpl(Features, "aes", true); 2634 setFeatureEnabledImpl(Features, "pclmul", true); 2635 setFeatureEnabledImpl(Features, "cx16", true); 2636 break; 2637 case CK_K6_2: 2638 case CK_K6_3: 2639 case CK_WinChip2: 2640 case CK_C3: 2641 setFeatureEnabledImpl(Features, "3dnow", true); 2642 break; 2643 case CK_Athlon: 2644 case CK_AthlonThunderbird: 2645 case CK_Geode: 2646 setFeatureEnabledImpl(Features, "3dnowa", true); 2647 break; 2648 case CK_Athlon4: 2649 case CK_AthlonXP: 2650 case CK_AthlonMP: 2651 setFeatureEnabledImpl(Features, "sse", true); 2652 setFeatureEnabledImpl(Features, "3dnowa", true); 2653 break; 2654 case CK_K8: 2655 case CK_Opteron: 2656 case CK_Athlon64: 2657 case CK_AthlonFX: 2658 setFeatureEnabledImpl(Features, "sse2", true); 2659 setFeatureEnabledImpl(Features, "3dnowa", true); 2660 break; 2661 case CK_AMDFAM10: 2662 setFeatureEnabledImpl(Features, "sse4a", true); 2663 setFeatureEnabledImpl(Features, "lzcnt", true); 2664 setFeatureEnabledImpl(Features, "popcnt", true); 2665 // FALLTHROUGH 2666 case CK_K8SSE3: 2667 case CK_OpteronSSE3: 2668 case CK_Athlon64SSE3: 2669 setFeatureEnabledImpl(Features, "sse3", true); 2670 setFeatureEnabledImpl(Features, "3dnowa", true); 2671 break; 2672 case CK_BTVER2: 2673 setFeatureEnabledImpl(Features, "avx", true); 2674 setFeatureEnabledImpl(Features, "aes", true); 2675 setFeatureEnabledImpl(Features, "pclmul", true); 2676 setFeatureEnabledImpl(Features, "bmi", true); 2677 setFeatureEnabledImpl(Features, "f16c", true); 2678 // FALLTHROUGH 2679 case CK_BTVER1: 2680 setFeatureEnabledImpl(Features, "ssse3", true); 2681 setFeatureEnabledImpl(Features, "sse4a", true); 2682 setFeatureEnabledImpl(Features, "lzcnt", true); 2683 setFeatureEnabledImpl(Features, "popcnt", true); 2684 setFeatureEnabledImpl(Features, "prfchw", true); 2685 setFeatureEnabledImpl(Features, "cx16", true); 2686 break; 2687 case CK_BDVER4: 2688 setFeatureEnabledImpl(Features, "avx2", true); 2689 setFeatureEnabledImpl(Features, "bmi2", true); 2690 // FALLTHROUGH 2691 case CK_BDVER3: 2692 setFeatureEnabledImpl(Features, "fsgsbase", true); 2693 // FALLTHROUGH 2694 case CK_BDVER2: 2695 setFeatureEnabledImpl(Features, "bmi", true); 2696 setFeatureEnabledImpl(Features, "fma", true); 2697 setFeatureEnabledImpl(Features, "f16c", true); 2698 setFeatureEnabledImpl(Features, "tbm", true); 2699 // FALLTHROUGH 2700 case CK_BDVER1: 2701 // xop implies avx, sse4a and fma4. 2702 setFeatureEnabledImpl(Features, "xop", true); 2703 setFeatureEnabledImpl(Features, "lzcnt", true); 2704 setFeatureEnabledImpl(Features, "aes", true); 2705 setFeatureEnabledImpl(Features, "pclmul", true); 2706 setFeatureEnabledImpl(Features, "prfchw", true); 2707 setFeatureEnabledImpl(Features, "cx16", true); 2708 break; 2709 } 2710 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec); 2711 } 2712 2713 void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features, 2714 X86SSEEnum Level, bool Enabled) { 2715 if (Enabled) { 2716 switch (Level) { 2717 case AVX512F: 2718 Features["avx512f"] = true; 2719 case AVX2: 2720 Features["avx2"] = true; 2721 case AVX: 2722 Features["avx"] = true; 2723 case SSE42: 2724 Features["sse4.2"] = true; 2725 case SSE41: 2726 Features["sse4.1"] = true; 2727 case SSSE3: 2728 Features["ssse3"] = true; 2729 case SSE3: 2730 Features["sse3"] = true; 2731 case SSE2: 2732 Features["sse2"] = true; 2733 case SSE1: 2734 Features["sse"] = true; 2735 case NoSSE: 2736 break; 2737 } 2738 return; 2739 } 2740 2741 switch (Level) { 2742 case NoSSE: 2743 case SSE1: 2744 Features["sse"] = false; 2745 case SSE2: 2746 Features["sse2"] = Features["pclmul"] = Features["aes"] = 2747 Features["sha"] = false; 2748 case SSE3: 2749 Features["sse3"] = false; 2750 setXOPLevel(Features, NoXOP, false); 2751 case SSSE3: 2752 Features["ssse3"] = false; 2753 case SSE41: 2754 Features["sse4.1"] = false; 2755 case SSE42: 2756 Features["sse4.2"] = false; 2757 case AVX: 2758 Features["fma"] = Features["avx"] = Features["f16c"] = false; 2759 setXOPLevel(Features, FMA4, false); 2760 case AVX2: 2761 Features["avx2"] = false; 2762 case AVX512F: 2763 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] = 2764 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] = 2765 Features["avx512vl"] = false; 2766 } 2767 } 2768 2769 void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features, 2770 MMX3DNowEnum Level, bool Enabled) { 2771 if (Enabled) { 2772 switch (Level) { 2773 case AMD3DNowAthlon: 2774 Features["3dnowa"] = true; 2775 case AMD3DNow: 2776 Features["3dnow"] = true; 2777 case MMX: 2778 Features["mmx"] = true; 2779 case NoMMX3DNow: 2780 break; 2781 } 2782 return; 2783 } 2784 2785 switch (Level) { 2786 case NoMMX3DNow: 2787 case MMX: 2788 Features["mmx"] = false; 2789 case AMD3DNow: 2790 Features["3dnow"] = false; 2791 case AMD3DNowAthlon: 2792 Features["3dnowa"] = false; 2793 } 2794 } 2795 2796 void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level, 2797 bool Enabled) { 2798 if (Enabled) { 2799 switch (Level) { 2800 case XOP: 2801 Features["xop"] = true; 2802 case FMA4: 2803 Features["fma4"] = true; 2804 setSSELevel(Features, AVX, true); 2805 case SSE4A: 2806 Features["sse4a"] = true; 2807 setSSELevel(Features, SSE3, true); 2808 case NoXOP: 2809 break; 2810 } 2811 return; 2812 } 2813 2814 switch (Level) { 2815 case NoXOP: 2816 case SSE4A: 2817 Features["sse4a"] = false; 2818 case FMA4: 2819 Features["fma4"] = false; 2820 case XOP: 2821 Features["xop"] = false; 2822 } 2823 } 2824 2825 void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features, 2826 StringRef Name, bool Enabled) { 2827 // This is a bit of a hack to deal with the sse4 target feature when used 2828 // as part of the target attribute. We handle sse4 correctly everywhere 2829 // else. See below for more information on how we handle the sse4 options. 2830 if (Name != "sse4") 2831 Features[Name] = Enabled; 2832 2833 if (Name == "mmx") { 2834 setMMXLevel(Features, MMX, Enabled); 2835 } else if (Name == "sse") { 2836 setSSELevel(Features, SSE1, Enabled); 2837 } else if (Name == "sse2") { 2838 setSSELevel(Features, SSE2, Enabled); 2839 } else if (Name == "sse3") { 2840 setSSELevel(Features, SSE3, Enabled); 2841 } else if (Name == "ssse3") { 2842 setSSELevel(Features, SSSE3, Enabled); 2843 } else if (Name == "sse4.2") { 2844 setSSELevel(Features, SSE42, Enabled); 2845 } else if (Name == "sse4.1") { 2846 setSSELevel(Features, SSE41, Enabled); 2847 } else if (Name == "3dnow") { 2848 setMMXLevel(Features, AMD3DNow, Enabled); 2849 } else if (Name == "3dnowa") { 2850 setMMXLevel(Features, AMD3DNowAthlon, Enabled); 2851 } else if (Name == "aes") { 2852 if (Enabled) 2853 setSSELevel(Features, SSE2, Enabled); 2854 } else if (Name == "pclmul") { 2855 if (Enabled) 2856 setSSELevel(Features, SSE2, Enabled); 2857 } else if (Name == "avx") { 2858 setSSELevel(Features, AVX, Enabled); 2859 } else if (Name == "avx2") { 2860 setSSELevel(Features, AVX2, Enabled); 2861 } else if (Name == "avx512f") { 2862 setSSELevel(Features, AVX512F, Enabled); 2863 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" 2864 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") { 2865 if (Enabled) 2866 setSSELevel(Features, AVX512F, Enabled); 2867 } else if (Name == "fma") { 2868 if (Enabled) 2869 setSSELevel(Features, AVX, Enabled); 2870 } else if (Name == "fma4") { 2871 setXOPLevel(Features, FMA4, Enabled); 2872 } else if (Name == "xop") { 2873 setXOPLevel(Features, XOP, Enabled); 2874 } else if (Name == "sse4a") { 2875 setXOPLevel(Features, SSE4A, Enabled); 2876 } else if (Name == "f16c") { 2877 if (Enabled) 2878 setSSELevel(Features, AVX, Enabled); 2879 } else if (Name == "sha") { 2880 if (Enabled) 2881 setSSELevel(Features, SSE2, Enabled); 2882 } else if (Name == "sse4") { 2883 // We can get here via the __target__ attribute since that's not controlled 2884 // via the -msse4/-mno-sse4 command line alias. Handle this the same way 2885 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if 2886 // disabled. 2887 if (Enabled) 2888 setSSELevel(Features, SSE42, Enabled); 2889 else 2890 setSSELevel(Features, SSE41, Enabled); 2891 } 2892 } 2893 2894 /// handleTargetFeatures - Perform initialization based on the user 2895 /// configured set of features. 2896 bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features, 2897 DiagnosticsEngine &Diags) { 2898 for (const auto &Feature : Features) { 2899 if (Feature[0] != '+') 2900 continue; 2901 2902 if (Feature == "+aes") { 2903 HasAES = true; 2904 } else if (Feature == "+pclmul") { 2905 HasPCLMUL = true; 2906 } else if (Feature == "+lzcnt") { 2907 HasLZCNT = true; 2908 } else if (Feature == "+rdrnd") { 2909 HasRDRND = true; 2910 } else if (Feature == "+fsgsbase") { 2911 HasFSGSBASE = true; 2912 } else if (Feature == "+bmi") { 2913 HasBMI = true; 2914 } else if (Feature == "+bmi2") { 2915 HasBMI2 = true; 2916 } else if (Feature == "+popcnt") { 2917 HasPOPCNT = true; 2918 } else if (Feature == "+rtm") { 2919 HasRTM = true; 2920 } else if (Feature == "+prfchw") { 2921 HasPRFCHW = true; 2922 } else if (Feature == "+rdseed") { 2923 HasRDSEED = true; 2924 } else if (Feature == "+adx") { 2925 HasADX = true; 2926 } else if (Feature == "+tbm") { 2927 HasTBM = true; 2928 } else if (Feature == "+fma") { 2929 HasFMA = true; 2930 } else if (Feature == "+f16c") { 2931 HasF16C = true; 2932 } else if (Feature == "+avx512cd") { 2933 HasAVX512CD = true; 2934 } else if (Feature == "+avx512er") { 2935 HasAVX512ER = true; 2936 } else if (Feature == "+avx512pf") { 2937 HasAVX512PF = true; 2938 } else if (Feature == "+avx512dq") { 2939 HasAVX512DQ = true; 2940 } else if (Feature == "+avx512bw") { 2941 HasAVX512BW = true; 2942 } else if (Feature == "+avx512vl") { 2943 HasAVX512VL = true; 2944 } else if (Feature == "+sha") { 2945 HasSHA = true; 2946 } else if (Feature == "+cx16") { 2947 HasCX16 = true; 2948 } 2949 2950 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature) 2951 .Case("+avx512f", AVX512F) 2952 .Case("+avx2", AVX2) 2953 .Case("+avx", AVX) 2954 .Case("+sse4.2", SSE42) 2955 .Case("+sse4.1", SSE41) 2956 .Case("+ssse3", SSSE3) 2957 .Case("+sse3", SSE3) 2958 .Case("+sse2", SSE2) 2959 .Case("+sse", SSE1) 2960 .Default(NoSSE); 2961 SSELevel = std::max(SSELevel, Level); 2962 2963 MMX3DNowEnum ThreeDNowLevel = 2964 llvm::StringSwitch<MMX3DNowEnum>(Feature) 2965 .Case("+3dnowa", AMD3DNowAthlon) 2966 .Case("+3dnow", AMD3DNow) 2967 .Case("+mmx", MMX) 2968 .Default(NoMMX3DNow); 2969 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel); 2970 2971 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature) 2972 .Case("+xop", XOP) 2973 .Case("+fma4", FMA4) 2974 .Case("+sse4a", SSE4A) 2975 .Default(NoXOP); 2976 XOPLevel = std::max(XOPLevel, XLevel); 2977 } 2978 2979 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled. 2980 // Can't do this earlier because we need to be able to explicitly enable 2981 // popcnt and still disable sse4.2. 2982 if (!HasPOPCNT && SSELevel >= SSE42 && 2983 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){ 2984 HasPOPCNT = true; 2985 Features.push_back("+popcnt"); 2986 } 2987 2988 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled. 2989 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow && 2990 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){ 2991 HasPRFCHW = true; 2992 Features.push_back("+prfchw"); 2993 } 2994 2995 // LLVM doesn't have a separate switch for fpmath, so only accept it if it 2996 // matches the selected sse level. 2997 if (FPMath == FP_SSE && SSELevel < SSE1) { 2998 Diags.Report(diag::err_target_unsupported_fpmath) << "sse"; 2999 return false; 3000 } else if (FPMath == FP_387 && SSELevel >= SSE1) { 3001 Diags.Report(diag::err_target_unsupported_fpmath) << "387"; 3002 return false; 3003 } 3004 3005 // Don't tell the backend if we're turning off mmx; it will end up disabling 3006 // SSE, which we don't want. 3007 // Additionally, if SSE is enabled and mmx is not explicitly disabled, 3008 // then enable MMX. 3009 std::vector<std::string>::iterator it; 3010 it = std::find(Features.begin(), Features.end(), "-mmx"); 3011 if (it != Features.end()) 3012 Features.erase(it); 3013 else if (SSELevel > NoSSE) 3014 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX); 3015 3016 SimdDefaultAlign = 3017 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128; 3018 return true; 3019 } 3020 3021 /// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro 3022 /// definitions for this particular subtarget. 3023 void X86TargetInfo::getTargetDefines(const LangOptions &Opts, 3024 MacroBuilder &Builder) const { 3025 // Target identification. 3026 if (getTriple().getArch() == llvm::Triple::x86_64) { 3027 Builder.defineMacro("__amd64__"); 3028 Builder.defineMacro("__amd64"); 3029 Builder.defineMacro("__x86_64"); 3030 Builder.defineMacro("__x86_64__"); 3031 if (getTriple().getArchName() == "x86_64h") { 3032 Builder.defineMacro("__x86_64h"); 3033 Builder.defineMacro("__x86_64h__"); 3034 } 3035 } else { 3036 DefineStd(Builder, "i386", Opts); 3037 } 3038 3039 // Subtarget options. 3040 // FIXME: We are hard-coding the tune parameters based on the CPU, but they 3041 // truly should be based on -mtune options. 3042 switch (CPU) { 3043 case CK_Generic: 3044 break; 3045 case CK_i386: 3046 // The rest are coming from the i386 define above. 3047 Builder.defineMacro("__tune_i386__"); 3048 break; 3049 case CK_i486: 3050 case CK_WinChipC6: 3051 case CK_WinChip2: 3052 case CK_C3: 3053 defineCPUMacros(Builder, "i486"); 3054 break; 3055 case CK_PentiumMMX: 3056 Builder.defineMacro("__pentium_mmx__"); 3057 Builder.defineMacro("__tune_pentium_mmx__"); 3058 // Fallthrough 3059 case CK_i586: 3060 case CK_Pentium: 3061 defineCPUMacros(Builder, "i586"); 3062 defineCPUMacros(Builder, "pentium"); 3063 break; 3064 case CK_Pentium3: 3065 case CK_Pentium3M: 3066 case CK_PentiumM: 3067 Builder.defineMacro("__tune_pentium3__"); 3068 // Fallthrough 3069 case CK_Pentium2: 3070 case CK_C3_2: 3071 Builder.defineMacro("__tune_pentium2__"); 3072 // Fallthrough 3073 case CK_PentiumPro: 3074 Builder.defineMacro("__tune_i686__"); 3075 Builder.defineMacro("__tune_pentiumpro__"); 3076 // Fallthrough 3077 case CK_i686: 3078 Builder.defineMacro("__i686"); 3079 Builder.defineMacro("__i686__"); 3080 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686. 3081 Builder.defineMacro("__pentiumpro"); 3082 Builder.defineMacro("__pentiumpro__"); 3083 break; 3084 case CK_Pentium4: 3085 case CK_Pentium4M: 3086 defineCPUMacros(Builder, "pentium4"); 3087 break; 3088 case CK_Yonah: 3089 case CK_Prescott: 3090 case CK_Nocona: 3091 defineCPUMacros(Builder, "nocona"); 3092 break; 3093 case CK_Core2: 3094 case CK_Penryn: 3095 defineCPUMacros(Builder, "core2"); 3096 break; 3097 case CK_Bonnell: 3098 defineCPUMacros(Builder, "atom"); 3099 break; 3100 case CK_Silvermont: 3101 defineCPUMacros(Builder, "slm"); 3102 break; 3103 case CK_Nehalem: 3104 case CK_Westmere: 3105 case CK_SandyBridge: 3106 case CK_IvyBridge: 3107 case CK_Haswell: 3108 case CK_Broadwell: 3109 // FIXME: Historically, we defined this legacy name, it would be nice to 3110 // remove it at some point. We've never exposed fine-grained names for 3111 // recent primary x86 CPUs, and we should keep it that way. 3112 defineCPUMacros(Builder, "corei7"); 3113 break; 3114 case CK_Skylake: 3115 // FIXME: Historically, we defined this legacy name, it would be nice to 3116 // remove it at some point. This is the only fine-grained CPU macro in the 3117 // main intel CPU line, and it would be better to not have these and force 3118 // people to use ISA macros. 3119 defineCPUMacros(Builder, "skx"); 3120 break; 3121 case CK_KNL: 3122 defineCPUMacros(Builder, "knl"); 3123 break; 3124 case CK_K6_2: 3125 Builder.defineMacro("__k6_2__"); 3126 Builder.defineMacro("__tune_k6_2__"); 3127 // Fallthrough 3128 case CK_K6_3: 3129 if (CPU != CK_K6_2) { // In case of fallthrough 3130 // FIXME: GCC may be enabling these in cases where some other k6 3131 // architecture is specified but -m3dnow is explicitly provided. The 3132 // exact semantics need to be determined and emulated here. 3133 Builder.defineMacro("__k6_3__"); 3134 Builder.defineMacro("__tune_k6_3__"); 3135 } 3136 // Fallthrough 3137 case CK_K6: 3138 defineCPUMacros(Builder, "k6"); 3139 break; 3140 case CK_Athlon: 3141 case CK_AthlonThunderbird: 3142 case CK_Athlon4: 3143 case CK_AthlonXP: 3144 case CK_AthlonMP: 3145 defineCPUMacros(Builder, "athlon"); 3146 if (SSELevel != NoSSE) { 3147 Builder.defineMacro("__athlon_sse__"); 3148 Builder.defineMacro("__tune_athlon_sse__"); 3149 } 3150 break; 3151 case CK_K8: 3152 case CK_K8SSE3: 3153 case CK_x86_64: 3154 case CK_Opteron: 3155 case CK_OpteronSSE3: 3156 case CK_Athlon64: 3157 case CK_Athlon64SSE3: 3158 case CK_AthlonFX: 3159 defineCPUMacros(Builder, "k8"); 3160 break; 3161 case CK_AMDFAM10: 3162 defineCPUMacros(Builder, "amdfam10"); 3163 break; 3164 case CK_BTVER1: 3165 defineCPUMacros(Builder, "btver1"); 3166 break; 3167 case CK_BTVER2: 3168 defineCPUMacros(Builder, "btver2"); 3169 break; 3170 case CK_BDVER1: 3171 defineCPUMacros(Builder, "bdver1"); 3172 break; 3173 case CK_BDVER2: 3174 defineCPUMacros(Builder, "bdver2"); 3175 break; 3176 case CK_BDVER3: 3177 defineCPUMacros(Builder, "bdver3"); 3178 break; 3179 case CK_BDVER4: 3180 defineCPUMacros(Builder, "bdver4"); 3181 break; 3182 case CK_Geode: 3183 defineCPUMacros(Builder, "geode"); 3184 break; 3185 } 3186 3187 // Target properties. 3188 Builder.defineMacro("__REGISTER_PREFIX__", ""); 3189 3190 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline 3191 // functions in glibc header files that use FP Stack inline asm which the 3192 // backend can't deal with (PR879). 3193 Builder.defineMacro("__NO_MATH_INLINES"); 3194 3195 if (HasAES) 3196 Builder.defineMacro("__AES__"); 3197 3198 if (HasPCLMUL) 3199 Builder.defineMacro("__PCLMUL__"); 3200 3201 if (HasLZCNT) 3202 Builder.defineMacro("__LZCNT__"); 3203 3204 if (HasRDRND) 3205 Builder.defineMacro("__RDRND__"); 3206 3207 if (HasFSGSBASE) 3208 Builder.defineMacro("__FSGSBASE__"); 3209 3210 if (HasBMI) 3211 Builder.defineMacro("__BMI__"); 3212 3213 if (HasBMI2) 3214 Builder.defineMacro("__BMI2__"); 3215 3216 if (HasPOPCNT) 3217 Builder.defineMacro("__POPCNT__"); 3218 3219 if (HasRTM) 3220 Builder.defineMacro("__RTM__"); 3221 3222 if (HasPRFCHW) 3223 Builder.defineMacro("__PRFCHW__"); 3224 3225 if (HasRDSEED) 3226 Builder.defineMacro("__RDSEED__"); 3227 3228 if (HasADX) 3229 Builder.defineMacro("__ADX__"); 3230 3231 if (HasTBM) 3232 Builder.defineMacro("__TBM__"); 3233 3234 switch (XOPLevel) { 3235 case XOP: 3236 Builder.defineMacro("__XOP__"); 3237 case FMA4: 3238 Builder.defineMacro("__FMA4__"); 3239 case SSE4A: 3240 Builder.defineMacro("__SSE4A__"); 3241 case NoXOP: 3242 break; 3243 } 3244 3245 if (HasFMA) 3246 Builder.defineMacro("__FMA__"); 3247 3248 if (HasF16C) 3249 Builder.defineMacro("__F16C__"); 3250 3251 if (HasAVX512CD) 3252 Builder.defineMacro("__AVX512CD__"); 3253 if (HasAVX512ER) 3254 Builder.defineMacro("__AVX512ER__"); 3255 if (HasAVX512PF) 3256 Builder.defineMacro("__AVX512PF__"); 3257 if (HasAVX512DQ) 3258 Builder.defineMacro("__AVX512DQ__"); 3259 if (HasAVX512BW) 3260 Builder.defineMacro("__AVX512BW__"); 3261 if (HasAVX512VL) 3262 Builder.defineMacro("__AVX512VL__"); 3263 3264 if (HasSHA) 3265 Builder.defineMacro("__SHA__"); 3266 3267 if (HasCX16) 3268 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16"); 3269 3270 // Each case falls through to the previous one here. 3271 switch (SSELevel) { 3272 case AVX512F: 3273 Builder.defineMacro("__AVX512F__"); 3274 case AVX2: 3275 Builder.defineMacro("__AVX2__"); 3276 case AVX: 3277 Builder.defineMacro("__AVX__"); 3278 case SSE42: 3279 Builder.defineMacro("__SSE4_2__"); 3280 case SSE41: 3281 Builder.defineMacro("__SSE4_1__"); 3282 case SSSE3: 3283 Builder.defineMacro("__SSSE3__"); 3284 case SSE3: 3285 Builder.defineMacro("__SSE3__"); 3286 case SSE2: 3287 Builder.defineMacro("__SSE2__"); 3288 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied. 3289 case SSE1: 3290 Builder.defineMacro("__SSE__"); 3291 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied. 3292 case NoSSE: 3293 break; 3294 } 3295 3296 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) { 3297 switch (SSELevel) { 3298 case AVX512F: 3299 case AVX2: 3300 case AVX: 3301 case SSE42: 3302 case SSE41: 3303 case SSSE3: 3304 case SSE3: 3305 case SSE2: 3306 Builder.defineMacro("_M_IX86_FP", Twine(2)); 3307 break; 3308 case SSE1: 3309 Builder.defineMacro("_M_IX86_FP", Twine(1)); 3310 break; 3311 default: 3312 Builder.defineMacro("_M_IX86_FP", Twine(0)); 3313 } 3314 } 3315 3316 // Each case falls through to the previous one here. 3317 switch (MMX3DNowLevel) { 3318 case AMD3DNowAthlon: 3319 Builder.defineMacro("__3dNOW_A__"); 3320 case AMD3DNow: 3321 Builder.defineMacro("__3dNOW__"); 3322 case MMX: 3323 Builder.defineMacro("__MMX__"); 3324 case NoMMX3DNow: 3325 break; 3326 } 3327 3328 if (CPU >= CK_i486) { 3329 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1"); 3330 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2"); 3331 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4"); 3332 } 3333 if (CPU >= CK_i586) 3334 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8"); 3335 } 3336 3337 bool X86TargetInfo::hasFeature(StringRef Feature) const { 3338 return llvm::StringSwitch<bool>(Feature) 3339 .Case("aes", HasAES) 3340 .Case("avx", SSELevel >= AVX) 3341 .Case("avx2", SSELevel >= AVX2) 3342 .Case("avx512f", SSELevel >= AVX512F) 3343 .Case("avx512cd", HasAVX512CD) 3344 .Case("avx512er", HasAVX512ER) 3345 .Case("avx512pf", HasAVX512PF) 3346 .Case("avx512dq", HasAVX512DQ) 3347 .Case("avx512bw", HasAVX512BW) 3348 .Case("avx512vl", HasAVX512VL) 3349 .Case("bmi", HasBMI) 3350 .Case("bmi2", HasBMI2) 3351 .Case("cx16", HasCX16) 3352 .Case("f16c", HasF16C) 3353 .Case("fma", HasFMA) 3354 .Case("fma4", XOPLevel >= FMA4) 3355 .Case("fsgsbase", HasFSGSBASE) 3356 .Case("lzcnt", HasLZCNT) 3357 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow) 3358 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon) 3359 .Case("mmx", MMX3DNowLevel >= MMX) 3360 .Case("pclmul", HasPCLMUL) 3361 .Case("popcnt", HasPOPCNT) 3362 .Case("prfchw", HasPRFCHW) 3363 .Case("rdrnd", HasRDRND) 3364 .Case("rdseed", HasRDSEED) 3365 .Case("rtm", HasRTM) 3366 .Case("sha", HasSHA) 3367 .Case("sse", SSELevel >= SSE1) 3368 .Case("sse2", SSELevel >= SSE2) 3369 .Case("sse3", SSELevel >= SSE3) 3370 .Case("ssse3", SSELevel >= SSSE3) 3371 .Case("sse4.1", SSELevel >= SSE41) 3372 .Case("sse4.2", SSELevel >= SSE42) 3373 .Case("sse4a", XOPLevel >= SSE4A) 3374 .Case("tbm", HasTBM) 3375 .Case("x86", true) 3376 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86) 3377 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64) 3378 .Case("xop", XOPLevel >= XOP) 3379 .Default(false); 3380 } 3381 3382 // We can't use a generic validation scheme for the features accepted here 3383 // versus subtarget features accepted in the target attribute because the 3384 // bitfield structure that's initialized in the runtime only supports the 3385 // below currently rather than the full range of subtarget features. (See 3386 // X86TargetInfo::hasFeature for a somewhat comprehensive list). 3387 bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const { 3388 return llvm::StringSwitch<bool>(FeatureStr) 3389 .Case("cmov", true) 3390 .Case("mmx", true) 3391 .Case("popcnt", true) 3392 .Case("sse", true) 3393 .Case("sse2", true) 3394 .Case("sse3", true) 3395 .Case("sse4.1", true) 3396 .Case("sse4.2", true) 3397 .Case("avx", true) 3398 .Case("avx2", true) 3399 .Case("sse4a", true) 3400 .Case("fma4", true) 3401 .Case("xop", true) 3402 .Case("fma", true) 3403 .Case("avx512f", true) 3404 .Case("bmi", true) 3405 .Case("bmi2", true) 3406 .Default(false); 3407 } 3408 3409 bool 3410 X86TargetInfo::validateAsmConstraint(const char *&Name, 3411 TargetInfo::ConstraintInfo &Info) const { 3412 switch (*Name) { 3413 default: return false; 3414 // Constant constraints. 3415 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64 3416 // instructions. 3417 case 'Z': // 32-bit unsigned integer constant for use with zero-extending 3418 // x86_64 instructions. 3419 case 's': 3420 Info.setRequiresImmediate(); 3421 return true; 3422 case 'I': 3423 Info.setRequiresImmediate(0, 31); 3424 return true; 3425 case 'J': 3426 Info.setRequiresImmediate(0, 63); 3427 return true; 3428 case 'K': 3429 Info.setRequiresImmediate(-128, 127); 3430 return true; 3431 case 'L': 3432 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) }); 3433 return true; 3434 case 'M': 3435 Info.setRequiresImmediate(0, 3); 3436 return true; 3437 case 'N': 3438 Info.setRequiresImmediate(0, 255); 3439 return true; 3440 case 'O': 3441 Info.setRequiresImmediate(0, 127); 3442 return true; 3443 // Register constraints. 3444 case 'Y': // 'Y' is the first character for several 2-character constraints. 3445 // Shift the pointer to the second character of the constraint. 3446 Name++; 3447 switch (*Name) { 3448 default: 3449 return false; 3450 case '0': // First SSE register. 3451 case 't': // Any SSE register, when SSE2 is enabled. 3452 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled. 3453 case 'm': // Any MMX register, when inter-unit moves enabled. 3454 Info.setAllowsRegister(); 3455 return true; 3456 } 3457 case 'f': // Any x87 floating point stack register. 3458 // Constraint 'f' cannot be used for output operands. 3459 if (Info.ConstraintStr[0] == '=') 3460 return false; 3461 Info.setAllowsRegister(); 3462 return true; 3463 case 'a': // eax. 3464 case 'b': // ebx. 3465 case 'c': // ecx. 3466 case 'd': // edx. 3467 case 'S': // esi. 3468 case 'D': // edi. 3469 case 'A': // edx:eax. 3470 case 't': // Top of floating point stack. 3471 case 'u': // Second from top of floating point stack. 3472 case 'q': // Any register accessible as [r]l: a, b, c, and d. 3473 case 'y': // Any MMX register. 3474 case 'x': // Any SSE register. 3475 case 'Q': // Any register accessible as [r]h: a, b, c, and d. 3476 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp. 3477 case 'l': // "Index" registers: any general register that can be used as an 3478 // index in a base+index memory access. 3479 Info.setAllowsRegister(); 3480 return true; 3481 // Floating point constant constraints. 3482 case 'C': // SSE floating point constant. 3483 case 'G': // x87 floating point constant. 3484 return true; 3485 } 3486 } 3487 3488 bool X86TargetInfo::validateOutputSize(StringRef Constraint, 3489 unsigned Size) const { 3490 // Strip off constraint modifiers. 3491 while (Constraint[0] == '=' || 3492 Constraint[0] == '+' || 3493 Constraint[0] == '&') 3494 Constraint = Constraint.substr(1); 3495 3496 return validateOperandSize(Constraint, Size); 3497 } 3498 3499 bool X86TargetInfo::validateInputSize(StringRef Constraint, 3500 unsigned Size) const { 3501 return validateOperandSize(Constraint, Size); 3502 } 3503 3504 bool X86TargetInfo::validateOperandSize(StringRef Constraint, 3505 unsigned Size) const { 3506 switch (Constraint[0]) { 3507 default: break; 3508 case 'y': 3509 return Size <= 64; 3510 case 'f': 3511 case 't': 3512 case 'u': 3513 return Size <= 128; 3514 case 'x': 3515 if (SSELevel >= AVX512F) 3516 // 512-bit zmm registers can be used if target supports AVX512F. 3517 return Size <= 512U; 3518 else if (SSELevel >= AVX) 3519 // 256-bit ymm registers can be used if target supports AVX. 3520 return Size <= 256U; 3521 return Size <= 128U; 3522 case 'Y': 3523 // 'Y' is the first character for several 2-character constraints. 3524 switch (Constraint[1]) { 3525 default: break; 3526 case 'm': 3527 // 'Ym' is synonymous with 'y'. 3528 return Size <= 64; 3529 case 'i': 3530 case 't': 3531 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled. 3532 if (SSELevel >= AVX512F) 3533 return Size <= 512U; 3534 else if (SSELevel >= AVX) 3535 return Size <= 256U; 3536 return SSELevel >= SSE2 && Size <= 128U; 3537 } 3538 3539 } 3540 3541 return true; 3542 } 3543 3544 std::string 3545 X86TargetInfo::convertConstraint(const char *&Constraint) const { 3546 switch (*Constraint) { 3547 case 'a': return std::string("{ax}"); 3548 case 'b': return std::string("{bx}"); 3549 case 'c': return std::string("{cx}"); 3550 case 'd': return std::string("{dx}"); 3551 case 'S': return std::string("{si}"); 3552 case 'D': return std::string("{di}"); 3553 case 'p': // address 3554 return std::string("im"); 3555 case 't': // top of floating point stack. 3556 return std::string("{st}"); 3557 case 'u': // second from top of floating point stack. 3558 return std::string("{st(1)}"); // second from top of floating point stack. 3559 default: 3560 return std::string(1, *Constraint); 3561 } 3562 } 3563 3564 // X86-32 generic target 3565 class X86_32TargetInfo : public X86TargetInfo { 3566 public: 3567 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) { 3568 DoubleAlign = LongLongAlign = 32; 3569 LongDoubleWidth = 96; 3570 LongDoubleAlign = 32; 3571 SuitableAlign = 128; 3572 DataLayoutString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128"; 3573 SizeType = UnsignedInt; 3574 PtrDiffType = SignedInt; 3575 IntPtrType = SignedInt; 3576 RegParmMax = 3; 3577 3578 // Use fpret for all types. 3579 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) | 3580 (1 << TargetInfo::Double) | 3581 (1 << TargetInfo::LongDouble)); 3582 3583 // x86-32 has atomics up to 8 bytes 3584 // FIXME: Check that we actually have cmpxchg8b before setting 3585 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.) 3586 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64; 3587 } 3588 BuiltinVaListKind getBuiltinVaListKind() const override { 3589 return TargetInfo::CharPtrBuiltinVaList; 3590 } 3591 3592 int getEHDataRegisterNumber(unsigned RegNo) const override { 3593 if (RegNo == 0) return 0; 3594 if (RegNo == 1) return 2; 3595 return -1; 3596 } 3597 bool validateOperandSize(StringRef Constraint, 3598 unsigned Size) const override { 3599 switch (Constraint[0]) { 3600 default: break; 3601 case 'R': 3602 case 'q': 3603 case 'Q': 3604 case 'a': 3605 case 'b': 3606 case 'c': 3607 case 'd': 3608 case 'S': 3609 case 'D': 3610 return Size <= 32; 3611 case 'A': 3612 return Size <= 64; 3613 } 3614 3615 return X86TargetInfo::validateOperandSize(Constraint, Size); 3616 } 3617 }; 3618 3619 class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> { 3620 public: 3621 NetBSDI386TargetInfo(const llvm::Triple &Triple) 3622 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {} 3623 3624 unsigned getFloatEvalMethod() const override { 3625 unsigned Major, Minor, Micro; 3626 getTriple().getOSVersion(Major, Minor, Micro); 3627 // New NetBSD uses the default rounding mode. 3628 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0) 3629 return X86_32TargetInfo::getFloatEvalMethod(); 3630 // NetBSD before 6.99.26 defaults to "double" rounding. 3631 return 1; 3632 } 3633 }; 3634 3635 class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> { 3636 public: 3637 OpenBSDI386TargetInfo(const llvm::Triple &Triple) 3638 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) { 3639 SizeType = UnsignedLong; 3640 IntPtrType = SignedLong; 3641 PtrDiffType = SignedLong; 3642 } 3643 }; 3644 3645 class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> { 3646 public: 3647 BitrigI386TargetInfo(const llvm::Triple &Triple) 3648 : BitrigTargetInfo<X86_32TargetInfo>(Triple) { 3649 SizeType = UnsignedLong; 3650 IntPtrType = SignedLong; 3651 PtrDiffType = SignedLong; 3652 } 3653 }; 3654 3655 class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> { 3656 public: 3657 DarwinI386TargetInfo(const llvm::Triple &Triple) 3658 : DarwinTargetInfo<X86_32TargetInfo>(Triple) { 3659 LongDoubleWidth = 128; 3660 LongDoubleAlign = 128; 3661 SuitableAlign = 128; 3662 SizeType = UnsignedLong; 3663 IntPtrType = SignedLong; 3664 DataLayoutString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128"; 3665 HasAlignMac68kSupport = true; 3666 } 3667 3668 bool handleTargetFeatures(std::vector<std::string> &Features, 3669 DiagnosticsEngine &Diags) override { 3670 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features, 3671 Diags)) 3672 return false; 3673 // We now know the features we have: we can decide how to align vectors. 3674 MaxVectorAlign = 3675 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128; 3676 return true; 3677 } 3678 }; 3679 3680 // x86-32 Windows target 3681 class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> { 3682 public: 3683 WindowsX86_32TargetInfo(const llvm::Triple &Triple) 3684 : WindowsTargetInfo<X86_32TargetInfo>(Triple) { 3685 WCharType = UnsignedShort; 3686 DoubleAlign = LongLongAlign = 64; 3687 bool IsWinCOFF = 3688 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF(); 3689 DataLayoutString = IsWinCOFF 3690 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32" 3691 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"; 3692 } 3693 void getTargetDefines(const LangOptions &Opts, 3694 MacroBuilder &Builder) const override { 3695 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder); 3696 } 3697 }; 3698 3699 // x86-32 Windows Visual Studio target 3700 class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo { 3701 public: 3702 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple) 3703 : WindowsX86_32TargetInfo(Triple) { 3704 LongDoubleWidth = LongDoubleAlign = 64; 3705 LongDoubleFormat = &llvm::APFloat::IEEEdouble; 3706 } 3707 void getTargetDefines(const LangOptions &Opts, 3708 MacroBuilder &Builder) const override { 3709 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder); 3710 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder); 3711 // The value of the following reflects processor type. 3712 // 300=386, 400=486, 500=Pentium, 600=Blend (default) 3713 // We lost the original triple, so we use the default. 3714 Builder.defineMacro("_M_IX86", "600"); 3715 } 3716 }; 3717 3718 static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) { 3719 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang supports 3720 // __declspec natively under -fms-extensions, but we define a no-op __declspec 3721 // macro anyway for pre-processor compatibility. 3722 if (Opts.MicrosoftExt) 3723 Builder.defineMacro("__declspec", "__declspec"); 3724 else 3725 Builder.defineMacro("__declspec(a)", "__attribute__((a))"); 3726 3727 if (!Opts.MicrosoftExt) { 3728 // Provide macros for all the calling convention keywords. Provide both 3729 // single and double underscore prefixed variants. These are available on 3730 // x64 as well as x86, even though they have no effect. 3731 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"}; 3732 for (const char *CC : CCs) { 3733 std::string GCCSpelling = "__attribute__((__"; 3734 GCCSpelling += CC; 3735 GCCSpelling += "__))"; 3736 Builder.defineMacro(Twine("_") + CC, GCCSpelling); 3737 Builder.defineMacro(Twine("__") + CC, GCCSpelling); 3738 } 3739 } 3740 } 3741 3742 static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) { 3743 Builder.defineMacro("__MSVCRT__"); 3744 Builder.defineMacro("__MINGW32__"); 3745 addCygMingDefines(Opts, Builder); 3746 } 3747 3748 // x86-32 MinGW target 3749 class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo { 3750 public: 3751 MinGWX86_32TargetInfo(const llvm::Triple &Triple) 3752 : WindowsX86_32TargetInfo(Triple) {} 3753 void getTargetDefines(const LangOptions &Opts, 3754 MacroBuilder &Builder) const override { 3755 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder); 3756 DefineStd(Builder, "WIN32", Opts); 3757 DefineStd(Builder, "WINNT", Opts); 3758 Builder.defineMacro("_X86_"); 3759 addMinGWDefines(Opts, Builder); 3760 } 3761 }; 3762 3763 // x86-32 Cygwin target 3764 class CygwinX86_32TargetInfo : public X86_32TargetInfo { 3765 public: 3766 CygwinX86_32TargetInfo(const llvm::Triple &Triple) 3767 : X86_32TargetInfo(Triple) { 3768 TLSSupported = false; 3769 WCharType = UnsignedShort; 3770 DoubleAlign = LongLongAlign = 64; 3771 DataLayoutString = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"; 3772 } 3773 void getTargetDefines(const LangOptions &Opts, 3774 MacroBuilder &Builder) const override { 3775 X86_32TargetInfo::getTargetDefines(Opts, Builder); 3776 Builder.defineMacro("_X86_"); 3777 Builder.defineMacro("__CYGWIN__"); 3778 Builder.defineMacro("__CYGWIN32__"); 3779 addCygMingDefines(Opts, Builder); 3780 DefineStd(Builder, "unix", Opts); 3781 if (Opts.CPlusPlus) 3782 Builder.defineMacro("_GNU_SOURCE"); 3783 } 3784 }; 3785 3786 // x86-32 Haiku target 3787 class HaikuX86_32TargetInfo : public X86_32TargetInfo { 3788 public: 3789 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) { 3790 SizeType = UnsignedLong; 3791 IntPtrType = SignedLong; 3792 PtrDiffType = SignedLong; 3793 ProcessIDType = SignedLong; 3794 this->UserLabelPrefix = ""; 3795 this->TLSSupported = false; 3796 } 3797 void getTargetDefines(const LangOptions &Opts, 3798 MacroBuilder &Builder) const override { 3799 X86_32TargetInfo::getTargetDefines(Opts, Builder); 3800 Builder.defineMacro("__INTEL__"); 3801 Builder.defineMacro("__HAIKU__"); 3802 } 3803 }; 3804 3805 // RTEMS Target 3806 template<typename Target> 3807 class RTEMSTargetInfo : public OSTargetInfo<Target> { 3808 protected: 3809 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 3810 MacroBuilder &Builder) const override { 3811 // RTEMS defines; list based off of gcc output 3812 3813 Builder.defineMacro("__rtems__"); 3814 Builder.defineMacro("__ELF__"); 3815 } 3816 3817 public: 3818 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) { 3819 this->UserLabelPrefix = ""; 3820 3821 switch (Triple.getArch()) { 3822 default: 3823 case llvm::Triple::x86: 3824 // this->MCountName = ".mcount"; 3825 break; 3826 case llvm::Triple::mips: 3827 case llvm::Triple::mipsel: 3828 case llvm::Triple::ppc: 3829 case llvm::Triple::ppc64: 3830 case llvm::Triple::ppc64le: 3831 // this->MCountName = "_mcount"; 3832 break; 3833 case llvm::Triple::arm: 3834 // this->MCountName = "__mcount"; 3835 break; 3836 } 3837 } 3838 }; 3839 3840 // x86-32 RTEMS target 3841 class RTEMSX86_32TargetInfo : public X86_32TargetInfo { 3842 public: 3843 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) { 3844 SizeType = UnsignedLong; 3845 IntPtrType = SignedLong; 3846 PtrDiffType = SignedLong; 3847 this->UserLabelPrefix = ""; 3848 } 3849 void getTargetDefines(const LangOptions &Opts, 3850 MacroBuilder &Builder) const override { 3851 X86_32TargetInfo::getTargetDefines(Opts, Builder); 3852 Builder.defineMacro("__INTEL__"); 3853 Builder.defineMacro("__rtems__"); 3854 } 3855 }; 3856 3857 // x86-64 generic target 3858 class X86_64TargetInfo : public X86TargetInfo { 3859 public: 3860 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) { 3861 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32; 3862 bool IsWinCOFF = 3863 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF(); 3864 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64; 3865 LongDoubleWidth = 128; 3866 LongDoubleAlign = 128; 3867 LargeArrayMinWidth = 128; 3868 LargeArrayAlign = 128; 3869 SuitableAlign = 128; 3870 SizeType = IsX32 ? UnsignedInt : UnsignedLong; 3871 PtrDiffType = IsX32 ? SignedInt : SignedLong; 3872 IntPtrType = IsX32 ? SignedInt : SignedLong; 3873 IntMaxType = IsX32 ? SignedLongLong : SignedLong; 3874 Int64Type = IsX32 ? SignedLongLong : SignedLong; 3875 RegParmMax = 6; 3876 3877 // Pointers are 32-bit in x32. 3878 DataLayoutString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128" 3879 : IsWinCOFF 3880 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128" 3881 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128"; 3882 3883 // Use fpret only for long double. 3884 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble); 3885 3886 // Use fp2ret for _Complex long double. 3887 ComplexLongDoubleUsesFP2Ret = true; 3888 3889 // Make __builtin_ms_va_list available. 3890 HasBuiltinMSVaList = true; 3891 3892 // x86-64 has atomics up to 16 bytes. 3893 MaxAtomicPromoteWidth = 128; 3894 MaxAtomicInlineWidth = 128; 3895 } 3896 BuiltinVaListKind getBuiltinVaListKind() const override { 3897 return TargetInfo::X86_64ABIBuiltinVaList; 3898 } 3899 3900 int getEHDataRegisterNumber(unsigned RegNo) const override { 3901 if (RegNo == 0) return 0; 3902 if (RegNo == 1) return 1; 3903 return -1; 3904 } 3905 3906 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override { 3907 return (CC == CC_C || 3908 CC == CC_X86VectorCall || 3909 CC == CC_IntelOclBicc || 3910 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning; 3911 } 3912 3913 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override { 3914 return CC_C; 3915 } 3916 3917 // for x32 we need it here explicitly 3918 bool hasInt128Type() const override { return true; } 3919 }; 3920 3921 // x86-64 Windows target 3922 class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> { 3923 public: 3924 WindowsX86_64TargetInfo(const llvm::Triple &Triple) 3925 : WindowsTargetInfo<X86_64TargetInfo>(Triple) { 3926 WCharType = UnsignedShort; 3927 LongWidth = LongAlign = 32; 3928 DoubleAlign = LongLongAlign = 64; 3929 IntMaxType = SignedLongLong; 3930 Int64Type = SignedLongLong; 3931 SizeType = UnsignedLongLong; 3932 PtrDiffType = SignedLongLong; 3933 IntPtrType = SignedLongLong; 3934 this->UserLabelPrefix = ""; 3935 } 3936 3937 void getTargetDefines(const LangOptions &Opts, 3938 MacroBuilder &Builder) const override { 3939 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder); 3940 Builder.defineMacro("_WIN64"); 3941 } 3942 3943 BuiltinVaListKind getBuiltinVaListKind() const override { 3944 return TargetInfo::CharPtrBuiltinVaList; 3945 } 3946 3947 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override { 3948 switch (CC) { 3949 case CC_X86StdCall: 3950 case CC_X86ThisCall: 3951 case CC_X86FastCall: 3952 return CCCR_Ignore; 3953 case CC_C: 3954 case CC_X86VectorCall: 3955 case CC_IntelOclBicc: 3956 case CC_X86_64SysV: 3957 return CCCR_OK; 3958 default: 3959 return CCCR_Warning; 3960 } 3961 } 3962 }; 3963 3964 // x86-64 Windows Visual Studio target 3965 class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo { 3966 public: 3967 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple) 3968 : WindowsX86_64TargetInfo(Triple) { 3969 LongDoubleWidth = LongDoubleAlign = 64; 3970 LongDoubleFormat = &llvm::APFloat::IEEEdouble; 3971 } 3972 void getTargetDefines(const LangOptions &Opts, 3973 MacroBuilder &Builder) const override { 3974 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder); 3975 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder); 3976 Builder.defineMacro("_M_X64", "100"); 3977 Builder.defineMacro("_M_AMD64", "100"); 3978 } 3979 }; 3980 3981 // x86-64 MinGW target 3982 class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo { 3983 public: 3984 MinGWX86_64TargetInfo(const llvm::Triple &Triple) 3985 : WindowsX86_64TargetInfo(Triple) {} 3986 void getTargetDefines(const LangOptions &Opts, 3987 MacroBuilder &Builder) const override { 3988 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder); 3989 DefineStd(Builder, "WIN64", Opts); 3990 Builder.defineMacro("__MINGW64__"); 3991 addMinGWDefines(Opts, Builder); 3992 3993 // GCC defines this macro when it is using __gxx_personality_seh0. 3994 if (!Opts.SjLjExceptions) 3995 Builder.defineMacro("__SEH__"); 3996 } 3997 }; 3998 3999 // x86-64 Cygwin target 4000 class CygwinX86_64TargetInfo : public X86_64TargetInfo { 4001 public: 4002 CygwinX86_64TargetInfo(const llvm::Triple &Triple) 4003 : X86_64TargetInfo(Triple) { 4004 TLSSupported = false; 4005 WCharType = UnsignedShort; 4006 } 4007 void getTargetDefines(const LangOptions &Opts, 4008 MacroBuilder &Builder) const override { 4009 X86_64TargetInfo::getTargetDefines(Opts, Builder); 4010 Builder.defineMacro("__x86_64__"); 4011 Builder.defineMacro("__CYGWIN__"); 4012 Builder.defineMacro("__CYGWIN64__"); 4013 addCygMingDefines(Opts, Builder); 4014 DefineStd(Builder, "unix", Opts); 4015 if (Opts.CPlusPlus) 4016 Builder.defineMacro("_GNU_SOURCE"); 4017 4018 // GCC defines this macro when it is using __gxx_personality_seh0. 4019 if (!Opts.SjLjExceptions) 4020 Builder.defineMacro("__SEH__"); 4021 } 4022 }; 4023 4024 class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> { 4025 public: 4026 DarwinX86_64TargetInfo(const llvm::Triple &Triple) 4027 : DarwinTargetInfo<X86_64TargetInfo>(Triple) { 4028 Int64Type = SignedLongLong; 4029 // The 64-bit iOS simulator uses the builtin bool type for Objective-C. 4030 llvm::Triple T = llvm::Triple(Triple); 4031 if (T.isiOS()) 4032 UseSignedCharForObjCBool = false; 4033 DataLayoutString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"; 4034 } 4035 4036 bool handleTargetFeatures(std::vector<std::string> &Features, 4037 DiagnosticsEngine &Diags) override { 4038 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features, 4039 Diags)) 4040 return false; 4041 // We now know the features we have: we can decide how to align vectors. 4042 MaxVectorAlign = 4043 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128; 4044 return true; 4045 } 4046 }; 4047 4048 class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> { 4049 public: 4050 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple) 4051 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) { 4052 IntMaxType = SignedLongLong; 4053 Int64Type = SignedLongLong; 4054 } 4055 }; 4056 4057 class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> { 4058 public: 4059 BitrigX86_64TargetInfo(const llvm::Triple &Triple) 4060 : BitrigTargetInfo<X86_64TargetInfo>(Triple) { 4061 IntMaxType = SignedLongLong; 4062 Int64Type = SignedLongLong; 4063 } 4064 }; 4065 4066 class ARMTargetInfo : public TargetInfo { 4067 // Possible FPU choices. 4068 enum FPUMode { 4069 VFP2FPU = (1 << 0), 4070 VFP3FPU = (1 << 1), 4071 VFP4FPU = (1 << 2), 4072 NeonFPU = (1 << 3), 4073 FPARMV8 = (1 << 4) 4074 }; 4075 4076 // Possible HWDiv features. 4077 enum HWDivMode { 4078 HWDivThumb = (1 << 0), 4079 HWDivARM = (1 << 1) 4080 }; 4081 4082 static bool FPUModeIsVFP(FPUMode Mode) { 4083 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8); 4084 } 4085 4086 static const TargetInfo::GCCRegAlias GCCRegAliases[]; 4087 static const char * const GCCRegNames[]; 4088 4089 std::string ABI, CPU; 4090 4091 StringRef DefaultCPU; 4092 StringRef CPUProfile; 4093 StringRef CPUAttr; 4094 4095 enum { 4096 FP_Default, 4097 FP_VFP, 4098 FP_Neon 4099 } FPMath; 4100 4101 unsigned ArchISA; 4102 unsigned ArchKind; 4103 unsigned ArchProfile; 4104 unsigned ArchVersion; 4105 4106 unsigned FPU : 5; 4107 4108 unsigned IsAAPCS : 1; 4109 unsigned HWDiv : 2; 4110 4111 // Initialized via features. 4112 unsigned SoftFloat : 1; 4113 unsigned SoftFloatABI : 1; 4114 4115 unsigned CRC : 1; 4116 unsigned Crypto : 1; 4117 unsigned DSP : 1; 4118 unsigned Unaligned : 1; 4119 4120 enum { 4121 LDREX_B = (1 << 0), /// byte (8-bit) 4122 LDREX_H = (1 << 1), /// half (16-bit) 4123 LDREX_W = (1 << 2), /// word (32-bit) 4124 LDREX_D = (1 << 3), /// double (64-bit) 4125 }; 4126 4127 uint32_t LDREX; 4128 4129 // ACLE 6.5.1 Hardware floating point 4130 enum { 4131 HW_FP_HP = (1 << 1), /// half (16-bit) 4132 HW_FP_SP = (1 << 2), /// single (32-bit) 4133 HW_FP_DP = (1 << 3), /// double (64-bit) 4134 }; 4135 uint32_t HW_FP; 4136 4137 static const Builtin::Info BuiltinInfo[]; 4138 4139 void setABIAAPCS() { 4140 IsAAPCS = true; 4141 4142 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64; 4143 const llvm::Triple &T = getTriple(); 4144 4145 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig. 4146 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD || 4147 T.getOS() == llvm::Triple::Bitrig) 4148 SizeType = UnsignedLong; 4149 else 4150 SizeType = UnsignedInt; 4151 4152 switch (T.getOS()) { 4153 case llvm::Triple::NetBSD: 4154 WCharType = SignedInt; 4155 break; 4156 case llvm::Triple::Win32: 4157 WCharType = UnsignedShort; 4158 break; 4159 case llvm::Triple::Linux: 4160 default: 4161 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int. 4162 WCharType = UnsignedInt; 4163 break; 4164 } 4165 4166 UseBitFieldTypeAlignment = true; 4167 4168 ZeroLengthBitfieldBoundary = 0; 4169 4170 // Thumb1 add sp, #imm requires the immediate value be multiple of 4, 4171 // so set preferred for small types to 32. 4172 if (T.isOSBinFormatMachO()) { 4173 DataLayoutString = 4174 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" 4175 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"; 4176 } else if (T.isOSWindows()) { 4177 assert(!BigEndian && "Windows on ARM does not support big endian"); 4178 DataLayoutString = "e" 4179 "-m:w" 4180 "-p:32:32" 4181 "-i64:64" 4182 "-v128:64:128" 4183 "-a:0:32" 4184 "-n32" 4185 "-S64"; 4186 } else if (T.isOSNaCl()) { 4187 assert(!BigEndian && "NaCl on ARM does not support big endian"); 4188 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128"; 4189 } else { 4190 DataLayoutString = 4191 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" 4192 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"; 4193 } 4194 4195 // FIXME: Enumerated types are variable width in straight AAPCS. 4196 } 4197 4198 void setABIAPCS() { 4199 const llvm::Triple &T = getTriple(); 4200 4201 IsAAPCS = false; 4202 4203 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32; 4204 4205 // size_t is unsigned int on FreeBSD. 4206 if (T.getOS() == llvm::Triple::FreeBSD) 4207 SizeType = UnsignedInt; 4208 else 4209 SizeType = UnsignedLong; 4210 4211 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour. 4212 WCharType = SignedInt; 4213 4214 // Do not respect the alignment of bit-field types when laying out 4215 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc. 4216 UseBitFieldTypeAlignment = false; 4217 4218 /// gcc forces the alignment to 4 bytes, regardless of the type of the 4219 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in 4220 /// gcc. 4221 ZeroLengthBitfieldBoundary = 32; 4222 4223 if (T.isOSBinFormatMachO()) 4224 DataLayoutString = 4225 BigEndian 4226 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32" 4227 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"; 4228 else 4229 DataLayoutString = 4230 BigEndian 4231 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32" 4232 : "e-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"; 4233 4234 // FIXME: Override "preferred align" for double and long long. 4235 } 4236 4237 void setArchInfo() { 4238 StringRef ArchName = getTriple().getArchName(); 4239 4240 ArchISA = llvm::ARM::parseArchISA(ArchName); 4241 DefaultCPU = getDefaultCPU(ArchName); 4242 4243 unsigned ArchKind = llvm::ARM::parseArch(ArchName); 4244 if (ArchKind == llvm::ARM::AK_INVALID) 4245 // set arch of the CPU, either provided explicitly or hardcoded default 4246 ArchKind = llvm::ARM::parseCPUArch(CPU); 4247 setArchInfo(ArchKind); 4248 } 4249 4250 void setArchInfo(unsigned Kind) { 4251 StringRef SubArch; 4252 4253 // cache TargetParser info 4254 ArchKind = Kind; 4255 SubArch = llvm::ARM::getSubArch(ArchKind); 4256 ArchProfile = llvm::ARM::parseArchProfile(SubArch); 4257 ArchVersion = llvm::ARM::parseArchVersion(SubArch); 4258 4259 // cache CPU related strings 4260 CPUAttr = getCPUAttr(); 4261 CPUProfile = getCPUProfile(); 4262 } 4263 4264 void setAtomic() { 4265 // when triple does not specify a sub arch, 4266 // then we are not using inline atomics 4267 bool ShouldUseInlineAtomic = DefaultCPU.empty() ? 4268 false : 4269 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) || 4270 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7); 4271 // Cortex M does not support 8 byte atomics, while general Thumb2 does. 4272 if (ArchProfile == llvm::ARM::PK_M) { 4273 MaxAtomicPromoteWidth = 32; 4274 if (ShouldUseInlineAtomic) 4275 MaxAtomicInlineWidth = 32; 4276 } 4277 else { 4278 MaxAtomicPromoteWidth = 64; 4279 if (ShouldUseInlineAtomic) 4280 MaxAtomicInlineWidth = 64; 4281 } 4282 } 4283 4284 bool isThumb() const { 4285 return (ArchISA == llvm::ARM::IK_THUMB); 4286 } 4287 4288 bool supportsThumb() const { 4289 return CPUAttr.count('T') || ArchVersion >= 6; 4290 } 4291 4292 bool supportsThumb2() const { 4293 return CPUAttr.equals("6T2") || ArchVersion >= 7; 4294 } 4295 4296 StringRef getDefaultCPU(StringRef ArchName) const { 4297 return llvm::ARM::getDefaultCPU(ArchName); 4298 } 4299 4300 StringRef getCPUAttr() const { 4301 // For most sub-arches, the build attribute CPU name is enough. 4302 // For Cortex variants, it's slightly different. 4303 switch(ArchKind) { 4304 default: 4305 return llvm::ARM::getCPUAttr(ArchKind); 4306 case llvm::ARM::AK_ARMV6M: 4307 case llvm::ARM::AK_ARMV6SM: 4308 case llvm::ARM::AK_ARMV6HL: 4309 return "6M"; 4310 case llvm::ARM::AK_ARMV7S: 4311 return "7S"; 4312 case llvm::ARM::AK_ARMV7: 4313 case llvm::ARM::AK_ARMV7A: 4314 case llvm::ARM::AK_ARMV7L: 4315 case llvm::ARM::AK_ARMV7HL: 4316 return "7A"; 4317 case llvm::ARM::AK_ARMV7R: 4318 return "7R"; 4319 case llvm::ARM::AK_ARMV7M: 4320 return "7M"; 4321 case llvm::ARM::AK_ARMV7EM: 4322 return "7EM"; 4323 case llvm::ARM::AK_ARMV8A: 4324 return "8A"; 4325 case llvm::ARM::AK_ARMV8_1A: 4326 return "8_1A"; 4327 } 4328 } 4329 4330 StringRef getCPUProfile() const { 4331 switch(ArchProfile) { 4332 case llvm::ARM::PK_A: 4333 return "A"; 4334 case llvm::ARM::PK_R: 4335 return "R"; 4336 case llvm::ARM::PK_M: 4337 return "M"; 4338 default: 4339 return ""; 4340 } 4341 } 4342 4343 public: 4344 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian) 4345 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default), 4346 IsAAPCS(true), LDREX(0), HW_FP(0) { 4347 BigEndian = IsBigEndian; 4348 4349 switch (getTriple().getOS()) { 4350 case llvm::Triple::NetBSD: 4351 PtrDiffType = SignedLong; 4352 break; 4353 default: 4354 PtrDiffType = SignedInt; 4355 break; 4356 } 4357 4358 // cache arch related info 4359 setArchInfo(); 4360 4361 // {} in inline assembly are neon specifiers, not assembly variant 4362 // specifiers. 4363 NoAsmVariants = true; 4364 4365 // FIXME: This duplicates code from the driver that sets the -target-abi 4366 // option - this code is used if -target-abi isn't passed and should 4367 // be unified in some way. 4368 if (Triple.isOSBinFormatMachO()) { 4369 // The backend is hardwired to assume AAPCS for M-class processors, ensure 4370 // the frontend matches that. 4371 if (Triple.getEnvironment() == llvm::Triple::EABI || 4372 Triple.getOS() == llvm::Triple::UnknownOS || 4373 StringRef(CPU).startswith("cortex-m")) { 4374 setABI("aapcs"); 4375 } else { 4376 setABI("apcs-gnu"); 4377 } 4378 } else if (Triple.isOSWindows()) { 4379 // FIXME: this is invalid for WindowsCE 4380 setABI("aapcs"); 4381 } else { 4382 // Select the default based on the platform. 4383 switch (Triple.getEnvironment()) { 4384 case llvm::Triple::Android: 4385 case llvm::Triple::GNUEABI: 4386 case llvm::Triple::GNUEABIHF: 4387 setABI("aapcs-linux"); 4388 break; 4389 case llvm::Triple::EABIHF: 4390 case llvm::Triple::EABI: 4391 setABI("aapcs"); 4392 break; 4393 case llvm::Triple::GNU: 4394 setABI("apcs-gnu"); 4395 break; 4396 default: 4397 if (Triple.getOS() == llvm::Triple::NetBSD) 4398 setABI("apcs-gnu"); 4399 else 4400 setABI("aapcs"); 4401 break; 4402 } 4403 } 4404 4405 // ARM targets default to using the ARM C++ ABI. 4406 TheCXXABI.set(TargetCXXABI::GenericARM); 4407 4408 // ARM has atomics up to 8 bytes 4409 setAtomic(); 4410 4411 // Do force alignment of members that follow zero length bitfields. If 4412 // the alignment of the zero-length bitfield is greater than the member 4413 // that follows it, `bar', `bar' will be aligned as the type of the 4414 // zero length bitfield. 4415 UseZeroLengthBitfieldAlignment = true; 4416 } 4417 4418 StringRef getABI() const override { return ABI; } 4419 4420 bool setABI(const std::string &Name) override { 4421 ABI = Name; 4422 4423 // The defaults (above) are for AAPCS, check if we need to change them. 4424 // 4425 // FIXME: We need support for -meabi... we could just mangle it into the 4426 // name. 4427 if (Name == "apcs-gnu") { 4428 setABIAPCS(); 4429 return true; 4430 } 4431 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") { 4432 setABIAAPCS(); 4433 return true; 4434 } 4435 return false; 4436 } 4437 4438 // FIXME: This should be based on Arch attributes, not CPU names. 4439 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, 4440 StringRef CPU, 4441 std::vector<std::string> &FeaturesVec) const override { 4442 4443 std::vector<const char*> TargetFeatures; 4444 4445 // get default FPU features 4446 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU); 4447 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures); 4448 4449 // get default Extension features 4450 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU); 4451 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures); 4452 4453 for (const char *Feature : TargetFeatures) 4454 if (Feature[0] == '+') 4455 Features[Feature+1] = true; 4456 4457 if (ArchVersion < 6 || 4458 (ArchVersion == 6 && ArchProfile == llvm::ARM::PK_M)) 4459 Features["strict-align"] = true; 4460 4461 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec); 4462 } 4463 4464 bool handleTargetFeatures(std::vector<std::string> &Features, 4465 DiagnosticsEngine &Diags) override { 4466 FPU = 0; 4467 CRC = 0; 4468 Crypto = 0; 4469 DSP = 0; 4470 Unaligned = 1; 4471 SoftFloat = SoftFloatABI = false; 4472 HWDiv = 0; 4473 4474 // This does not diagnose illegal cases like having both 4475 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp". 4476 uint32_t HW_FP_remove = 0; 4477 for (const auto &Feature : Features) { 4478 if (Feature == "+soft-float") { 4479 SoftFloat = true; 4480 } else if (Feature == "+soft-float-abi") { 4481 SoftFloatABI = true; 4482 } else if (Feature == "+vfp2") { 4483 FPU |= VFP2FPU; 4484 HW_FP |= HW_FP_SP | HW_FP_DP; 4485 } else if (Feature == "+vfp3") { 4486 FPU |= VFP3FPU; 4487 HW_FP |= HW_FP_SP | HW_FP_DP; 4488 } else if (Feature == "+vfp4") { 4489 FPU |= VFP4FPU; 4490 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP; 4491 } else if (Feature == "+fp-armv8") { 4492 FPU |= FPARMV8; 4493 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP; 4494 } else if (Feature == "+neon") { 4495 FPU |= NeonFPU; 4496 HW_FP |= HW_FP_SP | HW_FP_DP; 4497 } else if (Feature == "+hwdiv") { 4498 HWDiv |= HWDivThumb; 4499 } else if (Feature == "+hwdiv-arm") { 4500 HWDiv |= HWDivARM; 4501 } else if (Feature == "+crc") { 4502 CRC = 1; 4503 } else if (Feature == "+crypto") { 4504 Crypto = 1; 4505 } else if (Feature == "+t2dsp") { 4506 DSP = 1; 4507 } else if (Feature == "+fp-only-sp") { 4508 HW_FP_remove |= HW_FP_DP | HW_FP_HP; 4509 } else if (Feature == "+strict-align") { 4510 Unaligned = 0; 4511 } else if (Feature == "+fp16") { 4512 HW_FP |= HW_FP_HP; 4513 } 4514 } 4515 HW_FP &= ~HW_FP_remove; 4516 4517 switch (ArchVersion) { 4518 case 6: 4519 if (ArchProfile == llvm::ARM::PK_M) 4520 LDREX = 0; 4521 else if (ArchKind == llvm::ARM::AK_ARMV6K) 4522 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ; 4523 else 4524 LDREX = LDREX_W; 4525 break; 4526 case 7: 4527 if (ArchProfile == llvm::ARM::PK_M) 4528 LDREX = LDREX_W | LDREX_H | LDREX_B ; 4529 else 4530 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ; 4531 break; 4532 case 8: 4533 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ; 4534 } 4535 4536 if (!(FPU & NeonFPU) && FPMath == FP_Neon) { 4537 Diags.Report(diag::err_target_unsupported_fpmath) << "neon"; 4538 return false; 4539 } 4540 4541 if (FPMath == FP_Neon) 4542 Features.push_back("+neonfp"); 4543 else if (FPMath == FP_VFP) 4544 Features.push_back("-neonfp"); 4545 4546 // Remove front-end specific options which the backend handles differently. 4547 auto Feature = 4548 std::find(Features.begin(), Features.end(), "+soft-float-abi"); 4549 if (Feature != Features.end()) 4550 Features.erase(Feature); 4551 4552 return true; 4553 } 4554 4555 bool hasFeature(StringRef Feature) const override { 4556 return llvm::StringSwitch<bool>(Feature) 4557 .Case("arm", true) 4558 .Case("aarch32", true) 4559 .Case("softfloat", SoftFloat) 4560 .Case("thumb", isThumb()) 4561 .Case("neon", (FPU & NeonFPU) && !SoftFloat) 4562 .Case("hwdiv", HWDiv & HWDivThumb) 4563 .Case("hwdiv-arm", HWDiv & HWDivARM) 4564 .Default(false); 4565 } 4566 4567 bool setCPU(const std::string &Name) override { 4568 if (Name != "generic") 4569 setArchInfo(llvm::ARM::parseCPUArch(Name)); 4570 4571 if (ArchKind == llvm::ARM::AK_INVALID) 4572 return false; 4573 setAtomic(); 4574 CPU = Name; 4575 return true; 4576 } 4577 4578 bool setFPMath(StringRef Name) override; 4579 4580 void getTargetDefines(const LangOptions &Opts, 4581 MacroBuilder &Builder) const override { 4582 // Target identification. 4583 Builder.defineMacro("__arm"); 4584 Builder.defineMacro("__arm__"); 4585 4586 // Target properties. 4587 Builder.defineMacro("__REGISTER_PREFIX__", ""); 4588 if (!CPUAttr.empty()) 4589 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__"); 4590 4591 // ACLE 6.4.1 ARM/Thumb instruction set architecture 4592 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA 4593 Builder.defineMacro("__ARM_ARCH", llvm::utostr(ArchVersion)); 4594 4595 if (ArchVersion >= 8) { 4596 // ACLE 6.5.7 Crypto Extension 4597 if (Crypto) 4598 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1"); 4599 // ACLE 6.5.8 CRC32 Extension 4600 if (CRC) 4601 Builder.defineMacro("__ARM_FEATURE_CRC32", "1"); 4602 // ACLE 6.5.10 Numeric Maximum and Minimum 4603 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1"); 4604 // ACLE 6.5.9 Directed Rounding 4605 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1"); 4606 } 4607 4608 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It 4609 // is not defined for the M-profile. 4610 // NOTE that the deffault profile is assumed to be 'A' 4611 if (CPUProfile.empty() || CPUProfile != "M") 4612 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1"); 4613 4614 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original 4615 // Thumb ISA (including v6-M). It is set to 2 if the core supports the 4616 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture. 4617 if (supportsThumb2()) 4618 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2"); 4619 else if (supportsThumb()) 4620 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1"); 4621 4622 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit 4623 // instruction set such as ARM or Thumb. 4624 Builder.defineMacro("__ARM_32BIT_STATE", "1"); 4625 4626 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex) 4627 4628 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset. 4629 if (!CPUProfile.empty()) 4630 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'"); 4631 4632 // ACLE 6.4.3 Unaligned access supported in hardware 4633 if (Unaligned) 4634 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1"); 4635 4636 // ACLE 6.4.4 LDREX/STREX 4637 if (LDREX) 4638 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX)); 4639 4640 // ACLE 6.4.5 CLZ 4641 if (ArchVersion == 5 || 4642 (ArchVersion == 6 && CPUProfile != "M") || 4643 ArchVersion > 6) 4644 Builder.defineMacro("__ARM_FEATURE_CLZ", "1"); 4645 4646 // ACLE 6.5.1 Hardware Floating Point 4647 if (HW_FP) 4648 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP)); 4649 4650 // ACLE predefines. 4651 Builder.defineMacro("__ARM_ACLE", "200"); 4652 4653 // FP16 support (we currently only support IEEE format). 4654 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1"); 4655 Builder.defineMacro("__ARM_FP16_ARGS", "1"); 4656 4657 // ACLE 6.5.3 Fused multiply-accumulate (FMA) 4658 if (ArchVersion >= 7 && (CPUProfile != "M" || CPUAttr == "7EM")) 4659 Builder.defineMacro("__ARM_FEATURE_FMA", "1"); 4660 4661 // Subtarget options. 4662 4663 // FIXME: It's more complicated than this and we don't really support 4664 // interworking. 4665 // Windows on ARM does not "support" interworking 4666 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows()) 4667 Builder.defineMacro("__THUMB_INTERWORK__"); 4668 4669 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") { 4670 // Embedded targets on Darwin follow AAPCS, but not EABI. 4671 // Windows on ARM follows AAPCS VFP, but does not conform to EABI. 4672 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows()) 4673 Builder.defineMacro("__ARM_EABI__"); 4674 Builder.defineMacro("__ARM_PCS", "1"); 4675 4676 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp") 4677 Builder.defineMacro("__ARM_PCS_VFP", "1"); 4678 } 4679 4680 if (SoftFloat) 4681 Builder.defineMacro("__SOFTFP__"); 4682 4683 if (CPU == "xscale") 4684 Builder.defineMacro("__XSCALE__"); 4685 4686 if (isThumb()) { 4687 Builder.defineMacro("__THUMBEL__"); 4688 Builder.defineMacro("__thumb__"); 4689 if (supportsThumb2()) 4690 Builder.defineMacro("__thumb2__"); 4691 } 4692 4693 // ACLE 6.4.9 32-bit SIMD instructions 4694 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM")) 4695 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1"); 4696 4697 // ACLE 6.4.10 Hardware Integer Divide 4698 if (((HWDiv & HWDivThumb) && isThumb()) || ((HWDiv & HWDivARM) && !isThumb())) { 4699 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); 4700 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1"); 4701 } 4702 4703 // Note, this is always on in gcc, even though it doesn't make sense. 4704 Builder.defineMacro("__APCS_32__"); 4705 4706 if (FPUModeIsVFP((FPUMode) FPU)) { 4707 Builder.defineMacro("__VFP_FP__"); 4708 if (FPU & VFP2FPU) 4709 Builder.defineMacro("__ARM_VFPV2__"); 4710 if (FPU & VFP3FPU) 4711 Builder.defineMacro("__ARM_VFPV3__"); 4712 if (FPU & VFP4FPU) 4713 Builder.defineMacro("__ARM_VFPV4__"); 4714 } 4715 4716 // This only gets set when Neon instructions are actually available, unlike 4717 // the VFP define, hence the soft float and arch check. This is subtly 4718 // different from gcc, we follow the intent which was that it should be set 4719 // when Neon instructions are actually available. 4720 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) { 4721 Builder.defineMacro("__ARM_NEON", "1"); 4722 Builder.defineMacro("__ARM_NEON__"); 4723 // current AArch32 NEON implementations do not support double-precision 4724 // floating-point even when it is present in VFP. 4725 Builder.defineMacro("__ARM_NEON_FP", "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP)); 4726 } 4727 4728 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", 4729 Opts.ShortWChar ? "2" : "4"); 4730 4731 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM", 4732 Opts.ShortEnums ? "1" : "4"); 4733 4734 if (ArchVersion >= 6 && CPUAttr != "6M") { 4735 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1"); 4736 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2"); 4737 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4"); 4738 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8"); 4739 } 4740 4741 // ACLE 6.4.7 DSP instructions 4742 if (DSP) { 4743 Builder.defineMacro("__ARM_FEATURE_DSP", "1"); 4744 } 4745 4746 // ACLE 6.4.8 Saturation instructions 4747 bool SAT = false; 4748 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) { 4749 Builder.defineMacro("__ARM_FEATURE_SAT", "1"); 4750 SAT = true; 4751 } 4752 4753 // ACLE 6.4.6 Q (saturation) flag 4754 if (DSP || SAT) 4755 Builder.defineMacro("__ARM_FEATURE_QBIT", "1"); 4756 } 4757 4758 void getTargetBuiltins(const Builtin::Info *&Records, 4759 unsigned &NumRecords) const override { 4760 Records = BuiltinInfo; 4761 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin; 4762 } 4763 bool isCLZForZeroUndef() const override { return false; } 4764 BuiltinVaListKind getBuiltinVaListKind() const override { 4765 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList; 4766 } 4767 void getGCCRegNames(const char * const *&Names, 4768 unsigned &NumNames) const override; 4769 void getGCCRegAliases(const GCCRegAlias *&Aliases, 4770 unsigned &NumAliases) const override; 4771 bool validateAsmConstraint(const char *&Name, 4772 TargetInfo::ConstraintInfo &Info) const override { 4773 switch (*Name) { 4774 default: break; 4775 case 'l': // r0-r7 4776 case 'h': // r8-r15 4777 case 'w': // VFP Floating point register single precision 4778 case 'P': // VFP Floating point register double precision 4779 Info.setAllowsRegister(); 4780 return true; 4781 case 'I': 4782 case 'J': 4783 case 'K': 4784 case 'L': 4785 case 'M': 4786 // FIXME 4787 return true; 4788 case 'Q': // A memory address that is a single base register. 4789 Info.setAllowsMemory(); 4790 return true; 4791 case 'U': // a memory reference... 4792 switch (Name[1]) { 4793 case 'q': // ...ARMV4 ldrsb 4794 case 'v': // ...VFP load/store (reg+constant offset) 4795 case 'y': // ...iWMMXt load/store 4796 case 't': // address valid for load/store opaque types wider 4797 // than 128-bits 4798 case 'n': // valid address for Neon doubleword vector load/store 4799 case 'm': // valid address for Neon element and structure load/store 4800 case 's': // valid address for non-offset loads/stores of quad-word 4801 // values in four ARM registers 4802 Info.setAllowsMemory(); 4803 Name++; 4804 return true; 4805 } 4806 } 4807 return false; 4808 } 4809 std::string convertConstraint(const char *&Constraint) const override { 4810 std::string R; 4811 switch (*Constraint) { 4812 case 'U': // Two-character constraint; add "^" hint for later parsing. 4813 R = std::string("^") + std::string(Constraint, 2); 4814 Constraint++; 4815 break; 4816 case 'p': // 'p' should be translated to 'r' by default. 4817 R = std::string("r"); 4818 break; 4819 default: 4820 return std::string(1, *Constraint); 4821 } 4822 return R; 4823 } 4824 bool 4825 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size, 4826 std::string &SuggestedModifier) const override { 4827 bool isOutput = (Constraint[0] == '='); 4828 bool isInOut = (Constraint[0] == '+'); 4829 4830 // Strip off constraint modifiers. 4831 while (Constraint[0] == '=' || 4832 Constraint[0] == '+' || 4833 Constraint[0] == '&') 4834 Constraint = Constraint.substr(1); 4835 4836 switch (Constraint[0]) { 4837 default: break; 4838 case 'r': { 4839 switch (Modifier) { 4840 default: 4841 return (isInOut || isOutput || Size <= 64); 4842 case 'q': 4843 // A register of size 32 cannot fit a vector type. 4844 return false; 4845 } 4846 } 4847 } 4848 4849 return true; 4850 } 4851 const char *getClobbers() const override { 4852 // FIXME: Is this really right? 4853 return ""; 4854 } 4855 4856 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override { 4857 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning; 4858 } 4859 4860 int getEHDataRegisterNumber(unsigned RegNo) const override { 4861 if (RegNo == 0) return 0; 4862 if (RegNo == 1) return 1; 4863 return -1; 4864 } 4865 4866 bool hasSjLjLowering() const override { 4867 return true; 4868 } 4869 }; 4870 4871 bool ARMTargetInfo::setFPMath(StringRef Name) { 4872 if (Name == "neon") { 4873 FPMath = FP_Neon; 4874 return true; 4875 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" || 4876 Name == "vfp4") { 4877 FPMath = FP_VFP; 4878 return true; 4879 } 4880 return false; 4881 } 4882 4883 const char * const ARMTargetInfo::GCCRegNames[] = { 4884 // Integer registers 4885 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", 4886 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc", 4887 4888 // Float registers 4889 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", 4890 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15", 4891 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23", 4892 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31", 4893 4894 // Double registers 4895 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", 4896 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15", 4897 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23", 4898 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31", 4899 4900 // Quad registers 4901 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", 4902 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" 4903 }; 4904 4905 void ARMTargetInfo::getGCCRegNames(const char * const *&Names, 4906 unsigned &NumNames) const { 4907 Names = GCCRegNames; 4908 NumNames = llvm::array_lengthof(GCCRegNames); 4909 } 4910 4911 const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = { 4912 { { "a1" }, "r0" }, 4913 { { "a2" }, "r1" }, 4914 { { "a3" }, "r2" }, 4915 { { "a4" }, "r3" }, 4916 { { "v1" }, "r4" }, 4917 { { "v2" }, "r5" }, 4918 { { "v3" }, "r6" }, 4919 { { "v4" }, "r7" }, 4920 { { "v5" }, "r8" }, 4921 { { "v6", "rfp" }, "r9" }, 4922 { { "sl" }, "r10" }, 4923 { { "fp" }, "r11" }, 4924 { { "ip" }, "r12" }, 4925 { { "r13" }, "sp" }, 4926 { { "r14" }, "lr" }, 4927 { { "r15" }, "pc" }, 4928 // The S, D and Q registers overlap, but aren't really aliases; we 4929 // don't want to substitute one of these for a different-sized one. 4930 }; 4931 4932 void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases, 4933 unsigned &NumAliases) const { 4934 Aliases = GCCRegAliases; 4935 NumAliases = llvm::array_lengthof(GCCRegAliases); 4936 } 4937 4938 const Builtin::Info ARMTargetInfo::BuiltinInfo[] = { 4939 #define BUILTIN(ID, TYPE, ATTRS) \ 4940 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr }, 4941 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \ 4942 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr }, 4943 #include "clang/Basic/BuiltinsNEON.def" 4944 4945 #define BUILTIN(ID, TYPE, ATTRS) \ 4946 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr }, 4947 #define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \ 4948 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr }, 4949 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \ 4950 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr }, 4951 #include "clang/Basic/BuiltinsARM.def" 4952 }; 4953 4954 class ARMleTargetInfo : public ARMTargetInfo { 4955 public: 4956 ARMleTargetInfo(const llvm::Triple &Triple) 4957 : ARMTargetInfo(Triple, false) { } 4958 void getTargetDefines(const LangOptions &Opts, 4959 MacroBuilder &Builder) const override { 4960 Builder.defineMacro("__ARMEL__"); 4961 ARMTargetInfo::getTargetDefines(Opts, Builder); 4962 } 4963 }; 4964 4965 class ARMbeTargetInfo : public ARMTargetInfo { 4966 public: 4967 ARMbeTargetInfo(const llvm::Triple &Triple) 4968 : ARMTargetInfo(Triple, true) { } 4969 void getTargetDefines(const LangOptions &Opts, 4970 MacroBuilder &Builder) const override { 4971 Builder.defineMacro("__ARMEB__"); 4972 Builder.defineMacro("__ARM_BIG_ENDIAN"); 4973 ARMTargetInfo::getTargetDefines(Opts, Builder); 4974 } 4975 }; 4976 4977 class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> { 4978 const llvm::Triple Triple; 4979 public: 4980 WindowsARMTargetInfo(const llvm::Triple &Triple) 4981 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) { 4982 TLSSupported = false; 4983 WCharType = UnsignedShort; 4984 SizeType = UnsignedInt; 4985 UserLabelPrefix = ""; 4986 } 4987 void getVisualStudioDefines(const LangOptions &Opts, 4988 MacroBuilder &Builder) const { 4989 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder); 4990 4991 // FIXME: this is invalid for WindowsCE 4992 Builder.defineMacro("_M_ARM_NT", "1"); 4993 Builder.defineMacro("_M_ARMT", "_M_ARM"); 4994 Builder.defineMacro("_M_THUMB", "_M_ARM"); 4995 4996 assert((Triple.getArch() == llvm::Triple::arm || 4997 Triple.getArch() == llvm::Triple::thumb) && 4998 "invalid architecture for Windows ARM target info"); 4999 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6; 5000 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset)); 5001 5002 // TODO map the complete set of values 5003 // 31: VFPv3 40: VFPv4 5004 Builder.defineMacro("_M_ARM_FP", "31"); 5005 } 5006 BuiltinVaListKind getBuiltinVaListKind() const override { 5007 return TargetInfo::CharPtrBuiltinVaList; 5008 } 5009 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override { 5010 switch (CC) { 5011 case CC_X86StdCall: 5012 case CC_X86ThisCall: 5013 case CC_X86FastCall: 5014 case CC_X86VectorCall: 5015 return CCCR_Ignore; 5016 case CC_C: 5017 return CCCR_OK; 5018 default: 5019 return CCCR_Warning; 5020 } 5021 } 5022 }; 5023 5024 // Windows ARM + Itanium C++ ABI Target 5025 class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo { 5026 public: 5027 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple) 5028 : WindowsARMTargetInfo(Triple) { 5029 TheCXXABI.set(TargetCXXABI::GenericARM); 5030 } 5031 5032 void getTargetDefines(const LangOptions &Opts, 5033 MacroBuilder &Builder) const override { 5034 WindowsARMTargetInfo::getTargetDefines(Opts, Builder); 5035 5036 if (Opts.MSVCCompat) 5037 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder); 5038 } 5039 }; 5040 5041 // Windows ARM, MS (C++) ABI 5042 class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo { 5043 public: 5044 MicrosoftARMleTargetInfo(const llvm::Triple &Triple) 5045 : WindowsARMTargetInfo(Triple) { 5046 TheCXXABI.set(TargetCXXABI::Microsoft); 5047 } 5048 5049 void getTargetDefines(const LangOptions &Opts, 5050 MacroBuilder &Builder) const override { 5051 WindowsARMTargetInfo::getTargetDefines(Opts, Builder); 5052 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder); 5053 } 5054 }; 5055 5056 // ARM MinGW target 5057 class MinGWARMTargetInfo : public WindowsARMTargetInfo { 5058 public: 5059 MinGWARMTargetInfo(const llvm::Triple &Triple) 5060 : WindowsARMTargetInfo(Triple) { 5061 TheCXXABI.set(TargetCXXABI::GenericARM); 5062 } 5063 5064 void getTargetDefines(const LangOptions &Opts, 5065 MacroBuilder &Builder) const override { 5066 WindowsARMTargetInfo::getTargetDefines(Opts, Builder); 5067 DefineStd(Builder, "WIN32", Opts); 5068 DefineStd(Builder, "WINNT", Opts); 5069 Builder.defineMacro("_ARM_"); 5070 addMinGWDefines(Opts, Builder); 5071 } 5072 }; 5073 5074 // ARM Cygwin target 5075 class CygwinARMTargetInfo : public ARMleTargetInfo { 5076 public: 5077 CygwinARMTargetInfo(const llvm::Triple &Triple) : ARMleTargetInfo(Triple) { 5078 TLSSupported = false; 5079 WCharType = UnsignedShort; 5080 DoubleAlign = LongLongAlign = 64; 5081 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"; 5082 } 5083 void getTargetDefines(const LangOptions &Opts, 5084 MacroBuilder &Builder) const override { 5085 ARMleTargetInfo::getTargetDefines(Opts, Builder); 5086 Builder.defineMacro("_ARM_"); 5087 Builder.defineMacro("__CYGWIN__"); 5088 Builder.defineMacro("__CYGWIN32__"); 5089 DefineStd(Builder, "unix", Opts); 5090 if (Opts.CPlusPlus) 5091 Builder.defineMacro("_GNU_SOURCE"); 5092 } 5093 }; 5094 5095 class DarwinARMTargetInfo : 5096 public DarwinTargetInfo<ARMleTargetInfo> { 5097 protected: 5098 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 5099 MacroBuilder &Builder) const override { 5100 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion); 5101 } 5102 5103 public: 5104 DarwinARMTargetInfo(const llvm::Triple &Triple) 5105 : DarwinTargetInfo<ARMleTargetInfo>(Triple) { 5106 HasAlignMac68kSupport = true; 5107 // iOS always has 64-bit atomic instructions. 5108 // FIXME: This should be based off of the target features in 5109 // ARMleTargetInfo. 5110 MaxAtomicInlineWidth = 64; 5111 5112 // Darwin on iOS uses a variant of the ARM C++ ABI. 5113 TheCXXABI.set(TargetCXXABI::iOS); 5114 } 5115 }; 5116 5117 class AArch64TargetInfo : public TargetInfo { 5118 virtual void setDataLayoutString() = 0; 5119 static const TargetInfo::GCCRegAlias GCCRegAliases[]; 5120 static const char *const GCCRegNames[]; 5121 5122 enum FPUModeEnum { 5123 FPUMode, 5124 NeonMode 5125 }; 5126 5127 unsigned FPU; 5128 unsigned CRC; 5129 unsigned Crypto; 5130 unsigned Unaligned; 5131 5132 static const Builtin::Info BuiltinInfo[]; 5133 5134 std::string ABI; 5135 5136 public: 5137 AArch64TargetInfo(const llvm::Triple &Triple) 5138 : TargetInfo(Triple), ABI("aapcs") { 5139 5140 if (getTriple().getOS() == llvm::Triple::NetBSD) { 5141 WCharType = SignedInt; 5142 5143 // NetBSD apparently prefers consistency across ARM targets to consistency 5144 // across 64-bit targets. 5145 Int64Type = SignedLongLong; 5146 IntMaxType = SignedLongLong; 5147 } else { 5148 WCharType = UnsignedInt; 5149 Int64Type = SignedLong; 5150 IntMaxType = SignedLong; 5151 } 5152 5153 LongWidth = LongAlign = PointerWidth = PointerAlign = 64; 5154 MaxVectorAlign = 128; 5155 MaxAtomicInlineWidth = 128; 5156 MaxAtomicPromoteWidth = 128; 5157 5158 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128; 5159 LongDoubleFormat = &llvm::APFloat::IEEEquad; 5160 5161 // {} in inline assembly are neon specifiers, not assembly variant 5162 // specifiers. 5163 NoAsmVariants = true; 5164 5165 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type 5166 // contributes to the alignment of the containing aggregate in the same way 5167 // a plain (non bit-field) member of that type would, without exception for 5168 // zero-sized or anonymous bit-fields." 5169 UseBitFieldTypeAlignment = true; 5170 UseZeroLengthBitfieldAlignment = true; 5171 5172 // AArch64 targets default to using the ARM C++ ABI. 5173 TheCXXABI.set(TargetCXXABI::GenericAArch64); 5174 } 5175 5176 StringRef getABI() const override { return ABI; } 5177 bool setABI(const std::string &Name) override { 5178 if (Name != "aapcs" && Name != "darwinpcs") 5179 return false; 5180 5181 ABI = Name; 5182 return true; 5183 } 5184 5185 bool setCPU(const std::string &Name) override { 5186 bool CPUKnown = llvm::StringSwitch<bool>(Name) 5187 .Case("generic", true) 5188 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true) 5189 .Case("cyclone", true) 5190 .Default(false); 5191 return CPUKnown; 5192 } 5193 5194 void getTargetDefines(const LangOptions &Opts, 5195 MacroBuilder &Builder) const override { 5196 // Target identification. 5197 Builder.defineMacro("__aarch64__"); 5198 5199 // Target properties. 5200 Builder.defineMacro("_LP64"); 5201 Builder.defineMacro("__LP64__"); 5202 5203 // ACLE predefines. Many can only have one possible value on v8 AArch64. 5204 Builder.defineMacro("__ARM_ACLE", "200"); 5205 Builder.defineMacro("__ARM_ARCH", "8"); 5206 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'"); 5207 5208 Builder.defineMacro("__ARM_64BIT_STATE", "1"); 5209 Builder.defineMacro("__ARM_PCS_AAPCS64"); 5210 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1"); 5211 5212 Builder.defineMacro("__ARM_FEATURE_CLZ", "1"); 5213 Builder.defineMacro("__ARM_FEATURE_FMA", "1"); 5214 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF"); 5215 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE 5216 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility 5217 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1"); 5218 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1"); 5219 5220 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4"); 5221 5222 // 0xe implies support for half, single and double precision operations. 5223 Builder.defineMacro("__ARM_FP", "0xE"); 5224 5225 // PCS specifies this for SysV variants, which is all we support. Other ABIs 5226 // may choose __ARM_FP16_FORMAT_ALTERNATIVE. 5227 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1"); 5228 Builder.defineMacro("__ARM_FP16_ARGS", "1"); 5229 5230 if (Opts.FastMath || Opts.FiniteMathOnly) 5231 Builder.defineMacro("__ARM_FP_FAST"); 5232 5233 if (Opts.C99 && !Opts.Freestanding) 5234 Builder.defineMacro("__ARM_FP_FENV_ROUNDING"); 5235 5236 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4"); 5237 5238 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM", 5239 Opts.ShortEnums ? "1" : "4"); 5240 5241 if (FPU == NeonMode) { 5242 Builder.defineMacro("__ARM_NEON", "1"); 5243 // 64-bit NEON supports half, single and double precision operations. 5244 Builder.defineMacro("__ARM_NEON_FP", "0xE"); 5245 } 5246 5247 if (CRC) 5248 Builder.defineMacro("__ARM_FEATURE_CRC32", "1"); 5249 5250 if (Crypto) 5251 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1"); 5252 5253 if (Unaligned) 5254 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1"); 5255 5256 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work. 5257 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1"); 5258 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2"); 5259 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4"); 5260 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8"); 5261 } 5262 5263 void getTargetBuiltins(const Builtin::Info *&Records, 5264 unsigned &NumRecords) const override { 5265 Records = BuiltinInfo; 5266 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin; 5267 } 5268 5269 bool hasFeature(StringRef Feature) const override { 5270 return Feature == "aarch64" || 5271 Feature == "arm64" || 5272 Feature == "arm" || 5273 (Feature == "neon" && FPU == NeonMode); 5274 } 5275 5276 bool handleTargetFeatures(std::vector<std::string> &Features, 5277 DiagnosticsEngine &Diags) override { 5278 FPU = FPUMode; 5279 CRC = 0; 5280 Crypto = 0; 5281 Unaligned = 1; 5282 5283 for (const auto &Feature : Features) { 5284 if (Feature == "+neon") 5285 FPU = NeonMode; 5286 if (Feature == "+crc") 5287 CRC = 1; 5288 if (Feature == "+crypto") 5289 Crypto = 1; 5290 if (Feature == "+strict-align") 5291 Unaligned = 0; 5292 } 5293 5294 setDataLayoutString(); 5295 5296 return true; 5297 } 5298 5299 bool isCLZForZeroUndef() const override { return false; } 5300 5301 BuiltinVaListKind getBuiltinVaListKind() const override { 5302 return TargetInfo::AArch64ABIBuiltinVaList; 5303 } 5304 5305 void getGCCRegNames(const char *const *&Names, 5306 unsigned &NumNames) const override; 5307 void getGCCRegAliases(const GCCRegAlias *&Aliases, 5308 unsigned &NumAliases) const override; 5309 5310 bool validateAsmConstraint(const char *&Name, 5311 TargetInfo::ConstraintInfo &Info) const override { 5312 switch (*Name) { 5313 default: 5314 return false; 5315 case 'w': // Floating point and SIMD registers (V0-V31) 5316 Info.setAllowsRegister(); 5317 return true; 5318 case 'I': // Constant that can be used with an ADD instruction 5319 case 'J': // Constant that can be used with a SUB instruction 5320 case 'K': // Constant that can be used with a 32-bit logical instruction 5321 case 'L': // Constant that can be used with a 64-bit logical instruction 5322 case 'M': // Constant that can be used as a 32-bit MOV immediate 5323 case 'N': // Constant that can be used as a 64-bit MOV immediate 5324 case 'Y': // Floating point constant zero 5325 case 'Z': // Integer constant zero 5326 return true; 5327 case 'Q': // A memory reference with base register and no offset 5328 Info.setAllowsMemory(); 5329 return true; 5330 case 'S': // A symbolic address 5331 Info.setAllowsRegister(); 5332 return true; 5333 case 'U': 5334 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes. 5335 // Utf: A memory address suitable for ldp/stp in TF mode. 5336 // Usa: An absolute symbolic address. 5337 // Ush: The high part (bits 32:12) of a pc-relative symbolic address. 5338 llvm_unreachable("FIXME: Unimplemented support for U* constraints."); 5339 case 'z': // Zero register, wzr or xzr 5340 Info.setAllowsRegister(); 5341 return true; 5342 case 'x': // Floating point and SIMD registers (V0-V15) 5343 Info.setAllowsRegister(); 5344 return true; 5345 } 5346 return false; 5347 } 5348 5349 bool 5350 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size, 5351 std::string &SuggestedModifier) const override { 5352 // Strip off constraint modifiers. 5353 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&') 5354 Constraint = Constraint.substr(1); 5355 5356 switch (Constraint[0]) { 5357 default: 5358 return true; 5359 case 'z': 5360 case 'r': { 5361 switch (Modifier) { 5362 case 'x': 5363 case 'w': 5364 // For now assume that the person knows what they're 5365 // doing with the modifier. 5366 return true; 5367 default: 5368 // By default an 'r' constraint will be in the 'x' 5369 // registers. 5370 if (Size == 64) 5371 return true; 5372 5373 SuggestedModifier = "w"; 5374 return false; 5375 } 5376 } 5377 } 5378 } 5379 5380 const char *getClobbers() const override { return ""; } 5381 5382 int getEHDataRegisterNumber(unsigned RegNo) const override { 5383 if (RegNo == 0) 5384 return 0; 5385 if (RegNo == 1) 5386 return 1; 5387 return -1; 5388 } 5389 }; 5390 5391 const char *const AArch64TargetInfo::GCCRegNames[] = { 5392 // 32-bit Integer registers 5393 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10", 5394 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21", 5395 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp", 5396 5397 // 64-bit Integer registers 5398 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", 5399 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21", 5400 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp", 5401 5402 // 32-bit floating point regsisters 5403 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", 5404 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21", 5405 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31", 5406 5407 // 64-bit floating point regsisters 5408 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10", 5409 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21", 5410 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31", 5411 5412 // Vector registers 5413 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", 5414 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21", 5415 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31" 5416 }; 5417 5418 void AArch64TargetInfo::getGCCRegNames(const char *const *&Names, 5419 unsigned &NumNames) const { 5420 Names = GCCRegNames; 5421 NumNames = llvm::array_lengthof(GCCRegNames); 5422 } 5423 5424 const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = { 5425 { { "w31" }, "wsp" }, 5426 { { "x29" }, "fp" }, 5427 { { "x30" }, "lr" }, 5428 { { "x31" }, "sp" }, 5429 // The S/D/Q and W/X registers overlap, but aren't really aliases; we 5430 // don't want to substitute one of these for a different-sized one. 5431 }; 5432 5433 void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases, 5434 unsigned &NumAliases) const { 5435 Aliases = GCCRegAliases; 5436 NumAliases = llvm::array_lengthof(GCCRegAliases); 5437 } 5438 5439 const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = { 5440 #define BUILTIN(ID, TYPE, ATTRS) \ 5441 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr }, 5442 #include "clang/Basic/BuiltinsNEON.def" 5443 5444 #define BUILTIN(ID, TYPE, ATTRS) \ 5445 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr }, 5446 #include "clang/Basic/BuiltinsAArch64.def" 5447 }; 5448 5449 class AArch64leTargetInfo : public AArch64TargetInfo { 5450 void setDataLayoutString() override { 5451 if (getTriple().isOSBinFormatMachO()) 5452 DataLayoutString = "e-m:o-i64:64-i128:128-n32:64-S128"; 5453 else 5454 DataLayoutString = "e-m:e-i64:64-i128:128-n32:64-S128"; 5455 } 5456 5457 public: 5458 AArch64leTargetInfo(const llvm::Triple &Triple) 5459 : AArch64TargetInfo(Triple) { 5460 BigEndian = false; 5461 } 5462 void getTargetDefines(const LangOptions &Opts, 5463 MacroBuilder &Builder) const override { 5464 Builder.defineMacro("__AARCH64EL__"); 5465 AArch64TargetInfo::getTargetDefines(Opts, Builder); 5466 } 5467 }; 5468 5469 class AArch64beTargetInfo : public AArch64TargetInfo { 5470 void setDataLayoutString() override { 5471 assert(!getTriple().isOSBinFormatMachO()); 5472 DataLayoutString = "E-m:e-i64:64-i128:128-n32:64-S128"; 5473 } 5474 5475 public: 5476 AArch64beTargetInfo(const llvm::Triple &Triple) 5477 : AArch64TargetInfo(Triple) { } 5478 void getTargetDefines(const LangOptions &Opts, 5479 MacroBuilder &Builder) const override { 5480 Builder.defineMacro("__AARCH64EB__"); 5481 Builder.defineMacro("__AARCH_BIG_ENDIAN"); 5482 Builder.defineMacro("__ARM_BIG_ENDIAN"); 5483 AArch64TargetInfo::getTargetDefines(Opts, Builder); 5484 } 5485 }; 5486 5487 class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> { 5488 protected: 5489 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 5490 MacroBuilder &Builder) const override { 5491 Builder.defineMacro("__AARCH64_SIMD__"); 5492 Builder.defineMacro("__ARM64_ARCH_8__"); 5493 Builder.defineMacro("__ARM_NEON__"); 5494 Builder.defineMacro("__LITTLE_ENDIAN__"); 5495 Builder.defineMacro("__REGISTER_PREFIX__", ""); 5496 Builder.defineMacro("__arm64", "1"); 5497 Builder.defineMacro("__arm64__", "1"); 5498 5499 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion); 5500 } 5501 5502 public: 5503 DarwinAArch64TargetInfo(const llvm::Triple &Triple) 5504 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) { 5505 Int64Type = SignedLongLong; 5506 WCharType = SignedInt; 5507 UseSignedCharForObjCBool = false; 5508 5509 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64; 5510 LongDoubleFormat = &llvm::APFloat::IEEEdouble; 5511 5512 TheCXXABI.set(TargetCXXABI::iOS64); 5513 } 5514 5515 BuiltinVaListKind getBuiltinVaListKind() const override { 5516 return TargetInfo::CharPtrBuiltinVaList; 5517 } 5518 }; 5519 5520 // Hexagon abstract base class 5521 class HexagonTargetInfo : public TargetInfo { 5522 static const Builtin::Info BuiltinInfo[]; 5523 static const char * const GCCRegNames[]; 5524 static const TargetInfo::GCCRegAlias GCCRegAliases[]; 5525 std::string CPU; 5526 public: 5527 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) { 5528 BigEndian = false; 5529 DataLayoutString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32"; 5530 5531 // {} in inline assembly are packet specifiers, not assembly variant 5532 // specifiers. 5533 NoAsmVariants = true; 5534 } 5535 5536 void getTargetBuiltins(const Builtin::Info *&Records, 5537 unsigned &NumRecords) const override { 5538 Records = BuiltinInfo; 5539 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin; 5540 } 5541 5542 bool validateAsmConstraint(const char *&Name, 5543 TargetInfo::ConstraintInfo &Info) const override { 5544 return true; 5545 } 5546 5547 void getTargetDefines(const LangOptions &Opts, 5548 MacroBuilder &Builder) const override; 5549 5550 bool hasFeature(StringRef Feature) const override { 5551 return Feature == "hexagon"; 5552 } 5553 5554 BuiltinVaListKind getBuiltinVaListKind() const override { 5555 return TargetInfo::CharPtrBuiltinVaList; 5556 } 5557 void getGCCRegNames(const char * const *&Names, 5558 unsigned &NumNames) const override; 5559 void getGCCRegAliases(const GCCRegAlias *&Aliases, 5560 unsigned &NumAliases) const override; 5561 const char *getClobbers() const override { 5562 return ""; 5563 } 5564 5565 static const char *getHexagonCPUSuffix(StringRef Name) { 5566 return llvm::StringSwitch<const char*>(Name) 5567 .Case("hexagonv4", "4") 5568 .Case("hexagonv5", "5") 5569 .Default(nullptr); 5570 } 5571 5572 bool setCPU(const std::string &Name) override { 5573 if (!getHexagonCPUSuffix(Name)) 5574 return false; 5575 5576 CPU = Name; 5577 return true; 5578 } 5579 }; 5580 5581 void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts, 5582 MacroBuilder &Builder) const { 5583 Builder.defineMacro("qdsp6"); 5584 Builder.defineMacro("__qdsp6", "1"); 5585 Builder.defineMacro("__qdsp6__", "1"); 5586 5587 Builder.defineMacro("hexagon"); 5588 Builder.defineMacro("__hexagon", "1"); 5589 Builder.defineMacro("__hexagon__", "1"); 5590 5591 if(CPU == "hexagonv1") { 5592 Builder.defineMacro("__HEXAGON_V1__"); 5593 Builder.defineMacro("__HEXAGON_ARCH__", "1"); 5594 if(Opts.HexagonQdsp6Compat) { 5595 Builder.defineMacro("__QDSP6_V1__"); 5596 Builder.defineMacro("__QDSP6_ARCH__", "1"); 5597 } 5598 } 5599 else if(CPU == "hexagonv2") { 5600 Builder.defineMacro("__HEXAGON_V2__"); 5601 Builder.defineMacro("__HEXAGON_ARCH__", "2"); 5602 if(Opts.HexagonQdsp6Compat) { 5603 Builder.defineMacro("__QDSP6_V2__"); 5604 Builder.defineMacro("__QDSP6_ARCH__", "2"); 5605 } 5606 } 5607 else if(CPU == "hexagonv3") { 5608 Builder.defineMacro("__HEXAGON_V3__"); 5609 Builder.defineMacro("__HEXAGON_ARCH__", "3"); 5610 if(Opts.HexagonQdsp6Compat) { 5611 Builder.defineMacro("__QDSP6_V3__"); 5612 Builder.defineMacro("__QDSP6_ARCH__", "3"); 5613 } 5614 } 5615 else if(CPU == "hexagonv4") { 5616 Builder.defineMacro("__HEXAGON_V4__"); 5617 Builder.defineMacro("__HEXAGON_ARCH__", "4"); 5618 if(Opts.HexagonQdsp6Compat) { 5619 Builder.defineMacro("__QDSP6_V4__"); 5620 Builder.defineMacro("__QDSP6_ARCH__", "4"); 5621 } 5622 } 5623 else if(CPU == "hexagonv5") { 5624 Builder.defineMacro("__HEXAGON_V5__"); 5625 Builder.defineMacro("__HEXAGON_ARCH__", "5"); 5626 if(Opts.HexagonQdsp6Compat) { 5627 Builder.defineMacro("__QDSP6_V5__"); 5628 Builder.defineMacro("__QDSP6_ARCH__", "5"); 5629 } 5630 } 5631 } 5632 5633 const char * const HexagonTargetInfo::GCCRegNames[] = { 5634 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", 5635 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", 5636 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", 5637 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31", 5638 "p0", "p1", "p2", "p3", 5639 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp" 5640 }; 5641 5642 void HexagonTargetInfo::getGCCRegNames(const char * const *&Names, 5643 unsigned &NumNames) const { 5644 Names = GCCRegNames; 5645 NumNames = llvm::array_lengthof(GCCRegNames); 5646 } 5647 5648 5649 const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = { 5650 { { "sp" }, "r29" }, 5651 { { "fp" }, "r30" }, 5652 { { "lr" }, "r31" }, 5653 }; 5654 5655 void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases, 5656 unsigned &NumAliases) const { 5657 Aliases = GCCRegAliases; 5658 NumAliases = llvm::array_lengthof(GCCRegAliases); 5659 } 5660 5661 5662 const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = { 5663 #define BUILTIN(ID, TYPE, ATTRS) \ 5664 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr }, 5665 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \ 5666 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr }, 5667 #include "clang/Basic/BuiltinsHexagon.def" 5668 }; 5669 5670 // Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit). 5671 class SparcTargetInfo : public TargetInfo { 5672 static const TargetInfo::GCCRegAlias GCCRegAliases[]; 5673 static const char * const GCCRegNames[]; 5674 bool SoftFloat; 5675 public: 5676 SparcTargetInfo(const llvm::Triple &Triple) 5677 : TargetInfo(Triple), SoftFloat(false) {} 5678 5679 bool handleTargetFeatures(std::vector<std::string> &Features, 5680 DiagnosticsEngine &Diags) override { 5681 // The backend doesn't actually handle soft float yet, but in case someone 5682 // is using the support for the front end continue to support it. 5683 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float"); 5684 if (Feature != Features.end()) { 5685 SoftFloat = true; 5686 Features.erase(Feature); 5687 } 5688 return true; 5689 } 5690 void getTargetDefines(const LangOptions &Opts, 5691 MacroBuilder &Builder) const override { 5692 DefineStd(Builder, "sparc", Opts); 5693 Builder.defineMacro("__REGISTER_PREFIX__", ""); 5694 5695 if (SoftFloat) 5696 Builder.defineMacro("SOFT_FLOAT", "1"); 5697 } 5698 5699 bool hasFeature(StringRef Feature) const override { 5700 return llvm::StringSwitch<bool>(Feature) 5701 .Case("softfloat", SoftFloat) 5702 .Case("sparc", true) 5703 .Default(false); 5704 } 5705 5706 void getTargetBuiltins(const Builtin::Info *&Records, 5707 unsigned &NumRecords) const override { 5708 // FIXME: Implement! 5709 } 5710 BuiltinVaListKind getBuiltinVaListKind() const override { 5711 return TargetInfo::VoidPtrBuiltinVaList; 5712 } 5713 void getGCCRegNames(const char * const *&Names, 5714 unsigned &NumNames) const override; 5715 void getGCCRegAliases(const GCCRegAlias *&Aliases, 5716 unsigned &NumAliases) const override; 5717 bool validateAsmConstraint(const char *&Name, 5718 TargetInfo::ConstraintInfo &info) const override { 5719 // FIXME: Implement! 5720 switch (*Name) { 5721 case 'I': // Signed 13-bit constant 5722 case 'J': // Zero 5723 case 'K': // 32-bit constant with the low 12 bits clear 5724 case 'L': // A constant in the range supported by movcc (11-bit signed imm) 5725 case 'M': // A constant in the range supported by movrcc (19-bit signed imm) 5726 case 'N': // Same as 'K' but zext (required for SIMode) 5727 case 'O': // The constant 4096 5728 return true; 5729 } 5730 return false; 5731 } 5732 const char *getClobbers() const override { 5733 // FIXME: Implement! 5734 return ""; 5735 } 5736 }; 5737 5738 const char * const SparcTargetInfo::GCCRegNames[] = { 5739 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", 5740 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", 5741 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", 5742 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31" 5743 }; 5744 5745 void SparcTargetInfo::getGCCRegNames(const char * const *&Names, 5746 unsigned &NumNames) const { 5747 Names = GCCRegNames; 5748 NumNames = llvm::array_lengthof(GCCRegNames); 5749 } 5750 5751 const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = { 5752 { { "g0" }, "r0" }, 5753 { { "g1" }, "r1" }, 5754 { { "g2" }, "r2" }, 5755 { { "g3" }, "r3" }, 5756 { { "g4" }, "r4" }, 5757 { { "g5" }, "r5" }, 5758 { { "g6" }, "r6" }, 5759 { { "g7" }, "r7" }, 5760 { { "o0" }, "r8" }, 5761 { { "o1" }, "r9" }, 5762 { { "o2" }, "r10" }, 5763 { { "o3" }, "r11" }, 5764 { { "o4" }, "r12" }, 5765 { { "o5" }, "r13" }, 5766 { { "o6", "sp" }, "r14" }, 5767 { { "o7" }, "r15" }, 5768 { { "l0" }, "r16" }, 5769 { { "l1" }, "r17" }, 5770 { { "l2" }, "r18" }, 5771 { { "l3" }, "r19" }, 5772 { { "l4" }, "r20" }, 5773 { { "l5" }, "r21" }, 5774 { { "l6" }, "r22" }, 5775 { { "l7" }, "r23" }, 5776 { { "i0" }, "r24" }, 5777 { { "i1" }, "r25" }, 5778 { { "i2" }, "r26" }, 5779 { { "i3" }, "r27" }, 5780 { { "i4" }, "r28" }, 5781 { { "i5" }, "r29" }, 5782 { { "i6", "fp" }, "r30" }, 5783 { { "i7" }, "r31" }, 5784 }; 5785 5786 void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases, 5787 unsigned &NumAliases) const { 5788 Aliases = GCCRegAliases; 5789 NumAliases = llvm::array_lengthof(GCCRegAliases); 5790 } 5791 5792 // SPARC v8 is the 32-bit mode selected by Triple::sparc. 5793 class SparcV8TargetInfo : public SparcTargetInfo { 5794 public: 5795 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) { 5796 DataLayoutString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64"; 5797 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int. 5798 switch (getTriple().getOS()) { 5799 default: 5800 SizeType = UnsignedInt; 5801 IntPtrType = SignedInt; 5802 PtrDiffType = SignedInt; 5803 break; 5804 case llvm::Triple::NetBSD: 5805 case llvm::Triple::OpenBSD: 5806 SizeType = UnsignedLong; 5807 IntPtrType = SignedLong; 5808 PtrDiffType = SignedLong; 5809 break; 5810 } 5811 } 5812 5813 void getTargetDefines(const LangOptions &Opts, 5814 MacroBuilder &Builder) const override { 5815 SparcTargetInfo::getTargetDefines(Opts, Builder); 5816 Builder.defineMacro("__sparcv8"); 5817 } 5818 }; 5819 5820 // SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel. 5821 class SparcV8elTargetInfo : public SparcV8TargetInfo { 5822 public: 5823 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) { 5824 DataLayoutString = "e-m:e-p:32:32-i64:64-f128:64-n32-S64"; 5825 BigEndian = false; 5826 } 5827 }; 5828 5829 // SPARC v9 is the 64-bit mode selected by Triple::sparcv9. 5830 class SparcV9TargetInfo : public SparcTargetInfo { 5831 public: 5832 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) { 5833 // FIXME: Support Sparc quad-precision long double? 5834 DataLayoutString = "E-m:e-i64:64-n32:64-S128"; 5835 // This is an LP64 platform. 5836 LongWidth = LongAlign = PointerWidth = PointerAlign = 64; 5837 5838 // OpenBSD uses long long for int64_t and intmax_t. 5839 if (getTriple().getOS() == llvm::Triple::OpenBSD) 5840 IntMaxType = SignedLongLong; 5841 else 5842 IntMaxType = SignedLong; 5843 Int64Type = IntMaxType; 5844 5845 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit 5846 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned. 5847 LongDoubleWidth = 128; 5848 LongDoubleAlign = 128; 5849 LongDoubleFormat = &llvm::APFloat::IEEEquad; 5850 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64; 5851 } 5852 5853 void getTargetDefines(const LangOptions &Opts, 5854 MacroBuilder &Builder) const override { 5855 SparcTargetInfo::getTargetDefines(Opts, Builder); 5856 Builder.defineMacro("__sparcv9"); 5857 Builder.defineMacro("__arch64__"); 5858 // Solaris doesn't need these variants, but the BSDs do. 5859 if (getTriple().getOS() != llvm::Triple::Solaris) { 5860 Builder.defineMacro("__sparc64__"); 5861 Builder.defineMacro("__sparc_v9__"); 5862 Builder.defineMacro("__sparcv9__"); 5863 } 5864 } 5865 5866 bool setCPU(const std::string &Name) override { 5867 bool CPUKnown = llvm::StringSwitch<bool>(Name) 5868 .Case("v9", true) 5869 .Case("ultrasparc", true) 5870 .Case("ultrasparc3", true) 5871 .Case("niagara", true) 5872 .Case("niagara2", true) 5873 .Case("niagara3", true) 5874 .Case("niagara4", true) 5875 .Default(false); 5876 5877 // No need to store the CPU yet. There aren't any CPU-specific 5878 // macros to define. 5879 return CPUKnown; 5880 } 5881 }; 5882 5883 class SystemZTargetInfo : public TargetInfo { 5884 static const Builtin::Info BuiltinInfo[]; 5885 static const char *const GCCRegNames[]; 5886 std::string CPU; 5887 bool HasTransactionalExecution; 5888 bool HasVector; 5889 5890 public: 5891 SystemZTargetInfo(const llvm::Triple &Triple) 5892 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false), HasVector(false) { 5893 IntMaxType = SignedLong; 5894 Int64Type = SignedLong; 5895 TLSSupported = true; 5896 IntWidth = IntAlign = 32; 5897 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64; 5898 PointerWidth = PointerAlign = 64; 5899 LongDoubleWidth = 128; 5900 LongDoubleAlign = 64; 5901 LongDoubleFormat = &llvm::APFloat::IEEEquad; 5902 DefaultAlignForAttributeAligned = 64; 5903 MinGlobalAlign = 16; 5904 DataLayoutString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64"; 5905 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64; 5906 } 5907 void getTargetDefines(const LangOptions &Opts, 5908 MacroBuilder &Builder) const override { 5909 Builder.defineMacro("__s390__"); 5910 Builder.defineMacro("__s390x__"); 5911 Builder.defineMacro("__zarch__"); 5912 Builder.defineMacro("__LONG_DOUBLE_128__"); 5913 if (HasTransactionalExecution) 5914 Builder.defineMacro("__HTM__"); 5915 if (Opts.ZVector) 5916 Builder.defineMacro("__VEC__", "10301"); 5917 } 5918 void getTargetBuiltins(const Builtin::Info *&Records, 5919 unsigned &NumRecords) const override { 5920 Records = BuiltinInfo; 5921 NumRecords = clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin; 5922 } 5923 5924 void getGCCRegNames(const char *const *&Names, 5925 unsigned &NumNames) const override; 5926 void getGCCRegAliases(const GCCRegAlias *&Aliases, 5927 unsigned &NumAliases) const override { 5928 // No aliases. 5929 Aliases = nullptr; 5930 NumAliases = 0; 5931 } 5932 bool validateAsmConstraint(const char *&Name, 5933 TargetInfo::ConstraintInfo &info) const override; 5934 const char *getClobbers() const override { 5935 // FIXME: Is this really right? 5936 return ""; 5937 } 5938 BuiltinVaListKind getBuiltinVaListKind() const override { 5939 return TargetInfo::SystemZBuiltinVaList; 5940 } 5941 bool setCPU(const std::string &Name) override { 5942 CPU = Name; 5943 bool CPUKnown = llvm::StringSwitch<bool>(Name) 5944 .Case("z10", true) 5945 .Case("z196", true) 5946 .Case("zEC12", true) 5947 .Case("z13", true) 5948 .Default(false); 5949 5950 return CPUKnown; 5951 } 5952 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, 5953 StringRef CPU, 5954 std::vector<std::string> &FeaturesVec) const override { 5955 if (CPU == "zEC12") 5956 Features["transactional-execution"] = true; 5957 if (CPU == "z13") { 5958 Features["transactional-execution"] = true; 5959 Features["vector"] = true; 5960 } 5961 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec); 5962 } 5963 5964 bool handleTargetFeatures(std::vector<std::string> &Features, 5965 DiagnosticsEngine &Diags) override { 5966 HasTransactionalExecution = false; 5967 for (const auto &Feature : Features) { 5968 if (Feature == "+transactional-execution") 5969 HasTransactionalExecution = true; 5970 else if (Feature == "+vector") 5971 HasVector = true; 5972 } 5973 // If we use the vector ABI, vector types are 64-bit aligned. 5974 if (HasVector) { 5975 MaxVectorAlign = 64; 5976 DataLayoutString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64" 5977 "-v128:64-a:8:16-n32:64"; 5978 } 5979 return true; 5980 } 5981 5982 bool hasFeature(StringRef Feature) const override { 5983 return llvm::StringSwitch<bool>(Feature) 5984 .Case("systemz", true) 5985 .Case("htm", HasTransactionalExecution) 5986 .Case("vx", HasVector) 5987 .Default(false); 5988 } 5989 5990 StringRef getABI() const override { 5991 if (HasVector) 5992 return "vector"; 5993 return ""; 5994 } 5995 5996 bool useFloat128ManglingForLongDouble() const override { 5997 return true; 5998 } 5999 }; 6000 6001 const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = { 6002 #define BUILTIN(ID, TYPE, ATTRS) \ 6003 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr }, 6004 #include "clang/Basic/BuiltinsSystemZ.def" 6005 }; 6006 6007 const char *const SystemZTargetInfo::GCCRegNames[] = { 6008 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", 6009 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", 6010 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7", 6011 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15" 6012 }; 6013 6014 void SystemZTargetInfo::getGCCRegNames(const char *const *&Names, 6015 unsigned &NumNames) const { 6016 Names = GCCRegNames; 6017 NumNames = llvm::array_lengthof(GCCRegNames); 6018 } 6019 6020 bool SystemZTargetInfo:: 6021 validateAsmConstraint(const char *&Name, 6022 TargetInfo::ConstraintInfo &Info) const { 6023 switch (*Name) { 6024 default: 6025 return false; 6026 6027 case 'a': // Address register 6028 case 'd': // Data register (equivalent to 'r') 6029 case 'f': // Floating-point register 6030 Info.setAllowsRegister(); 6031 return true; 6032 6033 case 'I': // Unsigned 8-bit constant 6034 case 'J': // Unsigned 12-bit constant 6035 case 'K': // Signed 16-bit constant 6036 case 'L': // Signed 20-bit displacement (on all targets we support) 6037 case 'M': // 0x7fffffff 6038 return true; 6039 6040 case 'Q': // Memory with base and unsigned 12-bit displacement 6041 case 'R': // Likewise, plus an index 6042 case 'S': // Memory with base and signed 20-bit displacement 6043 case 'T': // Likewise, plus an index 6044 Info.setAllowsMemory(); 6045 return true; 6046 } 6047 } 6048 6049 class MSP430TargetInfo : public TargetInfo { 6050 static const char *const GCCRegNames[]; 6051 6052 public: 6053 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) { 6054 BigEndian = false; 6055 TLSSupported = false; 6056 IntWidth = 16; 6057 IntAlign = 16; 6058 LongWidth = 32; 6059 LongLongWidth = 64; 6060 LongAlign = LongLongAlign = 16; 6061 PointerWidth = 16; 6062 PointerAlign = 16; 6063 SuitableAlign = 16; 6064 SizeType = UnsignedInt; 6065 IntMaxType = SignedLongLong; 6066 IntPtrType = SignedInt; 6067 PtrDiffType = SignedInt; 6068 SigAtomicType = SignedLong; 6069 DataLayoutString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16"; 6070 } 6071 void getTargetDefines(const LangOptions &Opts, 6072 MacroBuilder &Builder) const override { 6073 Builder.defineMacro("MSP430"); 6074 Builder.defineMacro("__MSP430__"); 6075 // FIXME: defines for different 'flavours' of MCU 6076 } 6077 void getTargetBuiltins(const Builtin::Info *&Records, 6078 unsigned &NumRecords) const override { 6079 // FIXME: Implement. 6080 Records = nullptr; 6081 NumRecords = 0; 6082 } 6083 bool hasFeature(StringRef Feature) const override { 6084 return Feature == "msp430"; 6085 } 6086 void getGCCRegNames(const char *const *&Names, 6087 unsigned &NumNames) const override; 6088 void getGCCRegAliases(const GCCRegAlias *&Aliases, 6089 unsigned &NumAliases) const override { 6090 // No aliases. 6091 Aliases = nullptr; 6092 NumAliases = 0; 6093 } 6094 bool validateAsmConstraint(const char *&Name, 6095 TargetInfo::ConstraintInfo &info) const override { 6096 // FIXME: implement 6097 switch (*Name) { 6098 case 'K': // the constant 1 6099 case 'L': // constant -1^20 .. 1^19 6100 case 'M': // constant 1-4: 6101 return true; 6102 } 6103 // No target constraints for now. 6104 return false; 6105 } 6106 const char *getClobbers() const override { 6107 // FIXME: Is this really right? 6108 return ""; 6109 } 6110 BuiltinVaListKind getBuiltinVaListKind() const override { 6111 // FIXME: implement 6112 return TargetInfo::CharPtrBuiltinVaList; 6113 } 6114 }; 6115 6116 const char *const MSP430TargetInfo::GCCRegNames[] = { 6117 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", 6118 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"}; 6119 6120 void MSP430TargetInfo::getGCCRegNames(const char *const *&Names, 6121 unsigned &NumNames) const { 6122 Names = GCCRegNames; 6123 NumNames = llvm::array_lengthof(GCCRegNames); 6124 } 6125 6126 // LLVM and Clang cannot be used directly to output native binaries for 6127 // target, but is used to compile C code to llvm bitcode with correct 6128 // type and alignment information. 6129 // 6130 // TCE uses the llvm bitcode as input and uses it for generating customized 6131 // target processor and program binary. TCE co-design environment is 6132 // publicly available in http://tce.cs.tut.fi 6133 6134 static const unsigned TCEOpenCLAddrSpaceMap[] = { 6135 3, // opencl_global 6136 4, // opencl_local 6137 5, // opencl_constant 6138 // FIXME: generic has to be added to the target 6139 0, // opencl_generic 6140 0, // cuda_device 6141 0, // cuda_constant 6142 0 // cuda_shared 6143 }; 6144 6145 class TCETargetInfo : public TargetInfo { 6146 public: 6147 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) { 6148 TLSSupported = false; 6149 IntWidth = 32; 6150 LongWidth = LongLongWidth = 32; 6151 PointerWidth = 32; 6152 IntAlign = 32; 6153 LongAlign = LongLongAlign = 32; 6154 PointerAlign = 32; 6155 SuitableAlign = 32; 6156 SizeType = UnsignedInt; 6157 IntMaxType = SignedLong; 6158 IntPtrType = SignedInt; 6159 PtrDiffType = SignedInt; 6160 FloatWidth = 32; 6161 FloatAlign = 32; 6162 DoubleWidth = 32; 6163 DoubleAlign = 32; 6164 LongDoubleWidth = 32; 6165 LongDoubleAlign = 32; 6166 FloatFormat = &llvm::APFloat::IEEEsingle; 6167 DoubleFormat = &llvm::APFloat::IEEEsingle; 6168 LongDoubleFormat = &llvm::APFloat::IEEEsingle; 6169 DataLayoutString = "E-p:32:32-i8:8:32-i16:16:32-i64:32" 6170 "-f64:32-v64:32-v128:32-a:0:32-n32"; 6171 AddrSpaceMap = &TCEOpenCLAddrSpaceMap; 6172 UseAddrSpaceMapMangling = true; 6173 } 6174 6175 void getTargetDefines(const LangOptions &Opts, 6176 MacroBuilder &Builder) const override { 6177 DefineStd(Builder, "tce", Opts); 6178 Builder.defineMacro("__TCE__"); 6179 Builder.defineMacro("__TCE_V1__"); 6180 } 6181 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; } 6182 6183 void getTargetBuiltins(const Builtin::Info *&Records, 6184 unsigned &NumRecords) const override {} 6185 const char *getClobbers() const override { return ""; } 6186 BuiltinVaListKind getBuiltinVaListKind() const override { 6187 return TargetInfo::VoidPtrBuiltinVaList; 6188 } 6189 void getGCCRegNames(const char *const *&Names, 6190 unsigned &NumNames) const override {} 6191 bool validateAsmConstraint(const char *&Name, 6192 TargetInfo::ConstraintInfo &info) const override { 6193 return true; 6194 } 6195 void getGCCRegAliases(const GCCRegAlias *&Aliases, 6196 unsigned &NumAliases) const override {} 6197 }; 6198 6199 class BPFTargetInfo : public TargetInfo { 6200 public: 6201 BPFTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) { 6202 LongWidth = LongAlign = PointerWidth = PointerAlign = 64; 6203 SizeType = UnsignedLong; 6204 PtrDiffType = SignedLong; 6205 IntPtrType = SignedLong; 6206 IntMaxType = SignedLong; 6207 Int64Type = SignedLong; 6208 RegParmMax = 5; 6209 if (Triple.getArch() == llvm::Triple::bpfeb) { 6210 BigEndian = true; 6211 DataLayoutString = "E-m:e-p:64:64-i64:64-n32:64-S128"; 6212 } else { 6213 BigEndian = false; 6214 DataLayoutString = "e-m:e-p:64:64-i64:64-n32:64-S128"; 6215 } 6216 MaxAtomicPromoteWidth = 64; 6217 MaxAtomicInlineWidth = 64; 6218 TLSSupported = false; 6219 } 6220 void getTargetDefines(const LangOptions &Opts, 6221 MacroBuilder &Builder) const override { 6222 DefineStd(Builder, "bpf", Opts); 6223 Builder.defineMacro("__BPF__"); 6224 } 6225 bool hasFeature(StringRef Feature) const override { 6226 return Feature == "bpf"; 6227 } 6228 6229 void getTargetBuiltins(const Builtin::Info *&Records, 6230 unsigned &NumRecords) const override {} 6231 const char *getClobbers() const override { 6232 return ""; 6233 } 6234 BuiltinVaListKind getBuiltinVaListKind() const override { 6235 return TargetInfo::VoidPtrBuiltinVaList; 6236 } 6237 void getGCCRegNames(const char * const *&Names, 6238 unsigned &NumNames) const override { 6239 Names = nullptr; 6240 NumNames = 0; 6241 } 6242 bool validateAsmConstraint(const char *&Name, 6243 TargetInfo::ConstraintInfo &info) const override { 6244 return true; 6245 } 6246 void getGCCRegAliases(const GCCRegAlias *&Aliases, 6247 unsigned &NumAliases) const override { 6248 Aliases = nullptr; 6249 NumAliases = 0; 6250 } 6251 }; 6252 6253 class MipsTargetInfoBase : public TargetInfo { 6254 virtual void setDataLayoutString() = 0; 6255 6256 static const Builtin::Info BuiltinInfo[]; 6257 std::string CPU; 6258 bool IsMips16; 6259 bool IsMicromips; 6260 bool IsNan2008; 6261 bool IsSingleFloat; 6262 enum MipsFloatABI { 6263 HardFloat, SoftFloat 6264 } FloatABI; 6265 enum DspRevEnum { 6266 NoDSP, DSP1, DSP2 6267 } DspRev; 6268 bool HasMSA; 6269 6270 protected: 6271 bool HasFP64; 6272 std::string ABI; 6273 6274 public: 6275 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr, 6276 const std::string &CPUStr) 6277 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false), 6278 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat), 6279 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) { 6280 TheCXXABI.set(TargetCXXABI::GenericMIPS); 6281 } 6282 6283 bool isNaN2008Default() const { 6284 return CPU == "mips32r6" || CPU == "mips64r6"; 6285 } 6286 6287 bool isFP64Default() const { 6288 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64"; 6289 } 6290 6291 bool isNan2008() const override { 6292 return IsNan2008; 6293 } 6294 6295 StringRef getABI() const override { return ABI; } 6296 bool setCPU(const std::string &Name) override { 6297 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips || 6298 getTriple().getArch() == llvm::Triple::mipsel; 6299 CPU = Name; 6300 return llvm::StringSwitch<bool>(Name) 6301 .Case("mips1", IsMips32) 6302 .Case("mips2", IsMips32) 6303 .Case("mips3", true) 6304 .Case("mips4", true) 6305 .Case("mips5", true) 6306 .Case("mips32", IsMips32) 6307 .Case("mips32r2", IsMips32) 6308 .Case("mips32r3", IsMips32) 6309 .Case("mips32r5", IsMips32) 6310 .Case("mips32r6", IsMips32) 6311 .Case("mips64", true) 6312 .Case("mips64r2", true) 6313 .Case("mips64r3", true) 6314 .Case("mips64r5", true) 6315 .Case("mips64r6", true) 6316 .Case("octeon", true) 6317 .Default(false); 6318 } 6319 const std::string& getCPU() const { return CPU; } 6320 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, 6321 StringRef CPU, 6322 std::vector<std::string> &FeaturesVec) const override { 6323 if (CPU == "octeon") 6324 Features["mips64r2"] = Features["cnmips"] = true; 6325 else 6326 Features[CPU] = true; 6327 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec); 6328 } 6329 6330 void getTargetDefines(const LangOptions &Opts, 6331 MacroBuilder &Builder) const override { 6332 Builder.defineMacro("__mips__"); 6333 Builder.defineMacro("_mips"); 6334 if (Opts.GNUMode) 6335 Builder.defineMacro("mips"); 6336 6337 Builder.defineMacro("__REGISTER_PREFIX__", ""); 6338 6339 switch (FloatABI) { 6340 case HardFloat: 6341 Builder.defineMacro("__mips_hard_float", Twine(1)); 6342 break; 6343 case SoftFloat: 6344 Builder.defineMacro("__mips_soft_float", Twine(1)); 6345 break; 6346 } 6347 6348 if (IsSingleFloat) 6349 Builder.defineMacro("__mips_single_float", Twine(1)); 6350 6351 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32)); 6352 Builder.defineMacro("_MIPS_FPSET", 6353 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2))); 6354 6355 if (IsMips16) 6356 Builder.defineMacro("__mips16", Twine(1)); 6357 6358 if (IsMicromips) 6359 Builder.defineMacro("__mips_micromips", Twine(1)); 6360 6361 if (IsNan2008) 6362 Builder.defineMacro("__mips_nan2008", Twine(1)); 6363 6364 switch (DspRev) { 6365 default: 6366 break; 6367 case DSP1: 6368 Builder.defineMacro("__mips_dsp_rev", Twine(1)); 6369 Builder.defineMacro("__mips_dsp", Twine(1)); 6370 break; 6371 case DSP2: 6372 Builder.defineMacro("__mips_dsp_rev", Twine(2)); 6373 Builder.defineMacro("__mips_dspr2", Twine(1)); 6374 Builder.defineMacro("__mips_dsp", Twine(1)); 6375 break; 6376 } 6377 6378 if (HasMSA) 6379 Builder.defineMacro("__mips_msa", Twine(1)); 6380 6381 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0))); 6382 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth())); 6383 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth())); 6384 6385 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\""); 6386 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper()); 6387 } 6388 6389 void getTargetBuiltins(const Builtin::Info *&Records, 6390 unsigned &NumRecords) const override { 6391 Records = BuiltinInfo; 6392 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin; 6393 } 6394 bool hasFeature(StringRef Feature) const override { 6395 return llvm::StringSwitch<bool>(Feature) 6396 .Case("mips", true) 6397 .Case("fp64", HasFP64) 6398 .Default(false); 6399 } 6400 BuiltinVaListKind getBuiltinVaListKind() const override { 6401 return TargetInfo::VoidPtrBuiltinVaList; 6402 } 6403 void getGCCRegNames(const char * const *&Names, 6404 unsigned &NumNames) const override { 6405 static const char *const GCCRegNames[] = { 6406 // CPU register names 6407 // Must match second column of GCCRegAliases 6408 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7", 6409 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", 6410 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23", 6411 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31", 6412 // Floating point register names 6413 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7", 6414 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15", 6415 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23", 6416 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31", 6417 // Hi/lo and condition register names 6418 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4", 6419 "$fcc5","$fcc6","$fcc7", 6420 // MSA register names 6421 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7", 6422 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15", 6423 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23", 6424 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31", 6425 // MSA control register names 6426 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify", 6427 "$msarequest", "$msamap", "$msaunmap" 6428 }; 6429 Names = GCCRegNames; 6430 NumNames = llvm::array_lengthof(GCCRegNames); 6431 } 6432 void getGCCRegAliases(const GCCRegAlias *&Aliases, 6433 unsigned &NumAliases) const override = 0; 6434 bool validateAsmConstraint(const char *&Name, 6435 TargetInfo::ConstraintInfo &Info) const override { 6436 switch (*Name) { 6437 default: 6438 return false; 6439 case 'r': // CPU registers. 6440 case 'd': // Equivalent to "r" unless generating MIPS16 code. 6441 case 'y': // Equivalent to "r", backward compatibility only. 6442 case 'f': // floating-point registers. 6443 case 'c': // $25 for indirect jumps 6444 case 'l': // lo register 6445 case 'x': // hilo register pair 6446 Info.setAllowsRegister(); 6447 return true; 6448 case 'I': // Signed 16-bit constant 6449 case 'J': // Integer 0 6450 case 'K': // Unsigned 16-bit constant 6451 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui) 6452 case 'M': // Constants not loadable via lui, addiu, or ori 6453 case 'N': // Constant -1 to -65535 6454 case 'O': // A signed 15-bit constant 6455 case 'P': // A constant between 1 go 65535 6456 return true; 6457 case 'R': // An address that can be used in a non-macro load or store 6458 Info.setAllowsMemory(); 6459 return true; 6460 case 'Z': 6461 if (Name[1] == 'C') { // An address usable by ll, and sc. 6462 Info.setAllowsMemory(); 6463 Name++; // Skip over 'Z'. 6464 return true; 6465 } 6466 return false; 6467 } 6468 } 6469 6470 std::string convertConstraint(const char *&Constraint) const override { 6471 std::string R; 6472 switch (*Constraint) { 6473 case 'Z': // Two-character constraint; add "^" hint for later parsing. 6474 if (Constraint[1] == 'C') { 6475 R = std::string("^") + std::string(Constraint, 2); 6476 Constraint++; 6477 return R; 6478 } 6479 break; 6480 } 6481 return TargetInfo::convertConstraint(Constraint); 6482 } 6483 6484 const char *getClobbers() const override { 6485 // In GCC, $1 is not widely used in generated code (it's used only in a few 6486 // specific situations), so there is no real need for users to add it to 6487 // the clobbers list if they want to use it in their inline assembly code. 6488 // 6489 // In LLVM, $1 is treated as a normal GPR and is always allocatable during 6490 // code generation, so using it in inline assembly without adding it to the 6491 // clobbers list can cause conflicts between the inline assembly code and 6492 // the surrounding generated code. 6493 // 6494 // Another problem is that LLVM is allowed to choose $1 for inline assembly 6495 // operands, which will conflict with the ".set at" assembler option (which 6496 // we use only for inline assembly, in order to maintain compatibility with 6497 // GCC) and will also conflict with the user's usage of $1. 6498 // 6499 // The easiest way to avoid these conflicts and keep $1 as an allocatable 6500 // register for generated code is to automatically clobber $1 for all inline 6501 // assembly code. 6502 // 6503 // FIXME: We should automatically clobber $1 only for inline assembly code 6504 // which actually uses it. This would allow LLVM to use $1 for inline 6505 // assembly operands if the user's assembly code doesn't use it. 6506 return "~{$1}"; 6507 } 6508 6509 bool handleTargetFeatures(std::vector<std::string> &Features, 6510 DiagnosticsEngine &Diags) override { 6511 IsMips16 = false; 6512 IsMicromips = false; 6513 IsNan2008 = isNaN2008Default(); 6514 IsSingleFloat = false; 6515 FloatABI = HardFloat; 6516 DspRev = NoDSP; 6517 HasFP64 = isFP64Default(); 6518 6519 for (const auto &Feature : Features) { 6520 if (Feature == "+single-float") 6521 IsSingleFloat = true; 6522 else if (Feature == "+soft-float") 6523 FloatABI = SoftFloat; 6524 else if (Feature == "+mips16") 6525 IsMips16 = true; 6526 else if (Feature == "+micromips") 6527 IsMicromips = true; 6528 else if (Feature == "+dsp") 6529 DspRev = std::max(DspRev, DSP1); 6530 else if (Feature == "+dspr2") 6531 DspRev = std::max(DspRev, DSP2); 6532 else if (Feature == "+msa") 6533 HasMSA = true; 6534 else if (Feature == "+fp64") 6535 HasFP64 = true; 6536 else if (Feature == "-fp64") 6537 HasFP64 = false; 6538 else if (Feature == "+nan2008") 6539 IsNan2008 = true; 6540 else if (Feature == "-nan2008") 6541 IsNan2008 = false; 6542 } 6543 6544 setDataLayoutString(); 6545 6546 return true; 6547 } 6548 6549 int getEHDataRegisterNumber(unsigned RegNo) const override { 6550 if (RegNo == 0) return 4; 6551 if (RegNo == 1) return 5; 6552 return -1; 6553 } 6554 6555 bool isCLZForZeroUndef() const override { return false; } 6556 }; 6557 6558 const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = { 6559 #define BUILTIN(ID, TYPE, ATTRS) \ 6560 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr }, 6561 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \ 6562 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr }, 6563 #include "clang/Basic/BuiltinsMips.def" 6564 }; 6565 6566 class Mips32TargetInfoBase : public MipsTargetInfoBase { 6567 public: 6568 Mips32TargetInfoBase(const llvm::Triple &Triple) 6569 : MipsTargetInfoBase(Triple, "o32", "mips32r2") { 6570 SizeType = UnsignedInt; 6571 PtrDiffType = SignedInt; 6572 Int64Type = SignedLongLong; 6573 IntMaxType = Int64Type; 6574 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32; 6575 } 6576 bool setABI(const std::string &Name) override { 6577 if (Name == "o32" || Name == "eabi") { 6578 ABI = Name; 6579 return true; 6580 } 6581 return false; 6582 } 6583 void getTargetDefines(const LangOptions &Opts, 6584 MacroBuilder &Builder) const override { 6585 MipsTargetInfoBase::getTargetDefines(Opts, Builder); 6586 6587 Builder.defineMacro("__mips", "32"); 6588 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32"); 6589 6590 const std::string& CPUStr = getCPU(); 6591 if (CPUStr == "mips32") 6592 Builder.defineMacro("__mips_isa_rev", "1"); 6593 else if (CPUStr == "mips32r2") 6594 Builder.defineMacro("__mips_isa_rev", "2"); 6595 else if (CPUStr == "mips32r3") 6596 Builder.defineMacro("__mips_isa_rev", "3"); 6597 else if (CPUStr == "mips32r5") 6598 Builder.defineMacro("__mips_isa_rev", "5"); 6599 else if (CPUStr == "mips32r6") 6600 Builder.defineMacro("__mips_isa_rev", "6"); 6601 6602 if (ABI == "o32") { 6603 Builder.defineMacro("__mips_o32"); 6604 Builder.defineMacro("_ABIO32", "1"); 6605 Builder.defineMacro("_MIPS_SIM", "_ABIO32"); 6606 } 6607 else if (ABI == "eabi") 6608 Builder.defineMacro("__mips_eabi"); 6609 else 6610 llvm_unreachable("Invalid ABI for Mips32."); 6611 } 6612 void getGCCRegAliases(const GCCRegAlias *&Aliases, 6613 unsigned &NumAliases) const override { 6614 static const TargetInfo::GCCRegAlias GCCRegAliases[] = { 6615 { { "at" }, "$1" }, 6616 { { "v0" }, "$2" }, 6617 { { "v1" }, "$3" }, 6618 { { "a0" }, "$4" }, 6619 { { "a1" }, "$5" }, 6620 { { "a2" }, "$6" }, 6621 { { "a3" }, "$7" }, 6622 { { "t0" }, "$8" }, 6623 { { "t1" }, "$9" }, 6624 { { "t2" }, "$10" }, 6625 { { "t3" }, "$11" }, 6626 { { "t4" }, "$12" }, 6627 { { "t5" }, "$13" }, 6628 { { "t6" }, "$14" }, 6629 { { "t7" }, "$15" }, 6630 { { "s0" }, "$16" }, 6631 { { "s1" }, "$17" }, 6632 { { "s2" }, "$18" }, 6633 { { "s3" }, "$19" }, 6634 { { "s4" }, "$20" }, 6635 { { "s5" }, "$21" }, 6636 { { "s6" }, "$22" }, 6637 { { "s7" }, "$23" }, 6638 { { "t8" }, "$24" }, 6639 { { "t9" }, "$25" }, 6640 { { "k0" }, "$26" }, 6641 { { "k1" }, "$27" }, 6642 { { "gp" }, "$28" }, 6643 { { "sp","$sp" }, "$29" }, 6644 { { "fp","$fp" }, "$30" }, 6645 { { "ra" }, "$31" } 6646 }; 6647 Aliases = GCCRegAliases; 6648 NumAliases = llvm::array_lengthof(GCCRegAliases); 6649 } 6650 }; 6651 6652 class Mips32EBTargetInfo : public Mips32TargetInfoBase { 6653 void setDataLayoutString() override { 6654 DataLayoutString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64"; 6655 } 6656 6657 public: 6658 Mips32EBTargetInfo(const llvm::Triple &Triple) 6659 : Mips32TargetInfoBase(Triple) { 6660 } 6661 void getTargetDefines(const LangOptions &Opts, 6662 MacroBuilder &Builder) const override { 6663 DefineStd(Builder, "MIPSEB", Opts); 6664 Builder.defineMacro("_MIPSEB"); 6665 Mips32TargetInfoBase::getTargetDefines(Opts, Builder); 6666 } 6667 }; 6668 6669 class Mips32ELTargetInfo : public Mips32TargetInfoBase { 6670 void setDataLayoutString() override { 6671 DataLayoutString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64"; 6672 } 6673 6674 public: 6675 Mips32ELTargetInfo(const llvm::Triple &Triple) 6676 : Mips32TargetInfoBase(Triple) { 6677 BigEndian = false; 6678 } 6679 void getTargetDefines(const LangOptions &Opts, 6680 MacroBuilder &Builder) const override { 6681 DefineStd(Builder, "MIPSEL", Opts); 6682 Builder.defineMacro("_MIPSEL"); 6683 Mips32TargetInfoBase::getTargetDefines(Opts, Builder); 6684 } 6685 }; 6686 6687 class Mips64TargetInfoBase : public MipsTargetInfoBase { 6688 public: 6689 Mips64TargetInfoBase(const llvm::Triple &Triple) 6690 : MipsTargetInfoBase(Triple, "n64", "mips64r2") { 6691 LongDoubleWidth = LongDoubleAlign = 128; 6692 LongDoubleFormat = &llvm::APFloat::IEEEquad; 6693 if (getTriple().getOS() == llvm::Triple::FreeBSD) { 6694 LongDoubleWidth = LongDoubleAlign = 64; 6695 LongDoubleFormat = &llvm::APFloat::IEEEdouble; 6696 } 6697 setN64ABITypes(); 6698 SuitableAlign = 128; 6699 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64; 6700 } 6701 6702 void setN64ABITypes() { 6703 LongWidth = LongAlign = 64; 6704 PointerWidth = PointerAlign = 64; 6705 SizeType = UnsignedLong; 6706 PtrDiffType = SignedLong; 6707 Int64Type = SignedLong; 6708 IntMaxType = Int64Type; 6709 } 6710 6711 void setN32ABITypes() { 6712 LongWidth = LongAlign = 32; 6713 PointerWidth = PointerAlign = 32; 6714 SizeType = UnsignedInt; 6715 PtrDiffType = SignedInt; 6716 Int64Type = SignedLongLong; 6717 IntMaxType = Int64Type; 6718 } 6719 6720 bool setABI(const std::string &Name) override { 6721 if (Name == "n32") { 6722 setN32ABITypes(); 6723 ABI = Name; 6724 return true; 6725 } 6726 if (Name == "n64") { 6727 setN64ABITypes(); 6728 ABI = Name; 6729 return true; 6730 } 6731 return false; 6732 } 6733 6734 void getTargetDefines(const LangOptions &Opts, 6735 MacroBuilder &Builder) const override { 6736 MipsTargetInfoBase::getTargetDefines(Opts, Builder); 6737 6738 Builder.defineMacro("__mips", "64"); 6739 Builder.defineMacro("__mips64"); 6740 Builder.defineMacro("__mips64__"); 6741 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64"); 6742 6743 const std::string& CPUStr = getCPU(); 6744 if (CPUStr == "mips64") 6745 Builder.defineMacro("__mips_isa_rev", "1"); 6746 else if (CPUStr == "mips64r2") 6747 Builder.defineMacro("__mips_isa_rev", "2"); 6748 else if (CPUStr == "mips64r3") 6749 Builder.defineMacro("__mips_isa_rev", "3"); 6750 else if (CPUStr == "mips64r5") 6751 Builder.defineMacro("__mips_isa_rev", "5"); 6752 else if (CPUStr == "mips64r6") 6753 Builder.defineMacro("__mips_isa_rev", "6"); 6754 6755 if (ABI == "n32") { 6756 Builder.defineMacro("__mips_n32"); 6757 Builder.defineMacro("_ABIN32", "2"); 6758 Builder.defineMacro("_MIPS_SIM", "_ABIN32"); 6759 } 6760 else if (ABI == "n64") { 6761 Builder.defineMacro("__mips_n64"); 6762 Builder.defineMacro("_ABI64", "3"); 6763 Builder.defineMacro("_MIPS_SIM", "_ABI64"); 6764 } 6765 else 6766 llvm_unreachable("Invalid ABI for Mips64."); 6767 } 6768 void getGCCRegAliases(const GCCRegAlias *&Aliases, 6769 unsigned &NumAliases) const override { 6770 static const TargetInfo::GCCRegAlias GCCRegAliases[] = { 6771 { { "at" }, "$1" }, 6772 { { "v0" }, "$2" }, 6773 { { "v1" }, "$3" }, 6774 { { "a0" }, "$4" }, 6775 { { "a1" }, "$5" }, 6776 { { "a2" }, "$6" }, 6777 { { "a3" }, "$7" }, 6778 { { "a4" }, "$8" }, 6779 { { "a5" }, "$9" }, 6780 { { "a6" }, "$10" }, 6781 { { "a7" }, "$11" }, 6782 { { "t0" }, "$12" }, 6783 { { "t1" }, "$13" }, 6784 { { "t2" }, "$14" }, 6785 { { "t3" }, "$15" }, 6786 { { "s0" }, "$16" }, 6787 { { "s1" }, "$17" }, 6788 { { "s2" }, "$18" }, 6789 { { "s3" }, "$19" }, 6790 { { "s4" }, "$20" }, 6791 { { "s5" }, "$21" }, 6792 { { "s6" }, "$22" }, 6793 { { "s7" }, "$23" }, 6794 { { "t8" }, "$24" }, 6795 { { "t9" }, "$25" }, 6796 { { "k0" }, "$26" }, 6797 { { "k1" }, "$27" }, 6798 { { "gp" }, "$28" }, 6799 { { "sp","$sp" }, "$29" }, 6800 { { "fp","$fp" }, "$30" }, 6801 { { "ra" }, "$31" } 6802 }; 6803 Aliases = GCCRegAliases; 6804 NumAliases = llvm::array_lengthof(GCCRegAliases); 6805 } 6806 6807 bool hasInt128Type() const override { return true; } 6808 }; 6809 6810 class Mips64EBTargetInfo : public Mips64TargetInfoBase { 6811 void setDataLayoutString() override { 6812 if (ABI == "n32") 6813 DataLayoutString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128"; 6814 else 6815 DataLayoutString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128"; 6816 6817 } 6818 6819 public: 6820 Mips64EBTargetInfo(const llvm::Triple &Triple) 6821 : Mips64TargetInfoBase(Triple) {} 6822 void getTargetDefines(const LangOptions &Opts, 6823 MacroBuilder &Builder) const override { 6824 DefineStd(Builder, "MIPSEB", Opts); 6825 Builder.defineMacro("_MIPSEB"); 6826 Mips64TargetInfoBase::getTargetDefines(Opts, Builder); 6827 } 6828 }; 6829 6830 class Mips64ELTargetInfo : public Mips64TargetInfoBase { 6831 void setDataLayoutString() override { 6832 if (ABI == "n32") 6833 DataLayoutString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128"; 6834 else 6835 DataLayoutString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128"; 6836 } 6837 public: 6838 Mips64ELTargetInfo(const llvm::Triple &Triple) 6839 : Mips64TargetInfoBase(Triple) { 6840 // Default ABI is n64. 6841 BigEndian = false; 6842 } 6843 void getTargetDefines(const LangOptions &Opts, 6844 MacroBuilder &Builder) const override { 6845 DefineStd(Builder, "MIPSEL", Opts); 6846 Builder.defineMacro("_MIPSEL"); 6847 Mips64TargetInfoBase::getTargetDefines(Opts, Builder); 6848 } 6849 }; 6850 6851 class PNaClTargetInfo : public TargetInfo { 6852 public: 6853 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) { 6854 BigEndian = false; 6855 this->UserLabelPrefix = ""; 6856 this->LongAlign = 32; 6857 this->LongWidth = 32; 6858 this->PointerAlign = 32; 6859 this->PointerWidth = 32; 6860 this->IntMaxType = TargetInfo::SignedLongLong; 6861 this->Int64Type = TargetInfo::SignedLongLong; 6862 this->DoubleAlign = 64; 6863 this->LongDoubleWidth = 64; 6864 this->LongDoubleAlign = 64; 6865 this->SizeType = TargetInfo::UnsignedInt; 6866 this->PtrDiffType = TargetInfo::SignedInt; 6867 this->IntPtrType = TargetInfo::SignedInt; 6868 this->RegParmMax = 0; // Disallow regparm 6869 } 6870 6871 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const { 6872 Builder.defineMacro("__le32__"); 6873 Builder.defineMacro("__pnacl__"); 6874 } 6875 void getTargetDefines(const LangOptions &Opts, 6876 MacroBuilder &Builder) const override { 6877 getArchDefines(Opts, Builder); 6878 } 6879 bool hasFeature(StringRef Feature) const override { 6880 return Feature == "pnacl"; 6881 } 6882 void getTargetBuiltins(const Builtin::Info *&Records, 6883 unsigned &NumRecords) const override { 6884 } 6885 BuiltinVaListKind getBuiltinVaListKind() const override { 6886 return TargetInfo::PNaClABIBuiltinVaList; 6887 } 6888 void getGCCRegNames(const char * const *&Names, 6889 unsigned &NumNames) const override; 6890 void getGCCRegAliases(const GCCRegAlias *&Aliases, 6891 unsigned &NumAliases) const override; 6892 bool validateAsmConstraint(const char *&Name, 6893 TargetInfo::ConstraintInfo &Info) const override { 6894 return false; 6895 } 6896 6897 const char *getClobbers() const override { 6898 return ""; 6899 } 6900 }; 6901 6902 void PNaClTargetInfo::getGCCRegNames(const char * const *&Names, 6903 unsigned &NumNames) const { 6904 Names = nullptr; 6905 NumNames = 0; 6906 } 6907 6908 void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases, 6909 unsigned &NumAliases) const { 6910 Aliases = nullptr; 6911 NumAliases = 0; 6912 } 6913 6914 // We attempt to use PNaCl (le32) frontend and Mips32EL backend. 6915 class NaClMips32ELTargetInfo : public Mips32ELTargetInfo { 6916 public: 6917 NaClMips32ELTargetInfo(const llvm::Triple &Triple) : 6918 Mips32ELTargetInfo(Triple) { 6919 } 6920 6921 BuiltinVaListKind getBuiltinVaListKind() const override { 6922 return TargetInfo::PNaClABIBuiltinVaList; 6923 } 6924 }; 6925 6926 class Le64TargetInfo : public TargetInfo { 6927 static const Builtin::Info BuiltinInfo[]; 6928 6929 public: 6930 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) { 6931 BigEndian = false; 6932 NoAsmVariants = true; 6933 LongWidth = LongAlign = PointerWidth = PointerAlign = 64; 6934 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64; 6935 DataLayoutString = "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128"; 6936 } 6937 6938 void getTargetDefines(const LangOptions &Opts, 6939 MacroBuilder &Builder) const override { 6940 DefineStd(Builder, "unix", Opts); 6941 defineCPUMacros(Builder, "le64", /*Tuning=*/false); 6942 Builder.defineMacro("__ELF__"); 6943 } 6944 void getTargetBuiltins(const Builtin::Info *&Records, 6945 unsigned &NumRecords) const override { 6946 Records = BuiltinInfo; 6947 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin; 6948 } 6949 BuiltinVaListKind getBuiltinVaListKind() const override { 6950 return TargetInfo::PNaClABIBuiltinVaList; 6951 } 6952 const char *getClobbers() const override { return ""; } 6953 void getGCCRegNames(const char *const *&Names, 6954 unsigned &NumNames) const override { 6955 Names = nullptr; 6956 NumNames = 0; 6957 } 6958 void getGCCRegAliases(const GCCRegAlias *&Aliases, 6959 unsigned &NumAliases) const override { 6960 Aliases = nullptr; 6961 NumAliases = 0; 6962 } 6963 bool validateAsmConstraint(const char *&Name, 6964 TargetInfo::ConstraintInfo &Info) const override { 6965 return false; 6966 } 6967 6968 bool hasProtectedVisibility() const override { return false; } 6969 }; 6970 6971 class WebAssemblyTargetInfo : public TargetInfo { 6972 static const Builtin::Info BuiltinInfo[]; 6973 6974 enum SIMDEnum { 6975 NoSIMD, 6976 SIMD128, 6977 } SIMDLevel; 6978 6979 public: 6980 explicit WebAssemblyTargetInfo(const llvm::Triple &T) 6981 : TargetInfo(T), SIMDLevel(NoSIMD) { 6982 BigEndian = false; 6983 NoAsmVariants = true; 6984 SuitableAlign = 128; 6985 LargeArrayMinWidth = 128; 6986 LargeArrayAlign = 128; 6987 SimdDefaultAlign = 128; 6988 SigAtomicType = SignedLong; 6989 } 6990 6991 protected: 6992 void getTargetDefines(const LangOptions &Opts, 6993 MacroBuilder &Builder) const override { 6994 defineCPUMacros(Builder, "wasm", /*Tuning=*/false); 6995 if (SIMDLevel >= SIMD128) 6996 Builder.defineMacro("__wasm_simd128__"); 6997 } 6998 6999 private: 7000 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, 7001 StringRef CPU, 7002 std::vector<std::string> &FeaturesVec) const override { 7003 if (CPU == "bleeding-edge") 7004 Features["simd128"] = true; 7005 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec); 7006 } 7007 bool hasFeature(StringRef Feature) const final { 7008 return llvm::StringSwitch<bool>(Feature) 7009 .Case("simd128", SIMDLevel >= SIMD128) 7010 .Default(false); 7011 } 7012 bool handleTargetFeatures(std::vector<std::string> &Features, 7013 DiagnosticsEngine &Diags) final { 7014 for (const auto &Feature : Features) { 7015 if (Feature == "+simd128") { 7016 SIMDLevel = std::max(SIMDLevel, SIMD128); 7017 continue; 7018 } 7019 if (Feature == "-simd128") { 7020 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1)); 7021 continue; 7022 } 7023 7024 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature 7025 << "-target-feature"; 7026 return false; 7027 } 7028 return true; 7029 } 7030 bool setCPU(const std::string &Name) final { 7031 return llvm::StringSwitch<bool>(Name) 7032 .Case("mvp", true) 7033 .Case("bleeding-edge", true) 7034 .Case("generic", true) 7035 .Default(false); 7036 } 7037 void getTargetBuiltins(const Builtin::Info *&Records, 7038 unsigned &NumRecords) const final { 7039 Records = BuiltinInfo; 7040 NumRecords = clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin; 7041 } 7042 BuiltinVaListKind getBuiltinVaListKind() const final { 7043 // TODO: Implement va_list properly. 7044 return VoidPtrBuiltinVaList; 7045 } 7046 void getGCCRegNames(const char *const *&Names, 7047 unsigned &NumNames) const final { 7048 Names = nullptr; 7049 NumNames = 0; 7050 } 7051 void getGCCRegAliases(const GCCRegAlias *&Aliases, 7052 unsigned &NumAliases) const final { 7053 Aliases = nullptr; 7054 NumAliases = 0; 7055 } 7056 bool 7057 validateAsmConstraint(const char *&Name, 7058 TargetInfo::ConstraintInfo &Info) const final { 7059 return false; 7060 } 7061 const char *getClobbers() const final { return ""; } 7062 bool isCLZForZeroUndef() const final { return false; } 7063 bool hasInt128Type() const final { return true; } 7064 IntType getIntTypeByWidth(unsigned BitWidth, 7065 bool IsSigned) const final { 7066 // WebAssembly prefers long long for explicitly 64-bit integers. 7067 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong) 7068 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned); 7069 } 7070 IntType getLeastIntTypeByWidth(unsigned BitWidth, 7071 bool IsSigned) const final { 7072 // WebAssembly uses long long for int_least64_t and int_fast64_t. 7073 return BitWidth == 64 7074 ? (IsSigned ? SignedLongLong : UnsignedLongLong) 7075 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned); 7076 } 7077 }; 7078 7079 const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = { 7080 #define BUILTIN(ID, TYPE, ATTRS) \ 7081 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr }, 7082 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \ 7083 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr }, 7084 #include "clang/Basic/BuiltinsWebAssembly.def" 7085 }; 7086 7087 class WebAssembly32TargetInfo : public WebAssemblyTargetInfo { 7088 public: 7089 explicit WebAssembly32TargetInfo(const llvm::Triple &T) 7090 : WebAssemblyTargetInfo(T) { 7091 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32; 7092 DataLayoutString = "e-p:32:32-i64:64-n32:64-S128"; 7093 } 7094 7095 protected: 7096 void getTargetDefines(const LangOptions &Opts, 7097 MacroBuilder &Builder) const override { 7098 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder); 7099 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false); 7100 } 7101 }; 7102 7103 class WebAssembly64TargetInfo : public WebAssemblyTargetInfo { 7104 public: 7105 explicit WebAssembly64TargetInfo(const llvm::Triple &T) 7106 : WebAssemblyTargetInfo(T) { 7107 LongAlign = LongWidth = 64; 7108 PointerAlign = PointerWidth = 64; 7109 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64; 7110 DataLayoutString = "e-p:64:64-i64:64-n32:64-S128"; 7111 } 7112 7113 protected: 7114 void getTargetDefines(const LangOptions &Opts, 7115 MacroBuilder &Builder) const override { 7116 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder); 7117 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false); 7118 } 7119 }; 7120 7121 const Builtin::Info Le64TargetInfo::BuiltinInfo[] = { 7122 #define BUILTIN(ID, TYPE, ATTRS) \ 7123 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr }, 7124 #include "clang/Basic/BuiltinsLe64.def" 7125 }; 7126 7127 static const unsigned SPIRAddrSpaceMap[] = { 7128 1, // opencl_global 7129 3, // opencl_local 7130 2, // opencl_constant 7131 4, // opencl_generic 7132 0, // cuda_device 7133 0, // cuda_constant 7134 0 // cuda_shared 7135 }; 7136 class SPIRTargetInfo : public TargetInfo { 7137 public: 7138 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) { 7139 assert(getTriple().getOS() == llvm::Triple::UnknownOS && 7140 "SPIR target must use unknown OS"); 7141 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment && 7142 "SPIR target must use unknown environment type"); 7143 BigEndian = false; 7144 TLSSupported = false; 7145 LongWidth = LongAlign = 64; 7146 AddrSpaceMap = &SPIRAddrSpaceMap; 7147 UseAddrSpaceMapMangling = true; 7148 // Define available target features 7149 // These must be defined in sorted order! 7150 NoAsmVariants = true; 7151 } 7152 void getTargetDefines(const LangOptions &Opts, 7153 MacroBuilder &Builder) const override { 7154 DefineStd(Builder, "SPIR", Opts); 7155 } 7156 bool hasFeature(StringRef Feature) const override { 7157 return Feature == "spir"; 7158 } 7159 7160 void getTargetBuiltins(const Builtin::Info *&Records, 7161 unsigned &NumRecords) const override {} 7162 const char *getClobbers() const override { return ""; } 7163 void getGCCRegNames(const char *const *&Names, 7164 unsigned &NumNames) const override {} 7165 bool validateAsmConstraint(const char *&Name, 7166 TargetInfo::ConstraintInfo &info) const override { 7167 return true; 7168 } 7169 void getGCCRegAliases(const GCCRegAlias *&Aliases, 7170 unsigned &NumAliases) const override {} 7171 BuiltinVaListKind getBuiltinVaListKind() const override { 7172 return TargetInfo::VoidPtrBuiltinVaList; 7173 } 7174 7175 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override { 7176 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK 7177 : CCCR_Warning; 7178 } 7179 7180 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override { 7181 return CC_SpirFunction; 7182 } 7183 }; 7184 7185 class SPIR32TargetInfo : public SPIRTargetInfo { 7186 public: 7187 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) { 7188 PointerWidth = PointerAlign = 32; 7189 SizeType = TargetInfo::UnsignedInt; 7190 PtrDiffType = IntPtrType = TargetInfo::SignedInt; 7191 DataLayoutString = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-" 7192 "v96:128-v192:256-v256:256-v512:512-v1024:1024"; 7193 } 7194 void getTargetDefines(const LangOptions &Opts, 7195 MacroBuilder &Builder) const override { 7196 DefineStd(Builder, "SPIR32", Opts); 7197 } 7198 }; 7199 7200 class SPIR64TargetInfo : public SPIRTargetInfo { 7201 public: 7202 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) { 7203 PointerWidth = PointerAlign = 64; 7204 SizeType = TargetInfo::UnsignedLong; 7205 PtrDiffType = IntPtrType = TargetInfo::SignedLong; 7206 DataLayoutString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-" 7207 "v96:128-v192:256-v256:256-v512:512-v1024:1024"; 7208 } 7209 void getTargetDefines(const LangOptions &Opts, 7210 MacroBuilder &Builder) const override { 7211 DefineStd(Builder, "SPIR64", Opts); 7212 } 7213 }; 7214 7215 class XCoreTargetInfo : public TargetInfo { 7216 static const Builtin::Info BuiltinInfo[]; 7217 public: 7218 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) { 7219 BigEndian = false; 7220 NoAsmVariants = true; 7221 LongLongAlign = 32; 7222 SuitableAlign = 32; 7223 DoubleAlign = LongDoubleAlign = 32; 7224 SizeType = UnsignedInt; 7225 PtrDiffType = SignedInt; 7226 IntPtrType = SignedInt; 7227 WCharType = UnsignedChar; 7228 WIntType = UnsignedInt; 7229 UseZeroLengthBitfieldAlignment = true; 7230 DataLayoutString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32" 7231 "-f64:32-a:0:32-n32"; 7232 } 7233 void getTargetDefines(const LangOptions &Opts, 7234 MacroBuilder &Builder) const override { 7235 Builder.defineMacro("__XS1B__"); 7236 } 7237 void getTargetBuiltins(const Builtin::Info *&Records, 7238 unsigned &NumRecords) const override { 7239 Records = BuiltinInfo; 7240 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin; 7241 } 7242 BuiltinVaListKind getBuiltinVaListKind() const override { 7243 return TargetInfo::VoidPtrBuiltinVaList; 7244 } 7245 const char *getClobbers() const override { 7246 return ""; 7247 } 7248 void getGCCRegNames(const char * const *&Names, 7249 unsigned &NumNames) const override { 7250 static const char * const GCCRegNames[] = { 7251 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", 7252 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr" 7253 }; 7254 Names = GCCRegNames; 7255 NumNames = llvm::array_lengthof(GCCRegNames); 7256 } 7257 void getGCCRegAliases(const GCCRegAlias *&Aliases, 7258 unsigned &NumAliases) const override { 7259 Aliases = nullptr; 7260 NumAliases = 0; 7261 } 7262 bool validateAsmConstraint(const char *&Name, 7263 TargetInfo::ConstraintInfo &Info) const override { 7264 return false; 7265 } 7266 int getEHDataRegisterNumber(unsigned RegNo) const override { 7267 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister 7268 return (RegNo < 2)? RegNo : -1; 7269 } 7270 }; 7271 7272 const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = { 7273 #define BUILTIN(ID, TYPE, ATTRS) \ 7274 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr }, 7275 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \ 7276 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr }, 7277 #include "clang/Basic/BuiltinsXCore.def" 7278 }; 7279 7280 // x86_32 Android target 7281 class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> { 7282 public: 7283 AndroidX86_32TargetInfo(const llvm::Triple &Triple) 7284 : LinuxTargetInfo<X86_32TargetInfo>(Triple) { 7285 SuitableAlign = 32; 7286 LongDoubleWidth = 64; 7287 LongDoubleFormat = &llvm::APFloat::IEEEdouble; 7288 } 7289 }; 7290 7291 // x86_64 Android target 7292 class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> { 7293 public: 7294 AndroidX86_64TargetInfo(const llvm::Triple &Triple) 7295 : LinuxTargetInfo<X86_64TargetInfo>(Triple) { 7296 LongDoubleFormat = &llvm::APFloat::IEEEquad; 7297 } 7298 7299 bool useFloat128ManglingForLongDouble() const override { 7300 return true; 7301 } 7302 }; 7303 } // end anonymous namespace 7304 7305 //===----------------------------------------------------------------------===// 7306 // Driver code 7307 //===----------------------------------------------------------------------===// 7308 7309 static TargetInfo *AllocateTarget(const llvm::Triple &Triple) { 7310 llvm::Triple::OSType os = Triple.getOS(); 7311 7312 switch (Triple.getArch()) { 7313 default: 7314 return nullptr; 7315 7316 case llvm::Triple::xcore: 7317 return new XCoreTargetInfo(Triple); 7318 7319 case llvm::Triple::hexagon: 7320 return new HexagonTargetInfo(Triple); 7321 7322 case llvm::Triple::aarch64: 7323 if (Triple.isOSDarwin()) 7324 return new DarwinAArch64TargetInfo(Triple); 7325 7326 switch (os) { 7327 case llvm::Triple::FreeBSD: 7328 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple); 7329 case llvm::Triple::Linux: 7330 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple); 7331 case llvm::Triple::NetBSD: 7332 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple); 7333 default: 7334 return new AArch64leTargetInfo(Triple); 7335 } 7336 7337 case llvm::Triple::aarch64_be: 7338 switch (os) { 7339 case llvm::Triple::FreeBSD: 7340 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple); 7341 case llvm::Triple::Linux: 7342 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple); 7343 case llvm::Triple::NetBSD: 7344 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple); 7345 default: 7346 return new AArch64beTargetInfo(Triple); 7347 } 7348 7349 case llvm::Triple::arm: 7350 case llvm::Triple::thumb: 7351 if (Triple.isOSBinFormatMachO()) 7352 return new DarwinARMTargetInfo(Triple); 7353 7354 switch (os) { 7355 case llvm::Triple::Linux: 7356 return new LinuxTargetInfo<ARMleTargetInfo>(Triple); 7357 case llvm::Triple::FreeBSD: 7358 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple); 7359 case llvm::Triple::NetBSD: 7360 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple); 7361 case llvm::Triple::OpenBSD: 7362 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple); 7363 case llvm::Triple::Bitrig: 7364 return new BitrigTargetInfo<ARMleTargetInfo>(Triple); 7365 case llvm::Triple::RTEMS: 7366 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple); 7367 case llvm::Triple::NaCl: 7368 return new NaClTargetInfo<ARMleTargetInfo>(Triple); 7369 case llvm::Triple::Win32: 7370 switch (Triple.getEnvironment()) { 7371 case llvm::Triple::Cygnus: 7372 return new CygwinARMTargetInfo(Triple); 7373 case llvm::Triple::GNU: 7374 return new MinGWARMTargetInfo(Triple); 7375 case llvm::Triple::Itanium: 7376 return new ItaniumWindowsARMleTargetInfo(Triple); 7377 case llvm::Triple::MSVC: 7378 default: // Assume MSVC for unknown environments 7379 return new MicrosoftARMleTargetInfo(Triple); 7380 } 7381 default: 7382 return new ARMleTargetInfo(Triple); 7383 } 7384 7385 case llvm::Triple::armeb: 7386 case llvm::Triple::thumbeb: 7387 if (Triple.isOSDarwin()) 7388 return new DarwinARMTargetInfo(Triple); 7389 7390 switch (os) { 7391 case llvm::Triple::Linux: 7392 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple); 7393 case llvm::Triple::FreeBSD: 7394 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple); 7395 case llvm::Triple::NetBSD: 7396 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple); 7397 case llvm::Triple::OpenBSD: 7398 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple); 7399 case llvm::Triple::Bitrig: 7400 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple); 7401 case llvm::Triple::RTEMS: 7402 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple); 7403 case llvm::Triple::NaCl: 7404 return new NaClTargetInfo<ARMbeTargetInfo>(Triple); 7405 default: 7406 return new ARMbeTargetInfo(Triple); 7407 } 7408 7409 case llvm::Triple::bpfeb: 7410 case llvm::Triple::bpfel: 7411 return new BPFTargetInfo(Triple); 7412 7413 case llvm::Triple::msp430: 7414 return new MSP430TargetInfo(Triple); 7415 7416 case llvm::Triple::mips: 7417 switch (os) { 7418 case llvm::Triple::Linux: 7419 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple); 7420 case llvm::Triple::RTEMS: 7421 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple); 7422 case llvm::Triple::FreeBSD: 7423 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple); 7424 case llvm::Triple::NetBSD: 7425 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple); 7426 default: 7427 return new Mips32EBTargetInfo(Triple); 7428 } 7429 7430 case llvm::Triple::mipsel: 7431 switch (os) { 7432 case llvm::Triple::Linux: 7433 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple); 7434 case llvm::Triple::RTEMS: 7435 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple); 7436 case llvm::Triple::FreeBSD: 7437 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple); 7438 case llvm::Triple::NetBSD: 7439 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple); 7440 case llvm::Triple::NaCl: 7441 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple); 7442 default: 7443 return new Mips32ELTargetInfo(Triple); 7444 } 7445 7446 case llvm::Triple::mips64: 7447 switch (os) { 7448 case llvm::Triple::Linux: 7449 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple); 7450 case llvm::Triple::RTEMS: 7451 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple); 7452 case llvm::Triple::FreeBSD: 7453 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple); 7454 case llvm::Triple::NetBSD: 7455 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple); 7456 case llvm::Triple::OpenBSD: 7457 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple); 7458 default: 7459 return new Mips64EBTargetInfo(Triple); 7460 } 7461 7462 case llvm::Triple::mips64el: 7463 switch (os) { 7464 case llvm::Triple::Linux: 7465 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple); 7466 case llvm::Triple::RTEMS: 7467 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple); 7468 case llvm::Triple::FreeBSD: 7469 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple); 7470 case llvm::Triple::NetBSD: 7471 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple); 7472 case llvm::Triple::OpenBSD: 7473 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple); 7474 default: 7475 return new Mips64ELTargetInfo(Triple); 7476 } 7477 7478 case llvm::Triple::le32: 7479 switch (os) { 7480 case llvm::Triple::NaCl: 7481 return new NaClTargetInfo<PNaClTargetInfo>(Triple); 7482 default: 7483 return nullptr; 7484 } 7485 7486 case llvm::Triple::le64: 7487 return new Le64TargetInfo(Triple); 7488 7489 case llvm::Triple::ppc: 7490 if (Triple.isOSDarwin()) 7491 return new DarwinPPC32TargetInfo(Triple); 7492 switch (os) { 7493 case llvm::Triple::Linux: 7494 return new LinuxTargetInfo<PPC32TargetInfo>(Triple); 7495 case llvm::Triple::FreeBSD: 7496 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple); 7497 case llvm::Triple::NetBSD: 7498 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple); 7499 case llvm::Triple::OpenBSD: 7500 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple); 7501 case llvm::Triple::RTEMS: 7502 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple); 7503 default: 7504 return new PPC32TargetInfo(Triple); 7505 } 7506 7507 case llvm::Triple::ppc64: 7508 if (Triple.isOSDarwin()) 7509 return new DarwinPPC64TargetInfo(Triple); 7510 switch (os) { 7511 case llvm::Triple::Linux: 7512 return new LinuxTargetInfo<PPC64TargetInfo>(Triple); 7513 case llvm::Triple::Lv2: 7514 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple); 7515 case llvm::Triple::FreeBSD: 7516 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple); 7517 case llvm::Triple::NetBSD: 7518 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple); 7519 default: 7520 return new PPC64TargetInfo(Triple); 7521 } 7522 7523 case llvm::Triple::ppc64le: 7524 switch (os) { 7525 case llvm::Triple::Linux: 7526 return new LinuxTargetInfo<PPC64TargetInfo>(Triple); 7527 case llvm::Triple::NetBSD: 7528 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple); 7529 default: 7530 return new PPC64TargetInfo(Triple); 7531 } 7532 7533 case llvm::Triple::nvptx: 7534 return new NVPTX32TargetInfo(Triple); 7535 case llvm::Triple::nvptx64: 7536 return new NVPTX64TargetInfo(Triple); 7537 7538 case llvm::Triple::amdgcn: 7539 case llvm::Triple::r600: 7540 return new AMDGPUTargetInfo(Triple); 7541 7542 case llvm::Triple::sparc: 7543 switch (os) { 7544 case llvm::Triple::Linux: 7545 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple); 7546 case llvm::Triple::Solaris: 7547 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple); 7548 case llvm::Triple::NetBSD: 7549 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple); 7550 case llvm::Triple::OpenBSD: 7551 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple); 7552 case llvm::Triple::RTEMS: 7553 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple); 7554 default: 7555 return new SparcV8TargetInfo(Triple); 7556 } 7557 7558 // The 'sparcel' architecture copies all the above cases except for Solaris. 7559 case llvm::Triple::sparcel: 7560 switch (os) { 7561 case llvm::Triple::Linux: 7562 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple); 7563 case llvm::Triple::NetBSD: 7564 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple); 7565 case llvm::Triple::OpenBSD: 7566 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple); 7567 case llvm::Triple::RTEMS: 7568 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple); 7569 default: 7570 return new SparcV8elTargetInfo(Triple); 7571 } 7572 7573 case llvm::Triple::sparcv9: 7574 switch (os) { 7575 case llvm::Triple::Linux: 7576 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple); 7577 case llvm::Triple::Solaris: 7578 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple); 7579 case llvm::Triple::NetBSD: 7580 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple); 7581 case llvm::Triple::OpenBSD: 7582 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple); 7583 case llvm::Triple::FreeBSD: 7584 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple); 7585 default: 7586 return new SparcV9TargetInfo(Triple); 7587 } 7588 7589 case llvm::Triple::systemz: 7590 switch (os) { 7591 case llvm::Triple::Linux: 7592 return new LinuxTargetInfo<SystemZTargetInfo>(Triple); 7593 default: 7594 return new SystemZTargetInfo(Triple); 7595 } 7596 7597 case llvm::Triple::tce: 7598 return new TCETargetInfo(Triple); 7599 7600 case llvm::Triple::x86: 7601 if (Triple.isOSDarwin()) 7602 return new DarwinI386TargetInfo(Triple); 7603 7604 switch (os) { 7605 case llvm::Triple::CloudABI: 7606 return new CloudABITargetInfo<X86_32TargetInfo>(Triple); 7607 case llvm::Triple::Linux: { 7608 switch (Triple.getEnvironment()) { 7609 default: 7610 return new LinuxTargetInfo<X86_32TargetInfo>(Triple); 7611 case llvm::Triple::Android: 7612 return new AndroidX86_32TargetInfo(Triple); 7613 } 7614 } 7615 case llvm::Triple::DragonFly: 7616 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple); 7617 case llvm::Triple::NetBSD: 7618 return new NetBSDI386TargetInfo(Triple); 7619 case llvm::Triple::OpenBSD: 7620 return new OpenBSDI386TargetInfo(Triple); 7621 case llvm::Triple::Bitrig: 7622 return new BitrigI386TargetInfo(Triple); 7623 case llvm::Triple::FreeBSD: 7624 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple); 7625 case llvm::Triple::KFreeBSD: 7626 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple); 7627 case llvm::Triple::Minix: 7628 return new MinixTargetInfo<X86_32TargetInfo>(Triple); 7629 case llvm::Triple::Solaris: 7630 return new SolarisTargetInfo<X86_32TargetInfo>(Triple); 7631 case llvm::Triple::Win32: { 7632 switch (Triple.getEnvironment()) { 7633 case llvm::Triple::Cygnus: 7634 return new CygwinX86_32TargetInfo(Triple); 7635 case llvm::Triple::GNU: 7636 return new MinGWX86_32TargetInfo(Triple); 7637 case llvm::Triple::Itanium: 7638 case llvm::Triple::MSVC: 7639 default: // Assume MSVC for unknown environments 7640 return new MicrosoftX86_32TargetInfo(Triple); 7641 } 7642 } 7643 case llvm::Triple::Haiku: 7644 return new HaikuX86_32TargetInfo(Triple); 7645 case llvm::Triple::RTEMS: 7646 return new RTEMSX86_32TargetInfo(Triple); 7647 case llvm::Triple::NaCl: 7648 return new NaClTargetInfo<X86_32TargetInfo>(Triple); 7649 default: 7650 return new X86_32TargetInfo(Triple); 7651 } 7652 7653 case llvm::Triple::x86_64: 7654 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO()) 7655 return new DarwinX86_64TargetInfo(Triple); 7656 7657 switch (os) { 7658 case llvm::Triple::CloudABI: 7659 return new CloudABITargetInfo<X86_64TargetInfo>(Triple); 7660 case llvm::Triple::Linux: { 7661 switch (Triple.getEnvironment()) { 7662 default: 7663 return new LinuxTargetInfo<X86_64TargetInfo>(Triple); 7664 case llvm::Triple::Android: 7665 return new AndroidX86_64TargetInfo(Triple); 7666 } 7667 } 7668 case llvm::Triple::DragonFly: 7669 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple); 7670 case llvm::Triple::NetBSD: 7671 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple); 7672 case llvm::Triple::OpenBSD: 7673 return new OpenBSDX86_64TargetInfo(Triple); 7674 case llvm::Triple::Bitrig: 7675 return new BitrigX86_64TargetInfo(Triple); 7676 case llvm::Triple::FreeBSD: 7677 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple); 7678 case llvm::Triple::KFreeBSD: 7679 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple); 7680 case llvm::Triple::Solaris: 7681 return new SolarisTargetInfo<X86_64TargetInfo>(Triple); 7682 case llvm::Triple::Win32: { 7683 switch (Triple.getEnvironment()) { 7684 case llvm::Triple::Cygnus: 7685 return new CygwinX86_64TargetInfo(Triple); 7686 case llvm::Triple::GNU: 7687 return new MinGWX86_64TargetInfo(Triple); 7688 case llvm::Triple::MSVC: 7689 default: // Assume MSVC for unknown environments 7690 return new MicrosoftX86_64TargetInfo(Triple); 7691 } 7692 } 7693 case llvm::Triple::NaCl: 7694 return new NaClTargetInfo<X86_64TargetInfo>(Triple); 7695 case llvm::Triple::PS4: 7696 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple); 7697 default: 7698 return new X86_64TargetInfo(Triple); 7699 } 7700 7701 case llvm::Triple::spir: { 7702 if (Triple.getOS() != llvm::Triple::UnknownOS || 7703 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment) 7704 return nullptr; 7705 return new SPIR32TargetInfo(Triple); 7706 } 7707 case llvm::Triple::spir64: { 7708 if (Triple.getOS() != llvm::Triple::UnknownOS || 7709 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment) 7710 return nullptr; 7711 return new SPIR64TargetInfo(Triple); 7712 } 7713 case llvm::Triple::wasm32: 7714 if (!(Triple == llvm::Triple("wasm32-unknown-unknown"))) 7715 return nullptr; 7716 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple); 7717 case llvm::Triple::wasm64: 7718 if (!(Triple == llvm::Triple("wasm64-unknown-unknown"))) 7719 return nullptr; 7720 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple); 7721 } 7722 } 7723 7724 /// CreateTargetInfo - Return the target info object for the specified target 7725 /// options. 7726 TargetInfo * 7727 TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags, 7728 const std::shared_ptr<TargetOptions> &Opts) { 7729 llvm::Triple Triple(Opts->Triple); 7730 7731 // Construct the target 7732 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple)); 7733 if (!Target) { 7734 Diags.Report(diag::err_target_unknown_triple) << Triple.str(); 7735 return nullptr; 7736 } 7737 Target->TargetOpts = Opts; 7738 7739 // Set the target CPU if specified. 7740 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) { 7741 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU; 7742 return nullptr; 7743 } 7744 7745 // Set the target ABI if specified. 7746 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) { 7747 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI; 7748 return nullptr; 7749 } 7750 7751 // Set the fp math unit. 7752 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) { 7753 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath; 7754 return nullptr; 7755 } 7756 7757 // Compute the default target features, we need the target to handle this 7758 // because features may have dependencies on one another. 7759 llvm::StringMap<bool> Features; 7760 if (!Target->initFeatureMap(Features, Diags, Opts->CPU, 7761 Opts->FeaturesAsWritten)) 7762 return nullptr; 7763 7764 // Add the features to the compile options. 7765 Opts->Features.clear(); 7766 for (const auto &F : Features) 7767 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str()); 7768 7769 if (!Target->handleTargetFeatures(Opts->Features, Diags)) 7770 return nullptr; 7771 7772 return Target.release(); 7773 } 7774