summaryrefslogtreecommitdiffstats
path: root/source/slang
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang')
-rw-r--r--source/slang/slang-ir.cpp77
-rw-r--r--source/slang/slang.cpp18
2 files changed, 95 insertions, 0 deletions
diff --git a/source/slang/slang-ir.cpp b/source/slang/slang-ir.cpp
index 72313217b..92e51fe3b 100644
--- a/source/slang/slang-ir.cpp
+++ b/source/slang/slang-ir.cpp
@@ -7117,6 +7117,76 @@ void dumpIRGeneric(IRDumpContext* context, IRGeneric* witnessTable)
dump(context, "}\n");
}
+static void dumpEmbeddedDownstream(IRDumpContext* context, IRInst* inst)
+{
+ auto targetInst = inst->getOperand(0);
+ auto blobInst = inst->getOperand(1);
+
+ // Get the target value
+ auto targetLit = as<IRIntLit>(targetInst);
+ if (!targetLit)
+ {
+ dump(context, "EmbeddedDownstreamIR(invalid target)");
+ return;
+ }
+
+ // Get the blob
+ auto blobLitInst = as<IRBlobLit>(blobInst);
+ if (!blobLitInst)
+ {
+ dump(context, "EmbeddedDownstreamIR(invalid blob)");
+ return;
+ }
+
+ dump(context, "EmbeddedDownstreamIR(");
+ dump(context, targetLit->getValue());
+ dump(context, " : Int, ");
+
+ // If target is SPIR-V (6), disassemble the blob
+ if (targetLit->getValue() == (IRIntegerValue)CodeGenTarget::SPIRV)
+ {
+ auto blob = blobLitInst->getStringSlice();
+ const uint32_t* spirvCode = (const uint32_t*)blob.begin();
+ const size_t spirvWordCount = blob.getLength() / sizeof(uint32_t);
+
+ // Get the compiler from the session through the module
+ auto module = inst->getModule();
+ auto session = module->getSession();
+ IDownstreamCompiler* compiler =
+ session->getOrLoadDownstreamCompiler(PassThroughMode::SpirvDis, nullptr);
+
+ if (compiler)
+ {
+ // Use glslang interface to disassemble with string output
+ String disassemblyOutput;
+ if (SLANG_SUCCEEDED(compiler->disassembleWithResult(
+ spirvCode,
+ int(spirvWordCount),
+ disassemblyOutput)))
+ {
+ // Dump the captured disassembly
+ dump(context, "\n");
+ dumpIndent(context);
+ dump(context, disassemblyOutput);
+ }
+ else
+ {
+ dump(context, "<disassembly failed>");
+ }
+ }
+ else
+ {
+ dump(context, "<unavailable disassembler>");
+ }
+ }
+ else
+ {
+ // TODO: Add DXIL disassembly call here.
+ dump(context, "<binary blob>");
+ }
+ dump(context, ")");
+}
+
static void dumpInstExpr(IRDumpContext* context, IRInst* inst)
{
if (!inst)
@@ -7166,6 +7236,13 @@ static void dumpInstExpr(IRDumpContext* context, IRInst* inst)
}
}
+ // Special case EmbeddedDownstreamIR to show SPIR-V disassembly
+ if (op == kIROp_EmbeddedDownstreamIR)
+ {
+ dumpEmbeddedDownstream(context, inst);
+ return;
+ }
+
// Special case the SPIR-V asm operands as the distinction here is
// clear anyway to the user
switch (op)
diff --git a/source/slang/slang.cpp b/source/slang/slang.cpp
index e17d7ba9c..a23342458 100644
--- a/source/slang/slang.cpp
+++ b/source/slang/slang.cpp
@@ -3747,6 +3747,24 @@ SlangResult EndToEndCompileRequest::executeActionsInner()
{
SLANG_RETURN_ON_FAIL(
translationUnit->getModule()->precompileForTarget(targetEnum, nullptr));
+
+ if (frontEndReq->optionSet.shouldDumpIR())
+ {
+ DiagnosticSinkWriter writer(frontEndReq->getSink());
+
+ dumpIR(
+ translationUnit->getModule()->getIRModule(),
+ frontEndReq->m_irDumpOptions,
+ "PRECOMPILE_FOR_TARGET_COMPLETE_ALL",
+ frontEndReq->getSourceManager(),
+ &writer);
+
+ dumpIR(
+ translationUnit->getModule()->getIRModule()->getModuleInst(),
+ frontEndReq->m_irDumpOptions,
+ frontEndReq->getSourceManager(),
+ &writer);
+ }
}
}
}