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