]> Cypherpunks.ru repositories - gostls13.git/commitdiff
cmd/internal/obj/arm64: fix frame pointer restore in epilogue
authorKeith Randall <khr@golang.org>
Mon, 30 Oct 2023 20:23:00 +0000 (13:23 -0700)
committerKeith Randall <khr@golang.org>
Wed, 8 Nov 2023 05:46:32 +0000 (05:46 +0000)
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.

Fixes #63830

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>
src/cmd/internal/obj/arm64/obj7.go

index bd33cbe9073f4a3b0b741b03f561550e00b3e12c..0ab5939b8429106b4f74dc1c038187f813bd96ed 100644 (file)
@@ -850,21 +850,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