svenvh created this revision. svenvh added reviewers: Anastasia, olestrohm. svenvh added a project: clang. Herald added subscribers: ldrumm, jfb, yaxunl. svenvh requested review of this revision. Herald added a subscriber: cfe-commits.
https://reviews.llvm.org/D62335 added some C++ for OpenCL specific builtins to opencl-c.h, but these were not mirrored to the TableGen builtin functions yet. The TableGen builtins machinery does not have dedicated version handling for C++ for OpenCL at the moment: all builtin versioning is tied to `LangOpts.OpenCLVersion` (i.e., the OpenCL C version). As a workaround, to add builtins that are only available in C++ for OpenCL, we define a function extension guarded by the __cplusplus macro. Fixes PR50041. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D100935 Files: clang/lib/Sema/OpenCLBuiltins.td clang/test/SemaOpenCL/fdeclare-opencl-builtins.cl Index: clang/test/SemaOpenCL/fdeclare-opencl-builtins.cl =================================================================== --- clang/test/SemaOpenCL/fdeclare-opencl-builtins.cl +++ clang/test/SemaOpenCL/fdeclare-opencl-builtins.cl @@ -122,6 +122,17 @@ } #endif +// Test old atomic overloaded with generic address space in C++ for OpenCL. +#if __OPENCL_C_VERSION__ >= 200 +void test_legacy_atomics_cpp(__generic volatile unsigned int *a) { + atomic_add(a, 1); +#if !defined(__cplusplus) + // expected-error@-2{{no matching function for call to 'atomic_add'}} + // expected-note@-3 4 {{candidate function not viable}} +#endif +} +#endif + kernel void basic_conversion() { float f; char2 c2; Index: clang/lib/Sema/OpenCLBuiltins.td =================================================================== --- clang/lib/Sema/OpenCLBuiltins.td +++ clang/lib/Sema/OpenCLBuiltins.td @@ -82,6 +82,9 @@ def FuncExtKhrMipmapImageWrites : FunctionExtension<"cl_khr_mipmap_image_writes">; def FuncExtKhrGlMsaaSharing : FunctionExtension<"cl_khr_gl_msaa_sharing">; +// Not a real extension, but a workaround to add C++ for OpenCL specific builtins. +def FuncExtOpenCLCxx : FunctionExtension<"__cplusplus">; + // Multiple extensions def FuncExtKhrMipmapWritesAndWrite3d : FunctionExtension<"cl_khr_mipmap_image_writes cl_khr_3d_image_writes">; @@ -1077,6 +1080,17 @@ } } } + +let Extension = FuncExtOpenCLCxx in { + foreach Type = [Int, UInt] in { + foreach name = ["atomic_add", "atomic_sub", "atomic_xchg", + "atomic_min", "atomic_max", "atomic_and", + "atomic_or", "atomic_xor"] in { + def : Builtin<name, [Type, PointerType<VolatileType<Type>, GenericAS>, Type]>; + } + } +} + // OpenCL v2.0 s6.13.11 - Atomic Functions. let MinVersion = CL20 in { def : Builtin<"atomic_work_item_fence", [Void, MemFenceFlags, MemoryOrder, MemoryScope]>;
Index: clang/test/SemaOpenCL/fdeclare-opencl-builtins.cl =================================================================== --- clang/test/SemaOpenCL/fdeclare-opencl-builtins.cl +++ clang/test/SemaOpenCL/fdeclare-opencl-builtins.cl @@ -122,6 +122,17 @@ } #endif +// Test old atomic overloaded with generic address space in C++ for OpenCL. +#if __OPENCL_C_VERSION__ >= 200 +void test_legacy_atomics_cpp(__generic volatile unsigned int *a) { + atomic_add(a, 1); +#if !defined(__cplusplus) + // expected-error@-2{{no matching function for call to 'atomic_add'}} + // expected-note@-3 4 {{candidate function not viable}} +#endif +} +#endif + kernel void basic_conversion() { float f; char2 c2; Index: clang/lib/Sema/OpenCLBuiltins.td =================================================================== --- clang/lib/Sema/OpenCLBuiltins.td +++ clang/lib/Sema/OpenCLBuiltins.td @@ -82,6 +82,9 @@ def FuncExtKhrMipmapImageWrites : FunctionExtension<"cl_khr_mipmap_image_writes">; def FuncExtKhrGlMsaaSharing : FunctionExtension<"cl_khr_gl_msaa_sharing">; +// Not a real extension, but a workaround to add C++ for OpenCL specific builtins. +def FuncExtOpenCLCxx : FunctionExtension<"__cplusplus">; + // Multiple extensions def FuncExtKhrMipmapWritesAndWrite3d : FunctionExtension<"cl_khr_mipmap_image_writes cl_khr_3d_image_writes">; @@ -1077,6 +1080,17 @@ } } } + +let Extension = FuncExtOpenCLCxx in { + foreach Type = [Int, UInt] in { + foreach name = ["atomic_add", "atomic_sub", "atomic_xchg", + "atomic_min", "atomic_max", "atomic_and", + "atomic_or", "atomic_xor"] in { + def : Builtin<name, [Type, PointerType<VolatileType<Type>, GenericAS>, Type]>; + } + } +} + // OpenCL v2.0 s6.13.11 - Atomic Functions. let MinVersion = CL20 in { def : Builtin<"atomic_work_item_fence", [Void, MemFenceFlags, MemoryOrder, MemoryScope]>;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits