Commit 08c43488 authored by Dmitry Vyukov's avatar Dmitry Vyukov

cmd/gc: fix handling of OGETG in race mode

Now that getg is an intrinsic, more runtime functions
gets inlined (in particular, LockOSThread).
Runtime code gets race instrumented after inlining into
other packages. This can lead to false positives,
as race detector ignores all internal synchronization in runtime.
Inling of LockOSThread lead to false race reports on m contents.
See the issue for an example.

Fixes #10380

Change-Id: Ic9b760b53c28c2350bc54a5d4677fcd1c1f86e5f
Reviewed-on: https://go-review.googlesource.com/8690Reviewed-by: default avatarRuss Cox <rsc@golang.org>
Run-TryBot: Dmitry Vyukov <dvyukov@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 4b956ae3
......@@ -124,6 +124,16 @@ func caninl(fn *Node) {
}
}
// Runtime package must not be race instrumented.
// Racewalk skips runtime package. However, some runtime code can be
// inlined into other packages and instrumented there. To avoid this,
// we disable inlining of runtime functions in race mode.
// The example that we observed is inlining of LockOSThread,
// which lead to false race reports on m contents.
if flag_race != 0 && myimportpath == "runtime" {
return
}
const maxBudget = 80
budget := maxBudget // allowed hairyness
if ishairylist(fn.Nbody, &budget) || budget < 0 {
......
......@@ -391,7 +391,10 @@ func racewalknode(np **Node, init **NodeList, wr int, skip int) {
// impossible nodes: only appear in backend.
case ORROTC, OEXTEND:
Yyerror("racewalk: %v cannot exist now", Oconv(int(n.Op), 0))
goto ret
case OGETG:
Yyerror("racewalk: OGETG can happen only in runtime which we don't instrument")
goto ret
// just do generic traversal
......@@ -424,13 +427,7 @@ func racewalknode(np **Node, init **NodeList, wr int, skip int) {
OTYPE,
ONONAME,
OLITERAL,
OSLICESTR,
// g is goroutine local so cannot race. Although we don't instrument
// the runtime package, through inlining the call to runtime.getg can
// appear in non runtime packages, for example, after inlining
// runtime.LockOSThread.
OGETG,
// always preceded by bounds checking, avoid double instrumentation.
OSLICESTR, // always preceded by bounds checking, avoid double instrumentation.
OTYPESW: // ignored by code generation, do not instrument.
goto ret
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment