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