Debugger.cpp revision 6e4c5ce0f697eb9899a54854a2a9004e961b0de2
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
1016e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticelldb::DebuggerSP
1026e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebugger::FindDebuggerWithInstanceName (const ConstString &instance_name)
1036e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
1046e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    lldb::DebuggerSP debugger_sp;
1056e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
1066e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    Mutex::Locker locker (GetDebuggerListMutex ());
1076e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    DebuggerList &debugger_list = GetDebuggerList();
1086e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    DebuggerList::iterator pos, end = debugger_list.end();
1096e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
1106e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    for (pos = debugger_list.begin(); pos != end; ++pos)
1116e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {
1126e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        if ((*pos).get()->m_instance_name == instance_name)
1136e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        {
1146e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice            debugger_sp = *pos;
1156e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice            break;
1166e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        }
1176e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    }
1186e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    return debugger_sp;
1196e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
12063094e0bb161580564954dee512955c1c79d3476Greg Clayton
12163094e0bb161580564954dee512955c1c79d3476Greg ClaytonTargetSP
12263094e0bb161580564954dee512955c1c79d3476Greg ClaytonDebugger::FindTargetWithProcessID (lldb::pid_t pid)
12363094e0bb161580564954dee512955c1c79d3476Greg Clayton{
12463094e0bb161580564954dee512955c1c79d3476Greg Clayton    lldb::TargetSP target_sp;
12563094e0bb161580564954dee512955c1c79d3476Greg Clayton    Mutex::Locker locker (GetDebuggerListMutex ());
12663094e0bb161580564954dee512955c1c79d3476Greg Clayton    DebuggerList &debugger_list = GetDebuggerList();
12763094e0bb161580564954dee512955c1c79d3476Greg Clayton    DebuggerList::iterator pos, end = debugger_list.end();
12863094e0bb161580564954dee512955c1c79d3476Greg Clayton    for (pos = debugger_list.begin(); pos != end; ++pos)
12963094e0bb161580564954dee512955c1c79d3476Greg Clayton    {
13063094e0bb161580564954dee512955c1c79d3476Greg Clayton        target_sp = (*pos)->GetTargetList().FindTargetWithProcessID (pid);
13163094e0bb161580564954dee512955c1c79d3476Greg Clayton        if (target_sp)
13263094e0bb161580564954dee512955c1c79d3476Greg Clayton            break;
13363094e0bb161580564954dee512955c1c79d3476Greg Clayton    }
13463094e0bb161580564954dee512955c1c79d3476Greg Clayton    return target_sp;
13563094e0bb161580564954dee512955c1c79d3476Greg Clayton}
13663094e0bb161580564954dee512955c1c79d3476Greg Clayton
13763094e0bb161580564954dee512955c1c79d3476Greg Clayton
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::Debugger () :
139558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice    UserID (g_unique_id++),
1406e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    DebuggerInstanceSettings (*(Debugger::GetSettingsController().get())),
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_input_comm("debugger.input"),
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_input_file (),
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_output_file (),
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_error_file (),
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_list (),
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_listener ("lldb.Debugger"),
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_source_manager (),
14863094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_command_interpreter_ap (new CommandInterpreter (*this, eScriptLanguageDefault, false)),
14963094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_exe_ctx (),
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_input_readers (),
15174989e88af7e04f3fe0bb3a800163113d7e0ca12Jim Ingham    m_input_reader_data (),
15274989e88af7e04f3fe0bb3a800163113d7e0ca12Jim Ingham    m_use_external_editor(false)
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
15463094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_command_interpreter_ap->Initialize ();
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::~Debugger ()
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
15963094e0bb161580564954dee512955c1c79d3476Greg Clayton    int num_targets = m_target_list.GetNumTargets();
16063094e0bb161580564954dee512955c1c79d3476Greg Clayton    for (int i = 0; i < num_targets; i++)
16163094e0bb161580564954dee512955c1c79d3476Greg Clayton    {
16263094e0bb161580564954dee512955c1c79d3476Greg Clayton        ProcessSP process_sp (m_target_list.GetTargetAtIndex (i)->GetProcessSP());
16363094e0bb161580564954dee512955c1c79d3476Greg Clayton        if (process_sp)
16463094e0bb161580564954dee512955c1c79d3476Greg Clayton            process_sp->Destroy();
16563094e0bb161580564954dee512955c1c79d3476Greg Clayton    }
16663094e0bb161580564954dee512955c1c79d3476Greg Clayton    DisconnectInput();
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::GetAsyncExecution ()
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
17363094e0bb161580564954dee512955c1c79d3476Greg Clayton    return !m_command_interpreter_ap->GetSynchronous();
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::SetAsyncExecution (bool async_execution)
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
17963094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_command_interpreter_ap->SetSynchronous (!async_execution);
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::DisconnectInput()
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_input_comm.Clear ();
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::SetInputFileHandle (FILE *fh, bool tranfer_ownership)
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_input_file.SetFileHandle (fh, tranfer_ownership);
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_input_file.GetFileHandle() == NULL)
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_input_file.SetFileHandle (stdin, false);
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Disconnect from any old connection if we had one
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_input_comm.Disconnect ();
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_input_comm.SetConnection (new ConnectionFileDescriptor (::fileno (GetInputFileHandle()), true));
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_input_comm.SetReadThreadBytesReceivedCallback (Debugger::DispatchInputCallback, this);
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error error;
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_input_comm.StartReadThread (&error) == false)
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        FILE *err_fh = GetErrorFileHandle();
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (err_fh)
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ::fprintf (err_fh, "error: failed to main input read thread: %s", error.AsCString() ? error.AsCString() : "unkown error");
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            exit(1);
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFILE *
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::GetInputFileHandle ()
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_input_file.GetFileHandle();
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::SetOutputFileHandle (FILE *fh, bool tranfer_ownership)
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_output_file.SetFileHandle (fh, tranfer_ownership);
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_output_file.GetFileHandle() == NULL)
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_output_file.SetFileHandle (stdin, false);
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFILE *
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::GetOutputFileHandle ()
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_output_file.GetFileHandle();
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::SetErrorFileHandle (FILE *fh, bool tranfer_ownership)
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_error_file.SetFileHandle (fh, tranfer_ownership);
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_error_file.GetFileHandle() == NULL)
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_error_file.SetFileHandle (stdin, false);
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFILE *
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::GetErrorFileHandle ()
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_error_file.GetFileHandle();
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter &
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::GetCommandInterpreter ()
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
25263094e0bb161580564954dee512955c1c79d3476Greg Clayton    assert (m_command_interpreter_ap.get());
25363094e0bb161580564954dee512955c1c79d3476Greg Clayton    return *m_command_interpreter_ap;
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerListener &
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::GetListener ()
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_listener;
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetSP
264c833295baeec641086f536e78050388af36784f8Jim InghamDebugger::GetSelectedTarget ()
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
266c833295baeec641086f536e78050388af36784f8Jim Ingham    return m_target_list.GetSelectedTarget ();
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerExecutionContext
270c833295baeec641086f536e78050388af36784f8Jim InghamDebugger::GetSelectedExecutionContext ()
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ExecutionContext exe_ctx;
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    exe_ctx.Clear();
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
275c833295baeec641086f536e78050388af36784f8Jim Ingham    lldb::TargetSP target_sp = GetSelectedTarget();
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    exe_ctx.target = target_sp.get();
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (target_sp)
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        exe_ctx.process = target_sp->GetProcessSP().get();
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (exe_ctx.process && exe_ctx.process->IsRunning() == false)
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
283c833295baeec641086f536e78050388af36784f8Jim Ingham            exe_ctx.thread = exe_ctx.process->GetThreadList().GetSelectedThread().get();
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (exe_ctx.thread == NULL)
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                exe_ctx.thread = exe_ctx.process->GetThreadList().GetThreadAtIndex(0).get();
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (exe_ctx.thread)
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
288c833295baeec641086f536e78050388af36784f8Jim Ingham                exe_ctx.frame = exe_ctx.thread->GetSelectedFrame().get();
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (exe_ctx.frame == NULL)
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    exe_ctx.frame = exe_ctx.thread->GetStackFrameAtIndex (0).get();
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return exe_ctx;
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSourceManager &
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::GetSourceManager ()
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_source_manager;
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetList&
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::GetTargetList ()
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target_list;
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::DispatchInputCallback (void *baton, const void *bytes, size_t bytes_len)
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ((Debugger *)baton)->DispatchInput ((char *)bytes, bytes_len);
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::DispatchInput (const char *bytes, size_t bytes_len)
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (bytes == NULL || bytes_len == 0)
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // TODO: implement the STDIO to the process as an input reader...
325c833295baeec641086f536e78050388af36784f8Jim Ingham    TargetSP target = GetSelectedTarget();
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (target.get() != NULL)
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ProcessSP process_sp = target->GetProcessSP();
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (process_sp.get() != NULL
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            && StateIsRunningState (process_sp->GetState()))
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Error error;
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (process_sp->PutSTDIN (bytes, bytes_len, error) == bytes_len)
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return;
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    WriteToDefaultReader (bytes, bytes_len);
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::WriteToDefaultReader (const char *bytes, size_t bytes_len)
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (bytes && bytes_len)
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_input_reader_data.append (bytes, bytes_len);
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_input_reader_data.empty())
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    while (!m_input_readers.empty() && !m_input_reader_data.empty())
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        while (CheckIfTopInputReaderIsDone ())
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            /* Do nothing. */;
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Get the input reader from the top of the stack
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        InputReaderSP reader_sp(m_input_readers.top());
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!reader_sp)
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36153d68e749f0715691a95f23e9490d97e484b15daGreg Clayton        size_t bytes_handled = reader_sp->HandleRawBytes (m_input_reader_data.c_str(),
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          m_input_reader_data.size());
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (bytes_handled)
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_input_reader_data.erase (0, bytes_handled);
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // No bytes were handled, we might not have reached our
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // granularity, just return and wait for more data
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Flush out any input readers that are donesvn
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    while (CheckIfTopInputReaderIsDone ())
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        /* Do nothing. */;
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::PushInputReader (const InputReaderSP& reader_sp)
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!reader_sp)
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!m_input_readers.empty())
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Deactivate the old top reader
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        InputReaderSP top_reader_sp (m_input_readers.top());
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (top_reader_sp)
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            top_reader_sp->Notify (eInputReaderDeactivate);
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_input_readers.push (reader_sp);
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    reader_sp->Notify (eInputReaderActivate);
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ActivateInputReader (reader_sp);
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::PopInputReader (const lldb::InputReaderSP& pop_reader_sp)
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool result = false;
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // The reader on the stop of the stack is done, so let the next
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // read on the stack referesh its prompt and if there is one...
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!m_input_readers.empty())
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        InputReaderSP reader_sp(m_input_readers.top());
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!pop_reader_sp || pop_reader_sp.get() == reader_sp.get())
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_input_readers.pop ();
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            reader_sp->Notify (eInputReaderDeactivate);
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            reader_sp->Notify (eInputReaderDone);
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result = true;
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (!m_input_readers.empty())
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                reader_sp = m_input_readers.top();
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (reader_sp)
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    ActivateInputReader (reader_sp);
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    reader_sp->Notify (eInputReaderReactivate);
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return result;
42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::CheckIfTopInputReaderIsDone ()
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool result = false;
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!m_input_readers.empty())
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        InputReaderSP reader_sp(m_input_readers.top());
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (reader_sp && reader_sp->IsDone())
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result = true;
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            PopInputReader (reader_sp);
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return result;
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::ActivateInputReader (const InputReaderSP &reader_sp)
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FILE *in_fh = GetInputFileHandle();
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (in_fh)
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        struct termios in_fh_termios;
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        int in_fd = fileno (in_fh);
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (::tcgetattr(in_fd, &in_fh_termios) == 0)
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (reader_sp->GetEcho())
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                in_fh_termios.c_lflag |= ECHO;  // Turn on echoing
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                in_fh_termios.c_lflag &= ~ECHO; // Turn off echoing
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            switch (reader_sp->GetGranularity())
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case eInputReaderGranularityByte:
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case eInputReaderGranularityWord:
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                in_fh_termios.c_lflag &= ~ICANON;   // Get one char at a time
46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case eInputReaderGranularityLine:
47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case eInputReaderGranularityAll:
47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                in_fh_termios.c_lflag |= ICANON;   // Get lines at a time
47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            default:
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ::tcsetattr (in_fd, TCSANOW, &in_fh_termios);
47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
48263094e0bb161580564954dee512955c1c79d3476Greg Clayton
48363094e0bb161580564954dee512955c1c79d3476Greg Claytonvoid
48463094e0bb161580564954dee512955c1c79d3476Greg ClaytonDebugger::UpdateExecutionContext (ExecutionContext *override_context)
48563094e0bb161580564954dee512955c1c79d3476Greg Clayton{
48663094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_exe_ctx.Clear();
48763094e0bb161580564954dee512955c1c79d3476Greg Clayton
48863094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (override_context != NULL)
48963094e0bb161580564954dee512955c1c79d3476Greg Clayton    {
49063094e0bb161580564954dee512955c1c79d3476Greg Clayton        m_exe_ctx.target = override_context->target;
49163094e0bb161580564954dee512955c1c79d3476Greg Clayton        m_exe_ctx.process = override_context->process;
49263094e0bb161580564954dee512955c1c79d3476Greg Clayton        m_exe_ctx.thread = override_context->thread;
49363094e0bb161580564954dee512955c1c79d3476Greg Clayton        m_exe_ctx.frame = override_context->frame;
49463094e0bb161580564954dee512955c1c79d3476Greg Clayton    }
49563094e0bb161580564954dee512955c1c79d3476Greg Clayton    else
49663094e0bb161580564954dee512955c1c79d3476Greg Clayton    {
497c833295baeec641086f536e78050388af36784f8Jim Ingham        TargetSP target_sp (GetSelectedTarget());
49863094e0bb161580564954dee512955c1c79d3476Greg Clayton        if (target_sp)
49963094e0bb161580564954dee512955c1c79d3476Greg Clayton        {
50063094e0bb161580564954dee512955c1c79d3476Greg Clayton            m_exe_ctx.target = target_sp.get();
50163094e0bb161580564954dee512955c1c79d3476Greg Clayton            m_exe_ctx.process = target_sp->GetProcessSP().get();
502c5b15db9b9e17233c4dc35c9ff3539a0266465f0Johnny Chen            if (m_exe_ctx.process && m_exe_ctx.process->IsAlive() && !m_exe_ctx.process->IsRunning())
50363094e0bb161580564954dee512955c1c79d3476Greg Clayton            {
504c833295baeec641086f536e78050388af36784f8Jim Ingham                m_exe_ctx.thread = m_exe_ctx.process->GetThreadList().GetSelectedThread().get();
50563094e0bb161580564954dee512955c1c79d3476Greg Clayton                if (m_exe_ctx.thread == NULL)
50663094e0bb161580564954dee512955c1c79d3476Greg Clayton                    m_exe_ctx.thread = m_exe_ctx.process->GetThreadList().GetThreadAtIndex(0).get();
50763094e0bb161580564954dee512955c1c79d3476Greg Clayton                if (m_exe_ctx.thread)
50863094e0bb161580564954dee512955c1c79d3476Greg Clayton                {
509c833295baeec641086f536e78050388af36784f8Jim Ingham                    m_exe_ctx.frame = m_exe_ctx.thread->GetSelectedFrame().get();
51063094e0bb161580564954dee512955c1c79d3476Greg Clayton                    if (m_exe_ctx.frame == NULL)
51163094e0bb161580564954dee512955c1c79d3476Greg Clayton                        m_exe_ctx.frame = m_exe_ctx.thread->GetStackFrameAtIndex (0).get();
51263094e0bb161580564954dee512955c1c79d3476Greg Clayton                }
51363094e0bb161580564954dee512955c1c79d3476Greg Clayton            }
51463094e0bb161580564954dee512955c1c79d3476Greg Clayton        }
51563094e0bb161580564954dee512955c1c79d3476Greg Clayton    }
51663094e0bb161580564954dee512955c1c79d3476Greg Clayton}
51763094e0bb161580564954dee512955c1c79d3476Greg Clayton
518558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline TiceDebuggerSP
519558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline TiceDebugger::FindDebuggerWithID (lldb::user_id_t id)
520558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice{
521558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice    lldb::DebuggerSP debugger_sp;
522558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice
523558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice    Mutex::Locker locker (GetDebuggerListMutex ());
524558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice    DebuggerList &debugger_list = GetDebuggerList();
525558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice    DebuggerList::iterator pos, end = debugger_list.end();
526558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice    for (pos = debugger_list.begin(); pos != end; ++pos)
527558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice    {
528558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice        if ((*pos).get()->GetID() == id)
529558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice        {
530558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice            debugger_sp = *pos;
531558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice            break;
532558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice        }
533558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice    }
534558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice    return debugger_sp;
535558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice}
5366e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
5376e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticelldb::UserSettingsControllerSP &
5386e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebugger::GetSettingsController (bool finish)
5396e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
5406e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    static lldb::UserSettingsControllerSP g_settings_controller (new DebuggerSettingsController);
5416e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    static bool initialized = false;
5426e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
5436e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    if (!initialized)
5446e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {
5456e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        UserSettingsControllerSP parent = g_settings_controller->GetParent();
5466e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        if (parent)
5476e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice            parent->RegisterChild (g_settings_controller);
5486e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
5496e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        g_settings_controller->CreateSettingsVector (Debugger::DebuggerSettingsController::global_settings_table,
5506e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                     true);
5516e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        g_settings_controller->CreateSettingsVector (Debugger::DebuggerSettingsController::instance_settings_table,
5526e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                     false);
5536e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
5546e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice	g_settings_controller->InitializeGlobalVariables ();
5556e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        g_settings_controller->CreateDefaultInstanceSettings ();
5566e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice	initialized = true;
5576e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    }
5586e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
5596e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    if (finish)
5606e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {
5616e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        UserSettingsControllerSP parent = g_settings_controller->GetParent();
5626e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        if (parent)
5636e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice            parent->RemoveChild (g_settings_controller);
5646e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        g_settings_controller.reset();
5656e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    }
5666e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    return g_settings_controller;
5676e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
5686e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
5696e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//--------------------------------------------------
5706e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice// class Debugger::DebuggerSettingsController
5716e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//--------------------------------------------------
5726e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
5736e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebugger::DebuggerSettingsController::DebuggerSettingsController () :
5746e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    UserSettingsController ("", lldb::UserSettingsControllerSP()),
5756e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    m_term_width (80)
5766e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
5776e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    m_default_settings.reset (new DebuggerInstanceSettings (*this, InstanceSettings::GetDefaultName().AsCString()));
5786e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
5796e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
5806e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebugger::DebuggerSettingsController::~DebuggerSettingsController ()
5816e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
5826e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
5836e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
5846e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
5856e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticelldb::InstanceSettingsSP
5866e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebugger::DebuggerSettingsController::CreateNewInstanceSettings ()
5876e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
5886e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    DebuggerInstanceSettings *new_settings = new DebuggerInstanceSettings (*(Debugger::GetSettingsController().get()));
5896e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    lldb::InstanceSettingsSP new_settings_sp (new_settings);
5906e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    return new_settings_sp;
5916e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
5926e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
5936e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticebool
5946e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebugger::DebuggerSettingsController::ValidTermWidthValue (const char *value, Error err)
5956e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
5966e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    bool valid = true;
5976e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
5986e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    // Verify we have a value string.
5996e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    if (value == NULL
6006e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        || strlen (value) == 0)
6016e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {
6026e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        valid = false;
6036e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        err.SetErrorString ("Missing value.  Can't set terminal width without a value.\n");
6046e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    }
6056e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
6066e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    // Verify the string consists entirely of digits.
6076e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    if (valid)
6086e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {
6096e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        int len = strlen (value);
6106e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        for (int i = 0; i < len; ++i)
6116e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice            if (! isdigit (value[i]))
6126e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice            {
6136e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                valid = false;
6146e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                err.SetErrorStringWithFormat ("'%s' is not a valid representation of an integer.\n", value);
6156e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice            }
6166e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    }
6176e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
6186e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    // Verify the term-width is 'reasonable' (e.g. 10 <= width <= 250).
6196e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    if (valid)
6206e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {
6216e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        int width = atoi (value);
6226e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        if (width < 10
6236e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice            || width > 250)
6246e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        {
6256e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice            valid = false;
6266e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice            err.SetErrorString ("Invalid term-width value; value must be between 10 and 250.\n");
6276e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        }
6286e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    }
6296e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
6306e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    return valid;
6316e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
6326e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
6336e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
6346e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//--------------------------------------------------
6356e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//  class DebuggerInstanceSettings
6366e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//--------------------------------------------------
6376e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
6386e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebuggerInstanceSettings::DebuggerInstanceSettings (UserSettingsController &owner, const char *name) :
6396e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    InstanceSettings (owner, (name == NULL ? CreateInstanceName ().AsCString() : name)),
6406e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    m_prompt (),
6416e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    m_script_lang ()
6426e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
6436e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    if (name == NULL)
6446e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {
6456e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        const lldb::InstanceSettingsSP &pending_settings = m_owner.FindPendingSettings (m_instance_name);
6466e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        CopyInstanceSettings (pending_settings, false);
6476e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        m_owner.RemovePendingSettings (m_instance_name);
6486e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    }
6496e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
6506e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
6516e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebuggerInstanceSettings::DebuggerInstanceSettings (const DebuggerInstanceSettings &rhs) :
6526e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    InstanceSettings (*(Debugger::GetSettingsController().get()), CreateInstanceName ().AsCString()),
6536e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    m_prompt (rhs.m_prompt),
6546e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    m_script_lang (rhs.m_script_lang)
6556e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
6566e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    const lldb::InstanceSettingsSP &pending_settings = m_owner.FindPendingSettings (m_instance_name);
6576e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    CopyInstanceSettings (pending_settings, false);
6586e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    m_owner.RemovePendingSettings (m_instance_name);
6596e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
6606e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
6616e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebuggerInstanceSettings::~DebuggerInstanceSettings ()
6626e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
6636e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
6646e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
6656e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebuggerInstanceSettings&
6666e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebuggerInstanceSettings::operator= (const DebuggerInstanceSettings &rhs)
6676e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
6686e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    if (this != &rhs)
6696e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {
6706e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        m_prompt = rhs.m_prompt;
6716e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        m_script_lang = rhs.m_script_lang;
6726e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    }
6736e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
6746e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    return *this;
6756e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
6766e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
6776e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticevoid
6786e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebuggerInstanceSettings::UpdateInstanceSettingsVariable (const ConstString &var_name,
6796e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                          const char *index_value,
6806e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                          const char *value,
6816e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                          const ConstString &instance_name,
6826e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                          const SettingEntry &entry,
6836e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                          lldb::VarSetOperationType op,
6846e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                          Error &err,
6856e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                          bool pending)
6866e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
6876e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    if (var_name == PromptVarName())
6886e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {
6896e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice      UserSettingsController::UpdateStringVariable (op, m_prompt, value, err);
6906e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        if (!pending)
6916e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        {
6926e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice            BroadcastPromptChange (instance_name, m_prompt.c_str());
6936e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        }
6946e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    }
6956e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    else if (var_name == ScriptLangVarName())
6966e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {
6976e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        bool success;
6986e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        m_script_lang = Args::StringToScriptLanguage (value, eScriptLanguageDefault,
6996e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                      &success);
7006e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    }
7016e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
7026e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
7036e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticevoid
7046e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebugger::DebuggerSettingsController::UpdateGlobalVariable (const ConstString &var_name,
7056e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                            const char *index_value,
7066e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                            const char *value,
7076e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                            const SettingEntry &entry,
7086e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                            lldb::VarSetOperationType op,
7096e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                            Error &err)
7106e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
7116e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    static ConstString term_width_name ("term-width");
7126e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
7136e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    if (var_name == term_width_name)
7146e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {
7156e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        if (ValidTermWidthValue (value, err))
7166e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        {
7176e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice            m_term_width = atoi (value);
7186e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        }
7196e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    }
7206e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
7216e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
7226e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticevoid
7236e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebuggerInstanceSettings::GetInstanceSettingsValue (const SettingEntry &entry,
7246e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                    const ConstString &var_name,
7256e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                    StringList &value)
7266e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
7276e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    if (var_name == PromptVarName())
7286e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {
7296e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        value.AppendString (m_prompt.c_str());
7306e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
7316e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    }
7326e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    else if (var_name == ScriptLangVarName())
7336e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {
7346e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        value.AppendString (ScriptInterpreter::LanguageToString (m_script_lang).c_str());
7356e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    }
7366e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
7376e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
7386e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticevoid
7396e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebuggerInstanceSettings::CopyInstanceSettings (const lldb::InstanceSettingsSP &new_settings,
7406e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                bool pending)
7416e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
7426e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    if (new_settings.get() == NULL)
7436e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        return;
7446e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
7456e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    DebuggerInstanceSettings *new_debugger_settings = (DebuggerInstanceSettings *) new_settings.get();
7466e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
7476e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    m_prompt = new_debugger_settings->m_prompt;
7486e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    if (!pending)
7496e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        BroadcastPromptChange (m_instance_name, m_prompt.c_str());
7506e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
7516e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    m_script_lang = new_debugger_settings->m_script_lang;
7526e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
7536e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
7546e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticevoid
7556e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebugger::DebuggerSettingsController::GetGlobalSettingsValue (const ConstString &var_name,
7566e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                                              StringList &value)
7576e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
7586e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    static ConstString term_width_name ("term-width");
7596e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
7606e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    if (var_name == term_width_name)
7616e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {
7626e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        StreamString width_str;
7636e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        width_str.Printf ("%d", m_term_width);
7646e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        value.AppendString (width_str.GetData());
7656e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    }
7666e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
7676e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
7686e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticebool
7696e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebuggerInstanceSettings::BroadcastPromptChange (const ConstString &instance_name, const char *new_prompt)
7706e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
7716e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    std::string tmp_prompt;
7726e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
7736e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    if (new_prompt != NULL)
7746e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {
7756e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        tmp_prompt = new_prompt ;
7766e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        int len = tmp_prompt.size();
7776e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        if (len > 1
7786e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice            && (tmp_prompt[0] == '\'' || tmp_prompt[0] == '"')
7796e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice            && (tmp_prompt[len-1] == tmp_prompt[0]))
7806e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        {
7816e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice            tmp_prompt = tmp_prompt.substr(1,len-2);
7826e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        }
7836e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        len = tmp_prompt.size();
7846e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        if (tmp_prompt[len-1] != ' ')
7856e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice            tmp_prompt.append(" ");
7866e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    }
7876e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    EventSP new_event_sp;
7886e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    new_event_sp.reset (new Event(CommandInterpreter::eBroadcastBitResetPrompt,
7896e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice                                  new EventDataBytes (tmp_prompt.c_str())));
7906e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
7916e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    if (instance_name.GetLength() != 0)
7926e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {
7936e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        // Set prompt for a particular instance.
7946e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        Debugger *dbg = Debugger::FindDebuggerWithInstanceName (instance_name).get();
7956e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        if (dbg != NULL)
7966e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        {
7976e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice            dbg->GetCommandInterpreter().BroadcastEvent (new_event_sp);
7986e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice        }
7996e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    }
8006e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
8016e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    return true;
8026e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
8036e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
8046e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticeconst ConstString
8056e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebuggerInstanceSettings::CreateInstanceName ()
8066e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
8076e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    static int instance_count = 1;
8086e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    StreamString sstr;
8096e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
8106e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    sstr.Printf ("debugger_%d", instance_count);
8116e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    ++instance_count;
8126e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
8136e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    const ConstString ret_val (sstr.GetData());
8146e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
8156e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    return ret_val;
8166e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
8176e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
8186e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticeconst ConstString &
8196e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebuggerInstanceSettings::PromptVarName ()
8206e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
8216e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    static ConstString prompt_var_name ("prompt");
8226e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
8236e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    return prompt_var_name;
8246e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
8256e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
8266e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticeconst ConstString &
8276e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebuggerInstanceSettings::ScriptLangVarName ()
8286e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
8296e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    static ConstString script_lang_var_name ("script-lang");
8306e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
8316e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    return script_lang_var_name;
8326e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}
8336e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
8346e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//--------------------------------------------------
8356e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice// DebuggerSettingsController Variable Tables
8366e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//--------------------------------------------------
8376e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
8386e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
8396e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceSettingEntry
8406e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebugger::DebuggerSettingsController::global_settings_table[] =
8416e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
8426e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice  //{ "var-name",    var-type,      "default", enum-table, init'd, hidden, "help-text"},
8436e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    { "term-width" , eSetVarTypeInt, "80"    , NULL,       false , false , "The maximum number of columns to use for displaying text." },
8446e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {  NULL, eSetVarTypeNone, NULL, NULL, 0, 0, NULL }
8456e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice};
8466e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
8476e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
8486e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
8496e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceSettingEntry
8506e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebugger::DebuggerSettingsController::instance_settings_table[] =
8516e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{
8526e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice  //{ "var-name",     var-type ,        "default", enum-table, init'd, hidden, "help-text"},
8536e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    { "script-lang" , eSetVarTypeString, "python", NULL,       false,  false,  "The script language to be used for evaluating user-written scripts." },
8546e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    { "prompt"      , eSetVarTypeString, "(lldb)", NULL,       false,  false,  "The debugger command line prompt displayed for the user." },
8556e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    {  NULL, eSetVarTypeNone, NULL, NULL, 0, 0, NULL }
8566e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice};
857