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>
orig := r
r = r.Name.Defn.Right
+ for r.Op == OCONVNOP {
+ r = r.Left
+ }
+
switch r.Op {
case ONAME:
if staticcopy(l, r, out) {
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:
return false
}
- // No write barrier for implicit or explicit zeroing.
- if r == nil || iszero(r) {
+ // No write barrier for implicit zeroing.
+ if r == nil {
return false
}
- // No write barrier for initialization to constant.
- if r.Op == OLITERAL {
+ // Ignore no-op conversions when making decision.
+ // Ensures that xp = unsafe.Pointer(&x) is treated
+ // the same as xp = &x.
+ for r.Op == OCONVNOP {
+ r = r.Left
+ }
+
+ // No write barrier for zeroing or initialization to constant.
+ if iszero(r) || r.Op == OLITERAL {
return false
}
package p
+import "unsafe"
+
// Should be no init func in the assembly.
// All these initializations should be done at link time.
}
var _ Mer = (*T1)(nil)
+
+var Byte byte
+var PtrByte unsafe.Pointer = unsafe.Pointer(&Byte)