12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines//===-- dd_rtl.h ----------------------------------------------------------===// 22d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// 32d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// The LLVM Compiler Infrastructure 42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// 52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// This file is distributed under the University of Illinois Open Source 62d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// License. See LICENSE.TXT for details. 72d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// 82d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines//===----------------------------------------------------------------------===// 92d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifndef DD_RTL_H 102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#define DD_RTL_H 112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include "sanitizer_common/sanitizer_internal_defs.h" 132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include "sanitizer_common/sanitizer_deadlock_detector_interface.h" 142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include "sanitizer_common/sanitizer_flags.h" 152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include "sanitizer_common/sanitizer_allocator_internal.h" 162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include "sanitizer_common/sanitizer_addrhashmap.h" 172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include "sanitizer_common/sanitizer_mutex.h" 182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesnamespace __dsan { 202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesstruct Flags : CommonFlags, DDFlags { 222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}; 232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesstruct Mutex { 252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines DDMutex dd; 262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}; 272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesstruct Thread { 292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines DDPhysicalThread *dd_pt; 302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines DDLogicalThread *dd_lt; 312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines bool ignore_interceptors; 332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}; 342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesstruct Callback : DDCallback { 362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines Thread *thr; 372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines Callback(Thread *thr); 392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines virtual u32 Unwind(); 402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}; 412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinestypedef AddrHashMap<Mutex, 31051> MutexHashMap; 432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesstruct Context { 452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines DDetector *dd; 462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines BlockingMutex report_mutex; 482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines MutexHashMap mutex_map; 492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}; 502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesinline Flags* flags() { 522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines static Flags flags; 532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return &flags; 542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid Initialize(); 572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid InitializeInterceptors(); 582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid ThreadInit(Thread *thr); 602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid ThreadDestroy(Thread *thr); 612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid MutexBeforeLock(Thread *thr, uptr m, bool writelock); 632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid MutexAfterLock(Thread *thr, uptr m, bool writelock, bool trylock); 642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid MutexBeforeUnlock(Thread *thr, uptr m, bool writelock); 652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid MutexDestroy(Thread *thr, uptr m); 662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} // namespace __dsan 682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif // DD_RTL_H 69