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