diff options
author | Dmitry Vyukov <dvyukov@google.com> | 2013-02-01 14:41:58 +0000 |
---|---|---|
committer | Dmitry Vyukov <dvyukov@google.com> | 2013-02-01 14:41:58 +0000 |
commit | 87c6bb97162aaa9a9124f2af7dda411bac6f75fd (patch) | |
tree | e40feb4bd0da9c6e9c553bc44027d4654b364f2d /compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc | |
parent | 36a6dd04eff1956a5f638d9860c32d930cd4c194 (diff) | |
download | bcm5719-llvm-87c6bb97162aaa9a9124f2af7dda411bac6f75fd.tar.gz bcm5719-llvm-87c6bb97162aaa9a9124f2af7dda411bac6f75fd.zip |
tsan: even if races between atomic and plain memory accesses are turned off (report_atomic_races=0),
still report races between atomic accesses and free().
llvm-svn: 174175
Diffstat (limited to 'compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc')
-rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc b/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc index ba9b0ad3add..5fb8a6e26ff 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc +++ b/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cc @@ -531,11 +531,27 @@ static bool IsJavaNonsense(const ReportDesc *rep) { return false; } +static bool RaceBetweenAtomicAndFree(ThreadState *thr) { + Shadow s0(thr->racy_state[0]); + Shadow s1(thr->racy_state[1]); + CHECK(!(s0.IsAtomic() && s1.IsAtomic())); + if (!s0.IsAtomic() && !s1.IsAtomic()) + return true; + if (s0.IsAtomic() && s1.IsFreed()) + return true; + if (s1.IsAtomic() && thr->is_freeing) + return true; + return false; +} + void ReportRace(ThreadState *thr) { if (!flags()->report_bugs) return; ScopedInRtl in_rtl; + if (!flags()->report_atomic_races && !RaceBetweenAtomicAndFree(thr)) + return; + if (thr->in_signal_handler) Printf("ThreadSanitizer: printing report from signal handler." " Can crash or hang.\n"); |