]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: populate AuxCall fields for OpClosureCall
authorDavid Chase <drchase@google.com>
Wed, 24 Jun 2020 21:00:48 +0000 (17:00 -0400)
committerDavid Chase <drchase@google.com>
Wed, 16 Sep 2020 20:59:25 +0000 (20:59 +0000)
Change-Id: Ib5f62826d5249c1727b57d9f8ff2f3a1d6dc5032
Reviewed-on: https://go-review.googlesource.com/c/go/+/240185
Trust: David Chase <drchase@google.com>
Run-TryBot: David Chase <drchase@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
src/cmd/compile/internal/gc/ssa.go
src/cmd/compile/internal/ssa/op.go

index 6c0b027c175389cdee56d5a6c6f53b55403674b8..75fdbbae045d8b56d1fcc761a2c933e517a30096 100644 (file)
@@ -4306,7 +4306,7 @@ func (s *state) openDeferExit() {
                        v := s.load(r.closure.Type.Elem(), r.closure)
                        s.maybeNilCheckClosure(v, callDefer)
                        codeptr := s.rawLoad(types.Types[TUINTPTR], v)
-                       call = s.newValue3A(ssa.OpClosureCall, types.TypeMem, ssa.ClosureAuxCall(), codeptr, v, s.mem())
+                       call = s.newValue3A(ssa.OpClosureCall, types.TypeMem, ssa.ClosureAuxCall(ACArgs, ACResults), codeptr, v, s.mem())
                } else {
                        // Do a static call if the original call was a static function or method
                        call = s.newValue1A(ssa.OpStaticCall, types.TypeMem, ssa.StaticAuxCall(fn.Sym.Linksym(), ACArgs, ACResults), s.mem())
@@ -4512,7 +4512,7 @@ func (s *state) call(n *Node, k callKind) *ssa.Value {
                        // critical that we not clobber any arguments already
                        // stored onto the stack.
                        codeptr = s.rawLoad(types.Types[TUINTPTR], closure)
-                       call = s.newValue3A(ssa.OpClosureCall, types.TypeMem, ssa.ClosureAuxCall(), codeptr, closure, s.mem())
+                       call = s.newValue3A(ssa.OpClosureCall, types.TypeMem, ssa.ClosureAuxCall(ACArgs, ACResults), codeptr, closure, s.mem())
                case codeptr != nil:
                        call = s.newValue2A(ssa.OpInterCall, types.TypeMem, ssa.InterfaceAuxCall(ACArgs, ACResults), codeptr, s.mem())
                case sym != nil:
index f94399028add64e7eeeadd3aa4d298a3fde9522c..02ecdef5e6767766e5215d8562383eb2b09f59d5 100644 (file)
@@ -79,6 +79,10 @@ type AuxCall struct {
        results []Param
 }
 
+// String returns
+// "AuxCall{<fn>(<args>)}"             if len(results) == 0;
+// "AuxCall{<fn>(<args>)<results[0]>}" if len(results) == 1;
+// "AuxCall{<fn>(<args>)(<results>)}"  otherwise.
 func (a *AuxCall) String() string {
        var fn string
        if a.Fn == nil {
@@ -125,8 +129,8 @@ func InterfaceAuxCall(args []Param, results []Param) *AuxCall {
 }
 
 // ClosureAuxCall returns an AuxCall for a closure call.
-func ClosureAuxCall() *AuxCall {
-       return &AuxCall{}
+func ClosureAuxCall(args []Param, results []Param) *AuxCall {
+       return &AuxCall{Fn: nil, args: args, results: results}
 }
 
 const (