mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-18 03:24:00 +00:00
Fix function order - no random failures anymore!
This commit is contained in:
@@ -81,9 +81,24 @@ func (c *Compiler) Parse(path string) error {
|
|||||||
program.Build()
|
program.Build()
|
||||||
for _, pkg := range program.AllPackages() {
|
for _, pkg := range program.AllPackages() {
|
||||||
fmt.Println("package:", pkg.Pkg.Name())
|
fmt.Println("package:", pkg.Pkg.Name())
|
||||||
|
|
||||||
|
// First, build all function declarations.
|
||||||
|
for name, member := range pkg.Members {
|
||||||
|
if name == "init" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if member, ok := member.(*ssa.Function); ok {
|
||||||
|
err := c.parseFuncDecl(pkg.Pkg.Name(), member)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now, add definitions to those declarations.
|
||||||
for name, member := range pkg.Members {
|
for name, member := range pkg.Members {
|
||||||
fmt.Println("member:", name, member, member.Token())
|
fmt.Println("member:", name, member, member.Token())
|
||||||
if member.Name() == "init" {
|
if name == "init" {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
switch member := member.(type) {
|
switch member := member.(type) {
|
||||||
@@ -102,17 +117,21 @@ func (c *Compiler) Parse(path string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Compiler) parseFunc(pkgName string, f *ssa.Function) error {
|
func (c *Compiler) parseFuncDecl(pkgName string, f *ssa.Function) error {
|
||||||
fmt.Println("func:", f.Name(), f.Blocks, "len:", len(f.Blocks))
|
|
||||||
|
|
||||||
var fnType llvm.Type
|
var fnType llvm.Type
|
||||||
if f.Signature.Results() == nil {
|
if f.Signature.Results() == nil {
|
||||||
fnType = llvm.FunctionType(llvm.VoidType(), nil, false)
|
fnType = llvm.FunctionType(llvm.VoidType(), nil, false)
|
||||||
} else {
|
} else {
|
||||||
return errors.New("todo: return values")
|
return errors.New("todo: return values")
|
||||||
}
|
}
|
||||||
|
llvm.AddFunction(c.mod, pkgName + "." + f.Name(), fnType)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
fn := llvm.AddFunction(c.mod, pkgName + "." + f.Name(), fnType)
|
func (c *Compiler) parseFunc(pkgName string, f *ssa.Function) error {
|
||||||
|
fmt.Println("func:", f.Name(), f.Blocks, "len:", len(f.Blocks))
|
||||||
|
|
||||||
|
fn := c.mod.NamedFunction(pkgName + "." + f.Name())
|
||||||
start := c.ctx.AddBasicBlock(fn, "start")
|
start := c.ctx.AddBasicBlock(fn, "start")
|
||||||
c.builder.SetInsertPointAtEnd(start)
|
c.builder.SetInsertPointAtEnd(start)
|
||||||
|
|
||||||
@@ -188,7 +207,7 @@ func (c *Compiler) parseBuiltin(instr *ssa.CallCommon, call *ssa.Builtin) error
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *Compiler) parseFunctionCall(pkgName string, instr *ssa.CallCommon, call *ssa.Function) error {
|
func (c *Compiler) parseFunctionCall(pkgName string, instr *ssa.CallCommon, call *ssa.Function) error {
|
||||||
fmt.Printf(" function: %#v\n", call)
|
fmt.Printf(" function: %s\n", call)
|
||||||
|
|
||||||
name := call.Name()
|
name := call.Name()
|
||||||
if strings.IndexByte(name, '.') == -1 {
|
if strings.IndexByte(name, '.') == -1 {
|
||||||
|
|||||||
Reference in New Issue
Block a user