}
}
+ // 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 {
// 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
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.
- OTYPESW: // ignored by code generation, do not instrument.
+ OSLICESTR, // always preceded by bounds checking, avoid double instrumentation.
+ OTYPESW: // ignored by code generation, do not instrument.
goto ret
}