aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/link/internal/loader
diff options
context:
space:
mode:
authorCherry Zhang <cherryyz@google.com>2020-02-26 00:58:29 -0500
committerCherry Zhang <cherryyz@google.com>2020-03-03 15:34:18 +0000
commit5ee515fd8ced40265bd98b1b5d16100f831929f1 (patch)
tree93770804a63e874ab6155371827af8ba10d9dba7 /src/cmd/link/internal/loader
parent7f02fa72aaa01fba1f66adcf2fa4414154a6d6fa (diff)
downloadgo-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.go54
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.