[clang] f9ffe61 - [OpenCL] Factor out OpenCLBuiltinFileEmitterBase; NFC
Sven van Haastregt via cfe-commits
cfe-commits at lists.llvm.org
Mon Aug 9 03:41:39 PDT 2021
Author: Sven van Haastregt
Date: 2021-08-09T11:41:25+01:00
New Revision: f9ffe61fb53f595b7be136c340508c094482fcff
URL: https://github.com/llvm/llvm-project/commit/f9ffe61fb53f595b7be136c340508c094482fcff
DIFF: https://github.com/llvm/llvm-project/commit/f9ffe61fb53f595b7be136c340508c094482fcff.diff
LOG: [OpenCL] Factor out OpenCLBuiltinFileEmitterBase; NFC
Factor out functionality that can be shared with a header file emitter
that is to be added in the future.
Added:
Modified:
clang/utils/TableGen/ClangOpenCLBuiltinEmitter.cpp
Removed:
################################################################################
diff --git a/clang/utils/TableGen/ClangOpenCLBuiltinEmitter.cpp b/clang/utils/TableGen/ClangOpenCLBuiltinEmitter.cpp
index a4cb5b7cacd98..457313f1839fd 100644
--- a/clang/utils/TableGen/ClangOpenCLBuiltinEmitter.cpp
+++ b/clang/utils/TableGen/ClangOpenCLBuiltinEmitter.cpp
@@ -233,19 +233,17 @@ class BuiltinNameEmitter {
MapVector<BuiltinIndexListTy *, BuiltinTableEntries> SignatureListMap;
};
-// OpenCL builtin test generator. This class processes the same TableGen input
-// as BuiltinNameEmitter, but generates a .cl file that contains a call to each
-// builtin function described in the .td input.
-class OpenCLBuiltinTestEmitter {
+/// Base class for emitting a file (e.g. header or test) from OpenCLBuiltins.td
+class OpenCLBuiltinFileEmitterBase {
public:
- OpenCLBuiltinTestEmitter(RecordKeeper &Records, raw_ostream &OS)
+ OpenCLBuiltinFileEmitterBase(RecordKeeper &Records, raw_ostream &OS)
: Records(Records), OS(OS) {}
// Entrypoint to generate the functions for testing all OpenCL builtin
// functions.
- void emit();
+ virtual void emit() = 0;
-private:
+protected:
struct TypeFlags {
TypeFlags() : IsConst(false), IsVolatile(false), IsPointer(false) {}
bool IsConst : 1;
@@ -282,6 +280,18 @@ class OpenCLBuiltinTestEmitter {
expandTypesInSignature(const std::vector<Record *> &Signature,
SmallVectorImpl<SmallVector<std::string, 2>> &Types);
+ // Emit extension enabling pragmas.
+ void emitExtensionSetup();
+
+ // Emit an #if guard for a Builtin's extension. Return the corresponding
+ // closing #endif, or an empty string if no extension #if guard was emitted.
+ std::string emitExtensionGuard(const Record *Builtin);
+
+ // Emit an #if guard for a Builtin's language version. Return the
+ // corresponding closing #endif, or an empty string if no version #if guard
+ // was emitted.
+ std::string emitVersionGuard(const Record *Builtin);
+
// Contains OpenCL builtin functions and related information, stored as
// Record instances. They are coming from the associated TableGen file.
RecordKeeper &Records;
@@ -290,6 +300,19 @@ class OpenCLBuiltinTestEmitter {
raw_ostream &OS;
};
+// OpenCL builtin test generator. This class processes the same TableGen input
+// as BuiltinNameEmitter, but generates a .cl file that contains a call to each
+// builtin function described in the .td input.
+class OpenCLBuiltinTestEmitter : public OpenCLBuiltinFileEmitterBase {
+public:
+ OpenCLBuiltinTestEmitter(RecordKeeper &Records, raw_ostream &OS)
+ : OpenCLBuiltinFileEmitterBase(Records, OS) {}
+
+ // Entrypoint to generate the functions for testing all OpenCL builtin
+ // functions.
+ void emit() override;
+};
+
} // namespace
void BuiltinNameEmitter::Emit() {
@@ -923,9 +946,9 @@ static void OCL2Qual(Sema &S, const OpenCLTypeStruct &Ty,
OS << "\n} // OCL2Qual\n";
}
-std::string OpenCLBuiltinTestEmitter::getTypeString(const Record *Type,
- TypeFlags Flags,
- int VectorSize) const {
+std::string OpenCLBuiltinFileEmitterBase::getTypeString(const Record *Type,
+ TypeFlags Flags,
+ int VectorSize) const {
std::string S;
if (Type->getValueAsBit("IsConst") || Flags.IsConst) {
S += "const ";
@@ -970,7 +993,7 @@ std::string OpenCLBuiltinTestEmitter::getTypeString(const Record *Type,
return S;
}
-void OpenCLBuiltinTestEmitter::getTypeLists(
+void OpenCLBuiltinFileEmitterBase::getTypeLists(
Record *Type, TypeFlags &Flags, std::vector<Record *> &TypeList,
std::vector<int64_t> &VectorList) const {
bool isGenType = Type->isSubClassOf("GenericType");
@@ -1003,7 +1026,7 @@ void OpenCLBuiltinTestEmitter::getTypeLists(
VectorList.push_back(Type->getValueAsInt("VecWidth"));
}
-void OpenCLBuiltinTestEmitter::expandTypesInSignature(
+void OpenCLBuiltinFileEmitterBase::expandTypesInSignature(
const std::vector<Record *> &Signature,
SmallVectorImpl<SmallVector<std::string, 2>> &Types) {
// Find out if there are any GenTypes in this signature, and if so, calculate
@@ -1044,10 +1067,7 @@ void OpenCLBuiltinTestEmitter::expandTypesInSignature(
}
}
-void OpenCLBuiltinTestEmitter::emit() {
- emitSourceFileHeader("OpenCL Builtin exhaustive testing", OS);
-
- // Enable some extensions for testing.
+void OpenCLBuiltinFileEmitterBase::emitExtensionSetup() {
OS << R"(
#pragma OPENCL EXTENSION cl_khr_fp16 : enable
#pragma OPENCL EXTENSION cl_khr_fp64 : enable
@@ -1058,6 +1078,60 @@ void OpenCLBuiltinTestEmitter::emit() {
#pragma OPENCL EXTENSION cl_khr_3d_image_writes : enable
)";
+}
+
+std::string
+OpenCLBuiltinFileEmitterBase::emitExtensionGuard(const Record *Builtin) {
+ StringRef Extensions =
+ Builtin->getValueAsDef("Extension")->getValueAsString("ExtName");
+ if (Extensions.empty())
+ return "";
+
+ OS << "#if";
+
+ SmallVector<StringRef, 2> ExtVec;
+ Extensions.split(ExtVec, " ");
+ bool isFirst = true;
+ for (StringRef Ext : ExtVec) {
+ if (!isFirst) {
+ OS << " &&";
+ }
+ OS << " defined(" << Ext << ")";
+ isFirst = false;
+ }
+ OS << "\n";
+
+ return "#endif // Extension\n";
+}
+
+std::string
+OpenCLBuiltinFileEmitterBase::emitVersionGuard(const Record *Builtin) {
+ std::string OptionalEndif;
+ auto PrintOpenCLVersion = [this](int Version) {
+ OS << "CL_VERSION_" << (Version / 100) << "_" << ((Version % 100) / 10);
+ };
+ int MinVersion = Builtin->getValueAsDef("MinVersion")->getValueAsInt("ID");
+ if (MinVersion != 100) {
+ // OpenCL 1.0 is the default minimum version.
+ OS << "#if __OPENCL_C_VERSION__ >= ";
+ PrintOpenCLVersion(MinVersion);
+ OS << "\n";
+ OptionalEndif = "#endif // MinVersion\n" + OptionalEndif;
+ }
+ int MaxVersion = Builtin->getValueAsDef("MaxVersion")->getValueAsInt("ID");
+ if (MaxVersion) {
+ OS << "#if __OPENCL_C_VERSION__ < ";
+ PrintOpenCLVersion(MaxVersion);
+ OS << "\n";
+ OptionalEndif = "#endif // MaxVersion\n" + OptionalEndif;
+ }
+ return OptionalEndif;
+}
+
+void OpenCLBuiltinTestEmitter::emit() {
+ emitSourceFileHeader("OpenCL Builtin exhaustive testing", OS);
+
+ emitExtensionSetup();
// Ensure each test has a unique name by numbering them.
unsigned TestID = 0;
@@ -1071,43 +1145,10 @@ void OpenCLBuiltinTestEmitter::emit() {
expandTypesInSignature(B->getValueAsListOfDefs("Signature"), FTypes);
OS << "// Test " << Name << "\n";
- std::string OptionalEndif;
- StringRef Extensions =
- B->getValueAsDef("Extension")->getValueAsString("ExtName");
- if (!Extensions.empty()) {
- OS << "#if";
- OptionalEndif = "#endif // Extension\n";
-
- SmallVector<StringRef, 2> ExtVec;
- Extensions.split(ExtVec, " ");
- bool isFirst = true;
- for (StringRef Ext : ExtVec) {
- if (!isFirst) {
- OS << " &&";
- }
- OS << " defined(" << Ext << ")";
- isFirst = false;
- }
- OS << "\n";
- }
- auto PrintOpenCLVersion = [this](int Version) {
- OS << "CL_VERSION_" << (Version / 100) << "_" << ((Version % 100) / 10);
- };
- int MinVersion = B->getValueAsDef("MinVersion")->getValueAsInt("ID");
- if (MinVersion != 100) {
- // OpenCL 1.0 is the default minimum version.
- OS << "#if __OPENCL_C_VERSION__ >= ";
- PrintOpenCLVersion(MinVersion);
- OS << "\n";
- OptionalEndif = "#endif // MinVersion\n" + OptionalEndif;
- }
- int MaxVersion = B->getValueAsDef("MaxVersion")->getValueAsInt("ID");
- if (MaxVersion) {
- OS << "#if __OPENCL_C_VERSION__ < ";
- PrintOpenCLVersion(MaxVersion);
- OS << "\n";
- OptionalEndif = "#endif // MaxVersion\n" + OptionalEndif;
- }
+
+ std::string OptionalExtensionEndif = emitExtensionGuard(B);
+ std::string OptionalVersionEndif = emitVersionGuard(B);
+
for (const auto &Signature : FTypes) {
// Emit function declaration.
OS << Signature[0] << " test" << TestID++ << "_" << Name << "(";
@@ -1136,7 +1177,9 @@ void OpenCLBuiltinTestEmitter::emit() {
// End of function body.
OS << "}\n";
}
- OS << OptionalEndif << "\n";
+
+ OS << OptionalVersionEndif;
+ OS << OptionalExtensionEndif;
}
}
More information about the cfe-commits
mailing list