1 1.1 kamil //===-- msan_thread.h -------------------------------------------*- C++ -*-===// 2 1.1 kamil // 3 1.1 kamil // The LLVM Compiler Infrastructure 4 1.1 kamil // 5 1.1 kamil // This file is distributed under the University of Illinois Open Source 6 1.1 kamil // License. See LICENSE.TXT for details. 7 1.1 kamil // 8 1.1 kamil //===----------------------------------------------------------------------===// 9 1.1 kamil // 10 1.1 kamil // This file is a part of MemorySanitizer. 11 1.1 kamil // 12 1.1 kamil //===----------------------------------------------------------------------===// 13 1.1 kamil 14 1.1 kamil #ifndef MSAN_THREAD_H 15 1.1 kamil #define MSAN_THREAD_H 16 1.1 kamil 17 1.1 kamil #include "msan_allocator.h" 18 1.1 kamil #include "sanitizer_common/sanitizer_common.h" 19 1.1 kamil 20 1.1 kamil namespace __msan { 21 1.1 kamil 22 1.1 kamil class MsanThread { 23 1.1 kamil public: 24 1.1 kamil static MsanThread *Create(thread_callback_t start_routine, void *arg); 25 1.1 kamil static void TSDDtor(void *tsd); 26 1.1 kamil void Destroy(); 27 1.1 kamil 28 1.1 kamil void Init(); // Should be called from the thread itself. 29 1.1 kamil thread_return_t ThreadStart(); 30 1.1 kamil 31 1.1 kamil uptr stack_top() { return stack_top_; } 32 1.1 kamil uptr stack_bottom() { return stack_bottom_; } 33 1.1 kamil uptr tls_begin() { return tls_begin_; } 34 1.1 kamil uptr tls_end() { return tls_end_; } 35 1.1 kamil bool IsMainThread() { return start_routine_ == nullptr; } 36 1.1 kamil 37 1.1 kamil bool AddrIsInStack(uptr addr) { 38 1.1 kamil return addr >= stack_bottom_ && addr < stack_top_; 39 1.1 kamil } 40 1.1 kamil 41 1.1 kamil bool InSignalHandler() { return in_signal_handler_; } 42 1.1 kamil void EnterSignalHandler() { in_signal_handler_++; } 43 1.1 kamil void LeaveSignalHandler() { in_signal_handler_--; } 44 1.1 kamil 45 1.1 kamil MsanThreadLocalMallocStorage &malloc_storage() { return malloc_storage_; } 46 1.1 kamil 47 1.1 kamil int destructor_iterations_; 48 1.1 kamil 49 1.1 kamil private: 50 1.1 kamil // NOTE: There is no MsanThread constructor. It is allocated 51 1.1 kamil // via mmap() and *must* be valid in zero-initialized state. 52 1.1 kamil void SetThreadStackAndTls(); 53 1.1 kamil void ClearShadowForThreadStackAndTLS(); 54 1.1 kamil thread_callback_t start_routine_; 55 1.1 kamil void *arg_; 56 1.1 kamil uptr stack_top_; 57 1.1 kamil uptr stack_bottom_; 58 1.1 kamil uptr tls_begin_; 59 1.1 kamil uptr tls_end_; 60 1.1 kamil 61 1.1 kamil unsigned in_signal_handler_; 62 1.1 kamil 63 1.1 kamil MsanThreadLocalMallocStorage malloc_storage_; 64 1.1 kamil }; 65 1.1 kamil 66 1.1 kamil MsanThread *GetCurrentThread(); 67 1.1 kamil void SetCurrentThread(MsanThread *t); 68 1.1 kamil 69 1.1 kamil } // namespace __msan 70 1.1 kamil 71 1.1 kamil #endif // MSAN_THREAD_H 72