brintos

brintos / llvm-project-archived public Read only

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