From: Russ Cox Date: Tue, 23 Dec 2014 03:42:05 +0000 (-0500) Subject: runtime: add missing write barriers in append's copy of slice data X-Git-Tag: go1.5beta1~2454 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=a73c1cef070a33527c869d36a763ea265f689fe3;p=gostls13.git runtime: add missing write barriers in append's copy of slice data Found with GODEBUG=wbshadow=1 mode. Eventually that will run automatically, but right now it still detects other missing write barriers. Change-Id: Ic8624401d7c8225a935f719f96f2675c6f5c0d7c Reviewed-on: https://go-review.googlesource.com/2064 Reviewed-by: Rick Hudson Reviewed-by: Austin Clements --- diff --git a/src/runtime/slice.go b/src/runtime/slice.go index e427a8b7cc..8264cd6956 100644 --- a/src/runtime/slice.go +++ b/src/runtime/slice.go @@ -81,12 +81,16 @@ func growslice(t *slicetype, old sliceStruct, n int64) sliceStruct { var p unsafe.Pointer if et.kind&kindNoPointers != 0 { p = rawmem(capmem) + memmove(p, old.array, lenmem) memclr(add(p, lenmem), capmem-lenmem) } else { - // Note: can't use rawmem (which avoids zeroing of memory), because then GC can scan unitialized memory + // Note: can't use rawmem (which avoids zeroing of memory), because then GC can scan unitialized memory. + // TODO(rsc): Use memmove when !needwb(). p = newarray(et, uintptr(newcap)) + for i := 0; i < old.len; i++ { + writebarrierfat(et, add(p, uintptr(i)*et.size), add(old.array, uintptr(i)*et.size)) + } } - memmove(p, old.array, lenmem) return sliceStruct{p, old.len, newcap} }