]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj/loong64: save LR after decrementing SP
authorGuoqi Chen <chenguoqi@loongson.cn>
Tue, 5 Jul 2022 11:41:27 +0000 (19:41 +0800)
committerGopher Robot <gobot@golang.org>
Tue, 28 Mar 2023 05:41:44 +0000 (05:41 +0000)
Refer to CL 413428 and 412474, for loong64, like mips, s390x and riscv, there
is no single instruction that saves the LR and decrements the SP, so we also
need to insert an instruction to save the LR after decrementing the SP.

Fixes #56623.
Updates #53374.

Change-Id: I3de040792f0a041d3d2a98ea89c23a2dd2f4ad10
Reviewed-on: https://go-review.googlesource.com/c/go/+/416154
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Auto-Submit: Cherry Mui <cherryyz@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: WANG Xuerui <git@xen0n.name>
Reviewed-by: xiaodong liu <teaofmoli@gmail.com>
Run-TryBot: Cherry Mui <cherryyz@google.com>
Reviewed-by: Meidan Li <limeidan@loongson.cn>
src/cmd/internal/obj/loong64/obj.go

index dc05e18c7d85d260200a71f435b1b5bbb3e43c7a..0c1f5c029da94b991ce508cdcb51ed60de4d80dd 100644 (file)
@@ -260,6 +260,20 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
                                q.Spadj = +autosize
 
                                q = c.ctxt.EndUnsafePoint(q, c.newprog, -1)
+
+                               // On Linux, in a cgo binary we may get a SIGSETXID signal early on
+                               // before the signal stack is set, as glibc doesn't allow us to block
+                               // SIGSETXID. So a signal may land on the current stack and clobber
+                               // the content below the SP. We store the LR again after the SP is
+                               // decremented.
+                               q = obj.Appendp(q, newprog)
+                               q.As = mov
+                               q.Pos = p.Pos
+                               q.From.Type = obj.TYPE_REG
+                               q.From.Reg = REGLINK
+                               q.To.Type = obj.TYPE_MEM
+                               q.To.Offset = 0
+                               q.To.Reg = REGSP
                        }
 
                        if c.cursym.Func().Text.From.Sym.Wrapper() && c.cursym.Func().Text.Mark&LEAF == 0 {