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