mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: fuse escape analysis parameter tagging loops
Simplifies the code somewhat and allows removing Param.Field. Passes toolstash-check. Change-Id: Id854416aea8afd27ce4830ff0f5ff940f7353792 Reviewed-on: https://go-review.googlesource.com/99336 Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
This commit is contained in:
parent
7d654af586
commit
e3127f023f
4 changed files with 12 additions and 35 deletions
|
|
@ -668,11 +668,6 @@ func tofunargs(l []*Node, funarg types.Funarg) *types.Type {
|
||||||
for i, n := range l {
|
for i, n := range l {
|
||||||
f := structfield(n)
|
f := structfield(n)
|
||||||
f.Funarg = funarg
|
f.Funarg = funarg
|
||||||
|
|
||||||
// esc.go needs to find f given a PPARAM to add the tag.
|
|
||||||
if n.Left != nil && n.Left.Class() == PPARAM {
|
|
||||||
n.Left.Name.Param.Field = f
|
|
||||||
}
|
|
||||||
if f.Broke() {
|
if f.Broke() {
|
||||||
t.SetBroke(true)
|
t.SetBroke(true)
|
||||||
}
|
}
|
||||||
|
|
@ -688,11 +683,6 @@ func tofunargsfield(fields []*types.Field, funarg types.Funarg) *types.Type {
|
||||||
|
|
||||||
for _, f := range fields {
|
for _, f := range fields {
|
||||||
f.Funarg = funarg
|
f.Funarg = funarg
|
||||||
|
|
||||||
// esc.go needs to find f given a PPARAM to add the tag.
|
|
||||||
if asNode(f.Nname) != nil && asNode(f.Nname).Class() == PPARAM {
|
|
||||||
asNode(f.Nname).Name.Param.Field = f
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
t.SetFields(fields)
|
t.SetFields(fields)
|
||||||
return t
|
return t
|
||||||
|
|
|
||||||
|
|
@ -2238,27 +2238,6 @@ func (e *EscState) esctag(fn *Node) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, ln := range fn.Func.Dcl {
|
|
||||||
if ln.Op != ONAME {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
switch ln.Esc & EscMask {
|
|
||||||
case EscNone, // not touched by escflood
|
|
||||||
EscReturn:
|
|
||||||
if types.Haspointers(ln.Type) { // don't bother tagging for scalars
|
|
||||||
if ln.Name.Param.Field.Note != uintptrEscapesTag {
|
|
||||||
ln.Name.Param.Field.Note = mktag(int(ln.Esc))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
case EscHeap: // touched by escflood, moved to heap
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unnamed parameters are unused and therefore do not escape.
|
|
||||||
// (Unnamed parameters are not in the Dcl list in the loop above
|
|
||||||
// so we need to mark them separately.)
|
|
||||||
for _, fs := range types.RecvsParams {
|
for _, fs := range types.RecvsParams {
|
||||||
for _, f := range fs(fn.Type).Fields().Slice() {
|
for _, f := range fs(fn.Type).Fields().Slice() {
|
||||||
if !types.Haspointers(f.Type) { // don't bother tagging for scalars
|
if !types.Haspointers(f.Type) { // don't bother tagging for scalars
|
||||||
|
|
@ -2268,8 +2247,19 @@ func (e *EscState) esctag(fn *Node) {
|
||||||
// Note is already set in the loop above.
|
// Note is already set in the loop above.
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Unnamed parameters are unused and therefore do not escape.
|
||||||
if f.Sym == nil || f.Sym.IsBlank() {
|
if f.Sym == nil || f.Sym.IsBlank() {
|
||||||
f.Note = mktag(EscNone)
|
f.Note = mktag(EscNone)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
switch esc := asNode(f.Nname).Esc; esc & EscMask {
|
||||||
|
case EscNone, // not touched by escflood
|
||||||
|
EscReturn:
|
||||||
|
f.Note = mktag(int(esc))
|
||||||
|
|
||||||
|
case EscHeap: // touched by escflood, moved to heap
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ func TestSizeof(t *testing.T) {
|
||||||
}{
|
}{
|
||||||
{Func{}, 128, 232},
|
{Func{}, 128, 232},
|
||||||
{Name{}, 32, 56},
|
{Name{}, 32, 56},
|
||||||
{Param{}, 28, 56},
|
{Param{}, 24, 48},
|
||||||
{Node{}, 76, 128},
|
{Node{}, 76, 128},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -279,9 +279,6 @@ type Param struct {
|
||||||
// ONAME PAUTOHEAP
|
// ONAME PAUTOHEAP
|
||||||
Stackcopy *Node // the PPARAM/PPARAMOUT on-stack slot (moved func params only)
|
Stackcopy *Node // the PPARAM/PPARAMOUT on-stack slot (moved func params only)
|
||||||
|
|
||||||
// ONAME PPARAM
|
|
||||||
Field *types.Field // TFIELD in arg struct
|
|
||||||
|
|
||||||
// ONAME closure linkage
|
// ONAME closure linkage
|
||||||
// Consider:
|
// Consider:
|
||||||
//
|
//
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue