diff --git a/src/main/java/dk/camelot64/kickc/model/DirectiveParserContext.java b/src/main/java/dk/camelot64/kickc/model/DirectiveParserContext.java index 0e7542fe8..9c9418ff7 100644 --- a/src/main/java/dk/camelot64/kickc/model/DirectiveParserContext.java +++ b/src/main/java/dk/camelot64/kickc/model/DirectiveParserContext.java @@ -3,7 +3,6 @@ package dk.camelot64.kickc.model; import dk.camelot64.kickc.model.statements.StatementSource; import dk.camelot64.kickc.model.symbols.*; import dk.camelot64.kickc.model.types.SymbolType; -import dk.camelot64.kickc.model.types.SymbolTypeArray; import dk.camelot64.kickc.model.types.SymbolTypePointer; import dk.camelot64.kickc.model.types.SymbolTypeStruct; import dk.camelot64.kickc.model.values.ScopeRef; @@ -55,8 +54,6 @@ public class DirectiveParserContext { return INTEGER; } else if(SymbolType.STRING.equals(type)) { return ARRAY; - } else if(type instanceof SymbolTypeArray) { - return ARRAY; } else if(type instanceof SymbolTypePointer) { return POINTER; } else if(type instanceof SymbolTypeStruct) { diff --git a/src/main/java/dk/camelot64/kickc/model/iterator/ProgramValue.java b/src/main/java/dk/camelot64/kickc/model/iterator/ProgramValue.java index 15e46ba71..77244314f 100644 --- a/src/main/java/dk/camelot64/kickc/model/iterator/ProgramValue.java +++ b/src/main/java/dk/camelot64/kickc/model/iterator/ProgramValue.java @@ -3,7 +3,6 @@ package dk.camelot64.kickc.model.iterator; import dk.camelot64.kickc.model.ControlFlowBlock; import dk.camelot64.kickc.model.statements.*; import dk.camelot64.kickc.model.symbols.Variable; -import dk.camelot64.kickc.model.types.SymbolTypeArray; import dk.camelot64.kickc.model.values.*; /** @@ -947,26 +946,6 @@ public interface ProgramValue { } - /** Size inside a fixed size array. */ - class ProgramValueTypeArraySize implements ProgramValue { - private final SymbolTypeArray array; - - ProgramValueTypeArraySize(SymbolTypeArray array) { - this.array = array; - } - - @Override - public Value get() { - return array.getSize(); - } - - @Override - public void set(Value val) { - array.setSize((RValue) val); - } - - } - /** Size inside a fixed size array. */ class ProgramValueArraySize implements ProgramValue { private final Variable variable; diff --git a/src/main/java/dk/camelot64/kickc/model/iterator/ProgramValueIterator.java b/src/main/java/dk/camelot64/kickc/model/iterator/ProgramValueIterator.java index 6a6546fd5..60343b275 100644 --- a/src/main/java/dk/camelot64/kickc/model/iterator/ProgramValueIterator.java +++ b/src/main/java/dk/camelot64/kickc/model/iterator/ProgramValueIterator.java @@ -4,8 +4,9 @@ import dk.camelot64.kickc.model.ControlFlowBlock; import dk.camelot64.kickc.model.ControlFlowGraph; import dk.camelot64.kickc.model.Program; import dk.camelot64.kickc.model.statements.*; -import dk.camelot64.kickc.model.symbols.*; -import dk.camelot64.kickc.model.types.SymbolTypeArray; +import dk.camelot64.kickc.model.symbols.Label; +import dk.camelot64.kickc.model.symbols.ProgramScope; +import dk.camelot64.kickc.model.symbols.Variable; import dk.camelot64.kickc.model.values.*; import java.util.*; @@ -47,9 +48,6 @@ public class ProgramValueIterator { * @param programValueHandler The programValueHandler to execute */ public static void execute(Variable variable, ProgramValueHandler programValueHandler) { - if(variable.getType() instanceof SymbolTypeArray) { - execute(new ProgramValue.ProgramValueTypeArraySize((SymbolTypeArray) variable.getType()), programValueHandler, null, null, null); - } if(variable.isConstant()) { execute(new ProgramValue.ProgramValueConstantVar(variable), programValueHandler, null, null, null); } diff --git a/src/main/java/dk/camelot64/kickc/model/types/SymbolTypeArray.java b/src/main/java/dk/camelot64/kickc/model/types/SymbolTypeArray.java index f53b45291..dee6d4978 100644 --- a/src/main/java/dk/camelot64/kickc/model/types/SymbolTypeArray.java +++ b/src/main/java/dk/camelot64/kickc/model/types/SymbolTypeArray.java @@ -2,6 +2,8 @@ package dk.camelot64.kickc.model.types; import dk.camelot64.kickc.model.values.RValue; +import java.util.Objects; + /** * A fixed size array of another type */ @@ -41,7 +43,7 @@ public class SymbolTypeArray extends SymbolTypePointer { if(o == null || getClass() != o.getClass()) return false; if(!super.equals(o)) return false; SymbolTypeArray that = (SymbolTypeArray) o; - return size != null ? size.equals(that.size) : that.size == null; + return Objects.equals(size, that.size); } @Override diff --git a/src/main/java/dk/camelot64/kickc/model/types/SymbolTypeInference.java b/src/main/java/dk/camelot64/kickc/model/types/SymbolTypeInference.java index be45201d4..c045b70ab 100644 --- a/src/main/java/dk/camelot64/kickc/model/types/SymbolTypeInference.java +++ b/src/main/java/dk/camelot64/kickc/model/types/SymbolTypeInference.java @@ -50,13 +50,13 @@ public class SymbolTypeInference { throw new CompileError("Cannot infer pointer element type from type: " + pointerType); } } else if(rValue instanceof ConstantArrayList) { - return new SymbolTypeArray(((ConstantArrayList) rValue).getElementType()); + return new SymbolTypePointer(((ConstantArrayList) rValue).getElementType()); } else if(rValue instanceof ConstantArrayKickAsm) { - return new SymbolTypeArray(((ConstantArrayKickAsm) rValue).getElementType()); + return new SymbolTypePointer(((ConstantArrayKickAsm) rValue).getElementType()); } else if(rValue instanceof ArrayFilled) { - return new SymbolTypeArray(((ArrayFilled) rValue).getElementType(), ((ArrayFilled) rValue).getSize()); + return new SymbolTypePointer(((ArrayFilled) rValue).getElementType()); } else if(rValue instanceof ConstantArrayFilled) { - return new SymbolTypeArray(((ConstantArrayFilled) rValue).getElementType(), ((ConstantArrayFilled) rValue).getSize()); + return new SymbolTypePointer(((ConstantArrayFilled) rValue).getElementType()); } else if(rValue instanceof ConstantSymbolPointer) { return ((ConstantSymbolPointer) rValue).getType(symbols); } else if(rValue instanceof CastValue) { diff --git a/src/main/java/dk/camelot64/kickc/model/values/ConstantArrayFilled.java b/src/main/java/dk/camelot64/kickc/model/values/ConstantArrayFilled.java index e5647c812..4a5d5a9d6 100644 --- a/src/main/java/dk/camelot64/kickc/model/values/ConstantArrayFilled.java +++ b/src/main/java/dk/camelot64/kickc/model/values/ConstantArrayFilled.java @@ -1,9 +1,10 @@ package dk.camelot64.kickc.model.values; -import dk.camelot64.kickc.model.*; +import dk.camelot64.kickc.model.ConstantNotLiteral; +import dk.camelot64.kickc.model.Program; import dk.camelot64.kickc.model.symbols.ProgramScope; import dk.camelot64.kickc.model.types.SymbolType; -import dk.camelot64.kickc.model.types.SymbolTypeArray; +import dk.camelot64.kickc.model.types.SymbolTypePointer; /** * An zero-filled constant array. The array is allocated in the code memory (as a .fill() ). @@ -21,7 +22,7 @@ public class ConstantArrayFilled implements ConstantArray { @Override public SymbolType getType(ProgramScope scope) { - return new SymbolTypeArray(elementType); + return new SymbolTypePointer(elementType); } public SymbolType getElementType() { diff --git a/src/main/java/dk/camelot64/kickc/model/values/ConstantArrayKickAsm.java b/src/main/java/dk/camelot64/kickc/model/values/ConstantArrayKickAsm.java index 87a994285..299b3addc 100644 --- a/src/main/java/dk/camelot64/kickc/model/values/ConstantArrayKickAsm.java +++ b/src/main/java/dk/camelot64/kickc/model/values/ConstantArrayKickAsm.java @@ -4,7 +4,7 @@ import dk.camelot64.kickc.model.ConstantNotLiteral; import dk.camelot64.kickc.model.Program; import dk.camelot64.kickc.model.symbols.ProgramScope; import dk.camelot64.kickc.model.types.SymbolType; -import dk.camelot64.kickc.model.types.SymbolTypeArray; +import dk.camelot64.kickc.model.types.SymbolTypePointer; import java.util.List; @@ -38,7 +38,7 @@ public class ConstantArrayKickAsm implements ConstantArray { @Override public SymbolType getType(ProgramScope scope) { - return new SymbolTypeArray(elementType); + return new SymbolTypePointer(elementType); } public SymbolType getElementType() { diff --git a/src/main/java/dk/camelot64/kickc/model/values/ConstantArrayList.java b/src/main/java/dk/camelot64/kickc/model/values/ConstantArrayList.java index 8d3c347fb..a05acc169 100644 --- a/src/main/java/dk/camelot64/kickc/model/values/ConstantArrayList.java +++ b/src/main/java/dk/camelot64/kickc/model/values/ConstantArrayList.java @@ -1,9 +1,10 @@ package dk.camelot64.kickc.model.values; -import dk.camelot64.kickc.model.*; +import dk.camelot64.kickc.model.ConstantNotLiteral; +import dk.camelot64.kickc.model.Program; import dk.camelot64.kickc.model.symbols.ProgramScope; import dk.camelot64.kickc.model.types.SymbolType; -import dk.camelot64.kickc.model.types.SymbolTypeArray; +import dk.camelot64.kickc.model.types.SymbolTypePointer; import java.util.List; @@ -23,7 +24,7 @@ public class ConstantArrayList implements ConstantArray { @Override public SymbolType getType(ProgramScope scope) { - return new SymbolTypeArray(elementType); + return new SymbolTypePointer(elementType); } public SymbolType getElementType() { diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass1GenerateSingleStaticAssignmentForm.java b/src/main/java/dk/camelot64/kickc/passes/Pass1GenerateSingleStaticAssignmentForm.java index 7a15ef97a..793cc8e28 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass1GenerateSingleStaticAssignmentForm.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass1GenerateSingleStaticAssignmentForm.java @@ -6,10 +6,14 @@ import dk.camelot64.kickc.model.InternalError; import dk.camelot64.kickc.model.Program; import dk.camelot64.kickc.model.iterator.ProgramValue; import dk.camelot64.kickc.model.iterator.ProgramValueIterator; -import dk.camelot64.kickc.model.statements.*; -import dk.camelot64.kickc.model.symbols.*; -import dk.camelot64.kickc.model.types.SymbolType; -import dk.camelot64.kickc.model.types.SymbolTypeArray; +import dk.camelot64.kickc.model.statements.Statement; +import dk.camelot64.kickc.model.statements.StatementLValue; +import dk.camelot64.kickc.model.statements.StatementPhiBlock; +import dk.camelot64.kickc.model.statements.StatementSource; +import dk.camelot64.kickc.model.symbols.Procedure; +import dk.camelot64.kickc.model.symbols.Scope; +import dk.camelot64.kickc.model.symbols.Symbol; +import dk.camelot64.kickc.model.symbols.Variable; import dk.camelot64.kickc.model.values.*; import java.util.Collection; @@ -119,22 +123,6 @@ public class Pass1GenerateSingleStaticAssignmentForm extends Pass1Base { } } } - // Examine if the assigned variable is an array with a fixed size - if(currentStmt instanceof StatementAssignment) { - LValue lValue = ((StatementAssignment) currentStmt).getlValue(); - if(lValue instanceof VariableRef) { - Variable assignedVar = Pass1GenerateSingleStaticAssignmentForm.this.getScope().getVariable((VariableRef) lValue); - SymbolType assignedVarType = assignedVar.getType(); - if(assignedVarType instanceof SymbolTypeArray) { - SymbolTypeArray assignedArrayType = (SymbolTypeArray) assignedVarType; - RValue arraySize = assignedArrayType.getSize(); - Variable vrs = findOrCreateVersion(arraySize, blockVersions, blockNewPhis); - if(vrs != null) { - assignedArrayType.setSize(vrs.getRef()); - } - } - } - } }); // Add new Phi functions to block for(Variable symbol : blockNewPhis.keySet()) { diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass2FixInlineConstructors.java b/src/main/java/dk/camelot64/kickc/passes/Pass2FixInlineConstructors.java index affb2ae6c..eacc2e586 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass2FixInlineConstructors.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass2FixInlineConstructors.java @@ -12,7 +12,6 @@ import dk.camelot64.kickc.model.statements.StatementAssignment; import dk.camelot64.kickc.model.symbols.Scope; import dk.camelot64.kickc.model.symbols.Variable; import dk.camelot64.kickc.model.types.SymbolType; -import dk.camelot64.kickc.model.types.SymbolTypeArray; import dk.camelot64.kickc.model.types.SymbolTypePointer; import dk.camelot64.kickc.model.values.CastValue; import dk.camelot64.kickc.model.values.LValue; @@ -52,7 +51,7 @@ public class Pass2FixInlineConstructors extends Pass2SsaOptimization { } else if(SymbolType.DWORD.equals(castToType)) { addLiteralWordConstructor(Operators.DWORD, SymbolType.DWORD, SymbolType.WORD, programExpression, listValues, currentStmt, stmtIt, currentBlock); optimized.set(true); - } else if((castToType instanceof SymbolTypePointer) && !(castToType instanceof SymbolTypeArray)) { + } else if((castToType instanceof SymbolTypePointer)) { SymbolType castType = ((OperatorCastPtr) operator).getToType(); addLiteralWordConstructor(Operators.WORD, castType, SymbolType.BYTE, programExpression, listValues, currentStmt, stmtIt, currentBlock); optimized.set(true); diff --git a/src/main/java/dk/camelot64/kickc/passes/PassNAddTypeConversionAssignment.java b/src/main/java/dk/camelot64/kickc/passes/PassNAddTypeConversionAssignment.java index 94996e5ea..47f7cdec9 100644 --- a/src/main/java/dk/camelot64/kickc/passes/PassNAddTypeConversionAssignment.java +++ b/src/main/java/dk/camelot64/kickc/passes/PassNAddTypeConversionAssignment.java @@ -75,7 +75,7 @@ public class PassNAddTypeConversionAssignment extends Pass2SsaOptimization { getLog().append("Identified literal word (" + conversionType + ") " + binary.getRight().toString() + " in " + (currentStmt == null ? "" : currentStmt.toString(getProgram(), false))); binary.addRightCast(conversionType, stmtIt, currentBlock == null ? null : currentBlock.getScope(), getScope()); modified.set(true); - } else if(leftType instanceof SymbolTypePointer && !(leftType instanceof SymbolTypeArray) && isLiteralWordCandidate(right)) { + } else if(leftType instanceof SymbolTypePointer && isLiteralWordCandidate(right)) { // Detect word literal constructor SymbolType conversionType = SymbolType.WORD; if(pass2 || getLog().isVerbosePass1CreateSsa())