]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm-project/llvm/include/llvm/Support/TargetParser.h
Merge llvm-project main llvmorg-14-init-17616-g024a1fab5c35
[FreeBSD/FreeBSD.git] / contrib / llvm-project / llvm / include / llvm / Support / TargetParser.h
1 //===-- TargetParser - Parser for target features ---------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file implements a target parser to recognise hardware features such as
10 // FPU/CPU/ARCH names as well as specific support such as HDIV, etc.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #ifndef LLVM_SUPPORT_TARGETPARSER_H
15 #define LLVM_SUPPORT_TARGETPARSER_H
16
17 // FIXME: vector is used because that's what clang uses for subtarget feature
18 // lists, but SmallVector would probably be better
19 #include "llvm/Support/RISCVISAInfo.h"
20 #include <vector>
21
22 namespace llvm {
23
24 class StringRef;
25 template <typename T> class SmallVectorImpl;
26 class Triple;
27
28 // Target specific information in their own namespaces.
29 // (ARM/AArch64/X86 are declared in ARM/AArch64/X86TargetParser.h)
30 // These should be generated from TableGen because the information is already
31 // there, and there is where new information about targets will be added.
32 // FIXME: To TableGen this we need to make some table generated files available
33 // even if the back-end is not compiled with LLVM, plus we need to create a new
34 // back-end to TableGen to create these clean tables.
35 namespace AMDGPU {
36
37 /// GPU kinds supported by the AMDGPU target.
38 enum GPUKind : uint32_t {
39   // Not specified processor.
40   GK_NONE = 0,
41
42   // R600-based processors.
43   GK_R600 = 1,
44   GK_R630 = 2,
45   GK_RS880 = 3,
46   GK_RV670 = 4,
47   GK_RV710 = 5,
48   GK_RV730 = 6,
49   GK_RV770 = 7,
50   GK_CEDAR = 8,
51   GK_CYPRESS = 9,
52   GK_JUNIPER = 10,
53   GK_REDWOOD = 11,
54   GK_SUMO = 12,
55   GK_BARTS = 13,
56   GK_CAICOS = 14,
57   GK_CAYMAN = 15,
58   GK_TURKS = 16,
59
60   GK_R600_FIRST = GK_R600,
61   GK_R600_LAST = GK_TURKS,
62
63   // AMDGCN-based processors.
64   GK_GFX600 = 32,
65   GK_GFX601 = 33,
66   GK_GFX602 = 34,
67
68   GK_GFX700 = 40,
69   GK_GFX701 = 41,
70   GK_GFX702 = 42,
71   GK_GFX703 = 43,
72   GK_GFX704 = 44,
73   GK_GFX705 = 45,
74
75   GK_GFX801 = 50,
76   GK_GFX802 = 51,
77   GK_GFX803 = 52,
78   GK_GFX805 = 53,
79   GK_GFX810 = 54,
80
81   GK_GFX900 = 60,
82   GK_GFX902 = 61,
83   GK_GFX904 = 62,
84   GK_GFX906 = 63,
85   GK_GFX908 = 64,
86   GK_GFX909 = 65,
87   GK_GFX90A = 66,
88   GK_GFX90C = 67,
89
90   GK_GFX1010 = 71,
91   GK_GFX1011 = 72,
92   GK_GFX1012 = 73,
93   GK_GFX1013 = 74,
94   GK_GFX1030 = 75,
95   GK_GFX1031 = 76,
96   GK_GFX1032 = 77,
97   GK_GFX1033 = 78,
98   GK_GFX1034 = 79,
99   GK_GFX1035 = 80,
100
101   GK_AMDGCN_FIRST = GK_GFX600,
102   GK_AMDGCN_LAST = GK_GFX1035,
103 };
104
105 /// Instruction set architecture version.
106 struct IsaVersion {
107   unsigned Major;
108   unsigned Minor;
109   unsigned Stepping;
110 };
111
112 // This isn't comprehensive for now, just things that are needed from the
113 // frontend driver.
114 enum ArchFeatureKind : uint32_t {
115   FEATURE_NONE = 0,
116
117   // These features only exist for r600, and are implied true for amdgcn.
118   FEATURE_FMA = 1 << 1,
119   FEATURE_LDEXP = 1 << 2,
120   FEATURE_FP64 = 1 << 3,
121
122   // Common features.
123   FEATURE_FAST_FMA_F32 = 1 << 4,
124   FEATURE_FAST_DENORMAL_F32 = 1 << 5,
125
126   // Wavefront 32 is available.
127   FEATURE_WAVE32 = 1 << 6,
128
129   // Xnack is available.
130   FEATURE_XNACK = 1 << 7,
131
132   // Sram-ecc is available.
133   FEATURE_SRAMECC = 1 << 8,
134 };
135
136 StringRef getArchNameAMDGCN(GPUKind AK);
137 StringRef getArchNameR600(GPUKind AK);
138 StringRef getCanonicalArchName(const Triple &T, StringRef Arch);
139 GPUKind parseArchAMDGCN(StringRef CPU);
140 GPUKind parseArchR600(StringRef CPU);
141 unsigned getArchAttrAMDGCN(GPUKind AK);
142 unsigned getArchAttrR600(GPUKind AK);
143
144 void fillValidArchListAMDGCN(SmallVectorImpl<StringRef> &Values);
145 void fillValidArchListR600(SmallVectorImpl<StringRef> &Values);
146
147 IsaVersion getIsaVersion(StringRef GPU);
148
149 } // namespace AMDGPU
150
151 namespace RISCV {
152
153 enum CPUKind : unsigned {
154 #define PROC(ENUM, NAME, FEATURES, DEFAULT_MARCH) CK_##ENUM,
155 #include "RISCVTargetParser.def"
156 };
157
158 enum FeatureKind : unsigned {
159   FK_INVALID = 0,
160   FK_NONE = 1,
161   FK_64BIT = 1 << 2,
162 };
163
164 bool checkCPUKind(CPUKind Kind, bool IsRV64);
165 bool checkTuneCPUKind(CPUKind Kind, bool IsRV64);
166 CPUKind parseCPUKind(StringRef CPU);
167 CPUKind parseTuneCPUKind(StringRef CPU, bool IsRV64);
168 StringRef getMArchFromMcpu(StringRef CPU);
169 void fillValidCPUArchList(SmallVectorImpl<StringRef> &Values, bool IsRV64);
170 void fillValidTuneCPUArchList(SmallVectorImpl<StringRef> &Values, bool IsRV64);
171 bool getCPUFeaturesExceptStdExt(CPUKind Kind, std::vector<StringRef> &Features);
172 StringRef resolveTuneCPUAlias(StringRef TuneCPU, bool IsRV64);
173 StringRef computeDefaultABIFromArch(const llvm::RISCVISAInfo &ISAInfo);
174
175 } // namespace RISCV
176
177 namespace ARM {
178 struct ParsedBranchProtection {
179   StringRef Scope;
180   StringRef Key;
181   bool BranchTargetEnforcement;
182 };
183
184 bool parseBranchProtection(StringRef Spec, ParsedBranchProtection &PBP,
185                            StringRef &Err);
186
187 } // namespace ARM
188
189 } // namespace llvm
190
191 #endif