@@ -5179,6 +5179,24 @@ bool isValidLLVMModule(Module *M, SPIRVErrorLog &ErrorLog) {
5179
5179
5180
5180
namespace {
5181
5181
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
+
5182
5200
bool runSpirvWriterPasses (Module *M, std::ostream *OS, std::string &ErrMsg,
5183
5201
const SPIRV::TranslatorOpts &Opts) {
5184
5202
// 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,
5189
5207
if (!isValidLLVMModule (M, BM->getErrorLog ()))
5190
5208
return false ;
5191
5209
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
+
5192
5224
ModulePassManager PassMgr;
5193
5225
addPassesForSPIRV (PassMgr, Opts);
5194
5226
if (WriteSpirv) {
0 commit comments