compiler: move SSA construction to ir.go

Этот коммит содержится в:
Ayke van Laethem 2018-09-21 14:09:39 +02:00
родитель 2496ae9967
коммит 2ca2220e44
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: E97FF5335DFDFDED
2 изменённых файлов: 9 добавлений и 7 удалений

Просмотреть файл

@ -17,7 +17,6 @@ import (
"go/parser" "go/parser"
"golang.org/x/tools/go/loader" "golang.org/x/tools/go/loader"
"golang.org/x/tools/go/ssa" "golang.org/x/tools/go/ssa"
"golang.org/x/tools/go/ssa/ssautil"
) )
func init() { func init() {
@ -179,9 +178,7 @@ func (c *Compiler) Parse(mainPath string, buildTags []string) error {
} }
} }
program := ssautil.CreateProgram(lprogram, ssa.SanityCheckFunctions|ssa.BareInits|ssa.GlobalDebug) c.ir = NewProgram(lprogram, mainPath)
program.Build()
c.ir = NewProgram(program, mainPath)
// Make a list of packages in import order. // Make a list of packages in import order.
packageList := []*ssa.Package{} packageList := []*ssa.Package{}
@ -189,7 +186,7 @@ func (c *Compiler) Parse(mainPath string, buildTags []string) error {
worklist := []string{"runtime", mainPath} worklist := []string{"runtime", mainPath}
for len(worklist) != 0 { for len(worklist) != 0 {
pkgPath := worklist[0] pkgPath := worklist[0]
pkg := program.ImportedPackage(pkgPath) pkg := c.ir.program.ImportedPackage(pkgPath)
if pkg == nil { if pkg == nil {
// Non-SSA package (e.g. cgo). // Non-SSA package (e.g. cgo).
packageSet[pkgPath] = struct{}{} packageSet[pkgPath] = struct{}{}
@ -444,7 +441,7 @@ func (c *Compiler) Parse(mainPath string, buildTags []string) error {
} }
c.ir.SortMethods(methods) c.ir.SortMethods(methods)
for _, method := range methods { for _, method := range methods {
f := c.ir.GetFunction(program.MethodValue(method)) f := c.ir.GetFunction(c.ir.program.MethodValue(method))
if f.llvmFn.IsNil() { if f.llvmFn.IsNil() {
return errors.New("cannot find function: " + f.LinkName()) return errors.New("cannot find function: " + f.LinkName())
} }

7
ir.go
Просмотреть файл

@ -7,7 +7,9 @@ import (
"strings" "strings"
"github.com/aykevl/llvm/bindings/go/llvm" "github.com/aykevl/llvm/bindings/go/llvm"
"golang.org/x/tools/go/loader"
"golang.org/x/tools/go/ssa" "golang.org/x/tools/go/ssa"
"golang.org/x/tools/go/ssa/ssautil"
) )
// This file provides a wrapper around go/ssa values and adds extra // This file provides a wrapper around go/ssa values and adds extra
@ -74,7 +76,10 @@ type Interface struct {
} }
// Create and intialize a new *Program from a *ssa.Program. // Create and intialize a new *Program from a *ssa.Program.
func NewProgram(program *ssa.Program, mainPath string) *Program { func NewProgram(lprogram *loader.Program, mainPath string) *Program {
program := ssautil.CreateProgram(lprogram, ssa.SanityCheckFunctions|ssa.BareInits|ssa.GlobalDebug)
program.Build()
return &Program{ return &Program{
program: program, program: program,
mainPkg: program.ImportedPackage(mainPath), mainPkg: program.ImportedPackage(mainPath),