@@ -789,26 +789,39 @@ decodeOCLVer(unsigned Ver) {
789789}
790790
791791unsigned getOCLVersion (Module *M, bool AllowMulti) {
792- NamedMDNode *NamedMD = M->getNamedMetadata (kSPIR2MD ::OCLVer);
793- if (!NamedMD)
792+ NamedMDNode *NamedMDOCLVer = M->getNamedMetadata (kSPIR2MD ::OCLVer);
793+ NamedMDNode *NamedMDOCLCXXVer = M->getNamedMetadata (kSPIR2MD ::OCLCXXVer);
794+ if (!NamedMDOCLVer && !NamedMDOCLCXXVer)
794795 return 0 ;
795- assert (NamedMD->getNumOperands () > 0 && " Invalid SPIR" );
796- if (!AllowMulti && NamedMD->getNumOperands () != 1 )
797- report_fatal_error (
798- llvm::Twine (" Multiple OCL version metadata not allowed" ));
799796
800797 // If the module was linked with another module, there may be multiple
801798 // operands.
802- auto GetVer = [= ](unsigned I) {
799+ auto GetVerPair = [](unsigned I, NamedMDNode *NamedMD ) {
803800 auto *MD = NamedMD->getOperand (I);
804801 return std::make_pair (getMDOperandAsInt (MD, 0 ), getMDOperandAsInt (MD, 1 ));
805802 };
806- auto Ver = GetVer (0 );
807- for (unsigned I = 1 , E = NamedMD->getNumOperands (); I != E; ++I)
808- if (Ver != GetVer (I))
809- report_fatal_error (llvm::Twine (" OCL version mismatch" ));
810-
811- return encodeOCLVer (Ver.first , Ver.second , 0 );
803+ auto GetVer = [=](NamedMDNode *NamedMD) {
804+ assert (NamedMD->getNumOperands () && " Invalid SPIR" );
805+ if (!AllowMulti && NamedMD->getNumOperands () != 1 )
806+ report_fatal_error (
807+ llvm::Twine (" Multiple OCL version metadata not allowed" ));
808+ auto Ver = GetVerPair (0 , NamedMD);
809+ for (unsigned I = 1 , E = NamedMD->getNumOperands (); I != E; ++I)
810+ if (Ver != GetVerPair (I, NamedMD))
811+ report_fatal_error (llvm::Twine (" OCL version mismatch" ));
812+ return encodeOCLVer (Ver.first , Ver.second , 0 );
813+ };
814+ unsigned OCLVer = NamedMDOCLVer ? GetVer (NamedMDOCLVer) : 0 ;
815+ unsigned OCLCXXVer = NamedMDOCLCXXVer ? GetVer (NamedMDOCLCXXVer) : 0 ;
816+ // Check if OCLCXXVer is compatible with OCLVer
817+ if (OCLVer && OCLCXXVer) {
818+ if ((OCLVer == kOCLVer ::CL20 && OCLCXXVer == kOCLVer ::CLCXX10) ||
819+ (OCLVer == kOCLVer ::CL30 && OCLCXXVer == kOCLVer ::CLCXX2021))
820+ return OCLCXXVer;
821+ report_fatal_error (llvm::Twine (
822+ " opencl cxx version is not compatible with opencl c version!" ));
823+ }
824+ return OCLVer;
812825}
813826
814827SmallVector<unsigned , 3 > decodeMDNode (MDNode *N) {
0 commit comments