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

scala.scalanative.tools.package.scala Maven / Gradle / Ivy

The newest version!
package scala.scalanative

import scalanative.nir.Global

// API use-cases
//
// sbt plugin:
//   1. link & compile code
//
// compiler  test : VirtualDirectory -> World
//   1. virtual file system of some kind
//   2. instantiate scalac+nscplugin
//   3. run it and check invariants
//
// optimizer test : World -> World
//   1. define what passes we want
//   2. run them and check invariants
//
// code gen test : World -> Seq[String]
//   1. run code gen and check the string

package object tools {
  type LinkerPath = linker.ClassPath
  val LinkerPath = linker.ClassPath

  type LinkerReporter = linker.Reporter
  val LinkerReporter = linker.Reporter

  type LinkerResult = linker.Result
  val LinkerResult = linker.Result

  type OptimizerDriver = optimizer.Driver
  val OptimizerDriver = optimizer.Driver

  type OptimizerReporter = optimizer.Reporter
  val OptimizerReporter = optimizer.Reporter

  /** Given the classpath and main entry point, link under closed-world assumption. */
  def link(config: Config,
           driver: OptimizerDriver,
           reporter: LinkerReporter = LinkerReporter.empty): LinkerResult = {
    val deps    = driver.passes.flatMap(_.depends).distinct
    val injects = driver.passes.flatMap(_.injects).distinct
    val entry =
      nir.Global.Member(config.entry,
                        "main_scala.scalanative.runtime.ObjectArray_unit")
    val result =
      (linker.Linker(config, reporter)).link(entry +: deps)

    result.withDefns(result.defns ++ injects)
  }

  def linkRaw(config: Config,
              entries: Seq[Global],
              reporter: LinkerReporter = LinkerReporter.empty): LinkerResult =
    linker.Linker(config, reporter).link(entries)

  /** Transform high-level closed world to its lower-level counterpart. */
  def optimize(
      config: Config,
      driver: OptimizerDriver,
      assembly: Seq[nir.Defn],
      dyns: Seq[String],
      reporter: OptimizerReporter = OptimizerReporter.empty): Seq[nir.Defn] =
    optimizer.Optimizer(config, driver, assembly, dyns, reporter)

  /** Given low-level assembly, emit LLVM IR for it to the buildDirectory. */
  def codegen(config: Config, assembly: Seq[nir.Defn]): Unit =
    scalanative.codegen.CodeGen(config, assembly)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy