mirror of
https://github.com/KarolS/millfork.git
synced 2024-11-01 05:05:32 +00:00
Don't emit labels that are not necessary; fix the __heap_start symbol.
This commit is contained in:
parent
dc087ed887
commit
b2d2c3e005
@ -500,6 +500,7 @@ class Environment(val parent: Option[Environment], val prefix: String, val cpuFa
|
|||||||
}
|
}
|
||||||
addUnexpandedPointerConstant("__rwdata_start")
|
addUnexpandedPointerConstant("__rwdata_start")
|
||||||
addUnexpandedPointerConstant("__rwdata_end")
|
addUnexpandedPointerConstant("__rwdata_end")
|
||||||
|
addUnexpandedPointerConstant("__heap_start")
|
||||||
if (options.platform.ramInitialValuesBank.isDefined) {
|
if (options.platform.ramInitialValuesBank.isDefined) {
|
||||||
addUnexpandedPointerConstant("__rwdata_init_start")
|
addUnexpandedPointerConstant("__rwdata_init_start")
|
||||||
addUnexpandedPointerConstant("__rwdata_init_end")
|
addUnexpandedPointerConstant("__rwdata_init_end")
|
||||||
|
@ -35,6 +35,7 @@ abstract class AbstractAssembler[T <: AbstractCode](private val program: Program
|
|||||||
|
|
||||||
val mem = new CompiledMemory(platform.bankNumbers.toList, platform.bankFill, platform.isBigEndian)
|
val mem = new CompiledMemory(platform.bankNumbers.toList, platform.bankFill, platform.isBigEndian)
|
||||||
val labelMap: mutable.Map[String, (Int, Int)] = mutable.Map()
|
val labelMap: mutable.Map[String, (Int, Int)] = mutable.Map()
|
||||||
|
val unimportantLabelMap: mutable.Map[String, (Int, Int)] = mutable.Map()
|
||||||
val breakpointSet: mutable.Set[(Int, Int)] = mutable.Set()
|
val breakpointSet: mutable.Set[(Int, Int)] = mutable.Set()
|
||||||
private val bytesToWriteLater = mutable.ListBuffer[(String, Int, Constant, Option[Position])]()
|
private val bytesToWriteLater = mutable.ListBuffer[(String, Int, Constant, Option[Position])]()
|
||||||
private val wordsToWriteLater = mutable.ListBuffer[(String, Int, Constant, Option[Position])]()
|
private val wordsToWriteLater = mutable.ListBuffer[(String, Int, Constant, Option[Position])]()
|
||||||
@ -115,6 +116,7 @@ abstract class AbstractAssembler[T <: AbstractCode](private val program: Program
|
|||||||
if (labelMap.contains(th.name)) return labelMap(th.name)._2
|
if (labelMap.contains(th.name)) return labelMap(th.name)._2
|
||||||
if (labelMap.contains(th.name + "`")) return labelMap(th.name)._2
|
if (labelMap.contains(th.name + "`")) return labelMap(th.name)._2
|
||||||
if (labelMap.contains(th.name + ".addr")) return labelMap.getOrElse[(Int, Int)](th.name, labelMap(th.name + ".array"))._2
|
if (labelMap.contains(th.name + ".addr")) return labelMap.getOrElse[(Int, Int)](th.name, labelMap(th.name + ".array"))._2
|
||||||
|
if (unimportantLabelMap.contains(th.name)) return labelMap(th.name)._2
|
||||||
val x1 = env.maybeGet[ConstantThing](th.name).map(_.value)
|
val x1 = env.maybeGet[ConstantThing](th.name).map(_.value)
|
||||||
val x2 = env.maybeGet[ConstantThing](th.name + "`").map(_.value)
|
val x2 = env.maybeGet[ConstantThing](th.name + "`").map(_.value)
|
||||||
val x3 = env.maybeGet[NormalFunction](th.name).flatMap(_.address)
|
val x3 = env.maybeGet[NormalFunction](th.name).flatMap(_.address)
|
||||||
@ -137,6 +139,7 @@ abstract class AbstractAssembler[T <: AbstractCode](private val program: Program
|
|||||||
}
|
}
|
||||||
case badThing@UnexpandedConstant(name, _) =>
|
case badThing@UnexpandedConstant(name, _) =>
|
||||||
if (labelMap.contains(name)) labelMap(name)._2
|
if (labelMap.contains(name)) labelMap(name)._2
|
||||||
|
else if (unimportantLabelMap.contains(name)) unimportantLabelMap(name)._2
|
||||||
else {
|
else {
|
||||||
println(badThing)
|
println(badThing)
|
||||||
???
|
???
|
||||||
@ -594,9 +597,9 @@ abstract class AbstractAssembler[T <: AbstractCode](private val program: Program
|
|||||||
val size = rwDataEnd - rwDataStart
|
val size = rwDataEnd - rwDataStart
|
||||||
if (size < 0) log.fatal("Negative writable memory size. It's a compiler bug.")
|
if (size < 0) log.fatal("Negative writable memory size. It's a compiler bug.")
|
||||||
val ivAddr = codeAllocators(ivBank).allocateBytes(ib, options, size, initialized = true, writeable = false, AllocationLocation.High, NoAlignment)
|
val ivAddr = codeAllocators(ivBank).allocateBytes(ib, options, size, initialized = true, writeable = false, AllocationLocation.High, NoAlignment)
|
||||||
labelMap += "__rwdata_init_start" -> (ib.index -> ivAddr)
|
unimportantLabelMap += "__rwdata_init_start" -> (ib.index -> ivAddr)
|
||||||
labelMap += "__rwdata_init_end" -> (ib.index -> (ivAddr + size))
|
unimportantLabelMap += "__rwdata_init_end" -> (ib.index -> (ivAddr + size))
|
||||||
labelMap += "__rwdata_size" -> (ib.index -> size)
|
unimportantLabelMap += "__rwdata_size" -> (ib.index -> size)
|
||||||
for (i <- 0 until size) {
|
for (i <- 0 until size) {
|
||||||
ib.output(ivAddr + i) = db.output(rwDataStart + i)
|
ib.output(ivAddr + i) = db.output(rwDataStart + i)
|
||||||
}
|
}
|
||||||
@ -633,26 +636,26 @@ abstract class AbstractAssembler[T <: AbstractCode](private val program: Program
|
|||||||
if (platform.freeZpBytes.nonEmpty) {
|
if (platform.freeZpBytes.nonEmpty) {
|
||||||
val zpUsageOffset = platform.freeZpBytes.min
|
val zpUsageOffset = platform.freeZpBytes.min
|
||||||
val zeropageOccupation = zpOccupied.slice(zpUsageOffset, platform.freeZpBytes.max + 1)
|
val zeropageOccupation = zpOccupied.slice(zpUsageOffset, platform.freeZpBytes.max + 1)
|
||||||
labelMap += "__zeropage_usage" -> (defaultBank, zeropageOccupation.lastIndexOf(true) - zeropageOccupation.indexOf(true) + 1)
|
unimportantLabelMap += "__zeropage_usage" -> (defaultBank, zeropageOccupation.lastIndexOf(true) - zeropageOccupation.indexOf(true) + 1)
|
||||||
labelMap += "__zeropage_first" -> (defaultBank, zpUsageOffset + (zeropageOccupation.indexOf(true) max 0))
|
unimportantLabelMap += "__zeropage_first" -> (defaultBank, zpUsageOffset + (zeropageOccupation.indexOf(true) max 0))
|
||||||
labelMap += "__zeropage_last" -> (defaultBank, zpUsageOffset + (zeropageOccupation.lastIndexOf(true) max 0))
|
unimportantLabelMap += "__zeropage_last" -> (defaultBank, zpUsageOffset + (zeropageOccupation.lastIndexOf(true) max 0))
|
||||||
labelMap += "__zeropage_end" -> (defaultBank, zpUsageOffset + zeropageOccupation.lastIndexOf(true) + 1)
|
unimportantLabelMap += "__zeropage_end" -> (defaultBank, zpUsageOffset + zeropageOccupation.lastIndexOf(true) + 1)
|
||||||
} else {
|
} else {
|
||||||
labelMap += "__zeropage_usage" -> (defaultBank -> 0)
|
unimportantLabelMap += "__zeropage_usage" -> (defaultBank -> 0)
|
||||||
labelMap += "__zeropage_first" -> (defaultBank -> 3)
|
unimportantLabelMap += "__zeropage_first" -> (defaultBank -> 3)
|
||||||
labelMap += "__zeropage_last" -> (defaultBank -> 2)
|
unimportantLabelMap += "__zeropage_last" -> (defaultBank -> 2)
|
||||||
labelMap += "__zeropage_end" -> (defaultBank -> 3)
|
unimportantLabelMap += "__zeropage_end" -> (defaultBank -> 3)
|
||||||
}
|
}
|
||||||
labelMap += "__rwdata_start" -> (defaultBank -> rwDataStart)
|
unimportantLabelMap += "__rwdata_start" -> (defaultBank -> rwDataStart)
|
||||||
labelMap += "__rwdata_end" -> (defaultBank -> rwDataEnd)
|
unimportantLabelMap += "__rwdata_end" -> (defaultBank -> rwDataEnd)
|
||||||
labelMap += "__heap_start" -> (defaultBank -> variableAllocators("default").heapStart)
|
unimportantLabelMap += "__heap_start" -> (defaultBank -> variableAllocators("default").heapStart)
|
||||||
for (segment <- platform.bankNumbers.keys) {
|
for (segment <- platform.bankNumbers.keys) {
|
||||||
val allocator = options.platform.variableAllocators(segment)
|
val allocator = options.platform.variableAllocators(segment)
|
||||||
labelMap += s"segment.$segment.start" -> (defaultBank -> allocator.startAt)
|
unimportantLabelMap += s"segment.$segment.start" -> (defaultBank -> allocator.startAt)
|
||||||
labelMap += s"segment.$segment.end" -> (defaultBank -> (allocator.endBefore - 1))
|
unimportantLabelMap += s"segment.$segment.end" -> (defaultBank -> (allocator.endBefore - 1))
|
||||||
labelMap += s"segment.$segment.heapstart" -> (defaultBank -> allocator.heapStart)
|
unimportantLabelMap += s"segment.$segment.heapstart" -> (defaultBank -> allocator.heapStart)
|
||||||
labelMap += s"segment.$segment.length" -> (defaultBank -> (allocator.endBefore - allocator.startAt))
|
unimportantLabelMap += s"segment.$segment.length" -> (defaultBank -> (allocator.endBefore - allocator.startAt))
|
||||||
labelMap += s"segment.$segment.bank" -> (defaultBank -> platform.bankNumbers(segment))
|
unimportantLabelMap += s"segment.$segment.bank" -> (defaultBank -> platform.bankNumbers(segment))
|
||||||
}
|
}
|
||||||
|
|
||||||
env = rootEnv.allThings
|
env = rootEnv.allThings
|
||||||
@ -679,11 +682,11 @@ abstract class AbstractAssembler[T <: AbstractCode](private val program: Program
|
|||||||
mem.banks(bank).start = start
|
mem.banks(bank).start = start
|
||||||
mem.banks(bank).end = end
|
mem.banks(bank).end = end
|
||||||
}
|
}
|
||||||
|
val allLabelList = labelMap.toList ++ unimportantLabelMap.toList
|
||||||
labelMap.toList.sorted.foreach { case (l, (_, v)) =>
|
allLabelList.sorted.foreach { case (l, (_, v)) =>
|
||||||
assembly += f"$l%-30s = $$$v%04X"
|
assembly += f"$l%-30s = $$$v%04X"
|
||||||
}
|
}
|
||||||
labelMap.toList.sortBy { case (a, (_, v)) => v -> a }.foreach { case (l, (_, v)) =>
|
allLabelList.sortBy { case (a, (_, v)) => v -> a }.foreach { case (l, (_, v)) =>
|
||||||
assembly += f" ; $$$v%04X = $l%s"
|
assembly += f" ; $$$v%04X = $l%s"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
31
src/test/scala/millfork/test/UnimportantLabelSuite.scala
Normal file
31
src/test/scala/millfork/test/UnimportantLabelSuite.scala
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
package millfork.test
|
||||||
|
|
||||||
|
import millfork.Cpu
|
||||||
|
import millfork.test.emu.{EmuCrossPlatformBenchmarkRun, EmuUnoptimizedCrossPlatformRun}
|
||||||
|
import org.scalatest.{FunSuite, Matchers}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Karol Stasiak
|
||||||
|
*/
|
||||||
|
class UnimportantLabelSuite extends FunSuite with Matchers {
|
||||||
|
|
||||||
|
test("Unimportant labels") {
|
||||||
|
EmuUnoptimizedCrossPlatformRun(Cpu.Mos)(
|
||||||
|
"""
|
||||||
|
|
|
||||||
|
| array(word) output[6] @$c000
|
||||||
|
| void main() {
|
||||||
|
| output[0] = segment.default.start
|
||||||
|
| output[1] = segment.default.end
|
||||||
|
| output[2] = segment.default.heapstart
|
||||||
|
| output[3] = segment.default.length
|
||||||
|
| output[4] = segment.default.bank
|
||||||
|
| output[5] = __rwdata_start
|
||||||
|
| output[6] = __rwdata_end
|
||||||
|
| output[7] = __heap_start
|
||||||
|
| }
|
||||||
|
""".stripMargin) { m =>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user