mirror of
https://gitlab.com/camelot/kickc.git
synced 2024-10-11 12:23:45 +00:00
Refactored toString to avoid redundant code.
This commit is contained in:
parent
300bb644b9
commit
524252105a
@ -122,7 +122,7 @@ public class Compiler {
|
|||||||
log.append("Succesful SSA optimization " + optimization.getClass().getSimpleName() + "");
|
log.append("Succesful SSA optimization " + optimization.getClass().getSimpleName() + "");
|
||||||
ssaOptimized = true;
|
ssaOptimized = true;
|
||||||
log.append("CONTROL FLOW GRAPH");
|
log.append("CONTROL FLOW GRAPH");
|
||||||
log.append(program.getGraph().getAsTypedString(program.getScope()));
|
log.append(program.getGraph().toString(program.getScope()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -138,7 +138,7 @@ public class Compiler {
|
|||||||
pass1TypeInference.inferTypes(statementSequence);
|
pass1TypeInference.inferTypes(statementSequence);
|
||||||
|
|
||||||
log.append("PROGRAM");
|
log.append("PROGRAM");
|
||||||
log.append(statementSequence.getAsTypedString(programScope));
|
log.append(statementSequence.toString(programScope));
|
||||||
log.append("SYMBOLS");
|
log.append("SYMBOLS");
|
||||||
log.append(programScope.getSymbolTableContents());
|
log.append(programScope.getSymbolTableContents());
|
||||||
|
|
||||||
@ -148,26 +148,26 @@ public class Compiler {
|
|||||||
Program program = new Program(programScope, controlFlowGraph);
|
Program program = new Program(programScope, controlFlowGraph);
|
||||||
|
|
||||||
log.append("INITIAL CONTROL FLOW GRAPH");
|
log.append("INITIAL CONTROL FLOW GRAPH");
|
||||||
log.append(program.getGraph().getAsTypedString(program.getScope()));
|
log.append(program.getGraph().toString(program.getScope()));
|
||||||
|
|
||||||
Pass1ProcedureCallParameters pass1ProcedureCallParameters =
|
Pass1ProcedureCallParameters pass1ProcedureCallParameters =
|
||||||
new Pass1ProcedureCallParameters(program);
|
new Pass1ProcedureCallParameters(program);
|
||||||
program.setGraph(pass1ProcedureCallParameters.generate());
|
program.setGraph(pass1ProcedureCallParameters.generate());
|
||||||
log.append("CONTROL FLOW GRAPH WITH ASSIGNMENT CALL");
|
log.append("CONTROL FLOW GRAPH WITH ASSIGNMENT CALL");
|
||||||
log.append(program.getGraph().getAsTypedString(program.getScope()));
|
log.append(program.getGraph().toString(program.getScope()));
|
||||||
|
|
||||||
Pass1GenerateSingleStaticAssignmentForm pass1GenerateSingleStaticAssignmentForm =
|
Pass1GenerateSingleStaticAssignmentForm pass1GenerateSingleStaticAssignmentForm =
|
||||||
new Pass1GenerateSingleStaticAssignmentForm(log, program);
|
new Pass1GenerateSingleStaticAssignmentForm(log, program);
|
||||||
pass1GenerateSingleStaticAssignmentForm.generate();
|
pass1GenerateSingleStaticAssignmentForm.generate();
|
||||||
|
|
||||||
log.append("CONTROL FLOW GRAPH SSA");
|
log.append("CONTROL FLOW GRAPH SSA");
|
||||||
log.append(program.getGraph().getAsTypedString(program.getScope()));
|
log.append(program.getGraph().toString(program.getScope()));
|
||||||
|
|
||||||
Pass1ProcedureCallsReturnValue pass1ProcedureCallsReturnValue =
|
Pass1ProcedureCallsReturnValue pass1ProcedureCallsReturnValue =
|
||||||
new Pass1ProcedureCallsReturnValue(program);
|
new Pass1ProcedureCallsReturnValue(program);
|
||||||
program.setGraph(pass1ProcedureCallsReturnValue.generate());
|
program.setGraph(pass1ProcedureCallsReturnValue.generate());
|
||||||
log.append("CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN");
|
log.append("CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN");
|
||||||
log.append(program.getGraph().getAsTypedString(program.getScope()));
|
log.append(program.getGraph().toString(program.getScope()));
|
||||||
return program;
|
return program;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,16 +23,12 @@ public class PointerDereferenceRegisterZpByte implements PointerDereference {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return getAsString();
|
return toString(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAsTypedString(ProgramScope scope) {
|
public String toString(ProgramScope scope) {
|
||||||
return getAsString();
|
return "*(" + pointer.toString(scope) + ')';
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getAsString() {
|
|
||||||
return "*(" + pointer.toString() + ')';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -13,17 +13,17 @@ public class ConstantBool implements Constant {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return getAsString();
|
return toString(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAsTypedString(ProgramScope scope) {
|
public String toString(ProgramScope scope) {
|
||||||
return //"("+SymbolTypeBasic.BOOLEAN.getTypeName()+") "+
|
if(scope==null) {
|
||||||
Boolean.toString(value);
|
return Boolean.toString(value);
|
||||||
|
} else {
|
||||||
|
return //"("+SymbolTypeBasic.BOOLEAN.getTypeName()+") "+
|
||||||
|
Boolean.toString(value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getAsString() {
|
|
||||||
return Boolean.toString(value);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -17,16 +17,16 @@ public class ConstantDouble implements Constant {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return getAsString();
|
return toString(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAsTypedString(ProgramScope scope) {
|
public String toString(ProgramScope scope) {
|
||||||
return "(" + SymbolTypeBasic.VOID.getTypeName() + ") " + Double.toString(number);
|
if(scope==null) {
|
||||||
|
return Double.toString(number);
|
||||||
|
} else {
|
||||||
|
return "(" + SymbolTypeBasic.VOID.getTypeName() + ") " + Double.toString(number);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getAsString() {
|
|
||||||
return Double.toString(number);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -34,17 +34,16 @@ public class ConstantInteger implements Constant {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return getAsString();
|
return toString(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAsTypedString(ProgramScope scope) {
|
public String toString(ProgramScope scope) {
|
||||||
return "("+getType().getTypeName()+") "+Integer.toString(number); }
|
if (scope == null) {
|
||||||
|
return Integer.toString(number);
|
||||||
@Override
|
} else {
|
||||||
@JsonIgnore
|
return "(" + getType().getTypeName() + ") " + Integer.toString(number);
|
||||||
public String getAsString() {
|
}
|
||||||
return Integer.toString(number);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -13,15 +13,16 @@ public class ConstantString implements Constant {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return getAsString();
|
return toString(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAsTypedString(ProgramScope scope) {
|
public String toString(ProgramScope scope) {
|
||||||
return "("+SymbolTypeBasic.STRING.getTypeName()+") "+"\\"+value+"\\"; }
|
if (scope == null) {
|
||||||
|
return "\\" + value + "\\";
|
||||||
@Override
|
} else {
|
||||||
public String getAsString() {
|
return "(" + SymbolTypeBasic.STRING.getTypeName() + ") " + "\\" + value + "\\";
|
||||||
return "\\"+value+"\\";
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -79,7 +79,7 @@ public class ControlFlowBlock {
|
|||||||
return statements;
|
return statements;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getAsTypedString(ControlFlowGraph graph, ProgramScope scope) {
|
public String toString(ControlFlowGraph graph, ProgramScope scope) {
|
||||||
StringBuffer out = new StringBuffer();
|
StringBuffer out = new StringBuffer();
|
||||||
out.append(label.getFullName() + ":" );
|
out.append(label.getFullName() + ":" );
|
||||||
out.append(" from");
|
out.append(" from");
|
||||||
@ -95,33 +95,7 @@ public class ControlFlowBlock {
|
|||||||
}
|
}
|
||||||
out.append("\n");
|
out.append("\n");
|
||||||
for (Statement statement : statements) {
|
for (Statement statement : statements) {
|
||||||
out.append(" "+statement.getAsTypedString(scope)+"\n");
|
out.append(" "+statement.toString(scope)+"\n");
|
||||||
}
|
|
||||||
if(defaultSuccessor!=null) {
|
|
||||||
out.append(" to:");
|
|
||||||
out.append(defaultSuccessor.getFullName());
|
|
||||||
out.append("\n");
|
|
||||||
}
|
|
||||||
return out.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getAsString(ControlFlowGraph graph) {
|
|
||||||
StringBuffer out = new StringBuffer();
|
|
||||||
out.append(label.getFullName() + ":" );
|
|
||||||
out.append(" from");
|
|
||||||
if(graph!=null) {
|
|
||||||
List<ControlFlowBlock> predecessors = graph.getPredecessors(this);
|
|
||||||
if(predecessors.size()>0) {
|
|
||||||
for (ControlFlowBlock predecessor : predecessors) {
|
|
||||||
out.append(" " + predecessor.getLabel().getFullName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
out.append(" @UNKNOWN");
|
|
||||||
}
|
|
||||||
out.append("\n");
|
|
||||||
for (Statement statement : statements) {
|
|
||||||
out.append(" "+statement.getAsString()+"\n");
|
|
||||||
}
|
}
|
||||||
if(defaultSuccessor!=null) {
|
if(defaultSuccessor!=null) {
|
||||||
out.append(" to:");
|
out.append(" to:");
|
||||||
|
@ -131,24 +131,14 @@ public class ControlFlowGraph {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getAsTypedString(ProgramScope scope) {
|
public String toString(ProgramScope scope) {
|
||||||
StringBuffer out = new StringBuffer();
|
StringBuffer out = new StringBuffer();
|
||||||
for (ControlFlowBlock block : blocks.values()) {
|
for (ControlFlowBlock block : blocks.values()) {
|
||||||
out.append(block.getAsTypedString(this, scope));
|
out.append(block.toString(this, scope));
|
||||||
}
|
}
|
||||||
return out.toString();
|
return out.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@JsonIgnore
|
|
||||||
public String getAsString() {
|
|
||||||
StringBuffer out = new StringBuffer();
|
|
||||||
for (ControlFlowBlock block : blocks.values()) {
|
|
||||||
out.append(block.getAsString(this));
|
|
||||||
}
|
|
||||||
return out.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object o) {
|
public boolean equals(Object o) {
|
||||||
if (this == o) return true;
|
if (this == o) return true;
|
||||||
|
@ -89,22 +89,16 @@ public class Label implements Symbol {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return getAsString();
|
return toString(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAsTypedString(ProgramScope scope) {
|
public String toString(ProgramScope scope) {
|
||||||
return getTypedName();
|
if(scope==null) {
|
||||||
}
|
return getFullName();
|
||||||
|
} else {
|
||||||
@Override
|
return "("+getType().getTypeName() + ") "+getFullName();
|
||||||
@JsonIgnore
|
}
|
||||||
public String getAsString() {
|
|
||||||
return getFullName();
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getTypedName() {
|
|
||||||
return "("+getType().getTypeName() + ") "+getFullName();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
|
@ -30,16 +30,12 @@ public class PointerDereferenceIndexed implements PointerDereference {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return getAsString();
|
return toString(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAsTypedString(ProgramScope scope) {
|
public String toString(ProgramScope scope) {
|
||||||
return "*(" + pointer.getAsTypedString(scope) + " + " +index.getAsTypedString(scope) + ')';
|
return "*(" + pointer.toString(scope) + " + " +index.toString(scope) + ')';
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getAsString() {
|
|
||||||
return "*(" + pointer.getAsString() + " + " +index.getAsString() + ')';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -19,17 +19,12 @@ public class PointerDereferenceSimple implements PointerDereference {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return getAsString();
|
return toString(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAsTypedString(ProgramScope scope) {
|
public String toString(ProgramScope scope) {
|
||||||
return "*(" + pointer.getAsTypedString(scope) + ')';
|
return "*(" + pointer.toString(scope) + ')';
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getAsString() {
|
|
||||||
return "*(" + pointer.getAsString() + ')';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -71,29 +71,11 @@ public class Procedure extends Scope {
|
|||||||
return super.getFullName();
|
return super.getFullName();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public String getSymbolTableContents(ProgramScope scope) {
|
||||||
public String getTypedName() {
|
|
||||||
StringBuilder res = new StringBuilder();
|
StringBuilder res = new StringBuilder();
|
||||||
res.append("("+getType().getTypeName() + ") ");
|
res.append(toString(scope));
|
||||||
res.append(getFullName());
|
|
||||||
res.append("(");
|
|
||||||
boolean first = true;
|
|
||||||
if(parameterNames !=null) {
|
|
||||||
for (Variable parameter : getParameters()) {
|
|
||||||
if (!first) res.append(" , ");
|
|
||||||
first = false;
|
|
||||||
res.append(parameter.getTypedName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
res.append(")");
|
|
||||||
return res.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getSymbolTableContents() {
|
|
||||||
StringBuilder res = new StringBuilder();
|
|
||||||
res.append(getTypedName());
|
|
||||||
res.append("\n");
|
res.append("\n");
|
||||||
res.append(super.getSymbolTableContents());
|
res.append(super.getSymbolTableContents(scope));
|
||||||
return res.toString();
|
return res.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -102,8 +84,6 @@ public class Procedure extends Scope {
|
|||||||
return new SymbolTypeProcedure(returnType);
|
return new SymbolTypeProcedure(returnType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
RegisterAllocation getAllocation() {
|
RegisterAllocation getAllocation() {
|
||||||
if(getScope()!=null) {
|
if(getScope()!=null) {
|
||||||
@ -115,18 +95,25 @@ public class Procedure extends Scope {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return getTypedName();
|
return toString(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAsTypedString(ProgramScope scope) {
|
public String toString(ProgramScope scope) {
|
||||||
return getTypedName();
|
StringBuilder res = new StringBuilder();
|
||||||
}
|
res.append("("+getType().getTypeName() + ") ");
|
||||||
|
res.append(getFullName());
|
||||||
@Override
|
res.append("(");
|
||||||
@JsonIgnore
|
boolean first = true;
|
||||||
public String getAsString() {
|
if(parameterNames !=null) {
|
||||||
return getTypedName();
|
for (Variable parameter : getParameters()) {
|
||||||
|
if (!first) res.append(" , ");
|
||||||
|
first = false;
|
||||||
|
res.append(parameter.toString(scope));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
res.append(")");
|
||||||
|
return res.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
|
@ -72,14 +72,14 @@ public class ProgramScope extends Scope {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@JsonIgnore
|
||||||
public String getAsTypedString(ProgramScope scope) {
|
public String getSymbolTableContents() {
|
||||||
return getAsString();
|
return getSymbolTableContents(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@JsonIgnore
|
public String toString(ProgramScope scope) {
|
||||||
public String getAsString() {
|
|
||||||
return "program";
|
return "program";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -84,14 +84,10 @@ public class RegisterAllocation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAsTypedString(ProgramScope scope) {
|
public String toString(ProgramScope scope) {
|
||||||
return toString();
|
return toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getAsString() {
|
|
||||||
return toString();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Two zero page addresses used as a register for a single word variable. */
|
/** Two zero page addresses used as a register for a single word variable. */
|
||||||
@ -131,14 +127,10 @@ public class RegisterAllocation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAsTypedString(ProgramScope scope) {
|
public String toString(ProgramScope scope) {
|
||||||
return toString();
|
return toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getAsString() {
|
|
||||||
return toString();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -178,14 +170,10 @@ public class RegisterAllocation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAsTypedString(ProgramScope scope) {
|
public String toString(ProgramScope scope) {
|
||||||
return toString();
|
return toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getAsString() {
|
|
||||||
return toString();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** A zro page address pair used as a register containing a pointer to a byte. */
|
/** A zro page address pair used as a register containing a pointer to a byte. */
|
||||||
@ -224,14 +212,10 @@ public class RegisterAllocation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAsTypedString(ProgramScope scope) {
|
public String toString(ProgramScope scope) {
|
||||||
return toString();
|
return toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getAsString() {
|
|
||||||
return toString();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -255,14 +239,10 @@ public class RegisterAllocation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAsTypedString(ProgramScope scope) {
|
public String toString(ProgramScope scope) {
|
||||||
return toString();
|
return toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getAsString() {
|
|
||||||
return toString();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** The Y register. */
|
/** The Y register. */
|
||||||
@ -285,14 +265,10 @@ public class RegisterAllocation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAsTypedString(ProgramScope scope) {
|
public String toString(ProgramScope scope) {
|
||||||
return toString();
|
return toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getAsString() {
|
|
||||||
return toString();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** The A register. */
|
/** The A register. */
|
||||||
@ -315,14 +291,10 @@ public class RegisterAllocation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAsTypedString(ProgramScope scope) {
|
public String toString(ProgramScope scope) {
|
||||||
return toString();
|
return toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getAsString() {
|
|
||||||
return toString();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** The special ALU register. */
|
/** The special ALU register. */
|
||||||
@ -345,14 +317,10 @@ public class RegisterAllocation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAsTypedString(ProgramScope scope) {
|
public String toString(ProgramScope scope) {
|
||||||
return toString();
|
return toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getAsString() {
|
|
||||||
return toString();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Register getRegisterX() {
|
public static Register getRegisterX() {
|
||||||
|
@ -76,12 +76,6 @@ public abstract class Scope implements Symbol {
|
|||||||
return parentScope;
|
return parentScope;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
@JsonIgnore
|
|
||||||
public String getTypedName() {
|
|
||||||
return "(" + getType().getTypeName() + ") " + getFullName();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
public abstract SymbolType getType();
|
public abstract SymbolType getType();
|
||||||
@ -148,7 +142,6 @@ public abstract class Scope implements Symbol {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public Variable getVariable(String name) {
|
public Variable getVariable(String name) {
|
||||||
return (Variable) getSymbol(name);
|
return (Variable) getSymbol(name);
|
||||||
}
|
}
|
||||||
@ -215,7 +208,7 @@ public abstract class Scope implements Symbol {
|
|||||||
abstract RegisterAllocation getAllocation();
|
abstract RegisterAllocation getAllocation();
|
||||||
|
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
public String getSymbolTableContents() {
|
public String getSymbolTableContents(ProgramScope scope) {
|
||||||
StringBuilder res = new StringBuilder();
|
StringBuilder res = new StringBuilder();
|
||||||
Set<String> names = symbols.keySet();
|
Set<String> names = symbols.keySet();
|
||||||
List<String> sortedNames = new ArrayList<>(names);
|
List<String> sortedNames = new ArrayList<>(names);
|
||||||
@ -224,9 +217,9 @@ public abstract class Scope implements Symbol {
|
|||||||
for (String name : sortedNames) {
|
for (String name : sortedNames) {
|
||||||
Symbol symbol = symbols.get(name);
|
Symbol symbol = symbols.get(name);
|
||||||
if (symbol instanceof Scope) {
|
if (symbol instanceof Scope) {
|
||||||
res.append(((Scope) symbol).getSymbolTableContents());
|
res.append(((Scope) symbol).getSymbolTableContents(scope));
|
||||||
} else {
|
} else {
|
||||||
res.append(symbol.getTypedName());
|
res.append(symbol.toString(scope));
|
||||||
}
|
}
|
||||||
if (symbol instanceof Variable && allocation!=null) {
|
if (symbol instanceof Variable && allocation!=null) {
|
||||||
RegisterAllocation.Register register = allocation.getRegister((Variable) symbol);
|
RegisterAllocation.Register register = allocation.getRegister((Variable) symbol);
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package dk.camelot64.kickc.icl;
|
package dk.camelot64.kickc.icl;
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
|
||||||
import com.fasterxml.jackson.annotation.JsonSubTypes;
|
import com.fasterxml.jackson.annotation.JsonSubTypes;
|
||||||
import com.fasterxml.jackson.annotation.JsonTypeInfo;
|
import com.fasterxml.jackson.annotation.JsonTypeInfo;
|
||||||
|
|
||||||
@ -22,9 +21,6 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo;
|
|||||||
})
|
})
|
||||||
public interface Statement {
|
public interface Statement {
|
||||||
|
|
||||||
String getAsTypedString(ProgramScope scope);
|
String toString(ProgramScope scope);
|
||||||
|
|
||||||
@JsonIgnore
|
|
||||||
String getAsString();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -89,25 +89,16 @@ public class StatementAssignment implements StatementLValue {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return getAsString();
|
return toString(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAsTypedString(ProgramScope scope) {
|
public String toString(ProgramScope scope) {
|
||||||
return
|
return
|
||||||
lValue.getAsTypedString(scope) + " ← " +
|
lValue.toString(scope) + " ← " +
|
||||||
(rValue1==null?"":rValue1.getAsTypedString(scope)+" ") +
|
(rValue1==null?"":rValue1.toString(scope)+" ") +
|
||||||
(operator==null?"":operator+" ") +
|
(operator==null?"":operator+" ") +
|
||||||
rValue2 .getAsTypedString(scope);
|
rValue2.toString(scope);
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getAsString() {
|
|
||||||
return
|
|
||||||
lValue.getAsString() + " ← " +
|
|
||||||
(rValue1==null?"":rValue1.getAsString()+" ") +
|
|
||||||
(operator==null?"":operator+" ") +
|
|
||||||
rValue2.getAsString() ;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -94,14 +94,14 @@ public class StatementCall implements StatementLValue {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return getAsString();
|
return toString(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAsTypedString(ProgramScope scope) {
|
public String toString(ProgramScope scope) {
|
||||||
StringBuilder res = new StringBuilder();
|
StringBuilder res = new StringBuilder();
|
||||||
if(lValue!=null) {
|
if(lValue!=null) {
|
||||||
res.append(lValue.getAsTypedString(scope));
|
res.append(lValue.toString(scope));
|
||||||
res.append(" ← ");
|
res.append(" ← ");
|
||||||
}
|
}
|
||||||
res.append("call ");
|
res.append("call ");
|
||||||
@ -112,31 +112,7 @@ public class StatementCall implements StatementLValue {
|
|||||||
}
|
}
|
||||||
if(parameters!=null) {
|
if(parameters!=null) {
|
||||||
for (RValue parameter : parameters) {
|
for (RValue parameter : parameters) {
|
||||||
res.append(parameter.getAsTypedString(scope) + " ");
|
res.append(parameter.toString(scope) + " ");
|
||||||
}
|
|
||||||
}
|
|
||||||
if(parametersByAssignment) {
|
|
||||||
res.append("param-assignment");
|
|
||||||
}
|
|
||||||
return res.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getAsString() {
|
|
||||||
StringBuilder res = new StringBuilder();
|
|
||||||
if(lValue!=null) {
|
|
||||||
res.append(lValue.getAsString());
|
|
||||||
res.append(" ← ");
|
|
||||||
}
|
|
||||||
res.append("call ");
|
|
||||||
if(procedure!=null) {
|
|
||||||
res.append(procedure.getFullName()+ " ");
|
|
||||||
} else {
|
|
||||||
res.append(procedureName + " ");
|
|
||||||
}
|
|
||||||
if(parameters!=null) {
|
|
||||||
for (RValue parameter : parameters) {
|
|
||||||
res.append(parameter.getAsString() + " ");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(parametersByAssignment) {
|
if(parametersByAssignment) {
|
||||||
|
@ -72,32 +72,18 @@ public class StatementConditionalJump implements Statement {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return getAsString();
|
return toString(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAsTypedString(ProgramScope scope) {
|
public String toString(ProgramScope scope) {
|
||||||
StringBuilder out = new StringBuilder();
|
StringBuilder out = new StringBuilder();
|
||||||
out.append("if(");
|
out.append("if(");
|
||||||
if(rValue1!=null) {
|
if(rValue1!=null) {
|
||||||
out.append(rValue1.getAsTypedString(scope));
|
out.append(rValue1.toString(scope));
|
||||||
out.append(operator.getOperator());
|
out.append(operator.getOperator());
|
||||||
}
|
}
|
||||||
out.append(rValue2.getAsTypedString(scope));
|
out.append(rValue2.toString(scope));
|
||||||
out.append(") goto ");
|
|
||||||
out.append(destination.getFullName());
|
|
||||||
return out.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getAsString() {
|
|
||||||
StringBuilder out = new StringBuilder();
|
|
||||||
out.append("if(");
|
|
||||||
if(rValue1!=null) {
|
|
||||||
out.append(rValue1.getAsString());
|
|
||||||
out.append(operator.getOperator());
|
|
||||||
}
|
|
||||||
out.append(rValue2.getAsString());
|
|
||||||
out.append(") goto ");
|
out.append(") goto ");
|
||||||
out.append(destination.getFullName());
|
out.append(destination.getFullName());
|
||||||
return out.toString();
|
return out.toString();
|
||||||
|
@ -24,16 +24,11 @@ public class StatementJump implements Statement {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return getAsString();
|
return toString(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAsTypedString(ProgramScope scope) {
|
public String toString(ProgramScope scope) {
|
||||||
return getAsString();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getAsString() {
|
|
||||||
return "goto "+destination.getFullName();
|
return "goto "+destination.getFullName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,16 +17,12 @@ public class StatementLabel implements Statement {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return getAsString();
|
return toString(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAsTypedString(ProgramScope scope) {
|
public String toString(ProgramScope scope) {
|
||||||
return getAsString();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getAsString() {
|
|
||||||
return label.getFullName() + ":";
|
return label.getFullName() + ":";
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -70,43 +70,19 @@ public class StatementPhiBlock implements Statement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAsTypedString(ProgramScope scope) {
|
public String toString(ProgramScope scope) {
|
||||||
StringBuilder s = new StringBuilder();
|
StringBuilder s = new StringBuilder();
|
||||||
List<PhiVariable> variables = new ArrayList<>(phiVariables);
|
List<PhiVariable> variables = new ArrayList<>(phiVariables);
|
||||||
Collections.reverse(variables);
|
Collections.reverse(variables);
|
||||||
for (PhiVariable phiVariable : variables) {
|
for (PhiVariable phiVariable : variables) {
|
||||||
s.append(phiVariable.getVariable().getAsTypedString(scope));
|
s.append(phiVariable.getVariable().toString(scope));
|
||||||
s.append(" ← phi(");
|
s.append(" ← phi(");
|
||||||
for (PhiRValue phiRValue : phiVariable.getValues()) {
|
for (PhiRValue phiRValue : phiVariable.getValues()) {
|
||||||
s.append(" ");
|
s.append(" ");
|
||||||
s.append(phiRValue.getPredecessor().getAsString());
|
s.append(phiRValue.getPredecessor().toString(null));
|
||||||
s.append("/");
|
s.append("/");
|
||||||
RValue rValue = phiRValue.getrValue();
|
RValue rValue = phiRValue.getrValue();
|
||||||
s.append(rValue==null?"null":rValue.getAsTypedString(scope));
|
s.append(rValue==null?"null":rValue.toString(scope));
|
||||||
}
|
|
||||||
s.append(" )\n ");
|
|
||||||
}
|
|
||||||
if(s.length()>0) {
|
|
||||||
return s.toString().substring(0, s.length() - 3);
|
|
||||||
} else {
|
|
||||||
return s.toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getAsString() {
|
|
||||||
StringBuilder s = new StringBuilder();
|
|
||||||
List<PhiVariable> variables = new ArrayList<>(phiVariables);
|
|
||||||
Collections.reverse(variables);
|
|
||||||
for (PhiVariable phiVariable : variables) {
|
|
||||||
s.append(phiVariable.getVariable().getAsString());
|
|
||||||
s.append(" ← phi(");
|
|
||||||
for (PhiRValue phiRValue : phiVariable.getValues()) {
|
|
||||||
s.append(" ");
|
|
||||||
s.append(phiRValue.getPredecessor().getAsString());
|
|
||||||
s.append("/");
|
|
||||||
RValue rValue = phiRValue.getrValue();
|
|
||||||
s.append(rValue==null?"null":rValue.getAsString());
|
|
||||||
}
|
}
|
||||||
s.append(" )\n ");
|
s.append(" )\n ");
|
||||||
}
|
}
|
||||||
|
@ -30,16 +30,12 @@ public class StatementProcedureBegin implements Statement {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return getAsString();
|
return toString(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAsTypedString(ProgramScope scope) {
|
public String toString(ProgramScope scope) {
|
||||||
return "proc " + procedure.getAsTypedString(scope);
|
return "proc " + procedure.toString(scope);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getAsString() {
|
|
||||||
return "proc " + procedure.getAsString();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -15,15 +15,11 @@ public class StatementProcedureEnd implements Statement {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return getAsString();
|
return toString(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAsTypedString(ProgramScope scope) {
|
public String toString(ProgramScope scope) {
|
||||||
return getAsString();
|
return "endproc // "+procedure.getFullName()+"()";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getAsString() {
|
|
||||||
return "endproc // "+procedure.getFullName()+"()"; }
|
|
||||||
}
|
}
|
||||||
|
@ -26,16 +26,13 @@ public class StatementReturn implements Statement {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return getAsString();
|
return toString(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAsTypedString(ProgramScope scope) {
|
public String toString(ProgramScope scope) {
|
||||||
return "return "+(value==null?"":value.getAsTypedString(scope)); }
|
return "return " + (value == null ? "" : value.toString(scope));
|
||||||
|
}
|
||||||
@Override
|
|
||||||
public String getAsString() {
|
|
||||||
return "return "+(value==null?"":value.getAsString()); }
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object o) {
|
public boolean equals(Object o) {
|
||||||
|
@ -20,24 +20,13 @@ public class StatementSequence {
|
|||||||
return statements;
|
return statements;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getAsTypedString(ProgramScope scope) {
|
public String toString(ProgramScope scope) {
|
||||||
StringBuffer out = new StringBuffer();
|
StringBuffer out = new StringBuffer();
|
||||||
for (Statement statement : statements) {
|
for (Statement statement : statements) {
|
||||||
if(!(statement instanceof StatementLabel)) {
|
if(!(statement instanceof StatementLabel)) {
|
||||||
out.append(" ");
|
out.append(" ");
|
||||||
}
|
}
|
||||||
out.append(statement.getAsTypedString(scope)+"\n");
|
out.append(statement.toString(scope)+"\n");
|
||||||
}
|
|
||||||
return out.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getAsString() {
|
|
||||||
StringBuffer out = new StringBuffer();
|
|
||||||
for (Statement statement : statements) {
|
|
||||||
if(!(statement instanceof StatementLabel)) {
|
|
||||||
out.append(" ");
|
|
||||||
}
|
|
||||||
out.append(statement.getAsString()+"\n");
|
|
||||||
}
|
}
|
||||||
return out.toString();
|
return out.toString();
|
||||||
}
|
}
|
||||||
|
@ -11,9 +11,6 @@ public interface Symbol extends Value {
|
|||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
String getFullName();
|
String getFullName();
|
||||||
|
|
||||||
@JsonIgnore
|
|
||||||
String getTypedName();
|
|
||||||
|
|
||||||
SymbolType getType();
|
SymbolType getType();
|
||||||
|
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
|
@ -40,14 +40,12 @@ public class SymbolRef implements Value {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAsTypedString(ProgramScope scope) {
|
public String toString(ProgramScope scope) {
|
||||||
return scope.getSymbol(fullName).getTypedName();
|
if (scope == null) {
|
||||||
}
|
return fullName;
|
||||||
|
} else {
|
||||||
@Override
|
return scope.getSymbol(fullName).toString(scope);
|
||||||
@JsonIgnore
|
}
|
||||||
public String getAsString() {
|
|
||||||
return fullName;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
|
@ -24,8 +24,6 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo;
|
|||||||
})
|
})
|
||||||
public interface Value {
|
public interface Value {
|
||||||
|
|
||||||
String getAsTypedString(ProgramScope scope);
|
String toString(ProgramScope scope);
|
||||||
|
|
||||||
String getAsString();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -45,12 +45,6 @@ public abstract class Variable implements Symbol {
|
|||||||
return Scope.getFullName(this);
|
return Scope.getFullName(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
@JsonIgnore
|
|
||||||
public String getTypedName() {
|
|
||||||
return "(" + type.getTypeName() + (inferredType ? "~" : "") + ") " + getFullName();
|
|
||||||
}
|
|
||||||
|
|
||||||
public SymbolType getType() {
|
public SymbolType getType() {
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
@ -120,18 +114,12 @@ public abstract class Variable implements Symbol {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return getTypedName();
|
return toString(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAsTypedString(ProgramScope scope) {
|
public String toString(ProgramScope scope) {
|
||||||
return getTypedName();
|
return "(" + type.getTypeName() + (inferredType ? "~" : "") + ") " + getFullName();
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@JsonIgnore
|
|
||||||
public String getAsString() {
|
|
||||||
return getTypedName();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
|
@ -30,7 +30,7 @@ public class Pass1GenerateSingleStaticAssignmentForm {
|
|||||||
do {
|
do {
|
||||||
log.append("Completing Phi functions...");
|
log.append("Completing Phi functions...");
|
||||||
done = completePhiFunctions();
|
done = completePhiFunctions();
|
||||||
//log.append(this.controlFlowGraph.getAsTypedString(symbols));
|
//log.append(this.controlFlowGraph.toString(symbols));
|
||||||
} while (!done);
|
} while (!done);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -462,7 +462,7 @@ public class Pass1GenerateStatementSequence extends KickCBaseVisitor<Object> {
|
|||||||
for (PrePostModifier mod : modifiers) {
|
for (PrePostModifier mod : modifiers) {
|
||||||
Statement stmt = new StatementAssignment((LValue) mod.child, mod.operator, mod.child);
|
Statement stmt = new StatementAssignment((LValue) mod.child, mod.operator, mod.child);
|
||||||
parser.sequence.addStatement(stmt);
|
parser.sequence.addStatement(stmt);
|
||||||
parser.log.append("Adding pre/post-modifier "+stmt.getAsTypedString(parser.programScope));
|
parser.log.append("Adding pre/post-modifier "+stmt.toString(parser.programScope));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,7 +2,6 @@ package dk.camelot64.kickc.passes;
|
|||||||
|
|
||||||
import dk.camelot64.kickc.CompileLog;
|
import dk.camelot64.kickc.CompileLog;
|
||||||
import dk.camelot64.kickc.icl.*;
|
import dk.camelot64.kickc.icl.*;
|
||||||
import javafx.scene.input.InputMethodTextRun;
|
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
@ -26,10 +25,10 @@ public class Pass2AliasElimination extends Pass2SsaOptimization {
|
|||||||
replaceVariables(aliases.getReplacements());
|
replaceVariables(aliases.getReplacements());
|
||||||
for (AliasSet aliasSet : aliases.getAliasSets()) {
|
for (AliasSet aliasSet : aliases.getAliasSets()) {
|
||||||
StringBuilder str = new StringBuilder();
|
StringBuilder str = new StringBuilder();
|
||||||
str.append(aliasSet.getKeepVar().getAsTypedString(getSymbols()));
|
str.append(aliasSet.getKeepVar().toString(getSymbols()));
|
||||||
str.append(" = ");
|
str.append(" = ");
|
||||||
for (VariableRef var : aliasSet.getEliminateVars()) {
|
for (VariableRef var : aliasSet.getEliminateVars()) {
|
||||||
str.append(var.getAsTypedString(getSymbols()) + " ");
|
str.append(var.toString(getSymbols()) + " ");
|
||||||
}
|
}
|
||||||
log.append("Alias " + str);
|
log.append("Alias " + str);
|
||||||
}
|
}
|
||||||
@ -239,7 +238,7 @@ public class Pass2AliasElimination extends Pass2SsaOptimization {
|
|||||||
for (StatementPhiBlock.PhiRValue phiRValue : phiVariable.getValues()) {
|
for (StatementPhiBlock.PhiRValue phiRValue : phiVariable.getValues()) {
|
||||||
RValue rValue = phiRValue.getrValue();
|
RValue rValue = phiRValue.getrValue();
|
||||||
if (aliasSet.contains(rValue)) {
|
if (aliasSet.contains(rValue)) {
|
||||||
log.append("Alias candidate removed " + rValue.getAsTypedString(getSymbols()));
|
log.append("Alias candidate removed " + rValue.toString(getSymbols()));
|
||||||
aliasSet.remove(rValue);
|
aliasSet.remove(rValue);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -56,7 +56,7 @@ public class Pass2ConditionalJumpSimplification extends Pass2SsaOptimization {
|
|||||||
conditionalJump.setOperator(conditionAssignment.getOperator());
|
conditionalJump.setOperator(conditionAssignment.getOperator());
|
||||||
conditionalJump.setRValue2(conditionAssignment.getrValue2());
|
conditionalJump.setRValue2(conditionAssignment.getrValue2());
|
||||||
simpleConditionVars.add(conditionVar);
|
simpleConditionVars.add(conditionVar);
|
||||||
log.append("Simple Condition " + conditionVar.getAsTypedString(getSymbols()) + " " + conditionalJump.getAsTypedString(getSymbols()));
|
log.append("Simple Condition " + conditionVar.toString(getSymbols()) + " " + conditionalJump.toString(getSymbols()));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
|
@ -145,7 +145,7 @@ public class Pass2ConstantAdditionElimination extends Pass2SsaOptimization {
|
|||||||
*/
|
*/
|
||||||
private ConstantInteger consolidateSubConstants(VariableRef variable) {
|
private ConstantInteger consolidateSubConstants(VariableRef variable) {
|
||||||
if(getUsages(variable) >1) {
|
if(getUsages(variable) >1) {
|
||||||
log.append("Multiple usages for variable. Not optimizing sub-constant "+variable.getAsTypedString(getSymbols()));
|
log.append("Multiple usages for variable. Not optimizing sub-constant "+variable.toString(getSymbols()));
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
Variable var = getSymbols().getVariable(variable);
|
Variable var = getSymbols().getVariable(variable);
|
||||||
|
@ -22,7 +22,7 @@ public class Pass2ConstantPropagation extends Pass2SsaOptimization {
|
|||||||
final Map<VariableRef, Constant> constants = findConstantVariables();
|
final Map<VariableRef, Constant> constants = findConstantVariables();
|
||||||
for (VariableRef constantVar : constants.keySet()) {
|
for (VariableRef constantVar : constants.keySet()) {
|
||||||
Constant constantValue = constants.get(constantVar);
|
Constant constantValue = constants.get(constantVar);
|
||||||
log.append("Constant " + constantVar.getAsTypedString(getSymbols()) + " " + constantValue.getAsTypedString(getSymbols()));
|
log.append("Constant " + constantVar.toString(getSymbols()) + " " + constantValue.toString(getSymbols()));
|
||||||
}
|
}
|
||||||
removeAssignments(constants.keySet());
|
removeAssignments(constants.keySet());
|
||||||
deleteVariables(constants.keySet());
|
deleteVariables(constants.keySet());
|
||||||
|
@ -68,7 +68,7 @@ public class Pass2CullEmptyBlocks extends Pass2SsaOptimization {
|
|||||||
LabelRef removeBlockLabelRef = removeBlock.getLabel();
|
LabelRef removeBlockLabelRef = removeBlock.getLabel();
|
||||||
Label removeBlockLabel = getSymbols().getLabel(removeBlockLabelRef);
|
Label removeBlockLabel = getSymbols().getLabel(removeBlockLabelRef);
|
||||||
removeBlockLabel.getScope().remove(removeBlockLabel);
|
removeBlockLabel.getScope().remove(removeBlockLabel);
|
||||||
log.append("Culled Empty Block " + removeBlockLabel.getTypedName());
|
log.append("Culled Empty Block " + removeBlockLabel.toString(getSymbols()));
|
||||||
}
|
}
|
||||||
return remove.size()>0;
|
return remove.size()>0;
|
||||||
}
|
}
|
||||||
|
@ -23,7 +23,7 @@ public class Pass2RedundantPhiElimination extends Pass2SsaOptimization {
|
|||||||
replaceVariables(aliases);
|
replaceVariables(aliases);
|
||||||
for (VariableRef var : aliases.keySet()) {
|
for (VariableRef var : aliases.keySet()) {
|
||||||
RValue alias = aliases.get(var);
|
RValue alias = aliases.get(var);
|
||||||
log.append("Redundant Phi " + var.getAsTypedString(getSymbols()) + " " + alias.getAsTypedString(getSymbols()));
|
log.append("Redundant Phi " + var.toString(getSymbols()) + " " + alias.toString(getSymbols()));
|
||||||
}
|
}
|
||||||
deleteVariables(aliases.keySet());
|
deleteVariables(aliases.keySet());
|
||||||
return aliases.size()>0;
|
return aliases.size()>0;
|
||||||
|
@ -28,7 +28,7 @@ public class Pass2SelfPhiElimination extends Pass2SsaOptimization {
|
|||||||
if (phiRValue.getrValue().equals(phiVariable.getVariable())) {
|
if (phiRValue.getrValue().equals(phiVariable.getVariable())) {
|
||||||
iterator.remove();
|
iterator.remove();
|
||||||
optimized[0] = Boolean.TRUE;
|
optimized[0] = Boolean.TRUE;
|
||||||
log.append("Self Phi Eliminated "+phiVariable.getVariable().getAsTypedString(getSymbols()));
|
log.append("Self Phi Eliminated "+phiVariable.getVariable().toString(getSymbols()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -46,18 +46,14 @@ public abstract class Pass2SsaOptimization {
|
|||||||
public static RValue VOID = new RValue() {
|
public static RValue VOID = new RValue() {
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return getAsString();
|
return toString(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAsTypedString(ProgramScope scope) {
|
public String toString(ProgramScope scope) {
|
||||||
return getAsString();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getAsString() {
|
|
||||||
return "VOID";
|
return "VOID";
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -62,19 +62,19 @@ public class Pass3CodeGeneration {
|
|||||||
}
|
}
|
||||||
assignment = (StatementAssignment) statement;
|
assignment = (StatementAssignment) statement;
|
||||||
AsmFragment asmFragment = new AsmFragment(assignment, assignmentAlu, symbols);
|
AsmFragment asmFragment = new AsmFragment(assignment, assignmentAlu, symbols);
|
||||||
asm.addComment(statement.getAsTypedString(symbols) + " // " + asmFragment.getSignature());
|
asm.addComment(statement.toString(symbols) + " // " + asmFragment.getSignature());
|
||||||
asmFragment.generate(asm);
|
asmFragment.generate(asm);
|
||||||
isAlu = true;
|
isAlu = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!isAlu) {
|
if (!isAlu) {
|
||||||
AsmFragment asmFragment = new AsmFragment(assignment, symbols);
|
AsmFragment asmFragment = new AsmFragment(assignment, symbols);
|
||||||
asm.addComment(statement.getAsTypedString(symbols) + " // " + asmFragment.getSignature());
|
asm.addComment(statement.toString(symbols) + " // " + asmFragment.getSignature());
|
||||||
asmFragment.generate(asm);
|
asmFragment.generate(asm);
|
||||||
}
|
}
|
||||||
} else if (statement instanceof StatementConditionalJump) {
|
} else if (statement instanceof StatementConditionalJump) {
|
||||||
AsmFragment asmFragment = new AsmFragment((StatementConditionalJump) statement, block, symbols, graph);
|
AsmFragment asmFragment = new AsmFragment((StatementConditionalJump) statement, block, symbols, graph);
|
||||||
asm.addComment(statement.getAsTypedString(symbols) + " // " + asmFragment.getSignature());
|
asm.addComment(statement.toString(symbols) + " // " + asmFragment.getSignature());
|
||||||
asmFragment.generate(asm);
|
asmFragment.generate(asm);
|
||||||
} else if (statement instanceof StatementCall) {
|
} else if (statement instanceof StatementCall) {
|
||||||
StatementCall call = (StatementCall) statement;
|
StatementCall call = (StatementCall) statement;
|
||||||
@ -147,11 +147,11 @@ public class Pass3CodeGeneration {
|
|||||||
private void genAsmMove(AsmProgram asm, LValue lValue, RValue rValue) {
|
private void genAsmMove(AsmProgram asm, LValue lValue, RValue rValue) {
|
||||||
if (getRegister(lValue).equals(getRegister(rValue))) {
|
if (getRegister(lValue).equals(getRegister(rValue))) {
|
||||||
// Do not move from register to itself
|
// Do not move from register to itself
|
||||||
asm.addComment(lValue.getAsTypedString(symbols) + " = " + rValue.getAsTypedString(symbols) + " // register copy ");
|
asm.addComment(lValue.toString(symbols) + " = " + rValue.toString(symbols) + " // register copy ");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
AsmFragment asmFragment = new AsmFragment(lValue, rValue, symbols);
|
AsmFragment asmFragment = new AsmFragment(lValue, rValue, symbols);
|
||||||
asm.addComment(lValue.getAsTypedString(symbols) + " = " + rValue.getAsTypedString(symbols) + " // " + asmFragment.getSignature());
|
asm.addComment(lValue.toString(symbols) + " = " + rValue.toString(symbols) + " // " + asmFragment.getSignature());
|
||||||
asmFragment.generate(asm);
|
asmFragment.generate(asm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -63,7 +63,7 @@ public class TestCompilationOutput extends TestCase {
|
|||||||
boolean success = true;
|
boolean success = true;
|
||||||
success &= testOutput(fileName, ".asm", output.getAsmProgram().toString(false));
|
success &= testOutput(fileName, ".asm", output.getAsmProgram().toString(false));
|
||||||
success &= testOutput(fileName, ".sym", output.getSymbols().getSymbolTableContents());
|
success &= testOutput(fileName, ".sym", output.getSymbols().getSymbolTableContents());
|
||||||
success &= testOutput(fileName, ".cfg", output.getGraph().getAsTypedString(output.getSymbols()));
|
success &= testOutput(fileName, ".cfg", output.getGraph().toString(output.getSymbols()));
|
||||||
success &= testOutput(fileName, ".log", output.getLog().toString());
|
success &= testOutput(fileName, ".log", output.getLog().toString());
|
||||||
if(!success) {
|
if(!success) {
|
||||||
fail("Output does not match reference!");
|
fail("Output does not match reference!");
|
||||||
|
Loading…
Reference in New Issue
Block a user