1
0
mirror of https://github.com/golang/go synced 2024-11-22 19:34:59 -07:00

[dev.regabi] cmd/compile: make sure mkcall* passed non-nil init

So next CL can pass temporaries assignments for function arguments in to
init instead of CallExpr.Rargs.

Passes toolstash -cmp.

Change-Id: I2c3cb6a63e8bf9d0418052b39c1db58050f71305
Reviewed-on: https://go-review.googlesource.com/c/go/+/284893
Trust: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
Cuong Manh Le 2021-01-20 14:26:42 +07:00
parent 9f036844db
commit 19a6db6b63
4 changed files with 35 additions and 15 deletions

View File

@ -26,10 +26,9 @@ func instrument(fn *ir.Func) {
if base.Flag.Race { if base.Flag.Race {
lno := base.Pos lno := base.Pos
base.Pos = src.NoXPos base.Pos = src.NoXPos
if ssagen.Arch.LinkArch.Arch.Family != sys.AMD64 { if ssagen.Arch.LinkArch.Arch.Family != sys.AMD64 {
fn.Enter.Prepend(mkcall("racefuncenterfp", nil, nil)) fn.Enter.Prepend(mkcallstmt("racefuncenterfp"))
fn.Exit.Append(mkcall("racefuncexit", nil, nil)) fn.Exit.Append(mkcallstmt("racefuncexit"))
} else { } else {
// nodpc is the PC of the caller as extracted by // nodpc is the PC of the caller as extracted by
@ -44,8 +43,8 @@ func instrument(fn *ir.Func) {
nodpc.SetType(types.Types[types.TUINTPTR]) nodpc.SetType(types.Types[types.TUINTPTR])
nodpc.SetFrameOffset(int64(-types.PtrSize)) nodpc.SetFrameOffset(int64(-types.PtrSize))
fn.Dcl = append(fn.Dcl, nodpc) fn.Dcl = append(fn.Dcl, nodpc)
fn.Enter.Prepend(mkcall("racefuncenter", nil, nil, nodpc)) fn.Enter.Prepend(mkcallstmt("racefuncenter", nodpc))
fn.Exit.Append(mkcall("racefuncexit", nil, nil)) fn.Exit.Append(mkcallstmt("racefuncexit"))
} }
base.Pos = lno base.Pos = lno
} }

View File

@ -174,12 +174,12 @@ func walkRange(nrange *ir.RangeStmt) ir.Node {
fn := typecheck.LookupRuntime("mapiterinit") fn := typecheck.LookupRuntime("mapiterinit")
fn = typecheck.SubstArgTypes(fn, t.Key(), t.Elem(), th) fn = typecheck.SubstArgTypes(fn, t.Key(), t.Elem(), th)
init = append(init, mkcall1(fn, nil, nil, reflectdata.TypePtr(t), ha, typecheck.NodAddr(hit))) init = append(init, mkcallstmt1(fn, reflectdata.TypePtr(t), ha, typecheck.NodAddr(hit)))
nfor.Cond = ir.NewBinaryExpr(base.Pos, ir.ONE, ir.NewSelectorExpr(base.Pos, ir.ODOT, hit, keysym), typecheck.NodNil()) nfor.Cond = ir.NewBinaryExpr(base.Pos, ir.ONE, ir.NewSelectorExpr(base.Pos, ir.ODOT, hit, keysym), typecheck.NodNil())
fn = typecheck.LookupRuntime("mapiternext") fn = typecheck.LookupRuntime("mapiternext")
fn = typecheck.SubstArgTypes(fn, th) fn = typecheck.SubstArgTypes(fn, th)
nfor.Post = mkcall1(fn, nil, nil, typecheck.NodAddr(hit)) nfor.Post = mkcallstmt1(fn, typecheck.NodAddr(hit))
key := ir.NewStarExpr(base.Pos, ir.NewSelectorExpr(base.Pos, ir.ODOT, hit, keysym)) key := ir.NewStarExpr(base.Pos, ir.NewSelectorExpr(base.Pos, ir.ODOT, hit, keysym))
if v1 == nil { if v1 == nil {
@ -269,12 +269,14 @@ func walkRange(nrange *ir.RangeStmt) ir.Node {
// } else { // } else {
eif := ir.NewAssignListStmt(base.Pos, ir.OAS2, nil, nil) eif := ir.NewAssignListStmt(base.Pos, ir.OAS2, nil, nil)
nif.Else = []ir.Node{eif}
// hv2, hv1 = decoderune(ha, hv1) // hv2, hv1 = decoderune(ha, hv1)
eif.Lhs = []ir.Node{hv2, hv1} eif.Lhs = []ir.Node{hv2, hv1}
fn := typecheck.LookupRuntime("decoderune") fn := typecheck.LookupRuntime("decoderune")
eif.Rhs = []ir.Node{mkcall1(fn, fn.Type().Results(), nil, ha, hv1)} var fnInit ir.Nodes
eif.Rhs = []ir.Node{mkcall1(fn, fn.Type().Results(), &fnInit, ha, hv1)}
fnInit.Append(eif)
nif.Else = fnInit
body = append(body, nif) body = append(body, nif)
@ -374,7 +376,7 @@ func mapClear(m ir.Node) ir.Node {
// instantiate mapclear(typ *type, hmap map[any]any) // instantiate mapclear(typ *type, hmap map[any]any)
fn := typecheck.LookupRuntime("mapclear") fn := typecheck.LookupRuntime("mapclear")
fn = typecheck.SubstArgTypes(fn, t.Key(), t.Elem()) fn = typecheck.SubstArgTypes(fn, t.Key(), t.Elem())
n := mkcall1(fn, nil, nil, reflectdata.TypePtr(t), m) n := mkcallstmt1(fn, reflectdata.TypePtr(t), m)
return walkStmt(typecheck.Stmt(n)) return walkStmt(typecheck.Stmt(n))
} }
@ -449,10 +451,10 @@ func arrayClear(loop *ir.RangeStmt, v1, v2, a ir.Node) ir.Node {
if a.Type().Elem().HasPointers() { if a.Type().Elem().HasPointers() {
// memclrHasPointers(hp, hn) // memclrHasPointers(hp, hn)
ir.CurFunc.SetWBPos(stmt.Pos()) ir.CurFunc.SetWBPos(stmt.Pos())
fn = mkcall("memclrHasPointers", nil, nil, hp, hn) fn = mkcallstmt("memclrHasPointers", hp, hn)
} else { } else {
// memclrNoHeapPointers(hp, hn) // memclrNoHeapPointers(hp, hn)
fn = mkcall("memclrNoHeapPointers", nil, nil, hp, hn) fn = mkcallstmt("memclrNoHeapPointers", hp, hn)
} }
n.Body.Append(fn) n.Body.Append(fn)

View File

@ -35,7 +35,7 @@ func walkSelectCases(cases []*ir.CommClause) []ir.Node {
// optimization: zero-case select // optimization: zero-case select
if ncas == 0 { if ncas == 0 {
return []ir.Node{mkcall("block", nil, nil)} return []ir.Node{mkcallstmt("block")}
} }
// optimization: one-case select: single op. // optimization: one-case select: single op.
@ -214,7 +214,7 @@ func walkSelectCases(cases []*ir.CommClause) []ir.Node {
// TODO(mdempsky): There should be a cleaner way to // TODO(mdempsky): There should be a cleaner way to
// handle this. // handle this.
if base.Flag.Race { if base.Flag.Race {
r := mkcall("selectsetpc", nil, nil, typecheck.NodAddr(ir.NewIndexExpr(base.Pos, pcs, ir.NewInt(int64(i))))) r := mkcallstmt("selectsetpc", typecheck.NodAddr(ir.NewIndexExpr(base.Pos, pcs, ir.NewInt(int64(i)))))
init = append(init, r) init = append(init, r)
} }
} }
@ -229,7 +229,9 @@ func walkSelectCases(cases []*ir.CommClause) []ir.Node {
r := ir.NewAssignListStmt(base.Pos, ir.OAS2, nil, nil) r := ir.NewAssignListStmt(base.Pos, ir.OAS2, nil, nil)
r.Lhs = []ir.Node{chosen, recvOK} r.Lhs = []ir.Node{chosen, recvOK}
fn := typecheck.LookupRuntime("selectgo") fn := typecheck.LookupRuntime("selectgo")
r.Rhs = []ir.Node{mkcall1(fn, fn.Type().Results(), nil, bytePtrToIndex(selv, 0), bytePtrToIndex(order, 0), pc0, ir.NewInt(int64(nsends)), ir.NewInt(int64(nrecvs)), ir.NewBool(dflt == nil))} var fnInit ir.Nodes
r.Rhs = []ir.Node{mkcall1(fn, fn.Type().Results(), &fnInit, bytePtrToIndex(selv, 0), bytePtrToIndex(order, 0), pc0, ir.NewInt(int64(nsends)), ir.NewInt(int64(nrecvs)), ir.NewBool(dflt == nil))}
init = append(init, fnInit...)
init = append(init, typecheck.Stmt(r)) init = append(init, typecheck.Stmt(r))
// selv and order are no longer alive after selectgo. // selv and order are no longer alive after selectgo.

View File

@ -96,6 +96,9 @@ func convas(n *ir.AssignStmt, init *ir.Nodes) *ir.AssignStmt {
var stop = errors.New("stop") var stop = errors.New("stop")
func vmkcall(fn ir.Node, t *types.Type, init *ir.Nodes, va []ir.Node) *ir.CallExpr { func vmkcall(fn ir.Node, t *types.Type, init *ir.Nodes, va []ir.Node) *ir.CallExpr {
if init == nil {
base.Fatalf("mkcall with nil init: %v", fn)
}
if fn.Type() == nil || fn.Type().Kind() != types.TFUNC { if fn.Type() == nil || fn.Type().Kind() != types.TFUNC {
base.Fatalf("mkcall %v %v", fn, fn.Type()) base.Fatalf("mkcall %v %v", fn, fn.Type())
} }
@ -115,10 +118,24 @@ func mkcall(name string, t *types.Type, init *ir.Nodes, args ...ir.Node) *ir.Cal
return vmkcall(typecheck.LookupRuntime(name), t, init, args) return vmkcall(typecheck.LookupRuntime(name), t, init, args)
} }
func mkcallstmt(name string, args ...ir.Node) ir.Node {
return mkcallstmt1(typecheck.LookupRuntime(name), args...)
}
func mkcall1(fn ir.Node, t *types.Type, init *ir.Nodes, args ...ir.Node) *ir.CallExpr { func mkcall1(fn ir.Node, t *types.Type, init *ir.Nodes, args ...ir.Node) *ir.CallExpr {
return vmkcall(fn, t, init, args) return vmkcall(fn, t, init, args)
} }
func mkcallstmt1(fn ir.Node, args ...ir.Node) ir.Node {
var init ir.Nodes
n := vmkcall(fn, nil, &init, args)
if len(init) == 0 {
return n
}
init.Append(n)
return ir.NewBlockStmt(n.Pos(), init)
}
func chanfn(name string, n int, t *types.Type) ir.Node { func chanfn(name string, n int, t *types.Type) ir.Node {
if !t.IsChan() { if !t.IsChan() {
base.Fatalf("chanfn %v", t) base.Fatalf("chanfn %v", t)