]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj/arm64: fix return with register
authorJoel Sing <joel@sing.id.au>
Fri, 14 Jun 2024 15:28:46 +0000 (01:28 +1000)
committerJoel Sing <joel@sing.id.au>
Tue, 25 Jun 2024 14:29:06 +0000 (14:29 +0000)
ARM64 allows for a register to be specified with a return
instruction. While the assembler parsing and encoding currently
supports this, the preprocess function uses LR unconditionally.
Correct this such that if a register is specified, the register
is used.

Change-Id: I708f6c7e910d141559b60d2d5ee76ae2e1dc3a0e
Reviewed-on: https://go-review.googlesource.com/c/go/+/592796
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: David Chase <drchase@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>

src/cmd/asm/internal/asm/testdata/arm64.s
src/cmd/internal/obj/arm64/obj7.go

index ecad08b37aa021ee87f83e77def30e590a496809..f12cdaf921fc44fef1d766ea5f4f4c62ba488546 100644 (file)
@@ -961,7 +961,11 @@ again:
        CASPD   (R2, R3), (R2), (R8, R9)             // 487c2248
 
 // RET
-       RET
+       RET                                        // c0035fd6
+       RET R0                                     // 00005fd6
+       RET R6                                     // c0005fd6
+       RET R27                                    // 60035fd6
+       RET R30                                    // c0035fd6
        RET     foo(SB)
 
 // B/BL/B.cond cases, and canonical names JMP, CALL.
index 0ab5939b8429106b4f74dc1c038187f813bd96ed..20498bc2c67da73cacbb4b6f9831563fde8ea350 100644 (file)
@@ -552,7 +552,6 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
 
        var q *obj.Prog
        var q1 *obj.Prog
-       var retjmp *obj.LSym
        for p := c.cursym.Func().Text; p != nil; p = p.Link {
                o := p.As
                switch o {
@@ -846,7 +845,10 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
                                break
                        }
 
-                       retjmp = p.To.Sym
+                       retJMP, retReg := p.To.Sym, p.To.Reg
+                       if retReg == 0 {
+                               retReg = REGLINK
+                       }
                        p.To = obj.Addr{}
                        if c.cursym.Func().Text.Mark&LEAF != 0 {
                                if c.autosize != 0 {
@@ -924,10 +926,10 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
                                p = q
                        }
 
-                       if retjmp != nil { // retjmp
+                       if retJMP != nil {
                                p.As = AB
                                p.To.Type = obj.TYPE_BRANCH
-                               p.To.Sym = retjmp
+                               p.To.Sym = retJMP
                                p.Spadj = +c.autosize
                                break
                        }
@@ -935,7 +937,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
                        p.As = obj.ARET
                        p.To.Type = obj.TYPE_MEM
                        p.To.Offset = 0
-                       p.To.Reg = REGLINK
+                       p.To.Reg = retReg
                        p.Spadj = +c.autosize
 
                case AADD, ASUB: