]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.link] cmd/link: free compressed symbols after dwarfcompress
authorCherry Zhang <cherryyz@google.com>
Tue, 28 Apr 2020 05:08:12 +0000 (01:08 -0400)
committerCherry Zhang <cherryyz@google.com>
Wed, 29 Apr 2020 18:10:53 +0000 (18:10 +0000)
Once the symbol is compressed, we will not need the uncompressed
symbol content. Free its memory.

Linking cmd/compile,

name               old live-B     new live-B     delta
Dwarfcompress_GC      42.7M ± 0%     37.9M ± 0%   -11.31%  (p=0.008 n=5+5)

Change-Id: Ib6cc73832946d158ff4f5b4f31be9c35ba7cf103
Reviewed-on: https://go-review.googlesource.com/c/go/+/230859
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Than McIntosh <thanm@google.com>
Reviewed-by: Jeremy Faller <jeremy@golang.org>
src/cmd/link/internal/ld/dwarf2.go
src/cmd/link/internal/loader/loader.go

index 336122800b374d48899921ba5e00f78b3990a21b..79abccfdf39abd24e0bc95c646f56ac0155e863c 100644 (file)
@@ -149,6 +149,7 @@ func dwarfcompress(ctxt *Link) {
                        // compressed symbols are no longer needed.
                        for _, s := range z.syms {
                                ldr.SetAttrReachable(s, false)
+                               ldr.FreeSym(s)
                        }
                }
        }
index a6d9417c0000cfe46fac30a63a52163a00bfb196..e4b8098a8a0fa375cbb979a578c3fc71891739a8 100644 (file)
@@ -2054,7 +2054,6 @@ func (l *Loader) LoadFull(arch *sys.Arch, syms *sym.Symbols, needReloc bool) {
        // be copied in a later loop).
        toConvert := make([]Sym, 0, len(l.payloads))
        for _, i := range l.extReader.syms {
-               sname := l.RawSymName(i)
                if !l.attrReachable.Has(i) {
                        continue
                }
@@ -2065,7 +2064,7 @@ func (l *Loader) LoadFull(arch *sys.Arch, syms *sym.Symbols, needReloc bool) {
                // outer/sub processing below. Note that once we do this,
                // we'll need to get at the payload for a symbol with direct
                // reference to l.payloads[] as opposed to calling l.getPayload().
-               s := l.allocSym(sname, 0)
+               s := l.allocSym(pp.name, 0)
                l.installSym(i, s)
                toConvert = append(toConvert, i)
        }
@@ -2655,6 +2654,13 @@ func (l *Loader) CreateStaticSym(name string) Sym {
        return l.newExtSym(name, l.anonVersion)
 }
 
+func (l *Loader) FreeSym(i Sym) {
+       if l.IsExternal(i) {
+               pp := l.getPayload(i)
+               *pp = extSymPayload{}
+       }
+}
+
 func loadObjFull(l *Loader, r *oReader, needReloc bool) {
        for i, n := 0, r.NSym()+r.NNonpkgdef(); i < n; i++ {
                // A symbol may be a dup or overwritten. In this case, its