1276789Sdim//===-- msan_thread.h -------------------------------------------*- C++ -*-===// 2276789Sdim// 3276789Sdim// The LLVM Compiler Infrastructure 4276789Sdim// 5276789Sdim// This file is distributed under the University of Illinois Open Source 6276789Sdim// License. See LICENSE.TXT for details. 7276789Sdim// 8276789Sdim//===----------------------------------------------------------------------===// 9276789Sdim// 10276789Sdim// This file is a part of MemorySanitizer. 11276789Sdim// 12276789Sdim//===----------------------------------------------------------------------===// 13276789Sdim 14276789Sdim#ifndef MSAN_THREAD_H 15276789Sdim#define MSAN_THREAD_H 16276789Sdim 17276789Sdim#include "msan_allocator.h" 18276789Sdim#include "sanitizer_common/sanitizer_common.h" 19276789Sdim 20276789Sdimnamespace __msan { 21276789Sdim 22276789Sdimclass MsanThread { 23276789Sdim public: 24276789Sdim static MsanThread *Create(thread_callback_t start_routine, void *arg); 25276789Sdim static void TSDDtor(void *tsd); 26276789Sdim void Destroy(); 27276789Sdim 28276789Sdim void Init(); // Should be called from the thread itself. 29276789Sdim thread_return_t ThreadStart(); 30276789Sdim 31276789Sdim uptr stack_top() { return stack_top_; } 32276789Sdim uptr stack_bottom() { return stack_bottom_; } 33276789Sdim uptr tls_begin() { return tls_begin_; } 34276789Sdim uptr tls_end() { return tls_end_; } 35296417Sdim bool IsMainThread() { return start_routine_ == nullptr; } 36276789Sdim 37276789Sdim bool AddrIsInStack(uptr addr) { 38276789Sdim return addr >= stack_bottom_ && addr < stack_top_; 39276789Sdim } 40276789Sdim 41276789Sdim bool InSignalHandler() { return in_signal_handler_; } 42276789Sdim void EnterSignalHandler() { in_signal_handler_++; } 43276789Sdim void LeaveSignalHandler() { in_signal_handler_--; } 44276789Sdim 45276789Sdim MsanThreadLocalMallocStorage &malloc_storage() { return malloc_storage_; } 46276789Sdim 47276789Sdim int destructor_iterations_; 48276789Sdim 49276789Sdim private: 50276789Sdim // NOTE: There is no MsanThread constructor. It is allocated 51276789Sdim // via mmap() and *must* be valid in zero-initialized state. 52276789Sdim void SetThreadStackAndTls(); 53276789Sdim void ClearShadowForThreadStackAndTLS(); 54276789Sdim thread_callback_t start_routine_; 55276789Sdim void *arg_; 56276789Sdim uptr stack_top_; 57276789Sdim uptr stack_bottom_; 58276789Sdim uptr tls_begin_; 59276789Sdim uptr tls_end_; 60276789Sdim 61276789Sdim unsigned in_signal_handler_; 62276789Sdim 63276789Sdim MsanThreadLocalMallocStorage malloc_storage_; 64276789Sdim}; 65276789Sdim 66276789SdimMsanThread *GetCurrentThread(); 67276789Sdimvoid SetCurrentThread(MsanThread *t); 68276789Sdim 69276789Sdim} // namespace __msan 70276789Sdim 71276789Sdim#endif // MSAN_THREAD_H 72