diff options
Diffstat (limited to 'source/slang')
| -rw-r--r-- | source/slang/slang-ir.cpp | 77 | ||||
| -rw-r--r-- | source/slang/slang.cpp | 18 |
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); + } } } } |
