1//===-- dd_rtl.h ----------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8#ifndef DD_RTL_H
9#define DD_RTL_H
10
11#include "sanitizer_common/sanitizer_internal_defs.h"
12#include "sanitizer_common/sanitizer_deadlock_detector_interface.h"
13#include "sanitizer_common/sanitizer_flags.h"
14#include "sanitizer_common/sanitizer_allocator_internal.h"
15#include "sanitizer_common/sanitizer_addrhashmap.h"
16#include "sanitizer_common/sanitizer_mutex.h"
17
18namespace __dsan {
19
20typedef DDFlags Flags;
21
22struct Mutex {
23  DDMutex dd;
24};
25
26struct Thread {
27  DDPhysicalThread *dd_pt;
28  DDLogicalThread *dd_lt;
29
30  bool ignore_interceptors;
31};
32
33struct Callback : DDCallback {
34  Thread *thr;
35
36  Callback(Thread *thr);
37  u32 Unwind() override;
38};
39
40typedef AddrHashMap<Mutex, 31051> MutexHashMap;
41
42struct Context {
43  DDetector *dd;
44
45  BlockingMutex report_mutex;
46  MutexHashMap mutex_map;
47};
48
49inline Flags* flags() {
50  static Flags flags;
51  return &flags;
52}
53
54void Initialize();
55void InitializeInterceptors();
56
57void ThreadInit(Thread *thr);
58void ThreadDestroy(Thread *thr);
59
60void MutexBeforeLock(Thread *thr, uptr m, bool writelock);
61void MutexAfterLock(Thread *thr, uptr m, bool writelock, bool trylock);
62void MutexBeforeUnlock(Thread *thr, uptr m, bool writelock);
63void MutexDestroy(Thread *thr, uptr m);
64
65}  // namespace __dsan
66#endif  // DD_RTL_H
67