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/Builtins.h" 16 #include "clang/Basic/Cuda.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/TargetInfo.h" 22 #include "clang/Basic/TargetOptions.h" 23 #include "clang/Basic/Version.h" 24 #include "clang/Frontend/CodeGenOptions.h" 25 #include "llvm/ADT/APFloat.h" 26 #include "llvm/ADT/STLExtras.h" 27 #include "llvm/ADT/StringExtras.h" 28 #include "llvm/ADT/StringRef.h" 29 #include "llvm/ADT/StringSwitch.h" 30 #include "llvm/ADT/Triple.h" 31 #include "llvm/MC/MCSectionMachO.h" 32 #include "llvm/Support/ErrorHandling.h" 33 #include "llvm/Support/TargetParser.h" 34 #include <algorithm> 35 #include <memory> 36 37 using namespace clang; 38 39 //===----------------------------------------------------------------------===// 40 // Common code shared among targets. 41 //===----------------------------------------------------------------------===// 42 43 /// DefineStd - Define a macro name and standard variants. For example if 44 /// MacroName is "unix", then this will define "__unix", "__unix__", and "unix" 45 /// when in GNU mode. 46 static void DefineStd(MacroBuilder &Builder, StringRef MacroName, 47 const LangOptions &Opts) { 48 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace"); 49 50 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier 51 // in the user's namespace. 52 if (Opts.GNUMode) 53 Builder.defineMacro(MacroName); 54 55 // Define __unix. 56 Builder.defineMacro("__" + MacroName); 57 58 // Define __unix__. 59 Builder.defineMacro("__" + MacroName + "__"); 60 } 61 62 static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName, 63 bool Tuning = true) { 64 Builder.defineMacro("__" + CPUName); 65 Builder.defineMacro("__" + CPUName + "__"); 66 if (Tuning) 67 Builder.defineMacro("__tune_" + CPUName + "__"); 68 } 69 70 static TargetInfo *AllocateTarget(const llvm::Triple &Triple, 71 const TargetOptions &Opts); 72 73 //===----------------------------------------------------------------------===// 74 // Defines specific to certain operating systems. 75 //===----------------------------------------------------------------------===// 76 77 namespace { 78 template<typename TgtInfo> 79 class OSTargetInfo : public TgtInfo { 80 protected: 81 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 82 MacroBuilder &Builder) const=0; 83 public: 84 OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 85 : TgtInfo(Triple, Opts) {} 86 void getTargetDefines(const LangOptions &Opts, 87 MacroBuilder &Builder) const override { 88 TgtInfo::getTargetDefines(Opts, Builder); 89 getOSDefines(Opts, TgtInfo::getTriple(), Builder); 90 } 91 92 }; 93 94 // CloudABI Target 95 template <typename Target> 96 class CloudABITargetInfo : public OSTargetInfo<Target> { 97 protected: 98 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 99 MacroBuilder &Builder) const override { 100 Builder.defineMacro("__CloudABI__"); 101 Builder.defineMacro("__ELF__"); 102 103 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t. 104 Builder.defineMacro("__STDC_ISO_10646__", "201206L"); 105 Builder.defineMacro("__STDC_UTF_16__"); 106 Builder.defineMacro("__STDC_UTF_32__"); 107 } 108 109 public: 110 CloudABITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 111 : OSTargetInfo<Target>(Triple, Opts) {} 112 }; 113 114 static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts, 115 const llvm::Triple &Triple, 116 StringRef &PlatformName, 117 VersionTuple &PlatformMinVersion) { 118 Builder.defineMacro("__APPLE_CC__", "6000"); 119 Builder.defineMacro("__APPLE__"); 120 Builder.defineMacro("__STDC_NO_THREADS__"); 121 Builder.defineMacro("OBJC_NEW_PROPERTIES"); 122 // AddressSanitizer doesn't play well with source fortification, which is on 123 // by default on Darwin. 124 if (Opts.Sanitize.has(SanitizerKind::Address)) 125 Builder.defineMacro("_FORTIFY_SOURCE", "0"); 126 127 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode. 128 if (!Opts.ObjC1) { 129 // __weak is always defined, for use in blocks and with objc pointers. 130 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))"); 131 Builder.defineMacro("__strong", ""); 132 Builder.defineMacro("__unsafe_unretained", ""); 133 } 134 135 if (Opts.Static) 136 Builder.defineMacro("__STATIC__"); 137 else 138 Builder.defineMacro("__DYNAMIC__"); 139 140 if (Opts.POSIXThreads) 141 Builder.defineMacro("_REENTRANT"); 142 143 // Get the platform type and version number from the triple. 144 unsigned Maj, Min, Rev; 145 if (Triple.isMacOSX()) { 146 Triple.getMacOSXVersion(Maj, Min, Rev); 147 PlatformName = "macos"; 148 } else { 149 Triple.getOSVersion(Maj, Min, Rev); 150 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS()); 151 } 152 153 // If -target arch-pc-win32-macho option specified, we're 154 // generating code for Win32 ABI. No need to emit 155 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__. 156 if (PlatformName == "win32") { 157 PlatformMinVersion = VersionTuple(Maj, Min, Rev); 158 return; 159 } 160 161 // Set the appropriate OS version define. 162 if (Triple.isiOS()) { 163 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!"); 164 char Str[7]; 165 if (Maj < 10) { 166 Str[0] = '0' + Maj; 167 Str[1] = '0' + (Min / 10); 168 Str[2] = '0' + (Min % 10); 169 Str[3] = '0' + (Rev / 10); 170 Str[4] = '0' + (Rev % 10); 171 Str[5] = '\0'; 172 } else { 173 // Handle versions >= 10. 174 Str[0] = '0' + (Maj / 10); 175 Str[1] = '0' + (Maj % 10); 176 Str[2] = '0' + (Min / 10); 177 Str[3] = '0' + (Min % 10); 178 Str[4] = '0' + (Rev / 10); 179 Str[5] = '0' + (Rev % 10); 180 Str[6] = '\0'; 181 } 182 if (Triple.isTvOS()) 183 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str); 184 else 185 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", 186 Str); 187 188 } else if (Triple.isWatchOS()) { 189 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!"); 190 char Str[6]; 191 Str[0] = '0' + Maj; 192 Str[1] = '0' + (Min / 10); 193 Str[2] = '0' + (Min % 10); 194 Str[3] = '0' + (Rev / 10); 195 Str[4] = '0' + (Rev % 10); 196 Str[5] = '\0'; 197 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str); 198 } else if (Triple.isMacOSX()) { 199 // Note that the Driver allows versions which aren't representable in the 200 // define (because we only get a single digit for the minor and micro 201 // revision numbers). So, we limit them to the maximum representable 202 // version. 203 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!"); 204 char Str[7]; 205 if (Maj < 10 || (Maj == 10 && Min < 10)) { 206 Str[0] = '0' + (Maj / 10); 207 Str[1] = '0' + (Maj % 10); 208 Str[2] = '0' + std::min(Min, 9U); 209 Str[3] = '0' + std::min(Rev, 9U); 210 Str[4] = '\0'; 211 } else { 212 // Handle versions > 10.9. 213 Str[0] = '0' + (Maj / 10); 214 Str[1] = '0' + (Maj % 10); 215 Str[2] = '0' + (Min / 10); 216 Str[3] = '0' + (Min % 10); 217 Str[4] = '0' + (Rev / 10); 218 Str[5] = '0' + (Rev % 10); 219 Str[6] = '\0'; 220 } 221 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str); 222 } 223 224 // Tell users about the kernel if there is one. 225 if (Triple.isOSDarwin()) 226 Builder.defineMacro("__MACH__"); 227 228 // The Watch ABI uses Dwarf EH. 229 if(Triple.isWatchABI()) 230 Builder.defineMacro("__ARM_DWARF_EH__"); 231 232 PlatformMinVersion = VersionTuple(Maj, Min, Rev); 233 } 234 235 template<typename Target> 236 class DarwinTargetInfo : public OSTargetInfo<Target> { 237 protected: 238 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 239 MacroBuilder &Builder) const override { 240 getDarwinDefines(Builder, Opts, Triple, this->PlatformName, 241 this->PlatformMinVersion); 242 } 243 244 public: 245 DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 246 : OSTargetInfo<Target>(Triple, Opts) { 247 // By default, no TLS, and we whitelist permitted architecture/OS 248 // combinations. 249 this->TLSSupported = false; 250 251 if (Triple.isMacOSX()) 252 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7); 253 else if (Triple.isiOS()) { 254 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards. 255 if (Triple.getArch() == llvm::Triple::x86_64 || 256 Triple.getArch() == llvm::Triple::aarch64) 257 this->TLSSupported = !Triple.isOSVersionLT(8); 258 else if (Triple.getArch() == llvm::Triple::x86 || 259 Triple.getArch() == llvm::Triple::arm || 260 Triple.getArch() == llvm::Triple::thumb) 261 this->TLSSupported = !Triple.isOSVersionLT(9); 262 } else if (Triple.isWatchOS()) 263 this->TLSSupported = !Triple.isOSVersionLT(2); 264 265 this->MCountName = "\01mcount"; 266 } 267 268 std::string isValidSectionSpecifier(StringRef SR) const override { 269 // Let MCSectionMachO validate this. 270 StringRef Segment, Section; 271 unsigned TAA, StubSize; 272 bool HasTAA; 273 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section, 274 TAA, HasTAA, StubSize); 275 } 276 277 const char *getStaticInitSectionSpecifier() const override { 278 // FIXME: We should return 0 when building kexts. 279 return "__TEXT,__StaticInit,regular,pure_instructions"; 280 } 281 282 /// Darwin does not support protected visibility. Darwin's "default" 283 /// is very similar to ELF's "protected"; Darwin requires a "weak" 284 /// attribute on declarations that can be dynamically replaced. 285 bool hasProtectedVisibility() const override { 286 return false; 287 } 288 289 unsigned getExnObjectAlignment() const override { 290 // The alignment of an exception object is 8-bytes for darwin since 291 // libc++abi doesn't declare _Unwind_Exception with __attribute__((aligned)) 292 // and therefore doesn't guarantee 16-byte alignment. 293 return 64; 294 } 295 }; 296 297 298 // DragonFlyBSD Target 299 template<typename Target> 300 class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> { 301 protected: 302 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 303 MacroBuilder &Builder) const override { 304 // DragonFly defines; list based off of gcc output 305 Builder.defineMacro("__DragonFly__"); 306 Builder.defineMacro("__DragonFly_cc_version", "100001"); 307 Builder.defineMacro("__ELF__"); 308 Builder.defineMacro("__KPRINTF_ATTRIBUTE__"); 309 Builder.defineMacro("__tune_i386__"); 310 DefineStd(Builder, "unix", Opts); 311 } 312 public: 313 DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 314 : OSTargetInfo<Target>(Triple, Opts) { 315 switch (Triple.getArch()) { 316 default: 317 case llvm::Triple::x86: 318 case llvm::Triple::x86_64: 319 this->MCountName = ".mcount"; 320 break; 321 } 322 } 323 }; 324 325 #ifndef FREEBSD_CC_VERSION 326 #define FREEBSD_CC_VERSION 0U 327 #endif 328 329 // FreeBSD Target 330 template<typename Target> 331 class FreeBSDTargetInfo : public OSTargetInfo<Target> { 332 protected: 333 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 334 MacroBuilder &Builder) const override { 335 // FreeBSD defines; list based off of gcc output 336 337 unsigned Release = Triple.getOSMajorVersion(); 338 if (Release == 0U) 339 Release = 8U; 340 unsigned CCVersion = FREEBSD_CC_VERSION; 341 if (CCVersion == 0U) 342 CCVersion = Release * 100000U + 1U; 343 344 Builder.defineMacro("__FreeBSD__", Twine(Release)); 345 Builder.defineMacro("__FreeBSD_cc_version", Twine(CCVersion)); 346 Builder.defineMacro("__KPRINTF_ATTRIBUTE__"); 347 DefineStd(Builder, "unix", Opts); 348 Builder.defineMacro("__ELF__"); 349 350 // On FreeBSD, wchar_t contains the number of the code point as 351 // used by the character set of the locale. These character sets are 352 // not necessarily a superset of ASCII. 353 // 354 // FIXME: This is wrong; the macro refers to the numerical values 355 // of wchar_t *literals*, which are not locale-dependent. However, 356 // FreeBSD systems apparently depend on us getting this wrong, and 357 // setting this to 1 is conforming even if all the basic source 358 // character literals have the same encoding as char and wchar_t. 359 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1"); 360 } 361 public: 362 FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 363 : OSTargetInfo<Target>(Triple, Opts) { 364 switch (Triple.getArch()) { 365 default: 366 case llvm::Triple::x86: 367 case llvm::Triple::x86_64: 368 this->MCountName = ".mcount"; 369 break; 370 case llvm::Triple::mips: 371 case llvm::Triple::mipsel: 372 case llvm::Triple::ppc: 373 case llvm::Triple::ppc64: 374 case llvm::Triple::ppc64le: 375 this->MCountName = "_mcount"; 376 break; 377 case llvm::Triple::arm: 378 this->MCountName = "__mcount"; 379 break; 380 } 381 } 382 }; 383 384 // GNU/kFreeBSD Target 385 template<typename Target> 386 class KFreeBSDTargetInfo : public OSTargetInfo<Target> { 387 protected: 388 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 389 MacroBuilder &Builder) const override { 390 // GNU/kFreeBSD defines; list based off of gcc output 391 392 DefineStd(Builder, "unix", Opts); 393 Builder.defineMacro("__FreeBSD_kernel__"); 394 Builder.defineMacro("__GLIBC__"); 395 Builder.defineMacro("__ELF__"); 396 if (Opts.POSIXThreads) 397 Builder.defineMacro("_REENTRANT"); 398 if (Opts.CPlusPlus) 399 Builder.defineMacro("_GNU_SOURCE"); 400 } 401 public: 402 KFreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 403 : OSTargetInfo<Target>(Triple, Opts) {} 404 }; 405 406 // Haiku Target 407 template<typename Target> 408 class HaikuTargetInfo : public OSTargetInfo<Target> { 409 protected: 410 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 411 MacroBuilder &Builder) const override { 412 // Haiku defines; list based off of gcc output 413 Builder.defineMacro("__HAIKU__"); 414 Builder.defineMacro("__ELF__"); 415 DefineStd(Builder, "unix", Opts); 416 } 417 public: 418 HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 419 : OSTargetInfo<Target>(Triple, Opts) { 420 this->SizeType = TargetInfo::UnsignedLong; 421 this->IntPtrType = TargetInfo::SignedLong; 422 this->PtrDiffType = TargetInfo::SignedLong; 423 this->ProcessIDType = TargetInfo::SignedLong; 424 this->TLSSupported = false; 425 426 } 427 }; 428 429 // Minix Target 430 template<typename Target> 431 class MinixTargetInfo : public OSTargetInfo<Target> { 432 protected: 433 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 434 MacroBuilder &Builder) const override { 435 // Minix defines 436 437 Builder.defineMacro("__minix", "3"); 438 Builder.defineMacro("_EM_WSIZE", "4"); 439 Builder.defineMacro("_EM_PSIZE", "4"); 440 Builder.defineMacro("_EM_SSIZE", "2"); 441 Builder.defineMacro("_EM_LSIZE", "4"); 442 Builder.defineMacro("_EM_FSIZE", "4"); 443 Builder.defineMacro("_EM_DSIZE", "8"); 444 Builder.defineMacro("__ELF__"); 445 DefineStd(Builder, "unix", Opts); 446 } 447 public: 448 MinixTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 449 : OSTargetInfo<Target>(Triple, Opts) {} 450 }; 451 452 // Linux target 453 template<typename Target> 454 class LinuxTargetInfo : public OSTargetInfo<Target> { 455 protected: 456 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 457 MacroBuilder &Builder) const override { 458 // Linux defines; list based off of gcc output 459 DefineStd(Builder, "unix", Opts); 460 DefineStd(Builder, "linux", Opts); 461 Builder.defineMacro("__gnu_linux__"); 462 Builder.defineMacro("__ELF__"); 463 if (Triple.isAndroid()) { 464 Builder.defineMacro("__ANDROID__", "1"); 465 unsigned Maj, Min, Rev; 466 Triple.getEnvironmentVersion(Maj, Min, Rev); 467 this->PlatformName = "android"; 468 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev); 469 if (Maj) 470 Builder.defineMacro("__ANDROID_API__", Twine(Maj)); 471 } 472 if (Opts.POSIXThreads) 473 Builder.defineMacro("_REENTRANT"); 474 if (Opts.CPlusPlus) 475 Builder.defineMacro("_GNU_SOURCE"); 476 if (this->HasFloat128) 477 Builder.defineMacro("__FLOAT128__"); 478 } 479 public: 480 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 481 : OSTargetInfo<Target>(Triple, Opts) { 482 this->WIntType = TargetInfo::UnsignedInt; 483 484 switch (Triple.getArch()) { 485 default: 486 break; 487 case llvm::Triple::ppc: 488 case llvm::Triple::ppc64: 489 case llvm::Triple::ppc64le: 490 this->MCountName = "_mcount"; 491 break; 492 case llvm::Triple::x86: 493 case llvm::Triple::x86_64: 494 case llvm::Triple::systemz: 495 this->HasFloat128 = true; 496 break; 497 } 498 } 499 500 const char *getStaticInitSectionSpecifier() const override { 501 return ".text.startup"; 502 } 503 }; 504 505 // NetBSD Target 506 template<typename Target> 507 class NetBSDTargetInfo : public OSTargetInfo<Target> { 508 protected: 509 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 510 MacroBuilder &Builder) const override { 511 // NetBSD defines; list based off of gcc output 512 Builder.defineMacro("__NetBSD__"); 513 Builder.defineMacro("__unix__"); 514 Builder.defineMacro("__ELF__"); 515 if (Opts.POSIXThreads) 516 Builder.defineMacro("_REENTRANT"); 517 518 switch (Triple.getArch()) { 519 default: 520 break; 521 case llvm::Triple::arm: 522 case llvm::Triple::armeb: 523 case llvm::Triple::thumb: 524 case llvm::Triple::thumbeb: 525 Builder.defineMacro("__ARM_DWARF_EH__"); 526 break; 527 } 528 } 529 public: 530 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 531 : OSTargetInfo<Target>(Triple, Opts) { 532 this->MCountName = "_mcount"; 533 } 534 }; 535 536 // OpenBSD Target 537 template<typename Target> 538 class OpenBSDTargetInfo : public OSTargetInfo<Target> { 539 protected: 540 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 541 MacroBuilder &Builder) const override { 542 // OpenBSD defines; list based off of gcc output 543 544 Builder.defineMacro("__OpenBSD__"); 545 DefineStd(Builder, "unix", Opts); 546 Builder.defineMacro("__ELF__"); 547 if (Opts.POSIXThreads) 548 Builder.defineMacro("_REENTRANT"); 549 if (this->HasFloat128) 550 Builder.defineMacro("__FLOAT128__"); 551 } 552 public: 553 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 554 : OSTargetInfo<Target>(Triple, Opts) { 555 this->TLSSupported = false; 556 557 switch (Triple.getArch()) { 558 case llvm::Triple::x86: 559 case llvm::Triple::x86_64: 560 this->HasFloat128 = true; 561 // FALLTHROUGH 562 default: 563 this->MCountName = "__mcount"; 564 break; 565 case llvm::Triple::mips64: 566 case llvm::Triple::mips64el: 567 case llvm::Triple::ppc: 568 case llvm::Triple::sparcv9: 569 this->MCountName = "_mcount"; 570 break; 571 } 572 } 573 }; 574 575 // Bitrig Target 576 template<typename Target> 577 class BitrigTargetInfo : public OSTargetInfo<Target> { 578 protected: 579 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 580 MacroBuilder &Builder) const override { 581 // Bitrig defines; list based off of gcc output 582 583 Builder.defineMacro("__Bitrig__"); 584 DefineStd(Builder, "unix", Opts); 585 Builder.defineMacro("__ELF__"); 586 if (Opts.POSIXThreads) 587 Builder.defineMacro("_REENTRANT"); 588 589 switch (Triple.getArch()) { 590 default: 591 break; 592 case llvm::Triple::arm: 593 case llvm::Triple::armeb: 594 case llvm::Triple::thumb: 595 case llvm::Triple::thumbeb: 596 Builder.defineMacro("__ARM_DWARF_EH__"); 597 break; 598 } 599 } 600 public: 601 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 602 : OSTargetInfo<Target>(Triple, Opts) { 603 this->MCountName = "__mcount"; 604 } 605 }; 606 607 // PSP Target 608 template<typename Target> 609 class PSPTargetInfo : public OSTargetInfo<Target> { 610 protected: 611 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 612 MacroBuilder &Builder) const override { 613 // PSP defines; list based on the output of the pspdev gcc toolchain. 614 Builder.defineMacro("PSP"); 615 Builder.defineMacro("_PSP"); 616 Builder.defineMacro("__psp__"); 617 Builder.defineMacro("__ELF__"); 618 } 619 public: 620 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {} 621 }; 622 623 // PS3 PPU Target 624 template<typename Target> 625 class PS3PPUTargetInfo : public OSTargetInfo<Target> { 626 protected: 627 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 628 MacroBuilder &Builder) const override { 629 // PS3 PPU defines. 630 Builder.defineMacro("__PPC__"); 631 Builder.defineMacro("__PPU__"); 632 Builder.defineMacro("__CELLOS_LV2__"); 633 Builder.defineMacro("__ELF__"); 634 Builder.defineMacro("__LP32__"); 635 Builder.defineMacro("_ARCH_PPC64"); 636 Builder.defineMacro("__powerpc64__"); 637 } 638 public: 639 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 640 : OSTargetInfo<Target>(Triple, Opts) { 641 this->LongWidth = this->LongAlign = 32; 642 this->PointerWidth = this->PointerAlign = 32; 643 this->IntMaxType = TargetInfo::SignedLongLong; 644 this->Int64Type = TargetInfo::SignedLongLong; 645 this->SizeType = TargetInfo::UnsignedInt; 646 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64"); 647 } 648 }; 649 650 template <typename Target> 651 class PS4OSTargetInfo : public OSTargetInfo<Target> { 652 protected: 653 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 654 MacroBuilder &Builder) const override { 655 Builder.defineMacro("__FreeBSD__", "9"); 656 Builder.defineMacro("__FreeBSD_cc_version", "900001"); 657 Builder.defineMacro("__KPRINTF_ATTRIBUTE__"); 658 DefineStd(Builder, "unix", Opts); 659 Builder.defineMacro("__ELF__"); 660 Builder.defineMacro("__ORBIS__"); 661 } 662 public: 663 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 664 : OSTargetInfo<Target>(Triple, Opts) { 665 this->WCharType = this->UnsignedShort; 666 667 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits). 668 this->MaxTLSAlign = 256; 669 670 // On PS4, do not honor explicit bit field alignment, 671 // as in "__attribute__((aligned(2))) int b : 1;". 672 this->UseExplicitBitFieldAlignment = false; 673 674 switch (Triple.getArch()) { 675 default: 676 case llvm::Triple::x86_64: 677 this->MCountName = ".mcount"; 678 break; 679 } 680 } 681 }; 682 683 // Solaris target 684 template<typename Target> 685 class SolarisTargetInfo : public OSTargetInfo<Target> { 686 protected: 687 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 688 MacroBuilder &Builder) const override { 689 DefineStd(Builder, "sun", Opts); 690 DefineStd(Builder, "unix", Opts); 691 Builder.defineMacro("__ELF__"); 692 Builder.defineMacro("__svr4__"); 693 Builder.defineMacro("__SVR4"); 694 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and 695 // newer, but to 500 for everything else. feature_test.h has a check to 696 // ensure that you are not using C99 with an old version of X/Open or C89 697 // with a new version. 698 if (Opts.C99) 699 Builder.defineMacro("_XOPEN_SOURCE", "600"); 700 else 701 Builder.defineMacro("_XOPEN_SOURCE", "500"); 702 if (Opts.CPlusPlus) 703 Builder.defineMacro("__C99FEATURES__"); 704 Builder.defineMacro("_LARGEFILE_SOURCE"); 705 Builder.defineMacro("_LARGEFILE64_SOURCE"); 706 Builder.defineMacro("__EXTENSIONS__"); 707 Builder.defineMacro("_REENTRANT"); 708 } 709 public: 710 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 711 : OSTargetInfo<Target>(Triple, Opts) { 712 this->WCharType = this->SignedInt; 713 // FIXME: WIntType should be SignedLong 714 } 715 }; 716 717 // Windows target 718 template<typename Target> 719 class WindowsTargetInfo : public OSTargetInfo<Target> { 720 protected: 721 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 722 MacroBuilder &Builder) const override { 723 Builder.defineMacro("_WIN32"); 724 } 725 void getVisualStudioDefines(const LangOptions &Opts, 726 MacroBuilder &Builder) const { 727 if (Opts.CPlusPlus) { 728 if (Opts.RTTIData) 729 Builder.defineMacro("_CPPRTTI"); 730 731 if (Opts.CXXExceptions) 732 Builder.defineMacro("_CPPUNWIND"); 733 } 734 735 if (Opts.Bool) 736 Builder.defineMacro("__BOOL_DEFINED"); 737 738 if (!Opts.CharIsSigned) 739 Builder.defineMacro("_CHAR_UNSIGNED"); 740 741 // FIXME: POSIXThreads isn't exactly the option this should be defined for, 742 // but it works for now. 743 if (Opts.POSIXThreads) 744 Builder.defineMacro("_MT"); 745 746 if (Opts.MSCompatibilityVersion) { 747 Builder.defineMacro("_MSC_VER", 748 Twine(Opts.MSCompatibilityVersion / 100000)); 749 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion)); 750 // FIXME We cannot encode the revision information into 32-bits 751 Builder.defineMacro("_MSC_BUILD", Twine(1)); 752 753 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) 754 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1)); 755 756 if (Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) { 757 if (Opts.CPlusPlus1z) 758 Builder.defineMacro("_MSVC_LANG", "201403L"); 759 else if (Opts.CPlusPlus14) 760 Builder.defineMacro("_MSVC_LANG", "201402L"); 761 } 762 } 763 764 if (Opts.MicrosoftExt) { 765 Builder.defineMacro("_MSC_EXTENSIONS"); 766 767 if (Opts.CPlusPlus11) { 768 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED"); 769 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED"); 770 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED"); 771 } 772 } 773 774 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64"); 775 } 776 777 public: 778 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 779 : OSTargetInfo<Target>(Triple, Opts) {} 780 }; 781 782 template <typename Target> 783 class NaClTargetInfo : public OSTargetInfo<Target> { 784 protected: 785 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 786 MacroBuilder &Builder) const override { 787 if (Opts.POSIXThreads) 788 Builder.defineMacro("_REENTRANT"); 789 if (Opts.CPlusPlus) 790 Builder.defineMacro("_GNU_SOURCE"); 791 792 DefineStd(Builder, "unix", Opts); 793 Builder.defineMacro("__ELF__"); 794 Builder.defineMacro("__native_client__"); 795 } 796 797 public: 798 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 799 : OSTargetInfo<Target>(Triple, Opts) { 800 this->LongAlign = 32; 801 this->LongWidth = 32; 802 this->PointerAlign = 32; 803 this->PointerWidth = 32; 804 this->IntMaxType = TargetInfo::SignedLongLong; 805 this->Int64Type = TargetInfo::SignedLongLong; 806 this->DoubleAlign = 64; 807 this->LongDoubleWidth = 64; 808 this->LongDoubleAlign = 64; 809 this->LongLongWidth = 64; 810 this->LongLongAlign = 64; 811 this->SizeType = TargetInfo::UnsignedInt; 812 this->PtrDiffType = TargetInfo::SignedInt; 813 this->IntPtrType = TargetInfo::SignedInt; 814 // RegParmMax is inherited from the underlying architecture. 815 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble(); 816 if (Triple.getArch() == llvm::Triple::arm) { 817 // Handled in ARM's setABI(). 818 } else if (Triple.getArch() == llvm::Triple::x86) { 819 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128"); 820 } else if (Triple.getArch() == llvm::Triple::x86_64) { 821 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128"); 822 } else if (Triple.getArch() == llvm::Triple::mipsel) { 823 // Handled on mips' setDataLayout. 824 } else { 825 assert(Triple.getArch() == llvm::Triple::le32); 826 this->resetDataLayout("e-p:32:32-i64:64"); 827 } 828 } 829 }; 830 831 // Fuchsia Target 832 template<typename Target> 833 class FuchsiaTargetInfo : public OSTargetInfo<Target> { 834 protected: 835 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 836 MacroBuilder &Builder) const override { 837 Builder.defineMacro("__Fuchsia__"); 838 Builder.defineMacro("__ELF__"); 839 if (Opts.POSIXThreads) 840 Builder.defineMacro("_REENTRANT"); 841 // Required by the libc++ locale support. 842 if (Opts.CPlusPlus) 843 Builder.defineMacro("_GNU_SOURCE"); 844 } 845 public: 846 FuchsiaTargetInfo(const llvm::Triple &Triple, 847 const TargetOptions &Opts) 848 : OSTargetInfo<Target>(Triple, Opts) { 849 this->MCountName = "__mcount"; 850 } 851 }; 852 853 // WebAssembly target 854 template <typename Target> 855 class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> { 856 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 857 MacroBuilder &Builder) const final { 858 // A common platform macro. 859 if (Opts.POSIXThreads) 860 Builder.defineMacro("_REENTRANT"); 861 // Follow g++ convention and predefine _GNU_SOURCE for C++. 862 if (Opts.CPlusPlus) 863 Builder.defineMacro("_GNU_SOURCE"); 864 } 865 866 // As an optimization, group static init code together in a section. 867 const char *getStaticInitSectionSpecifier() const final { 868 return ".text.__startup"; 869 } 870 871 public: 872 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple, 873 const TargetOptions &Opts) 874 : OSTargetInfo<Target>(Triple, Opts) { 875 this->MCountName = "__mcount"; 876 this->TheCXXABI.set(TargetCXXABI::WebAssembly); 877 } 878 }; 879 880 //===----------------------------------------------------------------------===// 881 // Specific target implementations. 882 //===----------------------------------------------------------------------===// 883 884 // PPC abstract base class 885 class PPCTargetInfo : public TargetInfo { 886 static const Builtin::Info BuiltinInfo[]; 887 static const char * const GCCRegNames[]; 888 static const TargetInfo::GCCRegAlias GCCRegAliases[]; 889 std::string CPU; 890 891 // Target cpu features. 892 bool HasAltivec; 893 bool HasVSX; 894 bool HasP8Vector; 895 bool HasP8Crypto; 896 bool HasDirectMove; 897 bool HasQPX; 898 bool HasHTM; 899 bool HasBPERMD; 900 bool HasExtDiv; 901 bool HasP9Vector; 902 903 protected: 904 std::string ABI; 905 906 public: 907 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &) 908 : TargetInfo(Triple), HasAltivec(false), HasVSX(false), HasP8Vector(false), 909 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false), 910 HasBPERMD(false), HasExtDiv(false), HasP9Vector(false) { 911 SuitableAlign = 128; 912 SimdDefaultAlign = 128; 913 LongDoubleWidth = LongDoubleAlign = 128; 914 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble(); 915 } 916 917 /// \brief Flags for architecture specific defines. 918 typedef enum { 919 ArchDefineNone = 0, 920 ArchDefineName = 1 << 0, // <name> is substituted for arch name. 921 ArchDefinePpcgr = 1 << 1, 922 ArchDefinePpcsq = 1 << 2, 923 ArchDefine440 = 1 << 3, 924 ArchDefine603 = 1 << 4, 925 ArchDefine604 = 1 << 5, 926 ArchDefinePwr4 = 1 << 6, 927 ArchDefinePwr5 = 1 << 7, 928 ArchDefinePwr5x = 1 << 8, 929 ArchDefinePwr6 = 1 << 9, 930 ArchDefinePwr6x = 1 << 10, 931 ArchDefinePwr7 = 1 << 11, 932 ArchDefinePwr8 = 1 << 12, 933 ArchDefinePwr9 = 1 << 13, 934 ArchDefineA2 = 1 << 14, 935 ArchDefineA2q = 1 << 15 936 } ArchDefineTypes; 937 938 // Set the language option for altivec based on our value. 939 void adjust(LangOptions &Opts) override { 940 if (HasAltivec) 941 Opts.AltiVec = 1; 942 TargetInfo::adjust(Opts); 943 } 944 945 // Note: GCC recognizes the following additional cpus: 946 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801, 947 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell, 948 // titan, rs64. 949 bool setCPU(const std::string &Name) override { 950 bool CPUKnown = llvm::StringSwitch<bool>(Name) 951 .Case("generic", true) 952 .Case("440", true) 953 .Case("450", true) 954 .Case("601", true) 955 .Case("602", true) 956 .Case("603", true) 957 .Case("603e", true) 958 .Case("603ev", true) 959 .Case("604", true) 960 .Case("604e", true) 961 .Case("620", true) 962 .Case("630", true) 963 .Case("g3", true) 964 .Case("7400", true) 965 .Case("g4", true) 966 .Case("7450", true) 967 .Case("g4+", true) 968 .Case("750", true) 969 .Case("970", true) 970 .Case("g5", true) 971 .Case("a2", true) 972 .Case("a2q", true) 973 .Case("e500mc", true) 974 .Case("e5500", true) 975 .Case("power3", true) 976 .Case("pwr3", true) 977 .Case("power4", true) 978 .Case("pwr4", true) 979 .Case("power5", true) 980 .Case("pwr5", true) 981 .Case("power5x", true) 982 .Case("pwr5x", true) 983 .Case("power6", true) 984 .Case("pwr6", true) 985 .Case("power6x", true) 986 .Case("pwr6x", true) 987 .Case("power7", true) 988 .Case("pwr7", true) 989 .Case("power8", true) 990 .Case("pwr8", true) 991 .Case("power9", true) 992 .Case("pwr9", true) 993 .Case("powerpc", true) 994 .Case("ppc", true) 995 .Case("powerpc64", true) 996 .Case("ppc64", true) 997 .Case("powerpc64le", true) 998 .Case("ppc64le", true) 999 .Default(false); 1000 1001 if (CPUKnown) 1002 CPU = Name; 1003 1004 return CPUKnown; 1005 } 1006 1007 1008 StringRef getABI() const override { return ABI; } 1009 1010 ArrayRef<Builtin::Info> getTargetBuiltins() const override { 1011 return llvm::makeArrayRef(BuiltinInfo, 1012 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin); 1013 } 1014 1015 bool isCLZForZeroUndef() const override { return false; } 1016 1017 void getTargetDefines(const LangOptions &Opts, 1018 MacroBuilder &Builder) const override; 1019 1020 bool 1021 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, 1022 StringRef CPU, 1023 const std::vector<std::string> &FeaturesVec) const override; 1024 1025 bool handleTargetFeatures(std::vector<std::string> &Features, 1026 DiagnosticsEngine &Diags) override; 1027 bool hasFeature(StringRef Feature) const override; 1028 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name, 1029 bool Enabled) const override; 1030 1031 ArrayRef<const char *> getGCCRegNames() const override; 1032 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override; 1033 bool validateAsmConstraint(const char *&Name, 1034 TargetInfo::ConstraintInfo &Info) const override { 1035 switch (*Name) { 1036 default: return false; 1037 case 'O': // Zero 1038 break; 1039 case 'b': // Base register 1040 case 'f': // Floating point register 1041 Info.setAllowsRegister(); 1042 break; 1043 // FIXME: The following are added to allow parsing. 1044 // I just took a guess at what the actions should be. 1045 // Also, is more specific checking needed? I.e. specific registers? 1046 case 'd': // Floating point register (containing 64-bit value) 1047 case 'v': // Altivec vector register 1048 Info.setAllowsRegister(); 1049 break; 1050 case 'w': 1051 switch (Name[1]) { 1052 case 'd':// VSX vector register to hold vector double data 1053 case 'f':// VSX vector register to hold vector float data 1054 case 's':// VSX vector register to hold scalar float data 1055 case 'a':// Any VSX register 1056 case 'c':// An individual CR bit 1057 break; 1058 default: 1059 return false; 1060 } 1061 Info.setAllowsRegister(); 1062 Name++; // Skip over 'w'. 1063 break; 1064 case 'h': // `MQ', `CTR', or `LINK' register 1065 case 'q': // `MQ' register 1066 case 'c': // `CTR' register 1067 case 'l': // `LINK' register 1068 case 'x': // `CR' register (condition register) number 0 1069 case 'y': // `CR' register (condition register) 1070 case 'z': // `XER[CA]' carry bit (part of the XER register) 1071 Info.setAllowsRegister(); 1072 break; 1073 case 'I': // Signed 16-bit constant 1074 case 'J': // Unsigned 16-bit constant shifted left 16 bits 1075 // (use `L' instead for SImode constants) 1076 case 'K': // Unsigned 16-bit constant 1077 case 'L': // Signed 16-bit constant shifted left 16 bits 1078 case 'M': // Constant larger than 31 1079 case 'N': // Exact power of 2 1080 case 'P': // Constant whose negation is a signed 16-bit constant 1081 case 'G': // Floating point constant that can be loaded into a 1082 // register with one instruction per word 1083 case 'H': // Integer/Floating point constant that can be loaded 1084 // into a register using three instructions 1085 break; 1086 case 'm': // Memory operand. Note that on PowerPC targets, m can 1087 // include addresses that update the base register. It 1088 // is therefore only safe to use `m' in an asm statement 1089 // if that asm statement accesses the operand exactly once. 1090 // The asm statement must also use `%U<opno>' as a 1091 // placeholder for the "update" flag in the corresponding 1092 // load or store instruction. For example: 1093 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val)); 1094 // is correct but: 1095 // asm ("st %1,%0" : "=m" (mem) : "r" (val)); 1096 // is not. Use es rather than m if you don't want the base 1097 // register to be updated. 1098 case 'e': 1099 if (Name[1] != 's') 1100 return false; 1101 // es: A "stable" memory operand; that is, one which does not 1102 // include any automodification of the base register. Unlike 1103 // `m', this constraint can be used in asm statements that 1104 // might access the operand several times, or that might not 1105 // access it at all. 1106 Info.setAllowsMemory(); 1107 Name++; // Skip over 'e'. 1108 break; 1109 case 'Q': // Memory operand that is an offset from a register (it is 1110 // usually better to use `m' or `es' in asm statements) 1111 case 'Z': // Memory operand that is an indexed or indirect from a 1112 // register (it is usually better to use `m' or `es' in 1113 // asm statements) 1114 Info.setAllowsMemory(); 1115 Info.setAllowsRegister(); 1116 break; 1117 case 'R': // AIX TOC entry 1118 case 'a': // Address operand that is an indexed or indirect from a 1119 // register (`p' is preferable for asm statements) 1120 case 'S': // Constant suitable as a 64-bit mask operand 1121 case 'T': // Constant suitable as a 32-bit mask operand 1122 case 'U': // System V Release 4 small data area reference 1123 case 't': // AND masks that can be performed by two rldic{l, r} 1124 // instructions 1125 case 'W': // Vector constant that does not require memory 1126 case 'j': // Vector constant that is all zeros. 1127 break; 1128 // End FIXME. 1129 } 1130 return true; 1131 } 1132 std::string convertConstraint(const char *&Constraint) const override { 1133 std::string R; 1134 switch (*Constraint) { 1135 case 'e': 1136 case 'w': 1137 // Two-character constraint; add "^" hint for later parsing. 1138 R = std::string("^") + std::string(Constraint, 2); 1139 Constraint++; 1140 break; 1141 default: 1142 return TargetInfo::convertConstraint(Constraint); 1143 } 1144 return R; 1145 } 1146 const char *getClobbers() const override { 1147 return ""; 1148 } 1149 int getEHDataRegisterNumber(unsigned RegNo) const override { 1150 if (RegNo == 0) return 3; 1151 if (RegNo == 1) return 4; 1152 return -1; 1153 } 1154 1155 bool hasSjLjLowering() const override { 1156 return true; 1157 } 1158 1159 bool useFloat128ManglingForLongDouble() const override { 1160 return LongDoubleWidth == 128 && 1161 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble() && 1162 getTriple().isOSBinFormatELF(); 1163 } 1164 }; 1165 1166 const Builtin::Info PPCTargetInfo::BuiltinInfo[] = { 1167 #define BUILTIN(ID, TYPE, ATTRS) \ 1168 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr }, 1169 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \ 1170 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr }, 1171 #include "clang/Basic/BuiltinsPPC.def" 1172 }; 1173 1174 /// handleTargetFeatures - Perform initialization based on the user 1175 /// configured set of features. 1176 bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features, 1177 DiagnosticsEngine &Diags) { 1178 for (const auto &Feature : Features) { 1179 if (Feature == "+altivec") { 1180 HasAltivec = true; 1181 } else if (Feature == "+vsx") { 1182 HasVSX = true; 1183 } else if (Feature == "+bpermd") { 1184 HasBPERMD = true; 1185 } else if (Feature == "+extdiv") { 1186 HasExtDiv = true; 1187 } else if (Feature == "+power8-vector") { 1188 HasP8Vector = true; 1189 } else if (Feature == "+crypto") { 1190 HasP8Crypto = true; 1191 } else if (Feature == "+direct-move") { 1192 HasDirectMove = true; 1193 } else if (Feature == "+qpx") { 1194 HasQPX = true; 1195 } else if (Feature == "+htm") { 1196 HasHTM = true; 1197 } else if (Feature == "+float128") { 1198 HasFloat128 = true; 1199 } else if (Feature == "+power9-vector") { 1200 HasP9Vector = true; 1201 } 1202 // TODO: Finish this list and add an assert that we've handled them 1203 // all. 1204 } 1205 1206 return true; 1207 } 1208 1209 /// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific 1210 /// #defines that are not tied to a specific subtarget. 1211 void PPCTargetInfo::getTargetDefines(const LangOptions &Opts, 1212 MacroBuilder &Builder) const { 1213 // Target identification. 1214 Builder.defineMacro("__ppc__"); 1215 Builder.defineMacro("__PPC__"); 1216 Builder.defineMacro("_ARCH_PPC"); 1217 Builder.defineMacro("__powerpc__"); 1218 Builder.defineMacro("__POWERPC__"); 1219 if (PointerWidth == 64) { 1220 Builder.defineMacro("_ARCH_PPC64"); 1221 Builder.defineMacro("__powerpc64__"); 1222 Builder.defineMacro("__ppc64__"); 1223 Builder.defineMacro("__PPC64__"); 1224 } 1225 1226 // Target properties. 1227 if (getTriple().getArch() == llvm::Triple::ppc64le) { 1228 Builder.defineMacro("_LITTLE_ENDIAN"); 1229 } else { 1230 if (getTriple().getOS() != llvm::Triple::NetBSD && 1231 getTriple().getOS() != llvm::Triple::OpenBSD) 1232 Builder.defineMacro("_BIG_ENDIAN"); 1233 } 1234 1235 // ABI options. 1236 if (ABI == "elfv1" || ABI == "elfv1-qpx") 1237 Builder.defineMacro("_CALL_ELF", "1"); 1238 if (ABI == "elfv2") 1239 Builder.defineMacro("_CALL_ELF", "2"); 1240 1241 // This typically is only for a new enough linker (bfd >= 2.16.2 or gold), but 1242 // our suppport post-dates this and it should work on all 64-bit ppc linux 1243 // platforms. It is guaranteed to work on all elfv2 platforms. 1244 if (getTriple().getOS() == llvm::Triple::Linux && PointerWidth == 64) 1245 Builder.defineMacro("_CALL_LINUX", "1"); 1246 1247 // Subtarget options. 1248 Builder.defineMacro("__NATURAL_ALIGNMENT__"); 1249 Builder.defineMacro("__REGISTER_PREFIX__", ""); 1250 1251 // FIXME: Should be controlled by command line option. 1252 if (LongDoubleWidth == 128) { 1253 Builder.defineMacro("__LONG_DOUBLE_128__"); 1254 Builder.defineMacro("__LONGDOUBLE128"); 1255 } 1256 1257 // Define this for elfv2 (64-bit only) or 64-bit darwin. 1258 if (ABI == "elfv2" || 1259 (getTriple().getOS() == llvm::Triple::Darwin && PointerWidth == 64)) 1260 Builder.defineMacro("__STRUCT_PARM_ALIGN__", "16"); 1261 1262 // CPU identification. 1263 ArchDefineTypes defs = 1264 (ArchDefineTypes)llvm::StringSwitch<int>(CPU) 1265 .Case("440", ArchDefineName) 1266 .Case("450", ArchDefineName | ArchDefine440) 1267 .Case("601", ArchDefineName) 1268 .Case("602", ArchDefineName | ArchDefinePpcgr) 1269 .Case("603", ArchDefineName | ArchDefinePpcgr) 1270 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr) 1271 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr) 1272 .Case("604", ArchDefineName | ArchDefinePpcgr) 1273 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr) 1274 .Case("620", ArchDefineName | ArchDefinePpcgr) 1275 .Case("630", ArchDefineName | ArchDefinePpcgr) 1276 .Case("7400", ArchDefineName | ArchDefinePpcgr) 1277 .Case("7450", ArchDefineName | ArchDefinePpcgr) 1278 .Case("750", ArchDefineName | ArchDefinePpcgr) 1279 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr | 1280 ArchDefinePpcsq) 1281 .Case("a2", ArchDefineA2) 1282 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q) 1283 .Case("pwr3", ArchDefinePpcgr) 1284 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq) 1285 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr | 1286 ArchDefinePpcsq) 1287 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4 | 1288 ArchDefinePpcgr | ArchDefinePpcsq) 1289 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5 | 1290 ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq) 1291 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x | 1292 ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr | 1293 ArchDefinePpcsq) 1294 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6 | 1295 ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4 | 1296 ArchDefinePpcgr | ArchDefinePpcsq) 1297 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x | 1298 ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5 | 1299 ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq) 1300 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7 | 1301 ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x | 1302 ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr | 1303 ArchDefinePpcsq) 1304 .Case("power3", ArchDefinePpcgr) 1305 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq) 1306 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr | 1307 ArchDefinePpcsq) 1308 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4 | 1309 ArchDefinePpcgr | ArchDefinePpcsq) 1310 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5 | 1311 ArchDefinePwr4 | ArchDefinePpcgr | 1312 ArchDefinePpcsq) 1313 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x | 1314 ArchDefinePwr5 | ArchDefinePwr4 | 1315 ArchDefinePpcgr | ArchDefinePpcsq) 1316 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6 | 1317 ArchDefinePwr5x | ArchDefinePwr5 | 1318 ArchDefinePwr4 | ArchDefinePpcgr | 1319 ArchDefinePpcsq) 1320 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x | 1321 ArchDefinePwr6 | ArchDefinePwr5x | 1322 ArchDefinePwr5 | ArchDefinePwr4 | 1323 ArchDefinePpcgr | ArchDefinePpcsq) 1324 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7 | 1325 ArchDefinePwr6x | ArchDefinePwr6 | 1326 ArchDefinePwr5x | ArchDefinePwr5 | 1327 ArchDefinePwr4 | ArchDefinePpcgr | 1328 ArchDefinePpcsq) 1329 // powerpc64le automatically defaults to at least power8. 1330 .Case("ppc64le", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x | 1331 ArchDefinePwr6 | ArchDefinePwr5x | 1332 ArchDefinePwr5 | ArchDefinePwr4 | 1333 ArchDefinePpcgr | ArchDefinePpcsq) 1334 .Default(ArchDefineNone); 1335 1336 if (defs & ArchDefineName) 1337 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper())); 1338 if (defs & ArchDefinePpcgr) 1339 Builder.defineMacro("_ARCH_PPCGR"); 1340 if (defs & ArchDefinePpcsq) 1341 Builder.defineMacro("_ARCH_PPCSQ"); 1342 if (defs & ArchDefine440) 1343 Builder.defineMacro("_ARCH_440"); 1344 if (defs & ArchDefine603) 1345 Builder.defineMacro("_ARCH_603"); 1346 if (defs & ArchDefine604) 1347 Builder.defineMacro("_ARCH_604"); 1348 if (defs & ArchDefinePwr4) 1349 Builder.defineMacro("_ARCH_PWR4"); 1350 if (defs & ArchDefinePwr5) 1351 Builder.defineMacro("_ARCH_PWR5"); 1352 if (defs & ArchDefinePwr5x) 1353 Builder.defineMacro("_ARCH_PWR5X"); 1354 if (defs & ArchDefinePwr6) 1355 Builder.defineMacro("_ARCH_PWR6"); 1356 if (defs & ArchDefinePwr6x) 1357 Builder.defineMacro("_ARCH_PWR6X"); 1358 if (defs & ArchDefinePwr7) 1359 Builder.defineMacro("_ARCH_PWR7"); 1360 if (defs & ArchDefinePwr8) 1361 Builder.defineMacro("_ARCH_PWR8"); 1362 if (defs & ArchDefinePwr9) 1363 Builder.defineMacro("_ARCH_PWR9"); 1364 if (defs & ArchDefineA2) 1365 Builder.defineMacro("_ARCH_A2"); 1366 if (defs & ArchDefineA2q) { 1367 Builder.defineMacro("_ARCH_A2Q"); 1368 Builder.defineMacro("_ARCH_QP"); 1369 } 1370 1371 if (getTriple().getVendor() == llvm::Triple::BGQ) { 1372 Builder.defineMacro("__bg__"); 1373 Builder.defineMacro("__THW_BLUEGENE__"); 1374 Builder.defineMacro("__bgq__"); 1375 Builder.defineMacro("__TOS_BGQ__"); 1376 } 1377 1378 if (HasAltivec) { 1379 Builder.defineMacro("__VEC__", "10206"); 1380 Builder.defineMacro("__ALTIVEC__"); 1381 } 1382 if (HasVSX) 1383 Builder.defineMacro("__VSX__"); 1384 if (HasP8Vector) 1385 Builder.defineMacro("__POWER8_VECTOR__"); 1386 if (HasP8Crypto) 1387 Builder.defineMacro("__CRYPTO__"); 1388 if (HasHTM) 1389 Builder.defineMacro("__HTM__"); 1390 if (HasFloat128) 1391 Builder.defineMacro("__FLOAT128__"); 1392 if (HasP9Vector) 1393 Builder.defineMacro("__POWER9_VECTOR__"); 1394 1395 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1"); 1396 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2"); 1397 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4"); 1398 if (PointerWidth == 64) 1399 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8"); 1400 1401 // We have support for the bswap intrinsics so we can define this. 1402 Builder.defineMacro("__HAVE_BSWAP__", "1"); 1403 1404 // FIXME: The following are not yet generated here by Clang, but are 1405 // generated by GCC: 1406 // 1407 // _SOFT_FLOAT_ 1408 // __RECIP_PRECISION__ 1409 // __APPLE_ALTIVEC__ 1410 // __RECIP__ 1411 // __RECIPF__ 1412 // __RSQRTE__ 1413 // __RSQRTEF__ 1414 // _SOFT_DOUBLE_ 1415 // __NO_LWSYNC__ 1416 // __CMODEL_MEDIUM__ 1417 // __CMODEL_LARGE__ 1418 // _CALL_SYSV 1419 // _CALL_DARWIN 1420 // __NO_FPRS__ 1421 } 1422 1423 // Handle explicit options being passed to the compiler here: if we've 1424 // explicitly turned off vsx and turned on any of: 1425 // - power8-vector 1426 // - direct-move 1427 // - float128 1428 // - power9-vector 1429 // then go ahead and error since the customer has expressed an incompatible 1430 // set of options. 1431 static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags, 1432 const std::vector<std::string> &FeaturesVec) { 1433 1434 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") != 1435 FeaturesVec.end()) { 1436 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") != 1437 FeaturesVec.end()) { 1438 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector" 1439 << "-mno-vsx"; 1440 return false; 1441 } 1442 1443 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") != 1444 FeaturesVec.end()) { 1445 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move" 1446 << "-mno-vsx"; 1447 return false; 1448 } 1449 1450 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") != 1451 FeaturesVec.end()) { 1452 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128" 1453 << "-mno-vsx"; 1454 return false; 1455 } 1456 1457 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power9-vector") != 1458 FeaturesVec.end()) { 1459 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower9-vector" 1460 << "-mno-vsx"; 1461 return false; 1462 } 1463 } 1464 1465 return true; 1466 } 1467 1468 bool PPCTargetInfo::initFeatureMap( 1469 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU, 1470 const std::vector<std::string> &FeaturesVec) const { 1471 Features["altivec"] = llvm::StringSwitch<bool>(CPU) 1472 .Case("7400", true) 1473 .Case("g4", true) 1474 .Case("7450", true) 1475 .Case("g4+", true) 1476 .Case("970", true) 1477 .Case("g5", true) 1478 .Case("pwr6", true) 1479 .Case("pwr7", true) 1480 .Case("pwr8", true) 1481 .Case("pwr9", true) 1482 .Case("ppc64", true) 1483 .Case("ppc64le", true) 1484 .Default(false); 1485 1486 Features["qpx"] = (CPU == "a2q"); 1487 Features["power9-vector"] = (CPU == "pwr9"); 1488 Features["crypto"] = llvm::StringSwitch<bool>(CPU) 1489 .Case("ppc64le", true) 1490 .Case("pwr9", true) 1491 .Case("pwr8", true) 1492 .Default(false); 1493 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU) 1494 .Case("ppc64le", true) 1495 .Case("pwr9", true) 1496 .Case("pwr8", true) 1497 .Default(false); 1498 Features["bpermd"] = llvm::StringSwitch<bool>(CPU) 1499 .Case("ppc64le", true) 1500 .Case("pwr9", true) 1501 .Case("pwr8", true) 1502 .Case("pwr7", true) 1503 .Default(false); 1504 Features["extdiv"] = llvm::StringSwitch<bool>(CPU) 1505 .Case("ppc64le", true) 1506 .Case("pwr9", true) 1507 .Case("pwr8", true) 1508 .Case("pwr7", true) 1509 .Default(false); 1510 Features["direct-move"] = llvm::StringSwitch<bool>(CPU) 1511 .Case("ppc64le", true) 1512 .Case("pwr9", true) 1513 .Case("pwr8", true) 1514 .Default(false); 1515 Features["vsx"] = llvm::StringSwitch<bool>(CPU) 1516 .Case("ppc64le", true) 1517 .Case("pwr9", true) 1518 .Case("pwr8", true) 1519 .Case("pwr7", true) 1520 .Default(false); 1521 Features["htm"] = llvm::StringSwitch<bool>(CPU) 1522 .Case("ppc64le", true) 1523 .Case("pwr9", true) 1524 .Case("pwr8", true) 1525 .Default(false); 1526 1527 if (!ppcUserFeaturesCheck(Diags, FeaturesVec)) 1528 return false; 1529 1530 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec); 1531 } 1532 1533 bool PPCTargetInfo::hasFeature(StringRef Feature) const { 1534 return llvm::StringSwitch<bool>(Feature) 1535 .Case("powerpc", true) 1536 .Case("altivec", HasAltivec) 1537 .Case("vsx", HasVSX) 1538 .Case("power8-vector", HasP8Vector) 1539 .Case("crypto", HasP8Crypto) 1540 .Case("direct-move", HasDirectMove) 1541 .Case("qpx", HasQPX) 1542 .Case("htm", HasHTM) 1543 .Case("bpermd", HasBPERMD) 1544 .Case("extdiv", HasExtDiv) 1545 .Case("float128", HasFloat128) 1546 .Case("power9-vector", HasP9Vector) 1547 .Default(false); 1548 } 1549 1550 void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features, 1551 StringRef Name, bool Enabled) const { 1552 if (Enabled) { 1553 // If we're enabling any of the vsx based features then enable vsx and 1554 // altivec. We'll diagnose any problems later. 1555 bool FeatureHasVSX = llvm::StringSwitch<bool>(Name) 1556 .Case("vsx", true) 1557 .Case("direct-move", true) 1558 .Case("power8-vector", true) 1559 .Case("power9-vector", true) 1560 .Case("float128", true) 1561 .Default(false); 1562 if (FeatureHasVSX) 1563 Features["vsx"] = Features["altivec"] = true; 1564 if (Name == "power9-vector") 1565 Features["power8-vector"] = true; 1566 Features[Name] = true; 1567 } else { 1568 // If we're disabling altivec or vsx go ahead and disable all of the vsx 1569 // features. 1570 if ((Name == "altivec") || (Name == "vsx")) 1571 Features["vsx"] = Features["direct-move"] = Features["power8-vector"] = 1572 Features["float128"] = Features["power9-vector"] = false; 1573 if (Name == "power8-vector") 1574 Features["power9-vector"] = false; 1575 Features[Name] = false; 1576 } 1577 } 1578 1579 const char * const PPCTargetInfo::GCCRegNames[] = { 1580 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", 1581 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", 1582 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", 1583 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31", 1584 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", 1585 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", 1586 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", 1587 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", 1588 "mq", "lr", "ctr", "ap", 1589 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", 1590 "xer", 1591 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", 1592 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", 1593 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", 1594 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31", 1595 "vrsave", "vscr", 1596 "spe_acc", "spefscr", 1597 "sfp" 1598 }; 1599 1600 ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const { 1601 return llvm::makeArrayRef(GCCRegNames); 1602 } 1603 1604 const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = { 1605 // While some of these aliases do map to different registers 1606 // they still share the same register name. 1607 { { "0" }, "r0" }, 1608 { { "1"}, "r1" }, 1609 { { "2" }, "r2" }, 1610 { { "3" }, "r3" }, 1611 { { "4" }, "r4" }, 1612 { { "5" }, "r5" }, 1613 { { "6" }, "r6" }, 1614 { { "7" }, "r7" }, 1615 { { "8" }, "r8" }, 1616 { { "9" }, "r9" }, 1617 { { "10" }, "r10" }, 1618 { { "11" }, "r11" }, 1619 { { "12" }, "r12" }, 1620 { { "13" }, "r13" }, 1621 { { "14" }, "r14" }, 1622 { { "15" }, "r15" }, 1623 { { "16" }, "r16" }, 1624 { { "17" }, "r17" }, 1625 { { "18" }, "r18" }, 1626 { { "19" }, "r19" }, 1627 { { "20" }, "r20" }, 1628 { { "21" }, "r21" }, 1629 { { "22" }, "r22" }, 1630 { { "23" }, "r23" }, 1631 { { "24" }, "r24" }, 1632 { { "25" }, "r25" }, 1633 { { "26" }, "r26" }, 1634 { { "27" }, "r27" }, 1635 { { "28" }, "r28" }, 1636 { { "29" }, "r29" }, 1637 { { "30" }, "r30" }, 1638 { { "31" }, "r31" }, 1639 { { "fr0" }, "f0" }, 1640 { { "fr1" }, "f1" }, 1641 { { "fr2" }, "f2" }, 1642 { { "fr3" }, "f3" }, 1643 { { "fr4" }, "f4" }, 1644 { { "fr5" }, "f5" }, 1645 { { "fr6" }, "f6" }, 1646 { { "fr7" }, "f7" }, 1647 { { "fr8" }, "f8" }, 1648 { { "fr9" }, "f9" }, 1649 { { "fr10" }, "f10" }, 1650 { { "fr11" }, "f11" }, 1651 { { "fr12" }, "f12" }, 1652 { { "fr13" }, "f13" }, 1653 { { "fr14" }, "f14" }, 1654 { { "fr15" }, "f15" }, 1655 { { "fr16" }, "f16" }, 1656 { { "fr17" }, "f17" }, 1657 { { "fr18" }, "f18" }, 1658 { { "fr19" }, "f19" }, 1659 { { "fr20" }, "f20" }, 1660 { { "fr21" }, "f21" }, 1661 { { "fr22" }, "f22" }, 1662 { { "fr23" }, "f23" }, 1663 { { "fr24" }, "f24" }, 1664 { { "fr25" }, "f25" }, 1665 { { "fr26" }, "f26" }, 1666 { { "fr27" }, "f27" }, 1667 { { "fr28" }, "f28" }, 1668 { { "fr29" }, "f29" }, 1669 { { "fr30" }, "f30" }, 1670 { { "fr31" }, "f31" }, 1671 { { "cc" }, "cr0" }, 1672 }; 1673 1674 ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const { 1675 return llvm::makeArrayRef(GCCRegAliases); 1676 } 1677 1678 class PPC32TargetInfo : public PPCTargetInfo { 1679 public: 1680 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 1681 : PPCTargetInfo(Triple, Opts) { 1682 resetDataLayout("E-m:e-p:32:32-i64:64-n32"); 1683 1684 switch (getTriple().getOS()) { 1685 case llvm::Triple::Linux: 1686 case llvm::Triple::FreeBSD: 1687 case llvm::Triple::NetBSD: 1688 SizeType = UnsignedInt; 1689 PtrDiffType = SignedInt; 1690 IntPtrType = SignedInt; 1691 break; 1692 default: 1693 break; 1694 } 1695 1696 if (getTriple().getOS() == llvm::Triple::FreeBSD) { 1697 LongDoubleWidth = LongDoubleAlign = 64; 1698 LongDoubleFormat = &llvm::APFloat::IEEEdouble(); 1699 } 1700 1701 // PPC32 supports atomics up to 4 bytes. 1702 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32; 1703 } 1704 1705 BuiltinVaListKind getBuiltinVaListKind() const override { 1706 // This is the ELF definition, and is overridden by the Darwin sub-target 1707 return TargetInfo::PowerABIBuiltinVaList; 1708 } 1709 }; 1710 1711 // Note: ABI differences may eventually require us to have a separate 1712 // TargetInfo for little endian. 1713 class PPC64TargetInfo : public PPCTargetInfo { 1714 public: 1715 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 1716 : PPCTargetInfo(Triple, Opts) { 1717 LongWidth = LongAlign = PointerWidth = PointerAlign = 64; 1718 IntMaxType = SignedLong; 1719 Int64Type = SignedLong; 1720 1721 if ((Triple.getArch() == llvm::Triple::ppc64le)) { 1722 resetDataLayout("e-m:e-i64:64-n32:64"); 1723 ABI = "elfv2"; 1724 } else { 1725 resetDataLayout("E-m:e-i64:64-n32:64"); 1726 ABI = "elfv1"; 1727 } 1728 1729 switch (getTriple().getOS()) { 1730 case llvm::Triple::FreeBSD: 1731 LongDoubleWidth = LongDoubleAlign = 64; 1732 LongDoubleFormat = &llvm::APFloat::IEEEdouble(); 1733 break; 1734 case llvm::Triple::NetBSD: 1735 IntMaxType = SignedLongLong; 1736 Int64Type = SignedLongLong; 1737 break; 1738 default: 1739 break; 1740 } 1741 1742 // PPC64 supports atomics up to 8 bytes. 1743 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64; 1744 } 1745 BuiltinVaListKind getBuiltinVaListKind() const override { 1746 return TargetInfo::CharPtrBuiltinVaList; 1747 } 1748 // PPC64 Linux-specific ABI options. 1749 bool setABI(const std::string &Name) override { 1750 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") { 1751 ABI = Name; 1752 return true; 1753 } 1754 return false; 1755 } 1756 }; 1757 1758 class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> { 1759 public: 1760 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 1761 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) { 1762 HasAlignMac68kSupport = true; 1763 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool? 1764 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726 1765 LongLongAlign = 32; 1766 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32"); 1767 } 1768 BuiltinVaListKind getBuiltinVaListKind() const override { 1769 return TargetInfo::CharPtrBuiltinVaList; 1770 } 1771 }; 1772 1773 class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> { 1774 public: 1775 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 1776 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) { 1777 HasAlignMac68kSupport = true; 1778 resetDataLayout("E-m:o-i64:64-n32:64"); 1779 } 1780 }; 1781 1782 static const unsigned NVPTXAddrSpaceMap[] = { 1783 0, // Default 1784 1, // opencl_global 1785 3, // opencl_local 1786 4, // opencl_constant 1787 // FIXME: generic has to be added to the target 1788 0, // opencl_generic 1789 1, // cuda_device 1790 4, // cuda_constant 1791 3, // cuda_shared 1792 }; 1793 1794 class NVPTXTargetInfo : public TargetInfo { 1795 static const char *const GCCRegNames[]; 1796 static const Builtin::Info BuiltinInfo[]; 1797 CudaArch GPU; 1798 std::unique_ptr<TargetInfo> HostTarget; 1799 1800 public: 1801 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts, 1802 unsigned TargetPointerWidth) 1803 : TargetInfo(Triple) { 1804 assert((TargetPointerWidth == 32 || TargetPointerWidth == 64) && 1805 "NVPTX only supports 32- and 64-bit modes."); 1806 1807 TLSSupported = false; 1808 AddrSpaceMap = &NVPTXAddrSpaceMap; 1809 UseAddrSpaceMapMangling = true; 1810 1811 // Define available target features 1812 // These must be defined in sorted order! 1813 NoAsmVariants = true; 1814 GPU = CudaArch::SM_20; 1815 1816 if (TargetPointerWidth == 32) 1817 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64"); 1818 else 1819 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64"); 1820 1821 // If possible, get a TargetInfo for our host triple, so we can match its 1822 // types. 1823 llvm::Triple HostTriple(Opts.HostTriple); 1824 if (!HostTriple.isNVPTX()) 1825 HostTarget.reset(AllocateTarget(llvm::Triple(Opts.HostTriple), Opts)); 1826 1827 // If no host target, make some guesses about the data layout and return. 1828 if (!HostTarget) { 1829 LongWidth = LongAlign = TargetPointerWidth; 1830 PointerWidth = PointerAlign = TargetPointerWidth; 1831 switch (TargetPointerWidth) { 1832 case 32: 1833 SizeType = TargetInfo::UnsignedInt; 1834 PtrDiffType = TargetInfo::SignedInt; 1835 IntPtrType = TargetInfo::SignedInt; 1836 break; 1837 case 64: 1838 SizeType = TargetInfo::UnsignedLong; 1839 PtrDiffType = TargetInfo::SignedLong; 1840 IntPtrType = TargetInfo::SignedLong; 1841 break; 1842 default: 1843 llvm_unreachable("TargetPointerWidth must be 32 or 64"); 1844 } 1845 return; 1846 } 1847 1848 // Copy properties from host target. 1849 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0); 1850 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0); 1851 BoolWidth = HostTarget->getBoolWidth(); 1852 BoolAlign = HostTarget->getBoolAlign(); 1853 IntWidth = HostTarget->getIntWidth(); 1854 IntAlign = HostTarget->getIntAlign(); 1855 HalfWidth = HostTarget->getHalfWidth(); 1856 HalfAlign = HostTarget->getHalfAlign(); 1857 FloatWidth = HostTarget->getFloatWidth(); 1858 FloatAlign = HostTarget->getFloatAlign(); 1859 DoubleWidth = HostTarget->getDoubleWidth(); 1860 DoubleAlign = HostTarget->getDoubleAlign(); 1861 LongWidth = HostTarget->getLongWidth(); 1862 LongAlign = HostTarget->getLongAlign(); 1863 LongLongWidth = HostTarget->getLongLongWidth(); 1864 LongLongAlign = HostTarget->getLongLongAlign(); 1865 MinGlobalAlign = HostTarget->getMinGlobalAlign(); 1866 NewAlign = HostTarget->getNewAlign(); 1867 DefaultAlignForAttributeAligned = 1868 HostTarget->getDefaultAlignForAttributeAligned(); 1869 SizeType = HostTarget->getSizeType(); 1870 IntMaxType = HostTarget->getIntMaxType(); 1871 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0); 1872 IntPtrType = HostTarget->getIntPtrType(); 1873 WCharType = HostTarget->getWCharType(); 1874 WIntType = HostTarget->getWIntType(); 1875 Char16Type = HostTarget->getChar16Type(); 1876 Char32Type = HostTarget->getChar32Type(); 1877 Int64Type = HostTarget->getInt64Type(); 1878 SigAtomicType = HostTarget->getSigAtomicType(); 1879 ProcessIDType = HostTarget->getProcessIDType(); 1880 1881 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment(); 1882 UseZeroLengthBitfieldAlignment = 1883 HostTarget->useZeroLengthBitfieldAlignment(); 1884 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment(); 1885 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary(); 1886 1887 // This is a bit of a lie, but it controls __GCC_ATOMIC_XXX_LOCK_FREE, and 1888 // we need those macros to be identical on host and device, because (among 1889 // other things) they affect which standard library classes are defined, and 1890 // we need all classes to be defined on both the host and device. 1891 MaxAtomicInlineWidth = HostTarget->getMaxAtomicInlineWidth(); 1892 1893 // Properties intentionally not copied from host: 1894 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the 1895 // host/device boundary. 1896 // - SuitableAlign: Not visible across the host/device boundary, and may 1897 // correctly be different on host/device, e.g. if host has wider vector 1898 // types than device. 1899 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same 1900 // as its double type, but that's not necessarily true on the host. 1901 // TODO: nvcc emits a warning when using long double on device; we should 1902 // do the same. 1903 } 1904 void getTargetDefines(const LangOptions &Opts, 1905 MacroBuilder &Builder) const override { 1906 Builder.defineMacro("__PTX__"); 1907 Builder.defineMacro("__NVPTX__"); 1908 if (Opts.CUDAIsDevice) { 1909 // Set __CUDA_ARCH__ for the GPU specified. 1910 std::string CUDAArchCode = [this] { 1911 switch (GPU) { 1912 case CudaArch::UNKNOWN: 1913 assert(false && "No GPU arch when compiling CUDA device code."); 1914 return ""; 1915 case CudaArch::SM_20: 1916 return "200"; 1917 case CudaArch::SM_21: 1918 return "210"; 1919 case CudaArch::SM_30: 1920 return "300"; 1921 case CudaArch::SM_32: 1922 return "320"; 1923 case CudaArch::SM_35: 1924 return "350"; 1925 case CudaArch::SM_37: 1926 return "370"; 1927 case CudaArch::SM_50: 1928 return "500"; 1929 case CudaArch::SM_52: 1930 return "520"; 1931 case CudaArch::SM_53: 1932 return "530"; 1933 case CudaArch::SM_60: 1934 return "600"; 1935 case CudaArch::SM_61: 1936 return "610"; 1937 case CudaArch::SM_62: 1938 return "620"; 1939 } 1940 llvm_unreachable("unhandled CudaArch"); 1941 }(); 1942 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode); 1943 } 1944 } 1945 ArrayRef<Builtin::Info> getTargetBuiltins() const override { 1946 return llvm::makeArrayRef(BuiltinInfo, 1947 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin); 1948 } 1949 bool 1950 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, 1951 StringRef CPU, 1952 const std::vector<std::string> &FeaturesVec) const override { 1953 Features["satom"] = GPU >= CudaArch::SM_60; 1954 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec); 1955 } 1956 1957 bool hasFeature(StringRef Feature) const override { 1958 return llvm::StringSwitch<bool>(Feature) 1959 .Cases("ptx", "nvptx", true) 1960 .Case("satom", GPU >= CudaArch::SM_60) // Atomics w/ scope. 1961 .Default(false); 1962 } 1963 1964 ArrayRef<const char *> getGCCRegNames() const override; 1965 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override { 1966 // No aliases. 1967 return None; 1968 } 1969 bool validateAsmConstraint(const char *&Name, 1970 TargetInfo::ConstraintInfo &Info) const override { 1971 switch (*Name) { 1972 default: 1973 return false; 1974 case 'c': 1975 case 'h': 1976 case 'r': 1977 case 'l': 1978 case 'f': 1979 case 'd': 1980 Info.setAllowsRegister(); 1981 return true; 1982 } 1983 } 1984 const char *getClobbers() const override { 1985 // FIXME: Is this really right? 1986 return ""; 1987 } 1988 BuiltinVaListKind getBuiltinVaListKind() const override { 1989 // FIXME: implement 1990 return TargetInfo::CharPtrBuiltinVaList; 1991 } 1992 bool setCPU(const std::string &Name) override { 1993 GPU = StringToCudaArch(Name); 1994 return GPU != CudaArch::UNKNOWN; 1995 } 1996 void setSupportedOpenCLOpts() override { 1997 auto &Opts = getSupportedOpenCLOpts(); 1998 Opts.support("cl_clang_storage_class_specifiers"); 1999 Opts.support("cl_khr_gl_sharing"); 2000 Opts.support("cl_khr_icd"); 2001 2002 Opts.support("cl_khr_fp64"); 2003 Opts.support("cl_khr_byte_addressable_store"); 2004 Opts.support("cl_khr_global_int32_base_atomics"); 2005 Opts.support("cl_khr_global_int32_extended_atomics"); 2006 Opts.support("cl_khr_local_int32_base_atomics"); 2007 Opts.support("cl_khr_local_int32_extended_atomics"); 2008 } 2009 2010 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override { 2011 // CUDA compilations support all of the host's calling conventions. 2012 // 2013 // TODO: We should warn if you apply a non-default CC to anything other than 2014 // a host function. 2015 if (HostTarget) 2016 return HostTarget->checkCallingConvention(CC); 2017 return CCCR_Warning; 2018 } 2019 }; 2020 2021 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = { 2022 #define BUILTIN(ID, TYPE, ATTRS) \ 2023 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr }, 2024 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \ 2025 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr }, 2026 #define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \ 2027 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE }, 2028 #include "clang/Basic/BuiltinsNVPTX.def" 2029 }; 2030 2031 const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"}; 2032 2033 ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const { 2034 return llvm::makeArrayRef(GCCRegNames); 2035 } 2036 2037 static const LangAS::Map AMDGPUNonOpenCLPrivateIsZeroMap = { 2038 4, // Default 2039 1, // opencl_global 2040 3, // opencl_local 2041 2, // opencl_constant 2042 4, // opencl_generic 2043 1, // cuda_device 2044 2, // cuda_constant 2045 3 // cuda_shared 2046 }; 2047 static const LangAS::Map AMDGPUNonOpenCLGenericIsZeroMap = { 2048 0, // Default 2049 1, // opencl_global 2050 3, // opencl_local 2051 2, // opencl_constant 2052 0, // opencl_generic 2053 1, // cuda_device 2054 2, // cuda_constant 2055 3 // cuda_shared 2056 }; 2057 static const LangAS::Map AMDGPUOpenCLPrivateIsZeroMap = { 2058 0, // Default 2059 1, // opencl_global 2060 3, // opencl_local 2061 2, // opencl_constant 2062 4, // opencl_generic 2063 1, // cuda_device 2064 2, // cuda_constant 2065 3 // cuda_shared 2066 }; 2067 static const LangAS::Map AMDGPUOpenCLGenericIsZeroMap = { 2068 5, // Default 2069 1, // opencl_global 2070 3, // opencl_local 2071 2, // opencl_constant 2072 0, // opencl_generic 2073 1, // cuda_device 2074 2, // cuda_constant 2075 3 // cuda_shared 2076 }; 2077 2078 // If you edit the description strings, make sure you update 2079 // getPointerWidthV(). 2080 2081 static const char *const DataLayoutStringR600 = 2082 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128" 2083 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64"; 2084 2085 static const char *const DataLayoutStringSIPrivateIsZero = 2086 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32" 2087 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128" 2088 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64"; 2089 2090 static const char *const DataLayoutStringSIGenericIsZero = 2091 "e-p:64:64-p1:64:64-p2:64:64-p3:32:32-p4:32:32-p5:32:32" 2092 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128" 2093 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-A5"; 2094 2095 class AMDGPUTargetInfo final : public TargetInfo { 2096 static const Builtin::Info BuiltinInfo[]; 2097 static const char * const GCCRegNames[]; 2098 2099 struct AddrSpace { 2100 unsigned Generic, Global, Local, Constant, Private; 2101 AddrSpace(bool IsGenericZero_ = false){ 2102 if (IsGenericZero_) { 2103 Generic = 0; 2104 Global = 1; 2105 Local = 3; 2106 Constant = 2; 2107 Private = 5; 2108 } else { 2109 Generic = 4; 2110 Global = 1; 2111 Local = 3; 2112 Constant = 2; 2113 Private = 0; 2114 } 2115 } 2116 }; 2117 2118 /// \brief The GPU profiles supported by the AMDGPU target. 2119 enum GPUKind { 2120 GK_NONE, 2121 GK_R600, 2122 GK_R600_DOUBLE_OPS, 2123 GK_R700, 2124 GK_R700_DOUBLE_OPS, 2125 GK_EVERGREEN, 2126 GK_EVERGREEN_DOUBLE_OPS, 2127 GK_NORTHERN_ISLANDS, 2128 GK_CAYMAN, 2129 GK_GFX6, 2130 GK_GFX7, 2131 GK_GFX8, 2132 GK_GFX9 2133 } GPU; 2134 2135 bool hasFP64:1; 2136 bool hasFMAF:1; 2137 bool hasLDEXPF:1; 2138 const AddrSpace AS; 2139 2140 static bool hasFullSpeedFMAF32(StringRef GPUName) { 2141 return parseAMDGCNName(GPUName) >= GK_GFX9; 2142 } 2143 2144 static bool isAMDGCN(const llvm::Triple &TT) { 2145 return TT.getArch() == llvm::Triple::amdgcn; 2146 } 2147 2148 static bool isGenericZero(const llvm::Triple &TT) { 2149 return TT.getEnvironmentName() == "amdgiz" || 2150 TT.getEnvironmentName() == "amdgizcl"; 2151 } 2152 public: 2153 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 2154 : TargetInfo(Triple) , 2155 GPU(isAMDGCN(Triple) ? GK_GFX6 : GK_R600), 2156 hasFP64(false), 2157 hasFMAF(false), 2158 hasLDEXPF(false), 2159 AS(isGenericZero(Triple)){ 2160 if (getTriple().getArch() == llvm::Triple::amdgcn) { 2161 hasFP64 = true; 2162 hasFMAF = true; 2163 hasLDEXPF = true; 2164 } 2165 auto IsGenericZero = isGenericZero(Triple); 2166 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ? 2167 (IsGenericZero ? DataLayoutStringSIGenericIsZero : 2168 DataLayoutStringSIPrivateIsZero) 2169 : DataLayoutStringR600); 2170 assert(DataLayout->getAllocaAddrSpace() == AS.Private); 2171 2172 UseAddrSpaceMapMangling = true; 2173 } 2174 2175 void adjust(LangOptions &Opts) override { 2176 TargetInfo::adjust(Opts); 2177 if (isGenericZero(getTriple())) { 2178 AddrSpaceMap = Opts.OpenCL ? &AMDGPUOpenCLGenericIsZeroMap 2179 : &AMDGPUNonOpenCLGenericIsZeroMap; 2180 } else { 2181 AddrSpaceMap = Opts.OpenCL ? &AMDGPUOpenCLPrivateIsZeroMap 2182 : &AMDGPUNonOpenCLPrivateIsZeroMap; 2183 } 2184 } 2185 2186 uint64_t getPointerWidthV(unsigned AddrSpace) const override { 2187 if (GPU <= GK_CAYMAN) 2188 return 32; 2189 2190 if (AddrSpace == AS.Private || AddrSpace == AS.Local) { 2191 return 32; 2192 } 2193 return 64; 2194 } 2195 2196 uint64_t getMaxPointerWidth() const override { 2197 return getTriple().getArch() == llvm::Triple::amdgcn ? 64 : 32; 2198 } 2199 2200 const char * getClobbers() const override { 2201 return ""; 2202 } 2203 2204 ArrayRef<const char *> getGCCRegNames() const override; 2205 2206 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override { 2207 return None; 2208 } 2209 2210 bool validateAsmConstraint(const char *&Name, 2211 TargetInfo::ConstraintInfo &Info) const override { 2212 switch (*Name) { 2213 default: break; 2214 case 'v': // vgpr 2215 case 's': // sgpr 2216 Info.setAllowsRegister(); 2217 return true; 2218 } 2219 return false; 2220 } 2221 2222 bool initFeatureMap(llvm::StringMap<bool> &Features, 2223 DiagnosticsEngine &Diags, StringRef CPU, 2224 const std::vector<std::string> &FeatureVec) const override; 2225 2226 void adjustTargetOptions(const CodeGenOptions &CGOpts, 2227 TargetOptions &TargetOpts) const override { 2228 bool hasFP32Denormals = false; 2229 bool hasFP64Denormals = false; 2230 for (auto &I : TargetOpts.FeaturesAsWritten) { 2231 if (I == "+fp32-denormals" || I == "-fp32-denormals") 2232 hasFP32Denormals = true; 2233 if (I == "+fp64-fp16-denormals" || I == "-fp64-fp16-denormals") 2234 hasFP64Denormals = true; 2235 } 2236 if (!hasFP32Denormals) 2237 TargetOpts.Features.push_back( 2238 (Twine(hasFullSpeedFMAF32(TargetOpts.CPU) && 2239 !CGOpts.FlushDenorm ? '+' : '-') + Twine("fp32-denormals")).str()); 2240 // Always do not flush fp64 or fp16 denorms. 2241 if (!hasFP64Denormals && hasFP64) 2242 TargetOpts.Features.push_back("+fp64-fp16-denormals"); 2243 } 2244 2245 ArrayRef<Builtin::Info> getTargetBuiltins() const override { 2246 return llvm::makeArrayRef(BuiltinInfo, 2247 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin); 2248 } 2249 2250 void getTargetDefines(const LangOptions &Opts, 2251 MacroBuilder &Builder) const override { 2252 if (getTriple().getArch() == llvm::Triple::amdgcn) 2253 Builder.defineMacro("__AMDGCN__"); 2254 else 2255 Builder.defineMacro("__R600__"); 2256 2257 if (hasFMAF) 2258 Builder.defineMacro("__HAS_FMAF__"); 2259 if (hasLDEXPF) 2260 Builder.defineMacro("__HAS_LDEXPF__"); 2261 if (hasFP64) 2262 Builder.defineMacro("__HAS_FP64__"); 2263 } 2264 2265 BuiltinVaListKind getBuiltinVaListKind() const override { 2266 return TargetInfo::CharPtrBuiltinVaList; 2267 } 2268 2269 static GPUKind parseR600Name(StringRef Name) { 2270 return llvm::StringSwitch<GPUKind>(Name) 2271 .Case("r600" , GK_R600) 2272 .Case("rv610", GK_R600) 2273 .Case("rv620", GK_R600) 2274 .Case("rv630", GK_R600) 2275 .Case("rv635", GK_R600) 2276 .Case("rs780", GK_R600) 2277 .Case("rs880", GK_R600) 2278 .Case("rv670", GK_R600_DOUBLE_OPS) 2279 .Case("rv710", GK_R700) 2280 .Case("rv730", GK_R700) 2281 .Case("rv740", GK_R700_DOUBLE_OPS) 2282 .Case("rv770", GK_R700_DOUBLE_OPS) 2283 .Case("palm", GK_EVERGREEN) 2284 .Case("cedar", GK_EVERGREEN) 2285 .Case("sumo", GK_EVERGREEN) 2286 .Case("sumo2", GK_EVERGREEN) 2287 .Case("redwood", GK_EVERGREEN) 2288 .Case("juniper", GK_EVERGREEN) 2289 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS) 2290 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS) 2291 .Case("barts", GK_NORTHERN_ISLANDS) 2292 .Case("turks", GK_NORTHERN_ISLANDS) 2293 .Case("caicos", GK_NORTHERN_ISLANDS) 2294 .Case("cayman", GK_CAYMAN) 2295 .Case("aruba", GK_CAYMAN) 2296 .Default(GK_NONE); 2297 } 2298 2299 static GPUKind parseAMDGCNName(StringRef Name) { 2300 return llvm::StringSwitch<GPUKind>(Name) 2301 .Case("tahiti", GK_GFX6) 2302 .Case("pitcairn", GK_GFX6) 2303 .Case("verde", GK_GFX6) 2304 .Case("oland", GK_GFX6) 2305 .Case("hainan", GK_GFX6) 2306 .Case("bonaire", GK_GFX7) 2307 .Case("kabini", GK_GFX7) 2308 .Case("kaveri", GK_GFX7) 2309 .Case("hawaii", GK_GFX7) 2310 .Case("mullins", GK_GFX7) 2311 .Case("gfx700", GK_GFX7) 2312 .Case("gfx701", GK_GFX7) 2313 .Case("gfx702", GK_GFX7) 2314 .Case("tonga", GK_GFX8) 2315 .Case("iceland", GK_GFX8) 2316 .Case("carrizo", GK_GFX8) 2317 .Case("fiji", GK_GFX8) 2318 .Case("stoney", GK_GFX8) 2319 .Case("polaris10", GK_GFX8) 2320 .Case("polaris11", GK_GFX8) 2321 .Case("gfx800", GK_GFX8) 2322 .Case("gfx801", GK_GFX8) 2323 .Case("gfx802", GK_GFX8) 2324 .Case("gfx803", GK_GFX8) 2325 .Case("gfx804", GK_GFX8) 2326 .Case("gfx810", GK_GFX8) 2327 .Case("gfx900", GK_GFX9) 2328 .Case("gfx901", GK_GFX9) 2329 .Default(GK_NONE); 2330 } 2331 2332 bool setCPU(const std::string &Name) override { 2333 if (getTriple().getArch() == llvm::Triple::amdgcn) 2334 GPU = parseAMDGCNName(Name); 2335 else 2336 GPU = parseR600Name(Name); 2337 2338 return GPU != GK_NONE; 2339 } 2340 2341 void setSupportedOpenCLOpts() override { 2342 auto &Opts = getSupportedOpenCLOpts(); 2343 Opts.support("cl_clang_storage_class_specifiers"); 2344 Opts.support("cl_khr_icd"); 2345 2346 if (hasFP64) 2347 Opts.support("cl_khr_fp64"); 2348 if (GPU >= GK_EVERGREEN) { 2349 Opts.support("cl_khr_byte_addressable_store"); 2350 Opts.support("cl_khr_global_int32_base_atomics"); 2351 Opts.support("cl_khr_global_int32_extended_atomics"); 2352 Opts.support("cl_khr_local_int32_base_atomics"); 2353 Opts.support("cl_khr_local_int32_extended_atomics"); 2354 } 2355 if (GPU >= GK_GFX6) { 2356 Opts.support("cl_khr_fp16"); 2357 Opts.support("cl_khr_int64_base_atomics"); 2358 Opts.support("cl_khr_int64_extended_atomics"); 2359 Opts.support("cl_khr_mipmap_image"); 2360 Opts.support("cl_khr_subgroups"); 2361 Opts.support("cl_khr_3d_image_writes"); 2362 Opts.support("cl_amd_media_ops"); 2363 Opts.support("cl_amd_media_ops2"); 2364 } 2365 } 2366 2367 LangAS::ID getOpenCLImageAddrSpace() const override { 2368 return LangAS::opencl_constant; 2369 } 2370 2371 /// \returns Target specific vtbl ptr address space. 2372 unsigned getVtblPtrAddressSpace() const override { 2373 // \todo: We currently have address spaces defined in AMDGPU Backend. It 2374 // would be nice if we could use it here instead of using bare numbers (same 2375 // applies to getDWARFAddressSpace). 2376 return 2; // constant. 2377 } 2378 2379 /// \returns If a target requires an address within a target specific address 2380 /// space \p AddressSpace to be converted in order to be used, then return the 2381 /// corresponding target specific DWARF address space. 2382 /// 2383 /// \returns Otherwise return None and no conversion will be emitted in the 2384 /// DWARF. 2385 Optional<unsigned> getDWARFAddressSpace( 2386 unsigned AddressSpace) const override { 2387 const unsigned DWARF_Private = 1; 2388 const unsigned DWARF_Local = 2; 2389 if (AddressSpace == AS.Private) { 2390 return DWARF_Private; 2391 } else if (AddressSpace == AS.Local) { 2392 return DWARF_Local; 2393 } else { 2394 return None; 2395 } 2396 } 2397 2398 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override { 2399 switch (CC) { 2400 default: 2401 return CCCR_Warning; 2402 case CC_C: 2403 case CC_OpenCLKernel: 2404 return CCCR_OK; 2405 } 2406 } 2407 2408 // In amdgcn target the null pointer in global, constant, and generic 2409 // address space has value 0 but in private and local address space has 2410 // value ~0. 2411 uint64_t getNullPointerValue(unsigned AS) const override { 2412 return AS == LangAS::opencl_local ? ~0 : 0; 2413 } 2414 }; 2415 2416 const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = { 2417 #define BUILTIN(ID, TYPE, ATTRS) \ 2418 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr }, 2419 #define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \ 2420 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE }, 2421 #include "clang/Basic/BuiltinsAMDGPU.def" 2422 }; 2423 const char * const AMDGPUTargetInfo::GCCRegNames[] = { 2424 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", 2425 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", 2426 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", 2427 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31", 2428 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39", 2429 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47", 2430 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55", 2431 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63", 2432 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71", 2433 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79", 2434 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87", 2435 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95", 2436 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103", 2437 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111", 2438 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119", 2439 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127", 2440 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135", 2441 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143", 2442 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151", 2443 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159", 2444 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167", 2445 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175", 2446 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183", 2447 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191", 2448 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199", 2449 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207", 2450 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215", 2451 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223", 2452 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231", 2453 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239", 2454 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247", 2455 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255", 2456 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", 2457 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15", 2458 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23", 2459 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31", 2460 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39", 2461 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47", 2462 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55", 2463 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63", 2464 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71", 2465 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79", 2466 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87", 2467 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95", 2468 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103", 2469 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111", 2470 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119", 2471 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127", 2472 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi", 2473 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi" 2474 }; 2475 2476 ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const { 2477 return llvm::makeArrayRef(GCCRegNames); 2478 } 2479 2480 bool AMDGPUTargetInfo::initFeatureMap( 2481 llvm::StringMap<bool> &Features, 2482 DiagnosticsEngine &Diags, StringRef CPU, 2483 const std::vector<std::string> &FeatureVec) const { 2484 2485 // XXX - What does the member GPU mean if device name string passed here? 2486 if (getTriple().getArch() == llvm::Triple::amdgcn) { 2487 if (CPU.empty()) 2488 CPU = "tahiti"; 2489 2490 switch (parseAMDGCNName(CPU)) { 2491 case GK_GFX6: 2492 case GK_GFX7: 2493 break; 2494 2495 case GK_GFX9: 2496 Features["gfx9-insts"] = true; 2497 LLVM_FALLTHROUGH; 2498 case GK_GFX8: 2499 Features["s-memrealtime"] = true; 2500 Features["16-bit-insts"] = true; 2501 Features["dpp"] = true; 2502 break; 2503 2504 case GK_NONE: 2505 return false; 2506 default: 2507 llvm_unreachable("unhandled subtarget"); 2508 } 2509 } else { 2510 if (CPU.empty()) 2511 CPU = "r600"; 2512 2513 switch (parseR600Name(CPU)) { 2514 case GK_R600: 2515 case GK_R700: 2516 case GK_EVERGREEN: 2517 case GK_NORTHERN_ISLANDS: 2518 break; 2519 case GK_R600_DOUBLE_OPS: 2520 case GK_R700_DOUBLE_OPS: 2521 case GK_EVERGREEN_DOUBLE_OPS: 2522 case GK_CAYMAN: 2523 Features["fp64"] = true; 2524 break; 2525 case GK_NONE: 2526 return false; 2527 default: 2528 llvm_unreachable("unhandled subtarget"); 2529 } 2530 } 2531 2532 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec); 2533 } 2534 2535 const Builtin::Info BuiltinInfoX86[] = { 2536 #define BUILTIN(ID, TYPE, ATTRS) \ 2537 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr }, 2538 #define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \ 2539 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE }, 2540 #define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \ 2541 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE }, 2542 #include "clang/Basic/BuiltinsX86.def" 2543 2544 #define BUILTIN(ID, TYPE, ATTRS) \ 2545 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr }, 2546 #define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \ 2547 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE }, 2548 #define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \ 2549 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE }, 2550 #include "clang/Basic/BuiltinsX86_64.def" 2551 }; 2552 2553 2554 static const char* const GCCRegNames[] = { 2555 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp", 2556 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)", 2557 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame", 2558 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7", 2559 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7", 2560 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", 2561 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15", 2562 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7", 2563 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15", 2564 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23", 2565 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31", 2566 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23", 2567 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31", 2568 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7", 2569 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15", 2570 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23", 2571 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31", 2572 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7", 2573 }; 2574 2575 const TargetInfo::AddlRegName AddlRegNames[] = { 2576 { { "al", "ah", "eax", "rax" }, 0 }, 2577 { { "bl", "bh", "ebx", "rbx" }, 3 }, 2578 { { "cl", "ch", "ecx", "rcx" }, 2 }, 2579 { { "dl", "dh", "edx", "rdx" }, 1 }, 2580 { { "esi", "rsi" }, 4 }, 2581 { { "edi", "rdi" }, 5 }, 2582 { { "esp", "rsp" }, 7 }, 2583 { { "ebp", "rbp" }, 6 }, 2584 { { "r8d", "r8w", "r8b" }, 38 }, 2585 { { "r9d", "r9w", "r9b" }, 39 }, 2586 { { "r10d", "r10w", "r10b" }, 40 }, 2587 { { "r11d", "r11w", "r11b" }, 41 }, 2588 { { "r12d", "r12w", "r12b" }, 42 }, 2589 { { "r13d", "r13w", "r13b" }, 43 }, 2590 { { "r14d", "r14w", "r14b" }, 44 }, 2591 { { "r15d", "r15w", "r15b" }, 45 }, 2592 }; 2593 2594 // X86 target abstract base class; x86-32 and x86-64 are very close, so 2595 // most of the implementation can be shared. 2596 class X86TargetInfo : public TargetInfo { 2597 enum X86SSEEnum { 2598 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F 2599 } SSELevel = NoSSE; 2600 enum MMX3DNowEnum { 2601 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon 2602 } MMX3DNowLevel = NoMMX3DNow; 2603 enum XOPEnum { 2604 NoXOP, 2605 SSE4A, 2606 FMA4, 2607 XOP 2608 } XOPLevel = NoXOP; 2609 2610 bool HasAES = false; 2611 bool HasPCLMUL = false; 2612 bool HasLZCNT = false; 2613 bool HasRDRND = false; 2614 bool HasFSGSBASE = false; 2615 bool HasBMI = false; 2616 bool HasBMI2 = false; 2617 bool HasPOPCNT = false; 2618 bool HasRTM = false; 2619 bool HasPRFCHW = false; 2620 bool HasRDSEED = false; 2621 bool HasADX = false; 2622 bool HasTBM = false; 2623 bool HasLWP = false; 2624 bool HasFMA = false; 2625 bool HasF16C = false; 2626 bool HasAVX512CD = false; 2627 bool HasAVX512VPOPCNTDQ = false; 2628 bool HasAVX512ER = false; 2629 bool HasAVX512PF = false; 2630 bool HasAVX512DQ = false; 2631 bool HasAVX512BW = false; 2632 bool HasAVX512VL = false; 2633 bool HasAVX512VBMI = false; 2634 bool HasAVX512IFMA = false; 2635 bool HasSHA = false; 2636 bool HasMPX = false; 2637 bool HasSGX = false; 2638 bool HasCX16 = false; 2639 bool HasFXSR = false; 2640 bool HasXSAVE = false; 2641 bool HasXSAVEOPT = false; 2642 bool HasXSAVEC = false; 2643 bool HasXSAVES = false; 2644 bool HasMWAITX = false; 2645 bool HasCLZERO = false; 2646 bool HasPKU = false; 2647 bool HasCLFLUSHOPT = false; 2648 bool HasCLWB = false; 2649 bool HasMOVBE = false; 2650 bool HasPREFETCHWT1 = false; 2651 2652 /// \brief Enumeration of all of the X86 CPUs supported by Clang. 2653 /// 2654 /// Each enumeration represents a particular CPU supported by Clang. These 2655 /// loosely correspond to the options passed to '-march' or '-mtune' flags. 2656 enum CPUKind { 2657 CK_Generic, 2658 2659 /// \name i386 2660 /// i386-generation processors. 2661 //@{ 2662 CK_i386, 2663 //@} 2664 2665 /// \name i486 2666 /// i486-generation processors. 2667 //@{ 2668 CK_i486, 2669 CK_WinChipC6, 2670 CK_WinChip2, 2671 CK_C3, 2672 //@} 2673 2674 /// \name i586 2675 /// i586-generation processors, P5 microarchitecture based. 2676 //@{ 2677 CK_i586, 2678 CK_Pentium, 2679 CK_PentiumMMX, 2680 //@} 2681 2682 /// \name i686 2683 /// i686-generation processors, P6 / Pentium M microarchitecture based. 2684 //@{ 2685 CK_i686, 2686 CK_PentiumPro, 2687 CK_Pentium2, 2688 CK_Pentium3, 2689 CK_Pentium3M, 2690 CK_PentiumM, 2691 CK_C3_2, 2692 2693 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah. 2694 /// Clang however has some logic to suport this. 2695 // FIXME: Warn, deprecate, and potentially remove this. 2696 CK_Yonah, 2697 //@} 2698 2699 /// \name Netburst 2700 /// Netburst microarchitecture based processors. 2701 //@{ 2702 CK_Pentium4, 2703 CK_Pentium4M, 2704 CK_Prescott, 2705 CK_Nocona, 2706 //@} 2707 2708 /// \name Core 2709 /// Core microarchitecture based processors. 2710 //@{ 2711 CK_Core2, 2712 2713 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another 2714 /// codename which GCC no longer accepts as an option to -march, but Clang 2715 /// has some logic for recognizing it. 2716 // FIXME: Warn, deprecate, and potentially remove this. 2717 CK_Penryn, 2718 //@} 2719 2720 /// \name Atom 2721 /// Atom processors 2722 //@{ 2723 CK_Bonnell, 2724 CK_Silvermont, 2725 //@} 2726 2727 /// \name Nehalem 2728 /// Nehalem microarchitecture based processors. 2729 CK_Nehalem, 2730 2731 /// \name Westmere 2732 /// Westmere microarchitecture based processors. 2733 CK_Westmere, 2734 2735 /// \name Sandy Bridge 2736 /// Sandy Bridge microarchitecture based processors. 2737 CK_SandyBridge, 2738 2739 /// \name Ivy Bridge 2740 /// Ivy Bridge microarchitecture based processors. 2741 CK_IvyBridge, 2742 2743 /// \name Haswell 2744 /// Haswell microarchitecture based processors. 2745 CK_Haswell, 2746 2747 /// \name Broadwell 2748 /// Broadwell microarchitecture based processors. 2749 CK_Broadwell, 2750 2751 /// \name Skylake Client 2752 /// Skylake client microarchitecture based processors. 2753 CK_SkylakeClient, 2754 2755 /// \name Skylake Server 2756 /// Skylake server microarchitecture based processors. 2757 CK_SkylakeServer, 2758 2759 /// \name Cannonlake Client 2760 /// Cannonlake client microarchitecture based processors. 2761 CK_Cannonlake, 2762 2763 /// \name Knights Landing 2764 /// Knights Landing processor. 2765 CK_KNL, 2766 2767 /// \name Lakemont 2768 /// Lakemont microarchitecture based processors. 2769 CK_Lakemont, 2770 2771 /// \name K6 2772 /// K6 architecture processors. 2773 //@{ 2774 CK_K6, 2775 CK_K6_2, 2776 CK_K6_3, 2777 //@} 2778 2779 /// \name K7 2780 /// K7 architecture processors. 2781 //@{ 2782 CK_Athlon, 2783 CK_AthlonThunderbird, 2784 CK_Athlon4, 2785 CK_AthlonXP, 2786 CK_AthlonMP, 2787 //@} 2788 2789 /// \name K8 2790 /// K8 architecture processors. 2791 //@{ 2792 CK_Athlon64, 2793 CK_Athlon64SSE3, 2794 CK_AthlonFX, 2795 CK_K8, 2796 CK_K8SSE3, 2797 CK_Opteron, 2798 CK_OpteronSSE3, 2799 CK_AMDFAM10, 2800 //@} 2801 2802 /// \name Bobcat 2803 /// Bobcat architecture processors. 2804 //@{ 2805 CK_BTVER1, 2806 CK_BTVER2, 2807 //@} 2808 2809 /// \name Bulldozer 2810 /// Bulldozer architecture processors. 2811 //@{ 2812 CK_BDVER1, 2813 CK_BDVER2, 2814 CK_BDVER3, 2815 CK_BDVER4, 2816 //@} 2817 2818 /// \name zen 2819 /// Zen architecture processors. 2820 //@{ 2821 CK_ZNVER1, 2822 //@} 2823 2824 /// This specification is deprecated and will be removed in the future. 2825 /// Users should prefer \see CK_K8. 2826 // FIXME: Warn on this when the CPU is set to it. 2827 //@{ 2828 CK_x86_64, 2829 //@} 2830 2831 /// \name Geode 2832 /// Geode processors. 2833 //@{ 2834 CK_Geode 2835 //@} 2836 } CPU = CK_Generic; 2837 2838 CPUKind getCPUKind(StringRef CPU) const { 2839 return llvm::StringSwitch<CPUKind>(CPU) 2840 .Case("i386", CK_i386) 2841 .Case("i486", CK_i486) 2842 .Case("winchip-c6", CK_WinChipC6) 2843 .Case("winchip2", CK_WinChip2) 2844 .Case("c3", CK_C3) 2845 .Case("i586", CK_i586) 2846 .Case("pentium", CK_Pentium) 2847 .Case("pentium-mmx", CK_PentiumMMX) 2848 .Case("i686", CK_i686) 2849 .Case("pentiumpro", CK_PentiumPro) 2850 .Case("pentium2", CK_Pentium2) 2851 .Case("pentium3", CK_Pentium3) 2852 .Case("pentium3m", CK_Pentium3M) 2853 .Case("pentium-m", CK_PentiumM) 2854 .Case("c3-2", CK_C3_2) 2855 .Case("yonah", CK_Yonah) 2856 .Case("pentium4", CK_Pentium4) 2857 .Case("pentium4m", CK_Pentium4M) 2858 .Case("prescott", CK_Prescott) 2859 .Case("nocona", CK_Nocona) 2860 .Case("core2", CK_Core2) 2861 .Case("penryn", CK_Penryn) 2862 .Case("bonnell", CK_Bonnell) 2863 .Case("atom", CK_Bonnell) // Legacy name. 2864 .Case("silvermont", CK_Silvermont) 2865 .Case("slm", CK_Silvermont) // Legacy name. 2866 .Case("nehalem", CK_Nehalem) 2867 .Case("corei7", CK_Nehalem) // Legacy name. 2868 .Case("westmere", CK_Westmere) 2869 .Case("sandybridge", CK_SandyBridge) 2870 .Case("corei7-avx", CK_SandyBridge) // Legacy name. 2871 .Case("ivybridge", CK_IvyBridge) 2872 .Case("core-avx-i", CK_IvyBridge) // Legacy name. 2873 .Case("haswell", CK_Haswell) 2874 .Case("core-avx2", CK_Haswell) // Legacy name. 2875 .Case("broadwell", CK_Broadwell) 2876 .Case("skylake", CK_SkylakeClient) 2877 .Case("skylake-avx512", CK_SkylakeServer) 2878 .Case("skx", CK_SkylakeServer) // Legacy name. 2879 .Case("cannonlake", CK_Cannonlake) 2880 .Case("knl", CK_KNL) 2881 .Case("lakemont", CK_Lakemont) 2882 .Case("k6", CK_K6) 2883 .Case("k6-2", CK_K6_2) 2884 .Case("k6-3", CK_K6_3) 2885 .Case("athlon", CK_Athlon) 2886 .Case("athlon-tbird", CK_AthlonThunderbird) 2887 .Case("athlon-4", CK_Athlon4) 2888 .Case("athlon-xp", CK_AthlonXP) 2889 .Case("athlon-mp", CK_AthlonMP) 2890 .Case("athlon64", CK_Athlon64) 2891 .Case("athlon64-sse3", CK_Athlon64SSE3) 2892 .Case("athlon-fx", CK_AthlonFX) 2893 .Case("k8", CK_K8) 2894 .Case("k8-sse3", CK_K8SSE3) 2895 .Case("opteron", CK_Opteron) 2896 .Case("opteron-sse3", CK_OpteronSSE3) 2897 .Case("barcelona", CK_AMDFAM10) 2898 .Case("amdfam10", CK_AMDFAM10) 2899 .Case("btver1", CK_BTVER1) 2900 .Case("btver2", CK_BTVER2) 2901 .Case("bdver1", CK_BDVER1) 2902 .Case("bdver2", CK_BDVER2) 2903 .Case("bdver3", CK_BDVER3) 2904 .Case("bdver4", CK_BDVER4) 2905 .Case("znver1", CK_ZNVER1) 2906 .Case("x86-64", CK_x86_64) 2907 .Case("geode", CK_Geode) 2908 .Default(CK_Generic); 2909 } 2910 2911 enum FPMathKind { 2912 FP_Default, 2913 FP_SSE, 2914 FP_387 2915 } FPMath = FP_Default; 2916 2917 public: 2918 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &) 2919 : TargetInfo(Triple) { 2920 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended(); 2921 } 2922 unsigned getFloatEvalMethod() const override { 2923 // X87 evaluates with 80 bits "long double" precision. 2924 return SSELevel == NoSSE ? 2 : 0; 2925 } 2926 ArrayRef<const char *> getGCCRegNames() const override { 2927 return llvm::makeArrayRef(GCCRegNames); 2928 } 2929 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override { 2930 return None; 2931 } 2932 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override { 2933 return llvm::makeArrayRef(AddlRegNames); 2934 } 2935 bool validateCpuSupports(StringRef Name) const override; 2936 bool validateAsmConstraint(const char *&Name, 2937 TargetInfo::ConstraintInfo &info) const override; 2938 2939 bool validateGlobalRegisterVariable(StringRef RegName, 2940 unsigned RegSize, 2941 bool &HasSizeMismatch) const override { 2942 // esp and ebp are the only 32-bit registers the x86 backend can currently 2943 // handle. 2944 if (RegName.equals("esp") || RegName.equals("ebp")) { 2945 // Check that the register size is 32-bit. 2946 HasSizeMismatch = RegSize != 32; 2947 return true; 2948 } 2949 2950 return false; 2951 } 2952 2953 bool validateOutputSize(StringRef Constraint, unsigned Size) const override; 2954 2955 bool validateInputSize(StringRef Constraint, unsigned Size) const override; 2956 2957 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const; 2958 2959 std::string convertConstraint(const char *&Constraint) const override; 2960 const char *getClobbers() const override { 2961 return "~{dirflag},~{fpsr},~{flags}"; 2962 } 2963 2964 StringRef getConstraintRegister(const StringRef &Constraint, 2965 const StringRef &Expression) const override { 2966 StringRef::iterator I, E; 2967 for (I = Constraint.begin(), E = Constraint.end(); I != E; ++I) { 2968 if (isalpha(*I)) 2969 break; 2970 } 2971 if (I == E) 2972 return ""; 2973 switch (*I) { 2974 // For the register constraints, return the matching register name 2975 case 'a': 2976 return "ax"; 2977 case 'b': 2978 return "bx"; 2979 case 'c': 2980 return "cx"; 2981 case 'd': 2982 return "dx"; 2983 case 'S': 2984 return "si"; 2985 case 'D': 2986 return "di"; 2987 // In case the constraint is 'r' we need to return Expression 2988 case 'r': 2989 return Expression; 2990 default: 2991 // Default value if there is no constraint for the register 2992 return ""; 2993 } 2994 return ""; 2995 } 2996 2997 void getTargetDefines(const LangOptions &Opts, 2998 MacroBuilder &Builder) const override; 2999 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level, 3000 bool Enabled); 3001 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level, 3002 bool Enabled); 3003 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level, 3004 bool Enabled); 3005 void setFeatureEnabled(llvm::StringMap<bool> &Features, 3006 StringRef Name, bool Enabled) const override { 3007 setFeatureEnabledImpl(Features, Name, Enabled); 3008 } 3009 // This exists purely to cut down on the number of virtual calls in 3010 // initFeatureMap which calls this repeatedly. 3011 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features, 3012 StringRef Name, bool Enabled); 3013 bool 3014 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, 3015 StringRef CPU, 3016 const std::vector<std::string> &FeaturesVec) const override; 3017 bool hasFeature(StringRef Feature) const override; 3018 bool handleTargetFeatures(std::vector<std::string> &Features, 3019 DiagnosticsEngine &Diags) override; 3020 StringRef getABI() const override { 3021 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F) 3022 return "avx512"; 3023 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX) 3024 return "avx"; 3025 if (getTriple().getArch() == llvm::Triple::x86 && 3026 MMX3DNowLevel == NoMMX3DNow) 3027 return "no-mmx"; 3028 return ""; 3029 } 3030 bool setCPU(const std::string &Name) override { 3031 CPU = getCPUKind(Name); 3032 3033 // Perform any per-CPU checks necessary to determine if this CPU is 3034 // acceptable. 3035 // FIXME: This results in terrible diagnostics. Clang just says the CPU is 3036 // invalid without explaining *why*. 3037 switch (CPU) { 3038 case CK_Generic: 3039 // No processor selected! 3040 return false; 3041 3042 case CK_i386: 3043 case CK_i486: 3044 case CK_WinChipC6: 3045 case CK_WinChip2: 3046 case CK_C3: 3047 case CK_i586: 3048 case CK_Pentium: 3049 case CK_PentiumMMX: 3050 case CK_i686: 3051 case CK_PentiumPro: 3052 case CK_Pentium2: 3053 case CK_Pentium3: 3054 case CK_Pentium3M: 3055 case CK_PentiumM: 3056 case CK_Yonah: 3057 case CK_C3_2: 3058 case CK_Pentium4: 3059 case CK_Pentium4M: 3060 case CK_Lakemont: 3061 case CK_Prescott: 3062 case CK_K6: 3063 case CK_K6_2: 3064 case CK_K6_3: 3065 case CK_Athlon: 3066 case CK_AthlonThunderbird: 3067 case CK_Athlon4: 3068 case CK_AthlonXP: 3069 case CK_AthlonMP: 3070 case CK_Geode: 3071 // Only accept certain architectures when compiling in 32-bit mode. 3072 if (getTriple().getArch() != llvm::Triple::x86) 3073 return false; 3074 3075 // Fallthrough 3076 case CK_Nocona: 3077 case CK_Core2: 3078 case CK_Penryn: 3079 case CK_Bonnell: 3080 case CK_Silvermont: 3081 case CK_Nehalem: 3082 case CK_Westmere: 3083 case CK_SandyBridge: 3084 case CK_IvyBridge: 3085 case CK_Haswell: 3086 case CK_Broadwell: 3087 case CK_SkylakeClient: 3088 case CK_SkylakeServer: 3089 case CK_Cannonlake: 3090 case CK_KNL: 3091 case CK_Athlon64: 3092 case CK_Athlon64SSE3: 3093 case CK_AthlonFX: 3094 case CK_K8: 3095 case CK_K8SSE3: 3096 case CK_Opteron: 3097 case CK_OpteronSSE3: 3098 case CK_AMDFAM10: 3099 case CK_BTVER1: 3100 case CK_BTVER2: 3101 case CK_BDVER1: 3102 case CK_BDVER2: 3103 case CK_BDVER3: 3104 case CK_BDVER4: 3105 case CK_ZNVER1: 3106 case CK_x86_64: 3107 return true; 3108 } 3109 llvm_unreachable("Unhandled CPU kind"); 3110 } 3111 3112 bool setFPMath(StringRef Name) override; 3113 3114 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override { 3115 // Most of the non-ARM calling conventions are i386 conventions. 3116 switch (CC) { 3117 case CC_X86ThisCall: 3118 case CC_X86FastCall: 3119 case CC_X86StdCall: 3120 case CC_X86VectorCall: 3121 case CC_X86RegCall: 3122 case CC_C: 3123 case CC_Swift: 3124 case CC_X86Pascal: 3125 case CC_IntelOclBicc: 3126 case CC_OpenCLKernel: 3127 return CCCR_OK; 3128 default: 3129 return CCCR_Warning; 3130 } 3131 } 3132 3133 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override { 3134 return MT == CCMT_Member ? CC_X86ThisCall : CC_C; 3135 } 3136 3137 bool hasSjLjLowering() const override { 3138 return true; 3139 } 3140 3141 void setSupportedOpenCLOpts() override { 3142 getSupportedOpenCLOpts().supportAll(); 3143 } 3144 }; 3145 3146 bool X86TargetInfo::setFPMath(StringRef Name) { 3147 if (Name == "387") { 3148 FPMath = FP_387; 3149 return true; 3150 } 3151 if (Name == "sse") { 3152 FPMath = FP_SSE; 3153 return true; 3154 } 3155 return false; 3156 } 3157 3158 bool X86TargetInfo::initFeatureMap( 3159 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU, 3160 const std::vector<std::string> &FeaturesVec) const { 3161 // FIXME: This *really* should not be here. 3162 // X86_64 always has SSE2. 3163 if (getTriple().getArch() == llvm::Triple::x86_64) 3164 setFeatureEnabledImpl(Features, "sse2", true); 3165 3166 const CPUKind Kind = getCPUKind(CPU); 3167 3168 // Enable X87 for all X86 processors but Lakemont. 3169 if (Kind != CK_Lakemont) 3170 setFeatureEnabledImpl(Features, "x87", true); 3171 3172 switch (Kind) { 3173 case CK_Generic: 3174 case CK_i386: 3175 case CK_i486: 3176 case CK_i586: 3177 case CK_Pentium: 3178 case CK_i686: 3179 case CK_PentiumPro: 3180 case CK_Lakemont: 3181 break; 3182 case CK_PentiumMMX: 3183 case CK_Pentium2: 3184 case CK_K6: 3185 case CK_WinChipC6: 3186 setFeatureEnabledImpl(Features, "mmx", true); 3187 break; 3188 case CK_Pentium3: 3189 case CK_Pentium3M: 3190 case CK_C3_2: 3191 setFeatureEnabledImpl(Features, "sse", true); 3192 setFeatureEnabledImpl(Features, "fxsr", true); 3193 break; 3194 case CK_PentiumM: 3195 case CK_Pentium4: 3196 case CK_Pentium4M: 3197 case CK_x86_64: 3198 setFeatureEnabledImpl(Features, "sse2", true); 3199 setFeatureEnabledImpl(Features, "fxsr", true); 3200 break; 3201 case CK_Yonah: 3202 case CK_Prescott: 3203 case CK_Nocona: 3204 setFeatureEnabledImpl(Features, "sse3", true); 3205 setFeatureEnabledImpl(Features, "fxsr", true); 3206 setFeatureEnabledImpl(Features, "cx16", true); 3207 break; 3208 case CK_Core2: 3209 case CK_Bonnell: 3210 setFeatureEnabledImpl(Features, "ssse3", true); 3211 setFeatureEnabledImpl(Features, "fxsr", true); 3212 setFeatureEnabledImpl(Features, "cx16", true); 3213 break; 3214 case CK_Penryn: 3215 setFeatureEnabledImpl(Features, "sse4.1", true); 3216 setFeatureEnabledImpl(Features, "fxsr", true); 3217 setFeatureEnabledImpl(Features, "cx16", true); 3218 break; 3219 case CK_Cannonlake: 3220 setFeatureEnabledImpl(Features, "avx512ifma", true); 3221 setFeatureEnabledImpl(Features, "avx512vbmi", true); 3222 setFeatureEnabledImpl(Features, "sha", true); 3223 LLVM_FALLTHROUGH; 3224 case CK_SkylakeServer: 3225 setFeatureEnabledImpl(Features, "avx512f", true); 3226 setFeatureEnabledImpl(Features, "avx512cd", true); 3227 setFeatureEnabledImpl(Features, "avx512dq", true); 3228 setFeatureEnabledImpl(Features, "avx512bw", true); 3229 setFeatureEnabledImpl(Features, "avx512vl", true); 3230 setFeatureEnabledImpl(Features, "pku", true); 3231 setFeatureEnabledImpl(Features, "clwb", true); 3232 LLVM_FALLTHROUGH; 3233 case CK_SkylakeClient: 3234 setFeatureEnabledImpl(Features, "xsavec", true); 3235 setFeatureEnabledImpl(Features, "xsaves", true); 3236 setFeatureEnabledImpl(Features, "mpx", true); 3237 setFeatureEnabledImpl(Features, "sgx", true); 3238 setFeatureEnabledImpl(Features, "clflushopt", true); 3239 setFeatureEnabledImpl(Features, "rtm", true); 3240 LLVM_FALLTHROUGH; 3241 case CK_Broadwell: 3242 setFeatureEnabledImpl(Features, "rdseed", true); 3243 setFeatureEnabledImpl(Features, "adx", true); 3244 LLVM_FALLTHROUGH; 3245 case CK_Haswell: 3246 setFeatureEnabledImpl(Features, "avx2", true); 3247 setFeatureEnabledImpl(Features, "lzcnt", true); 3248 setFeatureEnabledImpl(Features, "bmi", true); 3249 setFeatureEnabledImpl(Features, "bmi2", true); 3250 setFeatureEnabledImpl(Features, "fma", true); 3251 setFeatureEnabledImpl(Features, "movbe", true); 3252 LLVM_FALLTHROUGH; 3253 case CK_IvyBridge: 3254 setFeatureEnabledImpl(Features, "rdrnd", true); 3255 setFeatureEnabledImpl(Features, "f16c", true); 3256 setFeatureEnabledImpl(Features, "fsgsbase", true); 3257 LLVM_FALLTHROUGH; 3258 case CK_SandyBridge: 3259 setFeatureEnabledImpl(Features, "avx", true); 3260 setFeatureEnabledImpl(Features, "xsave", true); 3261 setFeatureEnabledImpl(Features, "xsaveopt", true); 3262 LLVM_FALLTHROUGH; 3263 case CK_Westmere: 3264 case CK_Silvermont: 3265 setFeatureEnabledImpl(Features, "aes", true); 3266 setFeatureEnabledImpl(Features, "pclmul", true); 3267 LLVM_FALLTHROUGH; 3268 case CK_Nehalem: 3269 setFeatureEnabledImpl(Features, "sse4.2", true); 3270 setFeatureEnabledImpl(Features, "fxsr", true); 3271 setFeatureEnabledImpl(Features, "cx16", true); 3272 break; 3273 case CK_KNL: 3274 setFeatureEnabledImpl(Features, "avx512f", true); 3275 setFeatureEnabledImpl(Features, "avx512cd", true); 3276 setFeatureEnabledImpl(Features, "avx512er", true); 3277 setFeatureEnabledImpl(Features, "avx512pf", true); 3278 setFeatureEnabledImpl(Features, "prefetchwt1", true); 3279 setFeatureEnabledImpl(Features, "fxsr", true); 3280 setFeatureEnabledImpl(Features, "rdseed", true); 3281 setFeatureEnabledImpl(Features, "adx", true); 3282 setFeatureEnabledImpl(Features, "lzcnt", true); 3283 setFeatureEnabledImpl(Features, "bmi", true); 3284 setFeatureEnabledImpl(Features, "bmi2", true); 3285 setFeatureEnabledImpl(Features, "rtm", true); 3286 setFeatureEnabledImpl(Features, "fma", true); 3287 setFeatureEnabledImpl(Features, "rdrnd", true); 3288 setFeatureEnabledImpl(Features, "f16c", true); 3289 setFeatureEnabledImpl(Features, "fsgsbase", true); 3290 setFeatureEnabledImpl(Features, "aes", true); 3291 setFeatureEnabledImpl(Features, "pclmul", true); 3292 setFeatureEnabledImpl(Features, "cx16", true); 3293 setFeatureEnabledImpl(Features, "xsaveopt", true); 3294 setFeatureEnabledImpl(Features, "xsave", true); 3295 setFeatureEnabledImpl(Features, "movbe", true); 3296 break; 3297 case CK_K6_2: 3298 case CK_K6_3: 3299 case CK_WinChip2: 3300 case CK_C3: 3301 setFeatureEnabledImpl(Features, "3dnow", true); 3302 break; 3303 case CK_Athlon: 3304 case CK_AthlonThunderbird: 3305 case CK_Geode: 3306 setFeatureEnabledImpl(Features, "3dnowa", true); 3307 break; 3308 case CK_Athlon4: 3309 case CK_AthlonXP: 3310 case CK_AthlonMP: 3311 setFeatureEnabledImpl(Features, "sse", true); 3312 setFeatureEnabledImpl(Features, "3dnowa", true); 3313 setFeatureEnabledImpl(Features, "fxsr", true); 3314 break; 3315 case CK_K8: 3316 case CK_Opteron: 3317 case CK_Athlon64: 3318 case CK_AthlonFX: 3319 setFeatureEnabledImpl(Features, "sse2", true); 3320 setFeatureEnabledImpl(Features, "3dnowa", true); 3321 setFeatureEnabledImpl(Features, "fxsr", true); 3322 break; 3323 case CK_AMDFAM10: 3324 setFeatureEnabledImpl(Features, "sse4a", true); 3325 setFeatureEnabledImpl(Features, "lzcnt", true); 3326 setFeatureEnabledImpl(Features, "popcnt", true); 3327 LLVM_FALLTHROUGH; 3328 case CK_K8SSE3: 3329 case CK_OpteronSSE3: 3330 case CK_Athlon64SSE3: 3331 setFeatureEnabledImpl(Features, "sse3", true); 3332 setFeatureEnabledImpl(Features, "3dnowa", true); 3333 setFeatureEnabledImpl(Features, "fxsr", true); 3334 break; 3335 case CK_BTVER2: 3336 setFeatureEnabledImpl(Features, "avx", true); 3337 setFeatureEnabledImpl(Features, "aes", true); 3338 setFeatureEnabledImpl(Features, "pclmul", true); 3339 setFeatureEnabledImpl(Features, "bmi", true); 3340 setFeatureEnabledImpl(Features, "f16c", true); 3341 setFeatureEnabledImpl(Features, "xsaveopt", true); 3342 LLVM_FALLTHROUGH; 3343 case CK_BTVER1: 3344 setFeatureEnabledImpl(Features, "ssse3", true); 3345 setFeatureEnabledImpl(Features, "sse4a", true); 3346 setFeatureEnabledImpl(Features, "lzcnt", true); 3347 setFeatureEnabledImpl(Features, "popcnt", true); 3348 setFeatureEnabledImpl(Features, "prfchw", true); 3349 setFeatureEnabledImpl(Features, "cx16", true); 3350 setFeatureEnabledImpl(Features, "fxsr", true); 3351 break; 3352 case CK_ZNVER1: 3353 setFeatureEnabledImpl(Features, "adx", true); 3354 setFeatureEnabledImpl(Features, "aes", true); 3355 setFeatureEnabledImpl(Features, "avx2", true); 3356 setFeatureEnabledImpl(Features, "bmi", true); 3357 setFeatureEnabledImpl(Features, "bmi2", true); 3358 setFeatureEnabledImpl(Features, "clflushopt", true); 3359 setFeatureEnabledImpl(Features, "clzero", true); 3360 setFeatureEnabledImpl(Features, "cx16", true); 3361 setFeatureEnabledImpl(Features, "f16c", true); 3362 setFeatureEnabledImpl(Features, "fma", true); 3363 setFeatureEnabledImpl(Features, "fsgsbase", true); 3364 setFeatureEnabledImpl(Features, "fxsr", true); 3365 setFeatureEnabledImpl(Features, "lzcnt", true); 3366 setFeatureEnabledImpl(Features, "mwaitx", true); 3367 setFeatureEnabledImpl(Features, "movbe", true); 3368 setFeatureEnabledImpl(Features, "pclmul", true); 3369 setFeatureEnabledImpl(Features, "popcnt", true); 3370 setFeatureEnabledImpl(Features, "prfchw", true); 3371 setFeatureEnabledImpl(Features, "rdrnd", true); 3372 setFeatureEnabledImpl(Features, "rdseed", true); 3373 setFeatureEnabledImpl(Features, "sha", true); 3374 setFeatureEnabledImpl(Features, "sse4a", true); 3375 setFeatureEnabledImpl(Features, "xsave", true); 3376 setFeatureEnabledImpl(Features, "xsavec", true); 3377 setFeatureEnabledImpl(Features, "xsaveopt", true); 3378 setFeatureEnabledImpl(Features, "xsaves", true); 3379 break; 3380 case CK_BDVER4: 3381 setFeatureEnabledImpl(Features, "avx2", true); 3382 setFeatureEnabledImpl(Features, "bmi2", true); 3383 setFeatureEnabledImpl(Features, "mwaitx", true); 3384 LLVM_FALLTHROUGH; 3385 case CK_BDVER3: 3386 setFeatureEnabledImpl(Features, "fsgsbase", true); 3387 setFeatureEnabledImpl(Features, "xsaveopt", true); 3388 LLVM_FALLTHROUGH; 3389 case CK_BDVER2: 3390 setFeatureEnabledImpl(Features, "bmi", true); 3391 setFeatureEnabledImpl(Features, "fma", true); 3392 setFeatureEnabledImpl(Features, "f16c", true); 3393 setFeatureEnabledImpl(Features, "tbm", true); 3394 LLVM_FALLTHROUGH; 3395 case CK_BDVER1: 3396 // xop implies avx, sse4a and fma4. 3397 setFeatureEnabledImpl(Features, "xop", true); 3398 setFeatureEnabledImpl(Features, "lwp", true); 3399 setFeatureEnabledImpl(Features, "lzcnt", true); 3400 setFeatureEnabledImpl(Features, "aes", true); 3401 setFeatureEnabledImpl(Features, "pclmul", true); 3402 setFeatureEnabledImpl(Features, "prfchw", true); 3403 setFeatureEnabledImpl(Features, "cx16", true); 3404 setFeatureEnabledImpl(Features, "fxsr", true); 3405 setFeatureEnabledImpl(Features, "xsave", true); 3406 break; 3407 } 3408 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec)) 3409 return false; 3410 3411 // Can't do this earlier because we need to be able to explicitly enable 3412 // or disable these features and the things that they depend upon. 3413 3414 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled. 3415 auto I = Features.find("sse4.2"); 3416 if (I != Features.end() && I->getValue() && 3417 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") == 3418 FeaturesVec.end()) 3419 Features["popcnt"] = true; 3420 3421 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled. 3422 I = Features.find("3dnow"); 3423 if (I != Features.end() && I->getValue() && 3424 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") == 3425 FeaturesVec.end()) 3426 Features["prfchw"] = true; 3427 3428 // Additionally, if SSE is enabled and mmx is not explicitly disabled, 3429 // then enable MMX. 3430 I = Features.find("sse"); 3431 if (I != Features.end() && I->getValue() && 3432 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") == 3433 FeaturesVec.end()) 3434 Features["mmx"] = true; 3435 3436 return true; 3437 } 3438 3439 void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features, 3440 X86SSEEnum Level, bool Enabled) { 3441 if (Enabled) { 3442 switch (Level) { 3443 case AVX512F: 3444 Features["avx512f"] = true; 3445 LLVM_FALLTHROUGH; 3446 case AVX2: 3447 Features["avx2"] = true; 3448 LLVM_FALLTHROUGH; 3449 case AVX: 3450 Features["avx"] = true; 3451 Features["xsave"] = true; 3452 LLVM_FALLTHROUGH; 3453 case SSE42: 3454 Features["sse4.2"] = true; 3455 LLVM_FALLTHROUGH; 3456 case SSE41: 3457 Features["sse4.1"] = true; 3458 LLVM_FALLTHROUGH; 3459 case SSSE3: 3460 Features["ssse3"] = true; 3461 LLVM_FALLTHROUGH; 3462 case SSE3: 3463 Features["sse3"] = true; 3464 LLVM_FALLTHROUGH; 3465 case SSE2: 3466 Features["sse2"] = true; 3467 LLVM_FALLTHROUGH; 3468 case SSE1: 3469 Features["sse"] = true; 3470 LLVM_FALLTHROUGH; 3471 case NoSSE: 3472 break; 3473 } 3474 return; 3475 } 3476 3477 switch (Level) { 3478 case NoSSE: 3479 case SSE1: 3480 Features["sse"] = false; 3481 LLVM_FALLTHROUGH; 3482 case SSE2: 3483 Features["sse2"] = Features["pclmul"] = Features["aes"] = 3484 Features["sha"] = false; 3485 LLVM_FALLTHROUGH; 3486 case SSE3: 3487 Features["sse3"] = false; 3488 setXOPLevel(Features, NoXOP, false); 3489 LLVM_FALLTHROUGH; 3490 case SSSE3: 3491 Features["ssse3"] = false; 3492 LLVM_FALLTHROUGH; 3493 case SSE41: 3494 Features["sse4.1"] = false; 3495 LLVM_FALLTHROUGH; 3496 case SSE42: 3497 Features["sse4.2"] = false; 3498 LLVM_FALLTHROUGH; 3499 case AVX: 3500 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] = 3501 Features["xsaveopt"] = false; 3502 setXOPLevel(Features, FMA4, false); 3503 LLVM_FALLTHROUGH; 3504 case AVX2: 3505 Features["avx2"] = false; 3506 LLVM_FALLTHROUGH; 3507 case AVX512F: 3508 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] = 3509 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] = 3510 Features["avx512vl"] = Features["avx512vbmi"] = 3511 Features["avx512ifma"] = Features["avx512vpopcntdq"] = false; 3512 } 3513 } 3514 3515 void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features, 3516 MMX3DNowEnum Level, bool Enabled) { 3517 if (Enabled) { 3518 switch (Level) { 3519 case AMD3DNowAthlon: 3520 Features["3dnowa"] = true; 3521 LLVM_FALLTHROUGH; 3522 case AMD3DNow: 3523 Features["3dnow"] = true; 3524 LLVM_FALLTHROUGH; 3525 case MMX: 3526 Features["mmx"] = true; 3527 LLVM_FALLTHROUGH; 3528 case NoMMX3DNow: 3529 break; 3530 } 3531 return; 3532 } 3533 3534 switch (Level) { 3535 case NoMMX3DNow: 3536 case MMX: 3537 Features["mmx"] = false; 3538 LLVM_FALLTHROUGH; 3539 case AMD3DNow: 3540 Features["3dnow"] = false; 3541 LLVM_FALLTHROUGH; 3542 case AMD3DNowAthlon: 3543 Features["3dnowa"] = false; 3544 } 3545 } 3546 3547 void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level, 3548 bool Enabled) { 3549 if (Enabled) { 3550 switch (Level) { 3551 case XOP: 3552 Features["xop"] = true; 3553 LLVM_FALLTHROUGH; 3554 case FMA4: 3555 Features["fma4"] = true; 3556 setSSELevel(Features, AVX, true); 3557 LLVM_FALLTHROUGH; 3558 case SSE4A: 3559 Features["sse4a"] = true; 3560 setSSELevel(Features, SSE3, true); 3561 LLVM_FALLTHROUGH; 3562 case NoXOP: 3563 break; 3564 } 3565 return; 3566 } 3567 3568 switch (Level) { 3569 case NoXOP: 3570 case SSE4A: 3571 Features["sse4a"] = false; 3572 LLVM_FALLTHROUGH; 3573 case FMA4: 3574 Features["fma4"] = false; 3575 LLVM_FALLTHROUGH; 3576 case XOP: 3577 Features["xop"] = false; 3578 } 3579 } 3580 3581 void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features, 3582 StringRef Name, bool Enabled) { 3583 // This is a bit of a hack to deal with the sse4 target feature when used 3584 // as part of the target attribute. We handle sse4 correctly everywhere 3585 // else. See below for more information on how we handle the sse4 options. 3586 if (Name != "sse4") 3587 Features[Name] = Enabled; 3588 3589 if (Name == "mmx") { 3590 setMMXLevel(Features, MMX, Enabled); 3591 } else if (Name == "sse") { 3592 setSSELevel(Features, SSE1, Enabled); 3593 } else if (Name == "sse2") { 3594 setSSELevel(Features, SSE2, Enabled); 3595 } else if (Name == "sse3") { 3596 setSSELevel(Features, SSE3, Enabled); 3597 } else if (Name == "ssse3") { 3598 setSSELevel(Features, SSSE3, Enabled); 3599 } else if (Name == "sse4.2") { 3600 setSSELevel(Features, SSE42, Enabled); 3601 } else if (Name == "sse4.1") { 3602 setSSELevel(Features, SSE41, Enabled); 3603 } else if (Name == "3dnow") { 3604 setMMXLevel(Features, AMD3DNow, Enabled); 3605 } else if (Name == "3dnowa") { 3606 setMMXLevel(Features, AMD3DNowAthlon, Enabled); 3607 } else if (Name == "aes") { 3608 if (Enabled) 3609 setSSELevel(Features, SSE2, Enabled); 3610 } else if (Name == "pclmul") { 3611 if (Enabled) 3612 setSSELevel(Features, SSE2, Enabled); 3613 } else if (Name == "avx") { 3614 setSSELevel(Features, AVX, Enabled); 3615 } else if (Name == "avx2") { 3616 setSSELevel(Features, AVX2, Enabled); 3617 } else if (Name == "avx512f") { 3618 setSSELevel(Features, AVX512F, Enabled); 3619 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" || 3620 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" || 3621 Name == "avx512vbmi" || Name == "avx512ifma" || 3622 Name == "avx512vpopcntdq") { 3623 if (Enabled) 3624 setSSELevel(Features, AVX512F, Enabled); 3625 // Enable BWI instruction if VBMI is being enabled. 3626 if (Name == "avx512vbmi" && Enabled) 3627 Features["avx512bw"] = true; 3628 // Also disable VBMI if BWI is being disabled. 3629 if (Name == "avx512bw" && !Enabled) 3630 Features["avx512vbmi"] = false; 3631 } else if (Name == "fma") { 3632 if (Enabled) 3633 setSSELevel(Features, AVX, Enabled); 3634 } else if (Name == "fma4") { 3635 setXOPLevel(Features, FMA4, Enabled); 3636 } else if (Name == "xop") { 3637 setXOPLevel(Features, XOP, Enabled); 3638 } else if (Name == "sse4a") { 3639 setXOPLevel(Features, SSE4A, Enabled); 3640 } else if (Name == "f16c") { 3641 if (Enabled) 3642 setSSELevel(Features, AVX, Enabled); 3643 } else if (Name == "sha") { 3644 if (Enabled) 3645 setSSELevel(Features, SSE2, Enabled); 3646 } else if (Name == "sse4") { 3647 // We can get here via the __target__ attribute since that's not controlled 3648 // via the -msse4/-mno-sse4 command line alias. Handle this the same way 3649 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if 3650 // disabled. 3651 if (Enabled) 3652 setSSELevel(Features, SSE42, Enabled); 3653 else 3654 setSSELevel(Features, SSE41, Enabled); 3655 } else if (Name == "xsave") { 3656 if (!Enabled) 3657 Features["xsaveopt"] = false; 3658 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") { 3659 if (Enabled) 3660 Features["xsave"] = true; 3661 } 3662 } 3663 3664 /// handleTargetFeatures - Perform initialization based on the user 3665 /// configured set of features. 3666 bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features, 3667 DiagnosticsEngine &Diags) { 3668 for (const auto &Feature : Features) { 3669 if (Feature[0] != '+') 3670 continue; 3671 3672 if (Feature == "+aes") { 3673 HasAES = true; 3674 } else if (Feature == "+pclmul") { 3675 HasPCLMUL = true; 3676 } else if (Feature == "+lzcnt") { 3677 HasLZCNT = true; 3678 } else if (Feature == "+rdrnd") { 3679 HasRDRND = true; 3680 } else if (Feature == "+fsgsbase") { 3681 HasFSGSBASE = true; 3682 } else if (Feature == "+bmi") { 3683 HasBMI = true; 3684 } else if (Feature == "+bmi2") { 3685 HasBMI2 = true; 3686 } else if (Feature == "+popcnt") { 3687 HasPOPCNT = true; 3688 } else if (Feature == "+rtm") { 3689 HasRTM = true; 3690 } else if (Feature == "+prfchw") { 3691 HasPRFCHW = true; 3692 } else if (Feature == "+rdseed") { 3693 HasRDSEED = true; 3694 } else if (Feature == "+adx") { 3695 HasADX = true; 3696 } else if (Feature == "+tbm") { 3697 HasTBM = true; 3698 } else if (Feature == "+lwp") { 3699 HasLWP = true; 3700 } else if (Feature == "+fma") { 3701 HasFMA = true; 3702 } else if (Feature == "+f16c") { 3703 HasF16C = true; 3704 } else if (Feature == "+avx512cd") { 3705 HasAVX512CD = true; 3706 } else if (Feature == "+avx512vpopcntdq") { 3707 HasAVX512VPOPCNTDQ = true; 3708 } else if (Feature == "+avx512er") { 3709 HasAVX512ER = true; 3710 } else if (Feature == "+avx512pf") { 3711 HasAVX512PF = true; 3712 } else if (Feature == "+avx512dq") { 3713 HasAVX512DQ = true; 3714 } else if (Feature == "+avx512bw") { 3715 HasAVX512BW = true; 3716 } else if (Feature == "+avx512vl") { 3717 HasAVX512VL = true; 3718 } else if (Feature == "+avx512vbmi") { 3719 HasAVX512VBMI = true; 3720 } else if (Feature == "+avx512ifma") { 3721 HasAVX512IFMA = true; 3722 } else if (Feature == "+sha") { 3723 HasSHA = true; 3724 } else if (Feature == "+mpx") { 3725 HasMPX = true; 3726 } else if (Feature == "+movbe") { 3727 HasMOVBE = true; 3728 } else if (Feature == "+sgx") { 3729 HasSGX = true; 3730 } else if (Feature == "+cx16") { 3731 HasCX16 = true; 3732 } else if (Feature == "+fxsr") { 3733 HasFXSR = true; 3734 } else if (Feature == "+xsave") { 3735 HasXSAVE = true; 3736 } else if (Feature == "+xsaveopt") { 3737 HasXSAVEOPT = true; 3738 } else if (Feature == "+xsavec") { 3739 HasXSAVEC = true; 3740 } else if (Feature == "+xsaves") { 3741 HasXSAVES = true; 3742 } else if (Feature == "+mwaitx") { 3743 HasMWAITX = true; 3744 } else if (Feature == "+pku") { 3745 HasPKU = true; 3746 } else if (Feature == "+clflushopt") { 3747 HasCLFLUSHOPT = true; 3748 } else if (Feature == "+clwb") { 3749 HasCLWB = true; 3750 } else if (Feature == "+prefetchwt1") { 3751 HasPREFETCHWT1 = true; 3752 } else if (Feature == "+clzero") { 3753 HasCLZERO = true; 3754 } 3755 3756 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature) 3757 .Case("+avx512f", AVX512F) 3758 .Case("+avx2", AVX2) 3759 .Case("+avx", AVX) 3760 .Case("+sse4.2", SSE42) 3761 .Case("+sse4.1", SSE41) 3762 .Case("+ssse3", SSSE3) 3763 .Case("+sse3", SSE3) 3764 .Case("+sse2", SSE2) 3765 .Case("+sse", SSE1) 3766 .Default(NoSSE); 3767 SSELevel = std::max(SSELevel, Level); 3768 3769 MMX3DNowEnum ThreeDNowLevel = 3770 llvm::StringSwitch<MMX3DNowEnum>(Feature) 3771 .Case("+3dnowa", AMD3DNowAthlon) 3772 .Case("+3dnow", AMD3DNow) 3773 .Case("+mmx", MMX) 3774 .Default(NoMMX3DNow); 3775 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel); 3776 3777 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature) 3778 .Case("+xop", XOP) 3779 .Case("+fma4", FMA4) 3780 .Case("+sse4a", SSE4A) 3781 .Default(NoXOP); 3782 XOPLevel = std::max(XOPLevel, XLevel); 3783 } 3784 3785 // LLVM doesn't have a separate switch for fpmath, so only accept it if it 3786 // matches the selected sse level. 3787 if ((FPMath == FP_SSE && SSELevel < SSE1) || 3788 (FPMath == FP_387 && SSELevel >= SSE1)) { 3789 Diags.Report(diag::err_target_unsupported_fpmath) << 3790 (FPMath == FP_SSE ? "sse" : "387"); 3791 return false; 3792 } 3793 3794 SimdDefaultAlign = 3795 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128; 3796 return true; 3797 } 3798 3799 /// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro 3800 /// definitions for this particular subtarget. 3801 void X86TargetInfo::getTargetDefines(const LangOptions &Opts, 3802 MacroBuilder &Builder) const { 3803 // Target identification. 3804 if (getTriple().getArch() == llvm::Triple::x86_64) { 3805 Builder.defineMacro("__amd64__"); 3806 Builder.defineMacro("__amd64"); 3807 Builder.defineMacro("__x86_64"); 3808 Builder.defineMacro("__x86_64__"); 3809 if (getTriple().getArchName() == "x86_64h") { 3810 Builder.defineMacro("__x86_64h"); 3811 Builder.defineMacro("__x86_64h__"); 3812 } 3813 } else { 3814 DefineStd(Builder, "i386", Opts); 3815 } 3816 3817 // Subtarget options. 3818 // FIXME: We are hard-coding the tune parameters based on the CPU, but they 3819 // truly should be based on -mtune options. 3820 switch (CPU) { 3821 case CK_Generic: 3822 break; 3823 case CK_i386: 3824 // The rest are coming from the i386 define above. 3825 Builder.defineMacro("__tune_i386__"); 3826 break; 3827 case CK_i486: 3828 case CK_WinChipC6: 3829 case CK_WinChip2: 3830 case CK_C3: 3831 defineCPUMacros(Builder, "i486"); 3832 break; 3833 case CK_PentiumMMX: 3834 Builder.defineMacro("__pentium_mmx__"); 3835 Builder.defineMacro("__tune_pentium_mmx__"); 3836 // Fallthrough 3837 case CK_i586: 3838 case CK_Pentium: 3839 defineCPUMacros(Builder, "i586"); 3840 defineCPUMacros(Builder, "pentium"); 3841 break; 3842 case CK_Pentium3: 3843 case CK_Pentium3M: 3844 case CK_PentiumM: 3845 Builder.defineMacro("__tune_pentium3__"); 3846 // Fallthrough 3847 case CK_Pentium2: 3848 case CK_C3_2: 3849 Builder.defineMacro("__tune_pentium2__"); 3850 // Fallthrough 3851 case CK_PentiumPro: 3852 Builder.defineMacro("__tune_i686__"); 3853 Builder.defineMacro("__tune_pentiumpro__"); 3854 // Fallthrough 3855 case CK_i686: 3856 Builder.defineMacro("__i686"); 3857 Builder.defineMacro("__i686__"); 3858 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686. 3859 Builder.defineMacro("__pentiumpro"); 3860 Builder.defineMacro("__pentiumpro__"); 3861 break; 3862 case CK_Pentium4: 3863 case CK_Pentium4M: 3864 defineCPUMacros(Builder, "pentium4"); 3865 break; 3866 case CK_Yonah: 3867 case CK_Prescott: 3868 case CK_Nocona: 3869 defineCPUMacros(Builder, "nocona"); 3870 break; 3871 case CK_Core2: 3872 case CK_Penryn: 3873 defineCPUMacros(Builder, "core2"); 3874 break; 3875 case CK_Bonnell: 3876 defineCPUMacros(Builder, "atom"); 3877 break; 3878 case CK_Silvermont: 3879 defineCPUMacros(Builder, "slm"); 3880 break; 3881 case CK_Nehalem: 3882 case CK_Westmere: 3883 case CK_SandyBridge: 3884 case CK_IvyBridge: 3885 case CK_Haswell: 3886 case CK_Broadwell: 3887 case CK_SkylakeClient: 3888 // FIXME: Historically, we defined this legacy name, it would be nice to 3889 // remove it at some point. We've never exposed fine-grained names for 3890 // recent primary x86 CPUs, and we should keep it that way. 3891 defineCPUMacros(Builder, "corei7"); 3892 break; 3893 case CK_SkylakeServer: 3894 defineCPUMacros(Builder, "skx"); 3895 break; 3896 case CK_Cannonlake: 3897 break; 3898 case CK_KNL: 3899 defineCPUMacros(Builder, "knl"); 3900 break; 3901 case CK_Lakemont: 3902 Builder.defineMacro("__tune_lakemont__"); 3903 break; 3904 case CK_K6_2: 3905 Builder.defineMacro("__k6_2__"); 3906 Builder.defineMacro("__tune_k6_2__"); 3907 // Fallthrough 3908 case CK_K6_3: 3909 if (CPU != CK_K6_2) { // In case of fallthrough 3910 // FIXME: GCC may be enabling these in cases where some other k6 3911 // architecture is specified but -m3dnow is explicitly provided. The 3912 // exact semantics need to be determined and emulated here. 3913 Builder.defineMacro("__k6_3__"); 3914 Builder.defineMacro("__tune_k6_3__"); 3915 } 3916 // Fallthrough 3917 case CK_K6: 3918 defineCPUMacros(Builder, "k6"); 3919 break; 3920 case CK_Athlon: 3921 case CK_AthlonThunderbird: 3922 case CK_Athlon4: 3923 case CK_AthlonXP: 3924 case CK_AthlonMP: 3925 defineCPUMacros(Builder, "athlon"); 3926 if (SSELevel != NoSSE) { 3927 Builder.defineMacro("__athlon_sse__"); 3928 Builder.defineMacro("__tune_athlon_sse__"); 3929 } 3930 break; 3931 case CK_K8: 3932 case CK_K8SSE3: 3933 case CK_x86_64: 3934 case CK_Opteron: 3935 case CK_OpteronSSE3: 3936 case CK_Athlon64: 3937 case CK_Athlon64SSE3: 3938 case CK_AthlonFX: 3939 defineCPUMacros(Builder, "k8"); 3940 break; 3941 case CK_AMDFAM10: 3942 defineCPUMacros(Builder, "amdfam10"); 3943 break; 3944 case CK_BTVER1: 3945 defineCPUMacros(Builder, "btver1"); 3946 break; 3947 case CK_BTVER2: 3948 defineCPUMacros(Builder, "btver2"); 3949 break; 3950 case CK_BDVER1: 3951 defineCPUMacros(Builder, "bdver1"); 3952 break; 3953 case CK_BDVER2: 3954 defineCPUMacros(Builder, "bdver2"); 3955 break; 3956 case CK_BDVER3: 3957 defineCPUMacros(Builder, "bdver3"); 3958 break; 3959 case CK_BDVER4: 3960 defineCPUMacros(Builder, "bdver4"); 3961 break; 3962 case CK_ZNVER1: 3963 defineCPUMacros(Builder, "znver1"); 3964 break; 3965 case CK_Geode: 3966 defineCPUMacros(Builder, "geode"); 3967 break; 3968 } 3969 3970 // Target properties. 3971 Builder.defineMacro("__REGISTER_PREFIX__", ""); 3972 3973 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline 3974 // functions in glibc header files that use FP Stack inline asm which the 3975 // backend can't deal with (PR879). 3976 Builder.defineMacro("__NO_MATH_INLINES"); 3977 3978 if (HasAES) 3979 Builder.defineMacro("__AES__"); 3980 3981 if (HasPCLMUL) 3982 Builder.defineMacro("__PCLMUL__"); 3983 3984 if (HasLZCNT) 3985 Builder.defineMacro("__LZCNT__"); 3986 3987 if (HasRDRND) 3988 Builder.defineMacro("__RDRND__"); 3989 3990 if (HasFSGSBASE) 3991 Builder.defineMacro("__FSGSBASE__"); 3992 3993 if (HasBMI) 3994 Builder.defineMacro("__BMI__"); 3995 3996 if (HasBMI2) 3997 Builder.defineMacro("__BMI2__"); 3998 3999 if (HasPOPCNT) 4000 Builder.defineMacro("__POPCNT__"); 4001 4002 if (HasRTM) 4003 Builder.defineMacro("__RTM__"); 4004 4005 if (HasPRFCHW) 4006 Builder.defineMacro("__PRFCHW__"); 4007 4008 if (HasRDSEED) 4009 Builder.defineMacro("__RDSEED__"); 4010 4011 if (HasADX) 4012 Builder.defineMacro("__ADX__"); 4013 4014 if (HasTBM) 4015 Builder.defineMacro("__TBM__"); 4016 4017 if (HasLWP) 4018 Builder.defineMacro("__LWP__"); 4019 4020 if (HasMWAITX) 4021 Builder.defineMacro("__MWAITX__"); 4022 4023 switch (XOPLevel) { 4024 case XOP: 4025 Builder.defineMacro("__XOP__"); 4026 LLVM_FALLTHROUGH; 4027 case FMA4: 4028 Builder.defineMacro("__FMA4__"); 4029 LLVM_FALLTHROUGH; 4030 case SSE4A: 4031 Builder.defineMacro("__SSE4A__"); 4032 LLVM_FALLTHROUGH; 4033 case NoXOP: 4034 break; 4035 } 4036 4037 if (HasFMA) 4038 Builder.defineMacro("__FMA__"); 4039 4040 if (HasF16C) 4041 Builder.defineMacro("__F16C__"); 4042 4043 if (HasAVX512CD) 4044 Builder.defineMacro("__AVX512CD__"); 4045 if (HasAVX512VPOPCNTDQ) 4046 Builder.defineMacro("__AVX512VPOPCNTDQ__"); 4047 if (HasAVX512ER) 4048 Builder.defineMacro("__AVX512ER__"); 4049 if (HasAVX512PF) 4050 Builder.defineMacro("__AVX512PF__"); 4051 if (HasAVX512DQ) 4052 Builder.defineMacro("__AVX512DQ__"); 4053 if (HasAVX512BW) 4054 Builder.defineMacro("__AVX512BW__"); 4055 if (HasAVX512VL) 4056 Builder.defineMacro("__AVX512VL__"); 4057 if (HasAVX512VBMI) 4058 Builder.defineMacro("__AVX512VBMI__"); 4059 if (HasAVX512IFMA) 4060 Builder.defineMacro("__AVX512IFMA__"); 4061 4062 if (HasSHA) 4063 Builder.defineMacro("__SHA__"); 4064 4065 if (HasFXSR) 4066 Builder.defineMacro("__FXSR__"); 4067 if (HasXSAVE) 4068 Builder.defineMacro("__XSAVE__"); 4069 if (HasXSAVEOPT) 4070 Builder.defineMacro("__XSAVEOPT__"); 4071 if (HasXSAVEC) 4072 Builder.defineMacro("__XSAVEC__"); 4073 if (HasXSAVES) 4074 Builder.defineMacro("__XSAVES__"); 4075 if (HasPKU) 4076 Builder.defineMacro("__PKU__"); 4077 if (HasCX16) 4078 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16"); 4079 if (HasCLFLUSHOPT) 4080 Builder.defineMacro("__CLFLUSHOPT__"); 4081 if (HasCLWB) 4082 Builder.defineMacro("__CLWB__"); 4083 if (HasMPX) 4084 Builder.defineMacro("__MPX__"); 4085 if (HasSGX) 4086 Builder.defineMacro("__SGX__"); 4087 if (HasPREFETCHWT1) 4088 Builder.defineMacro("__PREFETCHWT1__"); 4089 if (HasCLZERO) 4090 Builder.defineMacro("__CLZERO__"); 4091 4092 // Each case falls through to the previous one here. 4093 switch (SSELevel) { 4094 case AVX512F: 4095 Builder.defineMacro("__AVX512F__"); 4096 LLVM_FALLTHROUGH; 4097 case AVX2: 4098 Builder.defineMacro("__AVX2__"); 4099 LLVM_FALLTHROUGH; 4100 case AVX: 4101 Builder.defineMacro("__AVX__"); 4102 LLVM_FALLTHROUGH; 4103 case SSE42: 4104 Builder.defineMacro("__SSE4_2__"); 4105 LLVM_FALLTHROUGH; 4106 case SSE41: 4107 Builder.defineMacro("__SSE4_1__"); 4108 LLVM_FALLTHROUGH; 4109 case SSSE3: 4110 Builder.defineMacro("__SSSE3__"); 4111 LLVM_FALLTHROUGH; 4112 case SSE3: 4113 Builder.defineMacro("__SSE3__"); 4114 LLVM_FALLTHROUGH; 4115 case SSE2: 4116 Builder.defineMacro("__SSE2__"); 4117 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied. 4118 LLVM_FALLTHROUGH; 4119 case SSE1: 4120 Builder.defineMacro("__SSE__"); 4121 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied. 4122 LLVM_FALLTHROUGH; 4123 case NoSSE: 4124 break; 4125 } 4126 4127 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) { 4128 switch (SSELevel) { 4129 case AVX512F: 4130 case AVX2: 4131 case AVX: 4132 case SSE42: 4133 case SSE41: 4134 case SSSE3: 4135 case SSE3: 4136 case SSE2: 4137 Builder.defineMacro("_M_IX86_FP", Twine(2)); 4138 break; 4139 case SSE1: 4140 Builder.defineMacro("_M_IX86_FP", Twine(1)); 4141 break; 4142 default: 4143 Builder.defineMacro("_M_IX86_FP", Twine(0)); 4144 } 4145 } 4146 4147 // Each case falls through to the previous one here. 4148 switch (MMX3DNowLevel) { 4149 case AMD3DNowAthlon: 4150 Builder.defineMacro("__3dNOW_A__"); 4151 LLVM_FALLTHROUGH; 4152 case AMD3DNow: 4153 Builder.defineMacro("__3dNOW__"); 4154 LLVM_FALLTHROUGH; 4155 case MMX: 4156 Builder.defineMacro("__MMX__"); 4157 LLVM_FALLTHROUGH; 4158 case NoMMX3DNow: 4159 break; 4160 } 4161 4162 if (CPU >= CK_i486) { 4163 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1"); 4164 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2"); 4165 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4"); 4166 } 4167 if (CPU >= CK_i586) 4168 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8"); 4169 4170 if (HasFloat128) 4171 Builder.defineMacro("__SIZEOF_FLOAT128__", "16"); 4172 } 4173 4174 bool X86TargetInfo::hasFeature(StringRef Feature) const { 4175 return llvm::StringSwitch<bool>(Feature) 4176 .Case("aes", HasAES) 4177 .Case("avx", SSELevel >= AVX) 4178 .Case("avx2", SSELevel >= AVX2) 4179 .Case("avx512f", SSELevel >= AVX512F) 4180 .Case("avx512cd", HasAVX512CD) 4181 .Case("avx512vpopcntdq", HasAVX512VPOPCNTDQ) 4182 .Case("avx512er", HasAVX512ER) 4183 .Case("avx512pf", HasAVX512PF) 4184 .Case("avx512dq", HasAVX512DQ) 4185 .Case("avx512bw", HasAVX512BW) 4186 .Case("avx512vl", HasAVX512VL) 4187 .Case("avx512vbmi", HasAVX512VBMI) 4188 .Case("avx512ifma", HasAVX512IFMA) 4189 .Case("bmi", HasBMI) 4190 .Case("bmi2", HasBMI2) 4191 .Case("clflushopt", HasCLFLUSHOPT) 4192 .Case("clwb", HasCLWB) 4193 .Case("clzero", HasCLZERO) 4194 .Case("cx16", HasCX16) 4195 .Case("f16c", HasF16C) 4196 .Case("fma", HasFMA) 4197 .Case("fma4", XOPLevel >= FMA4) 4198 .Case("fsgsbase", HasFSGSBASE) 4199 .Case("fxsr", HasFXSR) 4200 .Case("lzcnt", HasLZCNT) 4201 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow) 4202 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon) 4203 .Case("mmx", MMX3DNowLevel >= MMX) 4204 .Case("movbe", HasMOVBE) 4205 .Case("mpx", HasMPX) 4206 .Case("pclmul", HasPCLMUL) 4207 .Case("pku", HasPKU) 4208 .Case("popcnt", HasPOPCNT) 4209 .Case("prefetchwt1", HasPREFETCHWT1) 4210 .Case("prfchw", HasPRFCHW) 4211 .Case("rdrnd", HasRDRND) 4212 .Case("rdseed", HasRDSEED) 4213 .Case("rtm", HasRTM) 4214 .Case("sgx", HasSGX) 4215 .Case("sha", HasSHA) 4216 .Case("sse", SSELevel >= SSE1) 4217 .Case("sse2", SSELevel >= SSE2) 4218 .Case("sse3", SSELevel >= SSE3) 4219 .Case("ssse3", SSELevel >= SSSE3) 4220 .Case("sse4.1", SSELevel >= SSE41) 4221 .Case("sse4.2", SSELevel >= SSE42) 4222 .Case("sse4a", XOPLevel >= SSE4A) 4223 .Case("tbm", HasTBM) 4224 .Case("lwp", HasLWP) 4225 .Case("x86", true) 4226 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86) 4227 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64) 4228 .Case("xop", XOPLevel >= XOP) 4229 .Case("xsave", HasXSAVE) 4230 .Case("xsavec", HasXSAVEC) 4231 .Case("xsaves", HasXSAVES) 4232 .Case("xsaveopt", HasXSAVEOPT) 4233 .Default(false); 4234 } 4235 4236 // We can't use a generic validation scheme for the features accepted here 4237 // versus subtarget features accepted in the target attribute because the 4238 // bitfield structure that's initialized in the runtime only supports the 4239 // below currently rather than the full range of subtarget features. (See 4240 // X86TargetInfo::hasFeature for a somewhat comprehensive list). 4241 bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const { 4242 return llvm::StringSwitch<bool>(FeatureStr) 4243 .Case("cmov", true) 4244 .Case("mmx", true) 4245 .Case("popcnt", true) 4246 .Case("sse", true) 4247 .Case("sse2", true) 4248 .Case("sse3", true) 4249 .Case("ssse3", true) 4250 .Case("sse4.1", true) 4251 .Case("sse4.2", true) 4252 .Case("avx", true) 4253 .Case("avx2", true) 4254 .Case("sse4a", true) 4255 .Case("fma4", true) 4256 .Case("xop", true) 4257 .Case("fma", true) 4258 .Case("avx512f", true) 4259 .Case("bmi", true) 4260 .Case("bmi2", true) 4261 .Case("aes", true) 4262 .Case("pclmul", true) 4263 .Case("avx512vl", true) 4264 .Case("avx512bw", true) 4265 .Case("avx512dq", true) 4266 .Case("avx512cd", true) 4267 .Case("avx512vpopcntdq", true) 4268 .Case("avx512er", true) 4269 .Case("avx512pf", true) 4270 .Case("avx512vbmi", true) 4271 .Case("avx512ifma", true) 4272 .Default(false); 4273 } 4274 4275 bool 4276 X86TargetInfo::validateAsmConstraint(const char *&Name, 4277 TargetInfo::ConstraintInfo &Info) const { 4278 switch (*Name) { 4279 default: return false; 4280 // Constant constraints. 4281 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64 4282 // instructions. 4283 case 'Z': // 32-bit unsigned integer constant for use with zero-extending 4284 // x86_64 instructions. 4285 case 's': 4286 Info.setRequiresImmediate(); 4287 return true; 4288 case 'I': 4289 Info.setRequiresImmediate(0, 31); 4290 return true; 4291 case 'J': 4292 Info.setRequiresImmediate(0, 63); 4293 return true; 4294 case 'K': 4295 Info.setRequiresImmediate(-128, 127); 4296 return true; 4297 case 'L': 4298 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) }); 4299 return true; 4300 case 'M': 4301 Info.setRequiresImmediate(0, 3); 4302 return true; 4303 case 'N': 4304 Info.setRequiresImmediate(0, 255); 4305 return true; 4306 case 'O': 4307 Info.setRequiresImmediate(0, 127); 4308 return true; 4309 // Register constraints. 4310 case 'Y': // 'Y' is the first character for several 2-character constraints. 4311 // Shift the pointer to the second character of the constraint. 4312 Name++; 4313 switch (*Name) { 4314 default: 4315 return false; 4316 case '0': // First SSE register. 4317 case 't': // Any SSE register, when SSE2 is enabled. 4318 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled. 4319 case 'm': // Any MMX register, when inter-unit moves enabled. 4320 case 'k': // AVX512 arch mask registers: k1-k7. 4321 Info.setAllowsRegister(); 4322 return true; 4323 } 4324 case 'f': // Any x87 floating point stack register. 4325 // Constraint 'f' cannot be used for output operands. 4326 if (Info.ConstraintStr[0] == '=') 4327 return false; 4328 Info.setAllowsRegister(); 4329 return true; 4330 case 'a': // eax. 4331 case 'b': // ebx. 4332 case 'c': // ecx. 4333 case 'd': // edx. 4334 case 'S': // esi. 4335 case 'D': // edi. 4336 case 'A': // edx:eax. 4337 case 't': // Top of floating point stack. 4338 case 'u': // Second from top of floating point stack. 4339 case 'q': // Any register accessible as [r]l: a, b, c, and d. 4340 case 'y': // Any MMX register. 4341 case 'v': // Any {X,Y,Z}MM register (Arch & context dependent) 4342 case 'x': // Any SSE register. 4343 case 'k': // Any AVX512 mask register (same as Yk, additionaly allows k0 4344 // for intermideate k reg operations). 4345 case 'Q': // Any register accessible as [r]h: a, b, c, and d. 4346 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp. 4347 case 'l': // "Index" registers: any general register that can be used as an 4348 // index in a base+index memory access. 4349 Info.setAllowsRegister(); 4350 return true; 4351 // Floating point constant constraints. 4352 case 'C': // SSE floating point constant. 4353 case 'G': // x87 floating point constant. 4354 return true; 4355 } 4356 } 4357 4358 bool X86TargetInfo::validateOutputSize(StringRef Constraint, 4359 unsigned Size) const { 4360 // Strip off constraint modifiers. 4361 while (Constraint[0] == '=' || 4362 Constraint[0] == '+' || 4363 Constraint[0] == '&') 4364 Constraint = Constraint.substr(1); 4365 4366 return validateOperandSize(Constraint, Size); 4367 } 4368 4369 bool X86TargetInfo::validateInputSize(StringRef Constraint, 4370 unsigned Size) const { 4371 return validateOperandSize(Constraint, Size); 4372 } 4373 4374 bool X86TargetInfo::validateOperandSize(StringRef Constraint, 4375 unsigned Size) const { 4376 switch (Constraint[0]) { 4377 default: break; 4378 case 'k': 4379 // Registers k0-k7 (AVX512) size limit is 64 bit. 4380 case 'y': 4381 return Size <= 64; 4382 case 'f': 4383 case 't': 4384 case 'u': 4385 return Size <= 128; 4386 case 'v': 4387 case 'x': 4388 if (SSELevel >= AVX512F) 4389 // 512-bit zmm registers can be used if target supports AVX512F. 4390 return Size <= 512U; 4391 else if (SSELevel >= AVX) 4392 // 256-bit ymm registers can be used if target supports AVX. 4393 return Size <= 256U; 4394 return Size <= 128U; 4395 case 'Y': 4396 // 'Y' is the first character for several 2-character constraints. 4397 switch (Constraint[1]) { 4398 default: break; 4399 case 'm': 4400 // 'Ym' is synonymous with 'y'. 4401 case 'k': 4402 return Size <= 64; 4403 case 'i': 4404 case 't': 4405 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled. 4406 if (SSELevel >= AVX512F) 4407 return Size <= 512U; 4408 else if (SSELevel >= AVX) 4409 return Size <= 256U; 4410 return SSELevel >= SSE2 && Size <= 128U; 4411 } 4412 4413 } 4414 4415 return true; 4416 } 4417 4418 std::string 4419 X86TargetInfo::convertConstraint(const char *&Constraint) const { 4420 switch (*Constraint) { 4421 case 'a': return std::string("{ax}"); 4422 case 'b': return std::string("{bx}"); 4423 case 'c': return std::string("{cx}"); 4424 case 'd': return std::string("{dx}"); 4425 case 'S': return std::string("{si}"); 4426 case 'D': return std::string("{di}"); 4427 case 'p': // address 4428 return std::string("im"); 4429 case 't': // top of floating point stack. 4430 return std::string("{st}"); 4431 case 'u': // second from top of floating point stack. 4432 return std::string("{st(1)}"); // second from top of floating point stack. 4433 case 'Y': 4434 switch (Constraint[1]) { 4435 default: 4436 // Break from inner switch and fall through (copy single char), 4437 // continue parsing after copying the current constraint into 4438 // the return string. 4439 break; 4440 case 'k': 4441 // "^" hints llvm that this is a 2 letter constraint. 4442 // "Constraint++" is used to promote the string iterator 4443 // to the next constraint. 4444 return std::string("^") + std::string(Constraint++, 2); 4445 } 4446 LLVM_FALLTHROUGH; 4447 default: 4448 return std::string(1, *Constraint); 4449 } 4450 } 4451 4452 // X86-32 generic target 4453 class X86_32TargetInfo : public X86TargetInfo { 4454 public: 4455 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 4456 : X86TargetInfo(Triple, Opts) { 4457 DoubleAlign = LongLongAlign = 32; 4458 LongDoubleWidth = 96; 4459 LongDoubleAlign = 32; 4460 SuitableAlign = 128; 4461 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128"); 4462 SizeType = UnsignedInt; 4463 PtrDiffType = SignedInt; 4464 IntPtrType = SignedInt; 4465 RegParmMax = 3; 4466 4467 // Use fpret for all types. 4468 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) | 4469 (1 << TargetInfo::Double) | 4470 (1 << TargetInfo::LongDouble)); 4471 4472 // x86-32 has atomics up to 8 bytes 4473 // FIXME: Check that we actually have cmpxchg8b before setting 4474 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.) 4475 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64; 4476 } 4477 BuiltinVaListKind getBuiltinVaListKind() const override { 4478 return TargetInfo::CharPtrBuiltinVaList; 4479 } 4480 4481 int getEHDataRegisterNumber(unsigned RegNo) const override { 4482 if (RegNo == 0) return 0; 4483 if (RegNo == 1) return 2; 4484 return -1; 4485 } 4486 bool validateOperandSize(StringRef Constraint, 4487 unsigned Size) const override { 4488 switch (Constraint[0]) { 4489 default: break; 4490 case 'R': 4491 case 'q': 4492 case 'Q': 4493 case 'a': 4494 case 'b': 4495 case 'c': 4496 case 'd': 4497 case 'S': 4498 case 'D': 4499 return Size <= 32; 4500 case 'A': 4501 return Size <= 64; 4502 } 4503 4504 return X86TargetInfo::validateOperandSize(Constraint, Size); 4505 } 4506 ArrayRef<Builtin::Info> getTargetBuiltins() const override { 4507 return llvm::makeArrayRef(BuiltinInfoX86, clang::X86::LastX86CommonBuiltin - 4508 Builtin::FirstTSBuiltin + 1); 4509 } 4510 }; 4511 4512 class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> { 4513 public: 4514 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 4515 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {} 4516 4517 unsigned getFloatEvalMethod() const override { 4518 unsigned Major, Minor, Micro; 4519 getTriple().getOSVersion(Major, Minor, Micro); 4520 // New NetBSD uses the default rounding mode. 4521 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0) 4522 return X86_32TargetInfo::getFloatEvalMethod(); 4523 // NetBSD before 6.99.26 defaults to "double" rounding. 4524 return 1; 4525 } 4526 }; 4527 4528 class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> { 4529 public: 4530 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 4531 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) { 4532 SizeType = UnsignedLong; 4533 IntPtrType = SignedLong; 4534 PtrDiffType = SignedLong; 4535 } 4536 }; 4537 4538 class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> { 4539 public: 4540 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 4541 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) { 4542 SizeType = UnsignedLong; 4543 IntPtrType = SignedLong; 4544 PtrDiffType = SignedLong; 4545 } 4546 }; 4547 4548 class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> { 4549 public: 4550 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 4551 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) { 4552 LongDoubleWidth = 128; 4553 LongDoubleAlign = 128; 4554 SuitableAlign = 128; 4555 MaxVectorAlign = 256; 4556 // The watchOS simulator uses the builtin bool type for Objective-C. 4557 llvm::Triple T = llvm::Triple(Triple); 4558 if (T.isWatchOS()) 4559 UseSignedCharForObjCBool = false; 4560 SizeType = UnsignedLong; 4561 IntPtrType = SignedLong; 4562 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128"); 4563 HasAlignMac68kSupport = true; 4564 } 4565 4566 bool handleTargetFeatures(std::vector<std::string> &Features, 4567 DiagnosticsEngine &Diags) override { 4568 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features, 4569 Diags)) 4570 return false; 4571 // We now know the features we have: we can decide how to align vectors. 4572 MaxVectorAlign = 4573 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128; 4574 return true; 4575 } 4576 }; 4577 4578 // x86-32 Windows target 4579 class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> { 4580 public: 4581 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 4582 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) { 4583 WCharType = UnsignedShort; 4584 DoubleAlign = LongLongAlign = 64; 4585 bool IsWinCOFF = 4586 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF(); 4587 resetDataLayout(IsWinCOFF 4588 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32" 4589 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"); 4590 } 4591 void getTargetDefines(const LangOptions &Opts, 4592 MacroBuilder &Builder) const override { 4593 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder); 4594 } 4595 }; 4596 4597 // x86-32 Windows Visual Studio target 4598 class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo { 4599 public: 4600 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple, 4601 const TargetOptions &Opts) 4602 : WindowsX86_32TargetInfo(Triple, Opts) { 4603 LongDoubleWidth = LongDoubleAlign = 64; 4604 LongDoubleFormat = &llvm::APFloat::IEEEdouble(); 4605 } 4606 void getTargetDefines(const LangOptions &Opts, 4607 MacroBuilder &Builder) const override { 4608 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder); 4609 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder); 4610 // The value of the following reflects processor type. 4611 // 300=386, 400=486, 500=Pentium, 600=Blend (default) 4612 // We lost the original triple, so we use the default. 4613 Builder.defineMacro("_M_IX86", "600"); 4614 } 4615 }; 4616 4617 static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) { 4618 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang 4619 // supports __declspec natively under -fms-extensions, but we define a no-op 4620 // __declspec macro anyway for pre-processor compatibility. 4621 if (Opts.MicrosoftExt) 4622 Builder.defineMacro("__declspec", "__declspec"); 4623 else 4624 Builder.defineMacro("__declspec(a)", "__attribute__((a))"); 4625 4626 if (!Opts.MicrosoftExt) { 4627 // Provide macros for all the calling convention keywords. Provide both 4628 // single and double underscore prefixed variants. These are available on 4629 // x64 as well as x86, even though they have no effect. 4630 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"}; 4631 for (const char *CC : CCs) { 4632 std::string GCCSpelling = "__attribute__((__"; 4633 GCCSpelling += CC; 4634 GCCSpelling += "__))"; 4635 Builder.defineMacro(Twine("_") + CC, GCCSpelling); 4636 Builder.defineMacro(Twine("__") + CC, GCCSpelling); 4637 } 4638 } 4639 } 4640 4641 static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) { 4642 Builder.defineMacro("__MSVCRT__"); 4643 Builder.defineMacro("__MINGW32__"); 4644 addCygMingDefines(Opts, Builder); 4645 } 4646 4647 // x86-32 MinGW target 4648 class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo { 4649 public: 4650 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 4651 : WindowsX86_32TargetInfo(Triple, Opts) { 4652 HasFloat128 = true; 4653 } 4654 void getTargetDefines(const LangOptions &Opts, 4655 MacroBuilder &Builder) const override { 4656 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder); 4657 DefineStd(Builder, "WIN32", Opts); 4658 DefineStd(Builder, "WINNT", Opts); 4659 Builder.defineMacro("_X86_"); 4660 addMinGWDefines(Opts, Builder); 4661 } 4662 }; 4663 4664 // x86-32 Cygwin target 4665 class CygwinX86_32TargetInfo : public X86_32TargetInfo { 4666 public: 4667 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 4668 : X86_32TargetInfo(Triple, Opts) { 4669 WCharType = UnsignedShort; 4670 DoubleAlign = LongLongAlign = 64; 4671 resetDataLayout("e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"); 4672 } 4673 void getTargetDefines(const LangOptions &Opts, 4674 MacroBuilder &Builder) const override { 4675 X86_32TargetInfo::getTargetDefines(Opts, Builder); 4676 Builder.defineMacro("_X86_"); 4677 Builder.defineMacro("__CYGWIN__"); 4678 Builder.defineMacro("__CYGWIN32__"); 4679 addCygMingDefines(Opts, Builder); 4680 DefineStd(Builder, "unix", Opts); 4681 if (Opts.CPlusPlus) 4682 Builder.defineMacro("_GNU_SOURCE"); 4683 } 4684 }; 4685 4686 // x86-32 Haiku target 4687 class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> { 4688 public: 4689 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 4690 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) { 4691 } 4692 void getTargetDefines(const LangOptions &Opts, 4693 MacroBuilder &Builder) const override { 4694 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder); 4695 Builder.defineMacro("__INTEL__"); 4696 } 4697 }; 4698 4699 // X86-32 MCU target 4700 class MCUX86_32TargetInfo : public X86_32TargetInfo { 4701 public: 4702 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 4703 : X86_32TargetInfo(Triple, Opts) { 4704 LongDoubleWidth = 64; 4705 LongDoubleFormat = &llvm::APFloat::IEEEdouble(); 4706 resetDataLayout("e-m:e-p:32:32-i64:32-f64:32-f128:32-n8:16:32-a:0:32-S32"); 4707 WIntType = UnsignedInt; 4708 } 4709 4710 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override { 4711 // On MCU we support only C calling convention. 4712 return CC == CC_C ? CCCR_OK : CCCR_Warning; 4713 } 4714 4715 void getTargetDefines(const LangOptions &Opts, 4716 MacroBuilder &Builder) const override { 4717 X86_32TargetInfo::getTargetDefines(Opts, Builder); 4718 Builder.defineMacro("__iamcu"); 4719 Builder.defineMacro("__iamcu__"); 4720 } 4721 4722 bool allowsLargerPreferedTypeAlignment() const override { 4723 return false; 4724 } 4725 }; 4726 4727 // RTEMS Target 4728 template<typename Target> 4729 class RTEMSTargetInfo : public OSTargetInfo<Target> { 4730 protected: 4731 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 4732 MacroBuilder &Builder) const override { 4733 // RTEMS defines; list based off of gcc output 4734 4735 Builder.defineMacro("__rtems__"); 4736 Builder.defineMacro("__ELF__"); 4737 } 4738 4739 public: 4740 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 4741 : OSTargetInfo<Target>(Triple, Opts) { 4742 switch (Triple.getArch()) { 4743 default: 4744 case llvm::Triple::x86: 4745 // this->MCountName = ".mcount"; 4746 break; 4747 case llvm::Triple::mips: 4748 case llvm::Triple::mipsel: 4749 case llvm::Triple::ppc: 4750 case llvm::Triple::ppc64: 4751 case llvm::Triple::ppc64le: 4752 // this->MCountName = "_mcount"; 4753 break; 4754 case llvm::Triple::arm: 4755 // this->MCountName = "__mcount"; 4756 break; 4757 } 4758 } 4759 }; 4760 4761 // x86-32 RTEMS target 4762 class RTEMSX86_32TargetInfo : public X86_32TargetInfo { 4763 public: 4764 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 4765 : X86_32TargetInfo(Triple, Opts) { 4766 SizeType = UnsignedLong; 4767 IntPtrType = SignedLong; 4768 PtrDiffType = SignedLong; 4769 } 4770 void getTargetDefines(const LangOptions &Opts, 4771 MacroBuilder &Builder) const override { 4772 X86_32TargetInfo::getTargetDefines(Opts, Builder); 4773 Builder.defineMacro("__INTEL__"); 4774 Builder.defineMacro("__rtems__"); 4775 } 4776 }; 4777 4778 // x86-64 generic target 4779 class X86_64TargetInfo : public X86TargetInfo { 4780 public: 4781 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 4782 : X86TargetInfo(Triple, Opts) { 4783 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32; 4784 bool IsWinCOFF = 4785 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF(); 4786 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64; 4787 LongDoubleWidth = 128; 4788 LongDoubleAlign = 128; 4789 LargeArrayMinWidth = 128; 4790 LargeArrayAlign = 128; 4791 SuitableAlign = 128; 4792 SizeType = IsX32 ? UnsignedInt : UnsignedLong; 4793 PtrDiffType = IsX32 ? SignedInt : SignedLong; 4794 IntPtrType = IsX32 ? SignedInt : SignedLong; 4795 IntMaxType = IsX32 ? SignedLongLong : SignedLong; 4796 Int64Type = IsX32 ? SignedLongLong : SignedLong; 4797 RegParmMax = 6; 4798 4799 // Pointers are 32-bit in x32. 4800 resetDataLayout(IsX32 4801 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128" 4802 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128" 4803 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128"); 4804 4805 // Use fpret only for long double. 4806 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble); 4807 4808 // Use fp2ret for _Complex long double. 4809 ComplexLongDoubleUsesFP2Ret = true; 4810 4811 // Make __builtin_ms_va_list available. 4812 HasBuiltinMSVaList = true; 4813 4814 // x86-64 has atomics up to 16 bytes. 4815 MaxAtomicPromoteWidth = 128; 4816 MaxAtomicInlineWidth = 128; 4817 } 4818 BuiltinVaListKind getBuiltinVaListKind() const override { 4819 return TargetInfo::X86_64ABIBuiltinVaList; 4820 } 4821 4822 int getEHDataRegisterNumber(unsigned RegNo) const override { 4823 if (RegNo == 0) return 0; 4824 if (RegNo == 1) return 1; 4825 return -1; 4826 } 4827 4828 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override { 4829 switch (CC) { 4830 case CC_C: 4831 case CC_Swift: 4832 case CC_X86VectorCall: 4833 case CC_IntelOclBicc: 4834 case CC_X86_64Win64: 4835 case CC_PreserveMost: 4836 case CC_PreserveAll: 4837 case CC_X86RegCall: 4838 case CC_OpenCLKernel: 4839 return CCCR_OK; 4840 default: 4841 return CCCR_Warning; 4842 } 4843 } 4844 4845 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override { 4846 return CC_C; 4847 } 4848 4849 // for x32 we need it here explicitly 4850 bool hasInt128Type() const override { return true; } 4851 unsigned getUnwindWordWidth() const override { return 64; } 4852 unsigned getRegisterWidth() const override { return 64; } 4853 4854 bool validateGlobalRegisterVariable(StringRef RegName, 4855 unsigned RegSize, 4856 bool &HasSizeMismatch) const override { 4857 // rsp and rbp are the only 64-bit registers the x86 backend can currently 4858 // handle. 4859 if (RegName.equals("rsp") || RegName.equals("rbp")) { 4860 // Check that the register size is 64-bit. 4861 HasSizeMismatch = RegSize != 64; 4862 return true; 4863 } 4864 4865 // Check if the register is a 32-bit register the backend can handle. 4866 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize, 4867 HasSizeMismatch); 4868 } 4869 ArrayRef<Builtin::Info> getTargetBuiltins() const override { 4870 return llvm::makeArrayRef(BuiltinInfoX86, 4871 X86::LastTSBuiltin - Builtin::FirstTSBuiltin); 4872 } 4873 }; 4874 4875 // x86-64 Windows target 4876 class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> { 4877 public: 4878 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 4879 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) { 4880 WCharType = UnsignedShort; 4881 LongWidth = LongAlign = 32; 4882 DoubleAlign = LongLongAlign = 64; 4883 IntMaxType = SignedLongLong; 4884 Int64Type = SignedLongLong; 4885 SizeType = UnsignedLongLong; 4886 PtrDiffType = SignedLongLong; 4887 IntPtrType = SignedLongLong; 4888 } 4889 4890 void getTargetDefines(const LangOptions &Opts, 4891 MacroBuilder &Builder) const override { 4892 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder); 4893 Builder.defineMacro("_WIN64"); 4894 } 4895 4896 BuiltinVaListKind getBuiltinVaListKind() const override { 4897 return TargetInfo::CharPtrBuiltinVaList; 4898 } 4899 4900 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override { 4901 switch (CC) { 4902 case CC_X86StdCall: 4903 case CC_X86ThisCall: 4904 case CC_X86FastCall: 4905 return CCCR_Ignore; 4906 case CC_C: 4907 case CC_X86VectorCall: 4908 case CC_IntelOclBicc: 4909 case CC_X86_64SysV: 4910 case CC_Swift: 4911 case CC_X86RegCall: 4912 case CC_OpenCLKernel: 4913 return CCCR_OK; 4914 default: 4915 return CCCR_Warning; 4916 } 4917 } 4918 }; 4919 4920 // x86-64 Windows Visual Studio target 4921 class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo { 4922 public: 4923 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple, 4924 const TargetOptions &Opts) 4925 : WindowsX86_64TargetInfo(Triple, Opts) { 4926 LongDoubleWidth = LongDoubleAlign = 64; 4927 LongDoubleFormat = &llvm::APFloat::IEEEdouble(); 4928 } 4929 void getTargetDefines(const LangOptions &Opts, 4930 MacroBuilder &Builder) const override { 4931 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder); 4932 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder); 4933 Builder.defineMacro("_M_X64", "100"); 4934 Builder.defineMacro("_M_AMD64", "100"); 4935 } 4936 }; 4937 4938 // x86-64 MinGW target 4939 class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo { 4940 public: 4941 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 4942 : WindowsX86_64TargetInfo(Triple, Opts) { 4943 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks 4944 // with x86 FP ops. Weird. 4945 LongDoubleWidth = LongDoubleAlign = 128; 4946 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended(); 4947 HasFloat128 = true; 4948 } 4949 4950 void getTargetDefines(const LangOptions &Opts, 4951 MacroBuilder &Builder) const override { 4952 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder); 4953 DefineStd(Builder, "WIN64", Opts); 4954 Builder.defineMacro("__MINGW64__"); 4955 addMinGWDefines(Opts, Builder); 4956 4957 // GCC defines this macro when it is using __gxx_personality_seh0. 4958 if (!Opts.SjLjExceptions) 4959 Builder.defineMacro("__SEH__"); 4960 } 4961 }; 4962 4963 // x86-64 Cygwin target 4964 class CygwinX86_64TargetInfo : public X86_64TargetInfo { 4965 public: 4966 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 4967 : X86_64TargetInfo(Triple, Opts) { 4968 TLSSupported = false; 4969 WCharType = UnsignedShort; 4970 } 4971 void getTargetDefines(const LangOptions &Opts, 4972 MacroBuilder &Builder) const override { 4973 X86_64TargetInfo::getTargetDefines(Opts, Builder); 4974 Builder.defineMacro("__x86_64__"); 4975 Builder.defineMacro("__CYGWIN__"); 4976 Builder.defineMacro("__CYGWIN64__"); 4977 addCygMingDefines(Opts, Builder); 4978 DefineStd(Builder, "unix", Opts); 4979 if (Opts.CPlusPlus) 4980 Builder.defineMacro("_GNU_SOURCE"); 4981 4982 // GCC defines this macro when it is using __gxx_personality_seh0. 4983 if (!Opts.SjLjExceptions) 4984 Builder.defineMacro("__SEH__"); 4985 } 4986 }; 4987 4988 class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> { 4989 public: 4990 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 4991 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) { 4992 Int64Type = SignedLongLong; 4993 // The 64-bit iOS simulator uses the builtin bool type for Objective-C. 4994 llvm::Triple T = llvm::Triple(Triple); 4995 if (T.isiOS()) 4996 UseSignedCharForObjCBool = false; 4997 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128"); 4998 } 4999 5000 bool handleTargetFeatures(std::vector<std::string> &Features, 5001 DiagnosticsEngine &Diags) override { 5002 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features, 5003 Diags)) 5004 return false; 5005 // We now know the features we have: we can decide how to align vectors. 5006 MaxVectorAlign = 5007 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128; 5008 return true; 5009 } 5010 }; 5011 5012 class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> { 5013 public: 5014 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 5015 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) { 5016 IntMaxType = SignedLongLong; 5017 Int64Type = SignedLongLong; 5018 } 5019 }; 5020 5021 class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> { 5022 public: 5023 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 5024 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) { 5025 IntMaxType = SignedLongLong; 5026 Int64Type = SignedLongLong; 5027 } 5028 }; 5029 5030 class ARMTargetInfo : public TargetInfo { 5031 // Possible FPU choices. 5032 enum FPUMode { 5033 VFP2FPU = (1 << 0), 5034 VFP3FPU = (1 << 1), 5035 VFP4FPU = (1 << 2), 5036 NeonFPU = (1 << 3), 5037 FPARMV8 = (1 << 4) 5038 }; 5039 5040 // Possible HWDiv features. 5041 enum HWDivMode { 5042 HWDivThumb = (1 << 0), 5043 HWDivARM = (1 << 1) 5044 }; 5045 5046 static bool FPUModeIsVFP(FPUMode Mode) { 5047 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8); 5048 } 5049 5050 static const TargetInfo::GCCRegAlias GCCRegAliases[]; 5051 static const char * const GCCRegNames[]; 5052 5053 std::string ABI, CPU; 5054 5055 StringRef CPUProfile; 5056 StringRef CPUAttr; 5057 5058 enum { 5059 FP_Default, 5060 FP_VFP, 5061 FP_Neon 5062 } FPMath; 5063 5064 unsigned ArchISA; 5065 unsigned ArchKind = llvm::ARM::AK_ARMV4T; 5066 unsigned ArchProfile; 5067 unsigned ArchVersion; 5068 5069 unsigned FPU : 5; 5070 5071 unsigned IsAAPCS : 1; 5072 unsigned HWDiv : 2; 5073 5074 // Initialized via features. 5075 unsigned SoftFloat : 1; 5076 unsigned SoftFloatABI : 1; 5077 5078 unsigned CRC : 1; 5079 unsigned Crypto : 1; 5080 unsigned DSP : 1; 5081 unsigned Unaligned : 1; 5082 5083 enum { 5084 LDREX_B = (1 << 0), /// byte (8-bit) 5085 LDREX_H = (1 << 1), /// half (16-bit) 5086 LDREX_W = (1 << 2), /// word (32-bit) 5087 LDREX_D = (1 << 3), /// double (64-bit) 5088 }; 5089 5090 uint32_t LDREX; 5091 5092 // ACLE 6.5.1 Hardware floating point 5093 enum { 5094 HW_FP_HP = (1 << 1), /// half (16-bit) 5095 HW_FP_SP = (1 << 2), /// single (32-bit) 5096 HW_FP_DP = (1 << 3), /// double (64-bit) 5097 }; 5098 uint32_t HW_FP; 5099 5100 static const Builtin::Info BuiltinInfo[]; 5101 5102 void setABIAAPCS() { 5103 IsAAPCS = true; 5104 5105 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64; 5106 const llvm::Triple &T = getTriple(); 5107 5108 // size_t is unsigned long on MachO-derived environments, NetBSD, 5109 // OpenBSD and Bitrig. 5110 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD || 5111 T.getOS() == llvm::Triple::OpenBSD || 5112 T.getOS() == llvm::Triple::Bitrig) 5113 SizeType = UnsignedLong; 5114 else 5115 SizeType = UnsignedInt; 5116 5117 switch (T.getOS()) { 5118 case llvm::Triple::NetBSD: 5119 case llvm::Triple::OpenBSD: 5120 WCharType = SignedInt; 5121 break; 5122 case llvm::Triple::Win32: 5123 WCharType = UnsignedShort; 5124 break; 5125 case llvm::Triple::Linux: 5126 default: 5127 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int. 5128 WCharType = UnsignedInt; 5129 break; 5130 } 5131 5132 UseBitFieldTypeAlignment = true; 5133 5134 ZeroLengthBitfieldBoundary = 0; 5135 5136 // Thumb1 add sp, #imm requires the immediate value be multiple of 4, 5137 // so set preferred for small types to 32. 5138 if (T.isOSBinFormatMachO()) { 5139 resetDataLayout(BigEndian 5140 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" 5141 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"); 5142 } else if (T.isOSWindows()) { 5143 assert(!BigEndian && "Windows on ARM does not support big endian"); 5144 resetDataLayout("e" 5145 "-m:w" 5146 "-p:32:32" 5147 "-i64:64" 5148 "-v128:64:128" 5149 "-a:0:32" 5150 "-n32" 5151 "-S64"); 5152 } else if (T.isOSNaCl()) { 5153 assert(!BigEndian && "NaCl on ARM does not support big endian"); 5154 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128"); 5155 } else { 5156 resetDataLayout(BigEndian 5157 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" 5158 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"); 5159 } 5160 5161 // FIXME: Enumerated types are variable width in straight AAPCS. 5162 } 5163 5164 void setABIAPCS(bool IsAAPCS16) { 5165 const llvm::Triple &T = getTriple(); 5166 5167 IsAAPCS = false; 5168 5169 if (IsAAPCS16) 5170 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64; 5171 else 5172 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32; 5173 5174 // size_t is unsigned int on FreeBSD. 5175 if (T.getOS() == llvm::Triple::FreeBSD) 5176 SizeType = UnsignedInt; 5177 else 5178 SizeType = UnsignedLong; 5179 5180 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour. 5181 WCharType = SignedInt; 5182 5183 // Do not respect the alignment of bit-field types when laying out 5184 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc. 5185 UseBitFieldTypeAlignment = false; 5186 5187 /// gcc forces the alignment to 4 bytes, regardless of the type of the 5188 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in 5189 /// gcc. 5190 ZeroLengthBitfieldBoundary = 32; 5191 5192 if (T.isOSBinFormatMachO() && IsAAPCS16) { 5193 assert(!BigEndian && "AAPCS16 does not support big-endian"); 5194 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128"); 5195 } else if (T.isOSBinFormatMachO()) 5196 resetDataLayout( 5197 BigEndian 5198 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32" 5199 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"); 5200 else 5201 resetDataLayout( 5202 BigEndian 5203 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32" 5204 : "e-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"); 5205 5206 // FIXME: Override "preferred align" for double and long long. 5207 } 5208 5209 void setArchInfo() { 5210 StringRef ArchName = getTriple().getArchName(); 5211 5212 ArchISA = llvm::ARM::parseArchISA(ArchName); 5213 CPU = llvm::ARM::getDefaultCPU(ArchName); 5214 unsigned AK = llvm::ARM::parseArch(ArchName); 5215 if (AK != llvm::ARM::AK_INVALID) 5216 ArchKind = AK; 5217 setArchInfo(ArchKind); 5218 } 5219 5220 void setArchInfo(unsigned Kind) { 5221 StringRef SubArch; 5222 5223 // cache TargetParser info 5224 ArchKind = Kind; 5225 SubArch = llvm::ARM::getSubArch(ArchKind); 5226 ArchProfile = llvm::ARM::parseArchProfile(SubArch); 5227 ArchVersion = llvm::ARM::parseArchVersion(SubArch); 5228 5229 // cache CPU related strings 5230 CPUAttr = getCPUAttr(); 5231 CPUProfile = getCPUProfile(); 5232 } 5233 5234 void setAtomic() { 5235 // when triple does not specify a sub arch, 5236 // then we are not using inline atomics 5237 bool ShouldUseInlineAtomic = 5238 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) || 5239 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7); 5240 // Cortex M does not support 8 byte atomics, while general Thumb2 does. 5241 if (ArchProfile == llvm::ARM::PK_M) { 5242 MaxAtomicPromoteWidth = 32; 5243 if (ShouldUseInlineAtomic) 5244 MaxAtomicInlineWidth = 32; 5245 } 5246 else { 5247 MaxAtomicPromoteWidth = 64; 5248 if (ShouldUseInlineAtomic) 5249 MaxAtomicInlineWidth = 64; 5250 } 5251 } 5252 5253 bool isThumb() const { 5254 return (ArchISA == llvm::ARM::IK_THUMB); 5255 } 5256 5257 bool supportsThumb() const { 5258 return CPUAttr.count('T') || ArchVersion >= 6; 5259 } 5260 5261 bool supportsThumb2() const { 5262 return CPUAttr.equals("6T2") || 5263 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE")); 5264 } 5265 5266 StringRef getCPUAttr() const { 5267 // For most sub-arches, the build attribute CPU name is enough. 5268 // For Cortex variants, it's slightly different. 5269 switch(ArchKind) { 5270 default: 5271 return llvm::ARM::getCPUAttr(ArchKind); 5272 case llvm::ARM::AK_ARMV6M: 5273 return "6M"; 5274 case llvm::ARM::AK_ARMV7S: 5275 return "7S"; 5276 case llvm::ARM::AK_ARMV7A: 5277 return "7A"; 5278 case llvm::ARM::AK_ARMV7R: 5279 return "7R"; 5280 case llvm::ARM::AK_ARMV7M: 5281 return "7M"; 5282 case llvm::ARM::AK_ARMV7EM: 5283 return "7EM"; 5284 case llvm::ARM::AK_ARMV7VE: 5285 return "7VE"; 5286 case llvm::ARM::AK_ARMV8A: 5287 return "8A"; 5288 case llvm::ARM::AK_ARMV8_1A: 5289 return "8_1A"; 5290 case llvm::ARM::AK_ARMV8_2A: 5291 return "8_2A"; 5292 case llvm::ARM::AK_ARMV8MBaseline: 5293 return "8M_BASE"; 5294 case llvm::ARM::AK_ARMV8MMainline: 5295 return "8M_MAIN"; 5296 case llvm::ARM::AK_ARMV8R: 5297 return "8R"; 5298 } 5299 } 5300 5301 StringRef getCPUProfile() const { 5302 switch(ArchProfile) { 5303 case llvm::ARM::PK_A: 5304 return "A"; 5305 case llvm::ARM::PK_R: 5306 return "R"; 5307 case llvm::ARM::PK_M: 5308 return "M"; 5309 default: 5310 return ""; 5311 } 5312 } 5313 5314 public: 5315 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 5316 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0), 5317 HW_FP(0) { 5318 5319 switch (getTriple().getOS()) { 5320 case llvm::Triple::NetBSD: 5321 case llvm::Triple::OpenBSD: 5322 PtrDiffType = SignedLong; 5323 break; 5324 default: 5325 PtrDiffType = SignedInt; 5326 break; 5327 } 5328 5329 // Cache arch related info. 5330 setArchInfo(); 5331 5332 // {} in inline assembly are neon specifiers, not assembly variant 5333 // specifiers. 5334 NoAsmVariants = true; 5335 5336 // FIXME: This duplicates code from the driver that sets the -target-abi 5337 // option - this code is used if -target-abi isn't passed and should 5338 // be unified in some way. 5339 if (Triple.isOSBinFormatMachO()) { 5340 // The backend is hardwired to assume AAPCS for M-class processors, ensure 5341 // the frontend matches that. 5342 if (Triple.getEnvironment() == llvm::Triple::EABI || 5343 Triple.getOS() == llvm::Triple::UnknownOS || 5344 ArchProfile == llvm::ARM::PK_M) { 5345 setABI("aapcs"); 5346 } else if (Triple.isWatchABI()) { 5347 setABI("aapcs16"); 5348 } else { 5349 setABI("apcs-gnu"); 5350 } 5351 } else if (Triple.isOSWindows()) { 5352 // FIXME: this is invalid for WindowsCE 5353 setABI("aapcs"); 5354 } else { 5355 // Select the default based on the platform. 5356 switch (Triple.getEnvironment()) { 5357 case llvm::Triple::Android: 5358 case llvm::Triple::GNUEABI: 5359 case llvm::Triple::GNUEABIHF: 5360 case llvm::Triple::MuslEABI: 5361 case llvm::Triple::MuslEABIHF: 5362 setABI("aapcs-linux"); 5363 break; 5364 case llvm::Triple::EABIHF: 5365 case llvm::Triple::EABI: 5366 setABI("aapcs"); 5367 break; 5368 case llvm::Triple::GNU: 5369 setABI("apcs-gnu"); 5370 break; 5371 default: 5372 if (Triple.getOS() == llvm::Triple::NetBSD) 5373 setABI("apcs-gnu"); 5374 else if (Triple.getOS() == llvm::Triple::OpenBSD) 5375 setABI("aapcs-linux"); 5376 else 5377 setABI("aapcs"); 5378 break; 5379 } 5380 } 5381 5382 // ARM targets default to using the ARM C++ ABI. 5383 TheCXXABI.set(TargetCXXABI::GenericARM); 5384 5385 // ARM has atomics up to 8 bytes 5386 setAtomic(); 5387 5388 // Maximum alignment for ARM NEON data types should be 64-bits (AAPCS) 5389 if (IsAAPCS && (Triple.getEnvironment() != llvm::Triple::Android)) 5390 MaxVectorAlign = 64; 5391 5392 // Do force alignment of members that follow zero length bitfields. If 5393 // the alignment of the zero-length bitfield is greater than the member 5394 // that follows it, `bar', `bar' will be aligned as the type of the 5395 // zero length bitfield. 5396 UseZeroLengthBitfieldAlignment = true; 5397 5398 if (Triple.getOS() == llvm::Triple::Linux || 5399 Triple.getOS() == llvm::Triple::UnknownOS) 5400 this->MCountName = 5401 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount"; 5402 } 5403 5404 StringRef getABI() const override { return ABI; } 5405 5406 bool setABI(const std::string &Name) override { 5407 ABI = Name; 5408 5409 // The defaults (above) are for AAPCS, check if we need to change them. 5410 // 5411 // FIXME: We need support for -meabi... we could just mangle it into the 5412 // name. 5413 if (Name == "apcs-gnu" || Name == "aapcs16") { 5414 setABIAPCS(Name == "aapcs16"); 5415 return true; 5416 } 5417 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") { 5418 setABIAAPCS(); 5419 return true; 5420 } 5421 return false; 5422 } 5423 5424 // FIXME: This should be based on Arch attributes, not CPU names. 5425 bool 5426 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, 5427 StringRef CPU, 5428 const std::vector<std::string> &FeaturesVec) const override { 5429 5430 std::vector<StringRef> TargetFeatures; 5431 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName()); 5432 5433 // get default FPU features 5434 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch); 5435 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures); 5436 5437 // get default Extension features 5438 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch); 5439 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures); 5440 5441 for (auto Feature : TargetFeatures) 5442 if (Feature[0] == '+') 5443 Features[Feature.drop_front(1)] = true; 5444 5445 // Enable or disable thumb-mode explicitly per function to enable mixed 5446 // ARM and Thumb code generation. 5447 if (isThumb()) 5448 Features["thumb-mode"] = true; 5449 else 5450 Features["thumb-mode"] = false; 5451 5452 // Convert user-provided arm and thumb GNU target attributes to 5453 // [-|+]thumb-mode target features respectively. 5454 std::vector<std::string> UpdatedFeaturesVec(FeaturesVec); 5455 for (auto &Feature : UpdatedFeaturesVec) { 5456 if (Feature.compare("+arm") == 0) 5457 Feature = "-thumb-mode"; 5458 else if (Feature.compare("+thumb") == 0) 5459 Feature = "+thumb-mode"; 5460 } 5461 5462 return TargetInfo::initFeatureMap(Features, Diags, CPU, UpdatedFeaturesVec); 5463 } 5464 5465 bool handleTargetFeatures(std::vector<std::string> &Features, 5466 DiagnosticsEngine &Diags) override { 5467 FPU = 0; 5468 CRC = 0; 5469 Crypto = 0; 5470 DSP = 0; 5471 Unaligned = 1; 5472 SoftFloat = SoftFloatABI = false; 5473 HWDiv = 0; 5474 5475 // This does not diagnose illegal cases like having both 5476 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp". 5477 uint32_t HW_FP_remove = 0; 5478 for (const auto &Feature : Features) { 5479 if (Feature == "+soft-float") { 5480 SoftFloat = true; 5481 } else if (Feature == "+soft-float-abi") { 5482 SoftFloatABI = true; 5483 } else if (Feature == "+vfp2") { 5484 FPU |= VFP2FPU; 5485 HW_FP |= HW_FP_SP | HW_FP_DP; 5486 } else if (Feature == "+vfp3") { 5487 FPU |= VFP3FPU; 5488 HW_FP |= HW_FP_SP | HW_FP_DP; 5489 } else if (Feature == "+vfp4") { 5490 FPU |= VFP4FPU; 5491 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP; 5492 } else if (Feature == "+fp-armv8") { 5493 FPU |= FPARMV8; 5494 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP; 5495 } else if (Feature == "+neon") { 5496 FPU |= NeonFPU; 5497 HW_FP |= HW_FP_SP | HW_FP_DP; 5498 } else if (Feature == "+hwdiv") { 5499 HWDiv |= HWDivThumb; 5500 } else if (Feature == "+hwdiv-arm") { 5501 HWDiv |= HWDivARM; 5502 } else if (Feature == "+crc") { 5503 CRC = 1; 5504 } else if (Feature == "+crypto") { 5505 Crypto = 1; 5506 } else if (Feature == "+dsp") { 5507 DSP = 1; 5508 } else if (Feature == "+fp-only-sp") { 5509 HW_FP_remove |= HW_FP_DP; 5510 } else if (Feature == "+strict-align") { 5511 Unaligned = 0; 5512 } else if (Feature == "+fp16") { 5513 HW_FP |= HW_FP_HP; 5514 } 5515 } 5516 HW_FP &= ~HW_FP_remove; 5517 5518 switch (ArchVersion) { 5519 case 6: 5520 if (ArchProfile == llvm::ARM::PK_M) 5521 LDREX = 0; 5522 else if (ArchKind == llvm::ARM::AK_ARMV6K) 5523 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ; 5524 else 5525 LDREX = LDREX_W; 5526 break; 5527 case 7: 5528 if (ArchProfile == llvm::ARM::PK_M) 5529 LDREX = LDREX_W | LDREX_H | LDREX_B ; 5530 else 5531 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ; 5532 break; 5533 case 8: 5534 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ; 5535 } 5536 5537 if (!(FPU & NeonFPU) && FPMath == FP_Neon) { 5538 Diags.Report(diag::err_target_unsupported_fpmath) << "neon"; 5539 return false; 5540 } 5541 5542 if (FPMath == FP_Neon) 5543 Features.push_back("+neonfp"); 5544 else if (FPMath == FP_VFP) 5545 Features.push_back("-neonfp"); 5546 5547 // Remove front-end specific options which the backend handles differently. 5548 auto Feature = 5549 std::find(Features.begin(), Features.end(), "+soft-float-abi"); 5550 if (Feature != Features.end()) 5551 Features.erase(Feature); 5552 5553 return true; 5554 } 5555 5556 bool hasFeature(StringRef Feature) const override { 5557 return llvm::StringSwitch<bool>(Feature) 5558 .Case("arm", true) 5559 .Case("aarch32", true) 5560 .Case("softfloat", SoftFloat) 5561 .Case("thumb", isThumb()) 5562 .Case("neon", (FPU & NeonFPU) && !SoftFloat) 5563 .Case("vfp", FPU && !SoftFloat) 5564 .Case("hwdiv", HWDiv & HWDivThumb) 5565 .Case("hwdiv-arm", HWDiv & HWDivARM) 5566 .Default(false); 5567 } 5568 5569 bool setCPU(const std::string &Name) override { 5570 if (Name != "generic") 5571 setArchInfo(llvm::ARM::parseCPUArch(Name)); 5572 5573 if (ArchKind == llvm::ARM::AK_INVALID) 5574 return false; 5575 setAtomic(); 5576 CPU = Name; 5577 return true; 5578 } 5579 5580 bool setFPMath(StringRef Name) override; 5581 5582 void getTargetDefines(const LangOptions &Opts, 5583 MacroBuilder &Builder) const override { 5584 // Target identification. 5585 Builder.defineMacro("__arm"); 5586 Builder.defineMacro("__arm__"); 5587 // For bare-metal none-eabi. 5588 if (getTriple().getOS() == llvm::Triple::UnknownOS && 5589 (getTriple().getEnvironment() == llvm::Triple::EABI || 5590 getTriple().getEnvironment() == llvm::Triple::EABIHF)) 5591 Builder.defineMacro("__ELF__"); 5592 5593 5594 // Target properties. 5595 Builder.defineMacro("__REGISTER_PREFIX__", ""); 5596 5597 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU 5598 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__. 5599 if (getTriple().isWatchABI()) 5600 Builder.defineMacro("__ARM_ARCH_7K__", "2"); 5601 5602 if (!CPUAttr.empty()) 5603 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__"); 5604 5605 // ACLE 6.4.1 ARM/Thumb instruction set architecture 5606 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA 5607 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion)); 5608 5609 if (ArchVersion >= 8) { 5610 // ACLE 6.5.7 Crypto Extension 5611 if (Crypto) 5612 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1"); 5613 // ACLE 6.5.8 CRC32 Extension 5614 if (CRC) 5615 Builder.defineMacro("__ARM_FEATURE_CRC32", "1"); 5616 // ACLE 6.5.10 Numeric Maximum and Minimum 5617 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1"); 5618 // ACLE 6.5.9 Directed Rounding 5619 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1"); 5620 } 5621 5622 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It 5623 // is not defined for the M-profile. 5624 // NOTE that the default profile is assumed to be 'A' 5625 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M) 5626 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1"); 5627 5628 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original 5629 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the 5630 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all 5631 // v7 and v8 architectures excluding v8-M Baseline. 5632 if (supportsThumb2()) 5633 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2"); 5634 else if (supportsThumb()) 5635 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1"); 5636 5637 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit 5638 // instruction set such as ARM or Thumb. 5639 Builder.defineMacro("__ARM_32BIT_STATE", "1"); 5640 5641 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex) 5642 5643 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset. 5644 if (!CPUProfile.empty()) 5645 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'"); 5646 5647 // ACLE 6.4.3 Unaligned access supported in hardware 5648 if (Unaligned) 5649 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1"); 5650 5651 // ACLE 6.4.4 LDREX/STREX 5652 if (LDREX) 5653 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX)); 5654 5655 // ACLE 6.4.5 CLZ 5656 if (ArchVersion == 5 || 5657 (ArchVersion == 6 && CPUProfile != "M") || 5658 ArchVersion > 6) 5659 Builder.defineMacro("__ARM_FEATURE_CLZ", "1"); 5660 5661 // ACLE 6.5.1 Hardware Floating Point 5662 if (HW_FP) 5663 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP)); 5664 5665 // ACLE predefines. 5666 Builder.defineMacro("__ARM_ACLE", "200"); 5667 5668 // FP16 support (we currently only support IEEE format). 5669 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1"); 5670 Builder.defineMacro("__ARM_FP16_ARGS", "1"); 5671 5672 // ACLE 6.5.3 Fused multiply-accumulate (FMA) 5673 if (ArchVersion >= 7 && (FPU & VFP4FPU)) 5674 Builder.defineMacro("__ARM_FEATURE_FMA", "1"); 5675 5676 // Subtarget options. 5677 5678 // FIXME: It's more complicated than this and we don't really support 5679 // interworking. 5680 // Windows on ARM does not "support" interworking 5681 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows()) 5682 Builder.defineMacro("__THUMB_INTERWORK__"); 5683 5684 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") { 5685 // Embedded targets on Darwin follow AAPCS, but not EABI. 5686 // Windows on ARM follows AAPCS VFP, but does not conform to EABI. 5687 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows()) 5688 Builder.defineMacro("__ARM_EABI__"); 5689 Builder.defineMacro("__ARM_PCS", "1"); 5690 } 5691 5692 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" || 5693 ABI == "aapcs16") 5694 Builder.defineMacro("__ARM_PCS_VFP", "1"); 5695 5696 if (SoftFloat) 5697 Builder.defineMacro("__SOFTFP__"); 5698 5699 if (ArchKind == llvm::ARM::AK_XSCALE) 5700 Builder.defineMacro("__XSCALE__"); 5701 5702 if (isThumb()) { 5703 Builder.defineMacro("__THUMBEL__"); 5704 Builder.defineMacro("__thumb__"); 5705 if (supportsThumb2()) 5706 Builder.defineMacro("__thumb2__"); 5707 } 5708 5709 // ACLE 6.4.9 32-bit SIMD instructions 5710 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM")) 5711 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1"); 5712 5713 // ACLE 6.4.10 Hardware Integer Divide 5714 if (((HWDiv & HWDivThumb) && isThumb()) || 5715 ((HWDiv & HWDivARM) && !isThumb())) { 5716 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); 5717 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1"); 5718 } 5719 5720 // Note, this is always on in gcc, even though it doesn't make sense. 5721 Builder.defineMacro("__APCS_32__"); 5722 5723 if (FPUModeIsVFP((FPUMode) FPU)) { 5724 Builder.defineMacro("__VFP_FP__"); 5725 if (FPU & VFP2FPU) 5726 Builder.defineMacro("__ARM_VFPV2__"); 5727 if (FPU & VFP3FPU) 5728 Builder.defineMacro("__ARM_VFPV3__"); 5729 if (FPU & VFP4FPU) 5730 Builder.defineMacro("__ARM_VFPV4__"); 5731 if (FPU & FPARMV8) 5732 Builder.defineMacro("__ARM_FPV5__"); 5733 } 5734 5735 // This only gets set when Neon instructions are actually available, unlike 5736 // the VFP define, hence the soft float and arch check. This is subtly 5737 // different from gcc, we follow the intent which was that it should be set 5738 // when Neon instructions are actually available. 5739 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) { 5740 Builder.defineMacro("__ARM_NEON", "1"); 5741 Builder.defineMacro("__ARM_NEON__"); 5742 // current AArch32 NEON implementations do not support double-precision 5743 // floating-point even when it is present in VFP. 5744 Builder.defineMacro("__ARM_NEON_FP", 5745 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP)); 5746 } 5747 5748 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", 5749 Opts.ShortWChar ? "2" : "4"); 5750 5751 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM", 5752 Opts.ShortEnums ? "1" : "4"); 5753 5754 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") { 5755 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1"); 5756 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2"); 5757 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4"); 5758 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8"); 5759 } 5760 5761 // ACLE 6.4.7 DSP instructions 5762 if (DSP) { 5763 Builder.defineMacro("__ARM_FEATURE_DSP", "1"); 5764 } 5765 5766 // ACLE 6.4.8 Saturation instructions 5767 bool SAT = false; 5768 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) { 5769 Builder.defineMacro("__ARM_FEATURE_SAT", "1"); 5770 SAT = true; 5771 } 5772 5773 // ACLE 6.4.6 Q (saturation) flag 5774 if (DSP || SAT) 5775 Builder.defineMacro("__ARM_FEATURE_QBIT", "1"); 5776 5777 if (Opts.UnsafeFPMath) 5778 Builder.defineMacro("__ARM_FP_FAST", "1"); 5779 5780 if (ArchKind == llvm::ARM::AK_ARMV8_1A) 5781 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1"); 5782 } 5783 5784 ArrayRef<Builtin::Info> getTargetBuiltins() const override { 5785 return llvm::makeArrayRef(BuiltinInfo, 5786 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin); 5787 } 5788 bool isCLZForZeroUndef() const override { return false; } 5789 BuiltinVaListKind getBuiltinVaListKind() const override { 5790 return IsAAPCS 5791 ? AAPCSABIBuiltinVaList 5792 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList 5793 : TargetInfo::VoidPtrBuiltinVaList); 5794 } 5795 ArrayRef<const char *> getGCCRegNames() const override; 5796 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override; 5797 bool validateAsmConstraint(const char *&Name, 5798 TargetInfo::ConstraintInfo &Info) const override { 5799 switch (*Name) { 5800 default: break; 5801 case 'l': // r0-r7 5802 case 'h': // r8-r15 5803 case 't': // VFP Floating point register single precision 5804 case 'w': // VFP Floating point register double precision 5805 Info.setAllowsRegister(); 5806 return true; 5807 case 'I': 5808 case 'J': 5809 case 'K': 5810 case 'L': 5811 case 'M': 5812 // FIXME 5813 return true; 5814 case 'Q': // A memory address that is a single base register. 5815 Info.setAllowsMemory(); 5816 return true; 5817 case 'U': // a memory reference... 5818 switch (Name[1]) { 5819 case 'q': // ...ARMV4 ldrsb 5820 case 'v': // ...VFP load/store (reg+constant offset) 5821 case 'y': // ...iWMMXt load/store 5822 case 't': // address valid for load/store opaque types wider 5823 // than 128-bits 5824 case 'n': // valid address for Neon doubleword vector load/store 5825 case 'm': // valid address for Neon element and structure load/store 5826 case 's': // valid address for non-offset loads/stores of quad-word 5827 // values in four ARM registers 5828 Info.setAllowsMemory(); 5829 Name++; 5830 return true; 5831 } 5832 } 5833 return false; 5834 } 5835 std::string convertConstraint(const char *&Constraint) const override { 5836 std::string R; 5837 switch (*Constraint) { 5838 case 'U': // Two-character constraint; add "^" hint for later parsing. 5839 R = std::string("^") + std::string(Constraint, 2); 5840 Constraint++; 5841 break; 5842 case 'p': // 'p' should be translated to 'r' by default. 5843 R = std::string("r"); 5844 break; 5845 default: 5846 return std::string(1, *Constraint); 5847 } 5848 return R; 5849 } 5850 bool 5851 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size, 5852 std::string &SuggestedModifier) const override { 5853 bool isOutput = (Constraint[0] == '='); 5854 bool isInOut = (Constraint[0] == '+'); 5855 5856 // Strip off constraint modifiers. 5857 while (Constraint[0] == '=' || 5858 Constraint[0] == '+' || 5859 Constraint[0] == '&') 5860 Constraint = Constraint.substr(1); 5861 5862 switch (Constraint[0]) { 5863 default: break; 5864 case 'r': { 5865 switch (Modifier) { 5866 default: 5867 return (isInOut || isOutput || Size <= 64); 5868 case 'q': 5869 // A register of size 32 cannot fit a vector type. 5870 return false; 5871 } 5872 } 5873 } 5874 5875 return true; 5876 } 5877 const char *getClobbers() const override { 5878 // FIXME: Is this really right? 5879 return ""; 5880 } 5881 5882 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override { 5883 switch (CC) { 5884 case CC_AAPCS: 5885 case CC_AAPCS_VFP: 5886 case CC_Swift: 5887 case CC_OpenCLKernel: 5888 return CCCR_OK; 5889 default: 5890 return CCCR_Warning; 5891 } 5892 } 5893 5894 int getEHDataRegisterNumber(unsigned RegNo) const override { 5895 if (RegNo == 0) return 0; 5896 if (RegNo == 1) return 1; 5897 return -1; 5898 } 5899 5900 bool hasSjLjLowering() const override { 5901 return true; 5902 } 5903 }; 5904 5905 bool ARMTargetInfo::setFPMath(StringRef Name) { 5906 if (Name == "neon") { 5907 FPMath = FP_Neon; 5908 return true; 5909 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" || 5910 Name == "vfp4") { 5911 FPMath = FP_VFP; 5912 return true; 5913 } 5914 return false; 5915 } 5916 5917 const char * const ARMTargetInfo::GCCRegNames[] = { 5918 // Integer registers 5919 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", 5920 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc", 5921 5922 // Float registers 5923 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", 5924 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15", 5925 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23", 5926 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31", 5927 5928 // Double registers 5929 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", 5930 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15", 5931 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23", 5932 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31", 5933 5934 // Quad registers 5935 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", 5936 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" 5937 }; 5938 5939 ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const { 5940 return llvm::makeArrayRef(GCCRegNames); 5941 } 5942 5943 const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = { 5944 { { "a1" }, "r0" }, 5945 { { "a2" }, "r1" }, 5946 { { "a3" }, "r2" }, 5947 { { "a4" }, "r3" }, 5948 { { "v1" }, "r4" }, 5949 { { "v2" }, "r5" }, 5950 { { "v3" }, "r6" }, 5951 { { "v4" }, "r7" }, 5952 { { "v5" }, "r8" }, 5953 { { "v6", "rfp" }, "r9" }, 5954 { { "sl" }, "r10" }, 5955 { { "fp" }, "r11" }, 5956 { { "ip" }, "r12" }, 5957 { { "r13" }, "sp" }, 5958 { { "r14" }, "lr" }, 5959 { { "r15" }, "pc" }, 5960 // The S, D and Q registers overlap, but aren't really aliases; we 5961 // don't want to substitute one of these for a different-sized one. 5962 }; 5963 5964 ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const { 5965 return llvm::makeArrayRef(GCCRegAliases); 5966 } 5967 5968 const Builtin::Info ARMTargetInfo::BuiltinInfo[] = { 5969 #define BUILTIN(ID, TYPE, ATTRS) \ 5970 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr }, 5971 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \ 5972 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr }, 5973 #include "clang/Basic/BuiltinsNEON.def" 5974 5975 #define BUILTIN(ID, TYPE, ATTRS) \ 5976 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr }, 5977 #define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \ 5978 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr }, 5979 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \ 5980 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr }, 5981 #define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \ 5982 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE }, 5983 #include "clang/Basic/BuiltinsARM.def" 5984 }; 5985 5986 class ARMleTargetInfo : public ARMTargetInfo { 5987 public: 5988 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 5989 : ARMTargetInfo(Triple, Opts) {} 5990 void getTargetDefines(const LangOptions &Opts, 5991 MacroBuilder &Builder) const override { 5992 Builder.defineMacro("__ARMEL__"); 5993 ARMTargetInfo::getTargetDefines(Opts, Builder); 5994 } 5995 }; 5996 5997 class ARMbeTargetInfo : public ARMTargetInfo { 5998 public: 5999 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 6000 : ARMTargetInfo(Triple, Opts) {} 6001 void getTargetDefines(const LangOptions &Opts, 6002 MacroBuilder &Builder) const override { 6003 Builder.defineMacro("__ARMEB__"); 6004 Builder.defineMacro("__ARM_BIG_ENDIAN"); 6005 ARMTargetInfo::getTargetDefines(Opts, Builder); 6006 } 6007 }; 6008 6009 class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> { 6010 const llvm::Triple Triple; 6011 public: 6012 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 6013 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) { 6014 WCharType = UnsignedShort; 6015 SizeType = UnsignedInt; 6016 } 6017 void getVisualStudioDefines(const LangOptions &Opts, 6018 MacroBuilder &Builder) const { 6019 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder); 6020 6021 // FIXME: this is invalid for WindowsCE 6022 Builder.defineMacro("_M_ARM_NT", "1"); 6023 Builder.defineMacro("_M_ARMT", "_M_ARM"); 6024 Builder.defineMacro("_M_THUMB", "_M_ARM"); 6025 6026 assert((Triple.getArch() == llvm::Triple::arm || 6027 Triple.getArch() == llvm::Triple::thumb) && 6028 "invalid architecture for Windows ARM target info"); 6029 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6; 6030 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset)); 6031 6032 // TODO map the complete set of values 6033 // 31: VFPv3 40: VFPv4 6034 Builder.defineMacro("_M_ARM_FP", "31"); 6035 } 6036 BuiltinVaListKind getBuiltinVaListKind() const override { 6037 return TargetInfo::CharPtrBuiltinVaList; 6038 } 6039 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override { 6040 switch (CC) { 6041 case CC_X86StdCall: 6042 case CC_X86ThisCall: 6043 case CC_X86FastCall: 6044 case CC_X86VectorCall: 6045 return CCCR_Ignore; 6046 case CC_C: 6047 case CC_OpenCLKernel: 6048 return CCCR_OK; 6049 default: 6050 return CCCR_Warning; 6051 } 6052 } 6053 }; 6054 6055 // Windows ARM + Itanium C++ ABI Target 6056 class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo { 6057 public: 6058 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple, 6059 const TargetOptions &Opts) 6060 : WindowsARMTargetInfo(Triple, Opts) { 6061 TheCXXABI.set(TargetCXXABI::GenericARM); 6062 } 6063 6064 void getTargetDefines(const LangOptions &Opts, 6065 MacroBuilder &Builder) const override { 6066 WindowsARMTargetInfo::getTargetDefines(Opts, Builder); 6067 6068 if (Opts.MSVCCompat) 6069 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder); 6070 } 6071 }; 6072 6073 // Windows ARM, MS (C++) ABI 6074 class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo { 6075 public: 6076 MicrosoftARMleTargetInfo(const llvm::Triple &Triple, 6077 const TargetOptions &Opts) 6078 : WindowsARMTargetInfo(Triple, Opts) { 6079 TheCXXABI.set(TargetCXXABI::Microsoft); 6080 } 6081 6082 void getTargetDefines(const LangOptions &Opts, 6083 MacroBuilder &Builder) const override { 6084 WindowsARMTargetInfo::getTargetDefines(Opts, Builder); 6085 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder); 6086 } 6087 }; 6088 6089 // ARM MinGW target 6090 class MinGWARMTargetInfo : public WindowsARMTargetInfo { 6091 public: 6092 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 6093 : WindowsARMTargetInfo(Triple, Opts) { 6094 TheCXXABI.set(TargetCXXABI::GenericARM); 6095 } 6096 6097 void getTargetDefines(const LangOptions &Opts, 6098 MacroBuilder &Builder) const override { 6099 WindowsARMTargetInfo::getTargetDefines(Opts, Builder); 6100 DefineStd(Builder, "WIN32", Opts); 6101 DefineStd(Builder, "WINNT", Opts); 6102 Builder.defineMacro("_ARM_"); 6103 addMinGWDefines(Opts, Builder); 6104 } 6105 }; 6106 6107 // ARM Cygwin target 6108 class CygwinARMTargetInfo : public ARMleTargetInfo { 6109 public: 6110 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 6111 : ARMleTargetInfo(Triple, Opts) { 6112 TLSSupported = false; 6113 WCharType = UnsignedShort; 6114 DoubleAlign = LongLongAlign = 64; 6115 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"); 6116 } 6117 void getTargetDefines(const LangOptions &Opts, 6118 MacroBuilder &Builder) const override { 6119 ARMleTargetInfo::getTargetDefines(Opts, Builder); 6120 Builder.defineMacro("_ARM_"); 6121 Builder.defineMacro("__CYGWIN__"); 6122 Builder.defineMacro("__CYGWIN32__"); 6123 DefineStd(Builder, "unix", Opts); 6124 if (Opts.CPlusPlus) 6125 Builder.defineMacro("_GNU_SOURCE"); 6126 } 6127 }; 6128 6129 class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> { 6130 protected: 6131 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 6132 MacroBuilder &Builder) const override { 6133 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion); 6134 } 6135 6136 public: 6137 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 6138 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) { 6139 HasAlignMac68kSupport = true; 6140 // iOS always has 64-bit atomic instructions. 6141 // FIXME: This should be based off of the target features in 6142 // ARMleTargetInfo. 6143 MaxAtomicInlineWidth = 64; 6144 6145 if (Triple.isWatchABI()) { 6146 // Darwin on iOS uses a variant of the ARM C++ ABI. 6147 TheCXXABI.set(TargetCXXABI::WatchOS); 6148 6149 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that 6150 // size_t is long, it's a bit weird for it to be int. 6151 PtrDiffType = SignedLong; 6152 6153 // BOOL should be a real boolean on the new ABI 6154 UseSignedCharForObjCBool = false; 6155 } else 6156 TheCXXABI.set(TargetCXXABI::iOS); 6157 } 6158 }; 6159 6160 class AArch64TargetInfo : public TargetInfo { 6161 virtual void setDataLayout() = 0; 6162 static const TargetInfo::GCCRegAlias GCCRegAliases[]; 6163 static const char *const GCCRegNames[]; 6164 6165 enum FPUModeEnum { 6166 FPUMode, 6167 NeonMode 6168 }; 6169 6170 unsigned FPU; 6171 unsigned CRC; 6172 unsigned Crypto; 6173 unsigned Unaligned; 6174 unsigned V8_1A; 6175 6176 static const Builtin::Info BuiltinInfo[]; 6177 6178 std::string ABI; 6179 6180 public: 6181 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 6182 : TargetInfo(Triple), ABI("aapcs") { 6183 if (getTriple().getOS() == llvm::Triple::NetBSD || 6184 getTriple().getOS() == llvm::Triple::OpenBSD) { 6185 WCharType = SignedInt; 6186 6187 // NetBSD apparently prefers consistency across ARM targets to consistency 6188 // across 64-bit targets. 6189 Int64Type = SignedLongLong; 6190 IntMaxType = SignedLongLong; 6191 } else { 6192 WCharType = UnsignedInt; 6193 Int64Type = SignedLong; 6194 IntMaxType = SignedLong; 6195 } 6196 6197 LongWidth = LongAlign = PointerWidth = PointerAlign = 64; 6198 MaxVectorAlign = 128; 6199 MaxAtomicInlineWidth = 128; 6200 MaxAtomicPromoteWidth = 128; 6201 6202 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128; 6203 LongDoubleFormat = &llvm::APFloat::IEEEquad(); 6204 6205 // {} in inline assembly are neon specifiers, not assembly variant 6206 // specifiers. 6207 NoAsmVariants = true; 6208 6209 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type 6210 // contributes to the alignment of the containing aggregate in the same way 6211 // a plain (non bit-field) member of that type would, without exception for 6212 // zero-sized or anonymous bit-fields." 6213 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment"); 6214 UseZeroLengthBitfieldAlignment = true; 6215 6216 // AArch64 targets default to using the ARM C++ ABI. 6217 TheCXXABI.set(TargetCXXABI::GenericAArch64); 6218 6219 if (Triple.getOS() == llvm::Triple::Linux) 6220 this->MCountName = "\01_mcount"; 6221 else if (Triple.getOS() == llvm::Triple::UnknownOS) 6222 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount"; 6223 } 6224 6225 StringRef getABI() const override { return ABI; } 6226 bool setABI(const std::string &Name) override { 6227 if (Name != "aapcs" && Name != "darwinpcs") 6228 return false; 6229 6230 ABI = Name; 6231 return true; 6232 } 6233 6234 bool setCPU(const std::string &Name) override { 6235 return Name == "generic" || 6236 llvm::AArch64::parseCPUArch(Name) != 6237 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID); 6238 } 6239 6240 void getTargetDefines(const LangOptions &Opts, 6241 MacroBuilder &Builder) const override { 6242 // Target identification. 6243 Builder.defineMacro("__aarch64__"); 6244 // For bare-metal none-eabi. 6245 if (getTriple().getOS() == llvm::Triple::UnknownOS && 6246 (getTriple().getEnvironment() == llvm::Triple::EABI || 6247 getTriple().getEnvironment() == llvm::Triple::EABIHF)) 6248 Builder.defineMacro("__ELF__"); 6249 6250 // Target properties. 6251 Builder.defineMacro("_LP64"); 6252 Builder.defineMacro("__LP64__"); 6253 6254 // ACLE predefines. Many can only have one possible value on v8 AArch64. 6255 Builder.defineMacro("__ARM_ACLE", "200"); 6256 Builder.defineMacro("__ARM_ARCH", "8"); 6257 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'"); 6258 6259 Builder.defineMacro("__ARM_64BIT_STATE", "1"); 6260 Builder.defineMacro("__ARM_PCS_AAPCS64", "1"); 6261 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1"); 6262 6263 Builder.defineMacro("__ARM_FEATURE_CLZ", "1"); 6264 Builder.defineMacro("__ARM_FEATURE_FMA", "1"); 6265 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF"); 6266 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE 6267 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility 6268 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1"); 6269 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1"); 6270 6271 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4"); 6272 6273 // 0xe implies support for half, single and double precision operations. 6274 Builder.defineMacro("__ARM_FP", "0xE"); 6275 6276 // PCS specifies this for SysV variants, which is all we support. Other ABIs 6277 // may choose __ARM_FP16_FORMAT_ALTERNATIVE. 6278 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1"); 6279 Builder.defineMacro("__ARM_FP16_ARGS", "1"); 6280 6281 if (Opts.UnsafeFPMath) 6282 Builder.defineMacro("__ARM_FP_FAST", "1"); 6283 6284 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4"); 6285 6286 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM", 6287 Opts.ShortEnums ? "1" : "4"); 6288 6289 if (FPU == NeonMode) { 6290 Builder.defineMacro("__ARM_NEON", "1"); 6291 // 64-bit NEON supports half, single and double precision operations. 6292 Builder.defineMacro("__ARM_NEON_FP", "0xE"); 6293 } 6294 6295 if (CRC) 6296 Builder.defineMacro("__ARM_FEATURE_CRC32", "1"); 6297 6298 if (Crypto) 6299 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1"); 6300 6301 if (Unaligned) 6302 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1"); 6303 6304 if (V8_1A) 6305 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1"); 6306 6307 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work. 6308 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1"); 6309 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2"); 6310 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4"); 6311 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8"); 6312 } 6313 6314 ArrayRef<Builtin::Info> getTargetBuiltins() const override { 6315 return llvm::makeArrayRef(BuiltinInfo, 6316 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin); 6317 } 6318 6319 bool hasFeature(StringRef Feature) const override { 6320 return Feature == "aarch64" || 6321 Feature == "arm64" || 6322 Feature == "arm" || 6323 (Feature == "neon" && FPU == NeonMode); 6324 } 6325 6326 bool handleTargetFeatures(std::vector<std::string> &Features, 6327 DiagnosticsEngine &Diags) override { 6328 FPU = FPUMode; 6329 CRC = 0; 6330 Crypto = 0; 6331 Unaligned = 1; 6332 V8_1A = 0; 6333 6334 for (const auto &Feature : Features) { 6335 if (Feature == "+neon") 6336 FPU = NeonMode; 6337 if (Feature == "+crc") 6338 CRC = 1; 6339 if (Feature == "+crypto") 6340 Crypto = 1; 6341 if (Feature == "+strict-align") 6342 Unaligned = 0; 6343 if (Feature == "+v8.1a") 6344 V8_1A = 1; 6345 } 6346 6347 setDataLayout(); 6348 6349 return true; 6350 } 6351 6352 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override { 6353 switch (CC) { 6354 case CC_C: 6355 case CC_Swift: 6356 case CC_PreserveMost: 6357 case CC_PreserveAll: 6358 case CC_OpenCLKernel: 6359 return CCCR_OK; 6360 default: 6361 return CCCR_Warning; 6362 } 6363 } 6364 6365 bool isCLZForZeroUndef() const override { return false; } 6366 6367 BuiltinVaListKind getBuiltinVaListKind() const override { 6368 return TargetInfo::AArch64ABIBuiltinVaList; 6369 } 6370 6371 ArrayRef<const char *> getGCCRegNames() const override; 6372 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override; 6373 6374 bool validateAsmConstraint(const char *&Name, 6375 TargetInfo::ConstraintInfo &Info) const override { 6376 switch (*Name) { 6377 default: 6378 return false; 6379 case 'w': // Floating point and SIMD registers (V0-V31) 6380 Info.setAllowsRegister(); 6381 return true; 6382 case 'I': // Constant that can be used with an ADD instruction 6383 case 'J': // Constant that can be used with a SUB instruction 6384 case 'K': // Constant that can be used with a 32-bit logical instruction 6385 case 'L': // Constant that can be used with a 64-bit logical instruction 6386 case 'M': // Constant that can be used as a 32-bit MOV immediate 6387 case 'N': // Constant that can be used as a 64-bit MOV immediate 6388 case 'Y': // Floating point constant zero 6389 case 'Z': // Integer constant zero 6390 return true; 6391 case 'Q': // A memory reference with base register and no offset 6392 Info.setAllowsMemory(); 6393 return true; 6394 case 'S': // A symbolic address 6395 Info.setAllowsRegister(); 6396 return true; 6397 case 'U': 6398 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes. 6399 // Utf: A memory address suitable for ldp/stp in TF mode. 6400 // Usa: An absolute symbolic address. 6401 // Ush: The high part (bits 32:12) of a pc-relative symbolic address. 6402 llvm_unreachable("FIXME: Unimplemented support for U* constraints."); 6403 case 'z': // Zero register, wzr or xzr 6404 Info.setAllowsRegister(); 6405 return true; 6406 case 'x': // Floating point and SIMD registers (V0-V15) 6407 Info.setAllowsRegister(); 6408 return true; 6409 } 6410 return false; 6411 } 6412 6413 bool 6414 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size, 6415 std::string &SuggestedModifier) const override { 6416 // Strip off constraint modifiers. 6417 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&') 6418 Constraint = Constraint.substr(1); 6419 6420 switch (Constraint[0]) { 6421 default: 6422 return true; 6423 case 'z': 6424 case 'r': { 6425 switch (Modifier) { 6426 case 'x': 6427 case 'w': 6428 // For now assume that the person knows what they're 6429 // doing with the modifier. 6430 return true; 6431 default: 6432 // By default an 'r' constraint will be in the 'x' 6433 // registers. 6434 if (Size == 64) 6435 return true; 6436 6437 SuggestedModifier = "w"; 6438 return false; 6439 } 6440 } 6441 } 6442 } 6443 6444 const char *getClobbers() const override { return ""; } 6445 6446 int getEHDataRegisterNumber(unsigned RegNo) const override { 6447 if (RegNo == 0) 6448 return 0; 6449 if (RegNo == 1) 6450 return 1; 6451 return -1; 6452 } 6453 }; 6454 6455 const char *const AArch64TargetInfo::GCCRegNames[] = { 6456 // 32-bit Integer registers 6457 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10", 6458 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21", 6459 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp", 6460 6461 // 64-bit Integer registers 6462 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", 6463 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21", 6464 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp", 6465 6466 // 32-bit floating point regsisters 6467 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", 6468 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21", 6469 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31", 6470 6471 // 64-bit floating point regsisters 6472 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10", 6473 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21", 6474 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31", 6475 6476 // Vector registers 6477 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", 6478 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21", 6479 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31" 6480 }; 6481 6482 ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const { 6483 return llvm::makeArrayRef(GCCRegNames); 6484 } 6485 6486 const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = { 6487 { { "w31" }, "wsp" }, 6488 { { "x29" }, "fp" }, 6489 { { "x30" }, "lr" }, 6490 { { "x31" }, "sp" }, 6491 // The S/D/Q and W/X registers overlap, but aren't really aliases; we 6492 // don't want to substitute one of these for a different-sized one. 6493 }; 6494 6495 ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const { 6496 return llvm::makeArrayRef(GCCRegAliases); 6497 } 6498 6499 const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = { 6500 #define BUILTIN(ID, TYPE, ATTRS) \ 6501 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr }, 6502 #include "clang/Basic/BuiltinsNEON.def" 6503 6504 #define BUILTIN(ID, TYPE, ATTRS) \ 6505 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr }, 6506 #include "clang/Basic/BuiltinsAArch64.def" 6507 }; 6508 6509 class AArch64leTargetInfo : public AArch64TargetInfo { 6510 void setDataLayout() override { 6511 if (getTriple().isOSBinFormatMachO()) 6512 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128"); 6513 else 6514 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"); 6515 } 6516 6517 public: 6518 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 6519 : AArch64TargetInfo(Triple, Opts) { 6520 } 6521 void getTargetDefines(const LangOptions &Opts, 6522 MacroBuilder &Builder) const override { 6523 Builder.defineMacro("__AARCH64EL__"); 6524 AArch64TargetInfo::getTargetDefines(Opts, Builder); 6525 } 6526 }; 6527 6528 class AArch64beTargetInfo : public AArch64TargetInfo { 6529 void setDataLayout() override { 6530 assert(!getTriple().isOSBinFormatMachO()); 6531 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"); 6532 } 6533 6534 public: 6535 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 6536 : AArch64TargetInfo(Triple, Opts) {} 6537 void getTargetDefines(const LangOptions &Opts, 6538 MacroBuilder &Builder) const override { 6539 Builder.defineMacro("__AARCH64EB__"); 6540 Builder.defineMacro("__AARCH_BIG_ENDIAN"); 6541 Builder.defineMacro("__ARM_BIG_ENDIAN"); 6542 AArch64TargetInfo::getTargetDefines(Opts, Builder); 6543 } 6544 }; 6545 6546 class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> { 6547 protected: 6548 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 6549 MacroBuilder &Builder) const override { 6550 Builder.defineMacro("__AARCH64_SIMD__"); 6551 Builder.defineMacro("__ARM64_ARCH_8__"); 6552 Builder.defineMacro("__ARM_NEON__"); 6553 Builder.defineMacro("__LITTLE_ENDIAN__"); 6554 Builder.defineMacro("__REGISTER_PREFIX__", ""); 6555 Builder.defineMacro("__arm64", "1"); 6556 Builder.defineMacro("__arm64__", "1"); 6557 6558 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion); 6559 } 6560 6561 public: 6562 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 6563 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) { 6564 Int64Type = SignedLongLong; 6565 WCharType = SignedInt; 6566 UseSignedCharForObjCBool = false; 6567 6568 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64; 6569 LongDoubleFormat = &llvm::APFloat::IEEEdouble(); 6570 6571 TheCXXABI.set(TargetCXXABI::iOS64); 6572 } 6573 6574 BuiltinVaListKind getBuiltinVaListKind() const override { 6575 return TargetInfo::CharPtrBuiltinVaList; 6576 } 6577 }; 6578 6579 // Hexagon abstract base class 6580 class HexagonTargetInfo : public TargetInfo { 6581 static const Builtin::Info BuiltinInfo[]; 6582 static const char * const GCCRegNames[]; 6583 static const TargetInfo::GCCRegAlias GCCRegAliases[]; 6584 std::string CPU; 6585 bool HasHVX, HasHVXDouble; 6586 bool UseLongCalls; 6587 6588 public: 6589 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &) 6590 : TargetInfo(Triple) { 6591 // Specify the vector alignment explicitly. For v512x1, the calculated 6592 // alignment would be 512*alignment(i1), which is 512 bytes, instead of 6593 // the required minimum of 64 bytes. 6594 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-" 6595 "i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-" 6596 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048"); 6597 SizeType = UnsignedInt; 6598 PtrDiffType = SignedInt; 6599 IntPtrType = SignedInt; 6600 6601 // {} in inline assembly are packet specifiers, not assembly variant 6602 // specifiers. 6603 NoAsmVariants = true; 6604 6605 LargeArrayMinWidth = 64; 6606 LargeArrayAlign = 64; 6607 UseBitFieldTypeAlignment = true; 6608 ZeroLengthBitfieldBoundary = 32; 6609 HasHVX = HasHVXDouble = false; 6610 UseLongCalls = false; 6611 } 6612 6613 ArrayRef<Builtin::Info> getTargetBuiltins() const override { 6614 return llvm::makeArrayRef(BuiltinInfo, 6615 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin); 6616 } 6617 6618 bool validateAsmConstraint(const char *&Name, 6619 TargetInfo::ConstraintInfo &Info) const override { 6620 switch (*Name) { 6621 case 'v': 6622 case 'q': 6623 if (HasHVX) { 6624 Info.setAllowsRegister(); 6625 return true; 6626 } 6627 break; 6628 case 's': 6629 // Relocatable constant. 6630 return true; 6631 } 6632 return false; 6633 } 6634 6635 void getTargetDefines(const LangOptions &Opts, 6636 MacroBuilder &Builder) const override; 6637 6638 bool isCLZForZeroUndef() const override { return false; } 6639 6640 bool hasFeature(StringRef Feature) const override { 6641 return llvm::StringSwitch<bool>(Feature) 6642 .Case("hexagon", true) 6643 .Case("hvx", HasHVX) 6644 .Case("hvx-double", HasHVXDouble) 6645 .Case("long-calls", UseLongCalls) 6646 .Default(false); 6647 } 6648 6649 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, 6650 StringRef CPU, const std::vector<std::string> &FeaturesVec) 6651 const override; 6652 6653 bool handleTargetFeatures(std::vector<std::string> &Features, 6654 DiagnosticsEngine &Diags) override; 6655 6656 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name, 6657 bool Enabled) const override; 6658 6659 BuiltinVaListKind getBuiltinVaListKind() const override { 6660 return TargetInfo::CharPtrBuiltinVaList; 6661 } 6662 ArrayRef<const char *> getGCCRegNames() const override; 6663 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override; 6664 const char *getClobbers() const override { 6665 return ""; 6666 } 6667 6668 static const char *getHexagonCPUSuffix(StringRef Name) { 6669 return llvm::StringSwitch<const char*>(Name) 6670 .Case("hexagonv4", "4") 6671 .Case("hexagonv5", "5") 6672 .Case("hexagonv55", "55") 6673 .Case("hexagonv60", "60") 6674 .Case("hexagonv62", "62") 6675 .Default(nullptr); 6676 } 6677 6678 bool setCPU(const std::string &Name) override { 6679 if (!getHexagonCPUSuffix(Name)) 6680 return false; 6681 CPU = Name; 6682 return true; 6683 } 6684 6685 int getEHDataRegisterNumber(unsigned RegNo) const override { 6686 return RegNo < 2 ? RegNo : -1; 6687 } 6688 }; 6689 6690 void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts, 6691 MacroBuilder &Builder) const { 6692 Builder.defineMacro("__qdsp6__", "1"); 6693 Builder.defineMacro("__hexagon__", "1"); 6694 6695 if (CPU == "hexagonv4") { 6696 Builder.defineMacro("__HEXAGON_V4__"); 6697 Builder.defineMacro("__HEXAGON_ARCH__", "4"); 6698 if (Opts.HexagonQdsp6Compat) { 6699 Builder.defineMacro("__QDSP6_V4__"); 6700 Builder.defineMacro("__QDSP6_ARCH__", "4"); 6701 } 6702 } else if (CPU == "hexagonv5") { 6703 Builder.defineMacro("__HEXAGON_V5__"); 6704 Builder.defineMacro("__HEXAGON_ARCH__", "5"); 6705 if(Opts.HexagonQdsp6Compat) { 6706 Builder.defineMacro("__QDSP6_V5__"); 6707 Builder.defineMacro("__QDSP6_ARCH__", "5"); 6708 } 6709 } else if (CPU == "hexagonv55") { 6710 Builder.defineMacro("__HEXAGON_V55__"); 6711 Builder.defineMacro("__HEXAGON_ARCH__", "55"); 6712 Builder.defineMacro("__QDSP6_V55__"); 6713 Builder.defineMacro("__QDSP6_ARCH__", "55"); 6714 } else if (CPU == "hexagonv60") { 6715 Builder.defineMacro("__HEXAGON_V60__"); 6716 Builder.defineMacro("__HEXAGON_ARCH__", "60"); 6717 Builder.defineMacro("__QDSP6_V60__"); 6718 Builder.defineMacro("__QDSP6_ARCH__", "60"); 6719 } else if (CPU == "hexagonv62") { 6720 Builder.defineMacro("__HEXAGON_V62__"); 6721 Builder.defineMacro("__HEXAGON_ARCH__", "62"); 6722 } 6723 6724 if (hasFeature("hvx")) { 6725 Builder.defineMacro("__HVX__"); 6726 if (hasFeature("hvx-double")) 6727 Builder.defineMacro("__HVXDBL__"); 6728 } 6729 } 6730 6731 bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features, 6732 DiagnosticsEngine &Diags, StringRef CPU, 6733 const std::vector<std::string> &FeaturesVec) const { 6734 // Default for v60: -hvx, -hvx-double. 6735 Features["hvx"] = false; 6736 Features["hvx-double"] = false; 6737 Features["long-calls"] = false; 6738 6739 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec); 6740 } 6741 6742 bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features, 6743 DiagnosticsEngine &Diags) { 6744 for (auto &F : Features) { 6745 if (F == "+hvx") 6746 HasHVX = true; 6747 else if (F == "-hvx") 6748 HasHVX = HasHVXDouble = false; 6749 else if (F == "+hvx-double") 6750 HasHVX = HasHVXDouble = true; 6751 else if (F == "-hvx-double") 6752 HasHVXDouble = false; 6753 6754 if (F == "+long-calls") 6755 UseLongCalls = true; 6756 else if (F == "-long-calls") 6757 UseLongCalls = false; 6758 } 6759 return true; 6760 } 6761 6762 void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features, 6763 StringRef Name, bool Enabled) const { 6764 if (Enabled) { 6765 if (Name == "hvx-double") 6766 Features["hvx"] = true; 6767 } else { 6768 if (Name == "hvx") 6769 Features["hvx-double"] = false; 6770 } 6771 Features[Name] = Enabled; 6772 } 6773 6774 const char *const HexagonTargetInfo::GCCRegNames[] = { 6775 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", 6776 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", 6777 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", 6778 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31", 6779 "p0", "p1", "p2", "p3", 6780 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp" 6781 }; 6782 6783 ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const { 6784 return llvm::makeArrayRef(GCCRegNames); 6785 } 6786 6787 const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = { 6788 { { "sp" }, "r29" }, 6789 { { "fp" }, "r30" }, 6790 { { "lr" }, "r31" }, 6791 }; 6792 6793 ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const { 6794 return llvm::makeArrayRef(GCCRegAliases); 6795 } 6796 6797 6798 const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = { 6799 #define BUILTIN(ID, TYPE, ATTRS) \ 6800 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr }, 6801 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \ 6802 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr }, 6803 #include "clang/Basic/BuiltinsHexagon.def" 6804 }; 6805 6806 class LanaiTargetInfo : public TargetInfo { 6807 // Class for Lanai (32-bit). 6808 // The CPU profiles supported by the Lanai backend 6809 enum CPUKind { 6810 CK_NONE, 6811 CK_V11, 6812 } CPU; 6813 6814 static const TargetInfo::GCCRegAlias GCCRegAliases[]; 6815 static const char *const GCCRegNames[]; 6816 6817 public: 6818 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &) 6819 : TargetInfo(Triple) { 6820 // Description string has to be kept in sync with backend. 6821 resetDataLayout("E" // Big endian 6822 "-m:e" // ELF name manging 6823 "-p:32:32" // 32 bit pointers, 32 bit aligned 6824 "-i64:64" // 64 bit integers, 64 bit aligned 6825 "-a:0:32" // 32 bit alignment of objects of aggregate type 6826 "-n32" // 32 bit native integer width 6827 "-S64" // 64 bit natural stack alignment 6828 ); 6829 6830 // Setting RegParmMax equal to what mregparm was set to in the old 6831 // toolchain 6832 RegParmMax = 4; 6833 6834 // Set the default CPU to V11 6835 CPU = CK_V11; 6836 6837 // Temporary approach to make everything at least word-aligned and allow for 6838 // safely casting between pointers with different alignment requirements. 6839 // TODO: Remove this when there are no more cast align warnings on the 6840 // firmware. 6841 MinGlobalAlign = 32; 6842 } 6843 6844 void getTargetDefines(const LangOptions &Opts, 6845 MacroBuilder &Builder) const override { 6846 // Define __lanai__ when building for target lanai. 6847 Builder.defineMacro("__lanai__"); 6848 6849 // Set define for the CPU specified. 6850 switch (CPU) { 6851 case CK_V11: 6852 Builder.defineMacro("__LANAI_V11__"); 6853 break; 6854 case CK_NONE: 6855 llvm_unreachable("Unhandled target CPU"); 6856 } 6857 } 6858 6859 bool setCPU(const std::string &Name) override { 6860 CPU = llvm::StringSwitch<CPUKind>(Name) 6861 .Case("v11", CK_V11) 6862 .Default(CK_NONE); 6863 6864 return CPU != CK_NONE; 6865 } 6866 6867 bool hasFeature(StringRef Feature) const override { 6868 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false); 6869 } 6870 6871 ArrayRef<const char *> getGCCRegNames() const override; 6872 6873 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override; 6874 6875 BuiltinVaListKind getBuiltinVaListKind() const override { 6876 return TargetInfo::VoidPtrBuiltinVaList; 6877 } 6878 6879 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; } 6880 6881 bool validateAsmConstraint(const char *&Name, 6882 TargetInfo::ConstraintInfo &info) const override { 6883 return false; 6884 } 6885 6886 const char *getClobbers() const override { return ""; } 6887 }; 6888 6889 const char *const LanaiTargetInfo::GCCRegNames[] = { 6890 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", 6891 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21", 6892 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"}; 6893 6894 ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const { 6895 return llvm::makeArrayRef(GCCRegNames); 6896 } 6897 6898 const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = { 6899 {{"pc"}, "r2"}, 6900 {{"sp"}, "r4"}, 6901 {{"fp"}, "r5"}, 6902 {{"rv"}, "r8"}, 6903 {{"rr1"}, "r10"}, 6904 {{"rr2"}, "r11"}, 6905 {{"rca"}, "r15"}, 6906 }; 6907 6908 ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const { 6909 return llvm::makeArrayRef(GCCRegAliases); 6910 } 6911 6912 // Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit). 6913 class SparcTargetInfo : public TargetInfo { 6914 static const TargetInfo::GCCRegAlias GCCRegAliases[]; 6915 static const char * const GCCRegNames[]; 6916 bool SoftFloat; 6917 public: 6918 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &) 6919 : TargetInfo(Triple), SoftFloat(false) {} 6920 6921 int getEHDataRegisterNumber(unsigned RegNo) const override { 6922 if (RegNo == 0) return 24; 6923 if (RegNo == 1) return 25; 6924 return -1; 6925 } 6926 6927 bool handleTargetFeatures(std::vector<std::string> &Features, 6928 DiagnosticsEngine &Diags) override { 6929 // Check if software floating point is enabled 6930 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float"); 6931 if (Feature != Features.end()) { 6932 SoftFloat = true; 6933 } 6934 return true; 6935 } 6936 void getTargetDefines(const LangOptions &Opts, 6937 MacroBuilder &Builder) const override { 6938 DefineStd(Builder, "sparc", Opts); 6939 Builder.defineMacro("__REGISTER_PREFIX__", ""); 6940 6941 if (SoftFloat) 6942 Builder.defineMacro("SOFT_FLOAT", "1"); 6943 } 6944 6945 bool hasFeature(StringRef Feature) const override { 6946 return llvm::StringSwitch<bool>(Feature) 6947 .Case("softfloat", SoftFloat) 6948 .Case("sparc", true) 6949 .Default(false); 6950 } 6951 6952 bool hasSjLjLowering() const override { 6953 return true; 6954 } 6955 6956 ArrayRef<Builtin::Info> getTargetBuiltins() const override { 6957 // FIXME: Implement! 6958 return None; 6959 } 6960 BuiltinVaListKind getBuiltinVaListKind() const override { 6961 return TargetInfo::VoidPtrBuiltinVaList; 6962 } 6963 ArrayRef<const char *> getGCCRegNames() const override; 6964 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override; 6965 bool validateAsmConstraint(const char *&Name, 6966 TargetInfo::ConstraintInfo &info) const override { 6967 // FIXME: Implement! 6968 switch (*Name) { 6969 case 'I': // Signed 13-bit constant 6970 case 'J': // Zero 6971 case 'K': // 32-bit constant with the low 12 bits clear 6972 case 'L': // A constant in the range supported by movcc (11-bit signed imm) 6973 case 'M': // A constant in the range supported by movrcc (19-bit signed imm) 6974 case 'N': // Same as 'K' but zext (required for SIMode) 6975 case 'O': // The constant 4096 6976 return true; 6977 6978 case 'f': 6979 case 'e': 6980 info.setAllowsRegister(); 6981 return true; 6982 } 6983 return false; 6984 } 6985 const char *getClobbers() const override { 6986 // FIXME: Implement! 6987 return ""; 6988 } 6989 6990 // No Sparc V7 for now, the backend doesn't support it anyway. 6991 enum CPUKind { 6992 CK_GENERIC, 6993 CK_V8, 6994 CK_SUPERSPARC, 6995 CK_SPARCLITE, 6996 CK_F934, 6997 CK_HYPERSPARC, 6998 CK_SPARCLITE86X, 6999 CK_SPARCLET, 7000 CK_TSC701, 7001 CK_V9, 7002 CK_ULTRASPARC, 7003 CK_ULTRASPARC3, 7004 CK_NIAGARA, 7005 CK_NIAGARA2, 7006 CK_NIAGARA3, 7007 CK_NIAGARA4, 7008 CK_MYRIAD2100, 7009 CK_MYRIAD2150, 7010 CK_MYRIAD2450, 7011 CK_LEON2, 7012 CK_LEON2_AT697E, 7013 CK_LEON2_AT697F, 7014 CK_LEON3, 7015 CK_LEON3_UT699, 7016 CK_LEON3_GR712RC, 7017 CK_LEON4, 7018 CK_LEON4_GR740 7019 } CPU = CK_GENERIC; 7020 7021 enum CPUGeneration { 7022 CG_V8, 7023 CG_V9, 7024 }; 7025 7026 CPUGeneration getCPUGeneration(CPUKind Kind) const { 7027 switch (Kind) { 7028 case CK_GENERIC: 7029 case CK_V8: 7030 case CK_SUPERSPARC: 7031 case CK_SPARCLITE: 7032 case CK_F934: 7033 case CK_HYPERSPARC: 7034 case CK_SPARCLITE86X: 7035 case CK_SPARCLET: 7036 case CK_TSC701: 7037 case CK_MYRIAD2100: 7038 case CK_MYRIAD2150: 7039 case CK_MYRIAD2450: 7040 case CK_LEON2: 7041 case CK_LEON2_AT697E: 7042 case CK_LEON2_AT697F: 7043 case CK_LEON3: 7044 case CK_LEON3_UT699: 7045 case CK_LEON3_GR712RC: 7046 case CK_LEON4: 7047 case CK_LEON4_GR740: 7048 return CG_V8; 7049 case CK_V9: 7050 case CK_ULTRASPARC: 7051 case CK_ULTRASPARC3: 7052 case CK_NIAGARA: 7053 case CK_NIAGARA2: 7054 case CK_NIAGARA3: 7055 case CK_NIAGARA4: 7056 return CG_V9; 7057 } 7058 llvm_unreachable("Unexpected CPU kind"); 7059 } 7060 7061 CPUKind getCPUKind(StringRef Name) const { 7062 return llvm::StringSwitch<CPUKind>(Name) 7063 .Case("v8", CK_V8) 7064 .Case("supersparc", CK_SUPERSPARC) 7065 .Case("sparclite", CK_SPARCLITE) 7066 .Case("f934", CK_F934) 7067 .Case("hypersparc", CK_HYPERSPARC) 7068 .Case("sparclite86x", CK_SPARCLITE86X) 7069 .Case("sparclet", CK_SPARCLET) 7070 .Case("tsc701", CK_TSC701) 7071 .Case("v9", CK_V9) 7072 .Case("ultrasparc", CK_ULTRASPARC) 7073 .Case("ultrasparc3", CK_ULTRASPARC3) 7074 .Case("niagara", CK_NIAGARA) 7075 .Case("niagara2", CK_NIAGARA2) 7076 .Case("niagara3", CK_NIAGARA3) 7077 .Case("niagara4", CK_NIAGARA4) 7078 .Case("ma2100", CK_MYRIAD2100) 7079 .Case("ma2150", CK_MYRIAD2150) 7080 .Case("ma2450", CK_MYRIAD2450) 7081 // FIXME: the myriad2[.n] spellings are obsolete, 7082 // but a grace period is needed to allow updating dependent builds. 7083 .Case("myriad2", CK_MYRIAD2100) 7084 .Case("myriad2.1", CK_MYRIAD2100) 7085 .Case("myriad2.2", CK_MYRIAD2150) 7086 .Case("leon2", CK_LEON2) 7087 .Case("at697e", CK_LEON2_AT697E) 7088 .Case("at697f", CK_LEON2_AT697F) 7089 .Case("leon3", CK_LEON3) 7090 .Case("ut699", CK_LEON3_UT699) 7091 .Case("gr712rc", CK_LEON3_GR712RC) 7092 .Case("leon4", CK_LEON4) 7093 .Case("gr740", CK_LEON4_GR740) 7094 .Default(CK_GENERIC); 7095 } 7096 7097 bool setCPU(const std::string &Name) override { 7098 CPU = getCPUKind(Name); 7099 return CPU != CK_GENERIC; 7100 } 7101 }; 7102 7103 const char * const SparcTargetInfo::GCCRegNames[] = { 7104 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", 7105 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", 7106 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", 7107 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31" 7108 }; 7109 7110 ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const { 7111 return llvm::makeArrayRef(GCCRegNames); 7112 } 7113 7114 const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = { 7115 { { "g0" }, "r0" }, 7116 { { "g1" }, "r1" }, 7117 { { "g2" }, "r2" }, 7118 { { "g3" }, "r3" }, 7119 { { "g4" }, "r4" }, 7120 { { "g5" }, "r5" }, 7121 { { "g6" }, "r6" }, 7122 { { "g7" }, "r7" }, 7123 { { "o0" }, "r8" }, 7124 { { "o1" }, "r9" }, 7125 { { "o2" }, "r10" }, 7126 { { "o3" }, "r11" }, 7127 { { "o4" }, "r12" }, 7128 { { "o5" }, "r13" }, 7129 { { "o6", "sp" }, "r14" }, 7130 { { "o7" }, "r15" }, 7131 { { "l0" }, "r16" }, 7132 { { "l1" }, "r17" }, 7133 { { "l2" }, "r18" }, 7134 { { "l3" }, "r19" }, 7135 { { "l4" }, "r20" }, 7136 { { "l5" }, "r21" }, 7137 { { "l6" }, "r22" }, 7138 { { "l7" }, "r23" }, 7139 { { "i0" }, "r24" }, 7140 { { "i1" }, "r25" }, 7141 { { "i2" }, "r26" }, 7142 { { "i3" }, "r27" }, 7143 { { "i4" }, "r28" }, 7144 { { "i5" }, "r29" }, 7145 { { "i6", "fp" }, "r30" }, 7146 { { "i7" }, "r31" }, 7147 }; 7148 7149 ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const { 7150 return llvm::makeArrayRef(GCCRegAliases); 7151 } 7152 7153 // SPARC v8 is the 32-bit mode selected by Triple::sparc. 7154 class SparcV8TargetInfo : public SparcTargetInfo { 7155 public: 7156 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 7157 : SparcTargetInfo(Triple, Opts) { 7158 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64"); 7159 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int. 7160 switch (getTriple().getOS()) { 7161 default: 7162 SizeType = UnsignedInt; 7163 IntPtrType = SignedInt; 7164 PtrDiffType = SignedInt; 7165 break; 7166 case llvm::Triple::NetBSD: 7167 case llvm::Triple::OpenBSD: 7168 SizeType = UnsignedLong; 7169 IntPtrType = SignedLong; 7170 PtrDiffType = SignedLong; 7171 break; 7172 } 7173 // Up to 32 bits are lock-free atomic, but we're willing to do atomic ops 7174 // on up to 64 bits. 7175 MaxAtomicPromoteWidth = 64; 7176 MaxAtomicInlineWidth = 32; 7177 } 7178 7179 void getTargetDefines(const LangOptions &Opts, 7180 MacroBuilder &Builder) const override { 7181 SparcTargetInfo::getTargetDefines(Opts, Builder); 7182 switch (getCPUGeneration(CPU)) { 7183 case CG_V8: 7184 Builder.defineMacro("__sparcv8"); 7185 if (getTriple().getOS() != llvm::Triple::Solaris) 7186 Builder.defineMacro("__sparcv8__"); 7187 break; 7188 case CG_V9: 7189 Builder.defineMacro("__sparcv9"); 7190 if (getTriple().getOS() != llvm::Triple::Solaris) { 7191 Builder.defineMacro("__sparcv9__"); 7192 Builder.defineMacro("__sparc_v9__"); 7193 } 7194 break; 7195 } 7196 if (getTriple().getVendor() == llvm::Triple::Myriad) { 7197 std::string MyriadArchValue, Myriad2Value; 7198 Builder.defineMacro("__sparc_v8__"); 7199 Builder.defineMacro("__leon__"); 7200 switch (CPU) { 7201 case CK_MYRIAD2150: 7202 MyriadArchValue = "__ma2150"; 7203 Myriad2Value = "2"; 7204 break; 7205 case CK_MYRIAD2450: 7206 MyriadArchValue = "__ma2450"; 7207 Myriad2Value = "2"; 7208 break; 7209 default: 7210 MyriadArchValue = "__ma2100"; 7211 Myriad2Value = "1"; 7212 break; 7213 } 7214 Builder.defineMacro(MyriadArchValue, "1"); 7215 Builder.defineMacro(MyriadArchValue+"__", "1"); 7216 Builder.defineMacro("__myriad2__", Myriad2Value); 7217 Builder.defineMacro("__myriad2", Myriad2Value); 7218 } 7219 } 7220 7221 bool hasSjLjLowering() const override { 7222 return true; 7223 } 7224 }; 7225 7226 // SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel. 7227 class SparcV8elTargetInfo : public SparcV8TargetInfo { 7228 public: 7229 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 7230 : SparcV8TargetInfo(Triple, Opts) { 7231 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64"); 7232 } 7233 }; 7234 7235 // SPARC v9 is the 64-bit mode selected by Triple::sparcv9. 7236 class SparcV9TargetInfo : public SparcTargetInfo { 7237 public: 7238 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 7239 : SparcTargetInfo(Triple, Opts) { 7240 // FIXME: Support Sparc quad-precision long double? 7241 resetDataLayout("E-m:e-i64:64-n32:64-S128"); 7242 // This is an LP64 platform. 7243 LongWidth = LongAlign = PointerWidth = PointerAlign = 64; 7244 7245 // OpenBSD uses long long for int64_t and intmax_t. 7246 if (getTriple().getOS() == llvm::Triple::OpenBSD) 7247 IntMaxType = SignedLongLong; 7248 else 7249 IntMaxType = SignedLong; 7250 Int64Type = IntMaxType; 7251 7252 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit 7253 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned. 7254 LongDoubleWidth = 128; 7255 LongDoubleAlign = 128; 7256 LongDoubleFormat = &llvm::APFloat::IEEEquad(); 7257 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64; 7258 } 7259 7260 void getTargetDefines(const LangOptions &Opts, 7261 MacroBuilder &Builder) const override { 7262 SparcTargetInfo::getTargetDefines(Opts, Builder); 7263 Builder.defineMacro("__sparcv9"); 7264 Builder.defineMacro("__arch64__"); 7265 // Solaris doesn't need these variants, but the BSDs do. 7266 if (getTriple().getOS() != llvm::Triple::Solaris) { 7267 Builder.defineMacro("__sparc64__"); 7268 Builder.defineMacro("__sparc_v9__"); 7269 Builder.defineMacro("__sparcv9__"); 7270 } 7271 } 7272 7273 bool setCPU(const std::string &Name) override { 7274 if (!SparcTargetInfo::setCPU(Name)) 7275 return false; 7276 return getCPUGeneration(CPU) == CG_V9; 7277 } 7278 }; 7279 7280 class SystemZTargetInfo : public TargetInfo { 7281 static const Builtin::Info BuiltinInfo[]; 7282 static const char *const GCCRegNames[]; 7283 std::string CPU; 7284 bool HasTransactionalExecution; 7285 bool HasVector; 7286 7287 public: 7288 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &) 7289 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false), 7290 HasVector(false) { 7291 IntMaxType = SignedLong; 7292 Int64Type = SignedLong; 7293 TLSSupported = true; 7294 IntWidth = IntAlign = 32; 7295 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64; 7296 PointerWidth = PointerAlign = 64; 7297 LongDoubleWidth = 128; 7298 LongDoubleAlign = 64; 7299 LongDoubleFormat = &llvm::APFloat::IEEEquad(); 7300 DefaultAlignForAttributeAligned = 64; 7301 MinGlobalAlign = 16; 7302 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64"); 7303 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64; 7304 } 7305 void getTargetDefines(const LangOptions &Opts, 7306 MacroBuilder &Builder) const override { 7307 Builder.defineMacro("__s390__"); 7308 Builder.defineMacro("__s390x__"); 7309 Builder.defineMacro("__zarch__"); 7310 Builder.defineMacro("__LONG_DOUBLE_128__"); 7311 7312 const std::string ISARev = llvm::StringSwitch<std::string>(CPU) 7313 .Cases("arch8", "z10", "8") 7314 .Cases("arch9", "z196", "9") 7315 .Cases("arch10", "zEC12", "10") 7316 .Cases("arch11", "z13", "11") 7317 .Default(""); 7318 if (!ISARev.empty()) 7319 Builder.defineMacro("__ARCH__", ISARev); 7320 7321 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1"); 7322 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2"); 7323 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4"); 7324 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8"); 7325 7326 if (HasTransactionalExecution) 7327 Builder.defineMacro("__HTM__"); 7328 if (HasVector) 7329 Builder.defineMacro("__VX__"); 7330 if (Opts.ZVector) 7331 Builder.defineMacro("__VEC__", "10301"); 7332 } 7333 ArrayRef<Builtin::Info> getTargetBuiltins() const override { 7334 return llvm::makeArrayRef(BuiltinInfo, 7335 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin); 7336 } 7337 7338 ArrayRef<const char *> getGCCRegNames() const override; 7339 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override { 7340 // No aliases. 7341 return None; 7342 } 7343 bool validateAsmConstraint(const char *&Name, 7344 TargetInfo::ConstraintInfo &info) const override; 7345 const char *getClobbers() const override { 7346 // FIXME: Is this really right? 7347 return ""; 7348 } 7349 BuiltinVaListKind getBuiltinVaListKind() const override { 7350 return TargetInfo::SystemZBuiltinVaList; 7351 } 7352 bool setCPU(const std::string &Name) override { 7353 CPU = Name; 7354 bool CPUKnown = llvm::StringSwitch<bool>(Name) 7355 .Case("z10", true) 7356 .Case("arch8", true) 7357 .Case("z196", true) 7358 .Case("arch9", true) 7359 .Case("zEC12", true) 7360 .Case("arch10", true) 7361 .Case("z13", true) 7362 .Case("arch11", true) 7363 .Default(false); 7364 7365 return CPUKnown; 7366 } 7367 bool 7368 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, 7369 StringRef CPU, 7370 const std::vector<std::string> &FeaturesVec) const override { 7371 if (CPU == "zEC12" || CPU == "arch10") 7372 Features["transactional-execution"] = true; 7373 if (CPU == "z13" || CPU == "arch11") { 7374 Features["transactional-execution"] = true; 7375 Features["vector"] = true; 7376 } 7377 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec); 7378 } 7379 7380 bool handleTargetFeatures(std::vector<std::string> &Features, 7381 DiagnosticsEngine &Diags) override { 7382 HasTransactionalExecution = false; 7383 for (const auto &Feature : Features) { 7384 if (Feature == "+transactional-execution") 7385 HasTransactionalExecution = true; 7386 else if (Feature == "+vector") 7387 HasVector = true; 7388 } 7389 // If we use the vector ABI, vector types are 64-bit aligned. 7390 if (HasVector) { 7391 MaxVectorAlign = 64; 7392 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64" 7393 "-v128:64-a:8:16-n32:64"); 7394 } 7395 return true; 7396 } 7397 7398 bool hasFeature(StringRef Feature) const override { 7399 return llvm::StringSwitch<bool>(Feature) 7400 .Case("systemz", true) 7401 .Case("htm", HasTransactionalExecution) 7402 .Case("vx", HasVector) 7403 .Default(false); 7404 } 7405 7406 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override { 7407 switch (CC) { 7408 case CC_C: 7409 case CC_Swift: 7410 case CC_OpenCLKernel: 7411 return CCCR_OK; 7412 default: 7413 return CCCR_Warning; 7414 } 7415 } 7416 7417 StringRef getABI() const override { 7418 if (HasVector) 7419 return "vector"; 7420 return ""; 7421 } 7422 7423 bool useFloat128ManglingForLongDouble() const override { 7424 return true; 7425 } 7426 }; 7427 7428 const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = { 7429 #define BUILTIN(ID, TYPE, ATTRS) \ 7430 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr }, 7431 #define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \ 7432 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE }, 7433 #include "clang/Basic/BuiltinsSystemZ.def" 7434 }; 7435 7436 const char *const SystemZTargetInfo::GCCRegNames[] = { 7437 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", 7438 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", 7439 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7", 7440 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15" 7441 }; 7442 7443 ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const { 7444 return llvm::makeArrayRef(GCCRegNames); 7445 } 7446 7447 bool SystemZTargetInfo:: 7448 validateAsmConstraint(const char *&Name, 7449 TargetInfo::ConstraintInfo &Info) const { 7450 switch (*Name) { 7451 default: 7452 return false; 7453 7454 case 'a': // Address register 7455 case 'd': // Data register (equivalent to 'r') 7456 case 'f': // Floating-point register 7457 Info.setAllowsRegister(); 7458 return true; 7459 7460 case 'I': // Unsigned 8-bit constant 7461 case 'J': // Unsigned 12-bit constant 7462 case 'K': // Signed 16-bit constant 7463 case 'L': // Signed 20-bit displacement (on all targets we support) 7464 case 'M': // 0x7fffffff 7465 return true; 7466 7467 case 'Q': // Memory with base and unsigned 12-bit displacement 7468 case 'R': // Likewise, plus an index 7469 case 'S': // Memory with base and signed 20-bit displacement 7470 case 'T': // Likewise, plus an index 7471 Info.setAllowsMemory(); 7472 return true; 7473 } 7474 } 7475 7476 class MSP430TargetInfo : public TargetInfo { 7477 static const char *const GCCRegNames[]; 7478 7479 public: 7480 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &) 7481 : TargetInfo(Triple) { 7482 TLSSupported = false; 7483 IntWidth = 16; 7484 IntAlign = 16; 7485 LongWidth = 32; 7486 LongLongWidth = 64; 7487 LongAlign = LongLongAlign = 16; 7488 PointerWidth = 16; 7489 PointerAlign = 16; 7490 SuitableAlign = 16; 7491 SizeType = UnsignedInt; 7492 IntMaxType = SignedLongLong; 7493 IntPtrType = SignedInt; 7494 PtrDiffType = SignedInt; 7495 SigAtomicType = SignedLong; 7496 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16"); 7497 } 7498 void getTargetDefines(const LangOptions &Opts, 7499 MacroBuilder &Builder) const override { 7500 Builder.defineMacro("MSP430"); 7501 Builder.defineMacro("__MSP430__"); 7502 // FIXME: defines for different 'flavours' of MCU 7503 } 7504 ArrayRef<Builtin::Info> getTargetBuiltins() const override { 7505 // FIXME: Implement. 7506 return None; 7507 } 7508 bool hasFeature(StringRef Feature) const override { 7509 return Feature == "msp430"; 7510 } 7511 ArrayRef<const char *> getGCCRegNames() const override; 7512 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override { 7513 // No aliases. 7514 return None; 7515 } 7516 bool validateAsmConstraint(const char *&Name, 7517 TargetInfo::ConstraintInfo &info) const override { 7518 // FIXME: implement 7519 switch (*Name) { 7520 case 'K': // the constant 1 7521 case 'L': // constant -1^20 .. 1^19 7522 case 'M': // constant 1-4: 7523 return true; 7524 } 7525 // No target constraints for now. 7526 return false; 7527 } 7528 const char *getClobbers() const override { 7529 // FIXME: Is this really right? 7530 return ""; 7531 } 7532 BuiltinVaListKind getBuiltinVaListKind() const override { 7533 // FIXME: implement 7534 return TargetInfo::CharPtrBuiltinVaList; 7535 } 7536 }; 7537 7538 const char *const MSP430TargetInfo::GCCRegNames[] = { 7539 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", 7540 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"}; 7541 7542 ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const { 7543 return llvm::makeArrayRef(GCCRegNames); 7544 } 7545 7546 // LLVM and Clang cannot be used directly to output native binaries for 7547 // target, but is used to compile C code to llvm bitcode with correct 7548 // type and alignment information. 7549 // 7550 // TCE uses the llvm bitcode as input and uses it for generating customized 7551 // target processor and program binary. TCE co-design environment is 7552 // publicly available in http://tce.cs.tut.fi 7553 7554 static const unsigned TCEOpenCLAddrSpaceMap[] = { 7555 0, // Default 7556 3, // opencl_global 7557 4, // opencl_local 7558 5, // opencl_constant 7559 // FIXME: generic has to be added to the target 7560 0, // opencl_generic 7561 0, // cuda_device 7562 0, // cuda_constant 7563 0 // cuda_shared 7564 }; 7565 7566 class TCETargetInfo : public TargetInfo { 7567 public: 7568 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &) 7569 : TargetInfo(Triple) { 7570 TLSSupported = false; 7571 IntWidth = 32; 7572 LongWidth = LongLongWidth = 32; 7573 PointerWidth = 32; 7574 IntAlign = 32; 7575 LongAlign = LongLongAlign = 32; 7576 PointerAlign = 32; 7577 SuitableAlign = 32; 7578 SizeType = UnsignedInt; 7579 IntMaxType = SignedLong; 7580 IntPtrType = SignedInt; 7581 PtrDiffType = SignedInt; 7582 FloatWidth = 32; 7583 FloatAlign = 32; 7584 DoubleWidth = 32; 7585 DoubleAlign = 32; 7586 LongDoubleWidth = 32; 7587 LongDoubleAlign = 32; 7588 FloatFormat = &llvm::APFloat::IEEEsingle(); 7589 DoubleFormat = &llvm::APFloat::IEEEsingle(); 7590 LongDoubleFormat = &llvm::APFloat::IEEEsingle(); 7591 resetDataLayout("E-p:32:32:32-i1:8:8-i8:8:32-" 7592 "i16:16:32-i32:32:32-i64:32:32-" 7593 "f32:32:32-f64:32:32-v64:32:32-" 7594 "v128:32:32-v256:32:32-v512:32:32-" 7595 "v1024:32:32-a0:0:32-n32"); 7596 AddrSpaceMap = &TCEOpenCLAddrSpaceMap; 7597 UseAddrSpaceMapMangling = true; 7598 } 7599 7600 void getTargetDefines(const LangOptions &Opts, 7601 MacroBuilder &Builder) const override { 7602 DefineStd(Builder, "tce", Opts); 7603 Builder.defineMacro("__TCE__"); 7604 Builder.defineMacro("__TCE_V1__"); 7605 } 7606 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; } 7607 7608 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; } 7609 const char *getClobbers() const override { return ""; } 7610 BuiltinVaListKind getBuiltinVaListKind() const override { 7611 return TargetInfo::VoidPtrBuiltinVaList; 7612 } 7613 ArrayRef<const char *> getGCCRegNames() const override { return None; } 7614 bool validateAsmConstraint(const char *&Name, 7615 TargetInfo::ConstraintInfo &info) const override { 7616 return true; 7617 } 7618 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override { 7619 return None; 7620 } 7621 }; 7622 7623 class TCELETargetInfo : public TCETargetInfo { 7624 public: 7625 TCELETargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 7626 : TCETargetInfo(Triple, Opts) { 7627 BigEndian = false; 7628 7629 resetDataLayout("e-p:32:32:32-i1:8:8-i8:8:32-" 7630 "i16:16:32-i32:32:32-i64:32:32-" 7631 "f32:32:32-f64:32:32-v64:32:32-" 7632 "v128:32:32-v256:32:32-v512:32:32-" 7633 "v1024:32:32-a0:0:32-n32"); 7634 7635 } 7636 7637 virtual void getTargetDefines(const LangOptions &Opts, 7638 MacroBuilder &Builder) const { 7639 DefineStd(Builder, "tcele", Opts); 7640 Builder.defineMacro("__TCE__"); 7641 Builder.defineMacro("__TCE_V1__"); 7642 Builder.defineMacro("__TCELE__"); 7643 Builder.defineMacro("__TCELE_V1__"); 7644 } 7645 7646 }; 7647 7648 class BPFTargetInfo : public TargetInfo { 7649 public: 7650 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &) 7651 : TargetInfo(Triple) { 7652 LongWidth = LongAlign = PointerWidth = PointerAlign = 64; 7653 SizeType = UnsignedLong; 7654 PtrDiffType = SignedLong; 7655 IntPtrType = SignedLong; 7656 IntMaxType = SignedLong; 7657 Int64Type = SignedLong; 7658 RegParmMax = 5; 7659 if (Triple.getArch() == llvm::Triple::bpfeb) { 7660 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128"); 7661 } else { 7662 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128"); 7663 } 7664 MaxAtomicPromoteWidth = 64; 7665 MaxAtomicInlineWidth = 64; 7666 TLSSupported = false; 7667 } 7668 void getTargetDefines(const LangOptions &Opts, 7669 MacroBuilder &Builder) const override { 7670 DefineStd(Builder, "bpf", Opts); 7671 Builder.defineMacro("__BPF__"); 7672 } 7673 bool hasFeature(StringRef Feature) const override { 7674 return Feature == "bpf"; 7675 } 7676 7677 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; } 7678 const char *getClobbers() const override { 7679 return ""; 7680 } 7681 BuiltinVaListKind getBuiltinVaListKind() const override { 7682 return TargetInfo::VoidPtrBuiltinVaList; 7683 } 7684 ArrayRef<const char *> getGCCRegNames() const override { 7685 return None; 7686 } 7687 bool validateAsmConstraint(const char *&Name, 7688 TargetInfo::ConstraintInfo &info) const override { 7689 return true; 7690 } 7691 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override { 7692 return None; 7693 } 7694 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override { 7695 switch (CC) { 7696 default: 7697 return CCCR_Warning; 7698 case CC_C: 7699 case CC_OpenCLKernel: 7700 return CCCR_OK; 7701 } 7702 } 7703 }; 7704 7705 class MipsTargetInfo : public TargetInfo { 7706 void setDataLayout() { 7707 StringRef Layout; 7708 7709 if (ABI == "o32") 7710 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64"; 7711 else if (ABI == "n32") 7712 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128"; 7713 else if (ABI == "n64") 7714 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128"; 7715 else 7716 llvm_unreachable("Invalid ABI"); 7717 7718 if (BigEndian) 7719 resetDataLayout(("E-" + Layout).str()); 7720 else 7721 resetDataLayout(("e-" + Layout).str()); 7722 } 7723 7724 7725 static const Builtin::Info BuiltinInfo[]; 7726 std::string CPU; 7727 bool IsMips16; 7728 bool IsMicromips; 7729 bool IsNan2008; 7730 bool IsSingleFloat; 7731 bool IsNoABICalls; 7732 bool CanUseBSDABICalls; 7733 enum MipsFloatABI { 7734 HardFloat, SoftFloat 7735 } FloatABI; 7736 enum DspRevEnum { 7737 NoDSP, DSP1, DSP2 7738 } DspRev; 7739 bool HasMSA; 7740 bool DisableMadd4; 7741 7742 protected: 7743 bool HasFP64; 7744 std::string ABI; 7745 7746 public: 7747 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &) 7748 : TargetInfo(Triple), IsMips16(false), IsMicromips(false), 7749 IsNan2008(false), IsSingleFloat(false), IsNoABICalls(false), 7750 CanUseBSDABICalls(false), FloatABI(HardFloat), DspRev(NoDSP), 7751 HasMSA(false), DisableMadd4(false), HasFP64(false) { 7752 TheCXXABI.set(TargetCXXABI::GenericMIPS); 7753 7754 setABI((getTriple().getArch() == llvm::Triple::mips || 7755 getTriple().getArch() == llvm::Triple::mipsel) 7756 ? "o32" 7757 : "n64"); 7758 7759 CPU = ABI == "o32" ? "mips32r2" : "mips64r2"; 7760 7761 CanUseBSDABICalls = Triple.getOS() == llvm::Triple::FreeBSD || 7762 Triple.getOS() == llvm::Triple::OpenBSD; 7763 } 7764 7765 bool isNaN2008Default() const { 7766 return CPU == "mips32r6" || CPU == "mips64r6"; 7767 } 7768 7769 bool isFP64Default() const { 7770 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64"; 7771 } 7772 7773 bool isNan2008() const override { 7774 return IsNan2008; 7775 } 7776 7777 bool processorSupportsGPR64() const { 7778 return llvm::StringSwitch<bool>(CPU) 7779 .Case("mips3", true) 7780 .Case("mips4", true) 7781 .Case("mips5", true) 7782 .Case("mips64", true) 7783 .Case("mips64r2", true) 7784 .Case("mips64r3", true) 7785 .Case("mips64r5", true) 7786 .Case("mips64r6", true) 7787 .Case("octeon", true) 7788 .Default(false); 7789 return false; 7790 } 7791 7792 StringRef getABI() const override { return ABI; } 7793 bool setABI(const std::string &Name) override { 7794 if (Name == "o32") { 7795 setO32ABITypes(); 7796 ABI = Name; 7797 return true; 7798 } 7799 7800 if (Name == "n32") { 7801 setN32ABITypes(); 7802 ABI = Name; 7803 return true; 7804 } 7805 if (Name == "n64") { 7806 setN64ABITypes(); 7807 ABI = Name; 7808 return true; 7809 } 7810 return false; 7811 } 7812 7813 void setO32ABITypes() { 7814 Int64Type = SignedLongLong; 7815 IntMaxType = Int64Type; 7816 LongDoubleFormat = &llvm::APFloat::IEEEdouble(); 7817 LongDoubleWidth = LongDoubleAlign = 64; 7818 LongWidth = LongAlign = 32; 7819 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32; 7820 PointerWidth = PointerAlign = 32; 7821 PtrDiffType = SignedInt; 7822 SizeType = UnsignedInt; 7823 SuitableAlign = 64; 7824 } 7825 7826 void setN32N64ABITypes() { 7827 LongDoubleWidth = LongDoubleAlign = 128; 7828 LongDoubleFormat = &llvm::APFloat::IEEEquad(); 7829 if (getTriple().getOS() == llvm::Triple::FreeBSD) { 7830 LongDoubleWidth = LongDoubleAlign = 64; 7831 LongDoubleFormat = &llvm::APFloat::IEEEdouble(); 7832 } 7833 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64; 7834 SuitableAlign = 128; 7835 } 7836 7837 void setN64ABITypes() { 7838 setN32N64ABITypes(); 7839 if (getTriple().getOS() == llvm::Triple::OpenBSD) { 7840 Int64Type = SignedLongLong; 7841 } else { 7842 Int64Type = SignedLong; 7843 } 7844 IntMaxType = Int64Type; 7845 LongWidth = LongAlign = 64; 7846 PointerWidth = PointerAlign = 64; 7847 PtrDiffType = SignedLong; 7848 SizeType = UnsignedLong; 7849 } 7850 7851 void setN32ABITypes() { 7852 setN32N64ABITypes(); 7853 Int64Type = SignedLongLong; 7854 IntMaxType = Int64Type; 7855 LongWidth = LongAlign = 32; 7856 PointerWidth = PointerAlign = 32; 7857 PtrDiffType = SignedInt; 7858 SizeType = UnsignedInt; 7859 } 7860 7861 bool setCPU(const std::string &Name) override { 7862 CPU = Name; 7863 return llvm::StringSwitch<bool>(Name) 7864 .Case("mips1", true) 7865 .Case("mips2", true) 7866 .Case("mips3", true) 7867 .Case("mips4", true) 7868 .Case("mips5", true) 7869 .Case("mips32", true) 7870 .Case("mips32r2", true) 7871 .Case("mips32r3", true) 7872 .Case("mips32r5", true) 7873 .Case("mips32r6", true) 7874 .Case("mips64", true) 7875 .Case("mips64r2", true) 7876 .Case("mips64r3", true) 7877 .Case("mips64r5", true) 7878 .Case("mips64r6", true) 7879 .Case("octeon", true) 7880 .Case("p5600", true) 7881 .Default(false); 7882 } 7883 const std::string& getCPU() const { return CPU; } 7884 bool 7885 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, 7886 StringRef CPU, 7887 const std::vector<std::string> &FeaturesVec) const override { 7888 if (CPU.empty()) 7889 CPU = getCPU(); 7890 if (CPU == "octeon") 7891 Features["mips64r2"] = Features["cnmips"] = true; 7892 else 7893 Features[CPU] = true; 7894 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec); 7895 } 7896 7897 void getTargetDefines(const LangOptions &Opts, 7898 MacroBuilder &Builder) const override { 7899 if (BigEndian) { 7900 DefineStd(Builder, "MIPSEB", Opts); 7901 Builder.defineMacro("_MIPSEB"); 7902 } else { 7903 DefineStd(Builder, "MIPSEL", Opts); 7904 Builder.defineMacro("_MIPSEL"); 7905 } 7906 7907 Builder.defineMacro("__mips__"); 7908 Builder.defineMacro("_mips"); 7909 if (Opts.GNUMode) 7910 Builder.defineMacro("mips"); 7911 7912 if (ABI == "o32") { 7913 Builder.defineMacro("__mips", "32"); 7914 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32"); 7915 } else { 7916 Builder.defineMacro("__mips", "64"); 7917 Builder.defineMacro("__mips64"); 7918 Builder.defineMacro("__mips64__"); 7919 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64"); 7920 } 7921 7922 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU()) 7923 .Cases("mips32", "mips64", "1") 7924 .Cases("mips32r2", "mips64r2", "2") 7925 .Cases("mips32r3", "mips64r3", "3") 7926 .Cases("mips32r5", "mips64r5", "5") 7927 .Cases("mips32r6", "mips64r6", "6") 7928 .Default(""); 7929 if (!ISARev.empty()) 7930 Builder.defineMacro("__mips_isa_rev", ISARev); 7931 7932 if (ABI == "o32") { 7933 Builder.defineMacro("__mips_o32"); 7934 Builder.defineMacro("_ABIO32", "1"); 7935 Builder.defineMacro("_MIPS_SIM", "_ABIO32"); 7936 } else if (ABI == "n32") { 7937 Builder.defineMacro("__mips_n32"); 7938 Builder.defineMacro("_ABIN32", "2"); 7939 Builder.defineMacro("_MIPS_SIM", "_ABIN32"); 7940 } else if (ABI == "n64") { 7941 Builder.defineMacro("__mips_n64"); 7942 Builder.defineMacro("_ABI64", "3"); 7943 Builder.defineMacro("_MIPS_SIM", "_ABI64"); 7944 } else 7945 llvm_unreachable("Invalid ABI."); 7946 7947 if (!IsNoABICalls) { 7948 Builder.defineMacro("__mips_abicalls"); 7949 if (CanUseBSDABICalls) 7950 Builder.defineMacro("__ABICALLS__"); 7951 } 7952 7953 Builder.defineMacro("__REGISTER_PREFIX__", ""); 7954 7955 switch (FloatABI) { 7956 case HardFloat: 7957 Builder.defineMacro("__mips_hard_float", Twine(1)); 7958 break; 7959 case SoftFloat: 7960 Builder.defineMacro("__mips_soft_float", Twine(1)); 7961 break; 7962 } 7963 7964 if (IsSingleFloat) 7965 Builder.defineMacro("__mips_single_float", Twine(1)); 7966 7967 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32)); 7968 Builder.defineMacro("_MIPS_FPSET", 7969 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2))); 7970 7971 if (IsMips16) 7972 Builder.defineMacro("__mips16", Twine(1)); 7973 7974 if (IsMicromips) 7975 Builder.defineMacro("__mips_micromips", Twine(1)); 7976 7977 if (IsNan2008) 7978 Builder.defineMacro("__mips_nan2008", Twine(1)); 7979 7980 switch (DspRev) { 7981 default: 7982 break; 7983 case DSP1: 7984 Builder.defineMacro("__mips_dsp_rev", Twine(1)); 7985 Builder.defineMacro("__mips_dsp", Twine(1)); 7986 break; 7987 case DSP2: 7988 Builder.defineMacro("__mips_dsp_rev", Twine(2)); 7989 Builder.defineMacro("__mips_dspr2", Twine(1)); 7990 Builder.defineMacro("__mips_dsp", Twine(1)); 7991 break; 7992 } 7993 7994 if (HasMSA) 7995 Builder.defineMacro("__mips_msa", Twine(1)); 7996 7997 if (DisableMadd4) 7998 Builder.defineMacro("__mips_no_madd4", Twine(1)); 7999 8000 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0))); 8001 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth())); 8002 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth())); 8003 8004 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\""); 8005 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper()); 8006 8007 // These shouldn't be defined for MIPS-I but there's no need to check 8008 // for that since MIPS-I isn't supported. 8009 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1"); 8010 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2"); 8011 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4"); 8012 8013 // 32-bit MIPS processors don't have the necessary lld/scd instructions 8014 // found in 64-bit processors. In the case of O32 on a 64-bit processor, 8015 // the instructions exist but using them violates the ABI since they 8016 // require 64-bit GPRs and O32 only supports 32-bit GPRs. 8017 if (ABI == "n32" || ABI == "n64") 8018 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8"); 8019 } 8020 8021 ArrayRef<Builtin::Info> getTargetBuiltins() const override { 8022 return llvm::makeArrayRef(BuiltinInfo, 8023 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin); 8024 } 8025 bool hasFeature(StringRef Feature) const override { 8026 return llvm::StringSwitch<bool>(Feature) 8027 .Case("mips", true) 8028 .Case("fp64", HasFP64) 8029 .Default(false); 8030 } 8031 BuiltinVaListKind getBuiltinVaListKind() const override { 8032 return TargetInfo::VoidPtrBuiltinVaList; 8033 } 8034 ArrayRef<const char *> getGCCRegNames() const override { 8035 static const char *const GCCRegNames[] = { 8036 // CPU register names 8037 // Must match second column of GCCRegAliases 8038 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7", 8039 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", 8040 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23", 8041 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31", 8042 // Floating point register names 8043 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7", 8044 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15", 8045 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23", 8046 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31", 8047 // Hi/lo and condition register names 8048 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4", 8049 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo", 8050 "$ac3hi","$ac3lo", 8051 // MSA register names 8052 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7", 8053 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15", 8054 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23", 8055 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31", 8056 // MSA control register names 8057 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify", 8058 "$msarequest", "$msamap", "$msaunmap" 8059 }; 8060 return llvm::makeArrayRef(GCCRegNames); 8061 } 8062 bool validateAsmConstraint(const char *&Name, 8063 TargetInfo::ConstraintInfo &Info) const override { 8064 switch (*Name) { 8065 default: 8066 return false; 8067 case 'r': // CPU registers. 8068 case 'd': // Equivalent to "r" unless generating MIPS16 code. 8069 case 'y': // Equivalent to "r", backward compatibility only. 8070 case 'f': // floating-point registers. 8071 case 'c': // $25 for indirect jumps 8072 case 'l': // lo register 8073 case 'x': // hilo register pair 8074 Info.setAllowsRegister(); 8075 return true; 8076 case 'I': // Signed 16-bit constant 8077 case 'J': // Integer 0 8078 case 'K': // Unsigned 16-bit constant 8079 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui) 8080 case 'M': // Constants not loadable via lui, addiu, or ori 8081 case 'N': // Constant -1 to -65535 8082 case 'O': // A signed 15-bit constant 8083 case 'P': // A constant between 1 go 65535 8084 return true; 8085 case 'R': // An address that can be used in a non-macro load or store 8086 Info.setAllowsMemory(); 8087 return true; 8088 case 'Z': 8089 if (Name[1] == 'C') { // An address usable by ll, and sc. 8090 Info.setAllowsMemory(); 8091 Name++; // Skip over 'Z'. 8092 return true; 8093 } 8094 return false; 8095 } 8096 } 8097 8098 std::string convertConstraint(const char *&Constraint) const override { 8099 std::string R; 8100 switch (*Constraint) { 8101 case 'Z': // Two-character constraint; add "^" hint for later parsing. 8102 if (Constraint[1] == 'C') { 8103 R = std::string("^") + std::string(Constraint, 2); 8104 Constraint++; 8105 return R; 8106 } 8107 break; 8108 } 8109 return TargetInfo::convertConstraint(Constraint); 8110 } 8111 8112 const char *getClobbers() const override { 8113 // In GCC, $1 is not widely used in generated code (it's used only in a few 8114 // specific situations), so there is no real need for users to add it to 8115 // the clobbers list if they want to use it in their inline assembly code. 8116 // 8117 // In LLVM, $1 is treated as a normal GPR and is always allocatable during 8118 // code generation, so using it in inline assembly without adding it to the 8119 // clobbers list can cause conflicts between the inline assembly code and 8120 // the surrounding generated code. 8121 // 8122 // Another problem is that LLVM is allowed to choose $1 for inline assembly 8123 // operands, which will conflict with the ".set at" assembler option (which 8124 // we use only for inline assembly, in order to maintain compatibility with 8125 // GCC) and will also conflict with the user's usage of $1. 8126 // 8127 // The easiest way to avoid these conflicts and keep $1 as an allocatable 8128 // register for generated code is to automatically clobber $1 for all inline 8129 // assembly code. 8130 // 8131 // FIXME: We should automatically clobber $1 only for inline assembly code 8132 // which actually uses it. This would allow LLVM to use $1 for inline 8133 // assembly operands if the user's assembly code doesn't use it. 8134 return "~{$1}"; 8135 } 8136 8137 bool handleTargetFeatures(std::vector<std::string> &Features, 8138 DiagnosticsEngine &Diags) override { 8139 IsMips16 = false; 8140 IsMicromips = false; 8141 IsNan2008 = isNaN2008Default(); 8142 IsSingleFloat = false; 8143 FloatABI = HardFloat; 8144 DspRev = NoDSP; 8145 HasFP64 = isFP64Default(); 8146 8147 for (const auto &Feature : Features) { 8148 if (Feature == "+single-float") 8149 IsSingleFloat = true; 8150 else if (Feature == "+soft-float") 8151 FloatABI = SoftFloat; 8152 else if (Feature == "+mips16") 8153 IsMips16 = true; 8154 else if (Feature == "+micromips") 8155 IsMicromips = true; 8156 else if (Feature == "+dsp") 8157 DspRev = std::max(DspRev, DSP1); 8158 else if (Feature == "+dspr2") 8159 DspRev = std::max(DspRev, DSP2); 8160 else if (Feature == "+msa") 8161 HasMSA = true; 8162 else if (Feature == "+nomadd4") 8163 DisableMadd4 = true; 8164 else if (Feature == "+fp64") 8165 HasFP64 = true; 8166 else if (Feature == "-fp64") 8167 HasFP64 = false; 8168 else if (Feature == "+nan2008") 8169 IsNan2008 = true; 8170 else if (Feature == "-nan2008") 8171 IsNan2008 = false; 8172 else if (Feature == "+noabicalls") 8173 IsNoABICalls = true; 8174 } 8175 8176 setDataLayout(); 8177 8178 return true; 8179 } 8180 8181 int getEHDataRegisterNumber(unsigned RegNo) const override { 8182 if (RegNo == 0) return 4; 8183 if (RegNo == 1) return 5; 8184 return -1; 8185 } 8186 8187 bool isCLZForZeroUndef() const override { return false; } 8188 8189 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override { 8190 static const TargetInfo::GCCRegAlias O32RegAliases[] = { 8191 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"}, 8192 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"}, 8193 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"}, 8194 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"}, 8195 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"}, 8196 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"}, 8197 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"}, 8198 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"}, 8199 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"}, 8200 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"}, 8201 {{"ra"}, "$31"}}; 8202 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = { 8203 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"}, 8204 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"}, 8205 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"}, 8206 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"}, 8207 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"}, 8208 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"}, 8209 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"}, 8210 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"}, 8211 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"}, 8212 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"}, 8213 {{"ra"}, "$31"}}; 8214 if (ABI == "o32") 8215 return llvm::makeArrayRef(O32RegAliases); 8216 return llvm::makeArrayRef(NewABIRegAliases); 8217 } 8218 8219 bool hasInt128Type() const override { 8220 return ABI == "n32" || ABI == "n64"; 8221 } 8222 8223 bool validateTarget(DiagnosticsEngine &Diags) const override { 8224 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle 8225 // this yet. It's better to fail here than on the backend assertion. 8226 if (processorSupportsGPR64() && ABI == "o32") { 8227 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU; 8228 return false; 8229 } 8230 8231 // 64-bit ABI's require 64-bit CPU's. 8232 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) { 8233 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU; 8234 return false; 8235 } 8236 8237 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend 8238 // can't handle this yet. It's better to fail here than on the 8239 // backend assertion. 8240 if ((getTriple().getArch() == llvm::Triple::mips64 || 8241 getTriple().getArch() == llvm::Triple::mips64el) && 8242 ABI == "o32") { 8243 Diags.Report(diag::err_target_unsupported_abi_for_triple) 8244 << ABI << getTriple().str(); 8245 return false; 8246 } 8247 8248 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend 8249 // can't handle this yet. It's better to fail here than on the 8250 // backend assertion. 8251 if ((getTriple().getArch() == llvm::Triple::mips || 8252 getTriple().getArch() == llvm::Triple::mipsel) && 8253 (ABI == "n32" || ABI == "n64")) { 8254 Diags.Report(diag::err_target_unsupported_abi_for_triple) 8255 << ABI << getTriple().str(); 8256 return false; 8257 } 8258 8259 return true; 8260 } 8261 }; 8262 8263 const Builtin::Info MipsTargetInfo::BuiltinInfo[] = { 8264 #define BUILTIN(ID, TYPE, ATTRS) \ 8265 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr }, 8266 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \ 8267 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr }, 8268 #include "clang/Basic/BuiltinsMips.def" 8269 }; 8270 8271 class PNaClTargetInfo : public TargetInfo { 8272 public: 8273 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 8274 : TargetInfo(Triple) { 8275 this->LongAlign = 32; 8276 this->LongWidth = 32; 8277 this->PointerAlign = 32; 8278 this->PointerWidth = 32; 8279 this->IntMaxType = TargetInfo::SignedLongLong; 8280 this->Int64Type = TargetInfo::SignedLongLong; 8281 this->DoubleAlign = 64; 8282 this->LongDoubleWidth = 64; 8283 this->LongDoubleAlign = 64; 8284 this->SizeType = TargetInfo::UnsignedInt; 8285 this->PtrDiffType = TargetInfo::SignedInt; 8286 this->IntPtrType = TargetInfo::SignedInt; 8287 this->RegParmMax = 0; // Disallow regparm 8288 } 8289 8290 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const { 8291 Builder.defineMacro("__le32__"); 8292 Builder.defineMacro("__pnacl__"); 8293 } 8294 void getTargetDefines(const LangOptions &Opts, 8295 MacroBuilder &Builder) const override { 8296 getArchDefines(Opts, Builder); 8297 } 8298 bool hasFeature(StringRef Feature) const override { 8299 return Feature == "pnacl"; 8300 } 8301 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; } 8302 BuiltinVaListKind getBuiltinVaListKind() const override { 8303 return TargetInfo::PNaClABIBuiltinVaList; 8304 } 8305 ArrayRef<const char *> getGCCRegNames() const override; 8306 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override; 8307 bool validateAsmConstraint(const char *&Name, 8308 TargetInfo::ConstraintInfo &Info) const override { 8309 return false; 8310 } 8311 8312 const char *getClobbers() const override { 8313 return ""; 8314 } 8315 }; 8316 8317 ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const { 8318 return None; 8319 } 8320 8321 ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const { 8322 return None; 8323 } 8324 8325 // We attempt to use PNaCl (le32) frontend and Mips32EL backend. 8326 class NaClMips32TargetInfo : public MipsTargetInfo { 8327 public: 8328 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 8329 : MipsTargetInfo(Triple, Opts) {} 8330 8331 BuiltinVaListKind getBuiltinVaListKind() const override { 8332 return TargetInfo::PNaClABIBuiltinVaList; 8333 } 8334 }; 8335 8336 class Le64TargetInfo : public TargetInfo { 8337 static const Builtin::Info BuiltinInfo[]; 8338 8339 public: 8340 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &) 8341 : TargetInfo(Triple) { 8342 NoAsmVariants = true; 8343 LongWidth = LongAlign = PointerWidth = PointerAlign = 64; 8344 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64; 8345 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128"); 8346 } 8347 8348 void getTargetDefines(const LangOptions &Opts, 8349 MacroBuilder &Builder) const override { 8350 DefineStd(Builder, "unix", Opts); 8351 defineCPUMacros(Builder, "le64", /*Tuning=*/false); 8352 Builder.defineMacro("__ELF__"); 8353 } 8354 ArrayRef<Builtin::Info> getTargetBuiltins() const override { 8355 return llvm::makeArrayRef(BuiltinInfo, 8356 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin); 8357 } 8358 BuiltinVaListKind getBuiltinVaListKind() const override { 8359 return TargetInfo::PNaClABIBuiltinVaList; 8360 } 8361 const char *getClobbers() const override { return ""; } 8362 ArrayRef<const char *> getGCCRegNames() const override { 8363 return None; 8364 } 8365 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override { 8366 return None; 8367 } 8368 bool validateAsmConstraint(const char *&Name, 8369 TargetInfo::ConstraintInfo &Info) const override { 8370 return false; 8371 } 8372 8373 bool hasProtectedVisibility() const override { return false; } 8374 }; 8375 8376 class WebAssemblyTargetInfo : public TargetInfo { 8377 static const Builtin::Info BuiltinInfo[]; 8378 8379 enum SIMDEnum { 8380 NoSIMD, 8381 SIMD128, 8382 } SIMDLevel; 8383 8384 public: 8385 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &) 8386 : TargetInfo(T), SIMDLevel(NoSIMD) { 8387 NoAsmVariants = true; 8388 SuitableAlign = 128; 8389 LargeArrayMinWidth = 128; 8390 LargeArrayAlign = 128; 8391 SimdDefaultAlign = 128; 8392 SigAtomicType = SignedLong; 8393 LongDoubleWidth = LongDoubleAlign = 128; 8394 LongDoubleFormat = &llvm::APFloat::IEEEquad(); 8395 SizeType = UnsignedInt; 8396 PtrDiffType = SignedInt; 8397 IntPtrType = SignedInt; 8398 } 8399 8400 protected: 8401 void getTargetDefines(const LangOptions &Opts, 8402 MacroBuilder &Builder) const override { 8403 defineCPUMacros(Builder, "wasm", /*Tuning=*/false); 8404 if (SIMDLevel >= SIMD128) 8405 Builder.defineMacro("__wasm_simd128__"); 8406 } 8407 8408 private: 8409 bool 8410 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, 8411 StringRef CPU, 8412 const std::vector<std::string> &FeaturesVec) const override { 8413 if (CPU == "bleeding-edge") 8414 Features["simd128"] = true; 8415 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec); 8416 } 8417 bool hasFeature(StringRef Feature) const final { 8418 return llvm::StringSwitch<bool>(Feature) 8419 .Case("simd128", SIMDLevel >= SIMD128) 8420 .Default(false); 8421 } 8422 bool handleTargetFeatures(std::vector<std::string> &Features, 8423 DiagnosticsEngine &Diags) final { 8424 for (const auto &Feature : Features) { 8425 if (Feature == "+simd128") { 8426 SIMDLevel = std::max(SIMDLevel, SIMD128); 8427 continue; 8428 } 8429 if (Feature == "-simd128") { 8430 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1)); 8431 continue; 8432 } 8433 8434 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature 8435 << "-target-feature"; 8436 return false; 8437 } 8438 return true; 8439 } 8440 bool setCPU(const std::string &Name) final { 8441 return llvm::StringSwitch<bool>(Name) 8442 .Case("mvp", true) 8443 .Case("bleeding-edge", true) 8444 .Case("generic", true) 8445 .Default(false); 8446 } 8447 ArrayRef<Builtin::Info> getTargetBuiltins() const final { 8448 return llvm::makeArrayRef(BuiltinInfo, 8449 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin); 8450 } 8451 BuiltinVaListKind getBuiltinVaListKind() const final { 8452 return VoidPtrBuiltinVaList; 8453 } 8454 ArrayRef<const char *> getGCCRegNames() const final { 8455 return None; 8456 } 8457 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final { 8458 return None; 8459 } 8460 bool 8461 validateAsmConstraint(const char *&Name, 8462 TargetInfo::ConstraintInfo &Info) const final { 8463 return false; 8464 } 8465 const char *getClobbers() const final { return ""; } 8466 bool isCLZForZeroUndef() const final { return false; } 8467 bool hasInt128Type() const final { return true; } 8468 IntType getIntTypeByWidth(unsigned BitWidth, 8469 bool IsSigned) const final { 8470 // WebAssembly prefers long long for explicitly 64-bit integers. 8471 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong) 8472 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned); 8473 } 8474 IntType getLeastIntTypeByWidth(unsigned BitWidth, 8475 bool IsSigned) const final { 8476 // WebAssembly uses long long for int_least64_t and int_fast64_t. 8477 return BitWidth == 64 8478 ? (IsSigned ? SignedLongLong : UnsignedLongLong) 8479 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned); 8480 } 8481 }; 8482 8483 const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = { 8484 #define BUILTIN(ID, TYPE, ATTRS) \ 8485 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr }, 8486 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \ 8487 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr }, 8488 #include "clang/Basic/BuiltinsWebAssembly.def" 8489 }; 8490 8491 class WebAssembly32TargetInfo : public WebAssemblyTargetInfo { 8492 public: 8493 explicit WebAssembly32TargetInfo(const llvm::Triple &T, 8494 const TargetOptions &Opts) 8495 : WebAssemblyTargetInfo(T, Opts) { 8496 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64; 8497 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128"); 8498 } 8499 8500 protected: 8501 void getTargetDefines(const LangOptions &Opts, 8502 MacroBuilder &Builder) const override { 8503 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder); 8504 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false); 8505 } 8506 }; 8507 8508 class WebAssembly64TargetInfo : public WebAssemblyTargetInfo { 8509 public: 8510 explicit WebAssembly64TargetInfo(const llvm::Triple &T, 8511 const TargetOptions &Opts) 8512 : WebAssemblyTargetInfo(T, Opts) { 8513 LongAlign = LongWidth = 64; 8514 PointerAlign = PointerWidth = 64; 8515 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64; 8516 SizeType = UnsignedLong; 8517 PtrDiffType = SignedLong; 8518 IntPtrType = SignedLong; 8519 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128"); 8520 } 8521 8522 protected: 8523 void getTargetDefines(const LangOptions &Opts, 8524 MacroBuilder &Builder) const override { 8525 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder); 8526 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false); 8527 } 8528 }; 8529 8530 const Builtin::Info Le64TargetInfo::BuiltinInfo[] = { 8531 #define BUILTIN(ID, TYPE, ATTRS) \ 8532 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr }, 8533 #include "clang/Basic/BuiltinsLe64.def" 8534 }; 8535 8536 static const unsigned SPIRAddrSpaceMap[] = { 8537 0, // Default 8538 1, // opencl_global 8539 3, // opencl_local 8540 2, // opencl_constant 8541 4, // opencl_generic 8542 0, // cuda_device 8543 0, // cuda_constant 8544 0 // cuda_shared 8545 }; 8546 class SPIRTargetInfo : public TargetInfo { 8547 public: 8548 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &) 8549 : TargetInfo(Triple) { 8550 assert(getTriple().getOS() == llvm::Triple::UnknownOS && 8551 "SPIR target must use unknown OS"); 8552 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment && 8553 "SPIR target must use unknown environment type"); 8554 TLSSupported = false; 8555 LongWidth = LongAlign = 64; 8556 AddrSpaceMap = &SPIRAddrSpaceMap; 8557 UseAddrSpaceMapMangling = true; 8558 // Define available target features 8559 // These must be defined in sorted order! 8560 NoAsmVariants = true; 8561 } 8562 void getTargetDefines(const LangOptions &Opts, 8563 MacroBuilder &Builder) const override { 8564 DefineStd(Builder, "SPIR", Opts); 8565 } 8566 bool hasFeature(StringRef Feature) const override { 8567 return Feature == "spir"; 8568 } 8569 8570 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; } 8571 const char *getClobbers() const override { return ""; } 8572 ArrayRef<const char *> getGCCRegNames() const override { return None; } 8573 bool validateAsmConstraint(const char *&Name, 8574 TargetInfo::ConstraintInfo &info) const override { 8575 return true; 8576 } 8577 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override { 8578 return None; 8579 } 8580 BuiltinVaListKind getBuiltinVaListKind() const override { 8581 return TargetInfo::VoidPtrBuiltinVaList; 8582 } 8583 8584 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override { 8585 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK 8586 : CCCR_Warning; 8587 } 8588 8589 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override { 8590 return CC_SpirFunction; 8591 } 8592 8593 void setSupportedOpenCLOpts() override { 8594 // Assume all OpenCL extensions and optional core features are supported 8595 // for SPIR since it is a generic target. 8596 getSupportedOpenCLOpts().supportAll(); 8597 } 8598 }; 8599 8600 class SPIR32TargetInfo : public SPIRTargetInfo { 8601 public: 8602 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 8603 : SPIRTargetInfo(Triple, Opts) { 8604 PointerWidth = PointerAlign = 32; 8605 SizeType = TargetInfo::UnsignedInt; 8606 PtrDiffType = IntPtrType = TargetInfo::SignedInt; 8607 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-" 8608 "v96:128-v192:256-v256:256-v512:512-v1024:1024"); 8609 } 8610 void getTargetDefines(const LangOptions &Opts, 8611 MacroBuilder &Builder) const override { 8612 DefineStd(Builder, "SPIR32", Opts); 8613 } 8614 }; 8615 8616 class SPIR64TargetInfo : public SPIRTargetInfo { 8617 public: 8618 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 8619 : SPIRTargetInfo(Triple, Opts) { 8620 PointerWidth = PointerAlign = 64; 8621 SizeType = TargetInfo::UnsignedLong; 8622 PtrDiffType = IntPtrType = TargetInfo::SignedLong; 8623 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-" 8624 "v96:128-v192:256-v256:256-v512:512-v1024:1024"); 8625 } 8626 void getTargetDefines(const LangOptions &Opts, 8627 MacroBuilder &Builder) const override { 8628 DefineStd(Builder, "SPIR64", Opts); 8629 } 8630 }; 8631 8632 class XCoreTargetInfo : public TargetInfo { 8633 static const Builtin::Info BuiltinInfo[]; 8634 public: 8635 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &) 8636 : TargetInfo(Triple) { 8637 NoAsmVariants = true; 8638 LongLongAlign = 32; 8639 SuitableAlign = 32; 8640 DoubleAlign = LongDoubleAlign = 32; 8641 SizeType = UnsignedInt; 8642 PtrDiffType = SignedInt; 8643 IntPtrType = SignedInt; 8644 WCharType = UnsignedChar; 8645 WIntType = UnsignedInt; 8646 UseZeroLengthBitfieldAlignment = true; 8647 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32" 8648 "-f64:32-a:0:32-n32"); 8649 } 8650 void getTargetDefines(const LangOptions &Opts, 8651 MacroBuilder &Builder) const override { 8652 Builder.defineMacro("__XS1B__"); 8653 } 8654 ArrayRef<Builtin::Info> getTargetBuiltins() const override { 8655 return llvm::makeArrayRef(BuiltinInfo, 8656 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin); 8657 } 8658 BuiltinVaListKind getBuiltinVaListKind() const override { 8659 return TargetInfo::VoidPtrBuiltinVaList; 8660 } 8661 const char *getClobbers() const override { 8662 return ""; 8663 } 8664 ArrayRef<const char *> getGCCRegNames() const override { 8665 static const char * const GCCRegNames[] = { 8666 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", 8667 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr" 8668 }; 8669 return llvm::makeArrayRef(GCCRegNames); 8670 } 8671 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override { 8672 return None; 8673 } 8674 bool validateAsmConstraint(const char *&Name, 8675 TargetInfo::ConstraintInfo &Info) const override { 8676 return false; 8677 } 8678 int getEHDataRegisterNumber(unsigned RegNo) const override { 8679 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister 8680 return (RegNo < 2)? RegNo : -1; 8681 } 8682 bool allowsLargerPreferedTypeAlignment() const override { 8683 return false; 8684 } 8685 }; 8686 8687 const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = { 8688 #define BUILTIN(ID, TYPE, ATTRS) \ 8689 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr }, 8690 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \ 8691 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr }, 8692 #include "clang/Basic/BuiltinsXCore.def" 8693 }; 8694 8695 // x86_32 Android target 8696 class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> { 8697 public: 8698 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 8699 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) { 8700 SuitableAlign = 32; 8701 LongDoubleWidth = 64; 8702 LongDoubleFormat = &llvm::APFloat::IEEEdouble(); 8703 } 8704 }; 8705 8706 // x86_64 Android target 8707 class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> { 8708 public: 8709 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 8710 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) { 8711 LongDoubleFormat = &llvm::APFloat::IEEEquad(); 8712 } 8713 8714 bool useFloat128ManglingForLongDouble() const override { 8715 return true; 8716 } 8717 }; 8718 8719 // 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes 8720 class RenderScript32TargetInfo : public ARMleTargetInfo { 8721 public: 8722 RenderScript32TargetInfo(const llvm::Triple &Triple, 8723 const TargetOptions &Opts) 8724 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(), 8725 Triple.getOSName(), 8726 Triple.getEnvironmentName()), 8727 Opts) { 8728 IsRenderScriptTarget = true; 8729 LongWidth = LongAlign = 64; 8730 } 8731 void getTargetDefines(const LangOptions &Opts, 8732 MacroBuilder &Builder) const override { 8733 Builder.defineMacro("__RENDERSCRIPT__"); 8734 ARMleTargetInfo::getTargetDefines(Opts, Builder); 8735 } 8736 }; 8737 8738 // 64-bit RenderScript is aarch64 8739 class RenderScript64TargetInfo : public AArch64leTargetInfo { 8740 public: 8741 RenderScript64TargetInfo(const llvm::Triple &Triple, 8742 const TargetOptions &Opts) 8743 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(), 8744 Triple.getOSName(), 8745 Triple.getEnvironmentName()), 8746 Opts) { 8747 IsRenderScriptTarget = true; 8748 } 8749 8750 void getTargetDefines(const LangOptions &Opts, 8751 MacroBuilder &Builder) const override { 8752 Builder.defineMacro("__RENDERSCRIPT__"); 8753 AArch64leTargetInfo::getTargetDefines(Opts, Builder); 8754 } 8755 }; 8756 8757 /// Information about a specific microcontroller. 8758 struct MCUInfo { 8759 const char *Name; 8760 const char *DefineName; 8761 }; 8762 8763 // This list should be kept up-to-date with AVRDevices.td in LLVM. 8764 static ArrayRef<MCUInfo> AVRMcus = { 8765 { "at90s1200", "__AVR_AT90S1200__" }, 8766 { "attiny11", "__AVR_ATtiny11__" }, 8767 { "attiny12", "__AVR_ATtiny12__" }, 8768 { "attiny15", "__AVR_ATtiny15__" }, 8769 { "attiny28", "__AVR_ATtiny28__" }, 8770 { "at90s2313", "__AVR_AT90S2313__" }, 8771 { "at90s2323", "__AVR_AT90S2323__" }, 8772 { "at90s2333", "__AVR_AT90S2333__" }, 8773 { "at90s2343", "__AVR_AT90S2343__" }, 8774 { "attiny22", "__AVR_ATtiny22__" }, 8775 { "attiny26", "__AVR_ATtiny26__" }, 8776 { "at86rf401", "__AVR_AT86RF401__" }, 8777 { "at90s4414", "__AVR_AT90S4414__" }, 8778 { "at90s4433", "__AVR_AT90S4433__" }, 8779 { "at90s4434", "__AVR_AT90S4434__" }, 8780 { "at90s8515", "__AVR_AT90S8515__" }, 8781 { "at90c8534", "__AVR_AT90c8534__" }, 8782 { "at90s8535", "__AVR_AT90S8535__" }, 8783 { "ata5272", "__AVR_ATA5272__" }, 8784 { "attiny13", "__AVR_ATtiny13__" }, 8785 { "attiny13a", "__AVR_ATtiny13A__" }, 8786 { "attiny2313", "__AVR_ATtiny2313__" }, 8787 { "attiny2313a", "__AVR_ATtiny2313A__" }, 8788 { "attiny24", "__AVR_ATtiny24__" }, 8789 { "attiny24a", "__AVR_ATtiny24A__" }, 8790 { "attiny4313", "__AVR_ATtiny4313__" }, 8791 { "attiny44", "__AVR_ATtiny44__" }, 8792 { "attiny44a", "__AVR_ATtiny44A__" }, 8793 { "attiny84", "__AVR_ATtiny84__" }, 8794 { "attiny84a", "__AVR_ATtiny84A__" }, 8795 { "attiny25", "__AVR_ATtiny25__" }, 8796 { "attiny45", "__AVR_ATtiny45__" }, 8797 { "attiny85", "__AVR_ATtiny85__" }, 8798 { "attiny261", "__AVR_ATtiny261__" }, 8799 { "attiny261a", "__AVR_ATtiny261A__" }, 8800 { "attiny461", "__AVR_ATtiny461__" }, 8801 { "attiny461a", "__AVR_ATtiny461A__" }, 8802 { "attiny861", "__AVR_ATtiny861__" }, 8803 { "attiny861a", "__AVR_ATtiny861A__" }, 8804 { "attiny87", "__AVR_ATtiny87__" }, 8805 { "attiny43u", "__AVR_ATtiny43U__" }, 8806 { "attiny48", "__AVR_ATtiny48__" }, 8807 { "attiny88", "__AVR_ATtiny88__" }, 8808 { "attiny828", "__AVR_ATtiny828__" }, 8809 { "at43usb355", "__AVR_AT43USB355__" }, 8810 { "at76c711", "__AVR_AT76C711__" }, 8811 { "atmega103", "__AVR_ATmega103__" }, 8812 { "at43usb320", "__AVR_AT43USB320__" }, 8813 { "attiny167", "__AVR_ATtiny167__" }, 8814 { "at90usb82", "__AVR_AT90USB82__" }, 8815 { "at90usb162", "__AVR_AT90USB162__" }, 8816 { "ata5505", "__AVR_ATA5505__" }, 8817 { "atmega8u2", "__AVR_ATmega8U2__" }, 8818 { "atmega16u2", "__AVR_ATmega16U2__" }, 8819 { "atmega32u2", "__AVR_ATmega32U2__" }, 8820 { "attiny1634", "__AVR_ATtiny1634__" }, 8821 { "atmega8", "__AVR_ATmega8__" }, 8822 { "ata6289", "__AVR_ATA6289__" }, 8823 { "atmega8a", "__AVR_ATmega8A__" }, 8824 { "ata6285", "__AVR_ATA6285__" }, 8825 { "ata6286", "__AVR_ATA6286__" }, 8826 { "atmega48", "__AVR_ATmega48__" }, 8827 { "atmega48a", "__AVR_ATmega48A__" }, 8828 { "atmega48pa", "__AVR_ATmega48PA__" }, 8829 { "atmega48p", "__AVR_ATmega48P__" }, 8830 { "atmega88", "__AVR_ATmega88__" }, 8831 { "atmega88a", "__AVR_ATmega88A__" }, 8832 { "atmega88p", "__AVR_ATmega88P__" }, 8833 { "atmega88pa", "__AVR_ATmega88PA__" }, 8834 { "atmega8515", "__AVR_ATmega8515__" }, 8835 { "atmega8535", "__AVR_ATmega8535__" }, 8836 { "atmega8hva", "__AVR_ATmega8HVA__" }, 8837 { "at90pwm1", "__AVR_AT90PWM1__" }, 8838 { "at90pwm2", "__AVR_AT90PWM2__" }, 8839 { "at90pwm2b", "__AVR_AT90PWM2B__" }, 8840 { "at90pwm3", "__AVR_AT90PWM3__" }, 8841 { "at90pwm3b", "__AVR_AT90PWM3B__" }, 8842 { "at90pwm81", "__AVR_AT90PWM81__" }, 8843 { "ata5790", "__AVR_ATA5790__" }, 8844 { "ata5795", "__AVR_ATA5795__" }, 8845 { "atmega16", "__AVR_ATmega16__" }, 8846 { "atmega16a", "__AVR_ATmega16A__" }, 8847 { "atmega161", "__AVR_ATmega161__" }, 8848 { "atmega162", "__AVR_ATmega162__" }, 8849 { "atmega163", "__AVR_ATmega163__" }, 8850 { "atmega164a", "__AVR_ATmega164A__" }, 8851 { "atmega164p", "__AVR_ATmega164P__" }, 8852 { "atmega164pa", "__AVR_ATmega164PA__" }, 8853 { "atmega165", "__AVR_ATmega165__" }, 8854 { "atmega165a", "__AVR_ATmega165A__" }, 8855 { "atmega165p", "__AVR_ATmega165P__" }, 8856 { "atmega165pa", "__AVR_ATmega165PA__" }, 8857 { "atmega168", "__AVR_ATmega168__" }, 8858 { "atmega168a", "__AVR_ATmega168A__" }, 8859 { "atmega168p", "__AVR_ATmega168P__" }, 8860 { "atmega168pa", "__AVR_ATmega168PA__" }, 8861 { "atmega169", "__AVR_ATmega169__" }, 8862 { "atmega169a", "__AVR_ATmega169A__" }, 8863 { "atmega169p", "__AVR_ATmega169P__" }, 8864 { "atmega169pa", "__AVR_ATmega169PA__" }, 8865 { "atmega32", "__AVR_ATmega32__" }, 8866 { "atmega32a", "__AVR_ATmega32A__" }, 8867 { "atmega323", "__AVR_ATmega323__" }, 8868 { "atmega324a", "__AVR_ATmega324A__" }, 8869 { "atmega324p", "__AVR_ATmega324P__" }, 8870 { "atmega324pa", "__AVR_ATmega324PA__" }, 8871 { "atmega325", "__AVR_ATmega325__" }, 8872 { "atmega325a", "__AVR_ATmega325A__" }, 8873 { "atmega325p", "__AVR_ATmega325P__" }, 8874 { "atmega325pa", "__AVR_ATmega325PA__" }, 8875 { "atmega3250", "__AVR_ATmega3250__" }, 8876 { "atmega3250a", "__AVR_ATmega3250A__" }, 8877 { "atmega3250p", "__AVR_ATmega3250P__" }, 8878 { "atmega3250pa", "__AVR_ATmega3250PA__" }, 8879 { "atmega328", "__AVR_ATmega328__" }, 8880 { "atmega328p", "__AVR_ATmega328P__" }, 8881 { "atmega329", "__AVR_ATmega329__" }, 8882 { "atmega329a", "__AVR_ATmega329A__" }, 8883 { "atmega329p", "__AVR_ATmega329P__" }, 8884 { "atmega329pa", "__AVR_ATmega329PA__" }, 8885 { "atmega3290", "__AVR_ATmega3290__" }, 8886 { "atmega3290a", "__AVR_ATmega3290A__" }, 8887 { "atmega3290p", "__AVR_ATmega3290P__" }, 8888 { "atmega3290pa", "__AVR_ATmega3290PA__" }, 8889 { "atmega406", "__AVR_ATmega406__" }, 8890 { "atmega64", "__AVR_ATmega64__" }, 8891 { "atmega64a", "__AVR_ATmega64A__" }, 8892 { "atmega640", "__AVR_ATmega640__" }, 8893 { "atmega644", "__AVR_ATmega644__" }, 8894 { "atmega644a", "__AVR_ATmega644A__" }, 8895 { "atmega644p", "__AVR_ATmega644P__" }, 8896 { "atmega644pa", "__AVR_ATmega644PA__" }, 8897 { "atmega645", "__AVR_ATmega645__" }, 8898 { "atmega645a", "__AVR_ATmega645A__" }, 8899 { "atmega645p", "__AVR_ATmega645P__" }, 8900 { "atmega649", "__AVR_ATmega649__" }, 8901 { "atmega649a", "__AVR_ATmega649A__" }, 8902 { "atmega649p", "__AVR_ATmega649P__" }, 8903 { "atmega6450", "__AVR_ATmega6450__" }, 8904 { "atmega6450a", "__AVR_ATmega6450A__" }, 8905 { "atmega6450p", "__AVR_ATmega6450P__" }, 8906 { "atmega6490", "__AVR_ATmega6490__" }, 8907 { "atmega6490a", "__AVR_ATmega6490A__" }, 8908 { "atmega6490p", "__AVR_ATmega6490P__" }, 8909 { "atmega64rfr2", "__AVR_ATmega64RFR2__" }, 8910 { "atmega644rfr2", "__AVR_ATmega644RFR2__" }, 8911 { "atmega16hva", "__AVR_ATmega16HVA__" }, 8912 { "atmega16hva2", "__AVR_ATmega16HVA2__" }, 8913 { "atmega16hvb", "__AVR_ATmega16HVB__" }, 8914 { "atmega16hvbrevb", "__AVR_ATmega16HVBREVB__" }, 8915 { "atmega32hvb", "__AVR_ATmega32HVB__" }, 8916 { "atmega32hvbrevb", "__AVR_ATmega32HVBREVB__" }, 8917 { "atmega64hve", "__AVR_ATmega64HVE__" }, 8918 { "at90can32", "__AVR_AT90CAN32__" }, 8919 { "at90can64", "__AVR_AT90CAN64__" }, 8920 { "at90pwm161", "__AVR_AT90PWM161__" }, 8921 { "at90pwm216", "__AVR_AT90PWM216__" }, 8922 { "at90pwm316", "__AVR_AT90PWM316__" }, 8923 { "atmega32c1", "__AVR_ATmega32C1__" }, 8924 { "atmega64c1", "__AVR_ATmega64C1__" }, 8925 { "atmega16m1", "__AVR_ATmega16M1__" }, 8926 { "atmega32m1", "__AVR_ATmega32M1__" }, 8927 { "atmega64m1", "__AVR_ATmega64M1__" }, 8928 { "atmega16u4", "__AVR_ATmega16U4__" }, 8929 { "atmega32u4", "__AVR_ATmega32U4__" }, 8930 { "atmega32u6", "__AVR_ATmega32U6__" }, 8931 { "at90usb646", "__AVR_AT90USB646__" }, 8932 { "at90usb647", "__AVR_AT90USB647__" }, 8933 { "at90scr100", "__AVR_AT90SCR100__" }, 8934 { "at94k", "__AVR_AT94K__" }, 8935 { "m3000", "__AVR_AT000__" }, 8936 { "atmega128", "__AVR_ATmega128__" }, 8937 { "atmega128a", "__AVR_ATmega128A__" }, 8938 { "atmega1280", "__AVR_ATmega1280__" }, 8939 { "atmega1281", "__AVR_ATmega1281__" }, 8940 { "atmega1284", "__AVR_ATmega1284__" }, 8941 { "atmega1284p", "__AVR_ATmega1284P__" }, 8942 { "atmega128rfa1", "__AVR_ATmega128RFA1__" }, 8943 { "atmega128rfr2", "__AVR_ATmega128RFR2__" }, 8944 { "atmega1284rfr2", "__AVR_ATmega1284RFR2__" }, 8945 { "at90can128", "__AVR_AT90CAN128__" }, 8946 { "at90usb1286", "__AVR_AT90USB1286__" }, 8947 { "at90usb1287", "__AVR_AT90USB1287__" }, 8948 { "atmega2560", "__AVR_ATmega2560__" }, 8949 { "atmega2561", "__AVR_ATmega2561__" }, 8950 { "atmega256rfr2", "__AVR_ATmega256RFR2__" }, 8951 { "atmega2564rfr2", "__AVR_ATmega2564RFR2__" }, 8952 { "atxmega16a4", "__AVR_ATxmega16A4__" }, 8953 { "atxmega16a4u", "__AVR_ATxmega16a4U__" }, 8954 { "atxmega16c4", "__AVR_ATxmega16C4__" }, 8955 { "atxmega16d4", "__AVR_ATxmega16D4__" }, 8956 { "atxmega32a4", "__AVR_ATxmega32A4__" }, 8957 { "atxmega32a4u", "__AVR_ATxmega32A4U__" }, 8958 { "atxmega32c4", "__AVR_ATxmega32C4__" }, 8959 { "atxmega32d4", "__AVR_ATxmega32D4__" }, 8960 { "atxmega32e5", "__AVR_ATxmega32E5__" }, 8961 { "atxmega16e5", "__AVR_ATxmega16E5__" }, 8962 { "atxmega8e5", "__AVR_ATxmega8E5__" }, 8963 { "atxmega32x1", "__AVR_ATxmega32X1__" }, 8964 { "atxmega64a3", "__AVR_ATxmega64A3__" }, 8965 { "atxmega64a3u", "__AVR_ATxmega64A3U__" }, 8966 { "atxmega64a4u", "__AVR_ATxmega64A4U__" }, 8967 { "atxmega64b1", "__AVR_ATxmega64B1__" }, 8968 { "atxmega64b3", "__AVR_ATxmega64B3__" }, 8969 { "atxmega64c3", "__AVR_ATxmega64C3__" }, 8970 { "atxmega64d3", "__AVR_ATxmega64D3__" }, 8971 { "atxmega64d4", "__AVR_ATxmega64D4__" }, 8972 { "atxmega64a1", "__AVR_ATxmega64A1__" }, 8973 { "atxmega64a1u", "__AVR_ATxmega64A1U__" }, 8974 { "atxmega128a3", "__AVR_ATxmega128A3__" }, 8975 { "atxmega128a3u", "__AVR_ATxmega128A3U__" }, 8976 { "atxmega128b1", "__AVR_ATxmega128B1__" }, 8977 { "atxmega128b3", "__AVR_ATxmega128B3__" }, 8978 { "atxmega128c3", "__AVR_ATxmega128C3__" }, 8979 { "atxmega128d3", "__AVR_ATxmega128D3__" }, 8980 { "atxmega128d4", "__AVR_ATxmega128D4__" }, 8981 { "atxmega192a3", "__AVR_ATxmega192A3__" }, 8982 { "atxmega192a3u", "__AVR_ATxmega192A3U__" }, 8983 { "atxmega192c3", "__AVR_ATxmega192C3__" }, 8984 { "atxmega192d3", "__AVR_ATxmega192D3__" }, 8985 { "atxmega256a3", "__AVR_ATxmega256A3__" }, 8986 { "atxmega256a3u", "__AVR_ATxmega256A3U__" }, 8987 { "atxmega256a3b", "__AVR_ATxmega256A3B__" }, 8988 { "atxmega256a3bu", "__AVR_ATxmega256A3BU__" }, 8989 { "atxmega256c3", "__AVR_ATxmega256C3__" }, 8990 { "atxmega256d3", "__AVR_ATxmega256D3__" }, 8991 { "atxmega384c3", "__AVR_ATxmega384C3__" }, 8992 { "atxmega384d3", "__AVR_ATxmega384D3__" }, 8993 { "atxmega128a1", "__AVR_ATxmega128A1__" }, 8994 { "atxmega128a1u", "__AVR_ATxmega128A1U__" }, 8995 { "atxmega128a4u", "__AVR_ATxmega128a4U__" }, 8996 { "attiny4", "__AVR_ATtiny4__" }, 8997 { "attiny5", "__AVR_ATtiny5__" }, 8998 { "attiny9", "__AVR_ATtiny9__" }, 8999 { "attiny10", "__AVR_ATtiny10__" }, 9000 { "attiny20", "__AVR_ATtiny20__" }, 9001 { "attiny40", "__AVR_ATtiny40__" }, 9002 { "attiny102", "__AVR_ATtiny102__" }, 9003 { "attiny104", "__AVR_ATtiny104__" }, 9004 }; 9005 9006 // AVR Target 9007 class AVRTargetInfo : public TargetInfo { 9008 public: 9009 AVRTargetInfo(const llvm::Triple &Triple, const TargetOptions &) 9010 : TargetInfo(Triple) { 9011 TLSSupported = false; 9012 PointerWidth = 16; 9013 PointerAlign = 8; 9014 IntWidth = 16; 9015 IntAlign = 8; 9016 LongWidth = 32; 9017 LongAlign = 8; 9018 LongLongWidth = 64; 9019 LongLongAlign = 8; 9020 SuitableAlign = 8; 9021 DefaultAlignForAttributeAligned = 8; 9022 HalfWidth = 16; 9023 HalfAlign = 8; 9024 FloatWidth = 32; 9025 FloatAlign = 8; 9026 DoubleWidth = 32; 9027 DoubleAlign = 8; 9028 DoubleFormat = &llvm::APFloat::IEEEsingle(); 9029 LongDoubleWidth = 32; 9030 LongDoubleAlign = 8; 9031 LongDoubleFormat = &llvm::APFloat::IEEEsingle(); 9032 SizeType = UnsignedInt; 9033 PtrDiffType = SignedInt; 9034 IntPtrType = SignedInt; 9035 Char16Type = UnsignedInt; 9036 WCharType = SignedInt; 9037 WIntType = SignedInt; 9038 Char32Type = UnsignedLong; 9039 SigAtomicType = SignedChar; 9040 resetDataLayout("e-p:16:16:16-i8:8:8-i16:16:16-i32:32:32-i64:64:64" 9041 "-f32:32:32-f64:64:64-n8"); 9042 } 9043 9044 void getTargetDefines(const LangOptions &Opts, 9045 MacroBuilder &Builder) const override { 9046 Builder.defineMacro("AVR"); 9047 Builder.defineMacro("__AVR"); 9048 Builder.defineMacro("__AVR__"); 9049 9050 if (!this->CPU.empty()) { 9051 auto It = std::find_if(AVRMcus.begin(), AVRMcus.end(), 9052 [&](const MCUInfo &Info) { return Info.Name == this->CPU; }); 9053 9054 if (It != AVRMcus.end()) 9055 Builder.defineMacro(It->DefineName); 9056 } 9057 } 9058 9059 ArrayRef<Builtin::Info> getTargetBuiltins() const override { 9060 return None; 9061 } 9062 9063 BuiltinVaListKind getBuiltinVaListKind() const override { 9064 return TargetInfo::VoidPtrBuiltinVaList; 9065 } 9066 9067 const char *getClobbers() const override { 9068 return ""; 9069 } 9070 9071 ArrayRef<const char *> getGCCRegNames() const override { 9072 static const char * const GCCRegNames[] = { 9073 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", 9074 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", 9075 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", 9076 "r24", "r25", "X", "Y", "Z", "SP" 9077 }; 9078 return llvm::makeArrayRef(GCCRegNames); 9079 } 9080 9081 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override { 9082 return None; 9083 } 9084 9085 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override { 9086 static const TargetInfo::AddlRegName AddlRegNames[] = { 9087 { { "r26", "r27"}, 26 }, 9088 { { "r28", "r29"}, 27 }, 9089 { { "r30", "r31"}, 28 }, 9090 { { "SPL", "SPH"}, 29 }, 9091 }; 9092 return llvm::makeArrayRef(AddlRegNames); 9093 } 9094 9095 bool validateAsmConstraint(const char *&Name, 9096 TargetInfo::ConstraintInfo &Info) const override { 9097 // There aren't any multi-character AVR specific constraints. 9098 if (StringRef(Name).size() > 1) return false; 9099 9100 switch (*Name) { 9101 default: return false; 9102 case 'a': // Simple upper registers 9103 case 'b': // Base pointer registers pairs 9104 case 'd': // Upper register 9105 case 'l': // Lower registers 9106 case 'e': // Pointer register pairs 9107 case 'q': // Stack pointer register 9108 case 'r': // Any register 9109 case 'w': // Special upper register pairs 9110 case 't': // Temporary register 9111 case 'x': case 'X': // Pointer register pair X 9112 case 'y': case 'Y': // Pointer register pair Y 9113 case 'z': case 'Z': // Pointer register pair Z 9114 Info.setAllowsRegister(); 9115 return true; 9116 case 'I': // 6-bit positive integer constant 9117 Info.setRequiresImmediate(0, 63); 9118 return true; 9119 case 'J': // 6-bit negative integer constant 9120 Info.setRequiresImmediate(-63, 0); 9121 return true; 9122 case 'K': // Integer constant (Range: 2) 9123 Info.setRequiresImmediate(2); 9124 return true; 9125 case 'L': // Integer constant (Range: 0) 9126 Info.setRequiresImmediate(0); 9127 return true; 9128 case 'M': // 8-bit integer constant 9129 Info.setRequiresImmediate(0, 0xff); 9130 return true; 9131 case 'N': // Integer constant (Range: -1) 9132 Info.setRequiresImmediate(-1); 9133 return true; 9134 case 'O': // Integer constant (Range: 8, 16, 24) 9135 Info.setRequiresImmediate({8, 16, 24}); 9136 return true; 9137 case 'P': // Integer constant (Range: 1) 9138 Info.setRequiresImmediate(1); 9139 return true; 9140 case 'R': // Integer constant (Range: -6 to 5) 9141 Info.setRequiresImmediate(-6, 5); 9142 return true; 9143 case 'G': // Floating point constant 9144 case 'Q': // A memory address based on Y or Z pointer with displacement. 9145 return true; 9146 } 9147 9148 return false; 9149 } 9150 9151 IntType getIntTypeByWidth(unsigned BitWidth, 9152 bool IsSigned) const final { 9153 // AVR prefers int for 16-bit integers. 9154 return BitWidth == 16 ? (IsSigned ? SignedInt : UnsignedInt) 9155 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned); 9156 } 9157 9158 IntType getLeastIntTypeByWidth(unsigned BitWidth, 9159 bool IsSigned) const final { 9160 // AVR uses int for int_least16_t and int_fast16_t. 9161 return BitWidth == 16 9162 ? (IsSigned ? SignedInt : UnsignedInt) 9163 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned); 9164 } 9165 9166 bool setCPU(const std::string &Name) override { 9167 bool IsFamily = llvm::StringSwitch<bool>(Name) 9168 .Case("avr1", true) 9169 .Case("avr2", true) 9170 .Case("avr25", true) 9171 .Case("avr3", true) 9172 .Case("avr31", true) 9173 .Case("avr35", true) 9174 .Case("avr4", true) 9175 .Case("avr5", true) 9176 .Case("avr51", true) 9177 .Case("avr6", true) 9178 .Case("avrxmega1", true) 9179 .Case("avrxmega2", true) 9180 .Case("avrxmega3", true) 9181 .Case("avrxmega4", true) 9182 .Case("avrxmega5", true) 9183 .Case("avrxmega6", true) 9184 .Case("avrxmega7", true) 9185 .Case("avrtiny", true) 9186 .Default(false); 9187 9188 if (IsFamily) this->CPU = Name; 9189 9190 bool IsMCU = std::find_if(AVRMcus.begin(), AVRMcus.end(), 9191 [&](const MCUInfo &Info) { return Info.Name == Name; }) != AVRMcus.end(); 9192 9193 if (IsMCU) this->CPU = Name; 9194 9195 return IsFamily || IsMCU; 9196 } 9197 9198 protected: 9199 std::string CPU; 9200 }; 9201 9202 } // end anonymous namespace 9203 9204 //===----------------------------------------------------------------------===// 9205 // Driver code 9206 //===----------------------------------------------------------------------===// 9207 9208 static TargetInfo *AllocateTarget(const llvm::Triple &Triple, 9209 const TargetOptions &Opts) { 9210 llvm::Triple::OSType os = Triple.getOS(); 9211 9212 switch (Triple.getArch()) { 9213 default: 9214 return nullptr; 9215 9216 case llvm::Triple::xcore: 9217 return new XCoreTargetInfo(Triple, Opts); 9218 9219 case llvm::Triple::hexagon: 9220 return new HexagonTargetInfo(Triple, Opts); 9221 9222 case llvm::Triple::lanai: 9223 return new LanaiTargetInfo(Triple, Opts); 9224 9225 case llvm::Triple::aarch64: 9226 if (Triple.isOSDarwin()) 9227 return new DarwinAArch64TargetInfo(Triple, Opts); 9228 9229 switch (os) { 9230 case llvm::Triple::CloudABI: 9231 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts); 9232 case llvm::Triple::FreeBSD: 9233 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts); 9234 case llvm::Triple::Fuchsia: 9235 return new FuchsiaTargetInfo<AArch64leTargetInfo>(Triple, Opts); 9236 case llvm::Triple::Linux: 9237 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts); 9238 case llvm::Triple::NetBSD: 9239 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts); 9240 case llvm::Triple::OpenBSD: 9241 return new OpenBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts); 9242 default: 9243 return new AArch64leTargetInfo(Triple, Opts); 9244 } 9245 9246 case llvm::Triple::aarch64_be: 9247 switch (os) { 9248 case llvm::Triple::FreeBSD: 9249 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts); 9250 case llvm::Triple::Fuchsia: 9251 return new FuchsiaTargetInfo<AArch64beTargetInfo>(Triple, Opts); 9252 case llvm::Triple::Linux: 9253 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts); 9254 case llvm::Triple::NetBSD: 9255 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts); 9256 default: 9257 return new AArch64beTargetInfo(Triple, Opts); 9258 } 9259 9260 case llvm::Triple::arm: 9261 case llvm::Triple::thumb: 9262 if (Triple.isOSBinFormatMachO()) 9263 return new DarwinARMTargetInfo(Triple, Opts); 9264 9265 switch (os) { 9266 case llvm::Triple::CloudABI: 9267 return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts); 9268 case llvm::Triple::Linux: 9269 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts); 9270 case llvm::Triple::FreeBSD: 9271 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts); 9272 case llvm::Triple::NetBSD: 9273 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts); 9274 case llvm::Triple::OpenBSD: 9275 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts); 9276 case llvm::Triple::Bitrig: 9277 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts); 9278 case llvm::Triple::RTEMS: 9279 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts); 9280 case llvm::Triple::NaCl: 9281 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts); 9282 case llvm::Triple::Win32: 9283 switch (Triple.getEnvironment()) { 9284 case llvm::Triple::Cygnus: 9285 return new CygwinARMTargetInfo(Triple, Opts); 9286 case llvm::Triple::GNU: 9287 return new MinGWARMTargetInfo(Triple, Opts); 9288 case llvm::Triple::Itanium: 9289 return new ItaniumWindowsARMleTargetInfo(Triple, Opts); 9290 case llvm::Triple::MSVC: 9291 default: // Assume MSVC for unknown environments 9292 return new MicrosoftARMleTargetInfo(Triple, Opts); 9293 } 9294 default: 9295 return new ARMleTargetInfo(Triple, Opts); 9296 } 9297 9298 case llvm::Triple::armeb: 9299 case llvm::Triple::thumbeb: 9300 if (Triple.isOSDarwin()) 9301 return new DarwinARMTargetInfo(Triple, Opts); 9302 9303 switch (os) { 9304 case llvm::Triple::Linux: 9305 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts); 9306 case llvm::Triple::FreeBSD: 9307 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts); 9308 case llvm::Triple::NetBSD: 9309 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts); 9310 case llvm::Triple::OpenBSD: 9311 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts); 9312 case llvm::Triple::Bitrig: 9313 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts); 9314 case llvm::Triple::RTEMS: 9315 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts); 9316 case llvm::Triple::NaCl: 9317 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts); 9318 default: 9319 return new ARMbeTargetInfo(Triple, Opts); 9320 } 9321 9322 case llvm::Triple::avr: 9323 return new AVRTargetInfo(Triple, Opts); 9324 case llvm::Triple::bpfeb: 9325 case llvm::Triple::bpfel: 9326 return new BPFTargetInfo(Triple, Opts); 9327 9328 case llvm::Triple::msp430: 9329 return new MSP430TargetInfo(Triple, Opts); 9330 9331 case llvm::Triple::mips: 9332 switch (os) { 9333 case llvm::Triple::Linux: 9334 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts); 9335 case llvm::Triple::RTEMS: 9336 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts); 9337 case llvm::Triple::FreeBSD: 9338 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts); 9339 case llvm::Triple::NetBSD: 9340 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts); 9341 default: 9342 return new MipsTargetInfo(Triple, Opts); 9343 } 9344 9345 case llvm::Triple::mipsel: 9346 switch (os) { 9347 case llvm::Triple::Linux: 9348 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts); 9349 case llvm::Triple::RTEMS: 9350 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts); 9351 case llvm::Triple::FreeBSD: 9352 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts); 9353 case llvm::Triple::NetBSD: 9354 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts); 9355 case llvm::Triple::NaCl: 9356 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts); 9357 default: 9358 return new MipsTargetInfo(Triple, Opts); 9359 } 9360 9361 case llvm::Triple::mips64: 9362 switch (os) { 9363 case llvm::Triple::Linux: 9364 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts); 9365 case llvm::Triple::RTEMS: 9366 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts); 9367 case llvm::Triple::FreeBSD: 9368 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts); 9369 case llvm::Triple::NetBSD: 9370 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts); 9371 case llvm::Triple::OpenBSD: 9372 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts); 9373 default: 9374 return new MipsTargetInfo(Triple, Opts); 9375 } 9376 9377 case llvm::Triple::mips64el: 9378 switch (os) { 9379 case llvm::Triple::Linux: 9380 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts); 9381 case llvm::Triple::RTEMS: 9382 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts); 9383 case llvm::Triple::FreeBSD: 9384 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts); 9385 case llvm::Triple::NetBSD: 9386 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts); 9387 case llvm::Triple::OpenBSD: 9388 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts); 9389 default: 9390 return new MipsTargetInfo(Triple, Opts); 9391 } 9392 9393 case llvm::Triple::le32: 9394 switch (os) { 9395 case llvm::Triple::NaCl: 9396 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts); 9397 default: 9398 return nullptr; 9399 } 9400 9401 case llvm::Triple::le64: 9402 return new Le64TargetInfo(Triple, Opts); 9403 9404 case llvm::Triple::ppc: 9405 if (Triple.isOSDarwin()) 9406 return new DarwinPPC32TargetInfo(Triple, Opts); 9407 switch (os) { 9408 case llvm::Triple::Linux: 9409 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts); 9410 case llvm::Triple::FreeBSD: 9411 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts); 9412 case llvm::Triple::NetBSD: 9413 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts); 9414 case llvm::Triple::OpenBSD: 9415 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts); 9416 case llvm::Triple::RTEMS: 9417 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts); 9418 default: 9419 return new PPC32TargetInfo(Triple, Opts); 9420 } 9421 9422 case llvm::Triple::ppc64: 9423 if (Triple.isOSDarwin()) 9424 return new DarwinPPC64TargetInfo(Triple, Opts); 9425 switch (os) { 9426 case llvm::Triple::Linux: 9427 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts); 9428 case llvm::Triple::Lv2: 9429 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts); 9430 case llvm::Triple::FreeBSD: 9431 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts); 9432 case llvm::Triple::NetBSD: 9433 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts); 9434 default: 9435 return new PPC64TargetInfo(Triple, Opts); 9436 } 9437 9438 case llvm::Triple::ppc64le: 9439 switch (os) { 9440 case llvm::Triple::Linux: 9441 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts); 9442 case llvm::Triple::NetBSD: 9443 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts); 9444 default: 9445 return new PPC64TargetInfo(Triple, Opts); 9446 } 9447 9448 case llvm::Triple::nvptx: 9449 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/32); 9450 case llvm::Triple::nvptx64: 9451 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/64); 9452 9453 case llvm::Triple::amdgcn: 9454 case llvm::Triple::r600: 9455 return new AMDGPUTargetInfo(Triple, Opts); 9456 9457 case llvm::Triple::sparc: 9458 switch (os) { 9459 case llvm::Triple::Linux: 9460 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts); 9461 case llvm::Triple::Solaris: 9462 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts); 9463 case llvm::Triple::NetBSD: 9464 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts); 9465 case llvm::Triple::OpenBSD: 9466 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts); 9467 case llvm::Triple::RTEMS: 9468 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts); 9469 default: 9470 return new SparcV8TargetInfo(Triple, Opts); 9471 } 9472 9473 // The 'sparcel' architecture copies all the above cases except for Solaris. 9474 case llvm::Triple::sparcel: 9475 switch (os) { 9476 case llvm::Triple::Linux: 9477 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts); 9478 case llvm::Triple::NetBSD: 9479 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts); 9480 case llvm::Triple::OpenBSD: 9481 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts); 9482 case llvm::Triple::RTEMS: 9483 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts); 9484 default: 9485 return new SparcV8elTargetInfo(Triple, Opts); 9486 } 9487 9488 case llvm::Triple::sparcv9: 9489 switch (os) { 9490 case llvm::Triple::Linux: 9491 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts); 9492 case llvm::Triple::Solaris: 9493 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts); 9494 case llvm::Triple::NetBSD: 9495 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts); 9496 case llvm::Triple::OpenBSD: 9497 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts); 9498 case llvm::Triple::FreeBSD: 9499 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts); 9500 default: 9501 return new SparcV9TargetInfo(Triple, Opts); 9502 } 9503 9504 case llvm::Triple::systemz: 9505 switch (os) { 9506 case llvm::Triple::Linux: 9507 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts); 9508 default: 9509 return new SystemZTargetInfo(Triple, Opts); 9510 } 9511 9512 case llvm::Triple::tce: 9513 return new TCETargetInfo(Triple, Opts); 9514 9515 case llvm::Triple::tcele: 9516 return new TCELETargetInfo(Triple, Opts); 9517 9518 case llvm::Triple::x86: 9519 if (Triple.isOSDarwin()) 9520 return new DarwinI386TargetInfo(Triple, Opts); 9521 9522 switch (os) { 9523 case llvm::Triple::CloudABI: 9524 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts); 9525 case llvm::Triple::Linux: { 9526 switch (Triple.getEnvironment()) { 9527 default: 9528 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts); 9529 case llvm::Triple::Android: 9530 return new AndroidX86_32TargetInfo(Triple, Opts); 9531 } 9532 } 9533 case llvm::Triple::DragonFly: 9534 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts); 9535 case llvm::Triple::NetBSD: 9536 return new NetBSDI386TargetInfo(Triple, Opts); 9537 case llvm::Triple::OpenBSD: 9538 return new OpenBSDI386TargetInfo(Triple, Opts); 9539 case llvm::Triple::Bitrig: 9540 return new BitrigI386TargetInfo(Triple, Opts); 9541 case llvm::Triple::FreeBSD: 9542 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts); 9543 case llvm::Triple::KFreeBSD: 9544 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts); 9545 case llvm::Triple::Minix: 9546 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts); 9547 case llvm::Triple::Solaris: 9548 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts); 9549 case llvm::Triple::Win32: { 9550 switch (Triple.getEnvironment()) { 9551 case llvm::Triple::Cygnus: 9552 return new CygwinX86_32TargetInfo(Triple, Opts); 9553 case llvm::Triple::GNU: 9554 return new MinGWX86_32TargetInfo(Triple, Opts); 9555 case llvm::Triple::Itanium: 9556 case llvm::Triple::MSVC: 9557 default: // Assume MSVC for unknown environments 9558 return new MicrosoftX86_32TargetInfo(Triple, Opts); 9559 } 9560 } 9561 case llvm::Triple::Haiku: 9562 return new HaikuX86_32TargetInfo(Triple, Opts); 9563 case llvm::Triple::RTEMS: 9564 return new RTEMSX86_32TargetInfo(Triple, Opts); 9565 case llvm::Triple::NaCl: 9566 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts); 9567 case llvm::Triple::ELFIAMCU: 9568 return new MCUX86_32TargetInfo(Triple, Opts); 9569 default: 9570 return new X86_32TargetInfo(Triple, Opts); 9571 } 9572 9573 case llvm::Triple::x86_64: 9574 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO()) 9575 return new DarwinX86_64TargetInfo(Triple, Opts); 9576 9577 switch (os) { 9578 case llvm::Triple::CloudABI: 9579 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts); 9580 case llvm::Triple::Linux: { 9581 switch (Triple.getEnvironment()) { 9582 default: 9583 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts); 9584 case llvm::Triple::Android: 9585 return new AndroidX86_64TargetInfo(Triple, Opts); 9586 } 9587 } 9588 case llvm::Triple::DragonFly: 9589 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts); 9590 case llvm::Triple::NetBSD: 9591 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts); 9592 case llvm::Triple::OpenBSD: 9593 return new OpenBSDX86_64TargetInfo(Triple, Opts); 9594 case llvm::Triple::Bitrig: 9595 return new BitrigX86_64TargetInfo(Triple, Opts); 9596 case llvm::Triple::FreeBSD: 9597 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts); 9598 case llvm::Triple::Fuchsia: 9599 return new FuchsiaTargetInfo<X86_64TargetInfo>(Triple, Opts); 9600 case llvm::Triple::KFreeBSD: 9601 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts); 9602 case llvm::Triple::Solaris: 9603 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts); 9604 case llvm::Triple::Win32: { 9605 switch (Triple.getEnvironment()) { 9606 case llvm::Triple::Cygnus: 9607 return new CygwinX86_64TargetInfo(Triple, Opts); 9608 case llvm::Triple::GNU: 9609 return new MinGWX86_64TargetInfo(Triple, Opts); 9610 case llvm::Triple::MSVC: 9611 default: // Assume MSVC for unknown environments 9612 return new MicrosoftX86_64TargetInfo(Triple, Opts); 9613 } 9614 } 9615 case llvm::Triple::Haiku: 9616 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts); 9617 case llvm::Triple::NaCl: 9618 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts); 9619 case llvm::Triple::PS4: 9620 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts); 9621 default: 9622 return new X86_64TargetInfo(Triple, Opts); 9623 } 9624 9625 case llvm::Triple::spir: { 9626 if (Triple.getOS() != llvm::Triple::UnknownOS || 9627 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment) 9628 return nullptr; 9629 return new SPIR32TargetInfo(Triple, Opts); 9630 } 9631 case llvm::Triple::spir64: { 9632 if (Triple.getOS() != llvm::Triple::UnknownOS || 9633 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment) 9634 return nullptr; 9635 return new SPIR64TargetInfo(Triple, Opts); 9636 } 9637 case llvm::Triple::wasm32: 9638 if (Triple.getSubArch() != llvm::Triple::NoSubArch || 9639 Triple.getVendor() != llvm::Triple::UnknownVendor || 9640 Triple.getOS() != llvm::Triple::UnknownOS || 9641 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment || 9642 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm())) 9643 return nullptr; 9644 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts); 9645 case llvm::Triple::wasm64: 9646 if (Triple.getSubArch() != llvm::Triple::NoSubArch || 9647 Triple.getVendor() != llvm::Triple::UnknownVendor || 9648 Triple.getOS() != llvm::Triple::UnknownOS || 9649 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment || 9650 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm())) 9651 return nullptr; 9652 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts); 9653 9654 case llvm::Triple::renderscript32: 9655 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts); 9656 case llvm::Triple::renderscript64: 9657 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts); 9658 } 9659 } 9660 9661 /// CreateTargetInfo - Return the target info object for the specified target 9662 /// options. 9663 TargetInfo * 9664 TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags, 9665 const std::shared_ptr<TargetOptions> &Opts) { 9666 llvm::Triple Triple(Opts->Triple); 9667 9668 // Construct the target 9669 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts)); 9670 if (!Target) { 9671 Diags.Report(diag::err_target_unknown_triple) << Triple.str(); 9672 return nullptr; 9673 } 9674 Target->TargetOpts = Opts; 9675 9676 // Set the target CPU if specified. 9677 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) { 9678 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU; 9679 return nullptr; 9680 } 9681 9682 // Set the target ABI if specified. 9683 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) { 9684 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI; 9685 return nullptr; 9686 } 9687 9688 // Set the fp math unit. 9689 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) { 9690 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath; 9691 return nullptr; 9692 } 9693 9694 // Compute the default target features, we need the target to handle this 9695 // because features may have dependencies on one another. 9696 llvm::StringMap<bool> Features; 9697 if (!Target->initFeatureMap(Features, Diags, Opts->CPU, 9698 Opts->FeaturesAsWritten)) 9699 return nullptr; 9700 9701 // Add the features to the compile options. 9702 Opts->Features.clear(); 9703 for (const auto &F : Features) 9704 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str()); 9705 9706 if (!Target->handleTargetFeatures(Opts->Features, Diags)) 9707 return nullptr; 9708 9709 Target->setSupportedOpenCLOpts(); 9710 Target->setOpenCLExtensionOpts(); 9711 9712 if (!Target->validateTarget(Diags)) 9713 return nullptr; 9714 9715 return Target.release(); 9716 } 9717