From: Cherry Zhang Date: Wed, 7 Apr 2021 04:06:06 +0000 (-0400) Subject: cmd/compile: correct argument area size for typedmemmove/typedmemclr X-Git-Tag: go1.17beta1~797 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=b55d900529;p=gostls13.git cmd/compile: correct argument area size for typedmemmove/typedmemclr When the write barrier pass emits typedmemmove/typedmemclr calls, even the arguments are in registers, we still need to leave space for the spill slots. Count that space. Otherwise when the callee spills arguments it may clobber locals on the caller's frame. Change-Id: I5326943427feaf66cab7658a5bef55b3baf5d345 Reviewed-on: https://go-review.googlesource.com/c/go/+/307824 Trust: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Go Bot Reviewed-by: Than McIntosh Reviewed-by: David Chase --- diff --git a/src/cmd/compile/internal/ssa/writebarrier.go b/src/cmd/compile/internal/ssa/writebarrier.go index f0eceb7abe..d6af3578d0 100644 --- a/src/cmd/compile/internal/ssa/writebarrier.go +++ b/src/cmd/compile/internal/ssa/writebarrier.go @@ -494,36 +494,36 @@ func wbcall(pos src.XPos, b *Block, fn, typ *obj.LSym, ptr, val, mem, sp, sb *Va if typ != nil { // for typedmemmove taddr := b.NewValue1A(pos, OpAddr, b.Func.Config.Types.Uintptr, typ, sb) argTypes = append(argTypes, b.Func.Config.Types.Uintptr) + off = round(off, taddr.Type.Alignment()) if inRegs { wbargs = append(wbargs, taddr) } else { - off = round(off, taddr.Type.Alignment()) arg := b.NewValue1I(pos, OpOffPtr, taddr.Type.PtrTo(), off, sp) mem = b.NewValue3A(pos, OpStore, types.TypeMem, ptr.Type, arg, taddr, mem) - off += taddr.Type.Size() } + off += taddr.Type.Size() } argTypes = append(argTypes, ptr.Type) + off = round(off, ptr.Type.Alignment()) if inRegs { wbargs = append(wbargs, ptr) } else { - off = round(off, ptr.Type.Alignment()) arg := b.NewValue1I(pos, OpOffPtr, ptr.Type.PtrTo(), off, sp) mem = b.NewValue3A(pos, OpStore, types.TypeMem, ptr.Type, arg, ptr, mem) - off += ptr.Type.Size() } + off += ptr.Type.Size() if val != nil { argTypes = append(argTypes, val.Type) + off = round(off, val.Type.Alignment()) if inRegs { wbargs = append(wbargs, val) } else { - off = round(off, val.Type.Alignment()) arg := b.NewValue1I(pos, OpOffPtr, val.Type.PtrTo(), off, sp) mem = b.NewValue3A(pos, OpStore, types.TypeMem, val.Type, arg, val, mem) - off += val.Type.Size() } + off += val.Type.Size() } off = round(off, config.PtrSize) wbargs = append(wbargs, mem)