summaryrefslogtreecommitdiff
path: root/source/slang/slang-emit-spirv.cpp
diff options
context:
space:
mode:
authorEllie Hermaszewska <ellieh@nvidia.com>2023-08-08 06:01:02 +0800
committerGitHub <noreply@github.com>2023-08-07 15:01:02 -0700
commit10b2038a8e71eb4a0e41cff38bc71e36dc0003aa (patch)
tree54820b38e8c124ad581651c697a6264a81c2b7d0 /source/slang/slang-emit-spirv.cpp
parent9eb6a84285c1597d723be13924a7ad2991cf717f (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.cpp24
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)
{
}