From c8ca793176cfae8a9fc501d6e37896304f483f2e Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Wed, 5 Dec 2018 15:21:17 -0500 Subject: [PATCH] cmd/compile: mark memclrHasPointers calls as write barriers There are two places where the compiler generates memclrHasPointers calls. These are effectively write barriers, but the compiler doesn't currently record them as such in the function. As a result code like for i := range a { a[i] = nil } inserts a write barrier for the assignment to a[i], but the compiler doesn't report this. Hence, it's not reported in the -d=wb output, and it's not checked against //go:nowritebarrier annotations. Change-Id: I40299ebc9824f05cf516cba494d4c086b80ffb53 Reviewed-on: https://go-review.googlesource.com/c/152722 Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/cmd/compile/internal/gc/range.go | 1 + src/cmd/compile/internal/gc/walk.go | 1 + 2 files changed, 2 insertions(+) diff --git a/src/cmd/compile/internal/gc/range.go b/src/cmd/compile/internal/gc/range.go index bf30d9388e..cbe69a1ebc 100644 --- a/src/cmd/compile/internal/gc/range.go +++ b/src/cmd/compile/internal/gc/range.go @@ -588,6 +588,7 @@ func arrayClear(n, v1, v2, a *Node) bool { var fn *Node if types.Haspointers(a.Type.Elem()) { // memclrHasPointers(hp, hn) + Curfn.Func.setWBPos(stmt.Pos) fn = mkcall("memclrHasPointers", nil, nil, hp, hn) } else { // memclrNoHeapPointers(hp, hn) diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go index 528aacb213..b84bc26e04 100644 --- a/src/cmd/compile/internal/gc/walk.go +++ b/src/cmd/compile/internal/gc/walk.go @@ -2860,6 +2860,7 @@ func extendslice(n *Node, init *Nodes) *Node { hasPointers := types.Haspointers(elemtype) if hasPointers { clrname = "memclrHasPointers" + Curfn.Func.setWBPos(n.Pos) } var clr Nodes