aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/internal/obj
diff options
context:
space:
mode:
authorJoel Sing <joel@sing.id.au>2024-06-15 01:28:46 +1000
committerJoel Sing <joel@sing.id.au>2024-06-25 14:29:06 +0000
commitb1fd047508aad9f5038dc04d78146cc582328bf5 (patch)
treeb5e1929d55206a7579dbc71e6ef810f4ce9fefdd /src/cmd/internal/obj
parentb3b4556c245c8f21872910ee866133428bbb5a60 (diff)
downloadgo-b1fd047508aad9f5038dc04d78146cc582328bf5.tar.xz
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>
Diffstat (limited to 'src/cmd/internal/obj')
-rw-r--r--src/cmd/internal/obj/arm64/obj7.go12
1 files changed, 7 insertions, 5 deletions
diff --git a/src/cmd/internal/obj/arm64/obj7.go b/src/cmd/internal/obj/arm64/obj7.go
index 0ab5939b84..20498bc2c6 100644
--- a/src/cmd/internal/obj/arm64/obj7.go
+++ b/src/cmd/internal/obj/arm64/obj7.go
@@ -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: