@@ -5179,6 +5179,24 @@ bool isValidLLVMModule(Module *M, SPIRVErrorLog &ErrorLog) {
51795179
51805180namespace {
51815181
5182+ VersionNumber getVersionFromTriple (const Triple &TT, SPIRVErrorLog &ErrorLog) {
5183+ switch (TT.getSubArch ()) {
5184+ case Triple::SPIRVSubArch_v10:
5185+ return VersionNumber::SPIRV_1_0;
5186+ case Triple::SPIRVSubArch_v11:
5187+ return VersionNumber::SPIRV_1_1;
5188+ case Triple::SPIRVSubArch_v12:
5189+ return VersionNumber::SPIRV_1_2;
5190+ case Triple::SPIRVSubArch_v13:
5191+ return VersionNumber::SPIRV_1_3;
5192+ case Triple::SPIRVSubArch_v14:
5193+ return VersionNumber::SPIRV_1_4;
5194+ default :
5195+ ErrorLog.checkError (false , SPIRVEC_InvalidSubArch, TT.getArchName ().str ());
5196+ return VersionNumber::MaximumVersion;
5197+ }
5198+ }
5199+
51825200bool runSpirvWriterPasses (Module *M, std::ostream *OS, std::string &ErrMsg,
51835201 const SPIRV::TranslatorOpts &Opts) {
51845202 // Perform the conversion and write the resulting SPIR-V if an ostream has
@@ -5189,6 +5207,20 @@ bool runSpirvWriterPasses(Module *M, std::ostream *OS, std::string &ErrMsg,
51895207 if (!isValidLLVMModule (M, BM->getErrorLog ()))
51905208 return false ;
51915209
5210+ // If the module carries a SPIR-V triple with a version subarch, target
5211+ // that SPIR-V version.
5212+ Triple TargetTriple (M->getTargetTriple ());
5213+ if ((TargetTriple.getArch () == Triple::spirv32 ||
5214+ TargetTriple.getArch () == Triple::spirv64) &&
5215+ TargetTriple.getSubArch () != Triple::NoSubArch) {
5216+ VersionNumber ModuleVer =
5217+ getVersionFromTriple (TargetTriple, BM->getErrorLog ());
5218+ if (!BM->getErrorLog ().checkError (ModuleVer <= Opts.getMaxVersion (),
5219+ SPIRVEC_TripleMaxVersionIncompatible))
5220+ return false ;
5221+ BM->setMinSPIRVVersion (static_cast <SPIRVWord>(ModuleVer));
5222+ }
5223+
51925224 ModulePassManager PassMgr;
51935225 addPassesForSPIRV (PassMgr, Opts);
51945226 if (WriteSpirv) {
0 commit comments