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