Author: Wenju He Date: 2026-06-17T13:00:15+08:00 New Revision: 16d22173dbb1d3e77cfed5bbcc2aca1157350d25
URL: https://github.com/llvm/llvm-project/commit/16d22173dbb1d3e77cfed5bbcc2aca1157350d25 DIFF: https://github.com/llvm/llvm-project/commit/16d22173dbb1d3e77cfed5bbcc2aca1157350d25.diff LOG: [Clang][OpenCL] Add OpenCL 3.1 language version (#204043) OpenCL 3.1 was recently added to spec in https://github.com/KhronosGroup/OpenCL-Docs/commit/9fff1a87a975 This PR adds version 3.1 to clang support, including frontend flag `-std=cl3.1` (and its alias `-std=CL3.1`). Updated release note. A few extensions are promoted to 3.1 core. They'll be handled in follow-up PRs. Assisted-by: Claude Sonnet 4.6 Added: Modified: clang/docs/ReleaseNotes.rst clang/include/clang/Basic/LangStandards.def clang/include/clang/Basic/OpenCLOptions.h clang/lib/Basic/LangOptions.cpp clang/lib/Basic/TargetInfo.cpp clang/lib/Frontend/CompilerInvocation.cpp clang/lib/Frontend/InitPreprocessor.cpp clang/test/Driver/opencl.cl clang/test/Driver/unknown-std.cl clang/test/Preprocessor/predefined-macros.c clang/utils/TableGen/ClangOpenCLBuiltinEmitter.cpp Removed: ################################################################################ diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index c5e54b09b5ed4..89909fe27cbb9 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -822,6 +822,10 @@ Miscellaneous Clang Crashes Fixed OpenACC Specific Changes ------------------------ +OpenCL Specific Changes +----------------------- +- Added support for OpenCL C 3.1 language version (``-cl-std=CL3.1``). + Target Specific Changes ----------------------- diff --git a/clang/include/clang/Basic/LangStandards.def b/clang/include/clang/Basic/LangStandards.def index 4edc93503cdf5..809240978d013 100644 --- a/clang/include/clang/Basic/LangStandards.def +++ b/clang/include/clang/Basic/LangStandards.def @@ -209,6 +209,9 @@ LANGSTANDARD(opencl20, "cl2.0", LANGSTANDARD(opencl30, "cl3.0", OpenCL, "OpenCL 3.0", LineComment | C99 | Digraphs | HexFloat | OpenCL, std::nullopt) +LANGSTANDARD(opencl31, "cl3.1", + OpenCL, "OpenCL 3.1", + LineComment | C99 | Digraphs | HexFloat | OpenCL, std::nullopt) LANGSTANDARD(openclcpp10, "clc++1.0", OpenCL, "C++ for OpenCL 1.0", @@ -226,6 +229,7 @@ LANGSTANDARD_ALIAS_DEPR(opencl11, "CL1.1") LANGSTANDARD_ALIAS_DEPR(opencl12, "CL1.2") LANGSTANDARD_ALIAS_DEPR(opencl20, "CL2.0") LANGSTANDARD_ALIAS_DEPR(opencl30, "CL3.0") +LANGSTANDARD_ALIAS_DEPR(opencl31, "CL3.1") LANGSTANDARD_ALIAS_DEPR(openclcpp10, "CLC++") LANGSTANDARD_ALIAS_DEPR(openclcpp10, "CLC++1.0") LANGSTANDARD_ALIAS_DEPR(openclcpp2021, "CLC++2021") diff --git a/clang/include/clang/Basic/OpenCLOptions.h b/clang/include/clang/Basic/OpenCLOptions.h index d6cb1a210519d..ec661bba94adb 100644 --- a/clang/include/clang/Basic/OpenCLOptions.h +++ b/clang/include/clang/Basic/OpenCLOptions.h @@ -32,7 +32,8 @@ enum OpenCLVersionID : unsigned int { OCL_C_12 = 0x4, OCL_C_20 = 0x8, OCL_C_30 = 0x10, - OCL_C_ALL = 0x1f, + OCL_C_31 = 0x20, + OCL_C_ALL = 0x3f, OCL_C_11P = OCL_C_ALL ^ OCL_C_10, // OpenCL C 1.1+ OCL_C_12P = OCL_C_ALL ^ (OCL_C_10 | OCL_C_11), // OpenCL C 1.2+ }; @@ -51,6 +52,8 @@ static inline OpenCLVersionID encodeOpenCLVersion(unsigned OpenCLVersion) { return OCL_C_20; case 300: return OCL_C_30; + case 310: + return OCL_C_31; } } diff --git a/clang/lib/Basic/LangOptions.cpp b/clang/lib/Basic/LangOptions.cpp index 7e75bf1221eb7..7e0ee665d4493 100644 --- a/clang/lib/Basic/LangOptions.cpp +++ b/clang/lib/Basic/LangOptions.cpp @@ -153,6 +153,8 @@ void LangOptions::setLangDefaults(LangOptions &Opts, Language Lang, Opts.OpenCLVersion = 200; else if (LangStd == LangStandard::lang_opencl30) Opts.OpenCLVersion = 300; + else if (LangStd == LangStandard::lang_opencl31) + Opts.OpenCLVersion = 310; else if (LangStd == LangStandard::lang_openclcpp10) Opts.OpenCLCPlusPlusVersion = 100; else if (LangStd == LangStandard::lang_openclcpp2021) diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp index 854d23cadaea2..9a25384347073 100644 --- a/clang/lib/Basic/TargetInfo.cpp +++ b/clang/lib/Basic/TargetInfo.cpp @@ -491,7 +491,7 @@ void TargetInfo::adjust(DiagnosticsEngine &Diags, LangOptions &Opts, // for OpenCL C 2.0 but with no access to target capabilities. Target // should be immutable once created and thus these language options need // to be defined only once. - if (Opts.getOpenCLCompatibleVersion() == 300) { + if (Opts.getOpenCLCompatibleVersion() >= 300) { const auto &OpenCLFeaturesMap = getSupportedOpenCLOpts(); Opts.OpenCLGenericAddressSpace = hasFeatureEnabled( OpenCLFeaturesMap, "__opencl_c_generic_address_space"); diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index c564748ddabc1..d2847739e3143 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -4099,6 +4099,7 @@ bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args, .Cases({"cl1.2", "CL1.2"}, LangStandard::lang_opencl12) .Cases({"cl2.0", "CL2.0"}, LangStandard::lang_opencl20) .Cases({"cl3.0", "CL3.0"}, LangStandard::lang_opencl30) + .Cases({"cl3.1", "CL3.1"}, LangStandard::lang_opencl31) .Cases({"clc++", "CLC++"}, LangStandard::lang_openclcpp10) .Cases({"clc++1.0", "CLC++1.0"}, LangStandard::lang_openclcpp10) .Cases({"clc++2021", "CLC++2021"}, LangStandard::lang_openclcpp2021) diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index 3f0468a938149..ec009211ec6de 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -545,6 +545,9 @@ static void InitializeStandardPredefinedMacros(const TargetInfo &TI, case 300: Builder.defineMacro("__OPENCL_C_VERSION__", "300"); break; + case 310: + Builder.defineMacro("__OPENCL_C_VERSION__", "310"); + break; default: llvm_unreachable("Unsupported OpenCL version"); } @@ -554,6 +557,7 @@ static void InitializeStandardPredefinedMacros(const TargetInfo &TI, Builder.defineMacro("CL_VERSION_1_2", "120"); Builder.defineMacro("CL_VERSION_2_0", "200"); Builder.defineMacro("CL_VERSION_3_0", "300"); + Builder.defineMacro("CL_VERSION_3_1", "310"); if (TI.isLittleEndian()) Builder.defineMacro("__ENDIAN_LITTLE__"); diff --git a/clang/test/Driver/opencl.cl b/clang/test/Driver/opencl.cl index 5b2a1033de081..ba941d5f48feb 100644 --- a/clang/test/Driver/opencl.cl +++ b/clang/test/Driver/opencl.cl @@ -4,6 +4,7 @@ // RUN: %clang -S -### -cl-std=CL1.2 %s 2>&1 | FileCheck --check-prefix=CHECK-CL12 %s // RUN: %clang -S -### -cl-std=CL2.0 %s 2>&1 | FileCheck --check-prefix=CHECK-CL20 %s // RUN: %clang -S -### -cl-std=CL3.0 %s 2>&1 | FileCheck --check-prefix=CHECK-CL30 %s +// RUN: %clang -S -### -cl-std=CL3.1 %s 2>&1 | FileCheck --check-prefix=CHECK-CL31 %s // RUN: %clang -S -### -cl-std=clc++ %s 2>&1 | FileCheck --check-prefix=CHECK-CLCPP %s // RUN: %clang -S -### -cl-opt-disable %s 2>&1 | FileCheck --check-prefix=CHECK-OPT-DISABLE %s // RUN: %clang -S -### -cl-strict-aliasing %s 2>&1 | FileCheck --check-prefix=CHECK-STRICT-ALIASING %s @@ -31,6 +32,7 @@ // CHECK-CL12: "-cc1" {{.*}} "-cl-std=CL1.2" // CHECK-CL20: "-cc1" {{.*}} "-cl-std=CL2.0" // CHECK-CL30: "-cc1" {{.*}} "-cl-std=CL3.0" +// CHECK-CL31: "-cc1" {{.*}} "-cl-std=CL3.1" // CHECK-CLCPP: "-cc1" {{.*}} "-cl-std=clc++" // CHECK-OPT-DISABLE: "-cc1" {{.*}} "-cl-opt-disable" // CHECK-STRICT-ALIASING: "-cc1" {{.*}} "-cl-strict-aliasing" diff --git a/clang/test/Driver/unknown-std.cl b/clang/test/Driver/unknown-std.cl index 3570515ad076d..a6d065d9a7d44 100644 --- a/clang/test/Driver/unknown-std.cl +++ b/clang/test/Driver/unknown-std.cl @@ -11,6 +11,7 @@ // CHECK-NEXT: note: use 'cl1.2' for 'OpenCL 1.2' standard // CHECK-NEXT: note: use 'cl2.0' for 'OpenCL 2.0' standard // CHECK-NEXT: note: use 'cl3.0' for 'OpenCL 3.0' standard +// CHECK-NEXT: note: use 'cl3.1' for 'OpenCL 3.1' standard // CHECK-NEXT: note: use 'clc++1.0' or 'clc++' for 'C++ for OpenCL 1.0' standard // CHECK-NEXT: note: use 'clc++2021' for 'C++ for OpenCL 2021' standard diff --git a/clang/test/Preprocessor/predefined-macros.c b/clang/test/Preprocessor/predefined-macros.c index ab85cfc00b42a..2dd4b78238a7b 100644 --- a/clang/test/Preprocessor/predefined-macros.c +++ b/clang/test/Preprocessor/predefined-macros.c @@ -145,6 +145,8 @@ // RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-CL20 // RUN: %clang_cc1 %s -E -dM -o - -x cl -cl-std=CL3.0 \ // RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-CL30 +// RUN: %clang_cc1 %s -E -dM -o - -x cl -cl-std=CL3.1 \ +// RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-CL31 // RUN: %clang_cc1 %s -E -dM -o - -x cl -cl-fast-relaxed-math \ // RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-FRM // RUN: %clang_cc1 %s -E -dM -o - -x cl -cl-std=clc++ \ @@ -158,6 +160,7 @@ // CHECK-CL10: #define CL_VERSION_1_2 120 // CHECK-CL10: #define CL_VERSION_2_0 200 // CHECK-CL10: #define CL_VERSION_3_0 300 +// CHECK-CL10: #define CL_VERSION_3_1 310 // CHECK-CL10: #define __OPENCL_C_VERSION__ 100 // CHECK-CL10-NOT: #define __FAST_RELAXED_MATH__ 1 // CHECK-CL11: #define CL_VERSION_1_0 100 @@ -165,6 +168,7 @@ // CHECK-CL11: #define CL_VERSION_1_2 120 // CHECK-CL11: #define CL_VERSION_2_0 200 // CHECK-CL11: #define CL_VERSION_3_0 300 +// CHECK-CL11: #define CL_VERSION_3_1 310 // CHECK-CL11: #define __OPENCL_C_VERSION__ 110 // CHECK-CL11-NOT: #define __FAST_RELAXED_MATH__ 1 // CHECK-CL12: #define CL_VERSION_1_0 100 @@ -172,6 +176,7 @@ // CHECK-CL12: #define CL_VERSION_1_2 120 // CHECK-CL12: #define CL_VERSION_2_0 200 // CHECK-CL12: #define CL_VERSION_3_0 300 +// CHECK-CL12: #define CL_VERSION_3_1 310 // CHECK-CL12: #define __OPENCL_C_VERSION__ 120 // CHECK-CL12-NOT: #define __FAST_RELAXED_MATH__ 1 // CHECK-CL20: #define CL_VERSION_1_0 100 @@ -179,6 +184,7 @@ // CHECK-CL20: #define CL_VERSION_1_2 120 // CHECK-CL20: #define CL_VERSION_2_0 200 // CHECK-CL20: #define CL_VERSION_3_0 300 +// CHECK-CL20: #define CL_VERSION_3_1 310 // CHECK-CL20: #define __OPENCL_C_VERSION__ 200 // CHECK-CL20-NOT: #define __FAST_RELAXED_MATH__ 1 // CHECK-CL30: #define CL_VERSION_1_0 100 @@ -186,8 +192,17 @@ // CHECK-CL30: #define CL_VERSION_1_2 120 // CHECK-CL30: #define CL_VERSION_2_0 200 // CHECK-CL30: #define CL_VERSION_3_0 300 +// CHECK-CL30: #define CL_VERSION_3_1 310 // CHECK-CL30: #define __OPENCL_C_VERSION__ 300 // CHECK-CL30-NOT: #define __FAST_RELAXED_MATH__ 1 +// CHECK-CL31: #define CL_VERSION_1_0 100 +// CHECK-CL31: #define CL_VERSION_1_1 110 +// CHECK-CL31: #define CL_VERSION_1_2 120 +// CHECK-CL31: #define CL_VERSION_2_0 200 +// CHECK-CL31: #define CL_VERSION_3_0 300 +// CHECK-CL31: #define CL_VERSION_3_1 310 +// CHECK-CL31: #define __OPENCL_C_VERSION__ 310 +// CHECK-CL31-NOT: #define __FAST_RELAXED_MATH__ 1 // CHECK-FRM: #define __FAST_RELAXED_MATH__ 1 // CHECK-CLCPP10: #define __CL_CPP_VERSION_1_0__ 100 // CHECK-CLCPP10: #define __CL_CPP_VERSION_2021__ 202100 diff --git a/clang/utils/TableGen/ClangOpenCLBuiltinEmitter.cpp b/clang/utils/TableGen/ClangOpenCLBuiltinEmitter.cpp index 720afea8b0965..a666dd1ed795d 100644 --- a/clang/utils/TableGen/ClangOpenCLBuiltinEmitter.cpp +++ b/clang/utils/TableGen/ClangOpenCLBuiltinEmitter.cpp @@ -604,7 +604,7 @@ static unsigned short EncodeVersions(unsigned int MinVersion, MaxVersion = UINT_MAX; } - unsigned VersionIDs[] = {100, 110, 120, 200, 300}; + unsigned VersionIDs[] = {100, 110, 120, 200, 300, 310}; for (unsigned I = 0; I < std::size(VersionIDs); I++) { if (VersionIDs[I] >= MinVersion && VersionIDs[I] < MaxVersion) { Encoded |= 1 << I; _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
