mirror of
https://github.com/KarolS/millfork.git
synced 2024-10-25 05:24:11 +00:00
Don't remove things referred to only by aliases
This commit is contained in:
parent
007b1dc839
commit
dfd9dd4c6a
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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(", "))
|
||||
|
Loading…
Reference in New Issue
Block a user