[clang] [Clang][OpenCL] Add OpenCL 3.1 language version (PR #204043)
Wenju He via cfe-commits
cfe-commits at lists.llvm.org
Tue Jun 16 03:10:37 PDT 2026
https://github.com/wenju-he updated https://github.com/llvm/llvm-project/pull/204043
>From 1bfc4012e7835fff65ae020eaa7074347ce45a83 Mon Sep 17 00:00:00 2001
From: Wenju He <wenju.he at intel.com>
Date: Tue, 16 Jun 2026 03:20:40 +0200
Subject: [PATCH 1/2] [Clang][OpenCL] Add OpenCL 3.1 language version
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`).
Add a new OpenCLVersions.def to share OpenCL versions between
OpenCLOptions.h and ClangOpenCLBuiltinEmitter.cpp. 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
---
clang/docs/ReleaseNotes.rst | 4 +++
clang/include/clang/Basic/LangStandards.def | 4 +++
clang/include/clang/Basic/OpenCLOptions.h | 26 +++++++----------
clang/include/clang/Basic/OpenCLVersions.def | 29 +++++++++++++++++++
clang/lib/Basic/LangOptions.cpp | 2 ++
clang/lib/Basic/TargetInfo.cpp | 2 +-
clang/lib/Frontend/CompilerInvocation.cpp | 1 +
clang/lib/Frontend/InitPreprocessor.cpp | 4 +++
clang/test/Driver/opencl.cl | 2 ++
clang/test/Driver/unknown-std.cl | 1 +
clang/test/Preprocessor/predefined-macros.c | 15 ++++++++++
.../TableGen/ClangOpenCLBuiltinEmitter.cpp | 7 +++--
12 files changed, 77 insertions(+), 20 deletions(-)
create mode 100644 clang/include/clang/Basic/OpenCLVersions.def
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 7828135a6edbc..eda1327fc0eea 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..6eb08a183c244 100644
--- a/clang/include/clang/Basic/OpenCLOptions.h
+++ b/clang/include/clang/Basic/OpenCLOptions.h
@@ -27,12 +27,12 @@ namespace {
// a mask to indicate in which OpenCL version(s) extension is a core or
// optional core feature.
enum OpenCLVersionID : unsigned int {
- OCL_C_10 = 0x1,
- OCL_C_11 = 0x2,
- OCL_C_12 = 0x4,
- OCL_C_20 = 0x8,
- OCL_C_30 = 0x10,
- OCL_C_ALL = 0x1f,
+#define OPENCL_VERSION(VersionCode, Enumerator, BitValue) Enumerator = BitValue,
+#include "clang/Basic/OpenCLVersions.def"
+ OCL_C_ALL = 0
+#define OPENCL_VERSION(VersionCode, Enumerator, BitValue) | (Enumerator)
+#include "clang/Basic/OpenCLVersions.def"
+ ,
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+
};
@@ -41,16 +41,10 @@ static inline OpenCLVersionID encodeOpenCLVersion(unsigned OpenCLVersion) {
switch (OpenCLVersion) {
default:
llvm_unreachable("Unknown OpenCL version code");
- case 100:
- return OCL_C_10;
- case 110:
- return OCL_C_11;
- case 120:
- return OCL_C_12;
- case 200:
- return OCL_C_20;
- case 300:
- return OCL_C_30;
+#define OPENCL_VERSION(VersionCode, Enumerator, BitValue) \
+ case VersionCode: \
+ return Enumerator;
+#include "clang/Basic/OpenCLVersions.def"
}
}
diff --git a/clang/include/clang/Basic/OpenCLVersions.def b/clang/include/clang/Basic/OpenCLVersions.def
new file mode 100644
index 0000000000000..9952ce8c92d33
--- /dev/null
+++ b/clang/include/clang/Basic/OpenCLVersions.def
@@ -0,0 +1,29 @@
+//===--- OpenCLVersions.def - OpenCL version list ---------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines the list of supported OpenCL C versions.
+//
+// OPENCL_VERSION(VersionCode, Enumerator, BitValue)
+//
+// VersionCode - integer representation (e.g., 100 for OpenCL C 1.0).
+// Enumerator - OpenCLVersionID enum name.
+// BitValue - bitmask value for OpenCLVersionID.
+//
+
+#ifndef OPENCL_VERSION
+#error "OPENCL_VERSION macro must be defined before including this file"
+#endif
+
+OPENCL_VERSION(100, OCL_C_10, 0x01)
+OPENCL_VERSION(110, OCL_C_11, 0x02)
+OPENCL_VERSION(120, OCL_C_12, 0x04)
+OPENCL_VERSION(200, OCL_C_20, 0x08)
+OPENCL_VERSION(300, OCL_C_30, 0x10)
+OPENCL_VERSION(310, OCL_C_31, 0x20)
+
+#undef OPENCL_VERSION
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..d888e6e40cfa1 100644
--- a/clang/utils/TableGen/ClangOpenCLBuiltinEmitter.cpp
+++ b/clang/utils/TableGen/ClangOpenCLBuiltinEmitter.cpp
@@ -593,8 +593,6 @@ void BuiltinNameEmitter::EmitSignatureTable() {
// Encode a range MinVersion..MaxVersion into a single bit mask that can be
// checked against LangOpts using isOpenCLVersionContainedInMask().
-// This must be kept in sync with OpenCLVersionID in OpenCLOptions.h.
-// (Including OpenCLOptions.h here would be a layering violation.)
static unsigned short EncodeVersions(unsigned int MinVersion,
unsigned int MaxVersion) {
unsigned short Encoded = 0;
@@ -604,7 +602,10 @@ static unsigned short EncodeVersions(unsigned int MinVersion,
MaxVersion = UINT_MAX;
}
- unsigned VersionIDs[] = {100, 110, 120, 200, 300};
+ unsigned VersionIDs[] = {
+#define OPENCL_VERSION(VersionCode, Enumerator, BitValue) VersionCode,
+#include "clang/Basic/OpenCLVersions.def"
+ };
for (unsigned I = 0; I < std::size(VersionIDs); I++) {
if (VersionIDs[I] >= MinVersion && VersionIDs[I] < MaxVersion) {
Encoded |= 1 << I;
>From 0d60499fecaf279f9293b7886935cbb4b37693ba Mon Sep 17 00:00:00 2001
From: Wenju He <wenju.he at intel.com>
Date: Tue, 16 Jun 2026 12:00:25 +0200
Subject: [PATCH 2/2] delete OpenCLVersions.def
---
clang/include/clang/Basic/OpenCLOptions.h | 29 ++++++++++++-------
clang/include/clang/Basic/OpenCLVersions.def | 29 -------------------
.../TableGen/ClangOpenCLBuiltinEmitter.cpp | 7 ++---
3 files changed, 22 insertions(+), 43 deletions(-)
delete mode 100644 clang/include/clang/Basic/OpenCLVersions.def
diff --git a/clang/include/clang/Basic/OpenCLOptions.h b/clang/include/clang/Basic/OpenCLOptions.h
index 6eb08a183c244..ec661bba94adb 100644
--- a/clang/include/clang/Basic/OpenCLOptions.h
+++ b/clang/include/clang/Basic/OpenCLOptions.h
@@ -27,12 +27,13 @@ namespace {
// a mask to indicate in which OpenCL version(s) extension is a core or
// optional core feature.
enum OpenCLVersionID : unsigned int {
-#define OPENCL_VERSION(VersionCode, Enumerator, BitValue) Enumerator = BitValue,
-#include "clang/Basic/OpenCLVersions.def"
- OCL_C_ALL = 0
-#define OPENCL_VERSION(VersionCode, Enumerator, BitValue) | (Enumerator)
-#include "clang/Basic/OpenCLVersions.def"
- ,
+ OCL_C_10 = 0x1,
+ OCL_C_11 = 0x2,
+ OCL_C_12 = 0x4,
+ OCL_C_20 = 0x8,
+ OCL_C_30 = 0x10,
+ 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+
};
@@ -41,10 +42,18 @@ static inline OpenCLVersionID encodeOpenCLVersion(unsigned OpenCLVersion) {
switch (OpenCLVersion) {
default:
llvm_unreachable("Unknown OpenCL version code");
-#define OPENCL_VERSION(VersionCode, Enumerator, BitValue) \
- case VersionCode: \
- return Enumerator;
-#include "clang/Basic/OpenCLVersions.def"
+ case 100:
+ return OCL_C_10;
+ case 110:
+ return OCL_C_11;
+ case 120:
+ return OCL_C_12;
+ case 200:
+ return OCL_C_20;
+ case 300:
+ return OCL_C_30;
+ case 310:
+ return OCL_C_31;
}
}
diff --git a/clang/include/clang/Basic/OpenCLVersions.def b/clang/include/clang/Basic/OpenCLVersions.def
deleted file mode 100644
index 9952ce8c92d33..0000000000000
--- a/clang/include/clang/Basic/OpenCLVersions.def
+++ /dev/null
@@ -1,29 +0,0 @@
-//===--- OpenCLVersions.def - OpenCL version list ---------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file defines the list of supported OpenCL C versions.
-//
-// OPENCL_VERSION(VersionCode, Enumerator, BitValue)
-//
-// VersionCode - integer representation (e.g., 100 for OpenCL C 1.0).
-// Enumerator - OpenCLVersionID enum name.
-// BitValue - bitmask value for OpenCLVersionID.
-//
-
-#ifndef OPENCL_VERSION
-#error "OPENCL_VERSION macro must be defined before including this file"
-#endif
-
-OPENCL_VERSION(100, OCL_C_10, 0x01)
-OPENCL_VERSION(110, OCL_C_11, 0x02)
-OPENCL_VERSION(120, OCL_C_12, 0x04)
-OPENCL_VERSION(200, OCL_C_20, 0x08)
-OPENCL_VERSION(300, OCL_C_30, 0x10)
-OPENCL_VERSION(310, OCL_C_31, 0x20)
-
-#undef OPENCL_VERSION
diff --git a/clang/utils/TableGen/ClangOpenCLBuiltinEmitter.cpp b/clang/utils/TableGen/ClangOpenCLBuiltinEmitter.cpp
index d888e6e40cfa1..a666dd1ed795d 100644
--- a/clang/utils/TableGen/ClangOpenCLBuiltinEmitter.cpp
+++ b/clang/utils/TableGen/ClangOpenCLBuiltinEmitter.cpp
@@ -593,6 +593,8 @@ void BuiltinNameEmitter::EmitSignatureTable() {
// Encode a range MinVersion..MaxVersion into a single bit mask that can be
// checked against LangOpts using isOpenCLVersionContainedInMask().
+// This must be kept in sync with OpenCLVersionID in OpenCLOptions.h.
+// (Including OpenCLOptions.h here would be a layering violation.)
static unsigned short EncodeVersions(unsigned int MinVersion,
unsigned int MaxVersion) {
unsigned short Encoded = 0;
@@ -602,10 +604,7 @@ static unsigned short EncodeVersions(unsigned int MinVersion,
MaxVersion = UINT_MAX;
}
- unsigned VersionIDs[] = {
-#define OPENCL_VERSION(VersionCode, Enumerator, BitValue) VersionCode,
-#include "clang/Basic/OpenCLVersions.def"
- };
+ 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;
More information about the cfe-commits
mailing list