aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/link/internal/ppc64/asm.go
diff options
context:
space:
mode:
authorKatie Hockman <katie@golang.org>2021-06-07 12:31:32 -0400
committerKatie Hockman <katie@golang.org>2021-06-07 12:31:32 -0400
commit9647f89f2ac2a64acb502c594fc747f206842a86 (patch)
treee48b92008454a8aa6ffd1f4709578ac5b921a6a4 /src/cmd/link/internal/ppc64/asm.go
parent03a15201e7e0f11c8f4021a181071040a04dc375 (diff)
parentab7f8297f9734b24a43a942930258cda411f16a3 (diff)
downloadgo-9647f89f2ac2a64acb502c594fc747f206842a86.tar.gz
go-9647f89f2ac2a64acb502c594fc747f206842a86.zip
[dev.boringcrypto.go1.15] all: merge go1.15.13 into dev.boringcrypto.go1.15
Change-Id: I90b28aa5938fe0bddf11201c6bdb851de5c654c3
Diffstat (limited to 'src/cmd/link/internal/ppc64/asm.go')
-rw-r--r--src/cmd/link/internal/ppc64/asm.go14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/cmd/link/internal/ppc64/asm.go b/src/cmd/link/internal/ppc64/asm.go
index a3ecd43f891..8b0f15141c5 100644
--- a/src/cmd/link/internal/ppc64/asm.go
+++ b/src/cmd/link/internal/ppc64/asm.go
@@ -658,6 +658,16 @@ func archrelocaddr(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Sy
return int64(o2)<<32 | int64(o1)
}
+// Determine if the code was compiled so that the TOC register R2 is initialized and maintained
+func r2Valid(ctxt *ld.Link) bool {
+ switch ctxt.BuildMode {
+ case ld.BuildModeCArchive, ld.BuildModeCShared, ld.BuildModePIE, ld.BuildModeShared, ld.BuildModePlugin:
+ return true
+ }
+ // -linkshared option
+ return ctxt.IsSharedGoLink()
+}
+
// resolve direct jump relocation r in s, and add trampoline if necessary
func trampoline(ctxt *ld.Link, ldr *loader.Loader, ri int, rs, s loader.Sym) {
@@ -665,7 +675,7 @@ func trampoline(ctxt *ld.Link, ldr *loader.Loader, ri int, rs, s loader.Sym) {
// For internal linking, trampolines are always created for long calls.
// For external linking, the linker can insert a call stub to handle a long call, but depends on having the TOC address in
// r2. For those build modes with external linking where the TOC address is not maintained in r2, trampolines must be created.
- if ctxt.IsExternal() && (ctxt.DynlinkingGo() || ctxt.BuildMode == ld.BuildModeCArchive || ctxt.BuildMode == ld.BuildModeCShared || ctxt.BuildMode == ld.BuildModePIE) {
+ if ctxt.IsExternal() && r2Valid(ctxt) {
// No trampolines needed since r2 contains the TOC
return
}
@@ -719,7 +729,7 @@ func trampoline(ctxt *ld.Link, ldr *loader.Loader, ri int, rs, s loader.Sym) {
}
}
if ldr.SymType(tramp) == 0 {
- if ctxt.DynlinkingGo() || ctxt.BuildMode == ld.BuildModeCArchive || ctxt.BuildMode == ld.BuildModeCShared || ctxt.BuildMode == ld.BuildModePIE {
+ if r2Valid(ctxt) {
// Should have returned for above cases
ctxt.Errorf(s, "unexpected trampoline for shared or dynamic linking")
} else {