124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ProcessGDBRemote.h --------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef liblldb_ProcessGDBRemote_h_
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_ProcessGDBRemote_h_
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <list>
17c1f4587c3cc1b6de2f59d472762e9eb16819feffGreg Clayton#include <vector>
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ArchSpec.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Broadcaster.h"
22f0c0882ff3fd98456c1814b495888092da2f13f6Jason Molenda#include "lldb/Core/ConstString.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Error.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/InputReader.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamString.h"
267508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham#include "lldb/Core/StringList.h"
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ThreadSafeValue.h"
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h"
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3161d043bbb1a1a20abf01dc73fa50c1ca0a46d71dGreg Clayton#include "GDBRemoteCommunicationClient.h"
3254e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton#include "Utility/StringExtractor.h"
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "GDBRemoteRegisterContext.h"
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass ThreadGDBRemote;
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass ProcessGDBRemote : public lldb_private::Process
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Constructors and Destructors
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
4346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    static lldb::ProcessSP
4446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    CreateInstance (lldb_private::Target& target,
4546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                    lldb_private::Listener &listener,
4646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                    const lldb_private::FileSpec *crash_file_path);
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static void
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Initialize();
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static void
5297abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton    DebuggerInitialize (lldb_private::Debugger &debugger);
5397abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton
5497abb6ddae805a91ccf28a3a91fa68252dcf1fe2Greg Clayton    static void
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Terminate();
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
570e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    static lldb_private::ConstString
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetPluginNameStatic();
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static const char *
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetPluginDescriptionStatic();
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Constructors and Destructors
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ProcessGDBRemote(lldb_private::Target& target, lldb_private::Listener &listener);
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~ProcessGDBRemote();
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Check if a given Process
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
758d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton    CanDebug (lldb_private::Target &target,
768d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton              bool plugin_specified_by_name);
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7813193d5ae15f194102c14a5ccdc46e8db5c3d95fGreg Clayton    virtual lldb_private::CommandObject *
7913193d5ae15f194102c14a5ccdc46e8db5c3d95fGreg Clayton    GetPluginCommandObject();
807508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Creating a new process, or attaching to an existing one
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual lldb_private::Error
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    WillLaunch (lldb_private::Module* module);
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual lldb_private::Error
8836bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton    DoLaunch (lldb_private::Module *exe_module,
8936bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton              const lldb_private::ProcessLaunchInfo &launch_info);
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual void
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DidLaunch ();
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual lldb_private::Error
9520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    WillAttachToProcessWithID (lldb::pid_t pid);
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual lldb_private::Error
9820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    WillAttachToProcessWithName (const char *process_name, bool wait_for_launch);
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
100e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton    virtual lldb_private::Error
101fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda    DoConnectRemote (lldb_private::Stream *strm, const char *remote_url);
102e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb_private::Error
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    WillLaunchOrAttach ();
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual lldb_private::Error
10754e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton    DoAttachToProcessWithID (lldb::pid_t pid);
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual lldb_private::Error
110d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong    DoAttachToProcessWithID (lldb::pid_t pid, const lldb_private::ProcessAttachInfo &attach_info);
111d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong
112d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong    virtual lldb_private::Error
113d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong    DoAttachToProcessWithName (const char *process_name,
114d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong                               bool wait_for_launch,
115d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong                               const lldb_private::ProcessAttachInfo &attach_info);
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual void
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DidAttach ();
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // PluginInterface protocol
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
1230e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    virtual lldb_private::ConstString
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetPluginName();
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual uint32_t
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetPluginVersion();
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Process Control
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual lldb_private::Error
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    WillResume ();
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual lldb_private::Error
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DoResume ();
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual lldb_private::Error
1393ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham    DoHalt (bool &caused_stop);
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual lldb_private::Error
142761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham    DoDetach (bool keep_stopped);
143e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham
144e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham    virtual bool
145e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham    DetachRequiresHalt() { return true; }
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual lldb_private::Error
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DoSignal (int signal);
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual lldb_private::Error
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DoDestroy ();
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual void
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    RefreshStateAfterStop();
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Process Queries
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    IsAlive ();
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual lldb::addr_t
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetImageInfoAddress();
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Process Memory
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual size_t
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DoReadMemory (lldb::addr_t addr, void *buf, size_t size, lldb_private::Error &error);
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual size_t
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DoWriteMemory (lldb::addr_t addr, const void *buf, size_t size, lldb_private::Error &error);
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual lldb::addr_t
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DoAllocateMemory (size_t size, uint32_t permissions, lldb_private::Error &error);
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual lldb_private::Error
178a9385537809ef342c843c5ab972e513742652047Greg Clayton    GetMemoryRegionInfo (lldb::addr_t load_addr,
179a9385537809ef342c843c5ab972e513742652047Greg Clayton                         lldb_private::MemoryRegionInfo &region_info);
180a9385537809ef342c843c5ab972e513742652047Greg Clayton
181a9385537809ef342c843c5ab972e513742652047Greg Clayton    virtual lldb_private::Error
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DoDeallocateMemory (lldb::addr_t ptr);
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Process STDIO
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual size_t
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PutSTDIN (const char *buf, size_t buf_size, lldb_private::Error &error);
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //----------------------------------------------------------------------
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Process Breakpoints
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //----------------------------------------------------------------------
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual lldb_private::Error
194efb4aeba2bd8411ac0aee9934f08959094d50711Jim Ingham    EnableBreakpointSite (lldb_private::BreakpointSite *bp_site);
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual lldb_private::Error
197efb4aeba2bd8411ac0aee9934f08959094d50711Jim Ingham    DisableBreakpointSite (lldb_private::BreakpointSite *bp_site);
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //----------------------------------------------------------------------
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Process Watchpoints
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //----------------------------------------------------------------------
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual lldb_private::Error
2039c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    EnableWatchpoint (lldb_private::Watchpoint *wp, bool notify = true);
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual lldb_private::Error
2069c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham    DisableWatchpoint (lldb_private::Watchpoint *wp, bool notify = true);
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2087cbdcfb0cefcfd877b507ff2d83e51a1bde3fcc7Johnny Chen    virtual lldb_private::Error
2097cbdcfb0cefcfd877b507ff2d83e51a1bde3fcc7Johnny Chen    GetWatchpointSupportInfo (uint32_t &num);
2107cbdcfb0cefcfd877b507ff2d83e51a1bde3fcc7Johnny Chen
2117de2a3b03f37987c67f142ce328cc2484c831468Enrico Granata    virtual lldb_private::Error
2127de2a3b03f37987c67f142ce328cc2484c831468Enrico Granata    GetWatchpointSupportInfo (uint32_t &num, bool& after);
2137de2a3b03f37987c67f142ce328cc2484c831468Enrico Granata
21455e01d8635032ee10cc06e0114213a76a8677be0Jim Ingham    virtual bool
21555e01d8635032ee10cc06e0114213a76a8677be0Jim Ingham    StartNoticingNewThreads();
21655e01d8635032ee10cc06e0114213a76a8677be0Jim Ingham
21755e01d8635032ee10cc06e0114213a76a8677be0Jim Ingham    virtual bool
21855e01d8635032ee10cc06e0114213a76a8677be0Jim Ingham    StopNoticingNewThreads();
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
220451fa8288fdf6766407906a3f83f5e11b35faebeGreg Clayton    GDBRemoteCommunicationClient &
221451fa8288fdf6766407906a3f83f5e11b35faebeGreg Clayton    GetGDBRemote()
222451fa8288fdf6766407906a3f83f5e11b35faebeGreg Clayton    {
223451fa8288fdf6766407906a3f83f5e11b35faebeGreg Clayton        return m_gdb_comm;
224451fa8288fdf6766407906a3f83f5e11b35faebeGreg Clayton    }
225451fa8288fdf6766407906a3f83f5e11b35faebeGreg Clayton
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    friend class ThreadGDBRemote;
22861d043bbb1a1a20abf01dc73fa50c1ca0a46d71dGreg Clayton    friend class GDBRemoteCommunicationClient;
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    friend class GDBRemoteRegisterContext;
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //----------------------------------------------------------------------
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Accessors
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //----------------------------------------------------------------------
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    IsRunning ( lldb::StateType state )
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return    state == lldb::eStateRunning || IsStepping(state);
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    IsStepping ( lldb::StateType state)
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return    state == lldb::eStateStepping;
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CanResume ( lldb::StateType state)
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return state == lldb::eStateStopped;
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    HasExited (lldb::StateType state)
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return state == lldb::eStateExited;
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ProcessIDIsValid ( ) const;
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Clear ( );
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb_private::Flags &
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetFlags ()
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_flags;
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const lldb_private::Flags &
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetFlags () const
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_flags;
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
275ae932359b80098532f3c3766fa9e6527352fbb67Greg Clayton    virtual bool
27637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    UpdateThreadList (lldb_private::ThreadList &old_thread_list,
27737f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton                      lldb_private::ThreadList &new_thread_list);
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb_private::Error
280b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    StartDebugserverProcess (const char *debugserver_url);
281d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong
282d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong    lldb_private::Error
283d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong    StartDebugserverProcess (const char *debugserver_url, const lldb_private::ProcessInfo &process_info);
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    KillDebugserverProcess ();
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
2897e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton    BuildDynamicRegisterInfo (bool force);
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2910670900f9501137216a5aa6edce9c4bf94bb74b3Greg Clayton    void
292e3f9bfdfe3d09ef089f2aef3fb8701c8721f6f45Greg Clayton    SetLastStopPacket (const StringExtractorGDBRemote &response);
293b0e3c7c4d063da2cc6a2550ad4979d5c342c8306Jason Molenda
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Broadcaster event bits definitions.
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    enum
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        eBroadcastBitAsyncContinue                  = (1 << 0),
3007fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham        eBroadcastBitAsyncThreadShouldExit          = (1 << 1),
3017fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham        eBroadcastBitAsyncThreadDidExit             = (1 << 2)
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
304a948830c995f06bca836a0b104df567bad7dc822Jim Ingham    typedef enum AsyncThreadState
305a948830c995f06bca836a0b104df567bad7dc822Jim Ingham    {
306a948830c995f06bca836a0b104df567bad7dc822Jim Ingham        eAsyncThreadNotStarted,
307a948830c995f06bca836a0b104df567bad7dc822Jim Ingham        eAsyncThreadRunning,
308a948830c995f06bca836a0b104df567bad7dc822Jim Ingham        eAsyncThreadDone
309a948830c995f06bca836a0b104df567bad7dc822Jim Ingham    } AsyncThreadState;
310a948830c995f06bca836a0b104df567bad7dc822Jim Ingham
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb_private::Flags m_flags;            // Process specific flags (see eFlags enums)
31261d043bbb1a1a20abf01dc73fa50c1ca0a46d71dGreg Clayton    GDBRemoteCommunicationClient m_gdb_comm;
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::pid_t m_debugserver_pid;
314261a18b0176b0810438b504298df1293ac2f4211Greg Clayton    StringExtractorGDBRemote m_last_stop_packet;
3150670900f9501137216a5aa6edce9c4bf94bb74b3Greg Clayton    lldb_private::Mutex m_last_stop_packet_mutex;
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GDBRemoteDynamicRegisterInfo m_register_info;
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb_private::Broadcaster m_async_broadcaster;
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::thread_t m_async_thread;
319a948830c995f06bca836a0b104df567bad7dc822Jim Ingham    AsyncThreadState m_async_thread_state;
320a948830c995f06bca836a0b104df567bad7dc822Jim Ingham    lldb_private::Mutex m_async_thread_state_mutex;
321c1f4587c3cc1b6de2f59d472762e9eb16819feffGreg Clayton    typedef std::vector<lldb::tid_t> tid_collection;
322c1f4587c3cc1b6de2f59d472762e9eb16819feffGreg Clayton    typedef std::vector< std::pair<lldb::tid_t,int> > tid_sig_collection;
3232f085c6ca2895663687dca704589478ff040b849Greg Clayton    typedef std::map<lldb::addr_t, lldb::addr_t> MMapMap;
3245a9f85ca5734fec866257ff062a2e3349f330ecfGreg Clayton    tid_collection m_thread_ids; // Thread IDs for all threads. This list gets updated after stopping
325c1f4587c3cc1b6de2f59d472762e9eb16819feffGreg Clayton    tid_collection m_continue_c_tids;                  // 'c' for continue
326c1f4587c3cc1b6de2f59d472762e9eb16819feffGreg Clayton    tid_sig_collection m_continue_C_tids; // 'C' for continue with signal
327c1f4587c3cc1b6de2f59d472762e9eb16819feffGreg Clayton    tid_collection m_continue_s_tids;                  // 's' for step
328c1f4587c3cc1b6de2f59d472762e9eb16819feffGreg Clayton    tid_sig_collection m_continue_S_tids; // 'S' for step with signal
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::addr_t m_dispatch_queue_offsets_addr;
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t m_max_memory_size;       // The maximum number of bytes to read/write when reading and writing memory
3312f085c6ca2895663687dca704589478ff040b849Greg Clayton    MMapMap m_addr_to_mmap_size;
332bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton    lldb::BreakpointSP m_thread_create_bp_sp;
333bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton    bool m_waiting_for_attach;
33406b84494c72ceb559ca07ff5e2ccd2fe645b6363Jim Ingham    bool m_destroy_tried_resuming;
33513193d5ae15f194102c14a5ccdc46e8db5c3d95fGreg Clayton    lldb::CommandObjectSP m_command_sp;
336bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StartAsyncThread ();
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StopAsyncThread ();
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static void *
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    AsyncThread (void *arg);
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static bool
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    MonitorDebugserverProcess (void *callback_baton,
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                               lldb::pid_t pid,
3491c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton                               bool exited,
3501c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton                               int signo,
3511c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton                               int exit_status);
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::StateType
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetThreadStopInfo (StringExtractor& stop_packet);
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
3575a9f85ca5734fec866257ff062a2e3349f330ecfGreg Clayton    ClearThreadIDList ();
3585a9f85ca5734fec866257ff062a2e3349f330ecfGreg Clayton
3595a9f85ca5734fec866257ff062a2e3349f330ecfGreg Clayton    bool
3605a9f85ca5734fec866257ff062a2e3349f330ecfGreg Clayton    UpdateThreadIDList ();
3615a9f85ca5734fec866257ff062a2e3349f330ecfGreg Clayton
3625a9f85ca5734fec866257ff062a2e3349f330ecfGreg Clayton    void
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DidLaunchOrAttach ();
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb_private::Error
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ConnectToDebugserver (const char *host_port);
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetDispatchQueueNameForThread (lldb::addr_t thread_dispatch_qaddr,
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                   std::string &dispatch_queue_name);
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static size_t
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    AttachInputReaderCallback (void *baton,
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                               lldb_private::InputReader *reader,
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                               lldb::InputReaderAction notification,
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                               const char *bytes,
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                               size_t bytes_len);
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
379b46937c86ca4551b2fc9813d848b1a0a2bf2e636Jason Molenda    lldb_private::DynamicLoader *
380b46937c86ca4551b2fc9813d848b1a0a2bf2e636Jason Molenda    GetDynamicLoader ();
381b46937c86ca4551b2fc9813d848b1a0a2bf2e636Jason Molenda
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // For ProcessGDBRemote only
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
38655e01d8635032ee10cc06e0114213a76a8677be0Jim Ingham    static bool
38755e01d8635032ee10cc06e0114213a76a8677be0Jim Ingham    NewThreadNotifyBreakpointHit (void *baton,
38855e01d8635032ee10cc06e0114213a76a8677be0Jim Ingham                         lldb_private::StoppointCallbackContext *context,
38955e01d8635032ee10cc06e0114213a76a8677be0Jim Ingham                         lldb::user_id_t break_id,
39055e01d8635032ee10cc06e0114213a76a8677be0Jim Ingham                         lldb::user_id_t break_loc_id);
39155e01d8635032ee10cc06e0114213a76a8677be0Jim Ingham
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DISALLOW_COPY_AND_ASSIGN (ProcessGDBRemote);
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_ProcessGDBRemote_h_
397