1bdd1243dSDimitry Andric //===--- Triple.cpp - Target triple helper class --------------------------===// 2bdd1243dSDimitry Andric // 3bdd1243dSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4bdd1243dSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5bdd1243dSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6bdd1243dSDimitry Andric // 7bdd1243dSDimitry Andric //===----------------------------------------------------------------------===// 8bdd1243dSDimitry Andric 9bdd1243dSDimitry Andric #include "llvm/TargetParser/Triple.h" 10bdd1243dSDimitry Andric #include "llvm/ADT/SmallString.h" 11bdd1243dSDimitry Andric #include "llvm/ADT/StringExtras.h" 12bdd1243dSDimitry Andric #include "llvm/ADT/StringSwitch.h" 13bdd1243dSDimitry Andric #include "llvm/Support/ErrorHandling.h" 14bdd1243dSDimitry Andric #include "llvm/Support/SwapByteOrder.h" 15bdd1243dSDimitry Andric #include "llvm/Support/VersionTuple.h" 16bdd1243dSDimitry Andric #include "llvm/TargetParser/ARMTargetParser.h" 17bdd1243dSDimitry Andric #include "llvm/TargetParser/ARMTargetParserCommon.h" 18bdd1243dSDimitry Andric #include "llvm/TargetParser/Host.h" 19bdd1243dSDimitry Andric #include <cassert> 20bdd1243dSDimitry Andric #include <cstring> 21bdd1243dSDimitry Andric using namespace llvm; 22bdd1243dSDimitry Andric 23bdd1243dSDimitry Andric StringRef Triple::getArchTypeName(ArchType Kind) { 24bdd1243dSDimitry Andric switch (Kind) { 25bdd1243dSDimitry Andric case UnknownArch: return "unknown"; 26bdd1243dSDimitry Andric 27bdd1243dSDimitry Andric case aarch64: return "aarch64"; 28bdd1243dSDimitry Andric case aarch64_32: return "aarch64_32"; 29bdd1243dSDimitry Andric case aarch64_be: return "aarch64_be"; 30bdd1243dSDimitry Andric case amdgcn: return "amdgcn"; 31bdd1243dSDimitry Andric case amdil64: return "amdil64"; 32bdd1243dSDimitry Andric case amdil: return "amdil"; 33bdd1243dSDimitry Andric case arc: return "arc"; 34bdd1243dSDimitry Andric case arm: return "arm"; 35bdd1243dSDimitry Andric case armeb: return "armeb"; 36bdd1243dSDimitry Andric case avr: return "avr"; 37bdd1243dSDimitry Andric case bpfeb: return "bpfeb"; 38bdd1243dSDimitry Andric case bpfel: return "bpfel"; 39bdd1243dSDimitry Andric case csky: return "csky"; 40bdd1243dSDimitry Andric case dxil: return "dxil"; 41bdd1243dSDimitry Andric case hexagon: return "hexagon"; 42bdd1243dSDimitry Andric case hsail64: return "hsail64"; 43bdd1243dSDimitry Andric case hsail: return "hsail"; 44bdd1243dSDimitry Andric case kalimba: return "kalimba"; 45bdd1243dSDimitry Andric case lanai: return "lanai"; 46bdd1243dSDimitry Andric case le32: return "le32"; 47bdd1243dSDimitry Andric case le64: return "le64"; 48bdd1243dSDimitry Andric case loongarch32: return "loongarch32"; 49bdd1243dSDimitry Andric case loongarch64: return "loongarch64"; 50bdd1243dSDimitry Andric case m68k: return "m68k"; 51bdd1243dSDimitry Andric case mips64: return "mips64"; 52bdd1243dSDimitry Andric case mips64el: return "mips64el"; 53bdd1243dSDimitry Andric case mips: return "mips"; 54bdd1243dSDimitry Andric case mipsel: return "mipsel"; 55bdd1243dSDimitry Andric case msp430: return "msp430"; 56bdd1243dSDimitry Andric case nvptx64: return "nvptx64"; 57bdd1243dSDimitry Andric case nvptx: return "nvptx"; 58bdd1243dSDimitry Andric case ppc64: return "powerpc64"; 59bdd1243dSDimitry Andric case ppc64le: return "powerpc64le"; 60bdd1243dSDimitry Andric case ppc: return "powerpc"; 61bdd1243dSDimitry Andric case ppcle: return "powerpcle"; 62bdd1243dSDimitry Andric case r600: return "r600"; 63bdd1243dSDimitry Andric case renderscript32: return "renderscript32"; 64bdd1243dSDimitry Andric case renderscript64: return "renderscript64"; 65bdd1243dSDimitry Andric case riscv32: return "riscv32"; 66bdd1243dSDimitry Andric case riscv64: return "riscv64"; 67bdd1243dSDimitry Andric case shave: return "shave"; 68bdd1243dSDimitry Andric case sparc: return "sparc"; 69bdd1243dSDimitry Andric case sparcel: return "sparcel"; 70bdd1243dSDimitry Andric case sparcv9: return "sparcv9"; 71bdd1243dSDimitry Andric case spir64: return "spir64"; 72bdd1243dSDimitry Andric case spir: return "spir"; 73bdd1243dSDimitry Andric case spirv32: return "spirv32"; 74bdd1243dSDimitry Andric case spirv64: return "spirv64"; 75bdd1243dSDimitry Andric case systemz: return "s390x"; 76bdd1243dSDimitry Andric case tce: return "tce"; 77bdd1243dSDimitry Andric case tcele: return "tcele"; 78bdd1243dSDimitry Andric case thumb: return "thumb"; 79bdd1243dSDimitry Andric case thumbeb: return "thumbeb"; 80bdd1243dSDimitry Andric case ve: return "ve"; 81bdd1243dSDimitry Andric case wasm32: return "wasm32"; 82bdd1243dSDimitry Andric case wasm64: return "wasm64"; 83bdd1243dSDimitry Andric case x86: return "i386"; 84bdd1243dSDimitry Andric case x86_64: return "x86_64"; 85bdd1243dSDimitry Andric case xcore: return "xcore"; 86bdd1243dSDimitry Andric case xtensa: return "xtensa"; 87bdd1243dSDimitry Andric } 88bdd1243dSDimitry Andric 89bdd1243dSDimitry Andric llvm_unreachable("Invalid ArchType!"); 90bdd1243dSDimitry Andric } 91bdd1243dSDimitry Andric 92bdd1243dSDimitry Andric StringRef Triple::getArchTypePrefix(ArchType Kind) { 93bdd1243dSDimitry Andric switch (Kind) { 94bdd1243dSDimitry Andric default: 95bdd1243dSDimitry Andric return StringRef(); 96bdd1243dSDimitry Andric 97bdd1243dSDimitry Andric case aarch64: 98bdd1243dSDimitry Andric case aarch64_be: 99bdd1243dSDimitry Andric case aarch64_32: return "aarch64"; 100bdd1243dSDimitry Andric 101bdd1243dSDimitry Andric case arc: return "arc"; 102bdd1243dSDimitry Andric 103bdd1243dSDimitry Andric case arm: 104bdd1243dSDimitry Andric case armeb: 105bdd1243dSDimitry Andric case thumb: 106bdd1243dSDimitry Andric case thumbeb: return "arm"; 107bdd1243dSDimitry Andric 108bdd1243dSDimitry Andric case avr: return "avr"; 109bdd1243dSDimitry Andric 110bdd1243dSDimitry Andric case ppc64: 111bdd1243dSDimitry Andric case ppc64le: 112bdd1243dSDimitry Andric case ppc: 113bdd1243dSDimitry Andric case ppcle: return "ppc"; 114bdd1243dSDimitry Andric 115bdd1243dSDimitry Andric case m68k: return "m68k"; 116bdd1243dSDimitry Andric 117bdd1243dSDimitry Andric case mips: 118bdd1243dSDimitry Andric case mipsel: 119bdd1243dSDimitry Andric case mips64: 120bdd1243dSDimitry Andric case mips64el: return "mips"; 121bdd1243dSDimitry Andric 122bdd1243dSDimitry Andric case hexagon: return "hexagon"; 123bdd1243dSDimitry Andric 124bdd1243dSDimitry Andric case amdgcn: return "amdgcn"; 125bdd1243dSDimitry Andric case r600: return "r600"; 126bdd1243dSDimitry Andric 127bdd1243dSDimitry Andric case bpfel: 128bdd1243dSDimitry Andric case bpfeb: return "bpf"; 129bdd1243dSDimitry Andric 130bdd1243dSDimitry Andric case sparcv9: 131bdd1243dSDimitry Andric case sparcel: 132bdd1243dSDimitry Andric case sparc: return "sparc"; 133bdd1243dSDimitry Andric 134bdd1243dSDimitry Andric case systemz: return "s390"; 135bdd1243dSDimitry Andric 136bdd1243dSDimitry Andric case x86: 137bdd1243dSDimitry Andric case x86_64: return "x86"; 138bdd1243dSDimitry Andric 139bdd1243dSDimitry Andric case xcore: return "xcore"; 140bdd1243dSDimitry Andric 141bdd1243dSDimitry Andric // NVPTX intrinsics are namespaced under nvvm. 142bdd1243dSDimitry Andric case nvptx: return "nvvm"; 143bdd1243dSDimitry Andric case nvptx64: return "nvvm"; 144bdd1243dSDimitry Andric 145bdd1243dSDimitry Andric case le32: return "le32"; 146bdd1243dSDimitry Andric case le64: return "le64"; 147bdd1243dSDimitry Andric 148bdd1243dSDimitry Andric case amdil: 149bdd1243dSDimitry Andric case amdil64: return "amdil"; 150bdd1243dSDimitry Andric 151bdd1243dSDimitry Andric case hsail: 152bdd1243dSDimitry Andric case hsail64: return "hsail"; 153bdd1243dSDimitry Andric 154bdd1243dSDimitry Andric case spir: 155bdd1243dSDimitry Andric case spir64: return "spir"; 156bdd1243dSDimitry Andric 157bdd1243dSDimitry Andric case spirv32: 158bdd1243dSDimitry Andric case spirv64: return "spirv"; 159bdd1243dSDimitry Andric 160bdd1243dSDimitry Andric case kalimba: return "kalimba"; 161bdd1243dSDimitry Andric case lanai: return "lanai"; 162bdd1243dSDimitry Andric case shave: return "shave"; 163bdd1243dSDimitry Andric case wasm32: 164bdd1243dSDimitry Andric case wasm64: return "wasm"; 165bdd1243dSDimitry Andric 166bdd1243dSDimitry Andric case riscv32: 167bdd1243dSDimitry Andric case riscv64: return "riscv"; 168bdd1243dSDimitry Andric 169bdd1243dSDimitry Andric case ve: return "ve"; 170bdd1243dSDimitry Andric case csky: return "csky"; 171bdd1243dSDimitry Andric 172bdd1243dSDimitry Andric case loongarch32: 173bdd1243dSDimitry Andric case loongarch64: return "loongarch"; 174bdd1243dSDimitry Andric 175bdd1243dSDimitry Andric case dxil: return "dx"; 176bdd1243dSDimitry Andric 177bdd1243dSDimitry Andric case xtensa: return "xtensa"; 178bdd1243dSDimitry Andric } 179bdd1243dSDimitry Andric } 180bdd1243dSDimitry Andric 181bdd1243dSDimitry Andric StringRef Triple::getVendorTypeName(VendorType Kind) { 182bdd1243dSDimitry Andric switch (Kind) { 183bdd1243dSDimitry Andric case UnknownVendor: return "unknown"; 184bdd1243dSDimitry Andric 185bdd1243dSDimitry Andric case AMD: return "amd"; 186bdd1243dSDimitry Andric case Apple: return "apple"; 187bdd1243dSDimitry Andric case CSR: return "csr"; 188bdd1243dSDimitry Andric case Freescale: return "fsl"; 189bdd1243dSDimitry Andric case IBM: return "ibm"; 190bdd1243dSDimitry Andric case ImaginationTechnologies: return "img"; 191bdd1243dSDimitry Andric case Mesa: return "mesa"; 192bdd1243dSDimitry Andric case MipsTechnologies: return "mti"; 193bdd1243dSDimitry Andric case Myriad: return "myriad"; 194bdd1243dSDimitry Andric case NVIDIA: return "nvidia"; 195bdd1243dSDimitry Andric case OpenEmbedded: return "oe"; 196bdd1243dSDimitry Andric case PC: return "pc"; 197bdd1243dSDimitry Andric case SCEI: return "scei"; 198bdd1243dSDimitry Andric case SUSE: return "suse"; 199bdd1243dSDimitry Andric } 200bdd1243dSDimitry Andric 201bdd1243dSDimitry Andric llvm_unreachable("Invalid VendorType!"); 202bdd1243dSDimitry Andric } 203bdd1243dSDimitry Andric 204bdd1243dSDimitry Andric StringRef Triple::getOSTypeName(OSType Kind) { 205bdd1243dSDimitry Andric switch (Kind) { 206bdd1243dSDimitry Andric case UnknownOS: return "unknown"; 207bdd1243dSDimitry Andric 208bdd1243dSDimitry Andric case AIX: return "aix"; 209bdd1243dSDimitry Andric case AMDHSA: return "amdhsa"; 210bdd1243dSDimitry Andric case AMDPAL: return "amdpal"; 211bdd1243dSDimitry Andric case Ananas: return "ananas"; 212bdd1243dSDimitry Andric case CUDA: return "cuda"; 213bdd1243dSDimitry Andric case CloudABI: return "cloudabi"; 214bdd1243dSDimitry Andric case Contiki: return "contiki"; 215bdd1243dSDimitry Andric case Darwin: return "darwin"; 216bdd1243dSDimitry Andric case DragonFly: return "dragonfly"; 217bdd1243dSDimitry Andric case DriverKit: return "driverkit"; 218bdd1243dSDimitry Andric case ELFIAMCU: return "elfiamcu"; 219bdd1243dSDimitry Andric case Emscripten: return "emscripten"; 220bdd1243dSDimitry Andric case FreeBSD: return "freebsd"; 221bdd1243dSDimitry Andric case Fuchsia: return "fuchsia"; 222bdd1243dSDimitry Andric case Haiku: return "haiku"; 223bdd1243dSDimitry Andric case HermitCore: return "hermit"; 224bdd1243dSDimitry Andric case Hurd: return "hurd"; 225bdd1243dSDimitry Andric case IOS: return "ios"; 226bdd1243dSDimitry Andric case KFreeBSD: return "kfreebsd"; 227bdd1243dSDimitry Andric case Linux: return "linux"; 228bdd1243dSDimitry Andric case Lv2: return "lv2"; 229bdd1243dSDimitry Andric case MacOSX: return "macosx"; 230bdd1243dSDimitry Andric case Mesa3D: return "mesa3d"; 231bdd1243dSDimitry Andric case Minix: return "minix"; 232bdd1243dSDimitry Andric case NVCL: return "nvcl"; 233bdd1243dSDimitry Andric case NaCl: return "nacl"; 234bdd1243dSDimitry Andric case NetBSD: return "netbsd"; 235bdd1243dSDimitry Andric case OpenBSD: return "openbsd"; 236bdd1243dSDimitry Andric case PS4: return "ps4"; 237bdd1243dSDimitry Andric case PS5: return "ps5"; 238bdd1243dSDimitry Andric case RTEMS: return "rtems"; 239bdd1243dSDimitry Andric case Solaris: return "solaris"; 240bdd1243dSDimitry Andric case TvOS: return "tvos"; 241*06c3fb27SDimitry Andric case UEFI: return "uefi"; 242bdd1243dSDimitry Andric case WASI: return "wasi"; 243bdd1243dSDimitry Andric case WatchOS: return "watchos"; 244bdd1243dSDimitry Andric case Win32: return "windows"; 245bdd1243dSDimitry Andric case ZOS: return "zos"; 246bdd1243dSDimitry Andric case ShaderModel: return "shadermodel"; 247*06c3fb27SDimitry Andric case LiteOS: return "liteos"; 248bdd1243dSDimitry Andric } 249bdd1243dSDimitry Andric 250bdd1243dSDimitry Andric llvm_unreachable("Invalid OSType"); 251bdd1243dSDimitry Andric } 252bdd1243dSDimitry Andric 253bdd1243dSDimitry Andric StringRef Triple::getEnvironmentTypeName(EnvironmentType Kind) { 254bdd1243dSDimitry Andric switch (Kind) { 255bdd1243dSDimitry Andric case UnknownEnvironment: return "unknown"; 256bdd1243dSDimitry Andric case Android: return "android"; 257bdd1243dSDimitry Andric case CODE16: return "code16"; 258bdd1243dSDimitry Andric case CoreCLR: return "coreclr"; 259bdd1243dSDimitry Andric case Cygnus: return "cygnus"; 260bdd1243dSDimitry Andric case EABI: return "eabi"; 261bdd1243dSDimitry Andric case EABIHF: return "eabihf"; 262bdd1243dSDimitry Andric case GNU: return "gnu"; 263bdd1243dSDimitry Andric case GNUABI64: return "gnuabi64"; 264bdd1243dSDimitry Andric case GNUABIN32: return "gnuabin32"; 265bdd1243dSDimitry Andric case GNUEABI: return "gnueabi"; 266bdd1243dSDimitry Andric case GNUEABIHF: return "gnueabihf"; 267bdd1243dSDimitry Andric case GNUF32: return "gnuf32"; 268bdd1243dSDimitry Andric case GNUF64: return "gnuf64"; 269bdd1243dSDimitry Andric case GNUSF: return "gnusf"; 270bdd1243dSDimitry Andric case GNUX32: return "gnux32"; 271bdd1243dSDimitry Andric case GNUILP32: return "gnu_ilp32"; 272bdd1243dSDimitry Andric case Itanium: return "itanium"; 273bdd1243dSDimitry Andric case MSVC: return "msvc"; 274bdd1243dSDimitry Andric case MacABI: return "macabi"; 275bdd1243dSDimitry Andric case Musl: return "musl"; 276bdd1243dSDimitry Andric case MuslEABI: return "musleabi"; 277bdd1243dSDimitry Andric case MuslEABIHF: return "musleabihf"; 278bdd1243dSDimitry Andric case MuslX32: return "muslx32"; 279bdd1243dSDimitry Andric case Simulator: return "simulator"; 280bdd1243dSDimitry Andric case Pixel: return "pixel"; 281bdd1243dSDimitry Andric case Vertex: return "vertex"; 282bdd1243dSDimitry Andric case Geometry: return "geometry"; 283bdd1243dSDimitry Andric case Hull: return "hull"; 284bdd1243dSDimitry Andric case Domain: return "domain"; 285bdd1243dSDimitry Andric case Compute: return "compute"; 286bdd1243dSDimitry Andric case Library: return "library"; 287bdd1243dSDimitry Andric case RayGeneration: return "raygeneration"; 288bdd1243dSDimitry Andric case Intersection: return "intersection"; 289bdd1243dSDimitry Andric case AnyHit: return "anyhit"; 290bdd1243dSDimitry Andric case ClosestHit: return "closesthit"; 291bdd1243dSDimitry Andric case Miss: return "miss"; 292bdd1243dSDimitry Andric case Callable: return "callable"; 293bdd1243dSDimitry Andric case Mesh: return "mesh"; 294bdd1243dSDimitry Andric case Amplification: return "amplification"; 295*06c3fb27SDimitry Andric case OpenHOS: return "ohos"; 296bdd1243dSDimitry Andric } 297bdd1243dSDimitry Andric 298bdd1243dSDimitry Andric llvm_unreachable("Invalid EnvironmentType!"); 299bdd1243dSDimitry Andric } 300bdd1243dSDimitry Andric 301*06c3fb27SDimitry Andric StringRef Triple::getObjectFormatTypeName(ObjectFormatType Kind) { 302*06c3fb27SDimitry Andric switch (Kind) { 303*06c3fb27SDimitry Andric case UnknownObjectFormat: return ""; 304*06c3fb27SDimitry Andric case COFF: return "coff"; 305*06c3fb27SDimitry Andric case ELF: return "elf"; 306*06c3fb27SDimitry Andric case GOFF: return "goff"; 307*06c3fb27SDimitry Andric case MachO: return "macho"; 308*06c3fb27SDimitry Andric case Wasm: return "wasm"; 309*06c3fb27SDimitry Andric case XCOFF: return "xcoff"; 310*06c3fb27SDimitry Andric case DXContainer: return "dxcontainer"; 311*06c3fb27SDimitry Andric case SPIRV: return "spirv"; 312*06c3fb27SDimitry Andric } 313*06c3fb27SDimitry Andric llvm_unreachable("unknown object format type"); 314*06c3fb27SDimitry Andric } 315*06c3fb27SDimitry Andric 316bdd1243dSDimitry Andric static Triple::ArchType parseBPFArch(StringRef ArchName) { 317bdd1243dSDimitry Andric if (ArchName.equals("bpf")) { 318bdd1243dSDimitry Andric if (sys::IsLittleEndianHost) 319bdd1243dSDimitry Andric return Triple::bpfel; 320bdd1243dSDimitry Andric else 321bdd1243dSDimitry Andric return Triple::bpfeb; 322bdd1243dSDimitry Andric } else if (ArchName.equals("bpf_be") || ArchName.equals("bpfeb")) { 323bdd1243dSDimitry Andric return Triple::bpfeb; 324bdd1243dSDimitry Andric } else if (ArchName.equals("bpf_le") || ArchName.equals("bpfel")) { 325bdd1243dSDimitry Andric return Triple::bpfel; 326bdd1243dSDimitry Andric } else { 327bdd1243dSDimitry Andric return Triple::UnknownArch; 328bdd1243dSDimitry Andric } 329bdd1243dSDimitry Andric } 330bdd1243dSDimitry Andric 331bdd1243dSDimitry Andric Triple::ArchType Triple::getArchTypeForLLVMName(StringRef Name) { 332bdd1243dSDimitry Andric Triple::ArchType BPFArch(parseBPFArch(Name)); 333bdd1243dSDimitry Andric return StringSwitch<Triple::ArchType>(Name) 334bdd1243dSDimitry Andric .Case("aarch64", aarch64) 335bdd1243dSDimitry Andric .Case("aarch64_be", aarch64_be) 336bdd1243dSDimitry Andric .Case("aarch64_32", aarch64_32) 337bdd1243dSDimitry Andric .Case("arc", arc) 338bdd1243dSDimitry Andric .Case("arm64", aarch64) // "arm64" is an alias for "aarch64" 339bdd1243dSDimitry Andric .Case("arm64_32", aarch64_32) 340bdd1243dSDimitry Andric .Case("arm", arm) 341bdd1243dSDimitry Andric .Case("armeb", armeb) 342bdd1243dSDimitry Andric .Case("avr", avr) 343bdd1243dSDimitry Andric .StartsWith("bpf", BPFArch) 344bdd1243dSDimitry Andric .Case("m68k", m68k) 345bdd1243dSDimitry Andric .Case("mips", mips) 346bdd1243dSDimitry Andric .Case("mipsel", mipsel) 347bdd1243dSDimitry Andric .Case("mips64", mips64) 348bdd1243dSDimitry Andric .Case("mips64el", mips64el) 349bdd1243dSDimitry Andric .Case("msp430", msp430) 350bdd1243dSDimitry Andric .Case("ppc64", ppc64) 351bdd1243dSDimitry Andric .Case("ppc32", ppc) 352bdd1243dSDimitry Andric .Case("ppc", ppc) 353bdd1243dSDimitry Andric .Case("ppc32le", ppcle) 354bdd1243dSDimitry Andric .Case("ppcle", ppcle) 355bdd1243dSDimitry Andric .Case("ppc64le", ppc64le) 356bdd1243dSDimitry Andric .Case("r600", r600) 357bdd1243dSDimitry Andric .Case("amdgcn", amdgcn) 358bdd1243dSDimitry Andric .Case("riscv32", riscv32) 359bdd1243dSDimitry Andric .Case("riscv64", riscv64) 360bdd1243dSDimitry Andric .Case("hexagon", hexagon) 361bdd1243dSDimitry Andric .Case("sparc", sparc) 362bdd1243dSDimitry Andric .Case("sparcel", sparcel) 363bdd1243dSDimitry Andric .Case("sparcv9", sparcv9) 364bdd1243dSDimitry Andric .Case("s390x", systemz) 365bdd1243dSDimitry Andric .Case("systemz", systemz) 366bdd1243dSDimitry Andric .Case("tce", tce) 367bdd1243dSDimitry Andric .Case("tcele", tcele) 368bdd1243dSDimitry Andric .Case("thumb", thumb) 369bdd1243dSDimitry Andric .Case("thumbeb", thumbeb) 370bdd1243dSDimitry Andric .Case("x86", x86) 371bdd1243dSDimitry Andric .Case("i386", x86) 372bdd1243dSDimitry Andric .Case("x86-64", x86_64) 373bdd1243dSDimitry Andric .Case("xcore", xcore) 374bdd1243dSDimitry Andric .Case("nvptx", nvptx) 375bdd1243dSDimitry Andric .Case("nvptx64", nvptx64) 376bdd1243dSDimitry Andric .Case("le32", le32) 377bdd1243dSDimitry Andric .Case("le64", le64) 378bdd1243dSDimitry Andric .Case("amdil", amdil) 379bdd1243dSDimitry Andric .Case("amdil64", amdil64) 380bdd1243dSDimitry Andric .Case("hsail", hsail) 381bdd1243dSDimitry Andric .Case("hsail64", hsail64) 382bdd1243dSDimitry Andric .Case("spir", spir) 383bdd1243dSDimitry Andric .Case("spir64", spir64) 384bdd1243dSDimitry Andric .Case("spirv32", spirv32) 385bdd1243dSDimitry Andric .Case("spirv64", spirv64) 386bdd1243dSDimitry Andric .Case("kalimba", kalimba) 387bdd1243dSDimitry Andric .Case("lanai", lanai) 388bdd1243dSDimitry Andric .Case("shave", shave) 389bdd1243dSDimitry Andric .Case("wasm32", wasm32) 390bdd1243dSDimitry Andric .Case("wasm64", wasm64) 391bdd1243dSDimitry Andric .Case("renderscript32", renderscript32) 392bdd1243dSDimitry Andric .Case("renderscript64", renderscript64) 393bdd1243dSDimitry Andric .Case("ve", ve) 394bdd1243dSDimitry Andric .Case("csky", csky) 395bdd1243dSDimitry Andric .Case("loongarch32", loongarch32) 396bdd1243dSDimitry Andric .Case("loongarch64", loongarch64) 397bdd1243dSDimitry Andric .Case("dxil", dxil) 398bdd1243dSDimitry Andric .Case("xtensa", xtensa) 399bdd1243dSDimitry Andric .Default(UnknownArch); 400bdd1243dSDimitry Andric } 401bdd1243dSDimitry Andric 402bdd1243dSDimitry Andric static Triple::ArchType parseARMArch(StringRef ArchName) { 403bdd1243dSDimitry Andric ARM::ISAKind ISA = ARM::parseArchISA(ArchName); 404bdd1243dSDimitry Andric ARM::EndianKind ENDIAN = ARM::parseArchEndian(ArchName); 405bdd1243dSDimitry Andric 406bdd1243dSDimitry Andric Triple::ArchType arch = Triple::UnknownArch; 407bdd1243dSDimitry Andric switch (ENDIAN) { 408bdd1243dSDimitry Andric case ARM::EndianKind::LITTLE: { 409bdd1243dSDimitry Andric switch (ISA) { 410bdd1243dSDimitry Andric case ARM::ISAKind::ARM: 411bdd1243dSDimitry Andric arch = Triple::arm; 412bdd1243dSDimitry Andric break; 413bdd1243dSDimitry Andric case ARM::ISAKind::THUMB: 414bdd1243dSDimitry Andric arch = Triple::thumb; 415bdd1243dSDimitry Andric break; 416bdd1243dSDimitry Andric case ARM::ISAKind::AARCH64: 417bdd1243dSDimitry Andric arch = Triple::aarch64; 418bdd1243dSDimitry Andric break; 419bdd1243dSDimitry Andric case ARM::ISAKind::INVALID: 420bdd1243dSDimitry Andric break; 421bdd1243dSDimitry Andric } 422bdd1243dSDimitry Andric break; 423bdd1243dSDimitry Andric } 424bdd1243dSDimitry Andric case ARM::EndianKind::BIG: { 425bdd1243dSDimitry Andric switch (ISA) { 426bdd1243dSDimitry Andric case ARM::ISAKind::ARM: 427bdd1243dSDimitry Andric arch = Triple::armeb; 428bdd1243dSDimitry Andric break; 429bdd1243dSDimitry Andric case ARM::ISAKind::THUMB: 430bdd1243dSDimitry Andric arch = Triple::thumbeb; 431bdd1243dSDimitry Andric break; 432bdd1243dSDimitry Andric case ARM::ISAKind::AARCH64: 433bdd1243dSDimitry Andric arch = Triple::aarch64_be; 434bdd1243dSDimitry Andric break; 435bdd1243dSDimitry Andric case ARM::ISAKind::INVALID: 436bdd1243dSDimitry Andric break; 437bdd1243dSDimitry Andric } 438bdd1243dSDimitry Andric break; 439bdd1243dSDimitry Andric } 440bdd1243dSDimitry Andric case ARM::EndianKind::INVALID: { 441bdd1243dSDimitry Andric break; 442bdd1243dSDimitry Andric } 443bdd1243dSDimitry Andric } 444bdd1243dSDimitry Andric 445bdd1243dSDimitry Andric ArchName = ARM::getCanonicalArchName(ArchName); 446bdd1243dSDimitry Andric if (ArchName.empty()) 447bdd1243dSDimitry Andric return Triple::UnknownArch; 448bdd1243dSDimitry Andric 449bdd1243dSDimitry Andric // Thumb only exists in v4+ 450bdd1243dSDimitry Andric if (ISA == ARM::ISAKind::THUMB && 451bdd1243dSDimitry Andric (ArchName.startswith("v2") || ArchName.startswith("v3"))) 452bdd1243dSDimitry Andric return Triple::UnknownArch; 453bdd1243dSDimitry Andric 454bdd1243dSDimitry Andric // Thumb only for v6m 455bdd1243dSDimitry Andric ARM::ProfileKind Profile = ARM::parseArchProfile(ArchName); 456bdd1243dSDimitry Andric unsigned Version = ARM::parseArchVersion(ArchName); 457bdd1243dSDimitry Andric if (Profile == ARM::ProfileKind::M && Version == 6) { 458bdd1243dSDimitry Andric if (ENDIAN == ARM::EndianKind::BIG) 459bdd1243dSDimitry Andric return Triple::thumbeb; 460bdd1243dSDimitry Andric else 461bdd1243dSDimitry Andric return Triple::thumb; 462bdd1243dSDimitry Andric } 463bdd1243dSDimitry Andric 464bdd1243dSDimitry Andric return arch; 465bdd1243dSDimitry Andric } 466bdd1243dSDimitry Andric 467bdd1243dSDimitry Andric static Triple::ArchType parseArch(StringRef ArchName) { 468bdd1243dSDimitry Andric auto AT = StringSwitch<Triple::ArchType>(ArchName) 469bdd1243dSDimitry Andric .Cases("i386", "i486", "i586", "i686", Triple::x86) 470bdd1243dSDimitry Andric // FIXME: Do we need to support these? 471bdd1243dSDimitry Andric .Cases("i786", "i886", "i986", Triple::x86) 472bdd1243dSDimitry Andric .Cases("amd64", "x86_64", "x86_64h", Triple::x86_64) 473bdd1243dSDimitry Andric .Cases("powerpc", "powerpcspe", "ppc", "ppc32", Triple::ppc) 474bdd1243dSDimitry Andric .Cases("powerpcle", "ppcle", "ppc32le", Triple::ppcle) 475bdd1243dSDimitry Andric .Cases("powerpc64", "ppu", "ppc64", Triple::ppc64) 476bdd1243dSDimitry Andric .Cases("powerpc64le", "ppc64le", Triple::ppc64le) 477bdd1243dSDimitry Andric .Case("xscale", Triple::arm) 478bdd1243dSDimitry Andric .Case("xscaleeb", Triple::armeb) 479bdd1243dSDimitry Andric .Case("aarch64", Triple::aarch64) 480bdd1243dSDimitry Andric .Case("aarch64_be", Triple::aarch64_be) 481bdd1243dSDimitry Andric .Case("aarch64_32", Triple::aarch64_32) 482bdd1243dSDimitry Andric .Case("arc", Triple::arc) 483bdd1243dSDimitry Andric .Case("arm64", Triple::aarch64) 484bdd1243dSDimitry Andric .Case("arm64_32", Triple::aarch64_32) 485bdd1243dSDimitry Andric .Case("arm64e", Triple::aarch64) 486bdd1243dSDimitry Andric .Case("arm64ec", Triple::aarch64) 487bdd1243dSDimitry Andric .Case("arm", Triple::arm) 488bdd1243dSDimitry Andric .Case("armeb", Triple::armeb) 489bdd1243dSDimitry Andric .Case("thumb", Triple::thumb) 490bdd1243dSDimitry Andric .Case("thumbeb", Triple::thumbeb) 491bdd1243dSDimitry Andric .Case("avr", Triple::avr) 492bdd1243dSDimitry Andric .Case("m68k", Triple::m68k) 493bdd1243dSDimitry Andric .Case("msp430", Triple::msp430) 494bdd1243dSDimitry Andric .Cases("mips", "mipseb", "mipsallegrex", "mipsisa32r6", 495bdd1243dSDimitry Andric "mipsr6", Triple::mips) 496bdd1243dSDimitry Andric .Cases("mipsel", "mipsallegrexel", "mipsisa32r6el", "mipsr6el", 497bdd1243dSDimitry Andric Triple::mipsel) 498bdd1243dSDimitry Andric .Cases("mips64", "mips64eb", "mipsn32", "mipsisa64r6", 499bdd1243dSDimitry Andric "mips64r6", "mipsn32r6", Triple::mips64) 500bdd1243dSDimitry Andric .Cases("mips64el", "mipsn32el", "mipsisa64r6el", "mips64r6el", 501bdd1243dSDimitry Andric "mipsn32r6el", Triple::mips64el) 502bdd1243dSDimitry Andric .Case("r600", Triple::r600) 503bdd1243dSDimitry Andric .Case("amdgcn", Triple::amdgcn) 504bdd1243dSDimitry Andric .Case("riscv32", Triple::riscv32) 505bdd1243dSDimitry Andric .Case("riscv64", Triple::riscv64) 506bdd1243dSDimitry Andric .Case("hexagon", Triple::hexagon) 507bdd1243dSDimitry Andric .Cases("s390x", "systemz", Triple::systemz) 508bdd1243dSDimitry Andric .Case("sparc", Triple::sparc) 509bdd1243dSDimitry Andric .Case("sparcel", Triple::sparcel) 510bdd1243dSDimitry Andric .Cases("sparcv9", "sparc64", Triple::sparcv9) 511bdd1243dSDimitry Andric .Case("tce", Triple::tce) 512bdd1243dSDimitry Andric .Case("tcele", Triple::tcele) 513bdd1243dSDimitry Andric .Case("xcore", Triple::xcore) 514bdd1243dSDimitry Andric .Case("nvptx", Triple::nvptx) 515bdd1243dSDimitry Andric .Case("nvptx64", Triple::nvptx64) 516bdd1243dSDimitry Andric .Case("le32", Triple::le32) 517bdd1243dSDimitry Andric .Case("le64", Triple::le64) 518bdd1243dSDimitry Andric .Case("amdil", Triple::amdil) 519bdd1243dSDimitry Andric .Case("amdil64", Triple::amdil64) 520bdd1243dSDimitry Andric .Case("hsail", Triple::hsail) 521bdd1243dSDimitry Andric .Case("hsail64", Triple::hsail64) 522bdd1243dSDimitry Andric .Case("spir", Triple::spir) 523bdd1243dSDimitry Andric .Case("spir64", Triple::spir64) 524bdd1243dSDimitry Andric .Cases("spirv32", "spirv32v1.0", "spirv32v1.1", "spirv32v1.2", 525bdd1243dSDimitry Andric "spirv32v1.3", "spirv32v1.4", "spirv32v1.5", Triple::spirv32) 526bdd1243dSDimitry Andric .Cases("spirv64", "spirv64v1.0", "spirv64v1.1", "spirv64v1.2", 527bdd1243dSDimitry Andric "spirv64v1.3", "spirv64v1.4", "spirv64v1.5", Triple::spirv64) 528bdd1243dSDimitry Andric .StartsWith("kalimba", Triple::kalimba) 529bdd1243dSDimitry Andric .Case("lanai", Triple::lanai) 530bdd1243dSDimitry Andric .Case("renderscript32", Triple::renderscript32) 531bdd1243dSDimitry Andric .Case("renderscript64", Triple::renderscript64) 532bdd1243dSDimitry Andric .Case("shave", Triple::shave) 533bdd1243dSDimitry Andric .Case("ve", Triple::ve) 534bdd1243dSDimitry Andric .Case("wasm32", Triple::wasm32) 535bdd1243dSDimitry Andric .Case("wasm64", Triple::wasm64) 536bdd1243dSDimitry Andric .Case("csky", Triple::csky) 537bdd1243dSDimitry Andric .Case("loongarch32", Triple::loongarch32) 538bdd1243dSDimitry Andric .Case("loongarch64", Triple::loongarch64) 539bdd1243dSDimitry Andric .Case("dxil", Triple::dxil) 540bdd1243dSDimitry Andric .Case("xtensa", Triple::xtensa) 541bdd1243dSDimitry Andric .Default(Triple::UnknownArch); 542bdd1243dSDimitry Andric 543bdd1243dSDimitry Andric // Some architectures require special parsing logic just to compute the 544bdd1243dSDimitry Andric // ArchType result. 545bdd1243dSDimitry Andric if (AT == Triple::UnknownArch) { 546bdd1243dSDimitry Andric if (ArchName.startswith("arm") || ArchName.startswith("thumb") || 547bdd1243dSDimitry Andric ArchName.startswith("aarch64")) 548bdd1243dSDimitry Andric return parseARMArch(ArchName); 549bdd1243dSDimitry Andric if (ArchName.startswith("bpf")) 550bdd1243dSDimitry Andric return parseBPFArch(ArchName); 551bdd1243dSDimitry Andric } 552bdd1243dSDimitry Andric 553bdd1243dSDimitry Andric return AT; 554bdd1243dSDimitry Andric } 555bdd1243dSDimitry Andric 556bdd1243dSDimitry Andric static Triple::VendorType parseVendor(StringRef VendorName) { 557bdd1243dSDimitry Andric return StringSwitch<Triple::VendorType>(VendorName) 558bdd1243dSDimitry Andric .Case("apple", Triple::Apple) 559bdd1243dSDimitry Andric .Case("pc", Triple::PC) 560bdd1243dSDimitry Andric .Case("scei", Triple::SCEI) 561bdd1243dSDimitry Andric .Case("sie", Triple::SCEI) 562bdd1243dSDimitry Andric .Case("fsl", Triple::Freescale) 563bdd1243dSDimitry Andric .Case("ibm", Triple::IBM) 564bdd1243dSDimitry Andric .Case("img", Triple::ImaginationTechnologies) 565bdd1243dSDimitry Andric .Case("mti", Triple::MipsTechnologies) 566bdd1243dSDimitry Andric .Case("nvidia", Triple::NVIDIA) 567bdd1243dSDimitry Andric .Case("csr", Triple::CSR) 568bdd1243dSDimitry Andric .Case("myriad", Triple::Myriad) 569bdd1243dSDimitry Andric .Case("amd", Triple::AMD) 570bdd1243dSDimitry Andric .Case("mesa", Triple::Mesa) 571bdd1243dSDimitry Andric .Case("suse", Triple::SUSE) 572bdd1243dSDimitry Andric .Case("oe", Triple::OpenEmbedded) 573bdd1243dSDimitry Andric .Default(Triple::UnknownVendor); 574bdd1243dSDimitry Andric } 575bdd1243dSDimitry Andric 576bdd1243dSDimitry Andric static Triple::OSType parseOS(StringRef OSName) { 577bdd1243dSDimitry Andric return StringSwitch<Triple::OSType>(OSName) 578bdd1243dSDimitry Andric .StartsWith("ananas", Triple::Ananas) 579bdd1243dSDimitry Andric .StartsWith("cloudabi", Triple::CloudABI) 580bdd1243dSDimitry Andric .StartsWith("darwin", Triple::Darwin) 581bdd1243dSDimitry Andric .StartsWith("dragonfly", Triple::DragonFly) 582bdd1243dSDimitry Andric .StartsWith("freebsd", Triple::FreeBSD) 583bdd1243dSDimitry Andric .StartsWith("fuchsia", Triple::Fuchsia) 584bdd1243dSDimitry Andric .StartsWith("ios", Triple::IOS) 585bdd1243dSDimitry Andric .StartsWith("kfreebsd", Triple::KFreeBSD) 586bdd1243dSDimitry Andric .StartsWith("linux", Triple::Linux) 587bdd1243dSDimitry Andric .StartsWith("lv2", Triple::Lv2) 588bdd1243dSDimitry Andric .StartsWith("macos", Triple::MacOSX) 589bdd1243dSDimitry Andric .StartsWith("netbsd", Triple::NetBSD) 590bdd1243dSDimitry Andric .StartsWith("openbsd", Triple::OpenBSD) 591bdd1243dSDimitry Andric .StartsWith("solaris", Triple::Solaris) 592*06c3fb27SDimitry Andric .StartsWith("uefi", Triple::UEFI) 593bdd1243dSDimitry Andric .StartsWith("win32", Triple::Win32) 594bdd1243dSDimitry Andric .StartsWith("windows", Triple::Win32) 595bdd1243dSDimitry Andric .StartsWith("zos", Triple::ZOS) 596bdd1243dSDimitry Andric .StartsWith("haiku", Triple::Haiku) 597bdd1243dSDimitry Andric .StartsWith("minix", Triple::Minix) 598bdd1243dSDimitry Andric .StartsWith("rtems", Triple::RTEMS) 599bdd1243dSDimitry Andric .StartsWith("nacl", Triple::NaCl) 600bdd1243dSDimitry Andric .StartsWith("aix", Triple::AIX) 601bdd1243dSDimitry Andric .StartsWith("cuda", Triple::CUDA) 602bdd1243dSDimitry Andric .StartsWith("nvcl", Triple::NVCL) 603bdd1243dSDimitry Andric .StartsWith("amdhsa", Triple::AMDHSA) 604bdd1243dSDimitry Andric .StartsWith("ps4", Triple::PS4) 605bdd1243dSDimitry Andric .StartsWith("ps5", Triple::PS5) 606bdd1243dSDimitry Andric .StartsWith("elfiamcu", Triple::ELFIAMCU) 607bdd1243dSDimitry Andric .StartsWith("tvos", Triple::TvOS) 608bdd1243dSDimitry Andric .StartsWith("watchos", Triple::WatchOS) 609bdd1243dSDimitry Andric .StartsWith("driverkit", Triple::DriverKit) 610bdd1243dSDimitry Andric .StartsWith("mesa3d", Triple::Mesa3D) 611bdd1243dSDimitry Andric .StartsWith("contiki", Triple::Contiki) 612bdd1243dSDimitry Andric .StartsWith("amdpal", Triple::AMDPAL) 613bdd1243dSDimitry Andric .StartsWith("hermit", Triple::HermitCore) 614bdd1243dSDimitry Andric .StartsWith("hurd", Triple::Hurd) 615bdd1243dSDimitry Andric .StartsWith("wasi", Triple::WASI) 616bdd1243dSDimitry Andric .StartsWith("emscripten", Triple::Emscripten) 617bdd1243dSDimitry Andric .StartsWith("shadermodel", Triple::ShaderModel) 618*06c3fb27SDimitry Andric .StartsWith("liteos", Triple::LiteOS) 619bdd1243dSDimitry Andric .Default(Triple::UnknownOS); 620bdd1243dSDimitry Andric } 621bdd1243dSDimitry Andric 622bdd1243dSDimitry Andric static Triple::EnvironmentType parseEnvironment(StringRef EnvironmentName) { 623bdd1243dSDimitry Andric return StringSwitch<Triple::EnvironmentType>(EnvironmentName) 624bdd1243dSDimitry Andric .StartsWith("eabihf", Triple::EABIHF) 625bdd1243dSDimitry Andric .StartsWith("eabi", Triple::EABI) 626bdd1243dSDimitry Andric .StartsWith("gnuabin32", Triple::GNUABIN32) 627bdd1243dSDimitry Andric .StartsWith("gnuabi64", Triple::GNUABI64) 628bdd1243dSDimitry Andric .StartsWith("gnueabihf", Triple::GNUEABIHF) 629bdd1243dSDimitry Andric .StartsWith("gnueabi", Triple::GNUEABI) 630bdd1243dSDimitry Andric .StartsWith("gnuf32", Triple::GNUF32) 631bdd1243dSDimitry Andric .StartsWith("gnuf64", Triple::GNUF64) 632bdd1243dSDimitry Andric .StartsWith("gnusf", Triple::GNUSF) 633bdd1243dSDimitry Andric .StartsWith("gnux32", Triple::GNUX32) 634bdd1243dSDimitry Andric .StartsWith("gnu_ilp32", Triple::GNUILP32) 635bdd1243dSDimitry Andric .StartsWith("code16", Triple::CODE16) 636bdd1243dSDimitry Andric .StartsWith("gnu", Triple::GNU) 637bdd1243dSDimitry Andric .StartsWith("android", Triple::Android) 638bdd1243dSDimitry Andric .StartsWith("musleabihf", Triple::MuslEABIHF) 639bdd1243dSDimitry Andric .StartsWith("musleabi", Triple::MuslEABI) 640bdd1243dSDimitry Andric .StartsWith("muslx32", Triple::MuslX32) 641bdd1243dSDimitry Andric .StartsWith("musl", Triple::Musl) 642bdd1243dSDimitry Andric .StartsWith("msvc", Triple::MSVC) 643bdd1243dSDimitry Andric .StartsWith("itanium", Triple::Itanium) 644bdd1243dSDimitry Andric .StartsWith("cygnus", Triple::Cygnus) 645bdd1243dSDimitry Andric .StartsWith("coreclr", Triple::CoreCLR) 646bdd1243dSDimitry Andric .StartsWith("simulator", Triple::Simulator) 647bdd1243dSDimitry Andric .StartsWith("macabi", Triple::MacABI) 648bdd1243dSDimitry Andric .StartsWith("pixel", Triple::Pixel) 649bdd1243dSDimitry Andric .StartsWith("vertex", Triple::Vertex) 650bdd1243dSDimitry Andric .StartsWith("geometry", Triple::Geometry) 651bdd1243dSDimitry Andric .StartsWith("hull", Triple::Hull) 652bdd1243dSDimitry Andric .StartsWith("domain", Triple::Domain) 653bdd1243dSDimitry Andric .StartsWith("compute", Triple::Compute) 654bdd1243dSDimitry Andric .StartsWith("library", Triple::Library) 655bdd1243dSDimitry Andric .StartsWith("raygeneration", Triple::RayGeneration) 656bdd1243dSDimitry Andric .StartsWith("intersection", Triple::Intersection) 657bdd1243dSDimitry Andric .StartsWith("anyhit", Triple::AnyHit) 658bdd1243dSDimitry Andric .StartsWith("closesthit", Triple::ClosestHit) 659bdd1243dSDimitry Andric .StartsWith("miss", Triple::Miss) 660bdd1243dSDimitry Andric .StartsWith("callable", Triple::Callable) 661bdd1243dSDimitry Andric .StartsWith("mesh", Triple::Mesh) 662bdd1243dSDimitry Andric .StartsWith("amplification", Triple::Amplification) 663*06c3fb27SDimitry Andric .StartsWith("ohos", Triple::OpenHOS) 664bdd1243dSDimitry Andric .Default(Triple::UnknownEnvironment); 665bdd1243dSDimitry Andric } 666bdd1243dSDimitry Andric 667bdd1243dSDimitry Andric static Triple::ObjectFormatType parseFormat(StringRef EnvironmentName) { 668bdd1243dSDimitry Andric return StringSwitch<Triple::ObjectFormatType>(EnvironmentName) 669bdd1243dSDimitry Andric // "xcoff" must come before "coff" because of the order-dependendent 670bdd1243dSDimitry Andric // pattern matching. 671bdd1243dSDimitry Andric .EndsWith("xcoff", Triple::XCOFF) 672bdd1243dSDimitry Andric .EndsWith("coff", Triple::COFF) 673bdd1243dSDimitry Andric .EndsWith("elf", Triple::ELF) 674bdd1243dSDimitry Andric .EndsWith("goff", Triple::GOFF) 675bdd1243dSDimitry Andric .EndsWith("macho", Triple::MachO) 676bdd1243dSDimitry Andric .EndsWith("wasm", Triple::Wasm) 677bdd1243dSDimitry Andric .EndsWith("spirv", Triple::SPIRV) 678bdd1243dSDimitry Andric .Default(Triple::UnknownObjectFormat); 679bdd1243dSDimitry Andric } 680bdd1243dSDimitry Andric 681bdd1243dSDimitry Andric static Triple::SubArchType parseSubArch(StringRef SubArchName) { 682bdd1243dSDimitry Andric if (SubArchName.startswith("mips") && 683bdd1243dSDimitry Andric (SubArchName.endswith("r6el") || SubArchName.endswith("r6"))) 684bdd1243dSDimitry Andric return Triple::MipsSubArch_r6; 685bdd1243dSDimitry Andric 686bdd1243dSDimitry Andric if (SubArchName == "powerpcspe") 687bdd1243dSDimitry Andric return Triple::PPCSubArch_spe; 688bdd1243dSDimitry Andric 689bdd1243dSDimitry Andric if (SubArchName == "arm64e") 690bdd1243dSDimitry Andric return Triple::AArch64SubArch_arm64e; 691bdd1243dSDimitry Andric 692bdd1243dSDimitry Andric if (SubArchName == "arm64ec") 693bdd1243dSDimitry Andric return Triple::AArch64SubArch_arm64ec; 694bdd1243dSDimitry Andric 695bdd1243dSDimitry Andric if (SubArchName.startswith("spirv")) 696bdd1243dSDimitry Andric return StringSwitch<Triple::SubArchType>(SubArchName) 697bdd1243dSDimitry Andric .EndsWith("v1.0", Triple::SPIRVSubArch_v10) 698bdd1243dSDimitry Andric .EndsWith("v1.1", Triple::SPIRVSubArch_v11) 699bdd1243dSDimitry Andric .EndsWith("v1.2", Triple::SPIRVSubArch_v12) 700bdd1243dSDimitry Andric .EndsWith("v1.3", Triple::SPIRVSubArch_v13) 701bdd1243dSDimitry Andric .EndsWith("v1.4", Triple::SPIRVSubArch_v14) 702bdd1243dSDimitry Andric .EndsWith("v1.5", Triple::SPIRVSubArch_v15) 703bdd1243dSDimitry Andric .Default(Triple::NoSubArch); 704bdd1243dSDimitry Andric 705bdd1243dSDimitry Andric StringRef ARMSubArch = ARM::getCanonicalArchName(SubArchName); 706bdd1243dSDimitry Andric 707bdd1243dSDimitry Andric // For now, this is the small part. Early return. 708bdd1243dSDimitry Andric if (ARMSubArch.empty()) 709bdd1243dSDimitry Andric return StringSwitch<Triple::SubArchType>(SubArchName) 710bdd1243dSDimitry Andric .EndsWith("kalimba3", Triple::KalimbaSubArch_v3) 711bdd1243dSDimitry Andric .EndsWith("kalimba4", Triple::KalimbaSubArch_v4) 712bdd1243dSDimitry Andric .EndsWith("kalimba5", Triple::KalimbaSubArch_v5) 713bdd1243dSDimitry Andric .Default(Triple::NoSubArch); 714bdd1243dSDimitry Andric 715bdd1243dSDimitry Andric // ARM sub arch. 716bdd1243dSDimitry Andric switch(ARM::parseArch(ARMSubArch)) { 717bdd1243dSDimitry Andric case ARM::ArchKind::ARMV4: 718bdd1243dSDimitry Andric return Triple::NoSubArch; 719bdd1243dSDimitry Andric case ARM::ArchKind::ARMV4T: 720bdd1243dSDimitry Andric return Triple::ARMSubArch_v4t; 721bdd1243dSDimitry Andric case ARM::ArchKind::ARMV5T: 722bdd1243dSDimitry Andric return Triple::ARMSubArch_v5; 723bdd1243dSDimitry Andric case ARM::ArchKind::ARMV5TE: 724bdd1243dSDimitry Andric case ARM::ArchKind::IWMMXT: 725bdd1243dSDimitry Andric case ARM::ArchKind::IWMMXT2: 726bdd1243dSDimitry Andric case ARM::ArchKind::XSCALE: 727bdd1243dSDimitry Andric case ARM::ArchKind::ARMV5TEJ: 728bdd1243dSDimitry Andric return Triple::ARMSubArch_v5te; 729bdd1243dSDimitry Andric case ARM::ArchKind::ARMV6: 730bdd1243dSDimitry Andric return Triple::ARMSubArch_v6; 731bdd1243dSDimitry Andric case ARM::ArchKind::ARMV6K: 732bdd1243dSDimitry Andric case ARM::ArchKind::ARMV6KZ: 733bdd1243dSDimitry Andric return Triple::ARMSubArch_v6k; 734bdd1243dSDimitry Andric case ARM::ArchKind::ARMV6T2: 735bdd1243dSDimitry Andric return Triple::ARMSubArch_v6t2; 736bdd1243dSDimitry Andric case ARM::ArchKind::ARMV6M: 737bdd1243dSDimitry Andric return Triple::ARMSubArch_v6m; 738bdd1243dSDimitry Andric case ARM::ArchKind::ARMV7A: 739bdd1243dSDimitry Andric case ARM::ArchKind::ARMV7R: 740bdd1243dSDimitry Andric return Triple::ARMSubArch_v7; 741bdd1243dSDimitry Andric case ARM::ArchKind::ARMV7VE: 742bdd1243dSDimitry Andric return Triple::ARMSubArch_v7ve; 743bdd1243dSDimitry Andric case ARM::ArchKind::ARMV7K: 744bdd1243dSDimitry Andric return Triple::ARMSubArch_v7k; 745bdd1243dSDimitry Andric case ARM::ArchKind::ARMV7M: 746bdd1243dSDimitry Andric return Triple::ARMSubArch_v7m; 747bdd1243dSDimitry Andric case ARM::ArchKind::ARMV7S: 748bdd1243dSDimitry Andric return Triple::ARMSubArch_v7s; 749bdd1243dSDimitry Andric case ARM::ArchKind::ARMV7EM: 750bdd1243dSDimitry Andric return Triple::ARMSubArch_v7em; 751bdd1243dSDimitry Andric case ARM::ArchKind::ARMV8A: 752bdd1243dSDimitry Andric return Triple::ARMSubArch_v8; 753bdd1243dSDimitry Andric case ARM::ArchKind::ARMV8_1A: 754bdd1243dSDimitry Andric return Triple::ARMSubArch_v8_1a; 755bdd1243dSDimitry Andric case ARM::ArchKind::ARMV8_2A: 756bdd1243dSDimitry Andric return Triple::ARMSubArch_v8_2a; 757bdd1243dSDimitry Andric case ARM::ArchKind::ARMV8_3A: 758bdd1243dSDimitry Andric return Triple::ARMSubArch_v8_3a; 759bdd1243dSDimitry Andric case ARM::ArchKind::ARMV8_4A: 760bdd1243dSDimitry Andric return Triple::ARMSubArch_v8_4a; 761bdd1243dSDimitry Andric case ARM::ArchKind::ARMV8_5A: 762bdd1243dSDimitry Andric return Triple::ARMSubArch_v8_5a; 763bdd1243dSDimitry Andric case ARM::ArchKind::ARMV8_6A: 764bdd1243dSDimitry Andric return Triple::ARMSubArch_v8_6a; 765bdd1243dSDimitry Andric case ARM::ArchKind::ARMV8_7A: 766bdd1243dSDimitry Andric return Triple::ARMSubArch_v8_7a; 767bdd1243dSDimitry Andric case ARM::ArchKind::ARMV8_8A: 768bdd1243dSDimitry Andric return Triple::ARMSubArch_v8_8a; 769bdd1243dSDimitry Andric case ARM::ArchKind::ARMV8_9A: 770bdd1243dSDimitry Andric return Triple::ARMSubArch_v8_9a; 771bdd1243dSDimitry Andric case ARM::ArchKind::ARMV9A: 772bdd1243dSDimitry Andric return Triple::ARMSubArch_v9; 773bdd1243dSDimitry Andric case ARM::ArchKind::ARMV9_1A: 774bdd1243dSDimitry Andric return Triple::ARMSubArch_v9_1a; 775bdd1243dSDimitry Andric case ARM::ArchKind::ARMV9_2A: 776bdd1243dSDimitry Andric return Triple::ARMSubArch_v9_2a; 777bdd1243dSDimitry Andric case ARM::ArchKind::ARMV9_3A: 778bdd1243dSDimitry Andric return Triple::ARMSubArch_v9_3a; 779bdd1243dSDimitry Andric case ARM::ArchKind::ARMV9_4A: 780bdd1243dSDimitry Andric return Triple::ARMSubArch_v9_4a; 781bdd1243dSDimitry Andric case ARM::ArchKind::ARMV8R: 782bdd1243dSDimitry Andric return Triple::ARMSubArch_v8r; 783bdd1243dSDimitry Andric case ARM::ArchKind::ARMV8MBaseline: 784bdd1243dSDimitry Andric return Triple::ARMSubArch_v8m_baseline; 785bdd1243dSDimitry Andric case ARM::ArchKind::ARMV8MMainline: 786bdd1243dSDimitry Andric return Triple::ARMSubArch_v8m_mainline; 787bdd1243dSDimitry Andric case ARM::ArchKind::ARMV8_1MMainline: 788bdd1243dSDimitry Andric return Triple::ARMSubArch_v8_1m_mainline; 789bdd1243dSDimitry Andric default: 790bdd1243dSDimitry Andric return Triple::NoSubArch; 791bdd1243dSDimitry Andric } 792bdd1243dSDimitry Andric } 793bdd1243dSDimitry Andric 794bdd1243dSDimitry Andric static Triple::ObjectFormatType getDefaultFormat(const Triple &T) { 795bdd1243dSDimitry Andric switch (T.getArch()) { 796bdd1243dSDimitry Andric case Triple::UnknownArch: 797bdd1243dSDimitry Andric case Triple::aarch64: 798bdd1243dSDimitry Andric case Triple::aarch64_32: 799bdd1243dSDimitry Andric case Triple::arm: 800bdd1243dSDimitry Andric case Triple::thumb: 801bdd1243dSDimitry Andric case Triple::x86: 802bdd1243dSDimitry Andric case Triple::x86_64: 803bdd1243dSDimitry Andric if (T.isOSDarwin()) 804bdd1243dSDimitry Andric return Triple::MachO; 805bdd1243dSDimitry Andric else if (T.isOSWindows()) 806bdd1243dSDimitry Andric return Triple::COFF; 807bdd1243dSDimitry Andric return Triple::ELF; 808bdd1243dSDimitry Andric 809bdd1243dSDimitry Andric case Triple::aarch64_be: 810bdd1243dSDimitry Andric case Triple::amdgcn: 811bdd1243dSDimitry Andric case Triple::amdil64: 812bdd1243dSDimitry Andric case Triple::amdil: 813bdd1243dSDimitry Andric case Triple::arc: 814bdd1243dSDimitry Andric case Triple::armeb: 815bdd1243dSDimitry Andric case Triple::avr: 816bdd1243dSDimitry Andric case Triple::bpfeb: 817bdd1243dSDimitry Andric case Triple::bpfel: 818bdd1243dSDimitry Andric case Triple::csky: 819bdd1243dSDimitry Andric case Triple::hexagon: 820bdd1243dSDimitry Andric case Triple::hsail64: 821bdd1243dSDimitry Andric case Triple::hsail: 822bdd1243dSDimitry Andric case Triple::kalimba: 823bdd1243dSDimitry Andric case Triple::lanai: 824bdd1243dSDimitry Andric case Triple::le32: 825bdd1243dSDimitry Andric case Triple::le64: 826bdd1243dSDimitry Andric case Triple::loongarch32: 827bdd1243dSDimitry Andric case Triple::loongarch64: 828bdd1243dSDimitry Andric case Triple::m68k: 829bdd1243dSDimitry Andric case Triple::mips64: 830bdd1243dSDimitry Andric case Triple::mips64el: 831bdd1243dSDimitry Andric case Triple::mips: 832bdd1243dSDimitry Andric case Triple::mipsel: 833bdd1243dSDimitry Andric case Triple::msp430: 834bdd1243dSDimitry Andric case Triple::nvptx64: 835bdd1243dSDimitry Andric case Triple::nvptx: 836bdd1243dSDimitry Andric case Triple::ppc64le: 837bdd1243dSDimitry Andric case Triple::ppcle: 838bdd1243dSDimitry Andric case Triple::r600: 839bdd1243dSDimitry Andric case Triple::renderscript32: 840bdd1243dSDimitry Andric case Triple::renderscript64: 841bdd1243dSDimitry Andric case Triple::riscv32: 842bdd1243dSDimitry Andric case Triple::riscv64: 843bdd1243dSDimitry Andric case Triple::shave: 844bdd1243dSDimitry Andric case Triple::sparc: 845bdd1243dSDimitry Andric case Triple::sparcel: 846bdd1243dSDimitry Andric case Triple::sparcv9: 847bdd1243dSDimitry Andric case Triple::spir64: 848bdd1243dSDimitry Andric case Triple::spir: 849bdd1243dSDimitry Andric case Triple::tce: 850bdd1243dSDimitry Andric case Triple::tcele: 851bdd1243dSDimitry Andric case Triple::thumbeb: 852bdd1243dSDimitry Andric case Triple::ve: 853bdd1243dSDimitry Andric case Triple::xcore: 854bdd1243dSDimitry Andric case Triple::xtensa: 855bdd1243dSDimitry Andric return Triple::ELF; 856bdd1243dSDimitry Andric 857bdd1243dSDimitry Andric case Triple::ppc64: 858bdd1243dSDimitry Andric case Triple::ppc: 859bdd1243dSDimitry Andric if (T.isOSAIX()) 860bdd1243dSDimitry Andric return Triple::XCOFF; 861bdd1243dSDimitry Andric return Triple::ELF; 862bdd1243dSDimitry Andric 863bdd1243dSDimitry Andric case Triple::systemz: 864bdd1243dSDimitry Andric if (T.isOSzOS()) 865bdd1243dSDimitry Andric return Triple::GOFF; 866bdd1243dSDimitry Andric return Triple::ELF; 867bdd1243dSDimitry Andric 868bdd1243dSDimitry Andric case Triple::wasm32: 869bdd1243dSDimitry Andric case Triple::wasm64: 870bdd1243dSDimitry Andric return Triple::Wasm; 871bdd1243dSDimitry Andric 872bdd1243dSDimitry Andric case Triple::spirv32: 873bdd1243dSDimitry Andric case Triple::spirv64: 874bdd1243dSDimitry Andric return Triple::SPIRV; 875bdd1243dSDimitry Andric 876bdd1243dSDimitry Andric case Triple::dxil: 877bdd1243dSDimitry Andric return Triple::DXContainer; 878bdd1243dSDimitry Andric } 879bdd1243dSDimitry Andric llvm_unreachable("unknown architecture"); 880bdd1243dSDimitry Andric } 881bdd1243dSDimitry Andric 882bdd1243dSDimitry Andric /// Construct a triple from the string representation provided. 883bdd1243dSDimitry Andric /// 884bdd1243dSDimitry Andric /// This stores the string representation and parses the various pieces into 885bdd1243dSDimitry Andric /// enum members. 886bdd1243dSDimitry Andric Triple::Triple(const Twine &Str) 887bdd1243dSDimitry Andric : Data(Str.str()), Arch(UnknownArch), SubArch(NoSubArch), 888bdd1243dSDimitry Andric Vendor(UnknownVendor), OS(UnknownOS), Environment(UnknownEnvironment), 889bdd1243dSDimitry Andric ObjectFormat(UnknownObjectFormat) { 890bdd1243dSDimitry Andric // Do minimal parsing by hand here. 891bdd1243dSDimitry Andric SmallVector<StringRef, 4> Components; 892bdd1243dSDimitry Andric StringRef(Data).split(Components, '-', /*MaxSplit*/ 3); 893bdd1243dSDimitry Andric if (Components.size() > 0) { 894bdd1243dSDimitry Andric Arch = parseArch(Components[0]); 895bdd1243dSDimitry Andric SubArch = parseSubArch(Components[0]); 896bdd1243dSDimitry Andric if (Components.size() > 1) { 897bdd1243dSDimitry Andric Vendor = parseVendor(Components[1]); 898bdd1243dSDimitry Andric if (Components.size() > 2) { 899bdd1243dSDimitry Andric OS = parseOS(Components[2]); 900bdd1243dSDimitry Andric if (Components.size() > 3) { 901bdd1243dSDimitry Andric Environment = parseEnvironment(Components[3]); 902bdd1243dSDimitry Andric ObjectFormat = parseFormat(Components[3]); 903bdd1243dSDimitry Andric } 904bdd1243dSDimitry Andric } 905bdd1243dSDimitry Andric } else { 906bdd1243dSDimitry Andric Environment = 907bdd1243dSDimitry Andric StringSwitch<Triple::EnvironmentType>(Components[0]) 908bdd1243dSDimitry Andric .StartsWith("mipsn32", Triple::GNUABIN32) 909bdd1243dSDimitry Andric .StartsWith("mips64", Triple::GNUABI64) 910bdd1243dSDimitry Andric .StartsWith("mipsisa64", Triple::GNUABI64) 911bdd1243dSDimitry Andric .StartsWith("mipsisa32", Triple::GNU) 912bdd1243dSDimitry Andric .Cases("mips", "mipsel", "mipsr6", "mipsr6el", Triple::GNU) 913bdd1243dSDimitry Andric .Default(UnknownEnvironment); 914bdd1243dSDimitry Andric } 915bdd1243dSDimitry Andric } 916bdd1243dSDimitry Andric if (ObjectFormat == UnknownObjectFormat) 917bdd1243dSDimitry Andric ObjectFormat = getDefaultFormat(*this); 918bdd1243dSDimitry Andric } 919bdd1243dSDimitry Andric 920bdd1243dSDimitry Andric /// Construct a triple from string representations of the architecture, 921bdd1243dSDimitry Andric /// vendor, and OS. 922bdd1243dSDimitry Andric /// 923bdd1243dSDimitry Andric /// This joins each argument into a canonical string representation and parses 924bdd1243dSDimitry Andric /// them into enum members. It leaves the environment unknown and omits it from 925bdd1243dSDimitry Andric /// the string representation. 926bdd1243dSDimitry Andric Triple::Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr) 927bdd1243dSDimitry Andric : Data((ArchStr + Twine('-') + VendorStr + Twine('-') + OSStr).str()), 928bdd1243dSDimitry Andric Arch(parseArch(ArchStr.str())), 929bdd1243dSDimitry Andric SubArch(parseSubArch(ArchStr.str())), 930bdd1243dSDimitry Andric Vendor(parseVendor(VendorStr.str())), 931bdd1243dSDimitry Andric OS(parseOS(OSStr.str())), 932bdd1243dSDimitry Andric Environment(), ObjectFormat(Triple::UnknownObjectFormat) { 933bdd1243dSDimitry Andric ObjectFormat = getDefaultFormat(*this); 934bdd1243dSDimitry Andric } 935bdd1243dSDimitry Andric 936bdd1243dSDimitry Andric /// Construct a triple from string representations of the architecture, 937bdd1243dSDimitry Andric /// vendor, OS, and environment. 938bdd1243dSDimitry Andric /// 939bdd1243dSDimitry Andric /// This joins each argument into a canonical string representation and parses 940bdd1243dSDimitry Andric /// them into enum members. 941bdd1243dSDimitry Andric Triple::Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr, 942bdd1243dSDimitry Andric const Twine &EnvironmentStr) 943bdd1243dSDimitry Andric : Data((ArchStr + Twine('-') + VendorStr + Twine('-') + OSStr + Twine('-') + 944bdd1243dSDimitry Andric EnvironmentStr).str()), 945bdd1243dSDimitry Andric Arch(parseArch(ArchStr.str())), 946bdd1243dSDimitry Andric SubArch(parseSubArch(ArchStr.str())), 947bdd1243dSDimitry Andric Vendor(parseVendor(VendorStr.str())), 948bdd1243dSDimitry Andric OS(parseOS(OSStr.str())), 949bdd1243dSDimitry Andric Environment(parseEnvironment(EnvironmentStr.str())), 950bdd1243dSDimitry Andric ObjectFormat(parseFormat(EnvironmentStr.str())) { 951bdd1243dSDimitry Andric if (ObjectFormat == Triple::UnknownObjectFormat) 952bdd1243dSDimitry Andric ObjectFormat = getDefaultFormat(*this); 953bdd1243dSDimitry Andric } 954bdd1243dSDimitry Andric 955bdd1243dSDimitry Andric std::string Triple::normalize(StringRef Str) { 956bdd1243dSDimitry Andric bool IsMinGW32 = false; 957bdd1243dSDimitry Andric bool IsCygwin = false; 958bdd1243dSDimitry Andric 959bdd1243dSDimitry Andric // Parse into components. 960bdd1243dSDimitry Andric SmallVector<StringRef, 4> Components; 961bdd1243dSDimitry Andric Str.split(Components, '-'); 962bdd1243dSDimitry Andric 963bdd1243dSDimitry Andric // If the first component corresponds to a known architecture, preferentially 964bdd1243dSDimitry Andric // use it for the architecture. If the second component corresponds to a 965bdd1243dSDimitry Andric // known vendor, preferentially use it for the vendor, etc. This avoids silly 966bdd1243dSDimitry Andric // component movement when a component parses as (eg) both a valid arch and a 967bdd1243dSDimitry Andric // valid os. 968bdd1243dSDimitry Andric ArchType Arch = UnknownArch; 969bdd1243dSDimitry Andric if (Components.size() > 0) 970bdd1243dSDimitry Andric Arch = parseArch(Components[0]); 971bdd1243dSDimitry Andric VendorType Vendor = UnknownVendor; 972bdd1243dSDimitry Andric if (Components.size() > 1) 973bdd1243dSDimitry Andric Vendor = parseVendor(Components[1]); 974bdd1243dSDimitry Andric OSType OS = UnknownOS; 975bdd1243dSDimitry Andric if (Components.size() > 2) { 976bdd1243dSDimitry Andric OS = parseOS(Components[2]); 977bdd1243dSDimitry Andric IsCygwin = Components[2].startswith("cygwin"); 978bdd1243dSDimitry Andric IsMinGW32 = Components[2].startswith("mingw"); 979bdd1243dSDimitry Andric } 980bdd1243dSDimitry Andric EnvironmentType Environment = UnknownEnvironment; 981bdd1243dSDimitry Andric if (Components.size() > 3) 982bdd1243dSDimitry Andric Environment = parseEnvironment(Components[3]); 983bdd1243dSDimitry Andric ObjectFormatType ObjectFormat = UnknownObjectFormat; 984bdd1243dSDimitry Andric if (Components.size() > 4) 985bdd1243dSDimitry Andric ObjectFormat = parseFormat(Components[4]); 986bdd1243dSDimitry Andric 987bdd1243dSDimitry Andric // Note which components are already in their final position. These will not 988bdd1243dSDimitry Andric // be moved. 989bdd1243dSDimitry Andric bool Found[4]; 990bdd1243dSDimitry Andric Found[0] = Arch != UnknownArch; 991bdd1243dSDimitry Andric Found[1] = Vendor != UnknownVendor; 992bdd1243dSDimitry Andric Found[2] = OS != UnknownOS; 993bdd1243dSDimitry Andric Found[3] = Environment != UnknownEnvironment; 994bdd1243dSDimitry Andric 995bdd1243dSDimitry Andric // If they are not there already, permute the components into their canonical 996bdd1243dSDimitry Andric // positions by seeing if they parse as a valid architecture, and if so moving 997bdd1243dSDimitry Andric // the component to the architecture position etc. 998bdd1243dSDimitry Andric for (unsigned Pos = 0; Pos != std::size(Found); ++Pos) { 999bdd1243dSDimitry Andric if (Found[Pos]) 1000bdd1243dSDimitry Andric continue; // Already in the canonical position. 1001bdd1243dSDimitry Andric 1002bdd1243dSDimitry Andric for (unsigned Idx = 0; Idx != Components.size(); ++Idx) { 1003bdd1243dSDimitry Andric // Do not reparse any components that already matched. 1004bdd1243dSDimitry Andric if (Idx < std::size(Found) && Found[Idx]) 1005bdd1243dSDimitry Andric continue; 1006bdd1243dSDimitry Andric 1007bdd1243dSDimitry Andric // Does this component parse as valid for the target position? 1008bdd1243dSDimitry Andric bool Valid = false; 1009bdd1243dSDimitry Andric StringRef Comp = Components[Idx]; 1010bdd1243dSDimitry Andric switch (Pos) { 1011bdd1243dSDimitry Andric default: llvm_unreachable("unexpected component type!"); 1012bdd1243dSDimitry Andric case 0: 1013bdd1243dSDimitry Andric Arch = parseArch(Comp); 1014bdd1243dSDimitry Andric Valid = Arch != UnknownArch; 1015bdd1243dSDimitry Andric break; 1016bdd1243dSDimitry Andric case 1: 1017bdd1243dSDimitry Andric Vendor = parseVendor(Comp); 1018bdd1243dSDimitry Andric Valid = Vendor != UnknownVendor; 1019bdd1243dSDimitry Andric break; 1020bdd1243dSDimitry Andric case 2: 1021bdd1243dSDimitry Andric OS = parseOS(Comp); 1022bdd1243dSDimitry Andric IsCygwin = Comp.startswith("cygwin"); 1023bdd1243dSDimitry Andric IsMinGW32 = Comp.startswith("mingw"); 1024bdd1243dSDimitry Andric Valid = OS != UnknownOS || IsCygwin || IsMinGW32; 1025bdd1243dSDimitry Andric break; 1026bdd1243dSDimitry Andric case 3: 1027bdd1243dSDimitry Andric Environment = parseEnvironment(Comp); 1028bdd1243dSDimitry Andric Valid = Environment != UnknownEnvironment; 1029bdd1243dSDimitry Andric if (!Valid) { 1030bdd1243dSDimitry Andric ObjectFormat = parseFormat(Comp); 1031bdd1243dSDimitry Andric Valid = ObjectFormat != UnknownObjectFormat; 1032bdd1243dSDimitry Andric } 1033bdd1243dSDimitry Andric break; 1034bdd1243dSDimitry Andric } 1035bdd1243dSDimitry Andric if (!Valid) 1036bdd1243dSDimitry Andric continue; // Nope, try the next component. 1037bdd1243dSDimitry Andric 1038bdd1243dSDimitry Andric // Move the component to the target position, pushing any non-fixed 1039bdd1243dSDimitry Andric // components that are in the way to the right. This tends to give 1040bdd1243dSDimitry Andric // good results in the common cases of a forgotten vendor component 1041bdd1243dSDimitry Andric // or a wrongly positioned environment. 1042bdd1243dSDimitry Andric if (Pos < Idx) { 1043bdd1243dSDimitry Andric // Insert left, pushing the existing components to the right. For 1044bdd1243dSDimitry Andric // example, a-b-i386 -> i386-a-b when moving i386 to the front. 1045bdd1243dSDimitry Andric StringRef CurrentComponent(""); // The empty component. 1046bdd1243dSDimitry Andric // Replace the component we are moving with an empty component. 1047bdd1243dSDimitry Andric std::swap(CurrentComponent, Components[Idx]); 1048bdd1243dSDimitry Andric // Insert the component being moved at Pos, displacing any existing 1049bdd1243dSDimitry Andric // components to the right. 1050bdd1243dSDimitry Andric for (unsigned i = Pos; !CurrentComponent.empty(); ++i) { 1051bdd1243dSDimitry Andric // Skip over any fixed components. 1052bdd1243dSDimitry Andric while (i < std::size(Found) && Found[i]) 1053bdd1243dSDimitry Andric ++i; 1054bdd1243dSDimitry Andric // Place the component at the new position, getting the component 1055bdd1243dSDimitry Andric // that was at this position - it will be moved right. 1056bdd1243dSDimitry Andric std::swap(CurrentComponent, Components[i]); 1057bdd1243dSDimitry Andric } 1058bdd1243dSDimitry Andric } else if (Pos > Idx) { 1059bdd1243dSDimitry Andric // Push right by inserting empty components until the component at Idx 1060bdd1243dSDimitry Andric // reaches the target position Pos. For example, pc-a -> -pc-a when 1061bdd1243dSDimitry Andric // moving pc to the second position. 1062bdd1243dSDimitry Andric do { 1063bdd1243dSDimitry Andric // Insert one empty component at Idx. 1064bdd1243dSDimitry Andric StringRef CurrentComponent(""); // The empty component. 1065bdd1243dSDimitry Andric for (unsigned i = Idx; i < Components.size();) { 1066bdd1243dSDimitry Andric // Place the component at the new position, getting the component 1067bdd1243dSDimitry Andric // that was at this position - it will be moved right. 1068bdd1243dSDimitry Andric std::swap(CurrentComponent, Components[i]); 1069bdd1243dSDimitry Andric // If it was placed on top of an empty component then we are done. 1070bdd1243dSDimitry Andric if (CurrentComponent.empty()) 1071bdd1243dSDimitry Andric break; 1072bdd1243dSDimitry Andric // Advance to the next component, skipping any fixed components. 1073bdd1243dSDimitry Andric while (++i < std::size(Found) && Found[i]) 1074bdd1243dSDimitry Andric ; 1075bdd1243dSDimitry Andric } 1076bdd1243dSDimitry Andric // The last component was pushed off the end - append it. 1077bdd1243dSDimitry Andric if (!CurrentComponent.empty()) 1078bdd1243dSDimitry Andric Components.push_back(CurrentComponent); 1079bdd1243dSDimitry Andric 1080bdd1243dSDimitry Andric // Advance Idx to the component's new position. 1081bdd1243dSDimitry Andric while (++Idx < std::size(Found) && Found[Idx]) 1082bdd1243dSDimitry Andric ; 1083bdd1243dSDimitry Andric } while (Idx < Pos); // Add more until the final position is reached. 1084bdd1243dSDimitry Andric } 1085bdd1243dSDimitry Andric assert(Pos < Components.size() && Components[Pos] == Comp && 1086bdd1243dSDimitry Andric "Component moved wrong!"); 1087bdd1243dSDimitry Andric Found[Pos] = true; 1088bdd1243dSDimitry Andric break; 1089bdd1243dSDimitry Andric } 1090bdd1243dSDimitry Andric } 1091bdd1243dSDimitry Andric 1092bdd1243dSDimitry Andric // Replace empty components with "unknown" value. 1093bdd1243dSDimitry Andric for (StringRef &C : Components) 1094bdd1243dSDimitry Andric if (C.empty()) 1095bdd1243dSDimitry Andric C = "unknown"; 1096bdd1243dSDimitry Andric 1097bdd1243dSDimitry Andric // Special case logic goes here. At this point Arch, Vendor and OS have the 1098bdd1243dSDimitry Andric // correct values for the computed components. 1099bdd1243dSDimitry Andric std::string NormalizedEnvironment; 1100bdd1243dSDimitry Andric if (Environment == Triple::Android && Components[3].startswith("androideabi")) { 1101bdd1243dSDimitry Andric StringRef AndroidVersion = Components[3].drop_front(strlen("androideabi")); 1102bdd1243dSDimitry Andric if (AndroidVersion.empty()) { 1103bdd1243dSDimitry Andric Components[3] = "android"; 1104bdd1243dSDimitry Andric } else { 1105bdd1243dSDimitry Andric NormalizedEnvironment = Twine("android", AndroidVersion).str(); 1106bdd1243dSDimitry Andric Components[3] = NormalizedEnvironment; 1107bdd1243dSDimitry Andric } 1108bdd1243dSDimitry Andric } 1109bdd1243dSDimitry Andric 1110bdd1243dSDimitry Andric // SUSE uses "gnueabi" to mean "gnueabihf" 1111bdd1243dSDimitry Andric if (Vendor == Triple::SUSE && Environment == llvm::Triple::GNUEABI) 1112bdd1243dSDimitry Andric Components[3] = "gnueabihf"; 1113bdd1243dSDimitry Andric 1114bdd1243dSDimitry Andric if (OS == Triple::Win32) { 1115bdd1243dSDimitry Andric Components.resize(4); 1116bdd1243dSDimitry Andric Components[2] = "windows"; 1117bdd1243dSDimitry Andric if (Environment == UnknownEnvironment) { 1118bdd1243dSDimitry Andric if (ObjectFormat == UnknownObjectFormat || ObjectFormat == Triple::COFF) 1119bdd1243dSDimitry Andric Components[3] = "msvc"; 1120bdd1243dSDimitry Andric else 1121bdd1243dSDimitry Andric Components[3] = getObjectFormatTypeName(ObjectFormat); 1122bdd1243dSDimitry Andric } 1123bdd1243dSDimitry Andric } else if (IsMinGW32) { 1124bdd1243dSDimitry Andric Components.resize(4); 1125bdd1243dSDimitry Andric Components[2] = "windows"; 1126bdd1243dSDimitry Andric Components[3] = "gnu"; 1127bdd1243dSDimitry Andric } else if (IsCygwin) { 1128bdd1243dSDimitry Andric Components.resize(4); 1129bdd1243dSDimitry Andric Components[2] = "windows"; 1130bdd1243dSDimitry Andric Components[3] = "cygnus"; 1131bdd1243dSDimitry Andric } 1132bdd1243dSDimitry Andric if (IsMinGW32 || IsCygwin || 1133bdd1243dSDimitry Andric (OS == Triple::Win32 && Environment != UnknownEnvironment)) { 1134bdd1243dSDimitry Andric if (ObjectFormat != UnknownObjectFormat && ObjectFormat != Triple::COFF) { 1135bdd1243dSDimitry Andric Components.resize(5); 1136bdd1243dSDimitry Andric Components[4] = getObjectFormatTypeName(ObjectFormat); 1137bdd1243dSDimitry Andric } 1138bdd1243dSDimitry Andric } 1139bdd1243dSDimitry Andric 1140bdd1243dSDimitry Andric // Stick the corrected components back together to form the normalized string. 1141bdd1243dSDimitry Andric return join(Components, "-"); 1142bdd1243dSDimitry Andric } 1143bdd1243dSDimitry Andric 1144bdd1243dSDimitry Andric StringRef Triple::getArchName() const { 1145bdd1243dSDimitry Andric return StringRef(Data).split('-').first; // Isolate first component 1146bdd1243dSDimitry Andric } 1147bdd1243dSDimitry Andric 1148bdd1243dSDimitry Andric StringRef Triple::getArchName(ArchType Kind, SubArchType SubArch) const { 1149bdd1243dSDimitry Andric switch (Kind) { 1150bdd1243dSDimitry Andric case Triple::mips: 1151bdd1243dSDimitry Andric if (SubArch == MipsSubArch_r6) 1152bdd1243dSDimitry Andric return "mipsisa32r6"; 1153bdd1243dSDimitry Andric break; 1154bdd1243dSDimitry Andric case Triple::mipsel: 1155bdd1243dSDimitry Andric if (SubArch == MipsSubArch_r6) 1156bdd1243dSDimitry Andric return "mipsisa32r6el"; 1157bdd1243dSDimitry Andric break; 1158bdd1243dSDimitry Andric case Triple::mips64: 1159bdd1243dSDimitry Andric if (SubArch == MipsSubArch_r6) 1160bdd1243dSDimitry Andric return "mipsisa64r6"; 1161bdd1243dSDimitry Andric break; 1162bdd1243dSDimitry Andric case Triple::mips64el: 1163bdd1243dSDimitry Andric if (SubArch == MipsSubArch_r6) 1164bdd1243dSDimitry Andric return "mipsisa64r6el"; 1165bdd1243dSDimitry Andric break; 1166bdd1243dSDimitry Andric case Triple::aarch64: 1167bdd1243dSDimitry Andric if (SubArch == AArch64SubArch_arm64ec) 1168bdd1243dSDimitry Andric return "arm64ec"; 1169bdd1243dSDimitry Andric break; 1170bdd1243dSDimitry Andric default: 1171bdd1243dSDimitry Andric break; 1172bdd1243dSDimitry Andric } 1173bdd1243dSDimitry Andric return getArchTypeName(Kind); 1174bdd1243dSDimitry Andric } 1175bdd1243dSDimitry Andric 1176bdd1243dSDimitry Andric StringRef Triple::getVendorName() const { 1177bdd1243dSDimitry Andric StringRef Tmp = StringRef(Data).split('-').second; // Strip first component 1178bdd1243dSDimitry Andric return Tmp.split('-').first; // Isolate second component 1179bdd1243dSDimitry Andric } 1180bdd1243dSDimitry Andric 1181bdd1243dSDimitry Andric StringRef Triple::getOSName() const { 1182bdd1243dSDimitry Andric StringRef Tmp = StringRef(Data).split('-').second; // Strip first component 1183bdd1243dSDimitry Andric Tmp = Tmp.split('-').second; // Strip second component 1184bdd1243dSDimitry Andric return Tmp.split('-').first; // Isolate third component 1185bdd1243dSDimitry Andric } 1186bdd1243dSDimitry Andric 1187bdd1243dSDimitry Andric StringRef Triple::getEnvironmentName() const { 1188bdd1243dSDimitry Andric StringRef Tmp = StringRef(Data).split('-').second; // Strip first component 1189bdd1243dSDimitry Andric Tmp = Tmp.split('-').second; // Strip second component 1190bdd1243dSDimitry Andric return Tmp.split('-').second; // Strip third component 1191bdd1243dSDimitry Andric } 1192bdd1243dSDimitry Andric 1193bdd1243dSDimitry Andric StringRef Triple::getOSAndEnvironmentName() const { 1194bdd1243dSDimitry Andric StringRef Tmp = StringRef(Data).split('-').second; // Strip first component 1195bdd1243dSDimitry Andric return Tmp.split('-').second; // Strip second component 1196bdd1243dSDimitry Andric } 1197bdd1243dSDimitry Andric 1198bdd1243dSDimitry Andric static VersionTuple parseVersionFromName(StringRef Name) { 1199bdd1243dSDimitry Andric VersionTuple Version; 1200bdd1243dSDimitry Andric Version.tryParse(Name); 1201bdd1243dSDimitry Andric return Version.withoutBuild(); 1202bdd1243dSDimitry Andric } 1203bdd1243dSDimitry Andric 1204bdd1243dSDimitry Andric VersionTuple Triple::getEnvironmentVersion() const { 1205bdd1243dSDimitry Andric StringRef EnvironmentName = getEnvironmentName(); 1206bdd1243dSDimitry Andric StringRef EnvironmentTypeName = getEnvironmentTypeName(getEnvironment()); 1207bdd1243dSDimitry Andric if (EnvironmentName.startswith(EnvironmentTypeName)) 1208bdd1243dSDimitry Andric EnvironmentName = EnvironmentName.substr(EnvironmentTypeName.size()); 1209bdd1243dSDimitry Andric 1210bdd1243dSDimitry Andric return parseVersionFromName(EnvironmentName); 1211bdd1243dSDimitry Andric } 1212bdd1243dSDimitry Andric 1213bdd1243dSDimitry Andric VersionTuple Triple::getOSVersion() const { 1214bdd1243dSDimitry Andric StringRef OSName = getOSName(); 1215bdd1243dSDimitry Andric // Assume that the OS portion of the triple starts with the canonical name. 1216bdd1243dSDimitry Andric StringRef OSTypeName = getOSTypeName(getOS()); 1217bdd1243dSDimitry Andric if (OSName.startswith(OSTypeName)) 1218bdd1243dSDimitry Andric OSName = OSName.substr(OSTypeName.size()); 1219bdd1243dSDimitry Andric else if (getOS() == MacOSX) 1220bdd1243dSDimitry Andric OSName.consume_front("macos"); 1221bdd1243dSDimitry Andric 1222bdd1243dSDimitry Andric return parseVersionFromName(OSName); 1223bdd1243dSDimitry Andric } 1224bdd1243dSDimitry Andric 1225bdd1243dSDimitry Andric bool Triple::getMacOSXVersion(VersionTuple &Version) const { 1226bdd1243dSDimitry Andric Version = getOSVersion(); 1227bdd1243dSDimitry Andric 1228bdd1243dSDimitry Andric switch (getOS()) { 1229bdd1243dSDimitry Andric default: llvm_unreachable("unexpected OS for Darwin triple"); 1230bdd1243dSDimitry Andric case Darwin: 1231bdd1243dSDimitry Andric // Default to darwin8, i.e., MacOSX 10.4. 1232bdd1243dSDimitry Andric if (Version.getMajor() == 0) 1233bdd1243dSDimitry Andric Version = VersionTuple(8); 1234bdd1243dSDimitry Andric // Darwin version numbers are skewed from OS X versions. 1235bdd1243dSDimitry Andric if (Version.getMajor() < 4) { 1236bdd1243dSDimitry Andric return false; 1237bdd1243dSDimitry Andric } 1238bdd1243dSDimitry Andric if (Version.getMajor() <= 19) { 1239bdd1243dSDimitry Andric Version = VersionTuple(10, Version.getMajor() - 4); 1240bdd1243dSDimitry Andric } else { 1241bdd1243dSDimitry Andric // darwin20+ corresponds to macOS 11+. 1242bdd1243dSDimitry Andric Version = VersionTuple(11 + Version.getMajor() - 20); 1243bdd1243dSDimitry Andric } 1244bdd1243dSDimitry Andric break; 1245bdd1243dSDimitry Andric case MacOSX: 1246bdd1243dSDimitry Andric // Default to 10.4. 1247bdd1243dSDimitry Andric if (Version.getMajor() == 0) { 1248bdd1243dSDimitry Andric Version = VersionTuple(10, 4); 1249bdd1243dSDimitry Andric } else if (Version.getMajor() < 10) { 1250bdd1243dSDimitry Andric return false; 1251bdd1243dSDimitry Andric } 1252bdd1243dSDimitry Andric break; 1253bdd1243dSDimitry Andric case IOS: 1254bdd1243dSDimitry Andric case TvOS: 1255bdd1243dSDimitry Andric case WatchOS: 1256bdd1243dSDimitry Andric // Ignore the version from the triple. This is only handled because the 1257bdd1243dSDimitry Andric // the clang driver combines OS X and IOS support into a common Darwin 1258bdd1243dSDimitry Andric // toolchain that wants to know the OS X version number even when targeting 1259bdd1243dSDimitry Andric // IOS. 1260bdd1243dSDimitry Andric Version = VersionTuple(10, 4); 1261bdd1243dSDimitry Andric break; 1262bdd1243dSDimitry Andric case DriverKit: 1263bdd1243dSDimitry Andric llvm_unreachable("OSX version isn't relevant for DriverKit"); 1264bdd1243dSDimitry Andric } 1265bdd1243dSDimitry Andric return true; 1266bdd1243dSDimitry Andric } 1267bdd1243dSDimitry Andric 1268bdd1243dSDimitry Andric VersionTuple Triple::getiOSVersion() const { 1269bdd1243dSDimitry Andric switch (getOS()) { 1270bdd1243dSDimitry Andric default: llvm_unreachable("unexpected OS for Darwin triple"); 1271bdd1243dSDimitry Andric case Darwin: 1272bdd1243dSDimitry Andric case MacOSX: 1273bdd1243dSDimitry Andric // Ignore the version from the triple. This is only handled because the 1274bdd1243dSDimitry Andric // the clang driver combines OS X and IOS support into a common Darwin 1275bdd1243dSDimitry Andric // toolchain that wants to know the iOS version number even when targeting 1276bdd1243dSDimitry Andric // OS X. 1277bdd1243dSDimitry Andric return VersionTuple(5); 1278bdd1243dSDimitry Andric case IOS: 1279bdd1243dSDimitry Andric case TvOS: { 1280bdd1243dSDimitry Andric VersionTuple Version = getOSVersion(); 1281bdd1243dSDimitry Andric // Default to 5.0 (or 7.0 for arm64). 1282bdd1243dSDimitry Andric if (Version.getMajor() == 0) 1283bdd1243dSDimitry Andric return (getArch() == aarch64) ? VersionTuple(7) : VersionTuple(5); 1284bdd1243dSDimitry Andric return Version; 1285bdd1243dSDimitry Andric } 1286bdd1243dSDimitry Andric case WatchOS: 1287bdd1243dSDimitry Andric llvm_unreachable("conflicting triple info"); 1288bdd1243dSDimitry Andric case DriverKit: 1289bdd1243dSDimitry Andric llvm_unreachable("DriverKit doesn't have an iOS version"); 1290bdd1243dSDimitry Andric } 1291bdd1243dSDimitry Andric } 1292bdd1243dSDimitry Andric 1293bdd1243dSDimitry Andric VersionTuple Triple::getWatchOSVersion() const { 1294bdd1243dSDimitry Andric switch (getOS()) { 1295bdd1243dSDimitry Andric default: llvm_unreachable("unexpected OS for Darwin triple"); 1296bdd1243dSDimitry Andric case Darwin: 1297bdd1243dSDimitry Andric case MacOSX: 1298bdd1243dSDimitry Andric // Ignore the version from the triple. This is only handled because the 1299bdd1243dSDimitry Andric // the clang driver combines OS X and IOS support into a common Darwin 1300bdd1243dSDimitry Andric // toolchain that wants to know the iOS version number even when targeting 1301bdd1243dSDimitry Andric // OS X. 1302bdd1243dSDimitry Andric return VersionTuple(2); 1303bdd1243dSDimitry Andric case WatchOS: { 1304bdd1243dSDimitry Andric VersionTuple Version = getOSVersion(); 1305bdd1243dSDimitry Andric if (Version.getMajor() == 0) 1306bdd1243dSDimitry Andric return VersionTuple(2); 1307bdd1243dSDimitry Andric return Version; 1308bdd1243dSDimitry Andric } 1309bdd1243dSDimitry Andric case IOS: 1310bdd1243dSDimitry Andric llvm_unreachable("conflicting triple info"); 1311bdd1243dSDimitry Andric case DriverKit: 1312bdd1243dSDimitry Andric llvm_unreachable("DriverKit doesn't have a WatchOS version"); 1313bdd1243dSDimitry Andric } 1314bdd1243dSDimitry Andric } 1315bdd1243dSDimitry Andric 1316bdd1243dSDimitry Andric VersionTuple Triple::getDriverKitVersion() const { 1317bdd1243dSDimitry Andric switch (getOS()) { 1318bdd1243dSDimitry Andric default: 1319bdd1243dSDimitry Andric llvm_unreachable("unexpected OS for Darwin triple"); 1320bdd1243dSDimitry Andric case DriverKit: 1321bdd1243dSDimitry Andric VersionTuple Version = getOSVersion(); 1322bdd1243dSDimitry Andric if (Version.getMajor() == 0) 1323bdd1243dSDimitry Andric return Version.withMajorReplaced(19); 1324bdd1243dSDimitry Andric return Version; 1325bdd1243dSDimitry Andric } 1326bdd1243dSDimitry Andric } 1327bdd1243dSDimitry Andric 1328bdd1243dSDimitry Andric void Triple::setTriple(const Twine &Str) { 1329bdd1243dSDimitry Andric *this = Triple(Str); 1330bdd1243dSDimitry Andric } 1331bdd1243dSDimitry Andric 1332bdd1243dSDimitry Andric void Triple::setArch(ArchType Kind, SubArchType SubArch) { 1333bdd1243dSDimitry Andric setArchName(getArchName(Kind, SubArch)); 1334bdd1243dSDimitry Andric } 1335bdd1243dSDimitry Andric 1336bdd1243dSDimitry Andric void Triple::setVendor(VendorType Kind) { 1337bdd1243dSDimitry Andric setVendorName(getVendorTypeName(Kind)); 1338bdd1243dSDimitry Andric } 1339bdd1243dSDimitry Andric 1340bdd1243dSDimitry Andric void Triple::setOS(OSType Kind) { 1341bdd1243dSDimitry Andric setOSName(getOSTypeName(Kind)); 1342bdd1243dSDimitry Andric } 1343bdd1243dSDimitry Andric 1344bdd1243dSDimitry Andric void Triple::setEnvironment(EnvironmentType Kind) { 1345bdd1243dSDimitry Andric if (ObjectFormat == getDefaultFormat(*this)) 1346bdd1243dSDimitry Andric return setEnvironmentName(getEnvironmentTypeName(Kind)); 1347bdd1243dSDimitry Andric 1348bdd1243dSDimitry Andric setEnvironmentName((getEnvironmentTypeName(Kind) + Twine("-") + 1349bdd1243dSDimitry Andric getObjectFormatTypeName(ObjectFormat)).str()); 1350bdd1243dSDimitry Andric } 1351bdd1243dSDimitry Andric 1352bdd1243dSDimitry Andric void Triple::setObjectFormat(ObjectFormatType Kind) { 1353bdd1243dSDimitry Andric if (Environment == UnknownEnvironment) 1354bdd1243dSDimitry Andric return setEnvironmentName(getObjectFormatTypeName(Kind)); 1355bdd1243dSDimitry Andric 1356bdd1243dSDimitry Andric setEnvironmentName((getEnvironmentTypeName(Environment) + Twine("-") + 1357bdd1243dSDimitry Andric getObjectFormatTypeName(Kind)).str()); 1358bdd1243dSDimitry Andric } 1359bdd1243dSDimitry Andric 1360bdd1243dSDimitry Andric void Triple::setArchName(StringRef Str) { 1361bdd1243dSDimitry Andric // Work around a miscompilation bug for Twines in gcc 4.0.3. 1362bdd1243dSDimitry Andric SmallString<64> Triple; 1363bdd1243dSDimitry Andric Triple += Str; 1364bdd1243dSDimitry Andric Triple += "-"; 1365bdd1243dSDimitry Andric Triple += getVendorName(); 1366bdd1243dSDimitry Andric Triple += "-"; 1367bdd1243dSDimitry Andric Triple += getOSAndEnvironmentName(); 1368bdd1243dSDimitry Andric setTriple(Triple); 1369bdd1243dSDimitry Andric } 1370bdd1243dSDimitry Andric 1371bdd1243dSDimitry Andric void Triple::setVendorName(StringRef Str) { 1372bdd1243dSDimitry Andric setTriple(getArchName() + "-" + Str + "-" + getOSAndEnvironmentName()); 1373bdd1243dSDimitry Andric } 1374bdd1243dSDimitry Andric 1375bdd1243dSDimitry Andric void Triple::setOSName(StringRef Str) { 1376bdd1243dSDimitry Andric if (hasEnvironment()) 1377bdd1243dSDimitry Andric setTriple(getArchName() + "-" + getVendorName() + "-" + Str + 1378bdd1243dSDimitry Andric "-" + getEnvironmentName()); 1379bdd1243dSDimitry Andric else 1380bdd1243dSDimitry Andric setTriple(getArchName() + "-" + getVendorName() + "-" + Str); 1381bdd1243dSDimitry Andric } 1382bdd1243dSDimitry Andric 1383bdd1243dSDimitry Andric void Triple::setEnvironmentName(StringRef Str) { 1384bdd1243dSDimitry Andric setTriple(getArchName() + "-" + getVendorName() + "-" + getOSName() + 1385bdd1243dSDimitry Andric "-" + Str); 1386bdd1243dSDimitry Andric } 1387bdd1243dSDimitry Andric 1388bdd1243dSDimitry Andric void Triple::setOSAndEnvironmentName(StringRef Str) { 1389bdd1243dSDimitry Andric setTriple(getArchName() + "-" + getVendorName() + "-" + Str); 1390bdd1243dSDimitry Andric } 1391bdd1243dSDimitry Andric 1392bdd1243dSDimitry Andric static unsigned getArchPointerBitWidth(llvm::Triple::ArchType Arch) { 1393bdd1243dSDimitry Andric switch (Arch) { 1394bdd1243dSDimitry Andric case llvm::Triple::UnknownArch: 1395bdd1243dSDimitry Andric return 0; 1396bdd1243dSDimitry Andric 1397bdd1243dSDimitry Andric case llvm::Triple::avr: 1398bdd1243dSDimitry Andric case llvm::Triple::msp430: 1399bdd1243dSDimitry Andric return 16; 1400bdd1243dSDimitry Andric 1401bdd1243dSDimitry Andric case llvm::Triple::aarch64_32: 1402bdd1243dSDimitry Andric case llvm::Triple::amdil: 1403bdd1243dSDimitry Andric case llvm::Triple::arc: 1404bdd1243dSDimitry Andric case llvm::Triple::arm: 1405bdd1243dSDimitry Andric case llvm::Triple::armeb: 1406bdd1243dSDimitry Andric case llvm::Triple::csky: 1407bdd1243dSDimitry Andric case llvm::Triple::dxil: 1408bdd1243dSDimitry Andric case llvm::Triple::hexagon: 1409bdd1243dSDimitry Andric case llvm::Triple::hsail: 1410bdd1243dSDimitry Andric case llvm::Triple::kalimba: 1411bdd1243dSDimitry Andric case llvm::Triple::lanai: 1412bdd1243dSDimitry Andric case llvm::Triple::le32: 1413bdd1243dSDimitry Andric case llvm::Triple::loongarch32: 1414bdd1243dSDimitry Andric case llvm::Triple::m68k: 1415bdd1243dSDimitry Andric case llvm::Triple::mips: 1416bdd1243dSDimitry Andric case llvm::Triple::mipsel: 1417bdd1243dSDimitry Andric case llvm::Triple::nvptx: 1418bdd1243dSDimitry Andric case llvm::Triple::ppc: 1419bdd1243dSDimitry Andric case llvm::Triple::ppcle: 1420bdd1243dSDimitry Andric case llvm::Triple::r600: 1421bdd1243dSDimitry Andric case llvm::Triple::renderscript32: 1422bdd1243dSDimitry Andric case llvm::Triple::riscv32: 1423bdd1243dSDimitry Andric case llvm::Triple::shave: 1424bdd1243dSDimitry Andric case llvm::Triple::sparc: 1425bdd1243dSDimitry Andric case llvm::Triple::sparcel: 1426bdd1243dSDimitry Andric case llvm::Triple::spir: 1427bdd1243dSDimitry Andric case llvm::Triple::spirv32: 1428bdd1243dSDimitry Andric case llvm::Triple::tce: 1429bdd1243dSDimitry Andric case llvm::Triple::tcele: 1430bdd1243dSDimitry Andric case llvm::Triple::thumb: 1431bdd1243dSDimitry Andric case llvm::Triple::thumbeb: 1432bdd1243dSDimitry Andric case llvm::Triple::wasm32: 1433bdd1243dSDimitry Andric case llvm::Triple::x86: 1434bdd1243dSDimitry Andric case llvm::Triple::xcore: 1435bdd1243dSDimitry Andric case llvm::Triple::xtensa: 1436bdd1243dSDimitry Andric return 32; 1437bdd1243dSDimitry Andric 1438bdd1243dSDimitry Andric case llvm::Triple::aarch64: 1439bdd1243dSDimitry Andric case llvm::Triple::aarch64_be: 1440bdd1243dSDimitry Andric case llvm::Triple::amdgcn: 1441bdd1243dSDimitry Andric case llvm::Triple::amdil64: 1442bdd1243dSDimitry Andric case llvm::Triple::bpfeb: 1443bdd1243dSDimitry Andric case llvm::Triple::bpfel: 1444bdd1243dSDimitry Andric case llvm::Triple::hsail64: 1445bdd1243dSDimitry Andric case llvm::Triple::le64: 1446bdd1243dSDimitry Andric case llvm::Triple::loongarch64: 1447bdd1243dSDimitry Andric case llvm::Triple::mips64: 1448bdd1243dSDimitry Andric case llvm::Triple::mips64el: 1449bdd1243dSDimitry Andric case llvm::Triple::nvptx64: 1450bdd1243dSDimitry Andric case llvm::Triple::ppc64: 1451bdd1243dSDimitry Andric case llvm::Triple::ppc64le: 1452bdd1243dSDimitry Andric case llvm::Triple::renderscript64: 1453bdd1243dSDimitry Andric case llvm::Triple::riscv64: 1454bdd1243dSDimitry Andric case llvm::Triple::sparcv9: 1455bdd1243dSDimitry Andric case llvm::Triple::spir64: 1456bdd1243dSDimitry Andric case llvm::Triple::spirv64: 1457bdd1243dSDimitry Andric case llvm::Triple::systemz: 1458bdd1243dSDimitry Andric case llvm::Triple::ve: 1459bdd1243dSDimitry Andric case llvm::Triple::wasm64: 1460bdd1243dSDimitry Andric case llvm::Triple::x86_64: 1461bdd1243dSDimitry Andric return 64; 1462bdd1243dSDimitry Andric } 1463bdd1243dSDimitry Andric llvm_unreachable("Invalid architecture value"); 1464bdd1243dSDimitry Andric } 1465bdd1243dSDimitry Andric 1466bdd1243dSDimitry Andric bool Triple::isArch64Bit() const { 1467bdd1243dSDimitry Andric return getArchPointerBitWidth(getArch()) == 64; 1468bdd1243dSDimitry Andric } 1469bdd1243dSDimitry Andric 1470bdd1243dSDimitry Andric bool Triple::isArch32Bit() const { 1471bdd1243dSDimitry Andric return getArchPointerBitWidth(getArch()) == 32; 1472bdd1243dSDimitry Andric } 1473bdd1243dSDimitry Andric 1474bdd1243dSDimitry Andric bool Triple::isArch16Bit() const { 1475bdd1243dSDimitry Andric return getArchPointerBitWidth(getArch()) == 16; 1476bdd1243dSDimitry Andric } 1477bdd1243dSDimitry Andric 1478bdd1243dSDimitry Andric Triple Triple::get32BitArchVariant() const { 1479bdd1243dSDimitry Andric Triple T(*this); 1480bdd1243dSDimitry Andric switch (getArch()) { 1481bdd1243dSDimitry Andric case Triple::UnknownArch: 1482bdd1243dSDimitry Andric case Triple::amdgcn: 1483bdd1243dSDimitry Andric case Triple::avr: 1484bdd1243dSDimitry Andric case Triple::bpfeb: 1485bdd1243dSDimitry Andric case Triple::bpfel: 1486bdd1243dSDimitry Andric case Triple::msp430: 1487bdd1243dSDimitry Andric case Triple::systemz: 1488bdd1243dSDimitry Andric case Triple::ve: 1489bdd1243dSDimitry Andric T.setArch(UnknownArch); 1490bdd1243dSDimitry Andric break; 1491bdd1243dSDimitry Andric 1492bdd1243dSDimitry Andric case Triple::aarch64_32: 1493bdd1243dSDimitry Andric case Triple::amdil: 1494bdd1243dSDimitry Andric case Triple::arc: 1495bdd1243dSDimitry Andric case Triple::arm: 1496bdd1243dSDimitry Andric case Triple::armeb: 1497bdd1243dSDimitry Andric case Triple::csky: 1498bdd1243dSDimitry Andric case Triple::dxil: 1499bdd1243dSDimitry Andric case Triple::hexagon: 1500bdd1243dSDimitry Andric case Triple::hsail: 1501bdd1243dSDimitry Andric case Triple::kalimba: 1502bdd1243dSDimitry Andric case Triple::lanai: 1503bdd1243dSDimitry Andric case Triple::le32: 1504bdd1243dSDimitry Andric case Triple::loongarch32: 1505bdd1243dSDimitry Andric case Triple::m68k: 1506bdd1243dSDimitry Andric case Triple::mips: 1507bdd1243dSDimitry Andric case Triple::mipsel: 1508bdd1243dSDimitry Andric case Triple::nvptx: 1509bdd1243dSDimitry Andric case Triple::ppc: 1510bdd1243dSDimitry Andric case Triple::ppcle: 1511bdd1243dSDimitry Andric case Triple::r600: 1512bdd1243dSDimitry Andric case Triple::renderscript32: 1513bdd1243dSDimitry Andric case Triple::riscv32: 1514bdd1243dSDimitry Andric case Triple::shave: 1515bdd1243dSDimitry Andric case Triple::sparc: 1516bdd1243dSDimitry Andric case Triple::sparcel: 1517bdd1243dSDimitry Andric case Triple::spir: 1518bdd1243dSDimitry Andric case Triple::spirv32: 1519bdd1243dSDimitry Andric case Triple::tce: 1520bdd1243dSDimitry Andric case Triple::tcele: 1521bdd1243dSDimitry Andric case Triple::thumb: 1522bdd1243dSDimitry Andric case Triple::thumbeb: 1523bdd1243dSDimitry Andric case Triple::wasm32: 1524bdd1243dSDimitry Andric case Triple::x86: 1525bdd1243dSDimitry Andric case Triple::xcore: 1526bdd1243dSDimitry Andric case Triple::xtensa: 1527bdd1243dSDimitry Andric // Already 32-bit. 1528bdd1243dSDimitry Andric break; 1529bdd1243dSDimitry Andric 1530bdd1243dSDimitry Andric case Triple::aarch64: T.setArch(Triple::arm); break; 1531bdd1243dSDimitry Andric case Triple::aarch64_be: T.setArch(Triple::armeb); break; 1532bdd1243dSDimitry Andric case Triple::amdil64: T.setArch(Triple::amdil); break; 1533bdd1243dSDimitry Andric case Triple::hsail64: T.setArch(Triple::hsail); break; 1534bdd1243dSDimitry Andric case Triple::le64: T.setArch(Triple::le32); break; 1535bdd1243dSDimitry Andric case Triple::loongarch64: T.setArch(Triple::loongarch32); break; 1536bdd1243dSDimitry Andric case Triple::mips64: 1537bdd1243dSDimitry Andric T.setArch(Triple::mips, getSubArch()); 1538bdd1243dSDimitry Andric break; 1539bdd1243dSDimitry Andric case Triple::mips64el: 1540bdd1243dSDimitry Andric T.setArch(Triple::mipsel, getSubArch()); 1541bdd1243dSDimitry Andric break; 1542bdd1243dSDimitry Andric case Triple::nvptx64: T.setArch(Triple::nvptx); break; 1543bdd1243dSDimitry Andric case Triple::ppc64: T.setArch(Triple::ppc); break; 1544bdd1243dSDimitry Andric case Triple::ppc64le: T.setArch(Triple::ppcle); break; 1545bdd1243dSDimitry Andric case Triple::renderscript64: T.setArch(Triple::renderscript32); break; 1546bdd1243dSDimitry Andric case Triple::riscv64: T.setArch(Triple::riscv32); break; 1547bdd1243dSDimitry Andric case Triple::sparcv9: T.setArch(Triple::sparc); break; 1548bdd1243dSDimitry Andric case Triple::spir64: T.setArch(Triple::spir); break; 1549bdd1243dSDimitry Andric case Triple::spirv64: 1550bdd1243dSDimitry Andric T.setArch(Triple::spirv32, getSubArch()); 1551bdd1243dSDimitry Andric break; 1552bdd1243dSDimitry Andric case Triple::wasm64: T.setArch(Triple::wasm32); break; 1553bdd1243dSDimitry Andric case Triple::x86_64: T.setArch(Triple::x86); break; 1554bdd1243dSDimitry Andric } 1555bdd1243dSDimitry Andric return T; 1556bdd1243dSDimitry Andric } 1557bdd1243dSDimitry Andric 1558bdd1243dSDimitry Andric Triple Triple::get64BitArchVariant() const { 1559bdd1243dSDimitry Andric Triple T(*this); 1560bdd1243dSDimitry Andric switch (getArch()) { 1561bdd1243dSDimitry Andric case Triple::UnknownArch: 1562bdd1243dSDimitry Andric case Triple::arc: 1563bdd1243dSDimitry Andric case Triple::avr: 1564bdd1243dSDimitry Andric case Triple::csky: 1565bdd1243dSDimitry Andric case Triple::dxil: 1566bdd1243dSDimitry Andric case Triple::hexagon: 1567bdd1243dSDimitry Andric case Triple::kalimba: 1568bdd1243dSDimitry Andric case Triple::lanai: 1569bdd1243dSDimitry Andric case Triple::m68k: 1570bdd1243dSDimitry Andric case Triple::msp430: 1571bdd1243dSDimitry Andric case Triple::r600: 1572bdd1243dSDimitry Andric case Triple::shave: 1573bdd1243dSDimitry Andric case Triple::sparcel: 1574bdd1243dSDimitry Andric case Triple::tce: 1575bdd1243dSDimitry Andric case Triple::tcele: 1576bdd1243dSDimitry Andric case Triple::xcore: 1577bdd1243dSDimitry Andric case Triple::xtensa: 1578bdd1243dSDimitry Andric T.setArch(UnknownArch); 1579bdd1243dSDimitry Andric break; 1580bdd1243dSDimitry Andric 1581bdd1243dSDimitry Andric case Triple::aarch64: 1582bdd1243dSDimitry Andric case Triple::aarch64_be: 1583bdd1243dSDimitry Andric case Triple::amdgcn: 1584bdd1243dSDimitry Andric case Triple::amdil64: 1585bdd1243dSDimitry Andric case Triple::bpfeb: 1586bdd1243dSDimitry Andric case Triple::bpfel: 1587bdd1243dSDimitry Andric case Triple::hsail64: 1588bdd1243dSDimitry Andric case Triple::le64: 1589bdd1243dSDimitry Andric case Triple::loongarch64: 1590bdd1243dSDimitry Andric case Triple::mips64: 1591bdd1243dSDimitry Andric case Triple::mips64el: 1592bdd1243dSDimitry Andric case Triple::nvptx64: 1593bdd1243dSDimitry Andric case Triple::ppc64: 1594bdd1243dSDimitry Andric case Triple::ppc64le: 1595bdd1243dSDimitry Andric case Triple::renderscript64: 1596bdd1243dSDimitry Andric case Triple::riscv64: 1597bdd1243dSDimitry Andric case Triple::sparcv9: 1598bdd1243dSDimitry Andric case Triple::spir64: 1599bdd1243dSDimitry Andric case Triple::spirv64: 1600bdd1243dSDimitry Andric case Triple::systemz: 1601bdd1243dSDimitry Andric case Triple::ve: 1602bdd1243dSDimitry Andric case Triple::wasm64: 1603bdd1243dSDimitry Andric case Triple::x86_64: 1604bdd1243dSDimitry Andric // Already 64-bit. 1605bdd1243dSDimitry Andric break; 1606bdd1243dSDimitry Andric 1607bdd1243dSDimitry Andric case Triple::aarch64_32: T.setArch(Triple::aarch64); break; 1608bdd1243dSDimitry Andric case Triple::amdil: T.setArch(Triple::amdil64); break; 1609bdd1243dSDimitry Andric case Triple::arm: T.setArch(Triple::aarch64); break; 1610bdd1243dSDimitry Andric case Triple::armeb: T.setArch(Triple::aarch64_be); break; 1611bdd1243dSDimitry Andric case Triple::hsail: T.setArch(Triple::hsail64); break; 1612bdd1243dSDimitry Andric case Triple::le32: T.setArch(Triple::le64); break; 1613bdd1243dSDimitry Andric case Triple::loongarch32: T.setArch(Triple::loongarch64); break; 1614bdd1243dSDimitry Andric case Triple::mips: 1615bdd1243dSDimitry Andric T.setArch(Triple::mips64, getSubArch()); 1616bdd1243dSDimitry Andric break; 1617bdd1243dSDimitry Andric case Triple::mipsel: 1618bdd1243dSDimitry Andric T.setArch(Triple::mips64el, getSubArch()); 1619bdd1243dSDimitry Andric break; 1620bdd1243dSDimitry Andric case Triple::nvptx: T.setArch(Triple::nvptx64); break; 1621bdd1243dSDimitry Andric case Triple::ppc: T.setArch(Triple::ppc64); break; 1622bdd1243dSDimitry Andric case Triple::ppcle: T.setArch(Triple::ppc64le); break; 1623bdd1243dSDimitry Andric case Triple::renderscript32: T.setArch(Triple::renderscript64); break; 1624bdd1243dSDimitry Andric case Triple::riscv32: T.setArch(Triple::riscv64); break; 1625bdd1243dSDimitry Andric case Triple::sparc: T.setArch(Triple::sparcv9); break; 1626bdd1243dSDimitry Andric case Triple::spir: T.setArch(Triple::spir64); break; 1627bdd1243dSDimitry Andric case Triple::spirv32: 1628bdd1243dSDimitry Andric T.setArch(Triple::spirv64, getSubArch()); 1629bdd1243dSDimitry Andric break; 1630bdd1243dSDimitry Andric case Triple::thumb: T.setArch(Triple::aarch64); break; 1631bdd1243dSDimitry Andric case Triple::thumbeb: T.setArch(Triple::aarch64_be); break; 1632bdd1243dSDimitry Andric case Triple::wasm32: T.setArch(Triple::wasm64); break; 1633bdd1243dSDimitry Andric case Triple::x86: T.setArch(Triple::x86_64); break; 1634bdd1243dSDimitry Andric } 1635bdd1243dSDimitry Andric return T; 1636bdd1243dSDimitry Andric } 1637bdd1243dSDimitry Andric 1638bdd1243dSDimitry Andric Triple Triple::getBigEndianArchVariant() const { 1639bdd1243dSDimitry Andric Triple T(*this); 1640bdd1243dSDimitry Andric // Already big endian. 1641bdd1243dSDimitry Andric if (!isLittleEndian()) 1642bdd1243dSDimitry Andric return T; 1643bdd1243dSDimitry Andric switch (getArch()) { 1644bdd1243dSDimitry Andric case Triple::UnknownArch: 1645bdd1243dSDimitry Andric case Triple::amdgcn: 1646bdd1243dSDimitry Andric case Triple::amdil64: 1647bdd1243dSDimitry Andric case Triple::amdil: 1648bdd1243dSDimitry Andric case Triple::avr: 1649bdd1243dSDimitry Andric case Triple::dxil: 1650bdd1243dSDimitry Andric case Triple::hexagon: 1651bdd1243dSDimitry Andric case Triple::hsail64: 1652bdd1243dSDimitry Andric case Triple::hsail: 1653bdd1243dSDimitry Andric case Triple::kalimba: 1654bdd1243dSDimitry Andric case Triple::le32: 1655bdd1243dSDimitry Andric case Triple::le64: 1656bdd1243dSDimitry Andric case Triple::loongarch32: 1657bdd1243dSDimitry Andric case Triple::loongarch64: 1658bdd1243dSDimitry Andric case Triple::msp430: 1659bdd1243dSDimitry Andric case Triple::nvptx64: 1660bdd1243dSDimitry Andric case Triple::nvptx: 1661bdd1243dSDimitry Andric case Triple::r600: 1662bdd1243dSDimitry Andric case Triple::renderscript32: 1663bdd1243dSDimitry Andric case Triple::renderscript64: 1664bdd1243dSDimitry Andric case Triple::riscv32: 1665bdd1243dSDimitry Andric case Triple::riscv64: 1666bdd1243dSDimitry Andric case Triple::shave: 1667bdd1243dSDimitry Andric case Triple::spir64: 1668bdd1243dSDimitry Andric case Triple::spir: 1669bdd1243dSDimitry Andric case Triple::spirv32: 1670bdd1243dSDimitry Andric case Triple::spirv64: 1671bdd1243dSDimitry Andric case Triple::wasm32: 1672bdd1243dSDimitry Andric case Triple::wasm64: 1673bdd1243dSDimitry Andric case Triple::x86: 1674bdd1243dSDimitry Andric case Triple::x86_64: 1675bdd1243dSDimitry Andric case Triple::xcore: 1676bdd1243dSDimitry Andric case Triple::ve: 1677bdd1243dSDimitry Andric case Triple::csky: 1678bdd1243dSDimitry Andric case Triple::xtensa: 1679bdd1243dSDimitry Andric 1680bdd1243dSDimitry Andric // ARM is intentionally unsupported here, changing the architecture would 1681bdd1243dSDimitry Andric // drop any arch suffixes. 1682bdd1243dSDimitry Andric case Triple::arm: 1683bdd1243dSDimitry Andric case Triple::thumb: 1684bdd1243dSDimitry Andric T.setArch(UnknownArch); 1685bdd1243dSDimitry Andric break; 1686bdd1243dSDimitry Andric 1687bdd1243dSDimitry Andric case Triple::aarch64: T.setArch(Triple::aarch64_be); break; 1688bdd1243dSDimitry Andric case Triple::bpfel: T.setArch(Triple::bpfeb); break; 1689bdd1243dSDimitry Andric case Triple::mips64el: 1690bdd1243dSDimitry Andric T.setArch(Triple::mips64, getSubArch()); 1691bdd1243dSDimitry Andric break; 1692bdd1243dSDimitry Andric case Triple::mipsel: 1693bdd1243dSDimitry Andric T.setArch(Triple::mips, getSubArch()); 1694bdd1243dSDimitry Andric break; 1695bdd1243dSDimitry Andric case Triple::ppcle: T.setArch(Triple::ppc); break; 1696bdd1243dSDimitry Andric case Triple::ppc64le: T.setArch(Triple::ppc64); break; 1697bdd1243dSDimitry Andric case Triple::sparcel: T.setArch(Triple::sparc); break; 1698bdd1243dSDimitry Andric case Triple::tcele: T.setArch(Triple::tce); break; 1699bdd1243dSDimitry Andric default: 1700bdd1243dSDimitry Andric llvm_unreachable("getBigEndianArchVariant: unknown triple."); 1701bdd1243dSDimitry Andric } 1702bdd1243dSDimitry Andric return T; 1703bdd1243dSDimitry Andric } 1704bdd1243dSDimitry Andric 1705bdd1243dSDimitry Andric Triple Triple::getLittleEndianArchVariant() const { 1706bdd1243dSDimitry Andric Triple T(*this); 1707bdd1243dSDimitry Andric if (isLittleEndian()) 1708bdd1243dSDimitry Andric return T; 1709bdd1243dSDimitry Andric 1710bdd1243dSDimitry Andric switch (getArch()) { 1711bdd1243dSDimitry Andric case Triple::UnknownArch: 1712bdd1243dSDimitry Andric case Triple::lanai: 1713bdd1243dSDimitry Andric case Triple::sparcv9: 1714bdd1243dSDimitry Andric case Triple::systemz: 1715bdd1243dSDimitry Andric case Triple::m68k: 1716bdd1243dSDimitry Andric 1717bdd1243dSDimitry Andric // ARM is intentionally unsupported here, changing the architecture would 1718bdd1243dSDimitry Andric // drop any arch suffixes. 1719bdd1243dSDimitry Andric case Triple::armeb: 1720bdd1243dSDimitry Andric case Triple::thumbeb: 1721bdd1243dSDimitry Andric T.setArch(UnknownArch); 1722bdd1243dSDimitry Andric break; 1723bdd1243dSDimitry Andric 1724bdd1243dSDimitry Andric case Triple::aarch64_be: T.setArch(Triple::aarch64); break; 1725bdd1243dSDimitry Andric case Triple::bpfeb: T.setArch(Triple::bpfel); break; 1726bdd1243dSDimitry Andric case Triple::mips64: 1727bdd1243dSDimitry Andric T.setArch(Triple::mips64el, getSubArch()); 1728bdd1243dSDimitry Andric break; 1729bdd1243dSDimitry Andric case Triple::mips: 1730bdd1243dSDimitry Andric T.setArch(Triple::mipsel, getSubArch()); 1731bdd1243dSDimitry Andric break; 1732bdd1243dSDimitry Andric case Triple::ppc: T.setArch(Triple::ppcle); break; 1733bdd1243dSDimitry Andric case Triple::ppc64: T.setArch(Triple::ppc64le); break; 1734bdd1243dSDimitry Andric case Triple::sparc: T.setArch(Triple::sparcel); break; 1735bdd1243dSDimitry Andric case Triple::tce: T.setArch(Triple::tcele); break; 1736bdd1243dSDimitry Andric default: 1737bdd1243dSDimitry Andric llvm_unreachable("getLittleEndianArchVariant: unknown triple."); 1738bdd1243dSDimitry Andric } 1739bdd1243dSDimitry Andric return T; 1740bdd1243dSDimitry Andric } 1741bdd1243dSDimitry Andric 1742bdd1243dSDimitry Andric bool Triple::isLittleEndian() const { 1743bdd1243dSDimitry Andric switch (getArch()) { 1744bdd1243dSDimitry Andric case Triple::aarch64: 1745bdd1243dSDimitry Andric case Triple::aarch64_32: 1746bdd1243dSDimitry Andric case Triple::amdgcn: 1747bdd1243dSDimitry Andric case Triple::amdil64: 1748bdd1243dSDimitry Andric case Triple::amdil: 1749bdd1243dSDimitry Andric case Triple::arm: 1750bdd1243dSDimitry Andric case Triple::avr: 1751bdd1243dSDimitry Andric case Triple::bpfel: 1752bdd1243dSDimitry Andric case Triple::csky: 1753bdd1243dSDimitry Andric case Triple::dxil: 1754bdd1243dSDimitry Andric case Triple::hexagon: 1755bdd1243dSDimitry Andric case Triple::hsail64: 1756bdd1243dSDimitry Andric case Triple::hsail: 1757bdd1243dSDimitry Andric case Triple::kalimba: 1758bdd1243dSDimitry Andric case Triple::le32: 1759bdd1243dSDimitry Andric case Triple::le64: 1760bdd1243dSDimitry Andric case Triple::loongarch32: 1761bdd1243dSDimitry Andric case Triple::loongarch64: 1762bdd1243dSDimitry Andric case Triple::mips64el: 1763bdd1243dSDimitry Andric case Triple::mipsel: 1764bdd1243dSDimitry Andric case Triple::msp430: 1765bdd1243dSDimitry Andric case Triple::nvptx64: 1766bdd1243dSDimitry Andric case Triple::nvptx: 1767bdd1243dSDimitry Andric case Triple::ppcle: 1768bdd1243dSDimitry Andric case Triple::ppc64le: 1769bdd1243dSDimitry Andric case Triple::r600: 1770bdd1243dSDimitry Andric case Triple::renderscript32: 1771bdd1243dSDimitry Andric case Triple::renderscript64: 1772bdd1243dSDimitry Andric case Triple::riscv32: 1773bdd1243dSDimitry Andric case Triple::riscv64: 1774bdd1243dSDimitry Andric case Triple::shave: 1775bdd1243dSDimitry Andric case Triple::sparcel: 1776bdd1243dSDimitry Andric case Triple::spir64: 1777bdd1243dSDimitry Andric case Triple::spir: 1778bdd1243dSDimitry Andric case Triple::spirv32: 1779bdd1243dSDimitry Andric case Triple::spirv64: 1780bdd1243dSDimitry Andric case Triple::tcele: 1781bdd1243dSDimitry Andric case Triple::thumb: 1782bdd1243dSDimitry Andric case Triple::ve: 1783bdd1243dSDimitry Andric case Triple::wasm32: 1784bdd1243dSDimitry Andric case Triple::wasm64: 1785bdd1243dSDimitry Andric case Triple::x86: 1786bdd1243dSDimitry Andric case Triple::x86_64: 1787bdd1243dSDimitry Andric case Triple::xcore: 1788bdd1243dSDimitry Andric case Triple::xtensa: 1789bdd1243dSDimitry Andric return true; 1790bdd1243dSDimitry Andric default: 1791bdd1243dSDimitry Andric return false; 1792bdd1243dSDimitry Andric } 1793bdd1243dSDimitry Andric } 1794bdd1243dSDimitry Andric 1795bdd1243dSDimitry Andric bool Triple::isCompatibleWith(const Triple &Other) const { 1796bdd1243dSDimitry Andric // ARM and Thumb triples are compatible, if subarch, vendor and OS match. 1797bdd1243dSDimitry Andric if ((getArch() == Triple::thumb && Other.getArch() == Triple::arm) || 1798bdd1243dSDimitry Andric (getArch() == Triple::arm && Other.getArch() == Triple::thumb) || 1799bdd1243dSDimitry Andric (getArch() == Triple::thumbeb && Other.getArch() == Triple::armeb) || 1800bdd1243dSDimitry Andric (getArch() == Triple::armeb && Other.getArch() == Triple::thumbeb)) { 1801bdd1243dSDimitry Andric if (getVendor() == Triple::Apple) 1802bdd1243dSDimitry Andric return getSubArch() == Other.getSubArch() && 1803bdd1243dSDimitry Andric getVendor() == Other.getVendor() && getOS() == Other.getOS(); 1804bdd1243dSDimitry Andric else 1805bdd1243dSDimitry Andric return getSubArch() == Other.getSubArch() && 1806bdd1243dSDimitry Andric getVendor() == Other.getVendor() && getOS() == Other.getOS() && 1807bdd1243dSDimitry Andric getEnvironment() == Other.getEnvironment() && 1808bdd1243dSDimitry Andric getObjectFormat() == Other.getObjectFormat(); 1809bdd1243dSDimitry Andric } 1810bdd1243dSDimitry Andric 1811bdd1243dSDimitry Andric // If vendor is apple, ignore the version number. 1812bdd1243dSDimitry Andric if (getVendor() == Triple::Apple) 1813bdd1243dSDimitry Andric return getArch() == Other.getArch() && getSubArch() == Other.getSubArch() && 1814bdd1243dSDimitry Andric getVendor() == Other.getVendor() && getOS() == Other.getOS(); 1815bdd1243dSDimitry Andric 1816bdd1243dSDimitry Andric return *this == Other; 1817bdd1243dSDimitry Andric } 1818bdd1243dSDimitry Andric 1819bdd1243dSDimitry Andric std::string Triple::merge(const Triple &Other) const { 1820bdd1243dSDimitry Andric // If vendor is apple, pick the triple with the larger version number. 1821bdd1243dSDimitry Andric if (getVendor() == Triple::Apple) 1822bdd1243dSDimitry Andric if (Other.isOSVersionLT(*this)) 1823bdd1243dSDimitry Andric return str(); 1824bdd1243dSDimitry Andric 1825bdd1243dSDimitry Andric return Other.str(); 1826bdd1243dSDimitry Andric } 1827bdd1243dSDimitry Andric 1828bdd1243dSDimitry Andric bool Triple::isMacOSXVersionLT(unsigned Major, unsigned Minor, 1829bdd1243dSDimitry Andric unsigned Micro) const { 1830bdd1243dSDimitry Andric assert(isMacOSX() && "Not an OS X triple!"); 1831bdd1243dSDimitry Andric 1832bdd1243dSDimitry Andric // If this is OS X, expect a sane version number. 1833bdd1243dSDimitry Andric if (getOS() == Triple::MacOSX) 1834bdd1243dSDimitry Andric return isOSVersionLT(Major, Minor, Micro); 1835bdd1243dSDimitry Andric 1836bdd1243dSDimitry Andric // Otherwise, compare to the "Darwin" number. 1837bdd1243dSDimitry Andric if (Major == 10) { 1838bdd1243dSDimitry Andric return isOSVersionLT(Minor + 4, Micro, 0); 1839bdd1243dSDimitry Andric } else { 1840bdd1243dSDimitry Andric assert(Major >= 11 && "Unexpected major version"); 1841bdd1243dSDimitry Andric return isOSVersionLT(Major - 11 + 20, Minor, Micro); 1842bdd1243dSDimitry Andric } 1843bdd1243dSDimitry Andric } 1844bdd1243dSDimitry Andric 1845bdd1243dSDimitry Andric VersionTuple Triple::getMinimumSupportedOSVersion() const { 1846bdd1243dSDimitry Andric if (getVendor() != Triple::Apple || getArch() != Triple::aarch64) 1847bdd1243dSDimitry Andric return VersionTuple(); 1848bdd1243dSDimitry Andric switch (getOS()) { 1849bdd1243dSDimitry Andric case Triple::MacOSX: 1850bdd1243dSDimitry Andric // ARM64 slice is supported starting from macOS 11.0+. 1851bdd1243dSDimitry Andric return VersionTuple(11, 0, 0); 1852bdd1243dSDimitry Andric case Triple::IOS: 1853bdd1243dSDimitry Andric // ARM64 slice is supported starting from Mac Catalyst 14 (macOS 11). 1854bdd1243dSDimitry Andric // ARM64 simulators are supported for iOS 14+. 1855bdd1243dSDimitry Andric if (isMacCatalystEnvironment() || isSimulatorEnvironment()) 1856bdd1243dSDimitry Andric return VersionTuple(14, 0, 0); 1857bdd1243dSDimitry Andric // ARM64e slice is supported starting from iOS 14. 1858bdd1243dSDimitry Andric if (isArm64e()) 1859bdd1243dSDimitry Andric return VersionTuple(14, 0, 0); 1860bdd1243dSDimitry Andric break; 1861bdd1243dSDimitry Andric case Triple::TvOS: 1862bdd1243dSDimitry Andric // ARM64 simulators are supported for tvOS 14+. 1863bdd1243dSDimitry Andric if (isSimulatorEnvironment()) 1864bdd1243dSDimitry Andric return VersionTuple(14, 0, 0); 1865bdd1243dSDimitry Andric break; 1866bdd1243dSDimitry Andric case Triple::WatchOS: 1867bdd1243dSDimitry Andric // ARM64 simulators are supported for watchOS 7+. 1868bdd1243dSDimitry Andric if (isSimulatorEnvironment()) 1869bdd1243dSDimitry Andric return VersionTuple(7, 0, 0); 1870bdd1243dSDimitry Andric break; 1871bdd1243dSDimitry Andric case Triple::DriverKit: 1872bdd1243dSDimitry Andric return VersionTuple(20, 0, 0); 1873bdd1243dSDimitry Andric default: 1874bdd1243dSDimitry Andric break; 1875bdd1243dSDimitry Andric } 1876bdd1243dSDimitry Andric return VersionTuple(); 1877bdd1243dSDimitry Andric } 1878bdd1243dSDimitry Andric 1879bdd1243dSDimitry Andric VersionTuple Triple::getCanonicalVersionForOS(OSType OSKind, 1880bdd1243dSDimitry Andric const VersionTuple &Version) { 1881bdd1243dSDimitry Andric switch (OSKind) { 1882bdd1243dSDimitry Andric case MacOSX: 1883bdd1243dSDimitry Andric // macOS 10.16 is canonicalized to macOS 11. 1884bdd1243dSDimitry Andric if (Version == VersionTuple(10, 16)) 1885bdd1243dSDimitry Andric return VersionTuple(11, 0); 1886bdd1243dSDimitry Andric [[fallthrough]]; 1887bdd1243dSDimitry Andric default: 1888bdd1243dSDimitry Andric return Version; 1889bdd1243dSDimitry Andric } 1890bdd1243dSDimitry Andric } 1891bdd1243dSDimitry Andric 1892bdd1243dSDimitry Andric // HLSL triple environment orders are relied on in the front end 1893bdd1243dSDimitry Andric static_assert(Triple::Vertex - Triple::Pixel == 1, 1894bdd1243dSDimitry Andric "incorrect HLSL stage order"); 1895bdd1243dSDimitry Andric static_assert(Triple::Geometry - Triple::Pixel == 2, 1896bdd1243dSDimitry Andric "incorrect HLSL stage order"); 1897bdd1243dSDimitry Andric static_assert(Triple::Hull - Triple::Pixel == 3, 1898bdd1243dSDimitry Andric "incorrect HLSL stage order"); 1899bdd1243dSDimitry Andric static_assert(Triple::Domain - Triple::Pixel == 4, 1900bdd1243dSDimitry Andric "incorrect HLSL stage order"); 1901bdd1243dSDimitry Andric static_assert(Triple::Compute - Triple::Pixel == 5, 1902bdd1243dSDimitry Andric "incorrect HLSL stage order"); 1903bdd1243dSDimitry Andric static_assert(Triple::Library - Triple::Pixel == 6, 1904bdd1243dSDimitry Andric "incorrect HLSL stage order"); 1905bdd1243dSDimitry Andric static_assert(Triple::RayGeneration - Triple::Pixel == 7, 1906bdd1243dSDimitry Andric "incorrect HLSL stage order"); 1907bdd1243dSDimitry Andric static_assert(Triple::Intersection - Triple::Pixel == 8, 1908bdd1243dSDimitry Andric "incorrect HLSL stage order"); 1909bdd1243dSDimitry Andric static_assert(Triple::AnyHit - Triple::Pixel == 9, 1910bdd1243dSDimitry Andric "incorrect HLSL stage order"); 1911bdd1243dSDimitry Andric static_assert(Triple::ClosestHit - Triple::Pixel == 10, 1912bdd1243dSDimitry Andric "incorrect HLSL stage order"); 1913bdd1243dSDimitry Andric static_assert(Triple::Miss - Triple::Pixel == 11, 1914bdd1243dSDimitry Andric "incorrect HLSL stage order"); 1915bdd1243dSDimitry Andric static_assert(Triple::Callable - Triple::Pixel == 12, 1916bdd1243dSDimitry Andric "incorrect HLSL stage order"); 1917bdd1243dSDimitry Andric static_assert(Triple::Mesh - Triple::Pixel == 13, 1918bdd1243dSDimitry Andric "incorrect HLSL stage order"); 1919bdd1243dSDimitry Andric static_assert(Triple::Amplification - Triple::Pixel == 14, 1920bdd1243dSDimitry Andric "incorrect HLSL stage order"); 1921