From b2ad8e99a82884bb157e1be76b1ad7eb0e481457 Mon Sep 17 00:00:00 2001 From: Yong He Date: Thu, 26 Aug 2021 10:30:35 -0700 Subject: Add API to control interface specialization. (#1925) --- source/slang/slang-lower-to-ir.cpp | 64 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) (limited to 'source/slang/slang-lower-to-ir.cpp') 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 generateIRForSpecializedComponentType( @@ -8265,6 +8270,65 @@ RefPtr 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 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 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 generateIRForTypeConformance( + TypeConformance* typeConformance, + Int conformanceIdOverride, + DiagnosticSink* sink) +{ + TypeConformanceIRGenContext context; + return context.process(typeConformance, conformanceIdOverride, sink); +} RefPtr TargetProgram::getOrCreateIRModuleForLayout(DiagnosticSink* sink) { -- cgit v1.2.3