]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/gc: statically initialize function pointers
authorMatthew Dempsky <mdempsky@google.com>
Thu, 5 Mar 2015 00:33:28 +0000 (16:33 -0800)
committerKeith Randall <khr@golang.org>
Thu, 5 Mar 2015 21:35:07 +0000 (21:35 +0000)
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: Keith Randall <khr@golang.org>
src/cmd/internal/gc/sinit.go

index b66123076fb70ef7775ca2bb962d12f11dc47ce9..12562231fcc9407822e33ba98976006deab13083 100644 (file)
@@ -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) {