From 001743813971e0870144443399f2fb396b3781b7 Mon Sep 17 00:00:00 2001 From: shaharko Date: Thu, 13 Oct 2016 22:56:38 +0300 Subject: [PATCH] =?utf8?q?cmd/compile:=20only=20generate=20=C2=B7f=20symbo?= =?utf8?q?ls=20when=20necessary?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Before go supported buildmode=shared ·f symbols used to be defined only when they were used. In order to solve #11480 the strategy was changed to have these symbols defined on declaration which is less efficient and generates many unneeded symbols. With this change the best strategy is chosen for each situation, improving static linking time: name old s/op new s/op delta LinkCmdCompile 0.27 ± 5% 0.25 ± 6% -8.22% (p=0.000 n=98+96) LinkCmdGo 0.30 ± 6% 0.29 ± 8% -5.03% (p=0.000 n=95+99) name old MaxRSS new MaxRSS delta LinkCmdCompile 107k ± 2% 98k ± 3% -8.32% (p=0.000 n=99+100) LinkCmdGo 106k ± 3% 104k ± 3% -1.94% (p=0.000 n=99+100) Change-Id: I965eeee30541e724fd363804adcd6fda10f965a4 Reviewed-on: https://go-review.googlesource.com/31031 Reviewed-by: Michael Hudson-Doyle --- src/cmd/compile/internal/gc/closure.go | 4 +++- src/cmd/compile/internal/gc/dcl.go | 7 ++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/cmd/compile/internal/gc/closure.go b/src/cmd/compile/internal/gc/closure.go index 506cab1656..5183510fe5 100644 --- a/src/cmd/compile/internal/gc/closure.go +++ b/src/cmd/compile/internal/gc/closure.go @@ -218,7 +218,9 @@ func makeclosure(func_ *Node) *Node { xfunc.Func.Nname.Name.Funcdepth = func_.Func.Depth xfunc.Func.Depth = func_.Func.Depth xfunc.Func.Endlineno = func_.Func.Endlineno - makefuncsym(xfunc.Func.Nname.Sym) + if Ctxt.Flag_dynlink { + makefuncsym(xfunc.Func.Nname.Sym) + } xfunc.Nbody.Set(func_.Nbody.Slice()) xfunc.Func.Dcl = append(func_.Func.Dcl, xfunc.Func.Dcl...) diff --git a/src/cmd/compile/internal/gc/dcl.go b/src/cmd/compile/internal/gc/dcl.go index ff485c8377..d95e8dbd44 100644 --- a/src/cmd/compile/internal/gc/dcl.go +++ b/src/cmd/compile/internal/gc/dcl.go @@ -526,7 +526,7 @@ func funchdr(n *Node) { Fatalf("funchdr: dclcontext = %d", dclcontext) } - if importpkg == nil && n.Func.Nname != nil { + if Ctxt.Flag_dynlink && importpkg == nil && n.Func.Nname != nil { makefuncsym(n.Func.Nname.Sym) } @@ -1318,6 +1318,11 @@ func funcsym(s *Sym) *Sym { } s1 := Pkglookup(s.Name+"·f", s.Pkg) + if !Ctxt.Flag_dynlink && s1.Def == nil { + s1.Def = newfuncname(s1) + s1.Def.Func.Shortname = newname(s) + funcsyms = append(funcsyms, s1.Def) + } s.Fsym = s1 return s1 } -- 2.48.1