xref: /llvm-project/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerCommon.h (revision 7cb18bf537ed319eaa06f12ed39f85594bed641a)
1 //===-- GDBRemoteCommunicationServerCommon.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_GDBRemoteCommunicationServerCommon_h_
11 #define liblldb_GDBRemoteCommunicationServerCommon_h_
12 
13 // C Includes
14 // C++ Includes
15 #include <set>
16 
17 // Other libraries and framework includes
18 #include "lldb/lldb-private-forward.h"
19 #include "lldb/Host/Mutex.h"
20 #include "lldb/Target/Process.h"
21 
22 // Project includes
23 #include "GDBRemoteCommunicationServer.h"
24 #include "GDBRemoteCommunicationServerCommon.h"
25 
26 class ProcessGDBRemote;
27 class StringExtractorGDBRemote;
28 
29 class GDBRemoteCommunicationServerCommon :
30     public GDBRemoteCommunicationServer
31 {
32 public:
33     GDBRemoteCommunicationServerCommon(const char *comm_name, const char *listener_name);
34 
35     virtual
36     ~GDBRemoteCommunicationServerCommon();
37 
38 protected:
39     std::set<lldb::pid_t> m_spawned_pids;
40     lldb_private::Mutex m_spawned_pids_mutex;
41     lldb_private::ProcessLaunchInfo m_process_launch_info;
42     lldb_private::Error m_process_launch_error;
43     lldb_private::ProcessInstanceInfoList m_proc_infos;
44     uint32_t m_proc_infos_index;
45     bool m_thread_suffix_supported;
46     bool m_list_threads_in_stop_reply;
47 
48     PacketResult
49     Handle_A (StringExtractorGDBRemote &packet);
50 
51     PacketResult
52     Handle_qHostInfo (StringExtractorGDBRemote &packet);
53 
54     PacketResult
55     Handle_qProcessInfoPID (StringExtractorGDBRemote &packet);
56 
57     PacketResult
58     Handle_qfProcessInfo (StringExtractorGDBRemote &packet);
59 
60     PacketResult
61     Handle_qsProcessInfo (StringExtractorGDBRemote &packet);
62 
63     PacketResult
64     Handle_qUserName (StringExtractorGDBRemote &packet);
65 
66     PacketResult
67     Handle_qGroupName (StringExtractorGDBRemote &packet);
68 
69     PacketResult
70     Handle_qSpeedTest (StringExtractorGDBRemote &packet);
71 
72     PacketResult
73     Handle_qKillSpawnedProcess (StringExtractorGDBRemote &packet);
74 
75     PacketResult
76     Handle_vFile_Open (StringExtractorGDBRemote &packet);
77 
78     PacketResult
79     Handle_vFile_Close (StringExtractorGDBRemote &packet);
80 
81     PacketResult
82     Handle_vFile_pRead (StringExtractorGDBRemote &packet);
83 
84     PacketResult
85     Handle_vFile_pWrite (StringExtractorGDBRemote &packet);
86 
87     PacketResult
88     Handle_vFile_Size (StringExtractorGDBRemote &packet);
89 
90     PacketResult
91     Handle_vFile_Mode (StringExtractorGDBRemote &packet);
92 
93     PacketResult
94     Handle_vFile_Exists (StringExtractorGDBRemote &packet);
95 
96     PacketResult
97     Handle_vFile_symlink (StringExtractorGDBRemote &packet);
98 
99     PacketResult
100     Handle_vFile_unlink (StringExtractorGDBRemote &packet);
101 
102     PacketResult
103     Handle_vFile_Stat (StringExtractorGDBRemote &packet);
104 
105     PacketResult
106     Handle_vFile_MD5 (StringExtractorGDBRemote &packet);
107 
108     PacketResult
109     Handle_qModuleInfo (StringExtractorGDBRemote &packet);
110 
111     PacketResult
112     Handle_qPlatform_shell (StringExtractorGDBRemote &packet);
113 
114     PacketResult
115     Handle_qPlatform_mkdir (StringExtractorGDBRemote &packet);
116 
117     PacketResult
118     Handle_qPlatform_chmod (StringExtractorGDBRemote &packet);
119 
120     PacketResult
121     Handle_qSupported (StringExtractorGDBRemote &packet);
122 
123     PacketResult
124     Handle_QThreadSuffixSupported (StringExtractorGDBRemote &packet);
125 
126     PacketResult
127     Handle_QListThreadsInStopReply (StringExtractorGDBRemote &packet);
128 
129     PacketResult
130     Handle_QSetDetachOnError (StringExtractorGDBRemote &packet);
131 
132     PacketResult
133     Handle_QStartNoAckMode (StringExtractorGDBRemote &packet);
134 
135     PacketResult
136     Handle_QSetSTDIN (StringExtractorGDBRemote &packet);
137 
138     PacketResult
139     Handle_QSetSTDOUT (StringExtractorGDBRemote &packet);
140 
141     PacketResult
142     Handle_QSetSTDERR (StringExtractorGDBRemote &packet);
143 
144     PacketResult
145     Handle_qLaunchSuccess (StringExtractorGDBRemote &packet);
146 
147     PacketResult
148     Handle_QEnvironment  (StringExtractorGDBRemote &packet);
149 
150     PacketResult
151     Handle_QLaunchArch (StringExtractorGDBRemote &packet);
152 
153     bool
154     KillSpawnedProcess (lldb::pid_t pid);
155 
156     static void
157     CreateProcessInfoResponse (const lldb_private::ProcessInstanceInfo &proc_info,
158                                lldb_private::StreamString &response);
159 
160     static void
161     CreateProcessInfoResponse_DebugServerStyle (const lldb_private::ProcessInstanceInfo &proc_info,
162                                                 lldb_private::StreamString &response);
163 
164     template <typename T>
165     void
166     RegisterMemberFunctionHandler (StringExtractorGDBRemote::ServerPacketType packet_type,
167                                    PacketResult (T::*handler) (StringExtractorGDBRemote& packet))
168     {
169         RegisterPacketHandler(packet_type,
170                               [this, handler] (StringExtractorGDBRemote packet,
171                                                lldb_private::Error &error,
172                                                bool &interrupt,
173                                                bool &quit)
174                               {
175                                   return (static_cast<T*>(this)->*handler) (packet);
176                               });
177     }
178 
179     bool
180     GetThreadSuffixSupported () override
181     {
182         return true;
183     }
184 
185     //------------------------------------------------------------------
186     /// Launch a process with the current launch settings.
187     ///
188     /// This method supports running an lldb-gdbserver or similar
189     /// server in a situation where the startup code has been provided
190     /// with all the information for a child process to be launched.
191     ///
192     /// @return
193     ///     An Error object indicating the success or failure of the
194     ///     launch.
195     //------------------------------------------------------------------
196     virtual lldb_private::Error
197     LaunchProcess () = 0;
198 
199     virtual lldb_private::FileSpec
200     FindModuleFile (const std::string& module_path, const lldb_private::ArchSpec& arch);
201 };
202 
203 #endif  // liblldb_GDBRemoteCommunicationServerCommon_h_
204