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