vkPyFunc => vkPyFuncRef
This commit is contained in:
@@ -33,6 +33,7 @@ func main() {
|
|||||||
|
|
||||||
llgenDir(dir + "/cl/_testlibc")
|
llgenDir(dir + "/cl/_testlibc")
|
||||||
llgenDir(dir + "/cl/_testrt")
|
llgenDir(dir + "/cl/_testrt")
|
||||||
|
llgenDir(dir + "/cl/_testpy")
|
||||||
llgenDir(dir+"/cl/_testdata", "")
|
llgenDir(dir+"/cl/_testdata", "")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -40,12 +40,14 @@ _llgo_0:
|
|||||||
call void @"github.com/goplus/llgo/internal/runtime.init"()
|
call void @"github.com/goplus/llgo/internal/runtime.init"()
|
||||||
call void @main.init()
|
call void @main.init()
|
||||||
%2 = call ptr @PyFloat_FromDouble(double 2.000000e+00)
|
%2 = call ptr @PyFloat_FromDouble(double 2.000000e+00)
|
||||||
%3 = call ptr @PyObject_CallOneArg(ptr @__llgo_py.math.sqrt, ptr %2)
|
%3 = load ptr, ptr @__llgo_py.math.sqrt, align 8
|
||||||
%4 = call ptr @PyObject_CallNoArgs(ptr @__llgo_py.os.getcwd)
|
%4 = call ptr @PyObject_CallOneArg(ptr %3, ptr %2)
|
||||||
%5 = call double @PyFloat_AsDouble()
|
%5 = load ptr, ptr @__llgo_py.os.getcwd, align 8
|
||||||
%6 = call i32 (ptr, ...) @printf(ptr @0, double %5)
|
%6 = call ptr @PyObject_CallNoArgs(ptr %5)
|
||||||
%7 = call ptr @PyBytes_AsString()
|
%7 = call double @PyFloat_AsDouble()
|
||||||
%8 = call i32 (ptr, ...) @printf(ptr @1, ptr %7)
|
%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
|
ret void
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,29 +1,34 @@
|
|||||||
; ModuleID = 'math'
|
; ModuleID = 'command-line-arguments'
|
||||||
source_filename = "math"
|
source_filename = "command-line-arguments"
|
||||||
|
|
||||||
@__llgo_py.math.sqrt = external global ptr
|
@__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
|
@__llgo_py.math = linkonce global ptr null
|
||||||
@0 = private unnamed_addr constant [5 x i8] c"math\00", align 1
|
@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:
|
_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
|
br i1 %0, label %_llgo_2, label %_llgo_1
|
||||||
|
|
||||||
_llgo_1: ; preds = %_llgo_0
|
_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
|
%1 = load ptr, ptr @__llgo_py.math, align 8
|
||||||
%2 = icmp ne ptr %1, null
|
call void (ptr, ...) @llgoLoadPyModSyms(ptr %1, ptr @1, ptr @__llgo_py.math.sqrt, ptr null)
|
||||||
br i1 %2, label %_llgo_2, label %_llgo_3
|
%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
|
_llgo_2: ; preds = %_llgo_3, %_llgo_1, %_llgo_0
|
||||||
ret void
|
ret void
|
||||||
|
|
||||||
_llgo_3: ; preds = %_llgo_1
|
_llgo_3: ; preds = %_llgo_1
|
||||||
%3 = call ptr @PyImport_ImportModule(ptr @0)
|
%4 = call ptr @PyImport_ImportModule(ptr @0)
|
||||||
store ptr %3, ptr @__llgo_py.math, align 8
|
store ptr %4, ptr @__llgo_py.math, align 8
|
||||||
br label %_llgo_2
|
br label %_llgo_2
|
||||||
}
|
}
|
||||||
|
|
||||||
declare ptr @PyImport_ImportModule(ptr)
|
declare ptr @PyImport_ImportModule(ptr)
|
||||||
|
|
||||||
|
declare void @llgoLoadPyModSyms(ptr, ...)
|
||||||
|
|||||||
@@ -211,7 +211,7 @@ var (
|
|||||||
argvTy = types.NewPointer(types.NewPointer(types.Typ[types.Int8]))
|
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)
|
pkgTypes, name, ftype := p.funcName(f, true)
|
||||||
if ftype != goFunc {
|
if ftype != goFunc {
|
||||||
if ftype == pyFunc {
|
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.
|
// funcOf returns a function by name and set ftype = goFunc, cFunc, etc.
|
||||||
// or returns nil and set ftype = llgoCstr, llgoAlloca, llgoUnreachable, 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)
|
pkgTypes, name, ftype := p.funcName(fn, false)
|
||||||
switch ftype {
|
switch ftype {
|
||||||
case pyFunc:
|
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() {
|
p.inits = append(p.inits, func() {
|
||||||
if objs := pkg.PyObjs(); len(objs) > 0 {
|
if objs := pkg.PyObjs(); len(objs) > 0 {
|
||||||
mods := make(map[string][]llssa.PyObject)
|
mods := make(map[string][]llssa.PyObjRef)
|
||||||
for name, obj := range objs {
|
for name, obj := range objs {
|
||||||
modName := modOf(name)
|
modName := modOf(name)
|
||||||
mods[modName] = append(mods[modName], obj)
|
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?
|
// v.Pkg == nil: means auto generated function?
|
||||||
if v.Pkg == p.goPkg || v.Pkg == nil {
|
if v.Pkg == p.goPkg || v.Pkg == nil {
|
||||||
// function in this package
|
// function in this package
|
||||||
|
|||||||
16
ssa/decl.go
16
ssa/decl.go
@@ -285,16 +285,16 @@ func (p Function) Block(idx int) BasicBlock {
|
|||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
type aPyObject struct {
|
type aPyObjRef struct {
|
||||||
Expr
|
Expr
|
||||||
Obj Global
|
Obj Global
|
||||||
}
|
}
|
||||||
|
|
||||||
// PyObject represents a python object.
|
// PyObjRef represents a python object reference.
|
||||||
type PyObject = *aPyObject
|
type PyObjRef = *aPyObjRef
|
||||||
|
|
||||||
// NewPyFunc creates a new python function.
|
// 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 {
|
if v, ok := p.pyobjs[name]; ok {
|
||||||
return v
|
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.Init(prog.Null(obj.Type))
|
||||||
obj.impl.SetLinkage(llvm.LinkOnceAnyLinkage)
|
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}
|
expr := Expr{obj.impl, ty}
|
||||||
ret := &aPyObject{expr, obj}
|
ret := &aPyObjRef{expr, obj}
|
||||||
p.pyobjs[name] = ret
|
p.pyobjs[name] = ret
|
||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
// PyObjOf returns a python object by name.
|
// 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]
|
return p.pyobjs[name]
|
||||||
}
|
}
|
||||||
|
|
||||||
// PyObjs returns all used python objects in this project.
|
// 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
|
return p.pyobjs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1238,7 +1238,7 @@ func (b Builder) Call(fn Expr, args ...Expr) (ret Expr) {
|
|||||||
log.Println(b.String())
|
log.Println(b.String())
|
||||||
}
|
}
|
||||||
var kind = fn.kind
|
var kind = fn.kind
|
||||||
if kind == vkPyFunc {
|
if kind == vkPyFuncRef {
|
||||||
return b.pyCall(fn, args)
|
return b.pyCall(fn, args)
|
||||||
}
|
}
|
||||||
var ll llvm.Type
|
var ll llvm.Type
|
||||||
|
|||||||
@@ -258,7 +258,7 @@ func (p Program) NewPackage(name, pkgPath string) Package {
|
|||||||
gbls := make(map[string]Global)
|
gbls := make(map[string]Global)
|
||||||
fns := make(map[string]Function)
|
fns := make(map[string]Function)
|
||||||
stubs := make(map[string]Function)
|
stubs := make(map[string]Function)
|
||||||
pyobjs := make(map[string]PyObject)
|
pyobjs := make(map[string]PyObjRef)
|
||||||
pymods := make(map[string]Global)
|
pymods := make(map[string]Global)
|
||||||
p.NeedRuntime = false
|
p.NeedRuntime = false
|
||||||
// Don't need reset p.needPyInit here
|
// Don't need reset p.needPyInit here
|
||||||
@@ -367,7 +367,7 @@ type aPackage struct {
|
|||||||
vars map[string]Global
|
vars map[string]Global
|
||||||
fns map[string]Function
|
fns map[string]Function
|
||||||
stubs map[string]Function
|
stubs map[string]Function
|
||||||
pyobjs map[string]PyObject
|
pyobjs map[string]PyObjRef
|
||||||
pymods map[string]Global
|
pymods map[string]Global
|
||||||
Prog Program
|
Prog Program
|
||||||
}
|
}
|
||||||
@@ -552,7 +552,7 @@ func (b Builder) ImportPyMod(path string) Expr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// LoadPyModSyms loads python objects from specified module.
|
// 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
|
pkg := b.Func.Pkg
|
||||||
fnLoad := pkg.pyFunc("llgoLoadPyModSyms", b.Prog.tyLoadPyModSyms())
|
fnLoad := pkg.pyFunc("llgoLoadPyModSyms", b.Prog.tyLoadPyModSyms())
|
||||||
modPtr := pkg.NewPyModVar(modName, false).Expr
|
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) {
|
func (b Builder) pyCall(fn Expr, args []Expr) (ret Expr) {
|
||||||
prog := b.Prog
|
prog := b.Prog
|
||||||
pkg := b.Func.Pkg
|
pkg := b.Func.Pkg
|
||||||
|
fn = b.Load(fn)
|
||||||
sig := fn.raw.Type.(*types.Signature)
|
sig := fn.raw.Type.(*types.Signature)
|
||||||
params := sig.Params()
|
params := sig.Params()
|
||||||
n := params.Len()
|
n := params.Len()
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ const (
|
|||||||
vkFuncDecl
|
vkFuncDecl
|
||||||
vkFuncPtr
|
vkFuncPtr
|
||||||
vkClosure
|
vkClosure
|
||||||
vkPyFunc
|
vkPyFuncRef
|
||||||
vkTuple
|
vkTuple
|
||||||
vkPhisExpr = -1
|
vkPhisExpr = -1
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user