From 10b2038a8e71eb4a0e41cff38bc71e36dc0003aa Mon Sep 17 00:00:00 2001 From: Ellie Hermaszewska Date: Tue, 8 Aug 2023 06:01:02 +0800 Subject: Diagnostic improvements for direct spirv (#3053) * Fail on an unhandled spv operand * Diagnose on emitting a function with no definition or intrinsic * clearer error message * Add assert * Add assert * remove unused assert * Disagnostic on snippet parsing failure * Mention unimplemented instruction in error message * mention unhandled local instruction for spirv in error message * Allow specifying dump options in dumpIRToString --------- Co-authored-by: Yong He --- source/slang/slang-emit-spirv.cpp | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) (limited to 'source/slang/slang-emit-spirv.cpp') diff --git a/source/slang/slang-emit-spirv.cpp b/source/slang/slang-emit-spirv.cpp index f7d8a4ec6..30d1b4ecb 100644 --- a/source/slang/slang-emit-spirv.cpp +++ b/source/slang/slang-emit-spirv.cpp @@ -3,6 +3,7 @@ #include "slang-compiler.h" #include "slang-emit-base.h" +#include "slang-ir-util.h" #include "slang-ir.h" #include "slang-ir-insts.h" #include "slang-ir-layout.h" @@ -287,8 +288,6 @@ struct SPIRVEmitContext /// The Slang IR module being translated IRModule* m_irModule; - DiagnosticSink* m_sink; - // [2.2: Terms] // // > : A numerical name; the name used to refer to an object, a type, @@ -1066,6 +1065,7 @@ struct SPIRVEmitContext { SpvStorageClass storageClass = SpvStorageClassFunction; auto ptrType = as(inst); + SLANG_ASSERT(ptrType); if (ptrType->hasAddressSpace()) storageClass = (SpvStorageClass)ptrType->getAddressSpace(); if (storageClass == SpvStorageClassStorageBuffer) @@ -1206,8 +1206,9 @@ struct SPIRVEmitContext // ... default: - SLANG_UNIMPLEMENTED_X("unhandled instruction opcode for global instruction"); - UNREACHABLE_RETURN(nullptr); + String e = "Unhandled global inst in spirv-emit: " + + dumpIRToString(inst, {IRDumpOptions::Mode::Detailed, 0}); + SLANG_UNIMPLEMENTED_X(e.begin()); } } @@ -1342,6 +1343,7 @@ struct SPIRVEmitContext SpvInst* emitGlobalVar(IRGlobalVar* globalVar) { auto layout = getVarLayout(globalVar); + SLANG_ASSERT(layout); auto storageClass = SpvStorageClassUniform; if (auto ptrType = as(globalVar->getDataType())) { @@ -1398,6 +1400,9 @@ struct SPIRVEmitContext /// Emit a SPIR-V function definition for the Slang IR function `irFunc`. SpvInst* emitFuncDefinition(IRFunc* irFunc) { + if(!irFunc->getFirstBlock()) + m_sink->diagnose(irFunc, Diagnostics::noBlocksOrIntrinsic, "spirv"); + // [2.4: Logical Layout of a Module] // // > All function definitions (functions with a body). @@ -1588,8 +1593,11 @@ struct SPIRVEmitContext switch( inst->getOp() ) { default: - SLANG_UNIMPLEMENTED_X("unhandled instruction opcode for local instruction"); - break; + { + String e = "Unhandled local inst in spirv-emit: " + + dumpIRToString(inst, {IRDumpOptions::Mode::Detailed, 0}); + SLANG_UNIMPLEMENTED_X(e.getBuffer()); + } case kIROp_Specialize: return nullptr; case kIROp_Var: @@ -2228,6 +2236,7 @@ struct SPIRVEmitContext IRTargetIntrinsicDecoration* intrinsic) { SpvSnippet* snippet = getParsedSpvSnippet(intrinsic); + SLANG_ASSERT(snippet); SpvSnippetEmitContext context; context.irResultType = inst->getDataType(); context.resultType = ensureInst(inst->getFullType()); @@ -2894,9 +2903,8 @@ struct SPIRVEmitContext } SPIRVEmitContext(IRModule* module, TargetRequest* target, DiagnosticSink* sink) - : SPIRVEmitSharedContext(module, target) + : SPIRVEmitSharedContext(module, target, sink) , m_irModule(module) - , m_sink(sink) , m_memoryArena(2048) { } -- cgit v1.2.3