123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- //===-- dfsan_thread.h ------------------------------------------*- C++ -*-===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- //
- // This file is a part of DataFlowSanitizer.
- //
- //===----------------------------------------------------------------------===//
- #ifndef DFSAN_THREAD_H
- #define DFSAN_THREAD_H
- #include "dfsan_allocator.h"
- #include "sanitizer_common/sanitizer_common.h"
- #include "sanitizer_common/sanitizer_posix.h"
- namespace __dfsan {
- class DFsanThread {
- public:
- // NOTE: There is no DFsanThread constructor. It is allocated
- // via mmap() and *must* be valid in zero-initialized state.
- static DFsanThread *Create(void *start_routine_trampoline,
- thread_callback_t start_routine, void *arg,
- bool track_origins = false);
- static void TSDDtor(void *tsd);
- void Destroy();
- void Init(); // Should be called from the thread itself.
- thread_return_t ThreadStart();
- uptr stack_top();
- uptr stack_bottom();
- uptr tls_begin() { return tls_begin_; }
- uptr tls_end() { return tls_end_; }
- bool IsMainThread() { return start_routine_ == nullptr; }
- bool InSignalHandler() { return in_signal_handler_; }
- void EnterSignalHandler() { in_signal_handler_++; }
- void LeaveSignalHandler() { in_signal_handler_--; }
- DFsanThreadLocalMallocStorage &malloc_storage() { return malloc_storage_; }
- int destructor_iterations_;
- __sanitizer_sigset_t starting_sigset_;
- private:
- void SetThreadStackAndTls();
- void ClearShadowForThreadStackAndTLS();
- struct StackBounds {
- uptr bottom;
- uptr top;
- };
- StackBounds GetStackBounds() const;
- bool AddrIsInStack(uptr addr);
- void *start_routine_trampoline_;
- thread_callback_t start_routine_;
- void *arg_;
- bool track_origins_;
- StackBounds stack_;
- uptr tls_begin_;
- uptr tls_end_;
- unsigned in_signal_handler_;
- DFsanThreadLocalMallocStorage malloc_storage_;
- };
- DFsanThread *GetCurrentThread();
- void SetCurrentThread(DFsanThread *t);
- void DFsanTSDInit(void (*destructor)(void *tsd));
- void DFsanTSDDtor(void *tsd);
- } // namespace __dfsan
- #endif // DFSAN_THREAD_H
|