Skip to content

Commit 6946d33

Browse files
authored
Add OpenCL clang extension for bit fields (#505)
It's a manual backport of change: llvm/llvm-project@237c692
1 parent 76bc7f9 commit 6946d33

File tree

1 file changed

+162
-0
lines changed

1 file changed

+162
-0
lines changed
Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
From 237c6924bd46ec0e33da71f9616caf9bf9965b23 Mon Sep 17 00:00:00 2001
2+
From: Anastasia Stulova <[email protected]>
3+
Date: Mon, 24 May 2021 12:38:02 +0100
4+
Subject: [PATCH] [OpenCL] Add clang extension for bit-fields.
5+
6+
Allow use of bit-fields as a clang extension
7+
in OpenCL. The extension can be enabled using
8+
pragma directives.
9+
10+
This fixes PR45339!
11+
12+
Differential Revision: https://reviews.llvm.org/D101843
13+
14+
15+
diff --git a/clang/docs/LanguageExtensions.rst b/clang/docs/LanguageExtensions.rst
16+
index 0fec251c4bdc..870b8f9744c1 100644
17+
--- a/clang/docs/LanguageExtensions.rst
18+
+++ b/clang/docs/LanguageExtensions.rst
19+
@@ -1522,6 +1522,34 @@ Query the presence of this new mangling with
20+
OpenCL Features
21+
===============
22+
23+
+``__cl_clang_bitfields``
24+
+--------------------------------
25+
+
26+
+With this extension it is possible to enable bitfields in structs
27+
+or unions using the OpenCL extension pragma mechanism detailed in
28+
+`the OpenCL Extension Specification, section 1.2
29+
+<https://www.khronos.org/registry/OpenCL/specs/3.0-unified/html/OpenCL_Ext.html#extensions-overview>`_.
30+
+
31+
+Use of bitfields in OpenCL kernels can result in reduced portability as struct
32+
+layout is not guaranteed to be consistent when compiled by different compilers.
33+
+If structs with bitfields are used as kernel function parameters, it can result
34+
+in incorrect functionality when the layout is different between the host and
35+
+device code.
36+
+
37+
+**Example of Use**:
38+
+
39+
+.. code-block:: c++
40+
+
41+
+ #pragma OPENCL EXTENSION __cl_clang_bitfields : enable
42+
+ struct with_bitfield {
43+
+ unsigned int i : 5; // compiled - no diagnostic generated
44+
+ };
45+
+
46+
+ #pragma OPENCL EXTENSION __cl_clang_bitfields : disable
47+
+ struct without_bitfield {
48+
+ unsigned int i : 5; // error - bitfields are not supported
49+
+ };
50+
+
51+
C++ for OpenCL
52+
--------------
53+
54+
diff --git a/clang/include/clang/Basic/OpenCLExtensions.def b/clang/include/clang/Basic/OpenCLExtensions.def
55+
index 5536a6e8e4df..6438e5060576 100644
56+
--- a/clang/include/clang/Basic/OpenCLExtensions.def
57+
+++ b/clang/include/clang/Basic/OpenCLExtensions.def
58+
@@ -76,6 +76,7 @@ OPENCLEXT_INTERNAL(cl_khr_terminate_context, 200, ~0U)
59+
60+
// Clang Extensions.
61+
OPENCLEXT_INTERNAL(cl_clang_storage_class_specifiers, 100, ~0U)
62+
+OPENCLEXT_INTERNAL(__cl_clang_bitfields, 100, ~0U)
63+
64+
// AMD OpenCL extensions
65+
OPENCLEXT_INTERNAL(cl_amd_media_ops, 100, ~0U)
66+
diff --git a/clang/lib/Basic/Targets/AMDGPU.h b/clang/lib/Basic/Targets/AMDGPU.h
67+
index 456cb2ebb8b5..1befc0e742cd 100644
68+
--- a/clang/lib/Basic/Targets/AMDGPU.h
69+
+++ b/clang/lib/Basic/Targets/AMDGPU.h
70+
@@ -247,6 +247,8 @@ public:
71+
72+
bool IsAMDGCN = isAMDGCN(getTriple());
73+
74+
+ Opts.support("__cl_clang_bitfields");
75+
+
76+
if (hasFP64())
77+
Opts.support("cl_khr_fp64");
78+
79+
diff --git a/clang/lib/Basic/Targets/NVPTX.h b/clang/lib/Basic/Targets/NVPTX.h
80+
index 2cdd37ca1b07..5fac6cb70fe0 100644
81+
--- a/clang/lib/Basic/Targets/NVPTX.h
82+
+++ b/clang/lib/Basic/Targets/NVPTX.h
83+
@@ -132,6 +132,8 @@ public:
84+
Opts.support("cl_khr_global_int32_extended_atomics");
85+
Opts.support("cl_khr_local_int32_base_atomics");
86+
Opts.support("cl_khr_local_int32_extended_atomics");
87+
+
88+
+ Opts.support("__cl_clang_bitfields");
89+
}
90+
91+
/// \returns If a target requires an address within a target specific address
92+
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
93+
index 8f19edbc4f36..8e8d138cb84f 100644
94+
--- a/clang/lib/Sema/SemaDecl.cpp
95+
+++ b/clang/lib/Sema/SemaDecl.cpp
96+
@@ -15836,8 +15836,10 @@ FieldDecl *Sema::CheckFieldDecl(DeclarationName Name, QualType T,
97+
Record->setInvalidDecl();
98+
InvalidDecl = true;
99+
}
100+
- // OpenCL v1.2 s6.9.c: bitfields are not supported.
101+
- if (BitWidth) {
102+
+ // OpenCL v1.2 s6.9.c: bitfields are not supported, unless Clang extension
103+
+ // is enabled.
104+
+ if (BitWidth && !getOpenCLOptions().isEnabled(
105+
+ "__cl_clang_bitfields")) {
106+
Diag(Loc, diag::err_opencl_bitfields);
107+
InvalidDecl = true;
108+
}
109+
diff --git a/clang/test/Misc/amdgcn.languageOptsOpenCL.cl b/clang/test/Misc/amdgcn.languageOptsOpenCL.cl
110+
index 6a07fc98069c..be59a6cc5227 100644
111+
--- a/clang/test/Misc/amdgcn.languageOptsOpenCL.cl
112+
+++ b/clang/test/Misc/amdgcn.languageOptsOpenCL.cl
113+
@@ -14,6 +14,11 @@
114+
#endif
115+
#pragma OPENCL EXTENSION cl_clang_storage_class_specifiers: enable
116+
117+
+#ifndef __cl_clang_bitfields
118+
+#error "Missing __cl_clang_bitfields define"
119+
+#endif
120+
+#pragma OPENCL EXTENSION __cl_clang_bitfields : enable
121+
+
122+
#ifndef cl_khr_fp16
123+
#error "Missing cl_khr_fp16 define"
124+
#endif
125+
diff --git a/clang/test/Misc/r600.languageOptsOpenCL.cl b/clang/test/Misc/r600.languageOptsOpenCL.cl
126+
index 58444cf7688a..9d2f2ef88939 100644
127+
--- a/clang/test/Misc/r600.languageOptsOpenCL.cl
128+
+++ b/clang/test/Misc/r600.languageOptsOpenCL.cl
129+
@@ -30,6 +30,11 @@
130+
#endif
131+
#pragma OPENCL EXTENSION cl_clang_storage_class_specifiers: enable
132+
133+
+#ifndef __cl_clang_bitfields
134+
+#error "Missing __cl_clang_bitfields define"
135+
+#endif
136+
+#pragma OPENCL EXTENSION __cl_clang_bitfields : enable
137+
+
138+
#ifdef cl_khr_fp16
139+
#error "Incorrect cl_khr_fp16 define"
140+
#endif
141+
diff --git a/clang/test/SemaOpenCL/unsupported.cl b/clang/test/SemaOpenCL/unsupported.cl
142+
index a5fc570e757e..36f60259f8a7 100644
143+
--- a/clang/test/SemaOpenCL/unsupported.cl
144+
+++ b/clang/test/SemaOpenCL/unsupported.cl
145+
@@ -1,7 +1,15 @@
146+
// RUN: %clang_cc1 -verify %s
147+
+// RUN: %clang_cc1 -verify %s -DBITFIELDS_EXT
148+
149+
-struct {
150+
- int a : 1; // expected-error {{bit-fields are not supported in OpenCL}}
151+
+#ifdef BITFIELDS_EXT
152+
+#pragma OPENCL EXTENSION __cl_clang_bitfields : enable
153+
+#endif
154+
+
155+
+struct test {
156+
+ int a : 1;
157+
+#ifndef BITFIELDS_EXT
158+
+// expected-error@-2 {{bit-fields are not supported in OpenCL}}
159+
+#endif
160+
};
161+
162+
void no_vla(int n) {

0 commit comments

Comments
 (0)