10b57cec5SDimitry Andric //===-- dd_rtl.h ----------------------------------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric #ifndef DD_RTL_H
90b57cec5SDimitry Andric #define DD_RTL_H
100b57cec5SDimitry Andric 
110b57cec5SDimitry Andric #include "sanitizer_common/sanitizer_internal_defs.h"
120b57cec5SDimitry Andric #include "sanitizer_common/sanitizer_deadlock_detector_interface.h"
130b57cec5SDimitry Andric #include "sanitizer_common/sanitizer_flags.h"
140b57cec5SDimitry Andric #include "sanitizer_common/sanitizer_allocator_internal.h"
150b57cec5SDimitry Andric #include "sanitizer_common/sanitizer_addrhashmap.h"
160b57cec5SDimitry Andric #include "sanitizer_common/sanitizer_mutex.h"
170b57cec5SDimitry Andric 
180b57cec5SDimitry Andric namespace __dsan {
190b57cec5SDimitry Andric 
200b57cec5SDimitry Andric typedef DDFlags Flags;
210b57cec5SDimitry Andric 
22349cc55cSDimitry Andric struct UserMutex {
230b57cec5SDimitry Andric   DDMutex dd;
240b57cec5SDimitry Andric };
250b57cec5SDimitry Andric 
260b57cec5SDimitry Andric struct Thread {
270b57cec5SDimitry Andric   DDPhysicalThread *dd_pt;
280b57cec5SDimitry Andric   DDLogicalThread *dd_lt;
290b57cec5SDimitry Andric 
300b57cec5SDimitry Andric   bool ignore_interceptors;
310b57cec5SDimitry Andric };
320b57cec5SDimitry Andric 
33e8d8bef9SDimitry Andric struct Callback final : public DDCallback {
340b57cec5SDimitry Andric   Thread *thr;
350b57cec5SDimitry Andric 
360b57cec5SDimitry Andric   Callback(Thread *thr);
370b57cec5SDimitry Andric   u32 Unwind() override;
380b57cec5SDimitry Andric };
390b57cec5SDimitry Andric 
40349cc55cSDimitry Andric typedef AddrHashMap<UserMutex, 31051> MutexHashMap;
410b57cec5SDimitry Andric 
420b57cec5SDimitry Andric struct Context {
430b57cec5SDimitry Andric   DDetector *dd;
440b57cec5SDimitry Andric 
45349cc55cSDimitry Andric   Mutex report_mutex;
460b57cec5SDimitry Andric   MutexHashMap mutex_map;
470b57cec5SDimitry Andric };
480b57cec5SDimitry Andric 
flags()490b57cec5SDimitry Andric inline Flags* flags() {
500b57cec5SDimitry Andric   static Flags flags;
510b57cec5SDimitry Andric   return &flags;
520b57cec5SDimitry Andric }
530b57cec5SDimitry Andric 
540b57cec5SDimitry Andric void Initialize();
550b57cec5SDimitry Andric void InitializeInterceptors();
560b57cec5SDimitry Andric 
570b57cec5SDimitry Andric void ThreadInit(Thread *thr);
580b57cec5SDimitry Andric void ThreadDestroy(Thread *thr);
590b57cec5SDimitry Andric 
600b57cec5SDimitry Andric void MutexBeforeLock(Thread *thr, uptr m, bool writelock);
610b57cec5SDimitry Andric void MutexAfterLock(Thread *thr, uptr m, bool writelock, bool trylock);
620b57cec5SDimitry Andric void MutexBeforeUnlock(Thread *thr, uptr m, bool writelock);
630b57cec5SDimitry Andric void MutexDestroy(Thread *thr, uptr m);
640b57cec5SDimitry Andric 
650b57cec5SDimitry Andric }  // namespace __dsan
660b57cec5SDimitry Andric #endif  // DD_RTL_H
67