From: Cherry Zhang Date: Wed, 29 Apr 2020 22:41:30 +0000 (-0400) Subject: [dev.link] cmd/link: use new reloc pass on MIPS64 X-Git-Tag: go1.16beta1~1378^2~153 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=8f697c7ac8e077e8b8d856aa25ad410fab312892;p=gostls13.git [dev.link] cmd/link: use new reloc pass on MIPS64 Change-Id: I1c5da63d88e917877c70c1783bb350a697d6e207 Reviewed-on: https://go-review.googlesource.com/c/go/+/231937 Reviewed-by: Than McIntosh --- diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 3336bfac70..7b06972c0a 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -120,10 +120,10 @@ func trampoline(ctxt *Link, s loader.Sym) { } -// foldSubSymbolOffset computes the offset of symbol s to its top-level outer +// FoldSubSymbolOffset computes the offset of symbol s to its top-level outer // symbol. Returns the top-level symbol and the offset. // This is used in generating external relocations. -func foldSubSymbolOffset(ldr *loader.Loader, s loader.Sym) (loader.Sym, int64) { +func FoldSubSymbolOffset(ldr *loader.Loader, s loader.Sym) (loader.Sym, int64) { outer := ldr.OuterSym(s) off := int64(0) if outer != 0 { @@ -352,7 +352,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { // set up addend for eventual relocation via outer symbol. rs := rs - rs, off := foldSubSymbolOffset(ldr, rs) + rs, off := 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 { @@ -483,7 +483,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { // set up addend for eventual relocation via outer symbol. rs := rs - rs, off := foldSubSymbolOffset(ldr, rs) + rs, off := FoldSubSymbolOffset(ldr, rs) rr.Xadd = r.Add() + off rr.Xadd -= int64(siz) // relative to address after the relocated chunk rst := ldr.SymType(rs) diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index fe1dbd2136..b2841780a2 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -319,7 +319,7 @@ func Main(arch *sys.Arch, theArch Arch) { ctxt.loader.InitOutData() thearch.Asmb(ctxt, ctxt.loader) - newreloc := ctxt.IsAMD64() || ctxt.Is386() || ctxt.IsWasm() || ctxt.IsS390X() + newreloc := ctxt.Is386() || ctxt.IsAMD64() || ctxt.IsMIPS64() || ctxt.IsS390X() || ctxt.IsWasm() if newreloc { bench.Start("reloc") ctxt.reloc() diff --git a/src/cmd/link/internal/mips64/asm.go b/src/cmd/link/internal/mips64/asm.go index 58011a9d6f..9024ef0060 100644 --- a/src/cmd/link/internal/mips64/asm.go +++ b/src/cmd/link/internal/mips64/asm.go @@ -101,63 +101,63 @@ func machoreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, se return false } -func archreloc(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol, val int64) (int64, bool) { +func archreloc2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, needExtReloc bool, ok bool) { + rs := r.Sym() + rs = ldr.ResolveABIAlias(rs) if target.IsExternal() { - switch r.Type { + switch r.Type() { default: - return val, false + return val, false, false + case objabi.R_ADDRMIPS, objabi.R_ADDRMIPSU: - r.Done = false - // set up addend for eventual relocation via outer symbol. - rs := ld.ApplyOuterToXAdd(r) - if rs.Type != sym.SHOSTOBJ && rs.Type != sym.SDYNIMPORT && rs.Sect == nil { - ld.Errorf(s, "missing section for %s", rs.Name) + 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)) } - r.Xsym = rs + rr.Xsym = rs + return val, true, true - return val, true case objabi.R_ADDRMIPSTLS, objabi.R_CALLMIPS, objabi.R_JMPMIPS: - r.Done = false - r.Xsym = r.Sym - r.Xadd = r.Add - return val, true + rr.Xsym = rs + rr.Xadd = r.Add() + return val, true, true } } - switch r.Type { - case objabi.R_CONST: - return r.Add, true - case objabi.R_GOTOFF: - return ld.Symaddr(r.Sym) + r.Add - ld.Symaddr(syms.GOT), true + const isOk = true + const noExtReloc = false + switch r.Type() { case objabi.R_ADDRMIPS, objabi.R_ADDRMIPSU: - t := ld.Symaddr(r.Sym) + r.Add - o1 := target.Arch.ByteOrder.Uint32(s.P[r.Off:]) - if r.Type == objabi.R_ADDRMIPS { - return int64(o1&0xffff0000 | uint32(t)&0xffff), true + t := ldr.SymValue(rs) + r.Add() + o1 := target.Arch.ByteOrder.Uint32(ldr.OutData(s)[r.Off():]) + if r.Type() == objabi.R_ADDRMIPS { + return int64(o1&0xffff0000 | uint32(t)&0xffff), noExtReloc, isOk } - return int64(o1&0xffff0000 | uint32((t+1<<15)>>16)&0xffff), true + return int64(o1&0xffff0000 | uint32((t+1<<15)>>16)&0xffff), noExtReloc, isOk case objabi.R_ADDRMIPSTLS: // thread pointer is at 0x7000 offset from the start of TLS data area - t := ld.Symaddr(r.Sym) + r.Add - 0x7000 + t := ldr.SymValue(rs) + r.Add() - 0x7000 if t < -32768 || t >= 32678 { - ld.Errorf(s, "TLS offset out of range %d", t) + ldr.Errorf(s, "TLS offset out of range %d", t) } - o1 := target.Arch.ByteOrder.Uint32(s.P[r.Off:]) - return int64(o1&0xffff0000 | uint32(t)&0xffff), true + o1 := target.Arch.ByteOrder.Uint32(ldr.OutData(s)[r.Off():]) + return int64(o1&0xffff0000 | uint32(t)&0xffff), noExtReloc, isOk case objabi.R_CALLMIPS, objabi.R_JMPMIPS: // Low 26 bits = (S + A) >> 2 - t := ld.Symaddr(r.Sym) + r.Add - o1 := target.Arch.ByteOrder.Uint32(s.P[r.Off:]) - return int64(o1&0xfc000000 | uint32(t>>2)&^0xfc000000), true + t := ldr.SymValue(rs) + r.Add() + o1 := target.Arch.ByteOrder.Uint32(ldr.OutData(s)[r.Off():]) + return int64(o1&0xfc000000 | uint32(t>>2)&^0xfc000000), noExtReloc, isOk } - return val, false + return val, false, false } func archrelocvariant(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol, t int64) int64 { diff --git a/src/cmd/link/internal/mips64/obj.go b/src/cmd/link/internal/mips64/obj.go index b5f7ae1405..ab23c342b3 100644 --- a/src/cmd/link/internal/mips64/obj.go +++ b/src/cmd/link/internal/mips64/obj.go @@ -50,7 +50,7 @@ func Init() (*sys.Arch, ld.Arch) { Dwarfreglr: dwarfRegLR, Adddynrel: adddynrel, Archinit: archinit, - Archreloc: archreloc, + Archreloc2: archreloc2, Archrelocvariant: archrelocvariant, Asmb: asmb, Asmb2: asmb2,