diff options
author | David Symonds <dsymonds@golang.org> | 2014-06-03 11:19:11 +1000 |
---|---|---|
committer | David Symonds <dsymonds@golang.org> | 2014-06-03 11:19:11 +1000 |
commit | f34a051afc7e584b079096f571d1970130cc4e96 (patch) | |
tree | cead9f6631db2bbacdf42c16490d206291dd4ff2 | |
parent | e82cde2d5dda33564904f2db04d3e68960bec384 (diff) | |
download | go-f34a051afc7e584b079096f571d1970130cc4e96.tar.gz go-f34a051afc7e584b079096f571d1970130cc4e96.zip |
[release-branch.go1.3] cmd/gc: don't generate zillions of linehists for wrapper functions
««« CL 104840043 / 876107512a67
cmd/gc: don't generate zillions of linehists for wrapper functions
This is a workaround - the code should be better than this - but the
fix avoids generating large numbers of linehist entries for the wrapper
functions that enable interface conversions. There can be many of
them, they all happen at the end of compilation, and they can all
share a linehist entry.
Avoids bad n^2 behavior in liblink.
Test case in issue 8135 goes from 64 seconds to 2.5 seconds (still bad
but not intolerable).
Fixes #8135.
LGTM=rsc
R=rsc
CC=golang-codereviews
https://golang.org/cl/104840043
»»»
TBR=adg
CC=golang-codereviews
https://golang.org/cl/102070045
-rw-r--r-- | src/cmd/gc/subr.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/src/cmd/gc/subr.c b/src/cmd/gc/subr.c index 23cc9e11f7..72a9ac20c7 100644 --- a/src/cmd/gc/subr.c +++ b/src/cmd/gc/subr.c @@ -2493,6 +2493,7 @@ genwrapper(Type *rcvr, Type *method, Sym *newnam, int iface) Type *tpad, *methodrcvr; int isddd; Val v; + static int linehistdone = 0; if(0 && debug['r']) print("genwrapper rcvrtype=%T method=%T newnam=%S\n", @@ -2500,7 +2501,11 @@ genwrapper(Type *rcvr, Type *method, Sym *newnam, int iface) lexlineno++; lineno = lexlineno; - linehist("<autogenerated>", 0, 0); + if (linehistdone == 0) { + // All the wrappers can share the same linehist entry. + linehist("<autogenerated>", 0, 0); + linehistdone = 1; + } dclcontext = PEXTERN; markdcl(); |