mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
(This re-applies #7736 with an update to the tsan-inout.swift execution test to handle configurations where TSan's ignore_interceptors_accesses is enabled by default.) Add SILGen instrumentation to treat inout accesses as Thread Sanitizer writes. The goal is to catch races on inout accesses even when there is a not an llvm-level read/write to a particular address. Ultimately this will enable TSan to, for example, report racy writes to distinct stored properties of a common struct as a data race. This instrumentation is off by default. It can be enabled with the 'enable-experimental-tsan-inout-instrumentation' frontend flag. The high-level approach is to add a SIL-level builtin that represents a call to a TSan routine in compiler-rt. Then, when emitting an address for an LValue as part of an inout expression, we call this builtin for each path component that represents an LValue. I've added an 'isRValue()' method to PathComponent that tracks whether a component represents an RValue or an LValue. Right the only PathComponent that sometimes returns 'true' is ValueComponent(). For now, we're instrumenting only InoutExprs, but in the future it probably makes sense to instrument all LValue accesses. In this patch I've added a 'TSanKind' parameter to SILGenFunction::emitAddressOfLValue() and its helpers to limit instrumentation to inout accesses. I envision that this parameter will eventually go away.
55 KiB
55 KiB