12341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//===-- POSIXThread.h -------------------------------------------*- C++ -*-===// 22341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// 32341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// The LLVM Compiler Infrastructure 42341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// 52341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// This file is distributed under the University of Illinois Open Source 62341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// License. See LICENSE.TXT for details. 72341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// 82341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//===----------------------------------------------------------------------===// 92341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 102341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#ifndef liblldb_POSIXThread_H_ 112341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#define liblldb_POSIXThread_H_ 122341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 132341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// C Includes 142341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// C++ Includes 152341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include <memory> 160ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopec#include <string> 172341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 182341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// Other libraries and framework includes 192341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "lldb/Target/Thread.h" 202341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "RegisterContextPOSIX.h" 212341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 222341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenclass ProcessMessage; 232341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenclass ProcessMonitor; 242341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenclass RegisterContextPOSIX; 252341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 262341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//------------------------------------------------------------------------------ 272341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// @class POSIXThread 2843d853f67b3b176ee6c258fea52ffdefb810a915Ed Maste// @brief Abstraction of a POSIX thread. 292341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenclass POSIXThread 302341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen : public lldb_private::Thread 312341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{ 322341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenpublic: 335e91e379b3be10738ab5aeae87b47001de16cd7cGreg Clayton POSIXThread(lldb_private::Process &process, lldb::tid_t tid); 342341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 352341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual ~POSIXThread(); 362341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 372341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen void 382341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen RefreshStateAfterStop(); 392341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 40a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton virtual void 412341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen WillResume(lldb::StateType resume_state); 422341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 433bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor // This notifies the thread when a private stop occurs. 443bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor virtual void 453bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor DidStop (); 463bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor 472341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen const char * 482341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen GetInfo(); 492341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 500ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopec void 510ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopec SetName (const char *name); 520ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopec 530ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopec const char * 540ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopec GetName (); 550ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopec 562341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual lldb::RegisterContextSP 572341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen GetRegisterContext(); 582341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 592341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen virtual lldb::RegisterContextSP 602341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen CreateRegisterContextForFrame (lldb_private::StackFrame *frame); 612341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 622341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen //-------------------------------------------------------------------------- 63c73fedb63ab170d711fb73d198451eb8db710e8dAshok Thirumurthi // These functions provide a mapping from the register offset 642341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen // back to the register index or name for use in debugging or log 652341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen // output. 662341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 67c73fedb63ab170d711fb73d198451eb8db710e8dAshok Thirumurthi unsigned 682341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen GetRegisterIndexFromOffset(unsigned offset); 692341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 70c73fedb63ab170d711fb73d198451eb8db710e8dAshok Thirumurthi const char * 712341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen GetRegisterName(unsigned reg); 722341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 73c73fedb63ab170d711fb73d198451eb8db710e8dAshok Thirumurthi const char * 742341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen GetRegisterNameFromOffset(unsigned offset); 752341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 762341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen //-------------------------------------------------------------------------- 7743d853f67b3b176ee6c258fea52ffdefb810a915Ed Maste // These methods form a specialized interface to POSIX threads. 782341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen // 792341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen bool Resume(); 802341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 812341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen void Notify(const ProcessMessage &message); 822341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 833d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec //-------------------------------------------------------------------------- 843d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec // These methods provide an interface to watchpoints 853d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec // 863d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec bool EnableHardwareWatchpoint(lldb_private::Watchpoint *wp); 873d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec 883d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec bool DisableHardwareWatchpoint(lldb_private::Watchpoint *wp); 893d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec 903d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec uint32_t NumSupportedHardwareWatchpoints(); 913d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec 9212c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec uint32_t FindVacantWatchpointIndex(); 9312c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec 944349bcb8ec51f3fd447b511b2ce8292a92d3c771Michael Sartainprotected: 952341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen RegisterContextPOSIX * 962341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen GetRegisterContextPOSIX () 972341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen { 982341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen if (!m_reg_context_sp) 992341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen m_reg_context_sp = GetRegisterContext(); 1002341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#if 0 1012341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen return dynamic_cast<RegisterContextPOSIX*>(m_reg_context_sp.get()); 1022341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#endif 1032341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen return (RegisterContextPOSIX *)m_reg_context_sp.get(); 1042341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen } 1052341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 106102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton std::unique_ptr<lldb_private::StackFrame> m_frame_ap; 1072341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1082341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb::BreakpointSiteSP m_breakpoint; 1092341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1104349bcb8ec51f3fd447b511b2ce8292a92d3c771Michael Sartain bool m_thread_name_valid; 1110ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopec std::string m_thread_name; 1120ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopec 1132341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen ProcessMonitor & 1142341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen GetMonitor(); 1152341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 116863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton virtual bool 117863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton CalculateStopInfo(); 1182341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1192341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen void BreakNotify(const ProcessMessage &message); 1203d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec void WatchNotify(const ProcessMessage &message); 1214349bcb8ec51f3fd447b511b2ce8292a92d3c771Michael Sartain virtual void TraceNotify(const ProcessMessage &message); 1222341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen void LimboNotify(const ProcessMessage &message); 1232341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen void SignalNotify(const ProcessMessage &message); 1242341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen void SignalDeliveredNotify(const ProcessMessage &message); 1252341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen void CrashNotify(const ProcessMessage &message); 126f1fda3748c39c92d2e79aeba0715baffabd3286bMatt Kopec void ThreadNotify(const ProcessMessage &message); 1273bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor void ExitNotify(const ProcessMessage &message); 1282341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1292341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb_private::Unwind * 1302341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen GetUnwinder(); 1312341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}; 1322341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1332341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#endif // #ifndef liblldb_POSIXThread_H_ 134