From c080fbe59a5a174e452411a4abed7fafa03ecfc9 Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Wed, 13 Nov 2024 20:51:35 +0100 Subject: [PATCH] target machine config tweak and fix possible compiler crash on wrong type name --- codeCore/src/prog8/code/core/IMachineDefinition.kt | 1 + .../src/prog8/code/target/atari/AtariMachineDefinition.kt | 1 + .../src/prog8/code/target/c128/C128MachineDefinition.kt | 1 + .../src/prog8/code/target/c64/C64MachineDefinition.kt | 1 + .../src/prog8/code/target/cx16/CX16MachineDefinition.kt | 1 + .../prog8/code/target/neo6502/Neo6502MachineDefinition.kt | 1 + .../src/prog8/code/target/pet/PETMachineDefinition.kt | 1 + .../prog8/code/target/virtual/VirtualMachineDefinition.kt | 1 + compiler/src/prog8/compiler/astprocessing/AstChecker.kt | 5 +++-- compilerAst/src/prog8/ast/antlr/Antlr2Kotlin.kt | 8 +++++++- compilerAst/src/prog8/ast/expressions/AstExpressions.kt | 7 ++++++- docs/source/todo.rst | 3 --- examples/test.p8 | 2 +- 13 files changed, 25 insertions(+), 8 deletions(-) diff --git a/codeCore/src/prog8/code/core/IMachineDefinition.kt b/codeCore/src/prog8/code/core/IMachineDefinition.kt index 82e836cf2..6096d341a 100644 --- a/codeCore/src/prog8/code/core/IMachineDefinition.kt +++ b/codeCore/src/prog8/code/core/IMachineDefinition.kt @@ -13,6 +13,7 @@ interface IMachineDefinition { val FLOAT_MAX_NEGATIVE: Double val FLOAT_MAX_POSITIVE: Double val FLOAT_MEM_SIZE: Int + val STARTUP_CODE_RESERVED_SIZE: UInt // this is here, so that certain compiler targets are able to tune this val PROGRAM_LOAD_ADDRESS : UInt val PROGRAM_MEMTOP_ADDRESS: UInt val BSSHIGHRAM_START: UInt diff --git a/codeCore/src/prog8/code/target/atari/AtariMachineDefinition.kt b/codeCore/src/prog8/code/target/atari/AtariMachineDefinition.kt index 2d32a2d22..af0e3453b 100644 --- a/codeCore/src/prog8/code/target/atari/AtariMachineDefinition.kt +++ b/codeCore/src/prog8/code/target/atari/AtariMachineDefinition.kt @@ -11,6 +11,7 @@ class AtariMachineDefinition: IMachineDefinition { override val FLOAT_MAX_POSITIVE = 9.999999999e97 override val FLOAT_MAX_NEGATIVE = -9.999999999e97 override val FLOAT_MEM_SIZE = 6 + override val STARTUP_CODE_RESERVED_SIZE = 20u override val PROGRAM_LOAD_ADDRESS = 0x2000u override val PROGRAM_MEMTOP_ADDRESS = 0xffffu // TODO what's memtop? diff --git a/codeCore/src/prog8/code/target/c128/C128MachineDefinition.kt b/codeCore/src/prog8/code/target/c128/C128MachineDefinition.kt index 8636d6733..5e55590f6 100644 --- a/codeCore/src/prog8/code/target/c128/C128MachineDefinition.kt +++ b/codeCore/src/prog8/code/target/c128/C128MachineDefinition.kt @@ -13,6 +13,7 @@ class C128MachineDefinition: IMachineDefinition { override val FLOAT_MAX_POSITIVE = Mflpt5.FLOAT_MAX_POSITIVE override val FLOAT_MAX_NEGATIVE = Mflpt5.FLOAT_MAX_NEGATIVE override val FLOAT_MEM_SIZE = Mflpt5.FLOAT_MEM_SIZE + override val STARTUP_CODE_RESERVED_SIZE = 20u override val PROGRAM_LOAD_ADDRESS = 0x1c01u override val PROGRAM_MEMTOP_ADDRESS = 0xff00u diff --git a/codeCore/src/prog8/code/target/c64/C64MachineDefinition.kt b/codeCore/src/prog8/code/target/c64/C64MachineDefinition.kt index 83c08aa7c..f780cc1a1 100644 --- a/codeCore/src/prog8/code/target/c64/C64MachineDefinition.kt +++ b/codeCore/src/prog8/code/target/c64/C64MachineDefinition.kt @@ -14,6 +14,7 @@ class C64MachineDefinition: IMachineDefinition { override val FLOAT_MAX_POSITIVE = Mflpt5.FLOAT_MAX_POSITIVE override val FLOAT_MAX_NEGATIVE = Mflpt5.FLOAT_MAX_NEGATIVE override val FLOAT_MEM_SIZE = Mflpt5.FLOAT_MEM_SIZE + override val STARTUP_CODE_RESERVED_SIZE = 20u override val PROGRAM_LOAD_ADDRESS = 0x0801u override val PROGRAM_MEMTOP_ADDRESS = 0xcfe0u // $a000 if floats are used // note that at $cfe0-$cfff are the 16 'virtual registers' R0-R15 diff --git a/codeCore/src/prog8/code/target/cx16/CX16MachineDefinition.kt b/codeCore/src/prog8/code/target/cx16/CX16MachineDefinition.kt index 3c58e6305..21838e86e 100644 --- a/codeCore/src/prog8/code/target/cx16/CX16MachineDefinition.kt +++ b/codeCore/src/prog8/code/target/cx16/CX16MachineDefinition.kt @@ -13,6 +13,7 @@ class CX16MachineDefinition: IMachineDefinition { override val FLOAT_MAX_POSITIVE = Mflpt5.FLOAT_MAX_POSITIVE override val FLOAT_MAX_NEGATIVE = Mflpt5.FLOAT_MAX_NEGATIVE override val FLOAT_MEM_SIZE = Mflpt5.FLOAT_MEM_SIZE + override val STARTUP_CODE_RESERVED_SIZE = 20u override val PROGRAM_LOAD_ADDRESS = 0x0801u override val PROGRAM_MEMTOP_ADDRESS = 0x9f00u diff --git a/codeCore/src/prog8/code/target/neo6502/Neo6502MachineDefinition.kt b/codeCore/src/prog8/code/target/neo6502/Neo6502MachineDefinition.kt index b006968d1..9192f2e64 100644 --- a/codeCore/src/prog8/code/target/neo6502/Neo6502MachineDefinition.kt +++ b/codeCore/src/prog8/code/target/neo6502/Neo6502MachineDefinition.kt @@ -11,6 +11,7 @@ class Neo6502MachineDefinition: IMachineDefinition { override val FLOAT_MAX_POSITIVE = 9.999999999e97 override val FLOAT_MAX_NEGATIVE = -9.999999999e97 override val FLOAT_MEM_SIZE = 6 + override val STARTUP_CODE_RESERVED_SIZE = 20u override val PROGRAM_LOAD_ADDRESS = 0x0800u override val PROGRAM_MEMTOP_ADDRESS = 0xfc00u // kernal starts here diff --git a/codeCore/src/prog8/code/target/pet/PETMachineDefinition.kt b/codeCore/src/prog8/code/target/pet/PETMachineDefinition.kt index 09302d76d..b9251ff34 100644 --- a/codeCore/src/prog8/code/target/pet/PETMachineDefinition.kt +++ b/codeCore/src/prog8/code/target/pet/PETMachineDefinition.kt @@ -13,6 +13,7 @@ class PETMachineDefinition: IMachineDefinition { override val FLOAT_MAX_POSITIVE = Mflpt5.FLOAT_MAX_POSITIVE override val FLOAT_MAX_NEGATIVE = Mflpt5.FLOAT_MAX_NEGATIVE override val FLOAT_MEM_SIZE = Mflpt5.FLOAT_MEM_SIZE + override val STARTUP_CODE_RESERVED_SIZE = 20u override val PROGRAM_LOAD_ADDRESS = 0x0401u override val PROGRAM_MEMTOP_ADDRESS = 0x8000u diff --git a/codeCore/src/prog8/code/target/virtual/VirtualMachineDefinition.kt b/codeCore/src/prog8/code/target/virtual/VirtualMachineDefinition.kt index 96de9c098..35c512d82 100644 --- a/codeCore/src/prog8/code/target/virtual/VirtualMachineDefinition.kt +++ b/codeCore/src/prog8/code/target/virtual/VirtualMachineDefinition.kt @@ -13,6 +13,7 @@ class VirtualMachineDefinition: IMachineDefinition { override val FLOAT_MAX_POSITIVE = Float.MAX_VALUE.toDouble() override val FLOAT_MAX_NEGATIVE = -Float.MAX_VALUE.toDouble() override val FLOAT_MEM_SIZE = 8 // 64-bits double + override val STARTUP_CODE_RESERVED_SIZE = 0u // not actually used override val PROGRAM_LOAD_ADDRESS = 0u // not actually used override val PROGRAM_MEMTOP_ADDRESS = 0xffffu // not actually used diff --git a/compiler/src/prog8/compiler/astprocessing/AstChecker.kt b/compiler/src/prog8/compiler/astprocessing/AstChecker.kt index 50353c880..17d22a149 100644 --- a/compiler/src/prog8/compiler/astprocessing/AstChecker.kt +++ b/compiler/src/prog8/compiler/astprocessing/AstChecker.kt @@ -283,8 +283,9 @@ internal class AstChecker(private val program: Program, if (addr > 65535u) errors.err("block address must be valid integer 0..\$ffff", block.position) if(compilerOptions.loadAddress!=0u) { - if (addr < compilerOptions.loadAddress + 20u) - errors.err("block address must be at least program load address + 20 (to allow for startup logic)", block.position) + val gapsize = compilerOptions.compTarget.machine.STARTUP_CODE_RESERVED_SIZE + if (addr < compilerOptions.loadAddress + gapsize) + errors.err("block address must be at least program load address + $gapsize (to allow for startup logic)", block.position) } } diff --git a/compilerAst/src/prog8/ast/antlr/Antlr2Kotlin.kt b/compilerAst/src/prog8/ast/antlr/Antlr2Kotlin.kt index 2f6e17dea..a60b6383f 100644 --- a/compilerAst/src/prog8/ast/antlr/Antlr2Kotlin.kt +++ b/compilerAst/src/prog8/ast/antlr/Antlr2Kotlin.kt @@ -410,7 +410,13 @@ private fun AugassignmentContext.toAst(): Assignment { return Assignment(assign_target().toAst(), expression, AssignmentOrigin.USERCODE, toPosition()) } -private fun DatatypeContext.toAst() = DataType.valueOf(text.uppercase()) +private fun DatatypeContext.toAst(): DataType { + try { + return DataType.valueOf(text.uppercase()) + } catch (_: IllegalArgumentException) { + return DataType.UNDEFINED + } +} private fun ArrayindexContext.toAst() : ArrayIndex = ArrayIndex(expression().toAst(), toPosition()) diff --git a/compilerAst/src/prog8/ast/expressions/AstExpressions.kt b/compilerAst/src/prog8/ast/expressions/AstExpressions.kt index c5eec7e2d..1e9d67927 100644 --- a/compilerAst/src/prog8/ast/expressions/AstExpressions.kt +++ b/compilerAst/src/prog8/ast/expressions/AstExpressions.kt @@ -1182,7 +1182,12 @@ data class IdentifierReference(val nameInSource: List, override val posi override fun inferType(program: Program): InferredTypes.InferredType { return when (val targetStmt = targetStatement(program)) { - is VarDecl -> InferredTypes.knownFor(targetStmt.datatype) + is VarDecl -> { + if(targetStmt.datatype==DataType.UNDEFINED) + InferredTypes.unknown() + else + InferredTypes.knownFor(targetStmt.datatype) + } else -> InferredTypes.InferredType.unknown() } } diff --git a/docs/source/todo.rst b/docs/source/todo.rst index dc2e9f2f5..b23078ca8 100644 --- a/docs/source/todo.rst +++ b/docs/source/todo.rst @@ -1,9 +1,6 @@ TODO ==== - -- make "block address must be at least program load address + 20 (to allow for startup logic)" more flexible; the 20 should be a constant in the compilation target - ... diff --git a/examples/test.p8 b/examples/test.p8 index 47531cd53..24249f7d9 100644 --- a/examples/test.p8 +++ b/examples/test.p8 @@ -3,7 +3,7 @@ %option no_sysinit %zeropage basicsafe -main { +main $0810 { sub start() { ubyte sprite