diff options
| author | Yong He <yonghe@outlook.com> | 2024-04-01 18:44:44 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-04-01 18:44:44 -0700 |
| commit | abb7f1a7790544010d6eaac0f137e6b39349cf76 (patch) | |
| tree | 922ca0d837d426f42a09ebec0a9a8492964c4781 /source/slang/slang-emit-c-like.cpp | |
| parent | 2c4f9810327d58023e9ec44f579cd78adf56317b (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.cpp | 19 |
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)) |
