ssa: refactor Builder.BeginAsync

This commit is contained in:
Li Jie
2024-08-05 16:42:51 +08:00
parent 98072f3f4b
commit bb03df7059
2 changed files with 11 additions and 16 deletions

View File

@@ -231,15 +231,17 @@ func (p *context) compileFuncDecl(pkg llssa.Package, f *ssa.Function) (llssa.Fun
} }
nBlkOff := 0 nBlkOff := 0
if nblk := len(f.Blocks); nblk > 0 { if nblk := len(f.Blocks); nblk > 0 {
var entryBlk, allocBlk, cleanBlk, suspdBlk, trapBlk, beginBlk llssa.BasicBlock
if async { if async {
nBlkOff = 5 nBlkOff = 5
fn.MakeBlock("entry") entryBlk = fn.MakeBlock("entry")
fn.MakeBlock("alloc") allocBlk = fn.MakeBlock("alloc")
fn.MakeBlock("clean") cleanBlk = fn.MakeBlock("clean")
fn.MakeBlock("suspend") suspdBlk = fn.MakeBlock("suspend")
fn.MakeBlock("trap") trapBlk = fn.MakeBlock("trap")
} }
fn.MakeBlocks(nblk) // to set fn.HasBody() = true fn.MakeBlocks(nblk) // to set fn.HasBody() = true
beginBlk = fn.Block(nBlkOff)
if f.Recover != nil { // set recover block if f.Recover != nil { // set recover block
// TODO(lijie): fix this for async function because of the block offset increase // TODO(lijie): fix this for async function because of the block offset increase
fn.SetRecover(fn.Block(f.Recover.Index + nBlkOff)) fn.SetRecover(fn.Block(f.Recover.Index + nBlkOff))
@@ -260,7 +262,7 @@ func (p *context) compileFuncDecl(pkg llssa.Package, f *ssa.Function) (llssa.Fun
b := fn.NewBuilder() b := fn.NewBuilder()
b.SetBlockOffset(nBlkOff) b.SetBlockOffset(nBlkOff)
if async { if async {
b.BeginAsync(fn) b.BeginAsync(fn, entryBlk, allocBlk, cleanBlk, suspdBlk, trapBlk, beginBlk)
} }
p.bvals = make(map[ssa.Value]llssa.Expr) p.bvals = make(map[ssa.Value]llssa.Expr)
off := make([]int, len(f.Blocks)) off := make([]int, len(f.Blocks))

View File

@@ -21,7 +21,6 @@ import (
"go/constant" "go/constant"
"go/token" "go/token"
"go/types" "go/types"
"log"
) )
// declare void @llvm.coro.destroy(ptr <handle>) // declare void @llvm.coro.destroy(ptr <handle>)
@@ -382,6 +381,7 @@ func (b Builder) EndAsync() {
} }
/* /*
retPtr := malloc(sizeof(Promise))
id := @llvm.coro.id(0, null, null, null) id := @llvm.coro.id(0, null, null, null)
frameSize := @llvm.coro.size.i64() frameSize := @llvm.coro.size.i64()
needAlloc := @llvm.coro.alloc(id) needAlloc := @llvm.coro.alloc(id)
@@ -395,7 +395,7 @@ frame := null
hdl := @llvm.coro.begin(id, frame) hdl := @llvm.coro.begin(id, frame)
*retPtr = hdl *retPtr = hdl
*/ */
func (b Builder) BeginAsync(fn Function) { func (b Builder) BeginAsync(fn Function, entryBlk, allocBlk, cleanBlk, suspdBlk, trapBlk, beginBlk BasicBlock) {
ty := fn.Type.RawType().(*types.Signature).Results().At(0).Type() ty := fn.Type.RawType().(*types.Signature).Results().At(0).Type()
ptrTy, ok := ty.(*types.Pointer) ptrTy, ok := ty.(*types.Pointer)
if !ok { if !ok {
@@ -404,19 +404,12 @@ func (b Builder) BeginAsync(fn Function) {
promiseTy := b.Prog.Type(ptrTy.Elem(), InGo) promiseTy := b.Prog.Type(ptrTy.Elem(), InGo)
b.async = true b.async = true
entryBlk := fn.Block(0)
allocBlk := fn.Block(1)
cleanBlk := fn.Block(2)
suspdBlk := fn.Block(3)
trapBlk := fn.Block(4)
beginBlk := fn.Block(5)
b.SetBlock(entryBlk) b.SetBlock(entryBlk)
promiseSize := b.Const(constant.MakeUint64(b.Prog.SizeOf(promiseTy)), b.Prog.Int64()).SetName("promise.size") promiseSize := b.Const(constant.MakeUint64(b.Prog.SizeOf(promiseTy)), b.Prog.Int64()).SetName("promise.size")
promise := b.AllocZ(promiseSize).SetName("promise") promise := b.AllocZ(promiseSize).SetName("promise")
promise.Type = b.Prog.Pointer(promiseTy) promise.Type = b.Prog.Pointer(promiseTy)
b.promise = promise b.promise = promise
log.Printf("promise ptr: %v", promise.RawType())
align := b.Const(constant.MakeInt64(0), b.Prog.CInt()).SetName("align") align := b.Const(constant.MakeInt64(0), b.Prog.CInt()).SetName("align")
null := b.Const(nil, b.Prog.CIntPtr()) null := b.Const(nil, b.Prog.CIntPtr())
id := b.CoID(align, null, null, null).SetName("id") id := b.CoID(align, null, null, null).SetName("id")