diff options
| author | Cherry Zhang <cherryyz@google.com> | 2020-02-26 00:58:29 -0500 |
|---|---|---|
| committer | Cherry Zhang <cherryyz@google.com> | 2020-03-03 15:34:18 +0000 |
| commit | 5ee515fd8ced40265bd98b1b5d16100f831929f1 (patch) | |
| tree | 93770804a63e874ab6155371827af8ba10d9dba7 /src/cmd/link/internal/loader | |
| parent | 7f02fa72aaa01fba1f66adcf2fa4414154a6d6fa (diff) | |
| download | go-5ee515fd8ced40265bd98b1b5d16100f831929f1.tar.xz | |
[dev.link] cmd/link: remove sym.Symbols lookup map
Let the loader provide lookup functionalities.
Change-Id: I7d90166d12e6e6fd30e75cbda5d3097e93f9af1e
Reviewed-on: https://go-review.googlesource.com/c/go/+/221137
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Jeremy Faller <jeremy@golang.org>
Reviewed-by: Than McIntosh <thanm@google.com>
Diffstat (limited to 'src/cmd/link/internal/loader')
| -rw-r--r-- | src/cmd/link/internal/loader/loader.go | 54 |
1 files changed, 48 insertions, 6 deletions
diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index bf7e314977..56d13db805 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -259,7 +259,7 @@ func NewLoader(flags uint32, elfsetstring elfsetstringFunc) *Loader { objs: []objIdx{{}}, // reserve index 0 for nil symbol objSyms: []objSym{{}}, // reserve index 0 for nil symbol extReader: &oReader{}, - symsByName: [2]map[string]Sym{make(map[string]Sym), make(map[string]Sym)}, + symsByName: [2]map[string]Sym{make(map[string]Sym, 100000), make(map[string]Sym, 50000)}, // preallocate ~2MB for ABI0 and ~1MB for ABI1 symbols objByPkg: make(map[string]*oReader), outer: make(map[Sym]Sym), sub: make(map[Sym]Sym), @@ -1817,11 +1817,7 @@ func (l *Loader) ExtractSymbols(syms *sym.Symbols, rp map[*sym.Symbol]*sym.Symbo if s == nil { continue } - if s.Name != "" && s.Version >= 0 { - syms.Add(s) - } else { - syms.Allsym = append(syms.Allsym, s) - } + syms.Allsym = append(syms.Allsym, s) // XXX still add to Allsym for now, as there are code looping through Allsym if s.Version < 0 { s.Version = int16(anonVerReplacement) } @@ -1833,6 +1829,52 @@ func (l *Loader) ExtractSymbols(syms *sym.Symbols, rp map[*sym.Symbol]*sym.Symbo } rp[l.Syms[i]] = l.Syms[s] } + + // Provide lookup functions for sym.Symbols. + syms.Lookup = func(name string, ver int) *sym.Symbol { + i := l.LookupOrCreateSym(name, ver) + if s := l.Syms[i]; s != nil { + return s + } + s := l.allocSym(name, ver) + l.installSym(i, s) + syms.Allsym = append(syms.Allsym, s) // XXX see above + return s + } + syms.ROLookup = func(name string, ver int) *sym.Symbol { + i := l.Lookup(name, ver) + return l.Syms[i] + } + syms.Rename = func(old, new string, ver int) { + // annoying... maybe there is a better way to do this + if ver >= 2 { + panic("cannot rename static symbol") + } + i := l.Lookup(old, ver) + s := l.Syms[i] + s.Name = new + if s.Extname() == old { + s.SetExtname(new) + } + delete(l.symsByName[ver], old) + + // This mirrors the old code. But I'm not sure if the logic of + // handling dup in the old code actually works, or necessary. + dupi := l.symsByName[ver][new] + dup := l.Syms[dupi] + if dup == nil { + l.symsByName[ver][new] = i + } else { + if s.Type == 0 { + dup.Attr |= s.Attr + *s = *dup + } else if dup.Type == 0 { + s.Attr |= dup.Attr + *dup = *s + l.symsByName[ver][new] = i + } + } + } } // allocSym allocates a new symbol backing. |
