Skip to content

Commit 67917c3

Browse files
committed
cmd/internal/obj: fix tail call in non-zero frame leaf function on MIPS and S390X
A "RET f(SB)" wasn't assembled correctly in a leaf function with non-zero frame size. Follows CL 371034, for MIPS(32/64)(be/le) and S390X. Other architectures seem to do it right. Add a test. Change-Id: I41349a7ae9862b924f3a3de2bcb55b782061ce21 Reviewed-on: https://go-review.googlesource.com/c/go/+/371214 Trust: Cherry Mui <cherryyz@google.com> Run-TryBot: Cherry Mui <cherryyz@google.com> Reviewed-by: David Chase <drchase@google.com>
1 parent 9e85dc5 commit 67917c3

File tree

4 files changed

+27
-6
lines changed

4 files changed

+27
-6
lines changed

src/cmd/internal/obj/mips/obj0.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -466,9 +466,15 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
466466
q = c.newprog()
467467
q.As = AJMP
468468
q.Pos = p.Pos
469-
q.To.Type = obj.TYPE_MEM
470-
q.To.Offset = 0
471-
q.To.Reg = REGLINK
469+
if retSym != nil { // retjmp
470+
q.To.Type = obj.TYPE_BRANCH
471+
q.To.Name = obj.NAME_EXTERN
472+
q.To.Sym = retSym
473+
} else {
474+
q.To.Type = obj.TYPE_MEM
475+
q.To.Reg = REGLINK
476+
q.To.Offset = 0
477+
}
472478
q.Mark |= BRANCH
473479
q.Spadj = +autosize
474480

src/cmd/internal/obj/s390x/objz.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -488,8 +488,13 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
488488
q = obj.Appendp(p, c.newprog)
489489
q.As = ABR
490490
q.From = obj.Addr{}
491-
q.To.Type = obj.TYPE_REG
492-
q.To.Reg = REG_LR
491+
if retTarget == nil {
492+
q.To.Type = obj.TYPE_REG
493+
q.To.Reg = REG_LR
494+
} else {
495+
q.To.Type = obj.TYPE_BRANCH
496+
q.To.Sym = retTarget
497+
}
493498
q.Mark |= BRANCH
494499
q.Spadj = autosize
495500
break

test/retjmp.dir/a.s

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,7 @@ TEXT ·f(SB), 4, $8-0
1010
TEXT ·leaf(SB), 4, $0-0
1111
RET ·f3(SB)
1212
JMP ·unreachable(SB)
13+
14+
TEXT ·leaf2(SB), 4, $32-0 // nonzero frame size
15+
RET ·f4(SB)
16+
JMP ·unreachable(SB)

test/retjmp.dir/main.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ package main
66

77
func f()
88
func leaf()
9+
func leaf2()
910

10-
var f1called, f2called, f3called bool
11+
var f1called, f2called, f3called, f4called bool
1112

1213
func main() {
1314
f()
@@ -21,11 +22,16 @@ func main() {
2122
if !f3called {
2223
panic("f3 not called")
2324
}
25+
leaf2()
26+
if !f4called {
27+
panic("f4 not called")
28+
}
2429
}
2530

2631
func f1() { f1called = true }
2732
func f2() { f2called = true }
2833
func f3() { f3called = true }
34+
func f4() { f4called = true }
2935

3036
func unreachable() {
3137
panic("unreachable function called")

0 commit comments

Comments
 (0)