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