Skip to content

Commit

Permalink
cmd/link: on PPC64, put plt stubs at beginning of Textp
Browse files Browse the repository at this point in the history
Put call stubs at the beginning (instead of the end). So the
trampoline pass knows the addresses of the stubs, and it can
insert trampolines when necessary.

Fixes golang#19425.

Change-Id: I1e06529ef837a6130df58917315610d45a6819ca
Reviewed-on: https://go-review.googlesource.com/38131
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Lynn Boger <laboger@linux.vnet.ibm.com>
  • Loading branch information
cherrymui committed Mar 15, 2017
1 parent 43afcb5 commit 15b3765
Showing 1 changed file with 7 additions and 1 deletion.
8 changes: 7 additions & 1 deletion src/cmd/link/internal/ppc64/asm.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ func genplt(ctxt *ld.Link) {
//
// This assumes "case 1" from the ABI, where the caller needs
// us to save and restore the TOC pointer.
var stubs []*ld.Symbol
for _, s := range ctxt.Textp {
for i := range s.R {
r := &s.R[i]
Expand All @@ -108,7 +109,7 @@ func genplt(ctxt *ld.Link) {
if stub.Size == 0 {
// Need outer to resolve .TOC.
stub.Outer = s
ctxt.Textp = append(ctxt.Textp, stub)
stubs = append(stubs, stub)
gencallstub(ctxt, 1, stub, r.Sym)
}

Expand All @@ -121,6 +122,11 @@ func genplt(ctxt *ld.Link) {
ctxt.Arch.ByteOrder.PutUint32(s.P[r.Off+4:], o1)
}
}
// Put call stubs at the beginning (instead of the end).
// So when resolving the relocations to calls to the stubs,
// the addresses are known and trampolines can be inserted
// when necessary.
ctxt.Textp = append(stubs, ctxt.Textp...)
}

func genaddmoduledata(ctxt *ld.Link) {
Expand Down

0 comments on commit 15b3765

Please sign in to comment.