for any {
var load []uint64
for _, s := range ctxt.Syms.Allsym {
- for _, r := range s.R {
+ for i := range s.R {
+ r := &s.R[i] // Copying sym.Reloc has measurable impact on peformance
if r.Sym != nil && r.Sym.Type == sym.SXREF {
if off := armap[r.Sym.Name]; off != 0 && !loaded[off] {
load = append(load, off)
// but we do keep the symbols it refers to.
exports := d.ctxt.Syms.ROLookup("go.plugin.exports", 0)
if exports != nil {
- for _, r := range exports.R {
- d.mark(r.Sym, nil)
+ for i := range exports.R {
+ d.mark(exports.R[i].Sym, nil)
}
}
}
func importInfoSymbol(ctxt *Link, dsym *sym.Symbol) {
dsym.Attr |= sym.AttrNotInSymbolTable | sym.AttrReachable
dsym.Type = sym.SDWARFINFO
- for _, r := range dsym.R {
+ for i := range dsym.R {
+ r := &dsym.R[i] // Copying sym.Reloc has measurable impact on peformance
if r.Type == objabi.R_DWARFSECREF && r.Sym.Size == 0 {
if ctxt.BuildMode == BuildModeShared {
// These type symbols may not be present in BuildModeShared. Skip.
// Walk the relocations on the primary subprogram DIE and look for
// references to abstract funcs.
- for _, reloc := range dsym.R {
+ for i := range dsym.R {
+ reloc := &dsym.R[i] // Copying sym.Reloc has measurable impact on peformance
candsym := reloc.Sym
if reloc.Type != objabi.R_DWARFSECREF {
continue
empty := true
for _, u := range units {
for _, fn := range u.funcDIEs {
- for _, reloc := range fn.R {
+ for i := range fn.R {
+ reloc := &fn.R[i] // Copying sym.Reloc has measurable impact on peformance
if reloc.Type == objabi.R_DWARFSECREF && strings.HasPrefix(reloc.Sym.Name, dwarf.LocPrefix) {
reloc.Sym.Attr |= sym.AttrReachable | sym.AttrNotInSymbolTable
syms = append(syms, reloc.Sym)
// objects, try to read them from the libgcc file.
any := false
for _, s := range ctxt.Syms.Allsym {
- for _, r := range s.R {
+ for i := range s.R {
+ r := &s.R[i] // Copying sym.Reloc has measurable impact on peformance
if r.Sym != nil && r.Sym.Type == sym.SXREF && r.Sym.Name != ".got" {
any = true
break