forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			72 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
//===-- msan_thread.h -------------------------------------------*- C++ -*-===//
 | 
						|
//
 | 
						|
//                     The LLVM Compiler Infrastructure
 | 
						|
//
 | 
						|
// This file is distributed under the University of Illinois Open Source
 | 
						|
// License. See LICENSE.TXT for details.
 | 
						|
//
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
//
 | 
						|
// This file is a part of MemorySanitizer.
 | 
						|
//
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
 | 
						|
#ifndef MSAN_THREAD_H
 | 
						|
#define MSAN_THREAD_H
 | 
						|
 | 
						|
#include "msan_allocator.h"
 | 
						|
#include "sanitizer_common/sanitizer_common.h"
 | 
						|
 | 
						|
namespace __msan {
 | 
						|
 | 
						|
class MsanThread {
 | 
						|
 public:
 | 
						|
  static MsanThread *Create(thread_callback_t start_routine, void *arg);
 | 
						|
  static void TSDDtor(void *tsd);
 | 
						|
  void Destroy();
 | 
						|
 | 
						|
  void Init();  // Should be called from the thread itself.
 | 
						|
  thread_return_t ThreadStart();
 | 
						|
 | 
						|
  uptr stack_top() { return stack_top_; }
 | 
						|
  uptr stack_bottom() { return stack_bottom_; }
 | 
						|
  uptr tls_begin() { return tls_begin_; }
 | 
						|
  uptr tls_end() { return tls_end_; }
 | 
						|
  bool IsMainThread() { return start_routine_ == nullptr; }
 | 
						|
 | 
						|
  bool AddrIsInStack(uptr addr) {
 | 
						|
    return addr >= stack_bottom_ && addr < stack_top_;
 | 
						|
  }
 | 
						|
 | 
						|
  bool InSignalHandler() { return in_signal_handler_; }
 | 
						|
  void EnterSignalHandler() { in_signal_handler_++; }
 | 
						|
  void LeaveSignalHandler() { in_signal_handler_--; }
 | 
						|
 | 
						|
  MsanThreadLocalMallocStorage &malloc_storage() { return malloc_storage_; }
 | 
						|
 | 
						|
  int destructor_iterations_;
 | 
						|
 | 
						|
 private:
 | 
						|
  // NOTE: There is no MsanThread constructor. It is allocated
 | 
						|
  // via mmap() and *must* be valid in zero-initialized state.
 | 
						|
  void SetThreadStackAndTls();
 | 
						|
  void ClearShadowForThreadStackAndTLS();
 | 
						|
  thread_callback_t start_routine_;
 | 
						|
  void *arg_;
 | 
						|
  uptr stack_top_;
 | 
						|
  uptr stack_bottom_;
 | 
						|
  uptr tls_begin_;
 | 
						|
  uptr tls_end_;
 | 
						|
 | 
						|
  unsigned in_signal_handler_;
 | 
						|
 | 
						|
  MsanThreadLocalMallocStorage malloc_storage_;
 | 
						|
};
 | 
						|
 | 
						|
MsanThread *GetCurrentThread();
 | 
						|
void SetCurrentThread(MsanThread *t);
 | 
						|
 | 
						|
} // namespace __msan
 | 
						|
 | 
						|
#endif // MSAN_THREAD_H
 |