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" 1340af72e1SJim Ingham #include "lldb/Interpreter/Args.h" 1430fdc8d8SChris Lattner #include "lldb/Core/Debugger.h" 1530fdc8d8SChris Lattner #include "lldb/Core/State.h" 1630fdc8d8SChris Lattner #include "lldb/Target/Process.h" 1730fdc8d8SChris Lattner #include "lldb/Target/TargetList.h" 1830fdc8d8SChris Lattner 19ca93cc1dSEli Friedman #include "lldb/API/SBListener.h" 20ca93cc1dSEli Friedman #include "lldb/API/SBBroadcaster.h" 21ca93cc1dSEli Friedman #include "lldb/API/SBCommandInterpreter.h" 22ca93cc1dSEli Friedman #include "lldb/API/SBCommandReturnObject.h" 23ca93cc1dSEli Friedman #include "lldb/API/SBEvent.h" 24ca93cc1dSEli Friedman #include "lldb/API/SBFrame.h" 25ca93cc1dSEli Friedman #include "lldb/API/SBInputReader.h" 263df9a8dfSCaroline Tice #include "lldb/API/SBProcess.h" 273df9a8dfSCaroline Tice #include "lldb/API/SBSourceManager.h" 283df9a8dfSCaroline Tice #include "lldb/API/SBStringList.h" 293df9a8dfSCaroline Tice #include "lldb/API/SBTarget.h" 303df9a8dfSCaroline Tice #include "lldb/API/SBThread.h" 3130fdc8d8SChris Lattner 3230fdc8d8SChris Lattner using namespace lldb; 3330fdc8d8SChris Lattner using namespace lldb_private; 3430fdc8d8SChris Lattner 3530fdc8d8SChris Lattner void 3630fdc8d8SChris Lattner SBDebugger::Initialize () 3730fdc8d8SChris Lattner { 3830fdc8d8SChris Lattner Debugger::Initialize(); 3930fdc8d8SChris Lattner } 4030fdc8d8SChris Lattner 4130fdc8d8SChris Lattner void 4230fdc8d8SChris Lattner SBDebugger::Terminate () 4330fdc8d8SChris Lattner { 4430fdc8d8SChris Lattner Debugger::Terminate(); 4530fdc8d8SChris Lattner } 4630fdc8d8SChris Lattner 4748e42549SGreg Clayton void 4848e42549SGreg Clayton SBDebugger::Clear () 4948e42549SGreg Clayton { 5048e42549SGreg Clayton m_opaque_sp.reset(); 5148e42549SGreg Clayton } 5248e42549SGreg Clayton 536611103cSGreg Clayton SBDebugger 546611103cSGreg Clayton SBDebugger::Create() 556611103cSGreg Clayton { 566611103cSGreg Clayton SBDebugger debugger; 576611103cSGreg Clayton debugger.reset(Debugger::CreateInstance()); 586611103cSGreg Clayton return debugger; 596611103cSGreg Clayton } 606611103cSGreg Clayton 616611103cSGreg Clayton SBDebugger::SBDebugger () : 626611103cSGreg Clayton m_opaque_sp () 636611103cSGreg Clayton { 646611103cSGreg Clayton } 656611103cSGreg Clayton 666611103cSGreg Clayton SBDebugger::~SBDebugger () 676611103cSGreg Clayton { 686611103cSGreg Clayton } 696611103cSGreg Clayton 706611103cSGreg Clayton bool 716611103cSGreg Clayton SBDebugger::IsValid() const 726611103cSGreg Clayton { 736611103cSGreg Clayton return m_opaque_sp.get() != NULL; 746611103cSGreg Clayton } 756611103cSGreg Clayton 766611103cSGreg Clayton 7730fdc8d8SChris Lattner void 7830fdc8d8SChris Lattner SBDebugger::SetAsync (bool b) 7930fdc8d8SChris Lattner { 806611103cSGreg Clayton if (m_opaque_sp) 816611103cSGreg Clayton m_opaque_sp->SetAsyncExecution(b); 8230fdc8d8SChris Lattner } 8330fdc8d8SChris Lattner 8430fdc8d8SChris Lattner // Shouldn't really be settable after initialization as this could cause lots of problems; don't want users 8530fdc8d8SChris Lattner // trying to switch modes in the middle of a debugging session. 8630fdc8d8SChris Lattner void 8730fdc8d8SChris Lattner SBDebugger::SetInputFileHandle (FILE *fh, bool transfer_ownership) 8830fdc8d8SChris Lattner { 896611103cSGreg Clayton if (m_opaque_sp) 906611103cSGreg Clayton m_opaque_sp->SetInputFileHandle (fh, transfer_ownership); 9130fdc8d8SChris Lattner } 9230fdc8d8SChris Lattner 9330fdc8d8SChris Lattner void 9430fdc8d8SChris Lattner SBDebugger::SetOutputFileHandle (FILE *fh, bool transfer_ownership) 9530fdc8d8SChris Lattner { 966611103cSGreg Clayton if (m_opaque_sp) 976611103cSGreg Clayton m_opaque_sp->SetOutputFileHandle (fh, transfer_ownership); 9830fdc8d8SChris Lattner } 9930fdc8d8SChris Lattner 10030fdc8d8SChris Lattner void 10130fdc8d8SChris Lattner SBDebugger::SetErrorFileHandle (FILE *fh, bool transfer_ownership) 10230fdc8d8SChris Lattner { 1036611103cSGreg Clayton if (m_opaque_sp) 1046611103cSGreg Clayton m_opaque_sp->SetErrorFileHandle (fh, transfer_ownership); 10530fdc8d8SChris Lattner } 10630fdc8d8SChris Lattner 10730fdc8d8SChris Lattner FILE * 10830fdc8d8SChris Lattner SBDebugger::GetInputFileHandle () 10930fdc8d8SChris Lattner { 1106611103cSGreg Clayton if (m_opaque_sp) 1116611103cSGreg Clayton return m_opaque_sp->GetInputFileHandle(); 1126611103cSGreg Clayton return NULL; 11330fdc8d8SChris Lattner } 11430fdc8d8SChris Lattner 11530fdc8d8SChris Lattner FILE * 11630fdc8d8SChris Lattner SBDebugger::GetOutputFileHandle () 11730fdc8d8SChris Lattner { 1186611103cSGreg Clayton if (m_opaque_sp) 1196611103cSGreg Clayton return m_opaque_sp->GetOutputFileHandle(); 1206611103cSGreg Clayton return NULL; 12130fdc8d8SChris Lattner } 12230fdc8d8SChris Lattner 12330fdc8d8SChris Lattner FILE * 12430fdc8d8SChris Lattner SBDebugger::GetErrorFileHandle () 12530fdc8d8SChris Lattner { 1266611103cSGreg Clayton if (m_opaque_sp) 1276611103cSGreg Clayton return m_opaque_sp->GetErrorFileHandle(); 1286611103cSGreg Clayton return NULL; 12930fdc8d8SChris Lattner } 13030fdc8d8SChris Lattner 13130fdc8d8SChris Lattner SBCommandInterpreter 13230fdc8d8SChris Lattner SBDebugger::GetCommandInterpreter () 13330fdc8d8SChris Lattner { 1346611103cSGreg Clayton SBCommandInterpreter sb_interpreter; 1356611103cSGreg Clayton if (m_opaque_sp) 1366611103cSGreg Clayton sb_interpreter.reset (&m_opaque_sp->GetCommandInterpreter()); 13730fdc8d8SChris Lattner return sb_interpreter; 13830fdc8d8SChris Lattner } 13930fdc8d8SChris Lattner 14030fdc8d8SChris Lattner void 14130fdc8d8SChris Lattner SBDebugger::HandleCommand (const char *command) 14230fdc8d8SChris Lattner { 1436611103cSGreg Clayton if (m_opaque_sp) 1446611103cSGreg Clayton { 1456611103cSGreg Clayton SBCommandInterpreter sb_interpreter(GetCommandInterpreter ()); 14630fdc8d8SChris Lattner SBCommandReturnObject result; 14730fdc8d8SChris Lattner 14830fdc8d8SChris Lattner sb_interpreter.HandleCommand (command, result, false); 14930fdc8d8SChris Lattner 15030fdc8d8SChris Lattner if (GetErrorFileHandle() != NULL) 15130fdc8d8SChris Lattner result.PutError (GetErrorFileHandle()); 15230fdc8d8SChris Lattner if (GetOutputFileHandle() != NULL) 15330fdc8d8SChris Lattner result.PutOutput (GetOutputFileHandle()); 15430fdc8d8SChris Lattner 1556611103cSGreg Clayton if (m_opaque_sp->GetAsyncExecution() == false) 15630fdc8d8SChris Lattner { 1576611103cSGreg Clayton SBProcess process(GetCommandInterpreter().GetProcess ()); 15830fdc8d8SChris Lattner if (process.IsValid()) 15930fdc8d8SChris Lattner { 16030fdc8d8SChris Lattner EventSP event_sp; 1616611103cSGreg Clayton Listener &lldb_listener = m_opaque_sp->GetListener(); 16230fdc8d8SChris Lattner while (lldb_listener.GetNextEventForBroadcaster (process.get(), event_sp)) 16330fdc8d8SChris Lattner { 16430fdc8d8SChris Lattner SBEvent event(event_sp); 16530fdc8d8SChris Lattner HandleProcessEvent (process, event, GetOutputFileHandle(), GetErrorFileHandle()); 16630fdc8d8SChris Lattner } 16730fdc8d8SChris Lattner } 16830fdc8d8SChris Lattner } 16930fdc8d8SChris Lattner } 1706611103cSGreg Clayton } 17130fdc8d8SChris Lattner 17230fdc8d8SChris Lattner SBListener 17330fdc8d8SChris Lattner SBDebugger::GetListener () 17430fdc8d8SChris Lattner { 1756611103cSGreg Clayton SBListener sb_listener; 1766611103cSGreg Clayton if (m_opaque_sp) 1776611103cSGreg Clayton sb_listener.reset(&m_opaque_sp->GetListener(), false); 17830fdc8d8SChris Lattner return sb_listener; 17930fdc8d8SChris Lattner } 18030fdc8d8SChris Lattner 18130fdc8d8SChris Lattner void 18230fdc8d8SChris Lattner SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, FILE *out, FILE *err) 18330fdc8d8SChris Lattner { 18430fdc8d8SChris Lattner const uint32_t event_type = event.GetType(); 18530fdc8d8SChris Lattner char stdio_buffer[1024]; 18630fdc8d8SChris Lattner size_t len; 18730fdc8d8SChris Lattner 18830fdc8d8SChris Lattner if (event_type & Process::eBroadcastBitSTDOUT) 18930fdc8d8SChris Lattner { 19030fdc8d8SChris Lattner while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0) 19130fdc8d8SChris Lattner if (out != NULL) 19230fdc8d8SChris Lattner ::fwrite (stdio_buffer, 1, len, out); 19330fdc8d8SChris Lattner } 19430fdc8d8SChris Lattner else if (event_type & Process::eBroadcastBitSTDERR) 19530fdc8d8SChris Lattner { 19630fdc8d8SChris Lattner while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0) 19730fdc8d8SChris Lattner if (out != NULL) 19830fdc8d8SChris Lattner ::fwrite (stdio_buffer, 1, len, out); 19930fdc8d8SChris Lattner } 20030fdc8d8SChris Lattner else if (event_type & Process::eBroadcastBitStateChanged) 20130fdc8d8SChris Lattner { 20230fdc8d8SChris Lattner // Drain any stdout messages. 20330fdc8d8SChris Lattner while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0) 20430fdc8d8SChris Lattner if (out != NULL) 20530fdc8d8SChris Lattner ::fwrite (stdio_buffer, 1, len, out); 20630fdc8d8SChris Lattner 20730fdc8d8SChris Lattner // Drain any stderr messages. 20830fdc8d8SChris Lattner while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0) 20930fdc8d8SChris Lattner if (out != NULL) 21030fdc8d8SChris Lattner ::fwrite (stdio_buffer, 1, len, out); 21130fdc8d8SChris Lattner 21230fdc8d8SChris Lattner StateType event_state = SBProcess::GetStateFromEvent (event); 21330fdc8d8SChris Lattner 21430fdc8d8SChris Lattner if (event_state == eStateInvalid) 21530fdc8d8SChris Lattner return; 21630fdc8d8SChris Lattner 21730fdc8d8SChris Lattner bool is_stopped = StateIsStoppedState (event_state); 21830fdc8d8SChris Lattner if (!is_stopped) 2192976d00aSJim Ingham process.ReportEventState (event, out); 22030fdc8d8SChris Lattner } 22130fdc8d8SChris Lattner } 22230fdc8d8SChris Lattner 22330fdc8d8SChris Lattner void 2242976d00aSJim Ingham SBDebugger::UpdateSelectedThread (SBProcess &process) 22530fdc8d8SChris Lattner { 22630fdc8d8SChris Lattner if (process.IsValid()) 22730fdc8d8SChris Lattner { 2282976d00aSJim Ingham SBThread curr_thread = process.GetSelectedThread (); 22930fdc8d8SChris Lattner SBThread thread; 23030fdc8d8SChris Lattner StopReason curr_thread_stop_reason = eStopReasonInvalid; 23130fdc8d8SChris Lattner if (curr_thread.IsValid()) 23230fdc8d8SChris Lattner { 23330fdc8d8SChris Lattner if (curr_thread.GetStopReason() != eStopReasonInvalid) 23430fdc8d8SChris Lattner curr_thread_stop_reason = curr_thread.GetStopReason (); 23530fdc8d8SChris Lattner } 23630fdc8d8SChris Lattner 23730fdc8d8SChris Lattner if (! curr_thread.IsValid() 23830fdc8d8SChris Lattner || curr_thread_stop_reason == eStopReasonInvalid 23930fdc8d8SChris Lattner || curr_thread_stop_reason == eStopReasonNone) 24030fdc8d8SChris Lattner { 24130fdc8d8SChris Lattner // Prefer a thread that has just completed its plan over another thread as current thread. 24230fdc8d8SChris Lattner SBThread plan_thread; 24330fdc8d8SChris Lattner SBThread other_thread; 24430fdc8d8SChris Lattner const size_t num_threads = process.GetNumThreads (); 24530fdc8d8SChris Lattner size_t i; 24630fdc8d8SChris Lattner for (i = 0; i < num_threads; ++i) 24730fdc8d8SChris Lattner { 24830fdc8d8SChris Lattner thread = process.GetThreadAtIndex(i); 24930fdc8d8SChris Lattner if (thread.GetStopReason () != eStopReasonInvalid) 25030fdc8d8SChris Lattner { 25130fdc8d8SChris Lattner switch (thread.GetStopReason ()) 25230fdc8d8SChris Lattner { 25330fdc8d8SChris Lattner default: 25430fdc8d8SChris Lattner case eStopReasonInvalid: 25530fdc8d8SChris Lattner case eStopReasonNone: 25630fdc8d8SChris Lattner break; 25730fdc8d8SChris Lattner 25830fdc8d8SChris Lattner case eStopReasonTrace: 25930fdc8d8SChris Lattner case eStopReasonBreakpoint: 26030fdc8d8SChris Lattner case eStopReasonWatchpoint: 26130fdc8d8SChris Lattner case eStopReasonSignal: 26230fdc8d8SChris Lattner case eStopReasonException: 26330fdc8d8SChris Lattner if (! other_thread.IsValid()) 26430fdc8d8SChris Lattner other_thread = thread; 26530fdc8d8SChris Lattner break; 26630fdc8d8SChris Lattner case eStopReasonPlanComplete: 26730fdc8d8SChris Lattner if (! plan_thread.IsValid()) 26830fdc8d8SChris Lattner plan_thread = thread; 26930fdc8d8SChris Lattner break; 27030fdc8d8SChris Lattner } 27130fdc8d8SChris Lattner } 27230fdc8d8SChris Lattner } 27330fdc8d8SChris Lattner if (plan_thread.IsValid()) 2742976d00aSJim Ingham process.SetSelectedThreadByID (plan_thread.GetThreadID()); 27530fdc8d8SChris Lattner else if (other_thread.IsValid()) 2762976d00aSJim Ingham process.SetSelectedThreadByID (other_thread.GetThreadID()); 27730fdc8d8SChris Lattner else 27830fdc8d8SChris Lattner { 27930fdc8d8SChris Lattner if (curr_thread.IsValid()) 28030fdc8d8SChris Lattner thread = curr_thread; 28130fdc8d8SChris Lattner else 28230fdc8d8SChris Lattner thread = process.GetThreadAtIndex(0); 28330fdc8d8SChris Lattner 28430fdc8d8SChris Lattner if (thread.IsValid()) 2852976d00aSJim Ingham process.SetSelectedThreadByID (thread.GetThreadID()); 28630fdc8d8SChris Lattner } 28730fdc8d8SChris Lattner } 28830fdc8d8SChris Lattner } 28930fdc8d8SChris Lattner } 29030fdc8d8SChris Lattner 29130fdc8d8SChris Lattner SBSourceManager & 29230fdc8d8SChris Lattner SBDebugger::GetSourceManager () 29330fdc8d8SChris Lattner { 29430fdc8d8SChris Lattner static SourceManager g_lldb_source_manager; 29530fdc8d8SChris Lattner static SBSourceManager g_sb_source_manager (g_lldb_source_manager); 29630fdc8d8SChris Lattner return g_sb_source_manager; 29730fdc8d8SChris Lattner } 29830fdc8d8SChris Lattner 29930fdc8d8SChris Lattner 30030fdc8d8SChris Lattner bool 30130fdc8d8SChris Lattner SBDebugger::GetDefaultArchitecture (char *arch_name, size_t arch_name_len) 30230fdc8d8SChris Lattner { 30330fdc8d8SChris Lattner if (arch_name && arch_name_len) 30430fdc8d8SChris Lattner { 30530fdc8d8SChris Lattner ArchSpec &default_arch = lldb_private::GetDefaultArchitecture (); 30630fdc8d8SChris Lattner if (default_arch.IsValid()) 30730fdc8d8SChris Lattner { 30830fdc8d8SChris Lattner ::snprintf (arch_name, arch_name_len, "%s", default_arch.AsCString()); 30930fdc8d8SChris Lattner return true; 31030fdc8d8SChris Lattner } 31130fdc8d8SChris Lattner } 31230fdc8d8SChris Lattner if (arch_name && arch_name_len) 31330fdc8d8SChris Lattner arch_name[0] = '\0'; 31430fdc8d8SChris Lattner return false; 31530fdc8d8SChris Lattner } 31630fdc8d8SChris Lattner 31730fdc8d8SChris Lattner 31830fdc8d8SChris Lattner bool 31930fdc8d8SChris Lattner SBDebugger::SetDefaultArchitecture (const char *arch_name) 32030fdc8d8SChris Lattner { 32130fdc8d8SChris Lattner if (arch_name) 32230fdc8d8SChris Lattner { 32330fdc8d8SChris Lattner ArchSpec arch (arch_name); 32430fdc8d8SChris Lattner if (arch.IsValid()) 32530fdc8d8SChris Lattner { 32630fdc8d8SChris Lattner lldb_private::GetDefaultArchitecture () = arch; 32730fdc8d8SChris Lattner return true; 32830fdc8d8SChris Lattner } 32930fdc8d8SChris Lattner } 33030fdc8d8SChris Lattner return false; 33130fdc8d8SChris Lattner } 33230fdc8d8SChris Lattner 33330fdc8d8SChris Lattner ScriptLanguage 33430fdc8d8SChris Lattner SBDebugger::GetScriptingLanguage (const char *script_language_name) 33530fdc8d8SChris Lattner { 33630fdc8d8SChris Lattner return Args::StringToScriptLanguage (script_language_name, 33730fdc8d8SChris Lattner eScriptLanguageDefault, 33830fdc8d8SChris Lattner NULL); 33930fdc8d8SChris Lattner } 34030fdc8d8SChris Lattner 34130fdc8d8SChris Lattner const char * 34230fdc8d8SChris Lattner SBDebugger::GetVersionString () 34330fdc8d8SChris Lattner { 34430fdc8d8SChris Lattner return lldb_private::GetVersion(); 34530fdc8d8SChris Lattner } 34630fdc8d8SChris Lattner 34730fdc8d8SChris Lattner const char * 34830fdc8d8SChris Lattner SBDebugger::StateAsCString (lldb::StateType state) 34930fdc8d8SChris Lattner { 35030fdc8d8SChris Lattner return lldb_private::StateAsCString (state); 35130fdc8d8SChris Lattner } 35230fdc8d8SChris Lattner 35330fdc8d8SChris Lattner bool 35430fdc8d8SChris Lattner SBDebugger::StateIsRunningState (lldb::StateType state) 35530fdc8d8SChris Lattner { 35630fdc8d8SChris Lattner return lldb_private::StateIsRunningState (state); 35730fdc8d8SChris Lattner } 35830fdc8d8SChris Lattner 35930fdc8d8SChris Lattner bool 36030fdc8d8SChris Lattner SBDebugger::StateIsStoppedState (lldb::StateType state) 36130fdc8d8SChris Lattner { 36230fdc8d8SChris Lattner return lldb_private::StateIsStoppedState (state); 36330fdc8d8SChris Lattner } 36430fdc8d8SChris Lattner 36530fdc8d8SChris Lattner 36630fdc8d8SChris Lattner SBTarget 36730fdc8d8SChris Lattner SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename, 36830fdc8d8SChris Lattner const char *target_triple) 36930fdc8d8SChris Lattner { 3706611103cSGreg Clayton SBTarget target; 3716611103cSGreg Clayton if (m_opaque_sp) 3726611103cSGreg Clayton { 37330fdc8d8SChris Lattner ArchSpec arch; 37430fdc8d8SChris Lattner FileSpec file_spec (filename); 37530fdc8d8SChris Lattner arch.SetArchFromTargetTriple(target_triple); 37630fdc8d8SChris Lattner TargetSP target_sp; 3776611103cSGreg Clayton Error error (m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file_spec, arch, NULL, true, target_sp)); 3786611103cSGreg Clayton target.reset (target_sp); 3796611103cSGreg Clayton } 38030fdc8d8SChris Lattner return target; 38130fdc8d8SChris Lattner } 38230fdc8d8SChris Lattner 38330fdc8d8SChris Lattner SBTarget 38430fdc8d8SChris Lattner SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *archname) 38530fdc8d8SChris Lattner { 3866611103cSGreg Clayton SBTarget target; 3876611103cSGreg Clayton if (m_opaque_sp) 3886611103cSGreg Clayton { 38930fdc8d8SChris Lattner FileSpec file (filename); 39030fdc8d8SChris Lattner ArchSpec arch = lldb_private::GetDefaultArchitecture(); 39130fdc8d8SChris Lattner TargetSP target_sp; 39230fdc8d8SChris Lattner Error error; 39330fdc8d8SChris Lattner 39430fdc8d8SChris Lattner if (archname != NULL) 39530fdc8d8SChris Lattner { 39630fdc8d8SChris Lattner ArchSpec arch2 (archname); 3976611103cSGreg Clayton error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch2, NULL, true, target_sp); 39830fdc8d8SChris Lattner } 39930fdc8d8SChris Lattner else 40030fdc8d8SChris Lattner { 40130fdc8d8SChris Lattner if (!arch.IsValid()) 40230fdc8d8SChris Lattner arch = LLDB_ARCH_DEFAULT; 40330fdc8d8SChris Lattner 4046611103cSGreg Clayton error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp); 40530fdc8d8SChris Lattner 40630fdc8d8SChris Lattner if (error.Fail()) 40730fdc8d8SChris Lattner { 40830fdc8d8SChris Lattner if (arch == LLDB_ARCH_DEFAULT_32BIT) 40930fdc8d8SChris Lattner arch = LLDB_ARCH_DEFAULT_64BIT; 41030fdc8d8SChris Lattner else 41130fdc8d8SChris Lattner arch = LLDB_ARCH_DEFAULT_32BIT; 41230fdc8d8SChris Lattner 4136611103cSGreg Clayton error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp); 41430fdc8d8SChris Lattner } 41530fdc8d8SChris Lattner } 41630fdc8d8SChris Lattner 41730fdc8d8SChris Lattner if (error.Success()) 4186611103cSGreg Clayton { 4192976d00aSJim Ingham m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get()); 4206611103cSGreg Clayton target.reset(target_sp); 4216611103cSGreg Clayton } 4226611103cSGreg Clayton } 4236611103cSGreg Clayton return target; 42430fdc8d8SChris Lattner } 42530fdc8d8SChris Lattner 42630fdc8d8SChris Lattner SBTarget 42730fdc8d8SChris Lattner SBDebugger::CreateTarget (const char *filename) 42830fdc8d8SChris Lattner { 4296611103cSGreg Clayton SBTarget target; 4306611103cSGreg Clayton if (m_opaque_sp) 4316611103cSGreg Clayton { 43230fdc8d8SChris Lattner FileSpec file (filename); 43330fdc8d8SChris Lattner ArchSpec arch = lldb_private::GetDefaultArchitecture(); 43430fdc8d8SChris Lattner TargetSP target_sp; 43530fdc8d8SChris Lattner Error error; 43630fdc8d8SChris Lattner 43730fdc8d8SChris Lattner if (!arch.IsValid()) 43830fdc8d8SChris Lattner arch = LLDB_ARCH_DEFAULT; 43930fdc8d8SChris Lattner 4406611103cSGreg Clayton error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp); 44130fdc8d8SChris Lattner 44230fdc8d8SChris Lattner if (error.Fail()) 44330fdc8d8SChris Lattner { 44430fdc8d8SChris Lattner if (arch == LLDB_ARCH_DEFAULT_32BIT) 44530fdc8d8SChris Lattner arch = LLDB_ARCH_DEFAULT_64BIT; 44630fdc8d8SChris Lattner else 44730fdc8d8SChris Lattner arch = LLDB_ARCH_DEFAULT_32BIT; 44830fdc8d8SChris Lattner 4496611103cSGreg Clayton error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp); 45030fdc8d8SChris Lattner } 45130fdc8d8SChris Lattner 4526611103cSGreg Clayton if (error.Success()) 4536611103cSGreg Clayton { 4542976d00aSJim Ingham m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get()); 4556611103cSGreg Clayton target.reset (target_sp); 4566611103cSGreg Clayton } 4576611103cSGreg Clayton } 4586611103cSGreg Clayton return target; 45930fdc8d8SChris Lattner } 46030fdc8d8SChris Lattner 46130fdc8d8SChris Lattner SBTarget 46230fdc8d8SChris Lattner SBDebugger::GetTargetAtIndex (uint32_t idx) 46330fdc8d8SChris Lattner { 4646611103cSGreg Clayton SBTarget sb_target; 4656611103cSGreg Clayton if (m_opaque_sp) 4666611103cSGreg Clayton sb_target.reset(m_opaque_sp->GetTargetList().GetTargetAtIndex (idx)); 46730fdc8d8SChris Lattner return sb_target; 46830fdc8d8SChris Lattner } 46930fdc8d8SChris Lattner 47030fdc8d8SChris Lattner SBTarget 47130fdc8d8SChris Lattner SBDebugger::FindTargetWithProcessID (pid_t pid) 47230fdc8d8SChris Lattner { 4736611103cSGreg Clayton SBTarget sb_target; 4746611103cSGreg Clayton if (m_opaque_sp) 4756611103cSGreg Clayton sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid)); 47630fdc8d8SChris Lattner return sb_target; 47730fdc8d8SChris Lattner } 47830fdc8d8SChris Lattner 47930fdc8d8SChris Lattner SBTarget 48030fdc8d8SChris Lattner SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name) 48130fdc8d8SChris Lattner { 4826611103cSGreg Clayton SBTarget sb_target; 4836611103cSGreg Clayton if (m_opaque_sp && filename && filename[0]) 4846611103cSGreg Clayton { 48530fdc8d8SChris Lattner ArchSpec arch; 48630fdc8d8SChris Lattner if (arch_name) 48730fdc8d8SChris Lattner arch.SetArch(arch_name); 4886611103cSGreg Clayton TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename), arch_name ? &arch : NULL)); 4896611103cSGreg Clayton sb_target.reset(target_sp); 4906611103cSGreg Clayton } 4916611103cSGreg Clayton return sb_target; 49230fdc8d8SChris Lattner } 49330fdc8d8SChris Lattner 49430fdc8d8SChris Lattner SBTarget 49530fdc8d8SChris Lattner SBDebugger::FindTargetWithLLDBProcess (const lldb::ProcessSP &process_sp) 49630fdc8d8SChris Lattner { 4976611103cSGreg Clayton SBTarget sb_target; 4986611103cSGreg Clayton if (m_opaque_sp) 4996611103cSGreg Clayton sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get())); 50030fdc8d8SChris Lattner return sb_target; 50130fdc8d8SChris Lattner } 50230fdc8d8SChris Lattner 50330fdc8d8SChris Lattner 50430fdc8d8SChris Lattner uint32_t 50530fdc8d8SChris Lattner SBDebugger::GetNumTargets () 50630fdc8d8SChris Lattner { 5076611103cSGreg Clayton if (m_opaque_sp) 5086611103cSGreg Clayton return m_opaque_sp->GetTargetList().GetNumTargets (); 5096611103cSGreg Clayton return 0; 5106611103cSGreg Clayton } 51130fdc8d8SChris Lattner 51230fdc8d8SChris Lattner SBTarget 5132976d00aSJim Ingham SBDebugger::GetSelectedTarget () 51430fdc8d8SChris Lattner { 5156611103cSGreg Clayton SBTarget sb_target; 5166611103cSGreg Clayton if (m_opaque_sp) 5172976d00aSJim Ingham sb_target.reset(m_opaque_sp->GetTargetList().GetSelectedTarget ()); 51830fdc8d8SChris Lattner return sb_target; 51930fdc8d8SChris Lattner } 52030fdc8d8SChris Lattner 52130fdc8d8SChris Lattner void 52230fdc8d8SChris Lattner SBDebugger::DispatchInput (void *baton, const void *data, size_t data_len) 52330fdc8d8SChris Lattner { 5246611103cSGreg Clayton if (m_opaque_sp) 5256611103cSGreg Clayton m_opaque_sp->DispatchInput ((const char *) data, data_len); 52630fdc8d8SChris Lattner } 52730fdc8d8SChris Lattner 52830fdc8d8SChris Lattner void 52930fdc8d8SChris Lattner SBDebugger::PushInputReader (SBInputReader &reader) 53030fdc8d8SChris Lattner { 5316611103cSGreg Clayton if (m_opaque_sp && reader.IsValid()) 53230fdc8d8SChris Lattner { 53330fdc8d8SChris Lattner InputReaderSP reader_sp(*reader); 5346611103cSGreg Clayton m_opaque_sp->PushInputReader (reader_sp); 53530fdc8d8SChris Lattner } 53630fdc8d8SChris Lattner } 5376611103cSGreg Clayton 5386611103cSGreg Clayton void 5396611103cSGreg Clayton SBDebugger::reset (const lldb::DebuggerSP &debugger_sp) 5406611103cSGreg Clayton { 5416611103cSGreg Clayton m_opaque_sp = debugger_sp; 5426611103cSGreg Clayton } 5436611103cSGreg Clayton 5446611103cSGreg Clayton Debugger * 5456611103cSGreg Clayton SBDebugger::get () const 5466611103cSGreg Clayton { 5476611103cSGreg Clayton return m_opaque_sp.get(); 5486611103cSGreg Clayton } 5496611103cSGreg Clayton 5506611103cSGreg Clayton Debugger & 5516611103cSGreg Clayton SBDebugger::ref () const 5526611103cSGreg Clayton { 5536611103cSGreg Clayton assert (m_opaque_sp.get()); 5546611103cSGreg Clayton return *m_opaque_sp; 5556611103cSGreg Clayton } 5566611103cSGreg Clayton 5576611103cSGreg Clayton 558ebc1bb27SCaroline Tice SBDebugger 559ebc1bb27SCaroline Tice SBDebugger::FindDebuggerWithID (int id) 560ebc1bb27SCaroline Tice { 561ebc1bb27SCaroline Tice SBDebugger sb_debugger; 562ebc1bb27SCaroline Tice lldb::DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id); 563ebc1bb27SCaroline Tice if (debugger_sp) 564ebc1bb27SCaroline Tice sb_debugger.reset (debugger_sp); 565ebc1bb27SCaroline Tice return sb_debugger; 566ebc1bb27SCaroline Tice } 567e40e4218SJim Ingham 5683df9a8dfSCaroline Tice SBError 5693df9a8dfSCaroline Tice SBDebugger::SetInternalVariable (const char *var_name, const char *value) 5703df9a8dfSCaroline Tice { 5713df9a8dfSCaroline Tice lldb::UserSettingsControllerSP root_settings_controller = lldb_private::Debugger::GetSettingsController(); 5723df9a8dfSCaroline Tice 573*101c7c20SCaroline Tice const char *debugger_instance_name; 574*101c7c20SCaroline Tice 575*101c7c20SCaroline Tice if (m_opaque_sp) 576*101c7c20SCaroline Tice debugger_instance_name = m_opaque_sp->GetInstanceName().AsCString(); 577*101c7c20SCaroline Tice else 578*101c7c20SCaroline Tice debugger_instance_name = ""; 579*101c7c20SCaroline Tice 580*101c7c20SCaroline Tice Error err = root_settings_controller->SetVariable (var_name, value, lldb::eVarSetOperationAssign, false, 581*101c7c20SCaroline Tice debugger_instance_name); 5823df9a8dfSCaroline Tice SBError sb_error; 5833df9a8dfSCaroline Tice sb_error.SetError (err); 5843df9a8dfSCaroline Tice 5853df9a8dfSCaroline Tice return sb_error; 5863df9a8dfSCaroline Tice } 5873df9a8dfSCaroline Tice 5883df9a8dfSCaroline Tice lldb::SBStringList 5893df9a8dfSCaroline Tice SBDebugger::GetInternalVariableValue (const char *var_name) 5903df9a8dfSCaroline Tice { 5913df9a8dfSCaroline Tice SBStringList ret_value; 592*101c7c20SCaroline Tice lldb::SettableVariableType var_type; 593*101c7c20SCaroline Tice const char *debugger_instance_name; 594*101c7c20SCaroline Tice 5953df9a8dfSCaroline Tice lldb::UserSettingsControllerSP root_settings_controller = lldb_private::Debugger::GetSettingsController(); 5963df9a8dfSCaroline Tice 597*101c7c20SCaroline Tice if (m_opaque_sp) 598*101c7c20SCaroline Tice debugger_instance_name = m_opaque_sp->GetInstanceName().AsCString(); 599*101c7c20SCaroline Tice else 600*101c7c20SCaroline Tice debugger_instance_name = ""; 601*101c7c20SCaroline Tice 602*101c7c20SCaroline Tice StringList value = root_settings_controller->GetVariable (var_name, var_type, debugger_instance_name); 603311adf3dSChris Lattner for (unsigned i = 0; i != value.GetSize(); ++i) 6043df9a8dfSCaroline Tice ret_value.AppendString (value.GetStringAtIndex(i)); 6053df9a8dfSCaroline Tice 6063df9a8dfSCaroline Tice return ret_value; 6073df9a8dfSCaroline Tice } 6083df9a8dfSCaroline Tice 609e40e4218SJim Ingham bool 610e40e4218SJim Ingham SBDebugger::SetUseExternalEditor (bool value) 611e40e4218SJim Ingham { 612e40e4218SJim Ingham if (m_opaque_sp) 613e40e4218SJim Ingham return m_opaque_sp->SetUseExternalEditor (value); 614e40e4218SJim Ingham else 615e40e4218SJim Ingham return false; 616e40e4218SJim Ingham } 617e40e4218SJim Ingham 618e40e4218SJim Ingham bool 619e40e4218SJim Ingham SBDebugger::UseExternalEditor () 620e40e4218SJim Ingham { 621e40e4218SJim Ingham if (m_opaque_sp) 622e40e4218SJim Ingham return m_opaque_sp->UseExternalEditor (); 623e40e4218SJim Ingham else 624e40e4218SJim Ingham return false; 625e40e4218SJim Ingham } 626e40e4218SJim Ingham 627