1 //===-- dfsan_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 DataFlowSanitizer. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef DFSAN_THREAD_H 14 #define DFSAN_THREAD_H 15 16 #include "dfsan_allocator.h" 17 #include "sanitizer_common/sanitizer_common.h" 18 #include "sanitizer_common/sanitizer_posix.h" 19 20 namespace __dfsan { 21 22 class DFsanThread { 23 public: 24 // NOTE: There is no DFsanThread constructor. It is allocated 25 // via mmap() and *must* be valid in zero-initialized state. 26 27 static DFsanThread *Create(void *start_routine_trampoline, 28 thread_callback_t start_routine, void *arg, 29 bool track_origins = false); 30 static void TSDDtor(void *tsd); 31 void Destroy(); 32 33 void Init(); // Should be called from the thread itself. 34 thread_return_t ThreadStart(); 35 36 uptr stack_top(); 37 uptr stack_bottom(); 38 uptr tls_begin() { return tls_begin_; } 39 uptr tls_end() { return tls_end_; } 40 bool IsMainThread() { return start_routine_ == nullptr; } 41 42 bool InSignalHandler() { return in_signal_handler_; } 43 void EnterSignalHandler() { in_signal_handler_++; } 44 void LeaveSignalHandler() { in_signal_handler_--; } 45 46 DFsanThreadLocalMallocStorage &malloc_storage() { return malloc_storage_; } 47 48 int destructor_iterations_; 49 __sanitizer_sigset_t starting_sigset_; 50 51 private: 52 void SetThreadStackAndTls(); 53 void ClearShadowForThreadStackAndTLS(); 54 struct StackBounds { 55 uptr bottom; 56 uptr top; 57 }; 58 StackBounds GetStackBounds() const; 59 60 bool AddrIsInStack(uptr addr); 61 62 void *start_routine_trampoline_; 63 thread_callback_t start_routine_; 64 void *arg_; 65 bool track_origins_; 66 67 StackBounds stack_; 68 69 uptr tls_begin_; 70 uptr tls_end_; 71 72 unsigned in_signal_handler_; 73 74 DFsanThreadLocalMallocStorage malloc_storage_; 75 }; 76 77 DFsanThread *GetCurrentThread(); 78 void SetCurrentThread(DFsanThread *t); 79 void DFsanTSDInit(void (*destructor)(void *tsd)); 80 void DFsanTSDDtor(void *tsd); 81 82 } // namespace __dfsan 83 84 #endif // DFSAN_THREAD_H 85