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