1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-08-02 09:29:35 +00:00

Refactored toString to avoid redundant code.

This commit is contained in:
jespergravgaard 2017-07-24 08:19:44 +02:00
parent 300bb644b9
commit 524252105a
42 changed files with 156 additions and 393 deletions

View File

@ -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;
} }

View File

@ -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() + ')';
}
} }

View File

@ -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);
}
} }

View File

@ -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);
}
} }

View File

@ -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

View File

@ -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+"\\"; }
} }
} }

View File

@ -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:");

View File

@ -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;

View File

@ -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

View File

@ -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() + ')';
}
} }

View File

@ -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() + ')';
} }
} }

View File

@ -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

View File

@ -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";
} }

View File

@ -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() {

View File

@ -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);

View File

@ -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();
} }

View File

@ -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

View File

@ -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) {

View File

@ -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();

View File

@ -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();
} }

View File

@ -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() + ":";
} }
} }

View File

@ -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 ");
} }

View File

@ -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();
}
} }

View File

@ -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()+"()"; }
} }

View File

@ -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) {

View File

@ -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();
} }

View File

@ -11,9 +11,6 @@ public interface Symbol extends Value {
@JsonIgnore @JsonIgnore
String getFullName(); String getFullName();
@JsonIgnore
String getTypedName();
SymbolType getType(); SymbolType getType();
@JsonIgnore @JsonIgnore

View File

@ -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

View File

@ -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();
} }

View File

@ -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

View File

@ -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);
} }

View File

@ -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));
} }
} }

View File

@ -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;
} }

View File

@ -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:
} }

View File

@ -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);

View File

@ -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());

View File

@ -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;
} }

View File

@ -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;

View File

@ -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()));
} }
} }
} }

View File

@ -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";
} }
}; };
/** /**

View File

@ -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);
} }

View File

@ -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!");