20#include "llvm/ADT/SmallString.h"
21#include "llvm/TargetParser/AMDGPUTargetParser.h"
31const LangASMap AMDGPUTargetInfo::AMDGPUAddrSpaceMap = {
69#define GET_BUILTIN_STR_TABLE
70#include "clang/Basic/BuiltinsAMDGPU.inc"
71#undef GET_BUILTIN_STR_TABLE
74#define GET_BUILTIN_INFOS
75#include "clang/Basic/BuiltinsAMDGPU.inc"
76#undef GET_BUILTIN_INFOS
80const char *
const AMDGPUTargetInfo::GCCRegNames[] = {
81 "v0",
"v1",
"v2",
"v3",
"v4",
"v5",
"v6",
"v7",
"v8",
82 "v9",
"v10",
"v11",
"v12",
"v13",
"v14",
"v15",
"v16",
"v17",
83 "v18",
"v19",
"v20",
"v21",
"v22",
"v23",
"v24",
"v25",
"v26",
84 "v27",
"v28",
"v29",
"v30",
"v31",
"v32",
"v33",
"v34",
"v35",
85 "v36",
"v37",
"v38",
"v39",
"v40",
"v41",
"v42",
"v43",
"v44",
86 "v45",
"v46",
"v47",
"v48",
"v49",
"v50",
"v51",
"v52",
"v53",
87 "v54",
"v55",
"v56",
"v57",
"v58",
"v59",
"v60",
"v61",
"v62",
88 "v63",
"v64",
"v65",
"v66",
"v67",
"v68",
"v69",
"v70",
"v71",
89 "v72",
"v73",
"v74",
"v75",
"v76",
"v77",
"v78",
"v79",
"v80",
90 "v81",
"v82",
"v83",
"v84",
"v85",
"v86",
"v87",
"v88",
"v89",
91 "v90",
"v91",
"v92",
"v93",
"v94",
"v95",
"v96",
"v97",
"v98",
92 "v99",
"v100",
"v101",
"v102",
"v103",
"v104",
"v105",
"v106",
"v107",
93 "v108",
"v109",
"v110",
"v111",
"v112",
"v113",
"v114",
"v115",
"v116",
94 "v117",
"v118",
"v119",
"v120",
"v121",
"v122",
"v123",
"v124",
"v125",
95 "v126",
"v127",
"v128",
"v129",
"v130",
"v131",
"v132",
"v133",
"v134",
96 "v135",
"v136",
"v137",
"v138",
"v139",
"v140",
"v141",
"v142",
"v143",
97 "v144",
"v145",
"v146",
"v147",
"v148",
"v149",
"v150",
"v151",
"v152",
98 "v153",
"v154",
"v155",
"v156",
"v157",
"v158",
"v159",
"v160",
"v161",
99 "v162",
"v163",
"v164",
"v165",
"v166",
"v167",
"v168",
"v169",
"v170",
100 "v171",
"v172",
"v173",
"v174",
"v175",
"v176",
"v177",
"v178",
"v179",
101 "v180",
"v181",
"v182",
"v183",
"v184",
"v185",
"v186",
"v187",
"v188",
102 "v189",
"v190",
"v191",
"v192",
"v193",
"v194",
"v195",
"v196",
"v197",
103 "v198",
"v199",
"v200",
"v201",
"v202",
"v203",
"v204",
"v205",
"v206",
104 "v207",
"v208",
"v209",
"v210",
"v211",
"v212",
"v213",
"v214",
"v215",
105 "v216",
"v217",
"v218",
"v219",
"v220",
"v221",
"v222",
"v223",
"v224",
106 "v225",
"v226",
"v227",
"v228",
"v229",
"v230",
"v231",
"v232",
"v233",
107 "v234",
"v235",
"v236",
"v237",
"v238",
"v239",
"v240",
"v241",
"v242",
108 "v243",
"v244",
"v245",
"v246",
"v247",
"v248",
"v249",
"v250",
"v251",
109 "v252",
"v253",
"v254",
"v255",
"s0",
"s1",
"s2",
"s3",
"s4",
110 "s5",
"s6",
"s7",
"s8",
"s9",
"s10",
"s11",
"s12",
"s13",
111 "s14",
"s15",
"s16",
"s17",
"s18",
"s19",
"s20",
"s21",
"s22",
112 "s23",
"s24",
"s25",
"s26",
"s27",
"s28",
"s29",
"s30",
"s31",
113 "s32",
"s33",
"s34",
"s35",
"s36",
"s37",
"s38",
"s39",
"s40",
114 "s41",
"s42",
"s43",
"s44",
"s45",
"s46",
"s47",
"s48",
"s49",
115 "s50",
"s51",
"s52",
"s53",
"s54",
"s55",
"s56",
"s57",
"s58",
116 "s59",
"s60",
"s61",
"s62",
"s63",
"s64",
"s65",
"s66",
"s67",
117 "s68",
"s69",
"s70",
"s71",
"s72",
"s73",
"s74",
"s75",
"s76",
118 "s77",
"s78",
"s79",
"s80",
"s81",
"s82",
"s83",
"s84",
"s85",
119 "s86",
"s87",
"s88",
"s89",
"s90",
"s91",
"s92",
"s93",
"s94",
120 "s95",
"s96",
"s97",
"s98",
"s99",
"s100",
"s101",
"s102",
"s103",
121 "s104",
"s105",
"s106",
"s107",
"s108",
"s109",
"s110",
"s111",
"s112",
122 "s113",
"s114",
"s115",
"s116",
"s117",
"s118",
"s119",
"s120",
"s121",
123 "s122",
"s123",
"s124",
"s125",
"s126",
"s127",
"exec",
"vcc",
"scc",
124 "m0",
"flat_scratch",
"exec_lo",
"exec_hi",
"vcc_lo",
"vcc_hi",
125 "flat_scratch_lo",
"flat_scratch_hi",
126 "a0",
"a1",
"a2",
"a3",
"a4",
"a5",
"a6",
"a7",
"a8",
127 "a9",
"a10",
"a11",
"a12",
"a13",
"a14",
"a15",
"a16",
"a17",
128 "a18",
"a19",
"a20",
"a21",
"a22",
"a23",
"a24",
"a25",
"a26",
129 "a27",
"a28",
"a29",
"a30",
"a31",
"a32",
"a33",
"a34",
"a35",
130 "a36",
"a37",
"a38",
"a39",
"a40",
"a41",
"a42",
"a43",
"a44",
131 "a45",
"a46",
"a47",
"a48",
"a49",
"a50",
"a51",
"a52",
"a53",
132 "a54",
"a55",
"a56",
"a57",
"a58",
"a59",
"a60",
"a61",
"a62",
133 "a63",
"a64",
"a65",
"a66",
"a67",
"a68",
"a69",
"a70",
"a71",
134 "a72",
"a73",
"a74",
"a75",
"a76",
"a77",
"a78",
"a79",
"a80",
135 "a81",
"a82",
"a83",
"a84",
"a85",
"a86",
"a87",
"a88",
"a89",
136 "a90",
"a91",
"a92",
"a93",
"a94",
"a95",
"a96",
"a97",
"a98",
137 "a99",
"a100",
"a101",
"a102",
"a103",
"a104",
"a105",
"a106",
"a107",
138 "a108",
"a109",
"a110",
"a111",
"a112",
"a113",
"a114",
"a115",
"a116",
139 "a117",
"a118",
"a119",
"a120",
"a121",
"a122",
"a123",
"a124",
"a125",
140 "a126",
"a127",
"a128",
"a129",
"a130",
"a131",
"a132",
"a133",
"a134",
141 "a135",
"a136",
"a137",
"a138",
"a139",
"a140",
"a141",
"a142",
"a143",
142 "a144",
"a145",
"a146",
"a147",
"a148",
"a149",
"a150",
"a151",
"a152",
143 "a153",
"a154",
"a155",
"a156",
"a157",
"a158",
"a159",
"a160",
"a161",
144 "a162",
"a163",
"a164",
"a165",
"a166",
"a167",
"a168",
"a169",
"a170",
145 "a171",
"a172",
"a173",
"a174",
"a175",
"a176",
"a177",
"a178",
"a179",
146 "a180",
"a181",
"a182",
"a183",
"a184",
"a185",
"a186",
"a187",
"a188",
147 "a189",
"a190",
"a191",
"a192",
"a193",
"a194",
"a195",
"a196",
"a197",
148 "a198",
"a199",
"a200",
"a201",
"a202",
"a203",
"a204",
"a205",
"a206",
149 "a207",
"a208",
"a209",
"a210",
"a211",
"a212",
"a213",
"a214",
"a215",
150 "a216",
"a217",
"a218",
"a219",
"a220",
"a221",
"a222",
"a223",
"a224",
151 "a225",
"a226",
"a227",
"a228",
"a229",
"a230",
"a231",
"a232",
"a233",
152 "a234",
"a235",
"a236",
"a237",
"a238",
"a239",
"a240",
"a241",
"a242",
153 "a243",
"a244",
"a245",
"a246",
"a247",
"a248",
"a249",
"a250",
"a251",
154 "a252",
"a253",
"a254",
"a255"
163 const std::vector<std::string> &FeatureVec)
const {
170 auto HasError = fillAMDGPUFeatureMap(CPU,
getTriple(), Features);
171 switch (HasError.first) {
174 case llvm::AMDGPU::INVALID_FEATURE_COMBINATION:
175 Diags.
Report(diag::err_invalid_feature_combination) << HasError.second;
177 case llvm::AMDGPU::UNSUPPORTED_TARGET_FEATURE:
178 Diags.
Report(diag::err_opt_not_valid_on_target) << HasError.second;
188 llvm::AMDGPU::fillValidArchListAMDGCN(Values,
getTriple().getSubArch());
190 llvm::AMDGPU::fillValidArchListR600(Values);
196 GPUKind(Triple.isAMDGCN()
197 ? (Opts.CPU.empty() ?
llvm::
AMDGPU::getGPUKindFromSubArch(
201 GPUFeatures(Triple.isAMDGCN() ?
llvm::
AMDGPU::FEATURE_NONE
209 if (Triple.isAMDGCN()) {
219 WavefrontSize = llvm::AMDGPU::getFeatureBitset(GPUKind).test(
220 llvm::AMDGPU::FEAT_SUPPORTS_WAVE32)
236 CUMode = !llvm::AMDGPU::getFeatureBitset(GPUKind).test(
237 llvm::AMDGPU::FEAT_SUPPORTS_WGP);
239 for (
auto F : {
"image-insts",
"gws",
"vmem-to-lds-load-insts",
"supports-wgp",
240 "supports-wave32",
"xnack-support",
"sramecc-support",
241 "xnack-on-off-modes"}) {
242 if (GPUKind != llvm::AMDGPU::GK_NONE)
248 OffloadArchFeatures[
"xnack"] =
253 OffloadArchFeatures[
"sramecc"] =
271 Builder.defineMacro(
"__AMD__");
272 Builder.defineMacro(
"__AMDGPU__");
275 Builder.defineMacro(
"__AMDGCN__");
277 Builder.defineMacro(
"__R600__");
282 Builder.defineMacro(
"__HAS_FMAF__");
284 Builder.defineMacro(
"FP_FAST_FMAF");
286 Builder.defineMacro(
"__HAS_LDEXPF__");
288 Builder.defineMacro(
"__HAS_FP64__");
290 Builder.defineMacro(
"FP_FAST_FMA");
292 Builder.defineMacro(
"FP_FAST_FMA_HALF");
294 Builder.defineMacro(
"__AMDGCN_CUMODE__", Twine(CUMode));
297 bool IsHIPHost = Opts.HIP && !Opts.CUDAIsDevice;
298 if (GPUKind == llvm::AMDGPU::GK_NONE && !IsHIPHost)
302 (
getTriple().isAMDGCN() ? getArchNameAMDGCN(GPUKind)
303 : getArchNameR600(GPUKind));
307 llvm::replace(CanonName,
'-',
'_');
309 Builder.defineMacro(Twine(
"__") + Twine(CanonName) + Twine(
"__"));
311 if (
getTriple().isAMDGCN() && !IsHIPHost) {
312 assert(StringRef(CanonName).starts_with(
"gfx") &&
313 "Invalid amdgcn canonical name");
314 StringRef CanonFamilyName = getArchFamilyNameAMDGCN(GPUKind);
315 Builder.defineMacro(Twine(
"__") + Twine(CanonFamilyName.upper()) +
317 Builder.defineMacro(
"__amdgcn_processor__",
318 Twine(
"\"") + Twine(CanonName) + Twine(
"\""));
320 "__amdgcn_target_id__",
323 OffloadArchFeatures)) +
326 auto Loc = OffloadArchFeatures.find(F);
327 if (Loc != OffloadArchFeatures.end()) {
328 std::string NewF = F.str();
329 llvm::replace(NewF,
'-',
'_');
330 Builder.defineMacro(Twine(
"__amdgcn_feature_") + Twine(NewF) +
332 Loc->second ?
"1" :
"0");
338 Builder.defineMacro(
"__AMDGCN_UNSAFE_FP_ATOMICS__");
Defines the Diagnostic-related interfaces.
static constexpr llvm::StringTable BuiltinStrings
static constexpr Builtin::Info BuiltinInfos[]
static constexpr unsigned NumBuiltins
Defines enum values for all the target-independent builtin functions.
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.
AMDGPUFeatureState AMDGPUSramEccState
AMDGPU sramecc setting from -msramecc/-mno-sramecc.
AMDGPUFeatureState AMDGPUXnackState
AMDGPU xnack setting from -mxnack/-mno-xnack.
@ Enabled
Feature explicitly enabled.
@ Any
Feature state not specified and should generate most compatible code.
void setAuxTarget(const TargetInfo *Aux) override
ArrayRef< const char * > getGCCRegNames() const override
AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
uint64_t getPointerWidthV(LangAS AS) const override
void fillValidCPUList(SmallVectorImpl< StringRef > &Values) const override
Fill a SmallVectorImpl with the valid values to setCPU.
void adjust(DiagnosticsEngine &Diags, LangOptions &Opts, const TargetInfo *Aux) override
Set forced language options.
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 ...
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
llvm::SmallVector< Builtin::InfosShard > getTargetBuiltins() const override
Return information about target-specific builtins for the current primary target, and info about whic...
uint64_t getMaxPointerWidth() const override
Return the maximum width of pointers on this target.
Top level wrappers for InstallAPI frontend operations.
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.
std::string getCanonicalTargetID(llvm::StringRef Processor, const llvm::StringMap< bool > &Features)
Returns canonical target ID, assuming Processor is canonical and all entries in Features are valid.
Diagnostic wrappers for TextAPI types for error reporting.
The info used to represent each builtin.
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