diff --git a/src/main/java/dk/camelot64/kickc/model/symbols/Scope.java b/src/main/java/dk/camelot64/kickc/model/symbols/Scope.java index ef8548e38..76f154a8c 100644 --- a/src/main/java/dk/camelot64/kickc/model/symbols/Scope.java +++ b/src/main/java/dk/camelot64/kickc/model/symbols/Scope.java @@ -396,7 +396,7 @@ public abstract class Scope implements Symbol, Serializable { } } } - if(symVar.isConstant()) { + if(symVar.isConstant() && symVar.getConstantValue()!=null) { res.append(" = " + symVar.getConstantValue().toString(program)); } res.append("\n"); diff --git a/src/main/java/dk/camelot64/kickc/model/symbols/StructDefinition.java b/src/main/java/dk/camelot64/kickc/model/symbols/StructDefinition.java index 4a061a685..714a661f6 100644 --- a/src/main/java/dk/camelot64/kickc/model/symbols/StructDefinition.java +++ b/src/main/java/dk/camelot64/kickc/model/symbols/StructDefinition.java @@ -24,7 +24,7 @@ public class StructDefinition extends Scope { * @return The member variable */ public Variable getMember(String name) { - for(Variable member : getAllVariables(false)) { + for(Variable member : getAllVars(false)) { if(member.getLocalName().equals(name)) { return member; } @@ -39,7 +39,7 @@ public class StructDefinition extends Scope { */ public long getMemberByteOffset(Variable member, ProgramScope programScope) { long byteOffset=0; - for(Variable structMember : getAllVariables(false)) { + for(Variable structMember : getAllVars(false)) { if(structMember.equals(member)) { break; } else { 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 b9b168094..b53985397 100644 --- a/src/main/java/dk/camelot64/kickc/model/types/SymbolTypeInference.java +++ b/src/main/java/dk/camelot64/kickc/model/types/SymbolTypeInference.java @@ -102,7 +102,7 @@ public class SymbolTypeInference { if(structType instanceof SymbolTypeStruct) { String typeName = ((SymbolTypeStruct) structType).getStructTypeName(); StructDefinition structDefinition = symbols.getStructDefinition(typeName); - Variable structMember = structDefinition.getVariable(structMemberRef.getMemberName()); + Variable structMember = structDefinition.getVar(structMemberRef.getMemberName()); return structMember.getType(); } else { throw new CompileError("Dot applied to non-struct "+ structMemberRef.getStruct().toString()); diff --git a/src/main/java/dk/camelot64/kickc/model/types/SymbolTypeStruct.java b/src/main/java/dk/camelot64/kickc/model/types/SymbolTypeStruct.java index 622bcca99..0c23b773d 100644 --- a/src/main/java/dk/camelot64/kickc/model/types/SymbolTypeStruct.java +++ b/src/main/java/dk/camelot64/kickc/model/types/SymbolTypeStruct.java @@ -53,7 +53,7 @@ public class SymbolTypeStruct implements SymbolType { */ public int calculateSizeBytes(StructDefinition structDefinition, ProgramScope programScope) { int sizeBytes = 0; - for(Variable member : structDefinition.getAllVariables(false)) { + for(Variable member : structDefinition.getAllVars(false)) { SymbolType memberType = member.getType(); int memberSize = getMemberSizeBytes(memberType, member.getArraySpec(), programScope); sizeBytes += memberSize; diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java b/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java index 04aa6be03..2543669d8 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java @@ -569,28 +569,9 @@ public class Pass0GenerateStatementSequence extends KickCParserBaseVisitor memberDefs = structDefinition.getAllVariables(false); + Collection memberDefs = structDefinition.getAllVars(false); if(memberDefs.size()!=constantValues.size()) { throw new CompileError( "Struct initializer has wrong size ("+valueList.getList().size()+"), " + diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass4CodeGeneration.java b/src/main/java/dk/camelot64/kickc/passes/Pass4CodeGeneration.java index 1926bc504..0e6d5a247 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass4CodeGeneration.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass4CodeGeneration.java @@ -572,7 +572,7 @@ public class Pass4CodeGeneration { ConstantStructValue structValue = (ConstantStructValue) value; for(SymbolVariableRef memberRef : structValue.getMembers()) { ConstantValue memberValue = structValue.getValue(memberRef); - Variable memberVariable = getScope().getVariable(memberRef); + Variable memberVariable = getScope().getVar(memberRef); addChunkData(dataChunk, memberValue, memberVariable.getType(), memberVariable.getArraySpec(), scopeRef); } } else if(valueType instanceof SymbolTypePointer && valueArraySpec!=null) { diff --git a/src/main/java/dk/camelot64/kickc/passes/PassNAddInitializerValueListTypeCasts.java b/src/main/java/dk/camelot64/kickc/passes/PassNAddInitializerValueListTypeCasts.java index 92d936695..6b64335db 100644 --- a/src/main/java/dk/camelot64/kickc/passes/PassNAddInitializerValueListTypeCasts.java +++ b/src/main/java/dk/camelot64/kickc/passes/PassNAddInitializerValueListTypeCasts.java @@ -80,7 +80,7 @@ public class PassNAddInitializerValueListTypeCasts extends Pass2SsaOptimization SymbolTypeStruct declaredStructType = (SymbolTypeStruct) declaredType; // Recursively cast all sub-elements StructDefinition structDefinition = declaredStructType.getStructDefinition(program.getScope()); - Collection memberDefinitions = structDefinition.getAllVariables(false); + Collection memberDefinitions = structDefinition.getAllVars(false); int size = memberDefinitions.size(); if(size!=valueList.getList().size()) { throw new CompileError( diff --git a/src/main/java/dk/camelot64/kickc/passes/PassNEliminateUnusedVars.java b/src/main/java/dk/camelot64/kickc/passes/PassNEliminateUnusedVars.java index ed3c8e1a5..e016dd141 100644 --- a/src/main/java/dk/camelot64/kickc/passes/PassNEliminateUnusedVars.java +++ b/src/main/java/dk/camelot64/kickc/passes/PassNEliminateUnusedVars.java @@ -141,7 +141,7 @@ public class PassNEliminateUnusedVars extends Pass2SsaOptimization { Collection allConstants = getScope().getAllConstants(true); for(Variable constant : allConstants) { - if(!(constant.getScope() instanceof EnumDefinition)) { + if(!(constant.getScope() instanceof EnumDefinition) && !(constant.getScope() instanceof StructDefinition)) { if(referenceInfos.isUnused(constant.getRef())) { if(constant.isDeclaredExport()) { // Do not eliminate constants declared as export diff --git a/src/test/ref/declared-memory-var-4.log b/src/test/ref/declared-memory-var-4.log index 4eb3908d0..382c24a05 100644 --- a/src/test/ref/declared-memory-var-4.log +++ b/src/test/ref/declared-memory-var-4.log @@ -68,7 +68,7 @@ SYMBOL TABLE SSA (byte*) bar_thing3 loadstore (byte) foo::thing1 (byte) foo::thing2 -(byte*) foo::thing3 +(const byte*) foo::thing3 = { fill( $c, 0) } (void()) main() (bool~) main::$0 (byte*~) main::$1 @@ -206,7 +206,6 @@ VARIABLE REGISTER WEIGHTS (byte*) bar_thing3 loadstore 20.0 (byte) foo::thing1 (byte) foo::thing2 -(byte*) foo::thing3 (void()) main() (byte) main::i (byte) main::i#3 7.333333333333333 @@ -475,7 +474,7 @@ FINAL SYMBOL TABLE (byte*) bar_thing3 loadstore zp[2]:2 20.0 (byte) foo::thing1 (byte) foo::thing2 -(byte*) foo::thing3 +(const byte*) foo::thing3 = { fill( $c, 0) } (void()) main() (label) main::@1 (label) main::@return diff --git a/src/test/ref/declared-memory-var-4.sym b/src/test/ref/declared-memory-var-4.sym index 4c2d7ecc6..cf2fce8ab 100644 --- a/src/test/ref/declared-memory-var-4.sym +++ b/src/test/ref/declared-memory-var-4.sym @@ -9,7 +9,7 @@ (byte*) bar_thing3 loadstore zp[2]:2 20.0 (byte) foo::thing1 (byte) foo::thing2 -(byte*) foo::thing3 +(const byte*) foo::thing3 = { fill( $c, 0) } (void()) main() (label) main::@1 (label) main::@return diff --git a/src/test/ref/struct-11.log b/src/test/ref/struct-11.log index b30cecc2f..b646163db 100644 --- a/src/test/ref/struct-11.log +++ b/src/test/ref/struct-11.log @@ -465,7 +465,7 @@ SYMBOL TABLE SSA (const byte) HEXADECIMAL = (number) $10 (const byte) OCTAL = (number) 8 (dword) Person::id -(byte*) Person::initials +(const byte*) Person::initials = { fill( 3, 0) } (const byte) RADIX::BINARY = (number) 2 (const byte) RADIX::DECIMAL = (number) $a (const byte) RADIX::HEXADECIMAL = (number) $10 @@ -1320,7 +1320,6 @@ ultoa_append::@2: scope:[ultoa_append] from ultoa_append::@1 VARIABLE REGISTER WEIGHTS (dword) Person::id -(byte*) Person::initials (void()) main() (void()) print_char((byte) print_char::ch) (byte) print_char::ch @@ -2699,7 +2698,7 @@ FINAL SYMBOL TABLE (label) @end (const byte*) DIGITS = (string) "0123456789abcdef"z (dword) Person::id -(byte*) Person::initials +(const byte*) Person::initials = { fill( 3, 0) } (const byte) RADIX::BINARY = (number) 2 (const byte) RADIX::DECIMAL = (number) $a (const byte) RADIX::HEXADECIMAL = (number) $10 diff --git a/src/test/ref/struct-11.sym b/src/test/ref/struct-11.sym index 66fc78cbd..ffcaa482a 100644 --- a/src/test/ref/struct-11.sym +++ b/src/test/ref/struct-11.sym @@ -3,7 +3,7 @@ (label) @end (const byte*) DIGITS = (string) "0123456789abcdef"z (dword) Person::id -(byte*) Person::initials +(const byte*) Person::initials = { fill( 3, 0) } (const byte) RADIX::BINARY = (number) 2 (const byte) RADIX::DECIMAL = (number) $a (const byte) RADIX::HEXADECIMAL = (number) $10 diff --git a/src/test/ref/struct-12.log b/src/test/ref/struct-12.log index 8a66b12c0..d99ea9041 100644 --- a/src/test/ref/struct-12.log +++ b/src/test/ref/struct-12.log @@ -122,7 +122,7 @@ SYMBOL TABLE SSA (label) @end (const byte*) DIGIT = (string) "0123456789" (byte) Person::id -(byte*) Person::name +(const byte*) Person::name = { fill( $40, 0) } (const byte*) SCREEN = (byte*)(number) $400 (byte) idx (byte) idx#0 @@ -346,7 +346,6 @@ print_person::@2: scope:[print_person] from print_person::@1 VARIABLE REGISTER WEIGHTS (byte) Person::id -(byte*) Person::name (byte) idx (byte) idx#13 3.0 (byte) idx#14 9.75 @@ -749,7 +748,7 @@ FINAL SYMBOL TABLE (label) @end (const byte*) DIGIT = (string) "0123456789" (byte) Person::id -(byte*) Person::name +(const byte*) Person::name = { fill( $40, 0) } (const byte*) SCREEN = (byte*) 1024 (byte) idx (byte) idx#13 reg byte y 3.0 diff --git a/src/test/ref/struct-12.sym b/src/test/ref/struct-12.sym index 92c2c483d..5931de4fb 100644 --- a/src/test/ref/struct-12.sym +++ b/src/test/ref/struct-12.sym @@ -3,7 +3,7 @@ (label) @end (const byte*) DIGIT = (string) "0123456789" (byte) Person::id -(byte*) Person::name +(const byte*) Person::name = { fill( $40, 0) } (const byte*) SCREEN = (byte*) 1024 (byte) idx (byte) idx#13 reg byte y 3.0 diff --git a/src/test/ref/struct-ptr-23.log b/src/test/ref/struct-ptr-23.log index d20a4775f..c048c54fa 100644 --- a/src/test/ref/struct-ptr-23.log +++ b/src/test/ref/struct-ptr-23.log @@ -85,7 +85,7 @@ SYMBOL TABLE SSA (const byte) OFFSET_STRUCT_PERSON_ID = (byte) 0 (const byte) OFFSET_STRUCT_PERSON_INITIALS = (byte) 1 (byte) Person::id -(byte*) Person::initials +(const byte*) Person::initials = { fill( 4, 0) } (const byte*) SCREEN = (byte*)(number) $400 (const byte) SIZEOF_STRUCT_PERSON = (byte) 5 (byte) idx @@ -270,7 +270,6 @@ print_person::@return: scope:[print_person] from print_person VARIABLE REGISTER WEIGHTS (byte) Person::id -(byte*) Person::initials (byte) idx (byte) idx#10 1.0 (byte) idx#15 2.0 @@ -706,7 +705,7 @@ FINAL SYMBOL TABLE (label) @end (const byte) OFFSET_STRUCT_PERSON_INITIALS = (byte) 1 (byte) Person::id -(byte*) Person::initials +(const byte*) Person::initials = { fill( 4, 0) } (const byte*) SCREEN = (byte*) 1024 (const byte) SIZEOF_STRUCT_PERSON = (byte) 5 (byte) idx diff --git a/src/test/ref/struct-ptr-23.sym b/src/test/ref/struct-ptr-23.sym index a885f0692..d54764ad1 100644 --- a/src/test/ref/struct-ptr-23.sym +++ b/src/test/ref/struct-ptr-23.sym @@ -3,7 +3,7 @@ (label) @end (const byte) OFFSET_STRUCT_PERSON_INITIALS = (byte) 1 (byte) Person::id -(byte*) Person::initials +(const byte*) Person::initials = { fill( 4, 0) } (const byte*) SCREEN = (byte*) 1024 (const byte) SIZEOF_STRUCT_PERSON = (byte) 5 (byte) idx diff --git a/src/test/ref/struct-ptr-31.log b/src/test/ref/struct-ptr-31.log index 0b615d60b..11d3e687a 100644 --- a/src/test/ref/struct-ptr-31.log +++ b/src/test/ref/struct-ptr-31.log @@ -96,7 +96,7 @@ SYMBOL TABLE SSA (const byte) OFFSET_STRUCT_PERSON_ID = (byte) 0 (const byte) OFFSET_STRUCT_PERSON_NAME = (byte) 1 (byte) Person::id -(byte*) Person::name +(const byte*) Person::name = { fill( $10, 0) } (const byte*) SCREEN = (byte*)(number) $400 (const byte) SIZEOF_STRUCT_PERSON = (byte) $11 (byte) idx @@ -292,7 +292,6 @@ print_person::@2: scope:[print_person] from print_person::@1 VARIABLE REGISTER WEIGHTS (byte) Person::id -(byte*) Person::name (byte) idx (byte) idx#13 3.0 (byte) idx#14 6.5 @@ -729,7 +728,7 @@ FINAL SYMBOL TABLE (const byte*) DIGIT = (string) "0123456789" (const byte) OFFSET_STRUCT_PERSON_NAME = (byte) 1 (byte) Person::id -(byte*) Person::name +(const byte*) Person::name = { fill( $10, 0) } (const byte*) SCREEN = (byte*) 1024 (const byte) SIZEOF_STRUCT_PERSON = (byte) $11 (byte) idx diff --git a/src/test/ref/struct-ptr-31.sym b/src/test/ref/struct-ptr-31.sym index 5f8f1fb0c..3ce58a8ce 100644 --- a/src/test/ref/struct-ptr-31.sym +++ b/src/test/ref/struct-ptr-31.sym @@ -4,7 +4,7 @@ (const byte*) DIGIT = (string) "0123456789" (const byte) OFFSET_STRUCT_PERSON_NAME = (byte) 1 (byte) Person::id -(byte*) Person::name +(const byte*) Person::name = { fill( $10, 0) } (const byte*) SCREEN = (byte*) 1024 (const byte) SIZEOF_STRUCT_PERSON = (byte) $11 (byte) idx diff --git a/src/test/ref/struct-ptr-32.log b/src/test/ref/struct-ptr-32.log index 168461343..680b8f83d 100644 --- a/src/test/ref/struct-ptr-32.log +++ b/src/test/ref/struct-ptr-32.log @@ -69,7 +69,7 @@ SYMBOL TABLE SSA (const byte) OFFSET_STRUCT_PERSON_NAME = (byte) 1 (word) Person::age (byte) Person::id -(byte*) Person::name +(const byte*) Person::name = { fill( $d, 0) } (const byte) SIZEOF_STRUCT_PERSON = (byte) $10 (void()) main() (number~) main::$0 @@ -294,7 +294,6 @@ main::@return: scope:[main] from main VARIABLE REGISTER WEIGHTS (word) Person::age (byte) Person::id -(byte*) Person::name (void()) main() (struct Person*) main::person @@ -480,7 +479,7 @@ FINAL SYMBOL TABLE (const byte) OFFSET_STRUCT_PERSON_NAME = (byte) 1 (word) Person::age (byte) Person::id -(byte*) Person::name +(const byte*) Person::name = { fill( $d, 0) } (const byte) SIZEOF_STRUCT_PERSON = (byte) $10 (void()) main() (label) main::@return diff --git a/src/test/ref/struct-ptr-32.sym b/src/test/ref/struct-ptr-32.sym index eb7f5c30f..e3d980b5a 100644 --- a/src/test/ref/struct-ptr-32.sym +++ b/src/test/ref/struct-ptr-32.sym @@ -5,7 +5,7 @@ (const byte) OFFSET_STRUCT_PERSON_NAME = (byte) 1 (word) Person::age (byte) Person::id -(byte*) Person::name +(const byte*) Person::name = { fill( $d, 0) } (const byte) SIZEOF_STRUCT_PERSON = (byte) $10 (void()) main() (label) main::@return diff --git a/src/test/ref/struct-ptr-33.log b/src/test/ref/struct-ptr-33.log index 40aa75b66..853ca220b 100644 --- a/src/test/ref/struct-ptr-33.log +++ b/src/test/ref/struct-ptr-33.log @@ -35,7 +35,7 @@ SYMBOL TABLE SSA (const byte) OFFSET_STRUCT_PERSON_NAME = (byte) 1 (word) Person::age (byte) Person::id -(byte*) Person::name +(const byte*) Person::name = { fill( $d, 0) } (const byte) SIZEOF_STRUCT_PERSON = (byte) $10 (void()) main() (byte*~) main::$0 @@ -132,7 +132,6 @@ main::@return: scope:[main] from main VARIABLE REGISTER WEIGHTS (word) Person::age (byte) Person::id -(byte*) Person::name (void()) main() (struct Person*) main::person @@ -283,7 +282,7 @@ FINAL SYMBOL TABLE (const byte) OFFSET_STRUCT_PERSON_NAME = (byte) 1 (word) Person::age (byte) Person::id -(byte*) Person::name +(const byte*) Person::name = { fill( $d, 0) } (const byte) SIZEOF_STRUCT_PERSON = (byte) $10 (void()) main() (label) main::@return diff --git a/src/test/ref/struct-ptr-33.sym b/src/test/ref/struct-ptr-33.sym index de60c1593..e56310d13 100644 --- a/src/test/ref/struct-ptr-33.sym +++ b/src/test/ref/struct-ptr-33.sym @@ -4,7 +4,7 @@ (const byte) OFFSET_STRUCT_PERSON_NAME = (byte) 1 (word) Person::age (byte) Person::id -(byte*) Person::name +(const byte*) Person::name = { fill( $d, 0) } (const byte) SIZEOF_STRUCT_PERSON = (byte) $10 (void()) main() (label) main::@return diff --git a/src/test/ref/struct-ptr-34.log b/src/test/ref/struct-ptr-34.log index dfffffc48..f6e236d21 100644 --- a/src/test/ref/struct-ptr-34.log +++ b/src/test/ref/struct-ptr-34.log @@ -114,7 +114,7 @@ SYMBOL TABLE SSA (label) @end (const byte*) DIGIT = (string) "0123456789" (byte) Person::id -(byte*) Person::name +(const byte*) Person::name = { fill( $10, 0) } (const byte*) SCREEN = (byte*)(number) $400 (byte) idx (byte) idx#0 @@ -304,7 +304,6 @@ print_person::@2: scope:[print_person] from print_person::@1 VARIABLE REGISTER WEIGHTS (byte) Person::id -(byte*) Person::name (byte) idx (byte) idx#13 3.0 (byte) idx#14 9.75 @@ -701,7 +700,7 @@ FINAL SYMBOL TABLE (label) @end (const byte*) DIGIT = (string) "0123456789" (byte) Person::id -(byte*) Person::name +(const byte*) Person::name = { fill( $10, 0) } (const byte*) SCREEN = (byte*) 1024 (byte) idx (byte) idx#13 reg byte y 3.0 diff --git a/src/test/ref/struct-ptr-34.sym b/src/test/ref/struct-ptr-34.sym index ec62967eb..42a960d46 100644 --- a/src/test/ref/struct-ptr-34.sym +++ b/src/test/ref/struct-ptr-34.sym @@ -3,7 +3,7 @@ (label) @end (const byte*) DIGIT = (string) "0123456789" (byte) Person::id -(byte*) Person::name +(const byte*) Person::name = { fill( $10, 0) } (const byte*) SCREEN = (byte*) 1024 (byte) idx (byte) idx#13 reg byte y 3.0