Triple.h revision 7eaf057e54e9b5f0469057c71d81dcfee90d9e12
1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//===-- llvm/ADT/Triple.h - Target triple helper class ----------*- C++ -*-===//
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//                     The LLVM Compiler Infrastructure
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// This file is distributed under the University of Illinois Open Source
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// License. See LICENSE.TXT for details.
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//===----------------------------------------------------------------------===//
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef LLVM_ADT_TRIPLE_H
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define LLVM_ADT_TRIPLE_H
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <string>
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnamespace llvm {
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/// Triple - Helper class for working with target triples.
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org///
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/// Target triples are strings in the format of:
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org///   ARCHITECTURE-VENDOR-OPERATING_SYSTEM
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/// or
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org///   ARCHITECTURE-VENDOR-OPERATING_SYSTEM-ENVIRONMENT
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org///
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/// This class is used for clients which want to support arbitrary
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/// target triples, but also want to implement certain special
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/// behavior for particular targets. This class isolates the mapping
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/// from the components of the target triple to well known IDs.
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org///
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/// See autoconf/config.guess for a glimpse into what they look like
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/// in practice.
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass Triple {
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic:
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  enum ArchType {
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    UnknownArch,
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    x86,    // i?86
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ppc,    // powerpc
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ppc64,  // powerpc64
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    x86_64, // amd64, x86_64
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    InvalidArch
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  };
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  enum VendorType {
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    UnknownVendor,
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    Apple,
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    PC
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  };
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  enum OSType {
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    UnknownOS,
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    Darwin,
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    DragonFly,
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    FreeBSD,
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    Linux
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  };
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprivate:
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  std::string Data;
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// The parsed arch type (or InvalidArch if uninitialized).
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  mutable ArchType Arch;
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// The parsed vendor type.
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  mutable VendorType Vendor;
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// The parsed OS type.
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  mutable OSType OS;
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  bool isInitialized() const { return Arch != InvalidArch; }
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  void Parse() const;
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic:
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// @name Constructors
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// @{
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  Triple() : Data(""), Arch(InvalidArch) {}
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  explicit Triple(const char *Str) : Data(Str), Arch(InvalidArch) {}
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  explicit Triple(const char *ArchStr, const char *VendorStr, const char *OSStr)
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    : Data(ArchStr), Arch(InvalidArch) {
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    Data += '-';
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    Data += VendorStr;
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    Data += '-';
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    Data += OSStr;
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  }
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// @}
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// @name Typed Component Access
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// @{
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// getArch - Get the parsed architecture type of this triple.
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  ArchType getArch() const {
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (!isInitialized()) Parse();
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return Arch;
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  }
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// getVendor - Get the parsed vendor type of this triple.
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  VendorType getVendor() const {
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (!isInitialized()) Parse();
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return Vendor;
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  }
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// getOS - Get the parsed operating system type of this triple.
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  OSType getOS() const {
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (!isInitialized()) Parse();
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return OS;
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  }
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// hasEnvironment - Does this triple have the optional environment
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// (fourth) component?
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  bool hasEnvironment() const {
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return getEnvironmentName() != "";
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  }
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// @}
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// @name Direct Component Access
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// @{
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  const std::string &getTriple() const { return Data; }
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  // FIXME: Invent a lightweight string representation for these to
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  // use.
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// getArchName - Get the architecture (first) component of the
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// triple.
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  std::string getArchName() const;
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// getVendorName - Get the vendor (second) component of the triple.
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  std::string getVendorName() const;
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// getOSName - Get the operating system (third) component of the
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// triple.
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  std::string getOSName() const;
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// getEnvironmentName - Get the optional environment (fourth)
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// component of the triple, or "" if empty.
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  std::string getEnvironmentName() const;
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// getOSAndEnvironmentName - Get the operating system and optional
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// environment components as a single string (separated by a '-'
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// if the environment component is present).
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  std::string getOSAndEnvironmentName() const;
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// @}
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// @name Mutators
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// @{
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// setArch - Set the architecture (first) component of the triple
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// to a known type.
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  void setArch(ArchType Kind);
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// setVendor - Set the vendor (second) component of the triple to a
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// known type.
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  void setVendor(VendorType Kind);
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// setOS - Set the operating system (third) component of the triple
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// to a known type.
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  void setOS(OSType Kind);
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// setTriple - Set all components to the new triple \arg Str.
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  void setTriple(const std::string &Str);
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// setArchName - Set the architecture (first) component of the
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// triple by name.
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  void setArchName(const std::string &Str);
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// setVendorName - Set the vendor (second) component of the triple
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// by name.
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  void setVendorName(const std::string &Str);
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// setOSName - Set the operating system (third) component of the
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// triple by name.
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  void setOSName(const std::string &Str);
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// setEnvironmentName - Set the optional environment (fourth)
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// component of the triple by name.
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  void setEnvironmentName(const std::string &Str);
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// setOSAndEnvironmentName - Set the operating system and optional
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// environment components with a single string.
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  void setOSAndEnvironmentName(const std::string &Str);
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// @}
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// @name Static helpers for IDs.
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// @{
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// getArchTypeName - Get the canonical name for the \arg Kind
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// architecture.
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  static const char *getArchTypeName(ArchType Kind);
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// getVendorTypeName - Get the canonical name for the \arg Kind
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// vendor.
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  static const char *getVendorTypeName(VendorType Kind);
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// getOSTypeName - Get the canonical name for the \arg Kind vendor.
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  static const char *getOSTypeName(OSType Kind);
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /// @}
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} // End llvm namespace
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org