Merge pull request #9 from xushiwei/q

TestFuncParam
This commit is contained in:
xushiwei
2024-04-18 17:17:56 +08:00
committed by GitHub
3 changed files with 52 additions and 7 deletions

View File

@@ -17,6 +17,8 @@
package ssa
import (
"go/types"
"github.com/goplus/llvm"
)
@@ -105,11 +107,32 @@ type aFunction struct {
Type
prog Program
params []Type
}
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)
prog := p.prog
b := prog.ctx.NewBuilder()

View File

@@ -114,7 +114,7 @@ func (p Package) NewVar(name string, typ types.Type) Global {
func (p Package) NewFunc(name string, sig *types.Signature) Function {
t := p.prog.llvmSignature(sig)
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 {

View File

@@ -95,15 +95,37 @@ declare void @fn(i64)
func TestBasicFunc(t *testing.T) {
prog := NewProgram(nil)
pkg := prog.NewPackage("bar", "foo/bar")
rets := types.NewTuple(types.NewVar(0, nil, "a", types.Typ[types.Int]))
sig := types.NewSignatureType(nil, nil, nil, nil, rets, false)
b := pkg.NewFunc("fn", sig).MakeBody("")
b.Return(prog.Val(1))
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)
pkg.NewFunc("fn", sig).MakeBody("").
Return(prog.Val(1))
assertPkg(t, pkg, `; ModuleID = 'foo/bar'
source_filename = "foo/bar"
define i64 @fn() {
define i64 @fn(i64 %0, double %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
}
`)
}