]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - contrib/llvm/tools/lldb/source/Plugins/Process/POSIX/ProcessPOSIX.h
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / contrib / llvm / tools / lldb / source / Plugins / Process / POSIX / ProcessPOSIX.h
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
24 class ProcessMonitor;
25 class POSIXThread;
26
27 class ProcessPOSIX :
28     public lldb_private::Process
29 {
30 public:
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
177 protected:
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_