]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/asm,cmd/compile: fix tail call in leaf functions on PPC64
authorPaul E. Murphy <murp@ibm.com>
Fri, 10 Dec 2021 22:58:43 +0000 (16:58 -0600)
committerCherry Mui <cherryyz@google.com>
Mon, 13 Dec 2021 16:09:22 +0000 (16:09 +0000)
In some leaf functions using "RET foo(SB)", the jump may be incorrectly
translated into "JMP LR" instead of "JMP foo(SB)".

Such is the case when compiling the autogenerated function in k8s
k8s.io/kubernetes/pkg/kubelet/server/stats.(*resourceAnalyzer).GetPodVolumeStats.

Fixes #50048

Change-Id: Icdf65fcda6b3c5eb9d3ad5c7aad04add9419dffb
Reviewed-on: https://go-review.googlesource.com/c/go/+/371034
Run-TryBot: Paul Murphy <murp@ibm.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Trust: Paul Murphy <murp@ibm.com>

src/cmd/internal/obj/ppc64/obj9.go

index 7ac6465a7296b824a2fc25b93beadc0f47cf402e..c986c0d2b6e27ec13d1b712dd720a9223adb327c 100644 (file)
@@ -884,8 +884,13 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
                                q = c.newprog()
                                q.As = ABR
                                q.Pos = p.Pos
-                               q.To.Type = obj.TYPE_REG
-                               q.To.Reg = REG_LR
+                               if retTarget == nil {
+                                       q.To.Type = obj.TYPE_REG
+                                       q.To.Reg = REG_LR
+                               } else {
+                                       q.To.Type = obj.TYPE_BRANCH
+                                       q.To.Sym = retTarget
+                               }
                                q.Mark |= BRANCH
                                q.Spadj = +autosize