From 64c13fa9ae686bf093273ef088e855e3a88f560d Mon Sep 17 00:00:00 2001 From: xushiwei Date: Sun, 12 May 2024 00:24:56 +0800 Subject: [PATCH] llgo/ssa: NewPyFunc fix --- cl/_testpy/callpy/out.ll | 10 +++++----- cl/compile.go | 13 +++++++++---- py/math/llgo_autogen.lla | Bin 0 -> 563 bytes py/os/llgo_autogen.lla | Bin 0 -> 560 bytes ssa/decl.go | 5 ++++- ssa/package.go | 12 ++++++------ 6 files changed, 24 insertions(+), 16 deletions(-) create mode 100644 py/math/llgo_autogen.lla create mode 100644 py/os/llgo_autogen.lla diff --git a/cl/_testpy/callpy/out.ll b/cl/_testpy/callpy/out.ll index 001dd685..c1589558 100644 --- a/cl/_testpy/callpy/out.ll +++ b/cl/_testpy/callpy/out.ll @@ -4,8 +4,8 @@ source_filename = "main" @"main.init$guard" = global ptr null @__llgo_argc = global ptr null @__llgo_argv = global ptr null -@sqrt = external global ptr -@getcwd = external global ptr +@__llgo_py.math.sqrt = linkonce global ptr null +@__llgo_py.os.getcwd = linkonce global ptr null @0 = private unnamed_addr constant [14 x i8] c"sqrt(2) = %f\0A\00", align 1 @1 = private unnamed_addr constant [10 x i8] c"cwd = %s\0A\00", align 1 @@ -31,8 +31,8 @@ _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 @sqrt, ptr %2) - %4 = call ptr @PyObject_CallNoArg(ptr @getcwd) + %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() @@ -50,7 +50,7 @@ declare ptr @PyFloat_FromDouble(double) declare ptr @PyObject_CallOneArg(ptr, ptr) -declare ptr @PyObject_CallNoArg(ptr) +declare ptr @PyObject_CallNoArgs(ptr) declare double @PyFloat_AsDouble() diff --git a/cl/compile.go b/cl/compile.go index fd96cbdf..d762356a 100644 --- a/cl/compile.go +++ b/cl/compile.go @@ -285,13 +285,18 @@ func (p *context) compileFuncDecl(pkg llssa.Package, f *ssa.Function) (llssa.Fun // 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.PyFunction, ftype int) { - _, name, ftype := p.funcName(fn, false) + pkgTypes, name, ftype := p.funcName(fn, false) switch ftype { case pyFunc: - pkg := p.pkg - if pyFn = pkg.PyFuncOf(name); pyFn == nil { - pyFn = pkg.NewPyFunc(name, fn.Signature) + if kind, mod := pkgKindByScope(pkgTypes.Scope()); kind == PkgPyModule { + pkg := p.pkg + fnName := pysymPrefix + mod + "." + name + if pyFn = pkg.PyFuncOf(fnName); pyFn == nil { + pyFn = pkg.NewPyFunc(fnName, fn.Signature) + return + } } + ftype = ignoredFunc case llgoInstr: switch name { case "cstr": diff --git a/py/math/llgo_autogen.lla b/py/math/llgo_autogen.lla new file mode 100644 index 0000000000000000000000000000000000000000..1daa2e16ed71aae6a33a4adb82f10a7b636a6f76 GIT binary patch literal 563 zcmWIWW@Zs#U|`^2kl4RE;+4$4gnC8>21^zO27U$^hMb)A{P@JulKk}4JiVNp&=5`r zW{0WvX^uc#TEWf0$nq7a8f?JQ$${C23`AP*f7aGZUF38zOR~f0L!!PN&$oTOlgu`@ zE%ltPwy5Xt_q$ud(vO?9*LqIASAFi}^b$t?S(YcmzZbCojk(e5?LJfQ*iOBrtB(ae ztBQGdoOSDLyOmpvCH=2C6}fWv=^lKq%cyu-<)gOePWhix1HY!}n0=c2)Gd&6=M_!9 zrKTxA+i!VjB<2^n^Ku6~y25$N^JeKGF3l^e!zBO5Nj%YmkI&y?`#T;xAICkBs@J80b2a9eTOyGFGgj3=yr^9*o3A2m@ zCU5ZjHvjGXMGQ;WR0H%`JcIQXUfOf7`j_YonZIN%`Hm$8}p@nug5>sUeb z{myGD`;IMnCj8iD@ur=-PaprgN@MFrPh*q+?-u+M;q6xsp4|C=N#~JsffM=bHyV5L zOWEJ%J*ghx&B!Fjj4LK3fHBO#0E{YzC5<2!M!d2@;uS4U1H4(;K*||`Fce6i0GYr5 E0NTyp8~^|S literal 0 HcmV?d00001 diff --git a/py/os/llgo_autogen.lla b/py/os/llgo_autogen.lla new file mode 100644 index 0000000000000000000000000000000000000000..b018d58d72fbda97648a80784eb46a63b2fced9d GIT binary patch literal 560 zcmWIWW@Zs#U|`^2klnvJV!z_dGc}A145};)4Ezi-3^_UJ`SFRRCHd*8d3rfHp&^_M z%wALN(|mxqw1S&~k>x8;HQ0cqlTT+IHV|yK(GBAZ^Qbvu2}HQcmh z$D&OsDVDw(f4}#|S5Dp5SfR{6YiId0kElb7A8r+T&Ay{OQ15Q^+}1N9fq7n`;S+;) zcAlzDStYpACwHcYc@U>BcO&b)cvd;Z)h4-*w%lo7##Q|A2K#ZNjm3wuRw;z59bQ^8 zZOy+cTuZ0D(_6ptsT`NgYlrJzbALbBH|f{i47ED7V>_awb}sdESUcOW!pm~|fu40T zSNY}%-)Nk(pXsyDSE1u^3?V0D4o?x#GYjIrA$9U$SKHo?EOwsPqxL8;)FrRyd8)A7 z@%GiP$?~@uPUvtgh+^nUb85U_c}6ek&5r+(2d>^1`pI!G;7w?f$(lJE7kw<*Cbqrg zoj*I%ii_NHWR!1I+j33rapQrfN2V7V3Cy_bq`=AN(j2T6w&R-~ zkJ?FHHQl)^$!?+L$>ILLO9Q1|U&?zK_iD%8F7@`{%#$krH@L(-UvMJ4c<#(adk?)& z6aK^-;LXS+$BZi)C4kY(zyORVh9!+47DlA9LLwC{LIb>6*+9w}fiM(E9|f7f003pw B-7EkA literal 0 HcmV?d00001 diff --git a/ssa/decl.go b/ssa/decl.go index b89243fa..7c2b6933 100644 --- a/ssa/decl.go +++ b/ssa/decl.go @@ -298,7 +298,10 @@ func (p Package) NewPyFunc(name string, sig *types.Signature) PyFunction { if v, ok := p.pyfns[name]; ok { return v } - obj := p.NewVar(name, p.Prog.PyObjectPtrPtr().RawType(), InC) + prog := p.Prog + obj := p.NewVar(name, prog.PyObjectPtrPtr().RawType(), InC) + obj.Init(prog.Null(obj.Type)) + obj.impl.SetLinkage(llvm.LinkOnceAnyLinkage) ty := &aType{obj.ll, rawType{sig}, vkPyFunc} expr := Expr{obj.impl, ty} ret := &aPyFunction{expr, obj} diff --git a/ssa/package.go b/ssa/package.go index cb3691b3..e64df9c3 100644 --- a/ssa/package.go +++ b/ssa/package.go @@ -137,7 +137,7 @@ type aProgram struct { pyObjPPtr Type pyImpTy *types.Signature - callNoArg *types.Signature + callNoArgs *types.Signature callOneArg *types.Signature needRuntime bool @@ -485,14 +485,14 @@ func (p Program) tyImportPyModule() *types.Signature { return p.pyImpTy } -func (p Program) tyCallNoArg() *types.Signature { - if p.callNoArg == nil { +func (p Program) tyCallNoArgs() *types.Signature { + if p.callNoArgs == nil { objPtr := p.PyObjectPtr().raw.Type paramObjPtr := types.NewParam(token.NoPos, nil, "", objPtr) params := types.NewTuple(paramObjPtr) - p.callNoArg = types.NewSignatureType(nil, nil, nil, params, params, false) + p.callNoArgs = types.NewSignatureType(nil, nil, nil, params, params, false) } - return p.callNoArg + return p.callNoArgs } func (p Program) tyCallOneArg() *types.Signature { @@ -531,7 +531,7 @@ func (b Builder) pyCall(fn Expr, args []Expr) (ret Expr) { n := params.Len() switch n { case 0: - call := pkg.pyFunc("PyObject_CallNoArg", prog.tyCallNoArg()) + call := pkg.pyFunc("PyObject_CallNoArgs", prog.tyCallNoArgs()) ret = b.Call(call, fn) case 1: call := pkg.pyFunc("PyObject_CallOneArg", prog.tyCallOneArg())