LLVM  4.0.0
TargetParser.h
Go to the documentation of this file.
1 //===-- TargetParser - Parser for target features ---------------*- 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 // This file implements a target parser to recognise hardware features such as
11 // FPU/CPU/ARCH names as well as specific support such as HDIV, etc.
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #ifndef LLVM_SUPPORT_TARGETPARSER_H
16 #define LLVM_SUPPORT_TARGETPARSER_H
17 
18 // FIXME: vector is used because that's what clang uses for subtarget feature
19 // lists, but SmallVector would probably be better
20 #include <vector>
21 
22 namespace llvm {
23 class StringRef;
24 
25 // Target specific information into their own namespaces. These should be
26 // generated from TableGen because the information is already there, and there
27 // is where new information about targets will be added.
28 // FIXME: To TableGen this we need to make some table generated files available
29 // even if the back-end is not compiled with LLVM, plus we need to create a new
30 // back-end to TableGen to create these clean tables.
31 namespace ARM {
32 
33 // FPU names.
34 enum FPUKind {
35 #define ARM_FPU(NAME, KIND, VERSION, NEON_SUPPORT, RESTRICTION) KIND,
36 #include "ARMTargetParser.def"
37  FK_LAST
38 };
39 
40 // FPU Version
41 enum FPUVersion {
42  FV_NONE = 0,
48 };
49 
50 // An FPU name implies one of three levels of Neon support:
52  NS_None = 0, ///< No Neon
53  NS_Neon, ///< Neon
54  NS_Crypto ///< Neon with Crypto
55 };
56 
57 // An FPU name restricts the FPU in one of three ways:
59  FR_None = 0, ///< No restriction
60  FR_D16, ///< Only 16 D registers
61  FR_SP_D16 ///< Only single-precision instructions, with 16 D registers
62 };
63 
64 // Arch names.
65 enum ArchKind {
66 #define ARM_ARCH(NAME, ID, CPU_ATTR, SUB_ARCH, ARCH_ATTR, ARCH_FPU, ARCH_BASE_EXT) ID,
67 #include "ARMTargetParser.def"
68  AK_LAST
69 };
70 
71 // Arch extension modifiers for CPUs.
72 enum ArchExtKind : unsigned {
73  AEK_INVALID = 0x0,
74  AEK_NONE = 0x1,
75  AEK_CRC = 0x2,
76  AEK_CRYPTO = 0x4,
77  AEK_FP = 0x8,
78  AEK_HWDIV = 0x10,
79  AEK_HWDIVARM = 0x20,
80  AEK_MP = 0x40,
81  AEK_SIMD = 0x80,
82  AEK_SEC = 0x100,
83  AEK_VIRT = 0x200,
84  AEK_DSP = 0x400,
85  AEK_FP16 = 0x800,
86  AEK_RAS = 0x1000,
87  // Unsupported extensions.
88  AEK_OS = 0x8000000,
89  AEK_IWMMXT = 0x10000000,
90  AEK_IWMMXT2 = 0x20000000,
91  AEK_MAVERICK = 0x40000000,
92  AEK_XSCALE = 0x80000000,
93 };
94 
95 // ISA kinds.
97 
98 // Endianness
99 // FIXME: BE8 vs. BE32?
101 
102 // v6/v7/v8 Profile
104 
106 
107 // Information by ID
108 StringRef getFPUName(unsigned FPUKind);
109 unsigned getFPUVersion(unsigned FPUKind);
110 unsigned getFPUNeonSupportLevel(unsigned FPUKind);
111 unsigned getFPURestriction(unsigned FPUKind);
112 
113 // FIXME: These should be moved to TargetTuple once it exists
114 bool getFPUFeatures(unsigned FPUKind, std::vector<StringRef> &Features);
115 bool getHWDivFeatures(unsigned HWDivKind, std::vector<StringRef> &Features);
116 bool getExtensionFeatures(unsigned Extensions,
117  std::vector<StringRef> &Features);
118 
119 StringRef getArchName(unsigned ArchKind);
120 unsigned getArchAttr(unsigned ArchKind);
121 StringRef getCPUAttr(unsigned ArchKind);
122 StringRef getSubArch(unsigned ArchKind);
125 StringRef getHWDivName(unsigned HWDivKind);
126 
127 // Information by Name
128 unsigned getDefaultFPU(StringRef CPU, unsigned ArchKind);
129 unsigned getDefaultExtensions(StringRef CPU, unsigned ArchKind);
131 
132 // Parser
133 unsigned parseHWDiv(StringRef HWDiv);
134 unsigned parseFPU(StringRef FPU);
135 unsigned parseArch(StringRef Arch);
136 unsigned parseArchExt(StringRef ArchExt);
137 unsigned parseCPUArch(StringRef CPU);
138 unsigned parseArchISA(StringRef Arch);
139 unsigned parseArchEndian(StringRef Arch);
140 unsigned parseArchProfile(StringRef Arch);
141 unsigned parseArchVersion(StringRef Arch);
142 
143 } // namespace ARM
144 
145 // FIXME:This should be made into class design,to avoid dupplication.
146 namespace AArch64 {
147 
148 // Arch names.
149 enum class ArchKind {
150 #define AARCH64_ARCH(NAME, ID, CPU_ATTR, SUB_ARCH, ARCH_ATTR, ARCH_FPU, ARCH_BASE_EXT) ID,
151 #include "AArch64TargetParser.def"
152  AK_LAST
153 };
154 
155 // Arch extension modifiers for CPUs.
156 enum ArchExtKind : unsigned {
157  AEK_INVALID = 0x0,
158  AEK_NONE = 0x1,
159  AEK_CRC = 0x2,
160  AEK_CRYPTO = 0x4,
161  AEK_FP = 0x8,
162  AEK_SIMD = 0x10,
163  AEK_FP16 = 0x20,
164  AEK_PROFILE = 0x40,
165  AEK_RAS = 0x80,
166  AEK_LSE = 0x100
167 };
168 
170 
171 // Information by ID
172 StringRef getFPUName(unsigned FPUKind);
173 unsigned getFPUVersion(unsigned FPUKind);
174 unsigned getFPUNeonSupportLevel(unsigned FPUKind);
175 unsigned getFPURestriction(unsigned FPUKind);
176 
177 // FIXME: These should be moved to TargetTuple once it exists
178 bool getFPUFeatures(unsigned FPUKind, std::vector<StringRef> &Features);
179 bool getExtensionFeatures(unsigned Extensions,
180  std::vector<StringRef> &Features);
181 bool getArchFeatures(unsigned ArchKind, std::vector<StringRef> &Features);
182 
183 StringRef getArchName(unsigned ArchKind);
184 unsigned getArchAttr(unsigned ArchKind);
185 StringRef getCPUAttr(unsigned ArchKind);
186 StringRef getSubArch(unsigned ArchKind);
189 unsigned checkArchVersion(StringRef Arch);
190 
191 // Information by Name
192 unsigned getDefaultFPU(StringRef CPU, unsigned ArchKind);
193 unsigned getDefaultExtensions(StringRef CPU, unsigned ArchKind);
195 
196 // Parser
197 unsigned parseFPU(StringRef FPU);
198 unsigned parseArch(StringRef Arch);
199 unsigned parseArchExt(StringRef ArchExt);
200 unsigned parseCPUArch(StringRef CPU);
201 unsigned parseArchISA(StringRef Arch);
202 unsigned parseArchEndian(StringRef Arch);
203 unsigned parseArchProfile(StringRef Arch);
204 unsigned parseArchVersion(StringRef Arch);
205 
206 } // namespace AArch64
207 } // namespace llvm
208 
209 #endif
unsigned parseArchEndian(StringRef Arch)
unsigned getFPURestriction(unsigned FPUKind)
unsigned parseCPUArch(StringRef CPU)
unsigned checkArchVersion(StringRef Arch)
unsigned getFPUNeonSupportLevel(unsigned FPUKind)
StringRef getArchExtFeature(StringRef ArchExt)
StringRef getDefaultCPU(StringRef Arch)
unsigned parseArchISA(StringRef Arch)
unsigned parseFPU(StringRef FPU)
unsigned parseArchProfile(StringRef Arch)
StringRef getArchExtName(unsigned ArchExtKind)
StringRef getFPUName(unsigned FPUKind)
unsigned getArchAttr(unsigned ArchKind)
bool getHWDivFeatures(unsigned HWDivKind, std::vector< StringRef > &Features)
StringRef getArchName(unsigned ArchKind)
StringRef getArchName(unsigned ArchKind)
unsigned parseArchExt(StringRef ArchExt)
StringRef getArchExtName(unsigned ArchExtKind)
StringRef getArchExtFeature(StringRef ArchExt)
bool getExtensionFeatures(unsigned Extensions, std::vector< StringRef > &Features)
unsigned getFPUNeonSupportLevel(unsigned FPUKind)
unsigned parseCPUArch(StringRef CPU)
unsigned parseArchISA(StringRef Arch)
StringRef getCPUAttr(unsigned ArchKind)
bool getArchFeatures(unsigned ArchKind, std::vector< StringRef > &Features)
unsigned getDefaultFPU(StringRef CPU, unsigned ArchKind)
Only single-precision instructions, with 16 D registers.
Definition: TargetParser.h:61
unsigned getFPUVersion(unsigned FPUKind)
Only 16 D registers.
Definition: TargetParser.h:60
unsigned parseArchVersion(StringRef Arch)
StringRef getCanonicalArchName(StringRef Arch)
unsigned parseArchEndian(StringRef Arch)
static const struct @305 Extensions[]
unsigned getFPUVersion(unsigned FPUKind)
bool getFPUFeatures(unsigned FPUKind, std::vector< StringRef > &Features)
bool getExtensionFeatures(unsigned Extensions, std::vector< StringRef > &Features)
bool getFPUFeatures(unsigned FPUKind, std::vector< StringRef > &Features)
unsigned parseArch(StringRef Arch)
StringRef getHWDivName(unsigned HWDivKind)
Neon with Crypto.
Definition: TargetParser.h:54
StringRef getCPUAttr(unsigned ArchKind)
unsigned getArchAttr(unsigned ArchKind)
StringRef getSubArch(unsigned ArchKind)
unsigned parseArchProfile(StringRef Arch)
No restriction.
Definition: TargetParser.h:59
StringRef getSubArch(unsigned ArchKind)
unsigned parseArchExt(StringRef ArchExt)
unsigned getDefaultExtensions(StringRef CPU, unsigned ArchKind)
unsigned parseArch(StringRef Arch)
unsigned parseFPU(StringRef FPU)
const FeatureBitset Features
unsigned parseHWDiv(StringRef HWDiv)
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:47
StringRef getCanonicalArchName(StringRef Arch)
unsigned getDefaultFPU(StringRef CPU, unsigned ArchKind)
unsigned getDefaultExtensions(StringRef CPU, unsigned ArchKind)
StringRef getDefaultCPU(StringRef Arch)
StringRef getFPUName(unsigned FPUKind)
unsigned getFPURestriction(unsigned FPUKind)
unsigned parseArchVersion(StringRef Arch)