Commit 45c2e38b authored by Keith Randall's avatar Keith Randall

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: default avatarJosh Bleecher Snyder <josharian@gmail.com>
Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
parent fdd0179b
...@@ -1449,8 +1449,13 @@ func funccompile(n *Node) { ...@@ -1449,8 +1449,13 @@ func funccompile(n *Node) {
Funcdepth = n.Func.Depth + 1 Funcdepth = n.Func.Depth + 1
compile(n) compile(n)
Curfn = nil Curfn = nil
Pc = nil
continpc = nil
breakpc = nil
Funcdepth = 0 Funcdepth = 0
dclcontext = PEXTERN dclcontext = PEXTERN
flushdata()
obj.Flushplist(Ctxt) // convert from Prog list to machine code
} }
func funcsym(s *Sym) *Sym { func funcsym(s *Sym) *Sym {
......
...@@ -173,6 +173,18 @@ func dumpdata() { ...@@ -173,6 +173,18 @@ func dumpdata() {
Clearp(Pc) 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. // Fixup instructions after allocauto (formerly compactframe) has moved all autos around.
func fixautoused(p *obj.Prog) { func fixautoused(p *obj.Prog) {
for lp := &p; ; { for lp := &p; ; {
......
...@@ -302,16 +302,22 @@ func Flushplist(ctxt *Link) { ...@@ -302,16 +302,22 @@ func Flushplist(ctxt *Link) {
ctxt.Arch.Assemble(ctxt, s) ctxt.Arch.Assemble(ctxt, s)
fieldtrack(ctxt, s) fieldtrack(ctxt, s)
linkpcln(ctxt, s) linkpcln(ctxt, s)
s.Text = nil
s.Etext = nil
} }
// Add to running list in ctxt. // Add to running list in ctxt.
if ctxt.Etext == nil { if text != nil {
ctxt.Text = text if ctxt.Text == nil {
} else { ctxt.Text = text
ctxt.Etext.Next = text } else {
ctxt.Etext.Next = text
}
ctxt.Etext = etext
} }
ctxt.Etext = etext
ctxt.Plist = nil ctxt.Plist = nil
ctxt.Plast = nil
ctxt.Curp = nil
} }
func Writeobjfile(ctxt *Link, b *Biobuf) { func Writeobjfile(ctxt *Link, b *Biobuf) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment