summaryrefslogtreecommitdiff
path: root/source/slang/slang-ir.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/slang-ir.cpp')
-rw-r--r--source/slang/slang-ir.cpp16
1 files changed, 16 insertions, 0 deletions
diff --git a/source/slang/slang-ir.cpp b/source/slang/slang-ir.cpp
index 1287d1598..f75fe2f48 100644
--- a/source/slang/slang-ir.cpp
+++ b/source/slang/slang-ir.cpp
@@ -596,6 +596,13 @@ static IRBlock::SuccessorList getSuccessors(IRInst* terminator)
end = operands + terminator->getOperandCount() + 1;
stride = 2;
break;
+
+ case kIROp_Defer:
+ // defer <deferBlock> <mergeBlock> <scopeEndBlock>
+ begin = operands + 0;
+ end = begin + 1;
+ break;
+
default:
SLANG_UNEXPECTED("unhandled terminator instruction");
UNREACHABLE_RETURN(IRBlock::SuccessorList(nullptr, nullptr));
@@ -869,6 +876,7 @@ bool isTerminatorInst(IROp op)
case kIROp_Switch:
case kIROp_Unreachable:
case kIROp_MissingReturn:
+ case kIROp_Defer:
return true;
}
}
@@ -5698,6 +5706,14 @@ IRInst* IRBuilder::emitReturn()
return inst;
}
+IRInst* IRBuilder::emitDefer(IRBlock* deferBlock, IRBlock* mergeBlock, IRBlock* scopeEndBlock)
+{
+ auto inst =
+ createInst<IRDefer>(this, kIROp_Defer, nullptr, deferBlock, mergeBlock, scopeEndBlock);
+ addInst(inst);
+ return inst;
+}
+
IRInst* IRBuilder::emitThrow(IRInst* val)
{
auto inst = createInst<IRThrow>(this, kIROp_Throw, nullptr, val);