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() + "");
ssaOptimized = true;
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);
log.append("PROGRAM");
log.append(statementSequence.getAsTypedString(programScope));
log.append(statementSequence.toString(programScope));
log.append("SYMBOLS");
log.append(programScope.getSymbolTableContents());
@ -148,26 +148,26 @@ public class Compiler {
Program program = new Program(programScope, controlFlowGraph);
log.append("INITIAL CONTROL FLOW GRAPH");
log.append(program.getGraph().getAsTypedString(program.getScope()));
log.append(program.getGraph().toString(program.getScope()));
Pass1ProcedureCallParameters pass1ProcedureCallParameters =
new Pass1ProcedureCallParameters(program);
program.setGraph(pass1ProcedureCallParameters.generate());
log.append("CONTROL FLOW GRAPH WITH ASSIGNMENT CALL");
log.append(program.getGraph().getAsTypedString(program.getScope()));
log.append(program.getGraph().toString(program.getScope()));
Pass1GenerateSingleStaticAssignmentForm pass1GenerateSingleStaticAssignmentForm =
new Pass1GenerateSingleStaticAssignmentForm(log, program);
pass1GenerateSingleStaticAssignmentForm.generate();
log.append("CONTROL FLOW GRAPH SSA");
log.append(program.getGraph().getAsTypedString(program.getScope()));
log.append(program.getGraph().toString(program.getScope()));
Pass1ProcedureCallsReturnValue pass1ProcedureCallsReturnValue =
new Pass1ProcedureCallsReturnValue(program);
program.setGraph(pass1ProcedureCallsReturnValue.generate());
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;
}

View File

