1061da546Spatrick //===-- ProcessGDBRemote.h --------------------------------------*- C++ -*-===// 2061da546Spatrick // 3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information. 5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6061da546Spatrick // 7061da546Spatrick //===----------------------------------------------------------------------===// 8061da546Spatrick 9dda28197Spatrick #ifndef LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_PROCESSGDBREMOTE_H 10dda28197Spatrick #define LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_PROCESSGDBREMOTE_H 11061da546Spatrick 12061da546Spatrick #include <atomic> 13061da546Spatrick #include <map> 14061da546Spatrick #include <mutex> 15*f6aab3d8Srobert #include <optional> 16061da546Spatrick #include <string> 17061da546Spatrick #include <vector> 18061da546Spatrick 19061da546Spatrick #include "lldb/Core/LoadedModuleInfoList.h" 20061da546Spatrick #include "lldb/Core/ModuleSpec.h" 21061da546Spatrick #include "lldb/Core/ThreadSafeValue.h" 22061da546Spatrick #include "lldb/Host/HostThread.h" 23*f6aab3d8Srobert #include "lldb/Target/DynamicRegisterInfo.h" 24061da546Spatrick #include "lldb/Target/Process.h" 25061da546Spatrick #include "lldb/Target/Thread.h" 26061da546Spatrick #include "lldb/Utility/ArchSpec.h" 27061da546Spatrick #include "lldb/Utility/Broadcaster.h" 28061da546Spatrick #include "lldb/Utility/ConstString.h" 29061da546Spatrick #include "lldb/Utility/GDBRemote.h" 30061da546Spatrick #include "lldb/Utility/Status.h" 31061da546Spatrick #include "lldb/Utility/StreamString.h" 32061da546Spatrick #include "lldb/Utility/StringExtractor.h" 33061da546Spatrick #include "lldb/Utility/StringList.h" 34061da546Spatrick #include "lldb/Utility/StructuredData.h" 35061da546Spatrick #include "lldb/lldb-private-forward.h" 36061da546Spatrick 37061da546Spatrick #include "GDBRemoteCommunicationClient.h" 38061da546Spatrick #include "GDBRemoteRegisterContext.h" 39061da546Spatrick 40061da546Spatrick #include "llvm/ADT/DenseMap.h" 41061da546Spatrick 42061da546Spatrick namespace lldb_private { 43061da546Spatrick namespace repro { 44061da546Spatrick class Loader; 45061da546Spatrick } 46061da546Spatrick namespace process_gdb_remote { 47061da546Spatrick 48061da546Spatrick class ThreadGDBRemote; 49061da546Spatrick 50061da546Spatrick class ProcessGDBRemote : public Process, 51061da546Spatrick private GDBRemoteClientBase::ContinueDelegate { 52061da546Spatrick public: 53061da546Spatrick ~ProcessGDBRemote() override; 54061da546Spatrick 55061da546Spatrick static lldb::ProcessSP CreateInstance(lldb::TargetSP target_sp, 56061da546Spatrick lldb::ListenerSP listener_sp, 57be691f3bSpatrick const FileSpec *crash_file_path, 58be691f3bSpatrick bool can_connect); 59061da546Spatrick 60061da546Spatrick static void Initialize(); 61061da546Spatrick 62061da546Spatrick static void DebuggerInitialize(Debugger &debugger); 63061da546Spatrick 64061da546Spatrick static void Terminate(); 65061da546Spatrick GetPluginNameStatic()66*f6aab3d8Srobert static llvm::StringRef GetPluginNameStatic() { return "gdb-remote"; } 67061da546Spatrick 68*f6aab3d8Srobert static llvm::StringRef GetPluginDescriptionStatic(); 69061da546Spatrick 70be691f3bSpatrick static std::chrono::seconds GetPacketTimeout(); 71be691f3bSpatrick 72*f6aab3d8Srobert ArchSpec GetSystemArchitecture() override; 73*f6aab3d8Srobert 74061da546Spatrick // Check if a given Process 75061da546Spatrick bool CanDebug(lldb::TargetSP target_sp, 76061da546Spatrick bool plugin_specified_by_name) override; 77061da546Spatrick 78061da546Spatrick CommandObject *GetPluginCommandObject() override; 79061da546Spatrick 80061da546Spatrick // Creating a new process, or attaching to an existing one 81*f6aab3d8Srobert Status DoWillLaunch(Module *module) override; 82061da546Spatrick 83061da546Spatrick Status DoLaunch(Module *exe_module, ProcessLaunchInfo &launch_info) override; 84061da546Spatrick 85061da546Spatrick void DidLaunch() override; 86061da546Spatrick 87*f6aab3d8Srobert Status DoWillAttachToProcessWithID(lldb::pid_t pid) override; 88061da546Spatrick 89*f6aab3d8Srobert Status DoWillAttachToProcessWithName(const char *process_name, 90061da546Spatrick bool wait_for_launch) override; 91061da546Spatrick 92dda28197Spatrick Status DoConnectRemote(llvm::StringRef remote_url) override; 93061da546Spatrick 94061da546Spatrick Status WillLaunchOrAttach(); 95061da546Spatrick 96061da546Spatrick Status DoAttachToProcessWithID(lldb::pid_t pid, 97061da546Spatrick const ProcessAttachInfo &attach_info) override; 98061da546Spatrick 99061da546Spatrick Status 100061da546Spatrick DoAttachToProcessWithName(const char *process_name, 101061da546Spatrick const ProcessAttachInfo &attach_info) override; 102061da546Spatrick 103061da546Spatrick void DidAttach(ArchSpec &process_arch) override; 104061da546Spatrick 105061da546Spatrick // PluginInterface protocol GetPluginName()106*f6aab3d8Srobert llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } 107061da546Spatrick 108061da546Spatrick // Process Control 109061da546Spatrick Status WillResume() override; 110061da546Spatrick 111061da546Spatrick Status DoResume() override; 112061da546Spatrick 113061da546Spatrick Status DoHalt(bool &caused_stop) override; 114061da546Spatrick 115061da546Spatrick Status DoDetach(bool keep_stopped) override; 116061da546Spatrick DetachRequiresHalt()117061da546Spatrick bool DetachRequiresHalt() override { return true; } 118061da546Spatrick 119061da546Spatrick Status DoSignal(int signal) override; 120061da546Spatrick 121061da546Spatrick Status DoDestroy() override; 122061da546Spatrick 123061da546Spatrick void RefreshStateAfterStop() override; 124061da546Spatrick 125061da546Spatrick void SetUnixSignals(const lldb::UnixSignalsSP &signals_sp); 126061da546Spatrick 127061da546Spatrick // Process Queries 128061da546Spatrick bool IsAlive() override; 129061da546Spatrick 130061da546Spatrick lldb::addr_t GetImageInfoAddress() override; 131061da546Spatrick 132061da546Spatrick void WillPublicStop() override; 133061da546Spatrick 134061da546Spatrick // Process Memory 135061da546Spatrick size_t DoReadMemory(lldb::addr_t addr, void *buf, size_t size, 136061da546Spatrick Status &error) override; 137061da546Spatrick 138061da546Spatrick Status 139061da546Spatrick WriteObjectFile(std::vector<ObjectFile::LoadableData> entries) override; 140061da546Spatrick 141061da546Spatrick size_t DoWriteMemory(lldb::addr_t addr, const void *buf, size_t size, 142061da546Spatrick Status &error) override; 143061da546Spatrick 144061da546Spatrick lldb::addr_t DoAllocateMemory(size_t size, uint32_t permissions, 145061da546Spatrick Status &error) override; 146061da546Spatrick 147061da546Spatrick Status DoDeallocateMemory(lldb::addr_t ptr) override; 148061da546Spatrick 149061da546Spatrick // Process STDIO 150061da546Spatrick size_t PutSTDIN(const char *buf, size_t buf_size, Status &error) override; 151061da546Spatrick 152061da546Spatrick // Process Breakpoints 153061da546Spatrick Status EnableBreakpointSite(BreakpointSite *bp_site) override; 154061da546Spatrick 155061da546Spatrick Status DisableBreakpointSite(BreakpointSite *bp_site) override; 156061da546Spatrick 157061da546Spatrick // Process Watchpoints 158061da546Spatrick Status EnableWatchpoint(Watchpoint *wp, bool notify = true) override; 159061da546Spatrick 160061da546Spatrick Status DisableWatchpoint(Watchpoint *wp, bool notify = true) override; 161061da546Spatrick 162061da546Spatrick Status GetWatchpointSupportInfo(uint32_t &num) override; 163061da546Spatrick 164be691f3bSpatrick llvm::Expected<TraceSupportedResponse> TraceSupported() override; 165061da546Spatrick 166be691f3bSpatrick llvm::Error TraceStop(const TraceStopRequest &request) override; 167061da546Spatrick 168be691f3bSpatrick llvm::Error TraceStart(const llvm::json::Value &request) override; 169061da546Spatrick 170be691f3bSpatrick llvm::Expected<std::string> TraceGetState(llvm::StringRef type) override; 171061da546Spatrick 172be691f3bSpatrick llvm::Expected<std::vector<uint8_t>> 173be691f3bSpatrick TraceGetBinaryData(const TraceGetBinaryDataRequest &request) override; 174061da546Spatrick 175061da546Spatrick Status GetWatchpointSupportInfo(uint32_t &num, bool &after) override; 176061da546Spatrick 177061da546Spatrick bool StartNoticingNewThreads() override; 178061da546Spatrick 179061da546Spatrick bool StopNoticingNewThreads() override; 180061da546Spatrick GetGDBRemote()181061da546Spatrick GDBRemoteCommunicationClient &GetGDBRemote() { return m_gdb_comm; } 182061da546Spatrick 183061da546Spatrick Status SendEventData(const char *data) override; 184061da546Spatrick 185061da546Spatrick // Override DidExit so we can disconnect from the remote GDB server 186061da546Spatrick void DidExit() override; 187061da546Spatrick 188061da546Spatrick void SetUserSpecifiedMaxMemoryTransferSize(uint64_t user_specified_max); 189061da546Spatrick 190061da546Spatrick bool GetModuleSpec(const FileSpec &module_file_spec, const ArchSpec &arch, 191061da546Spatrick ModuleSpec &module_spec) override; 192061da546Spatrick 193061da546Spatrick void PrefetchModuleSpecs(llvm::ArrayRef<FileSpec> module_file_specs, 194061da546Spatrick const llvm::Triple &triple) override; 195061da546Spatrick 196061da546Spatrick llvm::VersionTuple GetHostOSVersion() override; 197061da546Spatrick llvm::VersionTuple GetHostMacCatalystVersion() override; 198061da546Spatrick 199061da546Spatrick llvm::Error LoadModules() override; 200061da546Spatrick 201061da546Spatrick llvm::Expected<LoadedModuleInfoList> GetLoadedModuleList() override; 202061da546Spatrick 203061da546Spatrick Status GetFileLoadAddress(const FileSpec &file, bool &is_loaded, 204061da546Spatrick lldb::addr_t &load_addr) override; 205061da546Spatrick 206061da546Spatrick void ModulesDidLoad(ModuleList &module_list) override; 207061da546Spatrick 208061da546Spatrick StructuredData::ObjectSP 209061da546Spatrick GetLoadedDynamicLibrariesInfos(lldb::addr_t image_list_address, 210061da546Spatrick lldb::addr_t image_count) override; 211061da546Spatrick 212061da546Spatrick Status 213061da546Spatrick ConfigureStructuredData(ConstString type_name, 214061da546Spatrick const StructuredData::ObjectSP &config_sp) override; 215061da546Spatrick 216061da546Spatrick StructuredData::ObjectSP GetLoadedDynamicLibrariesInfos() override; 217061da546Spatrick 218061da546Spatrick StructuredData::ObjectSP GetLoadedDynamicLibrariesInfos( 219061da546Spatrick const std::vector<lldb::addr_t> &load_addresses) override; 220061da546Spatrick 221061da546Spatrick StructuredData::ObjectSP 222061da546Spatrick GetLoadedDynamicLibrariesInfos_sender(StructuredData::ObjectSP args); 223061da546Spatrick 224061da546Spatrick StructuredData::ObjectSP GetSharedCacheInfo() override; 225061da546Spatrick 226*f6aab3d8Srobert StructuredData::ObjectSP GetDynamicLoaderProcessState() override; 227*f6aab3d8Srobert 228061da546Spatrick std::string HarmonizeThreadIdsForProfileData( 229061da546Spatrick StringExtractorGDBRemote &inputStringExtractor); 230061da546Spatrick 231*f6aab3d8Srobert void DidFork(lldb::pid_t child_pid, lldb::tid_t child_tid) override; 232*f6aab3d8Srobert void DidVFork(lldb::pid_t child_pid, lldb::tid_t child_tid) override; 233*f6aab3d8Srobert void DidVForkDone() override; 234*f6aab3d8Srobert void DidExec() override; 235*f6aab3d8Srobert 236*f6aab3d8Srobert llvm::Expected<bool> SaveCore(llvm::StringRef outfile) override; 237*f6aab3d8Srobert 238061da546Spatrick protected: 239061da546Spatrick friend class ThreadGDBRemote; 240061da546Spatrick friend class GDBRemoteCommunicationClient; 241061da546Spatrick friend class GDBRemoteRegisterContext; 242061da546Spatrick 243*f6aab3d8Srobert ProcessGDBRemote(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp); 244*f6aab3d8Srobert 245be691f3bSpatrick bool SupportsMemoryTagging() override; 246be691f3bSpatrick 247061da546Spatrick /// Broadcaster event bits definitions. 248061da546Spatrick enum { 249061da546Spatrick eBroadcastBitAsyncContinue = (1 << 0), 250061da546Spatrick eBroadcastBitAsyncThreadShouldExit = (1 << 1), 251061da546Spatrick eBroadcastBitAsyncThreadDidExit = (1 << 2) 252061da546Spatrick }; 253061da546Spatrick 254061da546Spatrick GDBRemoteCommunicationClient m_gdb_comm; 255061da546Spatrick std::atomic<lldb::pid_t> m_debugserver_pid; 256*f6aab3d8Srobert 257*f6aab3d8Srobert std::optional<StringExtractorGDBRemote> m_last_stop_packet; 258061da546Spatrick std::recursive_mutex m_last_stop_packet_mutex; 259*f6aab3d8Srobert 260be691f3bSpatrick GDBRemoteDynamicRegisterInfoSP m_register_info_sp; 261061da546Spatrick Broadcaster m_async_broadcaster; 262061da546Spatrick lldb::ListenerSP m_async_listener_sp; 263061da546Spatrick HostThread m_async_thread; 264061da546Spatrick std::recursive_mutex m_async_thread_state_mutex; 265061da546Spatrick typedef std::vector<lldb::tid_t> tid_collection; 266061da546Spatrick typedef std::vector<std::pair<lldb::tid_t, int>> tid_sig_collection; 267061da546Spatrick typedef std::map<lldb::addr_t, lldb::addr_t> MMapMap; 268061da546Spatrick typedef std::map<uint32_t, std::string> ExpeditedRegisterMap; 269061da546Spatrick tid_collection m_thread_ids; // Thread IDs for all threads. This list gets 270061da546Spatrick // updated after stopping 271061da546Spatrick std::vector<lldb::addr_t> m_thread_pcs; // PC values for all the threads. 272061da546Spatrick StructuredData::ObjectSP m_jstopinfo_sp; // Stop info only for any threads 273061da546Spatrick // that have valid stop infos 274061da546Spatrick StructuredData::ObjectSP m_jthreadsinfo_sp; // Full stop info, expedited 275061da546Spatrick // registers and memory for all 276061da546Spatrick // threads if "jThreadsInfo" 277061da546Spatrick // packet is supported 278061da546Spatrick tid_collection m_continue_c_tids; // 'c' for continue 279061da546Spatrick tid_sig_collection m_continue_C_tids; // 'C' for continue with signal 280061da546Spatrick tid_collection m_continue_s_tids; // 's' for step 281061da546Spatrick tid_sig_collection m_continue_S_tids; // 'S' for step with signal 282061da546Spatrick uint64_t m_max_memory_size; // The maximum number of bytes to read/write when 283061da546Spatrick // reading and writing memory 284061da546Spatrick uint64_t m_remote_stub_max_memory_size; // The maximum memory size the remote 285061da546Spatrick // gdb stub can handle 286061da546Spatrick MMapMap m_addr_to_mmap_size; 287061da546Spatrick lldb::BreakpointSP m_thread_create_bp_sp; 288061da546Spatrick bool m_waiting_for_attach; 289061da546Spatrick lldb::CommandObjectSP m_command_sp; 290061da546Spatrick int64_t m_breakpoint_pc_offset; 291061da546Spatrick lldb::tid_t m_initial_tid; // The initial thread ID, given by stub on attach 292061da546Spatrick bool m_use_g_packet_for_reading; 293061da546Spatrick 294061da546Spatrick bool m_allow_flash_writes; 295061da546Spatrick using FlashRangeVector = lldb_private::RangeVector<lldb::addr_t, size_t>; 296061da546Spatrick using FlashRange = FlashRangeVector::Entry; 297061da546Spatrick FlashRangeVector m_erased_flash_ranges; 298061da546Spatrick 299*f6aab3d8Srobert bool m_vfork_in_progress; 300*f6aab3d8Srobert 301061da546Spatrick // Accessors IsRunning(lldb::StateType state)302061da546Spatrick bool IsRunning(lldb::StateType state) { 303061da546Spatrick return state == lldb::eStateRunning || IsStepping(state); 304061da546Spatrick } 305061da546Spatrick IsStepping(lldb::StateType state)306061da546Spatrick bool IsStepping(lldb::StateType state) { 307061da546Spatrick return state == lldb::eStateStepping; 308061da546Spatrick } 309061da546Spatrick CanResume(lldb::StateType state)310061da546Spatrick bool CanResume(lldb::StateType state) { return state == lldb::eStateStopped; } 311061da546Spatrick HasExited(lldb::StateType state)312061da546Spatrick bool HasExited(lldb::StateType state) { return state == lldb::eStateExited; } 313061da546Spatrick 314061da546Spatrick void Clear(); 315061da546Spatrick 316be691f3bSpatrick bool DoUpdateThreadList(ThreadList &old_thread_list, 317061da546Spatrick ThreadList &new_thread_list) override; 318061da546Spatrick 319061da546Spatrick Status EstablishConnectionIfNeeded(const ProcessInfo &process_info); 320061da546Spatrick 321061da546Spatrick Status LaunchAndConnectToDebugserver(const ProcessInfo &process_info); 322061da546Spatrick 323061da546Spatrick void KillDebugserverProcess(); 324061da546Spatrick 325061da546Spatrick void BuildDynamicRegisterInfo(bool force); 326061da546Spatrick 327061da546Spatrick void SetLastStopPacket(const StringExtractorGDBRemote &response); 328061da546Spatrick 329061da546Spatrick bool ParsePythonTargetDefinition(const FileSpec &target_definition_fspec); 330061da546Spatrick 331061da546Spatrick DataExtractor GetAuxvData() override; 332061da546Spatrick 333061da546Spatrick StructuredData::ObjectSP GetExtendedInfoForThread(lldb::tid_t tid); 334061da546Spatrick 335061da546Spatrick void GetMaxMemorySize(); 336061da546Spatrick 337061da546Spatrick bool CalculateThreadStopInfo(ThreadGDBRemote *thread); 338061da546Spatrick 339*f6aab3d8Srobert size_t UpdateThreadPCsFromStopReplyThreadsValue(llvm::StringRef value); 340061da546Spatrick 341be691f3bSpatrick size_t UpdateThreadIDsFromStopReplyThreadsValue(llvm::StringRef value); 342061da546Spatrick 343061da546Spatrick bool StartAsyncThread(); 344061da546Spatrick 345061da546Spatrick void StopAsyncThread(); 346061da546Spatrick 347*f6aab3d8Srobert lldb::thread_result_t AsyncThread(); 348061da546Spatrick 349*f6aab3d8Srobert static void 350061da546Spatrick MonitorDebugserverProcess(std::weak_ptr<ProcessGDBRemote> process_wp, 351*f6aab3d8Srobert lldb::pid_t pid, int signo, int exit_status); 352061da546Spatrick 353061da546Spatrick lldb::StateType SetThreadStopInfo(StringExtractor &stop_packet); 354061da546Spatrick 355061da546Spatrick bool 356061da546Spatrick GetThreadStopInfoFromJSON(ThreadGDBRemote *thread, 357061da546Spatrick const StructuredData::ObjectSP &thread_infos_sp); 358061da546Spatrick 359061da546Spatrick lldb::ThreadSP SetThreadStopInfo(StructuredData::Dictionary *thread_dict); 360061da546Spatrick 361061da546Spatrick lldb::ThreadSP 362061da546Spatrick SetThreadStopInfo(lldb::tid_t tid, 363061da546Spatrick ExpeditedRegisterMap &expedited_register_map, uint8_t signo, 364061da546Spatrick const std::string &thread_name, const std::string &reason, 365061da546Spatrick const std::string &description, uint32_t exc_type, 366061da546Spatrick const std::vector<lldb::addr_t> &exc_data, 367061da546Spatrick lldb::addr_t thread_dispatch_qaddr, bool queue_vars_valid, 368061da546Spatrick lldb_private::LazyBool associated_with_libdispatch_queue, 369061da546Spatrick lldb::addr_t dispatch_queue_t, std::string &queue_name, 370061da546Spatrick lldb::QueueKind queue_kind, uint64_t queue_serial); 371061da546Spatrick 372061da546Spatrick void ClearThreadIDList(); 373061da546Spatrick 374061da546Spatrick bool UpdateThreadIDList(); 375061da546Spatrick 376061da546Spatrick void DidLaunchOrAttach(ArchSpec &process_arch); 377*f6aab3d8Srobert void LoadStubBinaries(); 378dda28197Spatrick void MaybeLoadExecutableModule(); 379061da546Spatrick 380061da546Spatrick Status ConnectToDebugserver(llvm::StringRef host_port); 381061da546Spatrick 382061da546Spatrick const char *GetDispatchQueueNameForThread(lldb::addr_t thread_dispatch_qaddr, 383061da546Spatrick std::string &dispatch_queue_name); 384061da546Spatrick 385061da546Spatrick DynamicLoader *GetDynamicLoader() override; 386061da546Spatrick 387*f6aab3d8Srobert bool GetGDBServerRegisterInfoXMLAndProcess( 388*f6aab3d8Srobert ArchSpec &arch_to_use, std::string xml_filename, 389*f6aab3d8Srobert std::vector<DynamicRegisterInfo::Register> ®isters); 390061da546Spatrick 391*f6aab3d8Srobert // Convert DynamicRegisterInfo::Registers into RegisterInfos and add 392*f6aab3d8Srobert // to the dynamic register list. 393*f6aab3d8Srobert void AddRemoteRegisters(std::vector<DynamicRegisterInfo::Register> ®isters, 394*f6aab3d8Srobert const ArchSpec &arch_to_use); 395061da546Spatrick // Query remote GDBServer for register information 396061da546Spatrick bool GetGDBServerRegisterInfo(ArchSpec &arch); 397061da546Spatrick 398061da546Spatrick lldb::ModuleSP LoadModuleAtAddress(const FileSpec &file, 399061da546Spatrick lldb::addr_t link_map, 400061da546Spatrick lldb::addr_t base_addr, 401061da546Spatrick bool value_is_offset); 402061da546Spatrick 403061da546Spatrick Status UpdateAutomaticSignalFiltering() override; 404061da546Spatrick 405061da546Spatrick Status FlashErase(lldb::addr_t addr, size_t size); 406061da546Spatrick 407061da546Spatrick Status FlashDone(); 408061da546Spatrick 409061da546Spatrick bool HasErased(FlashRange range); 410061da546Spatrick 411be691f3bSpatrick llvm::Expected<std::vector<uint8_t>> 412be691f3bSpatrick DoReadMemoryTags(lldb::addr_t addr, size_t len, int32_t type) override; 413be691f3bSpatrick 414be691f3bSpatrick Status DoWriteMemoryTags(lldb::addr_t addr, size_t len, int32_t type, 415be691f3bSpatrick const std::vector<uint8_t> &tags) override; 416be691f3bSpatrick 417*f6aab3d8Srobert Status DoGetMemoryRegionInfo(lldb::addr_t load_addr, 418*f6aab3d8Srobert MemoryRegionInfo ®ion_info) override; 419*f6aab3d8Srobert 420061da546Spatrick private: 421061da546Spatrick // For ProcessGDBRemote only 422061da546Spatrick std::string m_partial_profile_data; 423061da546Spatrick std::map<uint64_t, uint32_t> m_thread_id_to_used_usec_map; 424061da546Spatrick uint64_t m_last_signals_version = 0; 425061da546Spatrick 426061da546Spatrick static bool NewThreadNotifyBreakpointHit(void *baton, 427061da546Spatrick StoppointCallbackContext *context, 428061da546Spatrick lldb::user_id_t break_id, 429061da546Spatrick lldb::user_id_t break_loc_id); 430061da546Spatrick 431061da546Spatrick // ContinueDelegate interface 432061da546Spatrick void HandleAsyncStdout(llvm::StringRef out) override; 433061da546Spatrick void HandleAsyncMisc(llvm::StringRef data) override; 434061da546Spatrick void HandleStopReply() override; 435061da546Spatrick void HandleAsyncStructuredDataPacket(llvm::StringRef data) override; 436061da546Spatrick 437061da546Spatrick void SetThreadPc(const lldb::ThreadSP &thread_sp, uint64_t index); 438061da546Spatrick using ModuleCacheKey = std::pair<std::string, std::string>; 439061da546Spatrick // KeyInfo for the cached module spec DenseMap. 440061da546Spatrick // The invariant is that all real keys will have the file and architecture 441061da546Spatrick // set. 442061da546Spatrick // The empty key has an empty file and an empty arch. 443061da546Spatrick // The tombstone key has an invalid arch and an empty file. 444061da546Spatrick // The comparison and hash functions take the file name and architecture 445061da546Spatrick // triple into account. 446061da546Spatrick struct ModuleCacheInfo { getEmptyKeyModuleCacheInfo447061da546Spatrick static ModuleCacheKey getEmptyKey() { return ModuleCacheKey(); } 448061da546Spatrick getTombstoneKeyModuleCacheInfo449061da546Spatrick static ModuleCacheKey getTombstoneKey() { return ModuleCacheKey("", "T"); } 450061da546Spatrick getHashValueModuleCacheInfo451061da546Spatrick static unsigned getHashValue(const ModuleCacheKey &key) { 452061da546Spatrick return llvm::hash_combine(key.first, key.second); 453061da546Spatrick } 454061da546Spatrick isEqualModuleCacheInfo455061da546Spatrick static bool isEqual(const ModuleCacheKey &LHS, const ModuleCacheKey &RHS) { 456061da546Spatrick return LHS == RHS; 457061da546Spatrick } 458061da546Spatrick }; 459061da546Spatrick 460061da546Spatrick llvm::DenseMap<ModuleCacheKey, ModuleSpec, ModuleCacheInfo> 461061da546Spatrick m_cached_module_specs; 462061da546Spatrick 463dda28197Spatrick ProcessGDBRemote(const ProcessGDBRemote &) = delete; 464dda28197Spatrick const ProcessGDBRemote &operator=(const ProcessGDBRemote &) = delete; 465*f6aab3d8Srobert 466*f6aab3d8Srobert // fork helpers 467*f6aab3d8Srobert void DidForkSwitchSoftwareBreakpoints(bool enable); 468*f6aab3d8Srobert void DidForkSwitchHardwareTraps(bool enable); 469061da546Spatrick }; 470061da546Spatrick 471061da546Spatrick } // namespace process_gdb_remote 472061da546Spatrick } // namespace lldb_private 473061da546Spatrick 474dda28197Spatrick #endif // LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_PROCESSGDBREMOTE_H 475