Skip to content

Commit 7a913b2

Browse files
committed
Add tests for kernel name character encoding concerns.
1 parent 39f54e6 commit 7a913b2

File tree

4 files changed

+86
-9
lines changed

4 files changed

+86
-9
lines changed

clang/lib/AST/ASTContext.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15034,10 +15034,6 @@ static SYCLKernelInfo BuildSYCLKernelInfo(ASTContext &Context,
1503415034
MC->mangleCanonicalTypeName(KernelNameType, Out);
1503515035
std::string KernelName = Out.str();
1503615036

15037-
// FIXME: Diagnose kernel names that are not representable in the ordinary
15038-
// literal encoding. This is not necessarily the right place to add such
15039-
// a diagnostic.
15040-
1504115037
return {KernelNameType, FD, KernelName};
1504215038
}
1504315039

clang/lib/Sema/SemaSYCL.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -380,10 +380,7 @@ CompoundStmt *BuildSYCLKernelLaunchStmt(Sema &SemaRef, FunctionDecl *FD,
380380
ASTContext &Ctx = SemaRef.getASTContext();
381381
SmallVector<Stmt *> Stmts;
382382

383-
// Prepare a string literal that contains the kernel name in the ordinary
384-
// literal encoding.
385-
// FIXME: transcode the contents of KernelName from UTF-8 to the
386-
// ordinary literal encoding.
383+
// Prepare a string literal that contains the kernel name.
387384
QualType KernelNameCharTy = Ctx.CharTy.withConst();
388385
llvm::APInt KernelNameSize(Ctx.getTypeSize(Ctx.getSizeType()),
389386
KernelName.size() + 1);

clang/test/ASTSYCL/ast-dump-sycl-kernel-call-stmt.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,27 @@ void skep7(S7 k) {
319319
// CHECK-NEXT: | | `-DeclRefExpr {{.*}} 'S7' lvalue ImplicitParam {{.*}} 'k' 'S7'
320320
// CHECK-NEXT: | `-SYCLKernelEntryPointAttr {{.*}} KN<7>
321321

322+
// Symbol names generated for the kernel entry point function should be
323+
// representable in the ordinary literal encoding even when the kernel name
324+
// type is named with esoteric characters.
325+
struct \u03b4\u03c4\u03c7; // Delta Tau Chi (δτχ)
326+
struct S8 {
327+
void operator()() const;
328+
};
329+
[[clang::sycl_kernel_entry_point(\u03b4\u03c4\u03c7)]]
330+
void skep8(S8 k) {
331+
k();
332+
}
333+
// CHECK: |-FunctionDecl {{.*}} skep8 'void (S8)'
334+
// CHECK-NEXT: | |-ParmVarDecl {{.*}} used k 'S8'
335+
// CHECK-NEXT: | |-SYCLKernelCallStmt {{.*}}
336+
// CHECK-NEXT: | | |-CompoundStmt {{.*}}
337+
// CHECK: | | |-CompoundStmt {{.*}}
338+
// CHECK: | | | `-ImplicitCastExpr {{.*}} 'const char *' <ArrayToPointerDecay>
339+
// CHECK-NEXT: | | | `-StringLiteral {{.*}} 'const char[12]' lvalue "_ZTS6\316\264\317\204\317\207"
340+
// CHECK: | | `-OutlinedFunctionDecl {{.*}}
341+
// CHECK: | `-SYCLKernelEntryPointAttr {{.*}}
342+
322343

323344
void the_end() {}
324345
// CHECK: `-FunctionDecl {{.*}} the_end 'void ()'

clang/test/CodeGenSYCL/kernel-caller-entry-point.cpp

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,19 +44,24 @@ void kernel_single_task(KernelType kernelFunc) {
4444
kernelFunc(42);
4545
}
4646

47+
// Exercise code gen with kernel name types named with esoteric characters.
48+
struct \u03b4\u03c4\u03c7; // Delta Tau Chi (δτχ)
49+
4750
int main() {
4851
single_purpose_kernel obj;
4952
single_purpose_kernel_task(obj);
5053
int capture;
5154
auto lambda = [=](auto) { (void) capture; };
5255
kernel_single_task<decltype(lambda)>(lambda);
56+
kernel_single_task<\u03b4\u03c4\u03c7>([](int){});
5357
}
5458

5559
// Verify that SYCL kernel caller functions are not emitted during host
5660
// compilation.
5761
//
5862
// CHECK-HOST-NOT: define {{.*}} @_ZTS26single_purpose_kernel_name
59-
// CHECK-HOST-NOT: define {{.*}} @_ZTSZ4mainE18lambda_kernel_name
63+
// CHECK-HOST-NOT: define {{.*}} @_ZTSZ4mainEUlT_E_
64+
// CHECK-HOST-NOT: define {{.*}} @"_ZTS6\CE\B4\CF\84\CF\87"
6065

6166
// Verify that sycl_kernel_entry_point attributed functions are not emitted
6267
// during device compilation.
@@ -67,6 +72,10 @@ int main() {
6772
// Verify that kernel launch code is generated for sycl_kernel_entry_point
6873
// attributed functions during host compilation.
6974
//
75+
// CHECK-HOST-LINUX: @.str = private unnamed_addr constant [33 x i8] c"_ZTS26single_purpose_kernel_name\00", align 1
76+
// CHECK-HOST-LINUX: @.str.1 = private unnamed_addr constant [18 x i8] c"_ZTSZ4mainEUlT_E_\00", align 1
77+
// CHECK-HOST-LINUX: @.str.2 = private unnamed_addr constant [12 x i8] c"_ZTS6\CE\B4\CF\84\CF\87\00", align 1
78+
//
7079
// CHECK-HOST-LINUX: define dso_local void @_Z26single_purpose_kernel_task21single_purpose_kernel() #{{[0-9]+}} {
7180
// CHECK-HOST-LINUX-NEXT: entry:
7281
// CHECK-HOST-LINUX-NEXT: %kernelFunc = alloca %struct.single_purpose_kernel, align 1
@@ -83,6 +92,13 @@ int main() {
8392
// CHECK-HOST-LINUX-NEXT: ret void
8493
// CHECK-HOST-LINUX-NEXT: }
8594
//
95+
// CHECK-HOST-LINUX: define internal void @"_Z18kernel_single_taskI6\CE\B4\CF\84\CF\87Z4mainEUliE_EvT0_"() #{{[0-9]+}} {
96+
// CHECK-HOST-LINUX-NEXT: entry:
97+
// CHECK-HOST-LINUX-NEXT: %kernelFunc = alloca %class.anon.0, align 1
98+
// CHECK-HOST-LINUX-NEXT: store ptr @.str.2, ptr @kernel_name, align 8
99+
// CHECK-HOST-LINUX-NEXT: ret void
100+
// CHECK-HOST-LINUX-NEXT: }
101+
//
86102
// CHECK-HOST-WINDOWS: define dso_local void @"?single_purpose_kernel_task@@YAXUsingle_purpose_kernel@@@Z"(i8 %kernelFunc.coerce) #{{[0-9]+}} {
87103
// CHECK-HOST-WINDOWS-NEXT: entry:
88104
// CHECK-HOST-WINDOWS-NEXT: %kernelFunc = alloca %struct.single_purpose_kernel, align 1
@@ -100,6 +116,15 @@ int main() {
100116
// CHECK-HOST-WINDOWS-NEXT: store ptr @"??_C@_0BC@NHCDOLAA@_ZTSZ4mainEUlT_E_?$AA@", ptr @"?kernel_name@?0???$kernel_single_task@V<lambda_1>@?0??main@@9@V1?0??2@9@@@YAXV<lambda_1>@?0??main@@9@@Z@3PEBDEB", align 8
101117
// CHECK-HOST-WINDOWS-NEXT: ret void
102118
// CHECK-HOST-WINDOWS-NEXT: }
119+
//
120+
// CHECK-HOST-WINDOWS: define internal void @"??$kernel_single_task@U\CE\B4\CF\84\CF\87@@V<lambda_2>@?0??main@@9@@@YAXV<lambda_2>@?0??main@@9@@Z"(i8 %kernelFunc.coerce) #{{[0-9]+}} {
121+
// CHECK-HOST-WINDOWS-NEXT: entry:
122+
// CHECK-HOST-WINDOWS-NEXT: %kernelFunc = alloca %class.anon.0, align 1
123+
// CHECK-HOST-WINDOWS-NEXT: %coerce.dive = getelementptr inbounds nuw %class.anon.0, ptr %kernelFunc, i32 0, i32 0
124+
// CHECK-HOST-WINDOWS-NEXT: store i8 %kernelFunc.coerce, ptr %coerce.dive, align 1
125+
// CHECK-HOST-WINDOWS-NEXT: store ptr @"??_C@_0M@BCGAEMBE@_ZTS6?N?$LE?O?$IE?O?$IH?$AA@", ptr @"?kernel_name@?0???$kernel_single_task@U\CE\B4\CF\84\CF\87@@V<lambda_2>@?0??main@@9@@@YAXV<lambda_2>@?0??main@@9@@Z@3PEBDEB", align 8
126+
// CHECK-HOST-WINDOWS-NEXT: ret void
127+
// CHECK-HOST-WINDOWS-NEXT: }
103128

104129
// Verify that SYCL kernel caller functions are emitted for each device target.
105130
//
@@ -185,6 +210,44 @@ int main() {
185210
// CHECK-SPIR-NEXT: }
186211
// CHECK-SPIR: define internal spir_func void @_ZZ4mainENKUlT_E_clIiEEDaS_
187212

213+
// IR for the SYCL kernel caller function generated for kernel_single_task with
214+
// the Delta Tau Chi type as the SYCL kernel name type.
215+
//
216+
// CHECK-AMDGCN: Function Attrs: convergent mustprogress noinline norecurse nounwind optnone
217+
// CHECK-AMDGCN-NEXT: define dso_local amdgpu_kernel void @"_ZTS6\CE\B4\CF\84\CF\87"
218+
// CHECK-AMDGCN-SAME: (ptr addrspace(4) noundef byref(%class.anon.0) align 1 %0) #[[AMDGCN_ATTR0]] {
219+
// CHECK-AMDGCN-NEXT: entry:
220+
// CHECK-AMDGCN-NEXT: %coerce = alloca %class.anon.0, align 1, addrspace(5)
221+
// CHECK-AMDGCN-NEXT: %kernelFunc = addrspacecast ptr addrspace(5) %coerce to ptr
222+
// CHECK-AMDGCN-NEXT: call void @llvm.memcpy.p0.p4.i64(ptr align 1 %kernelFunc, ptr addrspace(4) align 1 %0, i64 1, i1 false)
223+
// CHECK-AMDGCN-NEXT: call void @_ZZ4mainENKUliE_clEi
224+
// CHECK-AMDGCN-SAME: (ptr noundef nonnull align 1 dereferenceable(1) %kernelFunc, i32 noundef 42) #[[AMDGCN_ATTR1:[0-9]+]]
225+
// CHECK-AMDGCN-NEXT: ret void
226+
// CHECK-AMDGCN-NEXT: }
227+
// CHECK-AMDGCN: define internal void @_ZZ4mainENKUliE_clEi
228+
//
229+
// CHECK-NVPTX: Function Attrs: convergent mustprogress noinline norecurse nounwind optnone
230+
// CHECK-NVPTX-NEXT: define dso_local ptx_kernel void @"_ZTS6\CE\B4\CF\84\CF\87"
231+
// CHECK-NVPTX-SAME: (ptr noundef byval(%class.anon.0) align 1 %kernelFunc) #[[NVPTX_ATTR0:[0-9]+]] {
232+
// CHECK-NVPTX-NEXT: entry:
233+
// CHECK-NVPTX-NEXT: call void @_ZZ4mainENKUliE_clEi
234+
// CHECK-NVPTX-SAME: (ptr noundef nonnull align 1 dereferenceable(1) %kernelFunc, i32 noundef 42) #[[NVPTX_ATTR1:[0-9]+]]
235+
// CHECK-NVPTX-NEXT: ret void
236+
// CHECK-NVPTX-NEXT: }
237+
// CHECK-NVPTX: define internal void @_ZZ4mainENKUliE_clEi
238+
//
239+
// CHECK-SPIR: Function Attrs: convergent mustprogress noinline norecurse nounwind optnone
240+
// CHECK-SPIR-NEXT: define {{[a-z_ ]*}}spir_kernel void @"_ZTS6\CE\B4\CF\84\CF\87"
241+
// CHECK-SPIR-SAME: (ptr noundef byval(%class.anon.0) align 1 %kernelFunc) #[[SPIR_ATTR0:[0-9]+]] {
242+
// CHECK-SPIR-NEXT: entry:
243+
// CHECK-SPIR-NEXT: %kernelFunc.ascast = addrspacecast ptr %kernelFunc to ptr addrspace(4)
244+
// CHECK-SPIR-NEXT: call spir_func void @_ZZ4mainENKUliE_clEi
245+
// CHECK-SPIR-SAME: (ptr addrspace(4) noundef align 1 dereferenceable_or_null(1) %kernelFunc.ascast, i32 noundef 42) #[[SPIR_ATTR1:[0-9]+]]
246+
// CHECK-SPIR-NEXT: ret void
247+
// CHECK-SPIR-NEXT: }
248+
// CHECK-SPIR: define internal spir_func void @_ZZ4mainENKUliE_clEi
249+
250+
188251
// CHECK-AMDGCN: #[[AMDGCN_ATTR0]] = { convergent mustprogress noinline norecurse nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" }
189252
// CHECK-AMDGCN: #[[AMDGCN_ATTR1]] = { convergent nounwind }
190253
//

0 commit comments

Comments
 (0)