From b915ae662b2e4bcaaeb6da62eb964356d0a978b4 Mon Sep 17 00:00:00 2001 From: jsmall-nvidia Date: Thu, 5 May 2022 15:53:29 -0400 Subject: Support for HLSL `export` (#2223) * #include an absolute path didn't work - because paths were taken to always be relative. * Add support for HLSL `export`. * Test for using `export` keyword. --- source/slang/slang-ir-link.cpp | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) (limited to 'source/slang/slang-ir-link.cpp') diff --git a/source/slang/slang-ir-link.cpp b/source/slang/slang-ir-link.cpp index 8c1edc032..80ba0b610 100644 --- a/source/slang/slang-ir-link.cpp +++ b/source/slang/slang-ir-link.cpp @@ -441,6 +441,7 @@ static void cloneExtraDecorations( default: break; + case kIROp_HLSLExportDecoration: case kIROp_BindExistentialSlotsDecoration: case kIROp_LayoutDecoration: case kIROp_PublicDecoration: @@ -1348,6 +1349,20 @@ struct IRSpecializationState } }; +static bool _isPublicOrHLSLExported(IRInst* inst) +{ + for (auto decoration : inst->getDecorations()) + { + const auto op = decoration->getOp(); + if (op == kIROp_PublicDecoration || + op == kIROp_HLSLExportDecoration) + { + return true; + } + } + return false; +} + LinkedIR linkIR( CodeGenContext* codeGenContext) { @@ -1495,14 +1510,14 @@ LinkedIR linkIR( { for (auto inst : irModule->getGlobalInsts()) { - auto hasPublic = inst->findDecoration(); - if (!hasPublic) - continue; - - auto cloned = cloneValue(context, inst); - if (!cloned->findDecorationImpl(kIROp_KeepAliveDecoration)) + // Is it `public` or (HLSL) `export` clone + if (_isPublicOrHLSLExported(inst)) { - context->builder->addKeepAliveDecoration(cloned); + auto cloned = cloneValue(context, inst); + if (!cloned->findDecorationImpl(kIROp_KeepAliveDecoration)) + { + context->builder->addKeepAliveDecoration(cloned); + } } } } -- cgit v1.2.3