testing: read coverage counters atomically
For -mode=atomic, we need to read the counters
using an atomic load to avoid a race. Not worth worrying
about when -mode=atomic is set during generation
of the profile, so we use atomic loads always.

Fixes #8630.

LGTM=rsc
R=dvyukov, rsc
CC=golang-codereviews
https://golang.org/cl/141800043
diff --git a/src/testing/cover.go b/src/testing/cover.go
index eb7249d..a4ce37f 100644
--- a/src/testing/cover.go
+++ b/src/testing/cover.go
@@ -9,6 +9,7 @@
 import (
 	"fmt"
 	"os"
+	"sync/atomic"
 )
 
 // CoverBlock records the coverage data for a single basic block.
@@ -44,8 +45,8 @@
 func Coverage() float64 {
 	var n, d int64
 	for _, counters := range cover.Counters {
-		for _, c := range counters {
-			if c > 0 {
+		for i := range counters {
+			if atomic.LoadUint32(&counters[i]) > 0 {
 				n++
 			}
 			d++
@@ -84,11 +85,13 @@
 	}
 
 	var active, total int64
+	var count uint32
 	for name, counts := range cover.Counters {
 		blocks := cover.Blocks[name]
-		for i, count := range counts {
+		for i := range counts {
 			stmts := int64(blocks[i].Stmts)
 			total += stmts
+			count = atomic.LoadUint32(&counts[i]) // For -mode=atomic.
 			if count > 0 {
 				active += stmts
 			}