Path: blob/main/contrib/llvm-project/llvm/lib/TargetParser/Triple.cpp
35233 views
//===--- Triple.cpp - Target triple helper class --------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "llvm/TargetParser/Triple.h"9#include "llvm/ADT/DenseMap.h"10#include "llvm/ADT/SmallString.h"11#include "llvm/ADT/StringExtras.h"12#include "llvm/ADT/StringSwitch.h"13#include "llvm/Support/ErrorHandling.h"14#include "llvm/Support/SwapByteOrder.h"15#include "llvm/Support/VersionTuple.h"16#include "llvm/TargetParser/ARMTargetParser.h"17#include "llvm/TargetParser/ARMTargetParserCommon.h"18#include "llvm/TargetParser/Host.h"19#include <cassert>20#include <cstring>21using namespace llvm;2223StringRef Triple::getArchTypeName(ArchType Kind) {24switch (Kind) {25case UnknownArch: return "unknown";2627case aarch64: return "aarch64";28case aarch64_32: return "aarch64_32";29case aarch64_be: return "aarch64_be";30case amdgcn: return "amdgcn";31case amdil64: return "amdil64";32case amdil: return "amdil";33case arc: return "arc";34case arm: return "arm";35case armeb: return "armeb";36case avr: return "avr";37case bpfeb: return "bpfeb";38case bpfel: return "bpfel";39case csky: return "csky";40case dxil: return "dxil";41case hexagon: return "hexagon";42case hsail64: return "hsail64";43case hsail: return "hsail";44case kalimba: return "kalimba";45case lanai: return "lanai";46case le32: return "le32";47case le64: return "le64";48case loongarch32: return "loongarch32";49case loongarch64: return "loongarch64";50case m68k: return "m68k";51case mips64: return "mips64";52case mips64el: return "mips64el";53case mips: return "mips";54case mipsel: return "mipsel";55case msp430: return "msp430";56case nvptx64: return "nvptx64";57case nvptx: return "nvptx";58case ppc64: return "powerpc64";59case ppc64le: return "powerpc64le";60case ppc: return "powerpc";61case ppcle: return "powerpcle";62case r600: return "r600";63case renderscript32: return "renderscript32";64case renderscript64: return "renderscript64";65case riscv32: return "riscv32";66case riscv64: return "riscv64";67case shave: return "shave";68case sparc: return "sparc";69case sparcel: return "sparcel";70case sparcv9: return "sparcv9";71case spir64: return "spir64";72case spir: return "spir";73case spirv: return "spirv";74case spirv32: return "spirv32";75case spirv64: return "spirv64";76case systemz: return "s390x";77case tce: return "tce";78case tcele: return "tcele";79case thumb: return "thumb";80case thumbeb: return "thumbeb";81case ve: return "ve";82case wasm32: return "wasm32";83case wasm64: return "wasm64";84case x86: return "i386";85case x86_64: return "x86_64";86case xcore: return "xcore";87case xtensa: return "xtensa";88}8990llvm_unreachable("Invalid ArchType!");91}9293StringRef Triple::getArchName(ArchType Kind, SubArchType SubArch) {94switch (Kind) {95case Triple::mips:96if (SubArch == MipsSubArch_r6)97return "mipsisa32r6";98break;99case Triple::mipsel:100if (SubArch == MipsSubArch_r6)101return "mipsisa32r6el";102break;103case Triple::mips64:104if (SubArch == MipsSubArch_r6)105return "mipsisa64r6";106break;107case Triple::mips64el:108if (SubArch == MipsSubArch_r6)109return "mipsisa64r6el";110break;111case Triple::aarch64:112if (SubArch == AArch64SubArch_arm64ec)113return "arm64ec";114if (SubArch == AArch64SubArch_arm64e)115return "arm64e";116break;117case Triple::dxil:118switch (SubArch) {119case Triple::NoSubArch:120case Triple::DXILSubArch_v1_0:121return "dxilv1.0";122case Triple::DXILSubArch_v1_1:123return "dxilv1.1";124case Triple::DXILSubArch_v1_2:125return "dxilv1.2";126case Triple::DXILSubArch_v1_3:127return "dxilv1.3";128case Triple::DXILSubArch_v1_4:129return "dxilv1.4";130case Triple::DXILSubArch_v1_5:131return "dxilv1.5";132case Triple::DXILSubArch_v1_6:133return "dxilv1.6";134case Triple::DXILSubArch_v1_7:135return "dxilv1.7";136case Triple::DXILSubArch_v1_8:137return "dxilv1.8";138default:139break;140}141break;142default:143break;144}145return getArchTypeName(Kind);146}147148StringRef Triple::getArchTypePrefix(ArchType Kind) {149switch (Kind) {150default:151return StringRef();152153case aarch64:154case aarch64_be:155case aarch64_32: return "aarch64";156157case arc: return "arc";158159case arm:160case armeb:161case thumb:162case thumbeb: return "arm";163164case avr: return "avr";165166case ppc64:167case ppc64le:168case ppc:169case ppcle: return "ppc";170171case m68k: return "m68k";172173case mips:174case mipsel:175case mips64:176case mips64el: return "mips";177178case hexagon: return "hexagon";179180case amdgcn: return "amdgcn";181case r600: return "r600";182183case bpfel:184case bpfeb: return "bpf";185186case sparcv9:187case sparcel:188case sparc: return "sparc";189190case systemz: return "s390";191192case x86:193case x86_64: return "x86";194195case xcore: return "xcore";196197// NVPTX intrinsics are namespaced under nvvm.198case nvptx: return "nvvm";199case nvptx64: return "nvvm";200201case le32: return "le32";202case le64: return "le64";203204case amdil:205case amdil64: return "amdil";206207case hsail:208case hsail64: return "hsail";209210case spir:211case spir64: return "spir";212213case spirv:214case spirv32:215case spirv64: return "spv";216217case kalimba: return "kalimba";218case lanai: return "lanai";219case shave: return "shave";220case wasm32:221case wasm64: return "wasm";222223case riscv32:224case riscv64: return "riscv";225226case ve: return "ve";227case csky: return "csky";228229case loongarch32:230case loongarch64: return "loongarch";231232case dxil: return "dx";233234case xtensa: return "xtensa";235}236}237238StringRef Triple::getVendorTypeName(VendorType Kind) {239switch (Kind) {240case UnknownVendor: return "unknown";241242case AMD: return "amd";243case Apple: return "apple";244case CSR: return "csr";245case Freescale: return "fsl";246case IBM: return "ibm";247case ImaginationTechnologies: return "img";248case Mesa: return "mesa";249case MipsTechnologies: return "mti";250case NVIDIA: return "nvidia";251case OpenEmbedded: return "oe";252case PC: return "pc";253case SCEI: return "scei";254case SUSE: return "suse";255}256257llvm_unreachable("Invalid VendorType!");258}259260StringRef Triple::getOSTypeName(OSType Kind) {261switch (Kind) {262case UnknownOS: return "unknown";263264case AIX: return "aix";265case AMDHSA: return "amdhsa";266case AMDPAL: return "amdpal";267case BridgeOS: return "bridgeos";268case CUDA: return "cuda";269case Darwin: return "darwin";270case DragonFly: return "dragonfly";271case DriverKit: return "driverkit";272case ELFIAMCU: return "elfiamcu";273case Emscripten: return "emscripten";274case FreeBSD: return "freebsd";275case Fuchsia: return "fuchsia";276case Haiku: return "haiku";277case HermitCore: return "hermit";278case Hurd: return "hurd";279case IOS: return "ios";280case KFreeBSD: return "kfreebsd";281case Linux: return "linux";282case Lv2: return "lv2";283case MacOSX: return "macosx";284case Mesa3D: return "mesa3d";285case NVCL: return "nvcl";286case NaCl: return "nacl";287case NetBSD: return "netbsd";288case OpenBSD: return "openbsd";289case PS4: return "ps4";290case PS5: return "ps5";291case RTEMS: return "rtems";292case Solaris: return "solaris";293case Serenity: return "serenity";294case TvOS: return "tvos";295case UEFI: return "uefi";296case WASI: return "wasi";297case WatchOS: return "watchos";298case Win32: return "windows";299case ZOS: return "zos";300case ShaderModel: return "shadermodel";301case LiteOS: return "liteos";302case XROS: return "xros";303case Vulkan: return "vulkan";304}305306llvm_unreachable("Invalid OSType");307}308309StringRef Triple::getEnvironmentTypeName(EnvironmentType Kind) {310switch (Kind) {311case UnknownEnvironment: return "unknown";312case Android: return "android";313case CODE16: return "code16";314case CoreCLR: return "coreclr";315case Cygnus: return "cygnus";316case EABI: return "eabi";317case EABIHF: return "eabihf";318case GNU: return "gnu";319case GNUT64: return "gnut64";320case GNUABI64: return "gnuabi64";321case GNUABIN32: return "gnuabin32";322case GNUEABI: return "gnueabi";323case GNUEABIT64: return "gnueabit64";324case GNUEABIHF: return "gnueabihf";325case GNUEABIHFT64: return "gnueabihft64";326case GNUF32: return "gnuf32";327case GNUF64: return "gnuf64";328case GNUSF: return "gnusf";329case GNUX32: return "gnux32";330case GNUILP32: return "gnu_ilp32";331case Itanium: return "itanium";332case MSVC: return "msvc";333case MacABI: return "macabi";334case Musl: return "musl";335case MuslEABI: return "musleabi";336case MuslEABIHF: return "musleabihf";337case MuslX32: return "muslx32";338case Simulator: return "simulator";339case Pixel: return "pixel";340case Vertex: return "vertex";341case Geometry: return "geometry";342case Hull: return "hull";343case Domain: return "domain";344case Compute: return "compute";345case Library: return "library";346case RayGeneration: return "raygeneration";347case Intersection: return "intersection";348case AnyHit: return "anyhit";349case ClosestHit: return "closesthit";350case Miss: return "miss";351case Callable: return "callable";352case Mesh: return "mesh";353case Amplification: return "amplification";354case OpenCL:355return "opencl";356case OpenHOS: return "ohos";357case PAuthTest:358return "pauthtest";359}360361llvm_unreachable("Invalid EnvironmentType!");362}363364StringRef Triple::getObjectFormatTypeName(ObjectFormatType Kind) {365switch (Kind) {366case UnknownObjectFormat: return "";367case COFF: return "coff";368case ELF: return "elf";369case GOFF: return "goff";370case MachO: return "macho";371case Wasm: return "wasm";372case XCOFF: return "xcoff";373case DXContainer: return "dxcontainer";374case SPIRV: return "spirv";375}376llvm_unreachable("unknown object format type");377}378379static Triple::ArchType parseBPFArch(StringRef ArchName) {380if (ArchName == "bpf") {381if (sys::IsLittleEndianHost)382return Triple::bpfel;383else384return Triple::bpfeb;385} else if (ArchName == "bpf_be" || ArchName == "bpfeb") {386return Triple::bpfeb;387} else if (ArchName == "bpf_le" || ArchName == "bpfel") {388return Triple::bpfel;389} else {390return Triple::UnknownArch;391}392}393394Triple::ArchType Triple::getArchTypeForLLVMName(StringRef Name) {395Triple::ArchType BPFArch(parseBPFArch(Name));396return StringSwitch<Triple::ArchType>(Name)397.Case("aarch64", aarch64)398.Case("aarch64_be", aarch64_be)399.Case("aarch64_32", aarch64_32)400.Case("arc", arc)401.Case("arm64", aarch64) // "arm64" is an alias for "aarch64"402.Case("arm64_32", aarch64_32)403.Case("arm", arm)404.Case("armeb", armeb)405.Case("avr", avr)406.StartsWith("bpf", BPFArch)407.Case("m68k", m68k)408.Case("mips", mips)409.Case("mipsel", mipsel)410.Case("mips64", mips64)411.Case("mips64el", mips64el)412.Case("msp430", msp430)413.Case("ppc64", ppc64)414.Case("ppc32", ppc)415.Case("ppc", ppc)416.Case("ppc32le", ppcle)417.Case("ppcle", ppcle)418.Case("ppc64le", ppc64le)419.Case("r600", r600)420.Case("amdgcn", amdgcn)421.Case("riscv32", riscv32)422.Case("riscv64", riscv64)423.Case("hexagon", hexagon)424.Case("sparc", sparc)425.Case("sparcel", sparcel)426.Case("sparcv9", sparcv9)427.Case("s390x", systemz)428.Case("systemz", systemz)429.Case("tce", tce)430.Case("tcele", tcele)431.Case("thumb", thumb)432.Case("thumbeb", thumbeb)433.Case("x86", x86)434.Case("i386", x86)435.Case("x86-64", x86_64)436.Case("xcore", xcore)437.Case("nvptx", nvptx)438.Case("nvptx64", nvptx64)439.Case("le32", le32)440.Case("le64", le64)441.Case("amdil", amdil)442.Case("amdil64", amdil64)443.Case("hsail", hsail)444.Case("hsail64", hsail64)445.Case("spir", spir)446.Case("spir64", spir64)447.Case("spirv", spirv)448.Case("spirv32", spirv32)449.Case("spirv64", spirv64)450.Case("kalimba", kalimba)451.Case("lanai", lanai)452.Case("shave", shave)453.Case("wasm32", wasm32)454.Case("wasm64", wasm64)455.Case("renderscript32", renderscript32)456.Case("renderscript64", renderscript64)457.Case("ve", ve)458.Case("csky", csky)459.Case("loongarch32", loongarch32)460.Case("loongarch64", loongarch64)461.Case("dxil", dxil)462.Case("xtensa", xtensa)463.Default(UnknownArch);464}465466static Triple::ArchType parseARMArch(StringRef ArchName) {467ARM::ISAKind ISA = ARM::parseArchISA(ArchName);468ARM::EndianKind ENDIAN = ARM::parseArchEndian(ArchName);469470Triple::ArchType arch = Triple::UnknownArch;471switch (ENDIAN) {472case ARM::EndianKind::LITTLE: {473switch (ISA) {474case ARM::ISAKind::ARM:475arch = Triple::arm;476break;477case ARM::ISAKind::THUMB:478arch = Triple::thumb;479break;480case ARM::ISAKind::AARCH64:481arch = Triple::aarch64;482break;483case ARM::ISAKind::INVALID:484break;485}486break;487}488case ARM::EndianKind::BIG: {489switch (ISA) {490case ARM::ISAKind::ARM:491arch = Triple::armeb;492break;493case ARM::ISAKind::THUMB:494arch = Triple::thumbeb;495break;496case ARM::ISAKind::AARCH64:497arch = Triple::aarch64_be;498break;499case ARM::ISAKind::INVALID:500break;501}502break;503}504case ARM::EndianKind::INVALID: {505break;506}507}508509ArchName = ARM::getCanonicalArchName(ArchName);510if (ArchName.empty())511return Triple::UnknownArch;512513// Thumb only exists in v4+514if (ISA == ARM::ISAKind::THUMB &&515(ArchName.starts_with("v2") || ArchName.starts_with("v3")))516return Triple::UnknownArch;517518// Thumb only for v6m519ARM::ProfileKind Profile = ARM::parseArchProfile(ArchName);520unsigned Version = ARM::parseArchVersion(ArchName);521if (Profile == ARM::ProfileKind::M && Version == 6) {522if (ENDIAN == ARM::EndianKind::BIG)523return Triple::thumbeb;524else525return Triple::thumb;526}527528return arch;529}530531static Triple::ArchType parseArch(StringRef ArchName) {532auto AT =533StringSwitch<Triple::ArchType>(ArchName)534.Cases("i386", "i486", "i586", "i686", Triple::x86)535// FIXME: Do we need to support these?536.Cases("i786", "i886", "i986", Triple::x86)537.Cases("amd64", "x86_64", "x86_64h", Triple::x86_64)538.Cases("powerpc", "powerpcspe", "ppc", "ppc32", Triple::ppc)539.Cases("powerpcle", "ppcle", "ppc32le", Triple::ppcle)540.Cases("powerpc64", "ppu", "ppc64", Triple::ppc64)541.Cases("powerpc64le", "ppc64le", Triple::ppc64le)542.Case("xscale", Triple::arm)543.Case("xscaleeb", Triple::armeb)544.Case("aarch64", Triple::aarch64)545.Case("aarch64_be", Triple::aarch64_be)546.Case("aarch64_32", Triple::aarch64_32)547.Case("arc", Triple::arc)548.Case("arm64", Triple::aarch64)549.Case("arm64_32", Triple::aarch64_32)550.Case("arm64e", Triple::aarch64)551.Case("arm64ec", Triple::aarch64)552.Case("arm", Triple::arm)553.Case("armeb", Triple::armeb)554.Case("thumb", Triple::thumb)555.Case("thumbeb", Triple::thumbeb)556.Case("avr", Triple::avr)557.Case("m68k", Triple::m68k)558.Case("msp430", Triple::msp430)559.Cases("mips", "mipseb", "mipsallegrex", "mipsisa32r6", "mipsr6",560Triple::mips)561.Cases("mipsel", "mipsallegrexel", "mipsisa32r6el", "mipsr6el",562Triple::mipsel)563.Cases("mips64", "mips64eb", "mipsn32", "mipsisa64r6", "mips64r6",564"mipsn32r6", Triple::mips64)565.Cases("mips64el", "mipsn32el", "mipsisa64r6el", "mips64r6el",566"mipsn32r6el", Triple::mips64el)567.Case("r600", Triple::r600)568.Case("amdgcn", Triple::amdgcn)569.Case("riscv32", Triple::riscv32)570.Case("riscv64", Triple::riscv64)571.Case("hexagon", Triple::hexagon)572.Cases("s390x", "systemz", Triple::systemz)573.Case("sparc", Triple::sparc)574.Case("sparcel", Triple::sparcel)575.Cases("sparcv9", "sparc64", Triple::sparcv9)576.Case("tce", Triple::tce)577.Case("tcele", Triple::tcele)578.Case("xcore", Triple::xcore)579.Case("nvptx", Triple::nvptx)580.Case("nvptx64", Triple::nvptx64)581.Case("le32", Triple::le32)582.Case("le64", Triple::le64)583.Case("amdil", Triple::amdil)584.Case("amdil64", Triple::amdil64)585.Case("hsail", Triple::hsail)586.Case("hsail64", Triple::hsail64)587.Case("spir", Triple::spir)588.Case("spir64", Triple::spir64)589.Cases("spirv", "spirv1.5", "spirv1.6", Triple::spirv)590.Cases("spirv32", "spirv32v1.0", "spirv32v1.1", "spirv32v1.2",591"spirv32v1.3", "spirv32v1.4", "spirv32v1.5",592"spirv32v1.6", Triple::spirv32)593.Cases("spirv64", "spirv64v1.0", "spirv64v1.1", "spirv64v1.2",594"spirv64v1.3", "spirv64v1.4", "spirv64v1.5",595"spirv64v1.6", Triple::spirv64)596.StartsWith("kalimba", Triple::kalimba)597.Case("lanai", Triple::lanai)598.Case("renderscript32", Triple::renderscript32)599.Case("renderscript64", Triple::renderscript64)600.Case("shave", Triple::shave)601.Case("ve", Triple::ve)602.Case("wasm32", Triple::wasm32)603.Case("wasm64", Triple::wasm64)604.Case("csky", Triple::csky)605.Case("loongarch32", Triple::loongarch32)606.Case("loongarch64", Triple::loongarch64)607.Cases("dxil", "dxilv1.0", "dxilv1.1", "dxilv1.2", "dxilv1.3",608"dxilv1.4", "dxilv1.5", "dxilv1.6", "dxilv1.7", "dxilv1.8",609Triple::dxil)610.Case("xtensa", Triple::xtensa)611.Default(Triple::UnknownArch);612613// Some architectures require special parsing logic just to compute the614// ArchType result.615if (AT == Triple::UnknownArch) {616if (ArchName.starts_with("arm") || ArchName.starts_with("thumb") ||617ArchName.starts_with("aarch64"))618return parseARMArch(ArchName);619if (ArchName.starts_with("bpf"))620return parseBPFArch(ArchName);621}622623return AT;624}625626static Triple::VendorType parseVendor(StringRef VendorName) {627return StringSwitch<Triple::VendorType>(VendorName)628.Case("apple", Triple::Apple)629.Case("pc", Triple::PC)630.Case("scei", Triple::SCEI)631.Case("sie", Triple::SCEI)632.Case("fsl", Triple::Freescale)633.Case("ibm", Triple::IBM)634.Case("img", Triple::ImaginationTechnologies)635.Case("mti", Triple::MipsTechnologies)636.Case("nvidia", Triple::NVIDIA)637.Case("csr", Triple::CSR)638.Case("amd", Triple::AMD)639.Case("mesa", Triple::Mesa)640.Case("suse", Triple::SUSE)641.Case("oe", Triple::OpenEmbedded)642.Default(Triple::UnknownVendor);643}644645static Triple::OSType parseOS(StringRef OSName) {646return StringSwitch<Triple::OSType>(OSName)647.StartsWith("darwin", Triple::Darwin)648.StartsWith("dragonfly", Triple::DragonFly)649.StartsWith("freebsd", Triple::FreeBSD)650.StartsWith("fuchsia", Triple::Fuchsia)651.StartsWith("ios", Triple::IOS)652.StartsWith("kfreebsd", Triple::KFreeBSD)653.StartsWith("linux", Triple::Linux)654.StartsWith("lv2", Triple::Lv2)655.StartsWith("macos", Triple::MacOSX)656.StartsWith("netbsd", Triple::NetBSD)657.StartsWith("openbsd", Triple::OpenBSD)658.StartsWith("solaris", Triple::Solaris)659.StartsWith("uefi", Triple::UEFI)660.StartsWith("win32", Triple::Win32)661.StartsWith("windows", Triple::Win32)662.StartsWith("zos", Triple::ZOS)663.StartsWith("haiku", Triple::Haiku)664.StartsWith("rtems", Triple::RTEMS)665.StartsWith("nacl", Triple::NaCl)666.StartsWith("aix", Triple::AIX)667.StartsWith("cuda", Triple::CUDA)668.StartsWith("nvcl", Triple::NVCL)669.StartsWith("amdhsa", Triple::AMDHSA)670.StartsWith("ps4", Triple::PS4)671.StartsWith("ps5", Triple::PS5)672.StartsWith("elfiamcu", Triple::ELFIAMCU)673.StartsWith("tvos", Triple::TvOS)674.StartsWith("watchos", Triple::WatchOS)675.StartsWith("bridgeos", Triple::BridgeOS)676.StartsWith("driverkit", Triple::DriverKit)677.StartsWith("xros", Triple::XROS)678.StartsWith("visionos", Triple::XROS)679.StartsWith("mesa3d", Triple::Mesa3D)680.StartsWith("amdpal", Triple::AMDPAL)681.StartsWith("hermit", Triple::HermitCore)682.StartsWith("hurd", Triple::Hurd)683.StartsWith("wasi", Triple::WASI)684.StartsWith("emscripten", Triple::Emscripten)685.StartsWith("shadermodel", Triple::ShaderModel)686.StartsWith("liteos", Triple::LiteOS)687.StartsWith("serenity", Triple::Serenity)688.StartsWith("vulkan", Triple::Vulkan)689.Default(Triple::UnknownOS);690}691692static Triple::EnvironmentType parseEnvironment(StringRef EnvironmentName) {693return StringSwitch<Triple::EnvironmentType>(EnvironmentName)694.StartsWith("eabihf", Triple::EABIHF)695.StartsWith("eabi", Triple::EABI)696.StartsWith("gnuabin32", Triple::GNUABIN32)697.StartsWith("gnuabi64", Triple::GNUABI64)698.StartsWith("gnueabihft64", Triple::GNUEABIHFT64)699.StartsWith("gnueabihf", Triple::GNUEABIHF)700.StartsWith("gnueabit64", Triple::GNUEABIT64)701.StartsWith("gnueabi", Triple::GNUEABI)702.StartsWith("gnuf32", Triple::GNUF32)703.StartsWith("gnuf64", Triple::GNUF64)704.StartsWith("gnusf", Triple::GNUSF)705.StartsWith("gnux32", Triple::GNUX32)706.StartsWith("gnu_ilp32", Triple::GNUILP32)707.StartsWith("code16", Triple::CODE16)708.StartsWith("gnut64", Triple::GNUT64)709.StartsWith("gnu", Triple::GNU)710.StartsWith("android", Triple::Android)711.StartsWith("musleabihf", Triple::MuslEABIHF)712.StartsWith("musleabi", Triple::MuslEABI)713.StartsWith("muslx32", Triple::MuslX32)714.StartsWith("musl", Triple::Musl)715.StartsWith("msvc", Triple::MSVC)716.StartsWith("itanium", Triple::Itanium)717.StartsWith("cygnus", Triple::Cygnus)718.StartsWith("coreclr", Triple::CoreCLR)719.StartsWith("simulator", Triple::Simulator)720.StartsWith("macabi", Triple::MacABI)721.StartsWith("pixel", Triple::Pixel)722.StartsWith("vertex", Triple::Vertex)723.StartsWith("geometry", Triple::Geometry)724.StartsWith("hull", Triple::Hull)725.StartsWith("domain", Triple::Domain)726.StartsWith("compute", Triple::Compute)727.StartsWith("library", Triple::Library)728.StartsWith("raygeneration", Triple::RayGeneration)729.StartsWith("intersection", Triple::Intersection)730.StartsWith("anyhit", Triple::AnyHit)731.StartsWith("closesthit", Triple::ClosestHit)732.StartsWith("miss", Triple::Miss)733.StartsWith("callable", Triple::Callable)734.StartsWith("mesh", Triple::Mesh)735.StartsWith("amplification", Triple::Amplification)736.StartsWith("opencl", Triple::OpenCL)737.StartsWith("ohos", Triple::OpenHOS)738.StartsWith("pauthtest", Triple::PAuthTest)739.Default(Triple::UnknownEnvironment);740}741742static Triple::ObjectFormatType parseFormat(StringRef EnvironmentName) {743return StringSwitch<Triple::ObjectFormatType>(EnvironmentName)744// "xcoff" must come before "coff" because of the order-dependendent745// pattern matching.746.EndsWith("xcoff", Triple::XCOFF)747.EndsWith("coff", Triple::COFF)748.EndsWith("elf", Triple::ELF)749.EndsWith("goff", Triple::GOFF)750.EndsWith("macho", Triple::MachO)751.EndsWith("wasm", Triple::Wasm)752.EndsWith("spirv", Triple::SPIRV)753.Default(Triple::UnknownObjectFormat);754}755756static Triple::SubArchType parseSubArch(StringRef SubArchName) {757if (SubArchName.starts_with("mips") &&758(SubArchName.ends_with("r6el") || SubArchName.ends_with("r6")))759return Triple::MipsSubArch_r6;760761if (SubArchName == "powerpcspe")762return Triple::PPCSubArch_spe;763764if (SubArchName == "arm64e")765return Triple::AArch64SubArch_arm64e;766767if (SubArchName == "arm64ec")768return Triple::AArch64SubArch_arm64ec;769770if (SubArchName.starts_with("spirv"))771return StringSwitch<Triple::SubArchType>(SubArchName)772.EndsWith("v1.0", Triple::SPIRVSubArch_v10)773.EndsWith("v1.1", Triple::SPIRVSubArch_v11)774.EndsWith("v1.2", Triple::SPIRVSubArch_v12)775.EndsWith("v1.3", Triple::SPIRVSubArch_v13)776.EndsWith("v1.4", Triple::SPIRVSubArch_v14)777.EndsWith("v1.5", Triple::SPIRVSubArch_v15)778.EndsWith("v1.6", Triple::SPIRVSubArch_v16)779.Default(Triple::NoSubArch);780781if (SubArchName.starts_with("dxil"))782return StringSwitch<Triple::SubArchType>(SubArchName)783.EndsWith("v1.0", Triple::DXILSubArch_v1_0)784.EndsWith("v1.1", Triple::DXILSubArch_v1_1)785.EndsWith("v1.2", Triple::DXILSubArch_v1_2)786.EndsWith("v1.3", Triple::DXILSubArch_v1_3)787.EndsWith("v1.4", Triple::DXILSubArch_v1_4)788.EndsWith("v1.5", Triple::DXILSubArch_v1_5)789.EndsWith("v1.6", Triple::DXILSubArch_v1_6)790.EndsWith("v1.7", Triple::DXILSubArch_v1_7)791.EndsWith("v1.8", Triple::DXILSubArch_v1_8)792.Default(Triple::NoSubArch);793794StringRef ARMSubArch = ARM::getCanonicalArchName(SubArchName);795796// For now, this is the small part. Early return.797if (ARMSubArch.empty())798return StringSwitch<Triple::SubArchType>(SubArchName)799.EndsWith("kalimba3", Triple::KalimbaSubArch_v3)800.EndsWith("kalimba4", Triple::KalimbaSubArch_v4)801.EndsWith("kalimba5", Triple::KalimbaSubArch_v5)802.Default(Triple::NoSubArch);803804// ARM sub arch.805switch(ARM::parseArch(ARMSubArch)) {806case ARM::ArchKind::ARMV4:807return Triple::NoSubArch;808case ARM::ArchKind::ARMV4T:809return Triple::ARMSubArch_v4t;810case ARM::ArchKind::ARMV5T:811return Triple::ARMSubArch_v5;812case ARM::ArchKind::ARMV5TE:813case ARM::ArchKind::IWMMXT:814case ARM::ArchKind::IWMMXT2:815case ARM::ArchKind::XSCALE:816case ARM::ArchKind::ARMV5TEJ:817return Triple::ARMSubArch_v5te;818case ARM::ArchKind::ARMV6:819return Triple::ARMSubArch_v6;820case ARM::ArchKind::ARMV6K:821case ARM::ArchKind::ARMV6KZ:822return Triple::ARMSubArch_v6k;823case ARM::ArchKind::ARMV6T2:824return Triple::ARMSubArch_v6t2;825case ARM::ArchKind::ARMV6M:826return Triple::ARMSubArch_v6m;827case ARM::ArchKind::ARMV7A:828case ARM::ArchKind::ARMV7R:829return Triple::ARMSubArch_v7;830case ARM::ArchKind::ARMV7VE:831return Triple::ARMSubArch_v7ve;832case ARM::ArchKind::ARMV7K:833return Triple::ARMSubArch_v7k;834case ARM::ArchKind::ARMV7M:835return Triple::ARMSubArch_v7m;836case ARM::ArchKind::ARMV7S:837return Triple::ARMSubArch_v7s;838case ARM::ArchKind::ARMV7EM:839return Triple::ARMSubArch_v7em;840case ARM::ArchKind::ARMV8A:841return Triple::ARMSubArch_v8;842case ARM::ArchKind::ARMV8_1A:843return Triple::ARMSubArch_v8_1a;844case ARM::ArchKind::ARMV8_2A:845return Triple::ARMSubArch_v8_2a;846case ARM::ArchKind::ARMV8_3A:847return Triple::ARMSubArch_v8_3a;848case ARM::ArchKind::ARMV8_4A:849return Triple::ARMSubArch_v8_4a;850case ARM::ArchKind::ARMV8_5A:851return Triple::ARMSubArch_v8_5a;852case ARM::ArchKind::ARMV8_6A:853return Triple::ARMSubArch_v8_6a;854case ARM::ArchKind::ARMV8_7A:855return Triple::ARMSubArch_v8_7a;856case ARM::ArchKind::ARMV8_8A:857return Triple::ARMSubArch_v8_8a;858case ARM::ArchKind::ARMV8_9A:859return Triple::ARMSubArch_v8_9a;860case ARM::ArchKind::ARMV9A:861return Triple::ARMSubArch_v9;862case ARM::ArchKind::ARMV9_1A:863return Triple::ARMSubArch_v9_1a;864case ARM::ArchKind::ARMV9_2A:865return Triple::ARMSubArch_v9_2a;866case ARM::ArchKind::ARMV9_3A:867return Triple::ARMSubArch_v9_3a;868case ARM::ArchKind::ARMV9_4A:869return Triple::ARMSubArch_v9_4a;870case ARM::ArchKind::ARMV9_5A:871return Triple::ARMSubArch_v9_5a;872case ARM::ArchKind::ARMV8R:873return Triple::ARMSubArch_v8r;874case ARM::ArchKind::ARMV8MBaseline:875return Triple::ARMSubArch_v8m_baseline;876case ARM::ArchKind::ARMV8MMainline:877return Triple::ARMSubArch_v8m_mainline;878case ARM::ArchKind::ARMV8_1MMainline:879return Triple::ARMSubArch_v8_1m_mainline;880default:881return Triple::NoSubArch;882}883}884885static Triple::ObjectFormatType getDefaultFormat(const Triple &T) {886switch (T.getArch()) {887case Triple::UnknownArch:888case Triple::aarch64:889case Triple::aarch64_32:890case Triple::arm:891case Triple::thumb:892case Triple::x86:893case Triple::x86_64:894switch (T.getOS()) {895case Triple::Win32:896case Triple::UEFI:897return Triple::COFF;898default:899return T.isOSDarwin() ? Triple::MachO : Triple::ELF;900}901case Triple::aarch64_be:902case Triple::amdgcn:903case Triple::amdil64:904case Triple::amdil:905case Triple::arc:906case Triple::armeb:907case Triple::avr:908case Triple::bpfeb:909case Triple::bpfel:910case Triple::csky:911case Triple::hexagon:912case Triple::hsail64:913case Triple::hsail:914case Triple::kalimba:915case Triple::lanai:916case Triple::le32:917case Triple::le64:918case Triple::loongarch32:919case Triple::loongarch64:920case Triple::m68k:921case Triple::mips64:922case Triple::mips64el:923case Triple::mips:924case Triple::mipsel:925case Triple::msp430:926case Triple::nvptx64:927case Triple::nvptx:928case Triple::ppc64le:929case Triple::ppcle:930case Triple::r600:931case Triple::renderscript32:932case Triple::renderscript64:933case Triple::riscv32:934case Triple::riscv64:935case Triple::shave:936case Triple::sparc:937case Triple::sparcel:938case Triple::sparcv9:939case Triple::spir64:940case Triple::spir:941case Triple::tce:942case Triple::tcele:943case Triple::thumbeb:944case Triple::ve:945case Triple::xcore:946case Triple::xtensa:947return Triple::ELF;948949case Triple::ppc64:950case Triple::ppc:951if (T.isOSAIX())952return Triple::XCOFF;953if (T.isOSDarwin())954return Triple::MachO;955return Triple::ELF;956957case Triple::systemz:958if (T.isOSzOS())959return Triple::GOFF;960return Triple::ELF;961962case Triple::wasm32:963case Triple::wasm64:964return Triple::Wasm;965966case Triple::spirv:967case Triple::spirv32:968case Triple::spirv64:969return Triple::SPIRV;970971case Triple::dxil:972return Triple::DXContainer;973}974llvm_unreachable("unknown architecture");975}976977/// Construct a triple from the string representation provided.978///979/// This stores the string representation and parses the various pieces into980/// enum members.981Triple::Triple(const Twine &Str)982: Data(Str.str()), Arch(UnknownArch), SubArch(NoSubArch),983Vendor(UnknownVendor), OS(UnknownOS), Environment(UnknownEnvironment),984ObjectFormat(UnknownObjectFormat) {985// Do minimal parsing by hand here.986SmallVector<StringRef, 4> Components;987StringRef(Data).split(Components, '-', /*MaxSplit*/ 3);988if (Components.size() > 0) {989Arch = parseArch(Components[0]);990SubArch = parseSubArch(Components[0]);991if (Components.size() > 1) {992Vendor = parseVendor(Components[1]);993if (Components.size() > 2) {994OS = parseOS(Components[2]);995if (Components.size() > 3) {996Environment = parseEnvironment(Components[3]);997ObjectFormat = parseFormat(Components[3]);998}999}1000} else {1001Environment =1002StringSwitch<Triple::EnvironmentType>(Components[0])1003.StartsWith("mipsn32", Triple::GNUABIN32)1004.StartsWith("mips64", Triple::GNUABI64)1005.StartsWith("mipsisa64", Triple::GNUABI64)1006.StartsWith("mipsisa32", Triple::GNU)1007.Cases("mips", "mipsel", "mipsr6", "mipsr6el", Triple::GNU)1008.Default(UnknownEnvironment);1009}1010}1011if (ObjectFormat == UnknownObjectFormat)1012ObjectFormat = getDefaultFormat(*this);1013}10141015/// Construct a triple from string representations of the architecture,1016/// vendor, and OS.1017///1018/// This joins each argument into a canonical string representation and parses1019/// them into enum members. It leaves the environment unknown and omits it from1020/// the string representation.1021Triple::Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr)1022: Data((ArchStr + Twine('-') + VendorStr + Twine('-') + OSStr).str()),1023Arch(parseArch(ArchStr.str())),1024SubArch(parseSubArch(ArchStr.str())),1025Vendor(parseVendor(VendorStr.str())),1026OS(parseOS(OSStr.str())),1027Environment(), ObjectFormat(Triple::UnknownObjectFormat) {1028ObjectFormat = getDefaultFormat(*this);1029}10301031/// Construct a triple from string representations of the architecture,1032/// vendor, OS, and environment.1033///1034/// This joins each argument into a canonical string representation and parses1035/// them into enum members.1036Triple::Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr,1037const Twine &EnvironmentStr)1038: Data((ArchStr + Twine('-') + VendorStr + Twine('-') + OSStr + Twine('-') +1039EnvironmentStr).str()),1040Arch(parseArch(ArchStr.str())),1041SubArch(parseSubArch(ArchStr.str())),1042Vendor(parseVendor(VendorStr.str())),1043OS(parseOS(OSStr.str())),1044Environment(parseEnvironment(EnvironmentStr.str())),1045ObjectFormat(parseFormat(EnvironmentStr.str())) {1046if (ObjectFormat == Triple::UnknownObjectFormat)1047ObjectFormat = getDefaultFormat(*this);1048}10491050static VersionTuple parseVersionFromName(StringRef Name);10511052static StringRef getDXILArchNameFromShaderModel(StringRef ShaderModelStr) {1053VersionTuple Ver =1054parseVersionFromName(ShaderModelStr.drop_front(strlen("shadermodel")));1055// Default DXIL minor version when Shader Model version is anything other1056// than 6.[0...8] or 6.x (which translates to latest current SM version)1057const unsigned SMMajor = 6;1058if (!Ver.empty()) {1059if (Ver.getMajor() == SMMajor) {1060if (std::optional<unsigned> SMMinor = Ver.getMinor()) {1061switch (*SMMinor) {1062case 0:1063return Triple::getArchName(Triple::dxil, Triple::DXILSubArch_v1_0);1064case 1:1065return Triple::getArchName(Triple::dxil, Triple::DXILSubArch_v1_1);1066case 2:1067return Triple::getArchName(Triple::dxil, Triple::DXILSubArch_v1_2);1068case 3:1069return Triple::getArchName(Triple::dxil, Triple::DXILSubArch_v1_3);1070case 4:1071return Triple::getArchName(Triple::dxil, Triple::DXILSubArch_v1_4);1072case 5:1073return Triple::getArchName(Triple::dxil, Triple::DXILSubArch_v1_5);1074case 6:1075return Triple::getArchName(Triple::dxil, Triple::DXILSubArch_v1_6);1076case 7:1077return Triple::getArchName(Triple::dxil, Triple::DXILSubArch_v1_7);1078case 8:1079return Triple::getArchName(Triple::dxil, Triple::DXILSubArch_v1_8);1080default:1081report_fatal_error("Unsupported Shader Model version", false);1082}1083}1084}1085} else {1086// Special case: DXIL minor version is set to LatestCurrentDXILMinor for1087// shadermodel6.x is1088if (ShaderModelStr == "shadermodel6.x") {1089return Triple::getArchName(Triple::dxil, Triple::LatestDXILSubArch);1090}1091}1092// DXIL version corresponding to Shader Model version other than 6.Minor1093// is 1.01094return Triple::getArchName(Triple::dxil, Triple::DXILSubArch_v1_0);1095}10961097std::string Triple::normalize(StringRef Str) {1098bool IsMinGW32 = false;1099bool IsCygwin = false;11001101// Parse into components.1102SmallVector<StringRef, 4> Components;1103Str.split(Components, '-');11041105// If the first component corresponds to a known architecture, preferentially1106// use it for the architecture. If the second component corresponds to a1107// known vendor, preferentially use it for the vendor, etc. This avoids silly1108// component movement when a component parses as (eg) both a valid arch and a1109// valid os.1110ArchType Arch = UnknownArch;1111if (Components.size() > 0)1112Arch = parseArch(Components[0]);1113VendorType Vendor = UnknownVendor;1114if (Components.size() > 1)1115Vendor = parseVendor(Components[1]);1116OSType OS = UnknownOS;1117if (Components.size() > 2) {1118OS = parseOS(Components[2]);1119IsCygwin = Components[2].starts_with("cygwin");1120IsMinGW32 = Components[2].starts_with("mingw");1121}1122EnvironmentType Environment = UnknownEnvironment;1123if (Components.size() > 3)1124Environment = parseEnvironment(Components[3]);1125ObjectFormatType ObjectFormat = UnknownObjectFormat;1126if (Components.size() > 4)1127ObjectFormat = parseFormat(Components[4]);11281129// Note which components are already in their final position. These will not1130// be moved.1131bool Found[4];1132Found[0] = Arch != UnknownArch;1133Found[1] = Vendor != UnknownVendor;1134Found[2] = OS != UnknownOS;1135Found[3] = Environment != UnknownEnvironment;11361137// If they are not there already, permute the components into their canonical1138// positions by seeing if they parse as a valid architecture, and if so moving1139// the component to the architecture position etc.1140for (unsigned Pos = 0; Pos != std::size(Found); ++Pos) {1141if (Found[Pos])1142continue; // Already in the canonical position.11431144for (unsigned Idx = 0; Idx != Components.size(); ++Idx) {1145// Do not reparse any components that already matched.1146if (Idx < std::size(Found) && Found[Idx])1147continue;11481149// Does this component parse as valid for the target position?1150bool Valid = false;1151StringRef Comp = Components[Idx];1152switch (Pos) {1153default: llvm_unreachable("unexpected component type!");1154case 0:1155Arch = parseArch(Comp);1156Valid = Arch != UnknownArch;1157break;1158case 1:1159Vendor = parseVendor(Comp);1160Valid = Vendor != UnknownVendor;1161break;1162case 2:1163OS = parseOS(Comp);1164IsCygwin = Comp.starts_with("cygwin");1165IsMinGW32 = Comp.starts_with("mingw");1166Valid = OS != UnknownOS || IsCygwin || IsMinGW32;1167break;1168case 3:1169Environment = parseEnvironment(Comp);1170Valid = Environment != UnknownEnvironment;1171if (!Valid) {1172ObjectFormat = parseFormat(Comp);1173Valid = ObjectFormat != UnknownObjectFormat;1174}1175break;1176}1177if (!Valid)1178continue; // Nope, try the next component.11791180// Move the component to the target position, pushing any non-fixed1181// components that are in the way to the right. This tends to give1182// good results in the common cases of a forgotten vendor component1183// or a wrongly positioned environment.1184if (Pos < Idx) {1185// Insert left, pushing the existing components to the right. For1186// example, a-b-i386 -> i386-a-b when moving i386 to the front.1187StringRef CurrentComponent(""); // The empty component.1188// Replace the component we are moving with an empty component.1189std::swap(CurrentComponent, Components[Idx]);1190// Insert the component being moved at Pos, displacing any existing1191// components to the right.1192for (unsigned i = Pos; !CurrentComponent.empty(); ++i) {1193// Skip over any fixed components.1194while (i < std::size(Found) && Found[i])1195++i;1196// Place the component at the new position, getting the component1197// that was at this position - it will be moved right.1198std::swap(CurrentComponent, Components[i]);1199}1200} else if (Pos > Idx) {1201// Push right by inserting empty components until the component at Idx1202// reaches the target position Pos. For example, pc-a -> -pc-a when1203// moving pc to the second position.1204do {1205// Insert one empty component at Idx.1206StringRef CurrentComponent(""); // The empty component.1207for (unsigned i = Idx; i < Components.size();) {1208// Place the component at the new position, getting the component1209// that was at this position - it will be moved right.1210std::swap(CurrentComponent, Components[i]);1211// If it was placed on top of an empty component then we are done.1212if (CurrentComponent.empty())1213break;1214// Advance to the next component, skipping any fixed components.1215while (++i < std::size(Found) && Found[i])1216;1217}1218// The last component was pushed off the end - append it.1219if (!CurrentComponent.empty())1220Components.push_back(CurrentComponent);12211222// Advance Idx to the component's new position.1223while (++Idx < std::size(Found) && Found[Idx])1224;1225} while (Idx < Pos); // Add more until the final position is reached.1226}1227assert(Pos < Components.size() && Components[Pos] == Comp &&1228"Component moved wrong!");1229Found[Pos] = true;1230break;1231}1232}12331234// If "none" is in the middle component in a three-component triple, treat it1235// as the OS (Components[2]) instead of the vendor (Components[1]).1236if (Found[0] && !Found[1] && !Found[2] && Found[3] &&1237Components[1] == "none" && Components[2].empty())1238std::swap(Components[1], Components[2]);12391240// Replace empty components with "unknown" value.1241for (StringRef &C : Components)1242if (C.empty())1243C = "unknown";12441245// Special case logic goes here. At this point Arch, Vendor and OS have the1246// correct values for the computed components.1247std::string NormalizedEnvironment;1248if (Environment == Triple::Android &&1249Components[3].starts_with("androideabi")) {1250StringRef AndroidVersion = Components[3].drop_front(strlen("androideabi"));1251if (AndroidVersion.empty()) {1252Components[3] = "android";1253} else {1254NormalizedEnvironment = Twine("android", AndroidVersion).str();1255Components[3] = NormalizedEnvironment;1256}1257}12581259// SUSE uses "gnueabi" to mean "gnueabihf"1260if (Vendor == Triple::SUSE && Environment == llvm::Triple::GNUEABI)1261Components[3] = "gnueabihf";12621263if (OS == Triple::Win32) {1264Components.resize(4);1265Components[2] = "windows";1266if (Environment == UnknownEnvironment) {1267if (ObjectFormat == UnknownObjectFormat || ObjectFormat == Triple::COFF)1268Components[3] = "msvc";1269else1270Components[3] = getObjectFormatTypeName(ObjectFormat);1271}1272} else if (IsMinGW32) {1273Components.resize(4);1274Components[2] = "windows";1275Components[3] = "gnu";1276} else if (IsCygwin) {1277Components.resize(4);1278Components[2] = "windows";1279Components[3] = "cygnus";1280}1281if (IsMinGW32 || IsCygwin ||1282(OS == Triple::Win32 && Environment != UnknownEnvironment)) {1283if (ObjectFormat != UnknownObjectFormat && ObjectFormat != Triple::COFF) {1284Components.resize(5);1285Components[4] = getObjectFormatTypeName(ObjectFormat);1286}1287}12881289// Normalize DXIL triple if it does not include DXIL version number.1290// Determine DXIL version number using the minor version number of Shader1291// Model version specified in target triple, if any. Prior to decoupling DXIL1292// version numbering from that of Shader Model DXIL version 1.Y corresponds to1293// SM 6.Y. E.g., dxilv1.Y-unknown-shadermodelX.Y-hull1294if (Components[0] == "dxil") {1295if (Components.size() > 4) {1296Components.resize(4);1297}1298// Add DXIL version only if shadermodel is specified in the triple1299if (OS == Triple::ShaderModel) {1300Components[0] = getDXILArchNameFromShaderModel(Components[2]);1301}1302}1303// Stick the corrected components back together to form the normalized string.1304return join(Components, "-");1305}13061307StringRef Triple::getArchName() const {1308return StringRef(Data).split('-').first; // Isolate first component1309}13101311StringRef Triple::getVendorName() const {1312StringRef Tmp = StringRef(Data).split('-').second; // Strip first component1313return Tmp.split('-').first; // Isolate second component1314}13151316StringRef Triple::getOSName() const {1317StringRef Tmp = StringRef(Data).split('-').second; // Strip first component1318Tmp = Tmp.split('-').second; // Strip second component1319return Tmp.split('-').first; // Isolate third component1320}13211322StringRef Triple::getEnvironmentName() const {1323StringRef Tmp = StringRef(Data).split('-').second; // Strip first component1324Tmp = Tmp.split('-').second; // Strip second component1325return Tmp.split('-').second; // Strip third component1326}13271328StringRef Triple::getOSAndEnvironmentName() const {1329StringRef Tmp = StringRef(Data).split('-').second; // Strip first component1330return Tmp.split('-').second; // Strip second component1331}13321333static VersionTuple parseVersionFromName(StringRef Name) {1334VersionTuple Version;1335Version.tryParse(Name);1336return Version.withoutBuild();1337}13381339VersionTuple Triple::getEnvironmentVersion() const {1340return parseVersionFromName(getEnvironmentVersionString());1341}13421343StringRef Triple::getEnvironmentVersionString() const {1344StringRef EnvironmentName = getEnvironmentName();13451346// none is a valid environment type - it basically amounts to a freestanding1347// environment.1348if (EnvironmentName == "none")1349return "";13501351StringRef EnvironmentTypeName = getEnvironmentTypeName(getEnvironment());1352EnvironmentName.consume_front(EnvironmentTypeName);13531354if (EnvironmentName.contains("-")) {1355// -obj is the suffix1356if (getObjectFormat() != Triple::UnknownObjectFormat) {1357StringRef ObjectFormatTypeName =1358getObjectFormatTypeName(getObjectFormat());1359const std::string tmp = (Twine("-") + ObjectFormatTypeName).str();1360EnvironmentName.consume_back(tmp);1361}1362}1363return EnvironmentName;1364}13651366VersionTuple Triple::getOSVersion() const {1367StringRef OSName = getOSName();1368// Assume that the OS portion of the triple starts with the canonical name.1369StringRef OSTypeName = getOSTypeName(getOS());1370if (OSName.starts_with(OSTypeName))1371OSName = OSName.substr(OSTypeName.size());1372else if (getOS() == MacOSX)1373OSName.consume_front("macos");1374else if (OSName.starts_with("visionos"))1375OSName.consume_front("visionos");13761377return parseVersionFromName(OSName);1378}13791380bool Triple::getMacOSXVersion(VersionTuple &Version) const {1381Version = getOSVersion();13821383switch (getOS()) {1384default: llvm_unreachable("unexpected OS for Darwin triple");1385case Darwin:1386// Default to darwin8, i.e., MacOSX 10.4.1387if (Version.getMajor() == 0)1388Version = VersionTuple(8);1389// Darwin version numbers are skewed from OS X versions.1390if (Version.getMajor() < 4) {1391return false;1392}1393if (Version.getMajor() <= 19) {1394Version = VersionTuple(10, Version.getMajor() - 4);1395} else {1396// darwin20+ corresponds to macOS 11+.1397Version = VersionTuple(11 + Version.getMajor() - 20);1398}1399break;1400case MacOSX:1401// Default to 10.4.1402if (Version.getMajor() == 0) {1403Version = VersionTuple(10, 4);1404} else if (Version.getMajor() < 10) {1405return false;1406}1407break;1408case IOS:1409case TvOS:1410case WatchOS:1411// Ignore the version from the triple. This is only handled because the1412// the clang driver combines OS X and IOS support into a common Darwin1413// toolchain that wants to know the OS X version number even when targeting1414// IOS.1415Version = VersionTuple(10, 4);1416break;1417case XROS:1418llvm_unreachable("OSX version isn't relevant for xrOS");1419case DriverKit:1420llvm_unreachable("OSX version isn't relevant for DriverKit");1421}1422return true;1423}14241425VersionTuple Triple::getiOSVersion() const {1426switch (getOS()) {1427default: llvm_unreachable("unexpected OS for Darwin triple");1428case Darwin:1429case MacOSX:1430// Ignore the version from the triple. This is only handled because the1431// the clang driver combines OS X and IOS support into a common Darwin1432// toolchain that wants to know the iOS version number even when targeting1433// OS X.1434return VersionTuple(5);1435case IOS:1436case TvOS: {1437VersionTuple Version = getOSVersion();1438// Default to 5.0 (or 7.0 for arm64).1439if (Version.getMajor() == 0)1440return (getArch() == aarch64) ? VersionTuple(7) : VersionTuple(5);1441return Version;1442}1443case XROS: {1444// xrOS 1 is aligned with iOS 17.1445VersionTuple Version = getOSVersion();1446return Version.withMajorReplaced(Version.getMajor() + 16);1447}1448case WatchOS:1449llvm_unreachable("conflicting triple info");1450case DriverKit:1451llvm_unreachable("DriverKit doesn't have an iOS version");1452}1453}14541455VersionTuple Triple::getWatchOSVersion() const {1456switch (getOS()) {1457default: llvm_unreachable("unexpected OS for Darwin triple");1458case Darwin:1459case MacOSX:1460// Ignore the version from the triple. This is only handled because the1461// the clang driver combines OS X and IOS support into a common Darwin1462// toolchain that wants to know the iOS version number even when targeting1463// OS X.1464return VersionTuple(2);1465case WatchOS: {1466VersionTuple Version = getOSVersion();1467if (Version.getMajor() == 0)1468return VersionTuple(2);1469return Version;1470}1471case IOS:1472llvm_unreachable("conflicting triple info");1473case XROS:1474llvm_unreachable("watchOS version isn't relevant for xrOS");1475case DriverKit:1476llvm_unreachable("DriverKit doesn't have a WatchOS version");1477}1478}14791480VersionTuple Triple::getDriverKitVersion() const {1481switch (getOS()) {1482default:1483llvm_unreachable("unexpected OS for Darwin triple");1484case DriverKit:1485VersionTuple Version = getOSVersion();1486if (Version.getMajor() == 0)1487return Version.withMajorReplaced(19);1488return Version;1489}1490}14911492VersionTuple Triple::getVulkanVersion() const {1493if (getArch() != spirv || getOS() != Vulkan)1494llvm_unreachable("invalid Vulkan SPIR-V triple");14951496VersionTuple VulkanVersion = getOSVersion();1497SubArchType SpirvVersion = getSubArch();14981499llvm::DenseMap<VersionTuple, SubArchType> ValidVersionMap = {1500// Vulkan 1.2 -> SPIR-V 1.5.1501{VersionTuple(1, 2), SPIRVSubArch_v15},1502// Vulkan 1.3 -> SPIR-V 1.6.1503{VersionTuple(1, 3), SPIRVSubArch_v16}};15041505// If Vulkan version is unset, default to 1.2.1506if (VulkanVersion == VersionTuple(0))1507VulkanVersion = VersionTuple(1, 2);15081509if (ValidVersionMap.contains(VulkanVersion) &&1510(ValidVersionMap.lookup(VulkanVersion) == SpirvVersion ||1511SpirvVersion == NoSubArch))1512return VulkanVersion;15131514return VersionTuple(0);1515}15161517VersionTuple Triple::getDXILVersion() const {1518if (getArch() != dxil || getOS() != ShaderModel)1519llvm_unreachable("invalid DXIL triple");1520StringRef Arch = getArchName();1521if (getSubArch() == NoSubArch)1522Arch = getDXILArchNameFromShaderModel(getOSName());1523Arch.consume_front("dxilv");1524VersionTuple DXILVersion = parseVersionFromName(Arch);1525// FIXME: validate DXIL version against Shader Model version.1526// Tracked by https://github.com/llvm/llvm-project/issues/913881527return DXILVersion;1528}15291530void Triple::setTriple(const Twine &Str) {1531*this = Triple(Str);1532}15331534void Triple::setArch(ArchType Kind, SubArchType SubArch) {1535setArchName(getArchName(Kind, SubArch));1536}15371538void Triple::setVendor(VendorType Kind) {1539setVendorName(getVendorTypeName(Kind));1540}15411542void Triple::setOS(OSType Kind) {1543setOSName(getOSTypeName(Kind));1544}15451546void Triple::setEnvironment(EnvironmentType Kind) {1547if (ObjectFormat == getDefaultFormat(*this))1548return setEnvironmentName(getEnvironmentTypeName(Kind));15491550setEnvironmentName((getEnvironmentTypeName(Kind) + Twine("-") +1551getObjectFormatTypeName(ObjectFormat)).str());1552}15531554void Triple::setObjectFormat(ObjectFormatType Kind) {1555if (Environment == UnknownEnvironment)1556return setEnvironmentName(getObjectFormatTypeName(Kind));15571558setEnvironmentName((getEnvironmentTypeName(Environment) + Twine("-") +1559getObjectFormatTypeName(Kind)).str());1560}15611562void Triple::setArchName(StringRef Str) {1563// Work around a miscompilation bug for Twines in gcc 4.0.3.1564SmallString<64> Triple;1565Triple += Str;1566Triple += "-";1567Triple += getVendorName();1568Triple += "-";1569Triple += getOSAndEnvironmentName();1570setTriple(Triple);1571}15721573void Triple::setVendorName(StringRef Str) {1574setTriple(getArchName() + "-" + Str + "-" + getOSAndEnvironmentName());1575}15761577void Triple::setOSName(StringRef Str) {1578if (hasEnvironment())1579setTriple(getArchName() + "-" + getVendorName() + "-" + Str +1580"-" + getEnvironmentName());1581else1582setTriple(getArchName() + "-" + getVendorName() + "-" + Str);1583}15841585void Triple::setEnvironmentName(StringRef Str) {1586setTriple(getArchName() + "-" + getVendorName() + "-" + getOSName() +1587"-" + Str);1588}15891590void Triple::setOSAndEnvironmentName(StringRef Str) {1591setTriple(getArchName() + "-" + getVendorName() + "-" + Str);1592}15931594unsigned Triple::getArchPointerBitWidth(llvm::Triple::ArchType Arch) {1595switch (Arch) {1596case llvm::Triple::UnknownArch:1597return 0;15981599case llvm::Triple::avr:1600case llvm::Triple::msp430:1601return 16;16021603case llvm::Triple::aarch64_32:1604case llvm::Triple::amdil:1605case llvm::Triple::arc:1606case llvm::Triple::arm:1607case llvm::Triple::armeb:1608case llvm::Triple::csky:1609case llvm::Triple::dxil:1610case llvm::Triple::hexagon:1611case llvm::Triple::hsail:1612case llvm::Triple::kalimba:1613case llvm::Triple::lanai:1614case llvm::Triple::le32:1615case llvm::Triple::loongarch32:1616case llvm::Triple::m68k:1617case llvm::Triple::mips:1618case llvm::Triple::mipsel:1619case llvm::Triple::nvptx:1620case llvm::Triple::ppc:1621case llvm::Triple::ppcle:1622case llvm::Triple::r600:1623case llvm::Triple::renderscript32:1624case llvm::Triple::riscv32:1625case llvm::Triple::shave:1626case llvm::Triple::sparc:1627case llvm::Triple::sparcel:1628case llvm::Triple::spir:1629case llvm::Triple::spirv32:1630case llvm::Triple::tce:1631case llvm::Triple::tcele:1632case llvm::Triple::thumb:1633case llvm::Triple::thumbeb:1634case llvm::Triple::wasm32:1635case llvm::Triple::x86:1636case llvm::Triple::xcore:1637case llvm::Triple::xtensa:1638return 32;16391640case llvm::Triple::aarch64:1641case llvm::Triple::aarch64_be:1642case llvm::Triple::amdgcn:1643case llvm::Triple::amdil64:1644case llvm::Triple::bpfeb:1645case llvm::Triple::bpfel:1646case llvm::Triple::hsail64:1647case llvm::Triple::le64:1648case llvm::Triple::loongarch64:1649case llvm::Triple::mips64:1650case llvm::Triple::mips64el:1651case llvm::Triple::nvptx64:1652case llvm::Triple::ppc64:1653case llvm::Triple::ppc64le:1654case llvm::Triple::renderscript64:1655case llvm::Triple::riscv64:1656case llvm::Triple::sparcv9:1657case llvm::Triple::spirv:1658case llvm::Triple::spir64:1659case llvm::Triple::spirv64:1660case llvm::Triple::systemz:1661case llvm::Triple::ve:1662case llvm::Triple::wasm64:1663case llvm::Triple::x86_64:1664return 64;1665}1666llvm_unreachable("Invalid architecture value");1667}16681669bool Triple::isArch64Bit() const {1670return getArchPointerBitWidth(getArch()) == 64;1671}16721673bool Triple::isArch32Bit() const {1674return getArchPointerBitWidth(getArch()) == 32;1675}16761677bool Triple::isArch16Bit() const {1678return getArchPointerBitWidth(getArch()) == 16;1679}16801681Triple Triple::get32BitArchVariant() const {1682Triple T(*this);1683switch (getArch()) {1684case Triple::UnknownArch:1685case Triple::amdgcn:1686case Triple::avr:1687case Triple::bpfeb:1688case Triple::bpfel:1689case Triple::msp430:1690case Triple::systemz:1691case Triple::ve:1692T.setArch(UnknownArch);1693break;16941695case Triple::aarch64_32:1696case Triple::amdil:1697case Triple::arc:1698case Triple::arm:1699case Triple::armeb:1700case Triple::csky:1701case Triple::dxil:1702case Triple::hexagon:1703case Triple::hsail:1704case Triple::kalimba:1705case Triple::lanai:1706case Triple::le32:1707case Triple::loongarch32:1708case Triple::m68k:1709case Triple::mips:1710case Triple::mipsel:1711case Triple::nvptx:1712case Triple::ppc:1713case Triple::ppcle:1714case Triple::r600:1715case Triple::renderscript32:1716case Triple::riscv32:1717case Triple::shave:1718case Triple::sparc:1719case Triple::sparcel:1720case Triple::spir:1721case Triple::spirv32:1722case Triple::tce:1723case Triple::tcele:1724case Triple::thumb:1725case Triple::thumbeb:1726case Triple::wasm32:1727case Triple::x86:1728case Triple::xcore:1729case Triple::xtensa:1730// Already 32-bit.1731break;17321733case Triple::aarch64: T.setArch(Triple::arm); break;1734case Triple::aarch64_be: T.setArch(Triple::armeb); break;1735case Triple::amdil64: T.setArch(Triple::amdil); break;1736case Triple::hsail64: T.setArch(Triple::hsail); break;1737case Triple::le64: T.setArch(Triple::le32); break;1738case Triple::loongarch64: T.setArch(Triple::loongarch32); break;1739case Triple::mips64:1740T.setArch(Triple::mips, getSubArch());1741break;1742case Triple::mips64el:1743T.setArch(Triple::mipsel, getSubArch());1744break;1745case Triple::nvptx64: T.setArch(Triple::nvptx); break;1746case Triple::ppc64: T.setArch(Triple::ppc); break;1747case Triple::ppc64le: T.setArch(Triple::ppcle); break;1748case Triple::renderscript64: T.setArch(Triple::renderscript32); break;1749case Triple::riscv64: T.setArch(Triple::riscv32); break;1750case Triple::sparcv9: T.setArch(Triple::sparc); break;1751case Triple::spir64: T.setArch(Triple::spir); break;1752case Triple::spirv:1753case Triple::spirv64:1754T.setArch(Triple::spirv32, getSubArch());1755break;1756case Triple::wasm64: T.setArch(Triple::wasm32); break;1757case Triple::x86_64: T.setArch(Triple::x86); break;1758}1759return T;1760}17611762Triple Triple::get64BitArchVariant() const {1763Triple T(*this);1764switch (getArch()) {1765case Triple::UnknownArch:1766case Triple::arc:1767case Triple::avr:1768case Triple::csky:1769case Triple::dxil:1770case Triple::hexagon:1771case Triple::kalimba:1772case Triple::lanai:1773case Triple::m68k:1774case Triple::msp430:1775case Triple::r600:1776case Triple::shave:1777case Triple::sparcel:1778case Triple::tce:1779case Triple::tcele:1780case Triple::xcore:1781case Triple::xtensa:1782T.setArch(UnknownArch);1783break;17841785case Triple::aarch64:1786case Triple::aarch64_be:1787case Triple::amdgcn:1788case Triple::amdil64:1789case Triple::bpfeb:1790case Triple::bpfel:1791case Triple::hsail64:1792case Triple::le64:1793case Triple::loongarch64:1794case Triple::mips64:1795case Triple::mips64el:1796case Triple::nvptx64:1797case Triple::ppc64:1798case Triple::ppc64le:1799case Triple::renderscript64:1800case Triple::riscv64:1801case Triple::sparcv9:1802case Triple::spir64:1803case Triple::spirv64:1804case Triple::systemz:1805case Triple::ve:1806case Triple::wasm64:1807case Triple::x86_64:1808// Already 64-bit.1809break;18101811case Triple::aarch64_32: T.setArch(Triple::aarch64); break;1812case Triple::amdil: T.setArch(Triple::amdil64); break;1813case Triple::arm: T.setArch(Triple::aarch64); break;1814case Triple::armeb: T.setArch(Triple::aarch64_be); break;1815case Triple::hsail: T.setArch(Triple::hsail64); break;1816case Triple::le32: T.setArch(Triple::le64); break;1817case Triple::loongarch32: T.setArch(Triple::loongarch64); break;1818case Triple::mips:1819T.setArch(Triple::mips64, getSubArch());1820break;1821case Triple::mipsel:1822T.setArch(Triple::mips64el, getSubArch());1823break;1824case Triple::nvptx: T.setArch(Triple::nvptx64); break;1825case Triple::ppc: T.setArch(Triple::ppc64); break;1826case Triple::ppcle: T.setArch(Triple::ppc64le); break;1827case Triple::renderscript32: T.setArch(Triple::renderscript64); break;1828case Triple::riscv32: T.setArch(Triple::riscv64); break;1829case Triple::sparc: T.setArch(Triple::sparcv9); break;1830case Triple::spir: T.setArch(Triple::spir64); break;1831case Triple::spirv:1832case Triple::spirv32:1833T.setArch(Triple::spirv64, getSubArch());1834break;1835case Triple::thumb: T.setArch(Triple::aarch64); break;1836case Triple::thumbeb: T.setArch(Triple::aarch64_be); break;1837case Triple::wasm32: T.setArch(Triple::wasm64); break;1838case Triple::x86: T.setArch(Triple::x86_64); break;1839}1840return T;1841}18421843Triple Triple::getBigEndianArchVariant() const {1844Triple T(*this);1845// Already big endian.1846if (!isLittleEndian())1847return T;1848switch (getArch()) {1849case Triple::UnknownArch:1850case Triple::amdgcn:1851case Triple::amdil64:1852case Triple::amdil:1853case Triple::avr:1854case Triple::dxil:1855case Triple::hexagon:1856case Triple::hsail64:1857case Triple::hsail:1858case Triple::kalimba:1859case Triple::le32:1860case Triple::le64:1861case Triple::loongarch32:1862case Triple::loongarch64:1863case Triple::msp430:1864case Triple::nvptx64:1865case Triple::nvptx:1866case Triple::r600:1867case Triple::renderscript32:1868case Triple::renderscript64:1869case Triple::riscv32:1870case Triple::riscv64:1871case Triple::shave:1872case Triple::spir64:1873case Triple::spir:1874case Triple::spirv:1875case Triple::spirv32:1876case Triple::spirv64:1877case Triple::wasm32:1878case Triple::wasm64:1879case Triple::x86:1880case Triple::x86_64:1881case Triple::xcore:1882case Triple::ve:1883case Triple::csky:1884case Triple::xtensa:18851886// ARM is intentionally unsupported here, changing the architecture would1887// drop any arch suffixes.1888case Triple::arm:1889case Triple::thumb:1890T.setArch(UnknownArch);1891break;18921893case Triple::aarch64: T.setArch(Triple::aarch64_be); break;1894case Triple::bpfel: T.setArch(Triple::bpfeb); break;1895case Triple::mips64el:1896T.setArch(Triple::mips64, getSubArch());1897break;1898case Triple::mipsel:1899T.setArch(Triple::mips, getSubArch());1900break;1901case Triple::ppcle: T.setArch(Triple::ppc); break;1902case Triple::ppc64le: T.setArch(Triple::ppc64); break;1903case Triple::sparcel: T.setArch(Triple::sparc); break;1904case Triple::tcele: T.setArch(Triple::tce); break;1905default:1906llvm_unreachable("getBigEndianArchVariant: unknown triple.");1907}1908return T;1909}19101911Triple Triple::getLittleEndianArchVariant() const {1912Triple T(*this);1913if (isLittleEndian())1914return T;19151916switch (getArch()) {1917case Triple::UnknownArch:1918case Triple::lanai:1919case Triple::sparcv9:1920case Triple::systemz:1921case Triple::m68k:19221923// ARM is intentionally unsupported here, changing the architecture would1924// drop any arch suffixes.1925case Triple::armeb:1926case Triple::thumbeb:1927T.setArch(UnknownArch);1928break;19291930case Triple::aarch64_be: T.setArch(Triple::aarch64); break;1931case Triple::bpfeb: T.setArch(Triple::bpfel); break;1932case Triple::mips64:1933T.setArch(Triple::mips64el, getSubArch());1934break;1935case Triple::mips:1936T.setArch(Triple::mipsel, getSubArch());1937break;1938case Triple::ppc: T.setArch(Triple::ppcle); break;1939case Triple::ppc64: T.setArch(Triple::ppc64le); break;1940case Triple::sparc: T.setArch(Triple::sparcel); break;1941case Triple::tce: T.setArch(Triple::tcele); break;1942default:1943llvm_unreachable("getLittleEndianArchVariant: unknown triple.");1944}1945return T;1946}19471948bool Triple::isLittleEndian() const {1949switch (getArch()) {1950case Triple::aarch64:1951case Triple::aarch64_32:1952case Triple::amdgcn:1953case Triple::amdil64:1954case Triple::amdil:1955case Triple::arm:1956case Triple::avr:1957case Triple::bpfel:1958case Triple::csky:1959case Triple::dxil:1960case Triple::hexagon:1961case Triple::hsail64:1962case Triple::hsail:1963case Triple::kalimba:1964case Triple::le32:1965case Triple::le64:1966case Triple::loongarch32:1967case Triple::loongarch64:1968case Triple::mips64el:1969case Triple::mipsel:1970case Triple::msp430:1971case Triple::nvptx64:1972case Triple::nvptx:1973case Triple::ppcle:1974case Triple::ppc64le:1975case Triple::r600:1976case Triple::renderscript32:1977case Triple::renderscript64:1978case Triple::riscv32:1979case Triple::riscv64:1980case Triple::shave:1981case Triple::sparcel:1982case Triple::spir64:1983case Triple::spir:1984case Triple::spirv:1985case Triple::spirv32:1986case Triple::spirv64:1987case Triple::tcele:1988case Triple::thumb:1989case Triple::ve:1990case Triple::wasm32:1991case Triple::wasm64:1992case Triple::x86:1993case Triple::x86_64:1994case Triple::xcore:1995case Triple::xtensa:1996return true;1997default:1998return false;1999}2000}20012002bool Triple::isCompatibleWith(const Triple &Other) const {2003// ARM and Thumb triples are compatible, if subarch, vendor and OS match.2004if ((getArch() == Triple::thumb && Other.getArch() == Triple::arm) ||2005(getArch() == Triple::arm && Other.getArch() == Triple::thumb) ||2006(getArch() == Triple::thumbeb && Other.getArch() == Triple::armeb) ||2007(getArch() == Triple::armeb && Other.getArch() == Triple::thumbeb)) {2008if (getVendor() == Triple::Apple)2009return getSubArch() == Other.getSubArch() &&2010getVendor() == Other.getVendor() && getOS() == Other.getOS();2011else2012return getSubArch() == Other.getSubArch() &&2013getVendor() == Other.getVendor() && getOS() == Other.getOS() &&2014getEnvironment() == Other.getEnvironment() &&2015getObjectFormat() == Other.getObjectFormat();2016}20172018// If vendor is apple, ignore the version number.2019if (getVendor() == Triple::Apple)2020return getArch() == Other.getArch() && getSubArch() == Other.getSubArch() &&2021getVendor() == Other.getVendor() && getOS() == Other.getOS();20222023return *this == Other;2024}20252026std::string Triple::merge(const Triple &Other) const {2027// If vendor is apple, pick the triple with the larger version number.2028if (getVendor() == Triple::Apple)2029if (Other.isOSVersionLT(*this))2030return str();20312032return Other.str();2033}20342035bool Triple::isMacOSXVersionLT(unsigned Major, unsigned Minor,2036unsigned Micro) const {2037assert(isMacOSX() && "Not an OS X triple!");20382039// If this is OS X, expect a sane version number.2040if (getOS() == Triple::MacOSX)2041return isOSVersionLT(Major, Minor, Micro);20422043// Otherwise, compare to the "Darwin" number.2044if (Major == 10) {2045return isOSVersionLT(Minor + 4, Micro, 0);2046} else {2047assert(Major >= 11 && "Unexpected major version");2048return isOSVersionLT(Major - 11 + 20, Minor, Micro);2049}2050}20512052VersionTuple Triple::getMinimumSupportedOSVersion() const {2053if (getVendor() != Triple::Apple || getArch() != Triple::aarch64)2054return VersionTuple();2055switch (getOS()) {2056case Triple::MacOSX:2057// ARM64 slice is supported starting from macOS 11.0+.2058return VersionTuple(11, 0, 0);2059case Triple::IOS:2060// ARM64 slice is supported starting from Mac Catalyst 14 (macOS 11).2061// ARM64 simulators are supported for iOS 14+.2062if (isMacCatalystEnvironment() || isSimulatorEnvironment())2063return VersionTuple(14, 0, 0);2064// ARM64e slice is supported starting from iOS 14.2065if (isArm64e())2066return VersionTuple(14, 0, 0);2067break;2068case Triple::TvOS:2069// ARM64 simulators are supported for tvOS 14+.2070if (isSimulatorEnvironment())2071return VersionTuple(14, 0, 0);2072break;2073case Triple::WatchOS:2074// ARM64 simulators are supported for watchOS 7+.2075if (isSimulatorEnvironment())2076return VersionTuple(7, 0, 0);2077break;2078case Triple::DriverKit:2079return VersionTuple(20, 0, 0);2080default:2081break;2082}2083return VersionTuple();2084}20852086VersionTuple Triple::getCanonicalVersionForOS(OSType OSKind,2087const VersionTuple &Version) {2088switch (OSKind) {2089case MacOSX:2090// macOS 10.16 is canonicalized to macOS 11.2091if (Version == VersionTuple(10, 16))2092return VersionTuple(11, 0);2093[[fallthrough]];2094default:2095return Version;2096}2097}20982099// HLSL triple environment orders are relied on in the front end2100static_assert(Triple::Vertex - Triple::Pixel == 1,2101"incorrect HLSL stage order");2102static_assert(Triple::Geometry - Triple::Pixel == 2,2103"incorrect HLSL stage order");2104static_assert(Triple::Hull - Triple::Pixel == 3,2105"incorrect HLSL stage order");2106static_assert(Triple::Domain - Triple::Pixel == 4,2107"incorrect HLSL stage order");2108static_assert(Triple::Compute - Triple::Pixel == 5,2109"incorrect HLSL stage order");2110static_assert(Triple::Library - Triple::Pixel == 6,2111"incorrect HLSL stage order");2112static_assert(Triple::RayGeneration - Triple::Pixel == 7,2113"incorrect HLSL stage order");2114static_assert(Triple::Intersection - Triple::Pixel == 8,2115"incorrect HLSL stage order");2116static_assert(Triple::AnyHit - Triple::Pixel == 9,2117"incorrect HLSL stage order");2118static_assert(Triple::ClosestHit - Triple::Pixel == 10,2119"incorrect HLSL stage order");2120static_assert(Triple::Miss - Triple::Pixel == 11,2121"incorrect HLSL stage order");2122static_assert(Triple::Callable - Triple::Pixel == 12,2123"incorrect HLSL stage order");2124static_assert(Triple::Mesh - Triple::Pixel == 13,2125"incorrect HLSL stage order");2126static_assert(Triple::Amplification - Triple::Pixel == 14,2127"incorrect HLSL stage order");212821292130