]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/lldb/source/Plugins/Process/FreeBSD/ProcessPOSIX.h
Merge from head
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / lldb / source / Plugins / Process / FreeBSD / 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 "Plugins/Process/POSIX/ProcessMessage.h"
22
23 class ProcessMonitor;
24 class POSIXThread;
25
26 class ProcessPOSIX :
27     public lldb_private::Process
28 {
29 public:
30
31     //------------------------------------------------------------------
32     // Constructors and destructors
33     //------------------------------------------------------------------
34     ProcessPOSIX(lldb_private::Target& target,
35                  lldb_private::Listener &listener,
36                  lldb::UnixSignalsSP &unix_signals_sp);
37
38     virtual
39     ~ProcessPOSIX();
40
41     //------------------------------------------------------------------
42     // Process protocol.
43     //------------------------------------------------------------------
44     void
45     Finalize() override;
46
47     bool
48     CanDebug(lldb_private::Target &target, bool plugin_specified_by_name) override;
49
50     lldb_private::Error
51     WillLaunch(lldb_private::Module *module) override;
52
53     lldb_private::Error
54     DoAttachToProcessWithID (lldb::pid_t pid, const lldb_private::ProcessAttachInfo &attach_info) override;
55
56     lldb_private::Error
57     DoLaunch (lldb_private::Module *exe_module, 
58               lldb_private::ProcessLaunchInfo &launch_info) override;
59
60     void
61     DidLaunch() override;
62
63     lldb_private::Error
64     DoResume() override;
65
66     lldb_private::Error
67     DoHalt(bool &caused_stop) override;
68
69     lldb_private::Error
70     DoDetach(bool keep_stopped) override = 0;
71
72     lldb_private::Error
73     DoSignal(int signal) override;
74
75     lldb_private::Error
76     DoDestroy() override;
77
78     void
79     DoDidExec() override;
80
81     void
82     RefreshStateAfterStop() override;
83
84     bool
85     IsAlive() override;
86
87     size_t
88     DoReadMemory(lldb::addr_t vm_addr,
89                  void *buf,
90                  size_t size,
91                  lldb_private::Error &error) override;
92
93     size_t
94     DoWriteMemory(lldb::addr_t vm_addr, const void *buf, size_t size,
95                   lldb_private::Error &error) override;
96
97     lldb::addr_t
98     DoAllocateMemory(size_t size, uint32_t permissions,
99                      lldb_private::Error &error) override;
100
101     lldb_private::Error
102     DoDeallocateMemory(lldb::addr_t ptr) override;
103
104     virtual size_t
105     GetSoftwareBreakpointTrapOpcode(lldb_private::BreakpointSite* bp_site);
106
107     lldb_private::Error
108     EnableBreakpointSite(lldb_private::BreakpointSite *bp_site) override;
109
110     lldb_private::Error
111     DisableBreakpointSite(lldb_private::BreakpointSite *bp_site) override;
112
113     lldb_private::Error
114     EnableWatchpoint(lldb_private::Watchpoint *wp, bool notify = true) override;
115
116     lldb_private::Error
117     DisableWatchpoint(lldb_private::Watchpoint *wp, bool notify = true) override;
118
119     lldb_private::Error
120     GetWatchpointSupportInfo(uint32_t &num) override;
121
122     lldb_private::Error
123     GetWatchpointSupportInfo(uint32_t &num, bool &after) override;
124
125     virtual uint32_t
126     UpdateThreadListIfNeeded();
127
128     bool
129     UpdateThreadList(lldb_private::ThreadList &old_thread_list, 
130                      lldb_private::ThreadList &new_thread_list) override = 0;
131
132     virtual lldb::ByteOrder
133     GetByteOrder() const;
134
135     lldb::addr_t
136     GetImageInfoAddress() override;
137
138     size_t
139     PutSTDIN(const char *buf, size_t len, lldb_private::Error &error) override;
140
141     const lldb::DataBufferSP
142     GetAuxvData () override;
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::FileSpec
155     GetFileSpec(const lldb_private::FileAction *file_action,
156                 const lldb_private::FileSpec &default_file_spec,
157                 const lldb_private::FileSpec &dbg_pts_file_spec);
158
159     /// Adds the thread to the list of threads for which we have received the initial stopping signal.
160     /// The \p stop_tid parameter indicates the thread which the stop happened for.
161     bool
162     AddThreadForInitialStopIfNeeded(lldb::tid_t stop_tid);
163
164     bool
165     WaitingForInitialStop(lldb::tid_t stop_tid);
166
167     virtual POSIXThread *
168     CreateNewPOSIXThread(lldb_private::Process &process, lldb::tid_t tid);
169
170 protected:
171     /// Target byte order.
172     lldb::ByteOrder m_byte_order;
173
174     /// Process monitor;
175     ProcessMonitor *m_monitor;
176
177     /// The module we are executing.
178     lldb_private::Module *m_module;
179
180     /// Message queue notifying this instance of inferior process state changes.
181     lldb_private::Mutex m_message_mutex;
182     std::queue<ProcessMessage> m_message_queue;
183
184     /// Drive any exit events to completion.
185     bool m_exit_now;
186
187     /// Returns true if the process has exited.
188     bool HasExited();
189
190     /// Returns true if the process is stopped.
191     bool IsStopped();
192
193     /// Returns true if at least one running is currently running
194     bool IsAThreadRunning();
195
196     typedef std::map<lldb::addr_t, lldb::addr_t> MMapMap;
197     MMapMap m_addr_to_mmap_size;
198
199     typedef std::set<lldb::tid_t> ThreadStopSet;
200     /// Every thread begins with a stop signal. This keeps track
201     /// of the threads for which we have received the stop signal.
202     ThreadStopSet m_seen_initial_stop;
203 };
204
205 #endif  // liblldb_MacOSXProcess_H_