]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.link] cmd/link: drop fields of external symbols after LoadFull
authorCherry Zhang <cherryyz@google.com>
Thu, 30 Apr 2020 21:45:00 +0000 (17:45 -0400)
committerCherry Zhang <cherryyz@google.com>
Fri, 1 May 2020 13:54:49 +0000 (13:54 +0000)
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>
src/cmd/link/internal/loader/loader.go

index e1d5c864ab913a0a69f6cd51d80f73917570dec7..f4d91644c9b680189f46c38499ca0c26e947247b 100644 (file)
@@ -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