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