]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/include/llvm/ADT/Triple.h
Upgrade Unbound to 1.7.0. More to follow.
[FreeBSD/FreeBSD.git] / contrib / llvm / include / llvm / ADT / Triple.h
1 //===-- 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
21 namespace 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.
44 class Triple {
45 public:
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
104     ARMSubArch_v8_3a,
105     ARMSubArch_v8_2a,
106     ARMSubArch_v8_1a,
107     ARMSubArch_v8,
108     ARMSubArch_v8r,
109     ARMSubArch_v8m_baseline,
110     ARMSubArch_v8m_mainline,
111     ARMSubArch_v7,
112     ARMSubArch_v7em,
113     ARMSubArch_v7m,
114     ARMSubArch_v7s,
115     ARMSubArch_v7k,
116     ARMSubArch_v7ve,
117     ARMSubArch_v6,
118     ARMSubArch_v6m,
119     ARMSubArch_v6k,
120     ARMSubArch_v6t2,
121     ARMSubArch_v5,
122     ARMSubArch_v5te,
123     ARMSubArch_v4t,
124
125     KalimbaSubArch_v3,
126     KalimbaSubArch_v4,
127     KalimbaSubArch_v5
128   };
129   enum VendorType {
130     UnknownVendor,
131
132     Apple,
133     PC,
134     SCEI,
135     BGP,
136     BGQ,
137     Freescale,
138     IBM,
139     ImaginationTechnologies,
140     MipsTechnologies,
141     NVIDIA,
142     CSR,
143     Myriad,
144     AMD,
145     Mesa,
146     SUSE,
147     LastVendorType = SUSE
148   };
149   enum OSType {
150     UnknownOS,
151
152     Ananas,
153     CloudABI,
154     Darwin,
155     DragonFly,
156     FreeBSD,
157     Fuchsia,
158     IOS,
159     KFreeBSD,
160     Linux,
161     Lv2,        // PS3
162     MacOSX,
163     NetBSD,
164     OpenBSD,
165     Solaris,
166     Win32,
167     Haiku,
168     Minix,
169     RTEMS,
170     NaCl,       // Native Client
171     CNK,        // BG/P Compute-Node Kernel
172     AIX,
173     CUDA,       // NVIDIA CUDA
174     NVCL,       // NVIDIA OpenCL
175     AMDHSA,     // AMD HSA Runtime
176     PS4,
177     ELFIAMCU,
178     TvOS,       // Apple tvOS
179     WatchOS,    // Apple watchOS
180     Mesa3D,
181     Contiki,
182     AMDPAL,     // AMD PAL Runtime
183     LastOSType = AMDPAL
184   };
185   enum EnvironmentType {
186     UnknownEnvironment,
187
188     GNU,
189     GNUABIN32,
190     GNUABI64,
191     GNUEABI,
192     GNUEABIHF,
193     GNUX32,
194     CODE16,
195     EABI,
196     EABIHF,
197     Android,
198     Musl,
199     MuslEABI,
200     MuslEABIHF,
201
202     MSVC,
203     Itanium,
204     Cygnus,
205     AMDOpenCL,
206     CoreCLR,
207     OpenCL,
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
220 private:
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
241 public:
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
663   /// Tests wether the target supports comdat
664   bool supportsCOMDAT() const {
665     return !isOSBinFormatMachO() && !isOSBinFormatWasm();
666   }
667
668   /// @}
669   /// @name Mutators
670   /// @{
671
672   /// setArch - Set the architecture (first) component of the triple
673   /// to a known type.
674   void setArch(ArchType Kind);
675
676   /// setVendor - Set the vendor (second) component of the triple to a
677   /// known type.
678   void setVendor(VendorType Kind);
679
680   /// setOS - Set the operating system (third) component of the triple
681   /// to a known type.
682   void setOS(OSType Kind);
683
684   /// setEnvironment - Set the environment (fourth) component of the triple
685   /// to a known type.
686   void setEnvironment(EnvironmentType Kind);
687
688   /// setObjectFormat - Set the object file format
689   void setObjectFormat(ObjectFormatType Kind);
690
691   /// setTriple - Set all components to the new triple \p Str.
692   void setTriple(const Twine &Str);
693
694   /// setArchName - Set the architecture (first) component of the
695   /// triple by name.
696   void setArchName(StringRef Str);
697
698   /// setVendorName - Set the vendor (second) component of the triple
699   /// by name.
700   void setVendorName(StringRef Str);
701
702   /// setOSName - Set the operating system (third) component of the
703   /// triple by name.
704   void setOSName(StringRef Str);
705
706   /// setEnvironmentName - Set the optional environment (fourth)
707   /// component of the triple by name.
708   void setEnvironmentName(StringRef Str);
709
710   /// setOSAndEnvironmentName - Set the operating system and optional
711   /// environment components with a single string.
712   void setOSAndEnvironmentName(StringRef Str);
713
714   /// @}
715   /// @name Helpers to build variants of a particular triple.
716   /// @{
717
718   /// Form a triple with a 32-bit variant of the current architecture.
719   ///
720   /// This can be used to move across "families" of architectures where useful.
721   ///
722   /// \returns A new triple with a 32-bit architecture or an unknown
723   ///          architecture if no such variant can be found.
724   llvm::Triple get32BitArchVariant() const;
725
726   /// Form a triple with a 64-bit variant of the current architecture.
727   ///
728   /// This can be used to move across "families" of architectures where useful.
729   ///
730   /// \returns A new triple with a 64-bit architecture or an unknown
731   ///          architecture if no such variant can be found.
732   llvm::Triple get64BitArchVariant() const;
733
734   /// Form a triple with a big endian variant of the current architecture.
735   ///
736   /// This can be used to move across "families" of architectures where useful.
737   ///
738   /// \returns A new triple with a big endian architecture or an unknown
739   ///          architecture if no such variant can be found.
740   llvm::Triple getBigEndianArchVariant() const;
741
742   /// Form a triple with a little endian variant of the current architecture.
743   ///
744   /// This can be used to move across "families" of architectures where useful.
745   ///
746   /// \returns A new triple with a little endian architecture or an unknown
747   ///          architecture if no such variant can be found.
748   llvm::Triple getLittleEndianArchVariant() const;
749
750   /// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
751   ///
752   /// \param Arch the architecture name (e.g., "armv7s"). If it is an empty
753   /// string then the triple's arch name is used.
754   StringRef getARMCPUForArch(StringRef Arch = StringRef()) const;
755
756   /// Tests whether the target triple is little endian.
757   ///
758   /// \returns true if the triple is little endian, false otherwise.
759   bool isLittleEndian() const;
760
761   /// Test whether target triples are compatible.
762   bool isCompatibleWith(const Triple &Other) const;
763
764   /// Merge target triples.
765   std::string merge(const Triple &Other) const;
766
767   /// @}
768   /// @name Static helpers for IDs.
769   /// @{
770
771   /// getArchTypeName - Get the canonical name for the \p Kind architecture.
772   static StringRef getArchTypeName(ArchType Kind);
773
774   /// getArchTypePrefix - Get the "prefix" canonical name for the \p Kind
775   /// architecture. This is the prefix used by the architecture specific
776   /// builtins, and is suitable for passing to \see
777   /// Intrinsic::getIntrinsicForGCCBuiltin().
778   ///
779   /// \return - The architecture prefix, or 0 if none is defined.
780   static StringRef getArchTypePrefix(ArchType Kind);
781
782   /// getVendorTypeName - Get the canonical name for the \p Kind vendor.
783   static StringRef getVendorTypeName(VendorType Kind);
784
785   /// getOSTypeName - Get the canonical name for the \p Kind operating system.
786   static StringRef getOSTypeName(OSType Kind);
787
788   /// getEnvironmentTypeName - Get the canonical name for the \p Kind
789   /// environment.
790   static StringRef getEnvironmentTypeName(EnvironmentType Kind);
791
792   /// @}
793   /// @name Static helpers for converting alternate architecture names.
794   /// @{
795
796   /// getArchTypeForLLVMName - The canonical type for the given LLVM
797   /// architecture name (e.g., "x86").
798   static ArchType getArchTypeForLLVMName(StringRef Str);
799
800   /// @}
801 };
802
803 } // End llvm namespace
804
805
806 #endif