aboutsummaryrefslogtreecommitdiff
path: root/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerCommon.h
blob: ecd80923fcf0fcc986c8a078aaad80daa6d02aec (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
//===-- GDBRemoteCommunicationServerCommon.h --------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONSERVERCOMMON_H
#define LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONSERVERCOMMON_H

#include <string>

#include "lldb/Host/ProcessLaunchInfo.h"
#include "lldb/lldb-private-forward.h"

#include "GDBRemoteCommunicationServer.h"
#include "GDBRemoteCommunicationServerCommon.h"

class StringExtractorGDBRemote;

namespace lldb_private {
namespace process_gdb_remote {

class ProcessGDBRemote;

class GDBRemoteCommunicationServerCommon : public GDBRemoteCommunicationServer {
public:
  GDBRemoteCommunicationServerCommon(const char *comm_name,
                                     const char *listener_name);

  ~GDBRemoteCommunicationServerCommon() override;

protected:
  ProcessLaunchInfo m_process_launch_info;
  Status m_process_launch_error;
  ProcessInstanceInfoList m_proc_infos;
  uint32_t m_proc_infos_index;

  PacketResult Handle_A(StringExtractorGDBRemote &packet);

  PacketResult Handle_qHostInfo(StringExtractorGDBRemote &packet);

  PacketResult Handle_qProcessInfoPID(StringExtractorGDBRemote &packet);

  PacketResult Handle_qfProcessInfo(StringExtractorGDBRemote &packet);

  PacketResult Handle_qsProcessInfo(StringExtractorGDBRemote &packet);

  PacketResult Handle_qUserName(StringExtractorGDBRemote &packet);

  PacketResult Handle_qGroupName(StringExtractorGDBRemote &packet);

  PacketResult Handle_qSpeedTest(StringExtractorGDBRemote &packet);

  PacketResult Handle_vFile_Open(StringExtractorGDBRemote &packet);

  PacketResult Handle_vFile_Close(StringExtractorGDBRemote &packet);

  PacketResult Handle_vFile_pRead(StringExtractorGDBRemote &packet);

  PacketResult Handle_vFile_pWrite(StringExtractorGDBRemote &packet);

  PacketResult Handle_vFile_Size(StringExtractorGDBRemote &packet);

  PacketResult Handle_vFile_Mode(StringExtractorGDBRemote &packet);

  PacketResult Handle_vFile_Exists(StringExtractorGDBRemote &packet);

  PacketResult Handle_vFile_symlink(StringExtractorGDBRemote &packet);

  PacketResult Handle_vFile_unlink(StringExtractorGDBRemote &packet);

  PacketResult Handle_vFile_Stat(StringExtractorGDBRemote &packet);

  PacketResult Handle_vFile_MD5(StringExtractorGDBRemote &packet);

  PacketResult Handle_qEcho(StringExtractorGDBRemote &packet);

  PacketResult Handle_qModuleInfo(StringExtractorGDBRemote &packet);

  PacketResult Handle_jModulesInfo(StringExtractorGDBRemote &packet);

  PacketResult Handle_qPlatform_shell(StringExtractorGDBRemote &packet);

  PacketResult Handle_qPlatform_mkdir(StringExtractorGDBRemote &packet);

  PacketResult Handle_qPlatform_chmod(StringExtractorGDBRemote &packet);

  PacketResult Handle_qSupported(StringExtractorGDBRemote &packet);

  PacketResult Handle_QSetDetachOnError(StringExtractorGDBRemote &packet);

  PacketResult Handle_QStartNoAckMode(StringExtractorGDBRemote &packet);

  PacketResult Handle_QSetSTDIN(StringExtractorGDBRemote &packet);

  PacketResult Handle_QSetSTDOUT(StringExtractorGDBRemote &packet);

  PacketResult Handle_QSetSTDERR(StringExtractorGDBRemote &packet);

  PacketResult Handle_qLaunchSuccess(StringExtractorGDBRemote &packet);

  PacketResult Handle_QEnvironment(StringExtractorGDBRemote &packet);

  PacketResult Handle_QEnvironmentHexEncoded(StringExtractorGDBRemote &packet);

  PacketResult Handle_QLaunchArch(StringExtractorGDBRemote &packet);

  static void CreateProcessInfoResponse(const ProcessInstanceInfo &proc_info,
                                        StreamString &response);

  static void CreateProcessInfoResponse_DebugServerStyle(
      const ProcessInstanceInfo &proc_info, StreamString &response);

  template <typename T>
  void RegisterMemberFunctionHandler(
      StringExtractorGDBRemote::ServerPacketType packet_type,
      PacketResult (T::*handler)(StringExtractorGDBRemote &packet)) {
    RegisterPacketHandler(packet_type,
                          [this, handler](StringExtractorGDBRemote packet,
                                          Status &error, bool &interrupt,
                                          bool &quit) {
                            return (static_cast<T *>(this)->*handler)(packet);
                          });
  }

  /// Launch a process with the current launch settings.
  ///
  /// This method supports running an lldb-gdbserver or similar
  /// server in a situation where the startup code has been provided
  /// with all the information for a child process to be launched.
  ///
  /// \return
  ///     An Status object indicating the success or failure of the
  ///     launch.
  virtual Status LaunchProcess() = 0;

  virtual FileSpec FindModuleFile(const std::string &module_path,
                                  const ArchSpec &arch);

  // Process client_features (qSupported) and return an array of server features
  // to be returned in response.
  virtual std::vector<std::string>
  HandleFeatures(llvm::ArrayRef<llvm::StringRef> client_features);

private:
  ModuleSpec GetModuleInfo(llvm::StringRef module_path, llvm::StringRef triple);
};

} // namespace process_gdb_remote
} // namespace lldb_private

#endif // LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONSERVERCOMMON_H