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 le32, // le32: generic little-endian 32-bit CPU (PNaCl) 92 le64, // le64: generic little-endian 64-bit CPU (PNaCl) 93 amdil, // AMDIL 94 amdil64, // AMDIL with 64-bit pointers 95 hsail, // AMD HSAIL 96 hsail64, // AMD HSAIL with 64-bit pointers 97 spir, // SPIR: standard portable IR for OpenCL 32-bit version 98 spir64, // SPIR: standard portable IR for OpenCL 64-bit version 99 spirv32, // SPIR-V with 32-bit pointers 100 spirv64, // SPIR-V with 64-bit pointers 101 kalimba, // Kalimba: generic kalimba 102 shave, // SHAVE: Movidius vector VLIW processors 103 lanai, // Lanai: Lanai 32-bit 104 wasm32, // WebAssembly with 32-bit pointers 105 wasm64, // WebAssembly with 64-bit pointers 106 renderscript32, // 32-bit RenderScript 107 renderscript64, // 64-bit RenderScript 108 ve, // NEC SX-Aurora Vector Engine 109 LastArchType = ve 110 }; 111 enum SubArchType { 112 NoSubArch, 113 114 ARMSubArch_v9_4a, 115 ARMSubArch_v9_3a, 116 ARMSubArch_v9_2a, 117 ARMSubArch_v9_1a, 118 ARMSubArch_v9, 119 ARMSubArch_v8_9a, 120 ARMSubArch_v8_8a, 121 ARMSubArch_v8_7a, 122 ARMSubArch_v8_6a, 123 ARMSubArch_v8_5a, 124 ARMSubArch_v8_4a, 125 ARMSubArch_v8_3a, 126 ARMSubArch_v8_2a, 127 ARMSubArch_v8_1a, 128 ARMSubArch_v8, 129 ARMSubArch_v8r, 130 ARMSubArch_v8m_baseline, 131 ARMSubArch_v8m_mainline, 132 ARMSubArch_v8_1m_mainline, 133 ARMSubArch_v7, 134 ARMSubArch_v7em, 135 ARMSubArch_v7m, 136 ARMSubArch_v7s, 137 ARMSubArch_v7k, 138 ARMSubArch_v7ve, 139 ARMSubArch_v6, 140 ARMSubArch_v6m, 141 ARMSubArch_v6k, 142 ARMSubArch_v6t2, 143 ARMSubArch_v5, 144 ARMSubArch_v5te, 145 ARMSubArch_v4t, 146 147 AArch64SubArch_arm64e, 148 AArch64SubArch_arm64ec, 149 150 KalimbaSubArch_v3, 151 KalimbaSubArch_v4, 152 KalimbaSubArch_v5, 153 154 MipsSubArch_r6, 155 156 PPCSubArch_spe, 157 158 // SPIR-V sub-arch corresponds to its version. 159 SPIRVSubArch_v10, 160 SPIRVSubArch_v11, 161 SPIRVSubArch_v12, 162 SPIRVSubArch_v13, 163 SPIRVSubArch_v14, 164 SPIRVSubArch_v15, 165 }; 166 enum VendorType { 167 UnknownVendor, 168 169 Apple, 170 PC, 171 SCEI, 172 Freescale, 173 IBM, 174 ImaginationTechnologies, 175 MipsTechnologies, 176 NVIDIA, 177 CSR, 178 Myriad, 179 AMD, 180 Mesa, 181 SUSE, 182 OpenEmbedded, 183 LastVendorType = OpenEmbedded 184 }; 185 enum OSType { 186 UnknownOS, 187 188 Ananas, 189 CloudABI, 190 Darwin, 191 DragonFly, 192 FreeBSD, 193 Fuchsia, 194 IOS, 195 KFreeBSD, 196 Linux, 197 Lv2, // PS3 198 MacOSX, 199 NetBSD, 200 OpenBSD, 201 Solaris, 202 Win32, 203 ZOS, 204 Haiku, 205 Minix, 206 RTEMS, 207 NaCl, // Native Client 208 AIX, 209 CUDA, // NVIDIA CUDA 210 NVCL, // NVIDIA OpenCL 211 AMDHSA, // AMD HSA Runtime 212 PS4, 213 PS5, 214 ELFIAMCU, 215 TvOS, // Apple tvOS 216 WatchOS, // Apple watchOS 217 DriverKit, // Apple DriverKit 218 Mesa3D, 219 Contiki, 220 AMDPAL, // AMD PAL Runtime 221 HermitCore, // HermitCore Unikernel/Multikernel 222 Hurd, // GNU/Hurd 223 WASI, // Experimental WebAssembly OS 224 Emscripten, 225 ShaderModel, // DirectX ShaderModel 226 LastOSType = ShaderModel 227 }; 228 enum EnvironmentType { 229 UnknownEnvironment, 230 231 GNU, 232 GNUABIN32, 233 GNUABI64, 234 GNUEABI, 235 GNUEABIHF, 236 GNUF32, 237 GNUF64, 238 GNUSF, 239 GNUX32, 240 GNUILP32, 241 CODE16, 242 EABI, 243 EABIHF, 244 Android, 245 Musl, 246 MuslEABI, 247 MuslEABIHF, 248 MuslX32, 249 250 MSVC, 251 Itanium, 252 Cygnus, 253 CoreCLR, 254 Simulator, // Simulator variants of other systems, e.g., Apple's iOS 255 MacABI, // Mac Catalyst variant of Apple's iOS deployment target. 256 257 // Shader Stages 258 // The order of these values matters, and must be kept in sync with the 259 // language options enum in Clang. The ordering is enforced in 260 // static_asserts in Triple.cpp and in Clang. 261 Pixel, 262 Vertex, 263 Geometry, 264 Hull, 265 Domain, 266 Compute, 267 Library, 268 RayGeneration, 269 Intersection, 270 AnyHit, 271 ClosestHit, 272 Miss, 273 Callable, 274 Mesh, 275 Amplification, 276 277 LastEnvironmentType = Amplification 278 }; 279 enum ObjectFormatType { 280 UnknownObjectFormat, 281 282 COFF, 283 DXContainer, 284 ELF, 285 GOFF, 286 MachO, 287 SPIRV, 288 Wasm, 289 XCOFF, 290 }; 291 292 private: 293 std::string Data; 294 295 /// The parsed arch type. 296 ArchType Arch{}; 297 298 /// The parsed subarchitecture type. 299 SubArchType SubArch{}; 300 301 /// The parsed vendor type. 302 VendorType Vendor{}; 303 304 /// The parsed OS type. 305 OSType OS{}; 306 307 /// The parsed Environment type. 308 EnvironmentType Environment{}; 309 310 /// The object format type. 311 ObjectFormatType ObjectFormat{}; 312 313 public: 314 /// @name Constructors 315 /// @{ 316 317 /// Default constructor is the same as an empty string and leaves all 318 /// triple fields unknown. 319 Triple() = default; 320 321 explicit Triple(const Twine &Str); 322 Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr); 323 Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr, 324 const Twine &EnvironmentStr); 325 326 bool operator==(const Triple &Other) const { 327 return Arch == Other.Arch && SubArch == Other.SubArch && 328 Vendor == Other.Vendor && OS == Other.OS && 329 Environment == Other.Environment && 330 ObjectFormat == Other.ObjectFormat; 331 } 332 333 bool operator!=(const Triple &Other) const { 334 return !(*this == Other); 335 } 336 337 /// @} 338 /// @name Normalization 339 /// @{ 340 341 /// Turn an arbitrary machine specification into the canonical triple form (or 342 /// something sensible that the Triple class understands if nothing better can 343 /// reasonably be done). In particular, it handles the common case in which 344 /// otherwise valid components are in the wrong order. 345 static std::string normalize(StringRef Str); 346 347 /// Return the normalized form of this triple's string. normalize()348 std::string normalize() const { return normalize(Data); } 349 350 /// @} 351 /// @name Typed Component Access 352 /// @{ 353 354 /// Get the parsed architecture type of this triple. getArch()355 ArchType getArch() const { return Arch; } 356 357 /// get the parsed subarchitecture type for this triple. getSubArch()358 SubArchType getSubArch() const { return SubArch; } 359 360 /// Get the parsed vendor type of this triple. getVendor()361 VendorType getVendor() const { return Vendor; } 362 363 /// Get the parsed operating system type of this triple. getOS()364 OSType getOS() const { return OS; } 365 366 /// Does this triple have the optional environment (fourth) component? hasEnvironment()367 bool hasEnvironment() const { 368 return getEnvironmentName() != ""; 369 } 370 371 /// Get the parsed environment type of this triple. getEnvironment()372 EnvironmentType getEnvironment() const { return Environment; } 373 374 /// Parse the version number from the OS name component of the 375 /// triple, if present. 376 /// 377 /// For example, "fooos1.2.3" would return (1, 2, 3). 378 VersionTuple getEnvironmentVersion() const; 379 380 /// Get the object format for this triple. getObjectFormat()381 ObjectFormatType getObjectFormat() const { return ObjectFormat; } 382 383 /// Parse the version number from the OS name component of the triple, if 384 /// present. 385 /// 386 /// For example, "fooos1.2.3" would return (1, 2, 3). 387 VersionTuple getOSVersion() const; 388 389 /// Return just the major version number, this is specialized because it is a 390 /// common query. getOSMajorVersion()391 unsigned getOSMajorVersion() const { return getOSVersion().getMajor(); } 392 393 /// Parse the version number as with getOSVersion and then translate generic 394 /// "darwin" versions to the corresponding OS X versions. This may also be 395 /// called with IOS triples but the OS X version number is just set to a 396 /// constant 10.4.0 in that case. Returns true if successful. 397 bool getMacOSXVersion(VersionTuple &Version) const; 398 399 /// Parse the version number as with getOSVersion. This should only be called 400 /// with IOS or generic triples. 401 VersionTuple getiOSVersion() const; 402 403 /// Parse the version number as with getOSVersion. This should only be called 404 /// with WatchOS or generic triples. 405 VersionTuple getWatchOSVersion() const; 406 407 /// Parse the version number as with getOSVersion. 408 VersionTuple getDriverKitVersion() const; 409 410 /// @} 411 /// @name Direct Component Access 412 /// @{ 413 str()414 const std::string &str() const { return Data; } 415 getTriple()416 const std::string &getTriple() const { return Data; } 417 418 /// Get the architecture (first) component of the triple. 419 StringRef getArchName() const; 420 421 /// Get the architecture name based on Kind and SubArch. 422 StringRef getArchName(ArchType Kind, SubArchType SubArch = NoSubArch) const; 423 424 /// Get the vendor (second) component of the triple. 425 StringRef getVendorName() const; 426 427 /// Get the operating system (third) component of the triple. 428 StringRef getOSName() const; 429 430 /// Get the optional environment (fourth) component of the triple, or "" if 431 /// empty. 432 StringRef getEnvironmentName() const; 433 434 /// Get the operating system and optional environment components as a single 435 /// string (separated by a '-' if the environment component is present). 436 StringRef getOSAndEnvironmentName() const; 437 438 /// @} 439 /// @name Convenience Predicates 440 /// @{ 441 442 /// Test whether the architecture is 64-bit 443 /// 444 /// Note that this tests for 64-bit pointer width, and nothing else. Note 445 /// that we intentionally expose only three predicates, 64-bit, 32-bit, and 446 /// 16-bit. The inner details of pointer width for particular architectures 447 /// is not summed up in the triple, and so only a coarse grained predicate 448 /// system is provided. 449 bool isArch64Bit() const; 450 451 /// Test whether the architecture is 32-bit 452 /// 453 /// Note that this tests for 32-bit pointer width, and nothing else. 454 bool isArch32Bit() const; 455 456 /// Test whether the architecture is 16-bit 457 /// 458 /// Note that this tests for 16-bit pointer width, and nothing else. 459 bool isArch16Bit() const; 460 461 /// Helper function for doing comparisons against version numbers included in 462 /// the target triple. 463 bool isOSVersionLT(unsigned Major, unsigned Minor = 0, 464 unsigned Micro = 0) const { 465 if (Minor == 0) { 466 return getOSVersion() < VersionTuple(Major); 467 } 468 if (Micro == 0) { 469 return getOSVersion() < VersionTuple(Major, Minor); 470 } 471 return getOSVersion() < VersionTuple(Major, Minor, Micro); 472 } 473 isOSVersionLT(const Triple & Other)474 bool isOSVersionLT(const Triple &Other) const { 475 return getOSVersion() < Other.getOSVersion(); 476 } 477 478 /// Comparison function for checking OS X version compatibility, which handles 479 /// supporting skewed version numbering schemes used by the "darwin" triples. 480 bool isMacOSXVersionLT(unsigned Major, unsigned Minor = 0, 481 unsigned Micro = 0) const; 482 483 /// Is this a Mac OS X triple. For legacy reasons, we support both "darwin" 484 /// and "osx" as OS X triples. isMacOSX()485 bool isMacOSX() const { 486 return getOS() == Triple::Darwin || getOS() == Triple::MacOSX; 487 } 488 489 /// Is this an iOS triple. 490 /// Note: This identifies tvOS as a variant of iOS. If that ever 491 /// changes, i.e., if the two operating systems diverge or their version 492 /// numbers get out of sync, that will need to be changed. 493 /// watchOS has completely different version numbers so it is not included. isiOS()494 bool isiOS() const { 495 return getOS() == Triple::IOS || isTvOS(); 496 } 497 498 /// Is this an Apple tvOS triple. isTvOS()499 bool isTvOS() const { 500 return getOS() == Triple::TvOS; 501 } 502 503 /// Is this an Apple watchOS triple. isWatchOS()504 bool isWatchOS() const { 505 return getOS() == Triple::WatchOS; 506 } 507 isWatchABI()508 bool isWatchABI() const { 509 return getSubArch() == Triple::ARMSubArch_v7k; 510 } 511 512 /// Is this an Apple DriverKit triple. isDriverKit()513 bool isDriverKit() const { return getOS() == Triple::DriverKit; } 514 isOSzOS()515 bool isOSzOS() const { return getOS() == Triple::ZOS; } 516 517 /// Is this a "Darwin" OS (macOS, iOS, tvOS, watchOS, or DriverKit). isOSDarwin()518 bool isOSDarwin() const { 519 return isMacOSX() || isiOS() || isWatchOS() || isDriverKit(); 520 } 521 isSimulatorEnvironment()522 bool isSimulatorEnvironment() const { 523 return getEnvironment() == Triple::Simulator; 524 } 525 isMacCatalystEnvironment()526 bool isMacCatalystEnvironment() const { 527 return getEnvironment() == Triple::MacABI; 528 } 529 530 /// Returns true for targets that run on a macOS machine. isTargetMachineMac()531 bool isTargetMachineMac() const { 532 return isMacOSX() || (isOSDarwin() && (isSimulatorEnvironment() || 533 isMacCatalystEnvironment())); 534 } 535 isOSNetBSD()536 bool isOSNetBSD() const { 537 return getOS() == Triple::NetBSD; 538 } 539 isOSOpenBSD()540 bool isOSOpenBSD() const { 541 return getOS() == Triple::OpenBSD; 542 } 543 isOSFreeBSD()544 bool isOSFreeBSD() const { 545 return getOS() == Triple::FreeBSD; 546 } 547 isOSFuchsia()548 bool isOSFuchsia() const { 549 return getOS() == Triple::Fuchsia; 550 } 551 isOSDragonFly()552 bool isOSDragonFly() const { return getOS() == Triple::DragonFly; } 553 isOSSolaris()554 bool isOSSolaris() const { 555 return getOS() == Triple::Solaris; 556 } 557 isOSIAMCU()558 bool isOSIAMCU() const { 559 return getOS() == Triple::ELFIAMCU; 560 } 561 isOSUnknown()562 bool isOSUnknown() const { return getOS() == Triple::UnknownOS; } 563 isGNUEnvironment()564 bool isGNUEnvironment() const { 565 EnvironmentType Env = getEnvironment(); 566 return Env == Triple::GNU || Env == Triple::GNUABIN32 || 567 Env == Triple::GNUABI64 || Env == Triple::GNUEABI || 568 Env == Triple::GNUEABIHF || Env == Triple::GNUF32 || 569 Env == Triple::GNUF64 || Env == Triple::GNUSF || 570 Env == Triple::GNUX32; 571 } 572 isOSContiki()573 bool isOSContiki() const { 574 return getOS() == Triple::Contiki; 575 } 576 577 /// Tests whether the OS is Haiku. isOSHaiku()578 bool isOSHaiku() const { 579 return getOS() == Triple::Haiku; 580 } 581 582 /// Tests whether the OS is Windows. isOSWindows()583 bool isOSWindows() const { 584 return getOS() == Triple::Win32; 585 } 586 587 /// Checks if the environment is MSVC. isKnownWindowsMSVCEnvironment()588 bool isKnownWindowsMSVCEnvironment() const { 589 return isOSWindows() && getEnvironment() == Triple::MSVC; 590 } 591 592 /// Checks if the environment could be MSVC. isWindowsMSVCEnvironment()593 bool isWindowsMSVCEnvironment() const { 594 return isKnownWindowsMSVCEnvironment() || 595 (isOSWindows() && getEnvironment() == Triple::UnknownEnvironment); 596 } 597 598 // Checks if we're using the Windows Arm64EC ABI. isWindowsArm64EC()599 bool isWindowsArm64EC() const { 600 return getArch() == Triple::aarch64 && 601 getSubArch() == Triple::AArch64SubArch_arm64ec; 602 } 603 isWindowsCoreCLREnvironment()604 bool isWindowsCoreCLREnvironment() const { 605 return isOSWindows() && getEnvironment() == Triple::CoreCLR; 606 } 607 isWindowsItaniumEnvironment()608 bool isWindowsItaniumEnvironment() const { 609 return isOSWindows() && getEnvironment() == Triple::Itanium; 610 } 611 isWindowsCygwinEnvironment()612 bool isWindowsCygwinEnvironment() const { 613 return isOSWindows() && getEnvironment() == Triple::Cygnus; 614 } 615 isWindowsGNUEnvironment()616 bool isWindowsGNUEnvironment() const { 617 return isOSWindows() && getEnvironment() == Triple::GNU; 618 } 619 620 /// Tests for either Cygwin or MinGW OS isOSCygMing()621 bool isOSCygMing() const { 622 return isWindowsCygwinEnvironment() || isWindowsGNUEnvironment(); 623 } 624 625 /// Is this a "Windows" OS targeting a "MSVCRT.dll" environment. isOSMSVCRT()626 bool isOSMSVCRT() const { 627 return isWindowsMSVCEnvironment() || isWindowsGNUEnvironment() || 628 isWindowsItaniumEnvironment(); 629 } 630 631 /// Tests whether the OS is NaCl (Native Client) isOSNaCl()632 bool isOSNaCl() const { 633 return getOS() == Triple::NaCl; 634 } 635 636 /// Tests whether the OS is Linux. isOSLinux()637 bool isOSLinux() const { 638 return getOS() == Triple::Linux; 639 } 640 641 /// Tests whether the OS is kFreeBSD. isOSKFreeBSD()642 bool isOSKFreeBSD() const { 643 return getOS() == Triple::KFreeBSD; 644 } 645 646 /// Tests whether the OS is Hurd. isOSHurd()647 bool isOSHurd() const { 648 return getOS() == Triple::Hurd; 649 } 650 651 /// Tests whether the OS is WASI. isOSWASI()652 bool isOSWASI() const { 653 return getOS() == Triple::WASI; 654 } 655 656 /// Tests whether the OS is Emscripten. isOSEmscripten()657 bool isOSEmscripten() const { 658 return getOS() == Triple::Emscripten; 659 } 660 661 /// Tests whether the OS uses glibc. isOSGlibc()662 bool isOSGlibc() const { 663 return (getOS() == Triple::Linux || getOS() == Triple::KFreeBSD || 664 getOS() == Triple::Hurd) && 665 !isAndroid(); 666 } 667 668 /// Tests whether the OS is AIX. isOSAIX()669 bool isOSAIX() const { 670 return getOS() == Triple::AIX; 671 } 672 673 /// Tests whether the OS uses the ELF binary format. isOSBinFormatELF()674 bool isOSBinFormatELF() const { 675 return getObjectFormat() == Triple::ELF; 676 } 677 678 /// Tests whether the OS uses the COFF binary format. isOSBinFormatCOFF()679 bool isOSBinFormatCOFF() const { 680 return getObjectFormat() == Triple::COFF; 681 } 682 683 /// Tests whether the OS uses the GOFF binary format. isOSBinFormatGOFF()684 bool isOSBinFormatGOFF() const { return getObjectFormat() == Triple::GOFF; } 685 686 /// Tests whether the environment is MachO. isOSBinFormatMachO()687 bool isOSBinFormatMachO() const { 688 return getObjectFormat() == Triple::MachO; 689 } 690 691 /// Tests whether the OS uses the Wasm binary format. isOSBinFormatWasm()692 bool isOSBinFormatWasm() const { 693 return getObjectFormat() == Triple::Wasm; 694 } 695 696 /// Tests whether the OS uses the XCOFF binary format. isOSBinFormatXCOFF()697 bool isOSBinFormatXCOFF() const { 698 return getObjectFormat() == Triple::XCOFF; 699 } 700 701 /// Tests whether the OS uses the DXContainer binary format. isOSBinFormatDXContainer()702 bool isOSBinFormatDXContainer() const { 703 return getObjectFormat() == Triple::DXContainer; 704 } 705 706 /// Tests whether the target is the PS4 platform. isPS4()707 bool isPS4() const { 708 return getArch() == Triple::x86_64 && 709 getVendor() == Triple::SCEI && 710 getOS() == Triple::PS4; 711 } 712 713 /// Tests whether the target is the PS5 platform. isPS5()714 bool isPS5() const { 715 return getArch() == Triple::x86_64 && 716 getVendor() == Triple::SCEI && 717 getOS() == Triple::PS5; 718 } 719 720 /// Tests whether the target is the PS4 or PS5 platform. isPS()721 bool isPS() const { return isPS4() || isPS5(); } 722 723 /// Tests whether the target is Android isAndroid()724 bool isAndroid() const { return getEnvironment() == Triple::Android; } 725 isAndroidVersionLT(unsigned Major)726 bool isAndroidVersionLT(unsigned Major) const { 727 assert(isAndroid() && "Not an Android triple!"); 728 729 VersionTuple Version = getEnvironmentVersion(); 730 731 // 64-bit targets did not exist before API level 21 (Lollipop). 732 if (isArch64Bit() && Version.getMajor() < 21) 733 return VersionTuple(21) < VersionTuple(Major); 734 735 return Version < VersionTuple(Major); 736 } 737 738 /// Tests whether the environment is musl-libc isMusl()739 bool isMusl() const { 740 return getEnvironment() == Triple::Musl || 741 getEnvironment() == Triple::MuslEABI || 742 getEnvironment() == Triple::MuslEABIHF || 743 getEnvironment() == Triple::MuslX32; 744 } 745 746 /// Tests whether the target is DXIL. isDXIL()747 bool isDXIL() const { 748 return getArch() == Triple::dxil; 749 } 750 751 /// Tests whether the target is SPIR (32- or 64-bit). isSPIR()752 bool isSPIR() const { 753 return getArch() == Triple::spir || getArch() == Triple::spir64; 754 } 755 756 /// Tests whether the target is SPIR-V (32/64-bit). isSPIRV()757 bool isSPIRV() const { 758 return getArch() == Triple::spirv32 || getArch() == Triple::spirv64; 759 } 760 761 /// Tests whether the target is NVPTX (32- or 64-bit). isNVPTX()762 bool isNVPTX() const { 763 return getArch() == Triple::nvptx || getArch() == Triple::nvptx64; 764 } 765 766 /// Tests whether the target is AMDGCN isAMDGCN()767 bool isAMDGCN() const { return getArch() == Triple::amdgcn; } 768 isAMDGPU()769 bool isAMDGPU() const { 770 return getArch() == Triple::r600 || getArch() == Triple::amdgcn; 771 } 772 773 /// Tests whether the target is Thumb (little and big endian). isThumb()774 bool isThumb() const { 775 return getArch() == Triple::thumb || getArch() == Triple::thumbeb; 776 } 777 778 /// Tests whether the target is ARM (little and big endian). isARM()779 bool isARM() const { 780 return getArch() == Triple::arm || getArch() == Triple::armeb; 781 } 782 783 /// Tests whether the target supports the EHABI exception 784 /// handling standard. isTargetEHABICompatible()785 bool isTargetEHABICompatible() const { 786 return (isARM() || isThumb()) && 787 (getEnvironment() == Triple::EABI || 788 getEnvironment() == Triple::GNUEABI || 789 getEnvironment() == Triple::MuslEABI || 790 getEnvironment() == Triple::EABIHF || 791 getEnvironment() == Triple::GNUEABIHF || 792 getEnvironment() == Triple::MuslEABIHF || isAndroid()) && 793 isOSBinFormatELF(); 794 } 795 796 /// Tests whether the target is T32. isArmT32()797 bool isArmT32() const { 798 switch (getSubArch()) { 799 case Triple::ARMSubArch_v8m_baseline: 800 case Triple::ARMSubArch_v7s: 801 case Triple::ARMSubArch_v7k: 802 case Triple::ARMSubArch_v7ve: 803 case Triple::ARMSubArch_v6: 804 case Triple::ARMSubArch_v6m: 805 case Triple::ARMSubArch_v6k: 806 case Triple::ARMSubArch_v6t2: 807 case Triple::ARMSubArch_v5: 808 case Triple::ARMSubArch_v5te: 809 case Triple::ARMSubArch_v4t: 810 return false; 811 default: 812 return true; 813 } 814 } 815 816 /// Tests whether the target is an M-class. isArmMClass()817 bool isArmMClass() const { 818 switch (getSubArch()) { 819 case Triple::ARMSubArch_v6m: 820 case Triple::ARMSubArch_v7m: 821 case Triple::ARMSubArch_v7em: 822 case Triple::ARMSubArch_v8m_mainline: 823 case Triple::ARMSubArch_v8m_baseline: 824 case Triple::ARMSubArch_v8_1m_mainline: 825 return true; 826 default: 827 return false; 828 } 829 } 830 831 /// Tests whether the target is AArch64 (little and big endian). isAArch64()832 bool isAArch64() const { 833 return getArch() == Triple::aarch64 || getArch() == Triple::aarch64_be || 834 getArch() == Triple::aarch64_32; 835 } 836 837 /// Tests whether the target is AArch64 and pointers are the size specified by 838 /// \p PointerWidth. isAArch64(int PointerWidth)839 bool isAArch64(int PointerWidth) const { 840 assert(PointerWidth == 64 || PointerWidth == 32); 841 if (!isAArch64()) 842 return false; 843 return getArch() == Triple::aarch64_32 || 844 getEnvironment() == Triple::GNUILP32 845 ? PointerWidth == 32 846 : PointerWidth == 64; 847 } 848 849 /// Tests whether the target is LoongArch (32- and 64-bit). isLoongArch()850 bool isLoongArch() const { 851 return getArch() == Triple::loongarch32 || getArch() == Triple::loongarch64; 852 } 853 854 /// Tests whether the target is MIPS 32-bit (little and big endian). isMIPS32()855 bool isMIPS32() const { 856 return getArch() == Triple::mips || getArch() == Triple::mipsel; 857 } 858 859 /// Tests whether the target is MIPS 64-bit (little and big endian). isMIPS64()860 bool isMIPS64() const { 861 return getArch() == Triple::mips64 || getArch() == Triple::mips64el; 862 } 863 864 /// Tests whether the target is MIPS (little and big endian, 32- or 64-bit). isMIPS()865 bool isMIPS() const { 866 return isMIPS32() || isMIPS64(); 867 } 868 869 /// Tests whether the target is PowerPC (32- or 64-bit LE or BE). isPPC()870 bool isPPC() const { 871 return getArch() == Triple::ppc || getArch() == Triple::ppc64 || 872 getArch() == Triple::ppcle || getArch() == Triple::ppc64le; 873 } 874 875 /// Tests whether the target is 32-bit PowerPC (little and big endian). isPPC32()876 bool isPPC32() const { 877 return getArch() == Triple::ppc || getArch() == Triple::ppcle; 878 } 879 880 /// Tests whether the target is 64-bit PowerPC (little and big endian). isPPC64()881 bool isPPC64() const { 882 return getArch() == Triple::ppc64 || getArch() == Triple::ppc64le; 883 } 884 885 /// Tests whether the target 64-bit PowerPC big endian ABI is ELFv2. isPPC64ELFv2ABI()886 bool isPPC64ELFv2ABI() const { 887 return (getArch() == Triple::ppc64 && 888 ((getOS() == Triple::FreeBSD && 889 (getOSMajorVersion() >= 13 || getOSVersion().empty())) || 890 getOS() == Triple::OpenBSD || isMusl())); 891 } 892 893 /// Tests whether the target is 32-bit RISC-V. isRISCV32()894 bool isRISCV32() const { return getArch() == Triple::riscv32; } 895 896 /// Tests whether the target is 64-bit RISC-V. isRISCV64()897 bool isRISCV64() const { return getArch() == Triple::riscv64; } 898 899 /// Tests whether the target is RISC-V (32- and 64-bit). isRISCV()900 bool isRISCV() const { return isRISCV32() || isRISCV64(); } 901 902 /// Tests whether the target is 32-bit SPARC (little and big endian). isSPARC32()903 bool isSPARC32() const { 904 return getArch() == Triple::sparc || getArch() == Triple::sparcel; 905 } 906 907 /// Tests whether the target is 64-bit SPARC (big endian). isSPARC64()908 bool isSPARC64() const { return getArch() == Triple::sparcv9; } 909 910 /// Tests whether the target is SPARC. isSPARC()911 bool isSPARC() const { return isSPARC32() || isSPARC64(); } 912 913 /// Tests whether the target is SystemZ. isSystemZ()914 bool isSystemZ() const { 915 return getArch() == Triple::systemz; 916 } 917 918 /// Tests whether the target is x86 (32- or 64-bit). isX86()919 bool isX86() const { 920 return getArch() == Triple::x86 || getArch() == Triple::x86_64; 921 } 922 923 /// Tests whether the target is VE isVE()924 bool isVE() const { 925 return getArch() == Triple::ve; 926 } 927 928 /// Tests whether the target is wasm (32- and 64-bit). isWasm()929 bool isWasm() const { 930 return getArch() == Triple::wasm32 || getArch() == Triple::wasm64; 931 } 932 933 // Tests whether the target is CSKY isCSKY()934 bool isCSKY() const { 935 return getArch() == Triple::csky; 936 } 937 938 /// Tests whether the target is the Apple "arm64e" AArch64 subarch. isArm64e()939 bool isArm64e() const { 940 return getArch() == Triple::aarch64 && 941 getSubArch() == Triple::AArch64SubArch_arm64e; 942 } 943 944 /// Tests whether the target is X32. isX32()945 bool isX32() const { 946 EnvironmentType Env = getEnvironment(); 947 return Env == Triple::GNUX32 || Env == Triple::MuslX32; 948 } 949 950 /// Tests whether the target is eBPF. isBPF()951 bool isBPF() const { 952 return getArch() == Triple::bpfel || getArch() == Triple::bpfeb; 953 } 954 955 /// Tests whether the target supports comdat supportsCOMDAT()956 bool supportsCOMDAT() const { 957 return !(isOSBinFormatMachO() || isOSBinFormatXCOFF() || 958 isOSBinFormatDXContainer()); 959 } 960 961 /// Tests whether the target uses emulated TLS as default. hasDefaultEmulatedTLS()962 bool hasDefaultEmulatedTLS() const { 963 return isAndroid() || isOSOpenBSD() || isWindowsCygwinEnvironment(); 964 } 965 966 /// Tests whether the target uses -data-sections as default. hasDefaultDataSections()967 bool hasDefaultDataSections() const { 968 return isOSBinFormatXCOFF() || isWasm(); 969 } 970 971 /// Tests if the environment supports dllimport/export annotations. hasDLLImportExport()972 bool hasDLLImportExport() const { return isOSWindows() || isPS(); } 973 974 /// @} 975 /// @name Mutators 976 /// @{ 977 978 /// Set the architecture (first) component of the triple to a known type. 979 void setArch(ArchType Kind, SubArchType SubArch = NoSubArch); 980 981 /// Set the vendor (second) component of the triple to a known type. 982 void setVendor(VendorType Kind); 983 984 /// Set the operating system (third) component of the triple to a known type. 985 void setOS(OSType Kind); 986 987 /// Set the environment (fourth) component of the triple to a known type. 988 void setEnvironment(EnvironmentType Kind); 989 990 /// Set the object file format. 991 void setObjectFormat(ObjectFormatType Kind); 992 993 /// Set all components to the new triple \p Str. 994 void setTriple(const Twine &Str); 995 996 /// Set the architecture (first) component of the triple by name. 997 void setArchName(StringRef Str); 998 999 /// Set the vendor (second) component of the triple by name. 1000 void setVendorName(StringRef Str); 1001 1002 /// Set the operating system (third) component of the triple by name. 1003 void setOSName(StringRef Str); 1004 1005 /// Set the optional environment (fourth) component of the triple by name. 1006 void setEnvironmentName(StringRef Str); 1007 1008 /// Set the operating system and optional environment components with a single 1009 /// string. 1010 void setOSAndEnvironmentName(StringRef Str); 1011 1012 /// @} 1013 /// @name Helpers to build variants of a particular triple. 1014 /// @{ 1015 1016 /// Form a triple with a 32-bit variant of the current architecture. 1017 /// 1018 /// This can be used to move across "families" of architectures where useful. 1019 /// 1020 /// \returns A new triple with a 32-bit architecture or an unknown 1021 /// architecture if no such variant can be found. 1022 llvm::Triple get32BitArchVariant() const; 1023 1024 /// Form a triple with a 64-bit variant of the current architecture. 1025 /// 1026 /// This can be used to move across "families" of architectures where useful. 1027 /// 1028 /// \returns A new triple with a 64-bit architecture or an unknown 1029 /// architecture if no such variant can be found. 1030 llvm::Triple get64BitArchVariant() const; 1031 1032 /// Form a triple with a big endian variant of the current architecture. 1033 /// 1034 /// This can be used to move across "families" of architectures where useful. 1035 /// 1036 /// \returns A new triple with a big endian architecture or an unknown 1037 /// architecture if no such variant can be found. 1038 llvm::Triple getBigEndianArchVariant() const; 1039 1040 /// Form a triple with a little endian variant of the current architecture. 1041 /// 1042 /// This can be used to move across "families" of architectures where useful. 1043 /// 1044 /// \returns A new triple with a little endian architecture or an unknown 1045 /// architecture if no such variant can be found. 1046 llvm::Triple getLittleEndianArchVariant() const; 1047 1048 /// Tests whether the target triple is little endian. 1049 /// 1050 /// \returns true if the triple is little endian, false otherwise. 1051 bool isLittleEndian() const; 1052 1053 /// Test whether target triples are compatible. 1054 bool isCompatibleWith(const Triple &Other) const; 1055 1056 /// Merge target triples. 1057 std::string merge(const Triple &Other) const; 1058 1059 /// Some platforms have different minimum supported OS versions that 1060 /// varies by the architecture specified in the triple. This function 1061 /// returns the minimum supported OS version for this triple if one an exists, 1062 /// or an invalid version tuple if this triple doesn't have one. 1063 VersionTuple getMinimumSupportedOSVersion() const; 1064 1065 /// @} 1066 /// @name Static helpers for IDs. 1067 /// @{ 1068 1069 /// Get the canonical name for the \p Kind architecture. 1070 static StringRef getArchTypeName(ArchType Kind); 1071 1072 /// Get the "prefix" canonical name for the \p Kind architecture. This is the 1073 /// prefix used by the architecture specific builtins, and is suitable for 1074 /// passing to \see Intrinsic::getIntrinsicForClangBuiltin(). 1075 /// 1076 /// \return - The architecture prefix, or 0 if none is defined. 1077 static StringRef getArchTypePrefix(ArchType Kind); 1078 1079 /// Get the canonical name for the \p Kind vendor. 1080 static StringRef getVendorTypeName(VendorType Kind); 1081 1082 /// Get the canonical name for the \p Kind operating system. 1083 static StringRef getOSTypeName(OSType Kind); 1084 1085 /// Get the canonical name for the \p Kind environment. 1086 static StringRef getEnvironmentTypeName(EnvironmentType Kind); 1087 1088 /// @} 1089 /// @name Static helpers for converting alternate architecture names. 1090 /// @{ 1091 1092 /// The canonical type for the given LLVM architecture name (e.g., "x86"). 1093 static ArchType getArchTypeForLLVMName(StringRef Str); 1094 1095 /// @} 1096 1097 /// Returns a canonicalized OS version number for the specified OS. 1098 static VersionTuple getCanonicalVersionForOS(OSType OSKind, 1099 const VersionTuple &Version); 1100 }; 1101 1102 } // End llvm namespace 1103 1104 1105 #endif 1106