<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(<->dd, m->id))<br>
+ return 0;<br>
+ SpinMutexLock lk(&mtx);<br>
+ MutexEnsureID(lt, m);<br>
+ CHECK(!dd.isHeld(<->dd, m->id));<br>
+ // Printf("T%d MutexLock: %zx\n", thr->tid, s->deadlock_detector_id);<br>
+ bool has_deadlock = trylock<br>
+ ? dd.onTryLock(<->dd, m->id)<br>
+ : dd.onLock(<->dd, m->id);<br>
+ DDReport *rep = 0;<br>
+ if (has_deadlock) {<br>
+ uptr path[10];<br>
+ uptr len = dd.findPathToHeldLock(<->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 = <->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(<->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>