diff options
author | Cherry Zhang <cherryyz@google.com> | 2020-04-30 17:45:00 -0400 |
---|---|---|
committer | Cherry Zhang <cherryyz@google.com> | 2020-05-01 13:54:49 +0000 |
commit | 7aa6e0faf20d48956eaeead4a71992dd53306c19 (patch) | |
tree | 7b548efe7a9861ece412b0190867b2be2026bfcb | |
parent | 83db26ac4aae372e470c07fbe2cac37d6b540aa8 (diff) | |
download | go-7aa6e0faf20d48956eaeead4a71992dd53306c19.tar.gz go-7aa6e0faf20d48956eaeead4a71992dd53306c19.zip |
[dev.link] cmd/link: drop fields of external symbols after LoadFull
Free some memory.
Linking cmd/compile with external linking,
name old live-B new live-B delta
Loadlibfull_GC 55.3M ± 0% 52.2M ± 0% -5.50% (p=0.008 n=5+5)
Change-Id: Ib8de2e61f2b012efaf6bdd98f9e5c56a19910b47
Reviewed-on: https://go-review.googlesource.com/c/go/+/231224
Reviewed-by: Jeremy Faller <jeremy@golang.org>
Reviewed-by: Than McIntosh <thanm@google.com>
-rw-r--r-- | src/cmd/link/internal/loader/loader.go | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index e1d5c864ab..f4d91644c9 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -2128,12 +2128,14 @@ func (l *Loader) LoadFull(arch *sys.Arch, syms *sym.Symbols, needReloc bool) { // Resolve ABI aliases for external symbols. This is only // needed for internal cgo linking. - for _, i := range l.extReader.syms { - if s := l.Syms[i]; s != nil && s.Attr.Reachable() { - for ri := range s.R { - r := &s.R[ri] - if r.Sym != nil && r.Sym.Type == sym.SABIALIAS { - r.Sym = r.Sym.R[0].Sym + if needReloc { + for _, i := range l.extReader.syms { + if s := l.Syms[i]; s != nil && s.Attr.Reachable() { + for ri := range s.R { + r := &s.R[ri] + if r.Sym != nil && r.Sym.Type == sym.SABIALIAS { + r.Sym = r.Sym.R[0].Sym + } } } } @@ -2170,6 +2172,16 @@ func (l *Loader) LoadFull(arch *sys.Arch, syms *sym.Symbols, needReloc bool) { l.dynid = nil l.relocVariant = nil l.extRelocs = nil + + // Drop fields that are no longer needed. + for _, i := range l.extReader.syms { + pp := l.getPayload(i) + pp.name = "" + pp.relocs = nil + pp.reltypes = nil + pp.auxs = nil + pp.data = nil + } } // ResolveABIAlias given a symbol returns the ABI alias target of that |