mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-21 12:59:04 +00:00
Move Compiler.program to Program.program
This commit is contained in:
+7
-11
@@ -46,8 +46,6 @@ type Compiler struct {
|
|||||||
coroSuspendFunc llvm.Value
|
coroSuspendFunc llvm.Value
|
||||||
coroEndFunc llvm.Value
|
coroEndFunc llvm.Value
|
||||||
coroFreeFunc llvm.Value
|
coroFreeFunc llvm.Value
|
||||||
program *ssa.Program
|
|
||||||
mainPkg *ssa.Package
|
|
||||||
initFuncs []llvm.Value
|
initFuncs []llvm.Value
|
||||||
ir *Program
|
ir *Program
|
||||||
}
|
}
|
||||||
@@ -73,7 +71,6 @@ func NewCompiler(pkgName, triple string, dumpSSA bool) (*Compiler, error) {
|
|||||||
c := &Compiler{
|
c := &Compiler{
|
||||||
dumpSSA: dumpSSA,
|
dumpSSA: dumpSSA,
|
||||||
triple: triple,
|
triple: triple,
|
||||||
ir: NewProgram(),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
target, err := llvm.GetTargetFromTriple(triple)
|
target, err := llvm.GetTargetFromTriple(triple)
|
||||||
@@ -160,10 +157,9 @@ func (c *Compiler) Parse(mainPath string, buildTags []string) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
c.program = ssautil.CreateProgram(lprogram, ssa.SanityCheckFunctions|ssa.BareInits)
|
program := ssautil.CreateProgram(lprogram, ssa.SanityCheckFunctions|ssa.BareInits)
|
||||||
c.program.Build()
|
program.Build()
|
||||||
|
c.ir = NewProgram(program, mainPath)
|
||||||
c.mainPkg = c.program.ImportedPackage(mainPath)
|
|
||||||
|
|
||||||
// Make a list of packages in import order.
|
// Make a list of packages in import order.
|
||||||
packageList := []*ssa.Package{}
|
packageList := []*ssa.Package{}
|
||||||
@@ -171,7 +167,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 := c.program.ImportedPackage(pkgPath)
|
pkg := 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{}{}
|
||||||
@@ -322,12 +318,12 @@ func (c *Compiler) Parse(mainPath string, buildTags []string) error {
|
|||||||
|
|
||||||
// Adjust main function.
|
// Adjust main function.
|
||||||
main := c.mod.NamedFunction("main.main")
|
main := c.mod.NamedFunction("main.main")
|
||||||
realMain := c.mod.NamedFunction(c.mainPkg.Pkg.Path() + ".main")
|
realMain := c.mod.NamedFunction(c.ir.mainPkg.Pkg.Path() + ".main")
|
||||||
if !realMain.IsNil() {
|
if !realMain.IsNil() {
|
||||||
main.ReplaceAllUsesWith(realMain)
|
main.ReplaceAllUsesWith(realMain)
|
||||||
}
|
}
|
||||||
mainAsync := c.mod.NamedFunction("main.main$async")
|
mainAsync := c.mod.NamedFunction("main.main$async")
|
||||||
realMainAsync := c.mod.NamedFunction(c.mainPkg.Pkg.Path() + ".main$async")
|
realMainAsync := c.mod.NamedFunction(c.ir.mainPkg.Pkg.Path() + ".main$async")
|
||||||
if !realMainAsync.IsNil() {
|
if !realMainAsync.IsNil() {
|
||||||
mainAsync.ReplaceAllUsesWith(realMainAsync)
|
mainAsync.ReplaceAllUsesWith(realMainAsync)
|
||||||
}
|
}
|
||||||
@@ -361,7 +357,7 @@ func (c *Compiler) Parse(mainPath string, buildTags []string) error {
|
|||||||
tuple := llvm.ConstNamedStruct(tupleType, tupleValues)
|
tuple := llvm.ConstNamedStruct(tupleType, tupleValues)
|
||||||
tuples = append(tuples, tuple)
|
tuples = append(tuples, tuple)
|
||||||
for _, method := range meta.Methods {
|
for _, method := range meta.Methods {
|
||||||
f := c.ir.GetFunction(c.program.MethodValue(method))
|
f := c.ir.GetFunction(program.MethodValue(method))
|
||||||
if f.llvmFn.IsNil() {
|
if f.llvmFn.IsNil() {
|
||||||
return errors.New("cannot find function: " + f.Name(false))
|
return errors.New("cannot find function: " + f.Name(false))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ import (
|
|||||||
// View on all functions, types, and globals in a program, with analysis
|
// View on all functions, types, and globals in a program, with analysis
|
||||||
// results.
|
// results.
|
||||||
type Program struct {
|
type Program struct {
|
||||||
|
program *ssa.Program
|
||||||
|
mainPkg *ssa.Package
|
||||||
Functions []*Function
|
Functions []*Function
|
||||||
functionMap map[*ssa.Function]*Function
|
functionMap map[*ssa.Function]*Function
|
||||||
Globals []*Global
|
Globals []*Global
|
||||||
@@ -52,8 +54,11 @@ type InterfaceType struct {
|
|||||||
Methods map[string]*types.Selection
|
Methods map[string]*types.Selection
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewProgram() *Program {
|
// Create and intialize a new *Program from a *ssa.Program.
|
||||||
|
func NewProgram(program *ssa.Program, mainPath string) *Program {
|
||||||
return &Program{
|
return &Program{
|
||||||
|
program: program,
|
||||||
|
mainPkg: program.ImportedPackage(mainPath),
|
||||||
functionMap: make(map[*ssa.Function]*Function),
|
functionMap: make(map[*ssa.Function]*Function),
|
||||||
globalMap: make(map[*ssa.Global]*Global),
|
globalMap: make(map[*ssa.Global]*Global),
|
||||||
methodSignatureNames: make(map[string]int),
|
methodSignatureNames: make(map[string]int),
|
||||||
|
|||||||
Reference in New Issue
Block a user