]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: don't use trampolines in ppc64le ext linking
authorLynn Boger <laboger@linux.vnet.ibm.com>
Fri, 4 Nov 2016 19:53:59 +0000 (14:53 -0500)
committerDavid Chase <drchase@google.com>
Mon, 7 Nov 2016 15:03:24 +0000 (15:03 +0000)
On ppc64x, trampolines are used to resolve too-far
branches for internal linking.  The external linking,
solution on ppc64x is to split text sections when they
get too large, allowing the external linker to handle
the long branches.

On arm trampolines are generanted for too-far branches
for internal and external linking.  When the change
was made recently to enable trampolines for external linking
on arm, that broke the ppc64x fix for too-far branches
with external linking.

The fix adds a check to use trampolines only for internal
linking with ppc64x.

Fixes #17795

Change-Id: Icce968fb96545f10a913e07654514643bce96261
Reviewed-on: https://go-review.googlesource.com/32853
Run-TryBot: Lynn Boger <laboger@linux.vnet.ibm.com>
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Reviewed-by: David Chase <drchase@google.com>
src/cmd/link/internal/ld/data.go

index 5197cb99b49fd46f41d918de8a01b4946e94f45f..7dff9baaeafa37af49e3ae481c2c44c36d1f4291 100644 (file)
@@ -325,12 +325,17 @@ func isRuntimeDepPkg(pkg string) bool {
 }
 
 // detect too-far jumps in function s, and add trampolines if necessary
-// (currently only ARM supports trampoline insertion)
+// ARM supports trampoline insertion for internal and external linking
+// PPC64 & PPC64LE support trampoline insertion for internal linking only
 func trampoline(ctxt *Link, s *Symbol) {
        if Thearch.Trampoline == nil {
                return // no need or no support of trampolines on this arch
        }
 
+       if Linkmode == LinkExternal && SysArch.Family == sys.PPC64 {
+               return
+       }
+
        for ri := range s.R {
                r := &s.R[ri]
                if !r.Type.IsDirectJump() {