blob: b442ed42cd6e36771c0894abd55b36691365f20d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
// errorcheck -+ -0 -l -d=wb
// Copyright 2016 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Test write barrier elimination for notinheap.
//go:build cgo
package p
import "runtime/cgo"
type t1 struct {
x *nih
s []nih
y [1024]byte // Prevent write decomposition
}
type t2 struct {
x *ih
s []ih
y [1024]byte
}
type nih struct {
_ cgo.Incomplete
x uintptr
}
type ih struct { // In-heap type
x uintptr
}
var (
v1 t1
v2 t2
v1s []t1
v2s []t2
)
func f() {
// Test direct writes
v1.x = nil // no barrier
v2.x = nil // ERROR "write barrier"
v1.s = []nih(nil) // no barrier
v2.s = []ih(nil) // ERROR "write barrier"
}
func g() {
// Test aggregate writes
v1 = t1{x: nil} // no barrier
v2 = t2{x: nil} // ERROR "write barrier"
}
func h() {
// Test copies and appends.
copy(v1s, v1s[1:]) // no barrier
copy(v2s, v2s[1:]) // ERROR "write barrier"
_ = append(v1s, v1s...) // no barrier
_ = append(v2s, v2s...) // ERROR "write barrier"
}
// Slice clearing
var (
sliceIH []*ih
sliceNIH []*nih
)
func sliceClear() {
for i := range sliceIH {
sliceIH[i] = nil // ERROR "write barrier"
}
for i := range sliceNIH {
sliceNIH[i] = nil // no barrier
}
}
|