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:
parent
300bb644b9
commit
524252105a
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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() + ')';
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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 + "\\";
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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:");
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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() + ')';
|
||||
}
|
||||
}
|
||||
|
@ -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) + ')';
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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";
|
||||
}
|
||||
|
||||
|
@ -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() {
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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) {
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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() + ":";
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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 ");
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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()+"()"; }
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -11,9 +11,6 @@ public interface Symbol extends Value {
|
||||
@JsonIgnore
|
||||
String getFullName();
|
||||
|
||||
@JsonIgnore
|
||||
String getTypedName();
|
||||
|
||||
SymbolType getType();
|
||||
|
||||
@JsonIgnore
|
||||
|
@ -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
|
||||
|
@ -24,8 +24,6 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo;
|
||||
})
|
||||
public interface Value {
|
||||
|
||||
String getAsTypedString(ProgramScope scope);
|
||||
|
||||
String getAsString();
|
||||
String toString(ProgramScope scope);
|
||||
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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:
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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());
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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";
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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!");
|
||||
|
Loading…
Reference in New Issue
Block a user