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