TestFuncParam
This commit is contained in:
25
ssa/decl.go
25
ssa/decl.go
@@ -17,6 +17,8 @@
|
|||||||
package ssa
|
package ssa
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"go/types"
|
||||||
|
|
||||||
"github.com/goplus/llvm"
|
"github.com/goplus/llvm"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -105,11 +107,32 @@ type aFunction struct {
|
|||||||
Type
|
Type
|
||||||
|
|
||||||
prog Program
|
prog Program
|
||||||
|
|
||||||
|
params []Type
|
||||||
}
|
}
|
||||||
|
|
||||||
type Function = *aFunction
|
type Function = *aFunction
|
||||||
|
|
||||||
func (p *aFunction) MakeBody(label string) Builder {
|
func newFunction(fn llvm.Value, t Type, prog Program) Function {
|
||||||
|
ret := &aFunction{fn, t, prog, newParams(t, prog)}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func newParams(fn Type, prog Program) []Type {
|
||||||
|
in := fn.t.(*types.Signature).Params()
|
||||||
|
n := in.Len()
|
||||||
|
ret := make([]Type, n)
|
||||||
|
for i := 0; i < n; i++ {
|
||||||
|
ret[i] = prog.llvmType(in.At(i).Type())
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p Function) Param(i int) Expr {
|
||||||
|
return Expr{p.impl.Param(i), p.params[i]}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p Function) MakeBody(label string) Builder {
|
||||||
body := llvm.AddBasicBlock(p.impl, label)
|
body := llvm.AddBasicBlock(p.impl, label)
|
||||||
prog := p.prog
|
prog := p.prog
|
||||||
b := prog.ctx.NewBuilder()
|
b := prog.ctx.NewBuilder()
|
||||||
|
|||||||
@@ -114,7 +114,7 @@ func (p Package) NewVar(name string, typ types.Type) Global {
|
|||||||
func (p Package) NewFunc(name string, sig *types.Signature) Function {
|
func (p Package) NewFunc(name string, sig *types.Signature) Function {
|
||||||
t := p.prog.llvmSignature(sig)
|
t := p.prog.llvmSignature(sig)
|
||||||
fn := llvm.AddFunction(p.mod, name, t.ll)
|
fn := llvm.AddFunction(p.mod, name, t.ll)
|
||||||
return &aFunction{fn, t, p.prog}
|
return newFunction(fn, t, p.prog)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p Package) String() string {
|
func (p Package) String() string {
|
||||||
|
|||||||
@@ -95,15 +95,37 @@ declare void @fn(i64)
|
|||||||
func TestBasicFunc(t *testing.T) {
|
func TestBasicFunc(t *testing.T) {
|
||||||
prog := NewProgram(nil)
|
prog := NewProgram(nil)
|
||||||
pkg := prog.NewPackage("bar", "foo/bar")
|
pkg := prog.NewPackage("bar", "foo/bar")
|
||||||
rets := types.NewTuple(types.NewVar(0, nil, "a", types.Typ[types.Int]))
|
params := types.NewTuple(
|
||||||
sig := types.NewSignatureType(nil, nil, nil, nil, rets, false)
|
types.NewVar(0, nil, "a", types.Typ[types.Int]),
|
||||||
b := pkg.NewFunc("fn", sig).MakeBody("")
|
types.NewVar(0, nil, "b", types.Typ[types.Float64]))
|
||||||
b.Return(prog.Val(1))
|
rets := types.NewTuple(types.NewVar(0, nil, "", types.Typ[types.Int]))
|
||||||
|
sig := types.NewSignatureType(nil, nil, nil, params, rets, false)
|
||||||
|
pkg.NewFunc("fn", sig).MakeBody("").
|
||||||
|
Return(prog.Val(1))
|
||||||
assertPkg(t, pkg, `; ModuleID = 'foo/bar'
|
assertPkg(t, pkg, `; ModuleID = 'foo/bar'
|
||||||
source_filename = "foo/bar"
|
source_filename = "foo/bar"
|
||||||
|
|
||||||
define i64 @fn() {
|
define i64 @fn(i64 %0, double %1) {
|
||||||
ret i64 1
|
ret i64 1
|
||||||
}
|
}
|
||||||
`)
|
`)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestFuncParam(t *testing.T) {
|
||||||
|
prog := NewProgram(nil)
|
||||||
|
pkg := prog.NewPackage("bar", "foo/bar")
|
||||||
|
params := types.NewTuple(
|
||||||
|
types.NewVar(0, nil, "a", types.Typ[types.Int]),
|
||||||
|
types.NewVar(0, nil, "b", types.Typ[types.Float64]))
|
||||||
|
rets := types.NewTuple(types.NewVar(0, nil, "", types.Typ[types.Int]))
|
||||||
|
sig := types.NewSignatureType(nil, nil, nil, params, rets, false)
|
||||||
|
fn := pkg.NewFunc("fn", sig)
|
||||||
|
fn.MakeBody("").Return(fn.Param(1))
|
||||||
|
assertPkg(t, pkg, `; ModuleID = 'foo/bar'
|
||||||
|
source_filename = "foo/bar"
|
||||||
|
|
||||||
|
define i64 @fn(i64 %0, double %1) {
|
||||||
|
ret double %1
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user