<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Mar 4, 2014 at 4:52 PM, Dmitry Vyukov <span dir="ltr"><<a href="mailto:dvyukov@google.com" target="_blank">dvyukov@google.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: dvyukov<br>
Date: Tue Mar  4 06:52:20 2014<br>
New Revision: 202843<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=202843&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=202843&view=rev</a><br>
Log:<br>
tsan: add dynamic library target for standalone deadlock detector<br>
it's LD_PRELOAD-able<br>
<br>
<br>
<br>
Added:<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector2.cc<br>
Modified:<br>
    compiler-rt/trunk/lib/sanitizer_common/CMakeLists.txt<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector1.cc<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector_interface.h<br>
    compiler-rt/trunk/lib/tsan/dd/CMakeLists.txt<br>
    compiler-rt/trunk/lib/tsan/dd/dd_interceptors.cc<br>
    compiler-rt/trunk/lib/tsan/dd/dd_rtl.cc<br>
    compiler-rt/trunk/lib/tsan/dd/dd_rtl.h<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/CMakeLists.txt?rev=202843&r1=202842&r2=202843&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/CMakeLists.txt?rev=202843&r1=202842&r2=202843&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/CMakeLists.txt (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/CMakeLists.txt Tue Mar  4 06:52:20 2014<br>
@@ -6,6 +6,7 @@ set(SANITIZER_SOURCES<br>
   sanitizer_common.cc<br>
   sanitizer_coverage.cc<br>
   sanitizer_deadlock_detector1.cc<br>
+  sanitizer_deadlock_detector2.cc<br>
   sanitizer_flags.cc<br>
   sanitizer_libc.cc<br>
   sanitizer_libignore.cc<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector1.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector1.cc?rev=202843&r1=202842&r2=202843&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector1.cc?rev=202843&r1=202842&r2=202843&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector1.cc (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector1.cc Tue Mar  4 06:52:20 2014<br>
@@ -17,6 +17,8 @@<br>
 #include "sanitizer_placement_new.h"<br>
 #include "sanitizer_mutex.h"<br>
<br>
+#if SANITIZER_DEADLOCK_DETECTOR_VERSION == 1<br>
+<br>
 namespace __sanitizer {<br>
<br>
 typedef TwoLevelBitVector<> DDBV;  // DeadlockDetector's bit vector.<br>
@@ -142,3 +144,4 @@ void DDetectorImpl::MutexDestroy(DDPhysi<br>
 }<br>
<br>
 }  // namespace __sanitizer<br>
+#endif  // #if SANITIZER_DEADLOCK_DETECTOR_VERSION == 1<br>
<br>
Added: compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector2.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector2.cc?rev=202843&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector2.cc?rev=202843&view=auto</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector2.cc (added)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector2.cc Tue Mar  4 06:52:20 2014<br>
@@ -0,0 +1,139 @@<br>
+//===-- sanitizer_deadlock_detector1.cc -----------------------------------===//<br></blockquote><div><br></div><div>Could you please fix and enhance the comment for this file? </div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+//<br>
+// Deadlock detector implementation based on NxN adjacency bit matrix.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+#include "sanitizer_deadlock_detector_interface.h"<br>
+#include "sanitizer_allocator_internal.h"<br>
+#include "sanitizer_placement_new.h"<br>
+//#include "sanitizer_mutex.h"<br>
+<br>
+#if SANITIZER_DEADLOCK_DETECTOR_VERSION == 2<br>
+<br>
+namespace __sanitizer {<br>
+<br>
+struct DDPhysicalThread {<br>
+  DDReport rep;<br>
+};<br>
+<br>
+struct DDLogicalThread {<br>
+  u64 ctx;<br>
+};<br>
+<br>
+struct DDetectorImpl : public DDetector {<br>
+  DDetectorImpl();<br>
+<br>
+  virtual DDPhysicalThread* CreatePhysicalThread();<br>
+  virtual void DestroyPhysicalThread(DDPhysicalThread *pt);<br>
+<br>
+  virtual DDLogicalThread* CreateLogicalThread(u64 ctx);<br>
+  virtual void DestroyLogicalThread(DDLogicalThread *lt);<br>
+<br>
+  virtual void MutexInit(DDMutex *m, u32 stk, u64 ctx);<br>
+  virtual DDReport *MutexLock(DDPhysicalThread *pt, DDLogicalThread *lt,<br>
+      DDMutex *m, bool writelock, bool trylock);<br>
+  virtual DDReport *MutexUnlock(DDPhysicalThread *pt, DDLogicalThread *lt,<br>
+      DDMutex *m, bool writelock);<br>
+  virtual void MutexDestroy(DDPhysicalThread *pt, DDLogicalThread *lt,<br>
+      DDMutex *m);<br>
+};<br>
+<br>
+DDetector *DDetector::Create() {<br>
+  void *mem = MmapOrDie(sizeof(DDetectorImpl), "deadlock detector");<br>
+  return new(mem) DDetectorImpl();<br>
+}<br>
+<br>
+DDetectorImpl::DDetectorImpl() {<br>
+}<br>
+<br>
+DDPhysicalThread* DDetectorImpl::CreatePhysicalThread() {<br>
+  void *mem = InternalAlloc(sizeof(DDPhysicalThread));<br>
+  DDPhysicalThread *pt = new(mem) DDPhysicalThread();<br>
+  return pt;<br>
+}<br>
+<br>
+void DDetectorImpl::DestroyPhysicalThread(DDPhysicalThread *pt) {<br>
+  pt->~DDPhysicalThread();<br>
+  InternalFree(pt);<br>
+}<br>
+<br>
+DDLogicalThread* DDetectorImpl::CreateLogicalThread(u64 ctx) {<br>
+  void *mem = InternalAlloc(sizeof(<br>
+  DDLogicalThread));<br>
+  DDLogicalThread *lt = new(mem) DDLogicalThread();<br>
+  lt->ctx = ctx;<br>
+  return lt;<br>
+}<br>
+<br>
+void DDetectorImpl::DestroyLogicalThread(DDLogicalThread *lt) {<br>
+  lt->~DDLogicalThread();<br>
+  InternalFree(lt);<br>
+}<br>
+<br>
+void DDetectorImpl::MutexInit(DDMutex *m, u32 stk, u64 ctx) {<br>
+  m->id = 0;<br>
+  m->stk = stk;<br>
+  m->ctx = ctx;<br>
+}<br>
+<br>
+DDReport *DDetectorImpl::MutexLock(DDPhysicalThread *pt, DDLogicalThread *lt,<br>
+    DDMutex *m, bool writelock, bool trylock) {<br>
+    /*<br>
+  if (dd.onFirstLock(&lt->dd, m->id))<br>
+    return 0;<br>
+  SpinMutexLock lk(&mtx);<br>
+  MutexEnsureID(lt, m);<br>
+  CHECK(!dd.isHeld(&lt->dd, m->id));<br>
+  // Printf("T%d MutexLock:   %zx\n", thr->tid, s->deadlock_detector_id);<br>
+  bool has_deadlock = trylock<br>
+      ? dd.onTryLock(&lt->dd, m->id)<br>
+       : dd.onLock(&lt->dd, m->id);<br>
+  DDReport *rep = 0;<br>
+  if (has_deadlock) {<br>
+    uptr path[10];<br>
+    uptr len = dd.findPathToHeldLock(&lt->dd, m->id,<br>
+                                          path, ARRAY_SIZE(path));<br>
+    CHECK_GT(len, 0U);  // Hm.. cycle of 10 locks? I'd like to see that.<br>
+    rep = &lt->rep;<br>
+    rep->n = len;<br>
+    for (uptr i = 0; i < len; i++) {<br>
+      DDMutex *m0 = (DDMutex*)dd.getData(path[i]);<br>
+      DDMutex *m1 = (DDMutex*)dd.getData(path[i < len - 1 ? i + 1 : 0]);<br>
+      rep->loop[i].thr_ctx = 0;  // don't know<br>
+      rep->loop[i].mtx_ctx0 = m0->ctx;<br>
+      rep->loop[i].mtx_ctx1 = m1->ctx;<br>
+      rep->loop[i].stk = m0->stk;<br>
+    }<br>
+  }<br>
+  return rep;<br>
+  */<br>
+  return 0;<br>
+}<br>
+<br>
+DDReport *DDetectorImpl::MutexUnlock(DDPhysicalThread *pt, DDLogicalThread *lt,<br>
+    DDMutex *m, bool writelock) {<br>
+  //dd.onUnlock(&lt->dd, m->id);<br>
+  return 0;<br>
+}<br>
+<br>
+void DDetectorImpl::MutexDestroy(DDPhysicalThread *pt, DDLogicalThread *lt,<br>
+    DDMutex *m) {<br>
+    /*<br>
+  if (!m->id) return;<br>
+  SpinMutexLock lk(&mtx);<br>
+  if (dd.nodeBelongsToCurrentEpoch(m->id))<br>
+    dd.removeNode(m->id);<br>
+  m->id = 0;<br>
+  */<br>
+}<br>
+<br>
+}  // namespace __sanitizer<br>
+#endif  // #if SANITIZER_DEADLOCK_DETECTOR_VERSION == 2<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector_interface.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector_interface.h?rev=202843&r1=202842&r2=202843&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector_interface.h?rev=202843&r1=202842&r2=202843&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector_interface.h (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector_interface.h Tue Mar  4 06:52:20 2014<br>
@@ -16,6 +16,8 @@<br>
 #ifndef SANITIZER_DEADLOCK_DETECTOR_INTERFACE_H<br>
 #define SANITIZER_DEADLOCK_DETECTOR_INTERFACE_H<br>
<br>
+#define SANITIZER_DEADLOCK_DETECTOR_VERSION 1<br>
+<br>
 #include "sanitizer_internal_defs.h"<br>
<br>
 namespace __sanitizer {<br>
<br>
Modified: compiler-rt/trunk/lib/tsan/dd/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/dd/CMakeLists.txt?rev=202843&r1=202842&r2=202843&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/dd/CMakeLists.txt?rev=202843&r1=202842&r2=202843&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/tsan/dd/CMakeLists.txt (original)<br>
+++ compiler-rt/trunk/lib/tsan/dd/CMakeLists.txt Tue Mar  4 06:52:20 2014<br>
@@ -11,6 +11,8 @@ else()<br>
   set(DD_COMMON_DEFINITIONS DEBUG=1)<br>
 endif()<br>
<br>
+set(DD_DYNAMIC_DEFINITIONS DYNAMIC=1)<br>
+<br>
 set(DD_SOURCES<br>
   dd_rtl.cc<br>
   dd_interceptors.cc<br>
@@ -22,7 +24,7 @@ set(DD_HEADERS<br>
<br>
 add_custom_target(dd)<br>
 # Deadlock detector is currently supported on 64-bit Linux only.<br>
-if(CAN_TARGET_x86_64 AND UNIX AND NOT APPLE)<br>
+if(CAN_TARGET_x86_64 AND UNIX AND NOT APPLE AND NOT ANDROID)<br>
   set(arch "x86_64")<br>
   add_compiler_rt_static_runtime(clang_rt.dd-${arch} ${arch}<br>
     SOURCES ${DD_SOURCES}<br>
@@ -31,6 +33,23 @@ if(CAN_TARGET_x86_64 AND UNIX AND NOT AP<br>
             $<TARGET_OBJECTS:RTSanitizerCommonLibc.${arch}><br>
     CFLAGS ${DD_CFLAGS}<br>
     DEFS ${DD_COMMON_DEFINITIONS})<br>
+<br>
+  add_library(RTDD OBJECT ${DD_SOURCES})<br>
+  set_target_compile_flags(RTDD ${DD_CFLAGS})<br>
+  set_property(TARGET RTDD APPEND PROPERTY<br>
+    COMPILE_DEFINITIONS ${DD_COMMON_DEFINITIONS})<br>
+  set_property(TARGET RTDD APPEND PROPERTY<br>
+    COMPILE_DEFINITIONS ${DD_DYNAMIC_DEFINITIONS})<br>
+<br>
+  add_library(clang_rt.dyndd-${arch} SHARED<br>
+    $<TARGET_OBJECTS:RTDD><br>
+    $<TARGET_OBJECTS:RTInterception.${arch}><br>
+    $<TARGET_OBJECTS:RTSanitizerCommon.${arch}><br>
+    $<TARGET_OBJECTS:RTSanitizerCommonLibc.${arch}>)<br>
+#  set_target_compile_flags(clang_rt.dd-${arch} ${DD_CFLAGS})<br>
+#  set_property(TARGET clang_rt.dd-${arch} APPEND PROPERTY<br>
+#    COMPILE_DEFINITIONS ${DD_COMMON_DEFINITIONS})<br>
+  target_link_libraries(clang_rt.dyndd-${arch} pthread dl)<br>
 endif()<br>
<br>
 add_dependencies(compiler-rt dd)<br>
<br>
Modified: compiler-rt/trunk/lib/tsan/dd/dd_interceptors.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/dd/dd_interceptors.cc?rev=202843&r1=202842&r2=202843&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/dd/dd_interceptors.cc?rev=202843&r1=202842&r2=202843&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/tsan/dd/dd_interceptors.cc (original)<br>
+++ compiler-rt/trunk/lib/tsan/dd/dd_interceptors.cc Tue Mar  4 06:52:20 2014<br>
@@ -66,3 +66,13 @@ void InitializeInterceptors() {<br>
 }<br>
<br>
 }  // namespace __dsan<br>
+<br>
+#if DYNAMIC<br>
+static void __local_dsan_init() __attribute__((constructor));<br>
+void __local_dsan_init() {<br>
+  __dsan::Initialize();<br>
+}<br>
+#else<br>
+__attribute__((section(".preinit_array"), used))<br>
+void (*__local_dsan_preinit)(void) = __dsan::Initialize;<br>
+#endif<br>
<br>
Modified: compiler-rt/trunk/lib/tsan/dd/dd_rtl.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/dd/dd_rtl.cc?rev=202843&r1=202842&r2=202843&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/dd/dd_rtl.cc?rev=202843&r1=202842&r2=202843&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/tsan/dd/dd_rtl.cc (original)<br>
+++ compiler-rt/trunk/lib/tsan/dd/dd_rtl.cc Tue Mar  4 06:52:20 2014<br>
@@ -100,6 +100,3 @@ void MutexDestroy(Thread *thr, uptr m) {<br>
 }<br>
<br>
 }  // namespace __dsan<br>
-<br>
-__attribute__((section(".preinit_array"), used))<br>
-void (*__local_dsan_preinit)(void) = __dsan::Initialize;<br>
<br>
Modified: compiler-rt/trunk/lib/tsan/dd/dd_rtl.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/dd/dd_rtl.h?rev=202843&r1=202842&r2=202843&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/dd/dd_rtl.h?rev=202843&r1=202842&r2=202843&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/tsan/dd/dd_rtl.h (original)<br>
+++ compiler-rt/trunk/lib/tsan/dd/dd_rtl.h Tue Mar  4 06:52:20 2014<br>
@@ -36,6 +36,7 @@ struct Context {<br>
   MutexHashMap mutex_map;<br>
 };<br>
<br>
+void Initialize();<br>
 void InitializeInterceptors();<br>
<br>
 void ThreadInit(Thread *thr);<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>