func windynrelocsym(ctxt *Link, rel *loader.SymbolBuilder, s loader.Sym) {
var su *loader.SymbolBuilder
relocs := ctxt.loader.Relocs(s)
- for ri := 0; ri < relocs.Count; ri++ {
+ for ri := 0; ri < relocs.Count(); ri++ {
r := relocs.At2(ri)
targ := r.Sym()
if targ == 0 {
exportsIdx := d.ldr.Lookup("go.plugin.exports", 0)
if exportsIdx != 0 {
relocs := d.ldr.Relocs(exportsIdx)
- for i := 0; i < relocs.Count; i++ {
+ for i := 0; i < relocs.Count(); i++ {
d.mark(relocs.At2(i).Sym(), 0)
}
}
}
var methods []methodref2
- for i := 0; i < relocs.Count; i++ {
+ for i := 0; i < relocs.Count(); i++ {
r := relocs.At2(i)
t := r.Type()
if t == objabi.R_WEAKADDROFF {
continue
}
if t == objabi.R_METHODOFF {
- if i+2 >= relocs.Count {
+ if i+2 >= relocs.Count() {
panic("expect three consecutive R_METHODOFF relocs")
}
methods = append(methods, methodref2{src: symIdx, r: i})
s := loader.Sym(i)
if ldr.IsItabLink(s) {
relocs := ldr.Relocs(s)
- if relocs.Count > 0 && ldr.AttrReachable(relocs.At2(0).Sym()) {
+ if relocs.Count() > 0 && ldr.AttrReachable(relocs.At2(0).Sym()) {
ldr.SetAttrReachable(s, true)
}
}
// to decodesym.go once the rouetines there have been decprecated + removed.
func decodeReloc2(ldr *loader.Loader, symIdx loader.Sym, relocs *loader.Relocs, off int32) loader.Reloc2 {
- for j := 0; j < relocs.Count; j++ {
+ for j := 0; j < relocs.Count(); j++ {
rel := relocs.At2(j)
if rel.Off() == off {
return rel
log.Fatalf("error: DWARF info sym %d/%s with incorrect type %s", dsym, d.ldr.SymName(dsym), d.ldr.SymType(dsym).String())
}
relocs := d.ldr.Relocs(dsym)
- for i := 0; i < relocs.Count; i++ {
+ for i := 0; i < relocs.Count(); i++ {
r := relocs.At2(i)
if r.Type() != objabi.R_DWARFSECREF {
continue
}
drelocs := d.ldr.Relocs(infosym)
- for ri := 0; ri < drelocs.Count; ri++ {
+ for ri := 0; ri < drelocs.Count(); ri++ {
r := drelocs.At2(ri)
if r.Type() == objabi.R_DWARFSECREF {
rsym := r.Sym()
for _, s := range list {
symIdx := loader.Sym(s)
relocs := d.ldr.Relocs(symIdx)
- for i := 0; i < relocs.Count; i++ {
+ for i := 0; i < relocs.Count(); i++ {
r := relocs.At2(i)
if r.Type() == objabi.R_USETYPE {
d.defgotype(r.Sym())
for _, u := range units {
for _, fn := range u.FuncDIEs2 {
relocs := d.ldr.Relocs(loader.Sym(fn))
- for i := 0; i < relocs.Count; i++ {
+ for i := 0; i < relocs.Count(); i++ {
reloc := relocs.At2(i)
if reloc.Type() != objabi.R_DWARFSECREF {
continue
continue
}
relocs := ctxt.loader.Relocs(s)
- for i := 0; i < relocs.Count; i++ {
+ for i := 0; i < relocs.Count(); i++ {
if rs := relocs.At2(i).Sym(); rs != 0 {
if ctxt.loader.SymType(rs) == sym.Sxxx && !ctxt.loader.AttrLocal(rs) {
// sanity check
}
// Process calls in this span.
- for i := 0; i < relocs.Count; i++ {
+ for i := 0; i < relocs.Count(); i++ {
r := relocs.At2(i)
if uint32(r.Off()) >= pcsp.NextPC {
break
ldr := ctxt.loader
for _, s := range ctxt.Textp2 {
relocs := ldr.Relocs(s)
- for i := 0; i < relocs.Count; i++ {
+ for i := 0; i < relocs.Count(); i++ {
r := relocs.At2(i)
rs := r.Sym()
if rs == 0 {
// relocation
relocs := ctxt.loader.Relocs(rsrcsym)
- for i := 0; i < relocs.Count; i++ {
+ for i := 0; i < relocs.Count(); i++ {
r := relocs.At2(i)
p := data[r.Off():]
val := uint32(int64(h.virtualAddress) + r.Add())
// Relocs encapsulates the set of relocations on a given symbol; an
// instance of this type is returned by the Loader Relocs() method.
type Relocs struct {
- Count int // == len(rs), TODO: remove
-
rs []goobj2.Reloc2
li int // local index of symbol whose relocs we're examining
}
}
+func (relocs *Relocs) Count() int { return len(relocs.rs) }
+
// At2 returns the j-th reloc for a global symbol.
func (relocs *Relocs) At2(j int) Reloc2 {
if relocs.l.isExtReader(relocs.r) {
// Relocs returns a Relocs object given a local sym index and reader.
func (l *Loader) relocs(r *oReader, li int) Relocs {
- var n int
var rs []goobj2.Reloc2
if l.isExtReader(r) {
pp := l.payloads[li]
- n = len(pp.relocs)
rs = pp.relocs
} else {
rs = r.Relocs2(li)
- n = len(rs)
}
return Relocs{
- Count: n,
- rs: rs,
- li: li,
- r: r,
- l: l,
+ rs: rs,
+ li: li,
+ r: r,
+ l: l,
}
}
for _, cand := range relocfixup {
s := l.Syms[cand]
relocs := l.Relocs(cand)
- if len(s.R) != relocs.Count {
- s.R = make([]sym.Reloc, relocs.Count)
+ if len(s.R) != relocs.Count() {
+ s.R = make([]sym.Reloc, relocs.Count())
}
l.convertRelocations(&relocs, s, true)
}
// Copy relocations
relocs := l.Relocs(symIdx)
- pp.relocs = make([]goobj2.Reloc2, relocs.Count)
- pp.reltypes = make([]objabi.RelocType, relocs.Count)
+ pp.relocs = make([]goobj2.Reloc2, relocs.Count())
+ pp.reltypes = make([]objabi.RelocType, relocs.Count())
for i := range pp.relocs {
// Copy the relocs slice.
// Convert local reference to global reference.
// Relocs
relocs := l.relocs(r, i)
batch := l.relocBatch
- s.R = batch[:relocs.Count:relocs.Count]
- l.relocBatch = batch[relocs.Count:]
+ s.R = batch[:relocs.Count():relocs.Count()]
+ l.relocBatch = batch[relocs.Count():]
l.convertRelocations(&relocs, s, false)
// Aux symbol info
result := []Sym{}
for si := Sym(1); si < Sym(len(l.objSyms)); si++ {
relocs := l.Relocs(si)
- for ri := 0; ri < relocs.Count; ri++ {
+ for ri := 0; ri < relocs.Count(); ri++ {
r := relocs.At2(ri)
rs := r.Sym()
if rs != 0 && l.SymType(rs) == sym.SXREF && l.RawSymName(rs) != ".got" {
}
func sameRelocSlice(s1 *Relocs, s2 []Reloc) bool {
- if s1.Count != len(s2) {
+ if s1.Count() != len(s2) {
return false
}
- for i := 0; i < s1.Count; i++ {
+ for i := 0; i < s1.Count(); i++ {
r1 := s1.At2(i)
r2 := &s2[i]
if r1.Sym() != r2.Sym ||