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