[compiler-rt] r204150 - tsan: deadlock detector: add deadlock detector flags
Dmitry Vyukov
dvyukov at google.com
Tue Mar 18 06:13:47 PDT 2014
Author: dvyukov
Date: Tue Mar 18 08:13:47 2014
New Revision: 204150
URL: http://llvm.org/viewvc/llvm-project?rev=204150&view=rev
Log:
tsan: deadlock detector: add deadlock detector flags
the first flags is to enable printing of the second stack per edge
Modified:
compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector1.cc
compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector2.cc
compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector_interface.h
compiler-rt/trunk/lib/tsan/dd/dd_rtl.cc
compiler-rt/trunk/lib/tsan/dd/dd_rtl.h
compiler-rt/trunk/lib/tsan/rtl/tsan_flags.cc
compiler-rt/trunk/lib/tsan/rtl/tsan_flags.h
compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector1.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector1.cc?rev=204150&r1=204149&r2=204150&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector1.cc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector1.cc Tue Mar 18 08:13:47 2014
@@ -56,7 +56,8 @@ struct DD : public DDetector {
void MutexEnsureID(DDLogicalThread *lt, DDMutex *m);
};
-DDetector *DDetector::Create() {
+DDetector *DDetector::Create(const DDFlags *flags) {
+ (void)flags;
void *mem = MmapOrDie(sizeof(DD), "deadlock detector");
return new(mem) DD();
}
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector2.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector2.cc?rev=204150&r1=204149&r2=204150&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector2.cc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector2.cc Tue Mar 18 08:13:47 2014
@@ -82,7 +82,7 @@ struct Mutex {
};
struct DD : public DDetector {
- explicit DD();
+ explicit DD(const DDFlags *flags);
DDPhysicalThread* CreatePhysicalThread();
void DestroyPhysicalThread(DDPhysicalThread *pt);
@@ -105,21 +105,24 @@ struct DD : public DDetector {
Mutex *getMutex(u32 id);
u32 getMutexId(Mutex *m);
+ DDFlags flags;
+
+ Mutex* mutex[kL1Size];
+
SpinMutex mtx;
InternalMmapVector<u32> free_id;
-
int id_gen;
-
- Mutex* mutex[kL1Size];
};
-DDetector *DDetector::Create() {
+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()
- : free_id(1024) {
+DD::DD(const DDFlags *flags)
+ : flags(*flags)
+ , free_id(1024) {
id_gen = 0;
}
@@ -210,7 +213,8 @@ void DD::MutexBeforeLock(DDCallback *cb,
ThreadMutex *tm = <->locked[lt->nlocked++];
tm->id = m->id;
- tm->stk = cb->Unwind();
+ if (flags.second_deadlock_stack)
+ tm->stk = cb->Unwind();
if (lt->nlocked == 1) {
VPrintf(3, "#%llu: DD::MutexBeforeLock first mutex\n",
cb->lt->ctx);
@@ -296,7 +300,8 @@ void DD::MutexAfterLock(DDCallback *cb,
m->id = allocateId(cb);
ThreadMutex *tm = <->locked[lt->nlocked++];
tm->id = m->id;
- tm->stk = cb->Unwind();
+ if (flags.second_deadlock_stack)
+ tm->stk = cb->Unwind();
}
void DD::MutexBeforeUnlock(DDCallback *cb, DDMutex *m, bool wlock) {
@@ -407,7 +412,7 @@ void DD::Report(DDPhysicalThread *pt, DD
rep->loop[i].thr_ctx = link->tid;
rep->loop[i].mtx_ctx0 = link0->id;
rep->loop[i].mtx_ctx1 = link->id;
- rep->loop[i].stk[0] = link->stk0;
+ rep->loop[i].stk[0] = flags.second_deadlock_stack ? link->stk0 : 0;
rep->loop[i].stk[1] = link->stk1;
}
pt->report_pending = true;
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector_interface.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector_interface.h?rev=204150&r1=204149&r2=204150&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector_interface.h (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector_interface.h Tue Mar 18 08:13:47 2014
@@ -46,6 +46,10 @@ struct DDMutex {
u64 ctx;
};
+struct DDFlags {
+ bool second_deadlock_stack;
+};
+
struct DDReport {
enum { kMaxLoopSize = 8 };
int n; // number of entries in loop
@@ -65,7 +69,7 @@ struct DDCallback {
};
struct DDetector {
- static DDetector *Create();
+ static DDetector *Create(const DDFlags *flags);
virtual DDPhysicalThread* CreatePhysicalThread() { return 0; }
virtual void DestroyPhysicalThread(DDPhysicalThread *pt) {}
Modified: compiler-rt/trunk/lib/tsan/dd/dd_rtl.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/dd/dd_rtl.cc?rev=204150&r1=204149&r2=204150&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/dd/dd_rtl.cc (original)
+++ compiler-rt/trunk/lib/tsan/dd/dd_rtl.cc Tue Mar 18 08:13:47 2014
@@ -45,9 +45,11 @@ static void ReportDeadlock(Thread *thr,
Printf("Thread %d locks mutex %llu while holding mutex %llu:\n",
rep->loop[i].thr_ctx, rep->loop[i].mtx_ctx1, rep->loop[i].mtx_ctx0);
PrintStackTrace(thr, rep->loop[i].stk[1]);
- Printf("Mutex %llu was acquired here:\n",
- rep->loop[i].mtx_ctx0);
- PrintStackTrace(thr, rep->loop[i].stk[0]);
+ if (rep->loop[i].stk[0]) {
+ Printf("Mutex %llu was acquired here:\n",
+ rep->loop[i].mtx_ctx0);
+ PrintStackTrace(thr, rep->loop[i].stk[0]);
+ }
}
Printf("==============================\n");
Die();
@@ -63,15 +65,32 @@ u32 Callback::Unwind() {
return CurrentStackTrace(thr, 3);
}
+void InitializeFlags(Flags *f, const char *env) {
+ internal_memset(f, 0, sizeof(*f));
+
+ // Default values.
+ f->second_deadlock_stack = false;
+
+ SetCommonFlagsDefaults(f);
+ // Override some common flags defaults.
+ f->allow_addr2line = true;
+
+ // Override from command line.
+ ParseFlag(env, &f->second_deadlock_stack, "second_deadlock_stack");
+ ParseCommonFlagsFromString(f, env);
+
+ // Copy back to common flags.
+ *common_flags() = *f;
+}
+
void Initialize() {
static u64 ctx_mem[sizeof(Context) / sizeof(u64) + 1];
ctx = new(ctx_mem) Context();
InitializeInterceptors();
- ParseCommonFlagsFromString(flags(), GetEnv("DSAN_OPTIONS"));
- //common_flags()->allow_addr2line = true;
+ InitializeFlags(flags(), GetEnv("DSAN_OPTIONS"));
common_flags()->symbolize = true;
- ctx->dd = DDetector::Create();
+ ctx->dd = DDetector::Create(flags());
}
void ThreadInit(Thread *thr) {
Modified: compiler-rt/trunk/lib/tsan/dd/dd_rtl.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/dd/dd_rtl.h?rev=204150&r1=204149&r2=204150&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/dd/dd_rtl.h (original)
+++ compiler-rt/trunk/lib/tsan/dd/dd_rtl.h Tue Mar 18 08:13:47 2014
@@ -18,6 +18,9 @@
namespace __dsan {
+struct Flags : CommonFlags, DDFlags {
+};
+
struct Mutex {
DDMutex dd;
};
@@ -44,8 +47,9 @@ struct Context {
MutexHashMap mutex_map;
};
-inline CommonFlags* flags() {
- return common_flags();
+inline Flags* flags() {
+ static Flags flags;
+ return &flags;
}
void Initialize();
Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_flags.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_flags.cc?rev=204150&r1=204149&r2=204150&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl/tsan_flags.cc (original)
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_flags.cc Tue Mar 18 08:13:47 2014
@@ -59,6 +59,9 @@ static void ParseFlags(Flags *f, const c
ParseFlag(env, &f->history_size, "history_size");
ParseFlag(env, &f->io_sync, "io_sync");
ParseFlag(env, &f->die_after_fork, "die_after_fork");
+
+ // DDFlags
+ ParseFlag(env, &f->second_deadlock_stack, "second_deadlock_stack");
}
void InitializeFlags(Flags *f, const char *env) {
@@ -91,6 +94,9 @@ void InitializeFlags(Flags *f, const cha
f->io_sync = 1;
f->die_after_fork = true;
+ // DDFlags
+ f->second_deadlock_stack = false;
+
SetCommonFlagsDefaults(f);
// Override some common flags defaults.
f->allow_addr2line = true;
Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_flags.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_flags.h?rev=204150&r1=204149&r2=204150&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl/tsan_flags.h (original)
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_flags.h Tue Mar 18 08:13:47 2014
@@ -15,10 +15,11 @@
#define TSAN_FLAGS_H
#include "sanitizer_common/sanitizer_flags.h"
+#include "sanitizer_common/sanitizer_deadlock_detector_interface.h"
namespace __tsan {
-struct Flags : CommonFlags {
+struct Flags : CommonFlags, DDFlags {
// Enable dynamic annotations, otherwise they are no-ops.
bool enable_annotations;
// Supress a race report if we've already output another race report
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=204150&r1=204149&r2=204150&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc (original)
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc Tue Mar 18 08:13:47 2014
@@ -251,7 +251,7 @@ void Initialize(ThreadState *thr) {
#endif
internal_start_thread(&BackgroundThread, 0);
if (flags()->detect_deadlocks)
- ctx->dd = DDetector::Create();
+ ctx->dd = DDetector::Create(flags());
if (ctx->flags.verbosity)
Printf("***** Running under ThreadSanitizer v2 (pid %d) *****\n",
More information about the llvm-commits
mailing list