diff options
| author | Ellie Hermaszewska <ellieh@nvidia.com> | 2023-08-08 06:01:02 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-08-07 15:01:02 -0700 |
| commit | 10b2038a8e71eb4a0e41cff38bc71e36dc0003aa (patch) | |
| tree | 54820b38e8c124ad581651c697a6264a81c2b7d0 /source/slang/slang-emit-spirv.cpp | |
| parent | 9eb6a84285c1597d723be13924a7ad2991cf717f (diff) | |
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 <yonghe@outlook.com>
Diffstat (limited to 'source/slang/slang-emit-spirv.cpp')
| -rw-r--r-- | source/slang/slang-emit-spirv.cpp | 24 |
1 files changed, 16 insertions, 8 deletions
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] // // > <id>: 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<IRPtrTypeBase>(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<IRPtrTypeBase>(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) { } |
