diff options
| author | Yong He <yonghe@outlook.com> | 2021-08-26 10:30:35 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-08-26 10:30:35 -0700 |
| commit | b2ad8e99a82884bb157e1be76b1ad7eb0e481457 (patch) | |
| tree | 3f5357083b5972761d516b70cb51a4fa7ab72cd5 /source/slang/slang-lower-to-ir.cpp | |
| parent | 33f7e1599cbecb32c23787b37b2bf3b34bdd5c84 (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.cpp | 64 |
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) { |
