diff options
| author | Joel Sing <joel@sing.id.au> | 2024-06-15 01:28:46 +1000 |
|---|---|---|
| committer | Joel Sing <joel@sing.id.au> | 2024-06-25 14:29:06 +0000 |
| commit | b1fd047508aad9f5038dc04d78146cc582328bf5 (patch) | |
| tree | b5e1929d55206a7579dbc71e6ef810f4ce9fefdd /src/cmd/internal/obj | |
| parent | b3b4556c245c8f21872910ee866133428bbb5a60 (diff) | |
| download | go-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.go | 12 |
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: |
