[PATCH] D19071: [OpenCL] Add predefined macros.

Yaxun Liu via cfe-commits cfe-commits at lists.llvm.org
Fri Apr 15 07:30:12 PDT 2016


yaxunl marked 6 inline comments as done.

================
Comment at: lib/Frontend/InitPreprocessor.cpp:426
@@ +425,3 @@
+    case 110:
+      Builder.defineMacro("__CLANG_OPENCL_C_VERSION__", "110");
+      break;
----------------
Anastasia wrote:
> So why we can't use unified __OPENCL_C_VERSION__?
`__OPENCL_C_VERSION__` is not defined in OpenCL spec v1.0 and 1.1.

================
Comment at: lib/Frontend/InitPreprocessor.cpp:438
@@ +437,3 @@
+    Builder.defineMacro("CL_VERSION_1_0", "100");
+    if (LangOpts.OpenCLVersion >= 110)
+      Builder.defineMacro("CL_VERSION_1_1", "110");
----------------
Anastasia wrote:
> I am not sure we should add this conditionally though. If you want to compile CL code like this (forcing pointer to point to private AS for all CL versions the code is compiled for):
> 
>   #if __OPENCL_C_VERSION__ >= CL_VERSION_2_0
>   private void* priv_ptr;
>   #else
>   void* priv_ptr;
>   #endif
> 
> This code would fail with -cl-sdt=CL1.1 (because CL_VERSION_2_0 is no longer defined), but the purpose of having version macros is to be able to condition on the passed CL version in the particular compilation run to avoid the compiler failure/miscompilation. This way we provide a way to select the right CL code for all versions the code is being compiled (if such selection is needed) to allow portability of CL code among OpenCL version.
CL_VERSION_x_y is only defined in OpenCL spec version equal or above x.y.

We can use macros like

  #if defined(__OPENCL_C_VERSION__) && defined(CL_VERSION_2_0) && __OPENCL_C_VERSION__ >= CL_VERSION_2_0
  #define _CL20_AND_ABOVE 1
  #endif


================
Comment at: lib/Frontend/InitPreprocessor.cpp:439
@@ +438,3 @@
+    if (LangOpts.OpenCLVersion >= 110)
+      Builder.defineMacro("CL_VERSION_1_1", "110");
+    if (LangOpts.OpenCLVersion >= 120)
----------------
yaxunl wrote:
> pxli168 wrote:
> > These macros maybe need for all cl version, and in the header we should compare  __OPENCL_C_VERSION__ with CL_VERSION_2_0 instead of the integer 200 in the header of  http://reviews.llvm.org/D18369? 
> Each OpenCL version only defines some of these macros by spec.
> 
> In the header file `__OPENCL_C_VERSION__` can compare with 200 since the spec defines the integer value for `__OPENCL_C_VERSION__`. Comparing with CL_VERSION_2_0 requires checking CL_VERSION_2_0 is available first. I think probably I can define a macro 
> 
>   #define _OPENCL20_AND_ABOVE defined(__OPENCL_C_VERSION__) and defined(CL_VERSION_2_0) and __OPENCL_C_VERSION__ >= 200
> 
> and then use this macro for conditioning 2.0 specific functions.
should be

  #if defined(__OPENCL_C_VERSION__) && defined(CL_VERSION_2_0) && __OPENCL_C_VERSION__ >= CL_VERSION_2_0
  #define _CL20_AND_ABOVE 1
  #endif



http://reviews.llvm.org/D19071





More information about the cfe-commits mailing list