X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Finternal%2Fcodegen%2Fwriter%2FModuleWriter.java;fp=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Finternal%2Fcodegen%2Fwriter%2FModuleWriter.java;h=714f66b952fdba86910f0e270a8c2d64756f41dd;hb=969bd23cab98a79ca9101af33334000879fb60c5;hp=0000000000000000000000000000000000000000;hpb=866dba5cd5a3929bbeae85991796acb212338a08;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/writer/ModuleWriter.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/writer/ModuleWriter.java new file mode 100644 index 000000000..714f66b95 --- /dev/null +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/writer/ModuleWriter.java @@ -0,0 +1,76 @@ +package org.simantics.scl.compiler.internal.codegen.writer; + +import gnu.trove.map.hash.THashMap; + +import java.util.Map; + +import org.simantics.scl.compiler.common.names.Name; +import org.simantics.scl.compiler.constants.Constant; +import org.simantics.scl.compiler.constants.JavaStaticField; +import org.simantics.scl.compiler.constants.SCLConstant; +import org.simantics.scl.compiler.internal.codegen.ssa.SSABlock; +import org.simantics.scl.compiler.internal.codegen.ssa.SSAFunction; +import org.simantics.scl.compiler.internal.codegen.ssa.SSAModule; +import org.simantics.scl.compiler.types.TVar; +import org.simantics.scl.compiler.types.Type; +import org.simantics.scl.runtime.tuple.Tuple2; + +public class ModuleWriter { + + SSAModule module; + + String moduleClassName; + THashMap externalConstantMap = + new THashMap(); + int externalConstantId = 0; + + public ModuleWriter(String moduleClassName) { + this.module = new SSAModule(); + this.moduleClassName = moduleClassName; + } + + public CodeWriter createFunction(SCLConstant constant, TVar[] typeParameters, + Type effect, Type returnType, Type[] parameterTypes) { + Name name = constant.getName(); + SSAFunction function = new SSAFunction(typeParameters, effect, returnType); + SSABlock block = new SSABlock(parameterTypes); + function.addBlock(block); + function.setTarget(constant); + constant.setDefinition(function); + module.put(name, constant); + return new CodeWriter(this, block); + } + + @Override + public String toString() { + return module.toString(); + } + + public SSAModule getModule() { + return module; + } + + public Constant getExternalConstant(Object value, Type type) { + Tuple2 tuple = new Tuple2(value, type); + if(externalConstantMap.contains(tuple)) + return externalConstantMap.get(tuple); + else { + ++externalConstantId; + String name = "externalConstant" + externalConstantId; + JavaStaticField constant = new JavaStaticField(moduleClassName, name, type, -1); + externalConstantMap.put(tuple, constant); + module.addStaticField(new Tuple2(name, type)); + return constant; + } + } + + public ExternalConstant[] getExternalConstants() { + ExternalConstant[] result = new ExternalConstant[externalConstantMap.size()]; + int i=0; + for(Map.Entry entry : externalConstantMap.entrySet()) { + result[i++] = new ExternalConstant(entry.getValue().getFieldName(), entry.getKey().c0); + } + return result; + } + +}