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