@@ -781,26 +781,39 @@ decodeOCLVer(unsigned Ver) {
781781}
782782
783783unsigned getOCLVersion (Module *M, bool AllowMulti) {
784- NamedMDNode *NamedMD = M->getNamedMetadata (kSPIR2MD ::OCLVer);
785- if (!NamedMD)
784+ NamedMDNode *NamedMDOCLVer = M->getNamedMetadata (kSPIR2MD ::OCLVer);
785+ NamedMDNode *NamedMDOCLCXXVer = M->getNamedMetadata (kSPIR2MD ::OCLCXXVer);
786+ if (!NamedMDOCLVer && !NamedMDOCLCXXVer)
786787 return 0 ;
787- assert (NamedMD->getNumOperands () > 0 && " Invalid SPIR" );
788- if (!AllowMulti && NamedMD->getNumOperands () != 1 )
789- report_fatal_error (
790- llvm::Twine (" Multiple OCL version metadata not allowed" ));
791788
792789 // If the module was linked with another module, there may be multiple
793790 // operands.
794- auto GetVer = [= ](unsigned I) {
791+ auto GetVerPair = [](unsigned I, NamedMDNode *NamedMD ) {
795792 auto *MD = NamedMD->getOperand (I);
796793 return std::make_pair (getMDOperandAsInt (MD, 0 ), getMDOperandAsInt (MD, 1 ));
797794 };
798- auto Ver = GetVer (0 );
799- for (unsigned I = 1 , E = NamedMD->getNumOperands (); I != E; ++I)
800- if (Ver != GetVer (I))
801- report_fatal_error (llvm::Twine (" OCL version mismatch" ));
802-
803- return encodeOCLVer (Ver.first , Ver.second , 0 );
795+ auto GetVer = [=](NamedMDNode *NamedMD) {
796+ assert (NamedMD->getNumOperands () && " Invalid SPIR" );
797+ if (!AllowMulti && NamedMD->getNumOperands () != 1 )
798+ report_fatal_error (
799+ llvm::Twine (" Multiple OCL version metadata not allowed" ));
800+ auto Ver = GetVerPair (0 , NamedMD);
801+ for (unsigned I = 1 , E = NamedMD->getNumOperands (); I != E; ++I)
802+ if (Ver != GetVerPair (I, NamedMD))
803+ report_fatal_error (llvm::Twine (" OCL version mismatch" ));
804+ return encodeOCLVer (Ver.first , Ver.second , 0 );
805+ };
806+ unsigned OCLVer = NamedMDOCLVer ? GetVer (NamedMDOCLVer) : 0 ;
807+ unsigned OCLCXXVer = NamedMDOCLCXXVer ? GetVer (NamedMDOCLCXXVer) : 0 ;
808+ // Check if OCLCXXVer is compatible with OCLVer
809+ if (OCLVer && OCLCXXVer) {
810+ if ((OCLVer == kOCLVer ::CL20 && OCLCXXVer == kOCLVer ::CLCXX10) ||
811+ (OCLVer == kOCLVer ::CL30 && OCLCXXVer == kOCLVer ::CLCXX2021))
812+ return OCLCXXVer;
813+ report_fatal_error (llvm::Twine (
814+ " opencl cxx version is not compatible with opencl c version!" ));
815+ }
816+ return OCLVer;
804817}
805818
806819SmallVector<unsigned , 3 > decodeMDNode (MDNode *N) {
0 commit comments