Triple.h revision aa7507d68dcc04f3118a05b5dff4123ded03253e
1e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes//===-- llvm/ADT/Triple.h - Target triple helper class ----------*- C++ -*-===//
2e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes//
3e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes//                     The LLVM Compiler Infrastructure
4e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes//
5e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes// This file is distributed under the University of Illinois Open Source
6e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes// License. See LICENSE.TXT for details.
7e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes//
8e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes//===----------------------------------------------------------------------===//
9e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
10e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes#ifndef LLVM_ADT_TRIPLE_H
11e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes#define LLVM_ADT_TRIPLE_H
12e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
13e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes#include "llvm/ADT/Twine.h"
14e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
15e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes// Some system headers or GCC predefined macros conflict with identifiers in
16e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes// this file.  Undefine them here.
17e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes#undef mips
18e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes#undef sparc
19e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
20e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesnamespace llvm {
21e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
22e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes/// Triple - Helper class for working with target triples.
23e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes///
24e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes/// Target triples are strings in the canonical form:
25e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes///   ARCHITECTURE-VENDOR-OPERATING_SYSTEM
26e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes/// or
278d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath///   ARCHITECTURE-VENDOR-OPERATING_SYSTEM-ENVIRONMENT
288d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath///
298d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath/// This class is used for clients which want to support arbitrary
308d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath/// target triples, but also want to implement certain special
318d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath/// behavior for particular targets. This class isolates the mapping
328d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath/// from the components of the target triple to well known IDs.
338d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath///
348d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath/// At its core the Triple class is designed to be a wrapper for a triple
358d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath/// string; the constructor does not change or normalize the triple string.
368d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath/// Clients that need to handle the non-canonical triples that users often
378d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath/// specify should use the normalize method.
388d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath///
398d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath/// See autoconf/config.guess for a glimpse into what triples look like in
408d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath/// practice.
418d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamathclass Triple {
428d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamathpublic:
438d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  enum ArchType {
448d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    UnknownArch,
458d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
468d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    arm,     // ARM; arm, armv.*, xscale
478d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    cellspu, // CellSPU: spu, cellspu
488d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    hexagon, // Hexagon: hexagon
498d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    mips,    // MIPS: mips, mipsallegrex
508d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    mipsel,  // MIPSEL: mipsel, mipsallegrexel
518d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    mips64,  // MIPS64: mips64
528d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    mips64el,// MIPS64EL: mips64el
538d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    msp430,  // MSP430: msp430
548d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    ppc,     // PPC: powerpc
558d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    ppc64,   // PPC64: powerpc64, ppu
568d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    r600,    // R600: AMD GPUs HD2XXX - HD6XXX
578d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    sparc,   // Sparc: sparc
588d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    sparcv9, // Sparcv9: Sparcv9
598d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    tce,     // TCE (http://tce.cs.tut.fi/): tce
608d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    thumb,   // Thumb: thumb, thumbv.*
618d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    x86,     // X86: i[3-9]86
628d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    x86_64,  // X86-64: amd64, x86_64
638d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    xcore,   // XCore: xcore
648d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    mblaze,  // MBlaze: mblaze
658d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    nvptx,   // NVPTX: 32-bit
668d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    nvptx64, // NVPTX: 64-bit
678d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    le32,    // le32: generic little-endian 32-bit CPU (PNaCl / Emscripten)
688d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    amdil   // amdil: amd IL
698d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  };
708d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  enum VendorType {
718d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    UnknownVendor,
728d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
738d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    Apple,
748d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    PC,
758d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    SCEI,
768d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    BGP,
778d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    BGQ
788d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  };
798d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  enum OSType {
808d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    UnknownOS,
818d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
828d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    AuroraUX,
838d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    Cygwin,
848d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    Darwin,
858d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    DragonFly,
868d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    FreeBSD,
878d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    IOS,
888d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    KFreeBSD,
898d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    Linux,
908d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    Lv2,        // PS3
918d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    MacOSX,
928d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    MinGW32,    // i*86-pc-mingw32, *-w64-mingw32
938d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    NetBSD,
948d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    OpenBSD,
958d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    Solaris,
968d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    Win32,
978d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    Haiku,
988d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    Minix,
998d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    RTEMS,
1008d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    NativeClient,
1018d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    CNK         // BG/P Compute-Node Kernel
1028d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  };
1038d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  enum EnvironmentType {
1048d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    UnknownEnvironment,
1058d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
1068d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    GNU,
1078d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    GNUEABI,
1088d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    GNUEABIHF,
1098d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    EABI,
1108d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    MachO,
111e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    ANDROIDEABI
1128d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  };
1138d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
1148d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamathprivate:
115e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes  std::string Data;
1168d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
117e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes  /// The parsed arch type.
1188d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  ArchType Arch;
1198d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
1208d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// The parsed vendor type.
1218d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  VendorType Vendor;
1228d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
1238d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// The parsed OS type.
1248d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  OSType OS;
1258d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
1268d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// The parsed Environment type.
1278d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  EnvironmentType Environment;
1288d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
1298d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamathpublic:
1308d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// @name Constructors
1318d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// @{
1328d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
1338d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// \brief Default constructor is the same as an empty string and leaves all
1348d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// triple fields unknown.
1358d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  Triple() : Data(), Arch(), Vendor(), OS(), Environment() {}
1368d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
1378d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  explicit Triple(const Twine &Str);
1388d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr);
1398d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr,
1408d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath         const Twine &EnvironmentStr);
1418d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
1428d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// @}
1438d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// @name Normalization
1448d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// @{
1458d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
1468d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// normalize - Turn an arbitrary machine specification into the canonical
1478d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// triple form (or something sensible that the Triple class understands if
1488d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// nothing better can reasonably be done).  In particular, it handles the
1498d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// common case in which otherwise valid components are in the wrong order.
1508d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  static std::string normalize(StringRef Str);
1518d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
1528d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// @}
1538d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// @name Typed Component Access
1548d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// @{
1558d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
1568d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// getArch - Get the parsed architecture type of this triple.
1578d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  ArchType getArch() const { return Arch; }
1588d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
1598d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// getVendor - Get the parsed vendor type of this triple.
1608d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  VendorType getVendor() const { return Vendor; }
1618d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
1628d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// getOS - Get the parsed operating system type of this triple.
1638d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  OSType getOS() const { return OS; }
1648d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
1658d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// hasEnvironment - Does this triple have the optional environment
1668d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// (fourth) component?
1678d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  bool hasEnvironment() const {
1688d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    return getEnvironmentName() != "";
1698d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  }
1708d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
1718d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// getEnvironment - Get the parsed environment type of this triple.
1728d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  EnvironmentType getEnvironment() const { return Environment; }
1738d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
1748d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// getOSVersion - Parse the version number from the OS name component of the
1758d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// triple, if present.
1768d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  ///
1778d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// For example, "fooos1.2.3" would return (1, 2, 3).
1788d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  ///
1798d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// If an entry is not defined, it will be returned as 0.
1808d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  void getOSVersion(unsigned &Major, unsigned &Minor, unsigned &Micro) const;
1818d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
1828d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// getOSMajorVersion - Return just the major version number, this is
1838d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// specialized because it is a common query.
1848d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  unsigned getOSMajorVersion() const {
1858d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    unsigned Maj, Min, Micro;
1868d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    getOSVersion(Maj, Min, Micro);
1878d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    return Maj;
1888d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  }
1898d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
1908d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// getMacOSXVersion - Parse the version number as with getOSVersion and then
191e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes  /// translate generic "darwin" versions to the corresponding OS X versions.
1928d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// This may also be called with IOS triples but the OS X version number is
1938d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// just set to a constant 10.4.0 in that case.  Returns true if successful.
1948d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  bool getMacOSXVersion(unsigned &Major, unsigned &Minor,
1958d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        unsigned &Micro) const;
1968d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
1978d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// getiOSVersion - Parse the version number as with getOSVersion.  This should
1988d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// only be called with IOS triples.
1998d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  void getiOSVersion(unsigned &Major, unsigned &Minor,
2008d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                     unsigned &Micro) const;
2018d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
2028d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// @}
2038d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// @name Direct Component Access
2048d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// @{
2058d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
2068d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  const std::string &str() const { return Data; }
2078d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
2088d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  const std::string &getTriple() const { return Data; }
2098d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
2108d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// getArchName - Get the architecture (first) component of the
2118d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// triple.
2128d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  StringRef getArchName() const;
2138d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
2148d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// getVendorName - Get the vendor (second) component of the triple.
2158d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  StringRef getVendorName() const;
2168d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
2178d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// getOSName - Get the operating system (third) component of the
2188d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// triple.
2198d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  StringRef getOSName() const;
2208d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
2218d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// getEnvironmentName - Get the optional environment (fourth)
2228d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// component of the triple, or "" if empty.
2238d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  StringRef getEnvironmentName() const;
2248d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
2258d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// getOSAndEnvironmentName - Get the operating system and optional
2268d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// environment components as a single string (separated by a '-'
2278d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// if the environment component is present).
2288d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  StringRef getOSAndEnvironmentName() const;
2298d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
2308d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// @}
2318d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// @name Convenience Predicates
2328d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// @{
2338d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
2348d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// \brief Test whether the architecture is 64-bit
2358d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  ///
2368d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// Note that this tests for 64-bit pointer width, and nothing else. Note
2378d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// that we intentionally expose only three predicates, 64-bit, 32-bit, and
2388d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// 16-bit. The inner details of pointer width for particular architectures
2398d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// is not summed up in the triple, and so only a coarse grained predicate
2408d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// system is provided.
2418d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  bool isArch64Bit() const;
2428d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
2438d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// \brief Test whether the architecture is 32-bit
2448d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  ///
2458d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// Note that this tests for 32-bit pointer width, and nothing else.
2468d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  bool isArch32Bit() const;
2478d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
2488d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// \brief Test whether the architecture is 16-bit
2498d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  ///
2508d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// Note that this tests for 16-bit pointer width, and nothing else.
2518d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  bool isArch16Bit() const;
2528d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
2538d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// isOSVersionLT - Helper function for doing comparisons against version
2548d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// numbers included in the target triple.
2558d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  bool isOSVersionLT(unsigned Major, unsigned Minor = 0,
2568d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                     unsigned Micro = 0) const {
2578d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    unsigned LHS[3];
2588d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    getOSVersion(LHS[0], LHS[1], LHS[2]);
2598d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
2608d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    if (LHS[0] != Major)
2618d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath      return LHS[0] < Major;
2628d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    if (LHS[1] != Minor)
2638d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath      return LHS[1] < Minor;
2648d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    if (LHS[2] != Micro)
2658d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath      return LHS[1] < Micro;
2668d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
2678d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    return false;
2688d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  }
2698d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
2708d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// isMacOSXVersionLT - Comparison function for checking OS X version
2718d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// compatibility, which handles supporting skewed version numbering schemes
2728d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// used by the "darwin" triples.
2738d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  unsigned isMacOSXVersionLT(unsigned Major, unsigned Minor = 0,
2748d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                             unsigned Micro = 0) const {
2758d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    assert(isMacOSX() && "Not an OS X triple!");
2768d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
2778d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    // If this is OS X, expect a sane version number.
2788d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    if (getOS() == Triple::MacOSX)
2798d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath      return isOSVersionLT(Major, Minor, Micro);
2808d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
2818d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    // Otherwise, compare to the "Darwin" number.
2828d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    assert(Major == 10 && "Unexpected major version");
2838d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    return isOSVersionLT(Minor + 4, Micro, 0);
2848d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  }
2858d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
2868d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// isMacOSX - Is this a Mac OS X triple. For legacy reasons, we support both
2878d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// "darwin" and "osx" as OS X triples.
2888d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  bool isMacOSX() const {
2898d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    return getOS() == Triple::Darwin || getOS() == Triple::MacOSX;
2908d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  }
2918d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
2928d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// isOSDarwin - Is this a "Darwin" OS (OS X or iOS).
2938d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  bool isOSDarwin() const {
2948d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    return isMacOSX() || getOS() == Triple::IOS;
2958d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  }
2968d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
2978d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// \brief Tests for either Cygwin or MinGW OS
2988d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  bool isOSCygMing() const {
2998d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    return getOS() == Triple::Cygwin || getOS() == Triple::MinGW32;
3008d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  }
3018d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
3028d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// isOSWindows - Is this a "Windows" OS.
3038d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  bool isOSWindows() const {
3048d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    return getOS() == Triple::Win32 || isOSCygMing();
3058d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  }
3068d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
3078d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// \brief Tests whether the OS uses the ELF binary format.
3088d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  bool isOSBinFormatELF() const {
3098d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    return !isOSDarwin() && !isOSWindows();
3108d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  }
3118d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
3128d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// \brief Tests whether the OS uses the COFF binary format.
3138d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  bool isOSBinFormatCOFF() const {
3148d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    return isOSWindows();
3158d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  }
3168d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
3178d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// \brief Tests whether the environment is MachO.
3188d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  // FIXME: Should this be an OSBinFormat predicate?
3198d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  bool isEnvironmentMachO() const {
3208d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    return getEnvironment() == Triple::MachO || isOSDarwin();
3218d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  }
3228d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
3238d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// @}
3248d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// @name Mutators
3258d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// @{
3268d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
3278d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// setArch - Set the architecture (first) component of the triple
3288d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// to a known type.
3298d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  void setArch(ArchType Kind);
3308d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
3318d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// setVendor - Set the vendor (second) component of the triple to a
3328d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// known type.
3338d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  void setVendor(VendorType Kind);
3348d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
3358d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// setOS - Set the operating system (third) component of the triple
3368d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// to a known type.
3378d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  void setOS(OSType Kind);
3388d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
3398d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// setEnvironment - Set the environment (fourth) component of the triple
3408d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// to a known type.
3418d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  void setEnvironment(EnvironmentType Kind);
3428d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
3438d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath  /// setTriple - Set all components to the new triple \arg Str.
344e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes  void setTriple(const Twine &Str);
345
346  /// setArchName - Set the architecture (first) component of the
347  /// triple by name.
348  void setArchName(StringRef Str);
349
350  /// setVendorName - Set the vendor (second) component of the triple
351  /// by name.
352  void setVendorName(StringRef Str);
353
354  /// setOSName - Set the operating system (third) component of the
355  /// triple by name.
356  void setOSName(StringRef Str);
357
358  /// setEnvironmentName - Set the optional environment (fourth)
359  /// component of the triple by name.
360  void setEnvironmentName(StringRef Str);
361
362  /// setOSAndEnvironmentName - Set the operating system and optional
363  /// environment components with a single string.
364  void setOSAndEnvironmentName(StringRef Str);
365
366  /// getArchNameForAssembler - Get an architecture name that is understood by
367  /// the target assembler.
368  const char *getArchNameForAssembler();
369
370  /// @}
371  /// @name Helpers to build variants of a particular triple.
372  /// @{
373
374  /// \brief Form a triple with a 32-bit variant of the current architecture.
375  ///
376  /// This can be used to move across "families" of architectures where useful.
377  ///
378  /// \returns A new triple with a 32-bit architecture or an unknown
379  ///          architecture if no such variant can be found.
380  llvm::Triple get32BitArchVariant() const;
381
382  /// \brief Form a triple with a 64-bit variant of the current architecture.
383  ///
384  /// This can be used to move across "families" of architectures where useful.
385  ///
386  /// \returns A new triple with a 64-bit architecture or an unknown
387  ///          architecture if no such variant can be found.
388  llvm::Triple get64BitArchVariant() const;
389
390  /// @}
391  /// @name Static helpers for IDs.
392  /// @{
393
394  /// getArchTypeName - Get the canonical name for the \arg Kind
395  /// architecture.
396  static const char *getArchTypeName(ArchType Kind);
397
398  /// getArchTypePrefix - Get the "prefix" canonical name for the \arg Kind
399  /// architecture. This is the prefix used by the architecture specific
400  /// builtins, and is suitable for passing to \see
401  /// Intrinsic::getIntrinsicForGCCBuiltin().
402  ///
403  /// \return - The architecture prefix, or 0 if none is defined.
404  static const char *getArchTypePrefix(ArchType Kind);
405
406  /// getVendorTypeName - Get the canonical name for the \arg Kind
407  /// vendor.
408  static const char *getVendorTypeName(VendorType Kind);
409
410  /// getOSTypeName - Get the canonical name for the \arg Kind operating
411  /// system.
412  static const char *getOSTypeName(OSType Kind);
413
414  /// getEnvironmentTypeName - Get the canonical name for the \arg Kind
415  /// environment.
416  static const char *getEnvironmentTypeName(EnvironmentType Kind);
417
418  /// @}
419  /// @name Static helpers for converting alternate architecture names.
420  /// @{
421
422  /// getArchTypeForLLVMName - The canonical type for the given LLVM
423  /// architecture name (e.g., "x86").
424  static ArchType getArchTypeForLLVMName(StringRef Str);
425
426  /// getArchTypeForDarwinArchName - Get the architecture type for a "Darwin"
427  /// architecture name, for example as accepted by "gcc -arch" (see also
428  /// arch(3)).
429  static ArchType getArchTypeForDarwinArchName(StringRef Str);
430
431  /// @}
432};
433
434} // End llvm namespace
435
436
437#endif
438