ssa: refactor Builder.BeginAsync
This commit is contained in:
@@ -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))
|
||||||
|
|||||||
11
ssa/coro.go
11
ssa/coro.go
@@ -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")
|
||||||
|
|||||||
Reference in New Issue
Block a user