github.com/igggame/nebulas-go@v2.1.0+incompatible/nbre/3rd_party/build_option_bak/Triple.h (about)

     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_3a,
   105      ARMSubArch_v8_2a,
   106      ARMSubArch_v8_1a,
   107      ARMSubArch_v8,
   108      ARMSubArch_v8r,
   109      ARMSubArch_v8m_baseline,
   110      ARMSubArch_v8m_mainline,
   111      ARMSubArch_v7,
   112      ARMSubArch_v7em,
   113      ARMSubArch_v7m,
   114      ARMSubArch_v7s,
   115      ARMSubArch_v7k,
   116      ARMSubArch_v7ve,
   117      ARMSubArch_v6,
   118      ARMSubArch_v6m,
   119      ARMSubArch_v6k,
   120      ARMSubArch_v6t2,
   121      ARMSubArch_v5,
   122      ARMSubArch_v5te,
   123      ARMSubArch_v4t,
   124  
   125      KalimbaSubArch_v3,
   126      KalimbaSubArch_v4,
   127      KalimbaSubArch_v5
   128    };
   129    enum VendorType {
   130      UnknownVendor,
   131  
   132      Apple,
   133      PC,
   134      SCEI,
   135      BGP,
   136      BGQ,
   137      Freescale,
   138      IBM,
   139      ImaginationTechnologies,
   140      MipsTechnologies,
   141      NVIDIA,
   142      CSR,
   143      Myriad,
   144      AMD,
   145      Mesa,
   146      SUSE,
   147      LastVendorType = SUSE
   148    };
   149    enum OSType {
   150      UnknownOS,
   151  
   152      Ananas,
   153      CloudABI,
   154      Darwin,
   155      DragonFly,
   156      FreeBSD,
   157      Fuchsia,
   158      IOS,
   159      KFreeBSD,
   160      Linux,
   161      Lv2,        // PS3
   162      MacOSX,
   163      NetBSD,
   164      OpenBSD,
   165      Solaris,
   166      Win32,
   167      Haiku,
   168      Minix,
   169      RTEMS,
   170      NaCl,       // Native Client
   171      CNK,        // BG/P Compute-Node Kernel
   172      AIX,
   173      CUDA,       // NVIDIA CUDA
   174      NVCL,       // NVIDIA OpenCL
   175      AMDHSA,     // AMD HSA Runtime
   176      PS4,
   177      ELFIAMCU,
   178      TvOS,       // Apple tvOS
   179      WatchOS,    // Apple watchOS
   180      Mesa3D,
   181      Contiki,
   182      AMDPAL,     // AMD PAL Runtime
   183      LastOSType = AMDPAL
   184    };
   185    enum EnvironmentType {
   186      UnknownEnvironment,
   187  
   188      GNU,
   189      GNUABIN32,
   190      GNUABI64,
   191      GNUEABI,
   192      GNUEABIHF,
   193      GNUX32,
   194      CODE16,
   195      EABI,
   196      EABIHF,
   197      Android,
   198      Musl,
   199      MuslEABI,
   200      MuslEABIHF,
   201  
   202      MSVC,
   203      Itanium,
   204      Cygnus,
   205      AMDOpenCL,
   206      CoreCLR,
   207      OpenCL,
   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.
   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.
   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.
   285    ArchType getArch() const { return Arch; }
   286  
   287    /// getSubArch - get the parsed subarchitecture type for this triple.
   288    SubArchType getSubArch() const { return SubArch; }
   289  
   290    /// getVendor - Get the parsed vendor type of this triple.
   291    VendorType getVendor() const { return Vendor; }
   292  
   293    /// getOS - Get the parsed operating system type of this triple.
   294    OSType getOS() const { return OS; }
   295  
   296    /// hasEnvironment - Does this triple have the optional environment
   297    /// (fourth) component?
   298    bool hasEnvironment() const {
   299      return getEnvironmentName() != "";
   300    }
   301  
   302    /// getEnvironment - Get the parsed environment type of this triple.
   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.
   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.
   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  
   354    const std::string &str() const { return Data; }
   355  
   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  
   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.
   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.
   451    bool isiOS() const {
   452      return getOS() == Triple::IOS || isTvOS();
   453    }
   454  
   455    /// Is this an Apple tvOS triple.
   456    bool isTvOS() const {
   457      return getOS() == Triple::TvOS;
   458    }
   459  
   460    /// Is this an Apple watchOS triple.
   461    bool isWatchOS() const {
   462      return getOS() == Triple::WatchOS;
   463    }
   464  
   465    bool isWatchABI() const {
   466      return getSubArch() == Triple::ARMSubArch_v7k;
   467    }
   468  
   469    /// isOSDarwin - Is this a "Darwin" OS (OS X, iOS, or watchOS).
   470    bool isOSDarwin() const {
   471      return isMacOSX() || isiOS() || isWatchOS();
   472    }
   473  
   474    bool isSimulatorEnvironment() const {
   475      return getEnvironment() == Triple::Simulator;
   476    }
   477  
   478    bool isOSNetBSD() const {
   479      return getOS() == Triple::NetBSD;
   480    }
   481  
   482    bool isOSOpenBSD() const {
   483      return getOS() == Triple::OpenBSD;
   484    }
   485  
   486    bool isOSFreeBSD() const {
   487      return getOS() == Triple::FreeBSD;
   488    }
   489  
   490    bool isOSFuchsia() const {
   491      return getOS() == Triple::Fuchsia;
   492    }
   493  
   494    bool isOSDragonFly() const { return getOS() == Triple::DragonFly; }
   495  
   496    bool isOSSolaris() const {
   497      return getOS() == Triple::Solaris;
   498    }
   499  
   500    bool isOSIAMCU() const {
   501      return getOS() == Triple::ELFIAMCU;
   502    }
   503  
   504    bool isOSUnknown() const { return getOS() == Triple::UnknownOS; }
   505  
   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  
   513    bool isOSContiki() const {
   514      return getOS() == Triple::Contiki;
   515    }
   516  
   517    /// Tests whether the OS is Haiku.
   518    bool isOSHaiku() const {
   519      return getOS() == Triple::Haiku;
   520    }
   521  
   522    /// Checks if the environment could be MSVC.
   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.
   530    bool isKnownWindowsMSVCEnvironment() const {
   531      return getOS() == Triple::Win32 && getEnvironment() == Triple::MSVC;
   532    }
   533  
   534    bool isWindowsCoreCLREnvironment() const {
   535      return getOS() == Triple::Win32 && getEnvironment() == Triple::CoreCLR;
   536    }
   537  
   538    bool isWindowsItaniumEnvironment() const {
   539      return getOS() == Triple::Win32 && getEnvironment() == Triple::Itanium;
   540    }
   541  
   542    bool isWindowsCygwinEnvironment() const {
   543      return getOS() == Triple::Win32 && getEnvironment() == Triple::Cygnus;
   544    }
   545  
   546    bool isWindowsGNUEnvironment() const {
   547      return getOS() == Triple::Win32 && getEnvironment() == Triple::GNU;
   548    }
   549  
   550    /// Tests for either Cygwin or MinGW OS
   551    bool isOSCygMing() const {
   552      return isWindowsCygwinEnvironment() || isWindowsGNUEnvironment();
   553    }
   554  
   555    /// Is this a "Windows" OS targeting a "MSVCRT.dll" environment.
   556    bool isOSMSVCRT() const {
   557      return isWindowsMSVCEnvironment() || isWindowsGNUEnvironment() ||
   558             isWindowsItaniumEnvironment();
   559    }
   560  
   561    /// Tests whether the OS is Windows.
   562    bool isOSWindows() const {
   563      return getOS() == Triple::Win32;
   564    }
   565  
   566    /// Tests whether the OS is NaCl (Native Client)
   567    bool isOSNaCl() const {
   568      return getOS() == Triple::NaCl;
   569    }
   570  
   571    /// Tests whether the OS is Linux.
   572    bool isOSLinux() const {
   573      return getOS() == Triple::Linux;
   574    }
   575  
   576    /// Tests whether the OS is kFreeBSD.
   577    bool isOSKFreeBSD() const {
   578      return getOS() == Triple::KFreeBSD;
   579    }
   580  
   581    /// Tests whether the OS uses glibc.
   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.
   588    bool isOSBinFormatELF() const {
   589      return getObjectFormat() == Triple::ELF;
   590    }
   591  
   592    /// Tests whether the OS uses the COFF binary format.
   593    bool isOSBinFormatCOFF() const {
   594      return getObjectFormat() == Triple::COFF;
   595    }
   596  
   597    /// Tests whether the environment is MachO.
   598    bool isOSBinFormatMachO() const {
   599      return getObjectFormat() == Triple::MachO;
   600    }
   601  
   602    /// Tests whether the OS uses the Wasm binary format.
   603    bool isOSBinFormatWasm() const {
   604      return getObjectFormat() == Triple::Wasm;
   605    }
   606  
   607    /// Tests whether the target is the PS4 CPU
   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
   615    bool isPS4() const {
   616      return getVendor() == Triple::SCEI &&
   617             getOS() == Triple::PS4;
   618    }
   619  
   620    /// Tests whether the target is Android
   621    bool isAndroid() const { return getEnvironment() == Triple::Android; }
   622  
   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
   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).
   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).
   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).
   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).
   659    bool isAArch64() const {
   660      return getArch() == Triple::aarch64 || getArch() == Triple::aarch64_be;
   661    }
   662  
   663    /// Tests wether the target supports comdat
   664    bool supportsCOMDAT() const { return false; }
   665  
   666    /// @}
   667    /// @name Mutators
   668    /// @{
   669  
   670    /// setArch - Set the architecture (first) component of the triple
   671    /// to a known type.
   672    void setArch(ArchType Kind);
   673  
   674    /// setVendor - Set the vendor (second) component of the triple to a
   675    /// known type.
   676    void setVendor(VendorType Kind);
   677  
   678    /// setOS - Set the operating system (third) component of the triple
   679    /// to a known type.
   680    void setOS(OSType Kind);
   681  
   682    /// setEnvironment - Set the environment (fourth) component of the triple
   683    /// to a known type.
   684    void setEnvironment(EnvironmentType Kind);
   685  
   686    /// setObjectFormat - Set the object file format
   687    void setObjectFormat(ObjectFormatType Kind);
   688  
   689    /// setTriple - Set all components to the new triple \p Str.
   690    void setTriple(const Twine &Str);
   691  
   692    /// setArchName - Set the architecture (first) component of the
   693    /// triple by name.
   694    void setArchName(StringRef Str);
   695  
   696    /// setVendorName - Set the vendor (second) component of the triple
   697    /// by name.
   698    void setVendorName(StringRef Str);
   699  
   700    /// setOSName - Set the operating system (third) component of the
   701    /// triple by name.
   702    void setOSName(StringRef Str);
   703  
   704    /// setEnvironmentName - Set the optional environment (fourth)
   705    /// component of the triple by name.
   706    void setEnvironmentName(StringRef Str);
   707  
   708    /// setOSAndEnvironmentName - Set the operating system and optional
   709    /// environment components with a single string.
   710    void setOSAndEnvironmentName(StringRef Str);
   711  
   712    /// @}
   713    /// @name Helpers to build variants of a particular triple.
   714    /// @{
   715  
   716    /// Form a triple with a 32-bit variant of the current architecture.
   717    ///
   718    /// This can be used to move across "families" of architectures where useful.
   719    ///
   720    /// \returns A new triple with a 32-bit architecture or an unknown
   721    ///          architecture if no such variant can be found.
   722    llvm::Triple get32BitArchVariant() const;
   723  
   724    /// Form a triple with a 64-bit variant of the current architecture.
   725    ///
   726    /// This can be used to move across "families" of architectures where useful.
   727    ///
   728    /// \returns A new triple with a 64-bit architecture or an unknown
   729    ///          architecture if no such variant can be found.
   730    llvm::Triple get64BitArchVariant() const;
   731  
   732    /// Form a triple with a big endian variant of the current architecture.
   733    ///
   734    /// This can be used to move across "families" of architectures where useful.
   735    ///
   736    /// \returns A new triple with a big endian architecture or an unknown
   737    ///          architecture if no such variant can be found.
   738    llvm::Triple getBigEndianArchVariant() const;
   739  
   740    /// Form a triple with a little endian variant of the current architecture.
   741    ///
   742    /// This can be used to move across "families" of architectures where useful.
   743    ///
   744    /// \returns A new triple with a little endian architecture or an unknown
   745    ///          architecture if no such variant can be found.
   746    llvm::Triple getLittleEndianArchVariant() const;
   747  
   748    /// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
   749    ///
   750    /// \param Arch the architecture name (e.g., "armv7s"). If it is an empty
   751    /// string then the triple's arch name is used.
   752    StringRef getARMCPUForArch(StringRef Arch = StringRef()) const;
   753  
   754    /// Tests whether the target triple is little endian.
   755    ///
   756    /// \returns true if the triple is little endian, false otherwise.
   757    bool isLittleEndian() const;
   758  
   759    /// Test whether target triples are compatible.
   760    bool isCompatibleWith(const Triple &Other) const;
   761  
   762    /// Merge target triples.
   763    std::string merge(const Triple &Other) const;
   764  
   765    /// @}
   766    /// @name Static helpers for IDs.
   767    /// @{
   768  
   769    /// getArchTypeName - Get the canonical name for the \p Kind architecture.
   770    static StringRef getArchTypeName(ArchType Kind);
   771  
   772    /// getArchTypePrefix - Get the "prefix" canonical name for the \p Kind
   773    /// architecture. This is the prefix used by the architecture specific
   774    /// builtins, and is suitable for passing to \see
   775    /// Intrinsic::getIntrinsicForGCCBuiltin().
   776    ///
   777    /// \return - The architecture prefix, or 0 if none is defined.
   778    static StringRef getArchTypePrefix(ArchType Kind);
   779  
   780    /// getVendorTypeName - Get the canonical name for the \p Kind vendor.
   781    static StringRef getVendorTypeName(VendorType Kind);
   782  
   783    /// getOSTypeName - Get the canonical name for the \p Kind operating system.
   784    static StringRef getOSTypeName(OSType Kind);
   785  
   786    /// getEnvironmentTypeName - Get the canonical name for the \p Kind
   787    /// environment.
   788    static StringRef getEnvironmentTypeName(EnvironmentType Kind);
   789  
   790    /// @}
   791    /// @name Static helpers for converting alternate architecture names.
   792    /// @{
   793  
   794    /// getArchTypeForLLVMName - The canonical type for the given LLVM
   795    /// architecture name (e.g., "x86").
   796    static ArchType getArchTypeForLLVMName(StringRef Str);
   797  
   798    /// @}
   799  };
   800  
   801  } // End llvm namespace
   802  
   803  
   804  #endif