From abb7f1a7790544010d6eaac0f137e6b39349cf76 Mon Sep 17 00:00:00 2001 From: Yong He Date: Mon, 1 Apr 2024 18:44:44 -0700 Subject: Support `[RequirePrelude]` attribute on types. (#3867) --- source/slang/slang-emit-c-like.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) (limited to 'source/slang/slang-emit-c-like.cpp') 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(findBestTargetDecoration(type))) + { + auto preludeTextInst = as(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 IRTargetSpecificDecoration* CLikeSourceEmitter::findBestTargetDecoration(IRInst* inInst) { - return Slang::findBestTargetDecoration(inInst, getTargetCaps()); + return Slang::findBestTargetDecoration(inInst, getTargetCaps()); } IRTargetIntrinsicDecoration* CLikeSourceEmitter::_findBestTargetIntrinsicDecoration(IRInst* inInst) { - return as(findBestTargetDecoration(inInst)); + return as(findBestTargetDecoration(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)) -- cgit v1.2.3