Skip to content

Commit 7bc82e5

Browse files
committed
[mlir][spirv] Conditionally add SPV_KHR_non_semantic_info extension upon serialization
If serialization option `emitDebugInfo` is enabled, then it is required to serialize `SPV_KHR_non_semantic_info` extension provided that it is available in the target environment. Signed-off-by: Mohammadreza Ameri Mahabadian <[email protected]>
1 parent 3fa34f1 commit 7bc82e5

File tree

3 files changed

+19
-5
lines changed

3 files changed

+19
-5
lines changed

mlir/lib/Target/SPIRV/Serialization/Serializer.cpp

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "mlir/Dialect/SPIRV/IR/SPIRVDialect.h"
1717
#include "mlir/Dialect/SPIRV/IR/SPIRVEnums.h"
1818
#include "mlir/Dialect/SPIRV/IR/SPIRVTypes.h"
19+
#include "mlir/Dialect/SPIRV/IR/TargetAndABI.h"
1920
#include "mlir/Target/SPIRV/SPIRVBinaryUtils.h"
2021
#include "llvm/ADT/STLExtras.h"
2122
#include "llvm/ADT/Sequence.h"
@@ -112,7 +113,9 @@ LogicalResult Serializer::serialize() {
112113

113114
// TODO: handle the other sections
114115
processCapability();
115-
processExtension();
116+
if (failed(processExtension())) {
117+
return failure();
118+
}
116119
processMemoryModel();
117120
processDebugInfo();
118121

@@ -204,13 +207,24 @@ void Serializer::processDebugInfo() {
204207
// TODO: Encode more debug instructions.
205208
}
206209

207-
void Serializer::processExtension() {
210+
LogicalResult Serializer::processExtension() {
208211
llvm::SmallVector<uint32_t, 16> extName;
209-
for (spirv::Extension ext : module.getVceTriple()->getExtensions()) {
212+
llvm::SmallSet<Extension, 4> deducedExts;
213+
deducedExts.insert_range(module.getVceTriple()->getExtensions());
214+
auto nonSemanticInfoExt = spirv::Extension::SPV_KHR_non_semantic_info;
215+
if (options.emitDebugInfo && !deducedExts.contains(nonSemanticInfoExt)) {
216+
TargetEnvAttr targetEnvAttr = lookupTargetEnvOrDefault(module);
217+
if (!is_contained(targetEnvAttr.getExtensions(), nonSemanticInfoExt))
218+
return module.emitError(
219+
"SPV_KHR_non_semantic_info extension not available");
220+
deducedExts.insert(nonSemanticInfoExt);
221+
}
222+
for (spirv::Extension ext : deducedExts) {
210223
extName.clear();
211224
spirv::encodeStringLiteralInto(extName, spirv::stringifyExtension(ext));
212225
encodeInstructionInto(extensions, spirv::Opcode::OpExtension, extName);
213226
}
227+
return success();
214228
}
215229

216230
void Serializer::processMemoryModel() {

mlir/lib/Target/SPIRV/Serialization/Serializer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ class Serializer {
102102

103103
void processDebugInfo();
104104

105-
void processExtension();
105+
LogicalResult processExtension();
106106

107107
void processMemoryModel();
108108

mlir/test/Target/SPIRV/debug.mlir

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// RUN: mlir-translate -no-implicit-module -test-spirv-roundtrip-debug -mlir-print-debuginfo -mlir-print-local-scope %s | FileCheck %s
22

3-
spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], []> {
3+
spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], [SPV_KHR_non_semantic_info]> attributes {spirv.target_env = #spirv.target_env<#spirv.vce<v1.0, [Shader], [SPV_KHR_non_semantic_info]>, #spirv.resource_limits<>>} {
44
// CHECK: loc({{".*debug.mlir"}}:5:3)
55
spirv.GlobalVariable @var0 bind(0, 1) : !spirv.ptr<f32, Input>
66
spirv.func @arithmetic(%arg0 : vector<4xf32>, %arg1 : vector<4xf32>) "None" {

0 commit comments

Comments
 (0)