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