]> Cypherpunks repositories - gostls13.git/commitdiff
reflect: fix register ABI spill space calculation
authorMichael Anthony Knyszek <mknyszek@google.com>
Wed, 17 Feb 2021 19:14:03 +0000 (19:14 +0000)
committerMichael Knyszek <mknyszek@google.com>
Fri, 26 Feb 2021 20:49:57 +0000 (20:49 +0000)
Currently this does things the old way by computing the number of
registers, but we're going to be using their ABI0 layout for the spill
space for now.

Change-Id: Ibcef1ee48fd834af7cbdaabe704bcabe066ed358
Reviewed-on: https://go-review.googlesource.com/c/go/+/293011
Run-TryBot: Michael Knyszek <mknyszek@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Trust: Michael Knyszek <mknyszek@google.com>

src/reflect/abi.go

index 88af212717d2338e1bbefb27d62e1176ea31a158..20f41d96b5a8de61e644b19b666cf44ca3ca0eb9 100644 (file)
@@ -334,8 +334,7 @@ func newAbiDesc(t *funcType, rcvr *rtype) abiDesc {
        //
        // TODO(mknyszek): Remove this when we no longer have
        // caller reserved spill space.
-       spillInt := uintptr(0)
-       spillFloat := uintptr(0)
+       spill := uintptr(0)
 
        // Compute gc program & stack bitmap for stack arguments
        stackPtrs := new(bitVector)
@@ -351,21 +350,19 @@ func newAbiDesc(t *funcType, rcvr *rtype) abiDesc {
                                stackPtrs.append(0)
                        }
                } else {
-                       spillInt += ptrSize
+                       spill += ptrSize
                }
        }
        for _, arg := range t.in() {
-               i, f := in.iregs, in.fregs
                stkStep := in.addArg(arg)
                if stkStep != nil {
                        addTypeBits(stackPtrs, stkStep.stkOff, arg)
                } else {
-                       i, f = in.iregs-i, in.fregs-f
-                       spillInt += uintptr(i) * ptrSize
-                       spillFloat += uintptr(f) * abi.EffectiveFloatRegSize
+                       spill = align(spill, uintptr(arg.align))
+                       spill += arg.size
                }
        }
-       spill := align(spillInt+spillFloat, ptrSize)
+       spill = align(spill, ptrSize)
 
        // From the input parameters alone, we now know
        // the stackCallArgsSize and retOffset.