diff options
Diffstat (limited to 'mlir/lib/Target/SPIRV')
| -rw-r--r-- | mlir/lib/Target/SPIRV/Serialization/Serializer.cpp | 20 | ||||
| -rw-r--r-- | mlir/lib/Target/SPIRV/Serialization/Serializer.h | 2 | ||||
| -rw-r--r-- | mlir/lib/Target/SPIRV/TranslateRegistration.cpp | 2 |
3 files changed, 19 insertions, 5 deletions
diff --git a/mlir/lib/Target/SPIRV/Serialization/Serializer.cpp b/mlir/lib/Target/SPIRV/Serialization/Serializer.cpp index 7c007de31558..7fc779587f4f 100644 --- a/mlir/lib/Target/SPIRV/Serialization/Serializer.cpp +++ b/mlir/lib/Target/SPIRV/Serialization/Serializer.cpp @@ -16,6 +16,7 @@ #include "mlir/Dialect/SPIRV/IR/SPIRVDialect.h" #include "mlir/Dialect/SPIRV/IR/SPIRVEnums.h" #include "mlir/Dialect/SPIRV/IR/SPIRVTypes.h" +#include "mlir/Dialect/SPIRV/IR/TargetAndABI.h" #include "mlir/Target/SPIRV/SPIRVBinaryUtils.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/Sequence.h" @@ -112,7 +113,9 @@ LogicalResult Serializer::serialize() { // TODO: handle the other sections processCapability(); - processExtension(); + if (failed(processExtension())) { + return failure(); + } processMemoryModel(); processDebugInfo(); @@ -204,13 +207,24 @@ void Serializer::processDebugInfo() { // TODO: Encode more debug instructions. } -void Serializer::processExtension() { +LogicalResult Serializer::processExtension() { llvm::SmallVector<uint32_t, 16> extName; - for (spirv::Extension ext : module.getVceTriple()->getExtensions()) { + llvm::SmallSet<Extension, 4> deducedExts( + llvm::from_range, module.getVceTriple()->getExtensions()); + auto nonSemanticInfoExt = spirv::Extension::SPV_KHR_non_semantic_info; + if (options.emitDebugInfo && !deducedExts.contains(nonSemanticInfoExt)) { + TargetEnvAttr targetEnvAttr = lookupTargetEnvOrDefault(module); + if (!is_contained(targetEnvAttr.getExtensions(), nonSemanticInfoExt)) + return module.emitError( + "SPV_KHR_non_semantic_info extension not available"); + deducedExts.insert(nonSemanticInfoExt); + } + for (spirv::Extension ext : deducedExts) { extName.clear(); spirv::encodeStringLiteralInto(extName, spirv::stringifyExtension(ext)); encodeInstructionInto(extensions, spirv::Opcode::OpExtension, extName); } + return success(); } void Serializer::processMemoryModel() { diff --git a/mlir/lib/Target/SPIRV/Serialization/Serializer.h b/mlir/lib/Target/SPIRV/Serialization/Serializer.h index 7047869bca4c..fb2cecdff8e4 100644 --- a/mlir/lib/Target/SPIRV/Serialization/Serializer.h +++ b/mlir/lib/Target/SPIRV/Serialization/Serializer.h @@ -102,7 +102,7 @@ private: void processDebugInfo(); - void processExtension(); + LogicalResult processExtension(); void processMemoryModel(); diff --git a/mlir/lib/Target/SPIRV/TranslateRegistration.cpp b/mlir/lib/Target/SPIRV/TranslateRegistration.cpp index 4391ee714c51..796354e154c0 100644 --- a/mlir/lib/Target/SPIRV/TranslateRegistration.cpp +++ b/mlir/lib/Target/SPIRV/TranslateRegistration.cpp @@ -106,7 +106,7 @@ serializeModule(spirv::ModuleOp moduleOp, raw_ostream &output, int fd = 0; std::error_code errorCode = llvm::sys::fs::createUniqueFile( - options.validationFilePrefix + "%%%%%%", fd, filename); + options.validationFilePrefix + "%%%%%%.spv", fd, filename); if (errorCode) return moduleOp.emitError("error creating validation output file: ") << errorCode.message() << "\n"; |
