summaryrefslogtreecommitdiff
path: root/source/slang/slang-emit-c-like.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2024-04-01 18:44:44 -0700
committerGitHub <noreply@github.com>2024-04-01 18:44:44 -0700
commitabb7f1a7790544010d6eaac0f137e6b39349cf76 (patch)
tree922ca0d837d426f42a09ebec0a9a8492964c4781 /source/slang/slang-emit-c-like.cpp
parent2c4f9810327d58023e9ec44f579cd78adf56317b (diff)
Support `[RequirePrelude]` attribute on types. (#3867)
Diffstat (limited to 'source/slang/slang-emit-c-like.cpp')
-rw-r--r--source/slang/slang-emit-c-like.cpp19
1 files changed, 17 insertions, 2 deletions
diff --git a/source/slang/slang-emit-c-like.cpp b/source/slang/slang-emit-c-like.cpp
index b60e0a4ac..5813819b4 100644
--- a/source/slang/slang-emit-c-like.cpp
+++ b/source/slang/slang-emit-c-like.cpp
@@ -129,6 +129,16 @@ void CLikeSourceEmitter::emitPreModuleImpl()
// Types
//
+void CLikeSourceEmitter::ensureTypePrelude(IRType* type)
+{
+ if (auto requirePreludeDecor = as<IRRequirePreludeDecoration>(findBestTargetDecoration<IRRequirePreludeDecoration>(type)))
+ {
+ auto preludeTextInst = as<IRStringLit>(requirePreludeDecor->getOperand(1));
+ if (preludeTextInst)
+ m_requiredPreludes.add(preludeTextInst);
+ }
+}
+
void CLikeSourceEmitter::emitDeclarator(DeclaratorInfo* declarator)
{
if (!declarator) return;
@@ -1733,14 +1743,15 @@ void CLikeSourceEmitter::emitInstResultDecl(IRInst* inst)
m_writer->emit(" = ");
}
+template<typename T>
IRTargetSpecificDecoration* CLikeSourceEmitter::findBestTargetDecoration(IRInst* inInst)
{
- return Slang::findBestTargetDecoration(inInst, getTargetCaps());
+ return Slang::findBestTargetDecoration<T>(inInst, getTargetCaps());
}
IRTargetIntrinsicDecoration* CLikeSourceEmitter::_findBestTargetIntrinsicDecoration(IRInst* inInst)
{
- return as<IRTargetIntrinsicDecoration>(findBestTargetDecoration(inInst));
+ return as<IRTargetIntrinsicDecoration>(findBestTargetDecoration<IRTargetSpecificDefinitionDecoration>(inInst));
}
/* static */bool CLikeSourceEmitter::isOrdinaryName(UnownedStringSlice const& name)
@@ -3492,6 +3503,8 @@ void CLikeSourceEmitter::emitFuncDecorationsImpl(IRFunc* func)
void CLikeSourceEmitter::emitStruct(IRStructType* structType)
{
+ ensureTypePrelude(structType);
+
// If the selected `struct` type is actually an intrinsic
// on our target, then we don't want to emit anything at all.
if(isTargetIntrinsic(structType))
@@ -3549,6 +3562,8 @@ void CLikeSourceEmitter::emitStructDeclarationsBlock(IRStructType* structType, b
void CLikeSourceEmitter::emitClass(IRClassType* classType)
{
+ ensureTypePrelude(classType);
+
// If the selected `class` type is actually an intrinsic
// on our target, then we don't want to emit anything at all.
if (isTargetIntrinsic(classType))