]> gerrit.simantics Code Review - simantics/platform.git/blob
25d5734c7fb6581e2a059101e42c127c5b8d4f44
[simantics/platform.git] /
1 package org.simantics.scl.compiler.internal.codegen.ssa;\r
2 \r
3 import java.util.ArrayList;\r
4 \r
5 import org.simantics.scl.compiler.internal.codegen.references.BoundVar;\r
6 import org.simantics.scl.compiler.internal.codegen.references.Val;\r
7 import org.simantics.scl.compiler.internal.codegen.references.ValRef;\r
8 import org.simantics.scl.compiler.internal.codegen.ssa.statements.LetApply;\r
9 import org.simantics.scl.compiler.internal.codegen.utils.CopyContext;\r
10 import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder;\r
11 import org.simantics.scl.compiler.internal.codegen.utils.Printable;\r
12 import org.simantics.scl.compiler.internal.codegen.utils.PrintingContext;\r
13 import org.simantics.scl.compiler.internal.codegen.utils.SSALambdaLiftingContext;\r
14 import org.simantics.scl.compiler.internal.codegen.utils.SSASimplificationContext;\r
15 import org.simantics.scl.compiler.internal.codegen.utils.SSAValidationContext;\r
16 import org.simantics.scl.compiler.types.TVar;\r
17 import org.simantics.scl.compiler.types.Type;\r
18 import org.simantics.scl.compiler.types.Types;\r
19 \r
20 \r
21 public abstract class SSAStatement implements Printable {\r
22     SSABlock parent;\r
23     SSAStatement prev;\r
24     SSAStatement next;\r
25     public long location;\r
26     \r
27     public void detach() {\r
28         if(prev == null)\r
29             parent.firstStatement = next;\r
30         else\r
31             prev.next = next;\r
32         if(next == null)\r
33             parent.lastStatement = prev;\r
34         else\r
35             next.prev = prev;\r
36     }\r
37 \r
38     public abstract void generateCode(MethodBuilder mb);\r
39 \r
40     public abstract void validate(SSAValidationContext context);\r
41 \r
42     public void simplify(SSASimplificationContext context) {\r
43     }\r
44 \r
45     public abstract void destroy();\r
46     \r
47     public SSABlock getParent() {\r
48         return parent;\r
49     }\r
50     \r
51     public SSAStatement getPrev() {\r
52         return prev;\r
53     }\r
54     \r
55     public void setAsLastStatement() {\r
56         this.next = null;\r
57         parent.lastStatement = this;\r
58     }\r
59     \r
60     public SSAStatement getNext() {\r
61         return next;\r
62     }\r
63     \r
64     public void remove() {\r
65         detach();\r
66         destroy();        \r
67     }\r
68     \r
69     @Override\r
70     public String toString() {\r
71         PrintingContext context = new PrintingContext();\r
72         toString(context);\r
73         return context.toString();\r
74     }\r
75 \r
76     public void markGenerateOnFly() {        \r
77     }\r
78 \r
79     public abstract SSAStatement copy(CopyContext context);\r
80     public abstract void replace(TVar[] vars, Type[] replacements);\r
81 \r
82     public abstract void addBoundVariablesTo(SSAValidationContext context);\r
83 \r
84     public abstract void collectFreeVariables(SSAFunction function, ArrayList<ValRef> vars);\r
85     \r
86     public SSAFunction getParentFunction() {\r
87         return parent.parent;\r
88     }\r
89 \r
90     public void lambdaLift(SSALambdaLiftingContext context) {\r
91     }\r
92     \r
93     public void insertBefore(SSAStatement statement) {\r
94         next = statement;\r
95         prev = statement.prev;\r
96         parent = statement.parent;\r
97         if(prev == null)\r
98             parent.firstStatement = this;\r
99         else\r
100             prev.next = this;\r
101         statement.prev = this;        \r
102     }\r
103     \r
104     public void insertAfter(SSAStatement statement) {\r
105         prev = statement;\r
106         next = statement.next;\r
107         parent = statement.parent;\r
108         if(next == null)\r
109             parent.lastStatement = this;\r
110         else\r
111             next.prev = this;\r
112         statement.next = this;        \r
113     }\r
114     \r
115     public void replaceByApply(ValRef valRef, Val function, Type[] typeParameters, Val[] parameters) {\r
116         BoundVar target = new BoundVar(valRef.getBinding().getType());\r
117         new LetApply(target, Types.NO_EFFECTS, function.createOccurrence(typeParameters), ValRef.createOccurrences(parameters)).insertBefore(this);\r
118         valRef.replaceBy(target);\r
119     }\r
120 \r
121     public void prepare(MethodBuilder mb) {        \r
122     }\r
123 }\r