[dev.link] cmd/link: use new-style relocation accessors in LoadFull
This gives some small speedup:
(linking cmd/compile)
Loadlibfull 77.8ms ± 6% 68.6ms ± 5% -11.88% (p=0.008 n=5+5)
Also convert some Relocs.At to At2, which should have been done
earlier.
Change-Id: I2a66aeb5857234c6e645e1b23380149cffc8221f
Reviewed-on: https://go-review.googlesource.com/c/go/+/226363
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Than McIntosh <thanm@google.com>
Reviewed-by: Jeremy Faller <jeremy@golang.org>
diff --git a/src/cmd/link/internal/ld/deadcode2.go b/src/cmd/link/internal/ld/deadcode2.go
index 892f3f4..f155580 100644
--- a/src/cmd/link/internal/ld/deadcode2.go
+++ b/src/cmd/link/internal/ld/deadcode2.go
@@ -272,7 +272,7 @@
s := loader.Sym(i)
if ldr.IsItabLink(s) {
relocs := ldr.Relocs(s)
- if relocs.Count > 0 && ldr.AttrReachable(relocs.At(0).Sym) {
+ if relocs.Count > 0 && ldr.AttrReachable(relocs.At2(0).Sym()) {
ldr.SetAttrReachable(s, true)
}
}
diff --git a/src/cmd/link/internal/ld/pe.go b/src/cmd/link/internal/ld/pe.go
index 81fae75..527c199 100644
--- a/src/cmd/link/internal/ld/pe.go
+++ b/src/cmd/link/internal/ld/pe.go
@@ -1480,9 +1480,9 @@
// relocation
relocs := ctxt.loader.Relocs(rsrcsym)
for i := 0; i < relocs.Count; i++ {
- r := relocs.At(i)
- p := data[r.Off:]
- val := uint32(int64(h.virtualAddress) + r.Add)
+ r := relocs.At2(i)
+ p := data[r.Off():]
+ val := uint32(int64(h.virtualAddress) + r.Add())
// 32-bit little-endian
p[0] = byte(val)
diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go
index c04cc03..7ebeb45 100644
--- a/src/cmd/link/internal/loader/loader.go
+++ b/src/cmd/link/internal/loader/loader.go
@@ -1865,7 +1865,8 @@
batch := l.relocBatch
s.R = batch[:len(pp.relocs):len(pp.relocs)]
l.relocBatch = batch[len(pp.relocs):]
- l.convertRelocations(pp.relocs, s, false)
+ relocs := l.Relocs(i)
+ l.convertRelocations(&relocs, s, false)
// Copy data
s.P = pp.data
@@ -1977,7 +1978,6 @@
// sym.Symbols are created.
// First pass, symbol creation and symbol data fixup.
- rslice := []Reloc{}
for _, cand := range toconvert {
sn := l.SymName(cand)
@@ -2063,11 +2063,10 @@
for _, cand := range relocfixup {
s := l.Syms[cand]
relocs := l.Relocs(cand)
- rslice = relocs.ReadAll(rslice)
- if len(s.R) != len(rslice) {
- s.R = make([]sym.Reloc, len(rslice))
+ if len(s.R) != relocs.Count {
+ s.R = make([]sym.Reloc, relocs.Count)
}
- l.convertRelocations(rslice, s, true)
+ l.convertRelocations(&relocs, s, true)
}
return result
@@ -2426,7 +2425,6 @@
fdsyms := []*sym.Symbol{}
var funcAllocCounts funcAllocInfo
pcdataBase := r.PcdataBase()
- rslice := []Reloc{}
for i, n := 0, r.NSym()+r.NNonpkgdef(); i < n; i++ {
// A symbol may be a dup or overwritten. In this case, its
// content will actually be provided by a different object
@@ -2471,11 +2469,10 @@
// Relocs
relocs := l.relocs(r, i)
- rslice = relocs.ReadAll(rslice)
batch := l.relocBatch
s.R = batch[:relocs.Count:relocs.Count]
l.relocBatch = batch[relocs.Count:]
- l.convertRelocations(rslice, s, false)
+ l.convertRelocations(&relocs, s, false)
// Aux symbol info
isym := -1
@@ -2645,12 +2642,12 @@
// etc. It is assumed that the caller has pre-allocated the dst symbol
// relocations slice. If 'strict' is set, then this method will
// panic if it finds a relocation targeting a nil symbol.
-func (l *Loader) convertRelocations(src []Reloc, dst *sym.Symbol, strict bool) {
+func (l *Loader) convertRelocations(src *Relocs, dst *sym.Symbol, strict bool) {
for j := range dst.R {
- r := src[j]
- rs := r.Sym
- sz := r.Size
- rt := r.Type
+ r := src.At2(j)
+ rs := r.Sym()
+ sz := r.Siz()
+ rt := r.Type()
if rt == objabi.R_METHODOFF {
if l.attrReachable.Has(rs) {
rt = objabi.R_ADDROFF
@@ -2671,10 +2668,10 @@
panic("nil reloc target in convertRelocations")
}
dst.R[j] = sym.Reloc{
- Off: r.Off,
+ Off: r.Off(),
Siz: sz,
Type: rt,
- Add: r.Add,
+ Add: r.Add(),
Sym: l.Syms[rs],
}
}