[compiler-rt] r202843 - tsan: add dynamic library target for standalone deadlock detector
Kostya Serebryany
kcc at google.com
Wed Mar 12 08:08:59 PDT 2014
On Tue, Mar 4, 2014 at 4:52 PM, Dmitry Vyukov <dvyukov at google.com> wrote:
> Author: dvyukov
> Date: Tue Mar 4 06:52:20 2014
> New Revision: 202843
>
> URL: http://llvm.org/viewvc/llvm-project?rev=202843&view=rev
> Log:
> tsan: add dynamic library target for standalone deadlock detector
> it's LD_PRELOAD-able
>
>
>
> Added:
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector2.cc
> Modified:
> compiler-rt/trunk/lib/sanitizer_common/CMakeLists.txt
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector1.cc
>
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector_interface.h
> compiler-rt/trunk/lib/tsan/dd/CMakeLists.txt
> compiler-rt/trunk/lib/tsan/dd/dd_interceptors.cc
> compiler-rt/trunk/lib/tsan/dd/dd_rtl.cc
> compiler-rt/trunk/lib/tsan/dd/dd_rtl.h
>
> Modified: compiler-rt/trunk/lib/sanitizer_common/CMakeLists.txt
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/CMakeLists.txt?rev=202843&r1=202842&r2=202843&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/CMakeLists.txt (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/CMakeLists.txt Tue Mar 4
> 06:52:20 2014
> @@ -6,6 +6,7 @@ set(SANITIZER_SOURCES
> sanitizer_common.cc
> sanitizer_coverage.cc
> sanitizer_deadlock_detector1.cc
> + sanitizer_deadlock_detector2.cc
> sanitizer_flags.cc
> sanitizer_libc.cc
> sanitizer_libignore.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=202843&r1=202842&r2=202843&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 4 06:52:20 2014
> @@ -17,6 +17,8 @@
> #include "sanitizer_placement_new.h"
> #include "sanitizer_mutex.h"
>
> +#if SANITIZER_DEADLOCK_DETECTOR_VERSION == 1
> +
> namespace __sanitizer {
>
> typedef TwoLevelBitVector<> DDBV; // DeadlockDetector's bit vector.
> @@ -142,3 +144,4 @@ void DDetectorImpl::MutexDestroy(DDPhysi
> }
>
> } // namespace __sanitizer
> +#endif // #if SANITIZER_DEADLOCK_DETECTOR_VERSION == 1
>
> Added:
> 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=202843&view=auto
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector2.cc
> (added)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_deadlock_detector2.cc
> Tue Mar 4 06:52:20 2014
> @@ -0,0 +1,139 @@
> +//===-- sanitizer_deadlock_detector1.cc
> -----------------------------------===//
>
Could you please fix and enhance the comment for this file?
> +//
> +// The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +//
> +// Deadlock detector implementation based on NxN adjacency bit matrix.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +#include "sanitizer_deadlock_detector_interface.h"
> +#include "sanitizer_allocator_internal.h"
> +#include "sanitizer_placement_new.h"
> +//#include "sanitizer_mutex.h"
> +
> +#if SANITIZER_DEADLOCK_DETECTOR_VERSION == 2
> +
> +namespace __sanitizer {
> +
> +struct DDPhysicalThread {
> + DDReport rep;
> +};
> +
> +struct DDLogicalThread {
> + u64 ctx;
> +};
> +
> +struct DDetectorImpl : public DDetector {
> + DDetectorImpl();
> +
> + virtual DDPhysicalThread* CreatePhysicalThread();
> + virtual void DestroyPhysicalThread(DDPhysicalThread *pt);
> +
> + virtual DDLogicalThread* CreateLogicalThread(u64 ctx);
> + virtual void DestroyLogicalThread(DDLogicalThread *lt);
> +
> + virtual void MutexInit(DDMutex *m, u32 stk, u64 ctx);
> + virtual DDReport *MutexLock(DDPhysicalThread *pt, DDLogicalThread *lt,
> + DDMutex *m, bool writelock, bool trylock);
> + virtual DDReport *MutexUnlock(DDPhysicalThread *pt, DDLogicalThread *lt,
> + DDMutex *m, bool writelock);
> + virtual void MutexDestroy(DDPhysicalThread *pt, DDLogicalThread *lt,
> + DDMutex *m);
> +};
> +
> +DDetector *DDetector::Create() {
> + void *mem = MmapOrDie(sizeof(DDetectorImpl), "deadlock detector");
> + return new(mem) DDetectorImpl();
> +}
> +
> +DDetectorImpl::DDetectorImpl() {
> +}
> +
> +DDPhysicalThread* DDetectorImpl::CreatePhysicalThread() {
> + void *mem = InternalAlloc(sizeof(DDPhysicalThread));
> + DDPhysicalThread *pt = new(mem) DDPhysicalThread();
> + return pt;
> +}
> +
> +void DDetectorImpl::DestroyPhysicalThread(DDPhysicalThread *pt) {
> + pt->~DDPhysicalThread();
> + InternalFree(pt);
> +}
> +
> +DDLogicalThread* DDetectorImpl::CreateLogicalThread(u64 ctx) {
> + void *mem = InternalAlloc(sizeof(
> + DDLogicalThread));
> + DDLogicalThread *lt = new(mem) DDLogicalThread();
> + lt->ctx = ctx;
> + return lt;
> +}
> +
> +void DDetectorImpl::DestroyLogicalThread(DDLogicalThread *lt) {
> + lt->~DDLogicalThread();
> + InternalFree(lt);
> +}
> +
> +void DDetectorImpl::MutexInit(DDMutex *m, u32 stk, u64 ctx) {
> + m->id = 0;
> + m->stk = stk;
> + m->ctx = ctx;
> +}
> +
> +DDReport *DDetectorImpl::MutexLock(DDPhysicalThread *pt, DDLogicalThread
> *lt,
> + DDMutex *m, bool writelock, bool trylock) {
> + /*
> + if (dd.onFirstLock(<->dd, m->id))
> + return 0;
> + SpinMutexLock lk(&mtx);
> + MutexEnsureID(lt, m);
> + CHECK(!dd.isHeld(<->dd, m->id));
> + // Printf("T%d MutexLock: %zx\n", thr->tid, s->deadlock_detector_id);
> + bool has_deadlock = trylock
> + ? dd.onTryLock(<->dd, m->id)
> + : dd.onLock(<->dd, m->id);
> + DDReport *rep = 0;
> + if (has_deadlock) {
> + uptr path[10];
> + uptr len = dd.findPathToHeldLock(<->dd, m->id,
> + path, ARRAY_SIZE(path));
> + CHECK_GT(len, 0U); // Hm.. cycle of 10 locks? I'd like to see that.
> + rep = <->rep;
> + rep->n = len;
> + for (uptr i = 0; i < len; i++) {
> + DDMutex *m0 = (DDMutex*)dd.getData(path[i]);
> + DDMutex *m1 = (DDMutex*)dd.getData(path[i < len - 1 ? i + 1 : 0]);
> + 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 = m0->stk;
> + }
> + }
> + return rep;
> + */
> + return 0;
> +}
> +
> +DDReport *DDetectorImpl::MutexUnlock(DDPhysicalThread *pt,
> DDLogicalThread *lt,
> + DDMutex *m, bool writelock) {
> + //dd.onUnlock(<->dd, m->id);
> + return 0;
> +}
> +
> +void DDetectorImpl::MutexDestroy(DDPhysicalThread *pt, DDLogicalThread
> *lt,
> + DDMutex *m) {
> + /*
> + if (!m->id) return;
> + SpinMutexLock lk(&mtx);
> + if (dd.nodeBelongsToCurrentEpoch(m->id))
> + dd.removeNode(m->id);
> + m->id = 0;
> + */
> +}
> +
> +} // namespace __sanitizer
> +#endif // #if SANITIZER_DEADLOCK_DETECTOR_VERSION == 2
>
> 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=202843&r1=202842&r2=202843&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 4 06:52:20 2014
> @@ -16,6 +16,8 @@
> #ifndef SANITIZER_DEADLOCK_DETECTOR_INTERFACE_H
> #define SANITIZER_DEADLOCK_DETECTOR_INTERFACE_H
>
> +#define SANITIZER_DEADLOCK_DETECTOR_VERSION 1
> +
> #include "sanitizer_internal_defs.h"
>
> namespace __sanitizer {
>
> Modified: compiler-rt/trunk/lib/tsan/dd/CMakeLists.txt
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/dd/CMakeLists.txt?rev=202843&r1=202842&r2=202843&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/dd/CMakeLists.txt (original)
> +++ compiler-rt/trunk/lib/tsan/dd/CMakeLists.txt Tue Mar 4 06:52:20 2014
> @@ -11,6 +11,8 @@ else()
> set(DD_COMMON_DEFINITIONS DEBUG=1)
> endif()
>
> +set(DD_DYNAMIC_DEFINITIONS DYNAMIC=1)
> +
> set(DD_SOURCES
> dd_rtl.cc
> dd_interceptors.cc
> @@ -22,7 +24,7 @@ set(DD_HEADERS
>
> add_custom_target(dd)
> # Deadlock detector is currently supported on 64-bit Linux only.
> -if(CAN_TARGET_x86_64 AND UNIX AND NOT APPLE)
> +if(CAN_TARGET_x86_64 AND UNIX AND NOT APPLE AND NOT ANDROID)
> set(arch "x86_64")
> add_compiler_rt_static_runtime(clang_rt.dd-${arch} ${arch}
> SOURCES ${DD_SOURCES}
> @@ -31,6 +33,23 @@ if(CAN_TARGET_x86_64 AND UNIX AND NOT AP
> $<TARGET_OBJECTS:RTSanitizerCommonLibc.${arch}>
> CFLAGS ${DD_CFLAGS}
> DEFS ${DD_COMMON_DEFINITIONS})
> +
> + add_library(RTDD OBJECT ${DD_SOURCES})
> + set_target_compile_flags(RTDD ${DD_CFLAGS})
> + set_property(TARGET RTDD APPEND PROPERTY
> + COMPILE_DEFINITIONS ${DD_COMMON_DEFINITIONS})
> + set_property(TARGET RTDD APPEND PROPERTY
> + COMPILE_DEFINITIONS ${DD_DYNAMIC_DEFINITIONS})
> +
> + add_library(clang_rt.dyndd-${arch} SHARED
> + $<TARGET_OBJECTS:RTDD>
> + $<TARGET_OBJECTS:RTInterception.${arch}>
> + $<TARGET_OBJECTS:RTSanitizerCommon.${arch}>
> + $<TARGET_OBJECTS:RTSanitizerCommonLibc.${arch}>)
> +# set_target_compile_flags(clang_rt.dd-${arch} ${DD_CFLAGS})
> +# set_property(TARGET clang_rt.dd-${arch} APPEND PROPERTY
> +# COMPILE_DEFINITIONS ${DD_COMMON_DEFINITIONS})
> + target_link_libraries(clang_rt.dyndd-${arch} pthread dl)
> endif()
>
> add_dependencies(compiler-rt dd)
>
> Modified: compiler-rt/trunk/lib/tsan/dd/dd_interceptors.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/dd/dd_interceptors.cc?rev=202843&r1=202842&r2=202843&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/dd/dd_interceptors.cc (original)
> +++ compiler-rt/trunk/lib/tsan/dd/dd_interceptors.cc Tue Mar 4 06:52:20
> 2014
> @@ -66,3 +66,13 @@ void InitializeInterceptors() {
> }
>
> } // namespace __dsan
> +
> +#if DYNAMIC
> +static void __local_dsan_init() __attribute__((constructor));
> +void __local_dsan_init() {
> + __dsan::Initialize();
> +}
> +#else
> +__attribute__((section(".preinit_array"), used))
> +void (*__local_dsan_preinit)(void) = __dsan::Initialize;
> +#endif
>
> 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=202843&r1=202842&r2=202843&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/dd/dd_rtl.cc (original)
> +++ compiler-rt/trunk/lib/tsan/dd/dd_rtl.cc Tue Mar 4 06:52:20 2014
> @@ -100,6 +100,3 @@ void MutexDestroy(Thread *thr, uptr m) {
> }
>
> } // namespace __dsan
> -
> -__attribute__((section(".preinit_array"), used))
> -void (*__local_dsan_preinit)(void) = __dsan::Initialize;
>
> 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=202843&r1=202842&r2=202843&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/dd/dd_rtl.h (original)
> +++ compiler-rt/trunk/lib/tsan/dd/dd_rtl.h Tue Mar 4 06:52:20 2014
> @@ -36,6 +36,7 @@ struct Context {
> MutexHashMap mutex_map;
> };
>
> +void Initialize();
> void InitializeInterceptors();
>
> void ThreadInit(Thread *thr);
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140312/ae132476/attachment.html>
More information about the llvm-commits
mailing list