aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/ssagen
diff options
context:
space:
mode:
authorDavid Chase <drchase@google.com>2021-04-16 00:15:31 -0400
committerDavid Chase <drchase@google.com>2021-04-16 20:12:20 +0000
commitb6e1c336037e53ae095e84cfed4a312d8fd3ad45 (patch)
treefb6a9784ec9249331e75f642bfd7d56e7ec9b266 /src/cmd/compile/internal/ssagen
parentfff236e659fa819e036ab849130931dd6245c7b2 (diff)
downloadgo-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.go24
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,
}
}