summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-target-program.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2025-09-10 11:50:30 -0700
committerGitHub <noreply@github.com>2025-09-10 18:50:30 +0000
commitc5607e9d68e9082ada9441f1949937f6b16d5c7f (patch)
treed7d947af4a8d29cb8d3631d9703f9ccfe8d26735 /source/slang/slang-target-program.cpp
parentec42c4a20facbcae441cd172bfd607614e761907 (diff)
Fix crash when compiling specialized generic entrypoint containing a static const decl. (#8392)
Closes #8184. We fixed three issues with this regression test: 1. After generating IR for a `SpecializeComponentType`, we should also strip the frontend decorations from the IR so there is no HighLevelDeclDecoration that will go into the backend. 2. When lowering a static const inside a generic function, we should not give the static const a linkage, because it won't such constant will not appear in global scope. Trying to give it a linkage decoration will lead to the parent generic (for the function) to have two duplicate Export/Import decorations with different mangle names, and confuses the linker. 3. Make sure internal exceptions does not leak through `IComponentType::getEntryPointCode`/`getTargetCode`.
Diffstat (limited to 'source/slang/slang-target-program.cpp')
-rw-r--r--source/slang/slang-target-program.cpp26
1 files changed, 19 insertions, 7 deletions
diff --git a/source/slang/slang-target-program.cpp b/source/slang/slang-target-program.cpp
index ffb859b55..d7e7a73bb 100644
--- a/source/slang/slang-target-program.cpp
+++ b/source/slang/slang-target-program.cpp
@@ -98,16 +98,28 @@ IArtifact* TargetProgram::getOrCreateEntryPointResult(Int entryPointIndex, Diagn
if (IArtifact* artifact = m_entryPointResults[entryPointIndex])
return artifact;
- // If we haven't yet computed a layout for this target
- // program, we need to make sure that is done before
- // code generation.
- //
- if (!getOrCreateIRModuleForLayout(sink))
+ try
+ {
+ // If we haven't yet computed a layout for this target
+ // program, we need to make sure that is done before
+ // code generation.
+ //
+ if (!getOrCreateIRModuleForLayout(sink))
+ {
+ return nullptr;
+ }
+
+ return _createEntryPointResult(entryPointIndex, sink);
+ }
+ catch (const Exception& e)
{
+ sink->diagnose(
+ SourceLoc(),
+ Diagnostics::compilationAbortedDueToException,
+ typeid(e).name(),
+ e.Message);
return nullptr;
}
-
- return _createEntryPointResult(entryPointIndex, sink);
}
} // namespace Slang