summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcheneym2 <acheney@nvidia.com>2025-03-11 14:12:33 -0400
committerGitHub <noreply@github.com>2025-03-11 11:12:33 -0700
commit5d6578b9d58d7ad46503d9124cccf8a68ecd5902 (patch)
tree4582cea2e4f47d63b39c2afc34c7497fc54c8bf5
parentf59e0ef409844f2514435a8df8ceeff3663e5db3 (diff)
Don't crash when precompiling twice (#6576)
Abort precompileForTarget if it's already done. Fixes #6516
-rw-r--r--source/slang/slang-compiler-tu.cpp12
-rw-r--r--tools/gfx-unit-test/precompiled-module-2.cpp9
2 files changed, 20 insertions, 1 deletions
diff --git a/source/slang/slang-compiler-tu.cpp b/source/slang/slang-compiler-tu.cpp
index 8bfe9a9ab..f82e50347 100644
--- a/source/slang/slang-compiler-tu.cpp
+++ b/source/slang/slang-compiler-tu.cpp
@@ -95,6 +95,18 @@ Module::precompileForTarget(SlangCompileTarget target, slang::IBlob** outDiagnos
{
CodeGenTarget targetEnum = CodeGenTarget(target);
+ // Don't precompile twice for the same target
+ for (auto globalInst : getIRModule()->getModuleInst()->getChildren())
+ {
+ if (auto inst = as<IREmbeddedDownstreamIR>(globalInst))
+ {
+ if (inst->getTarget() == targetEnum)
+ {
+ return SLANG_OK;
+ }
+ }
+ }
+
auto module = getIRModule();
auto linkage = getLinkage();
auto builder = IRBuilder(module);
diff --git a/tools/gfx-unit-test/precompiled-module-2.cpp b/tools/gfx-unit-test/precompiled-module-2.cpp
index 792f328b0..87420aa6e 100644
--- a/tools/gfx-unit-test/precompiled-module-2.cpp
+++ b/tools/gfx-unit-test/precompiled-module-2.cpp
@@ -59,8 +59,15 @@ static Slang::Result precompileProgram(
(void**)precompileService.writeRef()) == SLANG_OK)
{
Slang::ComPtr<slang::IBlob> diagnosticsBlob;
- precompileService->precompileForTarget(target, diagnosticsBlob.writeRef());
+ auto res = precompileService->precompileForTarget(target, diagnosticsBlob.writeRef());
diagnoseIfNeeded(diagnosticsBlob);
+ SLANG_RETURN_ON_FAIL(res);
+
+ // compile a second time to check for driver bugs.
+ diagnosticsBlob = nullptr;
+ res = precompileService->precompileForTarget(target, diagnosticsBlob.writeRef());
+ diagnoseIfNeeded(diagnosticsBlob);
+ SLANG_RETURN_ON_FAIL(res);
}
}