]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.link] cmd/link: stream external relocations on PPC64
authorCherry Zhang <cherryyz@google.com>
Wed, 22 Jul 2020 17:30:49 +0000 (13:30 -0400)
committerCherry Zhang <cherryyz@google.com>
Thu, 23 Jul 2020 16:44:27 +0000 (16:44 +0000)
Both ELF and Xcoff.

Now we support streaming on all platforms. Later CLs will clean
up the old code.

Change-Id: Ieeef7844a3e229429983a8bc108d7f3fabf618e9
Reviewed-on: https://go-review.googlesource.com/c/go/+/244358
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Jeremy Faller <jeremy@golang.org>
src/cmd/link/internal/ld/target.go
src/cmd/link/internal/ld/xcoff.go
src/cmd/link/internal/ppc64/asm.go
src/cmd/link/internal/ppc64/obj.go

index 2dafe9bb1f6127d993b2381d5d53da1304256999..ffe7c526172446f457e6810f052850f50fefdfc7 100644 (file)
@@ -184,6 +184,5 @@ func (t *Target) IsBigEndian() bool {
 
 // Temporary helper.
 func (t *Target) StreamExtRelocs() bool {
-       return (t.IsELF || t.IsDarwin() || t.IsWindows()) &&
-               (t.IsAMD64() || t.Is386() || t.IsARM() || t.IsARM64() || t.IsMIPS() || t.IsMIPS64() || t.IsS390X())
+       return true
 }
index 9e3b8e2a0c6befa603e2de8a49e2e6c8583bf106..3d1677e278f8eb25838ecd05751b03570e74d2da 100644 (file)
@@ -1695,27 +1695,32 @@ func (f *xcoffFile) emitRelocations(ctxt *Link, fileoff int64) {
                                break
                        }
 
+                       // Compute external relocations on the go, and pass to Xcoffreloc1 to stream out.
                        // Relocation must be ordered by address, so create a list of sorted indices.
-                       relocs := ldr.ExtRelocs(s)
+                       relocs := ldr.Relocs(s)
                        sorted := make([]int, relocs.Count())
                        for i := 0; i < relocs.Count(); i++ {
                                sorted[i] = i
                        }
                        sort.Slice(sorted, func(i, j int) bool {
-                               return relocs.At(sorted[i]).Off() < relocs.At(sorted[j]).Off()
+                               return relocs.At2(sorted[i]).Off() < relocs.At2(sorted[j]).Off()
                        })
 
                        for _, ri := range sorted {
-                               r := relocs.At(ri)
-
-                               if r.Xsym == 0 {
+                               r := relocs.At2(ri)
+                               rr, ok := extreloc(ctxt, ldr, s, r, ri)
+                               if !ok {
+                                       continue
+                               }
+                               if rr.Xsym == 0 {
                                        ldr.Errorf(s, "missing xsym in relocation")
                                        continue
                                }
-                               if ldr.SymDynid(r.Xsym) < 0 {
-                                       ldr.Errorf(s, "reloc %s to non-coff symbol %s (outer=%s) %d %d", r.Type(), ldr.SymName(r.Sym()), ldr.SymName(r.Xsym), ldr.SymType(r.Sym()), ldr.SymDynid(r.Xsym))
+                               if ldr.SymDynid(rr.Xsym) < 0 {
+                                       ldr.Errorf(s, "reloc %s to non-coff symbol %s (outer=%s) %d %d", r.Type(), ldr.SymName(r.Sym()), ldr.SymName(rr.Xsym), ldr.SymType(r.Sym()), ldr.SymDynid(rr.Xsym))
                                }
-                               if !thearch.Xcoffreloc1(ctxt.Arch, ctxt.Out, ldr, s, r, int64(uint64(ldr.SymValue(s)+int64(r.Off()))-base)) {
+                               rv := loader.ExtRelocView{Reloc2: r, ExtReloc: rr}
+                               if !thearch.Xcoffreloc1(ctxt.Arch, ctxt.Out, ldr, s, rv, int64(uint64(ldr.SymValue(s)+int64(r.Off()))-base)) {
                                        ldr.Errorf(s, "unsupported obj reloc %d(%s)/%d to %s", r.Type(), r.Type(), r.Siz(), ldr.SymName(r.Sym()))
                                }
                        }
index 7dca8703a8eaf4fcd0a9500fc291b350c3d94f9d..1daed8ac44d4ecefd820474e47833ab3b28591f0 100644 (file)
@@ -804,7 +804,7 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade
                // value with the current addresses.
                switch rt := r.Type(); rt {
                default:
-                       if target.IsAIX() {
+                       if !target.IsAIX() {
                                return val, nExtReloc, false
                        }
                case objabi.R_POWER_TLS, objabi.R_POWER_TLS_LE, objabi.R_POWER_TLS_IE:
@@ -813,8 +813,6 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade
                        if rt == objabi.R_POWER_TLS_IE {
                                nExtReloc = 2 // need two ELF relocations, see elfreloc1
                        }
-                       rr.Xadd = r.Add()
-                       rr.Xsym = rs
                        return val, nExtReloc, true
                case objabi.R_ADDRPOWER,
                        objabi.R_ADDRPOWER_DS,
@@ -823,23 +821,11 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade
                        objabi.R_ADDRPOWER_GOT,
                        objabi.R_ADDRPOWER_PCREL:
                        nExtReloc = 2 // need two ELF relocations, see elfreloc1
-
-                       // set up addend for eventual relocation via outer symbol.
-                       rs, off := ld.FoldSubSymbolOffset(ldr, rs)
-                       rr.Xadd = r.Add() + off
-                       rst := ldr.SymType(rs)
-                       if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && rst != sym.SUNDEFEXT && ldr.SymSect(rs) == nil {
-                               ldr.Errorf(s, "missing section for %s", ldr.SymName(rs))
-                       }
-                       rr.Xsym = rs
-
                        if !target.IsAIX() {
                                return val, nExtReloc, true
                        }
                case objabi.R_CALLPOWER:
                        nExtReloc = 1
-                       rr.Xsym = rs
-                       rr.Xadd = r.Add()
                        if !target.IsAIX() {
                                return val, nExtReloc, true
                        }
@@ -980,6 +966,37 @@ overflow:
        return t
 }
 
+func extreloc(target *ld.Target, ldr *loader.Loader, r loader.Reloc2, s loader.Sym) (loader.ExtReloc, bool) {
+       rs := ldr.ResolveABIAlias(r.Sym())
+       var rr loader.ExtReloc
+       switch r.Type() {
+       case objabi.R_POWER_TLS, objabi.R_POWER_TLS_LE, objabi.R_POWER_TLS_IE:
+               rr.Xadd = r.Add()
+               rr.Xsym = rs
+               return rr, true
+       case objabi.R_ADDRPOWER,
+               objabi.R_ADDRPOWER_DS,
+               objabi.R_ADDRPOWER_TOCREL,
+               objabi.R_ADDRPOWER_TOCREL_DS,
+               objabi.R_ADDRPOWER_GOT,
+               objabi.R_ADDRPOWER_PCREL:
+               // set up addend for eventual relocation via outer symbol.
+               rs, off := ld.FoldSubSymbolOffset(ldr, rs)
+               rr.Xadd = r.Add() + off
+               rst := ldr.SymType(rs)
+               if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && rst != sym.SUNDEFEXT && ldr.SymSect(rs) == nil {
+                       ldr.Errorf(s, "missing section for %s", ldr.SymName(rs))
+               }
+               rr.Xsym = rs
+               return rr, true
+       case objabi.R_CALLPOWER:
+               rr.Xsym = rs
+               rr.Xadd = r.Add()
+               return rr, true
+       }
+       return rr, false
+}
+
 func addpltsym(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym) {
        if ldr.SymPlt(s) >= 0 {
                return
index 31823444dd1338ce2ba71fdee61861bf556543ea..ef4393f48935b6505d2c42b5f463392d2e183421 100644 (file)
@@ -54,6 +54,7 @@ func Init() (*sys.Arch, ld.Arch) {
                Archinit:         archinit,
                Archreloc:        archreloc,
                Archrelocvariant: archrelocvariant,
+               Extreloc:         extreloc,
                Elfreloc1:        elfreloc1,
                ElfrelocSize:     24,
                Elfsetupplt:      elfsetupplt,