aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/internal/obj/objfile.go
diff options
context:
space:
mode:
authorKeith Randall <khr@golang.org>2016-02-24 09:12:51 -0800
committerKeith Randall <khr@golang.org>2016-02-24 18:47:57 +0000
commit45c2e38b37e40c3b6bdc508065edce0643f79110 (patch)
treeb5c8e22f3b0b6893875c90e2abe807b43ee84663 /src/cmd/internal/obj/objfile.go
parentfdd0179bb1fdd70d405929b78c7d2fb6b61369b0 (diff)
downloadgo-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/cmd/internal/obj/objfile.go')
-rw-r--r--src/cmd/internal/obj/objfile.go16
1 files changed, 11 insertions, 5 deletions
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) {