1 //===-- llvm/TargetParser/Triple.h - Target triple helper class--*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLVM_TARGETPARSER_TRIPLE_H 10 #define LLVM_TARGETPARSER_TRIPLE_H 11 12 #include "llvm/ADT/Twine.h" 13 #include "llvm/Support/VersionTuple.h" 14 15 // Some system headers or GCC predefined macros conflict with identifiers in 16 // this file. Undefine them here. 17 #undef NetBSD 18 #undef mips 19 #undef sparc 20 21 namespace llvm { 22 23 /// Triple - Helper class for working with autoconf configuration names. For 24 /// historical reasons, we also call these 'triples' (they used to contain 25 /// exactly three fields). 26 /// 27 /// Configuration names are strings in the canonical form: 28 /// ARCHITECTURE-VENDOR-OPERATING_SYSTEM 29 /// or 30 /// ARCHITECTURE-VENDOR-OPERATING_SYSTEM-ENVIRONMENT 31 /// 32 /// This class is used for clients which want to support arbitrary 33 /// configuration names, but also want to implement certain special 34 /// behavior for particular configurations. This class isolates the mapping 35 /// from the components of the configuration name to well known IDs. 36 /// 37 /// At its core the Triple class is designed to be a wrapper for a triple 38 /// string; the constructor does not change or normalize the triple string. 39 /// Clients that need to handle the non-canonical triples that users often 40 /// specify should use the normalize method. 41 /// 42 /// See autoconf/config.guess for a glimpse into what configuration names 43 /// look like in practice. 44 class Triple { 45 public: 46 enum ArchType { 47 UnknownArch, 48 49 arm, // ARM (little endian): arm, armv.*, xscale 50 armeb, // ARM (big endian): armeb 51 aarch64, // AArch64 (little endian): aarch64 52 aarch64_be, // AArch64 (big endian): aarch64_be 53 aarch64_32, // AArch64 (little endian) ILP32: aarch64_32 54 arc, // ARC: Synopsys ARC 55 avr, // AVR: Atmel AVR microcontroller 56 bpfel, // eBPF or extended BPF or 64-bit BPF (little endian) 57 bpfeb, // eBPF or extended BPF or 64-bit BPF (big endian) 58 csky, // CSKY: csky 59 dxil, // DXIL 32-bit DirectX bytecode 60 hexagon, // Hexagon: hexagon 61 loongarch32, // LoongArch (32-bit): loongarch32 62 loongarch64, // LoongArch (64-bit): loongarch64 63 m68k, // M68k: Motorola 680x0 family 64 mips, // MIPS: mips, mipsallegrex, mipsr6 65 mipsel, // MIPSEL: mipsel, mipsallegrexe, mipsr6el 66 mips64, // MIPS64: mips64, mips64r6, mipsn32, mipsn32r6 67 mips64el, // MIPS64EL: mips64el, mips64r6el, mipsn32el, mipsn32r6el 68 msp430, // MSP430: msp430 69 ppc, // PPC: powerpc 70 ppcle, // PPCLE: powerpc (little endian) 71 ppc64, // PPC64: powerpc64, ppu 72 ppc64le, // PPC64LE: powerpc64le 73 r600, // R600: AMD GPUs HD2XXX - HD6XXX 74 amdgcn, // AMDGCN: AMD GCN GPUs 75 riscv32, // RISC-V (32-bit): riscv32 76 riscv64, // RISC-V (64-bit): riscv64 77 sparc, // Sparc: sparc 78 sparcv9, // Sparcv9: Sparcv9 79 sparcel, // Sparc: (endianness = little). NB: 'Sparcle' is a CPU variant 80 systemz, // SystemZ: s390x 81 tce, // TCE (http://tce.cs.tut.fi/): tce 82 tcele, // TCE little endian (http://tce.cs.tut.fi/): tcele 83 thumb, // Thumb (little endian): thumb, thumbv.* 84 thumbeb, // Thumb (big endian): thumbeb 85 x86, // X86: i[3-9]86 86 x86_64, // X86-64: amd64, x86_64 87 xcore, // XCore: xcore 88 xtensa, // Tensilica: Xtensa 89 nvptx, // NVPTX: 32-bit 90 nvptx64, // NVPTX: 64-bit 91 amdil, // AMDIL 92 amdil64, // AMDIL with 64-bit pointers 93 hsail, // AMD HSAIL 94 hsail64, // AMD HSAIL with 64-bit pointers 95 spir, // SPIR: standard portable IR for OpenCL 32-bit version 96 spir64, // SPIR: standard portable IR for OpenCL 64-bit version 97 spirv, // SPIR-V with logical memory layout. 98 spirv32, // SPIR-V with 32-bit pointers 99 spirv64, // SPIR-V with 64-bit pointers 100 kalimba, // Kalimba: generic kalimba 101 shave, // SHAVE: Movidius vector VLIW processors 102 lanai, // Lanai: Lanai 32-bit 103 wasm32, // WebAssembly with 32-bit pointers 104 wasm64, // WebAssembly with 64-bit pointers 105 renderscript32, // 32-bit RenderScript 106 renderscript64, // 64-bit RenderScript 107 ve, // NEC SX-Aurora Vector Engine 108 LastArchType = ve 109 }; 110 enum SubArchType { 111 NoSubArch, 112 113 ARMSubArch_v9_6a, 114 ARMSubArch_v9_5a, 115 ARMSubArch_v9_4a, 116 ARMSubArch_v9_3a, 117 ARMSubArch_v9_2a, 118 ARMSubArch_v9_1a, 119 ARMSubArch_v9, 120 ARMSubArch_v8_9a, 121 ARMSubArch_v8_8a, 122 ARMSubArch_v8_7a, 123 ARMSubArch_v8_6a, 124 ARMSubArch_v8_5a, 125 ARMSubArch_v8_4a, 126 ARMSubArch_v8_3a, 127 ARMSubArch_v8_2a, 128 ARMSubArch_v8_1a, 129 ARMSubArch_v8, 130 ARMSubArch_v8r, 131 ARMSubArch_v8m_baseline, 132 ARMSubArch_v8m_mainline, 133 ARMSubArch_v8_1m_mainline, 134 ARMSubArch_v7, 135 ARMSubArch_v7em, 136 ARMSubArch_v7m, 137 ARMSubArch_v7s, 138 ARMSubArch_v7k, 139 ARMSubArch_v7ve, 140 ARMSubArch_v6, 141 ARMSubArch_v6m, 142 ARMSubArch_v6k, 143 ARMSubArch_v6t2, 144 ARMSubArch_v5, 145 ARMSubArch_v5te, 146 ARMSubArch_v4t, 147 148 AArch64SubArch_arm64e, 149 AArch64SubArch_arm64ec, 150 151 KalimbaSubArch_v3, 152 KalimbaSubArch_v4, 153 KalimbaSubArch_v5, 154 155 MipsSubArch_r6, 156 157 PPCSubArch_spe, 158 159 // SPIR-V sub-arch corresponds to its version. 160 SPIRVSubArch_v10, 161 SPIRVSubArch_v11, 162 SPIRVSubArch_v12, 163 SPIRVSubArch_v13, 164 SPIRVSubArch_v14, 165 SPIRVSubArch_v15, 166 SPIRVSubArch_v16, 167 168 // DXIL sub-arch corresponds to its version. 169 DXILSubArch_v1_0, 170 DXILSubArch_v1_1, 171 DXILSubArch_v1_2, 172 DXILSubArch_v1_3, 173 DXILSubArch_v1_4, 174 DXILSubArch_v1_5, 175 DXILSubArch_v1_6, 176 DXILSubArch_v1_7, 177 DXILSubArch_v1_8, 178 LatestDXILSubArch = DXILSubArch_v1_8, 179 }; 180 enum VendorType { 181 UnknownVendor, 182 183 Apple, 184 PC, 185 SCEI, 186 Freescale, 187 IBM, 188 ImaginationTechnologies, 189 MipsTechnologies, 190 NVIDIA, 191 CSR, 192 AMD, 193 Mesa, 194 SUSE, 195 OpenEmbedded, 196 Intel, 197 LastVendorType = Intel 198 }; 199 enum OSType { 200 UnknownOS, 201 202 Darwin, 203 DragonFly, 204 FreeBSD, 205 Fuchsia, 206 IOS, 207 KFreeBSD, 208 Linux, 209 Lv2, // PS3 210 MacOSX, 211 NetBSD, 212 OpenBSD, 213 Solaris, 214 UEFI, 215 Win32, 216 ZOS, 217 Haiku, 218 RTEMS, 219 NaCl, // Native Client 220 AIX, 221 CUDA, // NVIDIA CUDA 222 NVCL, // NVIDIA OpenCL 223 AMDHSA, // AMD HSA Runtime 224 PS4, 225 PS5, 226 ELFIAMCU, 227 TvOS, // Apple tvOS 228 WatchOS, // Apple watchOS 229 BridgeOS, // Apple bridgeOS 230 DriverKit, // Apple DriverKit 231 XROS, // Apple XROS 232 Mesa3D, 233 AMDPAL, // AMD PAL Runtime 234 HermitCore, // HermitCore Unikernel/Multikernel 235 Hurd, // GNU/Hurd 236 WASI, // Experimental WebAssembly OS 237 Emscripten, 238 ShaderModel, // DirectX ShaderModel 239 LiteOS, 240 Serenity, 241 Vulkan, // Vulkan SPIR-V 242 LastOSType = Vulkan 243 }; 244 enum EnvironmentType { 245 UnknownEnvironment, 246 247 GNU, 248 GNUT64, 249 GNUABIN32, 250 GNUABI64, 251 GNUEABI, 252 GNUEABIT64, 253 GNUEABIHF, 254 GNUEABIHFT64, 255 GNUF32, 256 GNUF64, 257 GNUSF, 258 GNUX32, 259 GNUILP32, 260 CODE16, 261 EABI, 262 EABIHF, 263 Android, 264 Musl, 265 MuslABIN32, 266 MuslABI64, 267 MuslEABI, 268 MuslEABIHF, 269 MuslF32, 270 MuslSF, 271 MuslX32, 272 LLVM, 273 274 MSVC, 275 Itanium, 276 Cygnus, 277 CoreCLR, 278 Simulator, // Simulator variants of other systems, e.g., Apple's iOS 279 MacABI, // Mac Catalyst variant of Apple's iOS deployment target. 280 281 // Shader Stages 282 // The order of these values matters, and must be kept in sync with the 283 // language options enum in Clang. The ordering is enforced in 284 // static_asserts in Triple.cpp and in Clang. 285 Pixel, 286 Vertex, 287 Geometry, 288 Hull, 289 Domain, 290 Compute, 291 Library, 292 RayGeneration, 293 Intersection, 294 AnyHit, 295 ClosestHit, 296 Miss, 297 Callable, 298 Mesh, 299 Amplification, 300 OpenCL, 301 OpenHOS, 302 303 PAuthTest, 304 305 LastEnvironmentType = PAuthTest 306 }; 307 enum ObjectFormatType { 308 UnknownObjectFormat, 309 310 COFF, 311 DXContainer, 312 ELF, 313 GOFF, 314 MachO, 315 SPIRV, 316 Wasm, 317 XCOFF, 318 }; 319 320 private: 321 std::string Data; 322 323 /// The parsed arch type. 324 ArchType Arch{}; 325 326 /// The parsed subarchitecture type. 327 SubArchType SubArch{}; 328 329 /// The parsed vendor type. 330 VendorType Vendor{}; 331 332 /// The parsed OS type. 333 OSType OS{}; 334 335 /// The parsed Environment type. 336 EnvironmentType Environment{}; 337 338 /// The object format type. 339 ObjectFormatType ObjectFormat{}; 340 341 public: 342 /// @name Constructors 343 /// @{ 344 345 /// Default constructor is the same as an empty string and leaves all 346 /// triple fields unknown. 347 Triple() = default; 348 349 explicit Triple(const Twine &Str); 350 Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr); 351 Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr, 352 const Twine &EnvironmentStr); 353 354 bool operator==(const Triple &Other) const { 355 return Arch == Other.Arch && SubArch == Other.SubArch && 356 Vendor == Other.Vendor && OS == Other.OS && 357 Environment == Other.Environment && 358 ObjectFormat == Other.ObjectFormat; 359 } 360 361 bool operator!=(const Triple &Other) const { 362 return !(*this == Other); 363 } 364 365 /// @} 366 /// @name Normalization 367 /// @{ 368 369 /// Canonical form 370 enum class CanonicalForm { 371 ANY = 0, 372 THREE_IDENT = 3, // ARCHITECTURE-VENDOR-OPERATING_SYSTEM 373 FOUR_IDENT = 4, // ARCHITECTURE-VENDOR-OPERATING_SYSTEM-ENVIRONMENT 374 FIVE_IDENT = 5, // ARCHITECTURE-VENDOR-OPERATING_SYSTEM-ENVIRONMENT-FORMAT 375 }; 376 377 /// Turn an arbitrary machine specification into the canonical triple form (or 378 /// something sensible that the Triple class understands if nothing better can 379 /// reasonably be done). In particular, it handles the common case in which 380 /// otherwise valid components are in the wrong order. \p Form is used to 381 /// specify the output canonical form. 382 static std::string normalize(StringRef Str, 383 CanonicalForm Form = CanonicalForm::ANY); 384 385 /// Return the normalized form of this triple's string. 386 std::string normalize(CanonicalForm Form = CanonicalForm::ANY) const { 387 return normalize(Data, Form); 388 } 389 390 /// @} 391 /// @name Typed Component Access 392 /// @{ 393 394 /// Get the parsed architecture type of this triple. 395 ArchType getArch() const { return Arch; } 396 397 /// get the parsed subarchitecture type for this triple. 398 SubArchType getSubArch() const { return SubArch; } 399 400 /// Get the parsed vendor type of this triple. 401 VendorType getVendor() const { return Vendor; } 402 403 /// Get the parsed operating system type of this triple. 404 OSType getOS() const { return OS; } 405 406 /// Does this triple have the optional environment (fourth) component? 407 bool hasEnvironment() const { 408 return getEnvironmentName() != ""; 409 } 410 411 /// Get the parsed environment type of this triple. 412 EnvironmentType getEnvironment() const { return Environment; } 413 414 /// Parse the version number from the OS name component of the 415 /// triple, if present. 416 /// 417 /// For example, "fooos1.2.3" would return (1, 2, 3). 418 VersionTuple getEnvironmentVersion() const; 419 420 /// Get the object format for this triple. 421 ObjectFormatType getObjectFormat() const { return ObjectFormat; } 422 423 /// Parse the version number from the OS name component of the triple, if 424 /// present. 425 /// 426 /// For example, "fooos1.2.3" would return (1, 2, 3). 427 VersionTuple getOSVersion() const; 428 429 /// Return just the major version number, this is specialized because it is a 430 /// common query. 431 unsigned getOSMajorVersion() const { return getOSVersion().getMajor(); } 432 433 /// Parse the version number as with getOSVersion and then translate generic 434 /// "darwin" versions to the corresponding OS X versions. This may also be 435 /// called with IOS triples but the OS X version number is just set to a 436 /// constant 10.4.0 in that case. Returns true if successful. 437 bool getMacOSXVersion(VersionTuple &Version) const; 438 439 /// Parse the version number as with getOSVersion. This should only be called 440 /// with IOS or generic triples. 441 VersionTuple getiOSVersion() const; 442 443 /// Parse the version number as with getOSVersion. This should only be called 444 /// with WatchOS or generic triples. 445 VersionTuple getWatchOSVersion() const; 446 447 /// Parse the version number as with getOSVersion. 448 VersionTuple getDriverKitVersion() const; 449 450 /// Parse the Vulkan version number from the OSVersion and SPIR-V version 451 /// (SubArch). This should only be called with Vulkan SPIR-V triples. 452 VersionTuple getVulkanVersion() const; 453 454 /// Parse the DXIL version number from the OSVersion and DXIL version 455 /// (SubArch). This should only be called with DXIL triples. 456 VersionTuple getDXILVersion() const; 457 458 /// @} 459 /// @name Direct Component Access 460 /// @{ 461 462 const std::string &str() const { return Data; } 463 464 const std::string &getTriple() const { return Data; } 465 466 /// Get the architecture (first) component of the triple. 467 StringRef getArchName() const; 468 469 /// Get the vendor (second) component of the triple. 470 StringRef getVendorName() const; 471 472 /// Get the operating system (third) component of the triple. 473 StringRef getOSName() const; 474 475 /// Get the optional environment (fourth) component of the triple, or "" if 476 /// empty. 477 StringRef getEnvironmentName() const; 478 479 /// Get the operating system and optional environment components as a single 480 /// string (separated by a '-' if the environment component is present). 481 StringRef getOSAndEnvironmentName() const; 482 483 /// Get the version component of the environment component as a single 484 /// string (the version after the environment). 485 /// 486 /// For example, "fooos1.2.3" would return "1.2.3". 487 StringRef getEnvironmentVersionString() const; 488 489 /// @} 490 /// @name Convenience Predicates 491 /// @{ 492 493 /// Returns the pointer width of this architecture. 494 static unsigned getArchPointerBitWidth(llvm::Triple::ArchType Arch); 495 496 /// Returns the pointer width of this architecture. 497 unsigned getArchPointerBitWidth() const { 498 return getArchPointerBitWidth(getArch()); 499 } 500 501 /// Returns the trampoline size in bytes for this configuration. 502 unsigned getTrampolineSize() const; 503 504 /// Test whether the architecture is 64-bit 505 /// 506 /// Note that this tests for 64-bit pointer width, and nothing else. Note 507 /// that we intentionally expose only three predicates, 64-bit, 32-bit, and 508 /// 16-bit. The inner details of pointer width for particular architectures 509 /// is not summed up in the triple, and so only a coarse grained predicate 510 /// system is provided. 511 bool isArch64Bit() const; 512 513 /// Test whether the architecture is 32-bit 514 /// 515 /// Note that this tests for 32-bit pointer width, and nothing else. 516 bool isArch32Bit() const; 517 518 /// Test whether the architecture is 16-bit 519 /// 520 /// Note that this tests for 16-bit pointer width, and nothing else. 521 bool isArch16Bit() const; 522 523 /// Helper function for doing comparisons against version numbers included in 524 /// the target triple. 525 bool isOSVersionLT(unsigned Major, unsigned Minor = 0, 526 unsigned Micro = 0) const { 527 if (Minor == 0) { 528 return getOSVersion() < VersionTuple(Major); 529 } 530 if (Micro == 0) { 531 return getOSVersion() < VersionTuple(Major, Minor); 532 } 533 return getOSVersion() < VersionTuple(Major, Minor, Micro); 534 } 535 536 bool isOSVersionLT(const Triple &Other) const { 537 return getOSVersion() < Other.getOSVersion(); 538 } 539 540 /// Comparison function for checking OS X version compatibility, which handles 541 /// supporting skewed version numbering schemes used by the "darwin" triples. 542 bool isMacOSXVersionLT(unsigned Major, unsigned Minor = 0, 543 unsigned Micro = 0) const; 544 545 /// Is this a Mac OS X triple. For legacy reasons, we support both "darwin" 546 /// and "osx" as OS X triples. 547 bool isMacOSX() const { 548 return getOS() == Triple::Darwin || getOS() == Triple::MacOSX; 549 } 550 551 /// Is this an iOS triple. 552 /// Note: This identifies tvOS as a variant of iOS. If that ever 553 /// changes, i.e., if the two operating systems diverge or their version 554 /// numbers get out of sync, that will need to be changed. 555 /// watchOS has completely different version numbers so it is not included. 556 bool isiOS() const { 557 return getOS() == Triple::IOS || isTvOS(); 558 } 559 560 /// Is this an Apple tvOS triple. 561 bool isTvOS() const { 562 return getOS() == Triple::TvOS; 563 } 564 565 /// Is this an Apple watchOS triple. 566 bool isWatchOS() const { 567 return getOS() == Triple::WatchOS; 568 } 569 570 bool isWatchABI() const { 571 return getSubArch() == Triple::ARMSubArch_v7k; 572 } 573 574 /// Is this an Apple XROS triple. 575 bool isXROS() const { return getOS() == Triple::XROS; } 576 577 /// Is this an Apple DriverKit triple. 578 bool isDriverKit() const { return getOS() == Triple::DriverKit; } 579 580 bool isOSzOS() const { return getOS() == Triple::ZOS; } 581 582 /// Is this an Apple MachO triple. 583 bool isAppleMachO() const { 584 return (getVendor() == Triple::Apple) && isOSBinFormatMachO(); 585 } 586 587 /// Is this a "Darwin" OS (macOS, iOS, tvOS, watchOS, XROS, or DriverKit). 588 bool isOSDarwin() const { 589 return isMacOSX() || isiOS() || isWatchOS() || isDriverKit() || isXROS(); 590 } 591 592 bool isSimulatorEnvironment() const { 593 return getEnvironment() == Triple::Simulator; 594 } 595 596 bool isMacCatalystEnvironment() const { 597 return getEnvironment() == Triple::MacABI; 598 } 599 600 /// Returns true for targets that run on a macOS machine. 601 bool isTargetMachineMac() const { 602 return isMacOSX() || (isOSDarwin() && (isSimulatorEnvironment() || 603 isMacCatalystEnvironment())); 604 } 605 606 bool isOSNetBSD() const { 607 return getOS() == Triple::NetBSD; 608 } 609 610 bool isOSOpenBSD() const { 611 return getOS() == Triple::OpenBSD; 612 } 613 614 bool isOSFreeBSD() const { 615 return getOS() == Triple::FreeBSD; 616 } 617 618 bool isOSFuchsia() const { 619 return getOS() == Triple::Fuchsia; 620 } 621 622 bool isOSDragonFly() const { return getOS() == Triple::DragonFly; } 623 624 bool isOSSolaris() const { 625 return getOS() == Triple::Solaris; 626 } 627 628 bool isOSIAMCU() const { 629 return getOS() == Triple::ELFIAMCU; 630 } 631 632 bool isOSUnknown() const { return getOS() == Triple::UnknownOS; } 633 634 bool isGNUEnvironment() const { 635 EnvironmentType Env = getEnvironment(); 636 return Env == Triple::GNU || Env == Triple::GNUT64 || 637 Env == Triple::GNUABIN32 || Env == Triple::GNUABI64 || 638 Env == Triple::GNUEABI || Env == Triple::GNUEABIT64 || 639 Env == Triple::GNUEABIHF || Env == Triple::GNUEABIHFT64 || 640 Env == Triple::GNUF32 || Env == Triple::GNUF64 || 641 Env == Triple::GNUSF || Env == Triple::GNUX32; 642 } 643 644 /// Tests whether the OS is Haiku. 645 bool isOSHaiku() const { 646 return getOS() == Triple::Haiku; 647 } 648 649 /// Tests whether the OS is UEFI. 650 bool isUEFI() const { 651 return getOS() == Triple::UEFI; 652 } 653 654 /// Tests whether the OS is Windows. 655 bool isOSWindows() const { 656 return getOS() == Triple::Win32; 657 } 658 659 /// Tests whether the OS is Windows or UEFI. 660 bool isOSWindowsOrUEFI() const { return isOSWindows() || isUEFI(); } 661 662 /// Checks if the environment is MSVC. 663 bool isKnownWindowsMSVCEnvironment() const { 664 return isOSWindows() && getEnvironment() == Triple::MSVC; 665 } 666 667 /// Checks if the environment could be MSVC. 668 bool isWindowsMSVCEnvironment() const { 669 return isKnownWindowsMSVCEnvironment() || 670 (isOSWindows() && getEnvironment() == Triple::UnknownEnvironment); 671 } 672 673 // Checks if we're using the Windows Arm64EC ABI. 674 bool isWindowsArm64EC() const { 675 return getArch() == Triple::aarch64 && 676 getSubArch() == Triple::AArch64SubArch_arm64ec; 677 } 678 679 bool isWindowsCoreCLREnvironment() const { 680 return isOSWindows() && getEnvironment() == Triple::CoreCLR; 681 } 682 683 bool isWindowsItaniumEnvironment() const { 684 return isOSWindows() && getEnvironment() == Triple::Itanium; 685 } 686 687 bool isWindowsCygwinEnvironment() const { 688 return isOSWindows() && getEnvironment() == Triple::Cygnus; 689 } 690 691 bool isWindowsGNUEnvironment() const { 692 return isOSWindows() && getEnvironment() == Triple::GNU; 693 } 694 695 /// Tests for either Cygwin or MinGW OS 696 bool isOSCygMing() const { 697 return isWindowsCygwinEnvironment() || isWindowsGNUEnvironment(); 698 } 699 700 /// Is this a "Windows" OS targeting a "MSVCRT.dll" environment. 701 bool isOSMSVCRT() const { 702 return isWindowsMSVCEnvironment() || isWindowsGNUEnvironment() || 703 isWindowsItaniumEnvironment(); 704 } 705 706 /// Tests whether the OS is NaCl (Native Client) 707 bool isOSNaCl() const { 708 return getOS() == Triple::NaCl; 709 } 710 711 /// Tests whether the OS is Linux. 712 bool isOSLinux() const { 713 return getOS() == Triple::Linux; 714 } 715 716 /// Tests whether the OS is kFreeBSD. 717 bool isOSKFreeBSD() const { 718 return getOS() == Triple::KFreeBSD; 719 } 720 721 /// Tests whether the OS is Hurd. 722 bool isOSHurd() const { 723 return getOS() == Triple::Hurd; 724 } 725 726 /// Tests whether the OS is WASI. 727 bool isOSWASI() const { 728 return getOS() == Triple::WASI; 729 } 730 731 /// Tests whether the OS is Emscripten. 732 bool isOSEmscripten() const { 733 return getOS() == Triple::Emscripten; 734 } 735 736 /// Tests whether the OS uses glibc. 737 bool isOSGlibc() const { 738 return (getOS() == Triple::Linux || getOS() == Triple::KFreeBSD || 739 getOS() == Triple::Hurd) && 740 !isAndroid(); 741 } 742 743 /// Tests whether the OS is AIX. 744 bool isOSAIX() const { 745 return getOS() == Triple::AIX; 746 } 747 748 bool isOSSerenity() const { 749 return getOS() == Triple::Serenity; 750 } 751 752 /// Tests whether the OS uses the ELF binary format. 753 bool isOSBinFormatELF() const { 754 return getObjectFormat() == Triple::ELF; 755 } 756 757 /// Tests whether the OS uses the COFF binary format. 758 bool isOSBinFormatCOFF() const { 759 return getObjectFormat() == Triple::COFF; 760 } 761 762 /// Tests whether the OS uses the GOFF binary format. 763 bool isOSBinFormatGOFF() const { return getObjectFormat() == Triple::GOFF; } 764 765 /// Tests whether the environment is MachO. 766 bool isOSBinFormatMachO() const { 767 return getObjectFormat() == Triple::MachO; 768 } 769 770 /// Tests whether the OS uses the Wasm binary format. 771 bool isOSBinFormatWasm() const { 772 return getObjectFormat() == Triple::Wasm; 773 } 774 775 /// Tests whether the OS uses the XCOFF binary format. 776 bool isOSBinFormatXCOFF() const { 777 return getObjectFormat() == Triple::XCOFF; 778 } 779 780 /// Tests whether the OS uses the DXContainer binary format. 781 bool isOSBinFormatDXContainer() const { 782 return getObjectFormat() == Triple::DXContainer; 783 } 784 785 /// Tests whether the target is the PS4 platform. 786 bool isPS4() const { 787 return getArch() == Triple::x86_64 && 788 getVendor() == Triple::SCEI && 789 getOS() == Triple::PS4; 790 } 791 792 /// Tests whether the target is the PS5 platform. 793 bool isPS5() const { 794 return getArch() == Triple::x86_64 && 795 getVendor() == Triple::SCEI && 796 getOS() == Triple::PS5; 797 } 798 799 /// Tests whether the target is the PS4 or PS5 platform. 800 bool isPS() const { return isPS4() || isPS5(); } 801 802 /// Tests whether the target is Android 803 bool isAndroid() const { return getEnvironment() == Triple::Android; } 804 805 bool isAndroidVersionLT(unsigned Major) const { 806 assert(isAndroid() && "Not an Android triple!"); 807 808 VersionTuple Version = getEnvironmentVersion(); 809 810 // 64-bit targets did not exist before API level 21 (Lollipop). 811 if (isArch64Bit() && Version.getMajor() < 21) 812 return VersionTuple(21) < VersionTuple(Major); 813 814 return Version < VersionTuple(Major); 815 } 816 817 /// Tests whether the environment is musl-libc 818 bool isMusl() const { 819 return getEnvironment() == Triple::Musl || 820 getEnvironment() == Triple::MuslABIN32 || 821 getEnvironment() == Triple::MuslABI64 || 822 getEnvironment() == Triple::MuslEABI || 823 getEnvironment() == Triple::MuslEABIHF || 824 getEnvironment() == Triple::MuslF32 || 825 getEnvironment() == Triple::MuslSF || 826 getEnvironment() == Triple::MuslX32 || 827 getEnvironment() == Triple::OpenHOS || isOSLiteOS(); 828 } 829 830 /// Tests whether the target is OHOS 831 /// LiteOS default enviroment is also OHOS, but omited on triple. 832 bool isOHOSFamily() const { return isOpenHOS() || isOSLiteOS(); } 833 834 bool isOpenHOS() const { return getEnvironment() == Triple::OpenHOS; } 835 836 bool isOSLiteOS() const { return getOS() == Triple::LiteOS; } 837 838 /// Tests whether the target is DXIL. 839 bool isDXIL() const { 840 return getArch() == Triple::dxil; 841 } 842 843 bool isShaderModelOS() const { 844 return getOS() == Triple::ShaderModel; 845 } 846 847 bool isVulkanOS() const { return getOS() == Triple::Vulkan; } 848 849 bool isShaderStageEnvironment() const { 850 EnvironmentType Env = getEnvironment(); 851 return Env == Triple::Pixel || Env == Triple::Vertex || 852 Env == Triple::Geometry || Env == Triple::Hull || 853 Env == Triple::Domain || Env == Triple::Compute || 854 Env == Triple::Library || Env == Triple::RayGeneration || 855 Env == Triple::Intersection || Env == Triple::AnyHit || 856 Env == Triple::ClosestHit || Env == Triple::Miss || 857 Env == Triple::Callable || Env == Triple::Mesh || 858 Env == Triple::Amplification; 859 } 860 861 /// Tests whether the target is SPIR (32- or 64-bit). 862 bool isSPIR() const { 863 return getArch() == Triple::spir || getArch() == Triple::spir64; 864 } 865 866 /// Tests whether the target is SPIR-V (32/64-bit/Logical). 867 bool isSPIRV() const { 868 return getArch() == Triple::spirv32 || getArch() == Triple::spirv64 || 869 getArch() == Triple::spirv; 870 } 871 872 // Tests whether the target is SPIR-V or SPIR. 873 bool isSPIROrSPIRV() const { return isSPIR() || isSPIRV(); } 874 875 /// Tests whether the target is SPIR-V Logical 876 bool isSPIRVLogical() const { 877 return getArch() == Triple::spirv; 878 } 879 880 /// Tests whether the target is NVPTX (32- or 64-bit). 881 bool isNVPTX() const { 882 return getArch() == Triple::nvptx || getArch() == Triple::nvptx64; 883 } 884 885 /// Tests whether the target is AMDGCN 886 bool isAMDGCN() const { return getArch() == Triple::amdgcn; } 887 888 bool isAMDGPU() const { 889 return getArch() == Triple::r600 || getArch() == Triple::amdgcn; 890 } 891 892 /// Tests whether the target is Thumb (little and big endian). 893 bool isThumb() const { 894 return getArch() == Triple::thumb || getArch() == Triple::thumbeb; 895 } 896 897 /// Tests whether the target is ARM (little and big endian). 898 bool isARM() const { 899 return getArch() == Triple::arm || getArch() == Triple::armeb; 900 } 901 902 /// Tests whether the target supports the EHABI exception 903 /// handling standard. 904 bool isTargetEHABICompatible() const { 905 return (isARM() || isThumb()) && 906 (getEnvironment() == Triple::EABI || 907 getEnvironment() == Triple::GNUEABI || 908 getEnvironment() == Triple::GNUEABIT64 || 909 getEnvironment() == Triple::MuslEABI || 910 getEnvironment() == Triple::EABIHF || 911 getEnvironment() == Triple::GNUEABIHF || 912 getEnvironment() == Triple::GNUEABIHFT64 || 913 getEnvironment() == Triple::OpenHOS || 914 getEnvironment() == Triple::MuslEABIHF || isAndroid()) && 915 isOSBinFormatELF(); 916 } 917 918 /// Tests whether the target is T32. 919 bool isArmT32() const { 920 switch (getSubArch()) { 921 case Triple::ARMSubArch_v8m_baseline: 922 case Triple::ARMSubArch_v7s: 923 case Triple::ARMSubArch_v7k: 924 case Triple::ARMSubArch_v7ve: 925 case Triple::ARMSubArch_v6: 926 case Triple::ARMSubArch_v6m: 927 case Triple::ARMSubArch_v6k: 928 case Triple::ARMSubArch_v6t2: 929 case Triple::ARMSubArch_v5: 930 case Triple::ARMSubArch_v5te: 931 case Triple::ARMSubArch_v4t: 932 return false; 933 default: 934 return true; 935 } 936 } 937 938 /// Tests whether the target is an M-class. 939 bool isArmMClass() const { 940 switch (getSubArch()) { 941 case Triple::ARMSubArch_v6m: 942 case Triple::ARMSubArch_v7m: 943 case Triple::ARMSubArch_v7em: 944 case Triple::ARMSubArch_v8m_mainline: 945 case Triple::ARMSubArch_v8m_baseline: 946 case Triple::ARMSubArch_v8_1m_mainline: 947 return true; 948 default: 949 return false; 950 } 951 } 952 953 /// Tests whether the target is AArch64 (little and big endian). 954 bool isAArch64() const { 955 return getArch() == Triple::aarch64 || getArch() == Triple::aarch64_be || 956 getArch() == Triple::aarch64_32; 957 } 958 959 /// Tests whether the target is AArch64 and pointers are the size specified by 960 /// \p PointerWidth. 961 bool isAArch64(int PointerWidth) const { 962 assert(PointerWidth == 64 || PointerWidth == 32); 963 if (!isAArch64()) 964 return false; 965 return getArch() == Triple::aarch64_32 || 966 getEnvironment() == Triple::GNUILP32 967 ? PointerWidth == 32 968 : PointerWidth == 64; 969 } 970 971 /// Tests whether the target is 32-bit LoongArch. 972 bool isLoongArch32() const { return getArch() == Triple::loongarch32; } 973 974 /// Tests whether the target is 64-bit LoongArch. 975 bool isLoongArch64() const { return getArch() == Triple::loongarch64; } 976 977 /// Tests whether the target is LoongArch (32- and 64-bit). 978 bool isLoongArch() const { return isLoongArch32() || isLoongArch64(); } 979 980 /// Tests whether the target is MIPS 32-bit (little and big endian). 981 bool isMIPS32() const { 982 return getArch() == Triple::mips || getArch() == Triple::mipsel; 983 } 984 985 /// Tests whether the target is MIPS 64-bit (little and big endian). 986 bool isMIPS64() const { 987 return getArch() == Triple::mips64 || getArch() == Triple::mips64el; 988 } 989 990 /// Tests whether the target is MIPS (little and big endian, 32- or 64-bit). 991 bool isMIPS() const { 992 return isMIPS32() || isMIPS64(); 993 } 994 995 /// Tests whether the target is PowerPC (32- or 64-bit LE or BE). 996 bool isPPC() const { 997 return getArch() == Triple::ppc || getArch() == Triple::ppc64 || 998 getArch() == Triple::ppcle || getArch() == Triple::ppc64le; 999 } 1000 1001 /// Tests whether the target is 32-bit PowerPC (little and big endian). 1002 bool isPPC32() const { 1003 return getArch() == Triple::ppc || getArch() == Triple::ppcle; 1004 } 1005 1006 /// Tests whether the target is 64-bit PowerPC (little and big endian). 1007 bool isPPC64() const { 1008 return getArch() == Triple::ppc64 || getArch() == Triple::ppc64le; 1009 } 1010 1011 /// Tests whether the target 64-bit PowerPC big endian ABI is ELFv2. 1012 bool isPPC64ELFv2ABI() const { 1013 return (getArch() == Triple::ppc64 && 1014 ((getOS() == Triple::FreeBSD && 1015 (getOSMajorVersion() >= 13 || getOSVersion().empty())) || 1016 getOS() == Triple::OpenBSD || isMusl())); 1017 } 1018 1019 /// Tests whether the target 32-bit PowerPC uses Secure PLT. 1020 bool isPPC32SecurePlt() const { 1021 return ((getArch() == Triple::ppc || getArch() == Triple::ppcle) && 1022 ((getOS() == Triple::FreeBSD && 1023 (getOSMajorVersion() >= 13 || getOSVersion().empty())) || 1024 getOS() == Triple::NetBSD || getOS() == Triple::OpenBSD || 1025 isMusl())); 1026 } 1027 1028 /// Tests whether the target is 32-bit RISC-V. 1029 bool isRISCV32() const { return getArch() == Triple::riscv32; } 1030 1031 /// Tests whether the target is 64-bit RISC-V. 1032 bool isRISCV64() const { return getArch() == Triple::riscv64; } 1033 1034 /// Tests whether the target is RISC-V (32- and 64-bit). 1035 bool isRISCV() const { return isRISCV32() || isRISCV64(); } 1036 1037 /// Tests whether the target is 32-bit SPARC (little and big endian). 1038 bool isSPARC32() const { 1039 return getArch() == Triple::sparc || getArch() == Triple::sparcel; 1040 } 1041 1042 /// Tests whether the target is 64-bit SPARC (big endian). 1043 bool isSPARC64() const { return getArch() == Triple::sparcv9; } 1044 1045 /// Tests whether the target is SPARC. 1046 bool isSPARC() const { return isSPARC32() || isSPARC64(); } 1047 1048 /// Tests whether the target is SystemZ. 1049 bool isSystemZ() const { 1050 return getArch() == Triple::systemz; 1051 } 1052 1053 /// Tests whether the target is x86 (32- or 64-bit). 1054 bool isX86() const { 1055 return getArch() == Triple::x86 || getArch() == Triple::x86_64; 1056 } 1057 1058 /// Tests whether the target is VE 1059 bool isVE() const { 1060 return getArch() == Triple::ve; 1061 } 1062 1063 /// Tests whether the target is wasm (32- and 64-bit). 1064 bool isWasm() const { 1065 return getArch() == Triple::wasm32 || getArch() == Triple::wasm64; 1066 } 1067 1068 // Tests whether the target is CSKY 1069 bool isCSKY() const { 1070 return getArch() == Triple::csky; 1071 } 1072 1073 /// Tests whether the target is the Apple "arm64e" AArch64 subarch. 1074 bool isArm64e() const { 1075 return getArch() == Triple::aarch64 && 1076 getSubArch() == Triple::AArch64SubArch_arm64e; 1077 } 1078 1079 // Tests whether the target is N32. 1080 bool isABIN32() const { 1081 EnvironmentType Env = getEnvironment(); 1082 return Env == Triple::GNUABIN32 || Env == Triple::MuslABIN32; 1083 } 1084 1085 /// Tests whether the target is X32. 1086 bool isX32() const { 1087 EnvironmentType Env = getEnvironment(); 1088 return Env == Triple::GNUX32 || Env == Triple::MuslX32; 1089 } 1090 1091 /// Tests whether the target is eBPF. 1092 bool isBPF() const { 1093 return getArch() == Triple::bpfel || getArch() == Triple::bpfeb; 1094 } 1095 1096 /// Tests if the target forces 64-bit time_t on a 32-bit architecture. 1097 bool isTime64ABI() const { 1098 EnvironmentType Env = getEnvironment(); 1099 return Env == Triple::GNUT64 || Env == Triple::GNUEABIT64 || 1100 Env == Triple::GNUEABIHFT64; 1101 } 1102 1103 /// Tests if the target forces hardfloat. 1104 bool isHardFloatABI() const { 1105 EnvironmentType Env = getEnvironment(); 1106 return Env == llvm::Triple::GNUEABIHF || 1107 Env == llvm::Triple::GNUEABIHFT64 || 1108 Env == llvm::Triple::MuslEABIHF || 1109 Env == llvm::Triple::EABIHF; 1110 } 1111 1112 /// Tests whether the target supports comdat 1113 bool supportsCOMDAT() const { 1114 return !(isOSBinFormatMachO() || isOSBinFormatXCOFF() || 1115 isOSBinFormatDXContainer()); 1116 } 1117 1118 /// Tests whether the target uses emulated TLS as default. 1119 /// 1120 /// Note: Android API level 29 (10) introduced ELF TLS. 1121 bool hasDefaultEmulatedTLS() const { 1122 return (isAndroid() && isAndroidVersionLT(29)) || isOSOpenBSD() || 1123 isWindowsCygwinEnvironment() || isOHOSFamily(); 1124 } 1125 1126 /// True if the target supports both general-dynamic and TLSDESC, and TLSDESC 1127 /// is enabled by default. 1128 bool hasDefaultTLSDESC() const { return isAndroid() && isRISCV64(); } 1129 1130 /// Tests whether the target uses -data-sections as default. 1131 bool hasDefaultDataSections() const { 1132 return isOSBinFormatXCOFF() || isWasm(); 1133 } 1134 1135 /// Tests if the environment supports dllimport/export annotations. 1136 bool hasDLLImportExport() const { return isOSWindows() || isPS(); } 1137 1138 /// @} 1139 /// @name Mutators 1140 /// @{ 1141 1142 /// Set the architecture (first) component of the triple to a known type. 1143 void setArch(ArchType Kind, SubArchType SubArch = NoSubArch); 1144 1145 /// Set the vendor (second) component of the triple to a known type. 1146 void setVendor(VendorType Kind); 1147 1148 /// Set the operating system (third) component of the triple to a known type. 1149 void setOS(OSType Kind); 1150 1151 /// Set the environment (fourth) component of the triple to a known type. 1152 void setEnvironment(EnvironmentType Kind); 1153 1154 /// Set the object file format. 1155 void setObjectFormat(ObjectFormatType Kind); 1156 1157 /// Set all components to the new triple \p Str. 1158 void setTriple(const Twine &Str); 1159 1160 /// Set the architecture (first) component of the triple by name. 1161 void setArchName(StringRef Str); 1162 1163 /// Set the vendor (second) component of the triple by name. 1164 void setVendorName(StringRef Str); 1165 1166 /// Set the operating system (third) component of the triple by name. 1167 void setOSName(StringRef Str); 1168 1169 /// Set the optional environment (fourth) component of the triple by name. 1170 void setEnvironmentName(StringRef Str); 1171 1172 /// Set the operating system and optional environment components with a single 1173 /// string. 1174 void setOSAndEnvironmentName(StringRef Str); 1175 1176 /// @} 1177 /// @name Helpers to build variants of a particular triple. 1178 /// @{ 1179 1180 /// Form a triple with a 32-bit variant of the current architecture. 1181 /// 1182 /// This can be used to move across "families" of architectures where useful. 1183 /// 1184 /// \returns A new triple with a 32-bit architecture or an unknown 1185 /// architecture if no such variant can be found. 1186 llvm::Triple get32BitArchVariant() const; 1187 1188 /// Form a triple with a 64-bit variant of the current architecture. 1189 /// 1190 /// This can be used to move across "families" of architectures where useful. 1191 /// 1192 /// \returns A new triple with a 64-bit architecture or an unknown 1193 /// architecture if no such variant can be found. 1194 llvm::Triple get64BitArchVariant() const; 1195 1196 /// Form a triple with a big endian variant of the current architecture. 1197 /// 1198 /// This can be used to move across "families" of architectures where useful. 1199 /// 1200 /// \returns A new triple with a big endian architecture or an unknown 1201 /// architecture if no such variant can be found. 1202 llvm::Triple getBigEndianArchVariant() const; 1203 1204 /// Form a triple with a little endian variant of the current architecture. 1205 /// 1206 /// This can be used to move across "families" of architectures where useful. 1207 /// 1208 /// \returns A new triple with a little endian architecture or an unknown 1209 /// architecture if no such variant can be found. 1210 llvm::Triple getLittleEndianArchVariant() const; 1211 1212 /// Tests whether the target triple is little endian. 1213 /// 1214 /// \returns true if the triple is little endian, false otherwise. 1215 bool isLittleEndian() const; 1216 1217 /// Test whether target triples are compatible. 1218 bool isCompatibleWith(const Triple &Other) const; 1219 1220 /// Merge target triples. 1221 std::string merge(const Triple &Other) const; 1222 1223 /// Some platforms have different minimum supported OS versions that 1224 /// varies by the architecture specified in the triple. This function 1225 /// returns the minimum supported OS version for this triple if one an exists, 1226 /// or an invalid version tuple if this triple doesn't have one. 1227 VersionTuple getMinimumSupportedOSVersion() const; 1228 1229 /// @} 1230 /// @name Static helpers for IDs. 1231 /// @{ 1232 1233 /// Get the canonical name for the \p Kind architecture. 1234 static StringRef getArchTypeName(ArchType Kind); 1235 1236 /// Get the architecture name based on \p Kind and \p SubArch. 1237 static StringRef getArchName(ArchType Kind, SubArchType SubArch = NoSubArch); 1238 1239 /// Get the "prefix" canonical name for the \p Kind architecture. This is the 1240 /// prefix used by the architecture specific builtins, and is suitable for 1241 /// passing to \see Intrinsic::getIntrinsicForClangBuiltin(). 1242 /// 1243 /// \return - The architecture prefix, or 0 if none is defined. 1244 static StringRef getArchTypePrefix(ArchType Kind); 1245 1246 /// Get the canonical name for the \p Kind vendor. 1247 static StringRef getVendorTypeName(VendorType Kind); 1248 1249 /// Get the canonical name for the \p Kind operating system. 1250 static StringRef getOSTypeName(OSType Kind); 1251 1252 /// Get the canonical name for the \p Kind environment. 1253 static StringRef getEnvironmentTypeName(EnvironmentType Kind); 1254 1255 /// Get the name for the \p Object format. 1256 static StringRef getObjectFormatTypeName(ObjectFormatType ObjectFormat); 1257 1258 /// @} 1259 /// @name Static helpers for converting alternate architecture names. 1260 /// @{ 1261 1262 /// The canonical type for the given LLVM architecture name (e.g., "x86"). 1263 static ArchType getArchTypeForLLVMName(StringRef Str); 1264 1265 /// @} 1266 1267 /// Returns a canonicalized OS version number for the specified OS. 1268 static VersionTuple getCanonicalVersionForOS(OSType OSKind, 1269 const VersionTuple &Version); 1270 }; 1271 1272 } // End llvm namespace 1273 1274 1275 #endif 1276