summaryrefslogtreecommitdiff
path: root/source/slang/slang-lower-to-ir.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2021-08-26 10:30:35 -0700
committerGitHub <noreply@github.com>2021-08-26 10:30:35 -0700
commitb2ad8e99a82884bb157e1be76b1ad7eb0e481457 (patch)
tree3f5357083b5972761d516b70cb51a4fa7ab72cd5 /source/slang/slang-lower-to-ir.cpp
parent33f7e1599cbecb32c23787b37b2bf3b34bdd5c84 (diff)
Add API to control interface specialization. (#1925)
Diffstat (limited to 'source/slang/slang-lower-to-ir.cpp')
-rw-r--r--source/slang/slang-lower-to-ir.cpp64
1 files changed, 64 insertions, 0 deletions
diff --git a/source/slang/slang-lower-to-ir.cpp b/source/slang/slang-lower-to-ir.cpp
index c7e32072e..8a40dbde9 100644
--- a/source/slang/slang-lower-to-ir.cpp
+++ b/source/slang/slang-lower-to-ir.cpp
@@ -8255,6 +8255,11 @@ struct SpecializedComponentTypeIRGenContext : ComponentTypeVisitor
{
visitChildren(specialized);
}
+
+ void visitTypeConformance(TypeConformance* conformance) SLANG_OVERRIDE
+ {
+ SLANG_UNUSED(conformance);
+ }
};
RefPtr<IRModule> generateIRForSpecializedComponentType(
@@ -8265,6 +8270,65 @@ RefPtr<IRModule> generateIRForSpecializedComponentType(
return context.process(componentType, sink);
}
+ /// Context for generating IR code to represent a `TypeConformance`
+struct TypeConformanceIRGenContext
+{
+ DiagnosticSink* sink;
+ Linkage* linkage;
+ Session* session;
+ IRGenContext* context;
+ IRBuilder* builder;
+
+ RefPtr<IRModule> process(
+ TypeConformance* typeConformance,
+ Int conformanceIdOverride,
+ DiagnosticSink* inSink)
+ {
+ sink = inSink;
+
+ linkage = typeConformance->getLinkage();
+ session = linkage->getSessionImpl();
+
+ SharedIRGenContext sharedContextStorage(session, sink, linkage->m_obfuscateCode);
+ SharedIRGenContext* sharedContext = &sharedContextStorage;
+
+ IRGenContext contextStorage(sharedContext, linkage->getASTBuilder());
+ context = &contextStorage;
+
+ SharedIRBuilder sharedBuilderStorage;
+ SharedIRBuilder* sharedBuilder = &sharedBuilderStorage;
+ sharedBuilder->module = nullptr;
+ sharedBuilder->session = session;
+
+ IRBuilder builderStorage;
+ builder = &builderStorage;
+ builder->sharedBuilder = sharedBuilder;
+
+ RefPtr<IRModule> module = builder->createModule();
+ sharedBuilder->module = module;
+
+ builder->setInsertInto(module->getModuleInst());
+
+ context->irBuilder = builder;
+
+ auto witness = lowerSimpleVal(context, typeConformance->getSubtypeWitness());
+ builder->addPublicDecoration(witness);
+ if (conformanceIdOverride != -1)
+ {
+ builder->addSequentialIDDecoration(witness, conformanceIdOverride);
+ }
+ return module;
+ }
+};
+
+RefPtr<IRModule> generateIRForTypeConformance(
+ TypeConformance* typeConformance,
+ Int conformanceIdOverride,
+ DiagnosticSink* sink)
+{
+ TypeConformanceIRGenContext context;
+ return context.process(typeConformance, conformanceIdOverride, sink);
+}
RefPtr<IRModule> TargetProgram::getOrCreateIRModuleForLayout(DiagnosticSink* sink)
{