mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
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: Keith Randall <khr@golang.org>
This commit is contained in:
parent
24a43e6a75
commit
632217aae4
1 changed files with 9 additions and 4 deletions
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue