]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.link] cmd/link: stream external relocations on MIPS (32/64)
authorCherry Zhang <cherryyz@google.com>
Tue, 21 Jul 2020 23:14:18 +0000 (19:14 -0400)
committerCherry Zhang <cherryyz@google.com>
Thu, 23 Jul 2020 16:38:36 +0000 (16:38 +0000)
Change-Id: I47fbeb3a49754395dceff51af371638fd43350ff
Reviewed-on: https://go-review.googlesource.com/c/go/+/244097
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/mips/asm.go
src/cmd/link/internal/mips/obj.go
src/cmd/link/internal/mips64/asm.go
src/cmd/link/internal/mips64/obj.go

index d075bce17f9168e3b3366b916c6b4526aff1a29f..9f0aab3d6cc23daa7d7c09003c20acb19c8dc816 100644 (file)
@@ -184,5 +184,6 @@ func (t *Target) IsBigEndian() bool {
 
 // Temporary helper.
 func (t *Target) StreamExtRelocs() bool {
-       return (t.IsELF || t.IsDarwin()) && (t.IsAMD64() || t.Is386() || t.IsARM64())
+       return (t.IsELF || t.IsDarwin()) &&
+               (t.IsAMD64() || t.Is386() || t.IsARM64() || t.IsMIPS() || t.IsMIPS64())
 }
index b8443da4ad0daa79b6bd82be132ff7a798b68102..558027d8195dcd5c63148244968ad5e8da34ef34 100644 (file)
@@ -100,19 +100,12 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade
 
                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 applyrel(target.Arch, ldr, r.Type(), r.Off(), s, val, rr.Xadd), 1, true
+                       _, off := ld.FoldSubSymbolOffset(ldr, rs)
+                       xadd := r.Add() + off
+                       return applyrel(target.Arch, ldr, r.Type(), r.Off(), s, val, xadd), 1, true
 
                case objabi.R_ADDRMIPSTLS, objabi.R_CALLMIPS, objabi.R_JMPMIPS:
-                       rr.Xsym = rs
-                       rr.Xadd = r.Add()
-                       return applyrel(target.Arch, ldr, r.Type(), r.Off(), s, val, rr.Xadd), 1, true
+                       return applyrel(target.Arch, ldr, r.Type(), r.Off(), s, val, r.Add()), 1, true
                }
        }
 
@@ -150,3 +143,26 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade
 func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVariant, loader.Sym, int64) int64 {
        return -1
 }
+
+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
+
+       case objabi.R_ADDRMIPSTLS, objabi.R_CALLMIPS, objabi.R_JMPMIPS:
+               rr.Xsym = rs
+               rr.Xadd = r.Add()
+               return rr, true
+       }
+       return rr, false
+}
index e59c382bfa49f848c3ee3527c75a50a844e6588b..f20597c0f51e6dc97b6b21359419e3331c32794c 100644 (file)
@@ -52,6 +52,7 @@ func Init() (*sys.Arch, ld.Arch) {
                Archinit:         archinit,
                Archreloc:        archreloc,
                Archrelocvariant: archrelocvariant,
+               Extreloc:         extreloc,
                Elfreloc1:        elfreloc1,
                ElfrelocSize:     8,
                Elfsetupplt:      elfsetupplt,
index f4fb13f2b53eaf27b4fa99218697678d4927757f..8b7342d4f24d915218ef486ed024436b3aa9f0e8 100644 (file)
@@ -95,36 +95,24 @@ func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtRe
 }
 
 func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, nExtReloc int, ok bool) {
-       rs := r.Sym()
-       rs = ldr.ResolveABIAlias(rs)
        if target.IsExternal() {
                switch r.Type() {
                default:
                        return val, 0, false
 
                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 val, 1, true
-
-               case objabi.R_ADDRMIPSTLS,
+                       objabi.R_ADDRMIPSU,
+                       objabi.R_ADDRMIPSTLS,
                        objabi.R_CALLMIPS,
                        objabi.R_JMPMIPS:
-                       rr.Xsym = rs
-                       rr.Xadd = r.Add()
                        return val, 1, true
                }
        }
 
        const isOk = true
        const noExtReloc = 0
+       rs := r.Sym()
+       rs = ldr.ResolveABIAlias(rs)
        switch r.Type() {
        case objabi.R_ADDRMIPS,
                objabi.R_ADDRMIPSU:
@@ -153,3 +141,29 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade
 func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVariant, loader.Sym, int64) int64 {
        return -1
 }
+
+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
+
+       case objabi.R_ADDRMIPSTLS,
+               objabi.R_CALLMIPS,
+               objabi.R_JMPMIPS:
+               rr.Xsym = rs
+               rr.Xadd = r.Add()
+               return rr, true
+       }
+       return rr, false
+}
index 6ef27cedb934f22c911ad9c5f809048a3322fc81..d2dc20f5c152c3dfe0b871c8fdd4dc94858dfb96 100644 (file)
@@ -51,6 +51,7 @@ func Init() (*sys.Arch, ld.Arch) {
                Archinit:         archinit,
                Archreloc:        archreloc,
                Archrelocvariant: archrelocvariant,
+               Extreloc:         extreloc,
                Elfreloc1:        elfreloc1,
                ElfrelocSize:     24,
                Elfsetupplt:      elfsetupplt,