compileBlock: use LoadPyModSyms

This commit is contained in:
xushiwei
2024-05-12 20:03:27 +08:00
parent 45babef689
commit 03fe594339
3 changed files with 32 additions and 7 deletions

View File

@@ -328,9 +328,18 @@ func (p *context) funcOf(fn *ssa.Function) (aFn llssa.Function, pyFn llssa.PyObj
return
}
func modOf(name string) string {
if pos := strings.LastIndexByte(name, '.'); pos > 0 {
return name[:pos]
}
return ""
}
func (p *context) compileBlock(b llssa.Builder, block *ssa.BasicBlock, n int, doMainInit, doModInit bool) llssa.BasicBlock {
var last int
var pyModInit bool
var prog = p.prog
var pkg = p.pkg
var instrs = block.Instrs[n:]
var ret = p.fn.Block(block.Index)
b.SetBlock(ret)
@@ -339,9 +348,20 @@ func (p *context) compileBlock(b llssa.Builder, block *ssa.BasicBlock, n int, do
last = len(instrs) - 1
instrs = instrs[:last]
}
p.inits = append(p.inits, func() {
if objs := pkg.PyObjs(); len(objs) > 0 {
mods := make(map[string][]llssa.PyObject)
for name, obj := range objs {
modName := modOf(name)
mods[modName] = append(mods[modName], obj)
}
b.SetBlockEx(ret, llssa.AtStart)
for modName, objs := range mods {
b.LoadPyModSyms(modName, objs...)
}
}
})
} else if doMainInit {
prog := p.prog
pkg := p.pkg
fn := p.fn
argc := pkg.NewVar("__llgo_argc", types.NewPointer(types.Typ[types.Int32]), llssa.InC)
argv := pkg.NewVar("__llgo_argv", types.NewPointer(argvTy), llssa.InC)
@@ -360,9 +380,9 @@ func (p *context) compileBlock(b llssa.Builder, block *ssa.BasicBlock, n int, do
jumpTo := p.jumpTo(jump)
modPath := p.pyMod
modName := pysymPrefix + modPath
modPtr := p.pkg.NewPyModVar(modName, true).Expr
modPtr := pkg.NewPyModVar(modName, true).Expr
mod := b.Load(modPtr)
cond := b.BinOp(token.NEQ, mod, b.Prog.Null(mod.Type))
cond := b.BinOp(token.NEQ, mod, prog.Null(mod.Type))
newBlk := p.fn.MakeBlock()
b.If(cond, jumpTo, newBlk)
b.SetBlock(newBlk)

View File

@@ -29,7 +29,7 @@ func testCompile(t *testing.T, src, expected string) {
}
func TestFromTestpy(t *testing.T) {
cltest.FromDir(t, "", "./_testpy", false)
cltest.FromDir(t, "callpy", "./_testpy", false)
}
func TestFromTestlibc(t *testing.T) {

View File

@@ -557,12 +557,17 @@ func (b Builder) LoadPyModSyms(modName string, objs ...PyObject) Expr {
fnLoad := pkg.pyFunc("llgoLoadPyModSyms", b.Prog.tyLoadPyModSyms())
modPtr := pkg.NewPyModVar(modName, false).Expr
mod := b.Load(modPtr)
args := make([]Expr, 1, len(objs)*2+1)
args := make([]Expr, 1, len(objs)*2+2)
args[0] = mod
nbase := len(modName) + 1
for _, o := range objs {
args = append(args, b.CStr(o.impl.Name()))
fullName := o.impl.Name()
name := fullName[nbase:]
args = append(args, b.CStr(name))
args = append(args, o.Expr)
}
prog := b.Prog
args = append(args, prog.Null(prog.CStr()))
return b.Call(fnLoad, args...)
}