X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Fcompilation%2FCodeGeneration.java;h=f0b9f735e68b7b6522b46423e188f7a0ca95feba;hb=f2b480b85db5e35cd18329ccdcd28ab1e0663094;hp=470b8e9f0701c0418fb08bf02757e0b4717616d5;hpb=969bd23cab98a79ca9101af33334000879fb60c5;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/CodeGeneration.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/CodeGeneration.java index 470b8e9f0..f0b9f735e 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/CodeGeneration.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/CodeGeneration.java @@ -17,6 +17,7 @@ import org.simantics.scl.compiler.constants.ThisConstant; import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext; import org.simantics.scl.compiler.elaboration.expressions.Expression; import org.simantics.scl.compiler.elaboration.macros.StandardMacroRule; +import org.simantics.scl.compiler.elaboration.modules.DerivedProperty; import org.simantics.scl.compiler.elaboration.modules.InlineProperty; import org.simantics.scl.compiler.elaboration.modules.MethodImplementation; import org.simantics.scl.compiler.elaboration.modules.PrivateProperty; @@ -25,8 +26,8 @@ import org.simantics.scl.compiler.elaboration.modules.SCLValueProperty; import org.simantics.scl.compiler.elaboration.modules.TypeClass; import org.simantics.scl.compiler.elaboration.modules.TypeClassInstance; import org.simantics.scl.compiler.elaboration.modules.TypeClassMethod; -import org.simantics.scl.compiler.environment.Environment; import org.simantics.scl.compiler.errors.ErrorLog; +import org.simantics.scl.compiler.errors.Locations; import org.simantics.scl.compiler.internal.codegen.references.IVal; import org.simantics.scl.compiler.internal.codegen.references.Val; import org.simantics.scl.compiler.internal.codegen.ssa.SSAModule; @@ -37,7 +38,6 @@ import org.simantics.scl.compiler.internal.codegen.utils.ClassBuilder; import org.simantics.scl.compiler.internal.codegen.utils.CodeBuilderUtils; import org.simantics.scl.compiler.internal.codegen.utils.CodeBuildingException; import org.simantics.scl.compiler.internal.codegen.utils.Constants; -import org.simantics.scl.compiler.internal.codegen.utils.JavaNamingPolicy; import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder; import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilderBase; import org.simantics.scl.compiler.internal.codegen.utils.ModuleBuilder; @@ -53,18 +53,20 @@ import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.Types; import org.simantics.scl.compiler.types.exceptions.MatchException; import org.simantics.scl.compiler.types.util.MultiFunction; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import gnu.trove.procedure.TObjectObjectProcedure; import gnu.trove.procedure.TObjectProcedure; public class CodeGeneration { - + + private static final Logger LOGGER = LoggerFactory.getLogger(CodeGeneration.class); + public static final int OPTIMIZATION_PHASES = 2; + CompilationContext compilationContext; ErrorLog errorLog; - Environment environment; - JavaNamingPolicy namingPolicy; - JavaTypeTranslator javaTypeTranslator; JavaReferenceValidator validator; ConcreteModule module; ModuleBuilder moduleBuilder; @@ -75,29 +77,23 @@ public class CodeGeneration { Map classes; @SuppressWarnings("unchecked") - public CodeGeneration(ErrorLog errorLog, - Environment environment, - JavaNamingPolicy namingPolicy, JavaTypeTranslator javaTypeTranslator, + public CodeGeneration(CompilationContext compilationContext, JavaReferenceValidator javaReferenceValidator, - ConcreteModule module) { - this.errorLog = errorLog; - this.environment = environment; - this.namingPolicy = namingPolicy; - this.javaTypeTranslator = javaTypeTranslator; + ConcreteModule module) { + this.compilationContext = compilationContext; + this.errorLog = compilationContext.errorLog; this.module = module; this.validator = (JavaReferenceValidator) javaReferenceValidator; - moduleBuilder = new ModuleBuilder(namingPolicy, javaTypeTranslator); + moduleBuilder = new ModuleBuilder(compilationContext.namingPolicy, compilationContext.javaTypeTranslator); } public void simplifyValues() { - //System.out.println("===== Simplify values ====="); + //LOGGER.info("===== Simplify values ====="); Collection values = module.getValues(); - SimplificationContext simplificationContext = - new SimplificationContext(environment, errorLog, - javaTypeTranslator, validator); - //System.out.println("-----------------------------------------------"); + SimplificationContext simplificationContext = new SimplificationContext(compilationContext, validator); + //LOGGER.info("-----------------------------------------------"); SCLValue[] valueArray = values.toArray(new SCLValue[values.size()]); for(SCLValue value : valueArray) { @@ -109,23 +105,21 @@ public class CodeGeneration { // Simplify for(SCLValue value : valueArray) { - //System.out.println("BEFORE " + value.getName() + " = " + value.getExpression()); + //LOGGER.info("BEFORE " + value.getName() + " = " + value.getExpression()); value.getSimplifiedExpression(simplificationContext); - //System.out.println("AFTER " + value.getName() + " = " + value.getExpression()); + //LOGGER.info("AFTER " + value.getName() + " = " + value.getExpression()); } } public void convertToSSA() { - ModuleWriter mw = new ModuleWriter(namingPolicy.getModuleClassName()); + ModuleWriter mw = new ModuleWriter(compilationContext.namingPolicy.getModuleClassName(), compilationContext.lineLocator); for(SCLValue value : module.getValues()) { - //System.out.println(value.getName().name + " :: " + value.getType()); + //LOGGER.info(value.getName().name + " :: " + value.getType()); Expression expression = value.getExpression(); if(expression == null) continue; Name name = value.getName(); - DecomposedExpression decomposed = - DecomposedExpression.decompose(expression); SCLConstant constant = new SCLConstant(name, value.getType()); value.setValue(constant); @@ -135,13 +129,18 @@ public class CodeGeneration { decomposed.typeParameters, decomposed.returnType, decomposed.parameterTypes));*/ + boolean isDerived = false; for(SCLValueProperty prop : value.getProperties()) { if(prop instanceof InlineProperty) { InlineProperty inlineProperty = (InlineProperty)prop; constant.setInlineArity(inlineProperty.arity, inlineProperty.phaseMask); } else if(prop == PrivateProperty.INSTANCE) - constant.setPrivate(true); + constant.setPrivate(!isDerived); + else if(prop == DerivedProperty.INSTANCE) { + constant.setPrivate(false); + isDerived = true; + } } } // This is quite hackish optimization that can be possibly removed when @@ -154,7 +153,7 @@ public class CodeGeneration { if(constant.getTypeParameters().length > 0) continue; - //System.out.println(value.getName() + " <- " + constant.getValue().getName()); + //LOGGER.info(value.getName() + " <- " + constant.getValue().getName()); value.setValue(constant.getValue().getValue()); value.setExpression(null); // HMM?? }*/ @@ -165,7 +164,7 @@ public class CodeGeneration { continue; DecomposedExpression decomposed = - DecomposedExpression.decompose(expression); + DecomposedExpression.decompose(errorLog, expression); CodeWriter w = mw.createFunction((SCLConstant)value.getValue(), decomposed.typeParameters, @@ -177,9 +176,12 @@ public class CodeGeneration { IVal[] parameterVals = w.getParameters(); for(int i=0;i