[clang] 6cb7631 - [OpenCL] Change OpenCL builtin version encoding
Sven van Haastregt via cfe-commits
cfe-commits at lists.llvm.org
Mon Apr 19 02:23:40 PDT 2021
Author: Sven van Haastregt
Date: 2021-04-19T10:23:13+01:00
New Revision: 6cb7631df348a0fa8bb64c518d47838525f4a40b
URL: https://github.com/llvm/llvm-project/commit/6cb7631df348a0fa8bb64c518d47838525f4a40b
DIFF: https://github.com/llvm/llvm-project/commit/6cb7631df348a0fa8bb64c518d47838525f4a40b.diff
LOG: [OpenCL] Change OpenCL builtin version encoding
Instead of using a MinVersion and MaxVersion field, encode the version
of a builtin using a mask that aligns better with version handling in
OpenCLOptions.h. In addition, this saves a field in the BuiltinTable.
This change allows a finer-grained control over the OpenCL versions in
which a builtin is available: instead of a range, we can now toggle
each version individually.
The fine-grained version control is not yet exposed on the TableGen
definitions side, as changes for OpenCL 3 feature optionality still
need to be defined and will affect how we want to expose these.
Differential Revision: https://reviews.llvm.org/D100492
Added:
Modified:
clang/lib/Sema/SemaLookup.cpp
clang/utils/TableGen/ClangOpenCLBuiltinEmitter.cpp
Removed:
################################################################################
diff --git a/clang/lib/Sema/SemaLookup.cpp b/clang/lib/Sema/SemaLookup.cpp
index 92efd427ba6c6..9eba3e812bbf1 100644
--- a/clang/lib/Sema/SemaLookup.cpp
+++ b/clang/lib/Sema/SemaLookup.cpp
@@ -798,19 +798,16 @@ static void InsertOCLBuiltinDeclarationsFromTable(Sema &S, LookupResult &LR,
// as argument. Only meaningful for generic types, otherwise equals 1.
unsigned GenTypeMaxCnt;
+ ASTContext &Context = S.Context;
+
for (unsigned SignatureIndex = 0; SignatureIndex < Len; SignatureIndex++) {
const OpenCLBuiltinStruct &OpenCLBuiltin =
BuiltinTable[FctIndex + SignatureIndex];
- ASTContext &Context = S.Context;
- // Ignore this BIF if its version does not match the language options.
- unsigned OpenCLVersion = Context.getLangOpts().OpenCLVersion;
- if (Context.getLangOpts().OpenCLCPlusPlus)
- OpenCLVersion = 200;
- if (OpenCLVersion < OpenCLBuiltin.MinVersion)
- continue;
- if ((OpenCLBuiltin.MaxVersion != 0) &&
- (OpenCLVersion >= OpenCLBuiltin.MaxVersion))
+ // Ignore this builtin function if it is not available in the currently
+ // selected language version.
+ if (!isOpenCLVersionContainedInMask(Context.getLangOpts(),
+ OpenCLBuiltin.Versions))
continue;
// Ignore this builtin function if it carries an extension macro that is
diff --git a/clang/utils/TableGen/ClangOpenCLBuiltinEmitter.cpp b/clang/utils/TableGen/ClangOpenCLBuiltinEmitter.cpp
index 3e8c90a00753f..aa22eea2ba95a 100644
--- a/clang/utils/TableGen/ClangOpenCLBuiltinEmitter.cpp
+++ b/clang/utils/TableGen/ClangOpenCLBuiltinEmitter.cpp
@@ -339,10 +339,8 @@ struct OpenCLBuiltinStruct {
const bool IsConv : 1;
// OpenCL extension(s) required for this overload.
const unsigned short Extension;
- // First OpenCL version in which this overload was introduced (e.g. CL20).
- const unsigned short MinVersion;
- // First OpenCL version in which this overload was removed (e.g. CL20).
- const unsigned short MaxVersion;
+ // OpenCL versions in which this overload is available.
+ const unsigned short Versions;
};
)";
@@ -490,6 +488,29 @@ void BuiltinNameEmitter::EmitSignatureTable() {
OS << "};\n\n";
}
+// 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;
+
+ // A maximum version of 0 means available in all later versions.
+ if (MaxVersion == 0) {
+ MaxVersion = UINT_MAX;
+ }
+
+ unsigned VersionIDs[] = {100, 110, 120, 200, 300};
+ for (unsigned I = 0; I < sizeof(VersionIDs) / sizeof(VersionIDs[0]); I++) {
+ if (VersionIDs[I] >= MinVersion && VersionIDs[I] < MaxVersion) {
+ Encoded |= 1 << I;
+ }
+ }
+
+ return Encoded;
+}
+
void BuiltinNameEmitter::EmitBuiltinTable() {
unsigned Index = 0;
@@ -510,9 +531,10 @@ void BuiltinNameEmitter::EmitBuiltinTable() {
<< (Overload.first->getValueAsBit("IsConst")) << ", "
<< (Overload.first->getValueAsBit("IsConv")) << ", "
<< FunctionExtensionIndex[ExtName] << ", "
- << Overload.first->getValueAsDef("MinVersion")->getValueAsInt("ID")
- << ", "
- << Overload.first->getValueAsDef("MaxVersion")->getValueAsInt("ID")
+ << EncodeVersions(Overload.first->getValueAsDef("MinVersion")
+ ->getValueAsInt("ID"),
+ Overload.first->getValueAsDef("MaxVersion")
+ ->getValueAsInt("ID"))
<< " },\n";
Index++;
}
More information about the cfe-commits
mailing list