74 lines · c
1//===- nsan_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-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef NSAN_THREAD_H10#define NSAN_THREAD_H11 12#include "nsan_allocator.h"13#include "sanitizer_common/sanitizer_common.h"14#include "sanitizer_common/sanitizer_posix.h"15 16namespace __nsan {17 18class NsanThread {19public:20 static NsanThread *Create(thread_callback_t start_routine, void *arg);21 static void TSDDtor(void *tsd);22 void Destroy();23 24 void Init(); // Should be called from the thread itself.25 thread_return_t ThreadStart();26 27 uptr stack_top();28 uptr stack_bottom();29 uptr tls_begin() { return tls_begin_; }30 uptr tls_end() { return tls_end_; }31 bool IsMainThread() { return start_routine_ == nullptr; }32 33 bool AddrIsInStack(uptr addr);34 35 void StartSwitchFiber(uptr bottom, uptr size);36 void FinishSwitchFiber(uptr *bottom_old, uptr *size_old);37 38 NsanThreadLocalMallocStorage &malloc_storage() { return malloc_storage_; }39 40 int destructor_iterations_;41 __sanitizer_sigset_t starting_sigset_;42 43private:44 void SetThreadStackAndTls();45 void ClearShadowForThreadStackAndTLS();46 struct StackBounds {47 uptr bottom;48 uptr top;49 };50 StackBounds GetStackBounds() const;51 52 thread_callback_t start_routine_;53 void *arg_;54 55 bool stack_switching_;56 57 StackBounds stack_;58 StackBounds next_stack_;59 60 uptr tls_begin_;61 uptr tls_end_;62 63 NsanThreadLocalMallocStorage malloc_storage_;64};65 66NsanThread *GetCurrentThread();67void SetCurrentThread(NsanThread *t);68void NsanTSDInit(void (*destructor)(void *tsd));69void NsanTSDDtor(void *tsd);70 71} // namespace __nsan72 73#endif // NSAN_THREAD_H74