diff options
author | Keith Randall <khr@golang.org> | 2023-10-30 13:23:00 -0700 |
---|---|---|
committer | Michael Knyszek <mknyszek@google.com> | 2024-02-02 16:26:24 +0000 |
commit | 2fdad8af6daf385ab688ba5465442fe943187b84 (patch) | |
tree | b8f635afe54555d5286cf8c18cdc475981e4b8d7 | |
parent | 01c93ad0498b4bc337ced16f4a4b8b65f255189c (diff) | |
download | go-2fdad8af6daf385ab688ba5465442fe943187b84.tar.gz go-2fdad8af6daf385ab688ba5465442fe943187b84.zip |
[release-branch.go1.21] cmd/internal/obj/arm64: fix frame pointer restore in epilogue
For leaf but nonzero-frame functions.
Currently we're not restoring it properly. We also need to restore
it before popping the stack frame, so that the frame won't get
clobbered by a signal handler in the meantime.
For #63830
Fixes #65449
Needs a test, but I'm not at all sure how we would actually do that. Leaving for inspiration.
Change-Id: I273a25f2a838f05a959c810145cccc5428eaf164
Reviewed-on: https://go-review.googlesource.com/c/go/+/538635
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Eric Fang <eric.fang@arm.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: David Chase <drchase@google.com>
(cherry picked from commit c9888bdfe2cdd85d14d7d184863d2e8bc42ff73c)
Reviewed-on: https://go-review.googlesource.com/c/go/+/560735
TryBot-Bypass: Michael Knyszek <mknyszek@google.com>
Reviewed-by: Keith Randall <khr@golang.org>
-rw-r--r-- | src/cmd/internal/obj/arm64/obj7.go | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/src/cmd/internal/obj/arm64/obj7.go b/src/cmd/internal/obj/arm64/obj7.go index f963f62dcd..f7cca30717 100644 --- a/src/cmd/internal/obj/arm64/obj7.go +++ b/src/cmd/internal/obj/arm64/obj7.go @@ -826,21 +826,24 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { p.To = obj.Addr{} if c.cursym.Func().Text.Mark&LEAF != 0 { if c.autosize != 0 { + // Restore frame pointer. + // ADD $framesize-8, RSP, R29 p.As = AADD p.From.Type = obj.TYPE_CONST - p.From.Offset = int64(c.autosize) + p.From.Offset = int64(c.autosize) - 8 + p.Reg = REGSP p.To.Type = obj.TYPE_REG - p.To.Reg = REGSP - p.Spadj = -c.autosize + p.To.Reg = REGFP - // Frame pointer. + // Pop stack frame. + // ADD $framesize, RSP, RSP p = obj.Appendp(p, c.newprog) - p.As = ASUB + p.As = AADD p.From.Type = obj.TYPE_CONST - p.From.Offset = 8 - p.Reg = REGSP + p.From.Offset = int64(c.autosize) p.To.Type = obj.TYPE_REG - p.To.Reg = REGFP + p.To.Reg = REGSP + p.Spadj = -c.autosize } } else { aoffset := c.autosize |