1 //===-- POSIXThread.h -------------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef liblldb_POSIXThread_H_ 11 #define liblldb_POSIXThread_H_ 12 13 // C Includes 14 // C++ Includes 15 #include <memory> 16 #include <string> 17 18 // Other libraries and framework includes 19 #include "lldb/Target/Thread.h" 20 #include "RegisterContextPOSIX.h" 21 22 class ProcessMessage; 23 class ProcessMonitor; 24 class RegisterContextPOSIX; 25 26 //------------------------------------------------------------------------------ 27 // @class POSIXThread 28 // @brief Abstraction of a POSIX thread. 29 class POSIXThread 30 : public lldb_private::Thread 31 { 32 public: 33 POSIXThread(lldb_private::Process &process, lldb::tid_t tid); 34 35 virtual ~POSIXThread(); 36 37 void 38 RefreshStateAfterStop(); 39 40 virtual void 41 WillResume(lldb::StateType resume_state); 42 43 // This notifies the thread when a private stop occurs. 44 virtual void 45 DidStop (); 46 47 const char * 48 GetInfo(); 49 50 void 51 SetName (const char *name); 52 53 const char * 54 GetName (); 55 56 virtual lldb::RegisterContextSP 57 GetRegisterContext(); 58 59 virtual lldb::RegisterContextSP 60 CreateRegisterContextForFrame (lldb_private::StackFrame *frame); 61 62 //-------------------------------------------------------------------------- 63 // These functions provide a mapping from the register offset 64 // back to the register index or name for use in debugging or log 65 // output. 66 67 unsigned 68 GetRegisterIndexFromOffset(unsigned offset); 69 70 const char * 71 GetRegisterName(unsigned reg); 72 73 const char * 74 GetRegisterNameFromOffset(unsigned offset); 75 76 //-------------------------------------------------------------------------- 77 // These methods form a specialized interface to POSIX threads. 78 // 79 bool Resume(); 80 81 void Notify(const ProcessMessage &message); 82 83 //-------------------------------------------------------------------------- 84 // These methods provide an interface to watchpoints 85 // 86 bool EnableHardwareWatchpoint(lldb_private::Watchpoint *wp); 87 88 bool DisableHardwareWatchpoint(lldb_private::Watchpoint *wp); 89 90 uint32_t NumSupportedHardwareWatchpoints(); 91 92 uint32_t FindVacantWatchpointIndex(); 93 94 protected: 95 RegisterContextPOSIX * GetRegisterContextPOSIX()96 GetRegisterContextPOSIX () 97 { 98 if (!m_reg_context_sp) 99 m_reg_context_sp = GetRegisterContext(); 100 #if 0 101 return dynamic_cast<RegisterContextPOSIX*>(m_reg_context_sp.get()); 102 #endif 103 return (RegisterContextPOSIX *)m_reg_context_sp.get(); 104 } 105 106 std::unique_ptr<lldb_private::StackFrame> m_frame_ap; 107 108 lldb::BreakpointSiteSP m_breakpoint; 109 110 bool m_thread_name_valid; 111 std::string m_thread_name; 112 113 ProcessMonitor & 114 GetMonitor(); 115 116 virtual bool 117 CalculateStopInfo(); 118 119 void BreakNotify(const ProcessMessage &message); 120 void WatchNotify(const ProcessMessage &message); 121 virtual void TraceNotify(const ProcessMessage &message); 122 void LimboNotify(const ProcessMessage &message); 123 void SignalNotify(const ProcessMessage &message); 124 void SignalDeliveredNotify(const ProcessMessage &message); 125 void CrashNotify(const ProcessMessage &message); 126 void ThreadNotify(const ProcessMessage &message); 127 void ExitNotify(const ProcessMessage &message); 128 129 lldb_private::Unwind * 130 GetUnwinder(); 131 }; 132 133 #endif // #ifndef liblldb_POSIXThread_H_ 134