Triple.cpp revision cd1267d2d68f03026aed21e22f7e28efd510ec5f
123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar//===--- Triple.cpp - Target triple helper class --------------------------===// 223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar// 323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar// The LLVM Compiler Infrastructure 423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar// 523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar// This file is distributed under the University of Illinois Open Source 623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar// License. See LICENSE.TXT for details. 723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar// 823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar//===----------------------------------------------------------------------===// 923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 1023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar#include "llvm/ADT/Triple.h" 1123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar#include <cassert> 1270748756427c115b9344c7ce7759ff7041ce879bMikhail Glushenkov#include <cstring> 1323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarusing namespace llvm; 1423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 1523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar// 1623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 1723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarconst char *Triple::getArchTypeName(ArchType Kind) { 1823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar switch (Kind) { 1923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar case InvalidArch: return "<invalid>"; 2023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar case UnknownArch: return "unknown"; 2123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 2223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar case x86: return "i386"; 2323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar case x86_64: return "x86_64"; 2423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar case ppc: return "powerpc"; 2523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar case ppc64: return "powerpc64"; 2623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar } 2723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 2823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar return "<invalid>"; 2923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 3023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 3123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarconst char *Triple::getVendorTypeName(VendorType Kind) { 3223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar switch (Kind) { 3323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar case UnknownVendor: return "unknown"; 3423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 3523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar case Apple: return "apple"; 3623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar case PC: return "PC"; 3723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar } 3823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 3923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar return "<invalid>"; 4023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 4123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 4223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarconst char *Triple::getOSTypeName(OSType Kind) { 4323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar switch (Kind) { 4423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar case UnknownOS: return "unknown"; 4523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 46852cd112edef55ff6fe334eeaeff153209f85666Duncan Sands case AuroraUX: return "auroraux"; 4723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar case Darwin: return "darwin"; 487eaf057e54e9b5f0469057c71d81dcfee90d9e12Daniel Dunbar case DragonFly: return "dragonfly"; 4923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar case FreeBSD: return "freebsd"; 5023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar case Linux: return "linux"; 51cd1267d2d68f03026aed21e22f7e28efd510ec5fDuncan Sands case OpenBSD: return "openbsd"; 5223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar } 5323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 5423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar return "<invalid>"; 5523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 5623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 5723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar// 5823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 5923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::Parse() const { 6023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar assert(!isInitialized() && "Invalid parse call."); 6123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 6223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar std::string ArchName = getArchName(); 6323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar if (ArchName.size() == 4 && ArchName[0] == 'i' && 6423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar ArchName[2] == '8' && ArchName[3] == '6') 6523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar Arch = x86; 6623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar else if (ArchName == "amd64" || ArchName == "x86_64") 6723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar Arch = x86_64; 6823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar else if (ArchName == "powerpc") 6923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar Arch = ppc; 7023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar else if (ArchName == "powerpc64") 7123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar Arch = ppc64; 7223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar else 7323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar Arch = UnknownArch; 7423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 7523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar std::string VendorName = getVendorName(); 7623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar if (VendorName == "apple") 7723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar Vendor = Apple; 7823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar else if (VendorName == "pc") 7923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar Vendor = PC; 8023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar else 8123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar Vendor = UnknownVendor; 8223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 8323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar std::string OSName = getOSName(); 84852cd112edef55ff6fe334eeaeff153209f85666Duncan Sands if (memcmp(&OSName[0], "auroraux", 8) == 0) 85852cd112edef55ff6fe334eeaeff153209f85666Duncan Sands OS = AuroraUX; 86852cd112edef55ff6fe334eeaeff153209f85666Duncan Sands else if (memcmp(&OSName[0], "darwin", 6) == 0) 8723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar OS = Darwin; 887eaf057e54e9b5f0469057c71d81dcfee90d9e12Daniel Dunbar else if (memcmp(&OSName[0], "dragonfly", 9) == 0) 897eaf057e54e9b5f0469057c71d81dcfee90d9e12Daniel Dunbar OS = DragonFly; 9023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar else if (memcmp(&OSName[0], "freebsd", 7) == 0) 9123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar OS = FreeBSD; 9223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar else if (memcmp(&OSName[0], "linux", 5) == 0) 9323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar OS = Linux; 94cd1267d2d68f03026aed21e22f7e28efd510ec5fDuncan Sands else if (memcmp(&OSName[0], "openbsd", 7) == 0) 95cd1267d2d68f03026aed21e22f7e28efd510ec5fDuncan Sands OS = OpenBSD; 9623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar else 9723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar OS = UnknownOS; 9823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 9923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar assert(isInitialized() && "Failed to initialize!"); 10023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 10123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 10223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarstatic std::string extract(const std::string &A, 10323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar std::string::size_type begin, 10423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar std::string::size_type end) { 10523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar if (begin == std::string::npos) 10623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar return ""; 10723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar if (end == std::string::npos) 10823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar return A.substr(begin); 10923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar return A.substr(begin, end - begin); 11023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 11123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 11223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarstatic std::string extract1(const std::string &A, 11323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar std::string::size_type begin, 11423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar std::string::size_type end) { 11523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar if (begin == std::string::npos || begin == end) 11623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar return ""; 11723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar return extract(A, begin + 1, end); 11823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 11923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 12023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarstd::string Triple::getArchName() const { 12123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar std::string Tmp = Data; 12223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar return extract(Tmp, 0, Tmp.find('-')); 12323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 12423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 12523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarstd::string Triple::getVendorName() const { 12623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar std::string Tmp = Data; 12723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar Tmp = extract1(Tmp, Tmp.find('-'), std::string::npos); 12823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar return extract(Tmp, 0, Tmp.find('-')); 12923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 13023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 13123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarstd::string Triple::getOSName() const { 13223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar std::string Tmp = Data; 13323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar Tmp = extract1(Tmp, Tmp.find('-'), std::string::npos); 13423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar Tmp = extract1(Tmp, Tmp.find('-'), std::string::npos); 13523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar return extract(Tmp, 0, Tmp.find('-')); 13623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 13723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 13823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarstd::string Triple::getEnvironmentName() const { 13923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar std::string Tmp = Data; 14023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar Tmp = extract1(Tmp, Tmp.find('-'), std::string::npos); 14123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar Tmp = extract1(Tmp, Tmp.find('-'), std::string::npos); 14223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar Tmp = extract1(Tmp, Tmp.find('-'), std::string::npos); 14323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar return extract(Tmp, 0, std::string::npos); 14423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 14523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 14623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarstd::string Triple::getOSAndEnvironmentName() const { 14723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar std::string Tmp = Data; 14823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar Tmp = extract1(Tmp, Tmp.find('-'), std::string::npos); 14923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar Tmp = extract1(Tmp, Tmp.find('-'), std::string::npos); 15023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar return extract(Tmp, 0, std::string::npos); 15123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 15223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 15323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::setTriple(const std::string &Str) { 15423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar Data = Str; 15523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar Arch = InvalidArch; 15623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 15723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 15823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::setArch(ArchType Kind) { 15923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar setArchName(getArchTypeName(Kind)); 16023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 16123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 16223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::setVendor(VendorType Kind) { 16323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar setVendorName(getVendorTypeName(Kind)); 16423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 16523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 16623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::setOS(OSType Kind) { 16723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar setOSName(getOSTypeName(Kind)); 16823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 16923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 17023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::setArchName(const std::string &Str) { 17123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar setTriple(Str + "-" + getVendorName() + "-" + getOSAndEnvironmentName()); 17223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 17323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 17423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::setVendorName(const std::string &Str) { 17523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar setTriple(getArchName() + "-" + Str + "-" + getOSAndEnvironmentName()); 17623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 17723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 17823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::setOSName(const std::string &Str) { 17923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar if (hasEnvironment()) 18023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar setTriple(getArchName() + "-" + getVendorName() + "-" + Str + 18123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar "-" + getEnvironmentName()); 18223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar else 18323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar setTriple(getArchName() + "-" + getVendorName() + "-" + Str); 18423e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 18523e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 18623e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::setEnvironmentName(const std::string &Str) { 18723e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar setTriple(getArchName() + "-" + getVendorName() + "-" + getOSName() + 18823e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar "-" + Str); 18923e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 19023e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar 19123e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbarvoid Triple::setOSAndEnvironmentName(const std::string &Str) { 19223e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar setTriple(getArchName() + "-" + getVendorName() + "-" + Str); 19323e97b05da7b31ed97e5ccc6330670da0173ca2eDaniel Dunbar} 194