summaryrefslogtreecommitdiff
path: root/source/slang/slang-ir-legalize-types.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2024-02-28 22:57:07 -0800
committerGitHub <noreply@github.com>2024-02-28 22:57:07 -0800
commit73a61edda8893901acad05bb4e7d3110db5041a8 (patch)
treebb6331b28715a4e95fcd7724ad338149ce56e562 /source/slang/slang-ir-legalize-types.cpp
parentd2644e2f8f0abb73bbd6afd70816f6bf245340da (diff)
[SPIRV] Add NonSemanticDebugInfo for step-through debugging. (#3644)
* [SPIRV] Add NonSemanticDebugInfo for step-through debugging. * Fix. * Fix.
Diffstat (limited to 'source/slang/slang-ir-legalize-types.cpp')
-rw-r--r--source/slang/slang-ir-legalize-types.cpp88
1 files changed, 88 insertions, 0 deletions
diff --git a/source/slang/slang-ir-legalize-types.cpp b/source/slang/slang-ir-legalize-types.cpp
index 6c5ab1223..93715bc36 100644
--- a/source/slang/slang-ir-legalize-types.cpp
+++ b/source/slang/slang-ir-legalize-types.cpp
@@ -814,6 +814,87 @@ static LegalVal legalizeLoad(
}
}
+static LegalVal legalizeDebugVar(IRTypeLegalizationContext* context, LegalType type, IRDebugVar* originalInst)
+{
+ // For now we just discard any special part and keep the ordinary part.
+
+ switch (type.flavor)
+ {
+ case LegalType::Flavor::simple:
+ {
+ auto legalVal = context->builder->emitDebugVar(
+ type.getSimple(),
+ originalInst->getSource(),
+ originalInst->getLine(),
+ originalInst->getCol());
+ copyNameHintAndDebugDecorations(legalVal, originalInst);
+ return LegalVal::simple(legalVal);
+ }
+ case LegalType::Flavor::none:
+ return LegalVal();
+ case LegalType::Flavor::pair:
+ {
+ auto pairType = type.getPair();
+ auto ordinaryVal = legalizeDebugVar(context, pairType->ordinaryType, originalInst);
+ return ordinaryVal;
+ }
+ case LegalType::Flavor::tuple:
+ {
+ auto tupleType = type.getTuple();
+ for (auto ee : tupleType->elements)
+ {
+ auto innerResult = legalizeDebugVar(context, ee.type, originalInst);
+ if (innerResult.flavor != LegalVal::Flavor::none)
+ return innerResult;
+ }
+ return LegalVal();
+ }
+ default:
+ return LegalVal();
+ }
+}
+
+static LegalVal legalizeDebugValue(IRTypeLegalizationContext* context, LegalVal debugVar, LegalVal debugValue, IRDebugValue* originalInst)
+{
+ // For now we just discard any special part and keep the ordinary part.
+ List<IRInst*> accessChain;
+ for (UInt i = 0; i < originalInst->getAccessChainCount(); i++)
+ {
+ accessChain.add(originalInst->getAccessChain(i));
+ }
+ switch (debugValue.flavor)
+ {
+ case LegalType::Flavor::simple:
+ return LegalVal::simple(
+ context->builder->emitDebugValue(
+ debugVar.getSimple(),
+ debugValue.getSimple(),
+ accessChain.getArrayView()));
+ case LegalType::Flavor::none:
+ return LegalVal();
+ case LegalType::Flavor::pair:
+ {
+ auto ordinaryVal = legalizeDebugValue(context, debugVar, debugValue.getPair()->ordinaryVal, originalInst);
+ return ordinaryVal;
+ }
+ case LegalType::Flavor::tuple:
+ {
+ auto tupleVar = debugVar.getTuple();
+ UInt index = 0;
+ for (auto ee : tupleVar->elements)
+ {
+ auto innerResult = legalizeDebugValue(context, debugVar, debugValue.getTuple()->elements[index].val, originalInst);
+ if (innerResult.flavor != LegalVal::Flavor::none)
+ return innerResult;
+ index++;
+ }
+ return LegalVal();
+ }
+ default:
+ return LegalVal();
+ }
+}
+
static LegalVal legalizeStore(
IRTypeLegalizationContext* context,
LegalVal legalPtrVal,
@@ -1921,6 +2002,12 @@ static LegalVal legalizeInst(
return legalizeCall(context, (IRCall*)inst);
case kIROp_Return:
return legalizeRetVal(context, args[0], (IRReturn*)inst);
+
+ case kIROp_DebugVar:
+ return legalizeDebugVar(context, type, (IRDebugVar*)inst);
+ case kIROp_DebugValue:
+ return legalizeDebugValue(context, args[0], args[1], (IRDebugValue*)inst);
+
case kIROp_MakeStruct:
return legalizeMakeStruct(
context,
@@ -1939,6 +2026,7 @@ static LegalVal legalizeInst(
return legalizeDefaultConstruct(
context,
type);
+
case kIROp_unconditionalBranch:
case kIROp_loop:
return legalizeUnconditionalBranch(context, args, (IRUnconditionalBranch*)inst);