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