diff options
| author | Keith Randall <khr@golang.org> | 2016-02-24 09:12:51 -0800 |
|---|---|---|
| committer | Keith Randall <khr@golang.org> | 2016-02-24 18:47:57 +0000 |
| commit | 45c2e38b37e40c3b6bdc508065edce0643f79110 (patch) | |
| tree | b5c8e22f3b0b6893875c90e2abe807b43ee84663 /src | |
| parent | fdd0179bb1fdd70d405929b78c7d2fb6b61369b0 (diff) | |
| download | go-45c2e38b37e40c3b6bdc508065edce0643f79110.tar.xz | |
cmd/compile: Drop references to Prog structs after each function
Don't accumulate a massive list of Prog structs during
compilation and write them all out at the end of compilation.
Instead, convert them to code+relocs (or data+relocs) after each
function is compiled.
Track down a few other places that were keeping Progs alive
and nil them out so the Progs get GCd promptly.
Saves ~20% in peak memory usage for the compiler. Surprisingly not much
help speed-wise (only because we end up doing more GCs. With a
compensating GOGC=120, it does help a bit), but this provides a base for
more changes (e.g. reusing a cache of Progs).
Change-Id: I838e01017c228995a687a8110d0cd67bf8596407
Reviewed-on: https://go-review.googlesource.com/19867
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src')
| -rw-r--r-- | src/cmd/compile/internal/gc/dcl.go | 5 | ||||
| -rw-r--r-- | src/cmd/compile/internal/gc/gsubr.go | 12 | ||||
| -rw-r--r-- | src/cmd/internal/obj/objfile.go | 16 |
3 files changed, 28 insertions, 5 deletions
diff --git a/src/cmd/compile/internal/gc/dcl.go b/src/cmd/compile/internal/gc/dcl.go index fc47a39ee6..7e44a4756d 100644 --- a/src/cmd/compile/internal/gc/dcl.go +++ b/src/cmd/compile/internal/gc/dcl.go @@ -1449,8 +1449,13 @@ func funccompile(n *Node) { Funcdepth = n.Func.Depth + 1 compile(n) Curfn = nil + Pc = nil + continpc = nil + breakpc = nil Funcdepth = 0 dclcontext = PEXTERN + flushdata() + obj.Flushplist(Ctxt) // convert from Prog list to machine code } func funcsym(s *Sym) *Sym { diff --git a/src/cmd/compile/internal/gc/gsubr.go b/src/cmd/compile/internal/gc/gsubr.go index 30bf736e3e..04e986562d 100644 --- a/src/cmd/compile/internal/gc/gsubr.go +++ b/src/cmd/compile/internal/gc/gsubr.go @@ -173,6 +173,18 @@ func dumpdata() { Clearp(Pc) } +func flushdata() { + if dfirst == nil { + return + } + newplist() + *Pc = *dfirst + Pc = dpc + Clearp(Pc) + dfirst = nil + dpc = nil +} + // Fixup instructions after allocauto (formerly compactframe) has moved all autos around. func fixautoused(p *obj.Prog) { for lp := &p; ; { diff --git a/src/cmd/internal/obj/objfile.go b/src/cmd/internal/obj/objfile.go index 40c92dd152..3dc5152f54 100644 --- a/src/cmd/internal/obj/objfile.go +++ b/src/cmd/internal/obj/objfile.go @@ -302,16 +302,22 @@ func Flushplist(ctxt *Link) { ctxt.Arch.Assemble(ctxt, s) fieldtrack(ctxt, s) linkpcln(ctxt, s) + s.Text = nil + s.Etext = nil } // Add to running list in ctxt. - if ctxt.Etext == nil { - ctxt.Text = text - } else { - ctxt.Etext.Next = text + if text != nil { + if ctxt.Text == nil { + ctxt.Text = text + } else { + ctxt.Etext.Next = text + } + ctxt.Etext = etext } - ctxt.Etext = etext ctxt.Plist = nil + ctxt.Plast = nil + ctxt.Curp = nil } func Writeobjfile(ctxt *Link, b *Biobuf) { |
