1
0
mirror of https://github.com/KarolS/millfork.git synced 2024-08-12 11:29:20 +00:00

Don't remove things referred to only by aliases

This commit is contained in:
Karol Stasiak 2018-12-17 17:03:01 +01:00
parent 007b1dc839
commit dfd9dd4c6a
3 changed files with 20 additions and 3 deletions

View File

@ -14,4 +14,14 @@ trait NodeOptimization {
def optimizeStatements(nodes: List[Statement], options: CompilationOptions): List[Statement] =
optimize(nodes, options).asInstanceOf[List[Statement]]
def resolveAliases(aliases: Map[String, String], set: Set[String]):Set[String] = {
var result = set
var lastSize = set.size
do {
lastSize = set.size
result = result.flatMap(name => aliases.get(name).fold(Set(name))(Set(_, name)))
} while(lastSize != set.size)
result
}
}

View File

@ -28,12 +28,16 @@ object UnusedFunctions extends NodeOptimization {
)
override def optimize(nodes: List[Node], options: CompilationOptions): List[Node] = {
val aliases = nodes.flatMap{
case AliasDefinitionStatement(source, target) => Some(source -> target)
case _ => None
}.toMap
val panicRequired = options.flags(CompilationFlag.CheckIndexOutOfBounds)
val allNormalFunctions = nodes.flatMap {
case v: FunctionDeclarationStatement => if (v.address.isDefined && v.statements.isDefined || v.interrupt || v.name == "main" || panicRequired && v.name == "_panic") Nil else List(v.name)
case _ => Nil
}.toSet
val allCalledFunctions = getAllCalledFunctions(nodes).toSet
val allCalledFunctions = resolveAliases(aliases, getAllCalledFunctions(nodes).toSet)
var unusedFunctions = allNormalFunctions -- allCalledFunctions
val effectiveZpSize = options.platform.cpuFamily match {
case CpuFamily.M6502 => options.zpRegisterSize

View File

@ -11,14 +11,17 @@ import millfork.node._
object UnusedGlobalVariables extends NodeOptimization {
override def optimize(nodes: List[Node], options: CompilationOptions): List[Node] = {
val aliases = nodes.flatMap{
case AliasDefinitionStatement(source, target) => Some(source -> target)
case _ => None
}.toMap
// TODO: volatile
val allNonvolatileGlobalVariables = nodes.flatMap {
case v: VariableDeclarationStatement => if (v.address.isDefined) Nil else List(v.name)
case v: ArrayDeclarationStatement => if (v.address.isDefined) Nil else List(v.name)
case _ => Nil
}.toSet
val allReadVariables = getAllReadVariables(nodes).toSet
val allReadVariables = resolveAliases(aliases, getAllReadVariables(nodes).toSet)
val unusedVariables = allNonvolatileGlobalVariables -- allReadVariables
if (unusedVariables.nonEmpty) {
options.log.debug("Removing unused global variables: " + unusedVariables.mkString(", "))