Skip to content

Commit 63d0328

Browse files
committed
[AMDGPU] Do not emit arch dependent macros with unspecified cpu
Summary: Currently, the AMDGPU toolchain accepts not passing `-mcpu` as a means to create a sort of "generic" IR. The resulting IR will not contain any target dependent attributes and can then be inserted into another program via `-mlink-builtin-bitcode` to inherit its attributes. However, there are a handful of macros that can leak incorrect information when compiling for an unspecified architecture. Currently, things like the wavefront size will default to 64, which is actually variable. We should not expose these macros unless it is known.
1 parent 55c6d91 commit 63d0328

File tree

3 files changed

+38
-30
lines changed

3 files changed

+38
-30
lines changed

clang/lib/Basic/Targets/AMDGPU.cpp

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -274,30 +274,31 @@ void AMDGPUTargetInfo::getTargetDefines(const LangOptions &Opts,
274274
else
275275
Builder.defineMacro("__R600__");
276276

277-
if (GPUKind != llvm::AMDGPU::GK_NONE) {
278-
StringRef CanonName = isAMDGCN(getTriple()) ?
279-
getArchNameAMDGCN(GPUKind) : getArchNameR600(GPUKind);
280-
Builder.defineMacro(Twine("__") + Twine(CanonName) + Twine("__"));
281-
// Emit macros for gfx family e.g. gfx906 -> __GFX9__, gfx1030 -> __GFX10___
282-
if (isAMDGCN(getTriple())) {
283-
assert(CanonName.starts_with("gfx") && "Invalid amdgcn canonical name");
284-
Builder.defineMacro(Twine("__") + Twine(CanonName.drop_back(2).upper()) +
285-
Twine("__"));
286-
}
287-
if (isAMDGCN(getTriple())) {
288-
Builder.defineMacro("__amdgcn_processor__",
289-
Twine("\"") + Twine(CanonName) + Twine("\""));
290-
Builder.defineMacro("__amdgcn_target_id__",
291-
Twine("\"") + Twine(*getTargetID()) + Twine("\""));
292-
for (auto F : getAllPossibleTargetIDFeatures(getTriple(), CanonName)) {
293-
auto Loc = OffloadArchFeatures.find(F);
294-
if (Loc != OffloadArchFeatures.end()) {
295-
std::string NewF = F.str();
296-
std::replace(NewF.begin(), NewF.end(), '-', '_');
297-
Builder.defineMacro(Twine("__amdgcn_feature_") + Twine(NewF) +
298-
Twine("__"),
299-
Loc->second ? "1" : "0");
300-
}
277+
if (GPUKind == llvm::AMDGPU::GK_NONE)
278+
return;
279+
280+
StringRef CanonName = isAMDGCN(getTriple()) ?
281+
getArchNameAMDGCN(GPUKind) : getArchNameR600(GPUKind);
282+
Builder.defineMacro(Twine("__") + Twine(CanonName) + Twine("__"));
283+
// Emit macros for gfx family e.g. gfx906 -> __GFX9__, gfx1030 -> __GFX10___
284+
if (isAMDGCN(getTriple())) {
285+
assert(CanonName.starts_with("gfx") && "Invalid amdgcn canonical name");
286+
Builder.defineMacro(Twine("__") + Twine(CanonName.drop_back(2).upper()) +
287+
Twine("__"));
288+
}
289+
if (isAMDGCN(getTriple())) {
290+
Builder.defineMacro("__amdgcn_processor__",
291+
Twine("\"") + Twine(CanonName) + Twine("\""));
292+
Builder.defineMacro("__amdgcn_target_id__",
293+
Twine("\"") + Twine(*getTargetID()) + Twine("\""));
294+
for (auto F : getAllPossibleTargetIDFeatures(getTriple(), CanonName)) {
295+
auto Loc = OffloadArchFeatures.find(F);
296+
if (Loc != OffloadArchFeatures.end()) {
297+
std::string NewF = F.str();
298+
std::replace(NewF.begin(), NewF.end(), '-', '_');
299+
Builder.defineMacro(Twine("__amdgcn_feature_") + Twine(NewF) +
300+
Twine("__"),
301+
Loc->second ? "1" : "0");
301302
}
302303
}
303304
}

clang/test/CodeGenOpenCL/builtins-amdgcn-wave64.cl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,6 @@ void test_read_exec_hi(global ulong* out) {
4444
*out = __builtin_amdgcn_read_exec_hi();
4545
}
4646

47-
#if __AMDGCN_WAVEFRONT_SIZE != 64
47+
#if defined(__AMDGCN_WAVEFRONT_SIZE__) && __AMDGCN_WAVEFRONT_SIZE__ != 64
4848
#error Wrong wavesize detected
4949
#endif

clang/test/Preprocessor/predefined-arch-macros.c

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4294,13 +4294,20 @@
42944294

42954295
// Begin amdgcn tests ----------------
42964296

4297-
// RUN: %clang -march=amdgcn -E -dM %s -o - 2>&1 \
4297+
// RUN: %clang -mcpu=gfx803 -E -dM %s -o - 2>&1 \
4298+
// RUN: -target amdgcn-unknown-unknown \
4299+
// RUN: | FileCheck -match-full-lines %s -check-prefixes=CHECK_AMDGCN,CHECK_AMDGCN_803
4300+
// RUN: %clang -E -dM %s -o - 2>&1 \
42984301
// RUN: -target amdgcn-unknown-unknown \
4299-
// RUN: | FileCheck -match-full-lines %s -check-prefix=CHECK_AMDGCN
4302+
// RUN: | FileCheck -match-full-lines %s -check-prefixes=CHECK_AMDGCN,CHECK_AMDGCN_NONE
43004303
// CHECK_AMDGCN: #define __AMDGCN__ 1
4301-
// CHECK_AMDGCN: #define __HAS_FMAF__ 1
4302-
// CHECK_AMDGCN: #define __HAS_FP64__ 1
4303-
// CHECK_AMDGCN: #define __HAS_LDEXPF__ 1
4304+
// CHECK_AMDGCN_803: #define __HAS_FMAF__ 1
4305+
// CHECK_AMDGCN_803: #define __HAS_FP64__ 1
4306+
// CHECK_AMDGCN_803: #define __HAS_LDEXPF__ 1
4307+
// CHECK_AMDGCN_NONE-NOT: #define __HAS_FMAF__
4308+
// CHECK_AMDGCN_NONE-NOT: #define __HAS_FP64__
4309+
// CHECK_AMDGCN_NONE-NOT: #define __HAS_LDEXPF__
4310+
// CHECK_AMDGCN_NONE-NOT: #define __AMDGCN_WAVEFRONT_SIZE__
43044311

43054312
// Begin r600 tests ----------------
43064313

0 commit comments

Comments
 (0)