Process.h revision 0296fe73a7cb1482226b1303a795ede00e12d677
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//===-- Process.h -----------------------------------------------*- C++ -*-===//
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//                     The LLVM Compiler Infrastructure
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// This file is distributed under the University of Illinois Open Source
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// License. See LICENSE.TXT for details.
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//===----------------------------------------------------------------------===//
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef liblldb_Process_h_
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define liblldb_Process_h_
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// C Includes
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <limits.h>
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <spawn.h>
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// C++ Includes
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <list>
19788717ca599c714d58b2cb5deea1d37b4a711c07Eino-Ville Talvala#include <iosfwd>
2010e09c69d659bf54d6efbe1a3660add7f8a39d6eWu-cheng Li#include <vector>
2110e09c69d659bf54d6efbe1a3660add7f8a39d6eWu-cheng Li
224f8e5ce21df881796d05a1b2117dd8868570a57bEino-Ville Talvala// Other libraries and framework includes
23a696f5d667227365da732481770767dcb330dd23Mathias Agopian// Project includes
244c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li#include "lldb/lldb-private.h"
2530771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li#include "lldb/Core/ArchSpec.h"
26fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis#include "lldb/Core/Broadcaster.h"
274f8e5ce21df881796d05a1b2117dd8868570a57bEino-Ville Talvala#include "lldb/Core/Communication.h"
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "lldb/Core/Error.h"
294f8e5ce21df881796d05a1b2117dd8868570a57bEino-Ville Talvala#include "lldb/Core/Event.h"
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "lldb/Core/StringList.h"
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "lldb/Core/ThreadSafeValue.h"
324f8e5ce21df881796d05a1b2117dd8868570a57bEino-Ville Talvala#include "lldb/Core/PluginInterface.h"
334f8e5ce21df881796d05a1b2117dd8868570a57bEino-Ville Talvala#include "lldb/Core/UserSettingsController.h"
347005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala#include "lldb/Breakpoint/BreakpointSiteList.h"
357005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala#include "lldb/Expression/ClangPersistentVariables.h"
367005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala#include "lldb/Expression/IRDynamicChecks.h"
377005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala#include "lldb/Host/FileSpec.h"
387005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala#include "lldb/Interpreter/Args.h"
39bde61a5731cdfef76a0691f8bd53b880606f5f6eWu-cheng Li#include "lldb/Interpreter/Options.h"
400a12018e4cd6eaaeaec795f6b2af4499fe3a8bcdAli Utku Selen#include "lldb/Target/ExecutionContextScope.h"
41bde61a5731cdfef76a0691f8bd53b880606f5f6eWu-cheng Li#include "lldb/Target/Memory.h"
42bde61a5731cdfef76a0691f8bd53b880606f5f6eWu-cheng Li#include "lldb/Target/ThreadList.h"
43bde61a5731cdfef76a0691f8bd53b880606f5f6eWu-cheng Li#include "lldb/Target/UnixSignals.h"
44bde61a5731cdfef76a0691f8bd53b880606f5f6eWu-cheng Li
45bde61a5731cdfef76a0691f8bd53b880606f5f6eWu-cheng Linamespace lldb_private {
46bde61a5731cdfef76a0691f8bd53b880606f5f6eWu-cheng Li
47bde61a5731cdfef76a0691f8bd53b880606f5f6eWu-cheng Li//----------------------------------------------------------------------
487d9a8ffd08fa950eb14f8224f6090fe46ab4aa9fIgor Murashkin// ProcessInstanceSettings
49bde61a5731cdfef76a0691f8bd53b880606f5f6eWu-cheng Li//----------------------------------------------------------------------
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass ProcessInstanceSettings : public InstanceSettings
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
52bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnorpublic:
53bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
54bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    ProcessInstanceSettings (UserSettingsController &owner, bool live_instance = true, const char *name = NULL);
55df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main
56bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    ProcessInstanceSettings (const ProcessInstanceSettings &rhs);
577478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Li
58df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main    virtual
59df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main    ~ProcessInstanceSettings ();
60bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
617478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Li    ProcessInstanceSettings&
62df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main    operator= (const ProcessInstanceSettings &rhs);
63df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main
64df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main
65df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main    void
66df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main    UpdateInstanceSettingsVariable (const ConstString &var_name,
67bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor                                    const char *index_value,
68bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor                                    const char *value,
69bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor                                    const ConstString &instance_name,
70341ff13689dfe822b598e626272ac2e80041b482Dan Egnor                                    const SettingEntry &entry,
71bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor                                    VarSetOperationType op,
72bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor                                    Error &err,
73bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor                                    bool pending);
74bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
75bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    bool
76bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    GetInstanceSettingsValue (const SettingEntry &entry,
77bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor                              const ConstString &var_name,
78bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor                              StringList &value,
79bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor                              Error *err);
80bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
81bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
82bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnorprotected:
83bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
84bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    void
85bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    CopyInstanceSettings (const lldb::InstanceSettingsSP &new_settings,
86bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor                          bool pending);
87bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
88bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    const ConstString
89bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    CreateInstanceName ();
90bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor};
91bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
92bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor//----------------------------------------------------------------------
93bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor// ProcessInfo
94bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor//
95bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor// A base class for information for a process. This can be used to fill
96bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor// out information for a process prior to launching it, or it can be
97bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor// used for an instance of a process and can be filled in with the
98bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor// existing values for that process.
99bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor//----------------------------------------------------------------------
100bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnorclass ProcessInfo
101bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor{
102bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnorpublic:
103bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    ProcessInfo () :
104bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        m_executable (),
105bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        m_arguments (),
106bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        m_environment (),
107bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        m_uid (UINT32_MAX),
108bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        m_gid (UINT32_MAX),
109bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        m_arch(),
110bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        m_pid (LLDB_INVALID_PROCESS_ID)
111bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    {
112bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    }
113bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
114bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    ProcessInfo (const char *name,
115bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor                 const ArchSpec &arch,
116bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor                 lldb::pid_t pid) :
117bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        m_executable (name, false),
118bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        m_arguments (),
119bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        m_environment(),
120bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        m_uid (UINT32_MAX),
121bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        m_gid (UINT32_MAX),
122341ff13689dfe822b598e626272ac2e80041b482Dan Egnor        m_arch (arch),
123bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        m_pid (pid)
124bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    {
125df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main    }
126df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main
127df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main    void
1287478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Li    Clear ()
129df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main    {
1306c5c3c392b8abce93fd2d366f12449c713ed0016Joe Fernandez        m_executable.Clear();
1316c5c3c392b8abce93fd2d366f12449c713ed0016Joe Fernandez        m_arguments.Clear();
1326c5c3c392b8abce93fd2d366f12449c713ed0016Joe Fernandez        m_environment.Clear();
1336c5c3c392b8abce93fd2d366f12449c713ed0016Joe Fernandez        m_uid = UINT32_MAX;
1346c5c3c392b8abce93fd2d366f12449c713ed0016Joe Fernandez        m_gid = UINT32_MAX;
1356c5c3c392b8abce93fd2d366f12449c713ed0016Joe Fernandez        m_arch.Clear();
136b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala        m_pid = LLDB_INVALID_PROCESS_ID;
137b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    }
138b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char *
140b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    GetName() const
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return m_executable.GetFilename().GetCString();
1439b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    }
144d2c2929c94bec68741b85f4174e11307fb65157fWu-cheng Li
145da83f4674a564007baac03db062a289c8158d940Benny Wong    size_t
146da83f4674a564007baac03db062a289c8158d940Benny Wong    GetNameLength() const
147da83f4674a564007baac03db062a289c8158d940Benny Wong    {
148da83f4674a564007baac03db062a289c8158d940Benny Wong        return m_executable.GetFilename().GetLength();
149da83f4674a564007baac03db062a289c8158d940Benny Wong    }
150da83f4674a564007baac03db062a289c8158d940Benny Wong
151da83f4674a564007baac03db062a289c8158d940Benny Wong    void
152da83f4674a564007baac03db062a289c8158d940Benny Wong    SetName (const char *name)
153da83f4674a564007baac03db062a289c8158d940Benny Wong    {
1544c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li        m_executable.GetFilename().SetCString (name);
155bb1e275c0e684dd213f124da77110cdd9d6f090cWu-cheng Li    }
1569d062cfe94dcd24b1d61fc83e5de565cb67965b1Wu-cheng Li
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    FileSpec &
1584838e338129e09a37b8c8ad5e44f85ec5cd3aea1Ashok Bhat    GetExecutableFile ()
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return m_executable;
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void
1647005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    SetExecutableFile (const FileSpec &exe_file, bool add_exe_file_as_first_arg)
165e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks    {
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (exe_file)
1679d062cfe94dcd24b1d61fc83e5de565cb67965b1Wu-cheng Li        {
1683f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li            m_executable = exe_file;
1694c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li            if (add_exe_file_as_first_arg)
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            {
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                m_arguments.Clear();
17294927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp                char filename[PATH_MAX];
1734c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li                if (exe_file.GetPath(filename, sizeof(filename)))
174a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin                    m_arguments.AppendArgument (filename);
1759b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            }
176feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk        }
177feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk        else
178feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk        {
1794c913801141163362dd5bb7c9784c83f69c11054Zhijun He            m_executable.Clear();
1804c913801141163362dd5bb7c9784c83f69c11054Zhijun He            if (add_exe_file_as_first_arg)
1814c913801141163362dd5bb7c9784c83f69c11054Zhijun He                m_arguments.Clear();
1824c913801141163362dd5bb7c9784c83f69c11054Zhijun He        }
1834c913801141163362dd5bb7c9784c83f69c11054Zhijun He    }
184feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const FileSpec &
18610e09c69d659bf54d6efbe1a3660add7f8a39d6eWu-cheng Li    GetExecutableFile () const
18710e09c69d659bf54d6efbe1a3660add7f8a39d6eWu-cheng Li    {
18810e09c69d659bf54d6efbe1a3660add7f8a39d6eWu-cheng Li        return m_executable;
18910e09c69d659bf54d6efbe1a3660add7f8a39d6eWu-cheng Li    }
19010e09c69d659bf54d6efbe1a3660add7f8a39d6eWu-cheng Li
19110e09c69d659bf54d6efbe1a3660add7f8a39d6eWu-cheng Li    uint32_t
19210e09c69d659bf54d6efbe1a3660add7f8a39d6eWu-cheng Li    GetUserID() const
19310e09c69d659bf54d6efbe1a3660add7f8a39d6eWu-cheng Li    {
19410e09c69d659bf54d6efbe1a3660add7f8a39d6eWu-cheng Li        return m_uid;
19510e09c69d659bf54d6efbe1a3660add7f8a39d6eWu-cheng Li    }
19610e09c69d659bf54d6efbe1a3660add7f8a39d6eWu-cheng Li
19710e09c69d659bf54d6efbe1a3660add7f8a39d6eWu-cheng Li    uint32_t
19810e09c69d659bf54d6efbe1a3660add7f8a39d6eWu-cheng Li    GetGroupID() const
19910e09c69d659bf54d6efbe1a3660add7f8a39d6eWu-cheng Li    {
20010e09c69d659bf54d6efbe1a3660add7f8a39d6eWu-cheng Li        return m_gid;
20110e09c69d659bf54d6efbe1a3660add7f8a39d6eWu-cheng Li    }
2024c913801141163362dd5bb7c9784c83f69c11054Zhijun He
2034c913801141163362dd5bb7c9784c83f69c11054Zhijun He    bool
2044c913801141163362dd5bb7c9784c83f69c11054Zhijun He    UserIDIsValid () const
2054c913801141163362dd5bb7c9784c83f69c11054Zhijun He    {
2064c913801141163362dd5bb7c9784c83f69c11054Zhijun He        return m_uid != UINT32_MAX;
2074c913801141163362dd5bb7c9784c83f69c11054Zhijun He    }
2084c913801141163362dd5bb7c9784c83f69c11054Zhijun He
2094c913801141163362dd5bb7c9784c83f69c11054Zhijun He    bool
210a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin    GroupIDIsValid () const
2114c913801141163362dd5bb7c9784c83f69c11054Zhijun He    {
2124c913801141163362dd5bb7c9784c83f69c11054Zhijun He        return m_gid != UINT32_MAX;
2134c913801141163362dd5bb7c9784c83f69c11054Zhijun He    }
2144c913801141163362dd5bb7c9784c83f69c11054Zhijun He
2154c913801141163362dd5bb7c9784c83f69c11054Zhijun He    void
216a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin    SetUserID (uint32_t uid)
2174c913801141163362dd5bb7c9784c83f69c11054Zhijun He    {
2184c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li        m_uid = uid;
2194c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    }
220c0c683b3344c67700882f8059e7d18266366daa9Wu-cheng Li
2214c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    void
2224c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    SetGroupID (uint32_t gid)
223c0c683b3344c67700882f8059e7d18266366daa9Wu-cheng Li    {
2244c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li        m_gid = gid;
225c0c683b3344c67700882f8059e7d18266366daa9Wu-cheng Li    }
2264c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li
2274c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    ArchSpec &
228341ff13689dfe822b598e626272ac2e80041b482Dan Egnor    GetArchitecture ()
229e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang    {
230e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang        return m_arch;
231e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang    }
232e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang
233341ff13689dfe822b598e626272ac2e80041b482Dan Egnor    const ArchSpec &
234b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang    GetArchitecture () const
235b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang    {
2364f8e5ce21df881796d05a1b2117dd8868570a57bEino-Ville Talvala        return m_arch;
2374f8e5ce21df881796d05a1b2117dd8868570a57bEino-Ville Talvala    }
2384f8e5ce21df881796d05a1b2117dd8868570a57bEino-Ville Talvala
2394f8e5ce21df881796d05a1b2117dd8868570a57bEino-Ville Talvala    lldb::pid_t
2404f8e5ce21df881796d05a1b2117dd8868570a57bEino-Ville Talvala    GetProcessID () const
2414f8e5ce21df881796d05a1b2117dd8868570a57bEino-Ville Talvala    {
2424f8e5ce21df881796d05a1b2117dd8868570a57bEino-Ville Talvala        return m_pid;
2434f8e5ce21df881796d05a1b2117dd8868570a57bEino-Ville Talvala    }
2444f8e5ce21df881796d05a1b2117dd8868570a57bEino-Ville Talvala
2454f8e5ce21df881796d05a1b2117dd8868570a57bEino-Ville Talvala    void
2464f8e5ce21df881796d05a1b2117dd8868570a57bEino-Ville Talvala    SetProcessID (lldb::pid_t pid)
2474f8e5ce21df881796d05a1b2117dd8868570a57bEino-Ville Talvala    {
2484f8e5ce21df881796d05a1b2117dd8868570a57bEino-Ville Talvala        m_pid = pid;
2494f8e5ce21df881796d05a1b2117dd8868570a57bEino-Ville Talvala    }
2504f8e5ce21df881796d05a1b2117dd8868570a57bEino-Ville Talvala
251b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang    bool
252b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang    ProcessIDIsValid() const
253b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang    {
254b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala        return m_pid != LLDB_INVALID_PROCESS_ID;
255b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    }
256b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala
257b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang    void
258b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    Dump (Stream &s, Platform *platform) const;
259b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang
2607836660f5eb45b7b7e1f5119face65c80e2ade17Wu-cheng Li    Args &
2617836660f5eb45b7b7e1f5119face65c80e2ade17Wu-cheng Li    GetArguments ()
2627836660f5eb45b7b7e1f5119face65c80e2ade17Wu-cheng Li    {
263b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang        return m_arguments;
2647836660f5eb45b7b7e1f5119face65c80e2ade17Wu-cheng Li    }
2657836660f5eb45b7b7e1f5119face65c80e2ade17Wu-cheng Li
2667836660f5eb45b7b7e1f5119face65c80e2ade17Wu-cheng Li    const Args &
2677836660f5eb45b7b7e1f5119face65c80e2ade17Wu-cheng Li    GetArguments () const
268b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang    {
269b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang        return m_arguments;
270b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang    }
271464cb21e2aaa448072449b82156f18bd64c0e613Joe Fernandez
272b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang    void
273b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang    SetArguments (const Args& args,
2747836660f5eb45b7b7e1f5119face65c80e2ade17Wu-cheng Li                  bool first_arg_is_executable,
275b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang                  bool first_arg_is_executable_and_argument);
276b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang
27732a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    void
278b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang    SetArguments (char const **argv,
27932a972c693400db50717435139fa292a63bc937aEino-Ville Talvala                  bool first_arg_is_executable,
280b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang                  bool first_arg_is_executable_and_argument);
28132a972c693400db50717435139fa292a63bc937aEino-Ville Talvala
2822fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li    Args &
2832fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li    GetEnvironmentEntries ()
2842fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li    {
2852fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li        return m_environment;
28632a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    }
287b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang
288b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang    const Args &
28969ea4e15e52c456537575d21443ac1efdb03a902Brad Fitzpatrick    GetEnvironmentEntries () const
29069ea4e15e52c456537575d21443ac1efdb03a902Brad Fitzpatrick    {
29169ea4e15e52c456537575d21443ac1efdb03a902Brad Fitzpatrick        return m_environment;
29269ea4e15e52c456537575d21443ac1efdb03a902Brad Fitzpatrick    }
293b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang
2947836660f5eb45b7b7e1f5119face65c80e2ade17Wu-cheng Liprotected:
295f7c6c5ad64c8e5d20e1806cc98b9919334c69614Eino-Ville Talvala    FileSpec m_executable;
296f7c6c5ad64c8e5d20e1806cc98b9919334c69614Eino-Ville Talvala    Args m_arguments;
297f7c6c5ad64c8e5d20e1806cc98b9919334c69614Eino-Ville Talvala    Args m_environment;
298f7c6c5ad64c8e5d20e1806cc98b9919334c69614Eino-Ville Talvala    uint32_t m_uid;
299f7c6c5ad64c8e5d20e1806cc98b9919334c69614Eino-Ville Talvala    uint32_t m_gid;
300f7c6c5ad64c8e5d20e1806cc98b9919334c69614Eino-Ville Talvala    ArchSpec m_arch;
301f7c6c5ad64c8e5d20e1806cc98b9919334c69614Eino-Ville Talvala    lldb::pid_t m_pid;
302f7c6c5ad64c8e5d20e1806cc98b9919334c69614Eino-Ville Talvala};
303f7c6c5ad64c8e5d20e1806cc98b9919334c69614Eino-Ville Talvala
304f7c6c5ad64c8e5d20e1806cc98b9919334c69614Eino-Ville Talvala//----------------------------------------------------------------------
305f7c6c5ad64c8e5d20e1806cc98b9919334c69614Eino-Ville Talvala// ProcessInstanceInfo
306f7c6c5ad64c8e5d20e1806cc98b9919334c69614Eino-Ville Talvala//
307f7c6c5ad64c8e5d20e1806cc98b9919334c69614Eino-Ville Talvala// Describes an existing process and any discoverable information that
308f7c6c5ad64c8e5d20e1806cc98b9919334c69614Eino-Ville Talvala// pertains to that process.
309f7c6c5ad64c8e5d20e1806cc98b9919334c69614Eino-Ville Talvala//----------------------------------------------------------------------
310b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Changclass ProcessInstanceInfo : public ProcessInfo
311b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang{
312b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Changpublic:
313a1c41e13b521cdd611a8fc46e43b5ae0a2c00238Wu-cheng Li    ProcessInstanceInfo () :
314a1c41e13b521cdd611a8fc46e43b5ae0a2c00238Wu-cheng Li        ProcessInfo (),
315a1c41e13b521cdd611a8fc46e43b5ae0a2c00238Wu-cheng Li        m_euid (UINT32_MAX),
316a1c41e13b521cdd611a8fc46e43b5ae0a2c00238Wu-cheng Li        m_egid (UINT32_MAX),
317bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        m_parent_pid (LLDB_INVALID_PROCESS_ID)
318bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    {
319bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    }
320341ff13689dfe822b598e626272ac2e80041b482Dan Egnor
321341ff13689dfe822b598e626272ac2e80041b482Dan Egnor    ProcessInstanceInfo (const char *name,
322bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor                 const ArchSpec &arch,
323bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor                 lldb::pid_t pid) :
324bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        ProcessInfo (name, arch, pid),
325bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        m_euid (UINT32_MAX),
326bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        m_egid (UINT32_MAX),
327bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        m_parent_pid (LLDB_INVALID_PROCESS_ID)
328bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    {
329bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    }
330bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
331bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    void
332bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    Clear ()
333341ff13689dfe822b598e626272ac2e80041b482Dan Egnor    {
334a48b70fa8ff6363d1e5282be70f6be12bc0688dcWu-cheng Li        ProcessInfo::Clear();
335bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        m_euid = UINT32_MAX;
336a1c41e13b521cdd611a8fc46e43b5ae0a2c00238Wu-cheng Li        m_egid = UINT32_MAX;
337a1c41e13b521cdd611a8fc46e43b5ae0a2c00238Wu-cheng Li        m_parent_pid = LLDB_INVALID_PROCESS_ID;
338a1c41e13b521cdd611a8fc46e43b5ae0a2c00238Wu-cheng Li    }
339facc8ce116bd92f7ba7e8ecb76cbda3953260ef9Wu-cheng Li
340e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang    uint32_t
341e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang    GetEffectiveUserID() const
3427bc1b21a5217c3737ae82edd3ff2d901c69a51adWu-cheng Li    {
343e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang        return m_euid;
344e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang    }
345e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang
346a48b70fa8ff6363d1e5282be70f6be12bc0688dcWu-cheng Li    uint32_t
347a48b70fa8ff6363d1e5282be70f6be12bc0688dcWu-cheng Li    GetEffectiveGroupID() const
348a48b70fa8ff6363d1e5282be70f6be12bc0688dcWu-cheng Li    {
3497836660f5eb45b7b7e1f5119face65c80e2ade17Wu-cheng Li        return m_egid;
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3519b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
352a48b70fa8ff6363d1e5282be70f6be12bc0688dcWu-cheng Li    bool
353a48b70fa8ff6363d1e5282be70f6be12bc0688dcWu-cheng Li    EffectiveUserIDIsValid () const
354a48b70fa8ff6363d1e5282be70f6be12bc0688dcWu-cheng Li    {
355a48b70fa8ff6363d1e5282be70f6be12bc0688dcWu-cheng Li        return m_euid != UINT32_MAX;
356a48b70fa8ff6363d1e5282be70f6be12bc0688dcWu-cheng Li    }
3577bc1b21a5217c3737ae82edd3ff2d901c69a51adWu-cheng Li
358a48b70fa8ff6363d1e5282be70f6be12bc0688dcWu-cheng Li    bool
359a48b70fa8ff6363d1e5282be70f6be12bc0688dcWu-cheng Li    EffectiveGroupIDIsValid () const
360a48b70fa8ff6363d1e5282be70f6be12bc0688dcWu-cheng Li    {
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return m_egid != UINT32_MAX;
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3634c913801141163362dd5bb7c9784c83f69c11054Zhijun He
3644c913801141163362dd5bb7c9784c83f69c11054Zhijun He    void
3654c913801141163362dd5bb7c9784c83f69c11054Zhijun He    SetEffectiveUserID (uint32_t uid)
3664c913801141163362dd5bb7c9784c83f69c11054Zhijun He    {
3674c913801141163362dd5bb7c9784c83f69c11054Zhijun He        m_euid = uid;
3684c913801141163362dd5bb7c9784c83f69c11054Zhijun He    }
3694c913801141163362dd5bb7c9784c83f69c11054Zhijun He
3704c913801141163362dd5bb7c9784c83f69c11054Zhijun He    void
3714c913801141163362dd5bb7c9784c83f69c11054Zhijun He    SetEffectiveGroupID (uint32_t gid)
3724c913801141163362dd5bb7c9784c83f69c11054Zhijun He    {
3734c913801141163362dd5bb7c9784c83f69c11054Zhijun He        m_egid = gid;
3744c913801141163362dd5bb7c9784c83f69c11054Zhijun He    }
3754c913801141163362dd5bb7c9784c83f69c11054Zhijun He
3764c913801141163362dd5bb7c9784c83f69c11054Zhijun He    lldb::pid_t
3774c913801141163362dd5bb7c9784c83f69c11054Zhijun He    GetParentProcessID () const
3784c913801141163362dd5bb7c9784c83f69c11054Zhijun He    {
3794c913801141163362dd5bb7c9784c83f69c11054Zhijun He        return m_parent_pid;
3804c913801141163362dd5bb7c9784c83f69c11054Zhijun He    }
3814c913801141163362dd5bb7c9784c83f69c11054Zhijun He
3824c913801141163362dd5bb7c9784c83f69c11054Zhijun He    void
3834c913801141163362dd5bb7c9784c83f69c11054Zhijun He    SetParentProcessID (lldb::pid_t pid)
3844c913801141163362dd5bb7c9784c83f69c11054Zhijun He    {
3854c913801141163362dd5bb7c9784c83f69c11054Zhijun He        m_parent_pid = pid;
3864c913801141163362dd5bb7c9784c83f69c11054Zhijun He    }
387a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin
3884c913801141163362dd5bb7c9784c83f69c11054Zhijun He    bool
389a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin    ParentProcessIDIsValid() const
390a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin    {
391a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin        return m_parent_pid != LLDB_INVALID_PROCESS_ID;
3924c913801141163362dd5bb7c9784c83f69c11054Zhijun He    }
3934c913801141163362dd5bb7c9784c83f69c11054Zhijun He
3944c913801141163362dd5bb7c9784c83f69c11054Zhijun He    void
395a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin    Dump (Stream &s, Platform *platform) const;
3964c913801141163362dd5bb7c9784c83f69c11054Zhijun He
397a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin    static void
3984c913801141163362dd5bb7c9784c83f69c11054Zhijun He    DumpTableHeader (Stream &s, Platform *platform, bool show_args, bool verbose);
3994c913801141163362dd5bb7c9784c83f69c11054Zhijun He
4004c913801141163362dd5bb7c9784c83f69c11054Zhijun He    void
4014c913801141163362dd5bb7c9784c83f69c11054Zhijun He    DumpAsTableRow (Stream &s, Platform *platform, bool show_args, bool verbose) const;
402a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin
403a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkinprotected:
404a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin    uint32_t m_euid;
405a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin    uint32_t m_egid;
4064c913801141163362dd5bb7c9784c83f69c11054Zhijun He    lldb::pid_t m_parent_pid;
4074c913801141163362dd5bb7c9784c83f69c11054Zhijun He};
4084c913801141163362dd5bb7c9784c83f69c11054Zhijun He
4094c913801141163362dd5bb7c9784c83f69c11054Zhijun He
4104c913801141163362dd5bb7c9784c83f69c11054Zhijun He//----------------------------------------------------------------------
4114c913801141163362dd5bb7c9784c83f69c11054Zhijun He// ProcessLaunchInfo
4124c913801141163362dd5bb7c9784c83f69c11054Zhijun He//
4134c913801141163362dd5bb7c9784c83f69c11054Zhijun He// Describes any information that is required to launch a process.
4144c913801141163362dd5bb7c9784c83f69c11054Zhijun He//----------------------------------------------------------------------
4154c913801141163362dd5bb7c9784c83f69c11054Zhijun He
4164c913801141163362dd5bb7c9784c83f69c11054Zhijun Heclass ProcessLaunchInfo : public ProcessInfo
417a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin{
4184c913801141163362dd5bb7c9784c83f69c11054Zhijun Hepublic:
4194c913801141163362dd5bb7c9784c83f69c11054Zhijun He
4204c913801141163362dd5bb7c9784c83f69c11054Zhijun He    class FileAction
4214c913801141163362dd5bb7c9784c83f69c11054Zhijun He    {
4224c913801141163362dd5bb7c9784c83f69c11054Zhijun He    public:
4234c913801141163362dd5bb7c9784c83f69c11054Zhijun He        enum Action
4244c913801141163362dd5bb7c9784c83f69c11054Zhijun He        {
4254c913801141163362dd5bb7c9784c83f69c11054Zhijun He            eFileActionNone,
4264c913801141163362dd5bb7c9784c83f69c11054Zhijun He            eFileActionClose,
4274c913801141163362dd5bb7c9784c83f69c11054Zhijun He            eFileActionDuplicate,
4284c913801141163362dd5bb7c9784c83f69c11054Zhijun He            eFileActionOpen
4294c913801141163362dd5bb7c9784c83f69c11054Zhijun He        };
4304c913801141163362dd5bb7c9784c83f69c11054Zhijun He
4314c913801141163362dd5bb7c9784c83f69c11054Zhijun He
4324c913801141163362dd5bb7c9784c83f69c11054Zhijun He        FileAction () :
4334c913801141163362dd5bb7c9784c83f69c11054Zhijun He            m_action (eFileActionNone),
4344c913801141163362dd5bb7c9784c83f69c11054Zhijun He            m_fd (-1),
4354c913801141163362dd5bb7c9784c83f69c11054Zhijun He            m_arg (-1),
4364c913801141163362dd5bb7c9784c83f69c11054Zhijun He            m_path ()
4374c913801141163362dd5bb7c9784c83f69c11054Zhijun He        {
4384c913801141163362dd5bb7c9784c83f69c11054Zhijun He        }
4394c913801141163362dd5bb7c9784c83f69c11054Zhijun He
4404c913801141163362dd5bb7c9784c83f69c11054Zhijun He        void
4414c913801141163362dd5bb7c9784c83f69c11054Zhijun He        Clear()
4424c913801141163362dd5bb7c9784c83f69c11054Zhijun He        {
4434c913801141163362dd5bb7c9784c83f69c11054Zhijun He            m_action = eFileActionNone;
4444c913801141163362dd5bb7c9784c83f69c11054Zhijun He            m_fd = -1;
4454c913801141163362dd5bb7c9784c83f69c11054Zhijun He            m_arg = -1;
446a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin            m_path.clear();
4474c913801141163362dd5bb7c9784c83f69c11054Zhijun He        }
4484c913801141163362dd5bb7c9784c83f69c11054Zhijun He
4494c913801141163362dd5bb7c9784c83f69c11054Zhijun He        bool
4504c913801141163362dd5bb7c9784c83f69c11054Zhijun He        Close (int fd);
4514c913801141163362dd5bb7c9784c83f69c11054Zhijun He
4524c913801141163362dd5bb7c9784c83f69c11054Zhijun He        bool
4534c913801141163362dd5bb7c9784c83f69c11054Zhijun He        Duplicate (int fd, int dup_fd);
4544c913801141163362dd5bb7c9784c83f69c11054Zhijun He
4554c913801141163362dd5bb7c9784c83f69c11054Zhijun He        bool
4564c913801141163362dd5bb7c9784c83f69c11054Zhijun He        Open (int fd, const char *path, bool read, bool write);
4574c913801141163362dd5bb7c9784c83f69c11054Zhijun He
4584c913801141163362dd5bb7c9784c83f69c11054Zhijun He        static bool
4594c913801141163362dd5bb7c9784c83f69c11054Zhijun He        AddPosixSpawnFileAction (posix_spawn_file_actions_t *file_actions,
4604c913801141163362dd5bb7c9784c83f69c11054Zhijun He                                 const FileAction *info,
4614c913801141163362dd5bb7c9784c83f69c11054Zhijun He                                 Log *log,
4624c913801141163362dd5bb7c9784c83f69c11054Zhijun He                                 Error& error);
4634c913801141163362dd5bb7c9784c83f69c11054Zhijun He
4644c913801141163362dd5bb7c9784c83f69c11054Zhijun He        int
4654c913801141163362dd5bb7c9784c83f69c11054Zhijun He        GetFD () const
4664c913801141163362dd5bb7c9784c83f69c11054Zhijun He        {
4674c913801141163362dd5bb7c9784c83f69c11054Zhijun He            return m_fd;
4684c913801141163362dd5bb7c9784c83f69c11054Zhijun He        }
469a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin
470a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin        Action
471a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin        GetAction () const
472a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin        {
473a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin            return m_action;
474a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin        }
475a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin
476a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin        int
477a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin        GetActionArgument () const
478a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin        {
479a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin            return m_arg;
480a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin        }
481a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin
482a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin        const char *
483a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin        GetPath () const
484a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin        {
485a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin            if (m_path.empty())
486a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin                return NULL;
487a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin            return m_path.c_str();
488a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin        }
489a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin
490a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin    protected:
491a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin        Action m_action;    // The action for this file
4927bc1b21a5217c3737ae82edd3ff2d901c69a51adWu-cheng Li        int m_fd;           // An existing file descriptor
493a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin        int m_arg;          // oflag for eFileActionOpen*, dup_fd for eFileActionDuplicate
494feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk        std::string m_path; // A file path to use for opening after fork or posix_spawn
495feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    };
496feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk
497feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    ProcessLaunchInfo () :
498feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk        ProcessInfo(),
499feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk        m_flags ()
500feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    {
501feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    }
502feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk
503feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    ProcessLaunchInfo (const char *stdin_path,
504feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk                       const char *stdout_path,
505feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk                       const char *stderr_path,
506feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk                       const char *working_directory,
507feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk                       uint32_t launch_flags) :
508feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk        ProcessInfo(),
509feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk        m_flags (launch_flags)
510feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    {
511feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk        if (stderr_path)
512feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk        {
513feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk            ProcessLaunchInfo::FileAction file_action;
514feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk            const bool read = true;
515feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk            const bool write = true;
516feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk            if (file_action.Open(STDERR_FILENO, stderr_path, read, write))
517feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk                AppendFileAction (file_action);
518feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk        }
519feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk        if (stdout_path)
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        {
5219b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            ProcessLaunchInfo::FileAction file_action;
5221c04a33c040dfb610952d62da9c93a53c291b2d7Wu-cheng Li            const bool read = false;
5231c04a33c040dfb610952d62da9c93a53c291b2d7Wu-cheng Li            const bool write = true;
5241c04a33c040dfb610952d62da9c93a53c291b2d7Wu-cheng Li            if (file_action.Open(STDOUT_FILENO, stdout_path, read, write))
5251c04a33c040dfb610952d62da9c93a53c291b2d7Wu-cheng Li                AppendFileAction (file_action);
5261c04a33c040dfb610952d62da9c93a53c291b2d7Wu-cheng Li        }
5271c04a33c040dfb610952d62da9c93a53c291b2d7Wu-cheng Li        if (stdin_path)
528a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin        {
5299b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            ProcessLaunchInfo::FileAction file_action;
530e0cc55ac725feec88c77b482d1990221c9a80f74Eino-Ville Talvala            const bool read = true;
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const bool write = false;
5329b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            if (file_action.Open(STDIN_FILENO, stdin_path, read, write))
5334c913801141163362dd5bb7c9784c83f69c11054Zhijun He                AppendFileAction (file_action);
534788717ca599c714d58b2cb5deea1d37b4a711c07Eino-Ville Talvala        }
535788717ca599c714d58b2cb5deea1d37b4a711c07Eino-Ville Talvala        if (working_directory)
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            SetWorkingDirectory(working_directory);
5379b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    }
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AppendFileAction (const FileAction &info)
541bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    {
542bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        m_file_actions.push_back(info);
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5449b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool
5464c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    AppendCloseFileAction (int fd)
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileAction file_action;
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (file_action.Close (fd))
550bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        {
551bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor            AppendFileAction (file_action);
552bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor            return true;
553bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        }
554bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        return false;
555bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    }
556bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
557bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    bool
55842419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    AppendDuplciateFileAction (int fd, int dup_fd)
55942419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    {
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileAction file_action;
561bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        if (file_action.Duplicate (fd, dup_fd))
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        {
563bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor            AppendFileAction (file_action);
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
565bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        }
5669b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        return false;
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
568bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
569bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    bool
570bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    AppendOpenFileAction (int fd, const char *path, bool read, bool write)
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
57253b30912d3e8598c05e47308981971e958e98db2Wu-cheng Li        FileAction file_action;
57342419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li        if (file_action.Open (fd, path, read, write))
57442419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li        {
57542419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li            AppendFileAction (file_action);
57642419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li            return true;
577bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        }
578bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        return false;
579bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    }
580bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool
582ffe1cf251a4f8469695b8acfa37270684dc1b70cWu-cheng Li    AppendSuppressFileAction (int fd, bool read, bool write)
5839b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    {
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileAction file_action;
585bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        if (file_action.Open (fd, "/dev/null", read, write))
586bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        {
587bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor            AppendFileAction (file_action);
588bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor            return true;
589bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        }
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
59153b30912d3e8598c05e47308981971e958e98db2Wu-cheng Li    }
59242419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li
59342419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    void
59442419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    FinalizeFileActions (Target *target, Process *process);
595bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
596bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    size_t
597bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    GetNumFileActions () const
598bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    {
599bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        return m_file_actions.size();
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
601bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
6029b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    const FileAction *
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GetFileActionAtIndex (size_t idx) const
604bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    {
605fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis        if (idx < m_file_actions.size())
606fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis            return &m_file_actions[idx];
607fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis        return NULL;
608fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis    }
6099b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
610bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    const FileAction *
611bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    GetFileActionForFD (int fd) const
612bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    {
613bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        for (uint32_t idx=0, count=m_file_actions.size(); idx < count; ++idx)
614bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        {
615bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor            if (m_file_actions[idx].GetFD () == fd)
616bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor                return &m_file_actions[idx];
617bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        }
618bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        return NULL;
619bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    }
620bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
621bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    Flags &
622bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    GetFlags ()
6239b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    {
624bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        return m_flags;
625bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    }
626bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
627bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    const Flags &
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GetFlags () const
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
630b8a10fe45657f2dcc50cae8a06805f8438a6937eWu-cheng Li        return m_flags;
631feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    }
632b8a10fe45657f2dcc50cae8a06805f8438a6937eWu-cheng Li
633feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    const char *
634b8a10fe45657f2dcc50cae8a06805f8438a6937eWu-cheng Li    GetWorkingDirectory () const
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (m_working_dir.empty())
637feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk            return NULL;
638feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk        return m_working_dir.c_str();
639feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    }
640feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SetWorkingDirectory (const char *working_dir)
643fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis    {
644fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis        if (working_dir && working_dir[0])
645fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis            m_working_dir.assign (working_dir);
646fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis        else
647fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis            m_working_dir.clear();
648fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis    }
649fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis
650fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis    void
651fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis    SwapWorkingDirectory (std::string &working_dir)
652fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis    {
653fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis        m_working_dir.swap (working_dir);
654fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis    }
655fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis
656fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis
65732a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    const char *
658e309a0fd2e528039b3c1f1372a9a7095bcd852ccEino-Ville Talvala    GetProcessPluginName () const
659e309a0fd2e528039b3c1f1372a9a7095bcd852ccEino-Ville Talvala    {
660e309a0fd2e528039b3c1f1372a9a7095bcd852ccEino-Ville Talvala        if (m_plugin_name.empty())
661e309a0fd2e528039b3c1f1372a9a7095bcd852ccEino-Ville Talvala            return NULL;
662e309a0fd2e528039b3c1f1372a9a7095bcd852ccEino-Ville Talvala        return m_plugin_name.c_str();
663108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala    }
664108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala
665108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala    void
666108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala    SetProcessPluginName (const char *plugin)
667108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala    {
668108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala        if (plugin && plugin[0])
669108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala            m_plugin_name.assign (plugin);
670fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis        else
671fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis            m_plugin_name.clear();
672fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis    }
673fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis
674fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis    void
675fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis    Clear ()
676dbc289d6c27968bd05cc547ca73579347c3adc99Glenn Kasten    {
677fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis        ProcessInfo::Clear();
678fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis        m_working_dir.clear();
679bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        m_plugin_name.clear();
680bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        m_flags.Clear();
681bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        m_file_actions.clear();
682bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    }
683bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
684bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnorprotected:
685bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    std::string m_working_dir;
686b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    std::string m_plugin_name;
687b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    Flags m_flags;       // Bitwise OR of bits from lldb::LaunchFlags
688b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    std::vector<FileAction> m_file_actions; // File actions for any other files
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
690b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass ProcessLaunchCommandOptions : public Options
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
694bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
695341ff13689dfe822b598e626272ac2e80041b482Dan Egnor    ProcessLaunchCommandOptions (CommandInterpreter &interpreter) :
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Options(interpreter)
697951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala    {
698951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala        // Keep default values of all options in one place: OptionParsingStarting ()
699951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala        OptionParsingStarting ();
700951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala    }
701951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala
702bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    ~ProcessLaunchCommandOptions ()
703a696f5d667227365da732481770767dcb330dd23Mathias Agopian    {
704df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main    }
705da0a56df963353a1f1bd1914fa31f870d982dd5aScott Main
7069b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    Error
7079b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    SetOptionValue (uint32_t option_idx, const char *option_arg);
708bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    OptionParsingStarting ()
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
7129b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        launch_info.Clear();
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
714bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
715c5f94d8a4779050125145396ca83fbc862c7ed6bEino-Ville Talvala    const OptionDefinition*
716c5f94d8a4779050125145396ca83fbc862c7ed6bEino-Ville Talvala    GetDefinitions ()
717c5f94d8a4779050125145396ca83fbc862c7ed6bEino-Ville Talvala    {
718bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        return g_option_table;
719bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    }
720bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
721bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    // Options table: Required for subclasses of Options.
722bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
723bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    static OptionDefinition g_option_table[];
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Instance variables to hold the values for command options.
7269b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ProcessLaunchInfo launch_info;
728bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor};
729bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//----------------------------------------------------------------------
7314c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li// ProcessInstanceInfoMatch
7324c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li//
7334c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li// A class to help matching one ProcessInstanceInfo to another.
734664d72e6630522589cc013b25f5c9cdd5d949fa3Chih-yu Huang//----------------------------------------------------------------------
735664d72e6630522589cc013b25f5c9cdd5d949fa3Chih-yu Huang
736664d72e6630522589cc013b25f5c9cdd5d949fa3Chih-yu Huangclass ProcessInstanceInfoMatch
737664d72e6630522589cc013b25f5c9cdd5d949fa3Chih-yu Huang{
738664d72e6630522589cc013b25f5c9cdd5d949fa3Chih-yu Huangpublic:
739f05c1d63d16e790ac78c5854bb12374f45d6118eWu-cheng Li    ProcessInstanceInfoMatch () :
740f05c1d63d16e790ac78c5854bb12374f45d6118eWu-cheng Li        m_match_info (),
741f05c1d63d16e790ac78c5854bb12374f45d6118eWu-cheng Li        m_name_match_type (lldb_private::eNameMatchIgnore),
7429d062cfe94dcd24b1d61fc83e5de565cb67965b1Wu-cheng Li        m_match_all_users (false)
7434c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    {
7444c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    }
7454c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li
7469b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ProcessInstanceInfoMatch (const char *process_name,
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      lldb_private::NameMatchType process_name_match_type) :
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m_match_info (),
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m_name_match_type (process_name_match_type),
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m_match_all_users (false)
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m_match_info.SetName (process_name);
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7549b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ProcessInstanceInfo &
756108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala    GetProcessInfo ()
757bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    {
758bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        return m_match_info;
759108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala    }
760108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala
761108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala    const ProcessInstanceInfo &
762108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala    GetProcessInfo () const
763108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala    {
764108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala        return m_match_info;
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
766bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
767bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    bool
768108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala    GetMatchAllUsers () const
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return m_match_all_users;
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
77394927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp    void
7747005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    SetMatchAllUsers (bool b)
7757005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    {
7767005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala        m_match_all_users = b;
777a6118c6383c6f5703a576d08586a340fd71d28a4Dave Sparks    }
778a6118c6383c6f5703a576d08586a340fd71d28a4Dave Sparks
77994927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp    lldb_private::NameMatchType
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GetNameMatchType () const
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return m_name_match_type;
783108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala    }
784108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala
785108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala    void
786108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala    SetNameMatchType (lldb_private::NameMatchType name_match_type)
787108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala    {
788108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala        m_name_match_type = name_match_type;
789108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala    }
790108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool
792bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    NameMatches (const char *process_name) const;
793bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
794108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala    bool
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Matches (const ProcessInstanceInfo &proc_info) const;
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
79794927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp    bool
79894927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp    MatchAllProcesses () const;
79994927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp    void
8007005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    Clear ();
8017005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala
8027005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvalaprotected:
80394927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp    ProcessInstanceInfo m_match_info;
80494927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp    lldb_private::NameMatchType m_name_match_type;
80594927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp    bool m_match_all_users;
80694927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp};
80794927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp
80894927dffce1626898b59579dfc5af53b5de8cef6Andrew Harpclass ProcessInstanceInfoList
809108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala{
810108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvalapublic:
811bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    ProcessInstanceInfoList () :
812108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala        m_infos()
813108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala    {
81494927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp    }
815bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
816bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    void
817bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    Clear()
818108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala    {
81994927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp        m_infos.clear();
820108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala    }
821bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
822108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala    uint32_t
823108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala    GetSize()
824108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala    {
825108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala        return m_infos.size();
826108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala    }
827108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala
82894927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp    void
829bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    Append (const ProcessInstanceInfo &info)
830bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    {
831bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        m_infos.push_back (info);
832108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala    }
83394927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp
83494927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp    const char *
83594927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp    GetProcessNameAtIndex (uint32_t idx)
83694927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp    {
83794927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp        if (idx < m_infos.size())
8387005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala            return m_infos[idx].GetName();
8397005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala        return NULL;
8407005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    }
84194927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GetProcessNameLengthAtIndex (uint32_t idx)
84494927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp    {
8453f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        if (idx < m_infos.size())
8463f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li            return m_infos[idx].GetNameLength();
847bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        return 0;
848bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    }
849bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
850bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    lldb::pid_t
851bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    GetProcessIDAtIndex (uint32_t idx)
852c10275abd6a494c93a025f683dde104a5d4f2793Wu-cheng Li    {
853951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala        if (idx < m_infos.size())
854951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala            return m_infos[idx].GetProcessID();
855951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala        return 0;
856951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala    }
857951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala
858951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala    bool
859951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala    GetInfoAtIndex (uint32_t idx, ProcessInstanceInfo &info)
860951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala    {
861951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala        if (idx < m_infos.size())
862951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala        {
863951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala            info = m_infos[idx];
86494927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp            return true;
865bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        }
866e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        return false;
867bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    }
868bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
869e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    // You must ensure "idx" is valid before calling this function
870e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    const ProcessInstanceInfo &
871e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    GetProcessInfoAtIndex (uint32_t idx) const
87294927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp    {
873951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala        assert (idx < m_infos.size());
874951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala        return m_infos[idx];
8755b9bcda3a26e9b1f9b1eff28a2be8853d69614f0Wu-cheng Li    }
87694927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp
877e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dongprotected:
878e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    typedef std::vector<ProcessInstanceInfo> collection;
879e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    collection m_infos;
880e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong};
881e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong
882e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong
883e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong// This class tracks the Modification state of the process.  Things that can currently modify
884e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong// the program are running the program (which will up the StopID) and writing memory (which
885e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong// will up the MemoryID.)
886e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong// FIXME: Should we also include modification of register states?
887e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong
888e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dongclass ProcessModID
889e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong{
890e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dongfriend bool operator== (const ProcessModID &lhs, const ProcessModID &rhs);
891e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dongpublic:
892e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    ProcessModID () :
893e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        m_stop_id (0),
894e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        m_resume_id (0),
895e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        m_memory_id (0),
896e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        m_last_user_expression_resume (0),
897e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        m_running_user_expression (false)
898e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    {}
899e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong
900e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    ProcessModID (const ProcessModID &rhs) :
901e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        m_stop_id (rhs.m_stop_id),
902e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        m_memory_id (rhs.m_memory_id)
903e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    {}
90432a972c693400db50717435139fa292a63bc937aEino-Ville Talvala
90532a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    const ProcessModID & operator= (const ProcessModID &rhs)
90632a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    {
90732a972c693400db50717435139fa292a63bc937aEino-Ville Talvala        if (this != &rhs)
90832a972c693400db50717435139fa292a63bc937aEino-Ville Talvala        {
90932a972c693400db50717435139fa292a63bc937aEino-Ville Talvala            m_stop_id = rhs.m_stop_id;
910e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong            m_memory_id = rhs.m_memory_id;
911e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        }
912e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        return *this;
913e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    }
914e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong
915e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    ~ProcessModID () {}
916e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong
917e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    void BumpStopID () {
918e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        m_stop_id++;
919e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    }
920e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong
921e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    void BumpMemoryID () { m_memory_id++; }
922e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong
923e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    void BumpResumeID () {
924e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        m_resume_id++;
925e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        if (m_running_user_expression > 0)
926e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong            m_last_user_expression_resume = m_resume_id;
927e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    }
928e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong
929e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    uint32_t GetStopID() const { return m_stop_id; }
930e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    uint32_t GetMemoryID () const { return m_memory_id; }
931e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    uint32_t GetResumeID () const { return m_resume_id; }
932e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    uint32_t GetLastUserExpressionResumeID () const { return m_last_user_expression_resume; }
933e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong
934e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    bool MemoryIDEqual (const ProcessModID &compare) const
935e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    {
936e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong        return m_memory_id == compare.m_memory_id;
937e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    }
938e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool StopIDEqual (const ProcessModID &compare) const
9407005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    {
9417005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala        return m_stop_id == compare.m_stop_id;
9427005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    }
9437005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala
9447005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    void SetInvalid ()
9457005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    {
9467005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala        m_stop_id = UINT32_MAX;
9477005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    }
9487005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala
9497005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    bool IsValid () const
9507005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    {
9517005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala        return m_stop_id != UINT32_MAX;
9527005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    }
9537005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala
9547005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    void
9557005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    SetRunningUserExpression (bool on)
9567005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    {
9577005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala        // REMOVEME printf ("Setting running user expression %s at resume id %d - value: %d.\n", on ? "on" : "off", m_resume_id, m_running_user_expression);
9587005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala        if (on)
9597005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala            m_running_user_expression++;
9607005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala        else
9617005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala            m_running_user_expression--;
9627005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    }
9637005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala
9647005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvalaprivate:
9657005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    uint32_t m_stop_id;
9667005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    uint32_t m_resume_id;
9677005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    uint32_t m_memory_id;
9687005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    uint32_t m_last_user_expression_resume;
9697005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    uint32_t m_running_user_expression;
9707005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala};
9717005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvalainline bool operator== (const ProcessModID &lhs, const ProcessModID &rhs)
9727005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala{
9737005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    if (lhs.StopIDEqual (rhs)
9747005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala        && lhs.MemoryIDEqual (rhs))
9757005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala        return true;
9767005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    else
9777005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala        return false;
9787005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala}
9797005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala
9807005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvalainline bool operator!= (const ProcessModID &lhs, const ProcessModID &rhs)
9817005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala{
9827005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    if (!lhs.StopIDEqual (rhs)
9837005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala        || !lhs.MemoryIDEqual (rhs))
9847005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala        return true;
9857005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    else
9867005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala        return false;
9877005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala}
9887005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala
9897005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala//----------------------------------------------------------------------
9907005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala/// @class Process Process.h "lldb/Target/Process.h"
9917005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala/// @brief A plug-in interface definition class for debugging a process.
9927005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala//----------------------------------------------------------------------
9937005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvalaclass Process :
9947005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    public ReferenceCountedBaseVirtual<Process>,
9957005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    public UserID,
9967005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    public Broadcaster,
9977005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    public ExecutionContextScope,
9987005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    public PluginInterface,
9997005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    public ProcessInstanceSettings
10007005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala{
10017005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvalafriend class ThreadList;
10027005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvalafriend class ClangFunction; // For WaitForStateChangeEventsPrivate
10037005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvalafriend class CommandObjectProcessLaunch;
10047005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvalafriend class ProcessEventData;
10057005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvalafriend class CommandObjectBreakpointCommand;
10067005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvalafriend class StopInfo;
10077005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala
10087005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvalapublic:
10097005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala
10107005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    //------------------------------------------------------------------
10117005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    /// Broadcaster event bits definitions.
10127005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    //------------------------------------------------------------------
10137005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    enum
10147005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    {
10157005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala        eBroadcastBitStateChanged   = (1 << 0),
10167005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala        eBroadcastBitInterrupt      = (1 << 1),
10177005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala        eBroadcastBitSTDOUT         = (1 << 2),
10187005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala        eBroadcastBitSTDERR         = (1 << 3)
10197005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    };
10207005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala
10217005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    enum
10227005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    {
10237005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala        eBroadcastInternalStateControlStop = (1<<0),
10247005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala        eBroadcastInternalStateControlPause = (1<<1),
10257005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala        eBroadcastInternalStateControlResume = (1<<2)
10267005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    };
10277005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala
10287005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    //------------------------------------------------------------------
10297005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    /// A notification structure that can be used by clients to listen
10307005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    /// for changes in a process's lifetime.
10317005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    ///
10327005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    /// @see RegisterNotificationCallbacks (const Notifications&)
10337005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    /// @see UnregisterNotificationCallbacks (const Notifications&)
10347005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    //------------------------------------------------------------------
10357005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala#ifndef SWIG
10367005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    typedef struct
10377005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    {
10387005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala        void *baton;
10397005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala        void (*initialize)(void *baton, Process *process);
10407005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala        void (*process_state_changed) (void *baton, Process *process, lldb::StateType state);
10417005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    } Notifications;
10427005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala
10437005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    class ProcessEventData :
10447005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala        public EventData
10457005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    {
10467005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala        friend class Process;
10477005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala
10487005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala        public:
10497005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala            ProcessEventData ();
10507005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala            ProcessEventData (const lldb::ProcessSP &process, lldb::StateType state);
10517005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala
10527005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala            virtual ~ProcessEventData();
10537005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala
10547005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala            static const ConstString &
10557005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala            GetFlavorString ();
10567005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala
10577005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala            virtual const ConstString &
10587005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala            GetFlavor () const;
10597005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala
10607005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala            const lldb::ProcessSP &
10617005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala            GetProcessSP() const
10627005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala            {
10637005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala                return m_process_sp;
10647005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala            }
10657005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala            lldb::StateType
10667005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala            GetState() const
10677005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala            {
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return m_state;
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1070a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin            bool
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            GetRestarted () const
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            {
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return m_restarted;
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            GetInterrupted () const
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            {
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return m_interrupted;
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1080c62f9bd13327937aa2d2f20b44215397120634c1Dave Sparks
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual void
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Dump (Stream *s) const;
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual void
1085c62f9bd13327937aa2d2f20b44215397120634c1Dave Sparks            DoOnRemoval (Event *event_ptr);
1086c62f9bd13327937aa2d2f20b44215397120634c1Dave Sparks
1087e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks            static const Process::ProcessEventData *
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            GetEventDataFromEvent (const Event *event_ptr);
1089e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            static lldb::ProcessSP
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            GetProcessFromEvent (const Event *event_ptr);
1092c62f9bd13327937aa2d2f20b44215397120634c1Dave Sparks
1093e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks            static lldb::StateType
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            GetStateFromEvent (const Event *event_ptr);
1095e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            static bool
10979b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            GetRestartedFromEvent (const Event *event_ptr);
1098c62f9bd13327937aa2d2f20b44215397120634c1Dave Sparks
1099ca367b717806c4c69190641c3361d3520a44ad08Eino-Ville Talvala            static void
1100ca367b717806c4c69190641c3361d3520a44ad08Eino-Ville Talvala            SetRestartedInEvent (Event *event_ptr, bool new_value);
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1102a6118c6383c6f5703a576d08586a340fd71d28a4Dave Sparks            static bool
1103a6118c6383c6f5703a576d08586a340fd71d28a4Dave Sparks            GetInterruptedFromEvent (const Event *event_ptr);
1104a6118c6383c6f5703a576d08586a340fd71d28a4Dave Sparks
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            static void
110694927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp            SetInterruptedInEvent (Event *event_ptr, bool new_value);
1107a6118c6383c6f5703a576d08586a340fd71d28a4Dave Sparks
1108a6118c6383c6f5703a576d08586a340fd71d28a4Dave Sparks            static bool
1109a6118c6383c6f5703a576d08586a340fd71d28a4Dave Sparks            SetUpdateStateOnRemoval (Event *event_ptr);
111094927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       private:
1112ca367b717806c4c69190641c3361d3520a44ad08Eino-Ville Talvala
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            SetUpdateStateOnRemoval()
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            {
1116e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks                m_update_state++;
1117e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks            }
1118e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks            void
1119e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks            SetRestarted (bool new_value)
1120e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks            {
1121e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks                m_restarted = new_value;
1122c62f9bd13327937aa2d2f20b44215397120634c1Dave Sparks            }
1123f05c1d63d16e790ac78c5854bb12374f45d6118eWu-cheng Li            void
1124f05c1d63d16e790ac78c5854bb12374f45d6118eWu-cheng Li            SetInterrupted (bool new_value)
1125f05c1d63d16e790ac78c5854bb12374f45d6118eWu-cheng Li            {
1126f05c1d63d16e790ac78c5854bb12374f45d6118eWu-cheng Li                m_interrupted = new_value;
1127f05c1d63d16e790ac78c5854bb12374f45d6118eWu-cheng Li            }
1128f05c1d63d16e790ac78c5854bb12374f45d6118eWu-cheng Li
1129f05c1d63d16e790ac78c5854bb12374f45d6118eWu-cheng Li            lldb::ProcessSP m_process_sp;
1130e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks            lldb::StateType m_state;
1131e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks            bool m_restarted;  // For "eStateStopped" events, this is true if the target was automatically restarted.
1132e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks            int m_update_state;
1133e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks            bool m_interrupted;
11343f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li            DISALLOW_COPY_AND_ASSIGN (ProcessEventData);
11353f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li
1136e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks    };
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class SettingsController : public UserSettingsController
1139bb1e275c0e684dd213f124da77110cdd9d6f090cWu-cheng Li    {
11404c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    public:
1141f0d6a48c6ad852b84687127f14b1ffde02416dc4Wu-cheng Li
11424c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li        SettingsController ();
11434c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li
11444c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li        virtual
1145c62f9bd13327937aa2d2f20b44215397120634c1Dave Sparks        ~SettingsController ();
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1147e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks        static SettingEntry global_settings_table[];
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        static SettingEntry instance_settings_table[];
1149e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected:
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11529d062cfe94dcd24b1d61fc83e5de565cb67965b1Wu-cheng Li        lldb::InstanceSettingsSP
11539d062cfe94dcd24b1d61fc83e5de565cb67965b1Wu-cheng Li        CreateInstanceSettings (const char *instance_name);
11549d062cfe94dcd24b1d61fc83e5de565cb67965b1Wu-cheng Li
11559d062cfe94dcd24b1d61fc83e5de565cb67965b1Wu-cheng Li    private:
11569d062cfe94dcd24b1d61fc83e5de565cb67965b1Wu-cheng Li
11579d062cfe94dcd24b1d61fc83e5de565cb67965b1Wu-cheng Li        // Class-wide settings.
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DISALLOW_COPY_AND_ASSIGN (SettingsController);
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static void
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SettingsInitialize ();
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static void
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SettingsTerminate ();
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static lldb::UserSettingsControllerSP &
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GetSettingsController ();
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    UpdateInstanceName ();
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //------------------------------------------------------------------
1179bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /// Construct with a shared pointer to a target, and the Process listener.
1180bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    //------------------------------------------------------------------
11817478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Li    Process(Target &target, Listener &listener);
11827478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Li
1183df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main    //------------------------------------------------------------------
1184df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main    /// Destructor.
11857478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Li    ///
1186df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main    /// The destructor is virtual since this class is designed to be
1187df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main    /// inherited from by the plug-in instance.
1188bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    //------------------------------------------------------------------
1189bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    virtual
1190b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    ~Process();
1191b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //------------------------------------------------------------------
1193b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    /// Find a Process plug-in that can debug \a module using the
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /// currently selected architecture.
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ///
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /// Scans all loaded plug-in interfaces that implement versions of
119769ea4e15e52c456537575d21443ac1efdb03a902Brad Fitzpatrick    /// the Process plug-in interface and returns the first instance
119869ea4e15e52c456537575d21443ac1efdb03a902Brad Fitzpatrick    /// that can debug the file.
119969ea4e15e52c456537575d21443ac1efdb03a902Brad Fitzpatrick    ///
120069ea4e15e52c456537575d21443ac1efdb03a902Brad Fitzpatrick    /// @param[in] module_sp
12019b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///     The module shared pointer that this process will debug.
1202b4f95be03e018df825356fe2cd363797c66303f1Wu-cheng Li    ///
1203b4f95be03e018df825356fe2cd363797c66303f1Wu-cheng Li    /// @param[in] plugin_name
120483d3352cf7a67efd60732c0d40e5928f642f6808Eino-Ville Talvala    ///     If NULL, select the best plug-in for the binary. If non-NULL
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ///     then look for a plugin whose PluginInfo's name matches
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ///     this string.
120783d3352cf7a67efd60732c0d40e5928f642f6808Eino-Ville Talvala    ///
120883d3352cf7a67efd60732c0d40e5928f642f6808Eino-Ville Talvala    /// @see Process::CanDebug ()
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //------------------------------------------------------------------
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static Process*
121153b30912d3e8598c05e47308981971e958e98db2Wu-cheng Li    FindPlugin (Target &target, const char *plugin_name, Listener &listener);
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1214bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
1215bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    //------------------------------------------------------------------
1216bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /// Static function that can be used with the \b host function
1217bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /// Host::StartMonitoringChildProcess ().
1218bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    ///
1219bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /// This function can be used by lldb_private::Process subclasses
1220bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /// when they want to watch for a local process and have its exit
1221bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /// status automatically set when the host child process exits.
122236322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li    /// Subclasses should call Host::StartMonitoringChildProcess ()
1223bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /// with:
1224da0a56df963353a1f1bd1914fa31f870d982dd5aScott Main    ///     callback = Process::SetHostProcessExitStatus
12257478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Li    ///     callback_baton = NULL
12267478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Li    ///     pid = Process::GetID()
1227df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main    ///     monitor_signals = false
1228df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main    //------------------------------------------------------------------
1229bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    static bool
1230068ef42c3ffe1eccec10f97f08541304f679fe67Wu-cheng Li    SetProcessExitStatus (void *callback_baton,   // The callback baton which should be set to NULL
1231068ef42c3ffe1eccec10f97f08541304f679fe67Wu-cheng Li                          lldb::pid_t pid,        // The process ID we want to monitor
1232bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor                          int signo,              // Zero for no signal
12337478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Li                          int status);            // Exit value of process if signal is zero
123453b30912d3e8598c05e47308981971e958e98db2Wu-cheng Li
1235b4f95be03e018df825356fe2cd363797c66303f1Wu-cheng Li    lldb::ByteOrder
1236b4f95be03e018df825356fe2cd363797c66303f1Wu-cheng Li    GetByteOrder () const;
1237b4f95be03e018df825356fe2cd363797c66303f1Wu-cheng Li
123883d3352cf7a67efd60732c0d40e5928f642f6808Eino-Ville Talvala    uint32_t
123953b30912d3e8598c05e47308981971e958e98db2Wu-cheng Li    GetAddressByteSize () const;
124053b30912d3e8598c05e47308981971e958e98db2Wu-cheng Li
124153b30912d3e8598c05e47308981971e958e98db2Wu-cheng Li    //------------------------------------------------------------------
124253b30912d3e8598c05e47308981971e958e98db2Wu-cheng Li    /// Check if a plug-in instance can debug the file in \a module.
124353b30912d3e8598c05e47308981971e958e98db2Wu-cheng Li    ///
124453b30912d3e8598c05e47308981971e958e98db2Wu-cheng Li    /// Each plug-in is given a chance to say whether it can debug
1245108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala    /// the file in \a module. If the Process plug-in instance can
1246108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala    /// debug a file on the current system, it should return \b true.
1247108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala    ///
1248108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala    /// @return
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ///     Returns \b true if this Process plug-in instance can
1250bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    ///     debug the executable, \b false otherwise.
125183d3352cf7a67efd60732c0d40e5928f642f6808Eino-Ville Talvala    //------------------------------------------------------------------
125283d3352cf7a67efd60732c0d40e5928f642f6808Eino-Ville Talvala    virtual bool
1253108708b4873fb05cb029b5bcb29a4e917004ca30Eino-Ville Talvala    CanDebug (Target &target,
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project              bool plugin_specified_by_name) = 0;
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1257f05c1d63d16e790ac78c5854bb12374f45d6118eWu-cheng Li    //------------------------------------------------------------------
1258248ba23ad28c1f8fb69904663204df08c5818700James Dong    /// This object is about to be destroyed, do any necessary cleanup.
1259248ba23ad28c1f8fb69904663204df08c5818700James Dong    ///
1260f05c1d63d16e790ac78c5854bb12374f45d6118eWu-cheng Li    /// Subclasses that override this method should always call this
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /// superclass method.
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //------------------------------------------------------------------
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual void
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Finalize();
1265bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
1266bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    //------------------------------------------------------------------
1267bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /// Launch a new process.
1268244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang    ///
1269bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /// Launch a new process by spawning a new process using the
1270bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /// target object's executable module's file as the file to launch.
1271244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang    /// Arguments are given in \a argv, and the environment variables
1272244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang    /// are in \a envp. Standard input and output files can be
1273244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang    /// optionally re-directed to \a stdin_path, \a stdout_path, and
1274f05c1d63d16e790ac78c5854bb12374f45d6118eWu-cheng Li    /// \a stderr_path.
1275248ba23ad28c1f8fb69904663204df08c5818700James Dong    ///
1276248ba23ad28c1f8fb69904663204df08c5818700James Dong    /// This function is not meant to be overridden by Process
1277f05c1d63d16e790ac78c5854bb12374f45d6118eWu-cheng Li    /// subclasses. It will first call Process::WillLaunch (Module *)
1278f05c1d63d16e790ac78c5854bb12374f45d6118eWu-cheng Li    /// and if that returns \b true, Process::DoLaunch (Module*,
1279f05c1d63d16e790ac78c5854bb12374f45d6118eWu-cheng Li    /// char const *[],char const *[],const char *,const char *,
1280f05c1d63d16e790ac78c5854bb12374f45d6118eWu-cheng Li    /// const char *) will be called to actually do the launching. If
1281f05c1d63d16e790ac78c5854bb12374f45d6118eWu-cheng Li    /// DoLaunch returns \b true, then Process::DidLaunch() will be
1282f05c1d63d16e790ac78c5854bb12374f45d6118eWu-cheng Li    /// called.
1283f05c1d63d16e790ac78c5854bb12374f45d6118eWu-cheng Li    ///
1284f05c1d63d16e790ac78c5854bb12374f45d6118eWu-cheng Li    /// @param[in] argv
1285f05c1d63d16e790ac78c5854bb12374f45d6118eWu-cheng Li    ///     The argument array.
1286f05c1d63d16e790ac78c5854bb12374f45d6118eWu-cheng Li    ///
1287f05c1d63d16e790ac78c5854bb12374f45d6118eWu-cheng Li    /// @param[in] envp
1288f05c1d63d16e790ac78c5854bb12374f45d6118eWu-cheng Li    ///     The environment array.
1289f05c1d63d16e790ac78c5854bb12374f45d6118eWu-cheng Li    ///
1290f05c1d63d16e790ac78c5854bb12374f45d6118eWu-cheng Li    /// @param[in] launch_flags
1291f05c1d63d16e790ac78c5854bb12374f45d6118eWu-cheng Li    ///     Flags to modify the launch (@see lldb::LaunchFlags)
1292f05c1d63d16e790ac78c5854bb12374f45d6118eWu-cheng Li    ///
1293f05c1d63d16e790ac78c5854bb12374f45d6118eWu-cheng Li    /// @param[in] stdin_path
1294244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang    ///     The path to use when re-directing the STDIN of the new
1295244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang    ///     process. If all stdXX_path arguments are NULL, a pseudo
1296244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang    ///     terminal will be used.
1297244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang    ///
12989d062cfe94dcd24b1d61fc83e5de565cb67965b1Wu-cheng Li    /// @param[in] stdout_path
12999d062cfe94dcd24b1d61fc83e5de565cb67965b1Wu-cheng Li    ///     The path to use when re-directing the STDOUT of the new
13006574539baecc8610529596554b7bca0f21b334b8Wu-cheng Li    ///     process. If all stdXX_path arguments are NULL, a pseudo
13016574539baecc8610529596554b7bca0f21b334b8Wu-cheng Li    ///     terminal will be used.
13026574539baecc8610529596554b7bca0f21b334b8Wu-cheng Li    ///
13036574539baecc8610529596554b7bca0f21b334b8Wu-cheng Li    /// @param[in] stderr_path
1304b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    ///     The path to use when re-directing the STDERR of the new
1305b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    ///     process. If all stdXX_path arguments are NULL, a pseudo
1306b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    ///     terminal will be used.
13079d062cfe94dcd24b1d61fc83e5de565cb67965b1Wu-cheng Li    ///
1308b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    /// @param[in] working_directory
13099d062cfe94dcd24b1d61fc83e5de565cb67965b1Wu-cheng Li    ///     The working directory to have the child process run in
13109d062cfe94dcd24b1d61fc83e5de565cb67965b1Wu-cheng Li    ///
13119d062cfe94dcd24b1d61fc83e5de565cb67965b1Wu-cheng Li    /// @return
13129d062cfe94dcd24b1d61fc83e5de565cb67965b1Wu-cheng Li    ///     An error object. Call GetID() to get the process ID if
13139d062cfe94dcd24b1d61fc83e5de565cb67965b1Wu-cheng Li    ///     the error object is success.
13149d062cfe94dcd24b1d61fc83e5de565cb67965b1Wu-cheng Li    //------------------------------------------------------------------
13156574539baecc8610529596554b7bca0f21b334b8Wu-cheng Li    virtual Error
13169d062cfe94dcd24b1d61fc83e5de565cb67965b1Wu-cheng Li    Launch (const ProcessLaunchInfo &launch_info);
13179d062cfe94dcd24b1d61fc83e5de565cb67965b1Wu-cheng Li
13189d062cfe94dcd24b1d61fc83e5de565cb67965b1Wu-cheng Li    //------------------------------------------------------------------
13199d062cfe94dcd24b1d61fc83e5de565cb67965b1Wu-cheng Li    /// Attach to an existing process using a process ID.
13209d062cfe94dcd24b1d61fc83e5de565cb67965b1Wu-cheng Li    ///
13219d062cfe94dcd24b1d61fc83e5de565cb67965b1Wu-cheng Li    /// This function is not meant to be overridden by Process
13229d062cfe94dcd24b1d61fc83e5de565cb67965b1Wu-cheng Li    /// subclasses. It will first call Process::WillAttach (lldb::pid_t)
13239d062cfe94dcd24b1d61fc83e5de565cb67965b1Wu-cheng Li    /// and if that returns \b true, Process::DoAttach (lldb::pid_t) will
13249d062cfe94dcd24b1d61fc83e5de565cb67965b1Wu-cheng Li    /// be called to actually do the attach. If DoAttach returns \b
13259d062cfe94dcd24b1d61fc83e5de565cb67965b1Wu-cheng Li    /// true, then Process::DidAttach() will be called.
13269d062cfe94dcd24b1d61fc83e5de565cb67965b1Wu-cheng Li    ///
13279d062cfe94dcd24b1d61fc83e5de565cb67965b1Wu-cheng Li    /// @param[in] pid
13289d062cfe94dcd24b1d61fc83e5de565cb67965b1Wu-cheng Li    ///     The process ID that we should attempt to attach to.
13299d062cfe94dcd24b1d61fc83e5de565cb67965b1Wu-cheng Li    ///
13309d062cfe94dcd24b1d61fc83e5de565cb67965b1Wu-cheng Li    /// @return
13319d062cfe94dcd24b1d61fc83e5de565cb67965b1Wu-cheng Li    ///     Returns \a pid if attaching was successful, or
13329d062cfe94dcd24b1d61fc83e5de565cb67965b1Wu-cheng Li    ///     LLDB_INVALID_PROCESS_ID if attaching fails.
1333bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    //------------------------------------------------------------------
1334bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    virtual Error
1335bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    Attach (lldb::pid_t pid);
1336b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala
1337b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    //------------------------------------------------------------------
1338b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    /// Attach to an existing process by process name.
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ///
1340b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    /// This function is not meant to be overridden by Process
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /// subclasses. It will first call
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /// Process::WillAttach (const char *) and if that returns \b
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /// true, Process::DoAttach (const char *) will be called to
1344bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /// actually do the attach. If DoAttach returns \b true, then
1345bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /// Process::DidAttach() will be called.
1346bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    ///
1347bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /// @param[in] process_name
1348bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    ///     A process name to match against the current process list.
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ///
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /// @return
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ///     Returns \a pid if attaching was successful, or
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ///     LLDB_INVALID_PROCESS_ID if attaching fails.
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //------------------------------------------------------------------
1354bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    virtual Error
1355bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    Attach (const char *process_name, bool wait_for_launch);
1356bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
1357b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    virtual Error
1358b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    ConnectRemote (const char *remote_url);
1359b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool
1361b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    AttachedToProcess() const
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return m_attached_to_process;
1364bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    }
1365bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
1366bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    //------------------------------------------------------------------
13679b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /// Get the image information address for the current process.
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ///
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /// Some runtimes have system functions that can help dynamic
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /// loaders locate the dynamic loader information needed to observe
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /// shared libraries being loaded or unloaded. This function is
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /// in the Process interface (as opposed to the DynamicLoader
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /// interface) to ensure that remote debugging can take advantage of
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /// this functionality.
1375bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    ///
13769b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /// @return
1377bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    ///     The address of the dynamic loader information, or
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ///     LLDB_INVALID_ADDRESS if this is not supported by this
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ///     interface.
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //------------------------------------------------------------------
1381e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks    virtual lldb::addr_t
1382e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks    GetImageInfoAddress ();
1383e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong
1384e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks    //------------------------------------------------------------------
1385e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks    /// Load a shared library into this process.
13869b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///
13879b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /// Try and load a shared library into the current process. This
13889b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /// call might fail in the dynamic loader plug-in says it isn't safe
13899b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /// to try and load shared libraries at the moment.
13909b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///
1391e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    /// @param[in] image_spec
1392e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    ///     The image file spec that points to the shared library that
13939b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///     you want to load.
13949b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///
13959b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /// @param[out] error
13969b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///     An error object that gets filled in with any errors that
13979b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///     might occur when trying to load the shared library.
1398e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks    ///
1399bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /// @return
1400bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    ///     A token that represents the shared library that can be
1401bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    ///     later used to unload the shared library. A value of
140242419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    ///     LLDB_INVALID_IMAGE_TOKEN will be returned if the shared
140342419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    ///     library can't be opened.
140442419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    //------------------------------------------------------------------
140540057ce749c8c4d274db0352a2af4344bda92dbaWu-cheng Li    virtual uint32_t
1406bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    LoadImage (const FileSpec &image_spec, Error &error);
1407bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
140840057ce749c8c4d274db0352a2af4344bda92dbaWu-cheng Li    virtual Error
1409bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    UnloadImage (uint32_t image_token);
1410bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
1411e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks    //------------------------------------------------------------------
1412bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /// Register for process and thread notifications.
1413e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks    ///
1414e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks    /// Clients can register nofication callbacks by filling out a
1415e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks    /// Process::Notifications structure and calling this function.
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ///
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /// @param[in] callbacks
1418e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks    ///     A structure that contains the notification baton and
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ///     callback functions.
1420e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    ///
1421e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    /// @see Process::Notifications
1422e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    //------------------------------------------------------------------
1423e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong#ifndef SWIG
1424e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    void
1425e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    RegisterNotificationCallbacks (const Process::Notifications& callbacks);
1426e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong#endif
1427e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    //------------------------------------------------------------------
1428e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    /// Unregister for process and thread notifications.
1429e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    ///
1430e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    /// Clients can unregister nofication callbacks by passing a copy of
1431e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    /// the original baton and callbacks in \a callbacks.
1432e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    ///
1433e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    /// @param[in] callbacks
1434e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    ///     A structure that contains the notification baton and
1435e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    ///     callback functions.
1436e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    ///
1437e9c6c9ccfde7a642a4c0554e2d066f3dbbea98ceWu-cheng Li    /// @return
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ///     Returns \b true if the notification callbacks were
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ///     successfully removed from the process, \b false otherwise.
1440e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks    ///
1441bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /// @see Process::Notifications
14423f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li    //------------------------------------------------------------------
14433f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li#ifndef SWIG
1444bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    bool
1445bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    UnregisterNotificationCallbacks (const Process::Notifications& callbacks);
1446bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor#endif
1447bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    //==================================================================
1448bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    // Built in Process Control functions
1449bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    //==================================================================
1450bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    //------------------------------------------------------------------
1451bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /// Resumes all of a process's threads as configured using the
1452bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /// Thread run control functions.
145336f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    ///
145436f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    /// Threads for a process should be updated with one of the run
145536f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    /// control actions (resume, step, or suspend) that they should take
14560ca25191c663ef229f1f475b17899f2017ed6980Wu-cheng Li    /// when the process is resumed. If no run control action is given
14570ca25191c663ef229f1f475b17899f2017ed6980Wu-cheng Li    /// to a thread it will be resumed by default.
1458bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    ///
145936f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    /// This function is not meant to be overridden by Process
146036f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    /// subclasses. This function will take care of disabling any
146136f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    /// breakpoints that threads may be stopped at, single stepping, and
146236f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    /// re-enabling breakpoints, and enabling the basic flow control
1463bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /// that the plug-in instances need not worry about.
14643f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li    ///
14653f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li    /// @return
14668cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li    ///     Returns an error object.
14670ca25191c663ef229f1f475b17899f2017ed6980Wu-cheng Li    ///
14680ca25191c663ef229f1f475b17899f2017ed6980Wu-cheng Li    /// @see Thread:Resume()
146936f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    /// @see Thread:Step()
147036f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    /// @see Thread:Suspend()
147136f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    //------------------------------------------------------------------
147236f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    Error
14732fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li    Resume ();
14742fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li
14752fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li    //------------------------------------------------------------------
1476b982fb4fd36a3cd24a0bb17c964139fe4c9cbb47Wu-cheng Li    /// Halts a running process.
1477b982fb4fd36a3cd24a0bb17c964139fe4c9cbb47Wu-cheng Li    ///
1478b982fb4fd36a3cd24a0bb17c964139fe4c9cbb47Wu-cheng Li    /// This function is not meant to be overridden by Process
1479d1d7706fce19a9a0cf71ff9b65f3aba9b89eeb3bChih-Chung Chang    /// subclasses.
148069ea4e15e52c456537575d21443ac1efdb03a902Brad Fitzpatrick    /// If the process is successfully halted, a eStateStopped
14812fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li    /// process event with GetInterrupted will be broadcast.  If false, we will
14822fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li    /// halt the process with no events generated by the halt.
1483d1d7706fce19a9a0cf71ff9b65f3aba9b89eeb3bChih-Chung Chang    ///
148469ea4e15e52c456537575d21443ac1efdb03a902Brad Fitzpatrick    /// @return
148569ea4e15e52c456537575d21443ac1efdb03a902Brad Fitzpatrick    ///     Returns an error object.  If the error is empty, the process is halted.
1486b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang    ///     otherwise the halt has failed.
1487724c52244423feced2677fbd1f905e0b8b0639f2Chih-Chung Chang    //------------------------------------------------------------------
1488724c52244423feced2677fbd1f905e0b8b0639f2Chih-Chung Chang    Error
1489724c52244423feced2677fbd1f905e0b8b0639f2Chih-Chung Chang    Halt ();
1490724c52244423feced2677fbd1f905e0b8b0639f2Chih-Chung Chang
1491724c52244423feced2677fbd1f905e0b8b0639f2Chih-Chung Chang    //------------------------------------------------------------------
1492724c52244423feced2677fbd1f905e0b8b0639f2Chih-Chung Chang    /// Detaches from a running or stopped process.
1493724c52244423feced2677fbd1f905e0b8b0639f2Chih-Chung Chang    ///
1494724c52244423feced2677fbd1f905e0b8b0639f2Chih-Chung Chang    /// This function is not meant to be overridden by Process
1495724c52244423feced2677fbd1f905e0b8b0639f2Chih-Chung Chang    /// subclasses.
1496724c52244423feced2677fbd1f905e0b8b0639f2Chih-Chung Chang    ///
1497724c52244423feced2677fbd1f905e0b8b0639f2Chih-Chung Chang    /// @return
1498724c52244423feced2677fbd1f905e0b8b0639f2Chih-Chung Chang    ///     Returns an error object.
1499724c52244423feced2677fbd1f905e0b8b0639f2Chih-Chung Chang    //------------------------------------------------------------------
1500724c52244423feced2677fbd1f905e0b8b0639f2Chih-Chung Chang    Error
1501b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang    Detach ();
15022fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li
15032fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li    //------------------------------------------------------------------
15042fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li    /// Kills the process and shuts down all threads that were spawned
15052fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li    /// to track and monitor the process.
15062fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li    ///
15072fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li    /// This function is not meant to be overridden by Process
15082fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li    /// subclasses.
1509724c52244423feced2677fbd1f905e0b8b0639f2Chih-Chung Chang    ///
1510724c52244423feced2677fbd1f905e0b8b0639f2Chih-Chung Chang    /// @return
1511b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang    ///     Returns an error object.
1512d303362ac21fb9de40f2f2366cbe7ecaa113dc12Wu-cheng Li    //------------------------------------------------------------------
1513d303362ac21fb9de40f2f2366cbe7ecaa113dc12Wu-cheng Li    Error
1514d303362ac21fb9de40f2f2366cbe7ecaa113dc12Wu-cheng Li    Destroy();
1515d303362ac21fb9de40f2f2366cbe7ecaa113dc12Wu-cheng Li
1516d1d7706fce19a9a0cf71ff9b65f3aba9b89eeb3bChih-Chung Chang    //------------------------------------------------------------------
1517e7bd22a9d9441916aa9c67d80ee9f02a2d3e10e5Chih-Chung Chang    /// Sends a process a UNIX signal \a signal.
1518e7bd22a9d9441916aa9c67d80ee9f02a2d3e10e5Chih-Chung Chang    ///
15192fe6fcaff4bdab45484055d6c18dd96d1b7b7be1Wu-cheng Li    /// This function is not meant to be overridden by Process
1520d1d7706fce19a9a0cf71ff9b65f3aba9b89eeb3bChih-Chung Chang    /// subclasses.
1521d1d7706fce19a9a0cf71ff9b65f3aba9b89eeb3bChih-Chung Chang    ///
1522d1d7706fce19a9a0cf71ff9b65f3aba9b89eeb3bChih-Chung Chang    /// @return
1523d1d7706fce19a9a0cf71ff9b65f3aba9b89eeb3bChih-Chung Chang    ///     Returns an error object.
1524487acdfb4eca3859fd688a1ff0a32fe6314b68f6Eino-Ville Talvala    //------------------------------------------------------------------
152569fe527bea12f262bfb1a5838f40e3433ad3cb78Eino-Ville Talvala    Error
1526487acdfb4eca3859fd688a1ff0a32fe6314b68f6Eino-Ville Talvala    Signal (int signal);
1527487acdfb4eca3859fd688a1ff0a32fe6314b68f6Eino-Ville Talvala
1528487acdfb4eca3859fd688a1ff0a32fe6314b68f6Eino-Ville Talvala    virtual UnixSignals &
1529487acdfb4eca3859fd688a1ff0a32fe6314b68f6Eino-Ville Talvala    GetUnixSignals ()
1530487acdfb4eca3859fd688a1ff0a32fe6314b68f6Eino-Ville Talvala    {
153169fe527bea12f262bfb1a5838f40e3433ad3cb78Eino-Ville Talvala        return m_unix_signals;
1532487acdfb4eca3859fd688a1ff0a32fe6314b68f6Eino-Ville Talvala    }
1533487acdfb4eca3859fd688a1ff0a32fe6314b68f6Eino-Ville Talvala
1534487acdfb4eca3859fd688a1ff0a32fe6314b68f6Eino-Ville Talvala    //==================================================================
1535487acdfb4eca3859fd688a1ff0a32fe6314b68f6Eino-Ville Talvala    // Plug-in Process Control Overrides
1536487acdfb4eca3859fd688a1ff0a32fe6314b68f6Eino-Ville Talvala    //==================================================================
153769fe527bea12f262bfb1a5838f40e3433ad3cb78Eino-Ville Talvala
153869fe527bea12f262bfb1a5838f40e3433ad3cb78Eino-Ville Talvala    //------------------------------------------------------------------
153969fe527bea12f262bfb1a5838f40e3433ad3cb78Eino-Ville Talvala    /// Called before attaching to a process.
1540487acdfb4eca3859fd688a1ff0a32fe6314b68f6Eino-Ville Talvala    ///
1541487acdfb4eca3859fd688a1ff0a32fe6314b68f6Eino-Ville Talvala    /// Allow Process plug-ins to execute some code before attaching a
1542487acdfb4eca3859fd688a1ff0a32fe6314b68f6Eino-Ville Talvala    /// process.
1543487acdfb4eca3859fd688a1ff0a32fe6314b68f6Eino-Ville Talvala    ///
154469fe527bea12f262bfb1a5838f40e3433ad3cb78Eino-Ville Talvala    /// @return
1545487acdfb4eca3859fd688a1ff0a32fe6314b68f6Eino-Ville Talvala    ///     Returns an error object.
154669fe527bea12f262bfb1a5838f40e3433ad3cb78Eino-Ville Talvala    //------------------------------------------------------------------
154769fe527bea12f262bfb1a5838f40e3433ad3cb78Eino-Ville Talvala    virtual Error
15484f8e5ce21df881796d05a1b2117dd8868570a57bEino-Ville Talvala    WillAttachToProcessWithID (lldb::pid_t pid)
15494f8e5ce21df881796d05a1b2117dd8868570a57bEino-Ville Talvala    {
15504f8e5ce21df881796d05a1b2117dd8868570a57bEino-Ville Talvala        return Error();
15514f8e5ce21df881796d05a1b2117dd8868570a57bEino-Ville Talvala    }
15524f8e5ce21df881796d05a1b2117dd8868570a57bEino-Ville Talvala
15534f8e5ce21df881796d05a1b2117dd8868570a57bEino-Ville Talvala    //------------------------------------------------------------------
15544f8e5ce21df881796d05a1b2117dd8868570a57bEino-Ville Talvala    /// Called before attaching to a process.
15554f8e5ce21df881796d05a1b2117dd8868570a57bEino-Ville Talvala    ///
15564f8e5ce21df881796d05a1b2117dd8868570a57bEino-Ville Talvala    /// Allow Process plug-ins to execute some code before attaching a
15574f8e5ce21df881796d05a1b2117dd8868570a57bEino-Ville Talvala    /// process.
15584f8e5ce21df881796d05a1b2117dd8868570a57bEino-Ville Talvala    ///
15594f8e5ce21df881796d05a1b2117dd8868570a57bEino-Ville Talvala    /// @return
15604f8e5ce21df881796d05a1b2117dd8868570a57bEino-Ville Talvala    ///     Returns an error object.
15616653362f6b5c5854bd88244bcecad72d11bf9404Igor Murashkin    //------------------------------------------------------------------
15626653362f6b5c5854bd88244bcecad72d11bf9404Igor Murashkin    virtual Error
15636653362f6b5c5854bd88244bcecad72d11bf9404Igor Murashkin    WillAttachToProcessWithName (const char *process_name, bool wait_for_launch)
15646653362f6b5c5854bd88244bcecad72d11bf9404Igor Murashkin    {
15656653362f6b5c5854bd88244bcecad72d11bf9404Igor Murashkin        return Error();
15666653362f6b5c5854bd88244bcecad72d11bf9404Igor Murashkin    }
15676653362f6b5c5854bd88244bcecad72d11bf9404Igor Murashkin
15686653362f6b5c5854bd88244bcecad72d11bf9404Igor Murashkin    virtual Error
15696653362f6b5c5854bd88244bcecad72d11bf9404Igor Murashkin    DoConnectRemote (const char *remote_url)
15706653362f6b5c5854bd88244bcecad72d11bf9404Igor Murashkin    {
15716653362f6b5c5854bd88244bcecad72d11bf9404Igor Murashkin        Error error;
15726653362f6b5c5854bd88244bcecad72d11bf9404Igor Murashkin        error.SetErrorString ("remote connections are not supported");
15736653362f6b5c5854bd88244bcecad72d11bf9404Igor Murashkin        return error;
15746653362f6b5c5854bd88244bcecad72d11bf9404Igor Murashkin    }
15756653362f6b5c5854bd88244bcecad72d11bf9404Igor Murashkin
15766653362f6b5c5854bd88244bcecad72d11bf9404Igor Murashkin    //------------------------------------------------------------------
15776653362f6b5c5854bd88244bcecad72d11bf9404Igor Murashkin    /// Attach to an existing process using a process ID.
15786653362f6b5c5854bd88244bcecad72d11bf9404Igor Murashkin    ///
15796653362f6b5c5854bd88244bcecad72d11bf9404Igor Murashkin    /// @param[in] pid
15806653362f6b5c5854bd88244bcecad72d11bf9404Igor Murashkin    ///     The process ID that we should attempt to attach to.
15814f8e5ce21df881796d05a1b2117dd8868570a57bEino-Ville Talvala    ///
158269fe527bea12f262bfb1a5838f40e3433ad3cb78Eino-Ville Talvala    /// @return
158369fe527bea12f262bfb1a5838f40e3433ad3cb78Eino-Ville Talvala    ///     Returns \a pid if attaching was successful, or
1584bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    ///     LLDB_INVALID_PROCESS_ID if attaching fails.
1585bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    //------------------------------------------------------------------
1586bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    virtual Error
1587bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    DoAttachToProcessWithID (lldb::pid_t pid) = 0;
1588b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala
1589b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    //------------------------------------------------------------------
1590b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    /// Attach to an existing process using a partial process name.
1591e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks    ///
1592b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    /// @param[in] process_name
15933f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li    ///     The name of the process to attach to.
1594e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks    ///
1595e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks    /// @param[in] wait_for_launch
1596bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    ///     If \b true, wait for the process to be launched and attach
159736f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    ///     as soon as possible after it does launch. If \b false, then
159836f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    ///     search for a matching process the currently exists.
15993f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li    ///
160036f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    /// @return
160136f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    ///     Returns \a pid if attaching was successful, or
1602e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks    ///     LLDB_INVALID_PROCESS_ID if attaching fails.
1603e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks    //------------------------------------------------------------------
16043f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li    virtual Error
1605e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks    DoAttachToProcessWithName (const char *process_name, bool wait_for_launch)
1606e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks    {
1607e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks        Error error;
16083f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        error.SetErrorString("attach by name is not supported");
160936f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li        return error;
16108cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li    }
16113f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li
16128cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li    //------------------------------------------------------------------
1613e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks    /// Called after attaching a process.
16143f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li    ///
1615e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks    /// Allow Process plug-ins to execute some code after attaching to
16163f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li    /// a process.
1617e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks    //------------------------------------------------------------------
16189b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    virtual void
16194c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    DidAttach () {}
16204c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li
16214c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li
1622b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    //------------------------------------------------------------------
1623b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    /// Called before launching to a process.
16244c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    ///
1625b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    /// Allow Process plug-ins to execute some code before launching a
16264c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    /// process.
16274c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    ///
16284c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    /// @return
16294c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    ///     Returns an error object.
16304c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    //------------------------------------------------------------------
163153b30912d3e8598c05e47308981971e958e98db2Wu-cheng Li    virtual Error
1632464cb21e2aaa448072449b82156f18bd64c0e613Joe Fernandez    WillLaunch (Module* module)
16334c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    {
1634f0d6a48c6ad852b84687127f14b1ffde02416dc4Wu-cheng Li        return Error();
16354c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    }
16364c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li
16374c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    //------------------------------------------------------------------
1638c0c683b3344c67700882f8059e7d18266366daa9Wu-cheng Li    /// Launch a new process.
16394c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    ///
16404c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    /// Launch a new process by spawning a new process using \a module's
16414c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    /// file as the file to launch. Arguments are given in \a argv,
1642c0c683b3344c67700882f8059e7d18266366daa9Wu-cheng Li    /// and the environment variables are in \a envp. Standard input
16434c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    /// and output files can be optionally re-directed to \a stdin_path,
16444c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    /// \a stdout_path, and \a stderr_path.
16454c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    ///
16464c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    /// @param[in] module
16474c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    ///     The module from which to extract the file specification and
16484c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    ///     launch.
16494c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    ///
1650c0c683b3344c67700882f8059e7d18266366daa9Wu-cheng Li    /// @param[in] argv
16514c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    ///     The argument array.
16524c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    ///
16534c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    /// @param[in] envp
16544c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    ///     The environment array.
1655c0c683b3344c67700882f8059e7d18266366daa9Wu-cheng Li    ///
16564c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    /// @param[in] launch_flags
16574c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    ///     Flags to modify the launch (@see lldb::LaunchFlags)
16588c13670c13a7a965884d92193b039e26c96b95c6Wu-cheng Li    ///
16594c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    /// @param[in] stdin_path
16608c13670c13a7a965884d92193b039e26c96b95c6Wu-cheng Li    ///     The path to use when re-directing the STDIN of the new
16618c13670c13a7a965884d92193b039e26c96b95c6Wu-cheng Li    ///     process. If all stdXX_path arguments are NULL, a pseudo
16628c13670c13a7a965884d92193b039e26c96b95c6Wu-cheng Li    ///     terminal will be used.
16638c13670c13a7a965884d92193b039e26c96b95c6Wu-cheng Li    ///
16648c13670c13a7a965884d92193b039e26c96b95c6Wu-cheng Li    /// @param[in] stdout_path
16658c13670c13a7a965884d92193b039e26c96b95c6Wu-cheng Li    ///     The path to use when re-directing the STDOUT of the new
16668c13670c13a7a965884d92193b039e26c96b95c6Wu-cheng Li    ///     process. If all stdXX_path arguments are NULL, a pseudo
16678c13670c13a7a965884d92193b039e26c96b95c6Wu-cheng Li    ///     terminal will be used.
16688c13670c13a7a965884d92193b039e26c96b95c6Wu-cheng Li    ///
16698c13670c13a7a965884d92193b039e26c96b95c6Wu-cheng Li    /// @param[in] stderr_path
16708c13670c13a7a965884d92193b039e26c96b95c6Wu-cheng Li    ///     The path to use when re-directing the STDERR of the new
16718c13670c13a7a965884d92193b039e26c96b95c6Wu-cheng Li    ///     process. If all stdXX_path arguments are NULL, a pseudo
16728c13670c13a7a965884d92193b039e26c96b95c6Wu-cheng Li    ///     terminal will be used.
16734c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    ///
1674c0c683b3344c67700882f8059e7d18266366daa9Wu-cheng Li    /// @param[in] working_directory
16754c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    ///     The working directory to have the child process run in
16764c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    ///
16774c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    /// @return
16784c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    ///     A new valid process ID, or LLDB_INVALID_PROCESS_ID if
1679c0c683b3344c67700882f8059e7d18266366daa9Wu-cheng Li    ///     launching fails.
16804c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    //------------------------------------------------------------------
1681c0c683b3344c67700882f8059e7d18266366daa9Wu-cheng Li    virtual Error
16824c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    DoLaunch (Module *exe_module,
16834c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li              const ProcessLaunchInfo &launch_info) = 0;
16844c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li
1685c0c683b3344c67700882f8059e7d18266366daa9Wu-cheng Li    //------------------------------------------------------------------
16864c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    /// Called after launching a process.
16874c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    ///
16884c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    /// Allow Process plug-ins to execute some code after launching
16894c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    /// a process.
1690c0c683b3344c67700882f8059e7d18266366daa9Wu-cheng Li    //------------------------------------------------------------------
16914c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    virtual void
1692464cb21e2aaa448072449b82156f18bd64c0e613Joe Fernandez    DidLaunch () {}
16934c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li
16944c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li
16954c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li
16964c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    //------------------------------------------------------------------
16974c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    /// Called before resuming to a process.
16984c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    ///
16994c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    /// Allow Process plug-ins to execute some code before resuming a
17004c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    /// process.
17014c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    ///
17024c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    /// @return
1703464cb21e2aaa448072449b82156f18bd64c0e613Joe Fernandez    ///     Returns an error object.
170453b30912d3e8598c05e47308981971e958e98db2Wu-cheng Li    //------------------------------------------------------------------
1705464cb21e2aaa448072449b82156f18bd64c0e613Joe Fernandez    virtual Error
1706464cb21e2aaa448072449b82156f18bd64c0e613Joe Fernandez    WillResume () { return Error(); }
17074c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li
1708464cb21e2aaa448072449b82156f18bd64c0e613Joe Fernandez    //------------------------------------------------------------------
1709b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    /// Resumes all of a process's threads as configured using the
1710b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    /// Thread run control functions.
17114c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    ///
1712b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    /// Threads for a process should be updated with one of the run
1713f0d6a48c6ad852b84687127f14b1ffde02416dc4Wu-cheng Li    /// control actions (resume, step, or suspend) that they should take
1714c0c683b3344c67700882f8059e7d18266366daa9Wu-cheng Li    /// when the process is resumed. If no run control action is given
1715c0c683b3344c67700882f8059e7d18266366daa9Wu-cheng Li    /// to a thread it will be resumed by default.
1716c0c683b3344c67700882f8059e7d18266366daa9Wu-cheng Li    ///
1717bb1e275c0e684dd213f124da77110cdd9d6f090cWu-cheng Li    /// @return
1718bb1e275c0e684dd213f124da77110cdd9d6f090cWu-cheng Li    ///     Returns \b true if the process successfully resumes using
1719bb1e275c0e684dd213f124da77110cdd9d6f090cWu-cheng Li    ///     the thread run control actions, \b false otherwise.
17204c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    ///
17214c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    /// @see Thread:Resume()
17224c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    /// @see Thread:Step()
1723c0c683b3344c67700882f8059e7d18266366daa9Wu-cheng Li    /// @see Thread:Suspend()
1724c0c683b3344c67700882f8059e7d18266366daa9Wu-cheng Li    //------------------------------------------------------------------
17258c13670c13a7a965884d92193b039e26c96b95c6Wu-cheng Li    virtual Error
17268c13670c13a7a965884d92193b039e26c96b95c6Wu-cheng Li    DoResume () = 0;
17278c13670c13a7a965884d92193b039e26c96b95c6Wu-cheng Li
17288c13670c13a7a965884d92193b039e26c96b95c6Wu-cheng Li    //------------------------------------------------------------------
1729f0d6a48c6ad852b84687127f14b1ffde02416dc4Wu-cheng Li    /// Called after resuming a process.
1730f0d6a48c6ad852b84687127f14b1ffde02416dc4Wu-cheng Li    ///
1731f0d6a48c6ad852b84687127f14b1ffde02416dc4Wu-cheng Li    /// Allow Process plug-ins to execute some code after resuming
17328c13670c13a7a965884d92193b039e26c96b95c6Wu-cheng Li    /// a process.
17338c13670c13a7a965884d92193b039e26c96b95c6Wu-cheng Li    //------------------------------------------------------------------
17348c13670c13a7a965884d92193b039e26c96b95c6Wu-cheng Li    virtual void
17358c13670c13a7a965884d92193b039e26c96b95c6Wu-cheng Li    DidResume () {}
17368c13670c13a7a965884d92193b039e26c96b95c6Wu-cheng Li
17378c13670c13a7a965884d92193b039e26c96b95c6Wu-cheng Li
17388c13670c13a7a965884d92193b039e26c96b95c6Wu-cheng Li    //------------------------------------------------------------------
17398c13670c13a7a965884d92193b039e26c96b95c6Wu-cheng Li    /// Called before halting to a process.
17408c13670c13a7a965884d92193b039e26c96b95c6Wu-cheng Li    ///
17418c13670c13a7a965884d92193b039e26c96b95c6Wu-cheng Li    /// Allow Process plug-ins to execute some code before halting a
17428c13670c13a7a965884d92193b039e26c96b95c6Wu-cheng Li    /// process.
17438c13670c13a7a965884d92193b039e26c96b95c6Wu-cheng Li    ///
17448c13670c13a7a965884d92193b039e26c96b95c6Wu-cheng Li    /// @return
17458c13670c13a7a965884d92193b039e26c96b95c6Wu-cheng Li    ///     Returns an error object.
17468c13670c13a7a965884d92193b039e26c96b95c6Wu-cheng Li    //------------------------------------------------------------------
17478c13670c13a7a965884d92193b039e26c96b95c6Wu-cheng Li    virtual Error
17488c13670c13a7a965884d92193b039e26c96b95c6Wu-cheng Li    WillHalt () { return Error(); }
17498c13670c13a7a965884d92193b039e26c96b95c6Wu-cheng Li
17504c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    //------------------------------------------------------------------
1751464cb21e2aaa448072449b82156f18bd64c0e613Joe Fernandez    /// Halts a running process.
17524c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    ///
1753bb1e275c0e684dd213f124da77110cdd9d6f090cWu-cheng Li    /// DoHalt must produce one and only one stop StateChanged event if it actually
17544c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    /// stops the process.  If the stop happens through some natural event (for
17554c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    /// instance a SIGSTOP), then forwarding that event will do.  Otherwise, you must
17568df3b2b3989df44953153603681e03140fd853d6Eino-Ville Talvala    /// generate the event manually.  Note also, the private event thread is stopped when
17578df3b2b3989df44953153603681e03140fd853d6Eino-Ville Talvala    /// DoHalt is run to prevent the events generated while halting to trigger
17588df3b2b3989df44953153603681e03140fd853d6Eino-Ville Talvala    /// other state changes before the halt is complete.
17598df3b2b3989df44953153603681e03140fd853d6Eino-Ville Talvala    ///
17608df3b2b3989df44953153603681e03140fd853d6Eino-Ville Talvala    /// @param[out] caused_stop
17618df3b2b3989df44953153603681e03140fd853d6Eino-Ville Talvala    ///     If true, then this Halt caused the stop, otherwise, the
17628df3b2b3989df44953153603681e03140fd853d6Eino-Ville Talvala    ///     process was already stopped.
17638df3b2b3989df44953153603681e03140fd853d6Eino-Ville Talvala    ///
17644c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    /// @return
1765464cb21e2aaa448072449b82156f18bd64c0e613Joe Fernandez    ///     Returns \b true if the process successfully halts, \b false
17664c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    ///     otherwise.
1767bb1e275c0e684dd213f124da77110cdd9d6f090cWu-cheng Li    //------------------------------------------------------------------
1768d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua    virtual Error
1769d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua    DoHalt (bool &caused_stop) = 0;
1770d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua
1771d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua    //------------------------------------------------------------------
1772d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua    /// Called after halting a process.
1773d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua    ///
1774d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua    /// Allow Process plug-ins to execute some code after halting
1775d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua    /// a process.
1776d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua    //------------------------------------------------------------------
1777d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua    virtual void
1778d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua    DidHalt () {}
1779d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua
1780d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua    //------------------------------------------------------------------
1781d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua    /// Called before detaching from a process.
1782d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua    ///
1783d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua    /// Allow Process plug-ins to execute some code before detaching
1784d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua    /// from a process.
1785d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua    ///
1786d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua    /// @return
1787d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua    ///     Returns an error object.
1788d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua    //------------------------------------------------------------------
1789d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua    virtual Error
1790d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua    WillDetach ()
1791d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua    {
1792d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua        return Error();
1793d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua    }
1794d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua
1795d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua    //------------------------------------------------------------------
1796d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua    /// Detaches from a running or stopped process.
1797d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua    ///
1798d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua    /// @return
1799d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua    ///     Returns \b true if the process successfully detaches, \b
1800d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua    ///     false otherwise.
1801d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua    //------------------------------------------------------------------
1802d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua    virtual Error
1803d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua    DoDetach () = 0;
1804d52b308916d5f207791788e00bc48baecb90d8b8Wei Hua
18054c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    //------------------------------------------------------------------
18064c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    /// Called after detaching from a process.
1807bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    ///
1808bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /// Allow Process plug-ins to execute some code after detaching
1809bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /// from a process.
1810bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    //------------------------------------------------------------------
1811bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    virtual void
1812bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    DidDetach () {}
18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1814bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    //------------------------------------------------------------------
1815bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /// Called before sending a signal to a process.
1816bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    ///
1817bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /// Allow Process plug-ins to execute some code before sending a
1818bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /// signal to a process.
1819bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    ///
18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /// @return
18219b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///     Returns no error if it is safe to proceed with a call to
18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ///     Process::DoSignal(int), otherwise an error describing what
1823bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    ///     prevents the signal from being sent.
1824bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    //------------------------------------------------------------------
1825bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    virtual Error
1826b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    WillSignal () { return Error(); }
1827b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala
1828b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    //------------------------------------------------------------------
18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /// Sends a process a UNIX signal \a signal.
1830b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    ///
18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /// @return
18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ///     Returns an error object.
18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //------------------------------------------------------------------
18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual Error
18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    DoSignal (int signal) = 0;
18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual Error
18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    WillDestroy () { return Error(); }
18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual Error
18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    DoDestroy () = 0;
18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual void
18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    DidDestroy () { }
1847bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //------------------------------------------------------------------
18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /// Called after sending a signal to a process.
18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ///
18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /// Allow Process plug-ins to execute some code after sending a
18539b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /// signal to a process.
18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //------------------------------------------------------------------
18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual void
18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    DidSignal () {}
18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1858bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
18599b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    //------------------------------------------------------------------
18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /// Currently called as part of ShouldStop.
186199a3f3e4e06b4370101ca97cc11dbe81d772fefaWu-cheng Li    /// FIXME: Should really happen when the target stops before the
1862bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /// event is taken from the queue...
18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ///
18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /// This callback is called as the event
18657005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    /// is about to be queued up to allow Process plug-ins to execute
18667005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    /// some code prior to clients being notified that a process was
18677005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    /// stopped. Common operations include updating the thread list,
18687005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    /// invalidating any thread state (registers, stack, etc) prior to
18697005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    /// letting the notification go out.
18707005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    ///
18717005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    //------------------------------------------------------------------
18727005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    virtual void
18737005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    RefreshStateAfterStop () = 0;
18747005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala
18757005b67c127d229017840925d2bc1bd84c43aaf5Eino-Ville Talvala    //------------------------------------------------------------------
18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /// Get the target object pointer for this module.
18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ///
18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /// @return
18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ///     A Target object pointer to the target that owns this
1880bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    ///     module.
1881bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    //------------------------------------------------------------------
1882bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    Target &
1883bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    GetTarget ()
1884bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    {
18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return m_target;
18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //------------------------------------------------------------------
18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /// Get the const target object pointer for this module.
18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ///
18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /// @return
18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ///     A const Target object pointer to the target that owns this
18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ///     module.
18941c04a33c040dfb610952d62da9c93a53c291b2d7Wu-cheng Li    //------------------------------------------------------------------
18951c04a33c040dfb610952d62da9c93a53c291b2d7Wu-cheng Li    const Target &
1896f76a50ce8fdc6aea22cabc77b2977a1a15a79630Ken Wakasa    GetTarget () const
18971c04a33c040dfb610952d62da9c93a53c291b2d7Wu-cheng Li    {
18981c04a33c040dfb610952d62da9c93a53c291b2d7Wu-cheng Li        return m_target;
18991c04a33c040dfb610952d62da9c93a53c291b2d7Wu-cheng Li    }
19001c04a33c040dfb610952d62da9c93a53c291b2d7Wu-cheng Li
19011c04a33c040dfb610952d62da9c93a53c291b2d7Wu-cheng Li
19021c04a33c040dfb610952d62da9c93a53c291b2d7Wu-cheng Li    //------------------------------------------------------------------
19031c04a33c040dfb610952d62da9c93a53c291b2d7Wu-cheng Li    /// Get accessor for the current process state.
19041c04a33c040dfb610952d62da9c93a53c291b2d7Wu-cheng Li    ///
19051c04a33c040dfb610952d62da9c93a53c291b2d7Wu-cheng Li    /// @return
1906df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    ///     The current state of the process.
1907df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    ///
1908df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    /// @see lldb::StateType
1909df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    //------------------------------------------------------------------
1910df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    lldb::StateType
1911df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    GetState ();
1912df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
1913df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    ExecutionResults
1914df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    RunThreadPlan (ExecutionContext &exe_ctx,
1915df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin                    lldb::ThreadPlanSP &thread_plan_sp,
1916df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin                    bool stop_others,
1917df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin                    bool try_all_threads,
1918df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin                    bool discard_on_error,
1919df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin                    uint32_t single_thread_timeout_usec,
1920df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin                    Stream &errors);
1921df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
1922df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    static const char *
1923df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    ExecutionResultAsCString (ExecutionResults result);
1924df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
1925df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    void
1926df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    GetStatus (Stream &ostrm);
1927bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
1928b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    size_t
1929b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    GetThreadStatus (Stream &ostrm,
19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     bool only_threads_with_stop_reason,
1931b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala                     uint32_t start_frame,
19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     uint32_t num_frames,
19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                     uint32_t num_frames_with_source);
19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19359b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Liprotected:
19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void
19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SetState (lldb::EventSP &event_sp);
19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    lldb::StateType
19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GetPrivateState ();
19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19434c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li    //------------------------------------------------------------------
19444c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li    // Called internally
19454c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li    //------------------------------------------------------------------
19464c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li    void
19474c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li    CompleteAttach ();
19484c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li
19494c4300c71229638183d814ab8374e09f722910f5Wu-cheng Lipublic:
19504c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li    //------------------------------------------------------------------
19514c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li    /// Get the exit status for a process.
19524c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li    ///
19534c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li    /// @return
19544c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li    ///     The process's return code, or -1 if the current process
19554c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li    ///     state is not eStateExited.
19564c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li    //------------------------------------------------------------------
19574c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li    int
19584c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li    GetExitStatus ();
19594c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li
19604c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li    //------------------------------------------------------------------
19614c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li    /// Get a textual description of what the process exited.
19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ///
19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /// @return
19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ///     The textual description of why the process exited, or NULL
19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ///     if there is no description available.
19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //------------------------------------------------------------------
19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char *
19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GetExitDescription ();
196932a972c693400db50717435139fa292a63bc937aEino-Ville Talvala
197032a972c693400db50717435139fa292a63bc937aEino-Ville Talvala
197132a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    virtual void
197232a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    DidExit ()
197332a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    {
197432a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    }
197532a972c693400db50717435139fa292a63bc937aEino-Ville Talvala
197632a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    //------------------------------------------------------------------
197732a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    /// Get the Modification ID of the process.
197832a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    ///
197932a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    /// @return
198032a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    ///     The modification ID of the process.
198132a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    //------------------------------------------------------------------
198232a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    ProcessModID
198332a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    GetModID () const
198432a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    {
198532a972c693400db50717435139fa292a63bc937aEino-Ville Talvala        return m_mod_id;
198632a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    }
198732a972c693400db50717435139fa292a63bc937aEino-Ville Talvala
198832a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    const ProcessModID &
198932a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    GetModIDRef () const
199032a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    {
1991bde61a5731cdfef76a0691f8bd53b880606f5f6eWu-cheng Li        return m_mod_id;
1992bde61a5731cdfef76a0691f8bd53b880606f5f6eWu-cheng Li    }
1993bde61a5731cdfef76a0691f8bd53b880606f5f6eWu-cheng Li
1994bde61a5731cdfef76a0691f8bd53b880606f5f6eWu-cheng Li    uint32_t
1995bde61a5731cdfef76a0691f8bd53b880606f5f6eWu-cheng Li    GetStopID () const
1996bde61a5731cdfef76a0691f8bd53b880606f5f6eWu-cheng Li    {
1997bde61a5731cdfef76a0691f8bd53b880606f5f6eWu-cheng Li        return m_mod_id.GetStopID();
1998b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    }
1999b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala
2000b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    uint32_t
200130771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li    GetResumeID () const
2002b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    {
200330771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li        return m_mod_id.GetResumeID();
200430771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li    }
200530771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li
200630771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li    uint32_t
200732a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    GetLastUserExpressionResumeID () const
200832a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    {
200930771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li        return m_mod_id.GetLastUserExpressionResumeID();
201030771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li    }
201130771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li
201230771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li    //------------------------------------------------------------------
201330771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li    /// Set accessor for the process exit status (return code).
201430771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li    ///
201530771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li    /// Sometimes a child exits and the exit can be detected by global
201630771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li    /// functions (signal handler for SIGCHLD for example). This
201730771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li    /// accessor allows the exit status to be set from an external
201830771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li    /// source.
201930771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li    ///
202030771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li    /// Setting this will cause a eStateExited event to be posted to
202130771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li    /// the process event queue.
202230771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li    ///
202330771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li    /// @param[in] exit_status
202430771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li    ///     The value for the process's return code.
202530771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li    ///
202630771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li    /// @see lldb::StateType
202730771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li    //------------------------------------------------------------------
202830771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li    virtual bool
202930771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li    SetExitStatus (int exit_status, const char *cstr);
203030771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li
203130771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li    //------------------------------------------------------------------
203230771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li    /// Check if a process is still alive.
203330771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li    ///
203430771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li    /// @return
2035bde61a5731cdfef76a0691f8bd53b880606f5f6eWu-cheng Li    ///     Returns \b true if the process is still valid, \b false
203632a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    ///     otherwise.
203732a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    //------------------------------------------------------------------
203832a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    virtual bool
203932a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    IsAlive () = 0;
204032a972c693400db50717435139fa292a63bc937aEino-Ville Talvala
2041bde61a5731cdfef76a0691f8bd53b880606f5f6eWu-cheng Li    //------------------------------------------------------------------
2042bde61a5731cdfef76a0691f8bd53b880606f5f6eWu-cheng Li    /// Actually do the reading of memory from a process.
2043bde61a5731cdfef76a0691f8bd53b880606f5f6eWu-cheng Li    ///
2044bde61a5731cdfef76a0691f8bd53b880606f5f6eWu-cheng Li    /// Subclasses must override this function and can return fewer
204530771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li    /// bytes than requested when memory requests are too large. This
204630771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li    /// class will break up the memory requests and keep advancing the
2047bde61a5731cdfef76a0691f8bd53b880606f5f6eWu-cheng Li    /// arguments along as needed.
204832a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    ///
204932a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    /// @param[in] vm_addr
205032a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    ///     A virtual load address that indicates where to start reading
205132a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    ///     memory from.
205232a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    ///
2053bde61a5731cdfef76a0691f8bd53b880606f5f6eWu-cheng Li    /// @param[in] size
2054bde61a5731cdfef76a0691f8bd53b880606f5f6eWu-cheng Li    ///     The number of bytes to read.
2055bde61a5731cdfef76a0691f8bd53b880606f5f6eWu-cheng Li    ///
2056bde61a5731cdfef76a0691f8bd53b880606f5f6eWu-cheng Li    /// @param[out] buf
205730771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li    ///     A byte buffer that is at least \a size bytes long that
2058bde61a5731cdfef76a0691f8bd53b880606f5f6eWu-cheng Li    ///     will receive the memory bytes.
205930771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li    ///
206030771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li    /// @return
2061bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    ///     The number of bytes that were actually read into \a buf.
20629b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    //------------------------------------------------------------------
20639b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    virtual size_t
2064bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    DoReadMemory (lldb::addr_t vm_addr,
2065bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor                  void *buf,
2066bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor                  size_t size,
2067bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor                  Error &error) = 0;
20689b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
20699b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    //------------------------------------------------------------------
20709b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /// Read of memory from a process.
20719b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///
2072bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /// This function will read memory from the current process's
2073bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /// address space and remove any traps that may have been inserted
2074bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    /// into the memory.
2075bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    ///
2076b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    /// This function is not meant to be overridden by Process
2077b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    /// subclasses, the subclasses should implement
2078b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    /// Process::DoReadMemory (lldb::addr_t, size_t, void *).
20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ///
2080b942b05093d2b1cee59ac73196a4b99962f10addEino-Ville Talvala    /// @param[in] vm_addr
20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ///     A virtual load address that indicates where to start reading
20829b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///     memory from.
20839b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///
20849b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /// @param[out] buf
20859b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///     A byte buffer that is at least \a size bytes long that
2086454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    ///     will receive the memory bytes.
20879b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///
20889b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /// @param[in] size
20894c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li    ///     The number of bytes to read.
20909b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///
20919b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /// @return
20929b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///     The number of bytes that were actually read into \a buf. If
20939b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///     the returned number is greater than zero, yet less than \a
20949b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///     size, then this function will get called again with \a
20959b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///     vm_addr, \a buf, and \a size updated appropriately. Zero is
20969b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///     returned to indicate an error.
20979b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    //------------------------------------------------------------------
20989b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    size_t
2099055c986ab841f8f758398841730f1e90313b132aRay Chen    ReadMemory (lldb::addr_t vm_addr,
21009b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                void *buf,
21019b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                size_t size,
21029b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                Error &error);
21039b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
21049b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    //------------------------------------------------------------------
210536322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li    /// Read a NULL terminated C string from memory
210630771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li    ///
210730771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li    /// This function will read a cache page at a time until the NULL
21086c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li    /// C stirng terminator is found. It will stop reading if the NULL
21096c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li    /// termination byte isn't found before reading \a cstr_max_len
21106c8d2760736a0753dad96b4bb8f98c7d075e6d54Wu-cheng Li    /// bytes, and the results are always guaranteed to be NULL
2111ff723b6c43d5a8fd0ae0e0732f5d47012d74e01dWu-cheng Li    /// terminated (at most cstr_max_len - 1 bytes will be read).
211224b326a8978bf78e3e560723dde221792784325bWu-cheng Li    //------------------------------------------------------------------
211324b326a8978bf78e3e560723dde221792784325bWu-cheng Li    size_t
211424b326a8978bf78e3e560723dde221792784325bWu-cheng Li    ReadCStringFromMemory (lldb::addr_t vm_addr,
21153773eef4e36fa4171a84b495dca849be112df0a8Eino-Ville Talvala                           char *cstr,
21163773eef4e36fa4171a84b495dca849be112df0a8Eino-Ville Talvala                           size_t cstr_max_len);
2117d9c2601afa46811bcb1345963d38010690981a01Eino-Ville Talvala
2118d9c2601afa46811bcb1345963d38010690981a01Eino-Ville Talvala    size_t
2119e98e4c806320ccb3078805ac019cca3ed9796123Wu-cheng Li    ReadMemoryFromInferior (lldb::addr_t vm_addr,
2120e98e4c806320ccb3078805ac019cca3ed9796123Wu-cheng Li                            void *buf,
21218cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li                            size_t size,
21228cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li                            Error &error);
21238cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li
21248cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li    //------------------------------------------------------------------
21258cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li    /// Reads an unsigned integer of the specified byte size from
2126e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li    /// process memory.
2127dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong    ///
2128dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong    /// @param[in] load_addr
2129dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong    ///     A load address of the integer to read.
21304c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    ///
21314c2292efbbfe7338138a9a0e8eefeaabdef1a0b4Wu-cheng Li    /// @param[in] byte_size
213225d8fb51dae37f1becf4fb3d32e8600c418eb6e8Wu-cheng Li    ///     The size in byte of the integer to read.
213398bb251c8b527600e7a4cca6cc33499710bbfbf1Wu-cheng Li    ///
2134037abb8bb064c2878858c9b69978f6754f242627Eino-Ville Talvala    /// @param[in] fail_value
2135037abb8bb064c2878858c9b69978f6754f242627Eino-Ville Talvala    ///     The value to return if we fail to read an integer.
2136e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li    ///
21379b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /// @param[out] error
21389b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///     An error that indicates the success or failure of this
21399b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///     operation. If error indicates success (error.Success()),
21408cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li    ///     then the value returned can be trusted, otherwise zero
21413773eef4e36fa4171a84b495dca849be112df0a8Eino-Ville Talvala    ///     will be returned.
21428cbb8f5e1f939b03515cb4d5942c3fcb226efb9eWu-cheng Li    ///
21439b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /// @return
21449b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///     The unsigned integer that was read from the process memory
21459b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///     space. If the integer was smaller than a uint64_t, any
21469b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///     unused upper bytes will be zero filled. If the process
21479b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///     byte order differs from the host byte order, the integer
21489b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///     value will be appropriately byte swapped into host byte
21499b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///     order.
21509b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    //------------------------------------------------------------------
21519b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    uint64_t
21529b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ReadUnsignedIntegerFromMemory (lldb::addr_t load_addr,
21539b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                                   size_t byte_size,
21549b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                                   uint64_t fail_value,
21559b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                                   Error &error);
21569b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
21579b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    lldb::addr_t
21589b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ReadPointerFromMemory (lldb::addr_t vm_addr,
21599b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                           Error &error);
21609b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
21619b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    bool
21629b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    WritePointerToMemory (lldb::addr_t vm_addr,
21639b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                          lldb::addr_t ptr_value,
21649b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                          Error &error);
21659b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
21669b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    //------------------------------------------------------------------
21679b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /// Actually do the writing of memory to a process.
21689b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///
21699b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /// @param[in] vm_addr
21709b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///     A virtual load address that indicates where to start writing
21719b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///     memory to.
21729b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///
21739b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /// @param[in] buf
21749b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///     A byte buffer that is at least \a size bytes long that
217536f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    ///     contains the data to write.
21769b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///
2177068ef42c3ffe1eccec10f97f08541304f679fe67Wu-cheng Li    /// @param[in] size
2178068ef42c3ffe1eccec10f97f08541304f679fe67Wu-cheng Li    ///     The number of bytes to write.
21799b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///
21809b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /// @param[out] error
218136f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    ///     An error value in case the memory write fails.
21829b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///
2183068ef42c3ffe1eccec10f97f08541304f679fe67Wu-cheng Li    /// @return
2184068ef42c3ffe1eccec10f97f08541304f679fe67Wu-cheng Li    ///     The number of bytes that were actually written.
21859b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    //------------------------------------------------------------------
21869b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    virtual size_t
218736f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    DoWriteMemory (lldb::addr_t vm_addr, const void *buf, size_t size, Error &error) = 0;
21889b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
21899b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    //------------------------------------------------------------------
21909b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /// Write all or part of a scalar value to memory.
21919b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///
219236f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    /// The value contained in \a scalar will be swapped to match the
219336322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li    /// byte order of the process that is being debugged. If \a size is
2194068ef42c3ffe1eccec10f97f08541304f679fe67Wu-cheng Li    /// less than the size of scalar, the least significate \a size bytes
2195068ef42c3ffe1eccec10f97f08541304f679fe67Wu-cheng Li    /// from scalar will be written. If \a size is larger than the byte
219636322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li    /// size of scalar, then the extra space will be padded with zeros
2197068ef42c3ffe1eccec10f97f08541304f679fe67Wu-cheng Li    /// and the scalar value will be placed in the least significant
21989b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /// bytes in memory.
219900e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    ///
220000e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    /// @param[in] vm_addr
220100e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    ///     A virtual load address that indicates where to start writing
22029b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///     memory to.
220300e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    ///
220400e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    /// @param[in] scalar
220500e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    ///     The scalar to write to the debugged process.
220600e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    ///
220700e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    /// @param[in] size
22089b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///     This value can be smaller or larger than the scalar value
220900e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    ///     itself. If \a size is smaller than the size of \a scalar,
221000e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    ///     the least significant bytes in \a scalar will be used. If
221100e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    ///     \a size is larger than the byte size of \a scalar, then
221200e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    ///     the extra space will be padded with zeros. If \a size is
22139b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///     set to UINT32_MAX, then the size of \a scalar will be used.
221400e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    ///
221500e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    /// @param[out] error
221600e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    ///     An error value in case the memory write fails.
221700e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    ///
22189b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /// @return
221900e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    ///     The number of bytes that were actually written.
222000e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    //------------------------------------------------------------------
222100e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    size_t
222200e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    WriteScalarToMemory (lldb::addr_t vm_addr,
22239b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li                         const Scalar &scalar,
222400e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li                         uint32_t size,
222500e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li                         Error &error);
222600e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li
222700e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    size_t
22289b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ReadScalarIntegerFromMemory (lldb::addr_t addr,
222900e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li                                 uint32_t byte_size,
223000e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li                                 bool is_signed,
223100e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li                                 Scalar &scalar,
223200e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li                                 Error &error);
22339b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
223400e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    //------------------------------------------------------------------
223500e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    /// Write memory to a process.
223600e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    ///
223700e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    /// This function will write memory to the current process's
22389b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /// address space and maintain any traps that might be present due
223900e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    /// to software breakpoints.
224000e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    ///
224100e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    /// This function is not meant to be overridden by Process
224200e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    /// subclasses, the subclasses should implement
22439b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /// Process::DoWriteMemory (lldb::addr_t, size_t, void *).
224400e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    ///
224500e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    /// @param[in] vm_addr
224600e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    ///     A virtual load address that indicates where to start writing
224700e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    ///     memory to.
22489b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///
224900e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    /// @param[in] buf
225000e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    ///     A byte buffer that is at least \a size bytes long that
225100e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    ///     contains the data to write.
225200e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    ///
22539b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /// @param[in] size
225400e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    ///     The number of bytes to write.
225500e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    ///
225600e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    /// @return
225700e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    ///     The number of bytes that were actually written.
22589b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    //------------------------------------------------------------------
225900e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    size_t
226000e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    WriteMemory (lldb::addr_t vm_addr, const void *buf, size_t size, Error &error);
226100e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li
226200e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li
226300e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    //------------------------------------------------------------------
22649b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /// Actually allocate memory in the process.
226500e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    ///
226600e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    /// This function will allocate memory in the process's address
226700e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    /// space.  This can't rely on the generic function calling mechanism,
226800e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    /// since that requires this function.
22699b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///
227000e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    /// @param[in] size
227100e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    ///     The size of the allocation requested.
227200e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    ///
227300e21f8eb57a7ae2c19516aa0290ab4fb5f251c2Wu-cheng Li    /// @return
22749b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///     The address of the allocated buffer in the process, or
22759b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///     LLDB_INVALID_ADDRESS if the allocation failed.
2276c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li    //------------------------------------------------------------------
2277c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li
2278c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li    virtual lldb::addr_t
2279c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li    DoAllocateMemory (size_t size, uint32_t permissions, Error &error) = 0;
2280c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li
2281c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li    //------------------------------------------------------------------
228236322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li    /// The public interface to allocating memory in the process.
2283da2f0ea10822628875a956e4bf096066c0debe9fEino-Ville Talvala    ///
2284da2f0ea10822628875a956e4bf096066c0debe9fEino-Ville Talvala    /// This function will allocate memory in the process's address
2285da2f0ea10822628875a956e4bf096066c0debe9fEino-Ville Talvala    /// space.  This can't rely on the generic function calling mechanism,
2286da2f0ea10822628875a956e4bf096066c0debe9fEino-Ville Talvala    /// since that requires this function.
2287da2f0ea10822628875a956e4bf096066c0debe9fEino-Ville Talvala    ///
2288da2f0ea10822628875a956e4bf096066c0debe9fEino-Ville Talvala    /// @param[in] size
2289da2f0ea10822628875a956e4bf096066c0debe9fEino-Ville Talvala    ///     The size of the allocation requested.
2290da2f0ea10822628875a956e4bf096066c0debe9fEino-Ville Talvala    ///
2291f008f3ea82a0518375ee4ea41b32451badffbd95Wu-cheng Li    /// @param[in] permissions
2292f008f3ea82a0518375ee4ea41b32451badffbd95Wu-cheng Li    ///     Or together any of the lldb::Permissions bits.  The permissions on
229336322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li    ///     a given memory allocation can't be changed after allocation.  Note
229436322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li    ///     that a block that isn't set writable can still be written on from lldb,
229536f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    ///     just not by the process itself.
229636322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li    ///
229736322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li    /// @param[in/out] error
229836322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li    ///     An error object to fill in if things go wrong.
229936322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li    /// @return
230036322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li    ///     The address of the allocated buffer in the process, or
2301f008f3ea82a0518375ee4ea41b32451badffbd95Wu-cheng Li    ///     LLDB_INVALID_ADDRESS if the allocation failed.
2302f008f3ea82a0518375ee4ea41b32451badffbd95Wu-cheng Li    //------------------------------------------------------------------
2303f008f3ea82a0518375ee4ea41b32451badffbd95Wu-cheng Li
2304f008f3ea82a0518375ee4ea41b32451badffbd95Wu-cheng Li    lldb::addr_t
2305f008f3ea82a0518375ee4ea41b32451badffbd95Wu-cheng Li    AllocateMemory (size_t size, uint32_t permissions, Error &error);
2306f008f3ea82a0518375ee4ea41b32451badffbd95Wu-cheng Li
230736322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li    //------------------------------------------------------------------
230836f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    /// Determines whether executing JIT-compiled code in this process
230936322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li    /// is possible.
231036322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li    ///
231136322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li    /// @return
231236322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li    ///     True if execution of JIT code is possible; false otherwise.
231336322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li    //------------------------------------------------------------------
231436322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li    bool CanJIT ();
231536322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li
231636322db5752c7ec196f59ba94abe5d5a63cc19f5Wu-cheng Li    //------------------------------------------------------------------
2317c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li    /// Sets whether executing JIT-compiled code in this process
2318c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li    /// is possible.
2319c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li    ///
2320c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li    /// @param[in] can_jit
2321c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li    ///     True if execution of JIT code is possible; false otherwise.
2322c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li    //------------------------------------------------------------------
2323c58b42327df5fbc826e2fcc2674ab6db0edfcd92Wu-cheng Li    void SetCanJIT (bool can_jit);
2324699fe9397974685e6b2c73f9a3a0eb9e5a5a2ccfWu-cheng Li
2325d45cb72ac0d7d57829ffc9223decb89a5fc42ce2Wu-cheng Li    //------------------------------------------------------------------
2326b9ac75d3dfc53ab4a0a104da147f1dfd7bc8c12fWu-cheng Li    /// Actually deallocate memory in the process.
2327b9ac75d3dfc53ab4a0a104da147f1dfd7bc8c12fWu-cheng Li    ///
2328b9ac75d3dfc53ab4a0a104da147f1dfd7bc8c12fWu-cheng Li    /// This function will deallocate memory in the process's address
2329b9ac75d3dfc53ab4a0a104da147f1dfd7bc8c12fWu-cheng Li    /// space that was allocated with AllocateMemory.
2330b9ac75d3dfc53ab4a0a104da147f1dfd7bc8c12fWu-cheng Li    ///
233153b30912d3e8598c05e47308981971e958e98db2Wu-cheng Li    /// @param[in] ptr
233253b30912d3e8598c05e47308981971e958e98db2Wu-cheng Li    ///     A return value from AllocateMemory, pointing to the memory you
233353b30912d3e8598c05e47308981971e958e98db2Wu-cheng Li    ///     want to deallocate.
233453b30912d3e8598c05e47308981971e958e98db2Wu-cheng Li    ///
233553b30912d3e8598c05e47308981971e958e98db2Wu-cheng Li    /// @return
233653b30912d3e8598c05e47308981971e958e98db2Wu-cheng Li    ///     \btrue if the memory was deallocated, \bfalse otherwise.
233753b30912d3e8598c05e47308981971e958e98db2Wu-cheng Li    //------------------------------------------------------------------
233853b30912d3e8598c05e47308981971e958e98db2Wu-cheng Li
233953b30912d3e8598c05e47308981971e958e98db2Wu-cheng Li    virtual Error
234053b30912d3e8598c05e47308981971e958e98db2Wu-cheng Li    DoDeallocateMemory (lldb::addr_t ptr) = 0;
234153b30912d3e8598c05e47308981971e958e98db2Wu-cheng Li
234253b30912d3e8598c05e47308981971e958e98db2Wu-cheng Li    //------------------------------------------------------------------
2343d45cb72ac0d7d57829ffc9223decb89a5fc42ce2Wu-cheng Li    /// The public interface to deallocating memory in the process.
2344d45cb72ac0d7d57829ffc9223decb89a5fc42ce2Wu-cheng Li    ///
2345699fe9397974685e6b2c73f9a3a0eb9e5a5a2ccfWu-cheng Li    /// This function will deallocate memory in the process's address
2346b9ac75d3dfc53ab4a0a104da147f1dfd7bc8c12fWu-cheng Li    /// space that was allocated with AllocateMemory.
2347b9ac75d3dfc53ab4a0a104da147f1dfd7bc8c12fWu-cheng Li    ///
2348b9ac75d3dfc53ab4a0a104da147f1dfd7bc8c12fWu-cheng Li    /// @param[in] ptr
2349b9ac75d3dfc53ab4a0a104da147f1dfd7bc8c12fWu-cheng Li    ///     A return value from AllocateMemory, pointing to the memory you
235053b30912d3e8598c05e47308981971e958e98db2Wu-cheng Li    ///     want to deallocate.
235153b30912d3e8598c05e47308981971e958e98db2Wu-cheng Li    ///
23520f4f97b70f6ad59b32e78720ba7357733bdef3e9Wu-cheng Li    /// @return
23530f4f97b70f6ad59b32e78720ba7357733bdef3e9Wu-cheng Li    ///     \btrue if the memory was deallocated, \bfalse otherwise.
23540f4f97b70f6ad59b32e78720ba7357733bdef3e9Wu-cheng Li    //------------------------------------------------------------------
23550f4f97b70f6ad59b32e78720ba7357733bdef3e9Wu-cheng Li
23560f4f97b70f6ad59b32e78720ba7357733bdef3e9Wu-cheng Li    Error
23570f4f97b70f6ad59b32e78720ba7357733bdef3e9Wu-cheng Li    DeallocateMemory (lldb::addr_t ptr);
23580f4f97b70f6ad59b32e78720ba7357733bdef3e9Wu-cheng Li
23590f4f97b70f6ad59b32e78720ba7357733bdef3e9Wu-cheng Li    //------------------------------------------------------------------
23600f4f97b70f6ad59b32e78720ba7357733bdef3e9Wu-cheng Li    /// Get any available STDOUT.
23610f4f97b70f6ad59b32e78720ba7357733bdef3e9Wu-cheng Li    ///
23620f4f97b70f6ad59b32e78720ba7357733bdef3e9Wu-cheng Li    /// If the process was launched without supplying valid file paths
23630f4f97b70f6ad59b32e78720ba7357733bdef3e9Wu-cheng Li    /// for stdin, stdout, and stderr, then the Process class might
2364b9ac75d3dfc53ab4a0a104da147f1dfd7bc8c12fWu-cheng Li    /// try to cache the STDOUT for the process if it is able. Events
2365b9ac75d3dfc53ab4a0a104da147f1dfd7bc8c12fWu-cheng Li    /// will be queued indicating that there is STDOUT available that
2366b9ac75d3dfc53ab4a0a104da147f1dfd7bc8c12fWu-cheng Li    /// can be retrieved using this function.
2367b9ac75d3dfc53ab4a0a104da147f1dfd7bc8c12fWu-cheng Li    ///
2368b9ac75d3dfc53ab4a0a104da147f1dfd7bc8c12fWu-cheng Li    /// @param[out] buf
2369e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li    ///     A buffer that will receive any STDOUT bytes that are
2370e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li    ///     currently available.
2371e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li    ///
2372e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li    /// @param[out] buf_size
2373e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li    ///     The size in bytes for the buffer \a buf.
2374e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li    ///
2375e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li    /// @return
2376e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li    ///     The number of bytes written into \a buf. If this value is
2377e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li    ///     equal to \a buf_size, another call to this function should
2378e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li    ///     be made to retrieve more STDOUT data.
2379e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li    //------------------------------------------------------------------
2380e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li    virtual size_t
2381e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li    GetSTDOUT (char *buf, size_t buf_size, Error &error)
2382e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li    {
2383e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li        error.SetErrorString("stdout unsupported");
2384e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li        return 0;
2385e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li    }
2386e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li
2387e339c5edbebedf446581f18ad70214007309bf4bWu-cheng Li
2388ca099614841bc619f217dfa088da630a7eb1ab65Wu-cheng Li    //------------------------------------------------------------------
2389454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    /// Get any available STDERR.
2390454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    ///
2391454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    /// If the process was launched without supplying valid file paths
2392454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    /// for stdin, stdout, and stderr, then the Process class might
2393454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    /// try to cache the STDERR for the process if it is able. Events
2394454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    /// will be queued indicating that there is STDERR available that
2395454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    /// can be retrieved using this function.
2396454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    ///
2397454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    /// @param[out] buf
2398454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    ///     A buffer that will receive any STDERR bytes that are
2399454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    ///     currently available.
2400454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    ///
2401454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    /// @param[out] buf_size
24029b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///     The size in bytes for the buffer \a buf.
24039b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///
24049b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /// @return
2405eb68c46a40c773eb56ef7bcf8e7ece5c6a5a8d23Chih-Chung Chang    ///     The number of bytes written into \a buf. If this value is
240610a1b30dfbd0bbeae6776e353600986647c6e0a8Wu-cheng Li    ///     equal to \a buf_size, another call to this function should
24079b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///     be made to retrieve more STDERR data.
24089b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    //------------------------------------------------------------------
240970fb9085044c5e6f52c33c970d238b764cf2373bWu-cheng Li    virtual size_t
24109b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    GetSTDERR (char *buf, size_t buf_size, Error &error)
24117d9a8ffd08fa950eb14f8224f6090fe46ab4aa9fIgor Murashkin    {
24127d9a8ffd08fa950eb14f8224f6090fe46ab4aa9fIgor Murashkin        error.SetErrorString("stderr unsupported");
24137d9a8ffd08fa950eb14f8224f6090fe46ab4aa9fIgor Murashkin        return 0;
24147d9a8ffd08fa950eb14f8224f6090fe46ab4aa9fIgor Murashkin    }
24157d9a8ffd08fa950eb14f8224f6090fe46ab4aa9fIgor Murashkin
24167d9a8ffd08fa950eb14f8224f6090fe46ab4aa9fIgor Murashkin    virtual size_t
24177d9a8ffd08fa950eb14f8224f6090fe46ab4aa9fIgor Murashkin    PutSTDIN (const char *buf, size_t buf_size, Error &error)
24187d9a8ffd08fa950eb14f8224f6090fe46ab4aa9fIgor Murashkin    {
24197d9a8ffd08fa950eb14f8224f6090fe46ab4aa9fIgor Murashkin        error.SetErrorString("stdin unsupported");
24207d9a8ffd08fa950eb14f8224f6090fe46ab4aa9fIgor Murashkin        return 0;
24217d9a8ffd08fa950eb14f8224f6090fe46ab4aa9fIgor Murashkin    }
24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //----------------------------------------------------------------------
24247d9a8ffd08fa950eb14f8224f6090fe46ab4aa9fIgor Murashkin    // Process Breakpoints
24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //----------------------------------------------------------------------
24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t
24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GetSoftwareBreakpointTrapOpcode (BreakpointSite* bp_site);
2428df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
2429df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    virtual Error
2430df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    EnableBreakpoint (BreakpointSite *bp_site) = 0;
2431df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
2432df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    virtual Error
2433df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    DisableBreakpoint (BreakpointSite *bp_site) = 0;
2434df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
2435df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    // This is implemented completely using the lldb::Process API. Subclasses
2436df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    // don't need to implement this function unless the standard flow of
2437df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    // read existing opcode, write breakpoint opcode, verify breakpoint opcode
2438df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    // doesn't work for a specific process plug-in.
2439df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    virtual Error
2440df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    EnableSoftwareBreakpoint (BreakpointSite *bp_site);
2441df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
2442df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    // This is implemented completely using the lldb::Process API. Subclasses
2443df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    // don't need to implement this function unless the standard flow of
2444df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    // restoring original opcode in memory and verifying the restored opcode
2445df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    // doesn't work for a specific process plug-in.
2446d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk    virtual Error
2447d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk    DisableSoftwareBreakpoint (BreakpointSite *bp_site);
2448d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk
2449d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk    BreakpointSiteList &
2450d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk    GetBreakpointSiteList();
2451d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk
2452d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk    const BreakpointSiteList &
2453d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk    GetBreakpointSiteList() const;
2454d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk
2455d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk    void
2456d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk    DisableAllBreakpointSites ();
2457d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk
2458d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk    Error
2459df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    ClearBreakpointSiteByID (lldb::user_id_t break_id);
24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    lldb::break_id_t
24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    CreateBreakpointSite (lldb::BreakpointLocationSP &owner,
24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                          bool use_hardware);
2464a1d662716b3da384dfe3a758f079e0cbd089784aIgor Murashkin
24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Error
24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    DisableBreakpointSiteByID (lldb::user_id_t break_id);
24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Error
24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EnableBreakpointSiteByID (lldb::user_id_t break_id);
24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // BreakpointLocations use RemoveOwnerFromBreakpointSite to remove
24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // themselves from the owner's list of this breakpoint sites.  This has to
24749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // be a static function because you can't be sure that removing the
24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // breakpoint from it's containing map won't delete the breakpoint site,
24769b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    // and doing that in an instance method isn't copasetic.
24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void
24789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    RemoveOwnerFromBreakpointSite (lldb::user_id_t owner_id,
24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                   lldb::user_id_t owner_loc_id,
24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                   lldb::BreakpointSiteSP &bp_site_sp);
24810a12018e4cd6eaaeaec795f6b2af4499fe3a8bcdAli Utku Selen
24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //----------------------------------------------------------------------
24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Process Watchpoints (optional)
24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //----------------------------------------------------------------------
24859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual Error
24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EnableWatchpoint (Watchpoint *wp);
24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual Error
24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    DisableWatchpoint (Watchpoint *wp);
24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //------------------------------------------------------------------
24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Thread Queries
24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //------------------------------------------------------------------
24949b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    virtual uint32_t
24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    UpdateThreadList (ThreadList &old_thread_list, ThreadList &new_thread_list) = 0;
24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24979b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    void
24989b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    UpdateThreadListIfNeeded ();
24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ThreadList &
25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GetThreadList ()
25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
25039b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        return m_thread_list;
25040a12018e4cd6eaaeaec795f6b2af4499fe3a8bcdAli Utku Selen    }
25050a12018e4cd6eaaeaec795f6b2af4499fe3a8bcdAli Utku Selen
25060a12018e4cd6eaaeaec795f6b2af4499fe3a8bcdAli Utku Selen
25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t
25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GetNextThreadIndexID ();
25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //------------------------------------------------------------------
25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Event Handling
25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //------------------------------------------------------------------
25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    lldb::StateType
25149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GetNextEvent (lldb::EventSP &event_sp);
25159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25169b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    lldb::StateType
25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    WaitForProcessToStop (const TimeValue *timeout);
25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    lldb::StateType
25209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    WaitForStateChangedEvents (const TimeValue *timeout, lldb::EventSP &event_sp);
25219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Event *
25239b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    PeekAtStateChangedEvents ();
25249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class
25279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ProcessEventHijacker
2528cb56923ba6350cf7441260886f6e8a1c6785886dEino-Ville Talvala    {
2529cb56923ba6350cf7441260886f6e8a1c6785886dEino-Ville Talvala    public:
25309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ProcessEventHijacker (Process &process, Listener *listener) :
25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            m_process (process),
2532cb56923ba6350cf7441260886f6e8a1c6785886dEino-Ville Talvala            m_listener (listener)
2533cb56923ba6350cf7441260886f6e8a1c6785886dEino-Ville Talvala        {
25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            m_process.HijackProcessEvents (listener);
25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ~ProcessEventHijacker ()
25377d9a8ffd08fa950eb14f8224f6090fe46ab4aa9fIgor Murashkin        {
25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            m_process.RestoreProcessEvents();
25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private:
25429b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        Process &m_process;
25439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Listener *m_listener;
25449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    friend class ProcessEventHijacker;
25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //------------------------------------------------------------------
25477d9a8ffd08fa950eb14f8224f6090fe46ab4aa9fIgor Murashkin    /// If you need to ensure that you and only you will hear about some public
25487d9a8ffd08fa950eb14f8224f6090fe46ab4aa9fIgor Murashkin    /// event, then make a new listener, set to listen to process events, and
25497d9a8ffd08fa950eb14f8224f6090fe46ab4aa9fIgor Murashkin    /// then call this with that listener.  Then you will have to wait on that
25507d9a8ffd08fa950eb14f8224f6090fe46ab4aa9fIgor Murashkin    /// listener explicitly for events (rather than using the GetNextEvent & WaitFor*
25517d9a8ffd08fa950eb14f8224f6090fe46ab4aa9fIgor Murashkin    /// calls above.  Be sure to call RestoreProcessEvents when you are done.
25527d9a8ffd08fa950eb14f8224f6090fe46ab4aa9fIgor Murashkin    ///
25537d9a8ffd08fa950eb14f8224f6090fe46ab4aa9fIgor Murashkin    /// @param[in] listener
25547d9a8ffd08fa950eb14f8224f6090fe46ab4aa9fIgor Murashkin    ///     This is the new listener to whom all process events will be delivered.
25557d9a8ffd08fa950eb14f8224f6090fe46ab4aa9fIgor Murashkin    ///
25567d9a8ffd08fa950eb14f8224f6090fe46ab4aa9fIgor Murashkin    /// @return
25577d9a8ffd08fa950eb14f8224f6090fe46ab4aa9fIgor Murashkin    ///     Returns \b true if the new listener could be installed,
25587d9a8ffd08fa950eb14f8224f6090fe46ab4aa9fIgor Murashkin    ///     \b false otherwise.
25599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //------------------------------------------------------------------
25609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool
2561e98e4c806320ccb3078805ac019cca3ed9796123Wu-cheng Li    HijackProcessEvents (Listener *listener);
2562f715bf95ded30821e81ba93bb48c08725e1c34aaWu-cheng Li
2563f715bf95ded30821e81ba93bb48c08725e1c34aaWu-cheng Li    //------------------------------------------------------------------
2564f715bf95ded30821e81ba93bb48c08725e1c34aaWu-cheng Li    /// Restores the process event broadcasting to its normal state.
2565f715bf95ded30821e81ba93bb48c08725e1c34aaWu-cheng Li    ///
2566f715bf95ded30821e81ba93bb48c08725e1c34aaWu-cheng Li    //------------------------------------------------------------------
2567f715bf95ded30821e81ba93bb48c08725e1c34aaWu-cheng Li    void
2568f715bf95ded30821e81ba93bb48c08725e1c34aaWu-cheng Li    RestoreProcessEvents ();
2569f715bf95ded30821e81ba93bb48c08725e1c34aaWu-cheng Li
2570f715bf95ded30821e81ba93bb48c08725e1c34aaWu-cheng Liprotected:
2571f715bf95ded30821e81ba93bb48c08725e1c34aaWu-cheng Li    //------------------------------------------------------------------
2572f715bf95ded30821e81ba93bb48c08725e1c34aaWu-cheng Li    /// This is the part of the event handling that for a process event.
2573f715bf95ded30821e81ba93bb48c08725e1c34aaWu-cheng Li    /// It decides what to do with the event and returns true if the
2574f715bf95ded30821e81ba93bb48c08725e1c34aaWu-cheng Li    /// event needs to be propagated to the user, and false otherwise.
2575f715bf95ded30821e81ba93bb48c08725e1c34aaWu-cheng Li    /// If the event is not propagated, this call will most likely set
2576f715bf95ded30821e81ba93bb48c08725e1c34aaWu-cheng Li    /// the target to executing again.
2577f715bf95ded30821e81ba93bb48c08725e1c34aaWu-cheng Li    ///
2578f715bf95ded30821e81ba93bb48c08725e1c34aaWu-cheng Li    /// @param[in] event_ptr
2579f715bf95ded30821e81ba93bb48c08725e1c34aaWu-cheng Li    ///     This is the event we are handling.
2580f715bf95ded30821e81ba93bb48c08725e1c34aaWu-cheng Li    ///
2581f715bf95ded30821e81ba93bb48c08725e1c34aaWu-cheng Li    /// @return
2582f715bf95ded30821e81ba93bb48c08725e1c34aaWu-cheng Li    ///     Returns \b true if the event should be reported to the
2583e98e4c806320ccb3078805ac019cca3ed9796123Wu-cheng Li    ///     user, \b false otherwise.
2584e98e4c806320ccb3078805ac019cca3ed9796123Wu-cheng Li    //------------------------------------------------------------------
2585e98e4c806320ccb3078805ac019cca3ed9796123Wu-cheng Li    bool
25869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ShouldBroadcastEvent (Event *event_ptr);
25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25889b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Lipublic:
25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const lldb::ABISP &
25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GetABI ();
25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    DynamicLoader *
25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GetDynamicLoader ()
25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
25959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return m_dyld_ap.get();
25969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25989b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    OperatingSystem *
25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GetOperatingSystem ()
26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return m_os_ap.get();
26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual LanguageRuntime *
26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GetLanguageRuntime (lldb::LanguageType language);
260726274fae33b7b056cf5fe9fd6e823cae9e4ddae2Wu-cheng Li
260826274fae33b7b056cf5fe9fd6e823cae9e4ddae2Wu-cheng Li    virtual CPPLanguageRuntime *
260926274fae33b7b056cf5fe9fd6e823cae9e4ddae2Wu-cheng Li    GetCPPLanguageRuntime ();
26109b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
2611c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li    virtual ObjCLanguageRuntime *
2612c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li    GetObjCLanguageRuntime ();
2613c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li
2614c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li    bool
2615c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li    IsRunning () const;
2616c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li
2617c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li    DynamicCheckerFunctions *GetDynamicCheckers()
2618c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li    {
2619c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li        return m_dynamic_checkers_ap.get();
2620c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li    }
2621c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li
26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void SetDynamicCheckers(DynamicCheckerFunctions *dynamic_checkers)
26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
2624c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li        m_dynamic_checkers_ap.reset(dynamic_checkers);
2625c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li    }
2626c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li
2627c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li    //------------------------------------------------------------------
26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /// Call this to set the lldb in the mode where it breaks on new thread
26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /// creations, and then auto-restarts.  This is useful when you are trying
26309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /// to run only one thread, but either that thread or the kernel is creating
26319b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /// new threads in the process.  If you stop when the thread is created, you
26329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /// can immediately suspend it, and keep executing only the one thread you intend.
26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ///
26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /// @return
26359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ///     Returns \b true if we were able to start up the notification
26369b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///     \b false otherwise.
2637dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong    //------------------------------------------------------------------
26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual bool
26399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    StartNoticingNewThreads()
26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
26419b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        return true;
26429b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    }
26439b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
26449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //------------------------------------------------------------------
26459b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /// Call this to turn off the stop & notice new threads mode.
26469b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ///
26479b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    /// @return
26483f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li    ///     Returns \b true if we were able to start up the notification
26499c79938d47a3caa06e5fb956955374f30c55992bWu-cheng Li    ///     \b false otherwise.
26509b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    //------------------------------------------------------------------
26519b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    virtual bool
26529b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    StopNoticingNewThreads()
26539b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    {
26549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
26559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
265732a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    void
265832a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    SetRunningUserExpression (bool on);
2659dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong
266032a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    //------------------------------------------------------------------
2661dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong    // lldb::ExecutionContextScope pure virtual functions
2662dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong    //------------------------------------------------------------------
2663dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong    virtual Target *
2664dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong    CalculateTarget ()
266532a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    {
2666dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong        return &m_target;
2667dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong    }
2668dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong
2669dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong    virtual Process *
2670dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong    CalculateProcess ()
2671dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong    {
2672dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong        return this;
2673dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong    }
2674dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong
2675dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong    virtual Thread *
2676dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong    CalculateThread ()
2677dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong    {
2678dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong        return NULL;
2679dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong    }
2680dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong
2681dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong    virtual StackFrame *
2682dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong    CalculateStackFrame ()
2683dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong    {
2684dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong        return NULL;
2685dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong    }
2686dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong
2687dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong    virtual void
2688dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong    CalculateExecutionContext (ExecutionContext &exe_ctx);
2689dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong
2690dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong    lldb::ProcessSP
2691dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong    GetSP ();
2692dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong
2693dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dongprotected:
2694dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong    //------------------------------------------------------------------
2695dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong    // NextEventAction provides a way to register an action on the next
2696dd0b16c26834d9a58b9865a467c7a26ea14482f3James Dong    // event that is delivered to this process.  There is currently only
269732a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    // one next event action allowed in the process at one time.  If a
26984c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li    // new "NextEventAction" is added while one is already present, the
269932a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    // old action will be discarded (with HandleBeingUnshipped called
27009b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    // after it is discarded.)
270132a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    //------------------------------------------------------------------
270232a972c693400db50717435139fa292a63bc937aEino-Ville Talvala    class NextEventAction
2703c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li    {
27049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
27059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        typedef enum EventActionResult
2706c157e0cd161e5b3b28b72bafebb3360ed856a608Wu-cheng Li        {
27079b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            eEventActionSuccess,
27089b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            eEventActionRetry,
27099b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            eEventActionExit
27109b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        } EventActionResult;
27119b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
27129b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        NextEventAction (Process *process) :
27139b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li            m_process(process)
27149b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        {}
27159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual ~NextEventAction() {}
27169b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
27179b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        virtual EventActionResult PerformAction (lldb::EventSP &event_sp) = 0;
27189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void HandleBeingUnshipped () {};
27199b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        virtual EventActionResult HandleBeingInterrupted () = 0;
27209b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        virtual const char *GetExitString() = 0;
27219b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    protected:
27229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Process *m_process;
27239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
27249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27254c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li    void SetNextEventAction (Process::NextEventAction *next_event_action)
27264c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li    {
27273f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        if (m_next_event_action_ap.get())
27284c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li            m_next_event_action_ap->HandleBeingUnshipped();
27294c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li
27304c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li        m_next_event_action_ap.reset(next_event_action);
27314c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li    }
27324c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li
27334c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li    // This is the completer for Attaching:
27344c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li    class AttachCompletionHandler : public NextEventAction
27354c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li    {
27364c4300c71229638183d814ab8374e09f722910f5Wu-cheng Li    public:
27379b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        AttachCompletionHandler (Process *process) :
27389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NextEventAction(process)
27399b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        {}
27409b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        virtual ~AttachCompletionHandler() {}
27419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27429b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        virtual EventActionResult PerformAction (lldb::EventSP &event_sp);
27439b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        virtual EventActionResult HandleBeingInterrupted ();
27449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual const char *GetExitString();
27459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private:
27469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        std::string m_exit_string;
27479b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    };
27489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27499b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    bool
27509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    HijackPrivateProcessEvents (Listener *listener);
27519b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
27529b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    void
27539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    RestorePrivateProcessEvents ();
27549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool
27569b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    PrivateStateThreadIsValid () const
27579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
27589b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        return m_private_state_thread != LLDB_INVALID_HOST_THREAD;
27599b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    }
27609b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
27619b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    //------------------------------------------------------------------
27629b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    // Member variables
27639b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    //------------------------------------------------------------------
27649b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    Target &                    m_target;               ///< The target that owns this process.
27659b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ThreadSafeValue<lldb::StateType>  m_public_state;
27669b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    ThreadSafeValue<lldb::StateType>  m_private_state; // The actual state of our process
27679b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    Broadcaster                 m_private_state_broadcaster;  // This broadcaster feeds state changed events into the private state thread's listener.
27689b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    Broadcaster                 m_private_state_control_broadcaster; // This is the control broadcaster, used to pause, resume & stop the private state thread.
27699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Listener                    m_private_state_listener;     // This is the listener for the private state thread.
27709b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    Predicate<bool>             m_private_state_control_wait; /// This Predicate is used to signal that a control operation is complete.
27719b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    lldb::thread_t              m_private_state_thread;  // Thread ID for the thread that watches interal state events
27729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ProcessModID                m_mod_id;              ///< Tracks the state of the process over stops and other alterations.
27739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t                    m_thread_index_id;      ///< Each thread is created with a 1 based index that won't get re-used.
27749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int                         m_exit_status;          ///< The exit status of the process, or -1 if not set.
2775a18e90176a8e2442837d0503fbfd4adb9df0818fWu-cheng Li    std::string                 m_exit_string;          ///< A textual description of why a process exited.
2776a18e90176a8e2442837d0503fbfd4adb9df0818fWu-cheng Li    ThreadList                  m_thread_list;          ///< The threads for this process.
27779b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    std::vector<Notifications>  m_notifications;        ///< The list of notifications that this process can deliver.
27789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    std::vector<lldb::addr_t>   m_image_tokens;
27795f1e69c76ef5886ed65e303490c5f660da4756efWu-cheng Li    Listener                    &m_listener;
27809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    BreakpointSiteList          m_breakpoint_site_list; ///< This is the list of breakpoint locations we intend
27815f1e69c76ef5886ed65e303490c5f660da4756efWu-cheng Li                                                        ///< to insert in the target.
27829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    std::auto_ptr<DynamicLoader> m_dyld_ap;
27839b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    std::auto_ptr<DynamicCheckerFunctions>  m_dynamic_checkers_ap; ///< The functions used by the expression parser to validate data that expressions use.
27849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    std::auto_ptr<OperatingSystem>     m_os_ap;
27859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    UnixSignals                 m_unix_signals;         /// This is the current signal set for this process.
27869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    lldb::ABISP                 m_abi_sp;
2787a18e90176a8e2442837d0503fbfd4adb9df0818fWu-cheng Li    lldb::InputReaderSP         m_process_input_reader;
2788a18e90176a8e2442837d0503fbfd4adb9df0818fWu-cheng Li    lldb_private::Communication m_stdio_communication;
2789a18e90176a8e2442837d0503fbfd4adb9df0818fWu-cheng Li    lldb_private::Mutex         m_stdio_communication_mutex;
27909b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    std::string                 m_stdout_data;
27919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    MemoryCache                 m_memory_cache;
27925f1e69c76ef5886ed65e303490c5f660da4756efWu-cheng Li    AllocatedMemoryCache        m_allocated_memory_cache;
27939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool                        m_attached_to_process;   /// Did we launch the process or attach to it?
27945f1e69c76ef5886ed65e303490c5f660da4756efWu-cheng Li
27959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    typedef std::map<lldb::LanguageType, lldb::LanguageRuntimeSP> LanguageRuntimeCollection;
27969b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    LanguageRuntimeCollection m_language_runtimes;
27979b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    std::auto_ptr<NextEventAction> m_next_event_action_ap;
27989b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
27999b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    enum {
28009b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        eCanJITDontKnow= 0,
28019b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        eCanJITYes,
28023f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li        eCanJITNo
28033f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li    } m_can_jit;
28045f1e69c76ef5886ed65e303490c5f660da4756efWu-cheng Li
28059b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    size_t
28065f1e69c76ef5886ed65e303490c5f660da4756efWu-cheng Li    RemoveBreakpointOpcodesFromBuffer (lldb::addr_t addr, size_t size, uint8_t *buf) const;
28079b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li
28089b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    void
28099b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li    SynchronouslyNotifyStateChanged (lldb::StateType state);
28109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void
28129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SetPublicState (lldb::StateType new_state);
28134a68e3c26dd2512c319071dc20074baa6e7d171fHai Guo
28141620d118a49dc6df7b0e83d7343f8a8bb6e23b12Wu-cheng Li    void
2815454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    SetPrivateState (lldb::StateType state);
2816454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li
2817454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    bool
2818454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    StartPrivateStateThread ();
2819454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li
2820454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    void
2821454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    StopPrivateStateThread ();
2822454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li
2823454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    void
2824454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    PausePrivateStateThread ();
2825454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li
2826454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    void
2827454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    ResumePrivateStateThread ();
2828454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li
2829454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    static void *
2830454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    PrivateStateThread (void *arg);
2831454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li
2832454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    void *
2833454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    RunPrivateStateThread ();
2834454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li
2835454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    void
2836454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    HandlePrivateEvent (lldb::EventSP &event_sp);
2837454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li
2838454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    lldb::StateType
2839454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    WaitForProcessStopPrivate (const TimeValue *timeout, lldb::EventSP &event_sp);
28405f1e69c76ef5886ed65e303490c5f660da4756efWu-cheng Li
2841454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    // This waits for both the state change broadcaster, and the control broadcaster.
2842454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    // If control_only, it only waits for the control broadcaster.
2843454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li
2844454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    bool
2845454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    WaitForEventsPrivate (const TimeValue *timeout, lldb::EventSP &event_sp, bool control_only);
2846454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li
2847454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    lldb::StateType
2848454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    WaitForStateChangedEventsPrivate (const TimeValue *timeout, lldb::EventSP &event_sp);
2849454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li
2850454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    lldb::StateType
2851454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    WaitForState (const TimeValue *timeout,
2852454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li                  const lldb::StateType *match_states,
2853454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li                  const uint32_t num_match_states);
2854454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li
2855454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    size_t
2856454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    WriteMemoryPrivate (lldb::addr_t addr, const void *buf, size_t size, Error &error);
2857454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li
2858454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    void
2859454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    AppendSTDOUT (const char *s, size_t len);
2860454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li
2861454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    static void
2862454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    STDIOReadThreadBytesReceived (void *baton, const void *src, size_t src_len);
2863454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li
2864454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    void
2865454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    PushProcessInputReader ();
2866454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li
2867454630f23784afcf3dd6fc58becbb9fb6aa878a9Wu-cheng Li    void
28687478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Li    PopProcessInputReader ();
2869da0a56df963353a1f1bd1914fa31f870d982dd5aScott Main
2870a696f5d667227365da732481770767dcb330dd23Mathias Agopian    void
2871df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main    ResetProcessInputReader ();
28727478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Li
2873951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala    void
2874951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala    SetUpProcessInputReader (int file_descriptor);
2875951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala
2876951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala    static size_t
2877951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala    ProcessInputReaderCallback (void *baton,
2878951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala                                InputReader &reader,
2879951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala                                lldb::InputReaderAction notification,
2880951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala                                const char *bytes,
2881951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala                                size_t bytes_len);
2882951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala
2883951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala
2884951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvalaprivate:
2885951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala    //------------------------------------------------------------------
2886951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala    // For Process only
2887951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala    //------------------------------------------------------------------
2888951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala    void ControlPrivateStateThread (uint32_t signal);
2889951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala
2890951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala    DISALLOW_COPY_AND_ASSIGN (Process);
2891951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala
2892951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala};
2893951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala
2894951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala} // namespace lldb_private
2895951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala
2896951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala#endif  // liblldb_Process_h_
2897951516358e2841d2425f610bcd0175d9960135d2Eino-Ville Talvala