]> Cypherpunks.ru repositories - gostls13.git/blobdiff - src/cmd/internal/obj/arm64/obj7.go
cmd/internal/obj/arm64: fix frame pointer restore in epilogue
[gostls13.git] / 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