1 //===-- dfsan_thread.h ------------------------------------------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 // This file is a part of DataFlowSanitizer.
11 //===----------------------------------------------------------------------===//
13 #ifndef DFSAN_THREAD_H
14 #define DFSAN_THREAD_H
16 #include "dfsan_allocator.h"
17 #include "sanitizer_common/sanitizer_common.h"
18 #include "sanitizer_common/sanitizer_posix.h"
24 // NOTE: There is no DFsanThread constructor. It is allocated
25 // via mmap() and *must* be valid in zero-initialized state.
27 static DFsanThread
*Create(thread_callback_t start_routine
, void *arg
,
28 bool track_origins
= false);
29 static void TSDDtor(void *tsd
);
32 void Init(); // Should be called from the thread itself.
33 thread_return_t
ThreadStart();
37 uptr
tls_begin() { return tls_begin_
; }
38 uptr
tls_end() { return tls_end_
; }
39 bool IsMainThread() { return start_routine_
== nullptr; }
41 bool InSignalHandler() { return in_signal_handler_
; }
42 void EnterSignalHandler() { in_signal_handler_
++; }
43 void LeaveSignalHandler() { in_signal_handler_
--; }
45 DFsanThreadLocalMallocStorage
&malloc_storage() { return malloc_storage_
; }
47 int destructor_iterations_
;
48 __sanitizer_sigset_t starting_sigset_
;
51 void SetThreadStackAndTls();
52 void ClearShadowForThreadStackAndTLS();
57 StackBounds
GetStackBounds() const;
59 bool AddrIsInStack(uptr addr
);
61 thread_callback_t start_routine_
;
70 unsigned in_signal_handler_
;
72 DFsanThreadLocalMallocStorage malloc_storage_
;
75 DFsanThread
*GetCurrentThread();
76 void SetCurrentThread(DFsanThread
*t
);
77 void DFsanTSDInit(void (*destructor
)(void *tsd
));
78 void DFsanTSDDtor(void *tsd
);
80 } // namespace __dfsan
82 #endif // DFSAN_THREAD_H