]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go,cmd/link: support buildmode c-shared on ppc64le
authorLynn Boger <laboger@linux.vnet.ibm.com>
Tue, 8 Aug 2017 17:45:41 +0000 (13:45 -0400)
committerLynn Boger <laboger@linux.vnet.ibm.com>
Wed, 9 Aug 2017 17:11:38 +0000 (17:11 +0000)
This change enables buildmode c-shared on ppc64le.

A bug was fixed in runtime/rt0_linux_ppc64le.s that was necessary to
make this work.  In _rt0_ppc64le_linux_lib, there is code to store
the value of r2 onto the caller's stack.  However, if this file
is compiled using a build mode that maintains the TOC address in
r2, then instructions will be inserted at the beginning of this
function to generate the r2 value for the callee, not the caller.
That means the r2 value for the callee is stored onto the caller's
stack.  If caller and callee don't have the same r2 values, then
the caller will restore the wrong r2 value after it returns.  This
situation can happen when using dlopen since the caller of this
function will be in ld64.so and will definitely have a different
TOC.

Updates #20756

Change-Id: I6e165e0d0716e73721bbbcc520e8302e4856e3ba
Reviewed-on: https://go-review.googlesource.com/53890
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/cmd/dist/test.go
src/cmd/go/internal/work/build.go
src/cmd/link/internal/ld/config.go
src/runtime/rt0_linux_ppc64le.s

index 73432d31ea37f63853d9f4590fe9db7482aac895..6052904cbf3a003d43b600a449c5406948b7477d 100644 (file)
@@ -824,7 +824,7 @@ func (t *tester) supportedBuildmode(mode string) bool {
                return false
        case "c-shared":
                switch pair {
-               case "linux-386", "linux-amd64", "linux-arm", "linux-arm64",
+               case "linux-386", "linux-amd64", "linux-arm", "linux-arm64", "linux-ppc64le",
                        "darwin-amd64", "darwin-386",
                        "android-arm", "android-arm64", "android-386":
                        return true
index 7d667ff552e3aeb339e422348cf1d4d37747f51f..8ac4f75985c81e943ea97f709a0c34c7d4136d11 100644 (file)
@@ -293,7 +293,7 @@ func BuildModeInit() {
                        codegenArg = "-fPIC"
                } else {
                        switch platform {
-                       case "linux/amd64", "linux/arm", "linux/arm64", "linux/386",
+                       case "linux/amd64", "linux/arm", "linux/arm64", "linux/386", "linux/ppc64le",
                                "android/amd64", "android/arm", "android/arm64", "android/386":
                                codegenArg = "-shared"
                        case "darwin/amd64", "darwin/386":
index 342351b4bca9ea7100f360df662ca43ada46bbc0..aae2a437236c72dfe4fdf5427728053dd586f1b6 100644 (file)
@@ -63,7 +63,7 @@ func (mode *BuildMode) Set(s string) error {
                *mode = BuildmodeCArchive
        case "c-shared":
                switch objabi.GOARCH {
-               case "386", "amd64", "arm", "arm64":
+               case "386", "amd64", "arm", "arm64", "ppc64le":
                default:
                        return badmode()
                }
index 81b991349a2cf36dd8b281f2859bcd28676fa1a1..134858bff88f1835e1cb5382c5112ea19a5a288e 100644 (file)
@@ -10,7 +10,6 @@ TEXT _rt0_ppc64le_linux_lib(SB),NOSPLIT,$-8
        MOVD    R0, 16(R1) // Save LR in caller's frame.
        MOVW    CR, R0     // Save CR in caller's frame
        MOVD    R0, 8(R1)
-       MOVD    R2, 24(R1) // Save TOC in caller's frame.
        MOVDU   R1, -320(R1) // Allocate frame.
        
        // Preserve callee-save registers.
@@ -121,7 +120,6 @@ done:
        FMOVD   304(R1), F31
 
        ADD     $320, R1
-       MOVD    24(R1), R2
        MOVD    8(R1), R0
        MOVFL   R0, $0xff
        MOVD    16(R1), R0