1254721Semaste//===-- ProcessPOSIX.h ------------------------------------------*- C++ -*-===//
2254721Semaste//
3254721Semaste//                     The LLVM Compiler Infrastructure
4254721Semaste//
5254721Semaste// This file is distributed under the University of Illinois Open Source
6254721Semaste// License. See LICENSE.TXT for details.
7254721Semaste//
8254721Semaste//===----------------------------------------------------------------------===//
9254721Semaste
10254721Semaste#ifndef liblldb_ProcessPOSIX_H_
11254721Semaste#define liblldb_ProcessPOSIX_H_
12254721Semaste
13254721Semaste// C Includes
14254721Semaste
15254721Semaste// C++ Includes
16254721Semaste#include <queue>
17254721Semaste#include <set>
18254721Semaste
19254721Semaste// Other libraries and framework includes
20254721Semaste#include "lldb/Target/Process.h"
21254721Semaste#include "lldb/Target/UnixSignals.h"
22254721Semaste#include "ProcessMessage.h"
23254721Semaste
24254721Semasteclass ProcessMonitor;
25254721Semasteclass POSIXThread;
26254721Semaste
27254721Semasteclass ProcessPOSIX :
28254721Semaste    public lldb_private::Process
29254721Semaste{
30254721Semastepublic:
31254721Semaste
32254721Semaste    //------------------------------------------------------------------
33254721Semaste    // Constructors and destructors
34254721Semaste    //------------------------------------------------------------------
35254721Semaste    ProcessPOSIX(lldb_private::Target& target,
36254721Semaste                 lldb_private::Listener &listener);
37254721Semaste
38254721Semaste    virtual
39254721Semaste    ~ProcessPOSIX();
40254721Semaste
41254721Semaste    //------------------------------------------------------------------
42254721Semaste    // Process protocol.
43254721Semaste    //------------------------------------------------------------------
44254721Semaste    virtual void
45254721Semaste    Finalize();
46254721Semaste
47254721Semaste    virtual bool
48254721Semaste    CanDebug(lldb_private::Target &target, bool plugin_specified_by_name);
49254721Semaste
50254721Semaste    virtual lldb_private::Error
51254721Semaste    WillLaunch(lldb_private::Module *module);
52254721Semaste
53254721Semaste    virtual lldb_private::Error
54254721Semaste    DoAttachToProcessWithID(lldb::pid_t pid);
55254721Semaste
56254721Semaste    virtual lldb_private::Error
57254721Semaste    DoAttachToProcessWithID (lldb::pid_t pid, const lldb_private::ProcessAttachInfo &attach_info);
58254721Semaste
59254721Semaste    virtual lldb_private::Error
60254721Semaste    DoLaunch (lldb_private::Module *exe_module,
61269024Semaste              lldb_private::ProcessLaunchInfo &launch_info);
62254721Semaste
63254721Semaste    virtual void
64254721Semaste    DidLaunch();
65254721Semaste
66254721Semaste    virtual lldb_private::Error
67269024Semaste    DoResume();
68254721Semaste
69254721Semaste    virtual lldb_private::Error
70254721Semaste    DoHalt(bool &caused_stop);
71254721Semaste
72254721Semaste    virtual lldb_private::Error
73263363Semaste    DoDetach(bool keep_stopped) = 0;
74254721Semaste
75254721Semaste    virtual lldb_private::Error
76254721Semaste    DoSignal(int signal);
77254721Semaste
78254721Semaste    virtual lldb_private::Error
79254721Semaste    DoDestroy();
80254721Semaste
81254721Semaste    virtual void
82263363Semaste    DoDidExec();
83263363Semaste
84263363Semaste    virtual void
85254721Semaste    RefreshStateAfterStop();
86254721Semaste
87254721Semaste    virtual bool
88254721Semaste    IsAlive();
89254721Semaste
90254721Semaste    virtual size_t
91254721Semaste    DoReadMemory(lldb::addr_t vm_addr,
92254721Semaste                 void *buf,
93254721Semaste                 size_t size,
94254721Semaste                 lldb_private::Error &error);
95254721Semaste
96254721Semaste    virtual size_t
97254721Semaste    DoWriteMemory(lldb::addr_t vm_addr, const void *buf, size_t size,
98254721Semaste                  lldb_private::Error &error);
99254721Semaste
100254721Semaste    virtual lldb::addr_t
101254721Semaste    DoAllocateMemory(size_t size, uint32_t permissions,
102254721Semaste                     lldb_private::Error &error);
103254721Semaste
104254721Semaste    virtual lldb_private::Error
105254721Semaste    DoDeallocateMemory(lldb::addr_t ptr);
106254721Semaste
107254721Semaste    virtual size_t
108254721Semaste    GetSoftwareBreakpointTrapOpcode(lldb_private::BreakpointSite* bp_site);
109254721Semaste
110254721Semaste    virtual lldb_private::Error
111254721Semaste    EnableBreakpointSite(lldb_private::BreakpointSite *bp_site);
112254721Semaste
113254721Semaste    virtual lldb_private::Error
114254721Semaste    DisableBreakpointSite(lldb_private::BreakpointSite *bp_site);
115254721Semaste
116254721Semaste    virtual lldb_private::Error
117254721Semaste    EnableWatchpoint(lldb_private::Watchpoint *wp, bool notify = true);
118254721Semaste
119254721Semaste    virtual lldb_private::Error
120254721Semaste    DisableWatchpoint(lldb_private::Watchpoint *wp, bool notify = true);
121254721Semaste
122254721Semaste    virtual lldb_private::Error
123254721Semaste    GetWatchpointSupportInfo(uint32_t &num);
124254721Semaste
125254721Semaste    virtual lldb_private::Error
126254721Semaste    GetWatchpointSupportInfo(uint32_t &num, bool &after);
127254721Semaste
128254721Semaste    virtual uint32_t
129254721Semaste    UpdateThreadListIfNeeded();
130254721Semaste
131254721Semaste    virtual bool
132254721Semaste    UpdateThreadList(lldb_private::ThreadList &old_thread_list,
133254721Semaste                     lldb_private::ThreadList &new_thread_list) = 0;
134254721Semaste
135254721Semaste    virtual lldb::ByteOrder
136254721Semaste    GetByteOrder() const;
137254721Semaste
138254721Semaste    virtual lldb::addr_t
139254721Semaste    GetImageInfoAddress();
140254721Semaste
141254721Semaste    virtual size_t
142254721Semaste    PutSTDIN(const char *buf, size_t len, lldb_private::Error &error);
143254721Semaste
144254721Semaste    //--------------------------------------------------------------------------
145254721Semaste    // ProcessPOSIX internal API.
146254721Semaste
147254721Semaste    /// Registers the given message with this process.
148263368Semaste    virtual void
149269024Semaste    SendMessage(const ProcessMessage &message);
150254721Semaste
151254721Semaste    ProcessMonitor &
152254721Semaste    GetMonitor() { assert(m_monitor); return *m_monitor; }
153254721Semaste
154254721Semaste    lldb_private::UnixSignals &
155254721Semaste    GetUnixSignals();
156254721Semaste
157254721Semaste    const char *
158254721Semaste    GetFilePath(const lldb_private::ProcessLaunchInfo::FileAction *file_action,
159254721Semaste                const char *default_path);
160254721Semaste
161254721Semaste    /// Stops all threads in the process.
162254721Semaste    /// The \p stop_tid parameter indicates the thread which initiated the stop.
163254721Semaste    virtual void
164254721Semaste    StopAllThreads(lldb::tid_t stop_tid);
165254721Semaste
166254721Semaste    /// Adds the thread to the list of threads for which we have received the initial stopping signal.
167254721Semaste    /// The \p stop_tid paramter indicates the thread which the stop happened for.
168254721Semaste    bool
169254721Semaste    AddThreadForInitialStopIfNeeded(lldb::tid_t stop_tid);
170254721Semaste
171263363Semaste    bool
172263363Semaste    WaitingForInitialStop(lldb::tid_t stop_tid);
173263363Semaste
174254721Semaste    virtual POSIXThread *
175254721Semaste    CreateNewPOSIXThread(lldb_private::Process &process, lldb::tid_t tid);
176254721Semaste
177254721Semasteprotected:
178254721Semaste    /// Target byte order.
179254721Semaste    lldb::ByteOrder m_byte_order;
180254721Semaste
181254721Semaste    /// Process monitor;
182254721Semaste    ProcessMonitor *m_monitor;
183254721Semaste
184254721Semaste    /// The module we are executing.
185254721Semaste    lldb_private::Module *m_module;
186254721Semaste
187254721Semaste    /// Message queue notifying this instance of inferior process state changes.
188254721Semaste    lldb_private::Mutex m_message_mutex;
189254721Semaste    std::queue<ProcessMessage> m_message_queue;
190254721Semaste
191254721Semaste    /// Drive any exit events to completion.
192254721Semaste    bool m_exit_now;
193254721Semaste
194254721Semaste    /// OS-specific signal set.
195254721Semaste    lldb_private::UnixSignals m_signals;
196254721Semaste
197254721Semaste    /// Returns true if the process has exited.
198254721Semaste    bool HasExited();
199254721Semaste
200254721Semaste    /// Returns true if the process is stopped.
201254721Semaste    bool IsStopped();
202254721Semaste
203254721Semaste    /// Returns true if at least one running is currently running
204254721Semaste    bool IsAThreadRunning();
205254721Semaste
206254721Semaste    typedef std::map<lldb::addr_t, lldb::addr_t> MMapMap;
207254721Semaste    MMapMap m_addr_to_mmap_size;
208254721Semaste
209254721Semaste    typedef std::set<lldb::tid_t> ThreadStopSet;
210254721Semaste    /// Every thread begins with a stop signal. This keeps track
211254721Semaste    /// of the threads for which we have received the stop signal.
212254721Semaste    ThreadStopSet m_seen_initial_stop;
213254721Semaste};
214254721Semaste
215254721Semaste#endif  // liblldb_MacOSXProcess_H_
216