All Downloads are FREE. Search and download functionalities are using the official Maven repository.

scala.scalanative.optimizer.pass.ConstLowering.scala Maven / Gradle / Ivy

The newest version!
package scala.scalanative
package optimizer
package pass

import scala.collection.mutable
import analysis.ClassHierarchy.Top
import nir._

/** Maps const values to top-level deduplicated constants.
 */
class ConstLowering extends Pass {
  private val consts   = mutable.UnrolledBuffer.empty[Val]
  private val constfor = mutable.Map.empty[Val, Int]
  private def constName(idx: Int): Global =
    Global.Member(Global.Top("__const"), " " + this.## + "." + idx.toString)
  private def constFor(v: Val): Int =
    if (constfor.contains(v)) {
      constfor(v)
    } else {
      consts += v
      constfor(v) = consts.length - 1
      consts.length - 1
    }

  override def onDefns(defns: Seq[Defn]): Seq[Defn] =
    super.onDefns(defns) ++ consts.zipWithIndex.map {
      case (v, idx) =>
        Defn.Const(Attrs.None, constName(idx), v.ty, v)
    }

  override def onVal(value: Val): Val = value match {
    case Val.Const(v) =>
      Val.Global(constName(constFor(onVal(v))), Type.Ptr)
    case _ =>
      super.onVal(value)
  }
}

object ConstLowering extends PassCompanion {
  override def apply(config: tools.Config, top: Top) =
    new ConstLowering
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy