Debugger.cpp revision 53d68e749f0715691a95f23e9490d97e484b15da
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Debugger.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/lldb-private.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ConnectionFileDescriptor.h"
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Debugger.h"
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/InputReader.h"
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/State.h"
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h"
1663094e0bb161580564954dee512955c1c79d3476Greg Clayton#include "lldb/Interpreter/CommandInterpreter.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/TargetList.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2563094e0bb161580564954dee512955c1c79d3476Greg Claytonstatic uint32_t g_shared_debugger_refcount = 0;
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Ticestatic lldb::user_id_t g_unique_id = 1;
28558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::Initialize ()
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3263094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (g_shared_debugger_refcount == 0)
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        lldb_private::Initialize();
3463094e0bb161580564954dee512955c1c79d3476Greg Clayton    g_shared_debugger_refcount++;
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::Terminate ()
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4063094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (g_shared_debugger_refcount > 0)
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
4263094e0bb161580564954dee512955c1c79d3476Greg Clayton        g_shared_debugger_refcount--;
4363094e0bb161580564954dee512955c1c79d3476Greg Clayton        if (g_shared_debugger_refcount == 0)
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
4563094e0bb161580564954dee512955c1c79d3476Greg Clayton            lldb_private::WillTerminate();
4663094e0bb161580564954dee512955c1c79d3476Greg Clayton            lldb_private::Terminate();
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5163094e0bb161580564954dee512955c1c79d3476Greg Claytontypedef std::vector<DebuggerSP> DebuggerList;
5263094e0bb161580564954dee512955c1c79d3476Greg Clayton
5363094e0bb161580564954dee512955c1c79d3476Greg Claytonstatic Mutex &
5463094e0bb161580564954dee512955c1c79d3476Greg ClaytonGetDebuggerListMutex ()
5563094e0bb161580564954dee512955c1c79d3476Greg Clayton{
5663094e0bb161580564954dee512955c1c79d3476Greg Clayton    static Mutex g_mutex(Mutex::eMutexTypeRecursive);
5763094e0bb161580564954dee512955c1c79d3476Greg Clayton    return g_mutex;
5863094e0bb161580564954dee512955c1c79d3476Greg Clayton}
5963094e0bb161580564954dee512955c1c79d3476Greg Clayton
6063094e0bb161580564954dee512955c1c79d3476Greg Claytonstatic DebuggerList &
6163094e0bb161580564954dee512955c1c79d3476Greg ClaytonGetDebuggerList()
6263094e0bb161580564954dee512955c1c79d3476Greg Clayton{
6363094e0bb161580564954dee512955c1c79d3476Greg Clayton    // hide the static debugger list inside a singleton accessor to avoid
6463094e0bb161580564954dee512955c1c79d3476Greg Clayton    // global init contructors
6563094e0bb161580564954dee512955c1c79d3476Greg Clayton    static DebuggerList g_list;
6663094e0bb161580564954dee512955c1c79d3476Greg Clayton    return g_list;
6763094e0bb161580564954dee512955c1c79d3476Greg Clayton}
6863094e0bb161580564954dee512955c1c79d3476Greg Clayton
6963094e0bb161580564954dee512955c1c79d3476Greg Clayton
7063094e0bb161580564954dee512955c1c79d3476Greg ClaytonDebuggerSP
7163094e0bb161580564954dee512955c1c79d3476Greg ClaytonDebugger::CreateInstance ()
7263094e0bb161580564954dee512955c1c79d3476Greg Clayton{
7363094e0bb161580564954dee512955c1c79d3476Greg Clayton    DebuggerSP debugger_sp (new Debugger);
7463094e0bb161580564954dee512955c1c79d3476Greg Clayton    // Scope for locker
7563094e0bb161580564954dee512955c1c79d3476Greg Clayton    {
7663094e0bb161580564954dee512955c1c79d3476Greg Clayton        Mutex::Locker locker (GetDebuggerListMutex ());
7763094e0bb161580564954dee512955c1c79d3476Greg Clayton        GetDebuggerList().push_back(debugger_sp);
7863094e0bb161580564954dee512955c1c79d3476Greg Clayton    }
7963094e0bb161580564954dee512955c1c79d3476Greg Clayton    return debugger_sp;
8063094e0bb161580564954dee512955c1c79d3476Greg Clayton}
8163094e0bb161580564954dee512955c1c79d3476Greg Clayton
8263094e0bb161580564954dee512955c1c79d3476Greg Claytonlldb::DebuggerSP
8363094e0bb161580564954dee512955c1c79d3476Greg ClaytonDebugger::GetSP ()
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
8563094e0bb161580564954dee512955c1c79d3476Greg Clayton    lldb::DebuggerSP debugger_sp;
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8763094e0bb161580564954dee512955c1c79d3476Greg Clayton    Mutex::Locker locker (GetDebuggerListMutex ());
8863094e0bb161580564954dee512955c1c79d3476Greg Clayton    DebuggerList &debugger_list = GetDebuggerList();
8963094e0bb161580564954dee512955c1c79d3476Greg Clayton    DebuggerList::iterator pos, end = debugger_list.end();
9063094e0bb161580564954dee512955c1c79d3476Greg Clayton    for (pos = debugger_list.begin(); pos != end; ++pos)
9163094e0bb161580564954dee512955c1c79d3476Greg Clayton    {
9263094e0bb161580564954dee512955c1c79d3476Greg Clayton        if ((*pos).get() == this)
9363094e0bb161580564954dee512955c1c79d3476Greg Clayton        {
9463094e0bb161580564954dee512955c1c79d3476Greg Clayton            debugger_sp = *pos;
9563094e0bb161580564954dee512955c1c79d3476Greg Clayton            break;
9663094e0bb161580564954dee512955c1c79d3476Greg Clayton        }
9763094e0bb161580564954dee512955c1c79d3476Greg Clayton    }
9863094e0bb161580564954dee512955c1c79d3476Greg Clayton    return debugger_sp;
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10163094e0bb161580564954dee512955c1c79d3476Greg Clayton
10263094e0bb161580564954dee512955c1c79d3476Greg ClaytonTargetSP
10363094e0bb161580564954dee512955c1c79d3476Greg ClaytonDebugger::FindTargetWithProcessID (lldb::pid_t pid)
10463094e0bb161580564954dee512955c1c79d3476Greg Clayton{
10563094e0bb161580564954dee512955c1c79d3476Greg Clayton    lldb::TargetSP target_sp;
10663094e0bb161580564954dee512955c1c79d3476Greg Clayton    Mutex::Locker locker (GetDebuggerListMutex ());
10763094e0bb161580564954dee512955c1c79d3476Greg Clayton    DebuggerList &debugger_list = GetDebuggerList();
10863094e0bb161580564954dee512955c1c79d3476Greg Clayton    DebuggerList::iterator pos, end = debugger_list.end();
10963094e0bb161580564954dee512955c1c79d3476Greg Clayton    for (pos = debugger_list.begin(); pos != end; ++pos)
11063094e0bb161580564954dee512955c1c79d3476Greg Clayton    {
11163094e0bb161580564954dee512955c1c79d3476Greg Clayton        target_sp = (*pos)->GetTargetList().FindTargetWithProcessID (pid);
11263094e0bb161580564954dee512955c1c79d3476Greg Clayton        if (target_sp)
11363094e0bb161580564954dee512955c1c79d3476Greg Clayton            break;
11463094e0bb161580564954dee512955c1c79d3476Greg Clayton    }
11563094e0bb161580564954dee512955c1c79d3476Greg Clayton    return target_sp;
11663094e0bb161580564954dee512955c1c79d3476Greg Clayton}
11763094e0bb161580564954dee512955c1c79d3476Greg Clayton
11863094e0bb161580564954dee512955c1c79d3476Greg Clayton
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::Debugger () :
120558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice    UserID (g_unique_id++),
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_input_comm("debugger.input"),
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_input_file (),
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_output_file (),
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_error_file (),
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_list (),
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_listener ("lldb.Debugger"),
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_source_manager (),
12863094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_command_interpreter_ap (new CommandInterpreter (*this, eScriptLanguageDefault, false)),
12963094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_exe_ctx (),
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_input_readers (),
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_input_reader_data ()
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
13363094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_command_interpreter_ap->Initialize ();
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::~Debugger ()
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
13863094e0bb161580564954dee512955c1c79d3476Greg Clayton    int num_targets = m_target_list.GetNumTargets();
13963094e0bb161580564954dee512955c1c79d3476Greg Clayton    for (int i = 0; i < num_targets; i++)
14063094e0bb161580564954dee512955c1c79d3476Greg Clayton    {
14163094e0bb161580564954dee512955c1c79d3476Greg Clayton        ProcessSP process_sp (m_target_list.GetTargetAtIndex (i)->GetProcessSP());
14263094e0bb161580564954dee512955c1c79d3476Greg Clayton        if (process_sp)
14363094e0bb161580564954dee512955c1c79d3476Greg Clayton            process_sp->Destroy();
14463094e0bb161580564954dee512955c1c79d3476Greg Clayton    }
14563094e0bb161580564954dee512955c1c79d3476Greg Clayton    DisconnectInput();
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::GetAsyncExecution ()
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
15263094e0bb161580564954dee512955c1c79d3476Greg Clayton    return !m_command_interpreter_ap->GetSynchronous();
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::SetAsyncExecution (bool async_execution)
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
15863094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_command_interpreter_ap->SetSynchronous (!async_execution);
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::DisconnectInput()
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_input_comm.Clear ();
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::SetInputFileHandle (FILE *fh, bool tranfer_ownership)
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_input_file.SetFileHandle (fh, tranfer_ownership);
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_input_file.GetFileHandle() == NULL)
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_input_file.SetFileHandle (stdin, false);
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Disconnect from any old connection if we had one
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_input_comm.Disconnect ();
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_input_comm.SetConnection (new ConnectionFileDescriptor (::fileno (GetInputFileHandle()), true));
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_input_comm.SetReadThreadBytesReceivedCallback (Debugger::DispatchInputCallback, this);
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error error;
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_input_comm.StartReadThread (&error) == false)
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        FILE *err_fh = GetErrorFileHandle();
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (err_fh)
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ::fprintf (err_fh, "error: failed to main input read thread: %s", error.AsCString() ? error.AsCString() : "unkown error");
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            exit(1);
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFILE *
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::GetInputFileHandle ()
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_input_file.GetFileHandle();
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::SetOutputFileHandle (FILE *fh, bool tranfer_ownership)
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_output_file.SetFileHandle (fh, tranfer_ownership);
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_output_file.GetFileHandle() == NULL)
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_output_file.SetFileHandle (stdin, false);
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFILE *
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::GetOutputFileHandle ()
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_output_file.GetFileHandle();
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::SetErrorFileHandle (FILE *fh, bool tranfer_ownership)
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_error_file.SetFileHandle (fh, tranfer_ownership);
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_error_file.GetFileHandle() == NULL)
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_error_file.SetFileHandle (stdin, false);
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFILE *
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::GetErrorFileHandle ()
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_error_file.GetFileHandle();
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter &
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::GetCommandInterpreter ()
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
23163094e0bb161580564954dee512955c1c79d3476Greg Clayton    assert (m_command_interpreter_ap.get());
23263094e0bb161580564954dee512955c1c79d3476Greg Clayton    return *m_command_interpreter_ap;
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerListener &
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::GetListener ()
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_listener;
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetSP
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::GetCurrentTarget ()
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target_list.GetCurrentTarget ();
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerExecutionContext
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::GetCurrentExecutionContext ()
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ExecutionContext exe_ctx;
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    exe_ctx.Clear();
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::TargetSP target_sp = GetCurrentTarget();
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    exe_ctx.target = target_sp.get();
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (target_sp)
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        exe_ctx.process = target_sp->GetProcessSP().get();
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (exe_ctx.process && exe_ctx.process->IsRunning() == false)
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            exe_ctx.thread = exe_ctx.process->GetThreadList().GetCurrentThread().get();
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (exe_ctx.thread == NULL)
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                exe_ctx.thread = exe_ctx.process->GetThreadList().GetThreadAtIndex(0).get();
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (exe_ctx.thread)
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                exe_ctx.frame = exe_ctx.thread->GetCurrentFrame().get();
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (exe_ctx.frame == NULL)
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    exe_ctx.frame = exe_ctx.thread->GetStackFrameAtIndex (0).get();
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return exe_ctx;
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSourceManager &
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::GetSourceManager ()
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_source_manager;
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetList&
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::GetTargetList ()
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target_list;
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::DispatchInputCallback (void *baton, const void *bytes, size_t bytes_len)
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ((Debugger *)baton)->DispatchInput ((char *)bytes, bytes_len);
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::DispatchInput (const char *bytes, size_t bytes_len)
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (bytes == NULL || bytes_len == 0)
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // TODO: implement the STDIO to the process as an input reader...
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    TargetSP target = GetCurrentTarget();
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (target.get() != NULL)
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ProcessSP process_sp = target->GetProcessSP();
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (process_sp.get() != NULL
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            && StateIsRunningState (process_sp->GetState()))
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Error error;
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (process_sp->PutSTDIN (bytes, bytes_len, error) == bytes_len)
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return;
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    WriteToDefaultReader (bytes, bytes_len);
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::WriteToDefaultReader (const char *bytes, size_t bytes_len)
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (bytes && bytes_len)
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_input_reader_data.append (bytes, bytes_len);
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_input_reader_data.empty())
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    while (!m_input_readers.empty() && !m_input_reader_data.empty())
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        while (CheckIfTopInputReaderIsDone ())
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            /* Do nothing. */;
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Get the input reader from the top of the stack
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        InputReaderSP reader_sp(m_input_readers.top());
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!reader_sp)
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34053d68e749f0715691a95f23e9490d97e484b15daGreg Clayton        size_t bytes_handled = reader_sp->HandleRawBytes (m_input_reader_data.c_str(),
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          m_input_reader_data.size());
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (bytes_handled)
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_input_reader_data.erase (0, bytes_handled);
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // No bytes were handled, we might not have reached our
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // granularity, just return and wait for more data
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Flush out any input readers that are donesvn
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    while (CheckIfTopInputReaderIsDone ())
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        /* Do nothing. */;
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::PushInputReader (const InputReaderSP& reader_sp)
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!reader_sp)
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!m_input_readers.empty())
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Deactivate the old top reader
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        InputReaderSP top_reader_sp (m_input_readers.top());
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (top_reader_sp)
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            top_reader_sp->Notify (eInputReaderDeactivate);
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_input_readers.push (reader_sp);
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    reader_sp->Notify (eInputReaderActivate);
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ActivateInputReader (reader_sp);
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::PopInputReader (const lldb::InputReaderSP& pop_reader_sp)
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool result = false;
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // The reader on the stop of the stack is done, so let the next
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // read on the stack referesh its prompt and if there is one...
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!m_input_readers.empty())
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        InputReaderSP reader_sp(m_input_readers.top());
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!pop_reader_sp || pop_reader_sp.get() == reader_sp.get())
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_input_readers.pop ();
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            reader_sp->Notify (eInputReaderDeactivate);
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            reader_sp->Notify (eInputReaderDone);
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result = true;
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (!m_input_readers.empty())
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                reader_sp = m_input_readers.top();
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (reader_sp)
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    ActivateInputReader (reader_sp);
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    reader_sp->Notify (eInputReaderReactivate);
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return result;
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::CheckIfTopInputReaderIsDone ()
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool result = false;
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!m_input_readers.empty())
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        InputReaderSP reader_sp(m_input_readers.top());
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (reader_sp && reader_sp->IsDone())
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result = true;
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            PopInputReader (reader_sp);
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return result;
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::ActivateInputReader (const InputReaderSP &reader_sp)
42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FILE *in_fh = GetInputFileHandle();
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (in_fh)
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        struct termios in_fh_termios;
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        int in_fd = fileno (in_fh);
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (::tcgetattr(in_fd, &in_fh_termios) == 0)
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (reader_sp->GetEcho())
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                in_fh_termios.c_lflag |= ECHO;  // Turn on echoing
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                in_fh_termios.c_lflag &= ~ECHO; // Turn off echoing
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            switch (reader_sp->GetGranularity())
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case eInputReaderGranularityByte:
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case eInputReaderGranularityWord:
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                in_fh_termios.c_lflag &= ~ICANON;   // Get one char at a time
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case eInputReaderGranularityLine:
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case eInputReaderGranularityAll:
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                in_fh_termios.c_lflag |= ICANON;   // Get lines at a time
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            default:
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ::tcsetattr (in_fd, TCSANOW, &in_fh_termios);
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
46163094e0bb161580564954dee512955c1c79d3476Greg Clayton
46263094e0bb161580564954dee512955c1c79d3476Greg Claytonvoid
46363094e0bb161580564954dee512955c1c79d3476Greg ClaytonDebugger::UpdateExecutionContext (ExecutionContext *override_context)
46463094e0bb161580564954dee512955c1c79d3476Greg Clayton{
46563094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_exe_ctx.Clear();
46663094e0bb161580564954dee512955c1c79d3476Greg Clayton
46763094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (override_context != NULL)
46863094e0bb161580564954dee512955c1c79d3476Greg Clayton    {
46963094e0bb161580564954dee512955c1c79d3476Greg Clayton        m_exe_ctx.target = override_context->target;
47063094e0bb161580564954dee512955c1c79d3476Greg Clayton        m_exe_ctx.process = override_context->process;
47163094e0bb161580564954dee512955c1c79d3476Greg Clayton        m_exe_ctx.thread = override_context->thread;
47263094e0bb161580564954dee512955c1c79d3476Greg Clayton        m_exe_ctx.frame = override_context->frame;
47363094e0bb161580564954dee512955c1c79d3476Greg Clayton    }
47463094e0bb161580564954dee512955c1c79d3476Greg Clayton    else
47563094e0bb161580564954dee512955c1c79d3476Greg Clayton    {
47663094e0bb161580564954dee512955c1c79d3476Greg Clayton        TargetSP target_sp (GetCurrentTarget());
47763094e0bb161580564954dee512955c1c79d3476Greg Clayton        if (target_sp)
47863094e0bb161580564954dee512955c1c79d3476Greg Clayton        {
47963094e0bb161580564954dee512955c1c79d3476Greg Clayton            m_exe_ctx.target = target_sp.get();
48063094e0bb161580564954dee512955c1c79d3476Greg Clayton            m_exe_ctx.process = target_sp->GetProcessSP().get();
48163094e0bb161580564954dee512955c1c79d3476Greg Clayton            if (m_exe_ctx.process && m_exe_ctx.process->IsRunning() == false)
48263094e0bb161580564954dee512955c1c79d3476Greg Clayton            {
48363094e0bb161580564954dee512955c1c79d3476Greg Clayton                m_exe_ctx.thread = m_exe_ctx.process->GetThreadList().GetCurrentThread().get();
48463094e0bb161580564954dee512955c1c79d3476Greg Clayton                if (m_exe_ctx.thread == NULL)
48563094e0bb161580564954dee512955c1c79d3476Greg Clayton                    m_exe_ctx.thread = m_exe_ctx.process->GetThreadList().GetThreadAtIndex(0).get();
48663094e0bb161580564954dee512955c1c79d3476Greg Clayton                if (m_exe_ctx.thread)
48763094e0bb161580564954dee512955c1c79d3476Greg Clayton                {
48863094e0bb161580564954dee512955c1c79d3476Greg Clayton                    m_exe_ctx.frame = m_exe_ctx.thread->GetCurrentFrame().get();
48963094e0bb161580564954dee512955c1c79d3476Greg Clayton                    if (m_exe_ctx.frame == NULL)
49063094e0bb161580564954dee512955c1c79d3476Greg Clayton                        m_exe_ctx.frame = m_exe_ctx.thread->GetStackFrameAtIndex (0).get();
49163094e0bb161580564954dee512955c1c79d3476Greg Clayton                }
49263094e0bb161580564954dee512955c1c79d3476Greg Clayton            }
49363094e0bb161580564954dee512955c1c79d3476Greg Clayton        }
49463094e0bb161580564954dee512955c1c79d3476Greg Clayton    }
49563094e0bb161580564954dee512955c1c79d3476Greg Clayton}
49663094e0bb161580564954dee512955c1c79d3476Greg Clayton
497558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline TiceDebuggerSP
498558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline TiceDebugger::FindDebuggerWithID (lldb::user_id_t id)
499558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice{
500558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice    lldb::DebuggerSP debugger_sp;
501558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice
502558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice    Mutex::Locker locker (GetDebuggerListMutex ());
503558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice    DebuggerList &debugger_list = GetDebuggerList();
504558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice    DebuggerList::iterator pos, end = debugger_list.end();
505558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice    for (pos = debugger_list.begin(); pos != end; ++pos)
506558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice    {
507558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice        if ((*pos).get()->GetID() == id)
508558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice        {
509558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice            debugger_sp = *pos;
510558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice            break;
511558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice        }
512558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice    }
513558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice    return debugger_sp;
514558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice}
515