@@ -3093,6 +3093,14 @@ class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler {
30933093 using SyclKernelFieldHandler::leaveStruct;
30943094};
30953095
3096+ class SyclKernelIntFooterCreator : public SyclKernelFieldHandler {
3097+ SYCLIntegrationFooter &Footer;
3098+
3099+ public:
3100+ SyclKernelIntFooterCreator (Sema &S, SYCLIntegrationFooter &F)
3101+ : SyclKernelFieldHandler(S), Footer(F) {}
3102+ };
3103+
30963104} // namespace
30973105
30983106class SYCLKernelNameTypeVisitor
@@ -3418,9 +3426,13 @@ void Sema::ConstructOpenCLKernel(FunctionDecl *KernelCallerFunc,
34183426 calculateKernelNameType (Context, KernelCallerFunc), KernelName,
34193427 StableName, KernelCallerFunc);
34203428
3429+ SyclKernelIntFooterCreator int_footer (*this , getSyclIntegrationFooter ());
3430+
34213431 KernelObjVisitor Visitor{*this };
3422- Visitor.VisitRecordBases (KernelObj, kernel_decl, kernel_body, int_header);
3423- Visitor.VisitRecordFields (KernelObj, kernel_decl, kernel_body, int_header);
3432+ Visitor.VisitRecordBases (KernelObj, kernel_decl, kernel_body, int_header,
3433+ int_footer);
3434+ Visitor.VisitRecordFields (KernelObj, kernel_decl, kernel_body, int_header,
3435+ int_footer);
34243436
34253437 if (ParmVarDecl *KernelHandlerArg =
34263438 getSyclKernelHandlerArg (KernelCallerFunc)) {
@@ -4157,7 +4169,7 @@ void SYCLIntegrationHeader::emit(raw_ostream &O) {
41574169 O << " \n " ;
41584170}
41594171
4160- bool SYCLIntegrationHeader::emit (const StringRef & IntHeaderName) {
4172+ bool SYCLIntegrationHeader::emit (StringRef IntHeaderName) {
41614173 if (IntHeaderName.empty ())
41624174 return false ;
41634175 int IntHeaderFD = 0 ;
@@ -4229,11 +4241,31 @@ void SYCLIntegrationHeader::setCallsThisGroup(bool B) {
42294241 K->FreeFunctionCalls .CallsThisGroup = B;
42304242}
42314243
4232- SYCLIntegrationHeader::SYCLIntegrationHeader (DiagnosticsEngine &_Diag,
4233- bool _UnnamedLambdaSupport,
4244+ SYCLIntegrationHeader::SYCLIntegrationHeader (bool _UnnamedLambdaSupport,
42344245 Sema &_S)
42354246 : UnnamedLambdaSupport(_UnnamedLambdaSupport), S(_S) {}
42364247
4248+ // Post-compile integration header support.
4249+ bool SYCLIntegrationFooter::emit (StringRef IntHeaderName) {
4250+ if (IntHeaderName.empty ())
4251+ return false ;
4252+ int IntHeaderFD = 0 ;
4253+ std::error_code EC =
4254+ llvm::sys::fs::openFileForWrite (IntHeaderName, IntHeaderFD);
4255+ if (EC) {
4256+ llvm::errs () << " Error: " << EC.message () << " \n " ;
4257+ // compilation will fail on absent include file - don't need to fail here
4258+ return false ;
4259+ }
4260+ llvm::raw_fd_ostream Out (IntHeaderFD, true /* close in destructor*/ );
4261+ return emit (Out);
4262+ }
4263+
4264+ bool SYCLIntegrationFooter::emit (raw_ostream &O) {
4265+ O << " // Integration Footer contents to go here.\n " ;
4266+ return true ;
4267+ }
4268+
42374269// -----------------------------------------------------------------------------
42384270// Utility class methods
42394271// -----------------------------------------------------------------------------
0 commit comments