diff --git a/clang/utils/TableGen/ClangOpenCLBuiltinEmitter.cpp b/clang/utils/TableGen/ClangOpenCLBuiltinEmitter.cpp --- a/clang/utils/TableGen/ClangOpenCLBuiltinEmitter.cpp +++ b/clang/utils/TableGen/ClangOpenCLBuiltinEmitter.cpp @@ -324,6 +324,18 @@ void emit() override; }; +// OpenCL builtin header generator. This class processes the same TableGen +// input as BuiltinNameEmitter, but generates a .h file that contains a +// prototype for each builtin function described in the .td input. +class OpenCLBuiltinHeaderEmitter : public OpenCLBuiltinFileEmitterBase { +public: + OpenCLBuiltinHeaderEmitter(RecordKeeper &Records, raw_ostream &OS) + : OpenCLBuiltinFileEmitterBase(Records, OS) {} + + // Entrypoint to generate the header. + void emit() override; +}; + } // namespace void BuiltinNameEmitter::Emit() { @@ -1260,11 +1272,76 @@ } } +void OpenCLBuiltinHeaderEmitter::emit() { + emitSourceFileHeader("OpenCL Builtin declarations", OS); + + emitExtensionSetup(); + + OS << R"( +#define __ovld __attribute__((overloadable)) +#define __conv __attribute__((convergent)) +#define __purefn __attribute__((pure)) +#define __cnfn __attribute__((const)) + +)"; + + // Iterate over all builtins; sort to follow order of definition in .td file. + std::vector Builtins = Records.getAllDerivedDefinitions("Builtin"); + llvm::sort(Builtins, LessRecord()); + + for (const auto *B : Builtins) { + StringRef Name = B->getValueAsString("Name"); + + std::string OptionalExtensionEndif = emitExtensionGuard(B); + std::string OptionalVersionEndif = emitVersionGuard(B); + + SmallVector, 4> FTypes; + expandTypesInSignature(B->getValueAsListOfDefs("Signature"), FTypes); + + for (const auto &Signature : FTypes) { + StringRef OptionalTypeExtEndif = emitTypeExtensionGuards(Signature); + + // Emit function declaration. + OS << Signature[0] << " __ovld "; + if (B->getValueAsBit("IsConst")) + OS << "__cnfn "; + if (B->getValueAsBit("IsPure")) + OS << "__purefn "; + if (B->getValueAsBit("IsConv")) + OS << "__conv "; + + OS << Name << "("; + if (Signature.size() > 1) { + for (unsigned I = 1; I < Signature.size(); I++) { + if (I != 1) + OS << ", "; + OS << Signature[I]; + } + } + OS << ");\n"; + + OS << OptionalTypeExtEndif; + } + + OS << OptionalVersionEndif; + OS << OptionalExtensionEndif; + } + + OS << "\n// Disable any extensions we may have enabled previously.\n" + "#pragma OPENCL EXTENSION all : disable"; +} + void clang::EmitClangOpenCLBuiltins(RecordKeeper &Records, raw_ostream &OS) { BuiltinNameEmitter NameChecker(Records, OS); NameChecker.Emit(); } +void clang::EmitClangOpenCLBuiltinHeader(RecordKeeper &Records, + raw_ostream &OS) { + OpenCLBuiltinHeaderEmitter HeaderFileGenerator(Records, OS); + HeaderFileGenerator.emit(); +} + void clang::EmitClangOpenCLBuiltinTests(RecordKeeper &Records, raw_ostream &OS) { OpenCLBuiltinTestEmitter TestFileGenerator(Records, OS); diff --git a/clang/utils/TableGen/TableGen.cpp b/clang/utils/TableGen/TableGen.cpp --- a/clang/utils/TableGen/TableGen.cpp +++ b/clang/utils/TableGen/TableGen.cpp @@ -65,6 +65,7 @@ GenClangCommentCommandInfo, GenClangCommentCommandList, GenClangOpenCLBuiltins, + GenClangOpenCLBuiltinHeader, GenClangOpenCLBuiltinTests, GenArmNeon, GenArmFP16, @@ -200,6 +201,9 @@ "documentation comments"), clEnumValN(GenClangOpenCLBuiltins, "gen-clang-opencl-builtins", "Generate OpenCL builtin declaration handlers"), + clEnumValN(GenClangOpenCLBuiltinHeader, + "gen-clang-opencl-builtin-header", + "Generate OpenCL builtin header"), clEnumValN(GenClangOpenCLBuiltinTests, "gen-clang-opencl-builtin-tests", "Generate OpenCL builtin declaration tests"), clEnumValN(GenArmNeon, "gen-arm-neon", "Generate arm_neon.h for clang"), @@ -384,6 +388,9 @@ case GenClangOpenCLBuiltins: EmitClangOpenCLBuiltins(Records, OS); break; + case GenClangOpenCLBuiltinHeader: + EmitClangOpenCLBuiltinHeader(Records, OS); + break; case GenClangOpenCLBuiltinTests: EmitClangOpenCLBuiltinTests(Records, OS); break; diff --git a/clang/utils/TableGen/TableGenBackends.h b/clang/utils/TableGen/TableGenBackends.h --- a/clang/utils/TableGen/TableGenBackends.h +++ b/clang/utils/TableGen/TableGenBackends.h @@ -124,6 +124,8 @@ void EmitClangOpenCLBuiltins(llvm::RecordKeeper &Records, llvm::raw_ostream &OS); +void EmitClangOpenCLBuiltinHeader(llvm::RecordKeeper &Records, + llvm::raw_ostream &OS); void EmitClangOpenCLBuiltinTests(llvm::RecordKeeper &Records, llvm::raw_ostream &OS);