blob: 525546312470396b83c6829caafc2bdf71fb4f36 [file] [log] [blame]
Tamas Berghammere13c2732015-02-11 10:29:30 +00001//===-- GDBRemoteCommunicationServerCommon.h --------------------*- C++ -*-===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Tamas Berghammere13c2732015-02-11 10:29:30 +00006//
7//===----------------------------------------------------------------------===//
8
9#ifndef liblldb_GDBRemoteCommunicationServerCommon_h_
10#define liblldb_GDBRemoteCommunicationServerCommon_h_
11
Eugene Zelenkoedb35d92015-10-24 01:08:35 +000012#include <string>
Tamas Berghammere13c2732015-02-11 10:29:30 +000013
Saleem Abdulrasoolbd689b92019-05-02 18:15:03 +000014#include "lldb/Host/ProcessLaunchInfo.h"
Kate Stoneb9c1b512016-09-06 20:57:50 +000015#include "lldb/lldb-private-forward.h"
Tamas Berghammere13c2732015-02-11 10:29:30 +000016
Tamas Berghammere13c2732015-02-11 10:29:30 +000017#include "GDBRemoteCommunicationServer.h"
18#include "GDBRemoteCommunicationServerCommon.h"
19
Tamas Berghammere13c2732015-02-11 10:29:30 +000020class StringExtractorGDBRemote;
21
Tamas Berghammerdb264a62015-03-31 09:52:22 +000022namespace lldb_private {
23namespace process_gdb_remote {
24
25class ProcessGDBRemote;
26
Kate Stoneb9c1b512016-09-06 20:57:50 +000027class GDBRemoteCommunicationServerCommon : public GDBRemoteCommunicationServer {
Tamas Berghammere13c2732015-02-11 10:29:30 +000028public:
Kate Stoneb9c1b512016-09-06 20:57:50 +000029 GDBRemoteCommunicationServerCommon(const char *comm_name,
30 const char *listener_name);
Tamas Berghammere13c2732015-02-11 10:29:30 +000031
Kate Stoneb9c1b512016-09-06 20:57:50 +000032 ~GDBRemoteCommunicationServerCommon() override;
Tamas Berghammere13c2732015-02-11 10:29:30 +000033
Tamas Berghammere13c2732015-02-11 10:29:30 +000034protected:
Kate Stoneb9c1b512016-09-06 20:57:50 +000035 ProcessLaunchInfo m_process_launch_info;
Zachary Turner97206d52017-05-12 04:51:55 +000036 Status m_process_launch_error;
Kate Stoneb9c1b512016-09-06 20:57:50 +000037 ProcessInstanceInfoList m_proc_infos;
38 uint32_t m_proc_infos_index;
39 bool m_thread_suffix_supported;
40 bool m_list_threads_in_stop_reply;
Tamas Berghammere13c2732015-02-11 10:29:30 +000041
Kate Stoneb9c1b512016-09-06 20:57:50 +000042 PacketResult Handle_A(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +000043
Kate Stoneb9c1b512016-09-06 20:57:50 +000044 PacketResult Handle_qHostInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +000045
Kate Stoneb9c1b512016-09-06 20:57:50 +000046 PacketResult Handle_qProcessInfoPID(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +000047
Kate Stoneb9c1b512016-09-06 20:57:50 +000048 PacketResult Handle_qfProcessInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +000049
Kate Stoneb9c1b512016-09-06 20:57:50 +000050 PacketResult Handle_qsProcessInfo(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +000051
Kate Stoneb9c1b512016-09-06 20:57:50 +000052 PacketResult Handle_qUserName(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +000053
Kate Stoneb9c1b512016-09-06 20:57:50 +000054 PacketResult Handle_qGroupName(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +000055
Kate Stoneb9c1b512016-09-06 20:57:50 +000056 PacketResult Handle_qSpeedTest(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +000057
Kate Stoneb9c1b512016-09-06 20:57:50 +000058 PacketResult Handle_vFile_Open(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +000059
Kate Stoneb9c1b512016-09-06 20:57:50 +000060 PacketResult Handle_vFile_Close(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +000061
Kate Stoneb9c1b512016-09-06 20:57:50 +000062 PacketResult Handle_vFile_pRead(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +000063
Kate Stoneb9c1b512016-09-06 20:57:50 +000064 PacketResult Handle_vFile_pWrite(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +000065
Kate Stoneb9c1b512016-09-06 20:57:50 +000066 PacketResult Handle_vFile_Size(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +000067
Kate Stoneb9c1b512016-09-06 20:57:50 +000068 PacketResult Handle_vFile_Mode(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +000069
Kate Stoneb9c1b512016-09-06 20:57:50 +000070 PacketResult Handle_vFile_Exists(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +000071
Kate Stoneb9c1b512016-09-06 20:57:50 +000072 PacketResult Handle_vFile_symlink(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +000073
Kate Stoneb9c1b512016-09-06 20:57:50 +000074 PacketResult Handle_vFile_unlink(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +000075
Kate Stoneb9c1b512016-09-06 20:57:50 +000076 PacketResult Handle_vFile_Stat(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +000077
Kate Stoneb9c1b512016-09-06 20:57:50 +000078 PacketResult Handle_vFile_MD5(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +000079
Kate Stoneb9c1b512016-09-06 20:57:50 +000080 PacketResult Handle_qEcho(StringExtractorGDBRemote &packet);
Greg Clayton420562a2015-05-29 00:15:15 +000081
Kate Stoneb9c1b512016-09-06 20:57:50 +000082 PacketResult Handle_qModuleInfo(StringExtractorGDBRemote &packet);
Oleksiy Vyalov6801be32015-02-25 22:15:44 +000083
Pavel Labath2f1fbae2016-09-08 10:07:04 +000084 PacketResult Handle_jModulesInfo(StringExtractorGDBRemote &packet);
85
Kate Stoneb9c1b512016-09-06 20:57:50 +000086 PacketResult Handle_qPlatform_shell(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +000087
Kate Stoneb9c1b512016-09-06 20:57:50 +000088 PacketResult Handle_qPlatform_mkdir(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +000089
Kate Stoneb9c1b512016-09-06 20:57:50 +000090 PacketResult Handle_qPlatform_chmod(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +000091
Kate Stoneb9c1b512016-09-06 20:57:50 +000092 PacketResult Handle_qSupported(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +000093
Kate Stoneb9c1b512016-09-06 20:57:50 +000094 PacketResult Handle_QThreadSuffixSupported(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +000095
Kate Stoneb9c1b512016-09-06 20:57:50 +000096 PacketResult Handle_QListThreadsInStopReply(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +000097
Kate Stoneb9c1b512016-09-06 20:57:50 +000098 PacketResult Handle_QSetDetachOnError(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +000099
Kate Stoneb9c1b512016-09-06 20:57:50 +0000100 PacketResult Handle_QStartNoAckMode(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000101
Kate Stoneb9c1b512016-09-06 20:57:50 +0000102 PacketResult Handle_QSetSTDIN(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000103
Kate Stoneb9c1b512016-09-06 20:57:50 +0000104 PacketResult Handle_QSetSTDOUT(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000105
Kate Stoneb9c1b512016-09-06 20:57:50 +0000106 PacketResult Handle_QSetSTDERR(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000107
Kate Stoneb9c1b512016-09-06 20:57:50 +0000108 PacketResult Handle_qLaunchSuccess(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000109
Kate Stoneb9c1b512016-09-06 20:57:50 +0000110 PacketResult Handle_QEnvironment(StringExtractorGDBRemote &packet);
Chaoren Lin0ddb7222015-03-31 22:37:59 +0000111
Kate Stoneb9c1b512016-09-06 20:57:50 +0000112 PacketResult Handle_QEnvironmentHexEncoded(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000113
Kate Stoneb9c1b512016-09-06 20:57:50 +0000114 PacketResult Handle_QLaunchArch(StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000115
Kate Stoneb9c1b512016-09-06 20:57:50 +0000116 static void CreateProcessInfoResponse(const ProcessInstanceInfo &proc_info,
117 StreamString &response);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000118
Kate Stoneb9c1b512016-09-06 20:57:50 +0000119 static void CreateProcessInfoResponse_DebugServerStyle(
120 const ProcessInstanceInfo &proc_info, StreamString &response);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000121
Kate Stoneb9c1b512016-09-06 20:57:50 +0000122 template <typename T>
123 void RegisterMemberFunctionHandler(
124 StringExtractorGDBRemote::ServerPacketType packet_type,
125 PacketResult (T::*handler)(StringExtractorGDBRemote &packet)) {
126 RegisterPacketHandler(packet_type,
127 [this, handler](StringExtractorGDBRemote packet,
Zachary Turner97206d52017-05-12 04:51:55 +0000128 Status &error, bool &interrupt,
Kate Stoneb9c1b512016-09-06 20:57:50 +0000129 bool &quit) {
130 return (static_cast<T *>(this)->*handler)(packet);
131 });
132 }
Tamas Berghammer7cb18bf2015-03-24 11:15:23 +0000133
Kate Stoneb9c1b512016-09-06 20:57:50 +0000134 /// Launch a process with the current launch settings.
135 ///
136 /// This method supports running an lldb-gdbserver or similar
137 /// server in a situation where the startup code has been provided
138 /// with all the information for a child process to be launched.
139 ///
Adrian Prantlf05b42e2019-03-11 17:09:29 +0000140 /// \return
Zachary Turner97206d52017-05-12 04:51:55 +0000141 /// An Status object indicating the success or failure of the
Kate Stoneb9c1b512016-09-06 20:57:50 +0000142 /// launch.
Zachary Turner97206d52017-05-12 04:51:55 +0000143 virtual Status LaunchProcess() = 0;
Tamas Berghammer7cb18bf2015-03-24 11:15:23 +0000144
Kate Stoneb9c1b512016-09-06 20:57:50 +0000145 virtual FileSpec FindModuleFile(const std::string &module_path,
146 const ArchSpec &arch);
Pavel Labath2f1fbae2016-09-08 10:07:04 +0000147
148private:
Zachary Turner28333212017-05-12 05:49:54 +0000149 ModuleSpec GetModuleInfo(llvm::StringRef module_path, llvm::StringRef triple);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000150};
151
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000152} // namespace process_gdb_remote
153} // namespace lldb_private
154
Eugene Zelenkoedb35d92015-10-24 01:08:35 +0000155#endif // liblldb_GDBRemoteCommunicationServerCommon_h_