mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-17 11:13:27 +00:00
builder: build SSA before compiling packages
This commit is contained in:
committed by
Damian Gryski
parent
570a3deac2
commit
c33682cf00
+9
-2
@@ -24,6 +24,7 @@ import (
|
|||||||
"sort"
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
|
|
||||||
"github.com/gofrs/flock"
|
"github.com/gofrs/flock"
|
||||||
"github.com/tinygo-org/tinygo/compileopts"
|
"github.com/tinygo-org/tinygo/compileopts"
|
||||||
@@ -269,6 +270,7 @@ func Build(pkgName, outpath, tmpdir string, config *compileopts.Config) (BuildRe
|
|||||||
// Create the *ssa.Program. This does not yet build the entire SSA of the
|
// Create the *ssa.Program. This does not yet build the entire SSA of the
|
||||||
// program so it's pretty fast and doesn't need to be parallelized.
|
// program so it's pretty fast and doesn't need to be parallelized.
|
||||||
program := lprogram.LoadSSA()
|
program := lprogram.LoadSSA()
|
||||||
|
buildProgram := sync.OnceFunc(program.Build)
|
||||||
|
|
||||||
// Add jobs to compile each package.
|
// Add jobs to compile each package.
|
||||||
// Packages that have a cache hit will not be compiled again.
|
// Packages that have a cache hit will not be compiled again.
|
||||||
@@ -398,8 +400,13 @@ func Build(pkgName, outpath, tmpdir string, config *compileopts.Config) (BuildRe
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compile AST to IR. The compiler.CompilePackage function will
|
// SSA package builds may run concurrently, but the resulting
|
||||||
// build the SSA as needed.
|
// functions cannot be inspected until all builds have finished:
|
||||||
|
// generic instances and wrappers can be shared across packages.
|
||||||
|
// Build the whole program once before compiling any package.
|
||||||
|
buildProgram()
|
||||||
|
|
||||||
|
// Compile AST to IR.
|
||||||
mod, errs := compiler.CompilePackage(pkg.ImportPath, pkg, program.Package(pkg.Pkg), machine, compilerConfig, config.DumpSSA())
|
mod, errs := compiler.CompilePackage(pkg.ImportPath, pkg, program.Package(pkg.Pkg), machine, compilerConfig, config.DumpSSA())
|
||||||
defer mod.Context().Dispose()
|
defer mod.Context().Dispose()
|
||||||
defer mod.Dispose()
|
defer mod.Dispose()
|
||||||
|
|||||||
@@ -296,6 +296,9 @@ func Sizes(machine llvm.TargetMachine) types.Sizes {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// CompilePackage compiles a single package to a LLVM module.
|
// CompilePackage compiles a single package to a LLVM module.
|
||||||
|
//
|
||||||
|
// The SSA package must already be built. When packages are compiled
|
||||||
|
// concurrently, the entire SSA program must be built before compilation starts.
|
||||||
func CompilePackage(moduleName string, pkg *loader.Package, ssaPkg *ssa.Package, machine llvm.TargetMachine, config *Config, dumpSSA bool) (llvm.Module, []error) {
|
func CompilePackage(moduleName string, pkg *loader.Package, ssaPkg *ssa.Package, machine llvm.TargetMachine, config *Config, dumpSSA bool) (llvm.Module, []error) {
|
||||||
c := newCompilerContext(moduleName, machine, config, dumpSSA)
|
c := newCompilerContext(moduleName, machine, config, dumpSSA)
|
||||||
defer c.dispose()
|
defer c.dispose()
|
||||||
@@ -306,9 +309,6 @@ func CompilePackage(moduleName string, pkg *loader.Package, ssaPkg *ssa.Package,
|
|||||||
c.runtimePkg = ssaPkg.Prog.ImportedPackage("runtime").Pkg
|
c.runtimePkg = ssaPkg.Prog.ImportedPackage("runtime").Pkg
|
||||||
c.program = ssaPkg.Prog
|
c.program = ssaPkg.Prog
|
||||||
|
|
||||||
// Convert AST to SSA.
|
|
||||||
ssaPkg.Build()
|
|
||||||
|
|
||||||
// Assign names to function-local named types before compiling the
|
// Assign names to function-local named types before compiling the
|
||||||
// package, so that types declared in different functions (or in
|
// package, so that types declared in different functions (or in
|
||||||
// different instantiations of a generic function) do not collide.
|
// different instantiations of a generic function) do not collide.
|
||||||
|
|||||||
@@ -413,5 +413,7 @@ func testCompilePackage(t *testing.T, options *compileopts.Options, file string)
|
|||||||
// Compile AST to IR.
|
// Compile AST to IR.
|
||||||
program := lprogram.LoadSSA()
|
program := lprogram.LoadSSA()
|
||||||
pkg := lprogram.MainPkg()
|
pkg := lprogram.MainPkg()
|
||||||
return CompilePackage(file, pkg, program.Package(pkg.Pkg), machine, compilerConfig, false)
|
ssaPkg := program.Package(pkg.Pkg)
|
||||||
|
ssaPkg.Build()
|
||||||
|
return CompilePackage(file, pkg, ssaPkg, machine, compilerConfig, false)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -224,7 +224,9 @@ func compileGoFileForTesting(t *testing.T, filename string) llvm.Module {
|
|||||||
// Compile AST to IR.
|
// Compile AST to IR.
|
||||||
program := lprogram.LoadSSA()
|
program := lprogram.LoadSSA()
|
||||||
pkg := lprogram.MainPkg()
|
pkg := lprogram.MainPkg()
|
||||||
mod, errs := compiler.CompilePackage(filename, pkg, program.Package(pkg.Pkg), machine, compilerConfig, false)
|
ssaPkg := program.Package(pkg.Pkg)
|
||||||
|
ssaPkg.Build()
|
||||||
|
mod, errs := compiler.CompilePackage(filename, pkg, ssaPkg, machine, compilerConfig, false)
|
||||||
if errs != nil {
|
if errs != nil {
|
||||||
for _, err := range errs {
|
for _, err := range errs {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
|
|||||||
Reference in New Issue
Block a user