1f09cf34dSArchibald Elliott //===--- Triple.cpp - Target triple helper class --------------------------===// 2f09cf34dSArchibald Elliott // 3f09cf34dSArchibald Elliott // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4f09cf34dSArchibald Elliott // See https://llvm.org/LICENSE.txt for license information. 5f09cf34dSArchibald Elliott // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6f09cf34dSArchibald Elliott // 7f09cf34dSArchibald Elliott //===----------------------------------------------------------------------===// 8f09cf34dSArchibald Elliott 9f09cf34dSArchibald Elliott #include "llvm/TargetParser/Triple.h" 10c21f48e5SNatalie Chouinard #include "llvm/ADT/DenseMap.h" 11f09cf34dSArchibald Elliott #include "llvm/ADT/SmallString.h" 12f09cf34dSArchibald Elliott #include "llvm/ADT/StringExtras.h" 13f09cf34dSArchibald Elliott #include "llvm/ADT/StringSwitch.h" 14f09cf34dSArchibald Elliott #include "llvm/Support/ErrorHandling.h" 15f09cf34dSArchibald Elliott #include "llvm/Support/SwapByteOrder.h" 16f09cf34dSArchibald Elliott #include "llvm/Support/VersionTuple.h" 17f09cf34dSArchibald Elliott #include "llvm/TargetParser/ARMTargetParser.h" 18f09cf34dSArchibald Elliott #include "llvm/TargetParser/ARMTargetParserCommon.h" 19f09cf34dSArchibald Elliott #include "llvm/TargetParser/Host.h" 20f09cf34dSArchibald Elliott #include <cassert> 21f09cf34dSArchibald Elliott #include <cstring> 22f09cf34dSArchibald Elliott using namespace llvm; 23f09cf34dSArchibald Elliott 24f09cf34dSArchibald Elliott StringRef Triple::getArchTypeName(ArchType Kind) { 25f09cf34dSArchibald Elliott switch (Kind) { 26f09cf34dSArchibald Elliott case UnknownArch: return "unknown"; 27f09cf34dSArchibald Elliott 28f09cf34dSArchibald Elliott case aarch64: return "aarch64"; 29f09cf34dSArchibald Elliott case aarch64_32: return "aarch64_32"; 30f09cf34dSArchibald Elliott case aarch64_be: return "aarch64_be"; 31f09cf34dSArchibald Elliott case amdgcn: return "amdgcn"; 32f09cf34dSArchibald Elliott case amdil64: return "amdil64"; 33f09cf34dSArchibald Elliott case amdil: return "amdil"; 34f09cf34dSArchibald Elliott case arc: return "arc"; 35f09cf34dSArchibald Elliott case arm: return "arm"; 36f09cf34dSArchibald Elliott case armeb: return "armeb"; 37f09cf34dSArchibald Elliott case avr: return "avr"; 38f09cf34dSArchibald Elliott case bpfeb: return "bpfeb"; 39f09cf34dSArchibald Elliott case bpfel: return "bpfel"; 40f09cf34dSArchibald Elliott case csky: return "csky"; 41f09cf34dSArchibald Elliott case dxil: return "dxil"; 42f09cf34dSArchibald Elliott case hexagon: return "hexagon"; 43f09cf34dSArchibald Elliott case hsail64: return "hsail64"; 44f09cf34dSArchibald Elliott case hsail: return "hsail"; 45f09cf34dSArchibald Elliott case kalimba: return "kalimba"; 46f09cf34dSArchibald Elliott case lanai: return "lanai"; 47f09cf34dSArchibald Elliott case loongarch32: return "loongarch32"; 48f09cf34dSArchibald Elliott case loongarch64: return "loongarch64"; 49f09cf34dSArchibald Elliott case m68k: return "m68k"; 50f09cf34dSArchibald Elliott case mips64: return "mips64"; 51f09cf34dSArchibald Elliott case mips64el: return "mips64el"; 52f09cf34dSArchibald Elliott case mips: return "mips"; 53f09cf34dSArchibald Elliott case mipsel: return "mipsel"; 54f09cf34dSArchibald Elliott case msp430: return "msp430"; 55f09cf34dSArchibald Elliott case nvptx64: return "nvptx64"; 56f09cf34dSArchibald Elliott case nvptx: return "nvptx"; 57f09cf34dSArchibald Elliott case ppc64: return "powerpc64"; 58f09cf34dSArchibald Elliott case ppc64le: return "powerpc64le"; 59f09cf34dSArchibald Elliott case ppc: return "powerpc"; 60f09cf34dSArchibald Elliott case ppcle: return "powerpcle"; 61f09cf34dSArchibald Elliott case r600: return "r600"; 62f09cf34dSArchibald Elliott case renderscript32: return "renderscript32"; 63f09cf34dSArchibald Elliott case renderscript64: return "renderscript64"; 64f09cf34dSArchibald Elliott case riscv32: return "riscv32"; 65f09cf34dSArchibald Elliott case riscv64: return "riscv64"; 66f09cf34dSArchibald Elliott case shave: return "shave"; 67f09cf34dSArchibald Elliott case sparc: return "sparc"; 68f09cf34dSArchibald Elliott case sparcel: return "sparcel"; 69f09cf34dSArchibald Elliott case sparcv9: return "sparcv9"; 70f09cf34dSArchibald Elliott case spir64: return "spir64"; 71f09cf34dSArchibald Elliott case spir: return "spir"; 7253b6a169SNathan Gauër case spirv: return "spirv"; 73f09cf34dSArchibald Elliott case spirv32: return "spirv32"; 74f09cf34dSArchibald Elliott case spirv64: return "spirv64"; 75f09cf34dSArchibald Elliott case systemz: return "s390x"; 76f09cf34dSArchibald Elliott case tce: return "tce"; 77f09cf34dSArchibald Elliott case tcele: return "tcele"; 78f09cf34dSArchibald Elliott case thumb: return "thumb"; 79f09cf34dSArchibald Elliott case thumbeb: return "thumbeb"; 80f09cf34dSArchibald Elliott case ve: return "ve"; 81f09cf34dSArchibald Elliott case wasm32: return "wasm32"; 82f09cf34dSArchibald Elliott case wasm64: return "wasm64"; 83f09cf34dSArchibald Elliott case x86: return "i386"; 84f09cf34dSArchibald Elliott case x86_64: return "x86_64"; 85f09cf34dSArchibald Elliott case xcore: return "xcore"; 868c618e8fSAndrei Safronov case xtensa: return "xtensa"; 87f09cf34dSArchibald Elliott } 88f09cf34dSArchibald Elliott 89f09cf34dSArchibald Elliott llvm_unreachable("Invalid ArchType!"); 90f09cf34dSArchibald Elliott } 91f09cf34dSArchibald Elliott 9288d00a68SAlpha Abdoulaye StringRef Triple::getArchName(ArchType Kind, SubArchType SubArch) { 9388d00a68SAlpha Abdoulaye switch (Kind) { 9488d00a68SAlpha Abdoulaye case Triple::mips: 9588d00a68SAlpha Abdoulaye if (SubArch == MipsSubArch_r6) 9688d00a68SAlpha Abdoulaye return "mipsisa32r6"; 9788d00a68SAlpha Abdoulaye break; 9888d00a68SAlpha Abdoulaye case Triple::mipsel: 9988d00a68SAlpha Abdoulaye if (SubArch == MipsSubArch_r6) 10088d00a68SAlpha Abdoulaye return "mipsisa32r6el"; 10188d00a68SAlpha Abdoulaye break; 10288d00a68SAlpha Abdoulaye case Triple::mips64: 10388d00a68SAlpha Abdoulaye if (SubArch == MipsSubArch_r6) 10488d00a68SAlpha Abdoulaye return "mipsisa64r6"; 10588d00a68SAlpha Abdoulaye break; 10688d00a68SAlpha Abdoulaye case Triple::mips64el: 10788d00a68SAlpha Abdoulaye if (SubArch == MipsSubArch_r6) 10888d00a68SAlpha Abdoulaye return "mipsisa64r6el"; 10988d00a68SAlpha Abdoulaye break; 11088d00a68SAlpha Abdoulaye case Triple::aarch64: 11188d00a68SAlpha Abdoulaye if (SubArch == AArch64SubArch_arm64ec) 11288d00a68SAlpha Abdoulaye return "arm64ec"; 11388d00a68SAlpha Abdoulaye if (SubArch == AArch64SubArch_arm64e) 11488d00a68SAlpha Abdoulaye return "arm64e"; 11588d00a68SAlpha Abdoulaye break; 116d7235876SSteven Perron case Triple::spirv: 117d7235876SSteven Perron switch (SubArch) { 118d7235876SSteven Perron case Triple::SPIRVSubArch_v10: 119d7235876SSteven Perron return "spirv1.0"; 120d7235876SSteven Perron case Triple::SPIRVSubArch_v11: 121d7235876SSteven Perron return "spirv1.1"; 122d7235876SSteven Perron case Triple::SPIRVSubArch_v12: 123d7235876SSteven Perron return "spirv1.2"; 124d7235876SSteven Perron case Triple::SPIRVSubArch_v13: 125d7235876SSteven Perron return "spirv1.3"; 126d7235876SSteven Perron case Triple::SPIRVSubArch_v14: 127d7235876SSteven Perron return "spirv1.4"; 128d7235876SSteven Perron case Triple::SPIRVSubArch_v15: 129d7235876SSteven Perron return "spirv1.5"; 130d7235876SSteven Perron case Triple::SPIRVSubArch_v16: 131d7235876SSteven Perron return "spirv1.6"; 132d7235876SSteven Perron default: 133d7235876SSteven Perron break; 134d7235876SSteven Perron } 135d7235876SSteven Perron break; 1366d890148SS. Bharadwaj Yadavalli case Triple::dxil: 1376d890148SS. Bharadwaj Yadavalli switch (SubArch) { 1386d890148SS. Bharadwaj Yadavalli case Triple::NoSubArch: 1396d890148SS. Bharadwaj Yadavalli case Triple::DXILSubArch_v1_0: 1406d890148SS. Bharadwaj Yadavalli return "dxilv1.0"; 1416d890148SS. Bharadwaj Yadavalli case Triple::DXILSubArch_v1_1: 1426d890148SS. Bharadwaj Yadavalli return "dxilv1.1"; 1436d890148SS. Bharadwaj Yadavalli case Triple::DXILSubArch_v1_2: 1446d890148SS. Bharadwaj Yadavalli return "dxilv1.2"; 1456d890148SS. Bharadwaj Yadavalli case Triple::DXILSubArch_v1_3: 1466d890148SS. Bharadwaj Yadavalli return "dxilv1.3"; 1476d890148SS. Bharadwaj Yadavalli case Triple::DXILSubArch_v1_4: 1486d890148SS. Bharadwaj Yadavalli return "dxilv1.4"; 1496d890148SS. Bharadwaj Yadavalli case Triple::DXILSubArch_v1_5: 1506d890148SS. Bharadwaj Yadavalli return "dxilv1.5"; 1516d890148SS. Bharadwaj Yadavalli case Triple::DXILSubArch_v1_6: 1526d890148SS. Bharadwaj Yadavalli return "dxilv1.6"; 1536d890148SS. Bharadwaj Yadavalli case Triple::DXILSubArch_v1_7: 1546d890148SS. Bharadwaj Yadavalli return "dxilv1.7"; 1556d890148SS. Bharadwaj Yadavalli case Triple::DXILSubArch_v1_8: 1566d890148SS. Bharadwaj Yadavalli return "dxilv1.8"; 1576d890148SS. Bharadwaj Yadavalli default: 1586d890148SS. Bharadwaj Yadavalli break; 1596d890148SS. Bharadwaj Yadavalli } 1606d890148SS. Bharadwaj Yadavalli break; 16188d00a68SAlpha Abdoulaye default: 16288d00a68SAlpha Abdoulaye break; 16388d00a68SAlpha Abdoulaye } 16488d00a68SAlpha Abdoulaye return getArchTypeName(Kind); 16588d00a68SAlpha Abdoulaye } 16688d00a68SAlpha Abdoulaye 167f09cf34dSArchibald Elliott StringRef Triple::getArchTypePrefix(ArchType Kind) { 168f09cf34dSArchibald Elliott switch (Kind) { 169f09cf34dSArchibald Elliott default: 170f09cf34dSArchibald Elliott return StringRef(); 171f09cf34dSArchibald Elliott 172f09cf34dSArchibald Elliott case aarch64: 173f09cf34dSArchibald Elliott case aarch64_be: 174f09cf34dSArchibald Elliott case aarch64_32: return "aarch64"; 175f09cf34dSArchibald Elliott 176f09cf34dSArchibald Elliott case arc: return "arc"; 177f09cf34dSArchibald Elliott 178f09cf34dSArchibald Elliott case arm: 179f09cf34dSArchibald Elliott case armeb: 180f09cf34dSArchibald Elliott case thumb: 181f09cf34dSArchibald Elliott case thumbeb: return "arm"; 182f09cf34dSArchibald Elliott 183f09cf34dSArchibald Elliott case avr: return "avr"; 184f09cf34dSArchibald Elliott 185f09cf34dSArchibald Elliott case ppc64: 186f09cf34dSArchibald Elliott case ppc64le: 187f09cf34dSArchibald Elliott case ppc: 188f09cf34dSArchibald Elliott case ppcle: return "ppc"; 189f09cf34dSArchibald Elliott 190f09cf34dSArchibald Elliott case m68k: return "m68k"; 191f09cf34dSArchibald Elliott 192f09cf34dSArchibald Elliott case mips: 193f09cf34dSArchibald Elliott case mipsel: 194f09cf34dSArchibald Elliott case mips64: 195f09cf34dSArchibald Elliott case mips64el: return "mips"; 196f09cf34dSArchibald Elliott 197f09cf34dSArchibald Elliott case hexagon: return "hexagon"; 198f09cf34dSArchibald Elliott 199f09cf34dSArchibald Elliott case amdgcn: return "amdgcn"; 200f09cf34dSArchibald Elliott case r600: return "r600"; 201f09cf34dSArchibald Elliott 202f09cf34dSArchibald Elliott case bpfel: 203f09cf34dSArchibald Elliott case bpfeb: return "bpf"; 204f09cf34dSArchibald Elliott 205f09cf34dSArchibald Elliott case sparcv9: 206f09cf34dSArchibald Elliott case sparcel: 207f09cf34dSArchibald Elliott case sparc: return "sparc"; 208f09cf34dSArchibald Elliott 209f09cf34dSArchibald Elliott case systemz: return "s390"; 210f09cf34dSArchibald Elliott 211f09cf34dSArchibald Elliott case x86: 212f09cf34dSArchibald Elliott case x86_64: return "x86"; 213f09cf34dSArchibald Elliott 214f09cf34dSArchibald Elliott case xcore: return "xcore"; 215f09cf34dSArchibald Elliott 216f09cf34dSArchibald Elliott // NVPTX intrinsics are namespaced under nvvm. 217f09cf34dSArchibald Elliott case nvptx: return "nvvm"; 218f09cf34dSArchibald Elliott case nvptx64: return "nvvm"; 219f09cf34dSArchibald Elliott 220f09cf34dSArchibald Elliott case amdil: 221f09cf34dSArchibald Elliott case amdil64: return "amdil"; 222f09cf34dSArchibald Elliott 223f09cf34dSArchibald Elliott case hsail: 224f09cf34dSArchibald Elliott case hsail64: return "hsail"; 225f09cf34dSArchibald Elliott 226f09cf34dSArchibald Elliott case spir: 227f09cf34dSArchibald Elliott case spir64: return "spir"; 228f09cf34dSArchibald Elliott 22953b6a169SNathan Gauër case spirv: 230f09cf34dSArchibald Elliott case spirv32: 2313b57b647SNatalie Chouinard case spirv64: return "spv"; 232f09cf34dSArchibald Elliott 233f09cf34dSArchibald Elliott case kalimba: return "kalimba"; 234f09cf34dSArchibald Elliott case lanai: return "lanai"; 235f09cf34dSArchibald Elliott case shave: return "shave"; 236f09cf34dSArchibald Elliott case wasm32: 237f09cf34dSArchibald Elliott case wasm64: return "wasm"; 238f09cf34dSArchibald Elliott 239f09cf34dSArchibald Elliott case riscv32: 240f09cf34dSArchibald Elliott case riscv64: return "riscv"; 241f09cf34dSArchibald Elliott 242f09cf34dSArchibald Elliott case ve: return "ve"; 243f09cf34dSArchibald Elliott case csky: return "csky"; 244f09cf34dSArchibald Elliott 245f09cf34dSArchibald Elliott case loongarch32: 246f09cf34dSArchibald Elliott case loongarch64: return "loongarch"; 247f09cf34dSArchibald Elliott 248f09cf34dSArchibald Elliott case dxil: return "dx"; 2498c618e8fSAndrei Safronov 2508c618e8fSAndrei Safronov case xtensa: return "xtensa"; 251f09cf34dSArchibald Elliott } 252f09cf34dSArchibald Elliott } 253f09cf34dSArchibald Elliott 254f09cf34dSArchibald Elliott StringRef Triple::getVendorTypeName(VendorType Kind) { 255f09cf34dSArchibald Elliott switch (Kind) { 256f09cf34dSArchibald Elliott case UnknownVendor: return "unknown"; 257f09cf34dSArchibald Elliott 258f09cf34dSArchibald Elliott case AMD: return "amd"; 259f09cf34dSArchibald Elliott case Apple: return "apple"; 260f09cf34dSArchibald Elliott case CSR: return "csr"; 261f09cf34dSArchibald Elliott case Freescale: return "fsl"; 262f09cf34dSArchibald Elliott case IBM: return "ibm"; 263f09cf34dSArchibald Elliott case ImaginationTechnologies: return "img"; 2641c16807dSNick Sarnie case Intel: 2651c16807dSNick Sarnie return "intel"; 266f09cf34dSArchibald Elliott case Mesa: return "mesa"; 267f09cf34dSArchibald Elliott case MipsTechnologies: return "mti"; 268f09cf34dSArchibald Elliott case NVIDIA: return "nvidia"; 269f09cf34dSArchibald Elliott case OpenEmbedded: return "oe"; 270f09cf34dSArchibald Elliott case PC: return "pc"; 271f09cf34dSArchibald Elliott case SCEI: return "scei"; 272f09cf34dSArchibald Elliott case SUSE: return "suse"; 273f09cf34dSArchibald Elliott } 274f09cf34dSArchibald Elliott 275f09cf34dSArchibald Elliott llvm_unreachable("Invalid VendorType!"); 276f09cf34dSArchibald Elliott } 277f09cf34dSArchibald Elliott 278f09cf34dSArchibald Elliott StringRef Triple::getOSTypeName(OSType Kind) { 279f09cf34dSArchibald Elliott switch (Kind) { 280f09cf34dSArchibald Elliott case UnknownOS: return "unknown"; 281f09cf34dSArchibald Elliott 282f09cf34dSArchibald Elliott case AIX: return "aix"; 283f09cf34dSArchibald Elliott case AMDHSA: return "amdhsa"; 284f09cf34dSArchibald Elliott case AMDPAL: return "amdpal"; 2851b26c25fSJonas Devlieghere case BridgeOS: return "bridgeos"; 286f09cf34dSArchibald Elliott case CUDA: return "cuda"; 287f09cf34dSArchibald Elliott case Darwin: return "darwin"; 288f09cf34dSArchibald Elliott case DragonFly: return "dragonfly"; 289f09cf34dSArchibald Elliott case DriverKit: return "driverkit"; 290f09cf34dSArchibald Elliott case ELFIAMCU: return "elfiamcu"; 291f09cf34dSArchibald Elliott case Emscripten: return "emscripten"; 292f09cf34dSArchibald Elliott case FreeBSD: return "freebsd"; 293f09cf34dSArchibald Elliott case Fuchsia: return "fuchsia"; 294f09cf34dSArchibald Elliott case Haiku: return "haiku"; 295f09cf34dSArchibald Elliott case HermitCore: return "hermit"; 296f09cf34dSArchibald Elliott case Hurd: return "hurd"; 297f09cf34dSArchibald Elliott case IOS: return "ios"; 298f09cf34dSArchibald Elliott case KFreeBSD: return "kfreebsd"; 299f09cf34dSArchibald Elliott case Linux: return "linux"; 300f09cf34dSArchibald Elliott case Lv2: return "lv2"; 301f09cf34dSArchibald Elliott case MacOSX: return "macosx"; 302f09cf34dSArchibald Elliott case Mesa3D: return "mesa3d"; 303f09cf34dSArchibald Elliott case NVCL: return "nvcl"; 304f09cf34dSArchibald Elliott case NaCl: return "nacl"; 305f09cf34dSArchibald Elliott case NetBSD: return "netbsd"; 306f09cf34dSArchibald Elliott case OpenBSD: return "openbsd"; 307f09cf34dSArchibald Elliott case PS4: return "ps4"; 308f09cf34dSArchibald Elliott case PS5: return "ps5"; 309f09cf34dSArchibald Elliott case RTEMS: return "rtems"; 310f09cf34dSArchibald Elliott case Solaris: return "solaris"; 3117ef6b21cSAndrew Kaster case Serenity: return "serenity"; 312f09cf34dSArchibald Elliott case TvOS: return "tvos"; 31330198bd7Sprabhukr case UEFI: return "uefi"; 314f09cf34dSArchibald Elliott case WASI: return "wasi"; 315f09cf34dSArchibald Elliott case WatchOS: return "watchos"; 316f09cf34dSArchibald Elliott case Win32: return "windows"; 317f09cf34dSArchibald Elliott case ZOS: return "zos"; 318f09cf34dSArchibald Elliott case ShaderModel: return "shadermodel"; 319c417b7a6SPavel Kosov case LiteOS: return "liteos"; 3207d3466b5SCyndy Ishida case XROS: return "xros"; 321c21f48e5SNatalie Chouinard case Vulkan: return "vulkan"; 322f09cf34dSArchibald Elliott } 323f09cf34dSArchibald Elliott 324f09cf34dSArchibald Elliott llvm_unreachable("Invalid OSType"); 325f09cf34dSArchibald Elliott } 326f09cf34dSArchibald Elliott 327f09cf34dSArchibald Elliott StringRef Triple::getEnvironmentTypeName(EnvironmentType Kind) { 328f09cf34dSArchibald Elliott switch (Kind) { 329f09cf34dSArchibald Elliott case UnknownEnvironment: return "unknown"; 330f09cf34dSArchibald Elliott case Android: return "android"; 331f09cf34dSArchibald Elliott case CODE16: return "code16"; 332f09cf34dSArchibald Elliott case CoreCLR: return "coreclr"; 333f09cf34dSArchibald Elliott case Cygnus: return "cygnus"; 334f09cf34dSArchibald Elliott case EABI: return "eabi"; 335f09cf34dSArchibald Elliott case EABIHF: return "eabihf"; 336f09cf34dSArchibald Elliott case GNU: return "gnu"; 337387b37afSMichał Górny case GNUT64: return "gnut64"; 338f09cf34dSArchibald Elliott case GNUABI64: return "gnuabi64"; 339f09cf34dSArchibald Elliott case GNUABIN32: return "gnuabin32"; 340f09cf34dSArchibald Elliott case GNUEABI: return "gnueabi"; 341387b37afSMichał Górny case GNUEABIT64: return "gnueabit64"; 342f09cf34dSArchibald Elliott case GNUEABIHF: return "gnueabihf"; 343387b37afSMichał Górny case GNUEABIHFT64: return "gnueabihft64"; 344f09cf34dSArchibald Elliott case GNUF32: return "gnuf32"; 345f09cf34dSArchibald Elliott case GNUF64: return "gnuf64"; 346f09cf34dSArchibald Elliott case GNUSF: return "gnusf"; 347f09cf34dSArchibald Elliott case GNUX32: return "gnux32"; 348f09cf34dSArchibald Elliott case GNUILP32: return "gnu_ilp32"; 349f09cf34dSArchibald Elliott case Itanium: return "itanium"; 350f09cf34dSArchibald Elliott case MSVC: return "msvc"; 351f09cf34dSArchibald Elliott case MacABI: return "macabi"; 352f09cf34dSArchibald Elliott case Musl: return "musl"; 35372a21805SAlex Rønne Petersen case MuslABIN32: 35472a21805SAlex Rønne Petersen return "muslabin32"; 35572a21805SAlex Rønne Petersen case MuslABI64: 35672a21805SAlex Rønne Petersen return "muslabi64"; 357f09cf34dSArchibald Elliott case MuslEABI: return "musleabi"; 358f09cf34dSArchibald Elliott case MuslEABIHF: return "musleabihf"; 35972a21805SAlex Rønne Petersen case MuslF32: 36072a21805SAlex Rønne Petersen return "muslf32"; 36172a21805SAlex Rønne Petersen case MuslSF: 36272a21805SAlex Rønne Petersen return "muslsf"; 363f09cf34dSArchibald Elliott case MuslX32: return "muslx32"; 364f09cf34dSArchibald Elliott case Simulator: return "simulator"; 365f09cf34dSArchibald Elliott case Pixel: return "pixel"; 366f09cf34dSArchibald Elliott case Vertex: return "vertex"; 367f09cf34dSArchibald Elliott case Geometry: return "geometry"; 368f09cf34dSArchibald Elliott case Hull: return "hull"; 369f09cf34dSArchibald Elliott case Domain: return "domain"; 370f09cf34dSArchibald Elliott case Compute: return "compute"; 371f09cf34dSArchibald Elliott case Library: return "library"; 372f09cf34dSArchibald Elliott case RayGeneration: return "raygeneration"; 373f09cf34dSArchibald Elliott case Intersection: return "intersection"; 374f09cf34dSArchibald Elliott case AnyHit: return "anyhit"; 375f09cf34dSArchibald Elliott case ClosestHit: return "closesthit"; 376f09cf34dSArchibald Elliott case Miss: return "miss"; 377f09cf34dSArchibald Elliott case Callable: return "callable"; 378f09cf34dSArchibald Elliott case Mesh: return "mesh"; 379f09cf34dSArchibald Elliott case Amplification: return "amplification"; 38034c4a0faSZijunZhaoCCK case OpenCL: 38134c4a0faSZijunZhaoCCK return "opencl"; 382c417b7a6SPavel Kosov case OpenHOS: return "ohos"; 383146fd7cdSDaniil Kovalev case PAuthTest: 384146fd7cdSDaniil Kovalev return "pauthtest"; 3857672216eSJoseph Huber case LLVM: 3867672216eSJoseph Huber return "llvm"; 387f09cf34dSArchibald Elliott } 388f09cf34dSArchibald Elliott 389f09cf34dSArchibald Elliott llvm_unreachable("Invalid EnvironmentType!"); 390f09cf34dSArchibald Elliott } 391f09cf34dSArchibald Elliott 392887d6ab1SLang Hames StringRef Triple::getObjectFormatTypeName(ObjectFormatType Kind) { 393887d6ab1SLang Hames switch (Kind) { 394887d6ab1SLang Hames case UnknownObjectFormat: return ""; 395887d6ab1SLang Hames case COFF: return "coff"; 396887d6ab1SLang Hames case ELF: return "elf"; 397887d6ab1SLang Hames case GOFF: return "goff"; 398887d6ab1SLang Hames case MachO: return "macho"; 399887d6ab1SLang Hames case Wasm: return "wasm"; 400887d6ab1SLang Hames case XCOFF: return "xcoff"; 401887d6ab1SLang Hames case DXContainer: return "dxcontainer"; 402887d6ab1SLang Hames case SPIRV: return "spirv"; 403887d6ab1SLang Hames } 404887d6ab1SLang Hames llvm_unreachable("unknown object format type"); 405887d6ab1SLang Hames } 406887d6ab1SLang Hames 407f09cf34dSArchibald Elliott static Triple::ArchType parseBPFArch(StringRef ArchName) { 408bb6df080SKazu Hirata if (ArchName == "bpf") { 409f09cf34dSArchibald Elliott if (sys::IsLittleEndianHost) 410f09cf34dSArchibald Elliott return Triple::bpfel; 411f09cf34dSArchibald Elliott else 412f09cf34dSArchibald Elliott return Triple::bpfeb; 413bb6df080SKazu Hirata } else if (ArchName == "bpf_be" || ArchName == "bpfeb") { 414f09cf34dSArchibald Elliott return Triple::bpfeb; 415bb6df080SKazu Hirata } else if (ArchName == "bpf_le" || ArchName == "bpfel") { 416f09cf34dSArchibald Elliott return Triple::bpfel; 417f09cf34dSArchibald Elliott } else { 418f09cf34dSArchibald Elliott return Triple::UnknownArch; 419f09cf34dSArchibald Elliott } 420f09cf34dSArchibald Elliott } 421f09cf34dSArchibald Elliott 422f09cf34dSArchibald Elliott Triple::ArchType Triple::getArchTypeForLLVMName(StringRef Name) { 423f09cf34dSArchibald Elliott Triple::ArchType BPFArch(parseBPFArch(Name)); 424f09cf34dSArchibald Elliott return StringSwitch<Triple::ArchType>(Name) 425f09cf34dSArchibald Elliott .Case("aarch64", aarch64) 426f09cf34dSArchibald Elliott .Case("aarch64_be", aarch64_be) 427f09cf34dSArchibald Elliott .Case("aarch64_32", aarch64_32) 428f09cf34dSArchibald Elliott .Case("arc", arc) 429f09cf34dSArchibald Elliott .Case("arm64", aarch64) // "arm64" is an alias for "aarch64" 430f09cf34dSArchibald Elliott .Case("arm64_32", aarch64_32) 431f09cf34dSArchibald Elliott .Case("arm", arm) 432f09cf34dSArchibald Elliott .Case("armeb", armeb) 433f09cf34dSArchibald Elliott .Case("avr", avr) 434f09cf34dSArchibald Elliott .StartsWith("bpf", BPFArch) 435f09cf34dSArchibald Elliott .Case("m68k", m68k) 436f09cf34dSArchibald Elliott .Case("mips", mips) 437f09cf34dSArchibald Elliott .Case("mipsel", mipsel) 438f09cf34dSArchibald Elliott .Case("mips64", mips64) 439f09cf34dSArchibald Elliott .Case("mips64el", mips64el) 440f09cf34dSArchibald Elliott .Case("msp430", msp430) 441f09cf34dSArchibald Elliott .Case("ppc64", ppc64) 442f09cf34dSArchibald Elliott .Case("ppc32", ppc) 443f09cf34dSArchibald Elliott .Case("ppc", ppc) 444f09cf34dSArchibald Elliott .Case("ppc32le", ppcle) 445f09cf34dSArchibald Elliott .Case("ppcle", ppcle) 446f09cf34dSArchibald Elliott .Case("ppc64le", ppc64le) 447f09cf34dSArchibald Elliott .Case("r600", r600) 448f09cf34dSArchibald Elliott .Case("amdgcn", amdgcn) 449f09cf34dSArchibald Elliott .Case("riscv32", riscv32) 450f09cf34dSArchibald Elliott .Case("riscv64", riscv64) 451f09cf34dSArchibald Elliott .Case("hexagon", hexagon) 452f09cf34dSArchibald Elliott .Case("sparc", sparc) 453f09cf34dSArchibald Elliott .Case("sparcel", sparcel) 454f09cf34dSArchibald Elliott .Case("sparcv9", sparcv9) 455f09cf34dSArchibald Elliott .Case("s390x", systemz) 456f09cf34dSArchibald Elliott .Case("systemz", systemz) 457f09cf34dSArchibald Elliott .Case("tce", tce) 458f09cf34dSArchibald Elliott .Case("tcele", tcele) 459f09cf34dSArchibald Elliott .Case("thumb", thumb) 460f09cf34dSArchibald Elliott .Case("thumbeb", thumbeb) 461f09cf34dSArchibald Elliott .Case("x86", x86) 462f09cf34dSArchibald Elliott .Case("i386", x86) 463f09cf34dSArchibald Elliott .Case("x86-64", x86_64) 464f09cf34dSArchibald Elliott .Case("xcore", xcore) 465f09cf34dSArchibald Elliott .Case("nvptx", nvptx) 466f09cf34dSArchibald Elliott .Case("nvptx64", nvptx64) 467f09cf34dSArchibald Elliott .Case("amdil", amdil) 468f09cf34dSArchibald Elliott .Case("amdil64", amdil64) 469f09cf34dSArchibald Elliott .Case("hsail", hsail) 470f09cf34dSArchibald Elliott .Case("hsail64", hsail64) 471f09cf34dSArchibald Elliott .Case("spir", spir) 472f09cf34dSArchibald Elliott .Case("spir64", spir64) 47353b6a169SNathan Gauër .Case("spirv", spirv) 474f09cf34dSArchibald Elliott .Case("spirv32", spirv32) 475f09cf34dSArchibald Elliott .Case("spirv64", spirv64) 476f09cf34dSArchibald Elliott .Case("kalimba", kalimba) 477f09cf34dSArchibald Elliott .Case("lanai", lanai) 478f09cf34dSArchibald Elliott .Case("shave", shave) 479f09cf34dSArchibald Elliott .Case("wasm32", wasm32) 480f09cf34dSArchibald Elliott .Case("wasm64", wasm64) 481f09cf34dSArchibald Elliott .Case("renderscript32", renderscript32) 482f09cf34dSArchibald Elliott .Case("renderscript64", renderscript64) 483f09cf34dSArchibald Elliott .Case("ve", ve) 484f09cf34dSArchibald Elliott .Case("csky", csky) 485f09cf34dSArchibald Elliott .Case("loongarch32", loongarch32) 486f09cf34dSArchibald Elliott .Case("loongarch64", loongarch64) 487f09cf34dSArchibald Elliott .Case("dxil", dxil) 4888c618e8fSAndrei Safronov .Case("xtensa", xtensa) 489f09cf34dSArchibald Elliott .Default(UnknownArch); 490f09cf34dSArchibald Elliott } 491f09cf34dSArchibald Elliott 492f09cf34dSArchibald Elliott static Triple::ArchType parseARMArch(StringRef ArchName) { 493f09cf34dSArchibald Elliott ARM::ISAKind ISA = ARM::parseArchISA(ArchName); 494f09cf34dSArchibald Elliott ARM::EndianKind ENDIAN = ARM::parseArchEndian(ArchName); 495f09cf34dSArchibald Elliott 496f09cf34dSArchibald Elliott Triple::ArchType arch = Triple::UnknownArch; 497f09cf34dSArchibald Elliott switch (ENDIAN) { 498f09cf34dSArchibald Elliott case ARM::EndianKind::LITTLE: { 499f09cf34dSArchibald Elliott switch (ISA) { 500f09cf34dSArchibald Elliott case ARM::ISAKind::ARM: 501f09cf34dSArchibald Elliott arch = Triple::arm; 502f09cf34dSArchibald Elliott break; 503f09cf34dSArchibald Elliott case ARM::ISAKind::THUMB: 504f09cf34dSArchibald Elliott arch = Triple::thumb; 505f09cf34dSArchibald Elliott break; 506f09cf34dSArchibald Elliott case ARM::ISAKind::AARCH64: 507f09cf34dSArchibald Elliott arch = Triple::aarch64; 508f09cf34dSArchibald Elliott break; 509f09cf34dSArchibald Elliott case ARM::ISAKind::INVALID: 510f09cf34dSArchibald Elliott break; 511f09cf34dSArchibald Elliott } 512f09cf34dSArchibald Elliott break; 513f09cf34dSArchibald Elliott } 514f09cf34dSArchibald Elliott case ARM::EndianKind::BIG: { 515f09cf34dSArchibald Elliott switch (ISA) { 516f09cf34dSArchibald Elliott case ARM::ISAKind::ARM: 517f09cf34dSArchibald Elliott arch = Triple::armeb; 518f09cf34dSArchibald Elliott break; 519f09cf34dSArchibald Elliott case ARM::ISAKind::THUMB: 520f09cf34dSArchibald Elliott arch = Triple::thumbeb; 521f09cf34dSArchibald Elliott break; 522f09cf34dSArchibald Elliott case ARM::ISAKind::AARCH64: 523f09cf34dSArchibald Elliott arch = Triple::aarch64_be; 524f09cf34dSArchibald Elliott break; 525f09cf34dSArchibald Elliott case ARM::ISAKind::INVALID: 526f09cf34dSArchibald Elliott break; 527f09cf34dSArchibald Elliott } 528f09cf34dSArchibald Elliott break; 529f09cf34dSArchibald Elliott } 530f09cf34dSArchibald Elliott case ARM::EndianKind::INVALID: { 531f09cf34dSArchibald Elliott break; 532f09cf34dSArchibald Elliott } 533f09cf34dSArchibald Elliott } 534f09cf34dSArchibald Elliott 535f09cf34dSArchibald Elliott ArchName = ARM::getCanonicalArchName(ArchName); 536f09cf34dSArchibald Elliott if (ArchName.empty()) 537f09cf34dSArchibald Elliott return Triple::UnknownArch; 538f09cf34dSArchibald Elliott 539f09cf34dSArchibald Elliott // Thumb only exists in v4+ 540f09cf34dSArchibald Elliott if (ISA == ARM::ISAKind::THUMB && 541586ecdf2SKazu Hirata (ArchName.starts_with("v2") || ArchName.starts_with("v3"))) 542f09cf34dSArchibald Elliott return Triple::UnknownArch; 543f09cf34dSArchibald Elliott 544f09cf34dSArchibald Elliott // Thumb only for v6m 545f09cf34dSArchibald Elliott ARM::ProfileKind Profile = ARM::parseArchProfile(ArchName); 546f09cf34dSArchibald Elliott unsigned Version = ARM::parseArchVersion(ArchName); 547f09cf34dSArchibald Elliott if (Profile == ARM::ProfileKind::M && Version == 6) { 548f09cf34dSArchibald Elliott if (ENDIAN == ARM::EndianKind::BIG) 549f09cf34dSArchibald Elliott return Triple::thumbeb; 550f09cf34dSArchibald Elliott else 551f09cf34dSArchibald Elliott return Triple::thumb; 552f09cf34dSArchibald Elliott } 553f09cf34dSArchibald Elliott 554f09cf34dSArchibald Elliott return arch; 555f09cf34dSArchibald Elliott } 556f09cf34dSArchibald Elliott 557f09cf34dSArchibald Elliott static Triple::ArchType parseArch(StringRef ArchName) { 558af7a82fdSS. Bharadwaj Yadavalli auto AT = 559af7a82fdSS. Bharadwaj Yadavalli StringSwitch<Triple::ArchType>(ArchName) 560f09cf34dSArchibald Elliott .Cases("i386", "i486", "i586", "i686", Triple::x86) 561f09cf34dSArchibald Elliott // FIXME: Do we need to support these? 562f09cf34dSArchibald Elliott .Cases("i786", "i886", "i986", Triple::x86) 563f09cf34dSArchibald Elliott .Cases("amd64", "x86_64", "x86_64h", Triple::x86_64) 564f09cf34dSArchibald Elliott .Cases("powerpc", "powerpcspe", "ppc", "ppc32", Triple::ppc) 565f09cf34dSArchibald Elliott .Cases("powerpcle", "ppcle", "ppc32le", Triple::ppcle) 566f09cf34dSArchibald Elliott .Cases("powerpc64", "ppu", "ppc64", Triple::ppc64) 567f09cf34dSArchibald Elliott .Cases("powerpc64le", "ppc64le", Triple::ppc64le) 568f09cf34dSArchibald Elliott .Case("xscale", Triple::arm) 569f09cf34dSArchibald Elliott .Case("xscaleeb", Triple::armeb) 570f09cf34dSArchibald Elliott .Case("aarch64", Triple::aarch64) 571f09cf34dSArchibald Elliott .Case("aarch64_be", Triple::aarch64_be) 572f09cf34dSArchibald Elliott .Case("aarch64_32", Triple::aarch64_32) 573f09cf34dSArchibald Elliott .Case("arc", Triple::arc) 574f09cf34dSArchibald Elliott .Case("arm64", Triple::aarch64) 575f09cf34dSArchibald Elliott .Case("arm64_32", Triple::aarch64_32) 576f09cf34dSArchibald Elliott .Case("arm64e", Triple::aarch64) 577f09cf34dSArchibald Elliott .Case("arm64ec", Triple::aarch64) 578f09cf34dSArchibald Elliott .Case("arm", Triple::arm) 579f09cf34dSArchibald Elliott .Case("armeb", Triple::armeb) 580f09cf34dSArchibald Elliott .Case("thumb", Triple::thumb) 581f09cf34dSArchibald Elliott .Case("thumbeb", Triple::thumbeb) 582f09cf34dSArchibald Elliott .Case("avr", Triple::avr) 583f09cf34dSArchibald Elliott .Case("m68k", Triple::m68k) 584f09cf34dSArchibald Elliott .Case("msp430", Triple::msp430) 585af7a82fdSS. Bharadwaj Yadavalli .Cases("mips", "mipseb", "mipsallegrex", "mipsisa32r6", "mipsr6", 586af7a82fdSS. Bharadwaj Yadavalli Triple::mips) 587f09cf34dSArchibald Elliott .Cases("mipsel", "mipsallegrexel", "mipsisa32r6el", "mipsr6el", 588f09cf34dSArchibald Elliott Triple::mipsel) 589af7a82fdSS. Bharadwaj Yadavalli .Cases("mips64", "mips64eb", "mipsn32", "mipsisa64r6", "mips64r6", 590af7a82fdSS. Bharadwaj Yadavalli "mipsn32r6", Triple::mips64) 591f09cf34dSArchibald Elliott .Cases("mips64el", "mipsn32el", "mipsisa64r6el", "mips64r6el", 592f09cf34dSArchibald Elliott "mipsn32r6el", Triple::mips64el) 593f09cf34dSArchibald Elliott .Case("r600", Triple::r600) 594f09cf34dSArchibald Elliott .Case("amdgcn", Triple::amdgcn) 595f09cf34dSArchibald Elliott .Case("riscv32", Triple::riscv32) 596f09cf34dSArchibald Elliott .Case("riscv64", Triple::riscv64) 597f09cf34dSArchibald Elliott .Case("hexagon", Triple::hexagon) 598f09cf34dSArchibald Elliott .Cases("s390x", "systemz", Triple::systemz) 599f09cf34dSArchibald Elliott .Case("sparc", Triple::sparc) 600f09cf34dSArchibald Elliott .Case("sparcel", Triple::sparcel) 601f09cf34dSArchibald Elliott .Cases("sparcv9", "sparc64", Triple::sparcv9) 602f09cf34dSArchibald Elliott .Case("tce", Triple::tce) 603f09cf34dSArchibald Elliott .Case("tcele", Triple::tcele) 604f09cf34dSArchibald Elliott .Case("xcore", Triple::xcore) 605f09cf34dSArchibald Elliott .Case("nvptx", Triple::nvptx) 606f09cf34dSArchibald Elliott .Case("nvptx64", Triple::nvptx64) 607f09cf34dSArchibald Elliott .Case("amdil", Triple::amdil) 608f09cf34dSArchibald Elliott .Case("amdil64", Triple::amdil64) 609f09cf34dSArchibald Elliott .Case("hsail", Triple::hsail) 610f09cf34dSArchibald Elliott .Case("hsail64", Triple::hsail64) 611f09cf34dSArchibald Elliott .Case("spir", Triple::spir) 612f09cf34dSArchibald Elliott .Case("spir64", Triple::spir64) 613c21f48e5SNatalie Chouinard .Cases("spirv", "spirv1.5", "spirv1.6", Triple::spirv) 614f09cf34dSArchibald Elliott .Cases("spirv32", "spirv32v1.0", "spirv32v1.1", "spirv32v1.2", 615f352ce36SMichal Paszkowski "spirv32v1.3", "spirv32v1.4", "spirv32v1.5", 616f352ce36SMichal Paszkowski "spirv32v1.6", Triple::spirv32) 617f09cf34dSArchibald Elliott .Cases("spirv64", "spirv64v1.0", "spirv64v1.1", "spirv64v1.2", 618f352ce36SMichal Paszkowski "spirv64v1.3", "spirv64v1.4", "spirv64v1.5", 619f352ce36SMichal Paszkowski "spirv64v1.6", Triple::spirv64) 620f09cf34dSArchibald Elliott .StartsWith("kalimba", Triple::kalimba) 621f09cf34dSArchibald Elliott .Case("lanai", Triple::lanai) 622f09cf34dSArchibald Elliott .Case("renderscript32", Triple::renderscript32) 623f09cf34dSArchibald Elliott .Case("renderscript64", Triple::renderscript64) 624f09cf34dSArchibald Elliott .Case("shave", Triple::shave) 625f09cf34dSArchibald Elliott .Case("ve", Triple::ve) 626f09cf34dSArchibald Elliott .Case("wasm32", Triple::wasm32) 627f09cf34dSArchibald Elliott .Case("wasm64", Triple::wasm64) 628f09cf34dSArchibald Elliott .Case("csky", Triple::csky) 629f09cf34dSArchibald Elliott .Case("loongarch32", Triple::loongarch32) 630f09cf34dSArchibald Elliott .Case("loongarch64", Triple::loongarch64) 631a2face49SS. Bharadwaj Yadavalli .Cases("dxil", "dxilv1.0", "dxilv1.1", "dxilv1.2", "dxilv1.3", 632a2face49SS. Bharadwaj Yadavalli "dxilv1.4", "dxilv1.5", "dxilv1.6", "dxilv1.7", "dxilv1.8", 633a2face49SS. Bharadwaj Yadavalli Triple::dxil) 6348c618e8fSAndrei Safronov .Case("xtensa", Triple::xtensa) 635f09cf34dSArchibald Elliott .Default(Triple::UnknownArch); 636f09cf34dSArchibald Elliott 637f09cf34dSArchibald Elliott // Some architectures require special parsing logic just to compute the 638f09cf34dSArchibald Elliott // ArchType result. 639f09cf34dSArchibald Elliott if (AT == Triple::UnknownArch) { 640586ecdf2SKazu Hirata if (ArchName.starts_with("arm") || ArchName.starts_with("thumb") || 641586ecdf2SKazu Hirata ArchName.starts_with("aarch64")) 642f09cf34dSArchibald Elliott return parseARMArch(ArchName); 643586ecdf2SKazu Hirata if (ArchName.starts_with("bpf")) 644f09cf34dSArchibald Elliott return parseBPFArch(ArchName); 645f09cf34dSArchibald Elliott } 646f09cf34dSArchibald Elliott 647f09cf34dSArchibald Elliott return AT; 648f09cf34dSArchibald Elliott } 649f09cf34dSArchibald Elliott 650f09cf34dSArchibald Elliott static Triple::VendorType parseVendor(StringRef VendorName) { 651f09cf34dSArchibald Elliott return StringSwitch<Triple::VendorType>(VendorName) 652f09cf34dSArchibald Elliott .Case("apple", Triple::Apple) 653f09cf34dSArchibald Elliott .Case("pc", Triple::PC) 654f09cf34dSArchibald Elliott .Case("scei", Triple::SCEI) 655f09cf34dSArchibald Elliott .Case("sie", Triple::SCEI) 656f09cf34dSArchibald Elliott .Case("fsl", Triple::Freescale) 657f09cf34dSArchibald Elliott .Case("ibm", Triple::IBM) 658f09cf34dSArchibald Elliott .Case("img", Triple::ImaginationTechnologies) 659f09cf34dSArchibald Elliott .Case("mti", Triple::MipsTechnologies) 660f09cf34dSArchibald Elliott .Case("nvidia", Triple::NVIDIA) 661f09cf34dSArchibald Elliott .Case("csr", Triple::CSR) 662f09cf34dSArchibald Elliott .Case("amd", Triple::AMD) 663f09cf34dSArchibald Elliott .Case("mesa", Triple::Mesa) 664f09cf34dSArchibald Elliott .Case("suse", Triple::SUSE) 665f09cf34dSArchibald Elliott .Case("oe", Triple::OpenEmbedded) 6661c16807dSNick Sarnie .Case("intel", Triple::Intel) 667f09cf34dSArchibald Elliott .Default(Triple::UnknownVendor); 668f09cf34dSArchibald Elliott } 669f09cf34dSArchibald Elliott 670f09cf34dSArchibald Elliott static Triple::OSType parseOS(StringRef OSName) { 671f09cf34dSArchibald Elliott return StringSwitch<Triple::OSType>(OSName) 672f09cf34dSArchibald Elliott .StartsWith("darwin", Triple::Darwin) 673f09cf34dSArchibald Elliott .StartsWith("dragonfly", Triple::DragonFly) 674f09cf34dSArchibald Elliott .StartsWith("freebsd", Triple::FreeBSD) 675f09cf34dSArchibald Elliott .StartsWith("fuchsia", Triple::Fuchsia) 676f09cf34dSArchibald Elliott .StartsWith("ios", Triple::IOS) 677f09cf34dSArchibald Elliott .StartsWith("kfreebsd", Triple::KFreeBSD) 678f09cf34dSArchibald Elliott .StartsWith("linux", Triple::Linux) 679f09cf34dSArchibald Elliott .StartsWith("lv2", Triple::Lv2) 680f09cf34dSArchibald Elliott .StartsWith("macos", Triple::MacOSX) 681f09cf34dSArchibald Elliott .StartsWith("netbsd", Triple::NetBSD) 682f09cf34dSArchibald Elliott .StartsWith("openbsd", Triple::OpenBSD) 683f09cf34dSArchibald Elliott .StartsWith("solaris", Triple::Solaris) 68430198bd7Sprabhukr .StartsWith("uefi", Triple::UEFI) 685f09cf34dSArchibald Elliott .StartsWith("win32", Triple::Win32) 686f09cf34dSArchibald Elliott .StartsWith("windows", Triple::Win32) 687f09cf34dSArchibald Elliott .StartsWith("zos", Triple::ZOS) 688f09cf34dSArchibald Elliott .StartsWith("haiku", Triple::Haiku) 689f09cf34dSArchibald Elliott .StartsWith("rtems", Triple::RTEMS) 690f09cf34dSArchibald Elliott .StartsWith("nacl", Triple::NaCl) 691f09cf34dSArchibald Elliott .StartsWith("aix", Triple::AIX) 692f09cf34dSArchibald Elliott .StartsWith("cuda", Triple::CUDA) 693f09cf34dSArchibald Elliott .StartsWith("nvcl", Triple::NVCL) 694f09cf34dSArchibald Elliott .StartsWith("amdhsa", Triple::AMDHSA) 695f09cf34dSArchibald Elliott .StartsWith("ps4", Triple::PS4) 696f09cf34dSArchibald Elliott .StartsWith("ps5", Triple::PS5) 697f09cf34dSArchibald Elliott .StartsWith("elfiamcu", Triple::ELFIAMCU) 698f09cf34dSArchibald Elliott .StartsWith("tvos", Triple::TvOS) 699f09cf34dSArchibald Elliott .StartsWith("watchos", Triple::WatchOS) 7001f57800fSJonas Devlieghere .StartsWith("bridgeos", Triple::BridgeOS) 701f09cf34dSArchibald Elliott .StartsWith("driverkit", Triple::DriverKit) 7027d3466b5SCyndy Ishida .StartsWith("xros", Triple::XROS) 7037d3466b5SCyndy Ishida .StartsWith("visionos", Triple::XROS) 704f09cf34dSArchibald Elliott .StartsWith("mesa3d", Triple::Mesa3D) 705f09cf34dSArchibald Elliott .StartsWith("amdpal", Triple::AMDPAL) 706f09cf34dSArchibald Elliott .StartsWith("hermit", Triple::HermitCore) 707f09cf34dSArchibald Elliott .StartsWith("hurd", Triple::Hurd) 708f09cf34dSArchibald Elliott .StartsWith("wasi", Triple::WASI) 709f09cf34dSArchibald Elliott .StartsWith("emscripten", Triple::Emscripten) 710f09cf34dSArchibald Elliott .StartsWith("shadermodel", Triple::ShaderModel) 711c417b7a6SPavel Kosov .StartsWith("liteos", Triple::LiteOS) 7127ef6b21cSAndrew Kaster .StartsWith("serenity", Triple::Serenity) 713c21f48e5SNatalie Chouinard .StartsWith("vulkan", Triple::Vulkan) 714f09cf34dSArchibald Elliott .Default(Triple::UnknownOS); 715f09cf34dSArchibald Elliott } 716f09cf34dSArchibald Elliott 717f09cf34dSArchibald Elliott static Triple::EnvironmentType parseEnvironment(StringRef EnvironmentName) { 718f09cf34dSArchibald Elliott return StringSwitch<Triple::EnvironmentType>(EnvironmentName) 719f09cf34dSArchibald Elliott .StartsWith("eabihf", Triple::EABIHF) 720f09cf34dSArchibald Elliott .StartsWith("eabi", Triple::EABI) 721f09cf34dSArchibald Elliott .StartsWith("gnuabin32", Triple::GNUABIN32) 722f09cf34dSArchibald Elliott .StartsWith("gnuabi64", Triple::GNUABI64) 723387b37afSMichał Górny .StartsWith("gnueabihft64", Triple::GNUEABIHFT64) 724f09cf34dSArchibald Elliott .StartsWith("gnueabihf", Triple::GNUEABIHF) 725387b37afSMichał Górny .StartsWith("gnueabit64", Triple::GNUEABIT64) 726f09cf34dSArchibald Elliott .StartsWith("gnueabi", Triple::GNUEABI) 727f09cf34dSArchibald Elliott .StartsWith("gnuf32", Triple::GNUF32) 728f09cf34dSArchibald Elliott .StartsWith("gnuf64", Triple::GNUF64) 729f09cf34dSArchibald Elliott .StartsWith("gnusf", Triple::GNUSF) 730f09cf34dSArchibald Elliott .StartsWith("gnux32", Triple::GNUX32) 731f09cf34dSArchibald Elliott .StartsWith("gnu_ilp32", Triple::GNUILP32) 732f09cf34dSArchibald Elliott .StartsWith("code16", Triple::CODE16) 733387b37afSMichał Górny .StartsWith("gnut64", Triple::GNUT64) 734f09cf34dSArchibald Elliott .StartsWith("gnu", Triple::GNU) 735f09cf34dSArchibald Elliott .StartsWith("android", Triple::Android) 73672a21805SAlex Rønne Petersen .StartsWith("muslabin32", Triple::MuslABIN32) 73772a21805SAlex Rønne Petersen .StartsWith("muslabi64", Triple::MuslABI64) 738f09cf34dSArchibald Elliott .StartsWith("musleabihf", Triple::MuslEABIHF) 739f09cf34dSArchibald Elliott .StartsWith("musleabi", Triple::MuslEABI) 74072a21805SAlex Rønne Petersen .StartsWith("muslf32", Triple::MuslF32) 74172a21805SAlex Rønne Petersen .StartsWith("muslsf", Triple::MuslSF) 742f09cf34dSArchibald Elliott .StartsWith("muslx32", Triple::MuslX32) 743f09cf34dSArchibald Elliott .StartsWith("musl", Triple::Musl) 744f09cf34dSArchibald Elliott .StartsWith("msvc", Triple::MSVC) 745f09cf34dSArchibald Elliott .StartsWith("itanium", Triple::Itanium) 746f09cf34dSArchibald Elliott .StartsWith("cygnus", Triple::Cygnus) 747f09cf34dSArchibald Elliott .StartsWith("coreclr", Triple::CoreCLR) 748f09cf34dSArchibald Elliott .StartsWith("simulator", Triple::Simulator) 749f09cf34dSArchibald Elliott .StartsWith("macabi", Triple::MacABI) 750f09cf34dSArchibald Elliott .StartsWith("pixel", Triple::Pixel) 751f09cf34dSArchibald Elliott .StartsWith("vertex", Triple::Vertex) 752f09cf34dSArchibald Elliott .StartsWith("geometry", Triple::Geometry) 753f09cf34dSArchibald Elliott .StartsWith("hull", Triple::Hull) 754f09cf34dSArchibald Elliott .StartsWith("domain", Triple::Domain) 755f09cf34dSArchibald Elliott .StartsWith("compute", Triple::Compute) 756f09cf34dSArchibald Elliott .StartsWith("library", Triple::Library) 757f09cf34dSArchibald Elliott .StartsWith("raygeneration", Triple::RayGeneration) 758f09cf34dSArchibald Elliott .StartsWith("intersection", Triple::Intersection) 759f09cf34dSArchibald Elliott .StartsWith("anyhit", Triple::AnyHit) 760f09cf34dSArchibald Elliott .StartsWith("closesthit", Triple::ClosestHit) 761f09cf34dSArchibald Elliott .StartsWith("miss", Triple::Miss) 762f09cf34dSArchibald Elliott .StartsWith("callable", Triple::Callable) 763f09cf34dSArchibald Elliott .StartsWith("mesh", Triple::Mesh) 764f09cf34dSArchibald Elliott .StartsWith("amplification", Triple::Amplification) 76534c4a0faSZijunZhaoCCK .StartsWith("opencl", Triple::OpenCL) 766c417b7a6SPavel Kosov .StartsWith("ohos", Triple::OpenHOS) 767146fd7cdSDaniil Kovalev .StartsWith("pauthtest", Triple::PAuthTest) 7687672216eSJoseph Huber .StartsWith("llvm", Triple::LLVM) 769f09cf34dSArchibald Elliott .Default(Triple::UnknownEnvironment); 770f09cf34dSArchibald Elliott } 771f09cf34dSArchibald Elliott 772f09cf34dSArchibald Elliott static Triple::ObjectFormatType parseFormat(StringRef EnvironmentName) { 773f09cf34dSArchibald Elliott return StringSwitch<Triple::ObjectFormatType>(EnvironmentName) 774f09cf34dSArchibald Elliott // "xcoff" must come before "coff" because of the order-dependendent 775f09cf34dSArchibald Elliott // pattern matching. 776f09cf34dSArchibald Elliott .EndsWith("xcoff", Triple::XCOFF) 777f09cf34dSArchibald Elliott .EndsWith("coff", Triple::COFF) 778f09cf34dSArchibald Elliott .EndsWith("elf", Triple::ELF) 779f09cf34dSArchibald Elliott .EndsWith("goff", Triple::GOFF) 780f09cf34dSArchibald Elliott .EndsWith("macho", Triple::MachO) 781f09cf34dSArchibald Elliott .EndsWith("wasm", Triple::Wasm) 782f09cf34dSArchibald Elliott .EndsWith("spirv", Triple::SPIRV) 783f09cf34dSArchibald Elliott .Default(Triple::UnknownObjectFormat); 784f09cf34dSArchibald Elliott } 785f09cf34dSArchibald Elliott 786f09cf34dSArchibald Elliott static Triple::SubArchType parseSubArch(StringRef SubArchName) { 787586ecdf2SKazu Hirata if (SubArchName.starts_with("mips") && 788586ecdf2SKazu Hirata (SubArchName.ends_with("r6el") || SubArchName.ends_with("r6"))) 789f09cf34dSArchibald Elliott return Triple::MipsSubArch_r6; 790f09cf34dSArchibald Elliott 791f09cf34dSArchibald Elliott if (SubArchName == "powerpcspe") 792f09cf34dSArchibald Elliott return Triple::PPCSubArch_spe; 793f09cf34dSArchibald Elliott 794f09cf34dSArchibald Elliott if (SubArchName == "arm64e") 795f09cf34dSArchibald Elliott return Triple::AArch64SubArch_arm64e; 796f09cf34dSArchibald Elliott 797f09cf34dSArchibald Elliott if (SubArchName == "arm64ec") 798f09cf34dSArchibald Elliott return Triple::AArch64SubArch_arm64ec; 799f09cf34dSArchibald Elliott 800586ecdf2SKazu Hirata if (SubArchName.starts_with("spirv")) 801f09cf34dSArchibald Elliott return StringSwitch<Triple::SubArchType>(SubArchName) 802f09cf34dSArchibald Elliott .EndsWith("v1.0", Triple::SPIRVSubArch_v10) 803f09cf34dSArchibald Elliott .EndsWith("v1.1", Triple::SPIRVSubArch_v11) 804f09cf34dSArchibald Elliott .EndsWith("v1.2", Triple::SPIRVSubArch_v12) 805f09cf34dSArchibald Elliott .EndsWith("v1.3", Triple::SPIRVSubArch_v13) 806f09cf34dSArchibald Elliott .EndsWith("v1.4", Triple::SPIRVSubArch_v14) 807f09cf34dSArchibald Elliott .EndsWith("v1.5", Triple::SPIRVSubArch_v15) 808c21f48e5SNatalie Chouinard .EndsWith("v1.6", Triple::SPIRVSubArch_v16) 809f09cf34dSArchibald Elliott .Default(Triple::NoSubArch); 810f09cf34dSArchibald Elliott 811a2face49SS. Bharadwaj Yadavalli if (SubArchName.starts_with("dxil")) 812a2face49SS. Bharadwaj Yadavalli return StringSwitch<Triple::SubArchType>(SubArchName) 813a2face49SS. Bharadwaj Yadavalli .EndsWith("v1.0", Triple::DXILSubArch_v1_0) 814a2face49SS. Bharadwaj Yadavalli .EndsWith("v1.1", Triple::DXILSubArch_v1_1) 815a2face49SS. Bharadwaj Yadavalli .EndsWith("v1.2", Triple::DXILSubArch_v1_2) 816a2face49SS. Bharadwaj Yadavalli .EndsWith("v1.3", Triple::DXILSubArch_v1_3) 817a2face49SS. Bharadwaj Yadavalli .EndsWith("v1.4", Triple::DXILSubArch_v1_4) 818a2face49SS. Bharadwaj Yadavalli .EndsWith("v1.5", Triple::DXILSubArch_v1_5) 819a2face49SS. Bharadwaj Yadavalli .EndsWith("v1.6", Triple::DXILSubArch_v1_6) 820a2face49SS. Bharadwaj Yadavalli .EndsWith("v1.7", Triple::DXILSubArch_v1_7) 821a2face49SS. Bharadwaj Yadavalli .EndsWith("v1.8", Triple::DXILSubArch_v1_8) 822a2face49SS. Bharadwaj Yadavalli .Default(Triple::NoSubArch); 823a2face49SS. Bharadwaj Yadavalli 824f09cf34dSArchibald Elliott StringRef ARMSubArch = ARM::getCanonicalArchName(SubArchName); 825f09cf34dSArchibald Elliott 826f09cf34dSArchibald Elliott // For now, this is the small part. Early return. 827f09cf34dSArchibald Elliott if (ARMSubArch.empty()) 828f09cf34dSArchibald Elliott return StringSwitch<Triple::SubArchType>(SubArchName) 829f09cf34dSArchibald Elliott .EndsWith("kalimba3", Triple::KalimbaSubArch_v3) 830f09cf34dSArchibald Elliott .EndsWith("kalimba4", Triple::KalimbaSubArch_v4) 831f09cf34dSArchibald Elliott .EndsWith("kalimba5", Triple::KalimbaSubArch_v5) 832f09cf34dSArchibald Elliott .Default(Triple::NoSubArch); 833f09cf34dSArchibald Elliott 834f09cf34dSArchibald Elliott // ARM sub arch. 835f09cf34dSArchibald Elliott switch(ARM::parseArch(ARMSubArch)) { 836f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV4: 837f09cf34dSArchibald Elliott return Triple::NoSubArch; 838f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV4T: 839f09cf34dSArchibald Elliott return Triple::ARMSubArch_v4t; 840f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV5T: 841f09cf34dSArchibald Elliott return Triple::ARMSubArch_v5; 842f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV5TE: 843f09cf34dSArchibald Elliott case ARM::ArchKind::IWMMXT: 844f09cf34dSArchibald Elliott case ARM::ArchKind::IWMMXT2: 845f09cf34dSArchibald Elliott case ARM::ArchKind::XSCALE: 846f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV5TEJ: 847f09cf34dSArchibald Elliott return Triple::ARMSubArch_v5te; 848f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV6: 849f09cf34dSArchibald Elliott return Triple::ARMSubArch_v6; 850f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV6K: 851f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV6KZ: 852f09cf34dSArchibald Elliott return Triple::ARMSubArch_v6k; 853f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV6T2: 854f09cf34dSArchibald Elliott return Triple::ARMSubArch_v6t2; 855f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV6M: 856f09cf34dSArchibald Elliott return Triple::ARMSubArch_v6m; 857f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV7A: 858f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV7R: 859f09cf34dSArchibald Elliott return Triple::ARMSubArch_v7; 860f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV7VE: 861f09cf34dSArchibald Elliott return Triple::ARMSubArch_v7ve; 862f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV7K: 863f09cf34dSArchibald Elliott return Triple::ARMSubArch_v7k; 864f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV7M: 865f09cf34dSArchibald Elliott return Triple::ARMSubArch_v7m; 866f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV7S: 867f09cf34dSArchibald Elliott return Triple::ARMSubArch_v7s; 868f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV7EM: 869f09cf34dSArchibald Elliott return Triple::ARMSubArch_v7em; 870f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV8A: 871f09cf34dSArchibald Elliott return Triple::ARMSubArch_v8; 872f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV8_1A: 873f09cf34dSArchibald Elliott return Triple::ARMSubArch_v8_1a; 874f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV8_2A: 875f09cf34dSArchibald Elliott return Triple::ARMSubArch_v8_2a; 876f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV8_3A: 877f09cf34dSArchibald Elliott return Triple::ARMSubArch_v8_3a; 878f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV8_4A: 879f09cf34dSArchibald Elliott return Triple::ARMSubArch_v8_4a; 880f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV8_5A: 881f09cf34dSArchibald Elliott return Triple::ARMSubArch_v8_5a; 882f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV8_6A: 883f09cf34dSArchibald Elliott return Triple::ARMSubArch_v8_6a; 884f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV8_7A: 885f09cf34dSArchibald Elliott return Triple::ARMSubArch_v8_7a; 886f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV8_8A: 887f09cf34dSArchibald Elliott return Triple::ARMSubArch_v8_8a; 888f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV8_9A: 889f09cf34dSArchibald Elliott return Triple::ARMSubArch_v8_9a; 890f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV9A: 891f09cf34dSArchibald Elliott return Triple::ARMSubArch_v9; 892f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV9_1A: 893f09cf34dSArchibald Elliott return Triple::ARMSubArch_v9_1a; 894f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV9_2A: 895f09cf34dSArchibald Elliott return Triple::ARMSubArch_v9_2a; 896f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV9_3A: 897f09cf34dSArchibald Elliott return Triple::ARMSubArch_v9_3a; 898f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV9_4A: 899f09cf34dSArchibald Elliott return Triple::ARMSubArch_v9_4a; 9006bbaad1eSLucas Duarte Prates case ARM::ArchKind::ARMV9_5A: 9016bbaad1eSLucas Duarte Prates return Triple::ARMSubArch_v9_5a; 902d0756caeSJonathan Thackray case ARM::ArchKind::ARMV9_6A: 903d0756caeSJonathan Thackray return Triple::ARMSubArch_v9_6a; 904f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV8R: 905f09cf34dSArchibald Elliott return Triple::ARMSubArch_v8r; 906f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV8MBaseline: 907f09cf34dSArchibald Elliott return Triple::ARMSubArch_v8m_baseline; 908f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV8MMainline: 909f09cf34dSArchibald Elliott return Triple::ARMSubArch_v8m_mainline; 910f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV8_1MMainline: 911f09cf34dSArchibald Elliott return Triple::ARMSubArch_v8_1m_mainline; 912f09cf34dSArchibald Elliott default: 913f09cf34dSArchibald Elliott return Triple::NoSubArch; 914f09cf34dSArchibald Elliott } 915f09cf34dSArchibald Elliott } 916f09cf34dSArchibald Elliott 917f09cf34dSArchibald Elliott static Triple::ObjectFormatType getDefaultFormat(const Triple &T) { 918f09cf34dSArchibald Elliott switch (T.getArch()) { 919f09cf34dSArchibald Elliott case Triple::UnknownArch: 920f09cf34dSArchibald Elliott case Triple::aarch64: 921f09cf34dSArchibald Elliott case Triple::aarch64_32: 922f09cf34dSArchibald Elliott case Triple::arm: 923f09cf34dSArchibald Elliott case Triple::thumb: 924f09cf34dSArchibald Elliott case Triple::x86: 925f09cf34dSArchibald Elliott case Triple::x86_64: 92662941293SMatt Arsenault switch (T.getOS()) { 92762941293SMatt Arsenault case Triple::Win32: 92862941293SMatt Arsenault case Triple::UEFI: 929f09cf34dSArchibald Elliott return Triple::COFF; 93062941293SMatt Arsenault default: 93162941293SMatt Arsenault return T.isOSDarwin() ? Triple::MachO : Triple::ELF; 93262941293SMatt Arsenault } 933f09cf34dSArchibald Elliott case Triple::aarch64_be: 934f09cf34dSArchibald Elliott case Triple::amdgcn: 935f09cf34dSArchibald Elliott case Triple::amdil64: 936f09cf34dSArchibald Elliott case Triple::amdil: 937f09cf34dSArchibald Elliott case Triple::arc: 938f09cf34dSArchibald Elliott case Triple::armeb: 939f09cf34dSArchibald Elliott case Triple::avr: 940f09cf34dSArchibald Elliott case Triple::bpfeb: 941f09cf34dSArchibald Elliott case Triple::bpfel: 942f09cf34dSArchibald Elliott case Triple::csky: 943f09cf34dSArchibald Elliott case Triple::hexagon: 944f09cf34dSArchibald Elliott case Triple::hsail64: 945f09cf34dSArchibald Elliott case Triple::hsail: 946f09cf34dSArchibald Elliott case Triple::kalimba: 947f09cf34dSArchibald Elliott case Triple::lanai: 948f09cf34dSArchibald Elliott case Triple::loongarch32: 949f09cf34dSArchibald Elliott case Triple::loongarch64: 950f09cf34dSArchibald Elliott case Triple::m68k: 951f09cf34dSArchibald Elliott case Triple::mips64: 952f09cf34dSArchibald Elliott case Triple::mips64el: 953f09cf34dSArchibald Elliott case Triple::mips: 954f09cf34dSArchibald Elliott case Triple::msp430: 955f09cf34dSArchibald Elliott case Triple::nvptx64: 956f09cf34dSArchibald Elliott case Triple::nvptx: 957f09cf34dSArchibald Elliott case Triple::ppc64le: 958f09cf34dSArchibald Elliott case Triple::ppcle: 959f09cf34dSArchibald Elliott case Triple::r600: 960f09cf34dSArchibald Elliott case Triple::renderscript32: 961f09cf34dSArchibald Elliott case Triple::renderscript64: 962f09cf34dSArchibald Elliott case Triple::riscv32: 963f09cf34dSArchibald Elliott case Triple::riscv64: 964f09cf34dSArchibald Elliott case Triple::shave: 965f09cf34dSArchibald Elliott case Triple::sparc: 966f09cf34dSArchibald Elliott case Triple::sparcel: 967f09cf34dSArchibald Elliott case Triple::sparcv9: 968f09cf34dSArchibald Elliott case Triple::spir64: 969f09cf34dSArchibald Elliott case Triple::spir: 970f09cf34dSArchibald Elliott case Triple::tce: 971f09cf34dSArchibald Elliott case Triple::tcele: 972f09cf34dSArchibald Elliott case Triple::thumbeb: 973f09cf34dSArchibald Elliott case Triple::ve: 974f09cf34dSArchibald Elliott case Triple::xcore: 9758c618e8fSAndrei Safronov case Triple::xtensa: 976f09cf34dSArchibald Elliott return Triple::ELF; 977f09cf34dSArchibald Elliott 978c6ba7b38Shpoussin case Triple::mipsel: 979c6ba7b38Shpoussin if (T.isOSWindows()) 980c6ba7b38Shpoussin return Triple::COFF; 981c6ba7b38Shpoussin return Triple::ELF; 982c6ba7b38Shpoussin 983f09cf34dSArchibald Elliott case Triple::ppc64: 984f09cf34dSArchibald Elliott case Triple::ppc: 985f09cf34dSArchibald Elliott if (T.isOSAIX()) 986f09cf34dSArchibald Elliott return Triple::XCOFF; 98762941293SMatt Arsenault if (T.isOSDarwin()) 98862941293SMatt Arsenault return Triple::MachO; 989f09cf34dSArchibald Elliott return Triple::ELF; 990f09cf34dSArchibald Elliott 991f09cf34dSArchibald Elliott case Triple::systemz: 992f09cf34dSArchibald Elliott if (T.isOSzOS()) 993f09cf34dSArchibald Elliott return Triple::GOFF; 994f09cf34dSArchibald Elliott return Triple::ELF; 995f09cf34dSArchibald Elliott 996f09cf34dSArchibald Elliott case Triple::wasm32: 997f09cf34dSArchibald Elliott case Triple::wasm64: 998f09cf34dSArchibald Elliott return Triple::Wasm; 999f09cf34dSArchibald Elliott 100053b6a169SNathan Gauër case Triple::spirv: 1001f09cf34dSArchibald Elliott case Triple::spirv32: 1002f09cf34dSArchibald Elliott case Triple::spirv64: 1003f09cf34dSArchibald Elliott return Triple::SPIRV; 1004f09cf34dSArchibald Elliott 1005f09cf34dSArchibald Elliott case Triple::dxil: 1006f09cf34dSArchibald Elliott return Triple::DXContainer; 1007f09cf34dSArchibald Elliott } 1008f09cf34dSArchibald Elliott llvm_unreachable("unknown architecture"); 1009f09cf34dSArchibald Elliott } 1010f09cf34dSArchibald Elliott 1011f09cf34dSArchibald Elliott /// Construct a triple from the string representation provided. 1012f09cf34dSArchibald Elliott /// 1013f09cf34dSArchibald Elliott /// This stores the string representation and parses the various pieces into 1014f09cf34dSArchibald Elliott /// enum members. 1015f09cf34dSArchibald Elliott Triple::Triple(const Twine &Str) 1016f09cf34dSArchibald Elliott : Data(Str.str()), Arch(UnknownArch), SubArch(NoSubArch), 1017f09cf34dSArchibald Elliott Vendor(UnknownVendor), OS(UnknownOS), Environment(UnknownEnvironment), 1018f09cf34dSArchibald Elliott ObjectFormat(UnknownObjectFormat) { 1019f09cf34dSArchibald Elliott // Do minimal parsing by hand here. 1020f09cf34dSArchibald Elliott SmallVector<StringRef, 4> Components; 1021f09cf34dSArchibald Elliott StringRef(Data).split(Components, '-', /*MaxSplit*/ 3); 1022f09cf34dSArchibald Elliott if (Components.size() > 0) { 1023f09cf34dSArchibald Elliott Arch = parseArch(Components[0]); 1024f09cf34dSArchibald Elliott SubArch = parseSubArch(Components[0]); 1025f09cf34dSArchibald Elliott if (Components.size() > 1) { 1026f09cf34dSArchibald Elliott Vendor = parseVendor(Components[1]); 1027f09cf34dSArchibald Elliott if (Components.size() > 2) { 1028f09cf34dSArchibald Elliott OS = parseOS(Components[2]); 1029f09cf34dSArchibald Elliott if (Components.size() > 3) { 1030f09cf34dSArchibald Elliott Environment = parseEnvironment(Components[3]); 1031f09cf34dSArchibald Elliott ObjectFormat = parseFormat(Components[3]); 1032f09cf34dSArchibald Elliott } 1033f09cf34dSArchibald Elliott } 1034f09cf34dSArchibald Elliott } else { 1035f09cf34dSArchibald Elliott Environment = 1036f09cf34dSArchibald Elliott StringSwitch<Triple::EnvironmentType>(Components[0]) 1037f09cf34dSArchibald Elliott .StartsWith("mipsn32", Triple::GNUABIN32) 1038f09cf34dSArchibald Elliott .StartsWith("mips64", Triple::GNUABI64) 1039f09cf34dSArchibald Elliott .StartsWith("mipsisa64", Triple::GNUABI64) 1040f09cf34dSArchibald Elliott .StartsWith("mipsisa32", Triple::GNU) 1041f09cf34dSArchibald Elliott .Cases("mips", "mipsel", "mipsr6", "mipsr6el", Triple::GNU) 1042f09cf34dSArchibald Elliott .Default(UnknownEnvironment); 1043f09cf34dSArchibald Elliott } 1044f09cf34dSArchibald Elliott } 1045f09cf34dSArchibald Elliott if (ObjectFormat == UnknownObjectFormat) 1046f09cf34dSArchibald Elliott ObjectFormat = getDefaultFormat(*this); 1047f09cf34dSArchibald Elliott } 1048f09cf34dSArchibald Elliott 1049f09cf34dSArchibald Elliott /// Construct a triple from string representations of the architecture, 1050f09cf34dSArchibald Elliott /// vendor, and OS. 1051f09cf34dSArchibald Elliott /// 1052f09cf34dSArchibald Elliott /// This joins each argument into a canonical string representation and parses 1053f09cf34dSArchibald Elliott /// them into enum members. It leaves the environment unknown and omits it from 1054f09cf34dSArchibald Elliott /// the string representation. 1055f09cf34dSArchibald Elliott Triple::Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr) 1056f09cf34dSArchibald Elliott : Data((ArchStr + Twine('-') + VendorStr + Twine('-') + OSStr).str()), 1057f09cf34dSArchibald Elliott Arch(parseArch(ArchStr.str())), 1058f09cf34dSArchibald Elliott SubArch(parseSubArch(ArchStr.str())), 1059f09cf34dSArchibald Elliott Vendor(parseVendor(VendorStr.str())), 1060f09cf34dSArchibald Elliott OS(parseOS(OSStr.str())), 1061f09cf34dSArchibald Elliott Environment(), ObjectFormat(Triple::UnknownObjectFormat) { 1062f09cf34dSArchibald Elliott ObjectFormat = getDefaultFormat(*this); 1063f09cf34dSArchibald Elliott } 1064f09cf34dSArchibald Elliott 1065f09cf34dSArchibald Elliott /// Construct a triple from string representations of the architecture, 1066f09cf34dSArchibald Elliott /// vendor, OS, and environment. 1067f09cf34dSArchibald Elliott /// 1068f09cf34dSArchibald Elliott /// This joins each argument into a canonical string representation and parses 1069f09cf34dSArchibald Elliott /// them into enum members. 1070f09cf34dSArchibald Elliott Triple::Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr, 1071f09cf34dSArchibald Elliott const Twine &EnvironmentStr) 1072f09cf34dSArchibald Elliott : Data((ArchStr + Twine('-') + VendorStr + Twine('-') + OSStr + Twine('-') + 1073f09cf34dSArchibald Elliott EnvironmentStr).str()), 1074f09cf34dSArchibald Elliott Arch(parseArch(ArchStr.str())), 1075f09cf34dSArchibald Elliott SubArch(parseSubArch(ArchStr.str())), 1076f09cf34dSArchibald Elliott Vendor(parseVendor(VendorStr.str())), 1077f09cf34dSArchibald Elliott OS(parseOS(OSStr.str())), 1078f09cf34dSArchibald Elliott Environment(parseEnvironment(EnvironmentStr.str())), 1079f09cf34dSArchibald Elliott ObjectFormat(parseFormat(EnvironmentStr.str())) { 1080f09cf34dSArchibald Elliott if (ObjectFormat == Triple::UnknownObjectFormat) 1081f09cf34dSArchibald Elliott ObjectFormat = getDefaultFormat(*this); 1082f09cf34dSArchibald Elliott } 1083f09cf34dSArchibald Elliott 10846d890148SS. Bharadwaj Yadavalli static VersionTuple parseVersionFromName(StringRef Name); 10856d890148SS. Bharadwaj Yadavalli 10866d890148SS. Bharadwaj Yadavalli static StringRef getDXILArchNameFromShaderModel(StringRef ShaderModelStr) { 10876d890148SS. Bharadwaj Yadavalli VersionTuple Ver = 10886d890148SS. Bharadwaj Yadavalli parseVersionFromName(ShaderModelStr.drop_front(strlen("shadermodel"))); 10896d890148SS. Bharadwaj Yadavalli // Default DXIL minor version when Shader Model version is anything other 10906d890148SS. Bharadwaj Yadavalli // than 6.[0...8] or 6.x (which translates to latest current SM version) 10916d890148SS. Bharadwaj Yadavalli const unsigned SMMajor = 6; 10926d890148SS. Bharadwaj Yadavalli if (!Ver.empty()) { 10936d890148SS. Bharadwaj Yadavalli if (Ver.getMajor() == SMMajor) { 10946d890148SS. Bharadwaj Yadavalli if (std::optional<unsigned> SMMinor = Ver.getMinor()) { 10956d890148SS. Bharadwaj Yadavalli switch (*SMMinor) { 10966d890148SS. Bharadwaj Yadavalli case 0: 10976d890148SS. Bharadwaj Yadavalli return Triple::getArchName(Triple::dxil, Triple::DXILSubArch_v1_0); 10986d890148SS. Bharadwaj Yadavalli case 1: 10996d890148SS. Bharadwaj Yadavalli return Triple::getArchName(Triple::dxil, Triple::DXILSubArch_v1_1); 11006d890148SS. Bharadwaj Yadavalli case 2: 11016d890148SS. Bharadwaj Yadavalli return Triple::getArchName(Triple::dxil, Triple::DXILSubArch_v1_2); 11026d890148SS. Bharadwaj Yadavalli case 3: 11036d890148SS. Bharadwaj Yadavalli return Triple::getArchName(Triple::dxil, Triple::DXILSubArch_v1_3); 11046d890148SS. Bharadwaj Yadavalli case 4: 11056d890148SS. Bharadwaj Yadavalli return Triple::getArchName(Triple::dxil, Triple::DXILSubArch_v1_4); 11066d890148SS. Bharadwaj Yadavalli case 5: 11076d890148SS. Bharadwaj Yadavalli return Triple::getArchName(Triple::dxil, Triple::DXILSubArch_v1_5); 11086d890148SS. Bharadwaj Yadavalli case 6: 11096d890148SS. Bharadwaj Yadavalli return Triple::getArchName(Triple::dxil, Triple::DXILSubArch_v1_6); 11106d890148SS. Bharadwaj Yadavalli case 7: 11116d890148SS. Bharadwaj Yadavalli return Triple::getArchName(Triple::dxil, Triple::DXILSubArch_v1_7); 11126d890148SS. Bharadwaj Yadavalli case 8: 11136d890148SS. Bharadwaj Yadavalli return Triple::getArchName(Triple::dxil, Triple::DXILSubArch_v1_8); 11146d890148SS. Bharadwaj Yadavalli default: 11156d890148SS. Bharadwaj Yadavalli report_fatal_error("Unsupported Shader Model version", false); 11166d890148SS. Bharadwaj Yadavalli } 11176d890148SS. Bharadwaj Yadavalli } 11186d890148SS. Bharadwaj Yadavalli } 11196d890148SS. Bharadwaj Yadavalli } else { 11206d890148SS. Bharadwaj Yadavalli // Special case: DXIL minor version is set to LatestCurrentDXILMinor for 11216d890148SS. Bharadwaj Yadavalli // shadermodel6.x is 11226d890148SS. Bharadwaj Yadavalli if (ShaderModelStr == "shadermodel6.x") { 11236d890148SS. Bharadwaj Yadavalli return Triple::getArchName(Triple::dxil, Triple::LatestDXILSubArch); 11246d890148SS. Bharadwaj Yadavalli } 11256d890148SS. Bharadwaj Yadavalli } 11266d890148SS. Bharadwaj Yadavalli // DXIL version corresponding to Shader Model version other than 6.Minor 11276d890148SS. Bharadwaj Yadavalli // is 1.0 11286d890148SS. Bharadwaj Yadavalli return Triple::getArchName(Triple::dxil, Triple::DXILSubArch_v1_0); 11296d890148SS. Bharadwaj Yadavalli } 11306d890148SS. Bharadwaj Yadavalli 1131ebef4406SShilei Tian std::string Triple::normalize(StringRef Str, CanonicalForm Form) { 1132f09cf34dSArchibald Elliott bool IsMinGW32 = false; 1133f09cf34dSArchibald Elliott bool IsCygwin = false; 1134f09cf34dSArchibald Elliott 1135f09cf34dSArchibald Elliott // Parse into components. 1136f09cf34dSArchibald Elliott SmallVector<StringRef, 4> Components; 1137f09cf34dSArchibald Elliott Str.split(Components, '-'); 1138f09cf34dSArchibald Elliott 1139f09cf34dSArchibald Elliott // If the first component corresponds to a known architecture, preferentially 1140f09cf34dSArchibald Elliott // use it for the architecture. If the second component corresponds to a 1141f09cf34dSArchibald Elliott // known vendor, preferentially use it for the vendor, etc. This avoids silly 1142f09cf34dSArchibald Elliott // component movement when a component parses as (eg) both a valid arch and a 1143f09cf34dSArchibald Elliott // valid os. 1144f09cf34dSArchibald Elliott ArchType Arch = UnknownArch; 1145f09cf34dSArchibald Elliott if (Components.size() > 0) 1146f09cf34dSArchibald Elliott Arch = parseArch(Components[0]); 1147f09cf34dSArchibald Elliott VendorType Vendor = UnknownVendor; 1148f09cf34dSArchibald Elliott if (Components.size() > 1) 1149f09cf34dSArchibald Elliott Vendor = parseVendor(Components[1]); 1150f09cf34dSArchibald Elliott OSType OS = UnknownOS; 1151f09cf34dSArchibald Elliott if (Components.size() > 2) { 1152f09cf34dSArchibald Elliott OS = parseOS(Components[2]); 1153586ecdf2SKazu Hirata IsCygwin = Components[2].starts_with("cygwin"); 1154586ecdf2SKazu Hirata IsMinGW32 = Components[2].starts_with("mingw"); 1155f09cf34dSArchibald Elliott } 1156f09cf34dSArchibald Elliott EnvironmentType Environment = UnknownEnvironment; 1157f09cf34dSArchibald Elliott if (Components.size() > 3) 1158f09cf34dSArchibald Elliott Environment = parseEnvironment(Components[3]); 1159f09cf34dSArchibald Elliott ObjectFormatType ObjectFormat = UnknownObjectFormat; 1160f09cf34dSArchibald Elliott if (Components.size() > 4) 1161f09cf34dSArchibald Elliott ObjectFormat = parseFormat(Components[4]); 1162f09cf34dSArchibald Elliott 1163f09cf34dSArchibald Elliott // Note which components are already in their final position. These will not 1164f09cf34dSArchibald Elliott // be moved. 1165f09cf34dSArchibald Elliott bool Found[4]; 1166f09cf34dSArchibald Elliott Found[0] = Arch != UnknownArch; 1167f09cf34dSArchibald Elliott Found[1] = Vendor != UnknownVendor; 1168f09cf34dSArchibald Elliott Found[2] = OS != UnknownOS; 1169f09cf34dSArchibald Elliott Found[3] = Environment != UnknownEnvironment; 1170f09cf34dSArchibald Elliott 1171f09cf34dSArchibald Elliott // If they are not there already, permute the components into their canonical 1172f09cf34dSArchibald Elliott // positions by seeing if they parse as a valid architecture, and if so moving 1173f09cf34dSArchibald Elliott // the component to the architecture position etc. 1174f09cf34dSArchibald Elliott for (unsigned Pos = 0; Pos != std::size(Found); ++Pos) { 1175f09cf34dSArchibald Elliott if (Found[Pos]) 1176f09cf34dSArchibald Elliott continue; // Already in the canonical position. 1177f09cf34dSArchibald Elliott 1178f09cf34dSArchibald Elliott for (unsigned Idx = 0; Idx != Components.size(); ++Idx) { 1179f09cf34dSArchibald Elliott // Do not reparse any components that already matched. 1180f09cf34dSArchibald Elliott if (Idx < std::size(Found) && Found[Idx]) 1181f09cf34dSArchibald Elliott continue; 1182f09cf34dSArchibald Elliott 1183f09cf34dSArchibald Elliott // Does this component parse as valid for the target position? 1184f09cf34dSArchibald Elliott bool Valid = false; 1185f09cf34dSArchibald Elliott StringRef Comp = Components[Idx]; 1186f09cf34dSArchibald Elliott switch (Pos) { 1187f09cf34dSArchibald Elliott default: llvm_unreachable("unexpected component type!"); 1188f09cf34dSArchibald Elliott case 0: 1189f09cf34dSArchibald Elliott Arch = parseArch(Comp); 1190f09cf34dSArchibald Elliott Valid = Arch != UnknownArch; 1191f09cf34dSArchibald Elliott break; 1192f09cf34dSArchibald Elliott case 1: 1193f09cf34dSArchibald Elliott Vendor = parseVendor(Comp); 1194f09cf34dSArchibald Elliott Valid = Vendor != UnknownVendor; 1195f09cf34dSArchibald Elliott break; 1196f09cf34dSArchibald Elliott case 2: 1197f09cf34dSArchibald Elliott OS = parseOS(Comp); 1198586ecdf2SKazu Hirata IsCygwin = Comp.starts_with("cygwin"); 1199586ecdf2SKazu Hirata IsMinGW32 = Comp.starts_with("mingw"); 1200f09cf34dSArchibald Elliott Valid = OS != UnknownOS || IsCygwin || IsMinGW32; 1201f09cf34dSArchibald Elliott break; 1202f09cf34dSArchibald Elliott case 3: 1203f09cf34dSArchibald Elliott Environment = parseEnvironment(Comp); 1204f09cf34dSArchibald Elliott Valid = Environment != UnknownEnvironment; 1205f09cf34dSArchibald Elliott if (!Valid) { 1206f09cf34dSArchibald Elliott ObjectFormat = parseFormat(Comp); 1207f09cf34dSArchibald Elliott Valid = ObjectFormat != UnknownObjectFormat; 1208f09cf34dSArchibald Elliott } 1209f09cf34dSArchibald Elliott break; 1210f09cf34dSArchibald Elliott } 1211f09cf34dSArchibald Elliott if (!Valid) 1212f09cf34dSArchibald Elliott continue; // Nope, try the next component. 1213f09cf34dSArchibald Elliott 1214f09cf34dSArchibald Elliott // Move the component to the target position, pushing any non-fixed 1215f09cf34dSArchibald Elliott // components that are in the way to the right. This tends to give 1216f09cf34dSArchibald Elliott // good results in the common cases of a forgotten vendor component 1217f09cf34dSArchibald Elliott // or a wrongly positioned environment. 1218f09cf34dSArchibald Elliott if (Pos < Idx) { 1219f09cf34dSArchibald Elliott // Insert left, pushing the existing components to the right. For 1220f09cf34dSArchibald Elliott // example, a-b-i386 -> i386-a-b when moving i386 to the front. 1221f09cf34dSArchibald Elliott StringRef CurrentComponent(""); // The empty component. 1222f09cf34dSArchibald Elliott // Replace the component we are moving with an empty component. 1223f09cf34dSArchibald Elliott std::swap(CurrentComponent, Components[Idx]); 1224f09cf34dSArchibald Elliott // Insert the component being moved at Pos, displacing any existing 1225f09cf34dSArchibald Elliott // components to the right. 1226f09cf34dSArchibald Elliott for (unsigned i = Pos; !CurrentComponent.empty(); ++i) { 1227f09cf34dSArchibald Elliott // Skip over any fixed components. 1228f09cf34dSArchibald Elliott while (i < std::size(Found) && Found[i]) 1229f09cf34dSArchibald Elliott ++i; 1230f09cf34dSArchibald Elliott // Place the component at the new position, getting the component 1231f09cf34dSArchibald Elliott // that was at this position - it will be moved right. 1232f09cf34dSArchibald Elliott std::swap(CurrentComponent, Components[i]); 1233f09cf34dSArchibald Elliott } 1234f09cf34dSArchibald Elliott } else if (Pos > Idx) { 1235f09cf34dSArchibald Elliott // Push right by inserting empty components until the component at Idx 1236f09cf34dSArchibald Elliott // reaches the target position Pos. For example, pc-a -> -pc-a when 1237f09cf34dSArchibald Elliott // moving pc to the second position. 1238f09cf34dSArchibald Elliott do { 1239f09cf34dSArchibald Elliott // Insert one empty component at Idx. 1240f09cf34dSArchibald Elliott StringRef CurrentComponent(""); // The empty component. 1241f09cf34dSArchibald Elliott for (unsigned i = Idx; i < Components.size();) { 1242f09cf34dSArchibald Elliott // Place the component at the new position, getting the component 1243f09cf34dSArchibald Elliott // that was at this position - it will be moved right. 1244f09cf34dSArchibald Elliott std::swap(CurrentComponent, Components[i]); 1245f09cf34dSArchibald Elliott // If it was placed on top of an empty component then we are done. 1246f09cf34dSArchibald Elliott if (CurrentComponent.empty()) 1247f09cf34dSArchibald Elliott break; 1248f09cf34dSArchibald Elliott // Advance to the next component, skipping any fixed components. 1249f09cf34dSArchibald Elliott while (++i < std::size(Found) && Found[i]) 1250f09cf34dSArchibald Elliott ; 1251f09cf34dSArchibald Elliott } 1252f09cf34dSArchibald Elliott // The last component was pushed off the end - append it. 1253f09cf34dSArchibald Elliott if (!CurrentComponent.empty()) 1254f09cf34dSArchibald Elliott Components.push_back(CurrentComponent); 1255f09cf34dSArchibald Elliott 1256f09cf34dSArchibald Elliott // Advance Idx to the component's new position. 1257f09cf34dSArchibald Elliott while (++Idx < std::size(Found) && Found[Idx]) 1258f09cf34dSArchibald Elliott ; 1259f09cf34dSArchibald Elliott } while (Idx < Pos); // Add more until the final position is reached. 1260f09cf34dSArchibald Elliott } 1261f09cf34dSArchibald Elliott assert(Pos < Components.size() && Components[Pos] == Comp && 1262f09cf34dSArchibald Elliott "Component moved wrong!"); 1263f09cf34dSArchibald Elliott Found[Pos] = true; 1264f09cf34dSArchibald Elliott break; 1265f09cf34dSArchibald Elliott } 1266f09cf34dSArchibald Elliott } 1267f09cf34dSArchibald Elliott 12684b75fcf0SYunQiang Su // If "none" is in the middle component in a three-component triple, treat it 12694b75fcf0SYunQiang Su // as the OS (Components[2]) instead of the vendor (Components[1]). 12704b75fcf0SYunQiang Su if (Found[0] && !Found[1] && !Found[2] && Found[3] && 12714b75fcf0SYunQiang Su Components[1] == "none" && Components[2].empty()) 12724b75fcf0SYunQiang Su std::swap(Components[1], Components[2]); 12734b75fcf0SYunQiang Su 1274f09cf34dSArchibald Elliott // Replace empty components with "unknown" value. 1275f09cf34dSArchibald Elliott for (StringRef &C : Components) 1276f09cf34dSArchibald Elliott if (C.empty()) 1277f09cf34dSArchibald Elliott C = "unknown"; 1278f09cf34dSArchibald Elliott 1279f09cf34dSArchibald Elliott // Special case logic goes here. At this point Arch, Vendor and OS have the 1280f09cf34dSArchibald Elliott // correct values for the computed components. 1281f09cf34dSArchibald Elliott std::string NormalizedEnvironment; 1282586ecdf2SKazu Hirata if (Environment == Triple::Android && 1283586ecdf2SKazu Hirata Components[3].starts_with("androideabi")) { 1284f09cf34dSArchibald Elliott StringRef AndroidVersion = Components[3].drop_front(strlen("androideabi")); 1285f09cf34dSArchibald Elliott if (AndroidVersion.empty()) { 1286f09cf34dSArchibald Elliott Components[3] = "android"; 1287f09cf34dSArchibald Elliott } else { 1288f09cf34dSArchibald Elliott NormalizedEnvironment = Twine("android", AndroidVersion).str(); 1289f09cf34dSArchibald Elliott Components[3] = NormalizedEnvironment; 1290f09cf34dSArchibald Elliott } 1291f09cf34dSArchibald Elliott } 1292f09cf34dSArchibald Elliott 1293f09cf34dSArchibald Elliott // SUSE uses "gnueabi" to mean "gnueabihf" 1294f09cf34dSArchibald Elliott if (Vendor == Triple::SUSE && Environment == llvm::Triple::GNUEABI) 1295f09cf34dSArchibald Elliott Components[3] = "gnueabihf"; 1296f09cf34dSArchibald Elliott 1297f09cf34dSArchibald Elliott if (OS == Triple::Win32) { 1298f09cf34dSArchibald Elliott Components.resize(4); 1299f09cf34dSArchibald Elliott Components[2] = "windows"; 1300f09cf34dSArchibald Elliott if (Environment == UnknownEnvironment) { 1301f09cf34dSArchibald Elliott if (ObjectFormat == UnknownObjectFormat || ObjectFormat == Triple::COFF) 1302f09cf34dSArchibald Elliott Components[3] = "msvc"; 1303f09cf34dSArchibald Elliott else 1304f09cf34dSArchibald Elliott Components[3] = getObjectFormatTypeName(ObjectFormat); 1305f09cf34dSArchibald Elliott } 1306f09cf34dSArchibald Elliott } else if (IsMinGW32) { 1307f09cf34dSArchibald Elliott Components.resize(4); 1308f09cf34dSArchibald Elliott Components[2] = "windows"; 1309f09cf34dSArchibald Elliott Components[3] = "gnu"; 1310f09cf34dSArchibald Elliott } else if (IsCygwin) { 1311f09cf34dSArchibald Elliott Components.resize(4); 1312f09cf34dSArchibald Elliott Components[2] = "windows"; 1313f09cf34dSArchibald Elliott Components[3] = "cygnus"; 1314f09cf34dSArchibald Elliott } 1315f09cf34dSArchibald Elliott if (IsMinGW32 || IsCygwin || 1316f09cf34dSArchibald Elliott (OS == Triple::Win32 && Environment != UnknownEnvironment)) { 1317f09cf34dSArchibald Elliott if (ObjectFormat != UnknownObjectFormat && ObjectFormat != Triple::COFF) { 1318f09cf34dSArchibald Elliott Components.resize(5); 1319f09cf34dSArchibald Elliott Components[4] = getObjectFormatTypeName(ObjectFormat); 1320f09cf34dSArchibald Elliott } 1321f09cf34dSArchibald Elliott } 1322f09cf34dSArchibald Elliott 13236d890148SS. Bharadwaj Yadavalli // Normalize DXIL triple if it does not include DXIL version number. 13246d890148SS. Bharadwaj Yadavalli // Determine DXIL version number using the minor version number of Shader 13256d890148SS. Bharadwaj Yadavalli // Model version specified in target triple, if any. Prior to decoupling DXIL 13266d890148SS. Bharadwaj Yadavalli // version numbering from that of Shader Model DXIL version 1.Y corresponds to 13276d890148SS. Bharadwaj Yadavalli // SM 6.Y. E.g., dxilv1.Y-unknown-shadermodelX.Y-hull 13286d890148SS. Bharadwaj Yadavalli if (Components[0] == "dxil") { 13296d890148SS. Bharadwaj Yadavalli if (Components.size() > 4) { 13306d890148SS. Bharadwaj Yadavalli Components.resize(4); 13316d890148SS. Bharadwaj Yadavalli } 13326d890148SS. Bharadwaj Yadavalli // Add DXIL version only if shadermodel is specified in the triple 13336d890148SS. Bharadwaj Yadavalli if (OS == Triple::ShaderModel) { 13346d890148SS. Bharadwaj Yadavalli Components[0] = getDXILArchNameFromShaderModel(Components[2]); 13356d890148SS. Bharadwaj Yadavalli } 13366d890148SS. Bharadwaj Yadavalli } 1337ebef4406SShilei Tian 1338ebef4406SShilei Tian // Canonicalize the components if necessary. 1339ebef4406SShilei Tian switch (Form) { 1340ebef4406SShilei Tian case CanonicalForm::ANY: 1341ebef4406SShilei Tian break; 1342ebef4406SShilei Tian case CanonicalForm::THREE_IDENT: 1343ebef4406SShilei Tian case CanonicalForm::FOUR_IDENT: 1344ebef4406SShilei Tian case CanonicalForm::FIVE_IDENT: { 1345ebef4406SShilei Tian Components.resize(static_cast<unsigned>(Form), "unknown"); 1346ebef4406SShilei Tian break; 1347ebef4406SShilei Tian } 1348ebef4406SShilei Tian } 1349ebef4406SShilei Tian 1350f09cf34dSArchibald Elliott // Stick the corrected components back together to form the normalized string. 1351f09cf34dSArchibald Elliott return join(Components, "-"); 1352f09cf34dSArchibald Elliott } 1353f09cf34dSArchibald Elliott 1354f09cf34dSArchibald Elliott StringRef Triple::getArchName() const { 1355f09cf34dSArchibald Elliott return StringRef(Data).split('-').first; // Isolate first component 1356f09cf34dSArchibald Elliott } 1357f09cf34dSArchibald Elliott 1358f09cf34dSArchibald Elliott StringRef Triple::getVendorName() const { 1359f09cf34dSArchibald Elliott StringRef Tmp = StringRef(Data).split('-').second; // Strip first component 1360f09cf34dSArchibald Elliott return Tmp.split('-').first; // Isolate second component 1361f09cf34dSArchibald Elliott } 1362f09cf34dSArchibald Elliott 1363f09cf34dSArchibald Elliott StringRef Triple::getOSName() const { 1364f09cf34dSArchibald Elliott StringRef Tmp = StringRef(Data).split('-').second; // Strip first component 1365f09cf34dSArchibald Elliott Tmp = Tmp.split('-').second; // Strip second component 1366f09cf34dSArchibald Elliott return Tmp.split('-').first; // Isolate third component 1367f09cf34dSArchibald Elliott } 1368f09cf34dSArchibald Elliott 1369f09cf34dSArchibald Elliott StringRef Triple::getEnvironmentName() const { 1370f09cf34dSArchibald Elliott StringRef Tmp = StringRef(Data).split('-').second; // Strip first component 1371f09cf34dSArchibald Elliott Tmp = Tmp.split('-').second; // Strip second component 1372f09cf34dSArchibald Elliott return Tmp.split('-').second; // Strip third component 1373f09cf34dSArchibald Elliott } 1374f09cf34dSArchibald Elliott 1375f09cf34dSArchibald Elliott StringRef Triple::getOSAndEnvironmentName() const { 1376f09cf34dSArchibald Elliott StringRef Tmp = StringRef(Data).split('-').second; // Strip first component 1377f09cf34dSArchibald Elliott return Tmp.split('-').second; // Strip second component 1378f09cf34dSArchibald Elliott } 1379f09cf34dSArchibald Elliott 1380f09cf34dSArchibald Elliott static VersionTuple parseVersionFromName(StringRef Name) { 1381f09cf34dSArchibald Elliott VersionTuple Version; 1382f09cf34dSArchibald Elliott Version.tryParse(Name); 1383f09cf34dSArchibald Elliott return Version.withoutBuild(); 1384f09cf34dSArchibald Elliott } 1385f09cf34dSArchibald Elliott 1386f09cf34dSArchibald Elliott VersionTuple Triple::getEnvironmentVersion() const { 1387f6dbd4ccSZijunZhaoCCK return parseVersionFromName(getEnvironmentVersionString()); 1388f6dbd4ccSZijunZhaoCCK } 1389f6dbd4ccSZijunZhaoCCK 1390f6dbd4ccSZijunZhaoCCK StringRef Triple::getEnvironmentVersionString() const { 1391f09cf34dSArchibald Elliott StringRef EnvironmentName = getEnvironmentName(); 139234c4a0faSZijunZhaoCCK 139334c4a0faSZijunZhaoCCK // none is a valid environment type - it basically amounts to a freestanding 139434c4a0faSZijunZhaoCCK // environment. 139534c4a0faSZijunZhaoCCK if (EnvironmentName == "none") 139634c4a0faSZijunZhaoCCK return ""; 139734c4a0faSZijunZhaoCCK 1398f09cf34dSArchibald Elliott StringRef EnvironmentTypeName = getEnvironmentTypeName(getEnvironment()); 1399f5f2c313SKazu Hirata EnvironmentName.consume_front(EnvironmentTypeName); 140034c4a0faSZijunZhaoCCK 140134c4a0faSZijunZhaoCCK if (EnvironmentName.contains("-")) { 140234c4a0faSZijunZhaoCCK // -obj is the suffix 140334c4a0faSZijunZhaoCCK if (getObjectFormat() != Triple::UnknownObjectFormat) { 140434c4a0faSZijunZhaoCCK StringRef ObjectFormatTypeName = 140534c4a0faSZijunZhaoCCK getObjectFormatTypeName(getObjectFormat()); 140634c4a0faSZijunZhaoCCK const std::string tmp = (Twine("-") + ObjectFormatTypeName).str(); 140734c4a0faSZijunZhaoCCK EnvironmentName.consume_back(tmp); 140834c4a0faSZijunZhaoCCK } 140934c4a0faSZijunZhaoCCK } 1410f6dbd4ccSZijunZhaoCCK return EnvironmentName; 1411f09cf34dSArchibald Elliott } 1412f09cf34dSArchibald Elliott 1413f09cf34dSArchibald Elliott VersionTuple Triple::getOSVersion() const { 1414f09cf34dSArchibald Elliott StringRef OSName = getOSName(); 1415f09cf34dSArchibald Elliott // Assume that the OS portion of the triple starts with the canonical name. 1416f09cf34dSArchibald Elliott StringRef OSTypeName = getOSTypeName(getOS()); 1417586ecdf2SKazu Hirata if (OSName.starts_with(OSTypeName)) 1418f09cf34dSArchibald Elliott OSName = OSName.substr(OSTypeName.size()); 1419f09cf34dSArchibald Elliott else if (getOS() == MacOSX) 1420f09cf34dSArchibald Elliott OSName.consume_front("macos"); 14217d3466b5SCyndy Ishida else if (OSName.starts_with("visionos")) 14227d3466b5SCyndy Ishida OSName.consume_front("visionos"); 1423f09cf34dSArchibald Elliott 1424f09cf34dSArchibald Elliott return parseVersionFromName(OSName); 1425f09cf34dSArchibald Elliott } 1426f09cf34dSArchibald Elliott 1427f09cf34dSArchibald Elliott bool Triple::getMacOSXVersion(VersionTuple &Version) const { 1428f09cf34dSArchibald Elliott Version = getOSVersion(); 1429f09cf34dSArchibald Elliott 1430f09cf34dSArchibald Elliott switch (getOS()) { 1431f09cf34dSArchibald Elliott default: llvm_unreachable("unexpected OS for Darwin triple"); 1432f09cf34dSArchibald Elliott case Darwin: 1433f09cf34dSArchibald Elliott // Default to darwin8, i.e., MacOSX 10.4. 1434f09cf34dSArchibald Elliott if (Version.getMajor() == 0) 1435f09cf34dSArchibald Elliott Version = VersionTuple(8); 1436f09cf34dSArchibald Elliott // Darwin version numbers are skewed from OS X versions. 1437f09cf34dSArchibald Elliott if (Version.getMajor() < 4) { 1438f09cf34dSArchibald Elliott return false; 1439f09cf34dSArchibald Elliott } 1440f09cf34dSArchibald Elliott if (Version.getMajor() <= 19) { 1441f09cf34dSArchibald Elliott Version = VersionTuple(10, Version.getMajor() - 4); 1442f09cf34dSArchibald Elliott } else { 1443f09cf34dSArchibald Elliott // darwin20+ corresponds to macOS 11+. 1444f09cf34dSArchibald Elliott Version = VersionTuple(11 + Version.getMajor() - 20); 1445f09cf34dSArchibald Elliott } 1446f09cf34dSArchibald Elliott break; 1447f09cf34dSArchibald Elliott case MacOSX: 1448f09cf34dSArchibald Elliott // Default to 10.4. 1449f09cf34dSArchibald Elliott if (Version.getMajor() == 0) { 1450f09cf34dSArchibald Elliott Version = VersionTuple(10, 4); 1451f09cf34dSArchibald Elliott } else if (Version.getMajor() < 10) { 1452f09cf34dSArchibald Elliott return false; 1453f09cf34dSArchibald Elliott } 1454f09cf34dSArchibald Elliott break; 1455f09cf34dSArchibald Elliott case IOS: 1456f09cf34dSArchibald Elliott case TvOS: 1457f09cf34dSArchibald Elliott case WatchOS: 1458f09cf34dSArchibald Elliott // Ignore the version from the triple. This is only handled because the 1459f09cf34dSArchibald Elliott // the clang driver combines OS X and IOS support into a common Darwin 1460f09cf34dSArchibald Elliott // toolchain that wants to know the OS X version number even when targeting 1461f09cf34dSArchibald Elliott // IOS. 1462f09cf34dSArchibald Elliott Version = VersionTuple(10, 4); 1463f09cf34dSArchibald Elliott break; 14647d3466b5SCyndy Ishida case XROS: 14657d3466b5SCyndy Ishida llvm_unreachable("OSX version isn't relevant for xrOS"); 1466f09cf34dSArchibald Elliott case DriverKit: 1467f09cf34dSArchibald Elliott llvm_unreachable("OSX version isn't relevant for DriverKit"); 1468f09cf34dSArchibald Elliott } 1469f09cf34dSArchibald Elliott return true; 1470f09cf34dSArchibald Elliott } 1471f09cf34dSArchibald Elliott 1472f09cf34dSArchibald Elliott VersionTuple Triple::getiOSVersion() const { 1473f09cf34dSArchibald Elliott switch (getOS()) { 1474f09cf34dSArchibald Elliott default: llvm_unreachable("unexpected OS for Darwin triple"); 1475f09cf34dSArchibald Elliott case Darwin: 1476f09cf34dSArchibald Elliott case MacOSX: 1477f09cf34dSArchibald Elliott // Ignore the version from the triple. This is only handled because the 1478f09cf34dSArchibald Elliott // the clang driver combines OS X and IOS support into a common Darwin 1479f09cf34dSArchibald Elliott // toolchain that wants to know the iOS version number even when targeting 1480f09cf34dSArchibald Elliott // OS X. 1481f09cf34dSArchibald Elliott return VersionTuple(5); 1482f09cf34dSArchibald Elliott case IOS: 1483f09cf34dSArchibald Elliott case TvOS: { 1484f09cf34dSArchibald Elliott VersionTuple Version = getOSVersion(); 1485f09cf34dSArchibald Elliott // Default to 5.0 (or 7.0 for arm64). 1486f09cf34dSArchibald Elliott if (Version.getMajor() == 0) 1487f09cf34dSArchibald Elliott return (getArch() == aarch64) ? VersionTuple(7) : VersionTuple(5); 1488f09cf34dSArchibald Elliott return Version; 1489f09cf34dSArchibald Elliott } 14907d3466b5SCyndy Ishida case XROS: { 14917d3466b5SCyndy Ishida // xrOS 1 is aligned with iOS 17. 14927d3466b5SCyndy Ishida VersionTuple Version = getOSVersion(); 14937d3466b5SCyndy Ishida return Version.withMajorReplaced(Version.getMajor() + 16); 14947d3466b5SCyndy Ishida } 1495f09cf34dSArchibald Elliott case WatchOS: 1496f09cf34dSArchibald Elliott llvm_unreachable("conflicting triple info"); 1497f09cf34dSArchibald Elliott case DriverKit: 1498f09cf34dSArchibald Elliott llvm_unreachable("DriverKit doesn't have an iOS version"); 1499f09cf34dSArchibald Elliott } 1500f09cf34dSArchibald Elliott } 1501f09cf34dSArchibald Elliott 1502f09cf34dSArchibald Elliott VersionTuple Triple::getWatchOSVersion() const { 1503f09cf34dSArchibald Elliott switch (getOS()) { 1504f09cf34dSArchibald Elliott default: llvm_unreachable("unexpected OS for Darwin triple"); 1505f09cf34dSArchibald Elliott case Darwin: 1506f09cf34dSArchibald Elliott case MacOSX: 1507f09cf34dSArchibald Elliott // Ignore the version from the triple. This is only handled because the 1508f09cf34dSArchibald Elliott // the clang driver combines OS X and IOS support into a common Darwin 1509f09cf34dSArchibald Elliott // toolchain that wants to know the iOS version number even when targeting 1510f09cf34dSArchibald Elliott // OS X. 1511f09cf34dSArchibald Elliott return VersionTuple(2); 1512f09cf34dSArchibald Elliott case WatchOS: { 1513f09cf34dSArchibald Elliott VersionTuple Version = getOSVersion(); 1514f09cf34dSArchibald Elliott if (Version.getMajor() == 0) 1515f09cf34dSArchibald Elliott return VersionTuple(2); 1516f09cf34dSArchibald Elliott return Version; 1517f09cf34dSArchibald Elliott } 1518f09cf34dSArchibald Elliott case IOS: 1519f09cf34dSArchibald Elliott llvm_unreachable("conflicting triple info"); 15207d3466b5SCyndy Ishida case XROS: 15217d3466b5SCyndy Ishida llvm_unreachable("watchOS version isn't relevant for xrOS"); 1522f09cf34dSArchibald Elliott case DriverKit: 1523f09cf34dSArchibald Elliott llvm_unreachable("DriverKit doesn't have a WatchOS version"); 1524f09cf34dSArchibald Elliott } 1525f09cf34dSArchibald Elliott } 1526f09cf34dSArchibald Elliott 1527f09cf34dSArchibald Elliott VersionTuple Triple::getDriverKitVersion() const { 1528f09cf34dSArchibald Elliott switch (getOS()) { 1529f09cf34dSArchibald Elliott default: 1530f09cf34dSArchibald Elliott llvm_unreachable("unexpected OS for Darwin triple"); 1531f09cf34dSArchibald Elliott case DriverKit: 1532f09cf34dSArchibald Elliott VersionTuple Version = getOSVersion(); 1533f09cf34dSArchibald Elliott if (Version.getMajor() == 0) 1534f09cf34dSArchibald Elliott return Version.withMajorReplaced(19); 1535f09cf34dSArchibald Elliott return Version; 1536f09cf34dSArchibald Elliott } 1537f09cf34dSArchibald Elliott } 1538f09cf34dSArchibald Elliott 1539c21f48e5SNatalie Chouinard VersionTuple Triple::getVulkanVersion() const { 1540c21f48e5SNatalie Chouinard if (getArch() != spirv || getOS() != Vulkan) 1541c21f48e5SNatalie Chouinard llvm_unreachable("invalid Vulkan SPIR-V triple"); 1542c21f48e5SNatalie Chouinard 1543c21f48e5SNatalie Chouinard VersionTuple VulkanVersion = getOSVersion(); 1544c21f48e5SNatalie Chouinard SubArchType SpirvVersion = getSubArch(); 1545c21f48e5SNatalie Chouinard 1546c21f48e5SNatalie Chouinard llvm::DenseMap<VersionTuple, SubArchType> ValidVersionMap = { 1547c21f48e5SNatalie Chouinard // Vulkan 1.2 -> SPIR-V 1.5. 1548c21f48e5SNatalie Chouinard {VersionTuple(1, 2), SPIRVSubArch_v15}, 1549c21f48e5SNatalie Chouinard // Vulkan 1.3 -> SPIR-V 1.6. 1550c21f48e5SNatalie Chouinard {VersionTuple(1, 3), SPIRVSubArch_v16}}; 1551c21f48e5SNatalie Chouinard 1552c21f48e5SNatalie Chouinard // If Vulkan version is unset, default to 1.2. 1553c21f48e5SNatalie Chouinard if (VulkanVersion == VersionTuple(0)) 1554c21f48e5SNatalie Chouinard VulkanVersion = VersionTuple(1, 2); 1555c21f48e5SNatalie Chouinard 1556c21f48e5SNatalie Chouinard if (ValidVersionMap.contains(VulkanVersion) && 1557c21f48e5SNatalie Chouinard (ValidVersionMap.lookup(VulkanVersion) == SpirvVersion || 1558c21f48e5SNatalie Chouinard SpirvVersion == NoSubArch)) 1559c21f48e5SNatalie Chouinard return VulkanVersion; 1560c21f48e5SNatalie Chouinard 1561c21f48e5SNatalie Chouinard return VersionTuple(0); 1562c21f48e5SNatalie Chouinard } 1563c21f48e5SNatalie Chouinard 1564665af09aSXiang Li VersionTuple Triple::getDXILVersion() const { 1565665af09aSXiang Li if (getArch() != dxil || getOS() != ShaderModel) 1566665af09aSXiang Li llvm_unreachable("invalid DXIL triple"); 1567665af09aSXiang Li StringRef Arch = getArchName(); 1568531a0b67SXiang Li if (getSubArch() == NoSubArch) 1569531a0b67SXiang Li Arch = getDXILArchNameFromShaderModel(getOSName()); 1570665af09aSXiang Li Arch.consume_front("dxilv"); 1571665af09aSXiang Li VersionTuple DXILVersion = parseVersionFromName(Arch); 1572665af09aSXiang Li // FIXME: validate DXIL version against Shader Model version. 1573665af09aSXiang Li // Tracked by https://github.com/llvm/llvm-project/issues/91388 1574665af09aSXiang Li return DXILVersion; 1575665af09aSXiang Li } 1576665af09aSXiang Li 1577f09cf34dSArchibald Elliott void Triple::setTriple(const Twine &Str) { 1578f09cf34dSArchibald Elliott *this = Triple(Str); 1579f09cf34dSArchibald Elliott } 1580f09cf34dSArchibald Elliott 1581f09cf34dSArchibald Elliott void Triple::setArch(ArchType Kind, SubArchType SubArch) { 1582f09cf34dSArchibald Elliott setArchName(getArchName(Kind, SubArch)); 1583f09cf34dSArchibald Elliott } 1584f09cf34dSArchibald Elliott 1585f09cf34dSArchibald Elliott void Triple::setVendor(VendorType Kind) { 1586f09cf34dSArchibald Elliott setVendorName(getVendorTypeName(Kind)); 1587f09cf34dSArchibald Elliott } 1588f09cf34dSArchibald Elliott 1589f09cf34dSArchibald Elliott void Triple::setOS(OSType Kind) { 1590f09cf34dSArchibald Elliott setOSName(getOSTypeName(Kind)); 1591f09cf34dSArchibald Elliott } 1592f09cf34dSArchibald Elliott 1593f09cf34dSArchibald Elliott void Triple::setEnvironment(EnvironmentType Kind) { 1594f09cf34dSArchibald Elliott if (ObjectFormat == getDefaultFormat(*this)) 1595f09cf34dSArchibald Elliott return setEnvironmentName(getEnvironmentTypeName(Kind)); 1596f09cf34dSArchibald Elliott 1597f09cf34dSArchibald Elliott setEnvironmentName((getEnvironmentTypeName(Kind) + Twine("-") + 1598f09cf34dSArchibald Elliott getObjectFormatTypeName(ObjectFormat)).str()); 1599f09cf34dSArchibald Elliott } 1600f09cf34dSArchibald Elliott 1601f09cf34dSArchibald Elliott void Triple::setObjectFormat(ObjectFormatType Kind) { 1602f09cf34dSArchibald Elliott if (Environment == UnknownEnvironment) 1603f09cf34dSArchibald Elliott return setEnvironmentName(getObjectFormatTypeName(Kind)); 1604f09cf34dSArchibald Elliott 1605f09cf34dSArchibald Elliott setEnvironmentName((getEnvironmentTypeName(Environment) + Twine("-") + 1606f09cf34dSArchibald Elliott getObjectFormatTypeName(Kind)).str()); 1607f09cf34dSArchibald Elliott } 1608f09cf34dSArchibald Elliott 1609f09cf34dSArchibald Elliott void Triple::setArchName(StringRef Str) { 1610f09cf34dSArchibald Elliott // Work around a miscompilation bug for Twines in gcc 4.0.3. 1611f09cf34dSArchibald Elliott SmallString<64> Triple; 1612f09cf34dSArchibald Elliott Triple += Str; 1613f09cf34dSArchibald Elliott Triple += "-"; 1614f09cf34dSArchibald Elliott Triple += getVendorName(); 1615f09cf34dSArchibald Elliott Triple += "-"; 1616f09cf34dSArchibald Elliott Triple += getOSAndEnvironmentName(); 1617f09cf34dSArchibald Elliott setTriple(Triple); 1618f09cf34dSArchibald Elliott } 1619f09cf34dSArchibald Elliott 1620f09cf34dSArchibald Elliott void Triple::setVendorName(StringRef Str) { 1621f09cf34dSArchibald Elliott setTriple(getArchName() + "-" + Str + "-" + getOSAndEnvironmentName()); 1622f09cf34dSArchibald Elliott } 1623f09cf34dSArchibald Elliott 1624f09cf34dSArchibald Elliott void Triple::setOSName(StringRef Str) { 1625f09cf34dSArchibald Elliott if (hasEnvironment()) 1626f09cf34dSArchibald Elliott setTriple(getArchName() + "-" + getVendorName() + "-" + Str + 1627f09cf34dSArchibald Elliott "-" + getEnvironmentName()); 1628f09cf34dSArchibald Elliott else 1629f09cf34dSArchibald Elliott setTriple(getArchName() + "-" + getVendorName() + "-" + Str); 1630f09cf34dSArchibald Elliott } 1631f09cf34dSArchibald Elliott 1632f09cf34dSArchibald Elliott void Triple::setEnvironmentName(StringRef Str) { 1633f09cf34dSArchibald Elliott setTriple(getArchName() + "-" + getVendorName() + "-" + getOSName() + 1634f09cf34dSArchibald Elliott "-" + Str); 1635f09cf34dSArchibald Elliott } 1636f09cf34dSArchibald Elliott 1637f09cf34dSArchibald Elliott void Triple::setOSAndEnvironmentName(StringRef Str) { 1638f09cf34dSArchibald Elliott setTriple(getArchName() + "-" + getVendorName() + "-" + Str); 1639f09cf34dSArchibald Elliott } 1640f09cf34dSArchibald Elliott 164180c25dacSLang Hames unsigned Triple::getArchPointerBitWidth(llvm::Triple::ArchType Arch) { 1642f09cf34dSArchibald Elliott switch (Arch) { 1643f09cf34dSArchibald Elliott case llvm::Triple::UnknownArch: 1644f09cf34dSArchibald Elliott return 0; 1645f09cf34dSArchibald Elliott 1646f09cf34dSArchibald Elliott case llvm::Triple::avr: 1647f09cf34dSArchibald Elliott case llvm::Triple::msp430: 1648f09cf34dSArchibald Elliott return 16; 1649f09cf34dSArchibald Elliott 1650f09cf34dSArchibald Elliott case llvm::Triple::aarch64_32: 1651f09cf34dSArchibald Elliott case llvm::Triple::amdil: 1652f09cf34dSArchibald Elliott case llvm::Triple::arc: 1653f09cf34dSArchibald Elliott case llvm::Triple::arm: 1654f09cf34dSArchibald Elliott case llvm::Triple::armeb: 1655f09cf34dSArchibald Elliott case llvm::Triple::csky: 1656f09cf34dSArchibald Elliott case llvm::Triple::dxil: 1657f09cf34dSArchibald Elliott case llvm::Triple::hexagon: 1658f09cf34dSArchibald Elliott case llvm::Triple::hsail: 1659f09cf34dSArchibald Elliott case llvm::Triple::kalimba: 1660f09cf34dSArchibald Elliott case llvm::Triple::lanai: 1661f09cf34dSArchibald Elliott case llvm::Triple::loongarch32: 1662f09cf34dSArchibald Elliott case llvm::Triple::m68k: 1663f09cf34dSArchibald Elliott case llvm::Triple::mips: 1664f09cf34dSArchibald Elliott case llvm::Triple::mipsel: 1665f09cf34dSArchibald Elliott case llvm::Triple::nvptx: 1666f09cf34dSArchibald Elliott case llvm::Triple::ppc: 1667f09cf34dSArchibald Elliott case llvm::Triple::ppcle: 1668f09cf34dSArchibald Elliott case llvm::Triple::r600: 1669f09cf34dSArchibald Elliott case llvm::Triple::renderscript32: 1670f09cf34dSArchibald Elliott case llvm::Triple::riscv32: 1671f09cf34dSArchibald Elliott case llvm::Triple::shave: 1672f09cf34dSArchibald Elliott case llvm::Triple::sparc: 1673f09cf34dSArchibald Elliott case llvm::Triple::sparcel: 1674f09cf34dSArchibald Elliott case llvm::Triple::spir: 1675f09cf34dSArchibald Elliott case llvm::Triple::spirv32: 1676f09cf34dSArchibald Elliott case llvm::Triple::tce: 1677f09cf34dSArchibald Elliott case llvm::Triple::tcele: 1678f09cf34dSArchibald Elliott case llvm::Triple::thumb: 1679f09cf34dSArchibald Elliott case llvm::Triple::thumbeb: 1680f09cf34dSArchibald Elliott case llvm::Triple::wasm32: 1681f09cf34dSArchibald Elliott case llvm::Triple::x86: 1682f09cf34dSArchibald Elliott case llvm::Triple::xcore: 16838c618e8fSAndrei Safronov case llvm::Triple::xtensa: 1684f09cf34dSArchibald Elliott return 32; 1685f09cf34dSArchibald Elliott 1686f09cf34dSArchibald Elliott case llvm::Triple::aarch64: 1687f09cf34dSArchibald Elliott case llvm::Triple::aarch64_be: 1688f09cf34dSArchibald Elliott case llvm::Triple::amdgcn: 1689f09cf34dSArchibald Elliott case llvm::Triple::amdil64: 1690f09cf34dSArchibald Elliott case llvm::Triple::bpfeb: 1691f09cf34dSArchibald Elliott case llvm::Triple::bpfel: 1692f09cf34dSArchibald Elliott case llvm::Triple::hsail64: 1693f09cf34dSArchibald Elliott case llvm::Triple::loongarch64: 1694f09cf34dSArchibald Elliott case llvm::Triple::mips64: 1695f09cf34dSArchibald Elliott case llvm::Triple::mips64el: 1696f09cf34dSArchibald Elliott case llvm::Triple::nvptx64: 1697f09cf34dSArchibald Elliott case llvm::Triple::ppc64: 1698f09cf34dSArchibald Elliott case llvm::Triple::ppc64le: 1699f09cf34dSArchibald Elliott case llvm::Triple::renderscript64: 1700f09cf34dSArchibald Elliott case llvm::Triple::riscv64: 1701f09cf34dSArchibald Elliott case llvm::Triple::sparcv9: 170253b6a169SNathan Gauër case llvm::Triple::spirv: 1703f09cf34dSArchibald Elliott case llvm::Triple::spir64: 1704f09cf34dSArchibald Elliott case llvm::Triple::spirv64: 1705f09cf34dSArchibald Elliott case llvm::Triple::systemz: 1706f09cf34dSArchibald Elliott case llvm::Triple::ve: 1707f09cf34dSArchibald Elliott case llvm::Triple::wasm64: 1708f09cf34dSArchibald Elliott case llvm::Triple::x86_64: 1709f09cf34dSArchibald Elliott return 64; 1710f09cf34dSArchibald Elliott } 1711f09cf34dSArchibald Elliott llvm_unreachable("Invalid architecture value"); 1712f09cf34dSArchibald Elliott } 1713f09cf34dSArchibald Elliott 1714*16e9601eSssijaric-nv unsigned Triple::getTrampolineSize() const { 1715*16e9601eSssijaric-nv switch (getArch()) { 1716*16e9601eSssijaric-nv default: 1717*16e9601eSssijaric-nv break; 1718*16e9601eSssijaric-nv case Triple::ppc: 1719*16e9601eSssijaric-nv case Triple::ppcle: 1720*16e9601eSssijaric-nv if (isOSLinux()) 1721*16e9601eSssijaric-nv return 40; 1722*16e9601eSssijaric-nv break; 1723*16e9601eSssijaric-nv case Triple::ppc64: 1724*16e9601eSssijaric-nv case Triple::ppc64le: 1725*16e9601eSssijaric-nv if (isOSLinux()) 1726*16e9601eSssijaric-nv return 48; 1727*16e9601eSssijaric-nv break; 1728*16e9601eSssijaric-nv case Triple::aarch64: 1729*16e9601eSssijaric-nv return 36; 1730*16e9601eSssijaric-nv } 1731*16e9601eSssijaric-nv return 32; 1732*16e9601eSssijaric-nv } 1733*16e9601eSssijaric-nv 1734f09cf34dSArchibald Elliott bool Triple::isArch64Bit() const { 1735f09cf34dSArchibald Elliott return getArchPointerBitWidth(getArch()) == 64; 1736f09cf34dSArchibald Elliott } 1737f09cf34dSArchibald Elliott 1738f09cf34dSArchibald Elliott bool Triple::isArch32Bit() const { 1739f09cf34dSArchibald Elliott return getArchPointerBitWidth(getArch()) == 32; 1740f09cf34dSArchibald Elliott } 1741f09cf34dSArchibald Elliott 1742f09cf34dSArchibald Elliott bool Triple::isArch16Bit() const { 1743f09cf34dSArchibald Elliott return getArchPointerBitWidth(getArch()) == 16; 1744f09cf34dSArchibald Elliott } 1745f09cf34dSArchibald Elliott 1746f09cf34dSArchibald Elliott Triple Triple::get32BitArchVariant() const { 1747f09cf34dSArchibald Elliott Triple T(*this); 1748f09cf34dSArchibald Elliott switch (getArch()) { 1749f09cf34dSArchibald Elliott case Triple::UnknownArch: 1750f09cf34dSArchibald Elliott case Triple::amdgcn: 1751f09cf34dSArchibald Elliott case Triple::avr: 1752f09cf34dSArchibald Elliott case Triple::bpfeb: 1753f09cf34dSArchibald Elliott case Triple::bpfel: 1754f09cf34dSArchibald Elliott case Triple::msp430: 1755f09cf34dSArchibald Elliott case Triple::systemz: 1756f09cf34dSArchibald Elliott case Triple::ve: 1757f09cf34dSArchibald Elliott T.setArch(UnknownArch); 1758f09cf34dSArchibald Elliott break; 1759f09cf34dSArchibald Elliott 1760f09cf34dSArchibald Elliott case Triple::aarch64_32: 1761f09cf34dSArchibald Elliott case Triple::amdil: 1762f09cf34dSArchibald Elliott case Triple::arc: 1763f09cf34dSArchibald Elliott case Triple::arm: 1764f09cf34dSArchibald Elliott case Triple::armeb: 1765f09cf34dSArchibald Elliott case Triple::csky: 1766f09cf34dSArchibald Elliott case Triple::dxil: 1767f09cf34dSArchibald Elliott case Triple::hexagon: 1768f09cf34dSArchibald Elliott case Triple::hsail: 1769f09cf34dSArchibald Elliott case Triple::kalimba: 1770f09cf34dSArchibald Elliott case Triple::lanai: 1771f09cf34dSArchibald Elliott case Triple::loongarch32: 1772f09cf34dSArchibald Elliott case Triple::m68k: 1773f09cf34dSArchibald Elliott case Triple::mips: 1774f09cf34dSArchibald Elliott case Triple::mipsel: 1775f09cf34dSArchibald Elliott case Triple::nvptx: 1776f09cf34dSArchibald Elliott case Triple::ppc: 1777f09cf34dSArchibald Elliott case Triple::ppcle: 1778f09cf34dSArchibald Elliott case Triple::r600: 1779f09cf34dSArchibald Elliott case Triple::renderscript32: 1780f09cf34dSArchibald Elliott case Triple::riscv32: 1781f09cf34dSArchibald Elliott case Triple::shave: 1782f09cf34dSArchibald Elliott case Triple::sparc: 1783f09cf34dSArchibald Elliott case Triple::sparcel: 1784f09cf34dSArchibald Elliott case Triple::spir: 1785f09cf34dSArchibald Elliott case Triple::spirv32: 1786f09cf34dSArchibald Elliott case Triple::tce: 1787f09cf34dSArchibald Elliott case Triple::tcele: 1788f09cf34dSArchibald Elliott case Triple::thumb: 1789f09cf34dSArchibald Elliott case Triple::thumbeb: 1790f09cf34dSArchibald Elliott case Triple::wasm32: 1791f09cf34dSArchibald Elliott case Triple::x86: 1792f09cf34dSArchibald Elliott case Triple::xcore: 17938c618e8fSAndrei Safronov case Triple::xtensa: 1794f09cf34dSArchibald Elliott // Already 32-bit. 1795f09cf34dSArchibald Elliott break; 1796f09cf34dSArchibald Elliott 1797f09cf34dSArchibald Elliott case Triple::aarch64: T.setArch(Triple::arm); break; 1798f09cf34dSArchibald Elliott case Triple::aarch64_be: T.setArch(Triple::armeb); break; 1799f09cf34dSArchibald Elliott case Triple::amdil64: T.setArch(Triple::amdil); break; 1800f09cf34dSArchibald Elliott case Triple::hsail64: T.setArch(Triple::hsail); break; 1801f09cf34dSArchibald Elliott case Triple::loongarch64: T.setArch(Triple::loongarch32); break; 1802f09cf34dSArchibald Elliott case Triple::mips64: 1803f09cf34dSArchibald Elliott T.setArch(Triple::mips, getSubArch()); 1804f09cf34dSArchibald Elliott break; 1805f09cf34dSArchibald Elliott case Triple::mips64el: 1806f09cf34dSArchibald Elliott T.setArch(Triple::mipsel, getSubArch()); 1807f09cf34dSArchibald Elliott break; 1808f09cf34dSArchibald Elliott case Triple::nvptx64: T.setArch(Triple::nvptx); break; 1809f09cf34dSArchibald Elliott case Triple::ppc64: T.setArch(Triple::ppc); break; 1810f09cf34dSArchibald Elliott case Triple::ppc64le: T.setArch(Triple::ppcle); break; 1811f09cf34dSArchibald Elliott case Triple::renderscript64: T.setArch(Triple::renderscript32); break; 1812f09cf34dSArchibald Elliott case Triple::riscv64: T.setArch(Triple::riscv32); break; 1813f09cf34dSArchibald Elliott case Triple::sparcv9: T.setArch(Triple::sparc); break; 1814f09cf34dSArchibald Elliott case Triple::spir64: T.setArch(Triple::spir); break; 181553b6a169SNathan Gauër case Triple::spirv: 1816f09cf34dSArchibald Elliott case Triple::spirv64: 1817f09cf34dSArchibald Elliott T.setArch(Triple::spirv32, getSubArch()); 1818f09cf34dSArchibald Elliott break; 1819f09cf34dSArchibald Elliott case Triple::wasm64: T.setArch(Triple::wasm32); break; 1820f09cf34dSArchibald Elliott case Triple::x86_64: T.setArch(Triple::x86); break; 1821f09cf34dSArchibald Elliott } 1822f09cf34dSArchibald Elliott return T; 1823f09cf34dSArchibald Elliott } 1824f09cf34dSArchibald Elliott 1825f09cf34dSArchibald Elliott Triple Triple::get64BitArchVariant() const { 1826f09cf34dSArchibald Elliott Triple T(*this); 1827f09cf34dSArchibald Elliott switch (getArch()) { 1828f09cf34dSArchibald Elliott case Triple::UnknownArch: 1829f09cf34dSArchibald Elliott case Triple::arc: 1830f09cf34dSArchibald Elliott case Triple::avr: 1831f09cf34dSArchibald Elliott case Triple::csky: 1832f09cf34dSArchibald Elliott case Triple::dxil: 1833f09cf34dSArchibald Elliott case Triple::hexagon: 1834f09cf34dSArchibald Elliott case Triple::kalimba: 1835f09cf34dSArchibald Elliott case Triple::lanai: 1836f09cf34dSArchibald Elliott case Triple::m68k: 1837f09cf34dSArchibald Elliott case Triple::msp430: 1838f09cf34dSArchibald Elliott case Triple::r600: 1839f09cf34dSArchibald Elliott case Triple::shave: 1840f09cf34dSArchibald Elliott case Triple::sparcel: 1841f09cf34dSArchibald Elliott case Triple::tce: 1842f09cf34dSArchibald Elliott case Triple::tcele: 1843f09cf34dSArchibald Elliott case Triple::xcore: 18448c618e8fSAndrei Safronov case Triple::xtensa: 1845f09cf34dSArchibald Elliott T.setArch(UnknownArch); 1846f09cf34dSArchibald Elliott break; 1847f09cf34dSArchibald Elliott 1848f09cf34dSArchibald Elliott case Triple::aarch64: 1849f09cf34dSArchibald Elliott case Triple::aarch64_be: 1850f09cf34dSArchibald Elliott case Triple::amdgcn: 1851f09cf34dSArchibald Elliott case Triple::amdil64: 1852f09cf34dSArchibald Elliott case Triple::bpfeb: 1853f09cf34dSArchibald Elliott case Triple::bpfel: 1854f09cf34dSArchibald Elliott case Triple::hsail64: 1855f09cf34dSArchibald Elliott case Triple::loongarch64: 1856f09cf34dSArchibald Elliott case Triple::mips64: 1857f09cf34dSArchibald Elliott case Triple::mips64el: 1858f09cf34dSArchibald Elliott case Triple::nvptx64: 1859f09cf34dSArchibald Elliott case Triple::ppc64: 1860f09cf34dSArchibald Elliott case Triple::ppc64le: 1861f09cf34dSArchibald Elliott case Triple::renderscript64: 1862f09cf34dSArchibald Elliott case Triple::riscv64: 1863f09cf34dSArchibald Elliott case Triple::sparcv9: 1864f09cf34dSArchibald Elliott case Triple::spir64: 1865f09cf34dSArchibald Elliott case Triple::spirv64: 1866f09cf34dSArchibald Elliott case Triple::systemz: 1867f09cf34dSArchibald Elliott case Triple::ve: 1868f09cf34dSArchibald Elliott case Triple::wasm64: 1869f09cf34dSArchibald Elliott case Triple::x86_64: 1870f09cf34dSArchibald Elliott // Already 64-bit. 1871f09cf34dSArchibald Elliott break; 1872f09cf34dSArchibald Elliott 1873f09cf34dSArchibald Elliott case Triple::aarch64_32: T.setArch(Triple::aarch64); break; 1874f09cf34dSArchibald Elliott case Triple::amdil: T.setArch(Triple::amdil64); break; 1875f09cf34dSArchibald Elliott case Triple::arm: T.setArch(Triple::aarch64); break; 1876f09cf34dSArchibald Elliott case Triple::armeb: T.setArch(Triple::aarch64_be); break; 1877f09cf34dSArchibald Elliott case Triple::hsail: T.setArch(Triple::hsail64); break; 1878f09cf34dSArchibald Elliott case Triple::loongarch32: T.setArch(Triple::loongarch64); break; 1879f09cf34dSArchibald Elliott case Triple::mips: 1880f09cf34dSArchibald Elliott T.setArch(Triple::mips64, getSubArch()); 1881f09cf34dSArchibald Elliott break; 1882f09cf34dSArchibald Elliott case Triple::mipsel: 1883f09cf34dSArchibald Elliott T.setArch(Triple::mips64el, getSubArch()); 1884f09cf34dSArchibald Elliott break; 1885f09cf34dSArchibald Elliott case Triple::nvptx: T.setArch(Triple::nvptx64); break; 1886f09cf34dSArchibald Elliott case Triple::ppc: T.setArch(Triple::ppc64); break; 1887f09cf34dSArchibald Elliott case Triple::ppcle: T.setArch(Triple::ppc64le); break; 1888f09cf34dSArchibald Elliott case Triple::renderscript32: T.setArch(Triple::renderscript64); break; 1889f09cf34dSArchibald Elliott case Triple::riscv32: T.setArch(Triple::riscv64); break; 1890f09cf34dSArchibald Elliott case Triple::sparc: T.setArch(Triple::sparcv9); break; 1891f09cf34dSArchibald Elliott case Triple::spir: T.setArch(Triple::spir64); break; 189253b6a169SNathan Gauër case Triple::spirv: 1893f09cf34dSArchibald Elliott case Triple::spirv32: 1894f09cf34dSArchibald Elliott T.setArch(Triple::spirv64, getSubArch()); 1895f09cf34dSArchibald Elliott break; 1896f09cf34dSArchibald Elliott case Triple::thumb: T.setArch(Triple::aarch64); break; 1897f09cf34dSArchibald Elliott case Triple::thumbeb: T.setArch(Triple::aarch64_be); break; 1898f09cf34dSArchibald Elliott case Triple::wasm32: T.setArch(Triple::wasm64); break; 1899f09cf34dSArchibald Elliott case Triple::x86: T.setArch(Triple::x86_64); break; 1900f09cf34dSArchibald Elliott } 1901f09cf34dSArchibald Elliott return T; 1902f09cf34dSArchibald Elliott } 1903f09cf34dSArchibald Elliott 1904f09cf34dSArchibald Elliott Triple Triple::getBigEndianArchVariant() const { 1905f09cf34dSArchibald Elliott Triple T(*this); 1906f09cf34dSArchibald Elliott // Already big endian. 1907f09cf34dSArchibald Elliott if (!isLittleEndian()) 1908f09cf34dSArchibald Elliott return T; 1909f09cf34dSArchibald Elliott switch (getArch()) { 1910f09cf34dSArchibald Elliott case Triple::UnknownArch: 1911f09cf34dSArchibald Elliott case Triple::amdgcn: 1912f09cf34dSArchibald Elliott case Triple::amdil64: 1913f09cf34dSArchibald Elliott case Triple::amdil: 1914f09cf34dSArchibald Elliott case Triple::avr: 1915f09cf34dSArchibald Elliott case Triple::dxil: 1916f09cf34dSArchibald Elliott case Triple::hexagon: 1917f09cf34dSArchibald Elliott case Triple::hsail64: 1918f09cf34dSArchibald Elliott case Triple::hsail: 1919f09cf34dSArchibald Elliott case Triple::kalimba: 1920f09cf34dSArchibald Elliott case Triple::loongarch32: 1921f09cf34dSArchibald Elliott case Triple::loongarch64: 1922f09cf34dSArchibald Elliott case Triple::msp430: 1923f09cf34dSArchibald Elliott case Triple::nvptx64: 1924f09cf34dSArchibald Elliott case Triple::nvptx: 1925f09cf34dSArchibald Elliott case Triple::r600: 1926f09cf34dSArchibald Elliott case Triple::renderscript32: 1927f09cf34dSArchibald Elliott case Triple::renderscript64: 1928f09cf34dSArchibald Elliott case Triple::riscv32: 1929f09cf34dSArchibald Elliott case Triple::riscv64: 1930f09cf34dSArchibald Elliott case Triple::shave: 1931f09cf34dSArchibald Elliott case Triple::spir64: 1932f09cf34dSArchibald Elliott case Triple::spir: 193353b6a169SNathan Gauër case Triple::spirv: 1934f09cf34dSArchibald Elliott case Triple::spirv32: 1935f09cf34dSArchibald Elliott case Triple::spirv64: 1936f09cf34dSArchibald Elliott case Triple::wasm32: 1937f09cf34dSArchibald Elliott case Triple::wasm64: 1938f09cf34dSArchibald Elliott case Triple::x86: 1939f09cf34dSArchibald Elliott case Triple::x86_64: 1940f09cf34dSArchibald Elliott case Triple::xcore: 1941f09cf34dSArchibald Elliott case Triple::ve: 1942f09cf34dSArchibald Elliott case Triple::csky: 19438c618e8fSAndrei Safronov case Triple::xtensa: 1944f09cf34dSArchibald Elliott 1945f09cf34dSArchibald Elliott // ARM is intentionally unsupported here, changing the architecture would 1946f09cf34dSArchibald Elliott // drop any arch suffixes. 1947f09cf34dSArchibald Elliott case Triple::arm: 1948f09cf34dSArchibald Elliott case Triple::thumb: 1949f09cf34dSArchibald Elliott T.setArch(UnknownArch); 1950f09cf34dSArchibald Elliott break; 1951f09cf34dSArchibald Elliott 1952f09cf34dSArchibald Elliott case Triple::aarch64: T.setArch(Triple::aarch64_be); break; 1953f09cf34dSArchibald Elliott case Triple::bpfel: T.setArch(Triple::bpfeb); break; 1954f09cf34dSArchibald Elliott case Triple::mips64el: 1955f09cf34dSArchibald Elliott T.setArch(Triple::mips64, getSubArch()); 1956f09cf34dSArchibald Elliott break; 1957f09cf34dSArchibald Elliott case Triple::mipsel: 1958f09cf34dSArchibald Elliott T.setArch(Triple::mips, getSubArch()); 1959f09cf34dSArchibald Elliott break; 1960f09cf34dSArchibald Elliott case Triple::ppcle: T.setArch(Triple::ppc); break; 1961f09cf34dSArchibald Elliott case Triple::ppc64le: T.setArch(Triple::ppc64); break; 1962f09cf34dSArchibald Elliott case Triple::sparcel: T.setArch(Triple::sparc); break; 1963f09cf34dSArchibald Elliott case Triple::tcele: T.setArch(Triple::tce); break; 1964f09cf34dSArchibald Elliott default: 1965f09cf34dSArchibald Elliott llvm_unreachable("getBigEndianArchVariant: unknown triple."); 1966f09cf34dSArchibald Elliott } 1967f09cf34dSArchibald Elliott return T; 1968f09cf34dSArchibald Elliott } 1969f09cf34dSArchibald Elliott 1970f09cf34dSArchibald Elliott Triple Triple::getLittleEndianArchVariant() const { 1971f09cf34dSArchibald Elliott Triple T(*this); 1972f09cf34dSArchibald Elliott if (isLittleEndian()) 1973f09cf34dSArchibald Elliott return T; 1974f09cf34dSArchibald Elliott 1975f09cf34dSArchibald Elliott switch (getArch()) { 1976f09cf34dSArchibald Elliott case Triple::UnknownArch: 1977f09cf34dSArchibald Elliott case Triple::lanai: 1978f09cf34dSArchibald Elliott case Triple::sparcv9: 1979f09cf34dSArchibald Elliott case Triple::systemz: 1980f09cf34dSArchibald Elliott case Triple::m68k: 1981f09cf34dSArchibald Elliott 1982f09cf34dSArchibald Elliott // ARM is intentionally unsupported here, changing the architecture would 1983f09cf34dSArchibald Elliott // drop any arch suffixes. 1984f09cf34dSArchibald Elliott case Triple::armeb: 1985f09cf34dSArchibald Elliott case Triple::thumbeb: 1986f09cf34dSArchibald Elliott T.setArch(UnknownArch); 1987f09cf34dSArchibald Elliott break; 1988f09cf34dSArchibald Elliott 1989f09cf34dSArchibald Elliott case Triple::aarch64_be: T.setArch(Triple::aarch64); break; 1990f09cf34dSArchibald Elliott case Triple::bpfeb: T.setArch(Triple::bpfel); break; 1991f09cf34dSArchibald Elliott case Triple::mips64: 1992f09cf34dSArchibald Elliott T.setArch(Triple::mips64el, getSubArch()); 1993f09cf34dSArchibald Elliott break; 1994f09cf34dSArchibald Elliott case Triple::mips: 1995f09cf34dSArchibald Elliott T.setArch(Triple::mipsel, getSubArch()); 1996f09cf34dSArchibald Elliott break; 1997f09cf34dSArchibald Elliott case Triple::ppc: T.setArch(Triple::ppcle); break; 1998f09cf34dSArchibald Elliott case Triple::ppc64: T.setArch(Triple::ppc64le); break; 1999f09cf34dSArchibald Elliott case Triple::sparc: T.setArch(Triple::sparcel); break; 2000f09cf34dSArchibald Elliott case Triple::tce: T.setArch(Triple::tcele); break; 2001f09cf34dSArchibald Elliott default: 2002f09cf34dSArchibald Elliott llvm_unreachable("getLittleEndianArchVariant: unknown triple."); 2003f09cf34dSArchibald Elliott } 2004f09cf34dSArchibald Elliott return T; 2005f09cf34dSArchibald Elliott } 2006f09cf34dSArchibald Elliott 2007f09cf34dSArchibald Elliott bool Triple::isLittleEndian() const { 2008f09cf34dSArchibald Elliott switch (getArch()) { 2009f09cf34dSArchibald Elliott case Triple::aarch64: 2010f09cf34dSArchibald Elliott case Triple::aarch64_32: 2011f09cf34dSArchibald Elliott case Triple::amdgcn: 2012f09cf34dSArchibald Elliott case Triple::amdil64: 2013f09cf34dSArchibald Elliott case Triple::amdil: 2014f09cf34dSArchibald Elliott case Triple::arm: 2015f09cf34dSArchibald Elliott case Triple::avr: 2016f09cf34dSArchibald Elliott case Triple::bpfel: 2017f09cf34dSArchibald Elliott case Triple::csky: 2018f09cf34dSArchibald Elliott case Triple::dxil: 2019f09cf34dSArchibald Elliott case Triple::hexagon: 2020f09cf34dSArchibald Elliott case Triple::hsail64: 2021f09cf34dSArchibald Elliott case Triple::hsail: 2022f09cf34dSArchibald Elliott case Triple::kalimba: 2023f09cf34dSArchibald Elliott case Triple::loongarch32: 2024f09cf34dSArchibald Elliott case Triple::loongarch64: 2025f09cf34dSArchibald Elliott case Triple::mips64el: 2026f09cf34dSArchibald Elliott case Triple::mipsel: 2027f09cf34dSArchibald Elliott case Triple::msp430: 2028f09cf34dSArchibald Elliott case Triple::nvptx64: 2029f09cf34dSArchibald Elliott case Triple::nvptx: 2030f09cf34dSArchibald Elliott case Triple::ppcle: 2031f09cf34dSArchibald Elliott case Triple::ppc64le: 2032f09cf34dSArchibald Elliott case Triple::r600: 2033f09cf34dSArchibald Elliott case Triple::renderscript32: 2034f09cf34dSArchibald Elliott case Triple::renderscript64: 2035f09cf34dSArchibald Elliott case Triple::riscv32: 2036f09cf34dSArchibald Elliott case Triple::riscv64: 2037f09cf34dSArchibald Elliott case Triple::shave: 2038f09cf34dSArchibald Elliott case Triple::sparcel: 2039f09cf34dSArchibald Elliott case Triple::spir64: 2040f09cf34dSArchibald Elliott case Triple::spir: 204153b6a169SNathan Gauër case Triple::spirv: 2042f09cf34dSArchibald Elliott case Triple::spirv32: 2043f09cf34dSArchibald Elliott case Triple::spirv64: 2044f09cf34dSArchibald Elliott case Triple::tcele: 2045f09cf34dSArchibald Elliott case Triple::thumb: 2046f09cf34dSArchibald Elliott case Triple::ve: 2047f09cf34dSArchibald Elliott case Triple::wasm32: 2048f09cf34dSArchibald Elliott case Triple::wasm64: 2049f09cf34dSArchibald Elliott case Triple::x86: 2050f09cf34dSArchibald Elliott case Triple::x86_64: 2051f09cf34dSArchibald Elliott case Triple::xcore: 20528c618e8fSAndrei Safronov case Triple::xtensa: 2053f09cf34dSArchibald Elliott return true; 2054f09cf34dSArchibald Elliott default: 2055f09cf34dSArchibald Elliott return false; 2056f09cf34dSArchibald Elliott } 2057f09cf34dSArchibald Elliott } 2058f09cf34dSArchibald Elliott 2059f09cf34dSArchibald Elliott bool Triple::isCompatibleWith(const Triple &Other) const { 2060a829ebadSMartin Storsjö // On MinGW, C code is usually built with a "w64" vendor, while Rust 2061a829ebadSMartin Storsjö // often uses a "pc" vendor. 2062a829ebadSMartin Storsjö bool IgnoreVendor = isWindowsGNUEnvironment(); 2063a829ebadSMartin Storsjö 2064f09cf34dSArchibald Elliott // ARM and Thumb triples are compatible, if subarch, vendor and OS match. 2065f09cf34dSArchibald Elliott if ((getArch() == Triple::thumb && Other.getArch() == Triple::arm) || 2066f09cf34dSArchibald Elliott (getArch() == Triple::arm && Other.getArch() == Triple::thumb) || 2067f09cf34dSArchibald Elliott (getArch() == Triple::thumbeb && Other.getArch() == Triple::armeb) || 2068f09cf34dSArchibald Elliott (getArch() == Triple::armeb && Other.getArch() == Triple::thumbeb)) { 2069f09cf34dSArchibald Elliott if (getVendor() == Triple::Apple) 2070f09cf34dSArchibald Elliott return getSubArch() == Other.getSubArch() && 2071f09cf34dSArchibald Elliott getVendor() == Other.getVendor() && getOS() == Other.getOS(); 2072f09cf34dSArchibald Elliott else 2073f09cf34dSArchibald Elliott return getSubArch() == Other.getSubArch() && 2074a829ebadSMartin Storsjö (getVendor() == Other.getVendor() || IgnoreVendor) && 2075a829ebadSMartin Storsjö getOS() == Other.getOS() && 2076f09cf34dSArchibald Elliott getEnvironment() == Other.getEnvironment() && 2077f09cf34dSArchibald Elliott getObjectFormat() == Other.getObjectFormat(); 2078f09cf34dSArchibald Elliott } 2079f09cf34dSArchibald Elliott 2080a829ebadSMartin Storsjö // If vendor is apple, ignore the version number (the environment field) 2081a829ebadSMartin Storsjö // and the object format. 2082f09cf34dSArchibald Elliott if (getVendor() == Triple::Apple) 2083f09cf34dSArchibald Elliott return getArch() == Other.getArch() && getSubArch() == Other.getSubArch() && 2084a829ebadSMartin Storsjö (getVendor() == Other.getVendor() || IgnoreVendor) && 2085a829ebadSMartin Storsjö getOS() == Other.getOS(); 2086f09cf34dSArchibald Elliott 2087a829ebadSMartin Storsjö return getArch() == Other.getArch() && getSubArch() == Other.getSubArch() && 2088a829ebadSMartin Storsjö (getVendor() == Other.getVendor() || IgnoreVendor) && 2089a829ebadSMartin Storsjö getOS() == Other.getOS() && 2090a829ebadSMartin Storsjö getEnvironment() == Other.getEnvironment() && 2091a829ebadSMartin Storsjö getObjectFormat() == Other.getObjectFormat(); 2092f09cf34dSArchibald Elliott } 2093f09cf34dSArchibald Elliott 2094f09cf34dSArchibald Elliott std::string Triple::merge(const Triple &Other) const { 2095f09cf34dSArchibald Elliott // If vendor is apple, pick the triple with the larger version number. 2096f09cf34dSArchibald Elliott if (getVendor() == Triple::Apple) 2097f09cf34dSArchibald Elliott if (Other.isOSVersionLT(*this)) 2098f09cf34dSArchibald Elliott return str(); 2099f09cf34dSArchibald Elliott 2100f09cf34dSArchibald Elliott return Other.str(); 2101f09cf34dSArchibald Elliott } 2102f09cf34dSArchibald Elliott 2103f09cf34dSArchibald Elliott bool Triple::isMacOSXVersionLT(unsigned Major, unsigned Minor, 2104f09cf34dSArchibald Elliott unsigned Micro) const { 2105f09cf34dSArchibald Elliott assert(isMacOSX() && "Not an OS X triple!"); 2106f09cf34dSArchibald Elliott 2107f09cf34dSArchibald Elliott // If this is OS X, expect a sane version number. 2108f09cf34dSArchibald Elliott if (getOS() == Triple::MacOSX) 2109f09cf34dSArchibald Elliott return isOSVersionLT(Major, Minor, Micro); 2110f09cf34dSArchibald Elliott 2111f09cf34dSArchibald Elliott // Otherwise, compare to the "Darwin" number. 2112f09cf34dSArchibald Elliott if (Major == 10) { 2113f09cf34dSArchibald Elliott return isOSVersionLT(Minor + 4, Micro, 0); 2114f09cf34dSArchibald Elliott } else { 2115f09cf34dSArchibald Elliott assert(Major >= 11 && "Unexpected major version"); 2116f09cf34dSArchibald Elliott return isOSVersionLT(Major - 11 + 20, Minor, Micro); 2117f09cf34dSArchibald Elliott } 2118f09cf34dSArchibald Elliott } 2119f09cf34dSArchibald Elliott 2120f09cf34dSArchibald Elliott VersionTuple Triple::getMinimumSupportedOSVersion() const { 2121f09cf34dSArchibald Elliott if (getVendor() != Triple::Apple || getArch() != Triple::aarch64) 2122f09cf34dSArchibald Elliott return VersionTuple(); 2123f09cf34dSArchibald Elliott switch (getOS()) { 2124f09cf34dSArchibald Elliott case Triple::MacOSX: 2125f09cf34dSArchibald Elliott // ARM64 slice is supported starting from macOS 11.0+. 2126f09cf34dSArchibald Elliott return VersionTuple(11, 0, 0); 2127f09cf34dSArchibald Elliott case Triple::IOS: 2128f09cf34dSArchibald Elliott // ARM64 slice is supported starting from Mac Catalyst 14 (macOS 11). 2129f09cf34dSArchibald Elliott // ARM64 simulators are supported for iOS 14+. 2130f09cf34dSArchibald Elliott if (isMacCatalystEnvironment() || isSimulatorEnvironment()) 2131f09cf34dSArchibald Elliott return VersionTuple(14, 0, 0); 2132f09cf34dSArchibald Elliott // ARM64e slice is supported starting from iOS 14. 2133f09cf34dSArchibald Elliott if (isArm64e()) 2134f09cf34dSArchibald Elliott return VersionTuple(14, 0, 0); 2135f09cf34dSArchibald Elliott break; 2136f09cf34dSArchibald Elliott case Triple::TvOS: 2137f09cf34dSArchibald Elliott // ARM64 simulators are supported for tvOS 14+. 2138f09cf34dSArchibald Elliott if (isSimulatorEnvironment()) 2139f09cf34dSArchibald Elliott return VersionTuple(14, 0, 0); 2140f09cf34dSArchibald Elliott break; 2141f09cf34dSArchibald Elliott case Triple::WatchOS: 2142f09cf34dSArchibald Elliott // ARM64 simulators are supported for watchOS 7+. 2143f09cf34dSArchibald Elliott if (isSimulatorEnvironment()) 2144f09cf34dSArchibald Elliott return VersionTuple(7, 0, 0); 2145f09cf34dSArchibald Elliott break; 2146f09cf34dSArchibald Elliott case Triple::DriverKit: 2147f09cf34dSArchibald Elliott return VersionTuple(20, 0, 0); 2148f09cf34dSArchibald Elliott default: 2149f09cf34dSArchibald Elliott break; 2150f09cf34dSArchibald Elliott } 2151f09cf34dSArchibald Elliott return VersionTuple(); 2152f09cf34dSArchibald Elliott } 2153f09cf34dSArchibald Elliott 2154f09cf34dSArchibald Elliott VersionTuple Triple::getCanonicalVersionForOS(OSType OSKind, 2155f09cf34dSArchibald Elliott const VersionTuple &Version) { 2156f09cf34dSArchibald Elliott switch (OSKind) { 2157f09cf34dSArchibald Elliott case MacOSX: 2158f09cf34dSArchibald Elliott // macOS 10.16 is canonicalized to macOS 11. 2159f09cf34dSArchibald Elliott if (Version == VersionTuple(10, 16)) 2160f09cf34dSArchibald Elliott return VersionTuple(11, 0); 2161f09cf34dSArchibald Elliott [[fallthrough]]; 2162f09cf34dSArchibald Elliott default: 2163f09cf34dSArchibald Elliott return Version; 2164f09cf34dSArchibald Elliott } 2165f09cf34dSArchibald Elliott } 2166f09cf34dSArchibald Elliott 2167f09cf34dSArchibald Elliott // HLSL triple environment orders are relied on in the front end 2168f09cf34dSArchibald Elliott static_assert(Triple::Vertex - Triple::Pixel == 1, 2169f09cf34dSArchibald Elliott "incorrect HLSL stage order"); 2170f09cf34dSArchibald Elliott static_assert(Triple::Geometry - Triple::Pixel == 2, 2171f09cf34dSArchibald Elliott "incorrect HLSL stage order"); 2172f09cf34dSArchibald Elliott static_assert(Triple::Hull - Triple::Pixel == 3, 2173f09cf34dSArchibald Elliott "incorrect HLSL stage order"); 2174f09cf34dSArchibald Elliott static_assert(Triple::Domain - Triple::Pixel == 4, 2175f09cf34dSArchibald Elliott "incorrect HLSL stage order"); 2176f09cf34dSArchibald Elliott static_assert(Triple::Compute - Triple::Pixel == 5, 2177f09cf34dSArchibald Elliott "incorrect HLSL stage order"); 2178f09cf34dSArchibald Elliott static_assert(Triple::Library - Triple::Pixel == 6, 2179f09cf34dSArchibald Elliott "incorrect HLSL stage order"); 2180f09cf34dSArchibald Elliott static_assert(Triple::RayGeneration - Triple::Pixel == 7, 2181f09cf34dSArchibald Elliott "incorrect HLSL stage order"); 2182f09cf34dSArchibald Elliott static_assert(Triple::Intersection - Triple::Pixel == 8, 2183f09cf34dSArchibald Elliott "incorrect HLSL stage order"); 2184f09cf34dSArchibald Elliott static_assert(Triple::AnyHit - Triple::Pixel == 9, 2185f09cf34dSArchibald Elliott "incorrect HLSL stage order"); 2186f09cf34dSArchibald Elliott static_assert(Triple::ClosestHit - Triple::Pixel == 10, 2187f09cf34dSArchibald Elliott "incorrect HLSL stage order"); 2188f09cf34dSArchibald Elliott static_assert(Triple::Miss - Triple::Pixel == 11, 2189f09cf34dSArchibald Elliott "incorrect HLSL stage order"); 2190f09cf34dSArchibald Elliott static_assert(Triple::Callable - Triple::Pixel == 12, 2191f09cf34dSArchibald Elliott "incorrect HLSL stage order"); 2192f09cf34dSArchibald Elliott static_assert(Triple::Mesh - Triple::Pixel == 13, 2193f09cf34dSArchibald Elliott "incorrect HLSL stage order"); 2194f09cf34dSArchibald Elliott static_assert(Triple::Amplification - Triple::Pixel == 14, 2195f09cf34dSArchibald Elliott "incorrect HLSL stage order"); 2196