llgo/ssa: abiMethodOf; AfterInit bugfix

This commit is contained in:
xushiwei
2024-05-27 14:32:23 +08:00
parent c0a156f347
commit 8e89dc8aa9
10 changed files with 567 additions and 266 deletions

View File

@@ -585,12 +585,24 @@ func (p Package) AfterInit(b Builder, ret BasicBlock) {
b.SetBlockEx(ret, afterInit, false)
if doAbiInit {
sigAbiInit := types.NewSignatureType(nil, nil, nil, nil, nil, false)
fn := p.NewFunc(p.Path()+".init$abi", sigAbiInit, InC)
fnb := fn.MakeBody(1)
for _, abiInit := range p.abiini {
abiInit(unsafe.Pointer(fnb))
baseName := p.Path() + ".init$abi"
name := baseName
idx := 1
fn := p.NewFunc(name, sigAbiInit, InC)
for {
fnb := fn.MakeBody(1)
first := fnb.blk
p.callAbiInit(fnb)
fnb.Return()
if len(p.abiini) == 0 {
break
}
idx++
name = baseName + strconv.Itoa(idx)
fn = p.NewFunc(name, sigAbiInit, InC)
fnb.SetBlockEx(first, AtStart, false)
fnb.Call(fn.Expr)
}
fnb.Return()
b.Call(fn.Expr)
}
if doPyLoadModSyms {
@@ -599,6 +611,14 @@ func (p Package) AfterInit(b Builder, ret BasicBlock) {
}
}
func (p Package) callAbiInit(fnb Builder) {
abiini := p.abiini
p.abiini = nil
for _, abiInit := range abiini {
abiInit(unsafe.Pointer(fnb))
}
}
/*
type CodeGenFileType = llvm.CodeGenFileType