Triple.h revision fdb0b7b555aaea054f85f654275fce56e5d7d1d3
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/StringRef.h" 14#include <string> 15 16namespace llvm { 17class StringRef; 18class Twine; 19 20/// Triple - Helper class for working with target triples. 21/// 22/// Target triples are strings in the format of: 23/// ARCHITECTURE-VENDOR-OPERATING_SYSTEM 24/// or 25/// ARCHITECTURE-VENDOR-OPERATING_SYSTEM-ENVIRONMENT 26/// 27/// This class is used for clients which want to support arbitrary 28/// target triples, but also want to implement certain special 29/// behavior for particular targets. This class isolates the mapping 30/// from the components of the target triple to well known IDs. 31/// 32/// See autoconf/config.guess for a glimpse into what they look like 33/// in practice. 34class Triple { 35public: 36 enum ArchType { 37 UnknownArch, 38 39 alpha, // Alpha: alpha 40 arm, // ARM; arm, armv.* 41 bfin, // Blackfin: bfin 42 cellspu, // CellSPU: spu, cellspu 43 mips, // MIPS: mips, mipsallegrex 44 mipsel, // MIPSEL: mipsel, mipsallegrexel, psp 45 msp430, // MPS430: msp430 46 pic16, // PIC16: pic16 47 ppc, // PPC: powerpc 48 ppc64, // PPC64: powerpc64 49 sparc, // Sparc: sparc 50 systemz, // SystemZ: s390x 51 thumb, // Thumb: thumb, thumbv.* 52 x86, // X86: i[3-9]86 53 x86_64, // X86-64: amd64, x86_64 54 xcore, // XCore: xcore 55 56 InvalidArch 57 }; 58 enum VendorType { 59 UnknownVendor, 60 61 Apple, 62 PC 63 }; 64 enum OSType { 65 UnknownOS, 66 67 AuroraUX, 68 Cygwin, 69 Darwin, 70 DragonFly, 71 FreeBSD, 72 Linux, 73 MinGW32, 74 MinGW64, 75 NetBSD, 76 OpenBSD, 77 Solaris, 78 Win32 79 }; 80 81private: 82 std::string Data; 83 84 /// The parsed arch type (or InvalidArch if uninitialized). 85 mutable ArchType Arch; 86 87 /// The parsed vendor type. 88 mutable VendorType Vendor; 89 90 /// The parsed OS type. 91 mutable OSType OS; 92 93 bool isInitialized() const { return Arch != InvalidArch; } 94 void Parse() const; 95 96public: 97 /// @name Constructors 98 /// @{ 99 100 Triple() : Data(), Arch(InvalidArch) {} 101 explicit Triple(const StringRef &Str) : Data(Str), Arch(InvalidArch) {} 102 explicit Triple(const char *ArchStr, const char *VendorStr, const char *OSStr) 103 : Data(ArchStr), Arch(InvalidArch) { 104 Data += '-'; 105 Data += VendorStr; 106 Data += '-'; 107 Data += OSStr; 108 } 109 110 /// @} 111 /// @name Typed Component Access 112 /// @{ 113 114 /// getArch - Get the parsed architecture type of this triple. 115 ArchType getArch() const { 116 if (!isInitialized()) Parse(); 117 return Arch; 118 } 119 120 /// getVendor - Get the parsed vendor type of this triple. 121 VendorType getVendor() const { 122 if (!isInitialized()) Parse(); 123 return Vendor; 124 } 125 126 /// getOS - Get the parsed operating system type of this triple. 127 OSType getOS() const { 128 if (!isInitialized()) Parse(); 129 return OS; 130 } 131 132 /// hasEnvironment - Does this triple have the optional environment 133 /// (fourth) component? 134 bool hasEnvironment() const { 135 return getEnvironmentName() != ""; 136 } 137 138 /// @} 139 /// @name Direct Component Access 140 /// @{ 141 142 const std::string &getTriple() const { return Data; } 143 144 /// getArchName - Get the architecture (first) component of the 145 /// triple. 146 StringRef getArchName() const; 147 148 /// getVendorName - Get the vendor (second) component of the triple. 149 StringRef getVendorName() const; 150 151 /// getOSName - Get the operating system (third) component of the 152 /// triple. 153 StringRef getOSName() const; 154 155 /// getEnvironmentName - Get the optional environment (fourth) 156 /// component of the triple, or "" if empty. 157 StringRef getEnvironmentName() const; 158 159 /// getOSAndEnvironmentName - Get the operating system and optional 160 /// environment components as a single string (separated by a '-' 161 /// if the environment component is present). 162 StringRef getOSAndEnvironmentName() const; 163 164 165 /// getDarwinNumber - Parse the 'darwin number' out of the specific target 166 /// triple. For example, if we have darwin8.5 return 8,5,0. If any entry is 167 /// not defined, return 0's. This requires that the triple have an OSType of 168 /// darwin before it is called. 169 void getDarwinNumber(unsigned &Maj, unsigned &Min, unsigned &Revision) const; 170 171 /// getDarwinMajorNumber - Return just the major version number, this is 172 /// specialized because it is a common query. 173 unsigned getDarwinMajorNumber() const { 174 unsigned Maj, Min, Rev; 175 getDarwinNumber(Maj, Min, Rev); 176 return Maj; 177 } 178 179 /// @} 180 /// @name Mutators 181 /// @{ 182 183 /// setArch - Set the architecture (first) component of the triple 184 /// to a known type. 185 void setArch(ArchType Kind); 186 187 /// setVendor - Set the vendor (second) component of the triple to a 188 /// known type. 189 void setVendor(VendorType Kind); 190 191 /// setOS - Set the operating system (third) component of the triple 192 /// to a known type. 193 void setOS(OSType Kind); 194 195 /// setTriple - Set all components to the new triple \arg Str. 196 void setTriple(const Twine &Str); 197 198 /// setArchName - Set the architecture (first) component of the 199 /// triple by name. 200 void setArchName(const StringRef &Str); 201 202 /// setVendorName - Set the vendor (second) component of the triple 203 /// by name. 204 void setVendorName(const StringRef &Str); 205 206 /// setOSName - Set the operating system (third) component of the 207 /// triple by name. 208 void setOSName(const StringRef &Str); 209 210 /// setEnvironmentName - Set the optional environment (fourth) 211 /// component of the triple by name. 212 void setEnvironmentName(const StringRef &Str); 213 214 /// setOSAndEnvironmentName - Set the operating system and optional 215 /// environment components with a single string. 216 void setOSAndEnvironmentName(const StringRef &Str); 217 218 /// @} 219 /// @name Static helpers for IDs. 220 /// @{ 221 222 /// getArchTypeName - Get the canonical name for the \arg Kind 223 /// architecture. 224 static const char *getArchTypeName(ArchType Kind); 225 226 /// getVendorTypeName - Get the canonical name for the \arg Kind 227 /// vendor. 228 static const char *getVendorTypeName(VendorType Kind); 229 230 /// getOSTypeName - Get the canonical name for the \arg Kind vendor. 231 static const char *getOSTypeName(OSType Kind); 232 233 /// getArchTypeForLLVMName - The canonical type for the given LLVM 234 /// architecture name (e.g., "x86"). 235 static ArchType getArchTypeForLLVMName(const StringRef &Str); 236 237 /// @} 238}; 239 240} // End llvm namespace 241 242 243#endif 244