From b55d90052918024caf331b35b209e434e3b7d176 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 7 Apr 2021 00:06:06 -0400 Subject: [PATCH] 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 --- src/cmd/compile/internal/ssa/writebarrier.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/cmd/compile/internal/ssa/writebarrier.go b/src/cmd/compile/internal/ssa/writebarrier.go index f0eceb7abe8..d6af3578d0a 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)