mirror of
https://github.com/golang/go.git
synced 2025-05-05 23:53:05 +00:00
cmd/internal/obj/arm64: fix return with register
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>
This commit is contained in:
parent
b3b4556c24
commit
b1fd047508
6
src/cmd/asm/internal/asm/testdata/arm64.s
vendored
6
src/cmd/asm/internal/asm/testdata/arm64.s
vendored
@ -961,7 +961,11 @@ again:
|
|||||||
CASPD (R2, R3), (R2), (R8, R9) // 487c2248
|
CASPD (R2, R3), (R2), (R8, R9) // 487c2248
|
||||||
|
|
||||||
// RET
|
// RET
|
||||||
RET
|
RET // c0035fd6
|
||||||
|
RET R0 // 00005fd6
|
||||||
|
RET R6 // c0005fd6
|
||||||
|
RET R27 // 60035fd6
|
||||||
|
RET R30 // c0035fd6
|
||||||
RET foo(SB)
|
RET foo(SB)
|
||||||
|
|
||||||
// B/BL/B.cond cases, and canonical names JMP, CALL.
|
// B/BL/B.cond cases, and canonical names JMP, CALL.
|
||||||
|
@ -552,7 +552,6 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
|
|||||||
|
|
||||||
var q *obj.Prog
|
var q *obj.Prog
|
||||||
var q1 *obj.Prog
|
var q1 *obj.Prog
|
||||||
var retjmp *obj.LSym
|
|
||||||
for p := c.cursym.Func().Text; p != nil; p = p.Link {
|
for p := c.cursym.Func().Text; p != nil; p = p.Link {
|
||||||
o := p.As
|
o := p.As
|
||||||
switch o {
|
switch o {
|
||||||
@ -846,7 +845,10 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
retjmp = p.To.Sym
|
retJMP, retReg := p.To.Sym, p.To.Reg
|
||||||
|
if retReg == 0 {
|
||||||
|
retReg = REGLINK
|
||||||
|
}
|
||||||
p.To = obj.Addr{}
|
p.To = obj.Addr{}
|
||||||
if c.cursym.Func().Text.Mark&LEAF != 0 {
|
if c.cursym.Func().Text.Mark&LEAF != 0 {
|
||||||
if c.autosize != 0 {
|
if c.autosize != 0 {
|
||||||
@ -924,10 +926,10 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
|
|||||||
p = q
|
p = q
|
||||||
}
|
}
|
||||||
|
|
||||||
if retjmp != nil { // retjmp
|
if retJMP != nil {
|
||||||
p.As = AB
|
p.As = AB
|
||||||
p.To.Type = obj.TYPE_BRANCH
|
p.To.Type = obj.TYPE_BRANCH
|
||||||
p.To.Sym = retjmp
|
p.To.Sym = retJMP
|
||||||
p.Spadj = +c.autosize
|
p.Spadj = +c.autosize
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@ -935,7 +937,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
|
|||||||
p.As = obj.ARET
|
p.As = obj.ARET
|
||||||
p.To.Type = obj.TYPE_MEM
|
p.To.Type = obj.TYPE_MEM
|
||||||
p.To.Offset = 0
|
p.To.Offset = 0
|
||||||
p.To.Reg = REGLINK
|
p.To.Reg = retReg
|
||||||
p.Spadj = +c.autosize
|
p.Spadj = +c.autosize
|
||||||
|
|
||||||
case AADD, ASUB:
|
case AADD, ASUB:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user