Skip to content

Commit 9912ac2

Browse files
authored
[SYCL] Don't define SYCL_EXTERNAL if -fno-sycl-rdc is passed (#8537)
Please review this commit by commit because one of the commits affects a ton of files. Thanks! The SYCL [spec ](https://registry.khronos.org/SYCL/specs/sycl-2020/html/sycl-2020.html#subsec:syclexternal)allows us to declare we don't support device function calls outside of the current translation unit by not defining the `SYCL_EXTERNAL` macro. With the `-fno-sycl-rdc` option, this is exactly that case: we do not support calls outside of the TU, so don't define the macro. However, we define and use the `SYCL_EXTERNAL` in the SYCL headers also, so instead add `__DPCPP_SYCL_EXTERNAL` and use that. It is defined to `SYCL_EXTERNAL` if `SYCL_EXTERNAL` is defined, and otherwise `__attribute__((sycl_device))` for device code or empty for host. This is fine because none of the uses here actually end up as cross-TU calls, it's either linked in from the device libraries or replaced by the SPIR-V translator to some SPIR-V intrinsic. I added a test in `sycl/test/basic_tests/macros_no_rdc.cpp` to make sure nobody uses `SYCL_EXTERNAL` directly in the SYCL headers in the future. (UPDATE: This part has been removed) However, with the macro being undefined, if a user tries to use it, they just get the classic `unknown type name 'SYCL_EXTERNAL'` which is not super helpful. I added some really gross code to give a better error message, but I'd like to hear from the CFE folks if there's a better way to do it, and if not, if it's so gross we should just drop it and rely on the normal error. Relevant discussion: #8479 --------- Signed-off-by: Sarnie, Nick <nick.sarnie@intel.com>
1 parent 723b80d commit 9912ac2

File tree

16 files changed

+1017
-894
lines changed

16 files changed

+1017
-894
lines changed

clang/include/clang/Basic/DiagnosticSemaKinds.td

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11835,9 +11835,6 @@ def err_sycl_restrict : Error<
1183511835
def err_sycl_external_global : Error<
1183611836
"invalid reference to 'device_global' variable; external 'device_global'"
1183711837
" variable must be marked with SYCL_EXTERNAL macro">;
11838-
def err_sycl_external_no_rdc : Error<
11839-
"invalid %select{declaration|definition}0 of SYCL_EXTERNAL function in non-relocatable "
11840-
"device code mode">;
1184111838
def warn_sycl_kernel_too_big_args : Warning<
1184211839
"size of kernel arguments (%0 bytes) may exceed the supported maximum "
1184311840
"of %1 bytes on some devices">, InGroup<SyclStrict>, ShowInSystemHeader;

clang/lib/Frontend/InitPreprocessor.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1297,7 +1297,8 @@ static void InitializePredefinedMacros(const TargetInfo &TI,
12971297
// SYCL device compiler which doesn't produce host binary.
12981298
if (LangOpts.SYCLIsDevice) {
12991299
Builder.defineMacro("__SYCL_DEVICE_ONLY__");
1300-
Builder.defineMacro("SYCL_EXTERNAL", "__attribute__((sycl_device))");
1300+
if (LangOpts.GPURelocatableDeviceCode)
1301+
Builder.defineMacro("SYCL_EXTERNAL", "__attribute__((sycl_device))");
13011302

13021303
const llvm::Triple &DeviceTriple = TI.getTriple();
13031304
const llvm::Triple::SubArchType DeviceSubArch = DeviceTriple.getSubArch();

clang/lib/Sema/SemaDecl.cpp

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10296,15 +10296,6 @@ Sema::ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC,
1029610296
}
1029710297
}
1029810298

10299-
if (getLangOpts().SYCLIsDevice && !getLangOpts().GPURelocatableDeviceCode &&
10300-
NewFD->hasAttr<SYCLDeviceAttr>() &&
10301-
!getSourceManager().isInSystemHeader(NewFD->getLocation())) {
10302-
Diag(NewFD->getLocation(), diag::err_sycl_external_no_rdc)
10303-
<< (D.getFunctionDefinitionKind() ==
10304-
clang::FunctionDefinitionKind::Definition);
10305-
NewFD->setInvalidDecl();
10306-
}
10307-
1030810299
if (!getLangOpts().CPlusPlus) {
1030910300
// Perform semantic checking on the function declaration.
1031010301
if (!NewFD->isInvalidDecl() && NewFD->isMain())

clang/test/SemaSYCL/sycl-no-rdc.cpp

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
// RUN: %clang_cc1 -fsycl-is-device -verify -fsyntax-only -fno-gpu-rdc -internal-isystem %S/Inputs %s
22

3-
// Check that declarations of SYCL_EXTERNAL functions throw an error if -fno-gpu-rdc is passed
3+
// Check that uses of SYCL_EXTERNAL throw an error if -fno-gpu-rdc is passed
44
#include "sycl.hpp"
55

6-
// expected-error@+1{{invalid declaration of SYCL_EXTERNAL function in non-relocatable device code mode}}
7-
SYCL_EXTERNAL void syclExternalDecl();
8-
9-
// expected-error@+1{{invalid definition of SYCL_EXTERNAL function in non-relocatable device code mode}}
10-
SYCL_EXTERNAL void syclExternalDefn() {}
6+
// expected-error@+1{{unknown type name 'SYCL_EXTERNAL'}}
7+
SYCL_EXTERNAL void syclExternal() {}
118

129
using namespace sycl;
1310
queue q;

sycl/include/CL/__spirv/spirv_ops.hpp

Lines changed: 239 additions & 211 deletions
Large diffs are not rendered by default.

sycl/include/CL/__spirv/spirv_vars.hpp

Lines changed: 52 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -17,39 +17,39 @@
1717

1818
#if defined(__NVPTX__) || defined(__AMDGCN__)
1919

20-
SYCL_EXTERNAL size_t __spirv_GlobalInvocationId_x();
21-
SYCL_EXTERNAL size_t __spirv_GlobalInvocationId_y();
22-
SYCL_EXTERNAL size_t __spirv_GlobalInvocationId_z();
20+
__DPCPP_SYCL_EXTERNAL size_t __spirv_GlobalInvocationId_x();
21+
__DPCPP_SYCL_EXTERNAL size_t __spirv_GlobalInvocationId_y();
22+
__DPCPP_SYCL_EXTERNAL size_t __spirv_GlobalInvocationId_z();
2323

24-
SYCL_EXTERNAL size_t __spirv_GlobalSize_x();
25-
SYCL_EXTERNAL size_t __spirv_GlobalSize_y();
26-
SYCL_EXTERNAL size_t __spirv_GlobalSize_z();
24+
__DPCPP_SYCL_EXTERNAL size_t __spirv_GlobalSize_x();
25+
__DPCPP_SYCL_EXTERNAL size_t __spirv_GlobalSize_y();
26+
__DPCPP_SYCL_EXTERNAL size_t __spirv_GlobalSize_z();
2727

28-
SYCL_EXTERNAL size_t __spirv_GlobalOffset_x();
29-
SYCL_EXTERNAL size_t __spirv_GlobalOffset_y();
30-
SYCL_EXTERNAL size_t __spirv_GlobalOffset_z();
28+
__DPCPP_SYCL_EXTERNAL size_t __spirv_GlobalOffset_x();
29+
__DPCPP_SYCL_EXTERNAL size_t __spirv_GlobalOffset_y();
30+
__DPCPP_SYCL_EXTERNAL size_t __spirv_GlobalOffset_z();
3131

32-
SYCL_EXTERNAL size_t __spirv_NumWorkgroups_x();
33-
SYCL_EXTERNAL size_t __spirv_NumWorkgroups_y();
34-
SYCL_EXTERNAL size_t __spirv_NumWorkgroups_z();
32+
__DPCPP_SYCL_EXTERNAL size_t __spirv_NumWorkgroups_x();
33+
__DPCPP_SYCL_EXTERNAL size_t __spirv_NumWorkgroups_y();
34+
__DPCPP_SYCL_EXTERNAL size_t __spirv_NumWorkgroups_z();
3535

36-
SYCL_EXTERNAL size_t __spirv_WorkgroupSize_x();
37-
SYCL_EXTERNAL size_t __spirv_WorkgroupSize_y();
38-
SYCL_EXTERNAL size_t __spirv_WorkgroupSize_z();
36+
__DPCPP_SYCL_EXTERNAL size_t __spirv_WorkgroupSize_x();
37+
__DPCPP_SYCL_EXTERNAL size_t __spirv_WorkgroupSize_y();
38+
__DPCPP_SYCL_EXTERNAL size_t __spirv_WorkgroupSize_z();
3939

40-
SYCL_EXTERNAL size_t __spirv_WorkgroupId_x();
41-
SYCL_EXTERNAL size_t __spirv_WorkgroupId_y();
42-
SYCL_EXTERNAL size_t __spirv_WorkgroupId_z();
40+
__DPCPP_SYCL_EXTERNAL size_t __spirv_WorkgroupId_x();
41+
__DPCPP_SYCL_EXTERNAL size_t __spirv_WorkgroupId_y();
42+
__DPCPP_SYCL_EXTERNAL size_t __spirv_WorkgroupId_z();
4343

44-
SYCL_EXTERNAL size_t __spirv_LocalInvocationId_x();
45-
SYCL_EXTERNAL size_t __spirv_LocalInvocationId_y();
46-
SYCL_EXTERNAL size_t __spirv_LocalInvocationId_z();
44+
__DPCPP_SYCL_EXTERNAL size_t __spirv_LocalInvocationId_x();
45+
__DPCPP_SYCL_EXTERNAL size_t __spirv_LocalInvocationId_y();
46+
__DPCPP_SYCL_EXTERNAL size_t __spirv_LocalInvocationId_z();
4747

48-
SYCL_EXTERNAL uint32_t __spirv_SubgroupSize();
49-
SYCL_EXTERNAL uint32_t __spirv_SubgroupMaxSize();
50-
SYCL_EXTERNAL uint32_t __spirv_NumSubgroups();
51-
SYCL_EXTERNAL uint32_t __spirv_SubgroupId();
52-
SYCL_EXTERNAL uint32_t __spirv_SubgroupLocalInvocationId();
48+
__DPCPP_SYCL_EXTERNAL uint32_t __spirv_SubgroupSize();
49+
__DPCPP_SYCL_EXTERNAL uint32_t __spirv_SubgroupMaxSize();
50+
__DPCPP_SYCL_EXTERNAL uint32_t __spirv_NumSubgroups();
51+
__DPCPP_SYCL_EXTERNAL uint32_t __spirv_SubgroupId();
52+
__DPCPP_SYCL_EXTERNAL uint32_t __spirv_SubgroupLocalInvocationId();
5353

5454
#else // defined(__NVPTX__) || defined(__AMDGCN__)
5555

@@ -68,89 +68,89 @@ __SPIRV_VAR_QUALIFIERS uint32_t __spirv_BuiltInNumSubgroups;
6868
__SPIRV_VAR_QUALIFIERS uint32_t __spirv_BuiltInSubgroupId;
6969
__SPIRV_VAR_QUALIFIERS uint32_t __spirv_BuiltInSubgroupLocalInvocationId;
7070

71-
SYCL_EXTERNAL inline size_t __spirv_GlobalInvocationId_x() {
71+
__DPCPP_SYCL_EXTERNAL inline size_t __spirv_GlobalInvocationId_x() {
7272
return __spirv_BuiltInGlobalInvocationId.x;
7373
}
74-
SYCL_EXTERNAL inline size_t __spirv_GlobalInvocationId_y() {
74+
__DPCPP_SYCL_EXTERNAL inline size_t __spirv_GlobalInvocationId_y() {
7575
return __spirv_BuiltInGlobalInvocationId.y;
7676
}
77-
SYCL_EXTERNAL inline size_t __spirv_GlobalInvocationId_z() {
77+
__DPCPP_SYCL_EXTERNAL inline size_t __spirv_GlobalInvocationId_z() {
7878
return __spirv_BuiltInGlobalInvocationId.z;
7979
}
8080

81-
SYCL_EXTERNAL inline size_t __spirv_GlobalSize_x() {
81+
__DPCPP_SYCL_EXTERNAL inline size_t __spirv_GlobalSize_x() {
8282
return __spirv_BuiltInGlobalSize.x;
8383
}
84-
SYCL_EXTERNAL inline size_t __spirv_GlobalSize_y() {
84+
__DPCPP_SYCL_EXTERNAL inline size_t __spirv_GlobalSize_y() {
8585
return __spirv_BuiltInGlobalSize.y;
8686
}
87-
SYCL_EXTERNAL inline size_t __spirv_GlobalSize_z() {
87+
__DPCPP_SYCL_EXTERNAL inline size_t __spirv_GlobalSize_z() {
8888
return __spirv_BuiltInGlobalSize.z;
8989
}
9090

91-
SYCL_EXTERNAL inline size_t __spirv_GlobalOffset_x() {
91+
__DPCPP_SYCL_EXTERNAL inline size_t __spirv_GlobalOffset_x() {
9292
return __spirv_BuiltInGlobalOffset.x;
9393
}
94-
SYCL_EXTERNAL inline size_t __spirv_GlobalOffset_y() {
94+
__DPCPP_SYCL_EXTERNAL inline size_t __spirv_GlobalOffset_y() {
9595
return __spirv_BuiltInGlobalOffset.y;
9696
}
97-
SYCL_EXTERNAL inline size_t __spirv_GlobalOffset_z() {
97+
__DPCPP_SYCL_EXTERNAL inline size_t __spirv_GlobalOffset_z() {
9898
return __spirv_BuiltInGlobalOffset.z;
9999
}
100100

101-
SYCL_EXTERNAL inline size_t __spirv_NumWorkgroups_x() {
101+
__DPCPP_SYCL_EXTERNAL inline size_t __spirv_NumWorkgroups_x() {
102102
return __spirv_BuiltInNumWorkgroups.x;
103103
}
104-
SYCL_EXTERNAL inline size_t __spirv_NumWorkgroups_y() {
104+
__DPCPP_SYCL_EXTERNAL inline size_t __spirv_NumWorkgroups_y() {
105105
return __spirv_BuiltInNumWorkgroups.y;
106106
}
107-
SYCL_EXTERNAL inline size_t __spirv_NumWorkgroups_z() {
107+
__DPCPP_SYCL_EXTERNAL inline size_t __spirv_NumWorkgroups_z() {
108108
return __spirv_BuiltInNumWorkgroups.z;
109109
}
110110

111-
SYCL_EXTERNAL inline size_t __spirv_WorkgroupSize_x() {
111+
__DPCPP_SYCL_EXTERNAL inline size_t __spirv_WorkgroupSize_x() {
112112
return __spirv_BuiltInWorkgroupSize.x;
113113
}
114-
SYCL_EXTERNAL inline size_t __spirv_WorkgroupSize_y() {
114+
__DPCPP_SYCL_EXTERNAL inline size_t __spirv_WorkgroupSize_y() {
115115
return __spirv_BuiltInWorkgroupSize.y;
116116
}
117-
SYCL_EXTERNAL inline size_t __spirv_WorkgroupSize_z() {
117+
__DPCPP_SYCL_EXTERNAL inline size_t __spirv_WorkgroupSize_z() {
118118
return __spirv_BuiltInWorkgroupSize.z;
119119
}
120120

121-
SYCL_EXTERNAL inline size_t __spirv_WorkgroupId_x() {
121+
__DPCPP_SYCL_EXTERNAL inline size_t __spirv_WorkgroupId_x() {
122122
return __spirv_BuiltInWorkgroupId.x;
123123
}
124-
SYCL_EXTERNAL inline size_t __spirv_WorkgroupId_y() {
124+
__DPCPP_SYCL_EXTERNAL inline size_t __spirv_WorkgroupId_y() {
125125
return __spirv_BuiltInWorkgroupId.y;
126126
}
127-
SYCL_EXTERNAL inline size_t __spirv_WorkgroupId_z() {
127+
__DPCPP_SYCL_EXTERNAL inline size_t __spirv_WorkgroupId_z() {
128128
return __spirv_BuiltInWorkgroupId.z;
129129
}
130130

131-
SYCL_EXTERNAL inline size_t __spirv_LocalInvocationId_x() {
131+
__DPCPP_SYCL_EXTERNAL inline size_t __spirv_LocalInvocationId_x() {
132132
return __spirv_BuiltInLocalInvocationId.x;
133133
}
134-
SYCL_EXTERNAL inline size_t __spirv_LocalInvocationId_y() {
134+
__DPCPP_SYCL_EXTERNAL inline size_t __spirv_LocalInvocationId_y() {
135135
return __spirv_BuiltInLocalInvocationId.y;
136136
}
137-
SYCL_EXTERNAL inline size_t __spirv_LocalInvocationId_z() {
137+
__DPCPP_SYCL_EXTERNAL inline size_t __spirv_LocalInvocationId_z() {
138138
return __spirv_BuiltInLocalInvocationId.z;
139139
}
140140

141-
SYCL_EXTERNAL inline uint32_t __spirv_SubgroupSize() {
141+
__DPCPP_SYCL_EXTERNAL inline uint32_t __spirv_SubgroupSize() {
142142
return __spirv_BuiltInSubgroupSize;
143143
}
144-
SYCL_EXTERNAL inline uint32_t __spirv_SubgroupMaxSize() {
144+
__DPCPP_SYCL_EXTERNAL inline uint32_t __spirv_SubgroupMaxSize() {
145145
return __spirv_BuiltInSubgroupMaxSize;
146146
}
147-
SYCL_EXTERNAL inline uint32_t __spirv_NumSubgroups() {
147+
__DPCPP_SYCL_EXTERNAL inline uint32_t __spirv_NumSubgroups() {
148148
return __spirv_BuiltInNumSubgroups;
149149
}
150-
SYCL_EXTERNAL inline uint32_t __spirv_SubgroupId() {
150+
__DPCPP_SYCL_EXTERNAL inline uint32_t __spirv_SubgroupId() {
151151
return __spirv_BuiltInSubgroupId;
152152
}
153-
SYCL_EXTERNAL inline uint32_t __spirv_SubgroupLocalInvocationId() {
153+
__DPCPP_SYCL_EXTERNAL inline uint32_t __spirv_SubgroupLocalInvocationId() {
154154
return __spirv_BuiltInSubgroupLocalInvocationId;
155155
}
156156

0 commit comments

Comments
 (0)