blob: c95b16dd4e8c8052ed0c91b0758a52f9c8fb72fa [file] [log] [blame]
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001//===-- llvm/ADT/Triple.h - Target triple helper class ----------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef LLVM_ADT_TRIPLE_H
11#define LLVM_ADT_TRIPLE_H
12
13#include "llvm/ADT/Twine.h"
14
15// Some system headers or GCC predefined macros conflict with identifiers in
16// this file. Undefine them here.
17#undef NetBSD
18#undef mips
19#undef sparc
20
21namespace llvm {
22
23/// Triple - Helper class for working with autoconf configuration names. For
24/// historical reasons, we also call these 'triples' (they used to contain
25/// exactly three fields).
26///
27/// Configuration names are strings in the canonical form:
28/// ARCHITECTURE-VENDOR-OPERATING_SYSTEM
29/// or
30/// ARCHITECTURE-VENDOR-OPERATING_SYSTEM-ENVIRONMENT
31///
32/// This class is used for clients which want to support arbitrary
33/// configuration names, but also want to implement certain special
34/// behavior for particular configurations. This class isolates the mapping
35/// from the components of the configuration name to well known IDs.
36///
37/// At its core the Triple class is designed to be a wrapper for a triple
38/// string; the constructor does not change or normalize the triple string.
39/// Clients that need to handle the non-canonical triples that users often
40/// specify should use the normalize method.
41///
42/// See autoconf/config.guess for a glimpse into what configuration names
43/// look like in practice.
44class Triple {
45public:
46 enum ArchType {
47 UnknownArch,
48
49 arm, // ARM (little endian): arm, armv.*, xscale
50 armeb, // ARM (big endian): armeb
51 aarch64, // AArch64 (little endian): aarch64
52 aarch64_be, // AArch64 (big endian): aarch64_be
53 arc, // ARC: Synopsys ARC
54 avr, // AVR: Atmel AVR microcontroller
55 bpfel, // eBPF or extended BPF or 64-bit BPF (little endian)
56 bpfeb, // eBPF or extended BPF or 64-bit BPF (big endian)
57 hexagon, // Hexagon: hexagon
58 mips, // MIPS: mips, mipsallegrex
59 mipsel, // MIPSEL: mipsel, mipsallegrexel
60 mips64, // MIPS64: mips64
61 mips64el, // MIPS64EL: mips64el
62 msp430, // MSP430: msp430
63 nios2, // NIOSII: nios2
64 ppc, // PPC: powerpc
65 ppc64, // PPC64: powerpc64, ppu
66 ppc64le, // PPC64LE: powerpc64le
67 r600, // R600: AMD GPUs HD2XXX - HD6XXX
68 amdgcn, // AMDGCN: AMD GCN GPUs
69 riscv32, // RISC-V (32-bit): riscv32
70 riscv64, // RISC-V (64-bit): riscv64
71 sparc, // Sparc: sparc
72 sparcv9, // Sparcv9: Sparcv9
73 sparcel, // Sparc: (endianness = little). NB: 'Sparcle' is a CPU variant
74 systemz, // SystemZ: s390x
75 tce, // TCE (http://tce.cs.tut.fi/): tce
76 tcele, // TCE little endian (http://tce.cs.tut.fi/): tcele
77 thumb, // Thumb (little endian): thumb, thumbv.*
78 thumbeb, // Thumb (big endian): thumbeb
79 x86, // X86: i[3-9]86
80 x86_64, // X86-64: amd64, x86_64
81 xcore, // XCore: xcore
82 nvptx, // NVPTX: 32-bit
83 nvptx64, // NVPTX: 64-bit
84 le32, // le32: generic little-endian 32-bit CPU (PNaCl)
85 le64, // le64: generic little-endian 64-bit CPU (PNaCl)
86 amdil, // AMDIL
87 amdil64, // AMDIL with 64-bit pointers
88 hsail, // AMD HSAIL
89 hsail64, // AMD HSAIL with 64-bit pointers
90 spir, // SPIR: standard portable IR for OpenCL 32-bit version
91 spir64, // SPIR: standard portable IR for OpenCL 64-bit version
92 kalimba, // Kalimba: generic kalimba
93 shave, // SHAVE: Movidius vector VLIW processors
94 lanai, // Lanai: Lanai 32-bit
95 wasm32, // WebAssembly with 32-bit pointers
96 wasm64, // WebAssembly with 64-bit pointers
97 renderscript32, // 32-bit RenderScript
98 renderscript64, // 64-bit RenderScript
99 LastArchType = renderscript64
100 };
101 enum SubArchType {
102 NoSubArch,
103
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100104 ARMSubArch_v8_4a,
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100105 ARMSubArch_v8_3a,
106 ARMSubArch_v8_2a,
107 ARMSubArch_v8_1a,
108 ARMSubArch_v8,
109 ARMSubArch_v8r,
110 ARMSubArch_v8m_baseline,
111 ARMSubArch_v8m_mainline,
112 ARMSubArch_v7,
113 ARMSubArch_v7em,
114 ARMSubArch_v7m,
115 ARMSubArch_v7s,
116 ARMSubArch_v7k,
117 ARMSubArch_v7ve,
118 ARMSubArch_v6,
119 ARMSubArch_v6m,
120 ARMSubArch_v6k,
121 ARMSubArch_v6t2,
122 ARMSubArch_v5,
123 ARMSubArch_v5te,
124 ARMSubArch_v4t,
125
126 KalimbaSubArch_v3,
127 KalimbaSubArch_v4,
128 KalimbaSubArch_v5
129 };
130 enum VendorType {
131 UnknownVendor,
132
133 Apple,
134 PC,
135 SCEI,
136 BGP,
137 BGQ,
138 Freescale,
139 IBM,
140 ImaginationTechnologies,
141 MipsTechnologies,
142 NVIDIA,
143 CSR,
144 Myriad,
145 AMD,
146 Mesa,
147 SUSE,
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100148 OpenEmbedded,
149 LastVendorType = OpenEmbedded
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100150 };
151 enum OSType {
152 UnknownOS,
153
154 Ananas,
155 CloudABI,
156 Darwin,
157 DragonFly,
158 FreeBSD,
159 Fuchsia,
160 IOS,
161 KFreeBSD,
162 Linux,
163 Lv2, // PS3
164 MacOSX,
165 NetBSD,
166 OpenBSD,
167 Solaris,
168 Win32,
169 Haiku,
170 Minix,
171 RTEMS,
172 NaCl, // Native Client
173 CNK, // BG/P Compute-Node Kernel
174 AIX,
175 CUDA, // NVIDIA CUDA
176 NVCL, // NVIDIA OpenCL
177 AMDHSA, // AMD HSA Runtime
178 PS4,
179 ELFIAMCU,
180 TvOS, // Apple tvOS
181 WatchOS, // Apple watchOS
182 Mesa3D,
183 Contiki,
184 AMDPAL, // AMD PAL Runtime
185 LastOSType = AMDPAL
186 };
187 enum EnvironmentType {
188 UnknownEnvironment,
189
190 GNU,
191 GNUABIN32,
192 GNUABI64,
193 GNUEABI,
194 GNUEABIHF,
195 GNUX32,
196 CODE16,
197 EABI,
198 EABIHF,
199 Android,
200 Musl,
201 MuslEABI,
202 MuslEABIHF,
203
204 MSVC,
205 Itanium,
206 Cygnus,
207 CoreCLR,
208 Simulator, // Simulator variants of other systems, e.g., Apple's iOS
209 LastEnvironmentType = Simulator
210 };
211 enum ObjectFormatType {
212 UnknownObjectFormat,
213
214 COFF,
215 ELF,
216 MachO,
217 Wasm,
218 };
219
220private:
221 std::string Data;
222
223 /// The parsed arch type.
224 ArchType Arch;
225
226 /// The parsed subarchitecture type.
227 SubArchType SubArch;
228
229 /// The parsed vendor type.
230 VendorType Vendor;
231
232 /// The parsed OS type.
233 OSType OS;
234
235 /// The parsed Environment type.
236 EnvironmentType Environment;
237
238 /// The object format type.
239 ObjectFormatType ObjectFormat;
240
241public:
242 /// @name Constructors
243 /// @{
244
245 /// Default constructor is the same as an empty string and leaves all
246 /// triple fields unknown.
247 Triple()
248 : Data(), Arch(), SubArch(), Vendor(), OS(), Environment(),
249 ObjectFormat() {}
250
251 explicit Triple(const Twine &Str);
252 Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr);
253 Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr,
254 const Twine &EnvironmentStr);
255
256 bool operator==(const Triple &Other) const {
257 return Arch == Other.Arch && SubArch == Other.SubArch &&
258 Vendor == Other.Vendor && OS == Other.OS &&
259 Environment == Other.Environment &&
260 ObjectFormat == Other.ObjectFormat;
261 }
262
263 bool operator!=(const Triple &Other) const {
264 return !(*this == Other);
265 }
266
267 /// @}
268 /// @name Normalization
269 /// @{
270
271 /// normalize - Turn an arbitrary machine specification into the canonical
272 /// triple form (or something sensible that the Triple class understands if
273 /// nothing better can reasonably be done). In particular, it handles the
274 /// common case in which otherwise valid components are in the wrong order.
275 static std::string normalize(StringRef Str);
276
277 /// Return the normalized form of this triple's string.
278 std::string normalize() const { return normalize(Data); }
279
280 /// @}
281 /// @name Typed Component Access
282 /// @{
283
284 /// getArch - Get the parsed architecture type of this triple.
285 ArchType getArch() const { return Arch; }
286
287 /// getSubArch - get the parsed subarchitecture type for this triple.
288 SubArchType getSubArch() const { return SubArch; }
289
290 /// getVendor - Get the parsed vendor type of this triple.
291 VendorType getVendor() const { return Vendor; }
292
293 /// getOS - Get the parsed operating system type of this triple.
294 OSType getOS() const { return OS; }
295
296 /// hasEnvironment - Does this triple have the optional environment
297 /// (fourth) component?
298 bool hasEnvironment() const {
299 return getEnvironmentName() != "";
300 }
301
302 /// getEnvironment - Get the parsed environment type of this triple.
303 EnvironmentType getEnvironment() const { return Environment; }
304
305 /// Parse the version number from the OS name component of the
306 /// triple, if present.
307 ///
308 /// For example, "fooos1.2.3" would return (1, 2, 3).
309 ///
310 /// If an entry is not defined, it will be returned as 0.
311 void getEnvironmentVersion(unsigned &Major, unsigned &Minor,
312 unsigned &Micro) const;
313
314 /// getFormat - Get the object format for this triple.
315 ObjectFormatType getObjectFormat() const { return ObjectFormat; }
316
317 /// getOSVersion - Parse the version number from the OS name component of the
318 /// triple, if present.
319 ///
320 /// For example, "fooos1.2.3" would return (1, 2, 3).
321 ///
322 /// If an entry is not defined, it will be returned as 0.
323 void getOSVersion(unsigned &Major, unsigned &Minor, unsigned &Micro) const;
324
325 /// getOSMajorVersion - Return just the major version number, this is
326 /// specialized because it is a common query.
327 unsigned getOSMajorVersion() const {
328 unsigned Maj, Min, Micro;
329 getOSVersion(Maj, Min, Micro);
330 return Maj;
331 }
332
333 /// getMacOSXVersion - Parse the version number as with getOSVersion and then
334 /// translate generic "darwin" versions to the corresponding OS X versions.
335 /// This may also be called with IOS triples but the OS X version number is
336 /// just set to a constant 10.4.0 in that case. Returns true if successful.
337 bool getMacOSXVersion(unsigned &Major, unsigned &Minor,
338 unsigned &Micro) const;
339
340 /// getiOSVersion - Parse the version number as with getOSVersion. This should
341 /// only be called with IOS or generic triples.
342 void getiOSVersion(unsigned &Major, unsigned &Minor,
343 unsigned &Micro) const;
344
345 /// getWatchOSVersion - Parse the version number as with getOSVersion. This
346 /// should only be called with WatchOS or generic triples.
347 void getWatchOSVersion(unsigned &Major, unsigned &Minor,
348 unsigned &Micro) const;
349
350 /// @}
351 /// @name Direct Component Access
352 /// @{
353
354 const std::string &str() const { return Data; }
355
356 const std::string &getTriple() const { return Data; }
357
358 /// getArchName - Get the architecture (first) component of the
359 /// triple.
360 StringRef getArchName() const;
361
362 /// getVendorName - Get the vendor (second) component of the triple.
363 StringRef getVendorName() const;
364
365 /// getOSName - Get the operating system (third) component of the
366 /// triple.
367 StringRef getOSName() const;
368
369 /// getEnvironmentName - Get the optional environment (fourth)
370 /// component of the triple, or "" if empty.
371 StringRef getEnvironmentName() const;
372
373 /// getOSAndEnvironmentName - Get the operating system and optional
374 /// environment components as a single string (separated by a '-'
375 /// if the environment component is present).
376 StringRef getOSAndEnvironmentName() const;
377
378 /// @}
379 /// @name Convenience Predicates
380 /// @{
381
382 /// Test whether the architecture is 64-bit
383 ///
384 /// Note that this tests for 64-bit pointer width, and nothing else. Note
385 /// that we intentionally expose only three predicates, 64-bit, 32-bit, and
386 /// 16-bit. The inner details of pointer width for particular architectures
387 /// is not summed up in the triple, and so only a coarse grained predicate
388 /// system is provided.
389 bool isArch64Bit() const;
390
391 /// Test whether the architecture is 32-bit
392 ///
393 /// Note that this tests for 32-bit pointer width, and nothing else.
394 bool isArch32Bit() const;
395
396 /// Test whether the architecture is 16-bit
397 ///
398 /// Note that this tests for 16-bit pointer width, and nothing else.
399 bool isArch16Bit() const;
400
401 /// isOSVersionLT - Helper function for doing comparisons against version
402 /// numbers included in the target triple.
403 bool isOSVersionLT(unsigned Major, unsigned Minor = 0,
404 unsigned Micro = 0) const {
405 unsigned LHS[3];
406 getOSVersion(LHS[0], LHS[1], LHS[2]);
407
408 if (LHS[0] != Major)
409 return LHS[0] < Major;
410 if (LHS[1] != Minor)
411 return LHS[1] < Minor;
412 if (LHS[2] != Micro)
413 return LHS[1] < Micro;
414
415 return false;
416 }
417
418 bool isOSVersionLT(const Triple &Other) const {
419 unsigned RHS[3];
420 Other.getOSVersion(RHS[0], RHS[1], RHS[2]);
421 return isOSVersionLT(RHS[0], RHS[1], RHS[2]);
422 }
423
424 /// isMacOSXVersionLT - Comparison function for checking OS X version
425 /// compatibility, which handles supporting skewed version numbering schemes
426 /// used by the "darwin" triples.
427 bool isMacOSXVersionLT(unsigned Major, unsigned Minor = 0,
428 unsigned Micro = 0) const {
429 assert(isMacOSX() && "Not an OS X triple!");
430
431 // If this is OS X, expect a sane version number.
432 if (getOS() == Triple::MacOSX)
433 return isOSVersionLT(Major, Minor, Micro);
434
435 // Otherwise, compare to the "Darwin" number.
436 assert(Major == 10 && "Unexpected major version");
437 return isOSVersionLT(Minor + 4, Micro, 0);
438 }
439
440 /// isMacOSX - Is this a Mac OS X triple. For legacy reasons, we support both
441 /// "darwin" and "osx" as OS X triples.
442 bool isMacOSX() const {
443 return getOS() == Triple::Darwin || getOS() == Triple::MacOSX;
444 }
445
446 /// Is this an iOS triple.
447 /// Note: This identifies tvOS as a variant of iOS. If that ever
448 /// changes, i.e., if the two operating systems diverge or their version
449 /// numbers get out of sync, that will need to be changed.
450 /// watchOS has completely different version numbers so it is not included.
451 bool isiOS() const {
452 return getOS() == Triple::IOS || isTvOS();
453 }
454
455 /// Is this an Apple tvOS triple.
456 bool isTvOS() const {
457 return getOS() == Triple::TvOS;
458 }
459
460 /// Is this an Apple watchOS triple.
461 bool isWatchOS() const {
462 return getOS() == Triple::WatchOS;
463 }
464
465 bool isWatchABI() const {
466 return getSubArch() == Triple::ARMSubArch_v7k;
467 }
468
469 /// isOSDarwin - Is this a "Darwin" OS (OS X, iOS, or watchOS).
470 bool isOSDarwin() const {
471 return isMacOSX() || isiOS() || isWatchOS();
472 }
473
474 bool isSimulatorEnvironment() const {
475 return getEnvironment() == Triple::Simulator;
476 }
477
478 bool isOSNetBSD() const {
479 return getOS() == Triple::NetBSD;
480 }
481
482 bool isOSOpenBSD() const {
483 return getOS() == Triple::OpenBSD;
484 }
485
486 bool isOSFreeBSD() const {
487 return getOS() == Triple::FreeBSD;
488 }
489
490 bool isOSFuchsia() const {
491 return getOS() == Triple::Fuchsia;
492 }
493
494 bool isOSDragonFly() const { return getOS() == Triple::DragonFly; }
495
496 bool isOSSolaris() const {
497 return getOS() == Triple::Solaris;
498 }
499
500 bool isOSIAMCU() const {
501 return getOS() == Triple::ELFIAMCU;
502 }
503
504 bool isOSUnknown() const { return getOS() == Triple::UnknownOS; }
505
506 bool isGNUEnvironment() const {
507 EnvironmentType Env = getEnvironment();
508 return Env == Triple::GNU || Env == Triple::GNUABIN32 ||
509 Env == Triple::GNUABI64 || Env == Triple::GNUEABI ||
510 Env == Triple::GNUEABIHF || Env == Triple::GNUX32;
511 }
512
513 bool isOSContiki() const {
514 return getOS() == Triple::Contiki;
515 }
516
517 /// Tests whether the OS is Haiku.
518 bool isOSHaiku() const {
519 return getOS() == Triple::Haiku;
520 }
521
522 /// Checks if the environment could be MSVC.
523 bool isWindowsMSVCEnvironment() const {
524 return getOS() == Triple::Win32 &&
525 (getEnvironment() == Triple::UnknownEnvironment ||
526 getEnvironment() == Triple::MSVC);
527 }
528
529 /// Checks if the environment is MSVC.
530 bool isKnownWindowsMSVCEnvironment() const {
531 return getOS() == Triple::Win32 && getEnvironment() == Triple::MSVC;
532 }
533
534 bool isWindowsCoreCLREnvironment() const {
535 return getOS() == Triple::Win32 && getEnvironment() == Triple::CoreCLR;
536 }
537
538 bool isWindowsItaniumEnvironment() const {
539 return getOS() == Triple::Win32 && getEnvironment() == Triple::Itanium;
540 }
541
542 bool isWindowsCygwinEnvironment() const {
543 return getOS() == Triple::Win32 && getEnvironment() == Triple::Cygnus;
544 }
545
546 bool isWindowsGNUEnvironment() const {
547 return getOS() == Triple::Win32 && getEnvironment() == Triple::GNU;
548 }
549
550 /// Tests for either Cygwin or MinGW OS
551 bool isOSCygMing() const {
552 return isWindowsCygwinEnvironment() || isWindowsGNUEnvironment();
553 }
554
555 /// Is this a "Windows" OS targeting a "MSVCRT.dll" environment.
556 bool isOSMSVCRT() const {
557 return isWindowsMSVCEnvironment() || isWindowsGNUEnvironment() ||
558 isWindowsItaniumEnvironment();
559 }
560
561 /// Tests whether the OS is Windows.
562 bool isOSWindows() const {
563 return getOS() == Triple::Win32;
564 }
565
566 /// Tests whether the OS is NaCl (Native Client)
567 bool isOSNaCl() const {
568 return getOS() == Triple::NaCl;
569 }
570
571 /// Tests whether the OS is Linux.
572 bool isOSLinux() const {
573 return getOS() == Triple::Linux;
574 }
575
576 /// Tests whether the OS is kFreeBSD.
577 bool isOSKFreeBSD() const {
578 return getOS() == Triple::KFreeBSD;
579 }
580
581 /// Tests whether the OS uses glibc.
582 bool isOSGlibc() const {
583 return (getOS() == Triple::Linux || getOS() == Triple::KFreeBSD) &&
584 !isAndroid();
585 }
586
587 /// Tests whether the OS uses the ELF binary format.
588 bool isOSBinFormatELF() const {
589 return getObjectFormat() == Triple::ELF;
590 }
591
592 /// Tests whether the OS uses the COFF binary format.
593 bool isOSBinFormatCOFF() const {
594 return getObjectFormat() == Triple::COFF;
595 }
596
597 /// Tests whether the environment is MachO.
598 bool isOSBinFormatMachO() const {
599 return getObjectFormat() == Triple::MachO;
600 }
601
602 /// Tests whether the OS uses the Wasm binary format.
603 bool isOSBinFormatWasm() const {
604 return getObjectFormat() == Triple::Wasm;
605 }
606
607 /// Tests whether the target is the PS4 CPU
608 bool isPS4CPU() const {
609 return getArch() == Triple::x86_64 &&
610 getVendor() == Triple::SCEI &&
611 getOS() == Triple::PS4;
612 }
613
614 /// Tests whether the target is the PS4 platform
615 bool isPS4() const {
616 return getVendor() == Triple::SCEI &&
617 getOS() == Triple::PS4;
618 }
619
620 /// Tests whether the target is Android
621 bool isAndroid() const { return getEnvironment() == Triple::Android; }
622
623 bool isAndroidVersionLT(unsigned Major) const {
624 assert(isAndroid() && "Not an Android triple!");
625
626 unsigned Env[3];
627 getEnvironmentVersion(Env[0], Env[1], Env[2]);
628
629 // 64-bit targets did not exist before API level 21 (Lollipop).
630 if (isArch64Bit() && Env[0] < 21)
631 Env[0] = 21;
632
633 return Env[0] < Major;
634 }
635
636 /// Tests whether the environment is musl-libc
637 bool isMusl() const {
638 return getEnvironment() == Triple::Musl ||
639 getEnvironment() == Triple::MuslEABI ||
640 getEnvironment() == Triple::MuslEABIHF;
641 }
642
643 /// Tests whether the target is NVPTX (32- or 64-bit).
644 bool isNVPTX() const {
645 return getArch() == Triple::nvptx || getArch() == Triple::nvptx64;
646 }
647
648 /// Tests whether the target is Thumb (little and big endian).
649 bool isThumb() const {
650 return getArch() == Triple::thumb || getArch() == Triple::thumbeb;
651 }
652
653 /// Tests whether the target is ARM (little and big endian).
654 bool isARM() const {
655 return getArch() == Triple::arm || getArch() == Triple::armeb;
656 }
657
658 /// Tests whether the target is AArch64 (little and big endian).
659 bool isAArch64() const {
660 return getArch() == Triple::aarch64 || getArch() == Triple::aarch64_be;
661 }
662
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100663 /// Tests whether the target is MIPS 32-bit (little and big endian).
664 bool isMIPS32() const {
665 return getArch() == Triple::mips || getArch() == Triple::mipsel;
666 }
667
668 /// Tests whether the target is MIPS 64-bit (little and big endian).
669 bool isMIPS64() const {
670 return getArch() == Triple::mips64 || getArch() == Triple::mips64el;
671 }
672
673 /// Tests whether the target is MIPS (little and big endian, 32- or 64-bit).
674 bool isMIPS() const {
675 return isMIPS32() || isMIPS64();
676 }
677
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100678 /// Tests whether the target supports comdat
679 bool supportsCOMDAT() const {
680 return !isOSBinFormatMachO();
681 }
682
683 /// Tests whether the target uses emulated TLS as default.
684 bool hasDefaultEmulatedTLS() const {
685 return isAndroid() || isOSOpenBSD() || isWindowsCygwinEnvironment();
686 }
687
688 /// @}
689 /// @name Mutators
690 /// @{
691
692 /// setArch - Set the architecture (first) component of the triple
693 /// to a known type.
694 void setArch(ArchType Kind);
695
696 /// setVendor - Set the vendor (second) component of the triple to a
697 /// known type.
698 void setVendor(VendorType Kind);
699
700 /// setOS - Set the operating system (third) component of the triple
701 /// to a known type.
702 void setOS(OSType Kind);
703
704 /// setEnvironment - Set the environment (fourth) component of the triple
705 /// to a known type.
706 void setEnvironment(EnvironmentType Kind);
707
708 /// setObjectFormat - Set the object file format
709 void setObjectFormat(ObjectFormatType Kind);
710
711 /// setTriple - Set all components to the new triple \p Str.
712 void setTriple(const Twine &Str);
713
714 /// setArchName - Set the architecture (first) component of the
715 /// triple by name.
716 void setArchName(StringRef Str);
717
718 /// setVendorName - Set the vendor (second) component of the triple
719 /// by name.
720 void setVendorName(StringRef Str);
721
722 /// setOSName - Set the operating system (third) component of the
723 /// triple by name.
724 void setOSName(StringRef Str);
725
726 /// setEnvironmentName - Set the optional environment (fourth)
727 /// component of the triple by name.
728 void setEnvironmentName(StringRef Str);
729
730 /// setOSAndEnvironmentName - Set the operating system and optional
731 /// environment components with a single string.
732 void setOSAndEnvironmentName(StringRef Str);
733
734 /// @}
735 /// @name Helpers to build variants of a particular triple.
736 /// @{
737
738 /// Form a triple with a 32-bit variant of the current architecture.
739 ///
740 /// This can be used to move across "families" of architectures where useful.
741 ///
742 /// \returns A new triple with a 32-bit architecture or an unknown
743 /// architecture if no such variant can be found.
744 llvm::Triple get32BitArchVariant() const;
745
746 /// Form a triple with a 64-bit variant of the current architecture.
747 ///
748 /// This can be used to move across "families" of architectures where useful.
749 ///
750 /// \returns A new triple with a 64-bit architecture or an unknown
751 /// architecture if no such variant can be found.
752 llvm::Triple get64BitArchVariant() const;
753
754 /// Form a triple with a big endian variant of the current architecture.
755 ///
756 /// This can be used to move across "families" of architectures where useful.
757 ///
758 /// \returns A new triple with a big endian architecture or an unknown
759 /// architecture if no such variant can be found.
760 llvm::Triple getBigEndianArchVariant() const;
761
762 /// Form a triple with a little endian variant of the current architecture.
763 ///
764 /// This can be used to move across "families" of architectures where useful.
765 ///
766 /// \returns A new triple with a little endian architecture or an unknown
767 /// architecture if no such variant can be found.
768 llvm::Triple getLittleEndianArchVariant() const;
769
770 /// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
771 ///
772 /// \param Arch the architecture name (e.g., "armv7s"). If it is an empty
773 /// string then the triple's arch name is used.
774 StringRef getARMCPUForArch(StringRef Arch = StringRef()) const;
775
776 /// Tests whether the target triple is little endian.
777 ///
778 /// \returns true if the triple is little endian, false otherwise.
779 bool isLittleEndian() const;
780
781 /// Test whether target triples are compatible.
782 bool isCompatibleWith(const Triple &Other) const;
783
784 /// Merge target triples.
785 std::string merge(const Triple &Other) const;
786
787 /// @}
788 /// @name Static helpers for IDs.
789 /// @{
790
791 /// getArchTypeName - Get the canonical name for the \p Kind architecture.
792 static StringRef getArchTypeName(ArchType Kind);
793
794 /// getArchTypePrefix - Get the "prefix" canonical name for the \p Kind
795 /// architecture. This is the prefix used by the architecture specific
796 /// builtins, and is suitable for passing to \see
797 /// Intrinsic::getIntrinsicForGCCBuiltin().
798 ///
799 /// \return - The architecture prefix, or 0 if none is defined.
800 static StringRef getArchTypePrefix(ArchType Kind);
801
802 /// getVendorTypeName - Get the canonical name for the \p Kind vendor.
803 static StringRef getVendorTypeName(VendorType Kind);
804
805 /// getOSTypeName - Get the canonical name for the \p Kind operating system.
806 static StringRef getOSTypeName(OSType Kind);
807
808 /// getEnvironmentTypeName - Get the canonical name for the \p Kind
809 /// environment.
810 static StringRef getEnvironmentTypeName(EnvironmentType Kind);
811
812 /// @}
813 /// @name Static helpers for converting alternate architecture names.
814 /// @{
815
816 /// getArchTypeForLLVMName - The canonical type for the given LLVM
817 /// architecture name (e.g., "x86").
818 static ArchType getArchTypeForLLVMName(StringRef Str);
819
820 /// @}
821};
822
823} // End llvm namespace
824
825
826#endif