130fdc8d8SChris Lattner //===-- SBDebugger.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 10ca93cc1dSEli Friedman #include "lldb/API/SBDebugger.h" 1130fdc8d8SChris Lattner 1230fdc8d8SChris Lattner #include "lldb/lldb-include.h" 1330fdc8d8SChris Lattner 14ca93cc1dSEli Friedman #include "lldb/API/SBListener.h" 15ca93cc1dSEli Friedman #include "lldb/API/SBBroadcaster.h" 16ca93cc1dSEli Friedman #include "lldb/API/SBCommandInterpreter.h" 17ca93cc1dSEli Friedman #include "lldb/API/SBCommandReturnObject.h" 18ca93cc1dSEli Friedman #include "lldb/API/SBEvent.h" 19ca93cc1dSEli Friedman #include "lldb/API/SBFrame.h" 20ca93cc1dSEli Friedman #include "lldb/API/SBInputReader.h" 213df9a8dfSCaroline Tice #include "lldb/API/SBProcess.h" 223df9a8dfSCaroline Tice #include "lldb/API/SBSourceManager.h" 23dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 243df9a8dfSCaroline Tice #include "lldb/API/SBStringList.h" 253df9a8dfSCaroline Tice #include "lldb/API/SBTarget.h" 263df9a8dfSCaroline Tice #include "lldb/API/SBThread.h" 276eee5aa0SGreg Clayton #include "lldb/Core/Debugger.h" 286eee5aa0SGreg Clayton #include "lldb/Core/State.h" 296eee5aa0SGreg Clayton #include "lldb/Interpreter/Args.h" 306eee5aa0SGreg Clayton #include "lldb/Interpreter/CommandInterpreter.h" 316eee5aa0SGreg Clayton #include "lldb/Target/Process.h" 326eee5aa0SGreg Clayton #include "lldb/Target/TargetList.h" 3330fdc8d8SChris Lattner 3430fdc8d8SChris Lattner using namespace lldb; 3530fdc8d8SChris Lattner using namespace lldb_private; 3630fdc8d8SChris Lattner 3730fdc8d8SChris Lattner void 3830fdc8d8SChris Lattner SBDebugger::Initialize () 3930fdc8d8SChris Lattner { 4030fdc8d8SChris Lattner Debugger::Initialize(); 4130fdc8d8SChris Lattner } 4230fdc8d8SChris Lattner 4330fdc8d8SChris Lattner void 4430fdc8d8SChris Lattner SBDebugger::Terminate () 4530fdc8d8SChris Lattner { 4630fdc8d8SChris Lattner Debugger::Terminate(); 4730fdc8d8SChris Lattner } 4830fdc8d8SChris Lattner 4948e42549SGreg Clayton void 5048e42549SGreg Clayton SBDebugger::Clear () 5148e42549SGreg Clayton { 5248e42549SGreg Clayton m_opaque_sp.reset(); 5348e42549SGreg Clayton } 5448e42549SGreg Clayton 556611103cSGreg Clayton SBDebugger 566611103cSGreg Clayton SBDebugger::Create() 576611103cSGreg Clayton { 586611103cSGreg Clayton SBDebugger debugger; 596611103cSGreg Clayton debugger.reset(Debugger::CreateInstance()); 606611103cSGreg Clayton return debugger; 616611103cSGreg Clayton } 626611103cSGreg Clayton 636611103cSGreg Clayton SBDebugger::SBDebugger () : 646611103cSGreg Clayton m_opaque_sp () 656611103cSGreg Clayton { 666611103cSGreg Clayton } 676611103cSGreg Clayton 686611103cSGreg Clayton SBDebugger::~SBDebugger () 696611103cSGreg Clayton { 706611103cSGreg Clayton } 716611103cSGreg Clayton 726611103cSGreg Clayton bool 736611103cSGreg Clayton SBDebugger::IsValid() const 746611103cSGreg Clayton { 756611103cSGreg Clayton return m_opaque_sp.get() != NULL; 766611103cSGreg Clayton } 776611103cSGreg Clayton 786611103cSGreg Clayton 7930fdc8d8SChris Lattner void 8030fdc8d8SChris Lattner SBDebugger::SetAsync (bool b) 8130fdc8d8SChris Lattner { 826611103cSGreg Clayton if (m_opaque_sp) 836611103cSGreg Clayton m_opaque_sp->SetAsyncExecution(b); 8430fdc8d8SChris Lattner } 8530fdc8d8SChris Lattner 866eee5aa0SGreg Clayton void 876eee5aa0SGreg Clayton SBDebugger::SkipLLDBInitFiles (bool b) 886eee5aa0SGreg Clayton { 896eee5aa0SGreg Clayton if (m_opaque_sp) 906eee5aa0SGreg Clayton m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles (b); 916eee5aa0SGreg Clayton } 926eee5aa0SGreg Clayton 9330fdc8d8SChris Lattner // Shouldn't really be settable after initialization as this could cause lots of problems; don't want users 9430fdc8d8SChris Lattner // trying to switch modes in the middle of a debugging session. 9530fdc8d8SChris Lattner void 9630fdc8d8SChris Lattner SBDebugger::SetInputFileHandle (FILE *fh, bool transfer_ownership) 9730fdc8d8SChris Lattner { 986611103cSGreg Clayton if (m_opaque_sp) 996611103cSGreg Clayton m_opaque_sp->SetInputFileHandle (fh, transfer_ownership); 10030fdc8d8SChris Lattner } 10130fdc8d8SChris Lattner 10230fdc8d8SChris Lattner void 10330fdc8d8SChris Lattner SBDebugger::SetOutputFileHandle (FILE *fh, bool transfer_ownership) 10430fdc8d8SChris Lattner { 1056611103cSGreg Clayton if (m_opaque_sp) 1066611103cSGreg Clayton m_opaque_sp->SetOutputFileHandle (fh, transfer_ownership); 10730fdc8d8SChris Lattner } 10830fdc8d8SChris Lattner 10930fdc8d8SChris Lattner void 11030fdc8d8SChris Lattner SBDebugger::SetErrorFileHandle (FILE *fh, bool transfer_ownership) 11130fdc8d8SChris Lattner { 1126611103cSGreg Clayton if (m_opaque_sp) 1136611103cSGreg Clayton m_opaque_sp->SetErrorFileHandle (fh, transfer_ownership); 11430fdc8d8SChris Lattner } 11530fdc8d8SChris Lattner 11630fdc8d8SChris Lattner FILE * 11730fdc8d8SChris Lattner SBDebugger::GetInputFileHandle () 11830fdc8d8SChris Lattner { 1196611103cSGreg Clayton if (m_opaque_sp) 1206611103cSGreg Clayton return m_opaque_sp->GetInputFileHandle(); 1216611103cSGreg Clayton return NULL; 12230fdc8d8SChris Lattner } 12330fdc8d8SChris Lattner 12430fdc8d8SChris Lattner FILE * 12530fdc8d8SChris Lattner SBDebugger::GetOutputFileHandle () 12630fdc8d8SChris Lattner { 1276611103cSGreg Clayton if (m_opaque_sp) 1286611103cSGreg Clayton return m_opaque_sp->GetOutputFileHandle(); 1296611103cSGreg Clayton return NULL; 13030fdc8d8SChris Lattner } 13130fdc8d8SChris Lattner 13230fdc8d8SChris Lattner FILE * 13330fdc8d8SChris Lattner SBDebugger::GetErrorFileHandle () 13430fdc8d8SChris Lattner { 1356611103cSGreg Clayton if (m_opaque_sp) 1366611103cSGreg Clayton return m_opaque_sp->GetErrorFileHandle(); 1376611103cSGreg Clayton return NULL; 13830fdc8d8SChris Lattner } 13930fdc8d8SChris Lattner 14030fdc8d8SChris Lattner SBCommandInterpreter 14130fdc8d8SChris Lattner SBDebugger::GetCommandInterpreter () 14230fdc8d8SChris Lattner { 1436611103cSGreg Clayton SBCommandInterpreter sb_interpreter; 1446611103cSGreg Clayton if (m_opaque_sp) 1456611103cSGreg Clayton sb_interpreter.reset (&m_opaque_sp->GetCommandInterpreter()); 14630fdc8d8SChris Lattner return sb_interpreter; 14730fdc8d8SChris Lattner } 14830fdc8d8SChris Lattner 14930fdc8d8SChris Lattner void 15030fdc8d8SChris Lattner SBDebugger::HandleCommand (const char *command) 15130fdc8d8SChris Lattner { 1526611103cSGreg Clayton if (m_opaque_sp) 1536611103cSGreg Clayton { 1546611103cSGreg Clayton SBCommandInterpreter sb_interpreter(GetCommandInterpreter ()); 15530fdc8d8SChris Lattner SBCommandReturnObject result; 15630fdc8d8SChris Lattner 15730fdc8d8SChris Lattner sb_interpreter.HandleCommand (command, result, false); 15830fdc8d8SChris Lattner 15930fdc8d8SChris Lattner if (GetErrorFileHandle() != NULL) 16030fdc8d8SChris Lattner result.PutError (GetErrorFileHandle()); 16130fdc8d8SChris Lattner if (GetOutputFileHandle() != NULL) 16230fdc8d8SChris Lattner result.PutOutput (GetOutputFileHandle()); 16330fdc8d8SChris Lattner 1646611103cSGreg Clayton if (m_opaque_sp->GetAsyncExecution() == false) 16530fdc8d8SChris Lattner { 1666611103cSGreg Clayton SBProcess process(GetCommandInterpreter().GetProcess ()); 16730fdc8d8SChris Lattner if (process.IsValid()) 16830fdc8d8SChris Lattner { 16930fdc8d8SChris Lattner EventSP event_sp; 1706611103cSGreg Clayton Listener &lldb_listener = m_opaque_sp->GetListener(); 17130fdc8d8SChris Lattner while (lldb_listener.GetNextEventForBroadcaster (process.get(), event_sp)) 17230fdc8d8SChris Lattner { 17330fdc8d8SChris Lattner SBEvent event(event_sp); 17430fdc8d8SChris Lattner HandleProcessEvent (process, event, GetOutputFileHandle(), GetErrorFileHandle()); 17530fdc8d8SChris Lattner } 17630fdc8d8SChris Lattner } 17730fdc8d8SChris Lattner } 17830fdc8d8SChris Lattner } 1796611103cSGreg Clayton } 18030fdc8d8SChris Lattner 18130fdc8d8SChris Lattner SBListener 18230fdc8d8SChris Lattner SBDebugger::GetListener () 18330fdc8d8SChris Lattner { 1846611103cSGreg Clayton SBListener sb_listener; 1856611103cSGreg Clayton if (m_opaque_sp) 1866611103cSGreg Clayton sb_listener.reset(&m_opaque_sp->GetListener(), false); 18730fdc8d8SChris Lattner return sb_listener; 18830fdc8d8SChris Lattner } 18930fdc8d8SChris Lattner 19030fdc8d8SChris Lattner void 19130fdc8d8SChris Lattner SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, FILE *out, FILE *err) 19230fdc8d8SChris Lattner { 19330fdc8d8SChris Lattner const uint32_t event_type = event.GetType(); 19430fdc8d8SChris Lattner char stdio_buffer[1024]; 19530fdc8d8SChris Lattner size_t len; 19630fdc8d8SChris Lattner 19730fdc8d8SChris Lattner if (event_type & Process::eBroadcastBitSTDOUT) 19830fdc8d8SChris Lattner { 19930fdc8d8SChris Lattner while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0) 20030fdc8d8SChris Lattner if (out != NULL) 20130fdc8d8SChris Lattner ::fwrite (stdio_buffer, 1, len, out); 20230fdc8d8SChris Lattner } 20330fdc8d8SChris Lattner else if (event_type & Process::eBroadcastBitSTDERR) 20430fdc8d8SChris Lattner { 20530fdc8d8SChris Lattner while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0) 20630fdc8d8SChris Lattner if (out != NULL) 20730fdc8d8SChris Lattner ::fwrite (stdio_buffer, 1, len, out); 20830fdc8d8SChris Lattner } 20930fdc8d8SChris Lattner else if (event_type & Process::eBroadcastBitStateChanged) 21030fdc8d8SChris Lattner { 21130fdc8d8SChris Lattner // Drain any stdout messages. 21230fdc8d8SChris Lattner while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0) 21330fdc8d8SChris Lattner if (out != NULL) 21430fdc8d8SChris Lattner ::fwrite (stdio_buffer, 1, len, out); 21530fdc8d8SChris Lattner 21630fdc8d8SChris Lattner // Drain any stderr messages. 21730fdc8d8SChris Lattner while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0) 21830fdc8d8SChris Lattner if (out != NULL) 21930fdc8d8SChris Lattner ::fwrite (stdio_buffer, 1, len, out); 22030fdc8d8SChris Lattner 22130fdc8d8SChris Lattner StateType event_state = SBProcess::GetStateFromEvent (event); 22230fdc8d8SChris Lattner 22330fdc8d8SChris Lattner if (event_state == eStateInvalid) 22430fdc8d8SChris Lattner return; 22530fdc8d8SChris Lattner 22630fdc8d8SChris Lattner bool is_stopped = StateIsStoppedState (event_state); 22730fdc8d8SChris Lattner if (!is_stopped) 2282976d00aSJim Ingham process.ReportEventState (event, out); 22930fdc8d8SChris Lattner } 23030fdc8d8SChris Lattner } 23130fdc8d8SChris Lattner 23230fdc8d8SChris Lattner void 2332976d00aSJim Ingham SBDebugger::UpdateSelectedThread (SBProcess &process) 23430fdc8d8SChris Lattner { 23530fdc8d8SChris Lattner if (process.IsValid()) 23630fdc8d8SChris Lattner { 2372976d00aSJim Ingham SBThread curr_thread = process.GetSelectedThread (); 23830fdc8d8SChris Lattner SBThread thread; 23930fdc8d8SChris Lattner StopReason curr_thread_stop_reason = eStopReasonInvalid; 24030fdc8d8SChris Lattner if (curr_thread.IsValid()) 24130fdc8d8SChris Lattner { 24230fdc8d8SChris Lattner if (curr_thread.GetStopReason() != eStopReasonInvalid) 24330fdc8d8SChris Lattner curr_thread_stop_reason = curr_thread.GetStopReason (); 24430fdc8d8SChris Lattner } 24530fdc8d8SChris Lattner 24630fdc8d8SChris Lattner if (! curr_thread.IsValid() 24730fdc8d8SChris Lattner || curr_thread_stop_reason == eStopReasonInvalid 24830fdc8d8SChris Lattner || curr_thread_stop_reason == eStopReasonNone) 24930fdc8d8SChris Lattner { 25030fdc8d8SChris Lattner // Prefer a thread that has just completed its plan over another thread as current thread. 25130fdc8d8SChris Lattner SBThread plan_thread; 25230fdc8d8SChris Lattner SBThread other_thread; 25330fdc8d8SChris Lattner const size_t num_threads = process.GetNumThreads (); 25430fdc8d8SChris Lattner size_t i; 25530fdc8d8SChris Lattner for (i = 0; i < num_threads; ++i) 25630fdc8d8SChris Lattner { 25730fdc8d8SChris Lattner thread = process.GetThreadAtIndex(i); 25830fdc8d8SChris Lattner if (thread.GetStopReason () != eStopReasonInvalid) 25930fdc8d8SChris Lattner { 26030fdc8d8SChris Lattner switch (thread.GetStopReason ()) 26130fdc8d8SChris Lattner { 26230fdc8d8SChris Lattner default: 26330fdc8d8SChris Lattner case eStopReasonInvalid: 26430fdc8d8SChris Lattner case eStopReasonNone: 26530fdc8d8SChris Lattner break; 26630fdc8d8SChris Lattner 26730fdc8d8SChris Lattner case eStopReasonTrace: 26830fdc8d8SChris Lattner case eStopReasonBreakpoint: 26930fdc8d8SChris Lattner case eStopReasonWatchpoint: 27030fdc8d8SChris Lattner case eStopReasonSignal: 27130fdc8d8SChris Lattner case eStopReasonException: 27230fdc8d8SChris Lattner if (! other_thread.IsValid()) 27330fdc8d8SChris Lattner other_thread = thread; 27430fdc8d8SChris Lattner break; 27530fdc8d8SChris Lattner case eStopReasonPlanComplete: 27630fdc8d8SChris Lattner if (! plan_thread.IsValid()) 27730fdc8d8SChris Lattner plan_thread = thread; 27830fdc8d8SChris Lattner break; 27930fdc8d8SChris Lattner } 28030fdc8d8SChris Lattner } 28130fdc8d8SChris Lattner } 28230fdc8d8SChris Lattner if (plan_thread.IsValid()) 2832976d00aSJim Ingham process.SetSelectedThreadByID (plan_thread.GetThreadID()); 28430fdc8d8SChris Lattner else if (other_thread.IsValid()) 2852976d00aSJim Ingham process.SetSelectedThreadByID (other_thread.GetThreadID()); 28630fdc8d8SChris Lattner else 28730fdc8d8SChris Lattner { 28830fdc8d8SChris Lattner if (curr_thread.IsValid()) 28930fdc8d8SChris Lattner thread = curr_thread; 29030fdc8d8SChris Lattner else 29130fdc8d8SChris Lattner thread = process.GetThreadAtIndex(0); 29230fdc8d8SChris Lattner 29330fdc8d8SChris Lattner if (thread.IsValid()) 2942976d00aSJim Ingham process.SetSelectedThreadByID (thread.GetThreadID()); 29530fdc8d8SChris Lattner } 29630fdc8d8SChris Lattner } 29730fdc8d8SChris Lattner } 29830fdc8d8SChris Lattner } 29930fdc8d8SChris Lattner 30030fdc8d8SChris Lattner SBSourceManager & 30130fdc8d8SChris Lattner SBDebugger::GetSourceManager () 30230fdc8d8SChris Lattner { 30330fdc8d8SChris Lattner static SourceManager g_lldb_source_manager; 30430fdc8d8SChris Lattner static SBSourceManager g_sb_source_manager (g_lldb_source_manager); 30530fdc8d8SChris Lattner return g_sb_source_manager; 30630fdc8d8SChris Lattner } 30730fdc8d8SChris Lattner 30830fdc8d8SChris Lattner 30930fdc8d8SChris Lattner bool 31030fdc8d8SChris Lattner SBDebugger::GetDefaultArchitecture (char *arch_name, size_t arch_name_len) 31130fdc8d8SChris Lattner { 31230fdc8d8SChris Lattner if (arch_name && arch_name_len) 31330fdc8d8SChris Lattner { 314daccaa9eSCaroline Tice ArchSpec default_arch = lldb_private::Target::GetDefaultArchitecture (); 315daccaa9eSCaroline Tice 31630fdc8d8SChris Lattner if (default_arch.IsValid()) 31730fdc8d8SChris Lattner { 31830fdc8d8SChris Lattner ::snprintf (arch_name, arch_name_len, "%s", default_arch.AsCString()); 31930fdc8d8SChris Lattner return true; 32030fdc8d8SChris Lattner } 32130fdc8d8SChris Lattner } 32230fdc8d8SChris Lattner if (arch_name && arch_name_len) 32330fdc8d8SChris Lattner arch_name[0] = '\0'; 32430fdc8d8SChris Lattner return false; 32530fdc8d8SChris Lattner } 32630fdc8d8SChris Lattner 32730fdc8d8SChris Lattner 32830fdc8d8SChris Lattner bool 32930fdc8d8SChris Lattner SBDebugger::SetDefaultArchitecture (const char *arch_name) 33030fdc8d8SChris Lattner { 33130fdc8d8SChris Lattner if (arch_name) 33230fdc8d8SChris Lattner { 33330fdc8d8SChris Lattner ArchSpec arch (arch_name); 33430fdc8d8SChris Lattner if (arch.IsValid()) 33530fdc8d8SChris Lattner { 336daccaa9eSCaroline Tice lldb_private::Target::SetDefaultArchitecture (arch); 33730fdc8d8SChris Lattner return true; 33830fdc8d8SChris Lattner } 33930fdc8d8SChris Lattner } 34030fdc8d8SChris Lattner return false; 34130fdc8d8SChris Lattner } 34230fdc8d8SChris Lattner 34330fdc8d8SChris Lattner ScriptLanguage 34430fdc8d8SChris Lattner SBDebugger::GetScriptingLanguage (const char *script_language_name) 34530fdc8d8SChris Lattner { 34630fdc8d8SChris Lattner return Args::StringToScriptLanguage (script_language_name, 34730fdc8d8SChris Lattner eScriptLanguageDefault, 34830fdc8d8SChris Lattner NULL); 34930fdc8d8SChris Lattner } 35030fdc8d8SChris Lattner 35130fdc8d8SChris Lattner const char * 35230fdc8d8SChris Lattner SBDebugger::GetVersionString () 35330fdc8d8SChris Lattner { 35430fdc8d8SChris Lattner return lldb_private::GetVersion(); 35530fdc8d8SChris Lattner } 35630fdc8d8SChris Lattner 35730fdc8d8SChris Lattner const char * 35830fdc8d8SChris Lattner SBDebugger::StateAsCString (lldb::StateType state) 35930fdc8d8SChris Lattner { 36030fdc8d8SChris Lattner return lldb_private::StateAsCString (state); 36130fdc8d8SChris Lattner } 36230fdc8d8SChris Lattner 36330fdc8d8SChris Lattner bool 36430fdc8d8SChris Lattner SBDebugger::StateIsRunningState (lldb::StateType state) 36530fdc8d8SChris Lattner { 36630fdc8d8SChris Lattner return lldb_private::StateIsRunningState (state); 36730fdc8d8SChris Lattner } 36830fdc8d8SChris Lattner 36930fdc8d8SChris Lattner bool 37030fdc8d8SChris Lattner SBDebugger::StateIsStoppedState (lldb::StateType state) 37130fdc8d8SChris Lattner { 37230fdc8d8SChris Lattner return lldb_private::StateIsStoppedState (state); 37330fdc8d8SChris Lattner } 37430fdc8d8SChris Lattner 37530fdc8d8SChris Lattner 37630fdc8d8SChris Lattner SBTarget 37730fdc8d8SChris Lattner SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename, 37830fdc8d8SChris Lattner const char *target_triple) 37930fdc8d8SChris Lattner { 3806611103cSGreg Clayton SBTarget target; 3816611103cSGreg Clayton if (m_opaque_sp) 3826611103cSGreg Clayton { 38330fdc8d8SChris Lattner ArchSpec arch; 384*274060b6SGreg Clayton FileSpec file_spec (filename, true); 38530fdc8d8SChris Lattner arch.SetArchFromTargetTriple(target_triple); 38630fdc8d8SChris Lattner TargetSP target_sp; 3876611103cSGreg Clayton Error error (m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file_spec, arch, NULL, true, target_sp)); 3886611103cSGreg Clayton target.reset (target_sp); 3896611103cSGreg Clayton } 39030fdc8d8SChris Lattner return target; 39130fdc8d8SChris Lattner } 39230fdc8d8SChris Lattner 39330fdc8d8SChris Lattner SBTarget 39430fdc8d8SChris Lattner SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *archname) 39530fdc8d8SChris Lattner { 3966611103cSGreg Clayton SBTarget target; 3976611103cSGreg Clayton if (m_opaque_sp) 3986611103cSGreg Clayton { 399*274060b6SGreg Clayton FileSpec file (filename, true); 400daccaa9eSCaroline Tice ArchSpec arch = lldb_private::Target::GetDefaultArchitecture (); 40130fdc8d8SChris Lattner TargetSP target_sp; 40230fdc8d8SChris Lattner Error error; 40330fdc8d8SChris Lattner 40430fdc8d8SChris Lattner if (archname != NULL) 40530fdc8d8SChris Lattner { 40630fdc8d8SChris Lattner ArchSpec arch2 (archname); 4076611103cSGreg Clayton error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch2, NULL, true, target_sp); 40830fdc8d8SChris Lattner } 40930fdc8d8SChris Lattner else 41030fdc8d8SChris Lattner { 41130fdc8d8SChris Lattner if (!arch.IsValid()) 41230fdc8d8SChris Lattner arch = LLDB_ARCH_DEFAULT; 41330fdc8d8SChris Lattner 4146611103cSGreg Clayton error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp); 41530fdc8d8SChris Lattner 41630fdc8d8SChris Lattner if (error.Fail()) 41730fdc8d8SChris Lattner { 41830fdc8d8SChris Lattner if (arch == LLDB_ARCH_DEFAULT_32BIT) 41930fdc8d8SChris Lattner arch = LLDB_ARCH_DEFAULT_64BIT; 42030fdc8d8SChris Lattner else 42130fdc8d8SChris Lattner arch = LLDB_ARCH_DEFAULT_32BIT; 42230fdc8d8SChris Lattner 4236611103cSGreg Clayton error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp); 42430fdc8d8SChris Lattner } 42530fdc8d8SChris Lattner } 42630fdc8d8SChris Lattner 42730fdc8d8SChris Lattner if (error.Success()) 4286611103cSGreg Clayton { 4292976d00aSJim Ingham m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get()); 4306611103cSGreg Clayton target.reset(target_sp); 4316611103cSGreg Clayton } 4326611103cSGreg Clayton } 4336611103cSGreg Clayton return target; 43430fdc8d8SChris Lattner } 43530fdc8d8SChris Lattner 43630fdc8d8SChris Lattner SBTarget 43730fdc8d8SChris Lattner SBDebugger::CreateTarget (const char *filename) 43830fdc8d8SChris Lattner { 4396611103cSGreg Clayton SBTarget target; 4406611103cSGreg Clayton if (m_opaque_sp) 4416611103cSGreg Clayton { 442*274060b6SGreg Clayton FileSpec file (filename, true); 443daccaa9eSCaroline Tice ArchSpec arch = lldb_private::Target::GetDefaultArchitecture (); 44430fdc8d8SChris Lattner TargetSP target_sp; 44530fdc8d8SChris Lattner Error error; 44630fdc8d8SChris Lattner 44730fdc8d8SChris Lattner if (!arch.IsValid()) 44830fdc8d8SChris Lattner arch = LLDB_ARCH_DEFAULT; 44930fdc8d8SChris Lattner 4506611103cSGreg Clayton error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp); 45130fdc8d8SChris Lattner 45230fdc8d8SChris Lattner if (error.Fail()) 45330fdc8d8SChris Lattner { 45430fdc8d8SChris Lattner if (arch == LLDB_ARCH_DEFAULT_32BIT) 45530fdc8d8SChris Lattner arch = LLDB_ARCH_DEFAULT_64BIT; 45630fdc8d8SChris Lattner else 45730fdc8d8SChris Lattner arch = LLDB_ARCH_DEFAULT_32BIT; 45830fdc8d8SChris Lattner 4596611103cSGreg Clayton error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp); 46030fdc8d8SChris Lattner } 46130fdc8d8SChris Lattner 4626611103cSGreg Clayton if (error.Success()) 4636611103cSGreg Clayton { 4642976d00aSJim Ingham m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get()); 4656611103cSGreg Clayton target.reset (target_sp); 4666611103cSGreg Clayton } 4676611103cSGreg Clayton } 4686611103cSGreg Clayton return target; 46930fdc8d8SChris Lattner } 47030fdc8d8SChris Lattner 47130fdc8d8SChris Lattner SBTarget 47230fdc8d8SChris Lattner SBDebugger::GetTargetAtIndex (uint32_t idx) 47330fdc8d8SChris Lattner { 4746611103cSGreg Clayton SBTarget sb_target; 4756611103cSGreg Clayton if (m_opaque_sp) 4766611103cSGreg Clayton sb_target.reset(m_opaque_sp->GetTargetList().GetTargetAtIndex (idx)); 47730fdc8d8SChris Lattner return sb_target; 47830fdc8d8SChris Lattner } 47930fdc8d8SChris Lattner 48030fdc8d8SChris Lattner SBTarget 48130fdc8d8SChris Lattner SBDebugger::FindTargetWithProcessID (pid_t pid) 48230fdc8d8SChris Lattner { 4836611103cSGreg Clayton SBTarget sb_target; 4846611103cSGreg Clayton if (m_opaque_sp) 4856611103cSGreg Clayton sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid)); 48630fdc8d8SChris Lattner return sb_target; 48730fdc8d8SChris Lattner } 48830fdc8d8SChris Lattner 48930fdc8d8SChris Lattner SBTarget 49030fdc8d8SChris Lattner SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name) 49130fdc8d8SChris Lattner { 4926611103cSGreg Clayton SBTarget sb_target; 4936611103cSGreg Clayton if (m_opaque_sp && filename && filename[0]) 4946611103cSGreg Clayton { 49530fdc8d8SChris Lattner ArchSpec arch; 49630fdc8d8SChris Lattner if (arch_name) 49730fdc8d8SChris Lattner arch.SetArch(arch_name); 498*274060b6SGreg Clayton TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename, false), arch_name ? &arch : NULL)); 4996611103cSGreg Clayton sb_target.reset(target_sp); 5006611103cSGreg Clayton } 5016611103cSGreg Clayton return sb_target; 50230fdc8d8SChris Lattner } 50330fdc8d8SChris Lattner 50430fdc8d8SChris Lattner SBTarget 50530fdc8d8SChris Lattner SBDebugger::FindTargetWithLLDBProcess (const lldb::ProcessSP &process_sp) 50630fdc8d8SChris Lattner { 5076611103cSGreg Clayton SBTarget sb_target; 5086611103cSGreg Clayton if (m_opaque_sp) 5096611103cSGreg Clayton sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get())); 51030fdc8d8SChris Lattner return sb_target; 51130fdc8d8SChris Lattner } 51230fdc8d8SChris Lattner 51330fdc8d8SChris Lattner 51430fdc8d8SChris Lattner uint32_t 51530fdc8d8SChris Lattner SBDebugger::GetNumTargets () 51630fdc8d8SChris Lattner { 5176611103cSGreg Clayton if (m_opaque_sp) 5186611103cSGreg Clayton return m_opaque_sp->GetTargetList().GetNumTargets (); 5196611103cSGreg Clayton return 0; 5206611103cSGreg Clayton } 52130fdc8d8SChris Lattner 52230fdc8d8SChris Lattner SBTarget 5232976d00aSJim Ingham SBDebugger::GetSelectedTarget () 52430fdc8d8SChris Lattner { 5256611103cSGreg Clayton SBTarget sb_target; 5266611103cSGreg Clayton if (m_opaque_sp) 5272976d00aSJim Ingham sb_target.reset(m_opaque_sp->GetTargetList().GetSelectedTarget ()); 52830fdc8d8SChris Lattner return sb_target; 52930fdc8d8SChris Lattner } 53030fdc8d8SChris Lattner 53130fdc8d8SChris Lattner void 53230fdc8d8SChris Lattner SBDebugger::DispatchInput (void *baton, const void *data, size_t data_len) 53330fdc8d8SChris Lattner { 5346611103cSGreg Clayton if (m_opaque_sp) 5356611103cSGreg Clayton m_opaque_sp->DispatchInput ((const char *) data, data_len); 53630fdc8d8SChris Lattner } 53730fdc8d8SChris Lattner 53830fdc8d8SChris Lattner void 53930fdc8d8SChris Lattner SBDebugger::PushInputReader (SBInputReader &reader) 54030fdc8d8SChris Lattner { 5416611103cSGreg Clayton if (m_opaque_sp && reader.IsValid()) 54230fdc8d8SChris Lattner { 54330fdc8d8SChris Lattner InputReaderSP reader_sp(*reader); 5446611103cSGreg Clayton m_opaque_sp->PushInputReader (reader_sp); 54530fdc8d8SChris Lattner } 54630fdc8d8SChris Lattner } 5476611103cSGreg Clayton 5486611103cSGreg Clayton void 5496611103cSGreg Clayton SBDebugger::reset (const lldb::DebuggerSP &debugger_sp) 5506611103cSGreg Clayton { 5516611103cSGreg Clayton m_opaque_sp = debugger_sp; 5526611103cSGreg Clayton } 5536611103cSGreg Clayton 5546611103cSGreg Clayton Debugger * 5556611103cSGreg Clayton SBDebugger::get () const 5566611103cSGreg Clayton { 5576611103cSGreg Clayton return m_opaque_sp.get(); 5586611103cSGreg Clayton } 5596611103cSGreg Clayton 5606611103cSGreg Clayton Debugger & 5616611103cSGreg Clayton SBDebugger::ref () const 5626611103cSGreg Clayton { 5636611103cSGreg Clayton assert (m_opaque_sp.get()); 5646611103cSGreg Clayton return *m_opaque_sp; 5656611103cSGreg Clayton } 5666611103cSGreg Clayton 5676611103cSGreg Clayton 568ebc1bb27SCaroline Tice SBDebugger 569ebc1bb27SCaroline Tice SBDebugger::FindDebuggerWithID (int id) 570ebc1bb27SCaroline Tice { 571ebc1bb27SCaroline Tice SBDebugger sb_debugger; 572ebc1bb27SCaroline Tice lldb::DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id); 573ebc1bb27SCaroline Tice if (debugger_sp) 574ebc1bb27SCaroline Tice sb_debugger.reset (debugger_sp); 575ebc1bb27SCaroline Tice return sb_debugger; 576ebc1bb27SCaroline Tice } 577e40e4218SJim Ingham 578dd759857SCaroline Tice const char * 579dd759857SCaroline Tice SBDebugger::GetInstanceName() 580dd759857SCaroline Tice { 581dd759857SCaroline Tice if (m_opaque_sp) 582dd759857SCaroline Tice return m_opaque_sp->GetInstanceName().AsCString(); 583dd759857SCaroline Tice else 584dd759857SCaroline Tice return NULL; 585dd759857SCaroline Tice } 586dd759857SCaroline Tice 5873df9a8dfSCaroline Tice SBError 588dd759857SCaroline Tice SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name) 5893df9a8dfSCaroline Tice { 5903df9a8dfSCaroline Tice lldb::UserSettingsControllerSP root_settings_controller = lldb_private::Debugger::GetSettingsController(); 5913df9a8dfSCaroline Tice 5921559a46bSCaroline Tice Error err = root_settings_controller->SetVariable (var_name, value, lldb::eVarSetOperationAssign, true, 593101c7c20SCaroline Tice debugger_instance_name); 5943df9a8dfSCaroline Tice SBError sb_error; 5953df9a8dfSCaroline Tice sb_error.SetError (err); 5963df9a8dfSCaroline Tice 5973df9a8dfSCaroline Tice return sb_error; 5983df9a8dfSCaroline Tice } 5993df9a8dfSCaroline Tice 6003df9a8dfSCaroline Tice lldb::SBStringList 601dd759857SCaroline Tice SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name) 6023df9a8dfSCaroline Tice { 6033df9a8dfSCaroline Tice SBStringList ret_value; 604101c7c20SCaroline Tice lldb::SettableVariableType var_type; 605daccaa9eSCaroline Tice lldb_private:Error err; 606101c7c20SCaroline Tice 6073df9a8dfSCaroline Tice lldb::UserSettingsControllerSP root_settings_controller = lldb_private::Debugger::GetSettingsController(); 6083df9a8dfSCaroline Tice 609daccaa9eSCaroline Tice StringList value = root_settings_controller->GetVariable (var_name, var_type, debugger_instance_name, err); 610daccaa9eSCaroline Tice 611daccaa9eSCaroline Tice if (err.Success()) 612daccaa9eSCaroline Tice { 613311adf3dSChris Lattner for (unsigned i = 0; i != value.GetSize(); ++i) 6143df9a8dfSCaroline Tice ret_value.AppendString (value.GetStringAtIndex(i)); 615daccaa9eSCaroline Tice } 616daccaa9eSCaroline Tice else 617daccaa9eSCaroline Tice { 618daccaa9eSCaroline Tice ret_value.AppendString (err.AsCString()); 619daccaa9eSCaroline Tice } 620daccaa9eSCaroline Tice 6213df9a8dfSCaroline Tice 6223df9a8dfSCaroline Tice return ret_value; 6233df9a8dfSCaroline Tice } 6243df9a8dfSCaroline Tice 625a7015092SGreg Clayton uint32_t 626a7015092SGreg Clayton SBDebugger::GetTerminalWidth () const 627a7015092SGreg Clayton { 628a7015092SGreg Clayton if (m_opaque_sp) 629a7015092SGreg Clayton return m_opaque_sp->GetTerminalWidth (); 630a7015092SGreg Clayton return 0; 631a7015092SGreg Clayton } 632a7015092SGreg Clayton 633a7015092SGreg Clayton void 634a7015092SGreg Clayton SBDebugger::SetTerminalWidth (uint32_t term_width) 635a7015092SGreg Clayton { 636a7015092SGreg Clayton if (m_opaque_sp) 637a7015092SGreg Clayton m_opaque_sp->SetTerminalWidth (term_width); 638a7015092SGreg Clayton } 639a7015092SGreg Clayton 640a7015092SGreg Clayton const char * 641a7015092SGreg Clayton SBDebugger::GetPrompt() const 642a7015092SGreg Clayton { 643a7015092SGreg Clayton if (m_opaque_sp) 644a7015092SGreg Clayton return m_opaque_sp->GetPrompt (); 645a7015092SGreg Clayton return 0; 646a7015092SGreg Clayton } 647a7015092SGreg Clayton 648a7015092SGreg Clayton void 649a7015092SGreg Clayton SBDebugger::SetPrompt (const char *prompt) 650a7015092SGreg Clayton { 651a7015092SGreg Clayton if (m_opaque_sp) 652a7015092SGreg Clayton m_opaque_sp->SetPrompt (prompt); 653a7015092SGreg Clayton } 654a7015092SGreg Clayton 655a7015092SGreg Clayton 656a7015092SGreg Clayton lldb::ScriptLanguage 657a7015092SGreg Clayton SBDebugger::GetScriptLanguage() const 658a7015092SGreg Clayton { 659a7015092SGreg Clayton if (m_opaque_sp) 660a7015092SGreg Clayton return m_opaque_sp->GetScriptLanguage (); 661a7015092SGreg Clayton return eScriptLanguageNone; 662a7015092SGreg Clayton } 663a7015092SGreg Clayton 664a7015092SGreg Clayton void 665a7015092SGreg Clayton SBDebugger::SetScriptLanguage (lldb::ScriptLanguage script_lang) 666a7015092SGreg Clayton { 667a7015092SGreg Clayton if (m_opaque_sp) 668a7015092SGreg Clayton m_opaque_sp->SetScriptLanguage (script_lang); 669a7015092SGreg Clayton } 670a7015092SGreg Clayton 671a7015092SGreg Clayton 672a7015092SGreg Clayton 673a7015092SGreg Clayton 674e40e4218SJim Ingham bool 675e40e4218SJim Ingham SBDebugger::SetUseExternalEditor (bool value) 676e40e4218SJim Ingham { 677e40e4218SJim Ingham if (m_opaque_sp) 678e40e4218SJim Ingham return m_opaque_sp->SetUseExternalEditor (value); 679e40e4218SJim Ingham else 680e40e4218SJim Ingham return false; 681e40e4218SJim Ingham } 682e40e4218SJim Ingham 683e40e4218SJim Ingham bool 684daccaa9eSCaroline Tice SBDebugger::GetUseExternalEditor () 685e40e4218SJim Ingham { 686e40e4218SJim Ingham if (m_opaque_sp) 687daccaa9eSCaroline Tice return m_opaque_sp->GetUseExternalEditor (); 688e40e4218SJim Ingham else 689e40e4218SJim Ingham return false; 690e40e4218SJim Ingham } 691e40e4218SJim Ingham 692dde9cff3SCaroline Tice bool 693dde9cff3SCaroline Tice SBDebugger::GetDescription (SBStream &description) 694dde9cff3SCaroline Tice { 695dde9cff3SCaroline Tice if (m_opaque_sp) 696dde9cff3SCaroline Tice { 697dde9cff3SCaroline Tice const char *name = m_opaque_sp->GetInstanceName().AsCString(); 698dde9cff3SCaroline Tice lldb::user_id_t id = m_opaque_sp->GetID(); 699dde9cff3SCaroline Tice description.Printf ("Debugger (instance: '%s', id: %d)", name, id); 700dde9cff3SCaroline Tice } 701dde9cff3SCaroline Tice else 702dde9cff3SCaroline Tice description.Printf ("No value"); 703dde9cff3SCaroline Tice 704dde9cff3SCaroline Tice return true; 705dde9cff3SCaroline Tice } 706