diff options
author | Dmitri Shuralyov <dmitshur@google.com> | 2022-04-13 15:33:25 +0000 |
---|---|---|
committer | Dmitri Shuralyov <dmitshur@google.com> | 2022-04-13 15:33:25 +0000 |
commit | ed86dfc4e441ee7597586dd858fb87c987f1f3c8 (patch) | |
tree | 5a8bc12cf9f7ca932a82e4f8564b18ed928a93e9 /src/runtime/mfinal.go | |
parent | 4ea866a9969f4ff2ffd975116a17bbe01ce00469 (diff) | |
parent | 346b18ee9d15410ab08dd583787c64dbed0666d2 (diff) | |
download | go-ed86dfc4e441ee7597586dd858fb87c987f1f3c8.tar.gz go-ed86dfc4e441ee7597586dd858fb87c987f1f3c8.zip |
[dev.boringcrypto.go1.17] all: merge go1.17.9 into dev.boringcrypto.go1.17
Change-Id: I65c66a480c706b9bf453e7df68afdb7fc163f58b
Diffstat (limited to 'src/runtime/mfinal.go')
-rw-r--r-- | src/runtime/mfinal.go | 24 |
1 files changed, 9 insertions, 15 deletions
diff --git a/src/runtime/mfinal.go b/src/runtime/mfinal.go index c134a0f22d..a6653032d7 100644 --- a/src/runtime/mfinal.go +++ b/src/runtime/mfinal.go @@ -187,21 +187,15 @@ func runfinq() { f := &fb.fin[i-1] var regs abi.RegArgs - var framesz uintptr - if argRegs > 0 { - // The args can always be passed in registers if they're - // available, because platforms we support always have no - // argument registers available, or more than 2. - // - // But unfortunately because we can have an arbitrary - // amount of returns and it would be complex to try and - // figure out how many of those can get passed in registers, - // just conservatively assume none of them do. - framesz = f.nret - } else { - // Need to pass arguments on the stack too. - framesz = unsafe.Sizeof((interface{})(nil)) + f.nret - } + // The args may be passed in registers or on stack. Even for + // the register case, we still need the spill slots. + // TODO: revisit if we remove spill slots. + // + // Unfortunately because we can have an arbitrary + // amount of returns and it would be complex to try and + // figure out how many of those can get passed in registers, + // just conservatively assume none of them do. + framesz := unsafe.Sizeof((interface{})(nil)) + f.nret if framecap < framesz { // The frame does not contain pointers interesting for GC, // all not yet finalized objects are stored in finq. |