summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--compiler-rt/lib/sanitizer_common/sanitizer_deadlock_detector1.cc16
-rw-r--r--compiler-rt/lib/tsan/Makefile.old2
-rw-r--r--compiler-rt/lib/tsan/rtl/Makefile.old2
-rw-r--r--compiler-rt/lib/tsan/rtl/tsan_rtl_mutex.cc2
-rw-r--r--compiler-rt/test/tsan/deadlock_detector_stress_test.cc19
5 files changed, 27 insertions, 14 deletions
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_deadlock_detector1.cc b/compiler-rt/lib/sanitizer_common/sanitizer_deadlock_detector1.cc
index 14c1052e674..04f5c0ffa82 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_deadlock_detector1.cc
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_deadlock_detector1.cc
@@ -36,8 +36,9 @@ struct DDLogicalThread {
struct DD : public DDetector {
SpinMutex mtx;
DeadlockDetector<DDBV> dd;
+ DDFlags flags;
- DD();
+ explicit DD(const DDFlags *flags);
DDPhysicalThread* CreatePhysicalThread();
void DestroyPhysicalThread(DDPhysicalThread *pt);
@@ -60,10 +61,11 @@ struct DD : public DDetector {
DDetector *DDetector::Create(const DDFlags *flags) {
(void)flags;
void *mem = MmapOrDie(sizeof(DD), "deadlock detector");
- return new(mem) DD();
+ return new(mem) DD(flags);
}
-DD::DD() {
+DD::DD(const DDFlags *flags)
+ : flags(*flags) {
dd.clear();
}
@@ -135,14 +137,16 @@ void DD::ReportDeadlock(DDCallback *cb, DDMutex *m) {
rep->loop[i].thr_ctx = 0; // don't know
rep->loop[i].mtx_ctx0 = m0->ctx;
rep->loop[i].mtx_ctx1 = m1->ctx;
- rep->loop[i].stk[0] = stk_from;
- rep->loop[i].stk[1] = stk_to;
+ rep->loop[i].stk[0] = stk_to;
+ rep->loop[i].stk[1] = stk_from;
}
}
void DD::MutexAfterLock(DDCallback *cb, DDMutex *m, bool wlock, bool trylock) {
DDLogicalThread *lt = cb->lt;
- u32 stk = cb->Unwind(); // FIXME: if this is hot, do this under a flag.
+ u32 stk = 0;
+ if (flags.second_deadlock_stack)
+ stk = cb->Unwind();
// Printf("T%p MutexLock: %zx stk %u\n", lt, m->id, stk);
if (dd.onFirstLock(&lt->dd, m->id, stk))
return;
diff --git a/compiler-rt/lib/tsan/Makefile.old b/compiler-rt/lib/tsan/Makefile.old
index 269ed3faae3..a93fa5f2bab 100644
--- a/compiler-rt/lib/tsan/Makefile.old
+++ b/compiler-rt/lib/tsan/Makefile.old
@@ -1,6 +1,6 @@
DEBUG=0
LDFLAGS=-ldl -lpthread -pie
-CXXFLAGS = -fPIE -fno-rtti -g -Wall -Werror \
+CXXFLAGS = -std=c++11 -fPIE -fno-rtti -g -Wall -Werror \
-DGTEST_HAS_RTTI=0 -DTSAN_DEBUG=$(DEBUG) -DSANITIZER_DEBUG=$(DEBUG)
CLANG=clang
FILECHECK=FileCheck
diff --git a/compiler-rt/lib/tsan/rtl/Makefile.old b/compiler-rt/lib/tsan/rtl/Makefile.old
index 7aee5abe78b..2a718690a46 100644
--- a/compiler-rt/lib/tsan/rtl/Makefile.old
+++ b/compiler-rt/lib/tsan/rtl/Makefile.old
@@ -1,4 +1,4 @@
-CXXFLAGS = -fPIE -g -Wall -Werror -fno-builtin -DTSAN_DEBUG=$(DEBUG) -DSANITIZER_DEBUG=$(DEBUG)
+CXXFLAGS = -std=c++11 -fPIE -g -Wall -Werror -fno-builtin -DTSAN_DEBUG=$(DEBUG) -DSANITIZER_DEBUG=$(DEBUG)
CLANG=clang
ifeq ($(DEBUG), 0)
CXXFLAGS += -O3
diff --git a/compiler-rt/lib/tsan/rtl/tsan_rtl_mutex.cc b/compiler-rt/lib/tsan/rtl/tsan_rtl_mutex.cc
index 3d4c43baf03..7423f19b22b 100644
--- a/compiler-rt/lib/tsan/rtl/tsan_rtl_mutex.cc
+++ b/compiler-rt/lib/tsan/rtl/tsan_rtl_mutex.cc
@@ -441,7 +441,7 @@ void ReportDeadlock(ThreadState *thr, uptr pc, DDReport *r) {
}
// FIXME: use all stacks for suppressions, not just the second stack of the
// first edge.
- OutputReport(ctx, rep, rep.GetReport()->stacks[1]);
+ OutputReport(ctx, rep, rep.GetReport()->stacks[0]);
}
} // namespace __tsan
diff --git a/compiler-rt/test/tsan/deadlock_detector_stress_test.cc b/compiler-rt/test/tsan/deadlock_detector_stress_test.cc
index a4555a9a3a8..14b4f8fee38 100644
--- a/compiler-rt/test/tsan/deadlock_detector_stress_test.cc
+++ b/compiler-rt/test/tsan/deadlock_detector_stress_test.cc
@@ -1,5 +1,6 @@
// RUN: %clangxx_tsan %s -o %t -DLockType=PthreadMutex
-// RUN: TSAN_OPTIONS=detect_deadlocks=1 not %t 2>&1 | FileCheck %s
+// RUN: TSAN_OPTIONS=detect_deadlocks=1 not %t 2>&1 | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-NOT-SECOND
+// TSAN_OPTIONS="detect_deadlocks=1 second_deadlock_stack=1" not %t 2>&1 | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-SECOND
// RUN: %clangxx_tsan %s -o %t -DLockType=PthreadSpinLock
// RUN: TSAN_OPTIONS=detect_deadlocks=1 not %t 2>&1 | FileCheck %s
// RUN: %clangxx_tsan %s -o %t -DLockType=PthreadRWLock
@@ -152,6 +153,14 @@ class LockTest {
Lock_1_0();
// CHECK: WARNING: ThreadSanitizer: lock-order-inversion (potential deadlock)
// CHECK: Path: [[M1:M[0-9]+]] => [[M2:M[0-9]+]] => [[M1]]
+ // CHECK: Edge: [[M1]] => [[M2]]
+ // CHECK: #0 pthread_
+ // CHECK-SECOND: #0 pthread_
+ // CHECK-NOT-SECOND-NOT: #0 pthread_
+ // CHECK: Edge: [[M2]] => [[M1]]
+ // CHECK: #0 pthread_
+ // CHECK-SECOND: #0 pthread_
+ // CHECK-NOT-SECOND-NOT: #0 pthread_
// CHECK: Mutex [[M1]] ([[A1]]) created at:
// CHECK: Mutex [[M2]] ([[A2]]) created at:
// CHECK-NOT: WARNING: ThreadSanitizer:
@@ -417,14 +426,14 @@ class LockTest {
fprintf(stderr, "Starting Test16: detailed output test with two locks\n");
// CHECK: Starting Test16
// CHECK: WARNING: ThreadSanitizer: lock-order-inversion
- // CHECK: LockTest::Acquire0
- // CHECK-NEXT: LockTest::Acquire_0_then_1
// CHECK: LockTest::Acquire1
// CHECK-NEXT: LockTest::Acquire_0_then_1
- // CHECK: LockTest::Acquire1
- // CHECK-NEXT: LockTest::Acquire_1_then_0
+ // CHECK-SECOND: LockTest::Acquire0
+ // CHECK-SECOND-NEXT: LockTest::Acquire_0_then_1
// CHECK: LockTest::Acquire0
// CHECK-NEXT: LockTest::Acquire_1_then_0
+ // CHECK-SECOND: LockTest::Acquire1
+ // CHECK-SECOND-NEXT: LockTest::Acquire_1_then_0
Init(5);
Acquire_0_then_1();
U(0); U(1);
OpenPOWER on IntegriCloud