]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: enable -buildmode=plugin for ppc64le
authorLynn Boger <laboger@linux.vnet.ibm.com>
Tue, 15 Aug 2017 18:34:53 +0000 (14:34 -0400)
committerLynn Boger <laboger@linux.vnet.ibm.com>
Mon, 11 Sep 2017 21:20:38 +0000 (21:20 +0000)
This enables support for the buildmode plugin on
ppc64le.

Fixes #20756

Change-Id: I83241ff63f9b5c366fe0496cf46a3f67d75d08ac
Reviewed-on: https://go-review.googlesource.com/55850
Run-TryBot: Lynn Boger <laboger@linux.vnet.ibm.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: David Crawshaw <crawshaw@golang.org>
src/cmd/dist/test.go
src/cmd/go/internal/work/build.go
src/cmd/link/internal/ld/config.go
src/cmd/link/internal/ld/lib.go
src/cmd/link/internal/ppc64/asm.go

index ef41d76258b2cf669fa71d3c420d8328a50a74b9..4b46f7f1a30a47e04b655d214b665afec51a4302 100644 (file)
@@ -840,7 +840,7 @@ func (t *tester) supportedBuildmode(mode string) bool {
                // linux-arm64 is missing because it causes the external linker
                // to crash, see https://golang.org/issue/17138
                switch pair {
-               case "linux-386", "linux-amd64", "linux-arm", "linux-s390x":
+               case "linux-386", "linux-amd64", "linux-arm", "linux-s390x", "linux-ppc64le":
                        return true
                case "darwin-amd64":
                        return true
index e9c94015eaf7b94f7f4afcc367c5446d6d52d72b..22ece5b9892730559032def2f0ed5debc1c8438e 100644 (file)
@@ -356,7 +356,7 @@ func BuildModeInit() {
                        codegenArg = "-fPIC"
                } else {
                        switch platform {
-                       case "linux/amd64", "linux/arm", "linux/arm64", "linux/386", "linux/s390x",
+                       case "linux/amd64", "linux/arm", "linux/arm64", "linux/386", "linux/s390x", "linux/ppc64le",
                                "android/amd64", "android/arm", "android/arm64", "android/386":
                        case "darwin/amd64":
                                // Skip DWARF generation due to #21647
index f6e7ccf5760e402122cb464a88ec94193c06a711..f91d9af5cdd105d98e5f8948079c261460722cd0 100644 (file)
@@ -90,7 +90,7 @@ func (mode *BuildMode) Set(s string) error {
                switch objabi.GOOS {
                case "linux":
                        switch objabi.GOARCH {
-                       case "386", "amd64", "arm", "arm64", "s390x":
+                       case "386", "amd64", "arm", "arm64", "s390x", "ppc64le":
                        default:
                                return badmode()
                        }
index 47c719b7b60d6f10c7bd55eca34f3a9bfd5d4846..a1413820c733440148619b89d81313710dfccf25 100644 (file)
@@ -168,8 +168,12 @@ func (ctxt *Link) DynlinkingGo() bool {
        if !ctxt.Loaded {
                panic("DynlinkingGo called before all symbols loaded")
        }
-       canUsePlugins := ctxt.Syms.ROLookup("plugin.Open", 0) != nil
-       return Buildmode == BuildmodeShared || *FlagLinkshared || Buildmode == BuildmodePlugin || canUsePlugins
+       return Buildmode == BuildmodeShared || *FlagLinkshared || Buildmode == BuildmodePlugin || ctxt.CanUsePlugins()
+}
+
+// CanUsePlugins returns whether a plugins can be used
+func (ctxt *Link) CanUsePlugins() bool {
+       return ctxt.Syms.ROLookup("plugin.Open", 0) != nil
 }
 
 // UseRelro returns whether to make use of "read only relocations" aka
index a85a893584c1d6ce9d88a8c309a5484c2f46d110..2f0947aff8de82d1a896584c4f472fbdbeb9480b 100644 (file)
@@ -131,7 +131,7 @@ func genplt(ctxt *ld.Link) {
 
 func genaddmoduledata(ctxt *ld.Link) {
        addmoduledata := ctxt.Syms.ROLookup("runtime.addmoduledata", 0)
-       if addmoduledata.Type == ld.STEXT {
+       if addmoduledata.Type == ld.STEXT && ld.Buildmode != ld.BuildmodePlugin {
                return
        }
        addmoduledata.Attr |= ld.AttrReachable
@@ -147,6 +147,7 @@ func genaddmoduledata(ctxt *ld.Link) {
        rel.Off = int32(initfunc.Size)
        rel.Siz = 8
        rel.Sym = ctxt.Syms.Lookup(".TOC.", 0)
+       rel.Sym.Attr |= ld.AttrReachable
        rel.Type = objabi.R_ADDRPOWER_PCREL
        o(0x3c4c0000)
        // addi r2, r2, .TOC.-func@l
@@ -159,7 +160,13 @@ func genaddmoduledata(ctxt *ld.Link) {
        rel = ld.Addrel(initfunc)
        rel.Off = int32(initfunc.Size)
        rel.Siz = 8
-       rel.Sym = ctxt.Syms.Lookup("local.moduledata", 0)
+       if !ctxt.CanUsePlugins() {
+               rel.Sym = ctxt.Syms.Lookup("local.moduledata", 0)
+       } else {
+               rel.Sym = ctxt.Syms.Lookup("runtime.firstmoduledata", 0)
+       }
+       rel.Sym.Attr |= ld.AttrReachable
+       rel.Sym.Attr |= ld.AttrLocal
        rel.Type = objabi.R_ADDRPOWER_GOT
        o(0x3c620000)
        // ld r3, local.moduledata@got@l(r3)
@@ -182,6 +189,9 @@ func genaddmoduledata(ctxt *ld.Link) {
        // blr
        o(0x4e800020)
 
+       if ld.Buildmode == ld.BuildmodePlugin {
+               ctxt.Textp = append(ctxt.Textp, addmoduledata)
+       }
        initarray_entry := ctxt.Syms.Lookup("go.link.addmoduledatainit", 0)
        ctxt.Textp = append(ctxt.Textp, initfunc)
        initarray_entry.Attr |= ld.AttrReachable