[compiler-rt] r182354 - tsan: detect when a thread ends with ignores enabled

Dmitry Vyukov dvyukov at google.com
Tue May 21 01:30:47 PDT 2013


On Tue, May 21, 2013 at 12:24 PM, Kostya Serebryany <kcc at google.com> wrote:
>
>
>
> On Tue, May 21, 2013 at 12:12 PM, Dmitry Vyukov <dvyukov at google.com> wrote:
>>
>> Author: dvyukov
>> Date: Tue May 21 03:12:35 2013
>> New Revision: 182354
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=182354&view=rev
>> Log:
>> tsan: detect when a thread ends with ignores enabled
>>
>> Added:
>>     compiler-rt/trunk/lib/tsan/lit_tests/thread_end_with_ignore.cc
>>     compiler-rt/trunk/lib/tsan/lit_tests/thread_end_with_ignore2.cc
>> Modified:
>>     compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc
>>     compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_thread.cc
>>
>> Added: compiler-rt/trunk/lib/tsan/lit_tests/thread_end_with_ignore.cc
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/thread_end_with_ignore.cc?rev=182354&view=auto
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/tsan/lit_tests/thread_end_with_ignore.cc (added)
>> +++ compiler-rt/trunk/lib/tsan/lit_tests/thread_end_with_ignore.cc Tue May
>> 21 03:12:35 2013
>> @@ -0,0 +1,19 @@
>> +// RUN: %clangxx_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
>> +#include <pthread.h>
>> +#include <stdio.h>
>> +
>> +extern "C" void AnnotateIgnoreReadsBegin(const char *f, int l);
>> +
>> +void *Thread(void *x) {
>> +  AnnotateIgnoreReadsBegin("", 0);
>> +  return 0;
>> +}
>> +
>> +int main() {
>> +  pthread_t t;
>> +  pthread_create(&t, 0, Thread, 0);
>> +  pthread_join(t, 0);
>> +}
>> +
>> +// CHECK: ThreadSanitizer: thread T1 finished with ignores enabled
>> +
>>
>> Added: compiler-rt/trunk/lib/tsan/lit_tests/thread_end_with_ignore2.cc
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/thread_end_with_ignore2.cc?rev=182354&view=auto
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/tsan/lit_tests/thread_end_with_ignore2.cc
>> (added)
>> +++ compiler-rt/trunk/lib/tsan/lit_tests/thread_end_with_ignore2.cc Tue
>> May 21 03:12:35 2013
>> @@ -0,0 +1,9 @@
>> +// RUN: %clangxx_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
>> +extern "C" void AnnotateIgnoreWritesBegin(const char *f, int l);
>> +
>> +int main() {
>> +  AnnotateIgnoreWritesBegin("", 0);
>> +}
>> +
>> +// CHECK: ThreadSanitizer: thread T0 finished with ignores enabled
>> +
>>
>> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc?rev=182354&r1=182353&r2=182354&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc (original)
>> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc Tue May 21 03:12:35 2013
>> @@ -84,8 +84,7 @@ ThreadState::ThreadState(Context *ctx, i
>>    : fast_state(tid, epoch)
>>    // Do not touch these, rely on zero initialization,
>>    // they may be accessed before the ctor.
>> -  // , fast_ignore_reads()
>> -  // , fast_ignore_writes()
>> +  // , ignore_reads_and_writes()
>>    // , in_rtl()
>>    , shadow_stack_pos(&shadow_stack[0])
>>  #ifndef TSAN_GO
>>
>> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_thread.cc
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_thread.cc?rev=182354&r1=182353&r2=182354&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_thread.cc (original)
>> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_thread.cc Tue May 21 03:12:35
>> 2013
>> @@ -165,8 +165,16 @@ static void MaybeReportThreadLeak(Thread
>>  }
>>  #endif
>>
>> +static void ThreadCheckIgnore(ThreadState *thr) {
>> +  if (thr->ignore_reads_and_writes) {
>> +    Printf("ThreadSanitizer: thread T%d finished with ignores
>> enabled.\n",
>> +           thr->tid);
>
>
> Maybe it should be a fatal error? Or somehow else more visible?


Users can enable it during shutdown in main thread, or during handling
of a fatal error. So I've made it non-fatal.



More information about the llvm-commits mailing list