diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -603,9 +603,9 @@ /// InitializeOpenCLFeatureTestMacros - Define OpenCL macros based on target /// settings and language version -void InitializeOpenCLFeatureTestMacros(const TargetInfo &TI, - const LangOptions &Opts, - MacroBuilder &Builder) { +static void InitializeOpenCLFeatureTestMacros(const TargetInfo &TI, + const LangOptions &Opts, + MacroBuilder &Builder) { const llvm::StringMap &OpenCLFeaturesMap = TI.getSupportedOpenCLOpts(); // FIXME: OpenCL options which affect language semantics/syntax // should be moved into LangOptions. @@ -622,6 +622,10 @@ // Assume compiling for FULL profile Builder.defineMacro("__opencl_c_int64"); + + if (Opts.OpenCLCPlusPlus || Opts.OpenCLVersion < 300 || + TI.hasFeatureEnabled(OpenCLFeaturesMap, "__opencl_c_images")) + Builder.defineMacro("__IMAGE_SUPPORT__"); } static void InitializePredefinedMacros(const TargetInfo &TI, @@ -1159,13 +1163,9 @@ } // OpenCL definitions. - if (LangOpts.OpenCL) { + if (LangOpts.OpenCL) InitializeOpenCLFeatureTestMacros(TI, LangOpts, Builder); - if (TI.getTriple().isSPIR()) - Builder.defineMacro("__IMAGE_SUPPORT__"); - } - if (TI.hasInt128Type() && LangOpts.CPlusPlus && LangOpts.GNUMode) { // For each extended integer type, g++ defines a macro mapping the // index of the type (0 in this case) in some list of extended types diff --git a/clang/test/Preprocessor/predefined-macros.c b/clang/test/Preprocessor/predefined-macros.c --- a/clang/test/Preprocessor/predefined-macros.c +++ b/clang/test/Preprocessor/predefined-macros.c @@ -188,14 +188,12 @@ // RUN: %clang_cc1 %s -E -dM -o - -x cl -triple spir-unknown-unknown \ // RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-SPIR -// CHECK-SPIR-DAG: #define __IMAGE_SUPPORT__ 1 // CHECK-SPIR-DAG: #define __SPIR__ 1 // CHECK-SPIR-DAG: #define __SPIR32__ 1 // CHECK-SPIR-NOT: #define __SPIR64__ 1 // RUN: %clang_cc1 %s -E -dM -o - -x cl -triple spir64-unknown-unknown \ // RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-SPIR64 -// CHECK-SPIR64-DAG: #define __IMAGE_SUPPORT__ 1 // CHECK-SPIR64-DAG: #define __SPIR__ 1 // CHECK-SPIR64-DAG: #define __SPIR64__ 1 // CHECK-SPIR64-NOT: #define __SPIR32__ 1 diff --git a/clang/test/SemaOpenCL/features.cl b/clang/test/SemaOpenCL/features.cl --- a/clang/test/SemaOpenCL/features.cl +++ b/clang/test/SemaOpenCL/features.cl @@ -1,9 +1,9 @@ // RUN: %clang_cc1 -triple spir-unknown-unknown %s -E -dM -o - -x cl -cl-std=CL3.0 -cl-ext=-all \ -// RUN: | FileCheck -match-full-lines %s --check-prefix=NO-FEATURES +// RUN: | FileCheck -match-full-lines %s --check-prefixes=NO-FEATURES,NO-FEATURES-CL30 // RUN: %clang_cc1 -triple spir-unknown-unknown %s -E -dM -o - -x cl -cl-std=CL3.0 -cl-ext=+all \ // RUN: | FileCheck -match-full-lines %s --check-prefix=FEATURES // RUN: %clang_cc1 -triple r600-unknown-unknown %s -E -dM -o - -x cl -cl-std=CL3.0 \ -// RUN: | FileCheck -match-full-lines %s --check-prefix=NO-FEATURES +// RUN: | FileCheck -match-full-lines %s --check-prefixes=NO-FEATURES,NO-FEATURES-CL30 // RUN: %clang_cc1 -triple r600-unknown-unknown %s -E -dM -o - -x cl -cl-std=CL3.0 -cl-ext=+all \ // RUN: | FileCheck -match-full-lines %s --check-prefix=FEATURES @@ -21,6 +21,7 @@ // Note that __opencl_c_int64 is always defined assuming // always compiling for FULL OpenCL profile +// FEATURES: #define __IMAGE_SUPPORT__ 1 // FEATURES: #define __opencl_c_3d_image_writes 1 // FEATURES: #define __opencl_c_atomic_order_acq_rel 1 // FEATURES: #define __opencl_c_atomic_order_seq_cst 1 @@ -46,3 +47,4 @@ // NO-FEATURES-NOT: __opencl_c_program_scope_global_variables // NO-FEATURES-NOT: __opencl_c_read_write_images // NO-FEATURES-NOT: __opencl_c_subgroups +// NO-FEATURES-CL30-NOT: __IMAGE_SUPPORT__