[tsan][llvm] Implement the function attribute to disable TSan checking at run time
authorAnna Zaks <ganna@apple.com>
Fri, 11 Nov 2016 23:01:02 +0000 (23:01 +0000)
committerAnna Zaks <ganna@apple.com>
Fri, 11 Nov 2016 23:01:02 +0000 (23:01 +0000)
commit3c43737832d0df721a32749c121d06897eed527c
tree5573de4ec114aae838b42e5370aa3cf8f390042a
parent9bfbf8bbdfda79210b4f37d0431151d359a0ee9b
[tsan][llvm] Implement the function attribute to disable TSan checking at run time

This implements a function annotation that disables TSan checking for the
function at run time. The benefit over attribute((no_sanitize("thread")))
is that the accesses within the callees will also be suppressed.

The motivation for this attribute is a guarantee given by the objective C
language that the calls to the reference count decrement and object
deallocation will be synchronized. To model this properly, we would need
to intercept all ref count decrement calls (which are very common in ObjC
due to use of ARC) and also every single message send. Instead, we propose
to just ignore all accesses made from within dealloc at run time. The main
downside is that this still does not introduce any synchronization, which
means we might still report false positives if the code that relies on this
synchronization is not executed from within dealloc. However, we have not seen
this in practice so far and think these cases will be very rare.

Differential Revision: https://reviews.llvm.org/D25858

llvm-svn: 286663
llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp
llvm/test/Instrumentation/ThreadSanitizer/sanitize-thread-no-checking.ll [new file with mode: 0644]