Process.cpp revision 1f3dd643e10552de04644986a603f7ff02ed4beb
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Process.cpp ---------------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private-log.h"
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Breakpoint/StoppointCallbackContext.h"
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Breakpoint/BreakpointLocation.h"
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Event.h"
17861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice#include "lldb/Core/ConnectionFileDescriptor.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Debugger.h"
19861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice#include "lldb/Core/InputReader.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Log.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/PluginManager.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/State.h"
236e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice#include "lldb/Interpreter/CommandInterpreter.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Host/Host.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ABI.h"
260baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton#include "lldb/Target/DynamicLoader.h"
27642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham#include "lldb/Target/LanguageRuntime.h"
28642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham#include "lldb/Target/CPPLanguageRuntime.h"
29642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham#include "lldb/Target/ObjCLanguageRuntime.h"
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h"
31643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton#include "lldb/Target/StopInfo.h"
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Target.h"
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/TargetList.h"
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h"
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlan.h"
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess*
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::FindPlugin (Target &target, const char *plugin_name, Listener &listener)
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ProcessCreateInstance create_callback = NULL;
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (plugin_name)
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        create_callback  = PluginManager::GetProcessCreateCallbackForPluginName (plugin_name);
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (create_callback)
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            std::auto_ptr<Process> debugger_ap(create_callback(target, listener));
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (debugger_ap->CanDebug(target))
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return debugger_ap.release();
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
5654e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton        for (uint32_t idx = 0; (create_callback = PluginManager::GetProcessCreateCallbackAtIndex(idx)) != NULL; ++idx)
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
5854e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton            std::auto_ptr<Process> debugger_ap(create_callback(target, listener));
5954e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton            if (debugger_ap->CanDebug(target))
6054e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton                return debugger_ap.release();
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Process constructor
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Process(Target &target, Listener &listener) :
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    UserID (LLDB_INVALID_PROCESS_ID),
7249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    Broadcaster ("lldb.process"),
73c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton    ProcessInstanceSettings (*GetSettingsController()),
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target (target),
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_public_state (eStateUnloaded),
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_private_state (eStateUnloaded),
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_private_state_broadcaster ("lldb.process.internal_state_broadcaster"),
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_private_state_control_broadcaster ("lldb.process.internal_state_control_broadcaster"),
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_private_state_listener ("lldb.process.internal_state_listener"),
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_private_state_control_wait(),
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_private_state_thread (LLDB_INVALID_HOST_THREAD),
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_stop_id (0),
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_thread_index_id (0),
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_exit_status (-1),
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_exit_string (),
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_thread_list (this),
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_notifications (),
8820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    m_image_tokens (),
8920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    m_listener (listener),
9020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    m_breakpoint_site_list (),
9120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    m_dynamic_checkers_ap (),
92861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    m_unix_signals (),
9320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    m_target_triple (),
9420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    m_byte_order (eByteOrderHost),
9520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    m_addr_byte_size (0),
9620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    m_abi_sp (),
97861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    m_process_input_reader (),
98eecb0f3b5021e37311f9588f14bcab38a35b8e9aGreg Clayton    m_stdio_communication ("lldb.process.stdio"),
9920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    m_stdio_communication_mutex (Mutex::eMutexTypeRecursive),
100861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    m_stdout_data ()
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1021ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice    UpdateInstanceName();
1031ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice
104e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("%p Process::Process()", this);
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10849ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    SetEventName (eBroadcastBitStateChanged, "state-changed");
10949ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    SetEventName (eBroadcastBitInterrupt, "interrupt");
11049ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    SetEventName (eBroadcastBitSTDOUT, "stdout-available");
11149ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    SetEventName (eBroadcastBitSTDERR, "stderr-available");
11249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    listener.StartListeningForEvents (this,
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                      eBroadcastBitStateChanged |
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                      eBroadcastBitInterrupt |
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                      eBroadcastBitSTDOUT |
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                      eBroadcastBitSTDERR);
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_private_state_listener.StartListeningForEvents(&m_private_state_broadcaster,
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     eBroadcastBitStateChanged);
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_private_state_listener.StartListeningForEvents(&m_private_state_control_broadcaster,
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     eBroadcastInternalStateControlStop |
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     eBroadcastInternalStateControlPause |
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     eBroadcastInternalStateControlResume);
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::~Process()
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
133e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("%p Process::~Process()", this);
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StopPrivateStateThread();
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Finalize()
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Do any cleanup needed prior to being destructed... Subclasses
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // that override this method should call this superclass method as well.
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::RegisterNotificationCallbacks (const Notifications& callbacks)
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_notifications.push_back(callbacks);
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (callbacks.initialize != NULL)
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        callbacks.initialize (callbacks.baton, this);
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::UnregisterNotificationCallbacks(const Notifications& callbacks)
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::vector<Notifications>::iterator pos, end = m_notifications.end();
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (pos = m_notifications.begin(); pos != end; ++pos)
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (pos->baton == callbacks.baton &&
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            pos->initialize == callbacks.initialize &&
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            pos->process_state_changed == callbacks.process_state_changed)
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_notifications.erase(pos);
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::SynchronouslyNotifyStateChanged (StateType state)
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::vector<Notifications>::iterator notification_pos, notification_end = m_notifications.end();
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (notification_pos = m_notifications.begin(); notification_pos != notification_end; ++notification_pos)
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (notification_pos->process_state_changed)
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            notification_pos->process_state_changed (notification_pos->baton, this, state);
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// FIXME: We need to do some work on events before the general Listener sees them.
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// For instance if we are continuing from a breakpoint, we need to ensure that we do
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// the little "insert real insn, step & stop" trick.  But we can't do that when the
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// event is delivered by the broadcaster - since that is done on the thread that is
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// waiting for new events, so if we needed more than one event for our handling, we would
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// stall.  So instead we do it when we fetch the event off of the queue.
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetNextEvent (EventSP &event_sp)
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StateType state = eStateInvalid;
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_listener.GetNextEventForBroadcaster (this, event_sp) && event_sp)
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        state = Process::ProcessEventData::GetStateFromEvent (event_sp.get());
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return state;
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForProcessToStop (const TimeValue *timeout)
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StateType match_states[] = { eStateStopped, eStateCrashed, eStateDetached, eStateExited, eStateUnloaded };
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return WaitForState (timeout, match_states, sizeof(match_states) / sizeof(StateType));
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForState
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const TimeValue *timeout,
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const StateType *match_states, const uint32_t num_match_states
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    EventSP event_sp;
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t i;
219d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton    StateType state = GetState();
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    while (state != eStateInvalid)
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
222d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton        // If we are exited or detached, we won't ever get back to any
223d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton        // other valid state...
224d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton        if (state == eStateDetached || state == eStateExited)
225d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton            return state;
226d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        state = WaitForStateChangedEvents (timeout, event_sp);
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (i=0; i<num_match_states; ++i)
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (match_states[i] == state)
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return state;
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return state;
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23863e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Inghambool
23963e24d7aeae8a7feb2aae0581e597b922749d4a1Jim InghamProcess::HijackProcessEvents (Listener *listener)
24063e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham{
24163e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham    if (listener != NULL)
24263e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham    {
24363e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham        return HijackBroadcaster(listener, eBroadcastBitStateChanged);
24463e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham    }
24563e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham    else
24663e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham        return false;
24763e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham}
24863e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham
24963e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Inghamvoid
25063e24d7aeae8a7feb2aae0581e597b922749d4a1Jim InghamProcess::RestoreProcessEvents ()
25163e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham{
25263e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham    RestoreBroadcaster();
25363e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham}
25463e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForStateChangedEvents (const TimeValue *timeout, EventSP &event_sp)
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
258e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout);
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StateType state = eStateInvalid;
26436f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton    if (m_listener.WaitForEventForBroadcasterWithType (timeout,
26536f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton                                                       this,
26636f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton                                                       eBroadcastBitStateChanged,
26736f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton                                                       event_sp))
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
270926060e198137f8a64face70455324a8cd4362a5Caroline Tice    log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS);
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("Process::%s (timeout = %p, event_sp) => %s",
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     __FUNCTION__,
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     timeout,
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     StateAsCString(state));
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return state;
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerEvent *
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::PeekAtStateChangedEvents ()
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
282e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("Process::%s...", __FUNCTION__);
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Event *event_ptr;
28836f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton    event_ptr = m_listener.PeekAtNextEventForBroadcasterWithType (this,
28936f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton                                                                  eBroadcastBitStateChanged);
290926060e198137f8a64face70455324a8cd4362a5Caroline Tice    log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS);
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (event_ptr)
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            log->Printf ("Process::%s (event_ptr) => %s",
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         __FUNCTION__,
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         StateAsCString(ProcessEventData::GetStateFromEvent (event_ptr)));
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            log->Printf ("Process::%s no events found",
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         __FUNCTION__);
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return event_ptr;
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForStateChangedEventsPrivate (const TimeValue *timeout, EventSP &event_sp)
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
311e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout);
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StateType state = eStateInvalid;
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_private_state_listener.WaitForEventForBroadcasterWithType(timeout,
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                    &m_private_state_broadcaster,
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                    eBroadcastBitStateChanged,
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                    event_sp))
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This is a bit of a hack, but when we wait here we could very well return
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // to the command-line, and that could disable the log, which would render the
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // log we got above invalid.
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS);
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("Process::%s (timeout = %p, event_sp) => %s", __FUNCTION__, timeout, StateAsCString(state));
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return state;
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForEventsPrivate (const TimeValue *timeout, EventSP &event_sp, bool control_only)
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
335e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout);
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (control_only)
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_private_state_listener.WaitForEventForBroadcaster(timeout, &m_private_state_control_broadcaster, event_sp);
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_private_state_listener.WaitForEvent(timeout, event_sp);
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::IsRunning () const
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return StateIsRunningState (m_public_state.GetValue());
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetExitStatus ()
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_public_state.GetValue() == eStateExited)
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_exit_status;
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return -1;
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
360638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton
361638351aee118e89c658ca295cb4e9d1db7849befGreg Claytonvoid
362638351aee118e89c658ca295cb4e9d1db7849befGreg ClaytonProcess::ProcessInstanceSettings::GetHostEnvironmentIfNeeded ()
363638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton{
364638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton    if (m_inherit_host_env && !m_got_host_env)
365638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton    {
366638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton        m_got_host_env = true;
367638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton        StringList host_env;
368638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton        const size_t host_env_count = Host::GetEnvironment (host_env);
369638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton        for (size_t idx=0; idx<host_env_count; idx++)
370638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton        {
371638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton            const char *env_entry = host_env.GetStringAtIndex (idx);
372638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton            if (env_entry)
373638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton            {
3741f3dd643e10552de04644986a603f7ff02ed4bebGreg Clayton                const char *equal_pos = ::strchr(env_entry, '=');
375638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton                if (equal_pos)
376638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton                {
377638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton                    std::string key (env_entry, equal_pos - env_entry);
378638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton                    std::string value (equal_pos + 1);
379638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton                    if (m_env_vars.find (key) == m_env_vars.end())
380638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton                        m_env_vars[key] = value;
381638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton                }
382638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton            }
383638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton        }
384638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton    }
385638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton}
386638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton
387638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton
388638351aee118e89c658ca295cb4e9d1db7849befGreg Claytonsize_t
389638351aee118e89c658ca295cb4e9d1db7849befGreg ClaytonProcess::ProcessInstanceSettings::GetEnvironmentAsArgs (Args &env)
390638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton{
391638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton    GetHostEnvironmentIfNeeded ();
392638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton
393638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton    dictionary::const_iterator pos, end = m_env_vars.end();
394638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton    for (pos = m_env_vars.begin(); pos != end; ++pos)
395638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton    {
396638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton        std::string env_var_equal_value (pos->first);
397638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton        env_var_equal_value.append(1, '=');
398638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton        env_var_equal_value.append (pos->second);
399638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton        env.AppendArgument (env_var_equal_value.c_str());
400638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton    }
401638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton    return env.GetArgumentCount();
402638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton}
403638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton
404638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetExitDescription ()
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_public_state.GetValue() == eStateExited && !m_exit_string.empty())
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_exit_string.c_str();
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::SetExitStatus (int status, const char *cstr)
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
41658e844b3561848e73e69d6d98746d4851e78306eGreg Clayton    if (m_private_state.GetValue() != eStateExited)
41758e844b3561848e73e69d6d98746d4851e78306eGreg Clayton    {
41858e844b3561848e73e69d6d98746d4851e78306eGreg Clayton        m_exit_status = status;
41958e844b3561848e73e69d6d98746d4851e78306eGreg Clayton        if (cstr)
42058e844b3561848e73e69d6d98746d4851e78306eGreg Clayton            m_exit_string = cstr;
42158e844b3561848e73e69d6d98746d4851e78306eGreg Clayton        else
42258e844b3561848e73e69d6d98746d4851e78306eGreg Clayton            m_exit_string.clear();
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42458e844b3561848e73e69d6d98746d4851e78306eGreg Clayton        DidExit ();
42558e844b3561848e73e69d6d98746d4851e78306eGreg Clayton
42658e844b3561848e73e69d6d98746d4851e78306eGreg Clayton        SetPrivateState (eStateExited);
42758e844b3561848e73e69d6d98746d4851e78306eGreg Clayton    }
42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This static callback can be used to watch for local child processes on
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// the current host. The the child process exits, the process will be
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// found in the global target list (we want to be completely sure that the
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// lldb_private::Process doesn't go away before we can deliver the signal.
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::SetProcessExitStatus
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void *callback_baton,
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::pid_t pid,
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int signo,      // Zero for no signal
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int exit_status      // Exit value of process if signal is zero
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (signo == 0 || exit_status)
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
44563094e0bb161580564954dee512955c1c79d3476Greg Clayton        TargetSP target_sp(Debugger::FindTargetWithProcessID (pid));
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_sp)
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ProcessSP process_sp (target_sp->GetProcessSP());
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (process_sp)
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const char *signal_cstr = NULL;
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (signo)
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    signal_cstr = process_sp->GetUnixSignals().GetSignalAsCString (signo);
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                process_sp->SetExitStatus (exit_status, signal_cstr);
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetNextThreadIndexID ()
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ++m_thread_index_id;
46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType
47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetState()
47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // If any other threads access this we will need a mutex for it
47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_public_state.GetValue ();
47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::SetPublicState (StateType new_state)
47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
480e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE));
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf("Process::SetPublicState (%s)", StateAsCString(new_state));
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_public_state.SetValue (new_state);
48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetPrivateState ()
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_private_state.GetValue();
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::SetPrivateState (StateType new_state)
49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
495e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE));
49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool state_changed = false;
49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf("Process::SetPrivateState (%s)", StateAsCString(new_state));
50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker(m_private_state.GetMutex());
50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const StateType old_state = m_private_state.GetValueNoLock ();
50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    state_changed = old_state != new_state;
50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (state_changed)
50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_private_state.SetValueNoLock (new_state);
50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (StateIsStoppedState(new_state))
50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_stop_id++;
51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (log)
51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                log->Printf("Process::SetPrivateState (%s) stop_id = %u", StateAsCString(new_state), m_stop_id);
51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Use our target to get a shared pointer to ourselves...
51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_private_state_broadcaster.BroadcastEvent (eBroadcastBitStateChanged, new ProcessEventData (GetTarget().GetProcessSP(), new_state));
51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (log)
52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            log->Printf("Process::SetPrivateState (%s) state didn't change. Ignoring...", StateAsCString(new_state), StateAsCString(old_state));
52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetStopID() const
52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_stop_id;
52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneraddr_t
53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetImageInfoAddress()
53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return LLDB_INVALID_ADDRESS;
53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5370baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton//----------------------------------------------------------------------
5380baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// LoadImage
5390baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton//
5400baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// This function provides a default implementation that works for most
5410baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// unix variants. Any Process subclasses that need to do shared library
5420baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// loading differently should override LoadImage and UnloadImage and
5430baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// do what is needed.
5440baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton//----------------------------------------------------------------------
5450baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Claytonuint32_t
5460baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonProcess::LoadImage (const FileSpec &image_spec, Error &error)
5470baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton{
5480baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    DynamicLoader *loader = GetDynamicLoader();
5490baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    if (loader)
5500baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    {
5510baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton        error = loader->CanLoadImage();
5520baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton        if (error.Fail())
5530baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton            return LLDB_INVALID_IMAGE_TOKEN;
5540baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    }
5550baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton
5560baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    if (error.Success())
5570baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    {
5580baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton        ThreadSP thread_sp(GetThreadList ().GetSelectedThread());
5590baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton        if (thread_sp == NULL)
5600baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton            thread_sp = GetThreadList ().GetThreadAtIndex(0, true);
5610baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton
5620baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton        if (thread_sp)
5630baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton        {
5640baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton            StackFrameSP frame_sp (thread_sp->GetStackFrameAtIndex (0));
5650baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton
5660baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton            if (frame_sp)
5670baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton            {
5680baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                ExecutionContext exe_ctx;
5690baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                frame_sp->CalculateExecutionContext (exe_ctx);
570ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham                bool unwind_on_error = true;
5710baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                StreamString expr;
5720baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                char path[PATH_MAX];
5730baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                image_spec.GetPath(path, sizeof(path));
5740baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                expr.Printf("dlopen (\"%s\", 2)", path);
5750baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                const char *prefix = "extern \"C\" void* dlopen (const char *path, int mode);\n";
576360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                lldb::ValueObjectSP result_valobj_sp;
577360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                ClangUserExpression::Evaluate (exe_ctx, unwind_on_error, expr.GetData(), prefix, result_valobj_sp);
5780baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                if (result_valobj_sp->GetError().Success())
5790baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                {
5800baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                    Scalar scalar;
5810baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                    if (result_valobj_sp->ResolveValue (frame_sp.get(), scalar))
5820baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                    {
5830baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                        addr_t image_ptr = scalar.ULongLong(LLDB_INVALID_ADDRESS);
5840baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                        if (image_ptr != 0 && image_ptr != LLDB_INVALID_ADDRESS)
5850baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                        {
5860baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                            uint32_t image_token = m_image_tokens.size();
5870baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                            m_image_tokens.push_back (image_ptr);
5880baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                            return image_token;
5890baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                        }
5900baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                    }
5910baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                }
5920baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton            }
5930baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton        }
5940baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    }
5950baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    return LLDB_INVALID_IMAGE_TOKEN;
5960baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton}
5970baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton
5980baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton//----------------------------------------------------------------------
5990baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// UnloadImage
6000baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton//
6010baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// This function provides a default implementation that works for most
6020baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// unix variants. Any Process subclasses that need to do shared library
6030baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// loading differently should override LoadImage and UnloadImage and
6040baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// do what is needed.
6050baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton//----------------------------------------------------------------------
6060baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonError
6070baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonProcess::UnloadImage (uint32_t image_token)
6080baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton{
6090baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    Error error;
6100baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    if (image_token < m_image_tokens.size())
6110baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    {
6120baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton        const addr_t image_addr = m_image_tokens[image_token];
6130baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton        if (image_addr == LLDB_INVALID_ADDRESS)
6140baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton        {
6150baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton            error.SetErrorString("image already unloaded");
6160baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton        }
6170baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton        else
6180baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton        {
6190baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton            DynamicLoader *loader = GetDynamicLoader();
6200baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton            if (loader)
6210baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                error = loader->CanLoadImage();
6220baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton
6230baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton            if (error.Success())
6240baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton            {
6250baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                ThreadSP thread_sp(GetThreadList ().GetSelectedThread());
6260baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                if (thread_sp == NULL)
6270baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                    thread_sp = GetThreadList ().GetThreadAtIndex(0, true);
6280baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton
6290baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                if (thread_sp)
6300baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                {
6310baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                    StackFrameSP frame_sp (thread_sp->GetStackFrameAtIndex (0));
6320baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton
6330baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                    if (frame_sp)
6340baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                    {
6350baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                        ExecutionContext exe_ctx;
6360baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                        frame_sp->CalculateExecutionContext (exe_ctx);
637ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham                        bool unwind_on_error = true;
6380baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                        StreamString expr;
6390baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                        expr.Printf("dlclose ((void *)0x%llx)", image_addr);
6400baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                        const char *prefix = "extern \"C\" int dlclose(void* handle);\n";
641360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        lldb::ValueObjectSP result_valobj_sp;
642360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        ClangUserExpression::Evaluate (exe_ctx, unwind_on_error, expr.GetData(), prefix, result_valobj_sp);
6430baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                        if (result_valobj_sp->GetError().Success())
6440baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                        {
6450baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                            Scalar scalar;
6460baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                            if (result_valobj_sp->ResolveValue (frame_sp.get(), scalar))
6470baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                            {
6480baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                                if (scalar.UInt(1))
6490baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                                {
6500baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                                    error.SetErrorStringWithFormat("expression failed: \"%s\"", expr.GetData());
6510baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                                }
6520baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                                else
6530baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                                {
6540baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                                    m_image_tokens[image_token] = LLDB_INVALID_ADDRESS;
6550baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                                }
6560baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                            }
6570baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                        }
6580baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                        else
6590baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                        {
6600baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                            error = result_valobj_sp->GetError();
6610baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                        }
6620baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                    }
6630baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton                }
6640baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton            }
6650baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton        }
6660baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    }
6670baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    else
6680baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    {
6690baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton        error.SetErrorString("invalid image token");
6700baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    }
6710baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    return error;
6720baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton}
6730baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton
67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDynamicLoader *
67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetDynamicLoader()
67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ABI *
68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetABI()
68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ConstString& triple = m_target_triple;
68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (triple.IsEmpty())
68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_abi_sp.get() == NULL)
68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_abi_sp.reset(ABI::FindPlugin(triple));
69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_abi_sp.get();
69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
696642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamLanguageRuntime *
697642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamProcess::GetLanguageRuntime(lldb::LanguageType language)
698642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{
699642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    LanguageRuntimeCollection::iterator pos;
700642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    pos = m_language_runtimes.find (language);
701642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    if (pos == m_language_runtimes.end())
702642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    {
703642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham        lldb::LanguageRuntimeSP runtime(LanguageRuntime::FindPlugin(this, language));
704642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
705642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham        m_language_runtimes[language]
706642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham            = runtime;
707642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham        return runtime.get();
708642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    }
709642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    else
710642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham        return (*pos).second.get();
711642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham}
712642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
713642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamCPPLanguageRuntime *
714642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamProcess::GetCPPLanguageRuntime ()
715642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{
716642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    LanguageRuntime *runtime = GetLanguageRuntime(eLanguageTypeC_plus_plus);
717642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    if (runtime != NULL && runtime->GetLanguageType() == eLanguageTypeC_plus_plus)
718642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham        return static_cast<CPPLanguageRuntime *> (runtime);
719642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    return NULL;
720642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham}
721642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
722642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamObjCLanguageRuntime *
723642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamProcess::GetObjCLanguageRuntime ()
724642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{
725642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    LanguageRuntime *runtime = GetLanguageRuntime(eLanguageTypeObjC);
726642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    if (runtime != NULL && runtime->GetLanguageType() == eLanguageTypeObjC)
727642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham        return static_cast<ObjCLanguageRuntime *> (runtime);
728642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    return NULL;
729642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham}
730642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointSiteList &
73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetBreakpointSiteList()
73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_breakpoint_site_list;
73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst BreakpointSiteList &
73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetBreakpointSiteList() const
73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_breakpoint_site_list;
74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::DisableAllBreakpointSites ()
74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_breakpoint_site_list.SetEnabledForAll (false);
74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError
75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ClearBreakpointSiteByID (lldb::user_id_t break_id)
75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error error (DisableBreakpointSiteByID (break_id));
75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (error.Success())
75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_breakpoint_site_list.Remove(break_id);
75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return error;
75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError
76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::DisableBreakpointSiteByID (lldb::user_id_t break_id)
76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
76424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error error;
76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BreakpointSiteSP bp_site_sp = m_breakpoint_site_list.FindByID (break_id);
76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (bp_site_sp)
76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (bp_site_sp->IsEnabled())
76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            error = DisableBreakpoint (bp_site_sp.get());
77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
77124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
77324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        error.SetErrorStringWithFormat("invalid breakpoint site ID: %i", break_id);
77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return error;
77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError
78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::EnableBreakpointSiteByID (lldb::user_id_t break_id)
78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error error;
78324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BreakpointSiteSP bp_site_sp = m_breakpoint_site_list.FindByID (break_id);
78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (bp_site_sp)
78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!bp_site_sp->IsEnabled())
78724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            error = EnableBreakpoint (bp_site_sp.get());
78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        error.SetErrorStringWithFormat("invalid breakpoint site ID: %i", break_id);
79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return error;
79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7963fd1f36c937575dbf57bae04c7ebaef78d8ecc1dStephen Wilsonlldb::break_id_t
79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::CreateBreakpointSite (BreakpointLocationSP &owner, bool use_hardware)
79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
799eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton    const addr_t load_addr = owner->GetAddress().GetLoadAddress (&m_target);
80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (load_addr != LLDB_INVALID_ADDRESS)
80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        BreakpointSiteSP bp_site_sp;
80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Look up this breakpoint site.  If it exists, then add this new owner, otherwise
80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // create a new breakpoint site and add it.
80624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
80724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bp_site_sp = m_breakpoint_site_list.FindByAddress (load_addr);
80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (bp_site_sp)
81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
81124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            bp_site_sp->AddOwner (owner);
81224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            owner->SetBreakpointSite (bp_site_sp);
81324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return bp_site_sp->GetID();
81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
81624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
81724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            bp_site_sp.reset (new BreakpointSite (&m_breakpoint_site_list, owner, load_addr, LLDB_INVALID_THREAD_ID, use_hardware));
81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (bp_site_sp)
81924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
82024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (EnableBreakpoint (bp_site_sp.get()).Success())
82124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
82224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    owner->SetBreakpointSite (bp_site_sp);
82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return m_breakpoint_site_list.Add (bp_site_sp);
82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
82624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // We failed to enable the breakpoint
82924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return LLDB_INVALID_BREAK_ID;
83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
83124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
83224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
83324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
83424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::RemoveOwnerFromBreakpointSite (lldb::user_id_t owner_id, lldb::user_id_t owner_loc_id, BreakpointSiteSP &bp_site_sp)
83524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
83624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_owners = bp_site_sp->RemoveOwner (owner_id, owner_loc_id);
83724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (num_owners == 0)
83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
83924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        DisableBreakpoint(bp_site_sp.get());
84024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_breakpoint_site_list.RemoveByAddress(bp_site_sp->GetLoadAddress());
84124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
84224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
84424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
84524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::RemoveBreakpointOpcodesFromBuffer (addr_t bp_addr, size_t size, uint8_t *buf) const
84724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t bytes_removed = 0;
84924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    addr_t intersect_addr;
85024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t intersect_size;
85124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t opcode_offset;
85224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t idx;
85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BreakpointSiteSP bp;
85424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
85524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (idx = 0; (bp = m_breakpoint_site_list.GetByIndex(idx)) != NULL; ++idx)
85624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (bp->GetType() == BreakpointSite::eSoftware)
85824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
85924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (bp->IntersectsRange(bp_addr, size, &intersect_addr, &intersect_size, &opcode_offset))
86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                assert(bp_addr <= intersect_addr && intersect_addr < bp_addr + size);
86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                assert(bp_addr < intersect_addr + intersect_size && intersect_addr + intersect_size <= bp_addr + size);
86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                assert(opcode_offset + intersect_size <= bp->GetByteSize());
86424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                size_t buf_offset = intersect_addr - bp_addr;
86524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ::memcpy(buf + buf_offset, bp->GetSavedOpcodeBytes() + opcode_offset, intersect_size);
86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return bytes_removed;
87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError
87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::EnableSoftwareBreakpoint (BreakpointSite *bp_site)
87524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
87624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error error;
87724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (bp_site != NULL);
878e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const addr_t bp_addr = bp_site->GetLoadAddress();
88024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%llx", bp_site->GetID(), (uint64_t)bp_addr);
88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (bp_site->IsEnabled())
88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (log)
88524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- already enabled", bp_site->GetID(), (uint64_t)bp_addr);
88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return error;
88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (bp_addr == LLDB_INVALID_ADDRESS)
89024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
89124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        error.SetErrorString("BreakpointSite contains an invalid load address.");
89224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return error;
89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Ask the lldb::Process subclass to fill in the correct software breakpoint
89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // trap for the breakpoint site
89624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const size_t bp_opcode_size = GetSoftwareBreakpointTrapOpcode(bp_site);
89724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
89824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (bp_opcode_size == 0)
89924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
90024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        error.SetErrorStringWithFormat ("Process::GetSoftwareBreakpointTrapOpcode() returned zero, unable to get breakpoint trap for address 0x%llx.\n", bp_addr);
90124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
90224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
90324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
90424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const uint8_t * const bp_opcode_bytes = bp_site->GetTrapOpcodeBytes();
90524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
90624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (bp_opcode_bytes == NULL)
90724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
90824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            error.SetErrorString ("BreakpointSite doesn't contain a valid breakpoint trap opcode.");
90924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return error;
91024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
91124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
91224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Save the original opcode by reading it
91324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (DoReadMemory(bp_addr, bp_site->GetSavedOpcodeBytes(), bp_opcode_size, error) == bp_opcode_size)
91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Write a software breakpoint in place of the original opcode
91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (DoWriteMemory(bp_addr, bp_opcode_bytes, bp_opcode_size, error) == bp_opcode_size)
91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint8_t verify_bp_opcode_bytes[64];
91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (DoReadMemory(bp_addr, verify_bp_opcode_bytes, bp_opcode_size, error) == bp_opcode_size)
92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
92124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (::memcmp(bp_opcode_bytes, verify_bp_opcode_bytes, bp_opcode_size) == 0)
92224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        bp_site->SetEnabled(true);
92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        bp_site->SetType (BreakpointSite::eSoftware);
92524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (log)
92624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- SUCCESS",
92724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         bp_site->GetID(),
92824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         (uint64_t)bp_addr);
92924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
93024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    else
93124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        error.SetErrorString("Failed to verify the breakpoint trap in memory.");
93224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
93324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
93424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    error.SetErrorString("Unable to read memory to verify breakpoint trap.");
93524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
93624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
93724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                error.SetErrorString("Unable to write breakpoint trap to memory.");
93824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
93924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
94024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            error.SetErrorString("Unable to read memory at breakpoint address.");
94124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
94224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
94324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- FAILED: %s",
94424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     bp_site->GetID(),
94524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     (uint64_t)bp_addr,
94624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     error.AsCString());
94724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return error;
94824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
94924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
95024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError
95124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::DisableSoftwareBreakpoint (BreakpointSite *bp_site)
95224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
95324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error error;
95424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (bp_site != NULL);
955e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
95624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    addr_t bp_addr = bp_site->GetLoadAddress();
95724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::user_id_t breakID = bp_site->GetID();
95824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
95924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("ProcessMacOSX::DisableBreakpoint (breakID = %d) addr = 0x%llx", breakID, (uint64_t)bp_addr);
96024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
96124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (bp_site->IsHardware())
96224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
96324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        error.SetErrorString("Breakpoint site is a hardware breakpoint.");
96424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
96524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else if (bp_site->IsEnabled())
96624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
96724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const size_t break_op_size = bp_site->GetByteSize();
96824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const uint8_t * const break_op = bp_site->GetTrapOpcodeBytes();
96924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (break_op_size > 0)
97024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
97124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Clear a software breakoint instruction
97254e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton            uint8_t curr_break_op[8];
973141eeac2adf8987d31b1f0e955c259e93e539b18Stephen Wilson            assert (break_op_size <= sizeof(curr_break_op));
97424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            bool break_op_found = false;
97524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
97624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Read the breakpoint opcode
97724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (DoReadMemory (bp_addr, curr_break_op, break_op_size, error) == break_op_size)
97824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
97924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                bool verify = false;
98024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Make sure we have the a breakpoint opcode exists at this address
98124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (::memcmp (curr_break_op, break_op, break_op_size) == 0)
98224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
98324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    break_op_found = true;
98424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // We found a valid breakpoint opcode at this address, now restore
98524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // the saved opcode.
98624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (DoWriteMemory (bp_addr, bp_site->GetSavedOpcodeBytes(), break_op_size, error) == break_op_size)
98724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
98824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        verify = true;
98924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
99024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    else
99124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        error.SetErrorString("Memory write failed when restoring original opcode.");
99224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
99324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
99424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
99524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    error.SetErrorString("Original breakpoint trap is no longer in memory.");
99624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // Set verify to true and so we can check if the original opcode has already been restored
99724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    verify = true;
99824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
99924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
100024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (verify)
100124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
100254e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton                    uint8_t verify_opcode[8];
1003141eeac2adf8987d31b1f0e955c259e93e539b18Stephen Wilson                    assert (break_op_size < sizeof(verify_opcode));
100424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // Verify that our original opcode made it back to the inferior
100524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (DoReadMemory (bp_addr, verify_opcode, break_op_size, error) == break_op_size)
100624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
100724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // compare the memory we just read with the original opcode
100824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (::memcmp (bp_site->GetSavedOpcodeBytes(), verify_opcode, break_op_size) == 0)
100924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
101024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            // SUCCESS
101124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            bp_site->SetEnabled(false);
101224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (log)
101324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- SUCCESS", bp_site->GetID(), (uint64_t)bp_addr);
101424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            return error;
101524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
101624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        else
101724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
101824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (break_op_found)
101924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                error.SetErrorString("Failed to restore original opcode.");
102024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
102124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
102224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    else
102324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        error.SetErrorString("Failed to read memory to verify that breakpoint trap was restored.");
102424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
102524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
102624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
102724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                error.SetErrorString("Unable to read memory that should contain the breakpoint trap.");
102824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
102924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
103024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
103124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
103224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (log)
103324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- already disabled", bp_site->GetID(), (uint64_t)bp_addr);
103424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return error;
103524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
103624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
103724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
103824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- FAILED: %s",
103924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     bp_site->GetID(),
104024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     (uint64_t)bp_addr,
104124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     error.AsCString());
104224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return error;
104324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
104424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
104524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
104624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
104724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
104824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ReadMemory (addr_t addr, void *buf, size_t size, Error &error)
104924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
105024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (buf == NULL || size == 0)
105124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return 0;
105224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
105324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t bytes_read = 0;
105424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint8_t *bytes = (uint8_t *)buf;
105524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
105624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    while (bytes_read < size)
105724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
105824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const size_t curr_size = size - bytes_read;
105924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const size_t curr_bytes_read = DoReadMemory (addr + bytes_read,
106024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     bytes + bytes_read,
106124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     curr_size,
106224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     error);
106324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bytes_read += curr_bytes_read;
106424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (curr_bytes_read == curr_size || curr_bytes_read == 0)
106524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
106624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
106724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
106824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Replace any software breakpoint opcodes that fall into this range back
106924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // into "buf" before we return
107024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (bytes_read > 0)
107124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        RemoveBreakpointOpcodesFromBuffer (addr, bytes_read, (uint8_t *)buf);
107224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return bytes_read;
107324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
107424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
107524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
107624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WriteMemoryPrivate (addr_t addr, const void *buf, size_t size, Error &error)
107724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
107824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t bytes_written = 0;
107924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint8_t *bytes = (const uint8_t *)buf;
108024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
108124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    while (bytes_written < size)
108224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
108324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const size_t curr_size = size - bytes_written;
108424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const size_t curr_bytes_written = DoWriteMemory (addr + bytes_written,
108524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                         bytes + bytes_written,
108624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                         curr_size,
108724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                         error);
108824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bytes_written += curr_bytes_written;
108924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (curr_bytes_written == curr_size || curr_bytes_written == 0)
109024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
109124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
109224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return bytes_written;
109324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
109424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
109524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
109624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WriteMemory (addr_t addr, const void *buf, size_t size, Error &error)
109724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
109824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (buf == NULL || size == 0)
109924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return 0;
110024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // We need to write any data that would go where any current software traps
110124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // (enabled software breakpoints) any software traps (breakpoints) that we
110224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // may have placed in our tasks memory.
110324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
110424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BreakpointSiteList::collection::const_iterator iter = m_breakpoint_site_list.GetMap()->lower_bound (addr);
110524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BreakpointSiteList::collection::const_iterator end =  m_breakpoint_site_list.GetMap()->end();
110624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
110724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (iter == end || iter->second->GetLoadAddress() > addr + size)
110824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return DoWriteMemory(addr, buf, size, error);
110924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
111024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BreakpointSiteList::collection::const_iterator pos;
111124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t bytes_written = 0;
111254e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton    addr_t intersect_addr = 0;
111354e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton    size_t intersect_size = 0;
111454e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton    size_t opcode_offset = 0;
111524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint8_t *ubuf = (const uint8_t *)buf;
111624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
111724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (pos = iter; pos != end; ++pos)
111824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
111924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        BreakpointSiteSP bp;
112024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bp = pos->second;
112124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
112224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert(bp->IntersectsRange(addr, size, &intersect_addr, &intersect_size, &opcode_offset));
112324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert(addr <= intersect_addr && intersect_addr < addr + size);
112424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert(addr < intersect_addr + intersect_size && intersect_addr + intersect_size <= addr + size);
112524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert(opcode_offset + intersect_size <= bp->GetByteSize());
112624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
112724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Check for bytes before this breakpoint
112824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const addr_t curr_addr = addr + bytes_written;
112924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (intersect_addr > curr_addr)
113024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
113124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // There are some bytes before this breakpoint that we need to
113224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // just write to memory
113324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            size_t curr_size = intersect_addr - curr_addr;
113424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            size_t curr_bytes_written = WriteMemoryPrivate (curr_addr,
113524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                            ubuf + bytes_written,
113624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                            curr_size,
113724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                            error);
113824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            bytes_written += curr_bytes_written;
113924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (curr_bytes_written != curr_size)
114024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
114124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // We weren't able to write all of the requested bytes, we
114224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // are done looping and will return the number of bytes that
114324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // we have written so far.
114424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
114524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
114624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
114724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
114824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Now write any bytes that would cover up any software breakpoints
114924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // directly into the breakpoint opcode buffer
115024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ::memcpy(bp->GetSavedOpcodeBytes() + opcode_offset, ubuf + bytes_written, intersect_size);
115124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bytes_written += intersect_size;
115224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
115324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
115424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Write any remaining bytes after the last breakpoint if we have any left
115524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (bytes_written < size)
115624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bytes_written += WriteMemoryPrivate (addr + bytes_written,
115724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             ubuf + bytes_written,
115824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             size - bytes_written,
115924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             error);
116024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
116124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return bytes_written;
116224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
116324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
116424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneraddr_t
116524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::AllocateMemory(size_t size, uint32_t permissions, Error &error)
116624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
116724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Fixme: we should track the blocks we've allocated, and clean them up...
116824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // We could even do our own allocator here if that ends up being more efficient.
116924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return DoAllocateMemory (size, permissions, error);
117024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
117124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
117224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError
117324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::DeallocateMemory (addr_t ptr)
117424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
117524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return DoDeallocateMemory (ptr);
117624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
117724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
117824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
117924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError
118024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::EnableWatchpoint (WatchpointLocation *watchpoint)
118124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
118224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error error;
118324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    error.SetErrorString("watchpoints are not supported");
118424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return error;
118524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
118624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
118724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError
118824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::DisableWatchpoint (WatchpointLocation *watchpoint)
118924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
119024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error error;
119124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    error.SetErrorString("watchpoints are not supported");
119224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return error;
119324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
119424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
119524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType
119624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForProcessStopPrivate (const TimeValue *timeout, EventSP &event_sp)
119724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
119824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StateType state;
119924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Now wait for the process to launch and return control to us, and then
120024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // call DidLaunch:
120124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    while (1)
120224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
120324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // FIXME: Might want to put a timeout in here:
120424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        state = WaitForStateChangedEventsPrivate (NULL, event_sp);
120524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (state == eStateStopped || state == eStateCrashed || state == eStateExited)
120624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
120724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
120824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            HandlePrivateEvent (event_sp);
120924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
121024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return state;
121124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
121224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
121324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError
121424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Launch
121524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
121624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    char const *argv[],
121724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    char const *envp[],
1218452bf613496c7290c6b7a1a1eb28efbce63fd3b9Greg Clayton    uint32_t launch_flags,
121924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *stdin_path,
122024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *stdout_path,
122124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *stderr_path
122224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
122324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
122424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error error;
122524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_triple.Clear();
122624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_abi_sp.reset();
1227861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    m_process_input_reader.reset();
122824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
122924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Module *exe_module = m_target.GetExecutableModule().get();
123024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (exe_module)
123124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
123224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        char exec_file_path[PATH_MAX];
123324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        exe_module->GetFileSpec().GetPath(exec_file_path, sizeof(exec_file_path));
123424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (exe_module->GetFileSpec().Exists())
123524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
123624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            error = WillLaunch (exe_module);
123724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (error.Success())
123824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
1239d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton                SetPublicState (eStateLaunching);
124024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // The args coming in should not contain the application name, the
124124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // lldb_private::Process class will add this in case the executable
124224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // gets resolved to a different file than was given on the command
124324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // line (like when an applicaiton bundle is specified and will
124424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // resolve to the contained exectuable file, or the file given was
124524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // a symlink or other file system link that resolves to a different
124624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // file).
124724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
124824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Get the resolved exectuable path
124924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
125024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Make a new argument vector
125124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                std::vector<const char *> exec_path_plus_argv;
125224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Append the resolved executable path
125324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                exec_path_plus_argv.push_back (exec_file_path);
125424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
125524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Push all args if there are any
125624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (argv)
125724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
125824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    for (int i = 0; argv[i]; ++i)
125924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        exec_path_plus_argv.push_back(argv[i]);
126024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
126124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
126224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Push a NULL to terminate the args.
126324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                exec_path_plus_argv.push_back(NULL);
126424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
126524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Now launch using these arguments.
126653d68e749f0715691a95f23e9490d97e484b15daGreg Clayton                error = DoLaunch (exe_module,
126753d68e749f0715691a95f23e9490d97e484b15daGreg Clayton                                  exec_path_plus_argv.empty() ? NULL : &exec_path_plus_argv.front(),
126853d68e749f0715691a95f23e9490d97e484b15daGreg Clayton                                  envp,
1269452bf613496c7290c6b7a1a1eb28efbce63fd3b9Greg Clayton                                  launch_flags,
127053d68e749f0715691a95f23e9490d97e484b15daGreg Clayton                                  stdin_path,
127153d68e749f0715691a95f23e9490d97e484b15daGreg Clayton                                  stdout_path,
127253d68e749f0715691a95f23e9490d97e484b15daGreg Clayton                                  stderr_path);
127324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
127424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (error.Fail())
127524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
127624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (GetID() != LLDB_INVALID_PROCESS_ID)
127724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
127824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        SetID (LLDB_INVALID_PROCESS_ID);
127924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        const char *error_string = error.AsCString();
128024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (error_string == NULL)
128124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            error_string = "launch failed";
128224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        SetExitStatus (-1, error_string);
128324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
128424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
128524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
128624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
128724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    EventSP event_sp;
128824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    StateType state = WaitForProcessStopPrivate(NULL, event_sp);
128924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
129024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (state == eStateStopped || state == eStateCrashed)
129124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
129224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        DidLaunch ();
129324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
129424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // This delays passing the stopped event to listeners till DidLaunch gets
129524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // a chance to complete...
129624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        HandlePrivateEvent (event_sp);
129724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        StartPrivateStateThread ();
129824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
129924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    else if (state == eStateExited)
130024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
130124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // We exited while trying to launch somehow.  Don't call DidLaunch as that's
130224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // not likely to work, and return an invalid pid.
130324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        HandlePrivateEvent (event_sp);
130424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
130524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
130624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
130724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
130824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
130924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
131024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            error.SetErrorStringWithFormat("File doesn't exist: '%s'.\n", exec_file_path);
131124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
131224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
131324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return error;
131424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
131524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
131624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError
131724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::CompleteAttach ()
131824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
131924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error error;
1320c1d3775eb2494c6e88ebee44c7d49beefcb3bb6aGreg Clayton
1321c1d3775eb2494c6e88ebee44c7d49beefcb3bb6aGreg Clayton    if (GetID() == LLDB_INVALID_PROCESS_ID)
1322c1d3775eb2494c6e88ebee44c7d49beefcb3bb6aGreg Clayton    {
1323c1d3775eb2494c6e88ebee44c7d49beefcb3bb6aGreg Clayton        error.SetErrorString("no process");
1324c1d3775eb2494c6e88ebee44c7d49beefcb3bb6aGreg Clayton    }
1325c1d3775eb2494c6e88ebee44c7d49beefcb3bb6aGreg Clayton
132624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    EventSP event_sp;
132724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StateType state = WaitForProcessStopPrivate(NULL, event_sp);
132824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (state == eStateStopped || state == eStateCrashed)
132924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
133024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        DidAttach ();
13317508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        // Figure out which one is the executable, and set that in our target:
13327508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        ModuleList &modules = GetTarget().GetImages();
13337508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
13347508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        size_t num_modules = modules.GetSize();
13357508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        for (int i = 0; i < num_modules; i++)
13367508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        {
13377508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham            ModuleSP module_sp = modules.GetModuleAtIndex(i);
13387508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham            if (module_sp->IsExecutable())
13397508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham            {
13407508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham                ModuleSP exec_module = GetTarget().GetExecutableModule();
13417508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham                if (!exec_module || exec_module != module_sp)
13427508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham                {
13437508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
13447508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham                    GetTarget().SetExecutableModule (module_sp, false);
13457508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham                }
13467508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham                break;
13477508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham            }
13487508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        }
134924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
135024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // This delays passing the stopped event to listeners till DidLaunch gets
135124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // a chance to complete...
135224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        HandlePrivateEvent(event_sp);
135324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        StartPrivateStateThread();
135424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
135524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
135624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
135724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // We exited while trying to launch somehow.  Don't call DidLaunch as that's
135824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // not likely to work, and return an invalid pid.
135924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (state == eStateExited)
136024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            HandlePrivateEvent (event_sp);
136124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        error.SetErrorStringWithFormat("invalid state after attach: %s",
136224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        lldb_private::StateAsCString(state));
136324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
136424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return error;
136524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
136624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
136724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError
136824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Attach (lldb::pid_t attach_pid)
136924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
137024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
137124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_triple.Clear();
137224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_abi_sp.reset();
1373861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    m_process_input_reader.reset();
137424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13757508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    // Find the process and its architecture.  Make sure it matches the architecture
13767508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    // of the current Target, and if not adjust it.
13777508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
13787508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    ArchSpec attach_spec = GetArchSpecForExistingProcess (attach_pid);
13797508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    if (attach_spec != GetTarget().GetArchitecture())
13807508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    {
13817508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        // Set the architecture on the target.
13827508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        GetTarget().SetArchitecture(attach_spec);
13837508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    }
13847508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
138554e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton    Error error (WillAttachToProcessWithID(attach_pid));
138624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (error.Success())
138724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1388d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton        SetPublicState (eStateAttaching);
1389d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton
139054e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton        error = DoAttachToProcessWithID (attach_pid);
139124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (error.Success())
139224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
139324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            error = CompleteAttach();
139424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
139524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
139624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
139724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (GetID() != LLDB_INVALID_PROCESS_ID)
139824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
139924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                SetID (LLDB_INVALID_PROCESS_ID);
140024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const char *error_string = error.AsCString();
140124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (error_string == NULL)
140224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    error_string = "attach failed";
140324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
140424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                SetExitStatus(-1, error_string);
140524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
140624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
140724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
140824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return error;
140924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
141024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
141124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError
141224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Attach (const char *process_name, bool wait_for_launch)
141324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
141424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_triple.Clear();
141524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_abi_sp.reset();
1416861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    m_process_input_reader.reset();
14177508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
14187508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    // Find the process and its architecture.  Make sure it matches the architecture
14197508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    // of the current Target, and if not adjust it.
14207508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
1421ea2941843e51df4018bbe9f0f42050964d78d2c0Jim Ingham    if (!wait_for_launch)
14227508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    {
1423ea2941843e51df4018bbe9f0f42050964d78d2c0Jim Ingham        ArchSpec attach_spec = GetArchSpecForExistingProcess (process_name);
1424c1d3775eb2494c6e88ebee44c7d49beefcb3bb6aGreg Clayton        if (attach_spec.IsValid() && attach_spec != GetTarget().GetArchitecture())
1425ea2941843e51df4018bbe9f0f42050964d78d2c0Jim Ingham        {
1426ea2941843e51df4018bbe9f0f42050964d78d2c0Jim Ingham            // Set the architecture on the target.
1427ea2941843e51df4018bbe9f0f42050964d78d2c0Jim Ingham            GetTarget().SetArchitecture(attach_spec);
1428ea2941843e51df4018bbe9f0f42050964d78d2c0Jim Ingham        }
14297508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    }
1430ea2941843e51df4018bbe9f0f42050964d78d2c0Jim Ingham
143154e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton    Error error (WillAttachToProcessWithName(process_name, wait_for_launch));
143224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (error.Success())
143324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1434d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton        SetPublicState (eStateAttaching);
143554e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton        error = DoAttachToProcessWithName (process_name, wait_for_launch);
143624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (error.Fail())
143724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
143824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (GetID() != LLDB_INVALID_PROCESS_ID)
143924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
144024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                SetID (LLDB_INVALID_PROCESS_ID);
144124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const char *error_string = error.AsCString();
144224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (error_string == NULL)
144324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    error_string = "attach failed";
144424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
144524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                SetExitStatus(-1, error_string);
144624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
144724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
144824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
144924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
145024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            error = CompleteAttach();
145124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
145224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
145324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return error;
145424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
145524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
145624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError
145724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Resume ()
145824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1459e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
146024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
146124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf("Process::Resume() m_stop_id = %u", m_stop_id);
146224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
146324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error error (WillResume());
146424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Tell the process it is about to resume before the thread list
146524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (error.Success())
146624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
14679c11d478f7c2a1611b591cd599782b7a0a8c5c37Johnny Chen        // Now let the thread list know we are about to resume so it
146824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // can let all of our threads know that they are about to be
146924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // resumed. Threads will each be called with
147024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Thread::WillResume(StateType) where StateType contains the state
147124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // that they are supposed to have when the process is resumed
147224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // (suspended/running/stepping). Threads should also check
147324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // their resume signal in lldb::Thread::GetResumeSignal()
147424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // to see if they are suppoed to start back up with a signal.
147524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_thread_list.WillResume())
147624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
147724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            error = DoResume();
147824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (error.Success())
147924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
148024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                DidResume();
148124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_thread_list.DidResume();
148224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
148324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
148424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
148524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
148624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            error.SetErrorStringWithFormat("thread list returned flase after WillResume");
148724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
148824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
148924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return error;
149024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
149124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
149224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError
149324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Halt ()
149424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
149524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error error (WillHalt());
149624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
149724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (error.Success())
149824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
149920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton
150020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton        bool caused_stop = false;
150120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton        EventSP event_sp;
150220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton
150320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton        // Pause our private state thread so we can ensure no one else eats
150420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton        // the stop event out from under us.
150520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton        PausePrivateStateThread();
150620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton
150720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton        // Ask the process subclass to actually halt our process
15083ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham        error = DoHalt(caused_stop);
150924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (error.Success())
15103ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham        {
151120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton            // If "caused_stop" is true, then DoHalt stopped the process. If
151220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton            // "caused_stop" is false, the process was already stopped.
151320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton            // If the DoHalt caused the process to stop, then we want to catch
151420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton            // this event and set the interrupted bool to true before we pass
151520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton            // this along so clients know that the process was interrupted by
151620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton            // a halt command.
15173ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham            if (caused_stop)
15183ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham            {
151920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                // Wait for 2 seconds for the process to stop.
152020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                TimeValue timeout_time;
152120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                timeout_time = TimeValue::Now();
152220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                timeout_time.OffsetWithSeconds(2);
152320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                StateType state = WaitForStateChangedEventsPrivate (&timeout_time, event_sp);
152420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton
152520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                if (state == eStateInvalid)
152620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                {
152720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                    // We timeout out and didn't get a stop event...
152820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                    error.SetErrorString ("Halt timed out.");
152920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                }
153020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                else
153120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                {
153220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                    if (StateIsStoppedState (state))
153320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                    {
153420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                        // We caused the process to interrupt itself, so mark this
153520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                        // as such in the stop event so clients can tell an interrupted
153620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                        // process from a natural stop
153720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                        ProcessEventData::SetInterruptedInEvent (event_sp.get(), true);
153820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                    }
153920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                    else
154020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                    {
154120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                        LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
154220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                        if (log)
154320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                            log->Printf("Process::Halt() failed to stop, state is: %s", StateAsCString(state));
154420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                        error.SetErrorString ("Did not get stopped event after halt.");
154520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                    }
154620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                }
15473ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham            }
154820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton            DidHalt();
154920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton
15503ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham        }
155120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton        // Resume our private state thread before we post the event (if any)
155220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton        ResumePrivateStateThread();
155320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton
155420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton        // Post any event we might have consumed. If all goes well, we will have
155520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton        // stopped the process, intercepted the event and set the interrupted
1556360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        // bool in the event.  Post it to the private event queue and that will end up
1557360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        // correctly setting the state.
155820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton        if (event_sp)
1559c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice            m_private_state_broadcaster.BroadcastEvent(event_sp);
156020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton
156124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
156224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return error;
156324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
156424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
156524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError
156624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Detach ()
156724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
156824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error error (WillDetach());
156924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
157024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (error.Success())
157124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
157224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        DisableAllBreakpointSites();
157324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        error = DoDetach();
157424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (error.Success())
157524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
157624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            DidDetach();
157724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            StopPrivateStateThread();
157824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
157924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
158024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return error;
158124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
158224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
158324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError
158424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Destroy ()
158524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
158624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error error (WillDestroy());
158724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (error.Success())
158824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
158924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        DisableAllBreakpointSites();
159024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        error = DoDestroy();
159124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (error.Success())
159224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
159324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            DidDestroy();
159424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            StopPrivateStateThread();
159524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
1596861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice        m_stdio_communication.StopReadThread();
1597861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice        m_stdio_communication.Disconnect();
1598861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice        if (m_process_input_reader && m_process_input_reader->IsActive())
1599861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice            m_target.GetDebugger().PopInputReader (m_process_input_reader);
1600861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice        if (m_process_input_reader)
1601861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice            m_process_input_reader.reset();
160224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
160324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return error;
160424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
160524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
160624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError
160724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Signal (int signal)
160824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
160924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error error (WillSignal());
161024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (error.Success())
161124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
161224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        error = DoSignal(signal);
161324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (error.Success())
161424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            DidSignal();
161524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
161624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return error;
161724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
161824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
161924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerUnixSignals &
162024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetUnixSignals ()
162124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
162224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_unix_signals;
162324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
162424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
162524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTarget &
162624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetTarget ()
162724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
162824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target;
162924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
163024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
163124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Target &
163224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetTarget () const
163324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
163424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target;
163524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
163624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
163724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
163824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetAddressByteSize()
163924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
164020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    if (m_addr_byte_size == 0)
164120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton        return m_target.GetArchitecture().GetAddressByteSize();
164220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    return m_addr_byte_size;
164324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
164424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
164524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
164624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ShouldBroadcastEvent (Event *event_ptr)
164724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
164824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const StateType state = Process::ProcessEventData::GetStateFromEvent (event_ptr);
164924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool return_value = true;
1650e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EVENTS));
165124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
165224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (state)
165324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
165424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateAttaching:
165524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateLaunching:
165624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateDetached:
165724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateExited:
165824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateUnloaded:
165924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // These events indicate changes in the state of the debugging session, always report them.
166024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return_value = true;
166124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
166224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateInvalid:
166324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // We stopped for no apparent reason, don't report it.
166424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return_value = false;
166524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
166624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateRunning:
166724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateStepping:
166824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // If we've started the target running, we handle the cases where we
166924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // are already running and where there is a transition from stopped to
167024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // running differently.
167124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // running -> running: Automatically suppress extra running events
167224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // stopped -> running: Report except when there is one or more no votes
167324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            //     and no yes votes.
167424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SynchronouslyNotifyStateChanged (state);
167524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            switch (m_public_state.GetValue())
167624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
167724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case eStateRunning:
167824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                case eStateStepping:
167924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // We always suppress multiple runnings with no PUBLIC stop in between.
168024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return_value = false;
168124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    break;
168224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                default:
168324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // TODO: make this work correctly. For now always report
168424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // run if we aren't running so we don't miss any runnning
168524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // events. If I run the lldb/test/thread/a.out file and
168624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // break at main.cpp:58, run and hit the breakpoints on
168724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // multiple threads, then somehow during the stepping over
168824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // of all breakpoints no run gets reported.
168924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return_value = true;
169024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
169124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // This is a transition from stop to run.
169224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    switch (m_thread_list.ShouldReportRun (event_ptr))
169324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
169424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        case eVoteYes:
169524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        case eVoteNoOpinion:
169624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            return_value = true;
169724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            break;
169824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        case eVoteNo:
169924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            return_value = false;
170024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            break;
170124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
170224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    break;
170324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
170424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
170524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateStopped:
170624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateCrashed:
170724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateSuspended:
170824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
170924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // We've stopped.  First see if we're going to restart the target.
171024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // If we are going to stop, then we always broadcast the event.
171124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // If we aren't going to stop, let the thread plans decide if we're going to report this event.
17125a47e8bcc7277dc3683f2af2aeb9717184e8360cJim Ingham            // If no thread has an opinion, we don't report it.
17133ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham            if (ProcessEventData::GetInterruptedFromEvent (event_ptr))
17143ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham            {
171520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                if (log)
171620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                    log->Printf ("Process::ShouldBroadcastEvent (%p) stopped due to an interrupt, state: %s", event_ptr, StateAsCString(state));
17173ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham                return true;
17183ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham            }
17193ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham            else
172024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
172124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RefreshStateAfterStop ();
172224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
172324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (m_thread_list.ShouldStop (event_ptr) == false)
172424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
172524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    switch (m_thread_list.ShouldReportStop (event_ptr))
172624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
172724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        case eVoteYes:
172824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            Process::ProcessEventData::SetRestartedInEvent (event_ptr, true);
1729028784b321087f1547df8f02f01631c59e5a9859Johnny Chen                            // Intentional fall-through here.
173024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        case eVoteNoOpinion:
173124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        case eVoteNo:
173224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            return_value = false;
173324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            break;
173424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
173524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
173624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (log)
17373ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham                        log->Printf ("Process::ShouldBroadcastEvent (%p) Restarting process from state: %s", event_ptr, StateAsCString(state));
173824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    Resume ();
173924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
174024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
174124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
174224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return_value = true;
174324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    SynchronouslyNotifyStateChanged (state);
174424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
174524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
174624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
174724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
174824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
174924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
175024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("Process::ShouldBroadcastEvent (%p) => %s", event_ptr, StateAsCString(state), return_value ? "YES" : "NO");
175124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return return_value;
175224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
175324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
175424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
175524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Thread Queries
175624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
175724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
175824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadList &
175924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetThreadList ()
176024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
176124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_thread_list;
176224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
176324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
176424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ThreadList &
176524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetThreadList () const
176624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
176724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_thread_list;
176824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
176924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
177024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
177124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
177224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::StartPrivateStateThread ()
177324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1774e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EVENTS));
177524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
177624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
177724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("Process::%s ( )", __FUNCTION__);
177824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
177924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Create a thread that watches our internal state and controls which
178024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // events make it to clients (into the DCProcess event queue).
178124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_private_state_thread = Host::ThreadCreate ("<lldb.process.internal-state>", Process::PrivateStateThread, this, NULL);
178224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_private_state_thread != LLDB_INVALID_HOST_THREAD;
178324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
178424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
178524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
178624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::PausePrivateStateThread ()
178724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
178824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ControlPrivateStateThread (eBroadcastInternalStateControlPause);
178924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
179024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
179124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
179224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ResumePrivateStateThread ()
179324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
179424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ControlPrivateStateThread (eBroadcastInternalStateControlResume);
179524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
179624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
179724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
179824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::StopPrivateStateThread ()
179924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
180024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ControlPrivateStateThread (eBroadcastInternalStateControlStop);
180124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
180224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
180324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
180424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ControlPrivateStateThread (uint32_t signal)
180524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1806e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EVENTS));
180724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
180824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (signal == eBroadcastInternalStateControlStop ||
180924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            signal == eBroadcastInternalStateControlPause ||
181024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            signal == eBroadcastInternalStateControlResume);
181124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
181224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
181324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("Process::%s ( ) - signal: %d", __FUNCTION__, signal);
181424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
181524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Signal the private state thread
181624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_private_state_thread != LLDB_INVALID_HOST_THREAD)
181724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
181824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        TimeValue timeout_time;
181924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool timed_out;
182024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
182124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_private_state_control_broadcaster.BroadcastEvent (signal, NULL);
182224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
182324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        timeout_time = TimeValue::Now();
182424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        timeout_time.OffsetWithSeconds(2);
182524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_private_state_control_wait.WaitForValueEqualTo (true, &timeout_time, &timed_out);
182624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_private_state_control_wait.SetValue (false, eBroadcastNever);
182724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
182824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (signal == eBroadcastInternalStateControlStop)
182924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
183024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (timed_out)
183124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Host::ThreadCancel (m_private_state_thread, NULL);
183224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
183324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            thread_result_t result = NULL;
183424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Host::ThreadJoin (m_private_state_thread, &result, NULL);
1835c607d8681f443d03806f105ceceb11dcadd16184Greg Clayton            m_private_state_thread = LLDB_INVALID_HOST_THREAD;
183624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
183724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
183824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
183924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
184024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
184124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::HandlePrivateEvent (EventSP &event_sp)
184224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1843e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
184424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const StateType internal_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
184524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // See if we should broadcast this state to external clients?
184624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const bool should_broadcast = ShouldBroadcastEvent (event_sp.get());
184724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
184824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("Process::%s (arg = %p, pid = %i) got event '%s' broadcast = %s", __FUNCTION__, this, GetID(), StateAsCString(internal_state), should_broadcast ? "yes" : "no");
184924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
185024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (should_broadcast)
185124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
185224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (log)
185324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
185424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            log->Printf ("\tChanging public state from: %s to %s", StateAsCString(GetState ()), StateAsCString (internal_state));
185524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
1856861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice        if (StateIsRunningState (internal_state))
1857861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice            PushProcessInputReader ();
1858861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice        else
1859861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice            PopProcessInputReader ();
186024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Process::ProcessEventData::SetUpdateStateOnRemoval(event_sp.get());
186124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        BroadcastEvent (event_sp);
186224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
186324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
186424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
186524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (log)
186624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
186724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            log->Printf ("\tNot changing public state with event: %s", StateAsCString (internal_state));
186824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
186924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
187024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
187124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
187224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
187324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::PrivateStateThread (void *arg)
187424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
187524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Process *proc = static_cast<Process*> (arg);
187624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void *result = proc->RunPrivateStateThread ();
187724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return result;
187824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
187924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
188024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
188124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::RunPrivateStateThread ()
188224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
188324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool control_only = false;
188424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_private_state_control_wait.SetValue (false, eBroadcastNever);
188524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1886e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
188724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
188824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("Process::%s (arg = %p, pid = %i) thread starting...", __FUNCTION__, this, GetID());
188924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
189024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool exit_now = false;
189124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    while (!exit_now)
189224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
189324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        EventSP event_sp;
189424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        WaitForEventsPrivate (NULL, event_sp, control_only);
189524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (event_sp->BroadcasterIs(&m_private_state_control_broadcaster))
189624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
189724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            switch (event_sp->GetType())
189824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
189924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case eBroadcastInternalStateControlStop:
190024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                exit_now = true;
190124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                continue;   // Go to next loop iteration so we exit without
190224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;      // doing any internal state managment below
190324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
190424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case eBroadcastInternalStateControlPause:
190524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                control_only = true;
190624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
190724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
190824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case eBroadcastInternalStateControlResume:
190924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                control_only = false;
191024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
191124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
19123ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham
19133ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham            log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS);
19143ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham            if (log)
19153ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham                log->Printf ("Process::%s (arg = %p, pid = %i) got a control event: %d", __FUNCTION__, this, GetID(), event_sp->GetType());
19163ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham
191724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_private_state_control_wait.SetValue (true, eBroadcastAlways);
19183ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham            continue;
191924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
192024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
192124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
192224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const StateType internal_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
192324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
192424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (internal_state != eStateInvalid)
192524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
192624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            HandlePrivateEvent (event_sp);
192724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
192824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19293b2c41c9d12bafdad87cc271fadd1f816081b9a8Greg Clayton        if (internal_state == eStateInvalid ||
19303b2c41c9d12bafdad87cc271fadd1f816081b9a8Greg Clayton            internal_state == eStateExited  ||
19313b2c41c9d12bafdad87cc271fadd1f816081b9a8Greg Clayton            internal_state == eStateDetached )
19323ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham        {
19333ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham            log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS);
19343ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham            if (log)
19353ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham                log->Printf ("Process::%s (arg = %p, pid = %i) about to exit with internal state %s...", __FUNCTION__, this, GetID(), StateAsCString(internal_state));
19363ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham
193724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
19383ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham        }
193924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
194024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1941926060e198137f8a64face70455324a8cd4362a5Caroline Tice    // Verify log is still enabled before attempting to write to it...
1942926060e198137f8a64face70455324a8cd4362a5Caroline Tice    log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS);
194324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
194424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("Process::%s (arg = %p, pid = %i) thread exiting...", __FUNCTION__, this, GetID());
194524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19468b4c16e6ca818961ce6229e419dc960e07737c91Greg Clayton    m_private_state_thread = LLDB_INVALID_HOST_THREAD;
194724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
194824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
194924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
195024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
195124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Process Event Data
195224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
195324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
195424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::ProcessEventData () :
195524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    EventData (),
195624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_process_sp (),
195724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_state (eStateInvalid),
195854e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton    m_restarted (false),
19593ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham    m_update_state (false),
19603ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham    m_interrupted (false)
196124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
196224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
196324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
196424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::ProcessEventData (const ProcessSP &process_sp, StateType state) :
196524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    EventData (),
196624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_process_sp (process_sp),
196724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_state (state),
196854e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton    m_restarted (false),
19693ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham    m_update_state (false),
19703ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham    m_interrupted (false)
197124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
197224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
197324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
197424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::~ProcessEventData()
197524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
197624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
197724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
197824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString &
197924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetFlavorString ()
198024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
198124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static ConstString g_flavor ("Process::ProcessEventData");
198224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return g_flavor;
198324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
198424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
198524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString &
198624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetFlavor () const
198724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
198824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ProcessEventData::GetFlavorString ();
198924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
199024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
199124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
199224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::DoOnRemoval (Event *event_ptr)
199324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
199424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This function gets called twice for each event, once when the event gets pulled
199524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // off of the private process event queue, and once when it gets pulled off of
199624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // the public event queue.  m_update_state is used to distinguish these
199724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // two cases; it is false when we're just pulling it off for private handling,
199824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // and we don't want to do the breakpoint command handling then.
199924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
200024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!m_update_state)
200124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
200224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
200324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_process_sp->SetPublicState (m_state);
200424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
200524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // If we're stopped and haven't restarted, then do the breakpoint commands here:
200624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_state == eStateStopped && ! m_restarted)
200724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
200824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        int num_threads = m_process_sp->GetThreadList().GetSize();
200924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        int idx;
2010643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
201124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (idx = 0; idx < num_threads; ++idx)
201224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
201324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            lldb::ThreadSP thread_sp = m_process_sp->GetThreadList().GetThreadAtIndex(idx);
201424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20156297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham            StopInfoSP stop_info_sp = thread_sp->GetStopInfo ();
20166297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham            if (stop_info_sp)
201724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
20186297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham                stop_info_sp->PerformAction(event_ptr);
201924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
202024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
2021643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
20226fb8baa66796cdb23f337dd03272bf15d97fdab9Jim Ingham        // The stop action might restart the target.  If it does, then we want to mark that in the
20236fb8baa66796cdb23f337dd03272bf15d97fdab9Jim Ingham        // event so that whoever is receiving it will know to wait for the running event and reflect
20246fb8baa66796cdb23f337dd03272bf15d97fdab9Jim Ingham        // that state appropriately.
20256fb8baa66796cdb23f337dd03272bf15d97fdab9Jim Ingham
202624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_process_sp->GetPrivateState() == eStateRunning)
202724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SetRestarted(true);
202824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
202924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
203024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
203124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
203224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::Dump (Stream *s) const
203324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
203424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_process_sp)
203524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        s->Printf(" process = %p (pid = %u), ", m_process_sp.get(), m_process_sp->GetID());
203624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
203724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Printf("state = %s", StateAsCString(GetState()));;
203824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
203924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
204024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Process::ProcessEventData *
204124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetEventDataFromEvent (const Event *event_ptr)
204224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
204324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (event_ptr)
204424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
204524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const EventData *event_data = event_ptr->GetData();
204624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (event_data && event_data->GetFlavor() == ProcessEventData::GetFlavorString())
204724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return static_cast <const ProcessEventData *> (event_ptr->GetData());
204824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
204924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
205024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
205124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
205224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcessSP
205324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetProcessFromEvent (const Event *event_ptr)
205424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
205524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ProcessSP process_sp;
205624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const ProcessEventData *data = GetEventDataFromEvent (event_ptr);
205724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (data)
205824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        process_sp = data->GetProcessSP();
205924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return process_sp;
206024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
206124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
206224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType
206324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetStateFromEvent (const Event *event_ptr)
206424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
206524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const ProcessEventData *data = GetEventDataFromEvent (event_ptr);
206624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (data == NULL)
206724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return eStateInvalid;
206824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
206924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return data->GetState();
207024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
207124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
207224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
207324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetRestartedFromEvent (const Event *event_ptr)
207424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
207524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const ProcessEventData *data = GetEventDataFromEvent (event_ptr);
207624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (data == NULL)
207724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
207824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
207924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return data->GetRestarted();
208024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
208124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
208224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
208324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::SetRestartedInEvent (Event *event_ptr, bool new_value)
208424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
208524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr));
208624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (data != NULL)
208724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        data->SetRestarted(new_value);
208824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
208924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
209024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
20913ae449a5c3b4f51afc0da22cfeaef00c303c0accJim InghamProcess::ProcessEventData::GetInterruptedFromEvent (const Event *event_ptr)
20923ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham{
20933ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham    const ProcessEventData *data = GetEventDataFromEvent (event_ptr);
20943ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham    if (data == NULL)
20953ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham        return false;
20963ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham    else
20973ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham        return data->GetInterrupted ();
20983ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham}
20993ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham
21003ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Inghamvoid
21013ae449a5c3b4f51afc0da22cfeaef00c303c0accJim InghamProcess::ProcessEventData::SetInterruptedInEvent (Event *event_ptr, bool new_value)
21023ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham{
21033ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham    ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr));
21043ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham    if (data != NULL)
21053ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham        data->SetInterrupted(new_value);
21063ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham}
21073ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham
21083ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Inghambool
210924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::SetUpdateStateOnRemoval (Event *event_ptr)
211024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
211124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr));
211224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (data)
211324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
211424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        data->SetUpdateStateOnRemoval();
211524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
211624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
211724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
211824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
211924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
212024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTarget *
212124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::CalculateTarget ()
212224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
212324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return &m_target;
212424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
212524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
212624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess *
212724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::CalculateProcess ()
212824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
212924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return this;
213024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
213124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
213224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThread *
213324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::CalculateThread ()
213424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
213524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
213624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
213724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
213824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStackFrame *
213924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::CalculateStackFrame ()
214024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
214124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
214224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
214324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
214424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
2145a830adbcd63d1995a01e6e18da79893c1426ca43Greg ClaytonProcess::CalculateExecutionContext (ExecutionContext &exe_ctx)
214624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
214724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    exe_ctx.target = &m_target;
214824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    exe_ctx.process = this;
214924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    exe_ctx.thread = NULL;
215024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    exe_ctx.frame = NULL;
215124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
215224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
215324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb::ProcessSP
215424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetSP ()
215524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
215624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return GetTarget().GetProcessSP();
215724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
215824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21597508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghamuint32_t
21607508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamProcess::ListProcessesMatchingName (const char *name, StringList &matches, std::vector<lldb::pid_t> &pids)
21617508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{
21627508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    return 0;
21637508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham}
21647508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
21657508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamArchSpec
21667508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamProcess::GetArchSpecForExistingProcess (lldb::pid_t pid)
21677508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{
21687508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    return Host::GetArchSpecForExistingProcess (pid);
21697508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham}
21707508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
21717508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamArchSpec
21727508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamProcess::GetArchSpecForExistingProcess (const char *process_name)
21737508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{
21747508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    return Host::GetArchSpecForExistingProcess (process_name);
21757508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham}
21767508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
2177861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid
2178861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::AppendSTDOUT (const char * s, size_t len)
2179861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{
218020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    Mutex::Locker locker (m_stdio_communication_mutex);
2181861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    m_stdout_data.append (s, len);
2182861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice
2183b37813353540bcabee7af5f096515a8180be0426Greg Clayton    BroadcastEventIfUnique (eBroadcastBitSTDOUT, new ProcessEventData (GetTarget().GetProcessSP(), GetState()));
2184861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice}
2185861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice
2186861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid
2187861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::STDIOReadThreadBytesReceived (void *baton, const void *src, size_t src_len)
2188861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{
2189861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    Process *process = (Process *) baton;
2190861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    process->AppendSTDOUT (static_cast<const char *>(src), src_len);
2191861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice}
2192861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice
2193861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticesize_t
2194861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::ProcessInputReaderCallback (void *baton,
2195861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice                                     InputReader &reader,
2196861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice                                     lldb::InputReaderAction notification,
2197861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice                                     const char *bytes,
2198861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice                                     size_t bytes_len)
2199861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{
2200861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    Process *process = (Process *) baton;
2201861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice
2202861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    switch (notification)
2203861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    {
2204861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    case eInputReaderActivate:
2205861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice        break;
2206861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice
2207861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    case eInputReaderDeactivate:
2208861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice        break;
2209861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice
2210861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    case eInputReaderReactivate:
2211861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice        break;
2212861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice
2213861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    case eInputReaderGotToken:
2214861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice        {
2215861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice            Error error;
2216861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice            process->PutSTDIN (bytes, bytes_len, error);
2217861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice        }
2218861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice        break;
2219861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice
2220c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice    case eInputReaderInterrupt:
2221c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice        process->Halt ();
2222c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice        break;
2223c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice
2224c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice    case eInputReaderEndOfFile:
2225c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice        process->AppendSTDOUT ("^D", 2);
2226c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice        break;
2227c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice
2228861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    case eInputReaderDone:
2229861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice        break;
2230861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice
2231861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    }
2232861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice
2233861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    return bytes_len;
2234861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice}
2235861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice
2236861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid
2237861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::ResetProcessInputReader ()
2238861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{
2239861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    m_process_input_reader.reset();
2240861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice}
2241861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice
2242861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid
2243861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::SetUpProcessInputReader (int file_descriptor)
2244861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{
2245861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    // First set up the Read Thread for reading/handling process I/O
2246861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice
2247861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    std::auto_ptr<ConnectionFileDescriptor> conn_ap (new ConnectionFileDescriptor (file_descriptor, true));
2248861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice
2249861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    if (conn_ap.get())
2250861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    {
2251861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice        m_stdio_communication.SetConnection (conn_ap.release());
2252861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice        if (m_stdio_communication.IsConnected())
2253861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice        {
2254861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice            m_stdio_communication.SetReadThreadBytesReceivedCallback (STDIOReadThreadBytesReceived, this);
2255861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice            m_stdio_communication.StartReadThread();
2256861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice
2257861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice            // Now read thread is set up, set up input reader.
2258861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice
2259861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice            if (!m_process_input_reader.get())
2260861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice            {
2261861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice                m_process_input_reader.reset (new InputReader(m_target.GetDebugger()));
2262861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice                Error err (m_process_input_reader->Initialize (Process::ProcessInputReaderCallback,
2263861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice                                                               this,
2264861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice                                                               eInputReaderGranularityByte,
2265861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice                                                               NULL,
2266861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice                                                               NULL,
2267861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice                                                               false));
2268861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice
2269861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice                if  (err.Fail())
2270861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice                    m_process_input_reader.reset();
2271861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice            }
2272861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice        }
2273861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    }
2274861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice}
2275861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice
2276861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid
2277861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::PushProcessInputReader ()
2278861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{
2279861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    if (m_process_input_reader && !m_process_input_reader->IsActive())
2280861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice        m_target.GetDebugger().PushInputReader (m_process_input_reader);
2281861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice}
2282861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice
2283861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid
2284861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::PopProcessInputReader ()
2285861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{
2286861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice    if (m_process_input_reader && m_process_input_reader->IsActive())
2287861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice        m_target.GetDebugger().PopInputReader (m_process_input_reader);
2288861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice}
2289861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice
22906e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
2291990de7bb41d3afec6b789155408ff322187d8682Greg Claytonvoid
2292990de7bb41d3afec6b789155408ff322187d8682Greg ClaytonProcess::Initialize ()
2293990de7bb41d3afec6b789155408ff322187d8682Greg Clayton{
2294990de7bb41d3afec6b789155408ff322187d8682Greg Clayton    UserSettingsControllerSP &usc = GetSettingsController();
2295990de7bb41d3afec6b789155408ff322187d8682Greg Clayton    usc.reset (new SettingsController);
2296990de7bb41d3afec6b789155408ff322187d8682Greg Clayton    UserSettingsController::InitializeSettingsController (usc,
2297990de7bb41d3afec6b789155408ff322187d8682Greg Clayton                                                          SettingsController::global_settings_table,
2298990de7bb41d3afec6b789155408ff322187d8682Greg Clayton                                                          SettingsController::instance_settings_table);
2299990de7bb41d3afec6b789155408ff322187d8682Greg Clayton}
23006e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
2301990de7bb41d3afec6b789155408ff322187d8682Greg Claytonvoid
2302990de7bb41d3afec6b789155408ff322187d8682Greg ClaytonProcess::Terminate ()
2303990de7bb41d3afec6b789155408ff322187d8682Greg Clayton{
2304990de7bb41d3afec6b789155408ff322187d8682Greg Clayton    UserSettingsControllerSP &usc = GetSettingsController();
2305990de7bb41d3afec6b789155408ff322187d8682Greg Clayton    UserSettingsController::FinalizeSettingsController (usc);
2306990de7bb41d3afec6b789155408ff322187d8682Greg Clayton    usc.reset();
2307990de7bb41d3afec6b789155408ff322187d8682Greg Clayton}
23086e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
2309990de7bb41d3afec6b789155408ff322187d8682Greg ClaytonUserSettingsControllerSP &
2310990de7bb41d3afec6b789155408ff322187d8682Greg ClaytonProcess::GetSettingsController ()
2311990de7bb41d3afec6b789155408ff322187d8682Greg Clayton{
2312990de7bb41d3afec6b789155408ff322187d8682Greg Clayton    static UserSettingsControllerSP g_settings_controller;
23136e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    return g_settings_controller;
23146e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
23156e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
23161ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Ticevoid
23171ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline TiceProcess::UpdateInstanceName ()
23181ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice{
23191ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice    ModuleSP module_sp = GetTarget().GetExecutableModule();
23201ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice    if (module_sp)
23211ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice    {
23221ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice        StreamString sstr;
23231ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice        sstr.Printf ("%s", module_sp->GetFileSpec().GetFilename().AsCString());
23241ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice
2325c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton        GetSettingsController()->RenameInstanceSettings (GetInstanceName().AsCString(),
23261ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice                                                                  sstr.GetData());
23271ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice    }
23281ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice}
23291ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice
2330427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonExecutionResults
2331360f53f3c216ee4fb433da0a367168785328a856Jim InghamProcess::RunThreadPlan (ExecutionContext &exe_ctx,
2332360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        lldb::ThreadPlanSP &thread_plan_sp,
2333360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        bool stop_others,
2334360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        bool try_all_threads,
2335360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        bool discard_on_error,
2336360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        uint32_t single_thread_timeout_usec,
2337360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        Stream &errors)
2338360f53f3c216ee4fb433da0a367168785328a856Jim Ingham{
2339360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    ExecutionResults return_value = eExecutionSetupError;
2340360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2341360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    // Save this value for restoration of the execution context after we run
2342360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    uint32_t tid = exe_ctx.thread->GetIndexID();
2343360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2344360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    // N.B. Running the target may unset the currently selected thread and frame.  We don't want to do that either,
2345360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    // so we should arrange to reset them as well.
2346360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2347360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    lldb::ThreadSP selected_thread_sp = exe_ctx.process->GetThreadList().GetSelectedThread();
2348360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    lldb::StackFrameSP selected_frame_sp;
2349360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2350360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    uint32_t selected_tid;
2351360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    if (selected_thread_sp != NULL)
2352360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    {
2353360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        selected_tid = selected_thread_sp->GetIndexID();
2354360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        selected_frame_sp = selected_thread_sp->GetSelectedFrame();
2355360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    }
2356360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    else
2357360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    {
2358360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        selected_tid = LLDB_INVALID_THREAD_ID;
2359360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    }
2360360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2361360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    exe_ctx.thread->QueueThreadPlan(thread_plan_sp, true);
2362360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2363360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    Listener listener("ClangFunction temporary listener");
2364360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    exe_ctx.process->HijackProcessEvents(&listener);
2365360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2366360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    Error resume_error = exe_ctx.process->Resume ();
2367360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    if (!resume_error.Success())
2368360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    {
2369360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        errors.Printf("Error resuming inferior: \"%s\".\n", resume_error.AsCString());
2370360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        exe_ctx.process->RestoreProcessEvents();
2371427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        return lldb::eExecutionSetupError;
2372360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    }
2373360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2374360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    // We need to call the function synchronously, so spin waiting for it to return.
2375360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    // If we get interrupted while executing, we're going to lose our context, and
2376360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    // won't be able to gather the result at this point.
2377360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    // We set the timeout AFTER the resume, since the resume takes some time and we
2378360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    // don't want to charge that to the timeout.
2379360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2380360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    TimeValue* timeout_ptr = NULL;
2381360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    TimeValue real_timeout;
2382360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2383360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    if (single_thread_timeout_usec != 0)
2384360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    {
2385360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        real_timeout = TimeValue::Now();
2386360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        real_timeout.OffsetWithMicroSeconds(single_thread_timeout_usec);
2387360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        timeout_ptr = &real_timeout;
2388360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    }
2389360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2390360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
2391360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    while (1)
2392360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    {
2393360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        lldb::EventSP event_sp;
2394360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        lldb::StateType stop_state = lldb::eStateInvalid;
2395360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        // Now wait for the process to stop again:
2396360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        bool got_event = listener.WaitForEvent (timeout_ptr, event_sp);
2397360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2398360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        if (!got_event)
2399360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        {
2400360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            // Right now this is the only way to tell we've timed out...
2401360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            // We should interrupt the process here...
2402360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            // Not really sure what to do if Halt fails here...
2403360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            if (log)
2404360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                if (try_all_threads)
2405360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    log->Printf ("Running function with timeout: %d timed out, trying with all threads enabled.",
2406360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                                 single_thread_timeout_usec);
2407360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                else
2408360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    log->Printf ("Running function with timeout: %d timed out, abandoning execution.",
2409360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                                 single_thread_timeout_usec);
2410360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2411360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            if (exe_ctx.process->Halt().Success())
2412360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            {
2413360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                timeout_ptr = NULL;
2414360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                if (log)
2415360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    log->Printf ("Halt succeeded.");
2416360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2417360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                // Between the time that we got the timeout and the time we halted, but target
2418360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                // might have actually completed the plan.  If so, we're done.  Note, I call WFE here with a short
2419360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                // timeout to
2420360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                got_event = listener.WaitForEvent(NULL, event_sp);
2421360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2422360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                if (got_event)
2423360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                {
2424360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
2425360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    if (log)
2426360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    {
2427360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        log->Printf ("Stopped with event: %s", StateAsCString(stop_state));
2428360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        if (stop_state == lldb::eStateStopped && Process::ProcessEventData::GetInterruptedFromEvent(event_sp.get()))
2429360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                            log->Printf ("    Event was the Halt interruption event.");
2430360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    }
2431360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2432360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    if (exe_ctx.thread->IsThreadPlanDone (thread_plan_sp.get()))
2433360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    {
2434360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        if (log)
2435360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                            log->Printf ("Even though we timed out, the call plan was done.  Exiting wait loop.");
2436427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        return_value = lldb::eExecutionCompleted;
2437360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        break;
2438360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    }
2439360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2440360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    if (try_all_threads
2441360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        && (stop_state == lldb::eStateStopped && Process::ProcessEventData::GetInterruptedFromEvent (event_sp.get())))
2442360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    {
2443360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2444360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        thread_plan_sp->SetStopOthers (false);
2445360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        if (log)
2446360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                            log->Printf ("About to resume.");
2447360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2448360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        exe_ctx.process->Resume();
2449360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        continue;
2450360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    }
2451360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    else
2452360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    {
2453360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        exe_ctx.process->RestoreProcessEvents ();
2454427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        return lldb::eExecutionInterrupted;
2455360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    }
2456360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                }
2457360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            }
2458360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        }
2459360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2460360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
2461360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        if (log)
2462360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            log->Printf("Got event: %s.", StateAsCString(stop_state));
2463360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2464360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        if (stop_state == lldb::eStateRunning || stop_state == lldb::eStateStepping)
2465360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            continue;
2466360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2467360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        if (exe_ctx.thread->IsThreadPlanDone (thread_plan_sp.get()))
2468360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        {
2469427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return_value = lldb::eExecutionCompleted;
2470360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            break;
2471360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        }
2472360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        else if (exe_ctx.thread->WasThreadPlanDiscarded (thread_plan_sp.get()))
2473360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        {
2474427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return_value = lldb::eExecutionDiscarded;
2475360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            break;
2476360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        }
2477360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        else
2478360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        {
2479360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            if (log)
2480360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            {
2481360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                StreamString s;
2482360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                event_sp->Dump (&s);
2483360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                StreamString ts;
2484360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2485360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                const char *event_explanation;
2486360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2487360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                do
2488360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                {
2489360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    const Process::ProcessEventData *event_data = Process::ProcessEventData::GetEventDataFromEvent (event_sp.get());
2490360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2491360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    if (!event_data)
2492360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    {
2493360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        event_explanation = "<no event data>";
2494360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        break;
2495360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    }
2496360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2497360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    Process *process = event_data->GetProcessSP().get();
2498360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2499360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    if (!process)
2500360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    {
2501360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        event_explanation = "<no process>";
2502360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        break;
2503360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    }
2504360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2505360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    ThreadList &thread_list = process->GetThreadList();
2506360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2507360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    uint32_t num_threads = thread_list.GetSize();
2508360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    uint32_t thread_index;
2509360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2510360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    ts.Printf("<%u threads> ", num_threads);
2511360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2512360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    for (thread_index = 0;
2513360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                         thread_index < num_threads;
2514360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                         ++thread_index)
2515360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    {
2516360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        Thread *thread = thread_list.GetThreadAtIndex(thread_index).get();
2517360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2518360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        if (!thread)
2519360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        {
2520360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                            ts.Printf("<?> ");
2521360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                            continue;
2522360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        }
2523360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2524360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        ts.Printf("<");
2525360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        RegisterContext *register_context = thread->GetRegisterContext();
2526360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2527360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        if (register_context)
2528360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                            ts.Printf("[ip 0x%llx] ", register_context->GetPC());
2529360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        else
2530360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                            ts.Printf("[ip unknown] ");
2531360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2532360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        lldb::StopInfoSP stop_info_sp = thread->GetStopInfo();
2533360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        if (stop_info_sp)
2534360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        {
2535360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                            const char *stop_desc = stop_info_sp->GetDescription();
2536360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                            if (stop_desc)
2537360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                                ts.PutCString (stop_desc);
2538360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        }
2539360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                        ts.Printf(">");
2540360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    }
2541360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2542360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    event_explanation = ts.GetData();
2543360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                } while (0);
2544360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2545360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                if (log)
2546360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                    log->Printf("Execution interrupted: %s %s", s.GetData(), event_explanation);
2547360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            }
2548360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2549360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            if (discard_on_error && thread_plan_sp)
2550360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            {
2551360f53f3c216ee4fb433da0a367168785328a856Jim Ingham                exe_ctx.thread->DiscardThreadPlansUpToPlan (thread_plan_sp);
2552360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            }
2553427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return_value = lldb::eExecutionInterrupted;
2554360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            break;
2555360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        }
2556360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    }
2557360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2558360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    if (exe_ctx.process)
2559360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        exe_ctx.process->RestoreProcessEvents ();
2560360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2561360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    // Thread we ran the function in may have gone away because we ran the target
2562360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    // Check that it's still there.
2563360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    exe_ctx.thread = exe_ctx.process->GetThreadList().FindThreadByIndexID(tid, true).get();
2564360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    if (exe_ctx.thread)
2565360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        exe_ctx.frame = exe_ctx.thread->GetStackFrameAtIndex(0).get();
2566360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2567360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    // Also restore the current process'es selected frame & thread, since this function calling may
2568360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    // be done behind the user's back.
2569360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2570360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    if (selected_tid != LLDB_INVALID_THREAD_ID)
2571360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    {
2572360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        if (exe_ctx.process->GetThreadList().SetSelectedThreadByIndexID (selected_tid))
2573360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        {
2574360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            // We were able to restore the selected thread, now restore the frame:
2575360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            exe_ctx.process->GetThreadList().GetSelectedThread()->SetSelectedFrame(selected_frame_sp.get());
2576360f53f3c216ee4fb433da0a367168785328a856Jim Ingham        }
2577360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    }
2578360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2579360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    return return_value;
2580360f53f3c216ee4fb433da0a367168785328a856Jim Ingham}
2581360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2582360f53f3c216ee4fb433da0a367168785328a856Jim Inghamconst char *
2583360f53f3c216ee4fb433da0a367168785328a856Jim InghamProcess::ExecutionResultAsCString (ExecutionResults result)
2584360f53f3c216ee4fb433da0a367168785328a856Jim Ingham{
2585360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    const char *result_name;
2586360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
2587360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    switch (result)
2588360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    {
2589427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        case lldb::eExecutionCompleted:
2590360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            result_name = "eExecutionCompleted";
2591360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            break;
2592427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        case lldb::eExecutionDiscarded:
2593360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            result_name = "eExecutionDiscarded";
2594360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            break;
2595427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        case lldb::eExecutionInterrupted:
2596360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            result_name = "eExecutionInterrupted";
2597360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            break;
2598427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        case lldb::eExecutionSetupError:
2599360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            result_name = "eExecutionSetupError";
2600360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            break;
2601427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        case lldb::eExecutionTimedOut:
2602360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            result_name = "eExecutionTimedOut";
2603360f53f3c216ee4fb433da0a367168785328a856Jim Ingham            break;
2604360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    }
2605360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    return result_name;
2606360f53f3c216ee4fb433da0a367168785328a856Jim Ingham}
2607360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
26086e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//--------------------------------------------------------------
2609d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton// class Process::SettingsController
26106e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//--------------------------------------------------------------
26116e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
2612d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonProcess::SettingsController::SettingsController () :
26135bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice    UserSettingsController ("process", Target::GetSettingsController())
26146e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
2615638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton    m_default_settings.reset (new ProcessInstanceSettings (*this,
2616638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton                                                           false,
2617004afcb95736e97d071b1dd9b5254800e11e581cCaroline Tice                                                           InstanceSettings::GetDefaultName().AsCString()));
26186e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
26196e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
2620d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonProcess::SettingsController::~SettingsController ()
26216e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
26226e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
26236e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
26246e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticelldb::InstanceSettingsSP
2625d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonProcess::SettingsController::CreateInstanceSettings (const char *instance_name)
26266e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
2627c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton    ProcessInstanceSettings *new_settings = new ProcessInstanceSettings (*GetSettingsController(),
2628c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton                                                                         false,
2629c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton                                                                         instance_name);
26306e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    lldb::InstanceSettingsSP new_settings_sp (new_settings);
26316e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    return new_settings_sp;
26326e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
26336e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
26346e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//--------------------------------------------------------------
26356e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice// class ProcessInstanceSettings
26366e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//--------------------------------------------------------------
26376e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
2638638351aee118e89c658ca295cb4e9d1db7849befGreg ClaytonProcessInstanceSettings::ProcessInstanceSettings
2639638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton(
2640638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton    UserSettingsController &owner,
2641638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton    bool live_instance,
2642638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton    const char *name
2643638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton) :
2644638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton    InstanceSettings (owner, name ? name : InstanceSettings::InvalidName().AsCString(), live_instance),
26456e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    m_run_args (),
26466e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    m_env_vars (),
26476e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    m_input_path (),
26486e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    m_output_path (),
26496e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    m_error_path (),
26506e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    m_plugin (),
2651bd666017403e102e0ca435d6da585ff979f83598Caroline Tice    m_disable_aslr (true),
2652638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton    m_disable_stdio (false),
2653638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton    m_inherit_host_env (true),
2654638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton    m_got_host_env (false)
26556e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
2656396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice    // CopyInstanceSettings is a pure virtual function in InstanceSettings; it therefore cannot be called
2657396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice    // until the vtables for ProcessInstanceSettings are properly set up, i.e. AFTER all the initializers.
2658396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice    // For this reason it has to be called here, rather than in the initializer or in the parent constructor.
265975b11a343a035ab426473a785a045f0614af9984Caroline Tice    // This is true for CreateInstanceName() too.
266075b11a343a035ab426473a785a045f0614af9984Caroline Tice
266175b11a343a035ab426473a785a045f0614af9984Caroline Tice    if (GetInstanceName () == InstanceSettings::InvalidName())
266275b11a343a035ab426473a785a045f0614af9984Caroline Tice    {
266375b11a343a035ab426473a785a045f0614af9984Caroline Tice        ChangeInstanceName (std::string (CreateInstanceName().AsCString()));
266475b11a343a035ab426473a785a045f0614af9984Caroline Tice        m_owner.RegisterInstanceSettings (this);
266575b11a343a035ab426473a785a045f0614af9984Caroline Tice    }
2666396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice
2667396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice    if (live_instance)
26686e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {
26696e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        const lldb::InstanceSettingsSP &pending_settings = m_owner.FindPendingSettings (m_instance_name);
26706e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        CopyInstanceSettings (pending_settings,false);
2671396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice        //m_owner.RemovePendingSettings (m_instance_name);
26726e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    }
26736e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
26746e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
26756e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::ProcessInstanceSettings (const ProcessInstanceSettings &rhs) :
2676c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton    InstanceSettings (*Process::GetSettingsController(), CreateInstanceName().AsCString()),
26776e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    m_run_args (rhs.m_run_args),
26786e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    m_env_vars (rhs.m_env_vars),
26796e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    m_input_path (rhs.m_input_path),
26806e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    m_output_path (rhs.m_output_path),
26816e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    m_error_path (rhs.m_error_path),
26826e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    m_plugin (rhs.m_plugin),
2683bd666017403e102e0ca435d6da585ff979f83598Caroline Tice    m_disable_aslr (rhs.m_disable_aslr),
2684bd666017403e102e0ca435d6da585ff979f83598Caroline Tice    m_disable_stdio (rhs.m_disable_stdio)
26856e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
26866e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    if (m_instance_name != InstanceSettings::GetDefaultName())
26876e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {
26886e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        const lldb::InstanceSettingsSP &pending_settings = m_owner.FindPendingSettings (m_instance_name);
26896e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        CopyInstanceSettings (pending_settings,false);
26906e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        m_owner.RemovePendingSettings (m_instance_name);
26916e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    }
26926e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
26936e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
26946e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::~ProcessInstanceSettings ()
26956e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
26966e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
26976e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
26986e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings&
26996e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::operator= (const ProcessInstanceSettings &rhs)
27006e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
27016e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    if (this != &rhs)
27026e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {
27036e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        m_run_args = rhs.m_run_args;
27046e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        m_env_vars = rhs.m_env_vars;
27056e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        m_input_path = rhs.m_input_path;
27066e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        m_output_path = rhs.m_output_path;
27076e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        m_error_path = rhs.m_error_path;
27086e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        m_plugin = rhs.m_plugin;
27096e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        m_disable_aslr = rhs.m_disable_aslr;
2710bd666017403e102e0ca435d6da585ff979f83598Caroline Tice        m_disable_stdio = rhs.m_disable_stdio;
2711638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton        m_inherit_host_env = rhs.m_inherit_host_env;
27126e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    }
27136e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
27146e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    return *this;
27156e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
27166e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
27176e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
27186e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticevoid
27196e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::UpdateInstanceSettingsVariable (const ConstString &var_name,
27206e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                         const char *index_value,
27216e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                         const char *value,
27226e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                         const ConstString &instance_name,
27236e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                         const SettingEntry &entry,
27246e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                         lldb::VarSetOperationType op,
27256e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                         Error &err,
27266e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                         bool pending)
27276e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
27286e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    if (var_name == RunArgsVarName())
27296e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        UserSettingsController::UpdateStringArrayVariable (op, index_value, m_run_args, value, err);
27306e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    else if (var_name == EnvVarsVarName())
2731638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton    {
2732638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton        GetHostEnvironmentIfNeeded ();
27336e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        UserSettingsController::UpdateDictionaryVariable (op, index_value, m_env_vars, value, err);
2734638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton    }
27356e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    else if (var_name == InputPathVarName())
27366e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        UserSettingsController::UpdateStringVariable (op, m_input_path, value, err);
27376e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    else if (var_name == OutputPathVarName())
27386e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        UserSettingsController::UpdateStringVariable (op, m_output_path, value, err);
27396e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    else if (var_name == ErrorPathVarName())
27406e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        UserSettingsController::UpdateStringVariable (op, m_error_path, value, err);
27416e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    else if (var_name == PluginVarName())
27426e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        UserSettingsController::UpdateEnumVariable (entry.enum_values, (int *) &m_plugin, value, err);
2743638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton    else if (var_name == InheritHostEnvVarName())
2744638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton        UserSettingsController::UpdateBooleanVariable (op, m_inherit_host_env, value, err);
27456e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    else if (var_name == DisableASLRVarName())
27466e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        UserSettingsController::UpdateBooleanVariable (op, m_disable_aslr, value, err);
2747bd666017403e102e0ca435d6da585ff979f83598Caroline Tice    else if (var_name == DisableSTDIOVarName ())
2748bd666017403e102e0ca435d6da585ff979f83598Caroline Tice        UserSettingsController::UpdateBooleanVariable (op, m_disable_stdio, value, err);
27496e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
27506e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
27516e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticevoid
27526e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::CopyInstanceSettings (const lldb::InstanceSettingsSP &new_settings,
27536e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                               bool pending)
27546e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
27556e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    if (new_settings.get() == NULL)
27566e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        return;
27576e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
27586e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    ProcessInstanceSettings *new_process_settings = (ProcessInstanceSettings *) new_settings.get();
27596e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
27606e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    m_run_args = new_process_settings->m_run_args;
27616e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    m_env_vars = new_process_settings->m_env_vars;
27626e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    m_input_path = new_process_settings->m_input_path;
27636e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    m_output_path = new_process_settings->m_output_path;
27646e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    m_error_path = new_process_settings->m_error_path;
27656e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    m_plugin = new_process_settings->m_plugin;
27666e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    m_disable_aslr = new_process_settings->m_disable_aslr;
2767bd666017403e102e0ca435d6da585ff979f83598Caroline Tice    m_disable_stdio = new_process_settings->m_disable_stdio;
27686e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
27696e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
2770bcb5b454767121980d937d2610ba762fdb575c45Caroline Ticebool
27716e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::GetInstanceSettingsValue (const SettingEntry &entry,
27726e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                   const ConstString &var_name,
27735bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice                                                   StringList &value,
2774bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice                                                   Error *err)
27756e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
27766e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    if (var_name == RunArgsVarName())
27776e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {
27786e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        if (m_run_args.GetArgumentCount() > 0)
2779c14069e2764a57c55e60ea9406842858a509223cGreg Clayton        {
27806e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice            for (int i = 0; i < m_run_args.GetArgumentCount(); ++i)
27816e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                value.AppendString (m_run_args.GetArgumentAtIndex (i));
2782c14069e2764a57c55e60ea9406842858a509223cGreg Clayton        }
27836e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    }
27846e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    else if (var_name == EnvVarsVarName())
27856e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {
2786638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton        GetHostEnvironmentIfNeeded ();
2787638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton
27886e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        if (m_env_vars.size() > 0)
27896e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        {
27906e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice            std::map<std::string, std::string>::iterator pos;
27916e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice            for (pos = m_env_vars.begin(); pos != m_env_vars.end(); ++pos)
27926e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice            {
27936e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                StreamString value_str;
27946e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                value_str.Printf ("%s=%s", pos->first.c_str(), pos->second.c_str());
27956e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                value.AppendString (value_str.GetData());
27966e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice            }
27976e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        }
27986e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    }
27996e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    else if (var_name == InputPathVarName())
28006e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {
28016e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        value.AppendString (m_input_path.c_str());
28026e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    }
28036e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    else if (var_name == OutputPathVarName())
28046e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {
28056e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        value.AppendString (m_output_path.c_str());
28066e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    }
28076e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    else if (var_name == ErrorPathVarName())
28086e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {
28096e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        value.AppendString (m_error_path.c_str());
28106e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    }
28116e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    else if (var_name == PluginVarName())
28126e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {
28136e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        value.AppendString (UserSettingsController::EnumToString (entry.enum_values, (int) m_plugin));
28146e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    }
2815a99b0bf8bd41541cc29eab76d23f90976ba0736aGreg Clayton    else if (var_name == InheritHostEnvVarName())
2816a99b0bf8bd41541cc29eab76d23f90976ba0736aGreg Clayton    {
2817a99b0bf8bd41541cc29eab76d23f90976ba0736aGreg Clayton        if (m_inherit_host_env)
2818a99b0bf8bd41541cc29eab76d23f90976ba0736aGreg Clayton            value.AppendString ("true");
2819a99b0bf8bd41541cc29eab76d23f90976ba0736aGreg Clayton        else
2820a99b0bf8bd41541cc29eab76d23f90976ba0736aGreg Clayton            value.AppendString ("false");
2821a99b0bf8bd41541cc29eab76d23f90976ba0736aGreg Clayton    }
28226e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    else if (var_name == DisableASLRVarName())
28236e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {
28246e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        if (m_disable_aslr)
28256e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice            value.AppendString ("true");
28266e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        else
28276e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice            value.AppendString ("false");
28286e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    }
2829bd666017403e102e0ca435d6da585ff979f83598Caroline Tice    else if (var_name == DisableSTDIOVarName())
2830bd666017403e102e0ca435d6da585ff979f83598Caroline Tice    {
2831bd666017403e102e0ca435d6da585ff979f83598Caroline Tice        if (m_disable_stdio)
2832bd666017403e102e0ca435d6da585ff979f83598Caroline Tice            value.AppendString ("true");
2833bd666017403e102e0ca435d6da585ff979f83598Caroline Tice        else
2834bd666017403e102e0ca435d6da585ff979f83598Caroline Tice            value.AppendString ("false");
2835bd666017403e102e0ca435d6da585ff979f83598Caroline Tice    }
28366e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    else
2837bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice    {
2838bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice        if (err)
2839bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice            err->SetErrorStringWithFormat ("unrecognized variable name '%s'", var_name.AsCString());
2840bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice        return false;
2841bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice    }
2842bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice    return true;
28436e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
28446e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
28456e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticeconst ConstString
28466e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::CreateInstanceName ()
28476e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
28486e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    static int instance_count = 1;
28496e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    StreamString sstr;
28506e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
28516e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    sstr.Printf ("process_%d", instance_count);
28526e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    ++instance_count;
28536e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
28546e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    const ConstString ret_val (sstr.GetData());
28556e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    return ret_val;
28566e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
28576e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
28586e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticeconst ConstString &
28596e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::RunArgsVarName ()
28606e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
28616e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    static ConstString run_args_var_name ("run-args");
28626e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
28636e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    return run_args_var_name;
28646e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
28656e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
28666e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticeconst ConstString &
28676e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::EnvVarsVarName ()
28686e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
28696e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    static ConstString env_vars_var_name ("env-vars");
28706e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
28716e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    return env_vars_var_name;
28726e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
28736e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
28746e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticeconst ConstString &
2875638351aee118e89c658ca295cb4e9d1db7849befGreg ClaytonProcessInstanceSettings::InheritHostEnvVarName ()
2876638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton{
2877638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton    static ConstString g_name ("inherit-env");
2878638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton
2879638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton    return g_name;
2880638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton}
2881638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton
2882638351aee118e89c658ca295cb4e9d1db7849befGreg Claytonconst ConstString &
28836e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::InputPathVarName ()
28846e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
28856e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice  static ConstString input_path_var_name ("input-path");
28866e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
28876e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    return input_path_var_name;
28886e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
28896e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
28906e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticeconst ConstString &
28916e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::OutputPathVarName ()
28926e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
289387097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice    static ConstString output_path_var_name ("output-path");
28946e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
28956e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    return output_path_var_name;
28966e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
28976e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
28986e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticeconst ConstString &
28996e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::ErrorPathVarName ()
29006e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
290187097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice    static ConstString error_path_var_name ("error-path");
29026e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
29036e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    return error_path_var_name;
29046e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
29056e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
29066e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticeconst ConstString &
29076e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::PluginVarName ()
29086e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
29096e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    static ConstString plugin_var_name ("plugin");
29106e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
29116e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    return plugin_var_name;
29126e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
29136e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
29146e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
29156e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticeconst ConstString &
29166e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::DisableASLRVarName ()
29176e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
29186e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    static ConstString disable_aslr_var_name ("disable-aslr");
29196e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
29206e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    return disable_aslr_var_name;
29216e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
29226e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
2923bd666017403e102e0ca435d6da585ff979f83598Caroline Ticeconst ConstString &
2924bd666017403e102e0ca435d6da585ff979f83598Caroline TiceProcessInstanceSettings::DisableSTDIOVarName ()
2925bd666017403e102e0ca435d6da585ff979f83598Caroline Tice{
2926bd666017403e102e0ca435d6da585ff979f83598Caroline Tice    static ConstString disable_stdio_var_name ("disable-stdio");
2927bd666017403e102e0ca435d6da585ff979f83598Caroline Tice
2928bd666017403e102e0ca435d6da585ff979f83598Caroline Tice    return disable_stdio_var_name;
2929bd666017403e102e0ca435d6da585ff979f83598Caroline Tice}
29306e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
29316e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//--------------------------------------------------
2932d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton// SettingsController Variable Tables
29336e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//--------------------------------------------------
29346e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
29356e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceSettingEntry
2936d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonProcess::SettingsController::global_settings_table[] =
29376e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
29386e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice  //{ "var-name",    var-type  ,        "default", enum-table, init'd, hidden, "help-text"},
29396e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {  NULL, eSetVarTypeNone, NULL, NULL, 0, 0, NULL }
29406e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice};
29416e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
29426e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
29436e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticelldb::OptionEnumValueElement
2944d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonProcess::SettingsController::g_plugins[] =
29456e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
2946f2c330df115cfdaedbf9d359b00f3ebb3cab9887Caroline Tice    { eMacosx, "process.macosx", "Use the native MacOSX debugger plugin" },
2947f2c330df115cfdaedbf9d359b00f3ebb3cab9887Caroline Tice    { eRemoteDebugger, "process.gdb-remote" , "Use the GDB Remote protocol based debugger plugin" },
2948f2c330df115cfdaedbf9d359b00f3ebb3cab9887Caroline Tice    { 0, NULL, NULL }
29496e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice};
29506e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
29516e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceSettingEntry
2952d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonProcess::SettingsController::instance_settings_table[] =
29536e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
2954638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton  //{ "var-name",       var-type,              "default",       enum-table, init'd, hidden, "help-text"},
2955638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton    { "run-args",       eSetVarTypeArray,       NULL,           NULL,       false,  false,  "A list containing all the arguments to be passed to the executable when it is run." },
2956638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton    { "env-vars",       eSetVarTypeDictionary,  NULL,           NULL,       false,  false,  "A list of all the environment variables to be passed to the executable's environment, and their values." },
2957638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton    { "inherit-env",    eSetVarTypeBoolean,     "true",         NULL,       false,  false,  "Inherit the environment from the process that is running LLDB." },
2958638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton    { "input-path",     eSetVarTypeString,      "/dev/stdin",   NULL,       false,  false,  "The file/path to be used by the executable program for reading its input." },
2959638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton    { "output-path",    eSetVarTypeString,      "/dev/stdout",  NULL,       false,  false,  "The file/path to be used by the executable program for writing its output." },
2960638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton    { "error-path",     eSetVarTypeString,      "/dev/stderr",  NULL,       false,  false,  "The file/path to be used by the executable program for writings its error messages." },
2961638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton    { "plugin",         eSetVarTypeEnum,        NULL         ,  g_plugins,  false,  false,  "The plugin to be used to run the process." },
2962638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton    { "disable-aslr",   eSetVarTypeBoolean,     "true",         NULL,       false,  false,  "Disable Address Space Layout Randomization (ASLR)" },
2963638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton    { "disable-stdio",  eSetVarTypeBoolean,     "false",        NULL,       false,  false,  "Disable stdin/stdout for process (e.g. for a GUI application)" },
2964638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton    {  NULL,            eSetVarTypeNone,        NULL,           NULL,       false,  false,  NULL }
29656e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice};
29666e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
29676e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
29687508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
2969