clang: lib/Basic/Targets/AMDGPU.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
19#include "llvm/ADT/SmallString.h"
20using namespace clang;
22
25
26
27
28
29const LangASMap AMDGPUTargetInfo::AMDGPUDefIsGenMap = {
30 llvm::AMDGPUAS::FLAT_ADDRESS,
31 llvm::AMDGPUAS::GLOBAL_ADDRESS,
32 llvm::AMDGPUAS::LOCAL_ADDRESS,
33 llvm::AMDGPUAS::CONSTANT_ADDRESS,
34 llvm::AMDGPUAS::PRIVATE_ADDRESS,
35 llvm::AMDGPUAS::FLAT_ADDRESS,
36 llvm::AMDGPUAS::GLOBAL_ADDRESS,
37 llvm::AMDGPUAS::GLOBAL_ADDRESS,
38 llvm::AMDGPUAS::GLOBAL_ADDRESS,
39 llvm::AMDGPUAS::CONSTANT_ADDRESS,
40 llvm::AMDGPUAS::LOCAL_ADDRESS,
41 llvm::AMDGPUAS::GLOBAL_ADDRESS,
42 llvm::AMDGPUAS::GLOBAL_ADDRESS,
43 llvm::AMDGPUAS::GLOBAL_ADDRESS,
44 llvm::AMDGPUAS::LOCAL_ADDRESS,
45 llvm::AMDGPUAS::PRIVATE_ADDRESS,
46 llvm::AMDGPUAS::FLAT_ADDRESS,
47 llvm::AMDGPUAS::FLAT_ADDRESS,
48 llvm::AMDGPUAS::FLAT_ADDRESS,
49 llvm::AMDGPUAS::FLAT_ADDRESS,
50 llvm::AMDGPUAS::CONSTANT_ADDRESS,
51
52
53 llvm::AMDGPUAS::PRIVATE_ADDRESS,
54 llvm::AMDGPUAS::GLOBAL_ADDRESS,
55 llvm::AMDGPUAS::PRIVATE_ADDRESS,
56};
57
58const LangASMap AMDGPUTargetInfo::AMDGPUDefIsPrivMap = {
59 llvm::AMDGPUAS::PRIVATE_ADDRESS,
60 llvm::AMDGPUAS::GLOBAL_ADDRESS,
61 llvm::AMDGPUAS::LOCAL_ADDRESS,
62 llvm::AMDGPUAS::CONSTANT_ADDRESS,
63 llvm::AMDGPUAS::PRIVATE_ADDRESS,
64 llvm::AMDGPUAS::FLAT_ADDRESS,
65 llvm::AMDGPUAS::GLOBAL_ADDRESS,
66 llvm::AMDGPUAS::GLOBAL_ADDRESS,
67 llvm::AMDGPUAS::GLOBAL_ADDRESS,
68 llvm::AMDGPUAS::CONSTANT_ADDRESS,
69 llvm::AMDGPUAS::LOCAL_ADDRESS,
70
71 llvm::AMDGPUAS::FLAT_ADDRESS,
72 llvm::AMDGPUAS::FLAT_ADDRESS,
73 llvm::AMDGPUAS::FLAT_ADDRESS,
74 llvm::AMDGPUAS::FLAT_ADDRESS,
75 llvm::AMDGPUAS::FLAT_ADDRESS,
76 llvm::AMDGPUAS::FLAT_ADDRESS,
77 llvm::AMDGPUAS::FLAT_ADDRESS,
78 llvm::AMDGPUAS::FLAT_ADDRESS,
79 llvm::AMDGPUAS::FLAT_ADDRESS,
80 llvm::AMDGPUAS::CONSTANT_ADDRESS,
81 llvm::AMDGPUAS::PRIVATE_ADDRESS,
82 llvm::AMDGPUAS::GLOBAL_ADDRESS,
83 llvm::AMDGPUAS::PRIVATE_ADDRESS,
84};
85}
86}
87
90
93#define BUILTIN CLANG_BUILTIN_STR_TABLE
94#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_STR_TABLE
95#include "clang/Basic/BuiltinsAMDGPU.def"
96 ;
97
99#define BUILTIN CLANG_BUILTIN_ENTRY
100#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_ENTRY
101#include "clang/Basic/BuiltinsAMDGPU.def"
102});
103
104const char *const AMDGPUTargetInfo::GCCRegNames[] = {
105 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8",
106 "v9", "v10", "v11", "v12", "v13", "v14", "v15", "v16", "v17",
107 "v18", "v19", "v20", "v21", "v22", "v23", "v24", "v25", "v26",
108 "v27", "v28", "v29", "v30", "v31", "v32", "v33", "v34", "v35",
109 "v36", "v37", "v38", "v39", "v40", "v41", "v42", "v43", "v44",
110 "v45", "v46", "v47", "v48", "v49", "v50", "v51", "v52", "v53",
111 "v54", "v55", "v56", "v57", "v58", "v59", "v60", "v61", "v62",
112 "v63", "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
113 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79", "v80",
114 "v81", "v82", "v83", "v84", "v85", "v86", "v87", "v88", "v89",
115 "v90", "v91", "v92", "v93", "v94", "v95", "v96", "v97", "v98",
116 "v99", "v100", "v101", "v102", "v103", "v104", "v105", "v106", "v107",
117 "v108", "v109", "v110", "v111", "v112", "v113", "v114", "v115", "v116",
118 "v117", "v118", "v119", "v120", "v121", "v122", "v123", "v124", "v125",
119 "v126", "v127", "v128", "v129", "v130", "v131", "v132", "v133", "v134",
120 "v135", "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
121 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151", "v152",
122 "v153", "v154", "v155", "v156", "v157", "v158", "v159", "v160", "v161",
123 "v162", "v163", "v164", "v165", "v166", "v167", "v168", "v169", "v170",
124 "v171", "v172", "v173", "v174", "v175", "v176", "v177", "v178", "v179",
125 "v180", "v181", "v182", "v183", "v184", "v185", "v186", "v187", "v188",
126 "v189", "v190", "v191", "v192", "v193", "v194", "v195", "v196", "v197",
127 "v198", "v199", "v200", "v201", "v202", "v203", "v204", "v205", "v206",
128 "v207", "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
129 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223", "v224",
130 "v225", "v226", "v227", "v228", "v229", "v230", "v231", "v232", "v233",
131 "v234", "v235", "v236", "v237", "v238", "v239", "v240", "v241", "v242",
132 "v243", "v244", "v245", "v246", "v247", "v248", "v249", "v250", "v251",
133 "v252", "v253", "v254", "v255", "s0", "s1", "s2", "s3", "s4",
134 "s5", "s6", "s7", "s8", "s9", "s10", "s11", "s12", "s13",
135 "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21", "s22",
136 "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
137 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39", "s40",
138 "s41", "s42", "s43", "s44", "s45", "s46", "s47", "s48", "s49",
139 "s50", "s51", "s52", "s53", "s54", "s55", "s56", "s57", "s58",
140 "s59", "s60", "s61", "s62", "s63", "s64", "s65", "s66", "s67",
141 "s68", "s69", "s70", "s71", "s72", "s73", "s74", "s75", "s76",
142 "s77", "s78", "s79", "s80", "s81", "s82", "s83", "s84", "s85",
143 "s86", "s87", "s88", "s89", "s90", "s91", "s92", "s93", "s94",
144 "s95", "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
145 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111", "s112",
146 "s113", "s114", "s115", "s116", "s117", "s118", "s119", "s120", "s121",
147 "s122", "s123", "s124", "s125", "s126", "s127", "exec", "vcc", "scc",
148 "m0", "flat_scratch", "exec_lo", "exec_hi", "vcc_lo", "vcc_hi",
149 "flat_scratch_lo", "flat_scratch_hi",
150 "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8",
151 "a9", "a10", "a11", "a12", "a13", "a14", "a15", "a16", "a17",
152 "a18", "a19", "a20", "a21", "a22", "a23", "a24", "a25", "a26",
153 "a27", "a28", "a29", "a30", "a31", "a32", "a33", "a34", "a35",
154 "a36", "a37", "a38", "a39", "a40", "a41", "a42", "a43", "a44",
155 "a45", "a46", "a47", "a48", "a49", "a50", "a51", "a52", "a53",
156 "a54", "a55", "a56", "a57", "a58", "a59", "a60", "a61", "a62",
157 "a63", "a64", "a65", "a66", "a67", "a68", "a69", "a70", "a71",
158 "a72", "a73", "a74", "a75", "a76", "a77", "a78", "a79", "a80",
159 "a81", "a82", "a83", "a84", "a85", "a86", "a87", "a88", "a89",
160 "a90", "a91", "a92", "a93", "a94", "a95", "a96", "a97", "a98",
161 "a99", "a100", "a101", "a102", "a103", "a104", "a105", "a106", "a107",
162 "a108", "a109", "a110", "a111", "a112", "a113", "a114", "a115", "a116",
163 "a117", "a118", "a119", "a120", "a121", "a122", "a123", "a124", "a125",
164 "a126", "a127", "a128", "a129", "a130", "a131", "a132", "a133", "a134",
165 "a135", "a136", "a137", "a138", "a139", "a140", "a141", "a142", "a143",
166 "a144", "a145", "a146", "a147", "a148", "a149", "a150", "a151", "a152",
167 "a153", "a154", "a155", "a156", "a157", "a158", "a159", "a160", "a161",
168 "a162", "a163", "a164", "a165", "a166", "a167", "a168", "a169", "a170",
169 "a171", "a172", "a173", "a174", "a175", "a176", "a177", "a178", "a179",
170 "a180", "a181", "a182", "a183", "a184", "a185", "a186", "a187", "a188",
171 "a189", "a190", "a191", "a192", "a193", "a194", "a195", "a196", "a197",
172 "a198", "a199", "a200", "a201", "a202", "a203", "a204", "a205", "a206",
173 "a207", "a208", "a209", "a210", "a211", "a212", "a213", "a214", "a215",
174 "a216", "a217", "a218", "a219", "a220", "a221", "a222", "a223", "a224",
175 "a225", "a226", "a227", "a228", "a229", "a230", "a231", "a232", "a233",
176 "a234", "a235", "a236", "a237", "a238", "a239", "a240", "a241", "a242",
177 "a243", "a244", "a245", "a246", "a247", "a248", "a249", "a250", "a251",
178 "a252", "a253", "a254", "a255"
179};
180
184
186 llvm::StringMap &Features, DiagnosticsEngine &Diags, StringRef CPU,
187 const std::vectorstd::string &FeatureVec) const {
188
189 using namespace llvm::AMDGPU;
190
192 return false;
193
194 auto HasError = fillAMDGPUFeatureMap(CPU, getTriple(), Features);
195 switch (HasError.first) {
196 default:
197 break;
198 case llvm::AMDGPU::INVALID_FEATURE_COMBINATION:
199 Diags.Report(diag::err_invalid_feature_combination) << HasError.second;
200 return false;
201 case llvm::AMDGPU::UNSUPPORTED_TARGET_FEATURE:
202 Diags.Report(diag::err_opt_not_valid_on_target) << HasError.second;
203 return false;
204 }
205
206 return true;
207}
208
212 llvm::AMDGPU::fillValidArchListAMDGCN(Values);
213 else
214 llvm::AMDGPU::fillValidArchListR600(Values);
215}
216
218 AddrSpaceMap = DefaultIsPrivate ? &AMDGPUDefIsPrivMap : &AMDGPUDefIsGenMap;
219}
220
224 GPUKind(isAMDGCN(Triple) ?
225 llvm::AMDGPU::parseArchAMDGCN(Opts.CPU) :
226 llvm::AMDGPU::parseArchR600(Opts.CPU)),
227 GPUFeatures(isAMDGCN(Triple) ?
228 llvm::AMDGPU::getArchAttrAMDGCN(GPUKind) :
229 llvm::AMDGPU::getArchAttrR600(GPUKind)) {
231
233 !isAMDGCN(Triple));
235
236 if (isAMDGCN(Triple)) {
237
240 }
241
244 WavefrontSize = (GPUFeatures & llvm::AMDGPU::FEATURE_WAVE32) ? 32 : 64;
245
246
253 }
254
256 CUMode = !(GPUFeatures & llvm::AMDGPU::FEATURE_WGP);
257
258 for (auto F : {"image-insts", "gws", "vmem-to-lds-load-insts"}) {
259 if (GPUKind != llvm::AMDGPU::GK_NONE)
261 }
263}
264
268
269
270
271 setAddressSpaceMap((Opts.OpenCL && !Opts.OpenCLGenericAddressSpace) ||
273
275}
276
281
284 Builder.defineMacro("__AMD__");
285 Builder.defineMacro("__AMDGPU__");
286
288 Builder.defineMacro("__AMDGCN__");
289 else
290 Builder.defineMacro("__R600__");
291
292
293 bool IsHIPHost = Opts.HIP && !Opts.CUDAIsDevice;
294 if (GPUKind == llvm::AMDGPU::GK_NONE && !IsHIPHost)
295 return;
296
298 (isAMDGCN(getTriple()) ? getArchNameAMDGCN(GPUKind)
299 : getArchNameR600(GPUKind));
300
301
302
303 if (GPUKind >= llvm::AMDGPU::GK_AMDGCN_GENERIC_FIRST &&
304 GPUKind <= llvm::AMDGPU::GK_AMDGCN_GENERIC_LAST) {
305 llvm::replace(CanonName, '-', '_');
306 }
307
308 Builder.defineMacro(Twine("__") + Twine(CanonName) + Twine("__"));
309
310 if (isAMDGCN(getTriple()) && !IsHIPHost) {
311 assert(StringRef(CanonName).starts_with("gfx") &&
312 "Invalid amdgcn canonical name");
313 StringRef CanonFamilyName = getArchFamilyNameAMDGCN(GPUKind);
314 Builder.defineMacro(Twine("__") + Twine(CanonFamilyName.upper()) +
315 Twine("__"));
316 Builder.defineMacro("__amdgcn_processor__",
317 Twine("\"") + Twine(CanonName) + Twine("\""));
318 Builder.defineMacro("__amdgcn_target_id__",
319 Twine("\"") + Twine(*getTargetID()) + Twine("\""));
321 auto Loc = OffloadArchFeatures.find(F);
322 if (Loc != OffloadArchFeatures.end()) {
323 std::string NewF = F.str();
324 llvm::replace(NewF, '-', '_');
325 Builder.defineMacro(Twine("__amdgcn_feature_") + Twine(NewF) +
326 Twine("__"),
327 Loc->second ? "1" : "0");
328 }
329 }
330 }
331
333 Builder.defineMacro("__AMDGCN_UNSAFE_FP_ATOMICS__");
334
335
336
337 if (hasFMAF())
338 Builder.defineMacro("__HAS_FMAF__");
339 if (hasFastFMAF())
340 Builder.defineMacro("FP_FAST_FMAF");
341 if (hasLDEXPF())
342 Builder.defineMacro("__HAS_LDEXPF__");
343 if (hasFP64())
344 Builder.defineMacro("__HAS_FP64__");
345 if (hasFastFMA())
346 Builder.defineMacro("FP_FAST_FMA");
347
348 Builder.defineMacro("__AMDGCN_CUMODE__", Twine(CUMode));
349}
350
355
356
357
358
368
369
370
371
372
373
374
375
376
380 }
381}
Defines the Diagnostic-related interfaces.
static constexpr llvm::StringTable BuiltinStrings
Definition AMDGPU.cpp:91
static constexpr Builtin::Info BuiltinInfos[]
static constexpr unsigned NumBuiltins
Defines enum values for all the target-independent builtin functions.
#define CLANG_BUILTIN_STR_TABLE_START
Defines the clang::LangOptions interface.
Defines the clang::MacroBuilder utility class.
Enumerates target-specific builtins in their own namespaces within namespace clang.
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
bool AtomicIgnoreDenormalMode
void copyAuxTarget(const TargetInfo *Aux)
Copy type and layout related info.
TargetInfo(const llvm::Triple &T)
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
const LangASMap * AddrSpaceMap
virtual void adjust(DiagnosticsEngine &Diags, LangOptions &Opts, const TargetInfo *Aux)
Set forced language options.
unsigned char MaxAtomicPromoteWidth
bool UseAddrSpaceMapMangling
Specify if mangling based on address space map should be used or not for language specific address sp...
void resetDataLayout()
Set the data layout based on current triple and ABI.
llvm::StringSet ReadOnlyFeatures
virtual bool hasFloat128Type() const
Determine whether the __float128 type is supported on this target.
virtual bool initFeatureMap(llvm::StringMap< bool > &Features, DiagnosticsEngine &Diags, StringRef CPU, const std::vector< std::string > &FeatureVec) const
Initialize the map with the default set of target features for the CPU this should include all legal ...
unsigned char MaxAtomicInlineWidth
Options for controlling the target.
void setAuxTarget(const TargetInfo *Aux) override
Definition AMDGPU.cpp:351
ArrayRef< const char * > getGCCRegNames() const override
Definition AMDGPU.cpp:181
AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition AMDGPU.cpp:221
uint64_t getPointerWidthV(LangAS AS) const override
void fillValidCPUList(SmallVectorImpl< StringRef > &Values) const override
Fill a SmallVectorImpl with the valid values to setCPU.
Definition AMDGPU.cpp:209
void adjust(DiagnosticsEngine &Diags, LangOptions &Opts, const TargetInfo *Aux) override
Set forced language options.
Definition AMDGPU.cpp:265
bool initFeatureMap(llvm::StringMap< bool > &Features, DiagnosticsEngine &Diags, StringRef CPU, const std::vector< std::string > &FeatureVec) const override
Initialize the map with the default set of target features for the CPU this should include all legal ...
Definition AMDGPU.cpp:185
void setAddressSpaceMap(bool DefaultIsPrivate)
Definition AMDGPU.cpp:217
std::optional< std::string > getTargetID() const override
Returns the target ID if supported.
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
Definition AMDGPU.cpp:282
llvm::SmallVector< Builtin::InfosShard > getTargetBuiltins() const override
Return information about target-specific builtins for the current primary target, and info about whic...
Definition AMDGPU.cpp:278
uint64_t getMaxPointerWidth() const override
Return the maximum width of pointers on this target.
static constexpr std::array< Info, N > MakeInfos(std::array< Info, N > Infos)
A constexpr function to construct an infos array from X-macros.
The JSON file list parser is used to communicate input to InstallAPI.
llvm::SmallVector< llvm::StringRef, 4 > getAllPossibleTargetIDFeatures(const llvm::Triple &T, llvm::StringRef Processor)
Get all feature strings that can be used in target ID for Processor.
unsigned[(unsigned) LangAS::FirstTargetAddressSpace] LangASMap
The type of a lookup table which maps from language-specific address spaces to target-specific ones.
Diagnostic wrappers for TextAPI types for error reporting.
const llvm::fltSemantics * DoubleFormat
unsigned char PointerWidth
const llvm::fltSemantics * LongDoubleFormat
const llvm::fltSemantics * Float128Format
unsigned char PointerAlign
unsigned char BFloat16Width
unsigned char LongDoubleAlign
unsigned char LongDoubleWidth
unsigned char BFloat16Align
const llvm::fltSemantics * FloatFormat
const llvm::fltSemantics * HalfFormat
const llvm::fltSemantics * BFloat16Format