@ -23,16 +23,12 @@ public class PointerDereferenceRegisterZpByte implements PointerDereference {
@Override
public String toString() {
return getAsString();
return toString(null);
}
@Override
public String getAsTypedString(ProgramScope scope) {
return getAsString();
public String toString(ProgramScope scope) {
return "*(" + pointer.toString(scope) + ')';
}
@Override
public String getAsString() {
return "*(" + pointer.toString() + ')';
}
}

View File

@ -13,17 +13,17 @@ public class ConstantBool implements Constant {
@Override
public String toString() {
return getAsString();
return toString(null);
}
@Override
public String getAsTypedString(ProgramScope scope) {
return //"("+SymbolTypeBasic.BOOLEAN.getTypeName()+") "+
Boolean.toString(value);
public String toString(ProgramScope scope) {
if(scope==null) {
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
public String toString() {
return getAsString();
return toString(null);
}
@Override
public String getAsTypedString(ProgramScope scope) {
return "(" + SymbolTypeBasic.VOID.getTypeName() + ") " + Double.toString(number);
public String toString(ProgramScope scope) {
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
public String toString() {
return getAsString();
return toString(null);
}
@Override
public String getAsTypedString(ProgramScope scope) {
return "("+getType().getTypeName()+") "+Integer.toString(number); }
@Override
@JsonIgnore
public String getAsString() {
return Integer.toString(number);
public String toString(ProgramScope scope) {
if (scope == null) {
return Integer.toString(number);
} else {
return "(" + getType().getTypeName() + ") " + Integer.toString(number);
}
}
@Override

View File

@ -13,15 +13,16 @@ public class ConstantString implements Constant {
@Override
public String toString() {
return getAsString();
return toString(null);
}
@Override
public String getAsTypedString(ProgramScope scope) {
return "("+SymbolTypeBasic.STRING.getTypeName()+") "+"\\"+value+"\\"; }
@Override
public String getAsString() {
return "\\"+value+"\\";
public String toString(ProgramScope scope) {
if (scope == null) {
return "\\" + value + "\\";
} else {
return "(" + SymbolTypeBasic.STRING.getTypeName() + ") " + "\\" + value + "\\";
}
}
}

View File

@ -79,7 +79,7 @@ public class ControlFlowBlock {
return statements;
}
public String getAsTypedString(ControlFlowGraph graph, ProgramScope scope) {
public String toString(ControlFlowGraph graph, ProgramScope scope) {
StringBuffer out = new StringBuffer();
out.append(label.getFullName() + ":" );
out.append(" from");
@ -95,33 +95,7 @@ public class ControlFlowBlock {
}
out.append("\n");
for (Statement statement : statements) {
out.append(" "+statement.getAsTypedString(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");
out.append(" "+statement.toString(scope)+"\n");
}
if(defaultSuccessor!=null) {
out.append(" to:");

View File

@ -131,24 +131,14 @@ public class ControlFlowGraph {
return null;
}
public String getAsTypedString(ProgramScope scope) {
public String toString(ProgramScope scope) {
StringBuffer out = new StringBuffer();
for (ControlFlowBlock block : blocks.values()) {
out.append(block.getAsTypedString(this, scope));
out.append(block.toString(this, scope));
}
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
public boolean equals(Object o) {
if (this == o) return true;

View File

@ -89,22 +89,16 @@ public class Label implements Symbol {
@Override
public String toString() {
return getAsString();
return toString(null);
}
@Override
public String getAsTypedString(ProgramScope scope) {
return getTypedName();
}
@Override
@JsonIgnore
public String getAsString() {
return getFullName();
}
public String getTypedName() {
return "("+getType().getTypeName() + ") "+getFullName();
public String toString(ProgramScope scope) {
if(scope==null) {
return getFullName();
} else {
return "("+getType().getTypeName() + ") "+getFullName();
}
}
@JsonIgnore

View File

@ -30,16 +30,12 @@ public class PointerDereferenceIndexed implements PointerDereference {
@Override
public String toString() {
return getAsString();
return toString(null);
}
@Override
public String getAsTypedString(ProgramScope scope) {
return "*(" + pointer.getAsTypedString(scope) + " + " +index.getAsTypedString(scope) + ')';
public String toString(ProgramScope 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
public String toString() {
return getAsString();
return toString(null);
}
@Override
public String getAsTypedString(ProgramScope scope) {
return "*(" + pointer.getAsTypedString(scope) + ')';
}
@Override
public String getAsString() {
return "*(" + pointer.getAsString() + ')';
public String toString(ProgramScope scope) {
return "*(" + pointer.toString(scope) + ')';
}
}

View File

@ -71,29 +71,11 @@ public class Procedure extends Scope {
return super.getFullName();
}
@Override
public String getTypedName() {
public String getSymbolTableContents(ProgramScope scope) {
StringBuilder res = new StringBuilder();
res.append("("+getType().getTypeName() + ") ");
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(toString(scope));
res.append("\n");
res.append(super.getSymbolTableContents());
res.append(super.getSymbolTableContents(scope));
return res.toString();
}
@ -102,8 +84,6 @@ public class Procedure extends Scope {
return new SymbolTypeProcedure(returnType);
}
@Override
RegisterAllocation getAllocation() {
if(getScope()!=null) {
@ -115,18 +95,25 @@ public class Procedure extends Scope {
@Override
public String toString() {
return getTypedName();
return toString(null);
}
@Override
public String getAsTypedString(ProgramScope scope) {
return getTypedName();
}
@Override
@JsonIgnore
public String getAsString() {
return getTypedName();
public String toString(ProgramScope scope) {
StringBuilder res = new StringBuilder();
res.append("("+getType().getTypeName() + ") ");
res.append(getFullName());
res.append("(");
boolean first = true;
if(parameterNames !=null) {
for (Variable parameter : getParameters()) {
if (!first) res.append(" , ");
first = false;
res.append(parameter.toString(scope));
}
}
res.append(")");
return res.toString();
}
@JsonIgnore

View File

@ -72,14 +72,14 @@ public class ProgramScope extends Scope {
return result;
}
@Override
public String getAsTypedString(ProgramScope scope) {
return getAsString();
@JsonIgnore
public String getSymbolTableContents() {
return getSymbolTableContents(this);
}
@Override
@JsonIgnore
public String getAsString() {
public String toString(ProgramScope scope) {
return "program";
}

View File

@ -84,14 +84,10 @@ public class RegisterAllocation {
}
@Override
public String getAsTypedString(ProgramScope scope) {
public String toString(ProgramScope scope) {
return toString();
}
@Override
public String getAsString() {
return toString();
}
}
/** Two zero page addresses used as a register for a single word variable. */
@ -131,14 +127,10 @@ public class RegisterAllocation {
}
@Override
public String getAsTypedString(ProgramScope scope) {
public String toString(ProgramScope scope) {
return toString();
}
@Override
public String getAsString() {
return toString();
}
}
@ -178,14 +170,10 @@ public class RegisterAllocation {
}
@Override
public String getAsTypedString(ProgramScope scope) {
public String toString(ProgramScope scope) {
return toString();
}
@Override
public String getAsString() {
return toString();
}
}
/** A zro page address pair used as a register containing a pointer to a byte. */
@ -224,14 +212,10 @@ public class RegisterAllocation {
}
@Override
public String getAsTypedString(ProgramScope scope) {
public String toString(ProgramScope scope) {
return toString();
}
@Override
public String getAsString() {
return toString();
}
}
@ -255,14 +239,10 @@ public class RegisterAllocation {
}
@Override
public String getAsTypedString(ProgramScope scope) {
public String toString(ProgramScope scope) {
return toString();
}
@Override
public String getAsString() {
return toString();
}
}
/** The Y register. */
@ -285,14 +265,10 @@ public class RegisterAllocation {
}
@Override
public String getAsTypedString(ProgramScope scope) {
public String toString(ProgramScope scope) {
return toString();
}
@Override
public String getAsString() {
return toString();
}
}
/** The A register. */
@ -315,14 +291,10 @@ public class RegisterAllocation {
}
@Override
public String getAsTypedString(ProgramScope scope) {
public String toString(ProgramScope scope) {
return toString();
}
@Override
public String getAsString() {
return toString();
}
}
/** The special ALU register. */
@ -345,14 +317,10 @@ public class RegisterAllocation {
}
@Override
public String getAsTypedString(ProgramScope scope) {
public String toString(ProgramScope scope) {
return toString();
}
@Override
public String getAsString() {
return toString();
}
}
public static Register getRegisterX() {

View File

@ -76,12 +76,6 @@ public abstract class Scope implements Symbol {
return parentScope;
}
@Override
@JsonIgnore
public String getTypedName() {
return "(" + getType().getTypeName() + ") " + getFullName();
}
@Override
@JsonIgnore
public abstract SymbolType getType();
@ -148,7 +142,6 @@ public abstract class Scope implements Symbol {
}
}
public Variable getVariable(String name) {
return (Variable) getSymbol(name);
}
@ -215,7 +208,7 @@ public abstract class Scope implements Symbol {
abstract RegisterAllocation getAllocation();
@JsonIgnore
public String getSymbolTableContents() {
public String getSymbolTableContents(ProgramScope scope) {
StringBuilder res = new StringBuilder();
Set<String> names = symbols.keySet();
List<String> sortedNames = new ArrayList<>(names);
@ -224,9 +217,9 @@ public abstract class Scope implements Symbol {
for (String name : sortedNames) {
Symbol symbol = symbols.get(name);
if (symbol instanceof Scope) {
res.append(((Scope) symbol).getSymbolTableContents());
res.append(((Scope) symbol).getSymbolTableContents(scope));
} else {
res.append(symbol.getTypedName());
res.append(symbol.toString(scope));
}
if (symbol instanceof Variable && allocation!=null) {
RegisterAllocation.Register register = allocation.getRegister((Variable) symbol);

View File

@ -1,6 +1,5 @@
package dk.camelot64.kickc.icl;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
@ -22,9 +21,6 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo;
})
public interface Statement {
String getAsTypedString(ProgramScope scope);
@JsonIgnore
String getAsString();
String toString(ProgramScope scope);
}

View File

@ -89,25 +89,16 @@ public class StatementAssignment implements StatementLValue {
@Override
public String toString() {
return getAsString();
return toString(null);
}
@Override
public String getAsTypedString(ProgramScope scope) {
public String toString(ProgramScope scope) {
return
lValue.getAsTypedString(scope) + "" +
(rValue1==null?"":rValue1.getAsTypedString(scope)+" ") +
lValue.toString(scope) + "" +
(rValue1==null?"":rValue1.toString(scope)+" ") +
(operator==null?"":operator+" ") +
rValue2 .getAsTypedString(scope);
}
@Override
public String getAsString() {
return
lValue.getAsString() + "" +
(rValue1==null?"":rValue1.getAsString()+" ") +
(operator==null?"":operator+" ") +
rValue2.getAsString() ;
rValue2.toString(scope);
}
@Override

View File

@ -94,14 +94,14 @@ public class StatementCall implements StatementLValue {
@Override
public String toString() {
return getAsString();
return toString(null);
}
@Override
public String getAsTypedString(ProgramScope scope) {
public String toString(ProgramScope scope) {
StringBuilder res = new StringBuilder();
if(lValue!=null) {
res.append(lValue.getAsTypedString(scope));
res.append(lValue.toString(scope));
res.append("");
}
res.append("call ");
@ -112,31 +112,7 @@ public class StatementCall implements StatementLValue {
}
if(parameters!=null) {
for (RValue parameter : parameters) {
res.append(parameter.getAsTypedString(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() + " ");
res.append(parameter.toString(scope) + " ");
}
}
if(parametersByAssignment) {

View File

@ -72,32 +72,18 @@ public class StatementConditionalJump implements Statement {
@Override
public String toString() {
return getAsString();
return toString(null);
}
@Override
public String getAsTypedString(ProgramScope scope) {
public String toString(ProgramScope scope) {
StringBuilder out = new StringBuilder();
out.append("if(");
if(rValue1!=null) {
out.append(rValue1.getAsTypedString(scope));
out.append(rValue1.toString(scope));
out.append(operator.getOperator());
}
out.append(rValue2.getAsTypedString(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(rValue2.toString(scope));
out.append(") goto ");
out.append(destination.getFullName());
return out.toString();

View File

@ -24,16 +24,11 @@ public class StatementJump implements Statement {
@Override
public String toString() {
return getAsString();
return toString(null);
}
@Override
public String getAsTypedString(ProgramScope scope) {
return getAsString();
}
@Override
public String getAsString() {
public String toString(ProgramScope scope) {
return "goto "+destination.getFullName();
}

View File

@ -17,16 +17,12 @@ public class StatementLabel implements Statement {
@Override
public String toString() {
return getAsString();
return toString(null);
}
@Override
public String getAsTypedString(ProgramScope scope) {
return getAsString();
}
@Override
public String getAsString() {
public String toString(ProgramScope scope) {
return label.getFullName() + ":";
}
}

View File

@ -70,43 +70,19 @@ public class StatementPhiBlock implements Statement {
}
@Override
public String getAsTypedString(ProgramScope scope) {
public String toString(ProgramScope scope) {
StringBuilder s = new StringBuilder();
List<PhiVariable> variables = new ArrayList<>(phiVariables);
Collections.reverse(variables);
for (PhiVariable phiVariable : variables) {
s.append(phiVariable.getVariable().getAsTypedString(scope));
s.append(phiVariable.getVariable().toString(scope));
s.append(" ← phi(");
for (PhiRValue phiRValue : phiVariable.getValues()) {
s.append(" ");
s.append(phiRValue.getPredecessor().getAsString());
s.append(phiRValue.getPredecessor().toString(null));
s.append("/");
RValue rValue = phiRValue.getrValue();
s.append(rValue==null?"null":rValue.getAsTypedString(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(rValue==null?"null":rValue.toString(scope));
}
s.append(" )\n ");
}

View File

@ -30,16 +30,12 @@ public class StatementProcedureBegin implements Statement {
@Override
public String toString() {
return getAsString();
return toString(null);
}
@Override
public String getAsTypedString(ProgramScope scope) {
return "proc " + procedure.getAsTypedString(scope);
public String toString(ProgramScope 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
public String toString() {
return getAsString();
return toString(null);
}
@Override
public String getAsTypedString(ProgramScope scope) {
return getAsString();
public String toString(ProgramScope scope) {
return "endproc // "+procedure.getFullName()+"()";
}
@Override
public String getAsString() {
return "endproc // "+procedure.getFullName()+"()"; }
}

View File

@ -26,16 +26,13 @@ public class StatementReturn implements Statement {
@Override
public String toString() {
return getAsString();
return toString(null);
}
@Override
public String getAsTypedString(ProgramScope scope) {
return "return "+(value==null?"":value.getAsTypedString(scope)); }
@Override
public String getAsString() {
return "return "+(value==null?"":value.getAsString()); }
public String toString(ProgramScope scope) {
return "return " + (value == null ? "" : value.toString(scope));
}
@Override
public boolean equals(Object o) {

View File

@ -20,24 +20,13 @@ public class StatementSequence {
return statements;
}
public String getAsTypedString(ProgramScope scope) {
public String toString(ProgramScope scope) {
StringBuffer out = new StringBuffer();
for (Statement statement : statements) {
if(!(statement instanceof StatementLabel)) {
out.append(" ");
}
out.append(statement.getAsTypedString(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");
out.append(statement.toString(scope)+"\n");
}
return out.toString();
}

View File

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

View File

@ -40,14 +40,12 @@ public class SymbolRef implements Value {
}
@Override
public String getAsTypedString(ProgramScope scope) {
return scope.getSymbol(fullName).getTypedName();
}
@Override
@JsonIgnore
public String getAsString() {
return fullName;
public String toString(ProgramScope scope) {
if (scope == null) {
return fullName;
} else {
return scope.getSymbol(fullName).toString(scope);
}
}
@JsonIgnore

View File

@ -24,8 +24,6 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo;
})
public interface Value {
String getAsTypedString(ProgramScope scope);
String getAsString();
String toString(ProgramScope scope);
}

View File

@ -45,12 +45,6 @@ public abstract class Variable implements Symbol {
return Scope.getFullName(this);
}
@Override
@JsonIgnore
public String getTypedName() {
return "(" + type.getTypeName() + (inferredType ? "~" : "") + ") " + getFullName();
}
public SymbolType getType() {
return type;
}
@ -120,18 +114,12 @@ public abstract class Variable implements Symbol {
@Override
public String toString() {
return getTypedName();
return toString(null);
}
@Override
public String getAsTypedString(ProgramScope scope) {
return getTypedName();
}
@Override
@JsonIgnore
public String getAsString() {
return getTypedName();
public String toString(ProgramScope scope) {
return "(" + type.getTypeName() + (inferredType ? "~" : "") + ") " + getFullName();
}
@JsonIgnore

View File

@ -30,7 +30,7 @@ public class Pass1GenerateSingleStaticAssignmentForm {
do {
log.append("Completing Phi functions...");
done = completePhiFunctions();
//log.append(this.controlFlowGraph.getAsTypedString(symbols));
//log.append(this.controlFlowGraph.toString(symbols));
} while (!done);
}

View File

@ -462,7 +462,7 @@ public class Pass1GenerateStatementSequence extends KickCBaseVisitor<Object> {
for (PrePostModifier mod : modifiers) {
Statement stmt = new StatementAssignment((LValue) mod.child, mod.operator, mod.child);
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.icl.*;
import javafx.scene.input.InputMethodTextRun;
import java.util.*;
@ -26,10 +25,10 @@ public class Pass2AliasElimination extends Pass2SsaOptimization {
replaceVariables(aliases.getReplacements());
for (AliasSet aliasSet : aliases.getAliasSets()) {
StringBuilder str = new StringBuilder();
str.append(aliasSet.getKeepVar().getAsTypedString(getSymbols()));
str.append(aliasSet.getKeepVar().toString(getSymbols()));
str.append(" = ");
for (VariableRef var : aliasSet.getEliminateVars()) {
str.append(var.getAsTypedString(getSymbols()) + " ");
str.append(var.toString(getSymbols()) + " ");
}
log.append("Alias " + str);
}
@ -239,7 +238,7 @@ public class Pass2AliasElimination extends Pass2SsaOptimization {
for (StatementPhiBlock.PhiRValue phiRValue : phiVariable.getValues()) {
RValue rValue = phiRValue.getrValue();
if (aliasSet.contains(rValue)) {
log.append("Alias candidate removed " + rValue.getAsTypedString(getSymbols()));
log.append("Alias candidate removed " + rValue.toString(getSymbols()));
aliasSet.remove(rValue);
break;
}

View File

@ -56,7 +56,7 @@ public class Pass2ConditionalJumpSimplification extends Pass2SsaOptimization {
conditionalJump.setOperator(conditionAssignment.getOperator());
conditionalJump.setRValue2(conditionAssignment.getrValue2());
simpleConditionVars.add(conditionVar);
log.append("Simple Condition " + conditionVar.getAsTypedString(getSymbols()) + " " + conditionalJump.getAsTypedString(getSymbols()));
log.append("Simple Condition " + conditionVar.toString(getSymbols()) + " " + conditionalJump.toString(getSymbols()));
break;
default:
}

View File

@ -145,7 +145,7 @@ public class Pass2ConstantAdditionElimination extends Pass2SsaOptimization {
*/
private ConstantInteger consolidateSubConstants(VariableRef variable) {
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;
}
Variable var = getSymbols().getVariable(variable);

View File

@ -22,7 +22,7 @@ public class Pass2ConstantPropagation extends Pass2SsaOptimization {
final Map<VariableRef, Constant> constants = findConstantVariables();
for (VariableRef constantVar : constants.keySet()) {
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());
deleteVariables(constants.keySet());

View File

@ -68,7 +68,7 @@ public class Pass2CullEmptyBlocks extends Pass2SsaOptimization {
LabelRef removeBlockLabelRef = removeBlock.getLabel();
Label removeBlockLabel = getSymbols().getLabel(removeBlockLabelRef);
removeBlockLabel.getScope().remove(removeBlockLabel);
log.append("Culled Empty Block " + removeBlockLabel.getTypedName());
log.append("Culled Empty Block " + removeBlockLabel.toString(getSymbols()));
}
return remove.size()>0;
}

View File

@ -23,7 +23,7 @@ public class Pass2RedundantPhiElimination extends Pass2SsaOptimization {
replaceVariables(aliases);
for (VariableRef var : aliases.keySet()) {
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());
return aliases.size()>0;

View File

@ -28,7 +28,7 @@ public class Pass2SelfPhiElimination extends Pass2SsaOptimization {
if (phiRValue.getrValue().equals(phiVariable.getVariable())) {
iterator.remove();
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() {
@Override
public String toString() {
return getAsString();
return toString(null);
}
@Override
public String getAsTypedString(ProgramScope scope) {
return getAsString();
}
@Override
public String getAsString() {
public String toString(ProgramScope scope) {
return "VOID";
}
};
/**

View File

@ -62,19 +62,19 @@ public class Pass3CodeGeneration {
}
assignment = (StatementAssignment) statement;
AsmFragment asmFragment = new AsmFragment(assignment, assignmentAlu, symbols);
asm.addComment(statement.getAsTypedString(symbols) + " // " + asmFragment.getSignature());
asm.addComment(statement.toString(symbols) + " // " + asmFragment.getSignature());
asmFragment.generate(asm);
isAlu = true;
}
}
if (!isAlu) {
AsmFragment asmFragment = new AsmFragment(assignment, symbols);
asm.addComment(statement.getAsTypedString(symbols) + " // " + asmFragment.getSignature());
asm.addComment(statement.toString(symbols) + " // " + asmFragment.getSignature());
asmFragment.generate(asm);
}
} else if (statement instanceof StatementConditionalJump) {
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);
} else if (statement instanceof StatementCall) {
StatementCall call = (StatementCall) statement;
@ -147,11 +147,11 @@ public class Pass3CodeGeneration {
private void genAsmMove(AsmProgram asm, LValue lValue, RValue rValue) {
if (getRegister(lValue).equals(getRegister(rValue))) {
// 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;
}
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);
}

View File

@ -63,7 +63,7 @@ public class TestCompilationOutput extends TestCase {
boolean success = true;
success &= testOutput(fileName, ".asm", output.getAsmProgram().toString(false));
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());
if(!success) {
fail("Output does not match reference!");