From: Cherry Zhang Date: Wed, 29 Apr 2020 22:59:15 +0000 (-0400) Subject: [dev.link] cmd/link: use new reloc pass on MIPS X-Git-Tag: go1.16beta1~1378^2~152 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=9408417d449f9241b81e83841a701c1dbeb9a4ac;p=gostls13.git [dev.link] cmd/link: use new reloc pass on MIPS Change-Id: Icb4e44bf2d02e7064d96fe644c731b545d32a086 Reviewed-on: https://go-review.googlesource.com/c/go/+/231938 Reviewed-by: Than McIntosh --- diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index b2841780a2..c82402699f 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.Is386() || ctxt.IsAMD64() || ctxt.IsMIPS64() || ctxt.IsS390X() || ctxt.IsWasm() + newreloc := ctxt.Is386() || ctxt.IsAMD64() || ctxt.IsMIPS() || ctxt.IsMIPS64() || ctxt.IsS390X() || ctxt.IsWasm() if newreloc { bench.Start("reloc") ctxt.reloc() diff --git a/src/cmd/link/internal/mips/asm.go b/src/cmd/link/internal/mips/asm.go index 73c578475c..ae37d3cdaf 100644 --- a/src/cmd/link/internal/mips/asm.go +++ b/src/cmd/link/internal/mips/asm.go @@ -84,9 +84,9 @@ func machoreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, se return false } -func applyrel(arch *sys.Arch, r *sym.Reloc, s *sym.Symbol, val int64, t int64) int64 { - o := arch.ByteOrder.Uint32(s.P[r.Off:]) - switch r.Type { +func applyrel(arch *sys.Arch, ldr *loader.Loader, rt objabi.RelocType, off int32, s loader.Sym, val int64, t int64) int64 { + o := arch.ByteOrder.Uint32(ldr.OutData(s)[off:]) + switch rt { case objabi.R_ADDRMIPS, objabi.R_ADDRMIPSTLS: return int64(o&0xffff0000 | uint32(t)&0xffff) case objabi.R_ADDRMIPSU: @@ -98,60 +98,61 @@ func applyrel(arch *sys.Arch, r *sym.Reloc, s *sym.Symbol, val int64, t int64) i } } -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 - case objabi.R_ADDRMIPS, objabi.R_ADDRMIPSU: - r.Done = false + return val, false, false + case objabi.R_ADDRMIPS, objabi.R_ADDRMIPSU: // 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 - return applyrel(target.Arch, r, s, val, r.Xadd), true + rr.Xsym = rs + return applyrel(target.Arch, ldr, r.Type(), r.Off(), s, val, rr.Xadd), true, true + case objabi.R_ADDRMIPSTLS, objabi.R_CALLMIPS, objabi.R_JMPMIPS: - r.Done = false - r.Xsym = r.Sym - r.Xadd = r.Add - return applyrel(target.Arch, r, s, val, r.Add), true + rr.Xsym = rs + rr.Xadd = r.Add() + return applyrel(target.Arch, ldr, r.Type(), r.Off(), s, val, rr.Xadd), 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 rt := r.Type(); rt { case objabi.R_ADDRMIPS, objabi.R_ADDRMIPSU: - t := ld.Symaddr(r.Sym) + r.Add - return applyrel(target.Arch, r, s, val, t), true + t := ldr.SymValue(rs) + r.Add() + return applyrel(target.Arch, ldr, rt, r.Off(), s, val, t), noExtReloc, isOk case objabi.R_CALLMIPS, objabi.R_JMPMIPS: - t := ld.Symaddr(r.Sym) + r.Add + t := ldr.SymValue(rs) + r.Add() if t&3 != 0 { - ld.Errorf(s, "direct call is not aligned: %s %x", r.Sym.Name, t) + ldr.Errorf(s, "direct call is not aligned: %s %x", ldr.SymName(rs), t) } // check if target address is in the same 256 MB region as the next instruction - if (s.Value+int64(r.Off)+4)&0xf0000000 != (t & 0xf0000000) { - ld.Errorf(s, "direct call too far: %s %x", r.Sym.Name, t) + if (ldr.SymValue(s)+int64(r.Off())+4)&0xf0000000 != (t & 0xf0000000) { + ldr.Errorf(s, "direct call too far: %s %x", ldr.SymName(rs), t) } - return applyrel(target.Arch, r, s, val, t), true + return applyrel(target.Arch, ldr, rt, r.Off(), s, val, t), 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) } - return applyrel(target.Arch, r, s, val, t), true + return applyrel(target.Arch, ldr, rt, r.Off(), s, val, t), 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/mips/obj.go b/src/cmd/link/internal/mips/obj.go index b646adaf40..c309a85052 100644 --- a/src/cmd/link/internal/mips/obj.go +++ b/src/cmd/link/internal/mips/obj.go @@ -51,7 +51,7 @@ func Init() (*sys.Arch, ld.Arch) { Adddynrel: adddynrel, Archinit: archinit, - Archreloc: archreloc, + Archreloc2: archreloc2, Archrelocvariant: archrelocvariant, Asmb: asmb, Asmb2: asmb2,