Commit 632217aa authored by Matthew Dempsky's avatar Matthew Dempsky Committed by Keith Randall

cmd/internal/gc: statically initialize function pointers

Previously, gc would compile code like

    func foo() { ... }
    var bar = foo

by emitting a static closure to wrap "foo", but then emitting runtime
initialization code to assign the closure to "bar".  This CL changes
gc to instead statically initialize "bar".

Notably, this change shrinks the "go" tool's text segment by ~7.4kB on
linux/amd64 while only increasing the data segment by ~100B:

   text	   data	    bss	    dec	    hex	filename
7237819	 122412	 215616	7575847	 739927	go.before
7230398	 122540	 215232	7568170	 737b2a	go.after

Fixes issue #10081.

Change-Id: If5e26cf46b323393ba6f2199a82a06e9e4baf411
Reviewed-on: https://go-review.googlesource.com/6880
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarKeith Randall <khr@golang.org>
parent 24a43e6a
......@@ -285,7 +285,14 @@ func staticinit(n *Node, out **NodeList) bool {
// like staticassign but we are copying an already
// initialized value r.
func staticcopy(l *Node, r *Node, out **NodeList) bool {
if r.Op != ONAME || r.Class != PEXTERN || r.Sym.Pkg != localpkg {
if r.Op != ONAME {
return false
}
if r.Class == PFUNC {
gdata(l, r, Widthptr)
return true
}
if r.Class != PEXTERN || r.Sym.Pkg != localpkg {
return false
}
if r.Defn == nil { // probably zeroed but perhaps supplied externally and of unknown value
......@@ -397,9 +404,7 @@ func staticassign(l *Node, r *Node, out **NodeList) bool {
break
case ONAME:
if r.Class == PEXTERN && r.Sym.Pkg == localpkg {
return staticcopy(l, r, out)
}
return staticcopy(l, r, out)
case OLITERAL:
if iszero(r) {
......
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