summaryrefslogtreecommitdiffstats
path: root/source/slang
diff options
context:
space:
mode:
authorJay Kwak <82421531+jkwak-work@users.noreply.github.com>2025-01-07 01:35:47 -0800
committerGitHub <noreply@github.com>2025-01-07 01:35:47 -0800
commit5621ace93b7665051f7e7c8a2fa68ceaf285ff8d (patch)
tree0aec6cedaeb888da9bd1cff617359a2775c63921 /source/slang
parenta448b7ecd880c4cbe1c0504af3df4ec708f42d48 (diff)
Use disassemble API from SPIRV-Tools (#6001)
* Use disassemble API from SPIRV-Tools This commit uses C API version of SPIRV disassemble function rather than calling spirv-dis.exe. This allows us to use a correct version of SPIRV disassble function that Slangc.exe is using. The implementation is mostly copied from external/spirv-tools/tools/dis/dis.cpp, which is a source file for building spirv-dis.exe. This commit also includes a fix for a bug in RPC communication to `test-server`. When an RPC connection to `test-server.exe` is reused and the second test abruptly fails due to a compile error or SPIRV validation error, the output from the first test run was incorrectly reused as the output for the second test. This commit resets the RPC result before waiting for the response so that even when the RPC connection is erratically disconnected, the result from the previous run will not be reused incorrectly. Some of the tests appear to be relying on this type of behavior. By using an option, `-skip-spirv-validation`, the RPC connection will continue without an interruption.
Diffstat (limited to 'source/slang')
-rw-r--r--source/slang/slang-diagnostic-defs.h6
-rw-r--r--source/slang/slang-emit-spirv.cpp1
-rw-r--r--source/slang/slang-emit.cpp20
-rw-r--r--source/slang/slang-spirv-val.cpp41
-rw-r--r--source/slang/slang-spirv-val.h10
5 files changed, 8 insertions, 70 deletions
diff --git a/source/slang/slang-diagnostic-defs.h b/source/slang/slang-diagnostic-defs.h
index 9d08d5b73..821a895bc 100644
--- a/source/slang/slang-diagnostic-defs.h
+++ b/source/slang/slang-diagnostic-defs.h
@@ -2562,11 +2562,7 @@ DIAGNOSTIC(
Internal,
serialDebugVerificationFailed,
"Verification of serial debug information failed.")
-DIAGNOSTIC(
- 99999,
- Internal,
- spirvValidationFailed,
- "Validation of generated SPIR-V failed. SPIRV generated: \n$0")
+DIAGNOSTIC(99999, Internal, spirvValidationFailed, "Validation of generated SPIR-V failed.")
DIAGNOSTIC(
99999,
diff --git a/source/slang/slang-emit-spirv.cpp b/source/slang/slang-emit-spirv.cpp
index 676a16228..d8c479cd1 100644
--- a/source/slang/slang-emit-spirv.cpp
+++ b/source/slang/slang-emit-spirv.cpp
@@ -12,7 +12,6 @@
#include "slang-ir-util.h"
#include "slang-ir.h"
#include "slang-lookup-spirv.h"
-#include "slang-spirv-val.h"
#include "spirv/unified1/spirv.h"
#include <type_traits>
diff --git a/source/slang/slang-emit.cpp b/source/slang/slang-emit.cpp
index f9118bb45..7ea2fef88 100644
--- a/source/slang/slang-emit.cpp
+++ b/source/slang/slang-emit.cpp
@@ -104,7 +104,6 @@
#include "slang-legalize-types.h"
#include "slang-lower-to-ir.h"
#include "slang-mangle.h"
-#include "slang-spirv-val.h"
#include "slang-syntax.h"
#include "slang-type-layout.h"
#include "slang-visitor.h"
@@ -1942,18 +1941,16 @@ SlangResult emitSPIRVForEntryPointsDirectly(
ArtifactUtil::createArtifactForCompileTarget(asExternal(codeGenContext->getTargetFormat()));
artifact->addRepresentationUnknown(ListBlob::moveCreate(spirv));
-#if 0
- // Dump the unoptimized SPIRV after lowering from slang IR -> SPIRV
- String err; String dis;
- disassembleSPIRV(spirv, err, dis);
- printf("%s", dis.begin());
-#endif
-
IDownstreamCompiler* compiler = codeGenContext->getSession()->getOrLoadDownstreamCompiler(
PassThroughMode::SpirvOpt,
codeGenContext->getSink());
if (compiler)
{
+#if 0
+ // Dump the unoptimized SPIRV after lowering from slang IR -> SPIRV
+ compiler->disassemble((uint32_t*)spirv.getBuffer(), int(spirv.getCount() / 4));
+#endif
+
if (!codeGenContext->shouldSkipSPIRVValidation())
{
StringBuilder runSpirvValEnvVar;
@@ -1966,13 +1963,10 @@ SlangResult emitSPIRVForEntryPointsDirectly(
(uint32_t*)spirv.getBuffer(),
int(spirv.getCount() / 4))))
{
- String err;
- String dis;
- disassembleSPIRV(spirv, err, dis);
+ compiler->disassemble((uint32_t*)spirv.getBuffer(), int(spirv.getCount() / 4));
codeGenContext->getSink()->diagnoseWithoutSourceView(
SourceLoc{},
- Diagnostics::spirvValidationFailed,
- dis);
+ Diagnostics::spirvValidationFailed);
}
}
}
diff --git a/source/slang/slang-spirv-val.cpp b/source/slang/slang-spirv-val.cpp
deleted file mode 100644
index e2b4da46c..000000000
--- a/source/slang/slang-spirv-val.cpp
+++ /dev/null
@@ -1,41 +0,0 @@
-#include "slang-spirv-val.h"
-
-namespace Slang
-{
-
-SlangResult disassembleSPIRV(const List<uint8_t>& spirv, String& outErr, String& outDis)
-{
- // Set up our process
- CommandLine commandLine;
- commandLine.m_executableLocation.setName("spirv-dis");
- commandLine.addArg("--comment");
- commandLine.addArg("--color");
- RefPtr<Process> p;
-
- // If we failed to even start the process, then validation isn't available
- SLANG_RETURN_ON_FAIL(Process::create(commandLine, 0, p));
- const auto in = p->getStream(StdStreamType::In);
- const auto out = p->getStream(StdStreamType::Out);
- const auto err = p->getStream(StdStreamType::ErrorOut);
-
- List<Byte> outData;
- List<Byte> outErrData;
- SLANG_RETURN_ON_FAIL(
- StreamUtil::readAndWrite(in, spirv.getArrayView(), out, outData, err, outErrData));
-
- SLANG_RETURN_ON_FAIL(p->waitForTermination(10));
-
- outDis = String(
- reinterpret_cast<const char*>(outData.begin()),
- reinterpret_cast<const char*>(outData.end()));
-
- outErr = String(
- reinterpret_cast<const char*>(outErrData.begin()),
- reinterpret_cast<const char*>(outErrData.end()));
-
- const auto ret = p->getReturnValue();
- return ret == 0 ? SLANG_OK : SLANG_FAIL;
-}
-
-
-} // namespace Slang
diff --git a/source/slang/slang-spirv-val.h b/source/slang/slang-spirv-val.h
deleted file mode 100644
index 01e111f91..000000000
--- a/source/slang/slang-spirv-val.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#pragma once
-
-#include "slang-compiler.h"
-
-#include <cstdint>
-
-namespace Slang
-{
-SlangResult disassembleSPIRV(const List<uint8_t>& spirv, String& outErr, String& outDis);
-}