1 //===-- llvm/ADT/Triple.h - Target triple helper class ----------*- C++ -*-===// 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 #ifndef LLVM_ADT_TRIPLE_H 11 #define LLVM_ADT_TRIPLE_H 12 13 #include "llvm/ADT/Twine.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 arc, // ARC: Synopsys ARC 54 avr, // AVR: Atmel AVR microcontroller 55 bpfel, // eBPF or extended BPF or 64-bit BPF (little endian) 56 bpfeb, // eBPF or extended BPF or 64-bit BPF (big endian) 57 hexagon, // Hexagon: hexagon 58 mips, // MIPS: mips, mipsallegrex 59 mipsel, // MIPSEL: mipsel, mipsallegrexel 60 mips64, // MIPS64: mips64 61 mips64el, // MIPS64EL: mips64el 62 msp430, // MSP430: msp430 63 nios2, // NIOSII: nios2 64 ppc, // PPC: powerpc 65 ppc64, // PPC64: powerpc64, ppu 66 ppc64le, // PPC64LE: powerpc64le 67 r600, // R600: AMD GPUs HD2XXX - HD6XXX 68 amdgcn, // AMDGCN: AMD GCN GPUs 69 riscv32, // RISC-V (32-bit): riscv32 70 riscv64, // RISC-V (64-bit): riscv64 71 sparc, // Sparc: sparc 72 sparcv9, // Sparcv9: Sparcv9 73 sparcel, // Sparc: (endianness = little). NB: 'Sparcle' is a CPU variant 74 systemz, // SystemZ: s390x 75 tce, // TCE (http://tce.cs.tut.fi/): tce 76 tcele, // TCE little endian (http://tce.cs.tut.fi/): tcele 77 thumb, // Thumb (little endian): thumb, thumbv.* 78 thumbeb, // Thumb (big endian): thumbeb 79 x86, // X86: i[3-9]86 80 x86_64, // X86-64: amd64, x86_64 81 xcore, // XCore: xcore 82 nvptx, // NVPTX: 32-bit 83 nvptx64, // NVPTX: 64-bit 84 le32, // le32: generic little-endian 32-bit CPU (PNaCl) 85 le64, // le64: generic little-endian 64-bit CPU (PNaCl) 86 amdil, // AMDIL 87 amdil64, // AMDIL with 64-bit pointers 88 hsail, // AMD HSAIL 89 hsail64, // AMD HSAIL with 64-bit pointers 90 spir, // SPIR: standard portable IR for OpenCL 32-bit version 91 spir64, // SPIR: standard portable IR for OpenCL 64-bit version 92 kalimba, // Kalimba: generic kalimba 93 shave, // SHAVE: Movidius vector VLIW processors 94 lanai, // Lanai: Lanai 32-bit 95 wasm32, // WebAssembly with 32-bit pointers 96 wasm64, // WebAssembly with 64-bit pointers 97 renderscript32, // 32-bit RenderScript 98 renderscript64, // 64-bit RenderScript 99 LastArchType = renderscript64 100 }; 101 enum SubArchType { 102 NoSubArch, 103 104 ARMSubArch_v8_4a, 105 ARMSubArch_v8_3a, 106 ARMSubArch_v8_2a, 107 ARMSubArch_v8_1a, 108 ARMSubArch_v8, 109 ARMSubArch_v8r, 110 ARMSubArch_v8m_baseline, 111 ARMSubArch_v8m_mainline, 112 ARMSubArch_v7, 113 ARMSubArch_v7em, 114 ARMSubArch_v7m, 115 ARMSubArch_v7s, 116 ARMSubArch_v7k, 117 ARMSubArch_v7ve, 118 ARMSubArch_v6, 119 ARMSubArch_v6m, 120 ARMSubArch_v6k, 121 ARMSubArch_v6t2, 122 ARMSubArch_v5, 123 ARMSubArch_v5te, 124 ARMSubArch_v4t, 125 126 KalimbaSubArch_v3, 127 KalimbaSubArch_v4, 128 KalimbaSubArch_v5 129 }; 130 enum VendorType { 131 UnknownVendor, 132 133 Apple, 134 PC, 135 SCEI, 136 BGP, 137 BGQ, 138 Freescale, 139 IBM, 140 ImaginationTechnologies, 141 MipsTechnologies, 142 NVIDIA, 143 CSR, 144 Myriad, 145 AMD, 146 Mesa, 147 SUSE, 148 OpenEmbedded, 149 LastVendorType = OpenEmbedded 150 }; 151 enum OSType { 152 UnknownOS, 153 154 Ananas, 155 CloudABI, 156 Darwin, 157 DragonFly, 158 FreeBSD, 159 Fuchsia, 160 IOS, 161 KFreeBSD, 162 Linux, 163 Lv2, // PS3 164 MacOSX, 165 NetBSD, 166 OpenBSD, 167 Solaris, 168 Win32, 169 Haiku, 170 Minix, 171 RTEMS, 172 NaCl, // Native Client 173 CNK, // BG/P Compute-Node Kernel 174 AIX, 175 CUDA, // NVIDIA CUDA 176 NVCL, // NVIDIA OpenCL 177 AMDHSA, // AMD HSA Runtime 178 PS4, 179 ELFIAMCU, 180 TvOS, // Apple tvOS 181 WatchOS, // Apple watchOS 182 Mesa3D, 183 Contiki, 184 AMDPAL, // AMD PAL Runtime 185 LastOSType = AMDPAL 186 }; 187 enum EnvironmentType { 188 UnknownEnvironment, 189 190 GNU, 191 GNUABIN32, 192 GNUABI64, 193 GNUEABI, 194 GNUEABIHF, 195 GNUX32, 196 CODE16, 197 EABI, 198 EABIHF, 199 Android, 200 Musl, 201 MuslEABI, 202 MuslEABIHF, 203 204 MSVC, 205 Itanium, 206 Cygnus, 207 CoreCLR, 208 Simulator, // Simulator variants of other systems, e.g., Apple's iOS 209 LastEnvironmentType = Simulator 210 }; 211 enum ObjectFormatType { 212 UnknownObjectFormat, 213 214 COFF, 215 ELF, 216 MachO, 217 Wasm, 218 }; 219 220 private: 221 std::string Data; 222 223 /// The parsed arch type. 224 ArchType Arch; 225 226 /// The parsed subarchitecture type. 227 SubArchType SubArch; 228 229 /// The parsed vendor type. 230 VendorType Vendor; 231 232 /// The parsed OS type. 233 OSType OS; 234 235 /// The parsed Environment type. 236 EnvironmentType Environment; 237 238 /// The object format type. 239 ObjectFormatType ObjectFormat; 240 241 public: 242 /// @name Constructors 243 /// @{ 244 245 /// Default constructor is the same as an empty string and leaves all 246 /// triple fields unknown. Triple()247 Triple() 248 : Data(), Arch(), SubArch(), Vendor(), OS(), Environment(), 249 ObjectFormat() {} 250 251 explicit Triple(const Twine &Str); 252 Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr); 253 Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr, 254 const Twine &EnvironmentStr); 255 256 bool operator==(const Triple &Other) const { 257 return Arch == Other.Arch && SubArch == Other.SubArch && 258 Vendor == Other.Vendor && OS == Other.OS && 259 Environment == Other.Environment && 260 ObjectFormat == Other.ObjectFormat; 261 } 262 263 bool operator!=(const Triple &Other) const { 264 return !(*this == Other); 265 } 266 267 /// @} 268 /// @name Normalization 269 /// @{ 270 271 /// normalize - Turn an arbitrary machine specification into the canonical 272 /// triple form (or something sensible that the Triple class understands if 273 /// nothing better can reasonably be done). In particular, it handles the 274 /// common case in which otherwise valid components are in the wrong order. 275 static std::string normalize(StringRef Str); 276 277 /// Return the normalized form of this triple's string. normalize()278 std::string normalize() const { return normalize(Data); } 279 280 /// @} 281 /// @name Typed Component Access 282 /// @{ 283 284 /// getArch - Get the parsed architecture type of this triple. getArch()285 ArchType getArch() const { return Arch; } 286 287 /// getSubArch - get the parsed subarchitecture type for this triple. getSubArch()288 SubArchType getSubArch() const { return SubArch; } 289 290 /// getVendor - Get the parsed vendor type of this triple. getVendor()291 VendorType getVendor() const { return Vendor; } 292 293 /// getOS - Get the parsed operating system type of this triple. getOS()294 OSType getOS() const { return OS; } 295 296 /// hasEnvironment - Does this triple have the optional environment 297 /// (fourth) component? hasEnvironment()298 bool hasEnvironment() const { 299 return getEnvironmentName() != ""; 300 } 301 302 /// getEnvironment - Get the parsed environment type of this triple. getEnvironment()303 EnvironmentType getEnvironment() const { return Environment; } 304 305 /// Parse the version number from the OS name component of the 306 /// triple, if present. 307 /// 308 /// For example, "fooos1.2.3" would return (1, 2, 3). 309 /// 310 /// If an entry is not defined, it will be returned as 0. 311 void getEnvironmentVersion(unsigned &Major, unsigned &Minor, 312 unsigned &Micro) const; 313 314 /// getFormat - Get the object format for this triple. getObjectFormat()315 ObjectFormatType getObjectFormat() const { return ObjectFormat; } 316 317 /// getOSVersion - Parse the version number from the OS name component of the 318 /// triple, if present. 319 /// 320 /// For example, "fooos1.2.3" would return (1, 2, 3). 321 /// 322 /// If an entry is not defined, it will be returned as 0. 323 void getOSVersion(unsigned &Major, unsigned &Minor, unsigned &Micro) const; 324 325 /// getOSMajorVersion - Return just the major version number, this is 326 /// specialized because it is a common query. getOSMajorVersion()327 unsigned getOSMajorVersion() const { 328 unsigned Maj, Min, Micro; 329 getOSVersion(Maj, Min, Micro); 330 return Maj; 331 } 332 333 /// getMacOSXVersion - Parse the version number as with getOSVersion and then 334 /// translate generic "darwin" versions to the corresponding OS X versions. 335 /// This may also be called with IOS triples but the OS X version number is 336 /// just set to a constant 10.4.0 in that case. Returns true if successful. 337 bool getMacOSXVersion(unsigned &Major, unsigned &Minor, 338 unsigned &Micro) const; 339 340 /// getiOSVersion - Parse the version number as with getOSVersion. This should 341 /// only be called with IOS or generic triples. 342 void getiOSVersion(unsigned &Major, unsigned &Minor, 343 unsigned &Micro) const; 344 345 /// getWatchOSVersion - Parse the version number as with getOSVersion. This 346 /// should only be called with WatchOS or generic triples. 347 void getWatchOSVersion(unsigned &Major, unsigned &Minor, 348 unsigned &Micro) const; 349 350 /// @} 351 /// @name Direct Component Access 352 /// @{ 353 str()354 const std::string &str() const { return Data; } 355 getTriple()356 const std::string &getTriple() const { return Data; } 357 358 /// getArchName - Get the architecture (first) component of the 359 /// triple. 360 StringRef getArchName() const; 361 362 /// getVendorName - Get the vendor (second) component of the triple. 363 StringRef getVendorName() const; 364 365 /// getOSName - Get the operating system (third) component of the 366 /// triple. 367 StringRef getOSName() const; 368 369 /// getEnvironmentName - Get the optional environment (fourth) 370 /// component of the triple, or "" if empty. 371 StringRef getEnvironmentName() const; 372 373 /// getOSAndEnvironmentName - Get the operating system and optional 374 /// environment components as a single string (separated by a '-' 375 /// if the environment component is present). 376 StringRef getOSAndEnvironmentName() const; 377 378 /// @} 379 /// @name Convenience Predicates 380 /// @{ 381 382 /// Test whether the architecture is 64-bit 383 /// 384 /// Note that this tests for 64-bit pointer width, and nothing else. Note 385 /// that we intentionally expose only three predicates, 64-bit, 32-bit, and 386 /// 16-bit. The inner details of pointer width for particular architectures 387 /// is not summed up in the triple, and so only a coarse grained predicate 388 /// system is provided. 389 bool isArch64Bit() const; 390 391 /// Test whether the architecture is 32-bit 392 /// 393 /// Note that this tests for 32-bit pointer width, and nothing else. 394 bool isArch32Bit() const; 395 396 /// Test whether the architecture is 16-bit 397 /// 398 /// Note that this tests for 16-bit pointer width, and nothing else. 399 bool isArch16Bit() const; 400 401 /// isOSVersionLT - Helper function for doing comparisons against version 402 /// numbers included in the target triple. 403 bool isOSVersionLT(unsigned Major, unsigned Minor = 0, 404 unsigned Micro = 0) const { 405 unsigned LHS[3]; 406 getOSVersion(LHS[0], LHS[1], LHS[2]); 407 408 if (LHS[0] != Major) 409 return LHS[0] < Major; 410 if (LHS[1] != Minor) 411 return LHS[1] < Minor; 412 if (LHS[2] != Micro) 413 return LHS[1] < Micro; 414 415 return false; 416 } 417 isOSVersionLT(const Triple & Other)418 bool isOSVersionLT(const Triple &Other) const { 419 unsigned RHS[3]; 420 Other.getOSVersion(RHS[0], RHS[1], RHS[2]); 421 return isOSVersionLT(RHS[0], RHS[1], RHS[2]); 422 } 423 424 /// isMacOSXVersionLT - Comparison function for checking OS X version 425 /// compatibility, which handles supporting skewed version numbering schemes 426 /// used by the "darwin" triples. 427 bool isMacOSXVersionLT(unsigned Major, unsigned Minor = 0, 428 unsigned Micro = 0) const { 429 assert(isMacOSX() && "Not an OS X triple!"); 430 431 // If this is OS X, expect a sane version number. 432 if (getOS() == Triple::MacOSX) 433 return isOSVersionLT(Major, Minor, Micro); 434 435 // Otherwise, compare to the "Darwin" number. 436 assert(Major == 10 && "Unexpected major version"); 437 return isOSVersionLT(Minor + 4, Micro, 0); 438 } 439 440 /// isMacOSX - Is this a Mac OS X triple. For legacy reasons, we support both 441 /// "darwin" and "osx" as OS X triples. isMacOSX()442 bool isMacOSX() const { 443 return getOS() == Triple::Darwin || getOS() == Triple::MacOSX; 444 } 445 446 /// Is this an iOS triple. 447 /// Note: This identifies tvOS as a variant of iOS. If that ever 448 /// changes, i.e., if the two operating systems diverge or their version 449 /// numbers get out of sync, that will need to be changed. 450 /// watchOS has completely different version numbers so it is not included. isiOS()451 bool isiOS() const { 452 return getOS() == Triple::IOS || isTvOS(); 453 } 454 455 /// Is this an Apple tvOS triple. isTvOS()456 bool isTvOS() const { 457 return getOS() == Triple::TvOS; 458 } 459 460 /// Is this an Apple watchOS triple. isWatchOS()461 bool isWatchOS() const { 462 return getOS() == Triple::WatchOS; 463 } 464 isWatchABI()465 bool isWatchABI() const { 466 return getSubArch() == Triple::ARMSubArch_v7k; 467 } 468 469 /// isOSDarwin - Is this a "Darwin" OS (OS X, iOS, or watchOS). isOSDarwin()470 bool isOSDarwin() const { 471 return isMacOSX() || isiOS() || isWatchOS(); 472 } 473 isSimulatorEnvironment()474 bool isSimulatorEnvironment() const { 475 return getEnvironment() == Triple::Simulator; 476 } 477 isOSNetBSD()478 bool isOSNetBSD() const { 479 return getOS() == Triple::NetBSD; 480 } 481 isOSOpenBSD()482 bool isOSOpenBSD() const { 483 return getOS() == Triple::OpenBSD; 484 } 485 isOSFreeBSD()486 bool isOSFreeBSD() const { 487 return getOS() == Triple::FreeBSD; 488 } 489 isOSFuchsia()490 bool isOSFuchsia() const { 491 return getOS() == Triple::Fuchsia; 492 } 493 isOSDragonFly()494 bool isOSDragonFly() const { return getOS() == Triple::DragonFly; } 495 isOSSolaris()496 bool isOSSolaris() const { 497 return getOS() == Triple::Solaris; 498 } 499 isOSIAMCU()500 bool isOSIAMCU() const { 501 return getOS() == Triple::ELFIAMCU; 502 } 503 isOSUnknown()504 bool isOSUnknown() const { return getOS() == Triple::UnknownOS; } 505 isGNUEnvironment()506 bool isGNUEnvironment() const { 507 EnvironmentType Env = getEnvironment(); 508 return Env == Triple::GNU || Env == Triple::GNUABIN32 || 509 Env == Triple::GNUABI64 || Env == Triple::GNUEABI || 510 Env == Triple::GNUEABIHF || Env == Triple::GNUX32; 511 } 512 isOSContiki()513 bool isOSContiki() const { 514 return getOS() == Triple::Contiki; 515 } 516 517 /// Tests whether the OS is Haiku. isOSHaiku()518 bool isOSHaiku() const { 519 return getOS() == Triple::Haiku; 520 } 521 522 /// Checks if the environment could be MSVC. isWindowsMSVCEnvironment()523 bool isWindowsMSVCEnvironment() const { 524 return getOS() == Triple::Win32 && 525 (getEnvironment() == Triple::UnknownEnvironment || 526 getEnvironment() == Triple::MSVC); 527 } 528 529 /// Checks if the environment is MSVC. isKnownWindowsMSVCEnvironment()530 bool isKnownWindowsMSVCEnvironment() const { 531 return getOS() == Triple::Win32 && getEnvironment() == Triple::MSVC; 532 } 533 isWindowsCoreCLREnvironment()534 bool isWindowsCoreCLREnvironment() const { 535 return getOS() == Triple::Win32 && getEnvironment() == Triple::CoreCLR; 536 } 537 isWindowsItaniumEnvironment()538 bool isWindowsItaniumEnvironment() const { 539 return getOS() == Triple::Win32 && getEnvironment() == Triple::Itanium; 540 } 541 isWindowsCygwinEnvironment()542 bool isWindowsCygwinEnvironment() const { 543 return getOS() == Triple::Win32 && getEnvironment() == Triple::Cygnus; 544 } 545 isWindowsGNUEnvironment()546 bool isWindowsGNUEnvironment() const { 547 return getOS() == Triple::Win32 && getEnvironment() == Triple::GNU; 548 } 549 550 /// Tests for either Cygwin or MinGW OS isOSCygMing()551 bool isOSCygMing() const { 552 return isWindowsCygwinEnvironment() || isWindowsGNUEnvironment(); 553 } 554 555 /// Is this a "Windows" OS targeting a "MSVCRT.dll" environment. isOSMSVCRT()556 bool isOSMSVCRT() const { 557 return isWindowsMSVCEnvironment() || isWindowsGNUEnvironment() || 558 isWindowsItaniumEnvironment(); 559 } 560 561 /// Tests whether the OS is Windows. isOSWindows()562 bool isOSWindows() const { 563 return getOS() == Triple::Win32; 564 } 565 566 /// Tests whether the OS is NaCl (Native Client) isOSNaCl()567 bool isOSNaCl() const { 568 return getOS() == Triple::NaCl; 569 } 570 571 /// Tests whether the OS is Linux. isOSLinux()572 bool isOSLinux() const { 573 return getOS() == Triple::Linux; 574 } 575 576 /// Tests whether the OS is kFreeBSD. isOSKFreeBSD()577 bool isOSKFreeBSD() const { 578 return getOS() == Triple::KFreeBSD; 579 } 580 581 /// Tests whether the OS uses glibc. isOSGlibc()582 bool isOSGlibc() const { 583 return (getOS() == Triple::Linux || getOS() == Triple::KFreeBSD) && 584 !isAndroid(); 585 } 586 587 /// Tests whether the OS uses the ELF binary format. isOSBinFormatELF()588 bool isOSBinFormatELF() const { 589 return getObjectFormat() == Triple::ELF; 590 } 591 592 /// Tests whether the OS uses the COFF binary format. isOSBinFormatCOFF()593 bool isOSBinFormatCOFF() const { 594 return getObjectFormat() == Triple::COFF; 595 } 596 597 /// Tests whether the environment is MachO. isOSBinFormatMachO()598 bool isOSBinFormatMachO() const { 599 return getObjectFormat() == Triple::MachO; 600 } 601 602 /// Tests whether the OS uses the Wasm binary format. isOSBinFormatWasm()603 bool isOSBinFormatWasm() const { 604 return getObjectFormat() == Triple::Wasm; 605 } 606 607 /// Tests whether the target is the PS4 CPU isPS4CPU()608 bool isPS4CPU() const { 609 return getArch() == Triple::x86_64 && 610 getVendor() == Triple::SCEI && 611 getOS() == Triple::PS4; 612 } 613 614 /// Tests whether the target is the PS4 platform isPS4()615 bool isPS4() const { 616 return getVendor() == Triple::SCEI && 617 getOS() == Triple::PS4; 618 } 619 620 /// Tests whether the target is Android isAndroid()621 bool isAndroid() const { return getEnvironment() == Triple::Android; } 622 isAndroidVersionLT(unsigned Major)623 bool isAndroidVersionLT(unsigned Major) const { 624 assert(isAndroid() && "Not an Android triple!"); 625 626 unsigned Env[3]; 627 getEnvironmentVersion(Env[0], Env[1], Env[2]); 628 629 // 64-bit targets did not exist before API level 21 (Lollipop). 630 if (isArch64Bit() && Env[0] < 21) 631 Env[0] = 21; 632 633 return Env[0] < Major; 634 } 635 636 /// Tests whether the environment is musl-libc isMusl()637 bool isMusl() const { 638 return getEnvironment() == Triple::Musl || 639 getEnvironment() == Triple::MuslEABI || 640 getEnvironment() == Triple::MuslEABIHF; 641 } 642 643 /// Tests whether the target is NVPTX (32- or 64-bit). isNVPTX()644 bool isNVPTX() const { 645 return getArch() == Triple::nvptx || getArch() == Triple::nvptx64; 646 } 647 648 /// Tests whether the target is Thumb (little and big endian). isThumb()649 bool isThumb() const { 650 return getArch() == Triple::thumb || getArch() == Triple::thumbeb; 651 } 652 653 /// Tests whether the target is ARM (little and big endian). isARM()654 bool isARM() const { 655 return getArch() == Triple::arm || getArch() == Triple::armeb; 656 } 657 658 /// Tests whether the target is AArch64 (little and big endian). isAArch64()659 bool isAArch64() const { 660 return getArch() == Triple::aarch64 || getArch() == Triple::aarch64_be; 661 } 662 663 /// Tests whether the target is MIPS 32-bit (little and big endian). isMIPS32()664 bool isMIPS32() const { 665 return getArch() == Triple::mips || getArch() == Triple::mipsel; 666 } 667 668 /// Tests whether the target is MIPS 64-bit (little and big endian). isMIPS64()669 bool isMIPS64() const { 670 return getArch() == Triple::mips64 || getArch() == Triple::mips64el; 671 } 672 673 /// Tests whether the target is MIPS (little and big endian, 32- or 64-bit). isMIPS()674 bool isMIPS() const { 675 return isMIPS32() || isMIPS64(); 676 } 677 678 /// Tests whether the target supports comdat supportsCOMDAT()679 bool supportsCOMDAT() const { 680 return !isOSBinFormatMachO(); 681 } 682 683 /// Tests whether the target uses emulated TLS as default. hasDefaultEmulatedTLS()684 bool hasDefaultEmulatedTLS() const { 685 return isAndroid() || isOSOpenBSD() || isWindowsCygwinEnvironment(); 686 } 687 688 /// @} 689 /// @name Mutators 690 /// @{ 691 692 /// setArch - Set the architecture (first) component of the triple 693 /// to a known type. 694 void setArch(ArchType Kind); 695 696 /// setVendor - Set the vendor (second) component of the triple to a 697 /// known type. 698 void setVendor(VendorType Kind); 699 700 /// setOS - Set the operating system (third) component of the triple 701 /// to a known type. 702 void setOS(OSType Kind); 703 704 /// setEnvironment - Set the environment (fourth) component of the triple 705 /// to a known type. 706 void setEnvironment(EnvironmentType Kind); 707 708 /// setObjectFormat - Set the object file format 709 void setObjectFormat(ObjectFormatType Kind); 710 711 /// setTriple - Set all components to the new triple \p Str. 712 void setTriple(const Twine &Str); 713 714 /// setArchName - Set the architecture (first) component of the 715 /// triple by name. 716 void setArchName(StringRef Str); 717 718 /// setVendorName - Set the vendor (second) component of the triple 719 /// by name. 720 void setVendorName(StringRef Str); 721 722 /// setOSName - Set the operating system (third) component of the 723 /// triple by name. 724 void setOSName(StringRef Str); 725 726 /// setEnvironmentName - Set the optional environment (fourth) 727 /// component of the triple by name. 728 void setEnvironmentName(StringRef Str); 729 730 /// setOSAndEnvironmentName - Set the operating system and optional 731 /// environment components with a single string. 732 void setOSAndEnvironmentName(StringRef Str); 733 734 /// @} 735 /// @name Helpers to build variants of a particular triple. 736 /// @{ 737 738 /// Form a triple with a 32-bit variant of the current architecture. 739 /// 740 /// This can be used to move across "families" of architectures where useful. 741 /// 742 /// \returns A new triple with a 32-bit architecture or an unknown 743 /// architecture if no such variant can be found. 744 llvm::Triple get32BitArchVariant() const; 745 746 /// Form a triple with a 64-bit variant of the current architecture. 747 /// 748 /// This can be used to move across "families" of architectures where useful. 749 /// 750 /// \returns A new triple with a 64-bit architecture or an unknown 751 /// architecture if no such variant can be found. 752 llvm::Triple get64BitArchVariant() const; 753 754 /// Form a triple with a big endian variant of the current architecture. 755 /// 756 /// This can be used to move across "families" of architectures where useful. 757 /// 758 /// \returns A new triple with a big endian architecture or an unknown 759 /// architecture if no such variant can be found. 760 llvm::Triple getBigEndianArchVariant() const; 761 762 /// Form a triple with a little endian variant of the current architecture. 763 /// 764 /// This can be used to move across "families" of architectures where useful. 765 /// 766 /// \returns A new triple with a little endian architecture or an unknown 767 /// architecture if no such variant can be found. 768 llvm::Triple getLittleEndianArchVariant() const; 769 770 /// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting. 771 /// 772 /// \param Arch the architecture name (e.g., "armv7s"). If it is an empty 773 /// string then the triple's arch name is used. 774 StringRef getARMCPUForArch(StringRef Arch = StringRef()) const; 775 776 /// Tests whether the target triple is little endian. 777 /// 778 /// \returns true if the triple is little endian, false otherwise. 779 bool isLittleEndian() const; 780 781 /// Test whether target triples are compatible. 782 bool isCompatibleWith(const Triple &Other) const; 783 784 /// Merge target triples. 785 std::string merge(const Triple &Other) const; 786 787 /// @} 788 /// @name Static helpers for IDs. 789 /// @{ 790 791 /// getArchTypeName - Get the canonical name for the \p Kind architecture. 792 static StringRef getArchTypeName(ArchType Kind); 793 794 /// getArchTypePrefix - Get the "prefix" canonical name for the \p Kind 795 /// architecture. This is the prefix used by the architecture specific 796 /// builtins, and is suitable for passing to \see 797 /// Intrinsic::getIntrinsicForGCCBuiltin(). 798 /// 799 /// \return - The architecture prefix, or 0 if none is defined. 800 static StringRef getArchTypePrefix(ArchType Kind); 801 802 /// getVendorTypeName - Get the canonical name for the \p Kind vendor. 803 static StringRef getVendorTypeName(VendorType Kind); 804 805 /// getOSTypeName - Get the canonical name for the \p Kind operating system. 806 static StringRef getOSTypeName(OSType Kind); 807 808 /// getEnvironmentTypeName - Get the canonical name for the \p Kind 809 /// environment. 810 static StringRef getEnvironmentTypeName(EnvironmentType Kind); 811 812 /// @} 813 /// @name Static helpers for converting alternate architecture names. 814 /// @{ 815 816 /// getArchTypeForLLVMName - The canonical type for the given LLVM 817 /// architecture name (e.g., "x86"). 818 static ArchType getArchTypeForLLVMName(StringRef Str); 819 820 /// @} 821 }; 822 823 } // End llvm namespace 824 825 826 #endif 827