blob: 05907526594bf0430f644f43290c3925a01618a2 [file] [log] [blame]
Greg Clayton269f91e2011-07-15 18:02:58 +00001//===-- ProcessKDP.h --------------------------------------------*- C++ -*-===//
Greg Clayton363be3f2011-07-15 03:27:12 +00002//
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_ProcessKDP_h_
11#define liblldb_ProcessKDP_h_
12
13// C Includes
14
15// C++ Includes
16#include <list>
17#include <vector>
18
19// Other libraries and framework includes
20#include "lldb/Core/ArchSpec.h"
21#include "lldb/Core/Broadcaster.h"
22#include "lldb/Core/Error.h"
23#include "lldb/Core/InputReader.h"
24#include "lldb/Core/StreamString.h"
25#include "lldb/Core/StringList.h"
26#include "lldb/Core/ThreadSafeValue.h"
27#include "lldb/Target/Process.h"
28#include "lldb/Target/Thread.h"
29
30#include "CommunicationKDP.h"
31#include "Utility/StringExtractor.h"
32
33class ThreadKDP;
34
35class ProcessKDP : public lldb_private::Process
36{
37public:
38 //------------------------------------------------------------------
39 // Constructors and Destructors
40 //------------------------------------------------------------------
41 static Process*
42 CreateInstance (lldb_private::Target& target, lldb_private::Listener &listener);
43
44 static void
45 Initialize();
46
47 static void
48 Terminate();
49
50 static const char *
51 GetPluginNameStatic();
52
53 static const char *
54 GetPluginDescriptionStatic();
55
56 //------------------------------------------------------------------
57 // Constructors and Destructors
58 //------------------------------------------------------------------
59 ProcessKDP(lldb_private::Target& target, lldb_private::Listener &listener);
60
61 virtual
62 ~ProcessKDP();
63
64 //------------------------------------------------------------------
65 // Check if a given Process
66 //------------------------------------------------------------------
67 virtual bool
Greg Clayton8d2ea282011-07-17 20:36:25 +000068 CanDebug (lldb_private::Target &target,
69 bool plugin_specified_by_name);
Greg Clayton363be3f2011-07-15 03:27:12 +000070
71 // virtual uint32_t
72 // ListProcessesMatchingName (const char *name, lldb_private::StringList &matches, std::vector<lldb::pid_t> &pids);
73
74 //------------------------------------------------------------------
75 // Creating a new process, or attaching to an existing one
76 //------------------------------------------------------------------
77 virtual lldb_private::Error
78 WillLaunch (lldb_private::Module* module);
79
80 virtual lldb_private::Error
81 DoLaunch (lldb_private::Module* module,
82 char const *argv[], // Can be NULL
83 char const *envp[], // Can be NULL
84 uint32_t flags,
85 const char *stdin_path, // Can be NULL
86 const char *stdout_path, // Can be NULL
87 const char *stderr_path, // Can be NULL
88 const char *working_dir); // Can be NULL
89
90 virtual lldb_private::Error
91 WillAttachToProcessWithID (lldb::pid_t pid);
92
93 virtual lldb_private::Error
94 WillAttachToProcessWithName (const char *process_name, bool wait_for_launch);
95
96 virtual lldb_private::Error
97 DoConnectRemote (const char *remote_url);
98
99 virtual lldb_private::Error
100 DoAttachToProcessWithID (lldb::pid_t pid);
101
102 virtual lldb_private::Error
103 DoAttachToProcessWithName (const char *process_name, bool wait_for_launch);
104
105 virtual void
106 DidAttach ();
107
108 //------------------------------------------------------------------
109 // PluginInterface protocol
110 //------------------------------------------------------------------
111 virtual const char *
112 GetPluginName();
113
114 virtual const char *
115 GetShortPluginName();
116
117 virtual uint32_t
118 GetPluginVersion();
119
120 //------------------------------------------------------------------
121 // Process Control
122 //------------------------------------------------------------------
123 virtual lldb_private::Error
124 WillResume ();
125
126 virtual lldb_private::Error
127 DoResume ();
128
129 virtual lldb_private::Error
130 DoHalt (bool &caused_stop);
131
132 virtual lldb_private::Error
133 WillDetach ();
134
135 virtual lldb_private::Error
136 DoDetach ();
137
138 virtual lldb_private::Error
139 DoSignal (int signal);
140
141 virtual lldb_private::Error
142 DoDestroy ();
143
144 virtual void
145 RefreshStateAfterStop();
146
147 //------------------------------------------------------------------
148 // Process Queries
149 //------------------------------------------------------------------
150 virtual bool
151 IsAlive ();
152
153 //------------------------------------------------------------------
154 // Process Memory
155 //------------------------------------------------------------------
156 virtual size_t
157 DoReadMemory (lldb::addr_t addr, void *buf, size_t size, lldb_private::Error &error);
158
159 virtual size_t
160 DoWriteMemory (lldb::addr_t addr, const void *buf, size_t size, lldb_private::Error &error);
161
162 virtual lldb::addr_t
163 DoAllocateMemory (size_t size, uint32_t permissions, lldb_private::Error &error);
164
165 virtual lldb_private::Error
166 DoDeallocateMemory (lldb::addr_t ptr);
167
168 //----------------------------------------------------------------------
169 // Process Breakpoints
170 //----------------------------------------------------------------------
171 virtual lldb_private::Error
172 EnableBreakpoint (lldb_private::BreakpointSite *bp_site);
173
174 virtual lldb_private::Error
175 DisableBreakpoint (lldb_private::BreakpointSite *bp_site);
176
177 //----------------------------------------------------------------------
178 // Process Watchpoints
179 //----------------------------------------------------------------------
180 virtual lldb_private::Error
181 EnableWatchpoint (lldb_private::WatchpointLocation *wp_loc);
182
183 virtual lldb_private::Error
184 DisableWatchpoint (lldb_private::WatchpointLocation *wp_loc);
185
Greg Clayton0fa51242011-07-19 03:57:15 +0000186 CommunicationKDP &
187 GetCommunication()
188 {
189 return m_comm;
190 }
191
Greg Clayton363be3f2011-07-15 03:27:12 +0000192protected:
193 friend class ThreadKDP;
194 friend class CommunicationKDP;
195
196 //----------------------------------------------------------------------
197 // Accessors
198 //----------------------------------------------------------------------
199 bool
200 IsRunning ( lldb::StateType state )
201 {
202 return state == lldb::eStateRunning || IsStepping(state);
203 }
204
205 bool
206 IsStepping ( lldb::StateType state)
207 {
208 return state == lldb::eStateStepping;
209 }
210
211 bool
212 CanResume ( lldb::StateType state)
213 {
214 return state == lldb::eStateStopped;
215 }
216
217 bool
218 HasExited (lldb::StateType state)
219 {
220 return state == lldb::eStateExited;
221 }
222
223 bool
224 ProcessIDIsValid ( ) const;
225
226 // static void
227 // STDIOReadThreadBytesReceived (void *baton, const void *src, size_t src_len);
228
229 // void
230 // AppendSTDOUT (const char* s, size_t len);
231
232 void
233 Clear ( );
234
235 uint32_t
Greg Clayton37f962e2011-08-22 02:49:39 +0000236 UpdateThreadList (lldb_private::ThreadList &old_thread_list,
237 lldb_private::ThreadList &new_thread_list);
Greg Clayton363be3f2011-07-15 03:27:12 +0000238
Greg Clayton363be3f2011-07-15 03:27:12 +0000239 enum
240 {
241 eBroadcastBitAsyncContinue = (1 << 0),
242 eBroadcastBitAsyncThreadShouldExit = (1 << 1)
243 };
244
245 lldb_private::Error
246 InterruptIfRunning (bool discard_thread_plans,
247 bool catch_stop_event,
248 lldb::EventSP &stop_event_sp);
249
250 //------------------------------------------------------------------
251 /// Broadcaster event bits definitions.
252 //------------------------------------------------------------------
253 CommunicationKDP m_comm;
254 lldb_private::Broadcaster m_async_broadcaster;
255 lldb::thread_t m_async_thread;
256
257 bool
258 StartAsyncThread ();
259
260 void
261 StopAsyncThread ();
262
263 static void *
264 AsyncThread (void *arg);
265
266 lldb::StateType
267 SetThreadStopInfo (StringExtractor& stop_packet);
268
Greg Clayton363be3f2011-07-15 03:27:12 +0000269private:
270 //------------------------------------------------------------------
271 // For ProcessKDP only
272 //------------------------------------------------------------------
273
274 DISALLOW_COPY_AND_ASSIGN (ProcessKDP);
275
276};
277
278#endif // liblldb_ProcessKDP_h_