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