ProcessPOSIX.h revision 269024
1//===-- ProcessPOSIX.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_ProcessPOSIX_H_ 11#define liblldb_ProcessPOSIX_H_ 12 13// C Includes 14 15// C++ Includes 16#include <queue> 17#include <set> 18 19// Other libraries and framework includes 20#include "lldb/Target/Process.h" 21#include "lldb/Target/UnixSignals.h" 22#include "ProcessMessage.h" 23 24class ProcessMonitor; 25class POSIXThread; 26 27class ProcessPOSIX : 28 public lldb_private::Process 29{ 30public: 31 32 //------------------------------------------------------------------ 33 // Constructors and destructors 34 //------------------------------------------------------------------ 35 ProcessPOSIX(lldb_private::Target& target, 36 lldb_private::Listener &listener); 37 38 virtual 39 ~ProcessPOSIX(); 40 41 //------------------------------------------------------------------ 42 // Process protocol. 43 //------------------------------------------------------------------ 44 virtual void 45 Finalize(); 46 47 virtual bool 48 CanDebug(lldb_private::Target &target, bool plugin_specified_by_name); 49 50 virtual lldb_private::Error 51 WillLaunch(lldb_private::Module *module); 52 53 virtual lldb_private::Error 54 DoAttachToProcessWithID(lldb::pid_t pid); 55 56 virtual lldb_private::Error 57 DoAttachToProcessWithID (lldb::pid_t pid, const lldb_private::ProcessAttachInfo &attach_info); 58 59 virtual lldb_private::Error 60 DoLaunch (lldb_private::Module *exe_module, 61 lldb_private::ProcessLaunchInfo &launch_info); 62 63 virtual void 64 DidLaunch(); 65 66 virtual lldb_private::Error 67 DoResume(); 68 69 virtual lldb_private::Error 70 DoHalt(bool &caused_stop); 71 72 virtual lldb_private::Error 73 DoDetach(bool keep_stopped) = 0; 74 75 virtual lldb_private::Error 76 DoSignal(int signal); 77 78 virtual lldb_private::Error 79 DoDestroy(); 80 81 virtual void 82 DoDidExec(); 83 84 virtual void 85 RefreshStateAfterStop(); 86 87 virtual bool 88 IsAlive(); 89 90 virtual size_t 91 DoReadMemory(lldb::addr_t vm_addr, 92 void *buf, 93 size_t size, 94 lldb_private::Error &error); 95 96 virtual size_t 97 DoWriteMemory(lldb::addr_t vm_addr, const void *buf, size_t size, 98 lldb_private::Error &error); 99 100 virtual lldb::addr_t 101 DoAllocateMemory(size_t size, uint32_t permissions, 102 lldb_private::Error &error); 103 104 virtual lldb_private::Error 105 DoDeallocateMemory(lldb::addr_t ptr); 106 107 virtual size_t 108 GetSoftwareBreakpointTrapOpcode(lldb_private::BreakpointSite* bp_site); 109 110 virtual lldb_private::Error 111 EnableBreakpointSite(lldb_private::BreakpointSite *bp_site); 112 113 virtual lldb_private::Error 114 DisableBreakpointSite(lldb_private::BreakpointSite *bp_site); 115 116 virtual lldb_private::Error 117 EnableWatchpoint(lldb_private::Watchpoint *wp, bool notify = true); 118 119 virtual lldb_private::Error 120 DisableWatchpoint(lldb_private::Watchpoint *wp, bool notify = true); 121 122 virtual lldb_private::Error 123 GetWatchpointSupportInfo(uint32_t &num); 124 125 virtual lldb_private::Error 126 GetWatchpointSupportInfo(uint32_t &num, bool &after); 127 128 virtual uint32_t 129 UpdateThreadListIfNeeded(); 130 131 virtual bool 132 UpdateThreadList(lldb_private::ThreadList &old_thread_list, 133 lldb_private::ThreadList &new_thread_list) = 0; 134 135 virtual lldb::ByteOrder 136 GetByteOrder() const; 137 138 virtual lldb::addr_t 139 GetImageInfoAddress(); 140 141 virtual size_t 142 PutSTDIN(const char *buf, size_t len, lldb_private::Error &error); 143 144 //-------------------------------------------------------------------------- 145 // ProcessPOSIX internal API. 146 147 /// Registers the given message with this process. 148 virtual void 149 SendMessage(const ProcessMessage &message); 150 151 ProcessMonitor & 152 GetMonitor() { assert(m_monitor); return *m_monitor; } 153 154 lldb_private::UnixSignals & 155 GetUnixSignals(); 156 157 const char * 158 GetFilePath(const lldb_private::ProcessLaunchInfo::FileAction *file_action, 159 const char *default_path); 160 161 /// Stops all threads in the process. 162 /// The \p stop_tid parameter indicates the thread which initiated the stop. 163 virtual void 164 StopAllThreads(lldb::tid_t stop_tid); 165 166 /// Adds the thread to the list of threads for which we have received the initial stopping signal. 167 /// The \p stop_tid paramter indicates the thread which the stop happened for. 168 bool 169 AddThreadForInitialStopIfNeeded(lldb::tid_t stop_tid); 170 171 bool 172 WaitingForInitialStop(lldb::tid_t stop_tid); 173 174 virtual POSIXThread * 175 CreateNewPOSIXThread(lldb_private::Process &process, lldb::tid_t tid); 176 177protected: 178 /// Target byte order. 179 lldb::ByteOrder m_byte_order; 180 181 /// Process monitor; 182 ProcessMonitor *m_monitor; 183 184 /// The module we are executing. 185 lldb_private::Module *m_module; 186 187 /// Message queue notifying this instance of inferior process state changes. 188 lldb_private::Mutex m_message_mutex; 189 std::queue<ProcessMessage> m_message_queue; 190 191 /// Drive any exit events to completion. 192 bool m_exit_now; 193 194 /// OS-specific signal set. 195 lldb_private::UnixSignals m_signals; 196 197 /// Returns true if the process has exited. 198 bool HasExited(); 199 200 /// Returns true if the process is stopped. 201 bool IsStopped(); 202 203 /// Returns true if at least one running is currently running 204 bool IsAThreadRunning(); 205 206 typedef std::map<lldb::addr_t, lldb::addr_t> MMapMap; 207 MMapMap m_addr_to_mmap_size; 208 209 typedef std::set<lldb::tid_t> ThreadStopSet; 210 /// Every thread begins with a stop signal. This keeps track 211 /// of the threads for which we have received the stop signal. 212 ThreadStopSet m_seen_initial_stop; 213}; 214 215#endif // liblldb_MacOSXProcess_H_ 216