summaryrefslogtreecommitdiff
path: root/source/slang/slang-ir-link.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/slang-ir-link.cpp')
-rw-r--r--source/slang/slang-ir-link.cpp29
1 files changed, 22 insertions, 7 deletions
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<IRPublicDecoration>();
- 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);
+ }
}
}
}