forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			58 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===-- SingleStepCheck.h ------------------------------------- -*- C++ -*-===//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open Source
 | |
| // License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #ifndef liblldb_SingleStepCheck_H_
 | |
| #define liblldb_SingleStepCheck_H_
 | |
| 
 | |
| #include <memory>
 | |
| #include <sched.h>
 | |
| #include <sys/types.h>
 | |
| 
 | |
| namespace lldb_private {
 | |
| namespace process_linux {
 | |
| 
 | |
| // arm64 linux had a bug which prevented single-stepping and watchpoints from
 | |
| // working on non-boot cpus, due to them being incorrectly initialized after
 | |
| // coming out of suspend.  This issue is particularly affecting android M, which
 | |
| // uses suspend ("doze mode") quite aggressively. This code detects that
 | |
| // situation and makes single-stepping work by doing all the step operations on
 | |
| // the boot cpu.
 | |
| //
 | |
| // The underlying issue has been fixed in android N and linux 4.4. This code can
 | |
| // be removed once these systems become obsolete.
 | |
| 
 | |
| #if defined(__arm64__) || defined(__aarch64__)
 | |
| class SingleStepWorkaround {
 | |
|   ::pid_t m_tid;
 | |
|   cpu_set_t m_original_set;
 | |
| 
 | |
|   SingleStepWorkaround(const SingleStepWorkaround &) = delete;
 | |
|   void operator=(const SingleStepWorkaround &) = delete;
 | |
| 
 | |
| public:
 | |
|   SingleStepWorkaround(::pid_t tid, cpu_set_t original_set)
 | |
|       : m_tid(tid), m_original_set(original_set) {}
 | |
|   ~SingleStepWorkaround();
 | |
| 
 | |
|   static std::unique_ptr<SingleStepWorkaround> Get(::pid_t tid);
 | |
| };
 | |
| #else
 | |
| class SingleStepWorkaround {
 | |
| public:
 | |
|   static std::unique_ptr<SingleStepWorkaround> Get(::pid_t tid) {
 | |
|     return nullptr;
 | |
|   }
 | |
| };
 | |
| #endif
 | |
| 
 | |
| } // end namespace process_linux
 | |
| } // end namespace lldb_private
 | |
| 
 | |
| #endif // #ifndef liblldb_SingleStepCheck_H_
 |