10b57cec5SDimitry Andric //===-- GDBRemoteCommunicationServerLLGS.h ----------------------*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
95ffd83dbSDimitry Andric #ifndef LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONSERVERLLGS_H
105ffd83dbSDimitry Andric #define LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONSERVERLLGS_H
110b57cec5SDimitry Andric 
120b57cec5SDimitry Andric #include <mutex>
130b57cec5SDimitry Andric #include <unordered_map>
1481ad6265SDimitry Andric #include <unordered_set>
150b57cec5SDimitry Andric 
160b57cec5SDimitry Andric #include "lldb/Core/Communication.h"
170b57cec5SDimitry Andric #include "lldb/Host/MainLoop.h"
180b57cec5SDimitry Andric #include "lldb/Host/common/NativeProcessProtocol.h"
19*06c3fb27SDimitry Andric #include "lldb/Utility/RegisterValue.h"
200b57cec5SDimitry Andric #include "lldb/lldb-private-forward.h"
210b57cec5SDimitry Andric 
220b57cec5SDimitry Andric #include "GDBRemoteCommunicationServerCommon.h"
230b57cec5SDimitry Andric 
240b57cec5SDimitry Andric class StringExtractorGDBRemote;
250b57cec5SDimitry Andric 
260b57cec5SDimitry Andric namespace lldb_private {
270b57cec5SDimitry Andric 
280b57cec5SDimitry Andric namespace process_gdb_remote {
290b57cec5SDimitry Andric 
300b57cec5SDimitry Andric class ProcessGDBRemote;
310b57cec5SDimitry Andric 
320b57cec5SDimitry Andric class GDBRemoteCommunicationServerLLGS
330b57cec5SDimitry Andric     : public GDBRemoteCommunicationServerCommon,
340b57cec5SDimitry Andric       public NativeProcessProtocol::NativeDelegate {
350b57cec5SDimitry Andric public:
360b57cec5SDimitry Andric   // Constructors and Destructors
370b57cec5SDimitry Andric   GDBRemoteCommunicationServerLLGS(
380b57cec5SDimitry Andric       MainLoop &mainloop,
39*06c3fb27SDimitry Andric       NativeProcessProtocol::Manager &process_manager);
400b57cec5SDimitry Andric 
410b57cec5SDimitry Andric   void SetLaunchInfo(const ProcessLaunchInfo &info);
420b57cec5SDimitry Andric 
430b57cec5SDimitry Andric   /// Launch a process with the current launch settings.
440b57cec5SDimitry Andric   ///
450b57cec5SDimitry Andric   /// This method supports running an lldb-gdbserver or similar
460b57cec5SDimitry Andric   /// server in a situation where the startup code has been provided
470b57cec5SDimitry Andric   /// with all the information for a child process to be launched.
480b57cec5SDimitry Andric   ///
490b57cec5SDimitry Andric   /// \return
500b57cec5SDimitry Andric   ///     An Status object indicating the success or failure of the
510b57cec5SDimitry Andric   ///     launch.
520b57cec5SDimitry Andric   Status LaunchProcess() override;
530b57cec5SDimitry Andric 
540b57cec5SDimitry Andric   /// Attach to a process.
550b57cec5SDimitry Andric   ///
560b57cec5SDimitry Andric   /// This method supports attaching llgs to a process accessible via the
570b57cec5SDimitry Andric   /// configured Platform.
580b57cec5SDimitry Andric   ///
590b57cec5SDimitry Andric   /// \return
600b57cec5SDimitry Andric   ///     An Status object indicating the success or failure of the
610b57cec5SDimitry Andric   ///     attach operation.
620b57cec5SDimitry Andric   Status AttachToProcess(lldb::pid_t pid);
630b57cec5SDimitry Andric 
64e8d8bef9SDimitry Andric   /// Wait to attach to a process with a given name.
65e8d8bef9SDimitry Andric   ///
66e8d8bef9SDimitry Andric   /// This method supports waiting for the next instance of a process
67e8d8bef9SDimitry Andric   /// with a given name and attaching llgs to that via the configured
68e8d8bef9SDimitry Andric   /// Platform.
69e8d8bef9SDimitry Andric   ///
70e8d8bef9SDimitry Andric   /// \return
71e8d8bef9SDimitry Andric   ///     An Status object indicating the success or failure of the
72e8d8bef9SDimitry Andric   ///     attach operation.
73e8d8bef9SDimitry Andric   Status AttachWaitProcess(llvm::StringRef process_name, bool include_existing);
74e8d8bef9SDimitry Andric 
750b57cec5SDimitry Andric   // NativeProcessProtocol::NativeDelegate overrides
760b57cec5SDimitry Andric   void InitializeDelegate(NativeProcessProtocol *process) override;
770b57cec5SDimitry Andric 
780b57cec5SDimitry Andric   void ProcessStateChanged(NativeProcessProtocol *process,
790b57cec5SDimitry Andric                            lldb::StateType state) override;
800b57cec5SDimitry Andric 
810b57cec5SDimitry Andric   void DidExec(NativeProcessProtocol *process) override;
820b57cec5SDimitry Andric 
83fe6060f1SDimitry Andric   void
84fe6060f1SDimitry Andric   NewSubprocess(NativeProcessProtocol *parent_process,
85fe6060f1SDimitry Andric                 std::unique_ptr<NativeProcessProtocol> child_process) override;
86fe6060f1SDimitry Andric 
875ffd83dbSDimitry Andric   Status InitializeConnection(std::unique_ptr<Connection> connection);
880b57cec5SDimitry Andric 
89fcaf7f86SDimitry Andric   struct DebuggedProcess {
90fcaf7f86SDimitry Andric     enum class Flag {
91fcaf7f86SDimitry Andric       vkilled = (1u << 0),
92fcaf7f86SDimitry Andric 
93fcaf7f86SDimitry Andric       LLVM_MARK_AS_BITMASK_ENUM(vkilled)
94fcaf7f86SDimitry Andric     };
95fcaf7f86SDimitry Andric 
96fcaf7f86SDimitry Andric     std::unique_ptr<NativeProcessProtocol> process_up;
97fcaf7f86SDimitry Andric     Flag flags;
98fcaf7f86SDimitry Andric   };
99fcaf7f86SDimitry Andric 
1000b57cec5SDimitry Andric protected:
1010b57cec5SDimitry Andric   MainLoop &m_mainloop;
1020b57cec5SDimitry Andric   MainLoop::ReadHandleUP m_network_handle_up;
103*06c3fb27SDimitry Andric   NativeProcessProtocol::Manager &m_process_manager;
1040b57cec5SDimitry Andric   lldb::tid_t m_current_tid = LLDB_INVALID_THREAD_ID;
1050b57cec5SDimitry Andric   lldb::tid_t m_continue_tid = LLDB_INVALID_THREAD_ID;
106fe6060f1SDimitry Andric   NativeProcessProtocol *m_current_process;
107fe6060f1SDimitry Andric   NativeProcessProtocol *m_continue_process;
1080b57cec5SDimitry Andric   std::recursive_mutex m_debugged_process_mutex;
109fcaf7f86SDimitry Andric   std::unordered_map<lldb::pid_t, DebuggedProcess> m_debugged_processes;
1100b57cec5SDimitry Andric 
1110b57cec5SDimitry Andric   Communication m_stdio_communication;
1120b57cec5SDimitry Andric   MainLoop::ReadHandleUP m_stdio_handle_up;
1130b57cec5SDimitry Andric 
1140b57cec5SDimitry Andric   llvm::StringMap<std::unique_ptr<llvm::MemoryBuffer>> m_xfer_buffer_map;
1150b57cec5SDimitry Andric   std::mutex m_saved_registers_mutex;
1160b57cec5SDimitry Andric   std::unordered_map<uint32_t, lldb::DataBufferSP> m_saved_registers_map;
1170b57cec5SDimitry Andric   uint32_t m_next_saved_registers_id = 1;
118fe6060f1SDimitry Andric   bool m_thread_suffix_supported = false;
119fe6060f1SDimitry Andric   bool m_list_threads_in_stop_reply = false;
12081ad6265SDimitry Andric   bool m_non_stop = false;
121fcaf7f86SDimitry Andric   bool m_disabling_non_stop = false;
122fcaf7f86SDimitry Andric   std::deque<std::string> m_stdio_notification_queue;
12381ad6265SDimitry Andric   std::deque<std::string> m_stop_notification_queue;
124fe6060f1SDimitry Andric 
125fe6060f1SDimitry Andric   NativeProcessProtocol::Extension m_extensions_supported = {};
1260b57cec5SDimitry Andric 
127*06c3fb27SDimitry Andric   // Typically we would use a SmallVector for this data but in this context we
128*06c3fb27SDimitry Andric   // don't know how much data we're recieving so we would have to heap allocate
129*06c3fb27SDimitry Andric   // a lot, or have a very large stack frame. So it's a member instead.
130*06c3fb27SDimitry Andric   uint8_t m_reg_bytes[RegisterValue::kMaxRegisterByteSize];
131*06c3fb27SDimitry Andric 
1320b57cec5SDimitry Andric   PacketResult SendONotification(const char *buffer, uint32_t len);
1330b57cec5SDimitry Andric 
1340b57cec5SDimitry Andric   PacketResult SendWResponse(NativeProcessProtocol *process);
1350b57cec5SDimitry Andric 
13681ad6265SDimitry Andric   StreamString PrepareStopReplyPacketForThread(NativeThreadProtocol &thread);
1370b57cec5SDimitry Andric 
13881ad6265SDimitry Andric   PacketResult SendStopReplyPacketForThread(NativeProcessProtocol &process,
13981ad6265SDimitry Andric                                             lldb::tid_t tid,
14081ad6265SDimitry Andric                                             bool force_synchronous);
14181ad6265SDimitry Andric 
14281ad6265SDimitry Andric   PacketResult SendStopReasonForState(NativeProcessProtocol &process,
14381ad6265SDimitry Andric                                       lldb::StateType process_state,
14481ad6265SDimitry Andric                                       bool force_synchronous);
14581ad6265SDimitry Andric 
14681ad6265SDimitry Andric   void EnqueueStopReplyPackets(lldb::tid_t thread_to_skip);
1470b57cec5SDimitry Andric 
1480b57cec5SDimitry Andric   PacketResult Handle_k(StringExtractorGDBRemote &packet);
1490b57cec5SDimitry Andric 
15081ad6265SDimitry Andric   PacketResult Handle_vKill(StringExtractorGDBRemote &packet);
15181ad6265SDimitry Andric 
1520b57cec5SDimitry Andric   PacketResult Handle_qProcessInfo(StringExtractorGDBRemote &packet);
1530b57cec5SDimitry Andric 
1540b57cec5SDimitry Andric   PacketResult Handle_qC(StringExtractorGDBRemote &packet);
1550b57cec5SDimitry Andric 
1560b57cec5SDimitry Andric   PacketResult Handle_QSetDisableASLR(StringExtractorGDBRemote &packet);
1570b57cec5SDimitry Andric 
1580b57cec5SDimitry Andric   PacketResult Handle_QSetWorkingDir(StringExtractorGDBRemote &packet);
1590b57cec5SDimitry Andric 
1600b57cec5SDimitry Andric   PacketResult Handle_qGetWorkingDir(StringExtractorGDBRemote &packet);
1610b57cec5SDimitry Andric 
162fe6060f1SDimitry Andric   PacketResult Handle_QThreadSuffixSupported(StringExtractorGDBRemote &packet);
163fe6060f1SDimitry Andric 
164fe6060f1SDimitry Andric   PacketResult Handle_QListThreadsInStopReply(StringExtractorGDBRemote &packet);
165fe6060f1SDimitry Andric 
166fcaf7f86SDimitry Andric   PacketResult ResumeProcess(NativeProcessProtocol &process,
167fcaf7f86SDimitry Andric                              const ResumeActionList &actions);
168fcaf7f86SDimitry Andric 
1690b57cec5SDimitry Andric   PacketResult Handle_C(StringExtractorGDBRemote &packet);
1700b57cec5SDimitry Andric 
1710b57cec5SDimitry Andric   PacketResult Handle_c(StringExtractorGDBRemote &packet);
1720b57cec5SDimitry Andric 
1730b57cec5SDimitry Andric   PacketResult Handle_vCont(StringExtractorGDBRemote &packet);
1740b57cec5SDimitry Andric 
1750b57cec5SDimitry Andric   PacketResult Handle_vCont_actions(StringExtractorGDBRemote &packet);
1760b57cec5SDimitry Andric 
1770b57cec5SDimitry Andric   PacketResult Handle_stop_reason(StringExtractorGDBRemote &packet);
1780b57cec5SDimitry Andric 
1790b57cec5SDimitry Andric   PacketResult Handle_qRegisterInfo(StringExtractorGDBRemote &packet);
1800b57cec5SDimitry Andric 
18181ad6265SDimitry Andric   void AddProcessThreads(StreamGDBRemote &response,
18281ad6265SDimitry Andric                          NativeProcessProtocol &process, bool &had_any);
18381ad6265SDimitry Andric 
1840b57cec5SDimitry Andric   PacketResult Handle_qfThreadInfo(StringExtractorGDBRemote &packet);
1850b57cec5SDimitry Andric 
1860b57cec5SDimitry Andric   PacketResult Handle_qsThreadInfo(StringExtractorGDBRemote &packet);
1870b57cec5SDimitry Andric 
1880b57cec5SDimitry Andric   PacketResult Handle_p(StringExtractorGDBRemote &packet);
1890b57cec5SDimitry Andric 
1900b57cec5SDimitry Andric   PacketResult Handle_P(StringExtractorGDBRemote &packet);
1910b57cec5SDimitry Andric 
1920b57cec5SDimitry Andric   PacketResult Handle_H(StringExtractorGDBRemote &packet);
1930b57cec5SDimitry Andric 
1940b57cec5SDimitry Andric   PacketResult Handle_I(StringExtractorGDBRemote &packet);
1950b57cec5SDimitry Andric 
1960b57cec5SDimitry Andric   PacketResult Handle_interrupt(StringExtractorGDBRemote &packet);
1970b57cec5SDimitry Andric 
1980b57cec5SDimitry Andric   // Handles $m and $x packets.
1990b57cec5SDimitry Andric   PacketResult Handle_memory_read(StringExtractorGDBRemote &packet);
2000b57cec5SDimitry Andric 
2010b57cec5SDimitry Andric   PacketResult Handle_M(StringExtractorGDBRemote &packet);
202e8d8bef9SDimitry Andric   PacketResult Handle__M(StringExtractorGDBRemote &packet);
203e8d8bef9SDimitry Andric   PacketResult Handle__m(StringExtractorGDBRemote &packet);
2040b57cec5SDimitry Andric 
2050b57cec5SDimitry Andric   PacketResult
2060b57cec5SDimitry Andric   Handle_qMemoryRegionInfoSupported(StringExtractorGDBRemote &packet);
2070b57cec5SDimitry Andric 
2080b57cec5SDimitry Andric   PacketResult Handle_qMemoryRegionInfo(StringExtractorGDBRemote &packet);
2090b57cec5SDimitry Andric 
2100b57cec5SDimitry Andric   PacketResult Handle_Z(StringExtractorGDBRemote &packet);
2110b57cec5SDimitry Andric 
2120b57cec5SDimitry Andric   PacketResult Handle_z(StringExtractorGDBRemote &packet);
2130b57cec5SDimitry Andric 
2140b57cec5SDimitry Andric   PacketResult Handle_s(StringExtractorGDBRemote &packet);
2150b57cec5SDimitry Andric 
2160b57cec5SDimitry Andric   PacketResult Handle_qXfer(StringExtractorGDBRemote &packet);
2170b57cec5SDimitry Andric 
2180b57cec5SDimitry Andric   PacketResult Handle_QSaveRegisterState(StringExtractorGDBRemote &packet);
2190b57cec5SDimitry Andric 
220fe6060f1SDimitry Andric   PacketResult Handle_jLLDBTraceSupported(StringExtractorGDBRemote &packet);
2210b57cec5SDimitry Andric 
222fe6060f1SDimitry Andric   PacketResult Handle_jLLDBTraceStart(StringExtractorGDBRemote &packet);
2230b57cec5SDimitry Andric 
224fe6060f1SDimitry Andric   PacketResult Handle_jLLDBTraceStop(StringExtractorGDBRemote &packet);
2250b57cec5SDimitry Andric 
226fe6060f1SDimitry Andric   PacketResult Handle_jLLDBTraceGetState(StringExtractorGDBRemote &packet);
2270b57cec5SDimitry Andric 
228fe6060f1SDimitry Andric   PacketResult Handle_jLLDBTraceGetBinaryData(StringExtractorGDBRemote &packet);
229e8d8bef9SDimitry Andric 
2300b57cec5SDimitry Andric   PacketResult Handle_QRestoreRegisterState(StringExtractorGDBRemote &packet);
2310b57cec5SDimitry Andric 
2320b57cec5SDimitry Andric   PacketResult Handle_vAttach(StringExtractorGDBRemote &packet);
2330b57cec5SDimitry Andric 
234e8d8bef9SDimitry Andric   PacketResult Handle_vAttachWait(StringExtractorGDBRemote &packet);
235e8d8bef9SDimitry Andric 
236e8d8bef9SDimitry Andric   PacketResult Handle_qVAttachOrWaitSupported(StringExtractorGDBRemote &packet);
237e8d8bef9SDimitry Andric 
238e8d8bef9SDimitry Andric   PacketResult Handle_vAttachOrWait(StringExtractorGDBRemote &packet);
239e8d8bef9SDimitry Andric 
240349cc55cSDimitry Andric   PacketResult Handle_vRun(StringExtractorGDBRemote &packet);
241349cc55cSDimitry Andric 
2420b57cec5SDimitry Andric   PacketResult Handle_D(StringExtractorGDBRemote &packet);
2430b57cec5SDimitry Andric 
2440b57cec5SDimitry Andric   PacketResult Handle_qThreadStopInfo(StringExtractorGDBRemote &packet);
2450b57cec5SDimitry Andric 
2460b57cec5SDimitry Andric   PacketResult Handle_jThreadsInfo(StringExtractorGDBRemote &packet);
2470b57cec5SDimitry Andric 
2480b57cec5SDimitry Andric   PacketResult Handle_qWatchpointSupportInfo(StringExtractorGDBRemote &packet);
2490b57cec5SDimitry Andric 
2500b57cec5SDimitry Andric   PacketResult Handle_qFileLoadAddress(StringExtractorGDBRemote &packet);
2510b57cec5SDimitry Andric 
2520b57cec5SDimitry Andric   PacketResult Handle_QPassSignals(StringExtractorGDBRemote &packet);
2530b57cec5SDimitry Andric 
254349cc55cSDimitry Andric   PacketResult Handle_qSaveCore(StringExtractorGDBRemote &packet);
255349cc55cSDimitry Andric 
25681ad6265SDimitry Andric   PacketResult Handle_QNonStop(StringExtractorGDBRemote &packet);
25781ad6265SDimitry Andric 
258fcaf7f86SDimitry Andric   PacketResult HandleNotificationAck(std::deque<std::string> &queue);
259fcaf7f86SDimitry Andric 
260fcaf7f86SDimitry Andric   PacketResult Handle_vStdio(StringExtractorGDBRemote &packet);
261fcaf7f86SDimitry Andric 
26281ad6265SDimitry Andric   PacketResult Handle_vStopped(StringExtractorGDBRemote &packet);
26381ad6265SDimitry Andric 
26481ad6265SDimitry Andric   PacketResult Handle_vCtrlC(StringExtractorGDBRemote &packet);
26581ad6265SDimitry Andric 
2660b57cec5SDimitry Andric   PacketResult Handle_g(StringExtractorGDBRemote &packet);
2670b57cec5SDimitry Andric 
268fe6060f1SDimitry Andric   PacketResult Handle_qMemTags(StringExtractorGDBRemote &packet);
269fe6060f1SDimitry Andric 
270fe6060f1SDimitry Andric   PacketResult Handle_QMemTags(StringExtractorGDBRemote &packet);
271fe6060f1SDimitry Andric 
27281ad6265SDimitry Andric   PacketResult Handle_T(StringExtractorGDBRemote &packet);
27381ad6265SDimitry Andric 
2740b57cec5SDimitry Andric   void SetCurrentThreadID(lldb::tid_t tid);
2750b57cec5SDimitry Andric 
2760b57cec5SDimitry Andric   lldb::tid_t GetCurrentThreadID() const;
2770b57cec5SDimitry Andric 
2780b57cec5SDimitry Andric   void SetContinueThreadID(lldb::tid_t tid);
2790b57cec5SDimitry Andric 
GetContinueThreadID()2800b57cec5SDimitry Andric   lldb::tid_t GetContinueThreadID() const { return m_continue_tid; }
2810b57cec5SDimitry Andric 
2820b57cec5SDimitry Andric   Status SetSTDIOFileDescriptor(int fd);
2830b57cec5SDimitry Andric 
2840b57cec5SDimitry Andric   FileSpec FindModuleFile(const std::string &module_path,
2850b57cec5SDimitry Andric                           const ArchSpec &arch) override;
2860b57cec5SDimitry Andric 
2870b57cec5SDimitry Andric   llvm::Expected<std::unique_ptr<llvm::MemoryBuffer>>
2880b57cec5SDimitry Andric   ReadXferObject(llvm::StringRef object, llvm::StringRef annex);
2890b57cec5SDimitry Andric 
2909dba64beSDimitry Andric   static std::string XMLEncodeAttributeValue(llvm::StringRef value);
2919dba64beSDimitry Andric 
29281ad6265SDimitry Andric   std::vector<std::string> HandleFeatures(
293fe6060f1SDimitry Andric       const llvm::ArrayRef<llvm::StringRef> client_features) override;
294fe6060f1SDimitry Andric 
29581ad6265SDimitry Andric   // Provide a response for successful continue action, i.e. send "OK"
29681ad6265SDimitry Andric   // in non-stop mode, no response otherwise.
29781ad6265SDimitry Andric   PacketResult SendContinueSuccessResponse();
29881ad6265SDimitry Andric 
29981ad6265SDimitry Andric   void AppendThreadIDToResponse(Stream &response, lldb::pid_t pid,
30081ad6265SDimitry Andric                                 lldb::tid_t tid);
30181ad6265SDimitry Andric 
3020b57cec5SDimitry Andric private:
3035ffd83dbSDimitry Andric   llvm::Expected<std::unique_ptr<llvm::MemoryBuffer>> BuildTargetXml();
3045ffd83dbSDimitry Andric 
3050b57cec5SDimitry Andric   void HandleInferiorState_Exited(NativeProcessProtocol *process);
3060b57cec5SDimitry Andric 
3070b57cec5SDimitry Andric   void HandleInferiorState_Stopped(NativeProcessProtocol *process);
3080b57cec5SDimitry Andric 
3090b57cec5SDimitry Andric   NativeThreadProtocol *GetThreadFromSuffix(StringExtractorGDBRemote &packet);
3100b57cec5SDimitry Andric 
3110b57cec5SDimitry Andric   uint32_t GetNextSavedRegistersID();
3120b57cec5SDimitry Andric 
3130b57cec5SDimitry Andric   void MaybeCloseInferiorTerminalConnection();
3140b57cec5SDimitry Andric 
3150b57cec5SDimitry Andric   void ClearProcessSpecificData();
3160b57cec5SDimitry Andric 
3170b57cec5SDimitry Andric   void RegisterPacketHandlers();
3180b57cec5SDimitry Andric 
3190b57cec5SDimitry Andric   void DataAvailableCallback();
3200b57cec5SDimitry Andric 
3210b57cec5SDimitry Andric   void SendProcessOutput();
3220b57cec5SDimitry Andric 
3230b57cec5SDimitry Andric   void StartSTDIOForwarding();
3240b57cec5SDimitry Andric 
3250b57cec5SDimitry Andric   void StopSTDIOForwarding();
3260b57cec5SDimitry Andric 
327fe6060f1SDimitry Andric   // Call SetEnabledExtensions() with appropriate flags on the process.
328fe6060f1SDimitry Andric   void SetEnabledExtensions(NativeProcessProtocol &process);
329fe6060f1SDimitry Andric 
3300b57cec5SDimitry Andric   // For GDBRemoteCommunicationServerLLGS only
3315ffd83dbSDimitry Andric   GDBRemoteCommunicationServerLLGS(const GDBRemoteCommunicationServerLLGS &) =
3325ffd83dbSDimitry Andric       delete;
3335ffd83dbSDimitry Andric   const GDBRemoteCommunicationServerLLGS &
3345ffd83dbSDimitry Andric   operator=(const GDBRemoteCommunicationServerLLGS &) = delete;
3350b57cec5SDimitry Andric };
3360b57cec5SDimitry Andric 
337349cc55cSDimitry Andric std::string LLGSArgToURL(llvm::StringRef url_arg, bool reverse_connect);
338349cc55cSDimitry Andric 
3390b57cec5SDimitry Andric } // namespace process_gdb_remote
3400b57cec5SDimitry Andric } // namespace lldb_private
3410b57cec5SDimitry Andric 
3425ffd83dbSDimitry Andric #endif // LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONSERVERLLGS_H
343