Triple.cpp revision 193323
1193323Sed//===--- Triple.cpp - Target triple helper class --------------------------===// 2193323Sed// 3193323Sed// The LLVM Compiler Infrastructure 4193323Sed// 5193323Sed// This file is distributed under the University of Illinois Open Source 6193323Sed// License. See LICENSE.TXT for details. 7193323Sed// 8193323Sed//===----------------------------------------------------------------------===// 9193323Sed 10193323Sed#include "llvm/ADT/Triple.h" 11193323Sed#include <cassert> 12193323Sed#include <cstring> 13193323Sedusing namespace llvm; 14193323Sed 15193323Sed// 16193323Sed 17193323Sedconst char *Triple::getArchTypeName(ArchType Kind) { 18193323Sed switch (Kind) { 19193323Sed case InvalidArch: return "<invalid>"; 20193323Sed case UnknownArch: return "unknown"; 21193323Sed 22193323Sed case x86: return "i386"; 23193323Sed case x86_64: return "x86_64"; 24193323Sed case ppc: return "powerpc"; 25193323Sed case ppc64: return "powerpc64"; 26193323Sed } 27193323Sed 28193323Sed return "<invalid>"; 29193323Sed} 30193323Sed 31193323Sedconst char *Triple::getVendorTypeName(VendorType Kind) { 32193323Sed switch (Kind) { 33193323Sed case UnknownVendor: return "unknown"; 34193323Sed 35193323Sed case Apple: return "apple"; 36193323Sed case PC: return "PC"; 37193323Sed } 38193323Sed 39193323Sed return "<invalid>"; 40193323Sed} 41193323Sed 42193323Sedconst char *Triple::getOSTypeName(OSType Kind) { 43193323Sed switch (Kind) { 44193323Sed case UnknownOS: return "unknown"; 45193323Sed 46193323Sed case Darwin: return "darwin"; 47193323Sed case DragonFly: return "dragonfly"; 48193323Sed case FreeBSD: return "freebsd"; 49193323Sed case Linux: return "linux"; 50193323Sed } 51193323Sed 52193323Sed return "<invalid>"; 53193323Sed} 54193323Sed 55193323Sed// 56193323Sed 57193323Sedvoid Triple::Parse() const { 58193323Sed assert(!isInitialized() && "Invalid parse call."); 59193323Sed 60193323Sed std::string ArchName = getArchName(); 61193323Sed if (ArchName.size() == 4 && ArchName[0] == 'i' && 62193323Sed ArchName[2] == '8' && ArchName[3] == '6') 63193323Sed Arch = x86; 64193323Sed else if (ArchName == "amd64" || ArchName == "x86_64") 65193323Sed Arch = x86_64; 66193323Sed else if (ArchName == "powerpc") 67193323Sed Arch = ppc; 68193323Sed else if (ArchName == "powerpc64") 69193323Sed Arch = ppc64; 70193323Sed else 71193323Sed Arch = UnknownArch; 72193323Sed 73193323Sed std::string VendorName = getVendorName(); 74193323Sed if (VendorName == "apple") 75193323Sed Vendor = Apple; 76193323Sed else if (VendorName == "pc") 77193323Sed Vendor = PC; 78193323Sed else 79193323Sed Vendor = UnknownVendor; 80193323Sed 81193323Sed std::string OSName = getOSName(); 82193323Sed if (memcmp(&OSName[0], "darwin", 6) == 0) 83193323Sed OS = Darwin; 84193323Sed else if (memcmp(&OSName[0], "dragonfly", 9) == 0) 85193323Sed OS = DragonFly; 86193323Sed else if (memcmp(&OSName[0], "freebsd", 7) == 0) 87193323Sed OS = FreeBSD; 88193323Sed else if (memcmp(&OSName[0], "linux", 5) == 0) 89193323Sed OS = Linux; 90193323Sed else 91193323Sed OS = UnknownOS; 92193323Sed 93193323Sed assert(isInitialized() && "Failed to initialize!"); 94193323Sed} 95193323Sed 96193323Sedstatic std::string extract(const std::string &A, 97193323Sed std::string::size_type begin, 98193323Sed std::string::size_type end) { 99193323Sed if (begin == std::string::npos) 100193323Sed return ""; 101193323Sed if (end == std::string::npos) 102193323Sed return A.substr(begin); 103193323Sed return A.substr(begin, end - begin); 104193323Sed} 105193323Sed 106193323Sedstatic std::string extract1(const std::string &A, 107193323Sed std::string::size_type begin, 108193323Sed std::string::size_type end) { 109193323Sed if (begin == std::string::npos || begin == end) 110193323Sed return ""; 111193323Sed return extract(A, begin + 1, end); 112193323Sed} 113193323Sed 114193323Sedstd::string Triple::getArchName() const { 115193323Sed std::string Tmp = Data; 116193323Sed return extract(Tmp, 0, Tmp.find('-')); 117193323Sed} 118193323Sed 119193323Sedstd::string Triple::getVendorName() const { 120193323Sed std::string Tmp = Data; 121193323Sed Tmp = extract1(Tmp, Tmp.find('-'), std::string::npos); 122193323Sed return extract(Tmp, 0, Tmp.find('-')); 123193323Sed} 124193323Sed 125193323Sedstd::string Triple::getOSName() const { 126193323Sed std::string Tmp = Data; 127193323Sed Tmp = extract1(Tmp, Tmp.find('-'), std::string::npos); 128193323Sed Tmp = extract1(Tmp, Tmp.find('-'), std::string::npos); 129193323Sed return extract(Tmp, 0, Tmp.find('-')); 130193323Sed} 131193323Sed 132193323Sedstd::string Triple::getEnvironmentName() const { 133193323Sed std::string Tmp = Data; 134193323Sed Tmp = extract1(Tmp, Tmp.find('-'), std::string::npos); 135193323Sed Tmp = extract1(Tmp, Tmp.find('-'), std::string::npos); 136193323Sed Tmp = extract1(Tmp, Tmp.find('-'), std::string::npos); 137193323Sed return extract(Tmp, 0, std::string::npos); 138193323Sed} 139193323Sed 140193323Sedstd::string Triple::getOSAndEnvironmentName() const { 141193323Sed std::string Tmp = Data; 142193323Sed Tmp = extract1(Tmp, Tmp.find('-'), std::string::npos); 143193323Sed Tmp = extract1(Tmp, Tmp.find('-'), std::string::npos); 144193323Sed return extract(Tmp, 0, std::string::npos); 145193323Sed} 146193323Sed 147193323Sedvoid Triple::setTriple(const std::string &Str) { 148193323Sed Data = Str; 149193323Sed Arch = InvalidArch; 150193323Sed} 151193323Sed 152193323Sedvoid Triple::setArch(ArchType Kind) { 153193323Sed setArchName(getArchTypeName(Kind)); 154193323Sed} 155193323Sed 156193323Sedvoid Triple::setVendor(VendorType Kind) { 157193323Sed setVendorName(getVendorTypeName(Kind)); 158193323Sed} 159193323Sed 160193323Sedvoid Triple::setOS(OSType Kind) { 161193323Sed setOSName(getOSTypeName(Kind)); 162193323Sed} 163193323Sed 164193323Sedvoid Triple::setArchName(const std::string &Str) { 165193323Sed setTriple(Str + "-" + getVendorName() + "-" + getOSAndEnvironmentName()); 166193323Sed} 167193323Sed 168193323Sedvoid Triple::setVendorName(const std::string &Str) { 169193323Sed setTriple(getArchName() + "-" + Str + "-" + getOSAndEnvironmentName()); 170193323Sed} 171193323Sed 172193323Sedvoid Triple::setOSName(const std::string &Str) { 173193323Sed if (hasEnvironment()) 174193323Sed setTriple(getArchName() + "-" + getVendorName() + "-" + Str + 175193323Sed "-" + getEnvironmentName()); 176193323Sed else 177193323Sed setTriple(getArchName() + "-" + getVendorName() + "-" + Str); 178193323Sed} 179193323Sed 180193323Sedvoid Triple::setEnvironmentName(const std::string &Str) { 181193323Sed setTriple(getArchName() + "-" + getVendorName() + "-" + getOSName() + 182193323Sed "-" + Str); 183193323Sed} 184193323Sed 185193323Sedvoid Triple::setOSAndEnvironmentName(const std::string &Str) { 186193323Sed setTriple(getArchName() + "-" + getVendorName() + "-" + Str); 187193323Sed} 188