]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.link] cmd/link: move arch-specific extreloc to common code
authorCherry Zhang <cherryyz@google.com>
Wed, 29 Jul 2020 00:23:16 +0000 (20:23 -0400)
committerCherry Zhang <cherryyz@google.com>
Thu, 30 Jul 2020 16:36:09 +0000 (16:36 +0000)
Change-Id: Ia833818862b277ac83266919f39e5c25faac895e
Reviewed-on: https://go-review.googlesource.com/c/go/+/245478
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/arm64/asm.go
src/cmd/link/internal/ld/data.go
src/cmd/link/internal/mips/asm.go
src/cmd/link/internal/mips64/asm.go
src/cmd/link/internal/ppc64/asm.go

index e7be4e639d7d3c18305510875c89842044ac51d1..fb9f175f06fedc8778f10a39d136bcd44a2f2b90 100644 (file)
@@ -688,16 +688,10 @@ func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVarian
 }
 
 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 rt := r.Type(); rt {
        case objabi.R_ARM64_GOTPCREL,
                objabi.R_ADDRARM64:
-
-               // set up addend for eventual relocation via outer symbol.
-               rs, off := ld.FoldSubSymbolOffset(ldr, rs)
-               rr.Xadd = r.Add() + off
-               rr.Xsym = rs
+               rr := ld.ExtrelocViaOuterSym(ldr, r, s)
 
                // Note: ld64 currently has a bug that any non-zero addend for BR26 relocation
                // will make the linking fail because it thinks the code is not PIC even though
@@ -716,11 +710,9 @@ func extreloc(target *ld.Target, ldr *loader.Loader, r loader.Reloc2, s loader.S
        case objabi.R_CALLARM64,
                objabi.R_ARM64_TLS_LE,
                objabi.R_ARM64_TLS_IE:
-               rr.Xsym = rs
-               rr.Xadd = r.Add()
-               return rr, true
+               return ld.ExtrelocSimple(ldr, r), true
        }
-       return rr, false
+       return loader.ExtReloc{}, false
 }
 
 func elfsetupplt(ctxt *ld.Link, plt, gotplt *loader.SymbolBuilder, dynamic loader.Sym) {
index 2a3d6e7fe744c8d6b2154860bb932f7b1ad06039..f09734fab429c78b50e9b561f3012dd61dc27418 100644 (file)
@@ -627,9 +627,7 @@ func extreloc(ctxt *Link, ldr *loader.Loader, s loader.Sym, r loader.Reloc2, ri
                return rr, false
 
        case objabi.R_XCOFFREF:
-               rs := ldr.ResolveABIAlias(r.Sym())
-               rr.Xsym = rs
-               rr.Xadd = r.Add()
+               return ExtrelocSimple(ldr, r), true
 
        // These reloc types don't need external relocations.
        case objabi.R_ADDROFF, objabi.R_WEAKADDROFF, objabi.R_METHODOFF, objabi.R_ADDRCUOFF,
@@ -639,6 +637,31 @@ func extreloc(ctxt *Link, ldr *loader.Loader, s loader.Sym, r loader.Reloc2, ri
        return rr, true
 }
 
+// ExtrelocSimple creates a simple external relocation from r, with the same
+// symbol and addend.
+func ExtrelocSimple(ldr *loader.Loader, r loader.Reloc2) loader.ExtReloc {
+       var rr loader.ExtReloc
+       rs := ldr.ResolveABIAlias(r.Sym())
+       rr.Xsym = rs
+       rr.Xadd = r.Add()
+       return rr
+}
+
+// ExtrelocViaOuterSym creates an external relocation from r targeting the
+// outer symbol and folding the subsymbol's offset into the addend.
+func ExtrelocViaOuterSym(ldr *loader.Loader, r loader.Reloc2, s loader.Sym) loader.ExtReloc {
+       // set up addend for eventual relocation via outer symbol.
+       var rr loader.ExtReloc
+       rs, off := FoldSubSymbolOffset(ldr, r.Sym())
+       rr.Xadd = r.Add() + off
+       rst := ldr.SymType(rs)
+       if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && ldr.SymSect(rs) == nil {
+               ldr.Errorf(s, "missing section for %s", ldr.SymName(rs))
+       }
+       rr.Xsym = rs
+       return rr
+}
+
 // relocSymState hold state information needed when making a series of
 // successive calls to relocsym(). The items here are invariant
 // (meaning that they are set up once initially and then don't change
index 71cd7681fb1678a8f73980e221600f9a963d6a5b..1e5b3781f10a3e59d987e020705eca9bb7a6958b 100644 (file)
@@ -145,24 +145,12 @@ func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVarian
 }
 
 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_ADDRMIPS, objabi.R_ADDRMIPSU:
-               // 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 && ldr.SymSect(rs) == nil {
-                       ldr.Errorf(s, "missing section for %s", ldr.SymName(rs))
-               }
-               rr.Xsym = rs
-               return rr, true
+               return ld.ExtrelocViaOuterSym(ldr, r, s), true
 
        case objabi.R_ADDRMIPSTLS, objabi.R_CALLMIPS, objabi.R_JMPMIPS:
-               rr.Xsym = rs
-               rr.Xadd = r.Add()
-               return rr, true
+               return ld.ExtrelocSimple(ldr, r), true
        }
-       return rr, false
+       return loader.ExtReloc{}, false
 }
index 8b9a7e5c691d13f4b8183769945d27af562a6e63..6310a7095dbfd3b1703462a7b0cc44d141c5d8cd 100644 (file)
@@ -143,27 +143,15 @@ func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVarian
 }
 
 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_ADDRMIPS,
                objabi.R_ADDRMIPSU:
-               // 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 && ldr.SymSect(rs) == nil {
-                       ldr.Errorf(s, "missing section for %s", ldr.SymName(rs))
-               }
-               rr.Xsym = rs
-               return rr, true
+               return ld.ExtrelocViaOuterSym(ldr, r, s), true
 
        case objabi.R_ADDRMIPSTLS,
                objabi.R_CALLMIPS,
                objabi.R_JMPMIPS:
-               rr.Xsym = rs
-               rr.Xadd = r.Add()
-               return rr, true
+               return ld.ExtrelocSimple(ldr, r), true
        }
-       return rr, false
+       return loader.ExtReloc{}, false
 }
index 23cacb32ad379506ce5966ca633982a75dde4c90..371e911ca65b73c2fc28716e912207c59b50e5f7 100644 (file)
@@ -967,34 +967,18 @@ overflow:
 }
 
 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_POWER_TLS, objabi.R_POWER_TLS_LE, objabi.R_POWER_TLS_IE, objabi.R_CALLPOWER:
+               return ld.ExtrelocSimple(ldr, r), 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 ld.ExtrelocViaOuterSym(ldr, r, s), true
        }
-       return rr, false
+       return loader.ExtReloc{}, false
 }
 
 func addpltsym(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym) {