Skip to content

Commit 10237c7

Browse files
authored
Backport support for pointer-to-a-pointer kernel arguments for OpenCL >= 2.0 (#402)
Signed-off-by: Carsten Uphoff <[email protected]>
1 parent ee31812 commit 10237c7

File tree

1 file changed

+74
-0
lines changed

1 file changed

+74
-0
lines changed
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
From 523775f96742e6f099b3498b6606b7250c0af841 Mon Sep 17 00:00:00 2001
2+
From: Sven van Haastregt <[email protected]>
3+
Date: Tue, 1 Dec 2020 11:33:10 +0000
4+
Subject: [PATCH] [OpenCL] Allow pointer-to-pointer kernel args beyond CL 1.2
5+
6+
The restriction on pointer-to-pointer kernel arguments has been
7+
relaxed in OpenCL 2.0. Apply the same address space restrictions for
8+
pointer argument types to the inner pointer types.
9+
10+
Differential Revision: https://reviews.llvm.org/D92091
11+
---
12+
clang/lib/Sema/SemaDecl.cpp | 29 ++++++++++++++-----
13+
.../SemaOpenCL/invalid-kernel-parameters.cl | 17 ++++++++++-
14+
2 files changed, 38 insertions(+), 8 deletions(-)
15+
16+
/*========================== begin_copyright_notice ============================
17+
18+
Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
19+
See https://llvm.org/LICENSE.txt for license information.
20+
SPDX-License-Identifier: Apache-2.0 with LLVM-exception
21+
22+
============================= end_copyright_notice ===========================*/
23+
24+
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
25+
index 9c282a73e0ed..2116b3f7b78e 100644
26+
--- a/clang/lib/Sema/SemaDecl.cpp
27+
+++ b/clang/lib/Sema/SemaDecl.cpp
28+
@@ -8591,12 +8591,21 @@ static bool isOpenCLSizeDependentType(ASTContext &C, QualType Ty) {
29+
static OpenCLParamType getOpenCLKernelParameterType(Sema &S, QualType PT) {
30+
if (PT->isPointerType()) {
31+
QualType PointeeType = PT->getPointeeType();
32+
- if (PointeeType->isPointerType())
33+
- return PtrPtrKernelParam;
34+
if (PointeeType.getAddressSpace() == LangAS::opencl_generic ||
35+
PointeeType.getAddressSpace() == LangAS::opencl_private ||
36+
PointeeType.getAddressSpace() == LangAS::Default)
37+
return InvalidAddrSpacePtrKernelParam;
38+
+
39+
+ if (PointeeType->isPointerType()) {
40+
+ // This is a pointer to pointer parameter.
41+
+ // Recursively check inner type.
42+
+ OpenCLParamType ParamKind = getOpenCLKernelParameterType(S, PointeeType);
43+
+ if (ParamKind == InvalidAddrSpacePtrKernelParam ||
44+
+ ParamKind == InvalidKernelParam)
45+
+ return ParamKind;
46+
+
47+
+ return PtrPtrKernelParam;
48+
+ }
49+
return PtrKernelParam;
50+
}
51+
52+
@@ -8649,11 +8658,17 @@ static void checkIsValidOpenCLKernelParameter(
53+
54+
switch (getOpenCLKernelParameterType(S, PT)) {
55+
case PtrPtrKernelParam:
56+
- // OpenCL v1.2 s6.9.a:
57+
- // A kernel function argument cannot be declared as a
58+
- // pointer to a pointer type.
59+
- S.Diag(Param->getLocation(), diag::err_opencl_ptrptr_kernel_param);
60+
- D.setInvalidType();
61+
+ // OpenCL v3.0 s6.11.a:
62+
+ // A kernel function argument cannot be declared as a pointer to a pointer
63+
+ // type. [...] This restriction only applies to OpenCL C 1.2 or below.
64+
+ if (S.getLangOpts().OpenCLVersion < 120 &&
65+
+ !S.getLangOpts().OpenCLCPlusPlus) {
66+
+ S.Diag(Param->getLocation(), diag::err_opencl_ptrptr_kernel_param);
67+
+ D.setInvalidType();
68+
+ return;
69+
+ }
70+
+
71+
+ ValidTypes.insert(PT.getTypePtr());
72+
return;
73+
74+
case InvalidAddrSpacePtrKernelParam:

0 commit comments

Comments
 (0)