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