Skip to content

Commit ab583e8

Browse files
[SYCL] Fix crash on array of pointers
The crash happens when address space of pointer element is checked using array type. The type of 'array element' should be checked, not the 'array type' itself. Signed-off-by: Elizabeth Andrews <[email protected]>
1 parent 7e1b4b5 commit ab583e8

File tree

5 files changed

+59
-3
lines changed

5 files changed

+59
-3
lines changed

clang/lib/Sema/SemaSYCL.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2096,7 +2096,7 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler {
20962096

20972097
bool handlePointerType(FieldDecl *FD, QualType FieldTy) final {
20982098
Expr *PointerRef =
2099-
createPointerParamReferenceExpr(FD->getType(), StructDepth != 0);
2099+
createPointerParamReferenceExpr(FieldTy, StructDepth != 0);
21002100
addFieldInit(FD, FieldTy, PointerRef);
21012101
return true;
21022102
}

clang/test/CodeGenSYCL/pointers-in-structs.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ struct B {
1313
int *F1;
1414
float *F2;
1515
A F3;
16+
int *F4[2];
1617
};
1718

1819
int main() {
@@ -35,9 +36,13 @@ int main() {
3536
// CHECK: %[[WRAPPER_F1:[a-zA-Z0-9_.]+]] = type { i32 addrspace(1)* }
3637
// CHECK: %[[WRAPPER_F2:[a-zA-Z0-9_.]+]] = type { float addrspace(1)* }
3738
// CHECK: %[[WRAPPER_F:[a-zA-Z0-9_.]+]] = type { float addrspace(1)* }
39+
// CHECK: %[[WRAPPER_F4_1:[a-zA-Z0-9_.]+]] = type { i32 addrspace(1)* }
40+
// CHECK: %[[WRAPPER_F4_2:[a-zA-Z0-9_.]+]] = type { i32 addrspace(1)* }
3841
// CHECK: %[[WRAPPER_LAMBDA_PTR:[a-zA-Z0-9_.]+]] = type { float addrspace(1)* }
3942
// CHECK: define spir_kernel void @{{.*}}structs
4043
// CHECK-SAME: %[[WRAPPER_F1]]* byval(%[[WRAPPER_F1]]) align 8 %_arg_F1,
4144
// CHECK-SAME: %[[WRAPPER_F2]]* byval(%[[WRAPPER_F2]]) align 8 %_arg_F2,
42-
// CHECK-SAME: %[[WRAPPER_F]]* byval(%[[WRAPPER_F]]) align 8 %_arg_F
45+
// CHECK-SAME: %[[WRAPPER_F]]* byval(%[[WRAPPER_F]]) align 8 %_arg_F,
46+
// CHECK-SAME: %[[WRAPPER_F4_1]]* byval(%[[WRAPPER_F4_1]]) align 8 %_arg_F4
47+
// CHECK-SAME: %[[WRAPPER_F4_2]]* byval(%[[WRAPPER_F4_2]]) align 8 %_arg_F41
4348
// CHECK: define spir_kernel void @{{.*}}lambdas{{.*}}(%[[WRAPPER_LAMBDA_PTR]]* byval(%[[WRAPPER_LAMBDA_PTR]]) align 8 %_arg_)

clang/test/CodeGenSYCL/pointers-int-header.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
struct struct_with_pointer {
1111
int data_in_struct;
1212
int *ptr_in_struct;
13+
int *ptr_array_in_struct1[2];
14+
int *ptr_array_in_struct2[2][3];
1315
};
1416

1517
int main() {
@@ -27,3 +29,11 @@ int main() {
2729
// CHECK:{ kernel_param_kind_t::kind_pointer, 8, 0 },
2830
// CHECK:{ kernel_param_kind_t::kind_std_layout, 4, 8 },
2931
// CHECK:{ kernel_param_kind_t::kind_std_layout, 8, 16 },
32+
// CHECK:{ kernel_param_kind_t::kind_std_layout, 8, 24 },
33+
// CHECK:{ kernel_param_kind_t::kind_std_layout, 8, 32 },
34+
// CHECK:{ kernel_param_kind_t::kind_std_layout, 8, 40 },
35+
// CHECK:{ kernel_param_kind_t::kind_std_layout, 8, 48 },
36+
// CHECK:{ kernel_param_kind_t::kind_std_layout, 8, 56 },
37+
// CHECK:{ kernel_param_kind_t::kind_std_layout, 8, 64 },
38+
// CHECK:{ kernel_param_kind_t::kind_std_layout, 8, 72 },
39+
// CHECK:{ kernel_param_kind_t::kind_std_layout, 8, 80 },

clang/test/SemaSYCL/built-in-type-kernel-arg.cpp

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ __attribute__((sycl_kernel)) void kernel(const Func &kernelFunc) {
1313
struct test_struct {
1414
int data;
1515
int *ptr; // Unused pointer in struct
16+
int *ptr_array1[2]; // Unused array of pointers in struct
17+
int *ptr_array2[2][3]; // Unused array of pointers in struct
1618
};
1719

1820
void test(const int some_const) {
@@ -66,9 +68,18 @@ int main() {
6668
// CHECK-NEXT: DeclRefExpr {{.*}} 'int' lvalue ParmVar {{.*}} '_arg_' 'int'
6769

6870
// Check kernel parameters
69-
// CHECK: {{.*}}kernel_struct{{.*}} 'void (int, __wrapper_class)'
71+
// CHECK: {{.*}}kernel_struct{{.*}} 'void (int, __wrapper_class, __wrapper_class, __wrapper_class
72+
// CHECK-SAME: __wrapper_class, __wrapper_class, __wrapper_class, __wrapper_class, __wrapper_class, __wrapper_class)'
7073
// CHECK: ParmVarDecl {{.*}} used _arg_data 'int'
7174
// CHECK: ParmVarDecl {{.*}} used _arg_ptr '__wrapper_class'
75+
// CHECK: ParmVarDecl {{.*}} used _arg_ptr_array1 '__wrapper_class'
76+
// CHECK: ParmVarDecl {{.*}} used _arg_ptr_array1 '__wrapper_class'
77+
// CHECK: ParmVarDecl {{.*}} used _arg_ptr_array2 '__wrapper_class'
78+
// CHECK: ParmVarDecl {{.*}} used _arg_ptr_array2 '__wrapper_class'
79+
// CHECK: ParmVarDecl {{.*}} used _arg_ptr_array2 '__wrapper_class'
80+
// CHECK: ParmVarDecl {{.*}} used _arg_ptr_array2 '__wrapper_class'
81+
// CHECK: ParmVarDecl {{.*}} used _arg_ptr_array2 '__wrapper_class'
82+
// CHECK: ParmVarDecl {{.*}} used _arg_ptr_array2 '__wrapper_class'
7283

7384
// Check that lambda field of struct type is initialized
7485
// CHECK: VarDecl {{.*}}'(lambda at {{.*}}built-in-type-kernel-arg.cpp{{.*}})'
@@ -79,6 +90,34 @@ int main() {
7990
// CHECK-NEXT: ImplicitCastExpr {{.*}} 'int *' <AddressSpaceConversion>
8091
// CHECK-NEXT: MemberExpr {{.*}} '__global int *' lvalue . {{.*}}
8192
// CHECK-NEXT: DeclRefExpr {{.*}} '__wrapper_class' lvalue ParmVar {{.*}} '_arg_ptr' '__wrapper_class'
93+
// CHECK-NEXT: InitListExpr {{.*}} 'int *[2]'
94+
// CHECK-NEXT: ImplicitCastExpr {{.*}} 'int *' <AddressSpaceConversion>
95+
// CHECK-NEXT: MemberExpr {{.*}} '__global int *' lvalue . {{.*}}
96+
// CHECK-NEXT: DeclRefExpr {{.*}} '__wrapper_class' lvalue ParmVar {{.*}} '_arg_ptr_array1' '__wrapper_class'
97+
// CHECK-NEXT: ImplicitCastExpr {{.*}} 'int *' <AddressSpaceConversion>
98+
// CHECK-NEXT: MemberExpr {{.*}} '__global int *' lvalue . {{.*}}
99+
// CHECK-NEXT: DeclRefExpr {{.*}} '__wrapper_class' lvalue ParmVar {{.*}} '_arg_ptr_array1' '__wrapper_class'
100+
// CHECK-NEXT: InitListExpr {{.*}} 'int *[2][3]'
101+
// CHECK-NEXT: InitListExpr {{.*}} 'int *[3]'
102+
// CHECK-NEXT: ImplicitCastExpr {{.*}} 'int *' <AddressSpaceConversion>
103+
// CHECK-NEXT: MemberExpr {{.*}} '__global int *' lvalue . {{.*}}
104+
// CHECK-NEXT: DeclRefExpr {{.*}} '__wrapper_class' lvalue ParmVar {{.*}} '_arg_ptr_array2' '__wrapper_class'
105+
// CHECK-NEXT: ImplicitCastExpr {{.*}} 'int *' <AddressSpaceConversion>
106+
// CHECK-NEXT: MemberExpr {{.*}} '__global int *' lvalue . {{.*}}
107+
// CHECK-NEXT: DeclRefExpr {{.*}} '__wrapper_class' lvalue ParmVar {{.*}} '_arg_ptr_array2' '__wrapper_class'
108+
// CHECK-NEXT: ImplicitCastExpr {{.*}} 'int *' <AddressSpaceConversion>
109+
// CHECK-NEXT: MemberExpr {{.*}} '__global int *' lvalue . {{.*}}
110+
// CHECK-NEXT: DeclRefExpr {{.*}} '__wrapper_class' lvalue ParmVar {{.*}} '_arg_ptr_array2' '__wrapper_class'
111+
// CHECK-NEXT: InitListExpr {{.*}} 'int *[3]'
112+
// CHECK-NEXT: ImplicitCastExpr {{.*}} 'int *' <AddressSpaceConversion>
113+
// CHECK-NEXT: MemberExpr {{.*}} '__global int *' lvalue . {{.*}}
114+
// CHECK-NEXT: DeclRefExpr {{.*}} '__wrapper_class' lvalue ParmVar {{.*}} '_arg_ptr_array2' '__wrapper_class'
115+
// CHECK-NEXT: ImplicitCastExpr {{.*}} 'int *' <AddressSpaceConversion>
116+
// CHECK-NEXT: MemberExpr {{.*}} '__global int *' lvalue . {{.*}}
117+
// CHECK-NEXT: DeclRefExpr {{.*}} '__wrapper_class' lvalue ParmVar {{.*}} '_arg_ptr_array2' '__wrapper_class'
118+
// CHECK-NEXT: ImplicitCastExpr {{.*}} 'int *' <AddressSpaceConversion>
119+
// CHECK-NEXT: MemberExpr {{.*}} '__global int *' lvalue . {{.*}}
120+
// CHECK-NEXT: DeclRefExpr {{.*}} '__wrapper_class' lvalue ParmVar {{.*}} '_arg_ptr_array2' '__wrapper_class'
82121

83122
// Check kernel parameters
84123
// CHECK: {{.*}}kernel_pointer{{.*}} 'void (__global int *, __global int *)'

sycl/test/basic_tests/unused_pointer.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ struct struct_with_pointer {
2121
int data;
2222
int *ptr1; // Unused pointer
2323
float *ptr2; // Unused pointer
24+
int *ptr_array1[2]; // Unused pointer array
25+
int *ptr_array2[2][3]; // Unused pointer array
2426
};
2527

2628
int main(int argc, char **argv) {

0 commit comments

Comments
 (0)