Triple.h revision 7eaf057e54e9b5f0469057c71d81dcfee90d9e12
1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//===-- llvm/ADT/Triple.h - Target triple helper class ----------*- C++ -*-===// 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// The LLVM Compiler Infrastructure 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// This file is distributed under the University of Illinois Open Source 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// License. See LICENSE.TXT for details. 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//===----------------------------------------------------------------------===// 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef LLVM_ADT_TRIPLE_H 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define LLVM_ADT_TRIPLE_H 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <string> 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnamespace llvm { 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/// Triple - Helper class for working with target triples. 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/// 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/// Target triples are strings in the format of: 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/// ARCHITECTURE-VENDOR-OPERATING_SYSTEM 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/// or 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/// ARCHITECTURE-VENDOR-OPERATING_SYSTEM-ENVIRONMENT 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/// 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/// This class is used for clients which want to support arbitrary 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/// target triples, but also want to implement certain special 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/// behavior for particular targets. This class isolates the mapping 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/// from the components of the target triple to well known IDs. 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/// 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/// See autoconf/config.guess for a glimpse into what they look like 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/// in practice. 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass Triple { 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum ArchType { 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UnknownArch, 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x86, // i?86 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ppc, // powerpc 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ppc64, // powerpc64 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x86_64, // amd64, x86_64 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org InvalidArch 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }; 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum VendorType { 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UnknownVendor, 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Apple, 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PC 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }; 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum OSType { 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UnknownOS, 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Darwin, 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DragonFly, 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FreeBSD, 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Linux 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }; 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprivate: 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org std::string Data; 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// The parsed arch type (or InvalidArch if uninitialized). 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mutable ArchType Arch; 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// The parsed vendor type. 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mutable VendorType Vendor; 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// The parsed OS type. 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mutable OSType OS; 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool isInitialized() const { return Arch != InvalidArch; } 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void Parse() const; 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// @name Constructors 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// @{ 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Triple() : Data(""), Arch(InvalidArch) {} 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org explicit Triple(const char *Str) : Data(Str), Arch(InvalidArch) {} 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org explicit Triple(const char *ArchStr, const char *VendorStr, const char *OSStr) 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org : Data(ArchStr), Arch(InvalidArch) { 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Data += '-'; 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Data += VendorStr; 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Data += '-'; 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Data += OSStr; 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// @} 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// @name Typed Component Access 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// @{ 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// getArch - Get the parsed architecture type of this triple. 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ArchType getArch() const { 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!isInitialized()) Parse(); 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return Arch; 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// getVendor - Get the parsed vendor type of this triple. 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VendorType getVendor() const { 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!isInitialized()) Parse(); 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return Vendor; 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// getOS - Get the parsed operating system type of this triple. 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OSType getOS() const { 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!isInitialized()) Parse(); 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return OS; 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// hasEnvironment - Does this triple have the optional environment 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// (fourth) component? 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool hasEnvironment() const { 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return getEnvironmentName() != ""; 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// @} 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// @name Direct Component Access 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// @{ 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const std::string &getTriple() const { return Data; } 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // FIXME: Invent a lightweight string representation for these to 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // use. 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// getArchName - Get the architecture (first) component of the 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// triple. 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org std::string getArchName() const; 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// getVendorName - Get the vendor (second) component of the triple. 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org std::string getVendorName() const; 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// getOSName - Get the operating system (third) component of the 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// triple. 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org std::string getOSName() const; 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// getEnvironmentName - Get the optional environment (fourth) 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// component of the triple, or "" if empty. 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org std::string getEnvironmentName() const; 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// getOSAndEnvironmentName - Get the operating system and optional 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// environment components as a single string (separated by a '-' 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// if the environment component is present). 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org std::string getOSAndEnvironmentName() const; 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// @} 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// @name Mutators 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// @{ 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// setArch - Set the architecture (first) component of the triple 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// to a known type. 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void setArch(ArchType Kind); 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// setVendor - Set the vendor (second) component of the triple to a 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// known type. 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void setVendor(VendorType Kind); 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// setOS - Set the operating system (third) component of the triple 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// to a known type. 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void setOS(OSType Kind); 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// setTriple - Set all components to the new triple \arg Str. 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void setTriple(const std::string &Str); 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// setArchName - Set the architecture (first) component of the 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// triple by name. 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void setArchName(const std::string &Str); 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// setVendorName - Set the vendor (second) component of the triple 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// by name. 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void setVendorName(const std::string &Str); 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// setOSName - Set the operating system (third) component of the 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// triple by name. 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void setOSName(const std::string &Str); 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// setEnvironmentName - Set the optional environment (fourth) 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// component of the triple by name. 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void setEnvironmentName(const std::string &Str); 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// setOSAndEnvironmentName - Set the operating system and optional 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// environment components with a single string. 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void setOSAndEnvironmentName(const std::string &Str); 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// @} 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// @name Static helpers for IDs. 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// @{ 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// getArchTypeName - Get the canonical name for the \arg Kind 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// architecture. 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static const char *getArchTypeName(ArchType Kind); 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// getVendorTypeName - Get the canonical name for the \arg Kind 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// vendor. 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static const char *getVendorTypeName(VendorType Kind); 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// getOSTypeName - Get the canonical name for the \arg Kind vendor. 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static const char *getOSTypeName(OSType Kind); 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// @} 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} // End llvm namespace 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org