]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj: mark unspill code in prologue preemptible
authorzhouguangyuan <zhouguangyuan.xian@gmail.com>
Wed, 6 Sep 2023 16:09:31 +0000 (00:09 +0800)
committerCherry Mui <cherryyz@google.com>
Fri, 8 Sep 2023 18:36:45 +0000 (18:36 +0000)
The UnspillReg code should always be preemptible because all the arg registers will be saved by runtime.asyncpreempt.

Change-Id: Ie36b5d0cdd1275efcb95661354d83be2e1b00a86
Reviewed-on: https://go-review.googlesource.com/c/go/+/526235
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Run-TryBot: Cherry Mui <cherryyz@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
src/cmd/internal/obj/arm64/obj7.go
src/cmd/internal/obj/ppc64/obj9.go
src/cmd/internal/obj/riscv/obj.go
src/cmd/internal/obj/x86/obj6.go

index 9774e0120bdefd3b2a43551a3aed2012ad43dc09..0e16e287a78779f2f6ad8923c4896c24147ad72b 100644 (file)
@@ -289,11 +289,12 @@ func (c *ctxt7) stacksplit(p *obj.Prog, framesize int32) *obj.Prog {
        }
        call.To.Sym = c.ctxt.Lookup(morestack)
 
-       unspill := c.cursym.Func().UnspillRegisterArgs(call, c.newprog)
-       pcdata = c.ctxt.EndUnsafePoint(unspill, c.newprog, -1)
+       // The instructions which unspill regs should be preemptible.
+       pcdata = c.ctxt.EndUnsafePoint(call, c.newprog, -1)
+       unspill := c.cursym.Func().UnspillRegisterArgs(pcdata, c.newprog)
 
        // B    start
-       jmp := obj.Appendp(pcdata, c.newprog)
+       jmp := obj.Appendp(unspill, c.newprog)
        jmp.As = AB
        jmp.To.Type = obj.TYPE_BRANCH
        jmp.To.SetTarget(startPred.Link)
index 02831b890a31ecb2afc5eafc133e00026d834553..da95e65079c4c7bc95eba9574221e00001496002 100644 (file)
@@ -1363,11 +1363,12 @@ func (c *ctxt9) stacksplit(p *obj.Prog, framesize int32) *obj.Prog {
                p.To.Reg = REG_R2
        }
 
+       // The instructions which unspill regs should be preemptible.
+       p = c.ctxt.EndUnsafePoint(p, c.newprog, -1)
        unspill := c.cursym.Func().UnspillRegisterArgs(p, c.newprog)
-       p = c.ctxt.EndUnsafePoint(unspill, c.newprog, -1)
 
        // BR   start
-       p = obj.Appendp(p, c.newprog)
+       p = obj.Appendp(unspill, c.newprog)
        p.As = ABR
        p.To.Type = obj.TYPE_BRANCH
        p.To.SetTarget(startPred.Link)
index 7b5621f65082cd6954857884bedac41f5b7bedd6..675031de73f14366941c9770c52bf329f59cbbe0 100644 (file)
@@ -913,8 +913,9 @@ func stacksplit(ctxt *obj.Link, p *obj.Prog, cursym *obj.LSym, newprog obj.ProgA
        }
        jalToSym(ctxt, p, REG_X5)
 
-       p = cursym.Func().UnspillRegisterArgs(p, newprog)
+       // The instructions which unspill regs should be preemptible.
        p = ctxt.EndUnsafePoint(p, newprog, -1)
+       p = cursym.Func().UnspillRegisterArgs(p, newprog)
 
        // JMP start
        p = obj.Appendp(p, newprog)
index fc4007ec88b7fd6451db842785fa5acccae8d47a..e6ea8985e4f78c326a2df0c6b015db0d963ed083 100644 (file)
@@ -1226,10 +1226,11 @@ func stacksplit(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog, newprog obj.ProgA
                progedit(ctxt, callend.Link, newprog)
        }
 
-       pcdata = cursym.Func().UnspillRegisterArgs(callend, newprog)
-       pcdata = ctxt.EndUnsafePoint(pcdata, newprog, -1)
+       // The instructions which unspill regs should be preemptible.
+       pcdata = ctxt.EndUnsafePoint(callend, newprog, -1)
+       unspill := cursym.Func().UnspillRegisterArgs(pcdata, newprog)
 
-       jmp := obj.Appendp(pcdata, newprog)
+       jmp := obj.Appendp(unspill, newprog)
        jmp.As = obj.AJMP
        jmp.To.Type = obj.TYPE_BRANCH
        jmp.To.SetTarget(startPred.Link)