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