]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/lldb/source/Plugins/Process/FreeBSD/ProcessFreeBSD.h
Update Apache Serf to 1.3.9 to support OpenSSL 1.1.1.
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / lldb / source / Plugins / Process / FreeBSD / ProcessFreeBSD.h
1 //===-- ProcessFreeBSD.h ------------------------------------------*- C++
2 //-*-===//
3 //
4 //                     The LLVM Compiler Infrastructure
5 //
6 // This file is distributed under the University of Illinois Open Source
7 // License. See LICENSE.TXT for details.
8 //
9 //===----------------------------------------------------------------------===//
10
11 #ifndef liblldb_ProcessFreeBSD_H_
12 #define liblldb_ProcessFreeBSD_H_
13
14 #include "Plugins/Process/POSIX/ProcessMessage.h"
15 #include "lldb/Target/Process.h"
16 #include "lldb/Target/ThreadList.h"
17 #include <mutex>
18 #include <queue>
19 #include <set>
20
21 class ProcessMonitor;
22 class FreeBSDThread;
23
24 class ProcessFreeBSD : public lldb_private::Process {
25
26 public:
27   //------------------------------------------------------------------
28   // Static functions.
29   //------------------------------------------------------------------
30   static lldb::ProcessSP
31   CreateInstance(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp,
32                  const lldb_private::FileSpec *crash_file_path);
33
34   static void Initialize();
35
36   static void Terminate();
37
38   static lldb_private::ConstString GetPluginNameStatic();
39
40   static const char *GetPluginDescriptionStatic();
41
42   //------------------------------------------------------------------
43   // Constructors and destructors
44   //------------------------------------------------------------------
45   ProcessFreeBSD(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp,
46                  lldb::UnixSignalsSP &unix_signals_sp);
47
48   ~ProcessFreeBSD();
49
50   virtual lldb_private::Status WillResume() override;
51
52   //------------------------------------------------------------------
53   // PluginInterface protocol
54   //------------------------------------------------------------------
55   virtual lldb_private::ConstString GetPluginName() override;
56
57   virtual uint32_t GetPluginVersion() override;
58
59 public:
60   //------------------------------------------------------------------
61   // Process protocol.
62   //------------------------------------------------------------------
63   void Finalize() override;
64
65   bool CanDebug(lldb::TargetSP target_sp,
66                 bool plugin_specified_by_name) override;
67
68   lldb_private::Status WillLaunch(lldb_private::Module *module) override;
69
70   lldb_private::Status DoAttachToProcessWithID(
71       lldb::pid_t pid,
72       const lldb_private::ProcessAttachInfo &attach_info) override;
73
74   lldb_private::Status
75   DoLaunch(lldb_private::Module *exe_module,
76            lldb_private::ProcessLaunchInfo &launch_info) override;
77
78   void DidLaunch() override;
79
80   lldb_private::Status DoResume() override;
81
82   lldb_private::Status DoHalt(bool &caused_stop) override;
83
84   lldb_private::Status DoDetach(bool keep_stopped) override;
85
86   lldb_private::Status DoSignal(int signal) override;
87
88   lldb_private::Status DoDestroy() override;
89
90   void DoDidExec() override;
91
92   void RefreshStateAfterStop() override;
93
94   bool IsAlive() override;
95
96   size_t DoReadMemory(lldb::addr_t vm_addr, void *buf, size_t size,
97                       lldb_private::Status &error) override;
98
99   size_t DoWriteMemory(lldb::addr_t vm_addr, const void *buf, size_t size,
100                        lldb_private::Status &error) override;
101
102   lldb::addr_t DoAllocateMemory(size_t size, uint32_t permissions,
103                                 lldb_private::Status &error) override;
104
105   lldb_private::Status DoDeallocateMemory(lldb::addr_t ptr) override;
106
107   virtual size_t
108   GetSoftwareBreakpointTrapOpcode(lldb_private::BreakpointSite *bp_site);
109
110   lldb_private::Status
111   EnableBreakpointSite(lldb_private::BreakpointSite *bp_site) override;
112
113   lldb_private::Status
114   DisableBreakpointSite(lldb_private::BreakpointSite *bp_site) override;
115
116   lldb_private::Status EnableWatchpoint(lldb_private::Watchpoint *wp,
117                                         bool notify = true) override;
118
119   lldb_private::Status DisableWatchpoint(lldb_private::Watchpoint *wp,
120                                          bool notify = true) override;
121
122   lldb_private::Status GetWatchpointSupportInfo(uint32_t &num) override;
123
124   lldb_private::Status GetWatchpointSupportInfo(uint32_t &num,
125                                                 bool &after) override;
126
127   virtual uint32_t UpdateThreadListIfNeeded();
128
129   bool UpdateThreadList(lldb_private::ThreadList &old_thread_list,
130                         lldb_private::ThreadList &new_thread_list) override;
131
132   virtual lldb::ByteOrder GetByteOrder() const;
133
134   lldb::addr_t GetImageInfoAddress() override;
135
136   size_t PutSTDIN(const char *buf, size_t len,
137                   lldb_private::Status &error) override;
138
139   const lldb::DataBufferSP GetAuxvData() override;
140
141   //--------------------------------------------------------------------------
142   // ProcessFreeBSD internal API.
143
144   /// Registers the given message with this process.
145   virtual void SendMessage(const ProcessMessage &message);
146
147   ProcessMonitor &GetMonitor() {
148     assert(m_monitor);
149     return *m_monitor;
150   }
151
152   lldb_private::FileSpec
153   GetFileSpec(const lldb_private::FileAction *file_action,
154               const lldb_private::FileSpec &default_file_spec,
155               const lldb_private::FileSpec &dbg_pts_file_spec);
156
157   /// Adds the thread to the list of threads for which we have received the
158   /// initial stopping signal.
159   /// The \p stop_tid parameter indicates the thread which the stop happened
160   /// for.
161   bool AddThreadForInitialStopIfNeeded(lldb::tid_t stop_tid);
162
163   bool WaitingForInitialStop(lldb::tid_t stop_tid);
164
165   virtual FreeBSDThread *CreateNewFreeBSDThread(lldb_private::Process &process,
166                                                 lldb::tid_t tid);
167
168   static bool SingleStepBreakpointHit(
169       void *baton, lldb_private::StoppointCallbackContext *context,
170       lldb::user_id_t break_id, lldb::user_id_t break_loc_id);
171
172   lldb_private::Status SetupSoftwareSingleStepping(lldb::tid_t tid);
173
174   lldb_private::Status SetSoftwareSingleStepBreakpoint(lldb::tid_t tid,
175                                                        lldb::addr_t addr);
176
177   bool IsSoftwareStepBreakpoint(lldb::tid_t tid);
178
179   bool SupportHardwareSingleStepping() const;
180
181   typedef std::vector<lldb::tid_t> tid_collection;
182   tid_collection &GetStepTids() { return m_step_tids; }
183
184 protected:
185   static const size_t MAX_TRAP_OPCODE_SIZE = 8;
186
187   /// Target byte order.
188   lldb::ByteOrder m_byte_order;
189
190   /// Process monitor;
191   ProcessMonitor *m_monitor;
192
193   /// The module we are executing.
194   lldb_private::Module *m_module;
195
196   /// Message queue notifying this instance of inferior process state changes.
197   std::recursive_mutex m_message_mutex;
198   std::queue<ProcessMessage> m_message_queue;
199
200   /// Drive any exit events to completion.
201   bool m_exit_now;
202
203   /// Returns true if the process has exited.
204   bool HasExited();
205
206   /// Returns true if the process is stopped.
207   bool IsStopped();
208
209   /// Returns true if at least one running is currently running
210   bool IsAThreadRunning();
211
212   typedef std::map<lldb::addr_t, lldb::addr_t> MMapMap;
213   MMapMap m_addr_to_mmap_size;
214
215   typedef std::set<lldb::tid_t> ThreadStopSet;
216   /// Every thread begins with a stop signal. This keeps track
217   /// of the threads for which we have received the stop signal.
218   ThreadStopSet m_seen_initial_stop;
219
220   friend class FreeBSDThread;
221
222   tid_collection m_suspend_tids;
223   tid_collection m_run_tids;
224   tid_collection m_step_tids;
225   std::map<lldb::tid_t, lldb::break_id_t> m_threads_stepping_with_breakpoint;
226
227   int m_resume_signo;
228 };
229
230 #endif // liblldb_ProcessFreeBSD_H_