From f7dfab481b6dfb679721e72bf1b9db2b773b8234 Mon Sep 17 00:00:00 2001 From: xushiwei Date: Sun, 12 May 2024 23:08:44 +0800 Subject: [PATCH] vkPyFunc => vkPyFuncRef --- chore/gentests/gentests.go | 1 + cl/_testpy/callpy/out.ll | 14 ++++++++------ cl/_testpy/math/out.ll | 25 +++++++++++++++---------- cl/compile.go | 8 ++++---- ssa/decl.go | 16 ++++++++-------- ssa/expr.go | 2 +- ssa/package.go | 7 ++++--- ssa/type.go | 2 +- 8 files changed, 42 insertions(+), 33 deletions(-) diff --git a/chore/gentests/gentests.go b/chore/gentests/gentests.go index b57138a1..bb34a1a7 100644 --- a/chore/gentests/gentests.go +++ b/chore/gentests/gentests.go @@ -33,6 +33,7 @@ func main() { llgenDir(dir + "/cl/_testlibc") llgenDir(dir + "/cl/_testrt") + llgenDir(dir + "/cl/_testpy") llgenDir(dir+"/cl/_testdata", "") } diff --git a/cl/_testpy/callpy/out.ll b/cl/_testpy/callpy/out.ll index 437dd6f7..c982584d 100644 --- a/cl/_testpy/callpy/out.ll +++ b/cl/_testpy/callpy/out.ll @@ -40,12 +40,14 @@ _llgo_0: call void @"github.com/goplus/llgo/internal/runtime.init"() call void @main.init() %2 = call ptr @PyFloat_FromDouble(double 2.000000e+00) - %3 = call ptr @PyObject_CallOneArg(ptr @__llgo_py.math.sqrt, ptr %2) - %4 = call ptr @PyObject_CallNoArgs(ptr @__llgo_py.os.getcwd) - %5 = call double @PyFloat_AsDouble() - %6 = call i32 (ptr, ...) @printf(ptr @0, double %5) - %7 = call ptr @PyBytes_AsString() - %8 = call i32 (ptr, ...) @printf(ptr @1, ptr %7) + %3 = load ptr, ptr @__llgo_py.math.sqrt, align 8 + %4 = call ptr @PyObject_CallOneArg(ptr %3, ptr %2) + %5 = load ptr, ptr @__llgo_py.os.getcwd, align 8 + %6 = call ptr @PyObject_CallNoArgs(ptr %5) + %7 = call double @PyFloat_AsDouble() + %8 = call i32 (ptr, ...) @printf(ptr @0, double %7) + %9 = call ptr @PyBytes_AsString() + %10 = call i32 (ptr, ...) @printf(ptr @1, ptr %9) ret void } diff --git a/cl/_testpy/math/out.ll b/cl/_testpy/math/out.ll index f5feead3..66f80e8f 100644 --- a/cl/_testpy/math/out.ll +++ b/cl/_testpy/math/out.ll @@ -1,29 +1,34 @@ -; ModuleID = 'math' -source_filename = "math" +; ModuleID = 'command-line-arguments' +source_filename = "command-line-arguments" @__llgo_py.math.sqrt = external global ptr -@"math.init$guard" = global ptr null +@"command-line-arguments.init$guard" = global ptr null @__llgo_py.math = linkonce global ptr null @0 = private unnamed_addr constant [5 x i8] c"math\00", align 1 +@1 = private unnamed_addr constant [5 x i8] c"sqrt\00", align 1 -define void @math.init() { +define void @command-line-arguments.init() { _llgo_0: - %0 = load i1, ptr @"math.init$guard", align 1 + %0 = load i1, ptr @"command-line-arguments.init$guard", align 1 br i1 %0, label %_llgo_2, label %_llgo_1 _llgo_1: ; preds = %_llgo_0 - store i1 true, ptr @"math.init$guard", align 1 + store i1 true, ptr @"command-line-arguments.init$guard", align 1 %1 = load ptr, ptr @__llgo_py.math, align 8 - %2 = icmp ne ptr %1, null - br i1 %2, label %_llgo_2, label %_llgo_3 + call void (ptr, ...) @llgoLoadPyModSyms(ptr %1, ptr @1, ptr @__llgo_py.math.sqrt, ptr null) + %2 = load ptr, ptr @__llgo_py.math, align 8 + %3 = icmp ne ptr %2, null + br i1 %3, label %_llgo_2, label %_llgo_3 _llgo_2: ; preds = %_llgo_3, %_llgo_1, %_llgo_0 ret void _llgo_3: ; preds = %_llgo_1 - %3 = call ptr @PyImport_ImportModule(ptr @0) - store ptr %3, ptr @__llgo_py.math, align 8 + %4 = call ptr @PyImport_ImportModule(ptr @0) + store ptr %4, ptr @__llgo_py.math, align 8 br label %_llgo_2 } declare ptr @PyImport_ImportModule(ptr) + +declare void @llgoLoadPyModSyms(ptr, ...) diff --git a/cl/compile.go b/cl/compile.go index 18142e64..a786981b 100644 --- a/cl/compile.go +++ b/cl/compile.go @@ -211,7 +211,7 @@ var ( argvTy = types.NewPointer(types.NewPointer(types.Typ[types.Int8])) ) -func (p *context) compileFuncDecl(pkg llssa.Package, f *ssa.Function, call bool) (llssa.Function, llssa.PyObject, int) { +func (p *context) compileFuncDecl(pkg llssa.Package, f *ssa.Function, call bool) (llssa.Function, llssa.PyObjRef, int) { pkgTypes, name, ftype := p.funcName(f, true) if ftype != goFunc { if ftype == pyFunc { @@ -283,7 +283,7 @@ func (p *context) compileFuncDecl(pkg llssa.Package, f *ssa.Function, call bool) // funcOf returns a function by name and set ftype = goFunc, cFunc, etc. // or returns nil and set ftype = llgoCstr, llgoAlloca, llgoUnreachable, etc. -func (p *context) funcOf(fn *ssa.Function) (aFn llssa.Function, pyFn llssa.PyObject, ftype int) { +func (p *context) funcOf(fn *ssa.Function) (aFn llssa.Function, pyFn llssa.PyObjRef, ftype int) { pkgTypes, name, ftype := p.funcName(fn, false) switch ftype { case pyFunc: @@ -350,7 +350,7 @@ func (p *context) compileBlock(b llssa.Builder, block *ssa.BasicBlock, n int, do } p.inits = append(p.inits, func() { if objs := pkg.PyObjs(); len(objs) > 0 { - mods := make(map[string][]llssa.PyObject) + mods := make(map[string][]llssa.PyObjRef) for name, obj := range objs { modName := modOf(name) mods[modName] = append(mods[modName], obj) @@ -782,7 +782,7 @@ func (p *context) compileInstr(b llssa.Builder, instr ssa.Instruction) { } } -func (p *context) compileFunction(v *ssa.Function) (goFn llssa.Function, pyFn llssa.PyObject, kind int) { +func (p *context) compileFunction(v *ssa.Function) (goFn llssa.Function, pyFn llssa.PyObjRef, kind int) { // v.Pkg == nil: means auto generated function? if v.Pkg == p.goPkg || v.Pkg == nil { // function in this package diff --git a/ssa/decl.go b/ssa/decl.go index 925ea0db..ca857cb1 100644 --- a/ssa/decl.go +++ b/ssa/decl.go @@ -285,16 +285,16 @@ func (p Function) Block(idx int) BasicBlock { // ----------------------------------------------------------------------------- -type aPyObject struct { +type aPyObjRef struct { Expr Obj Global } -// PyObject represents a python object. -type PyObject = *aPyObject +// PyObjRef represents a python object reference. +type PyObjRef = *aPyObjRef // NewPyFunc creates a new python function. -func (p Package) NewPyFunc(name string, sig *types.Signature, doInit bool) PyObject { +func (p Package) NewPyFunc(name string, sig *types.Signature, doInit bool) PyObjRef { if v, ok := p.pyobjs[name]; ok { return v } @@ -305,20 +305,20 @@ func (p Package) NewPyFunc(name string, sig *types.Signature, doInit bool) PyObj obj.Init(prog.Null(obj.Type)) obj.impl.SetLinkage(llvm.LinkOnceAnyLinkage) } - ty := &aType{obj.ll, rawType{sig}, vkPyFunc} + ty := &aType{obj.ll, rawType{types.NewPointer(sig)}, vkPyFuncRef} expr := Expr{obj.impl, ty} - ret := &aPyObject{expr, obj} + ret := &aPyObjRef{expr, obj} p.pyobjs[name] = ret return ret } // PyObjOf returns a python object by name. -func (p Package) PyObjOf(name string) PyObject { +func (p Package) PyObjOf(name string) PyObjRef { return p.pyobjs[name] } // PyObjs returns all used python objects in this project. -func (p Package) PyObjs() map[string]PyObject { +func (p Package) PyObjs() map[string]PyObjRef { return p.pyobjs } diff --git a/ssa/expr.go b/ssa/expr.go index a97157b8..71921b5e 100644 --- a/ssa/expr.go +++ b/ssa/expr.go @@ -1238,7 +1238,7 @@ func (b Builder) Call(fn Expr, args ...Expr) (ret Expr) { log.Println(b.String()) } var kind = fn.kind - if kind == vkPyFunc { + if kind == vkPyFuncRef { return b.pyCall(fn, args) } var ll llvm.Type diff --git a/ssa/package.go b/ssa/package.go index 67167685..eeee0f24 100644 --- a/ssa/package.go +++ b/ssa/package.go @@ -258,7 +258,7 @@ func (p Program) NewPackage(name, pkgPath string) Package { gbls := make(map[string]Global) fns := make(map[string]Function) stubs := make(map[string]Function) - pyobjs := make(map[string]PyObject) + pyobjs := make(map[string]PyObjRef) pymods := make(map[string]Global) p.NeedRuntime = false // Don't need reset p.needPyInit here @@ -367,7 +367,7 @@ type aPackage struct { vars map[string]Global fns map[string]Function stubs map[string]Function - pyobjs map[string]PyObject + pyobjs map[string]PyObjRef pymods map[string]Global Prog Program } @@ -552,7 +552,7 @@ func (b Builder) ImportPyMod(path string) Expr { } // LoadPyModSyms loads python objects from specified module. -func (b Builder) LoadPyModSyms(modName string, objs ...PyObject) Expr { +func (b Builder) LoadPyModSyms(modName string, objs ...PyObjRef) Expr { pkg := b.Func.Pkg fnLoad := pkg.pyFunc("llgoLoadPyModSyms", b.Prog.tyLoadPyModSyms()) modPtr := pkg.NewPyModVar(modName, false).Expr @@ -574,6 +574,7 @@ func (b Builder) LoadPyModSyms(modName string, objs ...PyObject) Expr { func (b Builder) pyCall(fn Expr, args []Expr) (ret Expr) { prog := b.Prog pkg := b.Func.Pkg + fn = b.Load(fn) sig := fn.raw.Type.(*types.Signature) params := sig.Params() n := params.Len() diff --git a/ssa/type.go b/ssa/type.go index 936c9b21..735a3d90 100644 --- a/ssa/type.go +++ b/ssa/type.go @@ -43,7 +43,7 @@ const ( vkFuncDecl vkFuncPtr vkClosure - vkPyFunc + vkPyFuncRef vkTuple vkPhisExpr = -1 )