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