mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
[dev.link] cmd/link: use new reloc pass on S390X
Change-Id: Ia51ca2c89f1d382813a27310211c1f8631afb125 Reviewed-on: https://go-review.googlesource.com/c/go/+/231919 Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Than McIntosh <thanm@google.com>
This commit is contained in:
parent
c89251204e
commit
0586fbb9d3
5 changed files with 41 additions and 47 deletions
|
|
@ -239,18 +239,21 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) {
|
||||||
rr.Idx = ri
|
rr.Idx = ri
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var rv sym.RelocVariant
|
||||||
|
if target.IsPPC64() || target.IsS390X() {
|
||||||
|
rv = ldr.RelocVariant(s, ri)
|
||||||
|
}
|
||||||
|
|
||||||
// TODO(mundaym): remove this special case - see issue 14218.
|
// TODO(mundaym): remove this special case - see issue 14218.
|
||||||
//if target.IsS390X() {
|
if target.IsS390X() {
|
||||||
// switch r.Type {
|
switch rt {
|
||||||
// case objabi.R_PCRELDBL:
|
case objabi.R_PCRELDBL:
|
||||||
// r.InitExt()
|
rt = objabi.R_PCREL
|
||||||
// r.Type = objabi.R_PCREL
|
rv = sym.RV_390_DBL
|
||||||
// r.Variant = sym.RV_390_DBL
|
case objabi.R_CALL:
|
||||||
// case objabi.R_CALL:
|
rv = sym.RV_390_DBL
|
||||||
// r.InitExt()
|
}
|
||||||
// r.Variant = sym.RV_390_DBL
|
}
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
var o int64
|
var o int64
|
||||||
switch rt {
|
switch rt {
|
||||||
|
|
@ -556,12 +559,11 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) {
|
||||||
o = ldr.SymValue(rs) + r.Add() - ldr.SymValue(syms.GOT2)
|
o = ldr.SymValue(rs) + r.Add() - ldr.SymValue(syms.GOT2)
|
||||||
}
|
}
|
||||||
|
|
||||||
//if target.IsPPC64() || target.IsS390X() {
|
if target.IsPPC64() || target.IsS390X() {
|
||||||
// r.InitExt()
|
if rv != sym.RV_NONE {
|
||||||
// if r.Variant != sym.RV_NONE {
|
o = thearch.Archrelocvariant2(target, ldr, r, rv, s, o)
|
||||||
// o = thearch.Archrelocvariant(ldr, target, syms, &r, s, o)
|
}
|
||||||
// }
|
}
|
||||||
//}
|
|
||||||
|
|
||||||
switch siz {
|
switch siz {
|
||||||
default:
|
default:
|
||||||
|
|
|
||||||
|
|
@ -246,7 +246,8 @@ type Arch struct {
|
||||||
// indicates a fatal error).
|
// indicates a fatal error).
|
||||||
Archreloc func(target *Target, syms *ArchSyms, rel *sym.Reloc, sym *sym.Symbol,
|
Archreloc func(target *Target, syms *ArchSyms, rel *sym.Reloc, sym *sym.Symbol,
|
||||||
offset int64) (relocatedOffset int64, success bool)
|
offset int64) (relocatedOffset int64, success bool)
|
||||||
Archreloc2 func(*Target, *loader.Loader, *ArchSyms, loader.Reloc2, *loader.ExtReloc, loader.Sym, int64) (int64, bool, bool)
|
Archreloc2 func(*Target, *loader.Loader, *ArchSyms, loader.Reloc2, *loader.ExtReloc,
|
||||||
|
loader.Sym, int64) (relocatedOffset int64, needExtReloc bool, ok bool)
|
||||||
// Archrelocvariant is a second arch-specific hook used for
|
// Archrelocvariant is a second arch-specific hook used for
|
||||||
// relocation processing; it handles relocations where r.Type is
|
// relocation processing; it handles relocations where r.Type is
|
||||||
// insufficient to describe the relocation (r.Variant !=
|
// insufficient to describe the relocation (r.Variant !=
|
||||||
|
|
@ -257,6 +258,8 @@ type Arch struct {
|
||||||
// offset value.
|
// offset value.
|
||||||
Archrelocvariant func(target *Target, syms *ArchSyms, rel *sym.Reloc, sym *sym.Symbol,
|
Archrelocvariant func(target *Target, syms *ArchSyms, rel *sym.Reloc, sym *sym.Symbol,
|
||||||
offset int64) (relocatedOffset int64)
|
offset int64) (relocatedOffset int64)
|
||||||
|
Archrelocvariant2 func(target *Target, ldr *loader.Loader, rel loader.Reloc2,
|
||||||
|
rv sym.RelocVariant, sym loader.Sym, offset int64) (relocatedOffset int64)
|
||||||
|
|
||||||
// Generate a trampoline for a call from s to rs if necessary. ri is
|
// Generate a trampoline for a call from s to rs if necessary. ri is
|
||||||
// index of the relocation.
|
// index of the relocation.
|
||||||
|
|
|
||||||
|
|
@ -319,7 +319,7 @@ func Main(arch *sys.Arch, theArch Arch) {
|
||||||
ctxt.loader.InitOutData()
|
ctxt.loader.InitOutData()
|
||||||
thearch.Asmb(ctxt, ctxt.loader)
|
thearch.Asmb(ctxt, ctxt.loader)
|
||||||
|
|
||||||
newreloc := ctxt.IsAMD64() || ctxt.Is386() || ctxt.IsWasm()
|
newreloc := ctxt.IsAMD64() || ctxt.Is386() || ctxt.IsWasm() || ctxt.IsS390X()
|
||||||
if newreloc {
|
if newreloc {
|
||||||
bench.Start("reloc")
|
bench.Start("reloc")
|
||||||
ctxt.reloc()
|
ctxt.reloc()
|
||||||
|
|
|
||||||
|
|
@ -367,33 +367,22 @@ func machoreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, se
|
||||||
return false
|
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) {
|
||||||
if target.IsExternal() {
|
return val, false, false
|
||||||
return val, false
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
return val, false
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func archrelocvariant(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol, t int64) int64 {
|
func archrelocvariant2(target *ld.Target, ldr *loader.Loader, r loader.Reloc2, rv sym.RelocVariant, s loader.Sym, t int64) int64 {
|
||||||
switch r.Variant & sym.RV_TYPE_MASK {
|
switch rv & sym.RV_TYPE_MASK {
|
||||||
default:
|
default:
|
||||||
ld.Errorf(s, "unexpected relocation variant %d", r.Variant)
|
ldr.Errorf(s, "unexpected relocation variant %d", rv)
|
||||||
return t
|
return t
|
||||||
|
|
||||||
case sym.RV_NONE:
|
case sym.RV_NONE:
|
||||||
return t
|
return t
|
||||||
|
|
||||||
case sym.RV_390_DBL:
|
case sym.RV_390_DBL:
|
||||||
if (t & 1) != 0 {
|
if t&1 != 0 {
|
||||||
ld.Errorf(s, "%s+%v is not 2-byte aligned", r.Sym.Name, r.Sym.Value)
|
ldr.Errorf(s, "%s+%v is not 2-byte aligned", ldr.SymName(r.Sym()), ldr.SymValue(r.Sym()))
|
||||||
}
|
}
|
||||||
return t >> 1
|
return t >> 1
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -46,16 +46,16 @@ func Init() (*sys.Arch, ld.Arch) {
|
||||||
Dwarfregsp: dwarfRegSP,
|
Dwarfregsp: dwarfRegSP,
|
||||||
Dwarfreglr: dwarfRegLR,
|
Dwarfreglr: dwarfRegLR,
|
||||||
|
|
||||||
Adddynrel2: adddynrel2,
|
Adddynrel2: adddynrel2,
|
||||||
Archinit: archinit,
|
Archinit: archinit,
|
||||||
Archreloc: archreloc,
|
Archreloc2: archreloc2,
|
||||||
Archrelocvariant: archrelocvariant,
|
Archrelocvariant2: archrelocvariant2,
|
||||||
Asmb: asmb, // in asm.go
|
Asmb: asmb,
|
||||||
Asmb2: asmb2, // in asm.go
|
Asmb2: asmb2,
|
||||||
Elfreloc1: elfreloc1,
|
Elfreloc1: elfreloc1,
|
||||||
Elfsetupplt: elfsetupplt,
|
Elfsetupplt: elfsetupplt,
|
||||||
Gentext2: gentext2,
|
Gentext2: gentext2,
|
||||||
Machoreloc1: machoreloc1,
|
Machoreloc1: machoreloc1,
|
||||||
|
|
||||||
Linuxdynld: "/lib64/ld64.so.1",
|
Linuxdynld: "/lib64/ld64.so.1",
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue