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