mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: allow static init for unsafe.Pointer(&x) where x is global
This avoids both a write barrier and then dynamic initialization globals of the form var x something var xp = unsafe.Pointer(&x) Using static initialization avoids emitting a relocation for &x, which helps cgo. Fixes #9411. Change-Id: I0dbf480859cce6ab57ab805d1b8609c45b48f156 Reviewed-on: https://go-review.googlesource.com/11693 Reviewed-by: Austin Clements <austin@google.com> Run-TryBot: Russ Cox <rsc@golang.org>
This commit is contained in:
parent
d6e6baa702
commit
9f90f31c3a
3 changed files with 24 additions and 4 deletions
|
|
@ -302,6 +302,10 @@ func staticcopy(l *Node, r *Node, out **NodeList) bool {
|
|||
orig := r
|
||||
r = r.Name.Defn.Right
|
||||
|
||||
for r.Op == OCONVNOP {
|
||||
r = r.Left
|
||||
}
|
||||
|
||||
switch r.Op {
|
||||
case ONAME:
|
||||
if staticcopy(l, r, out) {
|
||||
|
|
@ -395,6 +399,10 @@ func staticcopy(l *Node, r *Node, out **NodeList) bool {
|
|||
func staticassign(l *Node, r *Node, out **NodeList) bool {
|
||||
var n1 Node
|
||||
|
||||
for r.Op == OCONVNOP {
|
||||
r = r.Left
|
||||
}
|
||||
|
||||
switch r.Op {
|
||||
//dump("not static", r);
|
||||
default:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue