Author: Anastasia Stulova Date: 2021-05-24T12:42:17+01:00 New Revision: 237c6924bd46ec0e33da71f9616caf9bf9965b23
URL: https://github.com/llvm/llvm-project/commit/237c6924bd46ec0e33da71f9616caf9bf9965b23 DIFF: https://github.com/llvm/llvm-project/commit/237c6924bd46ec0e33da71f9616caf9bf9965b23.diff LOG: [OpenCL] Add clang extension for bit-fields. Allow use of bit-fields as a clang extension in OpenCL. The extension can be enabled using pragma directives. This fixes PR45339! Differential Revision: https://reviews.llvm.org/D101843 Added: Modified: clang/docs/LanguageExtensions.rst clang/include/clang/Basic/OpenCLExtensions.def clang/lib/Basic/Targets/AMDGPU.h clang/lib/Basic/Targets/NVPTX.h clang/lib/Sema/SemaDecl.cpp clang/test/Misc/amdgcn.languageOptsOpenCL.cl clang/test/Misc/nvptx.languageOptsOpenCL.cl clang/test/Misc/r600.languageOptsOpenCL.cl clang/test/SemaOpenCL/unsupported.cl Removed: ################################################################################ diff --git a/clang/docs/LanguageExtensions.rst b/clang/docs/LanguageExtensions.rst index 235bcac8f00f4..eb9fe0c0ac0d7 100644 --- a/clang/docs/LanguageExtensions.rst +++ b/clang/docs/LanguageExtensions.rst @@ -1741,6 +1741,34 @@ OpenCL Features Clang supports internal OpenCL extensions documented below. +``__cl_clang_bitfields`` +-------------------------------- + +With this extension it is possible to enable bitfields in structs +or unions using the OpenCL extension pragma mechanism detailed in +`the OpenCL Extension Specification, section 1.2 +<https://www.khronos.org/registry/OpenCL/specs/3.0-unified/html/OpenCL_Ext.html#extensions-overview>`_. + +Use of bitfields in OpenCL kernels can result in reduced portability as struct +layout is not guaranteed to be consistent when compiled by diff erent compilers. +If structs with bitfields are used as kernel function parameters, it can result +in incorrect functionality when the layout is diff erent between the host and +device code. + +**Example of Use**: + +.. code-block:: c++ + + #pragma OPENCL EXTENSION __cl_clang_bitfields : enable + struct with_bitfield { + unsigned int i : 5; // compiled - no diagnostic generated + }; + + #pragma OPENCL EXTENSION __cl_clang_bitfields : disable + struct without_bitfield { + unsigned int i : 5; // error - bitfields are not supported + }; + ``__cl_clang_function_pointers`` -------------------------------- diff --git a/clang/include/clang/Basic/OpenCLExtensions.def b/clang/include/clang/Basic/OpenCLExtensions.def index a0f01a2af9c37..a053a0e9adb59 100644 --- a/clang/include/clang/Basic/OpenCLExtensions.def +++ b/clang/include/clang/Basic/OpenCLExtensions.def @@ -88,6 +88,7 @@ OPENCL_EXTENSION(cl_clang_storage_class_specifiers, true, 100) OPENCL_EXTENSION(__cl_clang_function_pointers, true, 100) OPENCL_EXTENSION(__cl_clang_variadic_functions, true, 100) OPENCL_EXTENSION(__cl_clang_non_portable_kernel_param_types, true, 100) +OPENCL_EXTENSION(__cl_clang_bitfields, true, 100) // AMD OpenCL extensions OPENCL_EXTENSION(cl_amd_media_ops, true, 100) diff --git a/clang/lib/Basic/Targets/AMDGPU.h b/clang/lib/Basic/Targets/AMDGPU.h index 2729c515bb650..fe5c61c6ba2bb 100644 --- a/clang/lib/Basic/Targets/AMDGPU.h +++ b/clang/lib/Basic/Targets/AMDGPU.h @@ -288,6 +288,7 @@ class LLVM_LIBRARY_VISIBILITY AMDGPUTargetInfo final : public TargetInfo { Opts["__cl_clang_variadic_functions"] = true; Opts["__cl_clang_function_pointers"] = true; Opts["__cl_clang_non_portable_kernel_param_types"] = true; + Opts["__cl_clang_bitfields"] = true; bool IsAMDGCN = isAMDGCN(getTriple()); diff --git a/clang/lib/Basic/Targets/NVPTX.h b/clang/lib/Basic/Targets/NVPTX.h index c429d5501337a..c7db3cdaaf10a 100644 --- a/clang/lib/Basic/Targets/NVPTX.h +++ b/clang/lib/Basic/Targets/NVPTX.h @@ -136,6 +136,7 @@ class LLVM_LIBRARY_VISIBILITY NVPTXTargetInfo : public TargetInfo { Opts["__cl_clang_function_pointers"] = true; Opts["__cl_clang_variadic_functions"] = true; Opts["__cl_clang_non_portable_kernel_param_types"] = true; + Opts["__cl_clang_bitfields"] = true; Opts["cl_khr_fp64"] = true; Opts["__opencl_c_fp64"] = true; diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 6d6b8b5e797da..601f4f2502f0a 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -16815,8 +16815,10 @@ FieldDecl *Sema::CheckFieldDecl(DeclarationName Name, QualType T, Record->setInvalidDecl(); InvalidDecl = true; } - // OpenCL v1.2 s6.9.c: bitfields are not supported. - if (BitWidth) { + // OpenCL v1.2 s6.9.c: bitfields are not supported, unless Clang extension + // is enabled. + if (BitWidth && !getOpenCLOptions().isAvailableOption( + "__cl_clang_bitfields", LangOpts)) { Diag(Loc, diag::err_opencl_bitfields); InvalidDecl = true; } diff --git a/clang/test/Misc/amdgcn.languageOptsOpenCL.cl b/clang/test/Misc/amdgcn.languageOptsOpenCL.cl index 7fc4e7ea005e7..186cdae0494c6 100644 --- a/clang/test/Misc/amdgcn.languageOptsOpenCL.cl +++ b/clang/test/Misc/amdgcn.languageOptsOpenCL.cl @@ -29,6 +29,11 @@ #endif #pragma OPENCL EXTENSION __cl_clang_non_portable_kernel_param_types : enable +#ifndef __cl_clang_bitfields +#error "Missing __cl_clang_bitfields define" +#endif +#pragma OPENCL EXTENSION __cl_clang_bitfields : enable + #ifndef cl_khr_fp16 #error "Missing cl_khr_fp16 define" #endif diff --git a/clang/test/Misc/nvptx.languageOptsOpenCL.cl b/clang/test/Misc/nvptx.languageOptsOpenCL.cl index 6657c18f1eebe..f479dddffb3ab 100644 --- a/clang/test/Misc/nvptx.languageOptsOpenCL.cl +++ b/clang/test/Misc/nvptx.languageOptsOpenCL.cl @@ -33,6 +33,11 @@ #endif #pragma OPENCL EXTENSION __cl_clang_non_portable_kernel_param_types : enable +#ifndef __cl_clang_bitfields +#error "Missing __cl_clang_bitfields define" +#endif +#pragma OPENCL EXTENSION __cl_clang_bitfields : enable + #ifdef cl_khr_fp16 #error "Incorrect cl_khr_fp16 define" #endif diff --git a/clang/test/Misc/r600.languageOptsOpenCL.cl b/clang/test/Misc/r600.languageOptsOpenCL.cl index 80c628af03608..600c49f4ed692 100644 --- a/clang/test/Misc/r600.languageOptsOpenCL.cl +++ b/clang/test/Misc/r600.languageOptsOpenCL.cl @@ -39,6 +39,11 @@ #endif #pragma OPENCL EXTENSION __cl_clang_non_portable_kernel_param_types : enable +#ifndef __cl_clang_bitfields +#error "Missing __cl_clang_bitfields define" +#endif +#pragma OPENCL EXTENSION __cl_clang_bitfields : enable + #ifdef cl_khr_fp16 #error "Incorrect cl_khr_fp16 define" #endif diff --git a/clang/test/SemaOpenCL/unsupported.cl b/clang/test/SemaOpenCL/unsupported.cl index a5fc570e757ed..36f60259f8a73 100644 --- a/clang/test/SemaOpenCL/unsupported.cl +++ b/clang/test/SemaOpenCL/unsupported.cl @@ -1,7 +1,15 @@ // RUN: %clang_cc1 -verify %s +// RUN: %clang_cc1 -verify %s -DBITFIELDS_EXT -struct { - int a : 1; // expected-error {{bit-fields are not supported in OpenCL}} +#ifdef BITFIELDS_EXT +#pragma OPENCL EXTENSION __cl_clang_bitfields : enable +#endif + +struct test { + int a : 1; +#ifndef BITFIELDS_EXT +// expected-error@-2 {{bit-fields are not supported in OpenCL}} +#endif }; void no_vla(int n) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits