]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: set ir.Name.Func in more cases
authorAustin Clements <austin@google.com>
Sat, 27 Mar 2021 14:14:30 +0000 (10:14 -0400)
committerAustin Clements <austin@google.com>
Mon, 29 Mar 2021 18:46:28 +0000 (18:46 +0000)
ir.Name.Func is non-nil for *almost* all function names. This CL fixes
a few more major cases that leave it nil, though there are still a few
cases left: interface method values, and algorithms generated by
eqFor, hashfor, and hashmem.

We'll need this for mapping from ir.Names to function ABIs shortly.
The remaining cases would be nice to fix, but they're all guaranteed
to be ABIInternal, so we can at least work around them.

For #40724.

Change-Id: Ifcfa781c78899ccea0bf155d80f8cfc27f30351e
Reviewed-on: https://go-review.googlesource.com/c/go/+/305271
Trust: Austin Clements <austin@google.com>
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
src/cmd/compile/internal/ir/expr.go
src/cmd/compile/internal/ir/name.go
src/cmd/compile/internal/reflectdata/alg.go
src/cmd/compile/internal/reflectdata/reflect.go
src/cmd/compile/internal/typecheck/syms.go
src/cmd/compile/internal/walk/compare.go

index 49b9fa8e54ace578f7ae9082fcf2bd42a729b256..c95ea36909a7c93d428783290b29b14850cfa034 100644 (file)
@@ -528,6 +528,13 @@ func (n *SelectorExpr) FuncName() *Name {
        fn := NewNameAt(n.Selection.Pos, MethodSym(n.X.Type(), n.Sel))
        fn.Class = PFUNC
        fn.SetType(n.Type())
+       if n.Selection.Nname != nil {
+               // TODO(austin): Nname is nil for interface method
+               // expressions (I.M), so we can't attach a Func to
+               // those here. reflectdata.methodWrapper generates the
+               // Func.
+               fn.Func = n.Selection.Nname.(*Name).Func
+       }
        return fn
 }
 
index 5738aa1f3fc226ffc6f80b564f780b23a5978c97..5697213eac59d88b065c8a6900e29428ebbd2d46 100644 (file)
@@ -41,7 +41,7 @@ type Name struct {
        pragma    PragmaFlag // int16
        flags     bitset16
        sym       *types.Sym
-       Func      *Func
+       Func      *Func // TODO(austin): nil for I.M, eqFor, hashfor, and hashmem
        Offset_   int64
        val       constant.Value
        Opt       interface{} // for use by escape analysis
index faa431a9d194434f279ab45a283ed4a61d2d1336..9f2efbc3a0af08ab847bb8203535932e466efa3c 100644 (file)
@@ -287,6 +287,7 @@ func hashfor(t *types.Type) ir.Node {
                sym = TypeSymPrefix(".hash", t)
        }
 
+       // TODO(austin): This creates an ir.Name with a nil Func.
        n := typecheck.NewName(sym)
        ir.MarkFunc(n)
        n.SetType(types.NewSignature(types.NoPkg, nil, nil, []*types.Field{
@@ -775,6 +776,7 @@ func memrun(t *types.Type, start int) (size int64, next int) {
 func hashmem(t *types.Type) ir.Node {
        sym := ir.Pkgs.Runtime.Lookup("memhash")
 
+       // TODO(austin): This creates an ir.Name with a nil Func.
        n := typecheck.NewName(sym)
        ir.MarkFunc(n)
        n.SetType(types.NewSignature(types.NoPkg, nil, nil, []*types.Field{
index 4c974ea3243a3b635591a7c0a0002660bacd928a..c1cded826c225cecba2d7422008faa18cf3511a4 100644 (file)
@@ -1741,6 +1741,9 @@ func methodWrapper(rcvr *types.Type, method *types.Field) *obj.LSym {
                typecheck.NewFuncParams(method.Type.Params(), true),
                typecheck.NewFuncParams(method.Type.Results(), false))
 
+       // TODO(austin): SelectorExpr may have created one or more
+       // ir.Names for these already with a nil Func field. We should
+       // consolidate these and always attach a Func to the Name.
        fn := typecheck.DeclFunc(newnam, tfn)
        fn.SetDupok(true)
 
index 202a932e6c96bf37cb644ce4c70d28ae902a14ea..f29af82db2cc25670a60ef4192fd5623a4ee4806 100644 (file)
@@ -32,6 +32,7 @@ func SubstArgTypes(old *ir.Name, types_ ...*types.Type) *ir.Name {
        n := ir.NewNameAt(old.Pos(), old.Sym())
        n.Class = old.Class
        n.SetType(types.SubstAny(old.Type(), &types_))
+       n.Func = old.Func
        if len(types_) > 0 {
                base.Fatalf("SubstArgTypes: too many argument types")
        }
index f4b5387c061dab12449425c67f4f338b542665f1..b18615f61a3e3b4d0ca988193c1114d3b6d1fb86 100644 (file)
@@ -426,6 +426,7 @@ func eqFor(t *types.Type) (n ir.Node, needsize bool) {
                return n, true
        case types.ASPECIAL:
                sym := reflectdata.TypeSymPrefix(".eq", t)
+               // TODO(austin): This creates an ir.Name with a nil Func.
                n := typecheck.NewName(sym)
                ir.MarkFunc(n)
                n.SetType(types.NewSignature(types.NoPkg, nil, nil, []*types.Field{