130fdc8d8SChris Lattner //===-- Debugger.cpp --------------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 330fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 430fdc8d8SChris Lattner // 530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 630fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 730fdc8d8SChris Lattner // 830fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 930fdc8d8SChris Lattner 1030fdc8d8SChris Lattner #include "lldb/lldb-private.h" 1130fdc8d8SChris Lattner #include "lldb/Core/ConnectionFileDescriptor.h" 1230fdc8d8SChris Lattner #include "lldb/Core/Debugger.h" 1330fdc8d8SChris Lattner #include "lldb/Core/InputReader.h" 1430fdc8d8SChris Lattner #include "lldb/Core/State.h" 1530fdc8d8SChris Lattner #include "lldb/Core/Timer.h" 166611103cSGreg Clayton #include "lldb/Interpreter/CommandInterpreter.h" 1730fdc8d8SChris Lattner #include "lldb/Target/TargetList.h" 1830fdc8d8SChris Lattner #include "lldb/Target/Process.h" 1930fdc8d8SChris Lattner #include "lldb/Target/Thread.h" 2030fdc8d8SChris Lattner 2130fdc8d8SChris Lattner 2230fdc8d8SChris Lattner using namespace lldb; 2330fdc8d8SChris Lattner using namespace lldb_private; 2430fdc8d8SChris Lattner 256611103cSGreg Clayton static uint32_t g_shared_debugger_refcount = 0; 2630fdc8d8SChris Lattner 27ebc1bb27SCaroline Tice static lldb::user_id_t g_unique_id = 1; 28ebc1bb27SCaroline Tice 2930fdc8d8SChris Lattner void 3030fdc8d8SChris Lattner Debugger::Initialize () 3130fdc8d8SChris Lattner { 326611103cSGreg Clayton if (g_shared_debugger_refcount == 0) 3330fdc8d8SChris Lattner lldb_private::Initialize(); 346611103cSGreg Clayton g_shared_debugger_refcount++; 3530fdc8d8SChris Lattner } 3630fdc8d8SChris Lattner 3730fdc8d8SChris Lattner void 3830fdc8d8SChris Lattner Debugger::Terminate () 3930fdc8d8SChris Lattner { 406611103cSGreg Clayton if (g_shared_debugger_refcount > 0) 416611103cSGreg Clayton { 4230fdc8d8SChris Lattner g_shared_debugger_refcount--; 4330fdc8d8SChris Lattner if (g_shared_debugger_refcount == 0) 4430fdc8d8SChris Lattner { 4530fdc8d8SChris Lattner lldb_private::WillTerminate(); 466611103cSGreg Clayton lldb_private::Terminate(); 476611103cSGreg Clayton } 4830fdc8d8SChris Lattner } 4930fdc8d8SChris Lattner } 5030fdc8d8SChris Lattner 516611103cSGreg Clayton typedef std::vector<DebuggerSP> DebuggerList; 526611103cSGreg Clayton 536611103cSGreg Clayton static Mutex & 546611103cSGreg Clayton GetDebuggerListMutex () 5530fdc8d8SChris Lattner { 566611103cSGreg Clayton static Mutex g_mutex(Mutex::eMutexTypeRecursive); 576611103cSGreg Clayton return g_mutex; 5830fdc8d8SChris Lattner } 5930fdc8d8SChris Lattner 606611103cSGreg Clayton static DebuggerList & 616611103cSGreg Clayton GetDebuggerList() 626611103cSGreg Clayton { 636611103cSGreg Clayton // hide the static debugger list inside a singleton accessor to avoid 646611103cSGreg Clayton // global init contructors 656611103cSGreg Clayton static DebuggerList g_list; 666611103cSGreg Clayton return g_list; 676611103cSGreg Clayton } 686611103cSGreg Clayton 696611103cSGreg Clayton 706611103cSGreg Clayton DebuggerSP 716611103cSGreg Clayton Debugger::CreateInstance () 726611103cSGreg Clayton { 736611103cSGreg Clayton DebuggerSP debugger_sp (new Debugger); 746611103cSGreg Clayton // Scope for locker 756611103cSGreg Clayton { 766611103cSGreg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 776611103cSGreg Clayton GetDebuggerList().push_back(debugger_sp); 786611103cSGreg Clayton } 796611103cSGreg Clayton return debugger_sp; 806611103cSGreg Clayton } 816611103cSGreg Clayton 826611103cSGreg Clayton lldb::DebuggerSP 836611103cSGreg Clayton Debugger::GetSP () 846611103cSGreg Clayton { 856611103cSGreg Clayton lldb::DebuggerSP debugger_sp; 866611103cSGreg Clayton 876611103cSGreg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 886611103cSGreg Clayton DebuggerList &debugger_list = GetDebuggerList(); 896611103cSGreg Clayton DebuggerList::iterator pos, end = debugger_list.end(); 906611103cSGreg Clayton for (pos = debugger_list.begin(); pos != end; ++pos) 916611103cSGreg Clayton { 926611103cSGreg Clayton if ((*pos).get() == this) 936611103cSGreg Clayton { 946611103cSGreg Clayton debugger_sp = *pos; 956611103cSGreg Clayton break; 966611103cSGreg Clayton } 976611103cSGreg Clayton } 986611103cSGreg Clayton return debugger_sp; 996611103cSGreg Clayton } 1006611103cSGreg Clayton 1013df9a8dfSCaroline Tice lldb::DebuggerSP 1023df9a8dfSCaroline Tice Debugger::FindDebuggerWithInstanceName (const ConstString &instance_name) 1033df9a8dfSCaroline Tice { 1043df9a8dfSCaroline Tice lldb::DebuggerSP debugger_sp; 1053df9a8dfSCaroline Tice 1063df9a8dfSCaroline Tice Mutex::Locker locker (GetDebuggerListMutex ()); 1073df9a8dfSCaroline Tice DebuggerList &debugger_list = GetDebuggerList(); 1083df9a8dfSCaroline Tice DebuggerList::iterator pos, end = debugger_list.end(); 1093df9a8dfSCaroline Tice 1103df9a8dfSCaroline Tice for (pos = debugger_list.begin(); pos != end; ++pos) 1113df9a8dfSCaroline Tice { 1123df9a8dfSCaroline Tice if ((*pos).get()->m_instance_name == instance_name) 1133df9a8dfSCaroline Tice { 1143df9a8dfSCaroline Tice debugger_sp = *pos; 1153df9a8dfSCaroline Tice break; 1163df9a8dfSCaroline Tice } 1173df9a8dfSCaroline Tice } 1183df9a8dfSCaroline Tice return debugger_sp; 1193df9a8dfSCaroline Tice } 1206611103cSGreg Clayton 1216611103cSGreg Clayton TargetSP 1226611103cSGreg Clayton Debugger::FindTargetWithProcessID (lldb::pid_t pid) 1236611103cSGreg Clayton { 1246611103cSGreg Clayton lldb::TargetSP target_sp; 1256611103cSGreg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 1266611103cSGreg Clayton DebuggerList &debugger_list = GetDebuggerList(); 1276611103cSGreg Clayton DebuggerList::iterator pos, end = debugger_list.end(); 1286611103cSGreg Clayton for (pos = debugger_list.begin(); pos != end; ++pos) 1296611103cSGreg Clayton { 1306611103cSGreg Clayton target_sp = (*pos)->GetTargetList().FindTargetWithProcessID (pid); 1316611103cSGreg Clayton if (target_sp) 1326611103cSGreg Clayton break; 1336611103cSGreg Clayton } 1346611103cSGreg Clayton return target_sp; 1356611103cSGreg Clayton } 1366611103cSGreg Clayton 1376611103cSGreg Clayton 13830fdc8d8SChris Lattner Debugger::Debugger () : 139ebc1bb27SCaroline Tice UserID (g_unique_id++), 1403df9a8dfSCaroline Tice DebuggerInstanceSettings (*(Debugger::GetSettingsController().get())), 14130fdc8d8SChris Lattner m_input_comm("debugger.input"), 14230fdc8d8SChris Lattner m_input_file (), 14330fdc8d8SChris Lattner m_output_file (), 14430fdc8d8SChris Lattner m_error_file (), 14530fdc8d8SChris Lattner m_target_list (), 14630fdc8d8SChris Lattner m_listener ("lldb.Debugger"), 14730fdc8d8SChris Lattner m_source_manager (), 1486611103cSGreg Clayton m_command_interpreter_ap (new CommandInterpreter (*this, eScriptLanguageDefault, false)), 1496611103cSGreg Clayton m_exe_ctx (), 15030fdc8d8SChris Lattner m_input_readers (), 151e40e4218SJim Ingham m_input_reader_data (), 152e40e4218SJim Ingham m_use_external_editor(false) 15330fdc8d8SChris Lattner { 1546611103cSGreg Clayton m_command_interpreter_ap->Initialize (); 15530fdc8d8SChris Lattner } 15630fdc8d8SChris Lattner 15730fdc8d8SChris Lattner Debugger::~Debugger () 15830fdc8d8SChris Lattner { 1596611103cSGreg Clayton int num_targets = m_target_list.GetNumTargets(); 1606611103cSGreg Clayton for (int i = 0; i < num_targets; i++) 1616611103cSGreg Clayton { 1626611103cSGreg Clayton ProcessSP process_sp (m_target_list.GetTargetAtIndex (i)->GetProcessSP()); 1636611103cSGreg Clayton if (process_sp) 1646611103cSGreg Clayton process_sp->Destroy(); 1656611103cSGreg Clayton } 1666611103cSGreg Clayton DisconnectInput(); 16730fdc8d8SChris Lattner } 16830fdc8d8SChris Lattner 16930fdc8d8SChris Lattner 17030fdc8d8SChris Lattner bool 17130fdc8d8SChris Lattner Debugger::GetAsyncExecution () 17230fdc8d8SChris Lattner { 1736611103cSGreg Clayton return !m_command_interpreter_ap->GetSynchronous(); 17430fdc8d8SChris Lattner } 17530fdc8d8SChris Lattner 17630fdc8d8SChris Lattner void 17730fdc8d8SChris Lattner Debugger::SetAsyncExecution (bool async_execution) 17830fdc8d8SChris Lattner { 1796611103cSGreg Clayton m_command_interpreter_ap->SetSynchronous (!async_execution); 18030fdc8d8SChris Lattner } 18130fdc8d8SChris Lattner 18230fdc8d8SChris Lattner void 18330fdc8d8SChris Lattner Debugger::DisconnectInput() 18430fdc8d8SChris Lattner { 18530fdc8d8SChris Lattner m_input_comm.Clear (); 18630fdc8d8SChris Lattner } 18730fdc8d8SChris Lattner 18830fdc8d8SChris Lattner void 18930fdc8d8SChris Lattner Debugger::SetInputFileHandle (FILE *fh, bool tranfer_ownership) 19030fdc8d8SChris Lattner { 19130fdc8d8SChris Lattner m_input_file.SetFileHandle (fh, tranfer_ownership); 19230fdc8d8SChris Lattner if (m_input_file.GetFileHandle() == NULL) 19330fdc8d8SChris Lattner m_input_file.SetFileHandle (stdin, false); 19430fdc8d8SChris Lattner 19530fdc8d8SChris Lattner // Disconnect from any old connection if we had one 19630fdc8d8SChris Lattner m_input_comm.Disconnect (); 19730fdc8d8SChris Lattner m_input_comm.SetConnection (new ConnectionFileDescriptor (::fileno (GetInputFileHandle()), true)); 19830fdc8d8SChris Lattner m_input_comm.SetReadThreadBytesReceivedCallback (Debugger::DispatchInputCallback, this); 19930fdc8d8SChris Lattner 20030fdc8d8SChris Lattner Error error; 20130fdc8d8SChris Lattner if (m_input_comm.StartReadThread (&error) == false) 20230fdc8d8SChris Lattner { 20330fdc8d8SChris Lattner FILE *err_fh = GetErrorFileHandle(); 20430fdc8d8SChris Lattner if (err_fh) 20530fdc8d8SChris Lattner { 20630fdc8d8SChris Lattner ::fprintf (err_fh, "error: failed to main input read thread: %s", error.AsCString() ? error.AsCString() : "unkown error"); 20730fdc8d8SChris Lattner exit(1); 20830fdc8d8SChris Lattner } 20930fdc8d8SChris Lattner } 21030fdc8d8SChris Lattner 21130fdc8d8SChris Lattner } 21230fdc8d8SChris Lattner 21330fdc8d8SChris Lattner FILE * 21430fdc8d8SChris Lattner Debugger::GetInputFileHandle () 21530fdc8d8SChris Lattner { 21630fdc8d8SChris Lattner return m_input_file.GetFileHandle(); 21730fdc8d8SChris Lattner } 21830fdc8d8SChris Lattner 21930fdc8d8SChris Lattner 22030fdc8d8SChris Lattner void 22130fdc8d8SChris Lattner Debugger::SetOutputFileHandle (FILE *fh, bool tranfer_ownership) 22230fdc8d8SChris Lattner { 22330fdc8d8SChris Lattner m_output_file.SetFileHandle (fh, tranfer_ownership); 22430fdc8d8SChris Lattner if (m_output_file.GetFileHandle() == NULL) 22530fdc8d8SChris Lattner m_output_file.SetFileHandle (stdin, false); 22630fdc8d8SChris Lattner } 22730fdc8d8SChris Lattner 22830fdc8d8SChris Lattner FILE * 22930fdc8d8SChris Lattner Debugger::GetOutputFileHandle () 23030fdc8d8SChris Lattner { 23130fdc8d8SChris Lattner return m_output_file.GetFileHandle(); 23230fdc8d8SChris Lattner } 23330fdc8d8SChris Lattner 23430fdc8d8SChris Lattner void 23530fdc8d8SChris Lattner Debugger::SetErrorFileHandle (FILE *fh, bool tranfer_ownership) 23630fdc8d8SChris Lattner { 23730fdc8d8SChris Lattner m_error_file.SetFileHandle (fh, tranfer_ownership); 23830fdc8d8SChris Lattner if (m_error_file.GetFileHandle() == NULL) 23930fdc8d8SChris Lattner m_error_file.SetFileHandle (stdin, false); 24030fdc8d8SChris Lattner } 24130fdc8d8SChris Lattner 24230fdc8d8SChris Lattner 24330fdc8d8SChris Lattner FILE * 24430fdc8d8SChris Lattner Debugger::GetErrorFileHandle () 24530fdc8d8SChris Lattner { 24630fdc8d8SChris Lattner return m_error_file.GetFileHandle(); 24730fdc8d8SChris Lattner } 24830fdc8d8SChris Lattner 24930fdc8d8SChris Lattner CommandInterpreter & 25030fdc8d8SChris Lattner Debugger::GetCommandInterpreter () 25130fdc8d8SChris Lattner { 2526611103cSGreg Clayton assert (m_command_interpreter_ap.get()); 2536611103cSGreg Clayton return *m_command_interpreter_ap; 25430fdc8d8SChris Lattner } 25530fdc8d8SChris Lattner 25630fdc8d8SChris Lattner Listener & 25730fdc8d8SChris Lattner Debugger::GetListener () 25830fdc8d8SChris Lattner { 25930fdc8d8SChris Lattner return m_listener; 26030fdc8d8SChris Lattner } 26130fdc8d8SChris Lattner 26230fdc8d8SChris Lattner 26330fdc8d8SChris Lattner TargetSP 2642976d00aSJim Ingham Debugger::GetSelectedTarget () 26530fdc8d8SChris Lattner { 2662976d00aSJim Ingham return m_target_list.GetSelectedTarget (); 26730fdc8d8SChris Lattner } 26830fdc8d8SChris Lattner 26930fdc8d8SChris Lattner ExecutionContext 2702976d00aSJim Ingham Debugger::GetSelectedExecutionContext () 27130fdc8d8SChris Lattner { 27230fdc8d8SChris Lattner ExecutionContext exe_ctx; 27330fdc8d8SChris Lattner exe_ctx.Clear(); 27430fdc8d8SChris Lattner 2752976d00aSJim Ingham lldb::TargetSP target_sp = GetSelectedTarget(); 27630fdc8d8SChris Lattner exe_ctx.target = target_sp.get(); 27730fdc8d8SChris Lattner 27830fdc8d8SChris Lattner if (target_sp) 27930fdc8d8SChris Lattner { 28030fdc8d8SChris Lattner exe_ctx.process = target_sp->GetProcessSP().get(); 28130fdc8d8SChris Lattner if (exe_ctx.process && exe_ctx.process->IsRunning() == false) 28230fdc8d8SChris Lattner { 2832976d00aSJim Ingham exe_ctx.thread = exe_ctx.process->GetThreadList().GetSelectedThread().get(); 28430fdc8d8SChris Lattner if (exe_ctx.thread == NULL) 28530fdc8d8SChris Lattner exe_ctx.thread = exe_ctx.process->GetThreadList().GetThreadAtIndex(0).get(); 28630fdc8d8SChris Lattner if (exe_ctx.thread) 28730fdc8d8SChris Lattner { 2882976d00aSJim Ingham exe_ctx.frame = exe_ctx.thread->GetSelectedFrame().get(); 28930fdc8d8SChris Lattner if (exe_ctx.frame == NULL) 29030fdc8d8SChris Lattner exe_ctx.frame = exe_ctx.thread->GetStackFrameAtIndex (0).get(); 29130fdc8d8SChris Lattner } 29230fdc8d8SChris Lattner } 29330fdc8d8SChris Lattner } 29430fdc8d8SChris Lattner return exe_ctx; 29530fdc8d8SChris Lattner 29630fdc8d8SChris Lattner } 29730fdc8d8SChris Lattner 29830fdc8d8SChris Lattner SourceManager & 29930fdc8d8SChris Lattner Debugger::GetSourceManager () 30030fdc8d8SChris Lattner { 30130fdc8d8SChris Lattner return m_source_manager; 30230fdc8d8SChris Lattner } 30330fdc8d8SChris Lattner 30430fdc8d8SChris Lattner 30530fdc8d8SChris Lattner TargetList& 30630fdc8d8SChris Lattner Debugger::GetTargetList () 30730fdc8d8SChris Lattner { 30830fdc8d8SChris Lattner return m_target_list; 30930fdc8d8SChris Lattner } 31030fdc8d8SChris Lattner 31130fdc8d8SChris Lattner void 31230fdc8d8SChris Lattner Debugger::DispatchInputCallback (void *baton, const void *bytes, size_t bytes_len) 31330fdc8d8SChris Lattner { 31430fdc8d8SChris Lattner ((Debugger *)baton)->DispatchInput ((char *)bytes, bytes_len); 31530fdc8d8SChris Lattner } 31630fdc8d8SChris Lattner 31730fdc8d8SChris Lattner 31830fdc8d8SChris Lattner void 31930fdc8d8SChris Lattner Debugger::DispatchInput (const char *bytes, size_t bytes_len) 32030fdc8d8SChris Lattner { 32130fdc8d8SChris Lattner if (bytes == NULL || bytes_len == 0) 32230fdc8d8SChris Lattner return; 32330fdc8d8SChris Lattner 32430fdc8d8SChris Lattner // TODO: implement the STDIO to the process as an input reader... 3252976d00aSJim Ingham TargetSP target = GetSelectedTarget(); 32630fdc8d8SChris Lattner if (target.get() != NULL) 32730fdc8d8SChris Lattner { 32830fdc8d8SChris Lattner ProcessSP process_sp = target->GetProcessSP(); 32930fdc8d8SChris Lattner if (process_sp.get() != NULL 33030fdc8d8SChris Lattner && StateIsRunningState (process_sp->GetState())) 33130fdc8d8SChris Lattner { 33230fdc8d8SChris Lattner Error error; 33330fdc8d8SChris Lattner if (process_sp->PutSTDIN (bytes, bytes_len, error) == bytes_len) 33430fdc8d8SChris Lattner return; 33530fdc8d8SChris Lattner } 33630fdc8d8SChris Lattner } 33730fdc8d8SChris Lattner 33830fdc8d8SChris Lattner WriteToDefaultReader (bytes, bytes_len); 33930fdc8d8SChris Lattner } 34030fdc8d8SChris Lattner 34130fdc8d8SChris Lattner void 34230fdc8d8SChris Lattner Debugger::WriteToDefaultReader (const char *bytes, size_t bytes_len) 34330fdc8d8SChris Lattner { 34430fdc8d8SChris Lattner if (bytes && bytes_len) 34530fdc8d8SChris Lattner m_input_reader_data.append (bytes, bytes_len); 34630fdc8d8SChris Lattner 34730fdc8d8SChris Lattner if (m_input_reader_data.empty()) 34830fdc8d8SChris Lattner return; 34930fdc8d8SChris Lattner 35030fdc8d8SChris Lattner while (!m_input_readers.empty() && !m_input_reader_data.empty()) 35130fdc8d8SChris Lattner { 35230fdc8d8SChris Lattner while (CheckIfTopInputReaderIsDone ()) 35330fdc8d8SChris Lattner /* Do nothing. */; 35430fdc8d8SChris Lattner 35530fdc8d8SChris Lattner // Get the input reader from the top of the stack 35630fdc8d8SChris Lattner InputReaderSP reader_sp(m_input_readers.top()); 35730fdc8d8SChris Lattner 35830fdc8d8SChris Lattner if (!reader_sp) 35930fdc8d8SChris Lattner break; 36030fdc8d8SChris Lattner 361471b31ceSGreg Clayton size_t bytes_handled = reader_sp->HandleRawBytes (m_input_reader_data.c_str(), 36230fdc8d8SChris Lattner m_input_reader_data.size()); 36330fdc8d8SChris Lattner if (bytes_handled) 36430fdc8d8SChris Lattner { 36530fdc8d8SChris Lattner m_input_reader_data.erase (0, bytes_handled); 36630fdc8d8SChris Lattner } 36730fdc8d8SChris Lattner else 36830fdc8d8SChris Lattner { 36930fdc8d8SChris Lattner // No bytes were handled, we might not have reached our 37030fdc8d8SChris Lattner // granularity, just return and wait for more data 37130fdc8d8SChris Lattner break; 37230fdc8d8SChris Lattner } 37330fdc8d8SChris Lattner } 37430fdc8d8SChris Lattner 37530fdc8d8SChris Lattner // Flush out any input readers that are donesvn 37630fdc8d8SChris Lattner while (CheckIfTopInputReaderIsDone ()) 37730fdc8d8SChris Lattner /* Do nothing. */; 37830fdc8d8SChris Lattner 37930fdc8d8SChris Lattner } 38030fdc8d8SChris Lattner 38130fdc8d8SChris Lattner void 38230fdc8d8SChris Lattner Debugger::PushInputReader (const InputReaderSP& reader_sp) 38330fdc8d8SChris Lattner { 38430fdc8d8SChris Lattner if (!reader_sp) 38530fdc8d8SChris Lattner return; 38630fdc8d8SChris Lattner if (!m_input_readers.empty()) 38730fdc8d8SChris Lattner { 38830fdc8d8SChris Lattner // Deactivate the old top reader 38930fdc8d8SChris Lattner InputReaderSP top_reader_sp (m_input_readers.top()); 39030fdc8d8SChris Lattner if (top_reader_sp) 39130fdc8d8SChris Lattner top_reader_sp->Notify (eInputReaderDeactivate); 39230fdc8d8SChris Lattner } 39330fdc8d8SChris Lattner m_input_readers.push (reader_sp); 39430fdc8d8SChris Lattner reader_sp->Notify (eInputReaderActivate); 39530fdc8d8SChris Lattner ActivateInputReader (reader_sp); 39630fdc8d8SChris Lattner } 39730fdc8d8SChris Lattner 39830fdc8d8SChris Lattner bool 39930fdc8d8SChris Lattner Debugger::PopInputReader (const lldb::InputReaderSP& pop_reader_sp) 40030fdc8d8SChris Lattner { 40130fdc8d8SChris Lattner bool result = false; 40230fdc8d8SChris Lattner 40330fdc8d8SChris Lattner // The reader on the stop of the stack is done, so let the next 40430fdc8d8SChris Lattner // read on the stack referesh its prompt and if there is one... 40530fdc8d8SChris Lattner if (!m_input_readers.empty()) 40630fdc8d8SChris Lattner { 40730fdc8d8SChris Lattner InputReaderSP reader_sp(m_input_readers.top()); 40830fdc8d8SChris Lattner 40930fdc8d8SChris Lattner if (!pop_reader_sp || pop_reader_sp.get() == reader_sp.get()) 41030fdc8d8SChris Lattner { 41130fdc8d8SChris Lattner m_input_readers.pop (); 41230fdc8d8SChris Lattner reader_sp->Notify (eInputReaderDeactivate); 41330fdc8d8SChris Lattner reader_sp->Notify (eInputReaderDone); 41430fdc8d8SChris Lattner result = true; 41530fdc8d8SChris Lattner 41630fdc8d8SChris Lattner if (!m_input_readers.empty()) 41730fdc8d8SChris Lattner { 41830fdc8d8SChris Lattner reader_sp = m_input_readers.top(); 41930fdc8d8SChris Lattner if (reader_sp) 42030fdc8d8SChris Lattner { 42130fdc8d8SChris Lattner ActivateInputReader (reader_sp); 42230fdc8d8SChris Lattner reader_sp->Notify (eInputReaderReactivate); 42330fdc8d8SChris Lattner } 42430fdc8d8SChris Lattner } 42530fdc8d8SChris Lattner } 42630fdc8d8SChris Lattner } 42730fdc8d8SChris Lattner return result; 42830fdc8d8SChris Lattner } 42930fdc8d8SChris Lattner 43030fdc8d8SChris Lattner bool 43130fdc8d8SChris Lattner Debugger::CheckIfTopInputReaderIsDone () 43230fdc8d8SChris Lattner { 43330fdc8d8SChris Lattner bool result = false; 43430fdc8d8SChris Lattner if (!m_input_readers.empty()) 43530fdc8d8SChris Lattner { 43630fdc8d8SChris Lattner InputReaderSP reader_sp(m_input_readers.top()); 43730fdc8d8SChris Lattner 43830fdc8d8SChris Lattner if (reader_sp && reader_sp->IsDone()) 43930fdc8d8SChris Lattner { 44030fdc8d8SChris Lattner result = true; 44130fdc8d8SChris Lattner PopInputReader (reader_sp); 44230fdc8d8SChris Lattner } 44330fdc8d8SChris Lattner } 44430fdc8d8SChris Lattner return result; 44530fdc8d8SChris Lattner } 44630fdc8d8SChris Lattner 44730fdc8d8SChris Lattner void 44830fdc8d8SChris Lattner Debugger::ActivateInputReader (const InputReaderSP &reader_sp) 44930fdc8d8SChris Lattner { 45030fdc8d8SChris Lattner FILE *in_fh = GetInputFileHandle(); 45130fdc8d8SChris Lattner 45230fdc8d8SChris Lattner if (in_fh) 45330fdc8d8SChris Lattner { 45430fdc8d8SChris Lattner struct termios in_fh_termios; 45530fdc8d8SChris Lattner int in_fd = fileno (in_fh); 45630fdc8d8SChris Lattner if (::tcgetattr(in_fd, &in_fh_termios) == 0) 45730fdc8d8SChris Lattner { 45830fdc8d8SChris Lattner if (reader_sp->GetEcho()) 45930fdc8d8SChris Lattner in_fh_termios.c_lflag |= ECHO; // Turn on echoing 46030fdc8d8SChris Lattner else 46130fdc8d8SChris Lattner in_fh_termios.c_lflag &= ~ECHO; // Turn off echoing 46230fdc8d8SChris Lattner 46330fdc8d8SChris Lattner switch (reader_sp->GetGranularity()) 46430fdc8d8SChris Lattner { 46530fdc8d8SChris Lattner case eInputReaderGranularityByte: 46630fdc8d8SChris Lattner case eInputReaderGranularityWord: 46730fdc8d8SChris Lattner in_fh_termios.c_lflag &= ~ICANON; // Get one char at a time 46830fdc8d8SChris Lattner break; 46930fdc8d8SChris Lattner 47030fdc8d8SChris Lattner case eInputReaderGranularityLine: 47130fdc8d8SChris Lattner case eInputReaderGranularityAll: 47230fdc8d8SChris Lattner in_fh_termios.c_lflag |= ICANON; // Get lines at a time 47330fdc8d8SChris Lattner break; 47430fdc8d8SChris Lattner 47530fdc8d8SChris Lattner default: 47630fdc8d8SChris Lattner break; 47730fdc8d8SChris Lattner } 47830fdc8d8SChris Lattner ::tcsetattr (in_fd, TCSANOW, &in_fh_termios); 47930fdc8d8SChris Lattner } 48030fdc8d8SChris Lattner } 48130fdc8d8SChris Lattner } 4826611103cSGreg Clayton 4836611103cSGreg Clayton void 4846611103cSGreg Clayton Debugger::UpdateExecutionContext (ExecutionContext *override_context) 4856611103cSGreg Clayton { 4866611103cSGreg Clayton m_exe_ctx.Clear(); 4876611103cSGreg Clayton 4886611103cSGreg Clayton if (override_context != NULL) 4896611103cSGreg Clayton { 4906611103cSGreg Clayton m_exe_ctx.target = override_context->target; 4916611103cSGreg Clayton m_exe_ctx.process = override_context->process; 4926611103cSGreg Clayton m_exe_ctx.thread = override_context->thread; 4936611103cSGreg Clayton m_exe_ctx.frame = override_context->frame; 4946611103cSGreg Clayton } 4956611103cSGreg Clayton else 4966611103cSGreg Clayton { 4972976d00aSJim Ingham TargetSP target_sp (GetSelectedTarget()); 4986611103cSGreg Clayton if (target_sp) 4996611103cSGreg Clayton { 5006611103cSGreg Clayton m_exe_ctx.target = target_sp.get(); 5016611103cSGreg Clayton m_exe_ctx.process = target_sp->GetProcessSP().get(); 502725945d5SJohnny Chen if (m_exe_ctx.process && m_exe_ctx.process->IsAlive() && !m_exe_ctx.process->IsRunning()) 5036611103cSGreg Clayton { 5042976d00aSJim Ingham m_exe_ctx.thread = m_exe_ctx.process->GetThreadList().GetSelectedThread().get(); 5056611103cSGreg Clayton if (m_exe_ctx.thread == NULL) 5066611103cSGreg Clayton m_exe_ctx.thread = m_exe_ctx.process->GetThreadList().GetThreadAtIndex(0).get(); 5076611103cSGreg Clayton if (m_exe_ctx.thread) 5086611103cSGreg Clayton { 5092976d00aSJim Ingham m_exe_ctx.frame = m_exe_ctx.thread->GetSelectedFrame().get(); 5106611103cSGreg Clayton if (m_exe_ctx.frame == NULL) 5116611103cSGreg Clayton m_exe_ctx.frame = m_exe_ctx.thread->GetStackFrameAtIndex (0).get(); 5126611103cSGreg Clayton } 5136611103cSGreg Clayton } 5146611103cSGreg Clayton } 5156611103cSGreg Clayton } 5166611103cSGreg Clayton } 5176611103cSGreg Clayton 518ebc1bb27SCaroline Tice DebuggerSP 519ebc1bb27SCaroline Tice Debugger::FindDebuggerWithID (lldb::user_id_t id) 520ebc1bb27SCaroline Tice { 521ebc1bb27SCaroline Tice lldb::DebuggerSP debugger_sp; 522ebc1bb27SCaroline Tice 523ebc1bb27SCaroline Tice Mutex::Locker locker (GetDebuggerListMutex ()); 524ebc1bb27SCaroline Tice DebuggerList &debugger_list = GetDebuggerList(); 525ebc1bb27SCaroline Tice DebuggerList::iterator pos, end = debugger_list.end(); 526ebc1bb27SCaroline Tice for (pos = debugger_list.begin(); pos != end; ++pos) 527ebc1bb27SCaroline Tice { 528ebc1bb27SCaroline Tice if ((*pos).get()->GetID() == id) 529ebc1bb27SCaroline Tice { 530ebc1bb27SCaroline Tice debugger_sp = *pos; 531ebc1bb27SCaroline Tice break; 532ebc1bb27SCaroline Tice } 533ebc1bb27SCaroline Tice } 534ebc1bb27SCaroline Tice return debugger_sp; 535ebc1bb27SCaroline Tice } 5363df9a8dfSCaroline Tice 5373df9a8dfSCaroline Tice lldb::UserSettingsControllerSP & 5383df9a8dfSCaroline Tice Debugger::GetSettingsController (bool finish) 5393df9a8dfSCaroline Tice { 5403df9a8dfSCaroline Tice static lldb::UserSettingsControllerSP g_settings_controller (new DebuggerSettingsController); 5413df9a8dfSCaroline Tice static bool initialized = false; 5423df9a8dfSCaroline Tice 5433df9a8dfSCaroline Tice if (!initialized) 5443df9a8dfSCaroline Tice { 54595852755SJim Ingham initialized = UserSettingsController::InitializeSettingsController (g_settings_controller, 54695852755SJim Ingham Debugger::DebuggerSettingsController::global_settings_table, 54795852755SJim Ingham Debugger::DebuggerSettingsController::instance_settings_table); 5483df9a8dfSCaroline Tice } 5493df9a8dfSCaroline Tice 5503df9a8dfSCaroline Tice if (finish) 5513df9a8dfSCaroline Tice { 5523df9a8dfSCaroline Tice UserSettingsControllerSP parent = g_settings_controller->GetParent(); 5533df9a8dfSCaroline Tice if (parent) 5543df9a8dfSCaroline Tice parent->RemoveChild (g_settings_controller); 5553df9a8dfSCaroline Tice g_settings_controller.reset(); 5563df9a8dfSCaroline Tice } 5573df9a8dfSCaroline Tice return g_settings_controller; 5583df9a8dfSCaroline Tice } 5593df9a8dfSCaroline Tice 5603df9a8dfSCaroline Tice //-------------------------------------------------- 5613df9a8dfSCaroline Tice // class Debugger::DebuggerSettingsController 5623df9a8dfSCaroline Tice //-------------------------------------------------- 5633df9a8dfSCaroline Tice 5643df9a8dfSCaroline Tice Debugger::DebuggerSettingsController::DebuggerSettingsController () : 5653df9a8dfSCaroline Tice UserSettingsController ("", lldb::UserSettingsControllerSP()), 5663df9a8dfSCaroline Tice m_term_width (80) 5673df9a8dfSCaroline Tice { 568*91123da2SCaroline Tice m_default_settings.reset (new DebuggerInstanceSettings (*this, false, 569*91123da2SCaroline Tice InstanceSettings::GetDefaultName().AsCString())); 5703df9a8dfSCaroline Tice } 5713df9a8dfSCaroline Tice 5723df9a8dfSCaroline Tice Debugger::DebuggerSettingsController::~DebuggerSettingsController () 5733df9a8dfSCaroline Tice { 5743df9a8dfSCaroline Tice } 5753df9a8dfSCaroline Tice 5763df9a8dfSCaroline Tice 5773df9a8dfSCaroline Tice lldb::InstanceSettingsSP 578*91123da2SCaroline Tice Debugger::DebuggerSettingsController::CreateNewInstanceSettings (const char *instance_name) 5793df9a8dfSCaroline Tice { 580*91123da2SCaroline Tice DebuggerInstanceSettings *new_settings = new DebuggerInstanceSettings (*(Debugger::GetSettingsController().get()), 581*91123da2SCaroline Tice false, instance_name); 5823df9a8dfSCaroline Tice lldb::InstanceSettingsSP new_settings_sp (new_settings); 5833df9a8dfSCaroline Tice return new_settings_sp; 5843df9a8dfSCaroline Tice } 5853df9a8dfSCaroline Tice 5863df9a8dfSCaroline Tice bool 5873df9a8dfSCaroline Tice Debugger::DebuggerSettingsController::ValidTermWidthValue (const char *value, Error err) 5883df9a8dfSCaroline Tice { 5893df9a8dfSCaroline Tice bool valid = true; 5903df9a8dfSCaroline Tice 5913df9a8dfSCaroline Tice // Verify we have a value string. 5923df9a8dfSCaroline Tice if (value == NULL 5933df9a8dfSCaroline Tice || strlen (value) == 0) 5943df9a8dfSCaroline Tice { 5953df9a8dfSCaroline Tice valid = false; 5963df9a8dfSCaroline Tice err.SetErrorString ("Missing value. Can't set terminal width without a value.\n"); 5973df9a8dfSCaroline Tice } 5983df9a8dfSCaroline Tice 5993df9a8dfSCaroline Tice // Verify the string consists entirely of digits. 6003df9a8dfSCaroline Tice if (valid) 6013df9a8dfSCaroline Tice { 6023df9a8dfSCaroline Tice int len = strlen (value); 6033df9a8dfSCaroline Tice for (int i = 0; i < len; ++i) 6043df9a8dfSCaroline Tice if (! isdigit (value[i])) 6053df9a8dfSCaroline Tice { 6063df9a8dfSCaroline Tice valid = false; 6073df9a8dfSCaroline Tice err.SetErrorStringWithFormat ("'%s' is not a valid representation of an integer.\n", value); 6083df9a8dfSCaroline Tice } 6093df9a8dfSCaroline Tice } 6103df9a8dfSCaroline Tice 6113df9a8dfSCaroline Tice // Verify the term-width is 'reasonable' (e.g. 10 <= width <= 250). 6123df9a8dfSCaroline Tice if (valid) 6133df9a8dfSCaroline Tice { 6143df9a8dfSCaroline Tice int width = atoi (value); 6153df9a8dfSCaroline Tice if (width < 10 6163df9a8dfSCaroline Tice || width > 250) 6173df9a8dfSCaroline Tice { 6183df9a8dfSCaroline Tice valid = false; 6193df9a8dfSCaroline Tice err.SetErrorString ("Invalid term-width value; value must be between 10 and 250.\n"); 6203df9a8dfSCaroline Tice } 6213df9a8dfSCaroline Tice } 6223df9a8dfSCaroline Tice 6233df9a8dfSCaroline Tice return valid; 6243df9a8dfSCaroline Tice } 6253df9a8dfSCaroline Tice 6263df9a8dfSCaroline Tice 6273df9a8dfSCaroline Tice //-------------------------------------------------- 6283df9a8dfSCaroline Tice // class DebuggerInstanceSettings 6293df9a8dfSCaroline Tice //-------------------------------------------------- 6303df9a8dfSCaroline Tice 631*91123da2SCaroline Tice DebuggerInstanceSettings::DebuggerInstanceSettings (UserSettingsController &owner, bool live_instance, 632*91123da2SCaroline Tice const char *name) : 633*91123da2SCaroline Tice InstanceSettings (owner, (name == NULL ? CreateInstanceName ().AsCString() : name), live_instance), 6343df9a8dfSCaroline Tice m_prompt (), 6353df9a8dfSCaroline Tice m_script_lang () 6363df9a8dfSCaroline Tice { 637*91123da2SCaroline Tice if (name == NULL && live_instance) 6383df9a8dfSCaroline Tice { 6393df9a8dfSCaroline Tice const lldb::InstanceSettingsSP &pending_settings = m_owner.FindPendingSettings (m_instance_name); 6403df9a8dfSCaroline Tice CopyInstanceSettings (pending_settings, false); 6413df9a8dfSCaroline Tice m_owner.RemovePendingSettings (m_instance_name); 6423df9a8dfSCaroline Tice } 6433df9a8dfSCaroline Tice } 6443df9a8dfSCaroline Tice 6453df9a8dfSCaroline Tice DebuggerInstanceSettings::DebuggerInstanceSettings (const DebuggerInstanceSettings &rhs) : 6463df9a8dfSCaroline Tice InstanceSettings (*(Debugger::GetSettingsController().get()), CreateInstanceName ().AsCString()), 6473df9a8dfSCaroline Tice m_prompt (rhs.m_prompt), 6483df9a8dfSCaroline Tice m_script_lang (rhs.m_script_lang) 6493df9a8dfSCaroline Tice { 6503df9a8dfSCaroline Tice const lldb::InstanceSettingsSP &pending_settings = m_owner.FindPendingSettings (m_instance_name); 6513df9a8dfSCaroline Tice CopyInstanceSettings (pending_settings, false); 6523df9a8dfSCaroline Tice m_owner.RemovePendingSettings (m_instance_name); 6533df9a8dfSCaroline Tice } 6543df9a8dfSCaroline Tice 6553df9a8dfSCaroline Tice DebuggerInstanceSettings::~DebuggerInstanceSettings () 6563df9a8dfSCaroline Tice { 6573df9a8dfSCaroline Tice } 6583df9a8dfSCaroline Tice 6593df9a8dfSCaroline Tice DebuggerInstanceSettings& 6603df9a8dfSCaroline Tice DebuggerInstanceSettings::operator= (const DebuggerInstanceSettings &rhs) 6613df9a8dfSCaroline Tice { 6623df9a8dfSCaroline Tice if (this != &rhs) 6633df9a8dfSCaroline Tice { 6643df9a8dfSCaroline Tice m_prompt = rhs.m_prompt; 6653df9a8dfSCaroline Tice m_script_lang = rhs.m_script_lang; 6663df9a8dfSCaroline Tice } 6673df9a8dfSCaroline Tice 6683df9a8dfSCaroline Tice return *this; 6693df9a8dfSCaroline Tice } 6703df9a8dfSCaroline Tice 6713df9a8dfSCaroline Tice void 6723df9a8dfSCaroline Tice DebuggerInstanceSettings::UpdateInstanceSettingsVariable (const ConstString &var_name, 6733df9a8dfSCaroline Tice const char *index_value, 6743df9a8dfSCaroline Tice const char *value, 6753df9a8dfSCaroline Tice const ConstString &instance_name, 6763df9a8dfSCaroline Tice const SettingEntry &entry, 6773df9a8dfSCaroline Tice lldb::VarSetOperationType op, 6783df9a8dfSCaroline Tice Error &err, 6793df9a8dfSCaroline Tice bool pending) 6803df9a8dfSCaroline Tice { 6813df9a8dfSCaroline Tice if (var_name == PromptVarName()) 6823df9a8dfSCaroline Tice { 6833df9a8dfSCaroline Tice UserSettingsController::UpdateStringVariable (op, m_prompt, value, err); 6843df9a8dfSCaroline Tice if (!pending) 6853df9a8dfSCaroline Tice { 68649e2737eSCaroline Tice // 'instance_name' is actually (probably) in the form '[<instance_name>]'; if so, we need to 68749e2737eSCaroline Tice // strip off the brackets before passing it to BroadcastPromptChange. 68849e2737eSCaroline Tice 68949e2737eSCaroline Tice std::string tmp_instance_name (instance_name.AsCString()); 69049e2737eSCaroline Tice if ((tmp_instance_name[0] == '[') 69149e2737eSCaroline Tice && (tmp_instance_name[instance_name.GetLength() - 1] == ']')) 69249e2737eSCaroline Tice tmp_instance_name = tmp_instance_name.substr (1, instance_name.GetLength() - 2); 69349e2737eSCaroline Tice ConstString new_name (tmp_instance_name.c_str()); 69449e2737eSCaroline Tice 69549e2737eSCaroline Tice BroadcastPromptChange (new_name, m_prompt.c_str()); 6963df9a8dfSCaroline Tice } 6973df9a8dfSCaroline Tice } 6983df9a8dfSCaroline Tice else if (var_name == ScriptLangVarName()) 6993df9a8dfSCaroline Tice { 7003df9a8dfSCaroline Tice bool success; 7013df9a8dfSCaroline Tice m_script_lang = Args::StringToScriptLanguage (value, eScriptLanguageDefault, 7023df9a8dfSCaroline Tice &success); 7033df9a8dfSCaroline Tice } 7043df9a8dfSCaroline Tice } 7053df9a8dfSCaroline Tice 7063df9a8dfSCaroline Tice void 7073df9a8dfSCaroline Tice Debugger::DebuggerSettingsController::UpdateGlobalVariable (const ConstString &var_name, 7083df9a8dfSCaroline Tice const char *index_value, 7093df9a8dfSCaroline Tice const char *value, 7103df9a8dfSCaroline Tice const SettingEntry &entry, 7113df9a8dfSCaroline Tice lldb::VarSetOperationType op, 7123df9a8dfSCaroline Tice Error &err) 7133df9a8dfSCaroline Tice { 7143df9a8dfSCaroline Tice static ConstString term_width_name ("term-width"); 7153df9a8dfSCaroline Tice 7163df9a8dfSCaroline Tice if (var_name == term_width_name) 7173df9a8dfSCaroline Tice { 7183df9a8dfSCaroline Tice if (ValidTermWidthValue (value, err)) 7193df9a8dfSCaroline Tice { 7203df9a8dfSCaroline Tice m_term_width = atoi (value); 7213df9a8dfSCaroline Tice } 7223df9a8dfSCaroline Tice } 7233df9a8dfSCaroline Tice } 7243df9a8dfSCaroline Tice 7253df9a8dfSCaroline Tice void 7263df9a8dfSCaroline Tice DebuggerInstanceSettings::GetInstanceSettingsValue (const SettingEntry &entry, 7273df9a8dfSCaroline Tice const ConstString &var_name, 7283df9a8dfSCaroline Tice StringList &value) 7293df9a8dfSCaroline Tice { 7303df9a8dfSCaroline Tice if (var_name == PromptVarName()) 7313df9a8dfSCaroline Tice { 7323df9a8dfSCaroline Tice value.AppendString (m_prompt.c_str()); 7333df9a8dfSCaroline Tice 7343df9a8dfSCaroline Tice } 7353df9a8dfSCaroline Tice else if (var_name == ScriptLangVarName()) 7363df9a8dfSCaroline Tice { 7373df9a8dfSCaroline Tice value.AppendString (ScriptInterpreter::LanguageToString (m_script_lang).c_str()); 7383df9a8dfSCaroline Tice } 7393df9a8dfSCaroline Tice } 7403df9a8dfSCaroline Tice 7413df9a8dfSCaroline Tice void 7423df9a8dfSCaroline Tice DebuggerInstanceSettings::CopyInstanceSettings (const lldb::InstanceSettingsSP &new_settings, 7433df9a8dfSCaroline Tice bool pending) 7443df9a8dfSCaroline Tice { 7453df9a8dfSCaroline Tice if (new_settings.get() == NULL) 7463df9a8dfSCaroline Tice return; 7473df9a8dfSCaroline Tice 7483df9a8dfSCaroline Tice DebuggerInstanceSettings *new_debugger_settings = (DebuggerInstanceSettings *) new_settings.get(); 7493df9a8dfSCaroline Tice 7503df9a8dfSCaroline Tice m_prompt = new_debugger_settings->m_prompt; 7513df9a8dfSCaroline Tice if (!pending) 75249e2737eSCaroline Tice { 75349e2737eSCaroline Tice // 'instance_name' is actually (probably) in the form '[<instance_name>]'; if so, we need to 75449e2737eSCaroline Tice // strip off the brackets before passing it to BroadcastPromptChange. 75549e2737eSCaroline Tice 75649e2737eSCaroline Tice std::string tmp_instance_name (m_instance_name.AsCString()); 75749e2737eSCaroline Tice if ((tmp_instance_name[0] == '[') 75849e2737eSCaroline Tice && (tmp_instance_name[m_instance_name.GetLength() - 1] == ']')) 75949e2737eSCaroline Tice tmp_instance_name = tmp_instance_name.substr (1, m_instance_name.GetLength() - 2); 76049e2737eSCaroline Tice ConstString new_name (tmp_instance_name.c_str()); 76149e2737eSCaroline Tice 76249e2737eSCaroline Tice BroadcastPromptChange (new_name, m_prompt.c_str()); 76349e2737eSCaroline Tice } 7643df9a8dfSCaroline Tice 7653df9a8dfSCaroline Tice m_script_lang = new_debugger_settings->m_script_lang; 7663df9a8dfSCaroline Tice } 7673df9a8dfSCaroline Tice 7683df9a8dfSCaroline Tice void 7693df9a8dfSCaroline Tice Debugger::DebuggerSettingsController::GetGlobalSettingsValue (const ConstString &var_name, 7703df9a8dfSCaroline Tice StringList &value) 7713df9a8dfSCaroline Tice { 7723df9a8dfSCaroline Tice static ConstString term_width_name ("term-width"); 7733df9a8dfSCaroline Tice 7743df9a8dfSCaroline Tice if (var_name == term_width_name) 7753df9a8dfSCaroline Tice { 7763df9a8dfSCaroline Tice StreamString width_str; 7773df9a8dfSCaroline Tice width_str.Printf ("%d", m_term_width); 7783df9a8dfSCaroline Tice value.AppendString (width_str.GetData()); 7793df9a8dfSCaroline Tice } 7803df9a8dfSCaroline Tice } 7813df9a8dfSCaroline Tice 7823df9a8dfSCaroline Tice bool 7833df9a8dfSCaroline Tice DebuggerInstanceSettings::BroadcastPromptChange (const ConstString &instance_name, const char *new_prompt) 7843df9a8dfSCaroline Tice { 7853df9a8dfSCaroline Tice std::string tmp_prompt; 7863df9a8dfSCaroline Tice 7873df9a8dfSCaroline Tice if (new_prompt != NULL) 7883df9a8dfSCaroline Tice { 7893df9a8dfSCaroline Tice tmp_prompt = new_prompt ; 7903df9a8dfSCaroline Tice int len = tmp_prompt.size(); 7913df9a8dfSCaroline Tice if (len > 1 7923df9a8dfSCaroline Tice && (tmp_prompt[0] == '\'' || tmp_prompt[0] == '"') 7933df9a8dfSCaroline Tice && (tmp_prompt[len-1] == tmp_prompt[0])) 7943df9a8dfSCaroline Tice { 7953df9a8dfSCaroline Tice tmp_prompt = tmp_prompt.substr(1,len-2); 7963df9a8dfSCaroline Tice } 7973df9a8dfSCaroline Tice len = tmp_prompt.size(); 7983df9a8dfSCaroline Tice if (tmp_prompt[len-1] != ' ') 7993df9a8dfSCaroline Tice tmp_prompt.append(" "); 8003df9a8dfSCaroline Tice } 8013df9a8dfSCaroline Tice EventSP new_event_sp; 8023df9a8dfSCaroline Tice new_event_sp.reset (new Event(CommandInterpreter::eBroadcastBitResetPrompt, 8033df9a8dfSCaroline Tice new EventDataBytes (tmp_prompt.c_str()))); 8043df9a8dfSCaroline Tice 8053df9a8dfSCaroline Tice if (instance_name.GetLength() != 0) 8063df9a8dfSCaroline Tice { 8073df9a8dfSCaroline Tice // Set prompt for a particular instance. 8083df9a8dfSCaroline Tice Debugger *dbg = Debugger::FindDebuggerWithInstanceName (instance_name).get(); 8093df9a8dfSCaroline Tice if (dbg != NULL) 8103df9a8dfSCaroline Tice { 8113df9a8dfSCaroline Tice dbg->GetCommandInterpreter().BroadcastEvent (new_event_sp); 8123df9a8dfSCaroline Tice } 8133df9a8dfSCaroline Tice } 8143df9a8dfSCaroline Tice 8153df9a8dfSCaroline Tice return true; 8163df9a8dfSCaroline Tice } 8173df9a8dfSCaroline Tice 8183df9a8dfSCaroline Tice const ConstString 8193df9a8dfSCaroline Tice DebuggerInstanceSettings::CreateInstanceName () 8203df9a8dfSCaroline Tice { 8213df9a8dfSCaroline Tice static int instance_count = 1; 8223df9a8dfSCaroline Tice StreamString sstr; 8233df9a8dfSCaroline Tice 8243df9a8dfSCaroline Tice sstr.Printf ("debugger_%d", instance_count); 8253df9a8dfSCaroline Tice ++instance_count; 8263df9a8dfSCaroline Tice 8273df9a8dfSCaroline Tice const ConstString ret_val (sstr.GetData()); 8283df9a8dfSCaroline Tice 8293df9a8dfSCaroline Tice return ret_val; 8303df9a8dfSCaroline Tice } 8313df9a8dfSCaroline Tice 8323df9a8dfSCaroline Tice const ConstString & 8333df9a8dfSCaroline Tice DebuggerInstanceSettings::PromptVarName () 8343df9a8dfSCaroline Tice { 8353df9a8dfSCaroline Tice static ConstString prompt_var_name ("prompt"); 8363df9a8dfSCaroline Tice 8373df9a8dfSCaroline Tice return prompt_var_name; 8383df9a8dfSCaroline Tice } 8393df9a8dfSCaroline Tice 8403df9a8dfSCaroline Tice const ConstString & 8413df9a8dfSCaroline Tice DebuggerInstanceSettings::ScriptLangVarName () 8423df9a8dfSCaroline Tice { 8433df9a8dfSCaroline Tice static ConstString script_lang_var_name ("script-lang"); 8443df9a8dfSCaroline Tice 8453df9a8dfSCaroline Tice return script_lang_var_name; 8463df9a8dfSCaroline Tice } 8473df9a8dfSCaroline Tice 8483df9a8dfSCaroline Tice //-------------------------------------------------- 8493df9a8dfSCaroline Tice // DebuggerSettingsController Variable Tables 8503df9a8dfSCaroline Tice //-------------------------------------------------- 8513df9a8dfSCaroline Tice 8523df9a8dfSCaroline Tice 8533df9a8dfSCaroline Tice SettingEntry 8543df9a8dfSCaroline Tice Debugger::DebuggerSettingsController::global_settings_table[] = 8553df9a8dfSCaroline Tice { 8563df9a8dfSCaroline Tice //{ "var-name", var-type, "default", enum-table, init'd, hidden, "help-text"}, 8573df9a8dfSCaroline Tice { "term-width" , eSetVarTypeInt, "80" , NULL, false , false , "The maximum number of columns to use for displaying text." }, 8583df9a8dfSCaroline Tice { NULL, eSetVarTypeNone, NULL, NULL, 0, 0, NULL } 8593df9a8dfSCaroline Tice }; 8603df9a8dfSCaroline Tice 8613df9a8dfSCaroline Tice 8623df9a8dfSCaroline Tice 8633df9a8dfSCaroline Tice SettingEntry 8643df9a8dfSCaroline Tice Debugger::DebuggerSettingsController::instance_settings_table[] = 8653df9a8dfSCaroline Tice { 8663df9a8dfSCaroline Tice //{ "var-name", var-type , "default", enum-table, init'd, hidden, "help-text"}, 8673df9a8dfSCaroline Tice { "script-lang" , eSetVarTypeString, "python", NULL, false, false, "The script language to be used for evaluating user-written scripts." }, 8683df9a8dfSCaroline Tice { "prompt" , eSetVarTypeString, "(lldb)", NULL, false, false, "The debugger command line prompt displayed for the user." }, 8693df9a8dfSCaroline Tice { NULL, eSetVarTypeNone, NULL, NULL, 0, 0, NULL } 8703df9a8dfSCaroline Tice }; 871