fixing label names, fixes #11

This commit is contained in:
Irmen de Jong 2019-03-30 00:31:40 +01:00
parent 25e3b599e7
commit c4615591c9
3 changed files with 16 additions and 94 deletions

View File

@ -23,10 +23,7 @@ class AsmGen(val options: CompilationOptions, val program: IntermediateProgram,
private var breakpointCounter = 0 private var breakpointCounter = 0
init { init {
// Because 64tass understands scoped names via .proc / .block, // Convert invalid label names (such as "<anon-1>") to something that's allowed.
// we'll strip the block prefix from all scoped names in the program.
// Also, convert invalid label names (such as "<anon-1>") to something that's allowed.
// Also have to do that for the variablesMarkedForZeropage! TODO is this true?
val newblocks = mutableListOf<IntermediateProgram.ProgramBlock>() val newblocks = mutableListOf<IntermediateProgram.ProgramBlock>()
for(block in program.blocks) { for(block in program.blocks) {
val newvars = block.variables.map { symname(it.key, block) to it.value }.toMap().toMutableMap() val newvars = block.variables.map { symname(it.key, block) to it.value }.toMap().toMutableMap()
@ -42,13 +39,13 @@ class AsmGen(val options: CompilationOptions, val program: IntermediateProgram,
callLabel2 = if (it.callLabel2 != null) symname(it.callLabel2, block) else null) callLabel2 = if (it.callLabel2 != null) symname(it.callLabel2, block) else null)
} }
}.toMutableList() }.toMutableList()
val newConstants = block.memoryPointers.map { symname(it.key, block) to it.value }.toMap().toMutableMap() val newMempointers = block.memoryPointers.map { symname(it.key, block) to it.value }.toMap().toMutableMap()
val newblock = IntermediateProgram.ProgramBlock( val newblock = IntermediateProgram.ProgramBlock(
block.name, block.name,
block.address, block.address,
newinstructions, newinstructions,
newvars, newvars,
newConstants, newMempointers,
newlabels, newlabels,
force_output = block.force_output) force_output = block.force_output)
newblock.variablesMarkedForZeropage.clear() newblock.variablesMarkedForZeropage.clear()
@ -58,10 +55,9 @@ class AsmGen(val options: CompilationOptions, val program: IntermediateProgram,
program.blocks.clear() program.blocks.clear()
program.blocks.addAll(newblocks) program.blocks.addAll(newblocks)
// TODO is this still needed????? val newAllocatedZp = program.allocatedZeropageVariables.map { symname(it.key, null) to it.value}
// val newAllocatedZp = program.allocatedZeropageVariables.map { symname(it.key, null) to it.value} program.allocatedZeropageVariables.clear()
// program.allocatedZeropageVariables.clear() program.allocatedZeropageVariables.putAll(newAllocatedZp)
// program.allocatedZeropageVariables.putAll(newAllocatedZp)
// make a list of all const floats that are used // make a list of all const floats that are used
for(block in program.blocks) { for(block in program.blocks) {
@ -107,11 +103,11 @@ class AsmGen(val options: CompilationOptions, val program: IntermediateProgram,
// convert a fully scoped name (defined in the given block) to a valid assembly symbol name // convert a fully scoped name (defined in the given block) to a valid assembly symbol name
private fun symname(scoped: String, block: IntermediateProgram.ProgramBlock): String { private fun symname(scoped: String, block: IntermediateProgram.ProgramBlock?): String {
if(' ' in scoped) if(' ' in scoped)
return scoped return scoped
val blockLocal: Boolean val blockLocal: Boolean
var name = if (scoped.startsWith("${block.name}.")) { var name = if (block!=null && scoped.startsWith("${block.name}.")) {
blockLocal = true blockLocal = true
scoped.substring(block.name.length+1) scoped.substring(block.name.length+1)
} }
@ -221,16 +217,16 @@ class AsmGen(val options: CompilationOptions, val program: IntermediateProgram,
out("* = ${block.address?.toHex()}") out("* = ${block.address?.toHex()}")
} }
// deal with zeropage variables TODO does this still work correctly (the symname was changed a little) // deal with zeropage variables
for(variable in blk.variables) { for(variable in blk.variables) {
val sym = symname(blk.name+"."+variable.key, blk) val sym = symname(blk.name+"."+variable.key, null)
val zpVar = program.allocatedZeropageVariables[sym] val zpVar = program.allocatedZeropageVariables[sym]
if(zpVar==null) { if(zpVar==null) {
// This var is not on the ZP yet. Attempt to move it there (if it's not a float, those take up too much space) // This var is not on the ZP yet. Attempt to move it there (if it's not a float, those take up too much space)
if(variable.value.type in zeropage.allowedDatatypes && variable.value.type != DataType.FLOAT) { if(variable.value.type in zeropage.allowedDatatypes && variable.value.type != DataType.FLOAT) {
try { try {
val address = zeropage.allocate(sym, variable.value.type, null) val address = zeropage.allocate(sym, variable.value.type, null)
out("${variable.key} = $address\t; zp ${variable.value.type}") out("${variable.key} = $address\t; auto zp ${variable.value.type}")
// make sure we add the var to the set of zpvars for this block // make sure we add the var to the set of zpvars for this block
blk.variablesMarkedForZeropage.add(variable.key) blk.variablesMarkedForZeropage.add(variable.key)
program.allocatedZeropageVariables[sym] = Pair(address, variable.value.type) program.allocatedZeropageVariables[sym] = Pair(address, variable.value.type)

View File

@ -1,20 +0,0 @@
; @todo fix this (issue #11 on github): it generates invalid asm due to improper label names
~ main {
sub start() {
if A>10 {
A=44
while true {
;derp
}
} else {
gameover:
goto gameover
}
}
}

View File

@ -1,69 +1,15 @@
%zeropage basicsafe %zeropage basicsafe
; @todo fix this loop labeling problem (issue #11 on github): it generates invalid asm due to improper label names
~ main { ~ main {
label2: ubyte @zp var1
sub start() { sub start() {
ubyte @zp var1
label3: A=20
byte var1 A=var1
Y=main.var1
label4:
sub subsub() {
label3:
label4:
byte var1
}
sub subsub2() {
label3:
label4:
byte var1
byte var2
byte var3
label5ss2:
if A>10 {
label6ss2:
A=44
while true {
label7ss2:
;derp
}
} else {
gameoverss2:
goto gameoverss2
}
label8ss2:
}
label5:
if A>10 {
label6:
A=44
while true {
label7:
;derp
}
} else {
gameover:
goto gameover
}
label8:
} }
} }