]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: don't generate race calls for zero-sized values
authorJosh Bleecher Snyder <josharian@gmail.com>
Tue, 2 May 2017 18:02:53 +0000 (11:02 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Sat, 26 Aug 2017 15:55:04 +0000 (15:55 +0000)
One example of a heavily-used zero-size value is encoding/binary.BigEndian.

Change-Id: I8e873c447e154ab2ca61b7315df774693891270c
Reviewed-on: https://go-review.googlesource.com/59330
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Dmitry Vyukov <dvyukov@google.com>
src/cmd/compile/internal/gc/racewalk.go

index cfb803187cd1396d2f66086429fb9cc2a4159d15..b1c4f223abefe9c166d706253ca2f9cfd5e43251 100644 (file)
@@ -462,6 +462,15 @@ func callinstr(np **Node, init *Nodes, wr int, skip int) bool {
                return false
        }
        t := n.Type
+       // dowidth may not have been called for PEXTERN.
+       dowidth(t)
+       w := t.Width
+       if w == BADWIDTH {
+               Fatalf("instrument: %v badwidth", t)
+       }
+       if w == 0 {
+               return false // can't race on zero-sized things
+       }
        if isartificial(n) {
                return false
        }
@@ -494,24 +503,12 @@ func callinstr(np **Node, init *Nodes, wr int, skip int) bool {
                        if wr != 0 {
                                name = "msanwrite"
                        }
-                       // dowidth may not have been called for PEXTERN.
-                       dowidth(t)
-                       w := t.Width
-                       if w == BADWIDTH {
-                               Fatalf("instrument: %v badwidth", t)
-                       }
                        f = mkcall(name, nil, init, uintptraddr(n), nodintconst(w))
                } else if flag_race && (t.IsStruct() || t.IsArray()) {
                        name := "racereadrange"
                        if wr != 0 {
                                name = "racewriterange"
                        }
-                       // dowidth may not have been called for PEXTERN.
-                       dowidth(t)
-                       w := t.Width
-                       if w == BADWIDTH {
-                               Fatalf("instrument: %v badwidth", t)
-                       }
                        f = mkcall(name, nil, init, uintptraddr(n), nodintconst(w))
                } else if flag_race {
                        name := "raceread"