diff options
author | David Chase <drchase@google.com> | 2021-04-16 00:15:31 -0400 |
---|---|---|
committer | David Chase <drchase@google.com> | 2021-04-16 20:12:20 +0000 |
commit | b6e1c336037e53ae095e84cfed4a312d8fd3ad45 (patch) | |
tree | fb6a9784ec9249331e75f642bfd7d56e7ec9b266 /src/cmd/compile/internal/ssagen | |
parent | fff236e659fa819e036ab849130931dd6245c7b2 (diff) | |
download | go-b6e1c336037e53ae095e84cfed4a312d8fd3ad45.tar.gz go-b6e1c336037e53ae095e84cfed4a312d8fd3ad45.zip |
cmd/compile: spill all the parameters around morestack
former code only spilled those parameters mentioned in code
AT THE REGISTER LEVEL, this caused problems with liveness
sometimes (which worked on whole variables including
aggregates).
Updates #40724.
Change-Id: Ib9fdc50d95d1d2b1f1e405dd370540e88582ac71
Reviewed-on: https://go-review.googlesource.com/c/go/+/310690
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>
Diffstat (limited to 'src/cmd/compile/internal/ssagen')
-rw-r--r-- | src/cmd/compile/internal/ssagen/ssa.go | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/src/cmd/compile/internal/ssagen/ssa.go b/src/cmd/compile/internal/ssagen/ssa.go index f0bce0756a..e7d4865375 100644 --- a/src/cmd/compile/internal/ssagen/ssa.go +++ b/src/cmd/compile/internal/ssagen/ssa.go @@ -641,6 +641,22 @@ func buildssa(fn *ir.Func, worker int) *ssa.Func { s.emitOpenDeferInfo() } + // Record incoming parameter spill information for morestack calls emitted in the assembler. + // This is done here, using all the parameters (used, partially used, and unused) because + // it mimics the behavior of the former ABI (everything stored) and because it's not 100% + // clear if naming conventions are respected in autogenerated code. + // TODO figure out exactly what's unused, don't spill it. Make liveness fine-grained, also. + // TODO non-amd64 architectures have link registers etc that may require adjustment here. + for _, p := range params.InParams() { + typs, offs := p.RegisterTypesAndOffsets() + for i, t := range typs { + o := offs[i] // offset within parameter + fo := p.FrameOffset(params) // offset of parameter in frame + reg := ssa.ObjRegForAbiReg(p.Registers[i], s.f.Config) + s.f.RegArgs = append(s.f.RegArgs, ssa.Spill{Reg: reg, Offset: fo + o, Type: t}) + } + } + return s.f } @@ -7578,16 +7594,12 @@ func deferstruct(stksize int64) *types.Type { // The resulting addr is used in a non-standard context -- in the prologue // of a function, before the frame has been constructed, so the standard // addressing for the parameters will be wrong. -func SpillSlotAddr(slot *ssa.LocalSlot, baseReg int16, extraOffset int64) obj.Addr { - n, off := slot.N, slot.Off - if n.Class != ir.PPARAM && n.Class != ir.PPARAMOUT { - panic("Only expected to see param and returns here") - } +func SpillSlotAddr(spill ssa.Spill, baseReg int16, extraOffset int64) obj.Addr { return obj.Addr{ Name: obj.NAME_NONE, Type: obj.TYPE_MEM, Reg: baseReg, - Offset: off + extraOffset + n.FrameOffset(), + Offset: spill.Offset + extraOffset, } } |