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 {
402d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
41ceb6b139SCaroline Tice 
42ceb6b139SCaroline Tice     if (log)
43ceb6b139SCaroline Tice         log->Printf ("SBDebugger::Initialize ()");
44ceb6b139SCaroline Tice 
4530fdc8d8SChris Lattner     Debugger::Initialize();
4630fdc8d8SChris Lattner }
4730fdc8d8SChris Lattner 
4830fdc8d8SChris Lattner void
4930fdc8d8SChris Lattner SBDebugger::Terminate ()
5030fdc8d8SChris Lattner {
5130fdc8d8SChris Lattner     Debugger::Terminate();
5230fdc8d8SChris Lattner }
5330fdc8d8SChris Lattner 
5448e42549SGreg Clayton void
5548e42549SGreg Clayton SBDebugger::Clear ()
5648e42549SGreg Clayton {
572d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
58ceb6b139SCaroline Tice 
59ceb6b139SCaroline Tice     if (log)
6093aa84e8SGreg Clayton         log->Printf ("SBDebugger(%p)::Clear ()", m_opaque_sp.get());
613d6086f6SCaroline Tice 
623d6086f6SCaroline Tice     if (m_opaque_sp)
633d6086f6SCaroline Tice         m_opaque_sp->CleanUpInputReaders ();
64ceb6b139SCaroline Tice 
6548e42549SGreg Clayton     m_opaque_sp.reset();
6648e42549SGreg Clayton }
6748e42549SGreg Clayton 
686611103cSGreg Clayton SBDebugger
696611103cSGreg Clayton SBDebugger::Create()
706611103cSGreg Clayton {
712d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
72ceb6b139SCaroline Tice 
736611103cSGreg Clayton     SBDebugger debugger;
746611103cSGreg Clayton     debugger.reset(Debugger::CreateInstance());
75ceb6b139SCaroline Tice 
76ceb6b139SCaroline Tice     if (log)
77ceb6b139SCaroline Tice     {
78ceb6b139SCaroline Tice         SBStream sstr;
79ceb6b139SCaroline Tice         debugger.GetDescription (sstr);
8093aa84e8SGreg Clayton         log->Printf ("SBDebugger::Create () => SBDebugger(%p): %s", debugger.m_opaque_sp.get(), sstr.GetData());
81ceb6b139SCaroline Tice     }
82ceb6b139SCaroline Tice 
836611103cSGreg Clayton     return debugger;
846611103cSGreg Clayton }
856611103cSGreg Clayton 
866611103cSGreg Clayton SBDebugger::SBDebugger () :
876611103cSGreg Clayton     m_opaque_sp ()
886611103cSGreg Clayton {
896611103cSGreg Clayton }
906611103cSGreg Clayton 
91efabb123SGreg Clayton SBDebugger::SBDebugger(const SBDebugger &rhs) :
92efabb123SGreg Clayton     m_opaque_sp (rhs.m_opaque_sp)
93efabb123SGreg Clayton {
94efabb123SGreg Clayton }
95efabb123SGreg Clayton 
96efabb123SGreg Clayton SBDebugger &
97efabb123SGreg Clayton SBDebugger::operator = (const SBDebugger &rhs)
98efabb123SGreg Clayton {
99efabb123SGreg Clayton     if (this != &rhs)
100efabb123SGreg Clayton     {
101efabb123SGreg Clayton         m_opaque_sp = rhs.m_opaque_sp;
102efabb123SGreg Clayton     }
103efabb123SGreg Clayton     return *this;
104efabb123SGreg Clayton }
105efabb123SGreg Clayton 
1066611103cSGreg Clayton SBDebugger::~SBDebugger ()
1076611103cSGreg Clayton {
1086611103cSGreg Clayton }
1096611103cSGreg Clayton 
1106611103cSGreg Clayton bool
1116611103cSGreg Clayton SBDebugger::IsValid() const
1126611103cSGreg Clayton {
1136611103cSGreg Clayton     return m_opaque_sp.get() != NULL;
1146611103cSGreg Clayton }
1156611103cSGreg Clayton 
1166611103cSGreg Clayton 
11730fdc8d8SChris Lattner void
11830fdc8d8SChris Lattner SBDebugger::SetAsync (bool b)
11930fdc8d8SChris Lattner {
1206611103cSGreg Clayton     if (m_opaque_sp)
1216611103cSGreg Clayton         m_opaque_sp->SetAsyncExecution(b);
12230fdc8d8SChris Lattner }
12330fdc8d8SChris Lattner 
1246eee5aa0SGreg Clayton void
1256eee5aa0SGreg Clayton SBDebugger::SkipLLDBInitFiles (bool b)
1266eee5aa0SGreg Clayton {
1276eee5aa0SGreg Clayton     if (m_opaque_sp)
1286eee5aa0SGreg Clayton         m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles (b);
1296eee5aa0SGreg Clayton }
1306eee5aa0SGreg Clayton 
13130fdc8d8SChris Lattner // Shouldn't really be settable after initialization as this could cause lots of problems; don't want users
13230fdc8d8SChris Lattner // trying to switch modes in the middle of a debugging session.
13330fdc8d8SChris Lattner void
13430fdc8d8SChris Lattner SBDebugger::SetInputFileHandle (FILE *fh, bool transfer_ownership)
13530fdc8d8SChris Lattner {
1362d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
137ceb6b139SCaroline Tice 
138ceb6b139SCaroline Tice     if (log)
139cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::SetInputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
140cfd1acedSGreg Clayton                      fh, transfer_ownership);
141ceb6b139SCaroline Tice 
1426611103cSGreg Clayton     if (m_opaque_sp)
1436611103cSGreg Clayton         m_opaque_sp->SetInputFileHandle (fh, transfer_ownership);
14430fdc8d8SChris Lattner }
14530fdc8d8SChris Lattner 
14630fdc8d8SChris Lattner void
14730fdc8d8SChris Lattner SBDebugger::SetOutputFileHandle (FILE *fh, bool transfer_ownership)
14830fdc8d8SChris Lattner {
1492d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
150ceb6b139SCaroline Tice 
151ceb6b139SCaroline Tice 
152ceb6b139SCaroline Tice     if (log)
153cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::SetOutputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
154cfd1acedSGreg Clayton                      fh, transfer_ownership);
155ceb6b139SCaroline Tice 
1566611103cSGreg Clayton     if (m_opaque_sp)
1576611103cSGreg Clayton         m_opaque_sp->SetOutputFileHandle (fh, transfer_ownership);
15830fdc8d8SChris Lattner }
15930fdc8d8SChris Lattner 
16030fdc8d8SChris Lattner void
16130fdc8d8SChris Lattner SBDebugger::SetErrorFileHandle (FILE *fh, bool transfer_ownership)
16230fdc8d8SChris Lattner {
1632d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
164ceb6b139SCaroline Tice 
165ceb6b139SCaroline Tice 
166ceb6b139SCaroline Tice     if (log)
167cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::SetErrorFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
168cfd1acedSGreg Clayton                      fh, transfer_ownership);
169ceb6b139SCaroline Tice 
1706611103cSGreg Clayton     if (m_opaque_sp)
1716611103cSGreg Clayton         m_opaque_sp->SetErrorFileHandle (fh, transfer_ownership);
17230fdc8d8SChris Lattner }
17330fdc8d8SChris Lattner 
17430fdc8d8SChris Lattner FILE *
17530fdc8d8SChris Lattner SBDebugger::GetInputFileHandle ()
17630fdc8d8SChris Lattner {
1776611103cSGreg Clayton     if (m_opaque_sp)
1786611103cSGreg Clayton         return m_opaque_sp->GetInputFileHandle();
1796611103cSGreg Clayton     return NULL;
18030fdc8d8SChris Lattner }
18130fdc8d8SChris Lattner 
18230fdc8d8SChris Lattner FILE *
18330fdc8d8SChris Lattner SBDebugger::GetOutputFileHandle ()
18430fdc8d8SChris Lattner {
1856611103cSGreg Clayton     if (m_opaque_sp)
1866611103cSGreg Clayton         return m_opaque_sp->GetOutputFileHandle();
1876611103cSGreg Clayton     return NULL;
18830fdc8d8SChris Lattner }
18930fdc8d8SChris Lattner 
19030fdc8d8SChris Lattner FILE *
19130fdc8d8SChris Lattner SBDebugger::GetErrorFileHandle ()
19230fdc8d8SChris Lattner {
1936611103cSGreg Clayton     if (m_opaque_sp)
1946611103cSGreg Clayton         return m_opaque_sp->GetErrorFileHandle();
1956611103cSGreg Clayton     return NULL;
19630fdc8d8SChris Lattner }
19730fdc8d8SChris Lattner 
19830fdc8d8SChris Lattner SBCommandInterpreter
19930fdc8d8SChris Lattner SBDebugger::GetCommandInterpreter ()
20030fdc8d8SChris Lattner {
2012d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
202ceb6b139SCaroline Tice 
2036611103cSGreg Clayton     SBCommandInterpreter sb_interpreter;
2046611103cSGreg Clayton     if (m_opaque_sp)
2056611103cSGreg Clayton         sb_interpreter.reset (&m_opaque_sp->GetCommandInterpreter());
206ceb6b139SCaroline Tice 
207750cd175SCaroline Tice     if (log)
20893aa84e8SGreg Clayton         log->Printf ("SBDebugger(%p)::GetCommandInterpreter () => SBCommandInterpreter(%p)",
209750cd175SCaroline Tice                      m_opaque_sp.get(), sb_interpreter.get());
210750cd175SCaroline Tice 
21130fdc8d8SChris Lattner     return sb_interpreter;
21230fdc8d8SChris Lattner }
21330fdc8d8SChris Lattner 
21430fdc8d8SChris Lattner void
21530fdc8d8SChris Lattner SBDebugger::HandleCommand (const char *command)
21630fdc8d8SChris Lattner {
2176611103cSGreg Clayton     if (m_opaque_sp)
2186611103cSGreg Clayton     {
2196611103cSGreg Clayton         SBCommandInterpreter sb_interpreter(GetCommandInterpreter ());
22030fdc8d8SChris Lattner         SBCommandReturnObject result;
22130fdc8d8SChris Lattner 
22230fdc8d8SChris Lattner         sb_interpreter.HandleCommand (command, result, false);
22330fdc8d8SChris Lattner 
22430fdc8d8SChris Lattner         if (GetErrorFileHandle() != NULL)
22530fdc8d8SChris Lattner             result.PutError (GetErrorFileHandle());
22630fdc8d8SChris Lattner         if (GetOutputFileHandle() != NULL)
22730fdc8d8SChris Lattner             result.PutOutput (GetOutputFileHandle());
22830fdc8d8SChris Lattner 
2296611103cSGreg Clayton         if (m_opaque_sp->GetAsyncExecution() == false)
23030fdc8d8SChris Lattner         {
2316611103cSGreg Clayton             SBProcess process(GetCommandInterpreter().GetProcess ());
23230fdc8d8SChris Lattner             if (process.IsValid())
23330fdc8d8SChris Lattner             {
23430fdc8d8SChris Lattner                 EventSP event_sp;
2356611103cSGreg Clayton                 Listener &lldb_listener = m_opaque_sp->GetListener();
23630fdc8d8SChris Lattner                 while (lldb_listener.GetNextEventForBroadcaster (process.get(), event_sp))
23730fdc8d8SChris Lattner                 {
23830fdc8d8SChris Lattner                     SBEvent event(event_sp);
23930fdc8d8SChris Lattner                     HandleProcessEvent (process, event, GetOutputFileHandle(), GetErrorFileHandle());
24030fdc8d8SChris Lattner                 }
24130fdc8d8SChris Lattner             }
24230fdc8d8SChris Lattner         }
24330fdc8d8SChris Lattner     }
2446611103cSGreg Clayton }
24530fdc8d8SChris Lattner 
24630fdc8d8SChris Lattner SBListener
24730fdc8d8SChris Lattner SBDebugger::GetListener ()
24830fdc8d8SChris Lattner {
2492d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
250ceb6b139SCaroline Tice 
2516611103cSGreg Clayton     SBListener sb_listener;
2526611103cSGreg Clayton     if (m_opaque_sp)
2536611103cSGreg Clayton         sb_listener.reset(&m_opaque_sp->GetListener(), false);
254ceb6b139SCaroline Tice 
255750cd175SCaroline Tice     if (log)
25693aa84e8SGreg Clayton         log->Printf ("SBDebugger(%p)::GetListener () => SBListener(%p)", m_opaque_sp.get(),
257750cd175SCaroline Tice                      sb_listener.get());
258750cd175SCaroline Tice 
25930fdc8d8SChris Lattner     return sb_listener;
26030fdc8d8SChris Lattner }
26130fdc8d8SChris Lattner 
26230fdc8d8SChris Lattner void
26330fdc8d8SChris Lattner SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, FILE *out, FILE *err)
26430fdc8d8SChris Lattner {
26530fdc8d8SChris Lattner      const uint32_t event_type = event.GetType();
26630fdc8d8SChris Lattner      char stdio_buffer[1024];
26730fdc8d8SChris Lattner      size_t len;
26830fdc8d8SChris Lattner 
26930fdc8d8SChris Lattner      if (event_type & Process::eBroadcastBitSTDOUT)
27030fdc8d8SChris Lattner      {
27130fdc8d8SChris Lattner          while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
27230fdc8d8SChris Lattner              if (out != NULL)
27330fdc8d8SChris Lattner                  ::fwrite (stdio_buffer, 1, len, out);
27430fdc8d8SChris Lattner      }
27530fdc8d8SChris Lattner      else if (event_type & Process::eBroadcastBitSTDERR)
27630fdc8d8SChris Lattner      {
27730fdc8d8SChris Lattner          while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
27830fdc8d8SChris Lattner              if (out != NULL)
27930fdc8d8SChris Lattner                  ::fwrite (stdio_buffer, 1, len, out);
28030fdc8d8SChris Lattner      }
28130fdc8d8SChris Lattner      else if (event_type & Process::eBroadcastBitStateChanged)
28230fdc8d8SChris Lattner      {
28330fdc8d8SChris Lattner          // Drain any stdout messages.
28430fdc8d8SChris Lattner          while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
28530fdc8d8SChris Lattner              if (out != NULL)
28630fdc8d8SChris Lattner                  ::fwrite (stdio_buffer, 1, len, out);
28730fdc8d8SChris Lattner 
28830fdc8d8SChris Lattner          // Drain any stderr messages.
28930fdc8d8SChris Lattner          while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
29030fdc8d8SChris Lattner              if (out != NULL)
29130fdc8d8SChris Lattner                  ::fwrite (stdio_buffer, 1, len, out);
29230fdc8d8SChris Lattner 
29330fdc8d8SChris Lattner          StateType event_state = SBProcess::GetStateFromEvent (event);
29430fdc8d8SChris Lattner 
29530fdc8d8SChris Lattner          if (event_state == eStateInvalid)
29630fdc8d8SChris Lattner              return;
29730fdc8d8SChris Lattner 
29830fdc8d8SChris Lattner          bool is_stopped = StateIsStoppedState (event_state);
29930fdc8d8SChris Lattner          if (!is_stopped)
3002976d00aSJim Ingham              process.ReportEventState (event, out);
30130fdc8d8SChris Lattner    }
30230fdc8d8SChris Lattner }
30330fdc8d8SChris Lattner 
30430fdc8d8SChris Lattner void
3052976d00aSJim Ingham SBDebugger::UpdateSelectedThread (SBProcess &process)
30630fdc8d8SChris Lattner {
30730fdc8d8SChris Lattner     if (process.IsValid())
30830fdc8d8SChris Lattner     {
3092976d00aSJim Ingham         SBThread curr_thread = process.GetSelectedThread ();
31030fdc8d8SChris Lattner         SBThread thread;
31130fdc8d8SChris Lattner         StopReason curr_thread_stop_reason = eStopReasonInvalid;
31230fdc8d8SChris Lattner         if (curr_thread.IsValid())
31330fdc8d8SChris Lattner         {
31430fdc8d8SChris Lattner             if (curr_thread.GetStopReason() != eStopReasonInvalid)
31530fdc8d8SChris Lattner                 curr_thread_stop_reason = curr_thread.GetStopReason ();
31630fdc8d8SChris Lattner         }
31730fdc8d8SChris Lattner 
31830fdc8d8SChris Lattner         if (! curr_thread.IsValid()
31930fdc8d8SChris Lattner             || curr_thread_stop_reason == eStopReasonInvalid
32030fdc8d8SChris Lattner             || curr_thread_stop_reason == eStopReasonNone)
32130fdc8d8SChris Lattner           {
32230fdc8d8SChris Lattner             // Prefer a thread that has just completed its plan over another thread as current thread.
32330fdc8d8SChris Lattner             SBThread plan_thread;
32430fdc8d8SChris Lattner             SBThread other_thread;
32530fdc8d8SChris Lattner             const size_t num_threads = process.GetNumThreads ();
32630fdc8d8SChris Lattner             size_t i;
32730fdc8d8SChris Lattner             for (i = 0; i < num_threads; ++i)
32830fdc8d8SChris Lattner             {
32930fdc8d8SChris Lattner                 thread = process.GetThreadAtIndex(i);
33030fdc8d8SChris Lattner                 if (thread.GetStopReason () != eStopReasonInvalid)
33130fdc8d8SChris Lattner                 {
33230fdc8d8SChris Lattner                     switch (thread.GetStopReason ())
33330fdc8d8SChris Lattner                     {
33430fdc8d8SChris Lattner                         default:
33530fdc8d8SChris Lattner                         case eStopReasonInvalid:
33630fdc8d8SChris Lattner                         case eStopReasonNone:
33730fdc8d8SChris Lattner                             break;
33830fdc8d8SChris Lattner 
33930fdc8d8SChris Lattner                         case eStopReasonTrace:
34030fdc8d8SChris Lattner                         case eStopReasonBreakpoint:
34130fdc8d8SChris Lattner                         case eStopReasonWatchpoint:
34230fdc8d8SChris Lattner                         case eStopReasonSignal:
34330fdc8d8SChris Lattner                         case eStopReasonException:
34430fdc8d8SChris Lattner                             if (! other_thread.IsValid())
34530fdc8d8SChris Lattner                                 other_thread = thread;
34630fdc8d8SChris Lattner                             break;
34730fdc8d8SChris Lattner                         case eStopReasonPlanComplete:
34830fdc8d8SChris Lattner                             if (! plan_thread.IsValid())
34930fdc8d8SChris Lattner                                 plan_thread = thread;
35030fdc8d8SChris Lattner                             break;
35130fdc8d8SChris Lattner                     }
35230fdc8d8SChris Lattner                 }
35330fdc8d8SChris Lattner             }
35430fdc8d8SChris Lattner             if (plan_thread.IsValid())
3552976d00aSJim Ingham                 process.SetSelectedThreadByID (plan_thread.GetThreadID());
35630fdc8d8SChris Lattner             else if (other_thread.IsValid())
3572976d00aSJim Ingham                 process.SetSelectedThreadByID (other_thread.GetThreadID());
35830fdc8d8SChris Lattner             else
35930fdc8d8SChris Lattner             {
36030fdc8d8SChris Lattner                 if (curr_thread.IsValid())
36130fdc8d8SChris Lattner                     thread = curr_thread;
36230fdc8d8SChris Lattner                 else
36330fdc8d8SChris Lattner                     thread = process.GetThreadAtIndex(0);
36430fdc8d8SChris Lattner 
36530fdc8d8SChris Lattner                 if (thread.IsValid())
3662976d00aSJim Ingham                     process.SetSelectedThreadByID (thread.GetThreadID());
36730fdc8d8SChris Lattner             }
36830fdc8d8SChris Lattner         }
36930fdc8d8SChris Lattner     }
37030fdc8d8SChris Lattner }
37130fdc8d8SChris Lattner 
37230fdc8d8SChris Lattner SBSourceManager &
37330fdc8d8SChris Lattner SBDebugger::GetSourceManager ()
37430fdc8d8SChris Lattner {
37530fdc8d8SChris Lattner     static SourceManager g_lldb_source_manager;
376efabb123SGreg Clayton     static SBSourceManager g_sb_source_manager (&g_lldb_source_manager);
37730fdc8d8SChris Lattner     return g_sb_source_manager;
37830fdc8d8SChris Lattner }
37930fdc8d8SChris Lattner 
38030fdc8d8SChris Lattner 
38130fdc8d8SChris Lattner bool
38230fdc8d8SChris Lattner SBDebugger::GetDefaultArchitecture (char *arch_name, size_t arch_name_len)
38330fdc8d8SChris Lattner {
38430fdc8d8SChris Lattner     if (arch_name && arch_name_len)
38530fdc8d8SChris Lattner     {
386daccaa9eSCaroline Tice         ArchSpec default_arch = lldb_private::Target::GetDefaultArchitecture ();
387daccaa9eSCaroline Tice 
38830fdc8d8SChris Lattner         if (default_arch.IsValid())
38930fdc8d8SChris Lattner         {
39030fdc8d8SChris Lattner             ::snprintf (arch_name, arch_name_len, "%s", default_arch.AsCString());
39130fdc8d8SChris Lattner             return true;
39230fdc8d8SChris Lattner         }
39330fdc8d8SChris Lattner     }
39430fdc8d8SChris Lattner     if (arch_name && arch_name_len)
39530fdc8d8SChris Lattner         arch_name[0] = '\0';
39630fdc8d8SChris Lattner     return false;
39730fdc8d8SChris Lattner }
39830fdc8d8SChris Lattner 
39930fdc8d8SChris Lattner 
40030fdc8d8SChris Lattner bool
40130fdc8d8SChris Lattner SBDebugger::SetDefaultArchitecture (const char *arch_name)
40230fdc8d8SChris Lattner {
40330fdc8d8SChris Lattner     if (arch_name)
40430fdc8d8SChris Lattner     {
40530fdc8d8SChris Lattner         ArchSpec arch (arch_name);
40630fdc8d8SChris Lattner         if (arch.IsValid())
40730fdc8d8SChris Lattner         {
408daccaa9eSCaroline Tice             lldb_private::Target::SetDefaultArchitecture (arch);
40930fdc8d8SChris Lattner             return true;
41030fdc8d8SChris Lattner         }
41130fdc8d8SChris Lattner     }
41230fdc8d8SChris Lattner     return false;
41330fdc8d8SChris Lattner }
41430fdc8d8SChris Lattner 
41530fdc8d8SChris Lattner ScriptLanguage
41630fdc8d8SChris Lattner SBDebugger::GetScriptingLanguage (const char *script_language_name)
41730fdc8d8SChris Lattner {
41830fdc8d8SChris Lattner     return Args::StringToScriptLanguage (script_language_name,
41930fdc8d8SChris Lattner                                          eScriptLanguageDefault,
42030fdc8d8SChris Lattner                                          NULL);
42130fdc8d8SChris Lattner }
42230fdc8d8SChris Lattner 
42330fdc8d8SChris Lattner const char *
42430fdc8d8SChris Lattner SBDebugger::GetVersionString ()
42530fdc8d8SChris Lattner {
42630fdc8d8SChris Lattner     return lldb_private::GetVersion();
42730fdc8d8SChris Lattner }
42830fdc8d8SChris Lattner 
42930fdc8d8SChris Lattner const char *
43030fdc8d8SChris Lattner SBDebugger::StateAsCString (lldb::StateType state)
43130fdc8d8SChris Lattner {
43230fdc8d8SChris Lattner     return lldb_private::StateAsCString (state);
43330fdc8d8SChris Lattner }
43430fdc8d8SChris Lattner 
43530fdc8d8SChris Lattner bool
43630fdc8d8SChris Lattner SBDebugger::StateIsRunningState (lldb::StateType state)
43730fdc8d8SChris Lattner {
4382d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4394838131bSGreg Clayton 
4404838131bSGreg Clayton     const bool result = lldb_private::StateIsRunningState (state);
4414838131bSGreg Clayton     if (log)
4424838131bSGreg Clayton         log->Printf ("SBDebugger::StateIsRunningState (state=%s) => %i",
4434838131bSGreg Clayton                      lldb_private::StateAsCString (state), result);
4444838131bSGreg Clayton 
4454838131bSGreg Clayton     return result;
44630fdc8d8SChris Lattner }
44730fdc8d8SChris Lattner 
44830fdc8d8SChris Lattner bool
44930fdc8d8SChris Lattner SBDebugger::StateIsStoppedState (lldb::StateType state)
45030fdc8d8SChris Lattner {
4512d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
452ceb6b139SCaroline Tice 
4534838131bSGreg Clayton     const bool result = lldb_private::StateIsStoppedState (state);
454ceb6b139SCaroline Tice     if (log)
4554838131bSGreg Clayton         log->Printf ("SBDebugger::StateIsStoppedState (state=%s) => %i",
4564838131bSGreg Clayton                      lldb_private::StateAsCString (state), result);
457ceb6b139SCaroline Tice 
4584838131bSGreg Clayton     return result;
45930fdc8d8SChris Lattner }
46030fdc8d8SChris Lattner 
46130fdc8d8SChris Lattner 
46230fdc8d8SChris Lattner SBTarget
46330fdc8d8SChris Lattner SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename,
46430fdc8d8SChris Lattner                                                  const char *target_triple)
46530fdc8d8SChris Lattner {
4666611103cSGreg Clayton     SBTarget target;
4676611103cSGreg Clayton     if (m_opaque_sp)
4686611103cSGreg Clayton     {
46930fdc8d8SChris Lattner         ArchSpec arch;
470274060b6SGreg Clayton         FileSpec file_spec (filename, true);
47130fdc8d8SChris Lattner         arch.SetArchFromTargetTriple(target_triple);
47230fdc8d8SChris Lattner         TargetSP target_sp;
4736611103cSGreg Clayton         Error error (m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file_spec, arch, NULL, true, target_sp));
4746611103cSGreg Clayton         target.reset (target_sp);
4756611103cSGreg Clayton     }
4764838131bSGreg Clayton 
4772d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4784838131bSGreg Clayton     if (log)
4794838131bSGreg Clayton     {
480cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndTargetTriple (filename=\"%s\", triple=%s) => SBTarget(%p)",
4814838131bSGreg Clayton                      m_opaque_sp.get(), filename, target_triple, target.get());
4824838131bSGreg Clayton     }
4834838131bSGreg Clayton 
48430fdc8d8SChris Lattner     return target;
48530fdc8d8SChris Lattner }
48630fdc8d8SChris Lattner 
48730fdc8d8SChris Lattner SBTarget
48830fdc8d8SChris Lattner SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *archname)
48930fdc8d8SChris Lattner {
4902d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
491ceb6b139SCaroline Tice 
4926611103cSGreg Clayton     SBTarget target;
4936611103cSGreg Clayton     if (m_opaque_sp)
4946611103cSGreg Clayton     {
495274060b6SGreg Clayton         FileSpec file (filename, true);
496daccaa9eSCaroline Tice         ArchSpec arch = lldb_private::Target::GetDefaultArchitecture ();
49730fdc8d8SChris Lattner         TargetSP target_sp;
49830fdc8d8SChris Lattner         Error error;
49930fdc8d8SChris Lattner 
50030fdc8d8SChris Lattner         if (archname != NULL)
50130fdc8d8SChris Lattner         {
50230fdc8d8SChris Lattner             ArchSpec arch2 (archname);
5036611103cSGreg Clayton             error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch2, NULL, true, target_sp);
50430fdc8d8SChris Lattner         }
50530fdc8d8SChris Lattner         else
50630fdc8d8SChris Lattner         {
50730fdc8d8SChris Lattner             if (!arch.IsValid())
50830fdc8d8SChris Lattner                 arch = LLDB_ARCH_DEFAULT;
50930fdc8d8SChris Lattner 
5106611103cSGreg Clayton             error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
51130fdc8d8SChris Lattner 
51230fdc8d8SChris Lattner             if (error.Fail())
51330fdc8d8SChris Lattner             {
51430fdc8d8SChris Lattner                 if (arch == LLDB_ARCH_DEFAULT_32BIT)
51530fdc8d8SChris Lattner                     arch = LLDB_ARCH_DEFAULT_64BIT;
51630fdc8d8SChris Lattner                 else
51730fdc8d8SChris Lattner                     arch = LLDB_ARCH_DEFAULT_32BIT;
51830fdc8d8SChris Lattner 
5196611103cSGreg Clayton                 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
52030fdc8d8SChris Lattner             }
52130fdc8d8SChris Lattner         }
52230fdc8d8SChris Lattner 
52330fdc8d8SChris Lattner         if (error.Success())
5246611103cSGreg Clayton         {
5252976d00aSJim Ingham             m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
5266611103cSGreg Clayton             target.reset(target_sp);
5276611103cSGreg Clayton         }
5286611103cSGreg Clayton     }
529ceb6b139SCaroline Tice 
530ceb6b139SCaroline Tice     if (log)
531ceb6b139SCaroline Tice     {
532cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndArch (filename=\"%s\", arch=%s) => SBTarget(%p)",
5334838131bSGreg Clayton                      m_opaque_sp.get(), filename, archname, target.get());
534ceb6b139SCaroline Tice     }
535ceb6b139SCaroline Tice 
5366611103cSGreg Clayton     return target;
53730fdc8d8SChris Lattner }
53830fdc8d8SChris Lattner 
53930fdc8d8SChris Lattner SBTarget
54030fdc8d8SChris Lattner SBDebugger::CreateTarget (const char *filename)
54130fdc8d8SChris Lattner {
5426611103cSGreg Clayton     SBTarget target;
5436611103cSGreg Clayton     if (m_opaque_sp)
5446611103cSGreg Clayton     {
545274060b6SGreg Clayton         FileSpec file (filename, true);
546daccaa9eSCaroline Tice         ArchSpec arch = lldb_private::Target::GetDefaultArchitecture ();
54730fdc8d8SChris Lattner         TargetSP target_sp;
54830fdc8d8SChris Lattner         Error error;
54930fdc8d8SChris Lattner 
55030fdc8d8SChris Lattner         if (!arch.IsValid())
55130fdc8d8SChris Lattner             arch = LLDB_ARCH_DEFAULT;
55230fdc8d8SChris Lattner 
5536611103cSGreg Clayton         error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
55430fdc8d8SChris Lattner 
55530fdc8d8SChris Lattner         if (error.Fail())
55630fdc8d8SChris Lattner         {
55730fdc8d8SChris Lattner             if (arch == LLDB_ARCH_DEFAULT_32BIT)
55830fdc8d8SChris Lattner                 arch = LLDB_ARCH_DEFAULT_64BIT;
55930fdc8d8SChris Lattner             else
56030fdc8d8SChris Lattner                 arch = LLDB_ARCH_DEFAULT_32BIT;
56130fdc8d8SChris Lattner 
5626611103cSGreg Clayton             error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
56330fdc8d8SChris Lattner         }
56430fdc8d8SChris Lattner 
5656611103cSGreg Clayton         if (error.Success())
5666611103cSGreg Clayton         {
5672976d00aSJim Ingham             m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
5686611103cSGreg Clayton             target.reset (target_sp);
5696611103cSGreg Clayton         }
5706611103cSGreg Clayton     }
5712d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5724838131bSGreg Clayton     if (log)
5734838131bSGreg Clayton     {
574cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)",
5754838131bSGreg Clayton                      m_opaque_sp.get(), filename, target.get());
5764838131bSGreg Clayton     }
5776611103cSGreg Clayton     return target;
57830fdc8d8SChris Lattner }
57930fdc8d8SChris Lattner 
58030fdc8d8SChris Lattner SBTarget
58130fdc8d8SChris Lattner SBDebugger::GetTargetAtIndex (uint32_t idx)
58230fdc8d8SChris Lattner {
5836611103cSGreg Clayton     SBTarget sb_target;
5846611103cSGreg Clayton     if (m_opaque_sp)
5856611103cSGreg Clayton         sb_target.reset(m_opaque_sp->GetTargetList().GetTargetAtIndex (idx));
58630fdc8d8SChris Lattner     return sb_target;
58730fdc8d8SChris Lattner }
58830fdc8d8SChris Lattner 
58930fdc8d8SChris Lattner SBTarget
59030fdc8d8SChris Lattner SBDebugger::FindTargetWithProcessID (pid_t pid)
59130fdc8d8SChris Lattner {
5926611103cSGreg Clayton     SBTarget sb_target;
5936611103cSGreg Clayton     if (m_opaque_sp)
5946611103cSGreg Clayton         sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid));
59530fdc8d8SChris Lattner     return sb_target;
59630fdc8d8SChris Lattner }
59730fdc8d8SChris Lattner 
59830fdc8d8SChris Lattner SBTarget
59930fdc8d8SChris Lattner SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name)
60030fdc8d8SChris Lattner {
6016611103cSGreg Clayton     SBTarget sb_target;
6026611103cSGreg Clayton     if (m_opaque_sp && filename && filename[0])
6036611103cSGreg Clayton     {
60430fdc8d8SChris Lattner         ArchSpec arch;
60530fdc8d8SChris Lattner         if (arch_name)
60630fdc8d8SChris Lattner             arch.SetArch(arch_name);
607274060b6SGreg Clayton         TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename, false), arch_name ? &arch : NULL));
6086611103cSGreg Clayton         sb_target.reset(target_sp);
6096611103cSGreg Clayton     }
6106611103cSGreg Clayton     return sb_target;
61130fdc8d8SChris Lattner }
61230fdc8d8SChris Lattner 
61330fdc8d8SChris Lattner SBTarget
61430fdc8d8SChris Lattner SBDebugger::FindTargetWithLLDBProcess (const lldb::ProcessSP &process_sp)
61530fdc8d8SChris Lattner {
6166611103cSGreg Clayton     SBTarget sb_target;
6176611103cSGreg Clayton     if (m_opaque_sp)
6186611103cSGreg Clayton         sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get()));
61930fdc8d8SChris Lattner     return sb_target;
62030fdc8d8SChris Lattner }
62130fdc8d8SChris Lattner 
62230fdc8d8SChris Lattner 
62330fdc8d8SChris Lattner uint32_t
62430fdc8d8SChris Lattner SBDebugger::GetNumTargets ()
62530fdc8d8SChris Lattner {
6266611103cSGreg Clayton     if (m_opaque_sp)
6276611103cSGreg Clayton         return m_opaque_sp->GetTargetList().GetNumTargets ();
6286611103cSGreg Clayton     return 0;
6296611103cSGreg Clayton }
63030fdc8d8SChris Lattner 
63130fdc8d8SChris Lattner SBTarget
6322976d00aSJim Ingham SBDebugger::GetSelectedTarget ()
63330fdc8d8SChris Lattner {
6342d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
635ceb6b139SCaroline Tice 
6366611103cSGreg Clayton     SBTarget sb_target;
6376611103cSGreg Clayton     if (m_opaque_sp)
6382976d00aSJim Ingham         sb_target.reset(m_opaque_sp->GetTargetList().GetSelectedTarget ());
639ceb6b139SCaroline Tice 
640ceb6b139SCaroline Tice     if (log)
641ceb6b139SCaroline Tice     {
642ceb6b139SCaroline Tice         SBStream sstr;
643ceb6b139SCaroline Tice         sb_target.GetDescription (sstr, lldb::eDescriptionLevelBrief);
64493aa84e8SGreg Clayton         log->Printf ("SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s", m_opaque_sp.get(),
645750cd175SCaroline Tice                      sb_target.get(), sstr.GetData());
646ceb6b139SCaroline Tice     }
647ceb6b139SCaroline Tice 
64830fdc8d8SChris Lattner     return sb_target;
64930fdc8d8SChris Lattner }
65030fdc8d8SChris Lattner 
65130fdc8d8SChris Lattner void
65230fdc8d8SChris Lattner SBDebugger::DispatchInput (void *baton, const void *data, size_t data_len)
65330fdc8d8SChris Lattner {
6542d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
655ceb6b139SCaroline Tice 
656ceb6b139SCaroline Tice     if (log)
657cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::DispatchInput (baton=%p, data=\"%.*s\", size_t=%zu)", m_opaque_sp.get(),
658cfd1acedSGreg Clayton                      baton, (int) data_len, (const char *) data, data_len);
659ceb6b139SCaroline Tice 
6606611103cSGreg Clayton     if (m_opaque_sp)
6616611103cSGreg Clayton         m_opaque_sp->DispatchInput ((const char *) data, data_len);
66230fdc8d8SChris Lattner }
66330fdc8d8SChris Lattner 
66430fdc8d8SChris Lattner void
665efed6131SCaroline Tice SBDebugger::DispatchInputInterrupt ()
666efed6131SCaroline Tice {
667efed6131SCaroline Tice     if (m_opaque_sp)
668efed6131SCaroline Tice         m_opaque_sp->DispatchInputInterrupt ();
669efed6131SCaroline Tice }
670efed6131SCaroline Tice 
671efed6131SCaroline Tice void
672efed6131SCaroline Tice SBDebugger::DispatchInputEndOfFile ()
673efed6131SCaroline Tice {
674efed6131SCaroline Tice     if (m_opaque_sp)
675efed6131SCaroline Tice         m_opaque_sp->DispatchInputEndOfFile ();
676efed6131SCaroline Tice }
677efed6131SCaroline Tice 
678efed6131SCaroline Tice void
67930fdc8d8SChris Lattner SBDebugger::PushInputReader (SBInputReader &reader)
68030fdc8d8SChris Lattner {
6812d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
682ceb6b139SCaroline Tice 
683ceb6b139SCaroline Tice     if (log)
68493aa84e8SGreg Clayton         log->Printf ("SBDebugger(%p)::PushInputReader (SBInputReader(%p))", m_opaque_sp.get(), &reader);
685ceb6b139SCaroline Tice 
6866611103cSGreg Clayton     if (m_opaque_sp && reader.IsValid())
68730fdc8d8SChris Lattner     {
68830fdc8d8SChris Lattner         InputReaderSP reader_sp(*reader);
6896611103cSGreg Clayton         m_opaque_sp->PushInputReader (reader_sp);
69030fdc8d8SChris Lattner     }
69130fdc8d8SChris Lattner }
6926611103cSGreg Clayton 
6936611103cSGreg Clayton void
6946611103cSGreg Clayton SBDebugger::reset (const lldb::DebuggerSP &debugger_sp)
6956611103cSGreg Clayton {
6966611103cSGreg Clayton     m_opaque_sp = debugger_sp;
6976611103cSGreg Clayton }
6986611103cSGreg Clayton 
6996611103cSGreg Clayton Debugger *
7006611103cSGreg Clayton SBDebugger::get () const
7016611103cSGreg Clayton {
7026611103cSGreg Clayton     return m_opaque_sp.get();
7036611103cSGreg Clayton }
7046611103cSGreg Clayton 
7056611103cSGreg Clayton Debugger &
7066611103cSGreg Clayton SBDebugger::ref () const
7076611103cSGreg Clayton {
7086611103cSGreg Clayton     assert (m_opaque_sp.get());
7096611103cSGreg Clayton     return *m_opaque_sp;
7106611103cSGreg Clayton }
7116611103cSGreg Clayton 
7126611103cSGreg Clayton 
713ebc1bb27SCaroline Tice SBDebugger
714ebc1bb27SCaroline Tice SBDebugger::FindDebuggerWithID (int id)
715ebc1bb27SCaroline Tice {
716ebc1bb27SCaroline Tice     SBDebugger sb_debugger;
717ebc1bb27SCaroline Tice     lldb::DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id);
718ebc1bb27SCaroline Tice     if (debugger_sp)
719ebc1bb27SCaroline Tice         sb_debugger.reset (debugger_sp);
720ebc1bb27SCaroline Tice     return sb_debugger;
721ebc1bb27SCaroline Tice }
722e40e4218SJim Ingham 
723dd759857SCaroline Tice const char *
724dd759857SCaroline Tice SBDebugger::GetInstanceName()
725dd759857SCaroline Tice {
726dd759857SCaroline Tice     if (m_opaque_sp)
727dd759857SCaroline Tice         return m_opaque_sp->GetInstanceName().AsCString();
728dd759857SCaroline Tice     else
729dd759857SCaroline Tice         return NULL;
730dd759857SCaroline Tice }
731dd759857SCaroline Tice 
7323df9a8dfSCaroline Tice SBError
733dd759857SCaroline Tice SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name)
7343df9a8dfSCaroline Tice {
7353df9a8dfSCaroline Tice     lldb::UserSettingsControllerSP root_settings_controller = lldb_private::Debugger::GetSettingsController();
7363df9a8dfSCaroline Tice 
7371559a46bSCaroline Tice     Error err = root_settings_controller->SetVariable (var_name, value, lldb::eVarSetOperationAssign, true,
738101c7c20SCaroline Tice                                                        debugger_instance_name);
7393df9a8dfSCaroline Tice     SBError sb_error;
7403df9a8dfSCaroline Tice     sb_error.SetError (err);
7413df9a8dfSCaroline Tice 
7423df9a8dfSCaroline Tice     return sb_error;
7433df9a8dfSCaroline Tice }
7443df9a8dfSCaroline Tice 
7453df9a8dfSCaroline Tice lldb::SBStringList
746dd759857SCaroline Tice SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name)
7473df9a8dfSCaroline Tice {
7483df9a8dfSCaroline Tice     SBStringList ret_value;
749101c7c20SCaroline Tice     lldb::SettableVariableType var_type;
750*508265afSJohnny Chen     lldb_private::Error err;
751101c7c20SCaroline Tice 
7523df9a8dfSCaroline Tice     lldb::UserSettingsControllerSP root_settings_controller = lldb_private::Debugger::GetSettingsController();
7533df9a8dfSCaroline Tice 
754daccaa9eSCaroline Tice     StringList value = root_settings_controller->GetVariable (var_name, var_type, debugger_instance_name, err);
755daccaa9eSCaroline Tice 
756daccaa9eSCaroline Tice     if (err.Success())
757daccaa9eSCaroline Tice     {
758311adf3dSChris Lattner         for (unsigned i = 0; i != value.GetSize(); ++i)
7593df9a8dfSCaroline Tice             ret_value.AppendString (value.GetStringAtIndex(i));
760daccaa9eSCaroline Tice     }
761daccaa9eSCaroline Tice     else
762daccaa9eSCaroline Tice     {
763daccaa9eSCaroline Tice         ret_value.AppendString (err.AsCString());
764daccaa9eSCaroline Tice     }
765daccaa9eSCaroline Tice 
7663df9a8dfSCaroline Tice 
7673df9a8dfSCaroline Tice     return ret_value;
7683df9a8dfSCaroline Tice }
7693df9a8dfSCaroline Tice 
770a7015092SGreg Clayton uint32_t
771a7015092SGreg Clayton SBDebugger::GetTerminalWidth () const
772a7015092SGreg Clayton {
773a7015092SGreg Clayton     if (m_opaque_sp)
774a7015092SGreg Clayton         return m_opaque_sp->GetTerminalWidth ();
775a7015092SGreg Clayton     return 0;
776a7015092SGreg Clayton }
777a7015092SGreg Clayton 
778a7015092SGreg Clayton void
779a7015092SGreg Clayton SBDebugger::SetTerminalWidth (uint32_t term_width)
780a7015092SGreg Clayton {
781a7015092SGreg Clayton     if (m_opaque_sp)
782a7015092SGreg Clayton         m_opaque_sp->SetTerminalWidth (term_width);
783a7015092SGreg Clayton }
784a7015092SGreg Clayton 
785a7015092SGreg Clayton const char *
786a7015092SGreg Clayton SBDebugger::GetPrompt() const
787a7015092SGreg Clayton {
7882d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
789ceb6b139SCaroline Tice 
790ceb6b139SCaroline Tice     if (log)
791cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::GetPrompt () => \"%s\"", m_opaque_sp.get(),
792750cd175SCaroline Tice                      (m_opaque_sp ? m_opaque_sp->GetPrompt() : ""));
793ceb6b139SCaroline Tice 
794a7015092SGreg Clayton     if (m_opaque_sp)
795a7015092SGreg Clayton         return m_opaque_sp->GetPrompt ();
796a7015092SGreg Clayton     return 0;
797a7015092SGreg Clayton }
798a7015092SGreg Clayton 
799a7015092SGreg Clayton void
800a7015092SGreg Clayton SBDebugger::SetPrompt (const char *prompt)
801a7015092SGreg Clayton {
802a7015092SGreg Clayton     if (m_opaque_sp)
803a7015092SGreg Clayton         m_opaque_sp->SetPrompt (prompt);
804a7015092SGreg Clayton }
805a7015092SGreg Clayton 
806a7015092SGreg Clayton 
807a7015092SGreg Clayton lldb::ScriptLanguage
808a7015092SGreg Clayton SBDebugger::GetScriptLanguage() const
809a7015092SGreg Clayton {
810a7015092SGreg Clayton     if (m_opaque_sp)
811a7015092SGreg Clayton         return m_opaque_sp->GetScriptLanguage ();
812a7015092SGreg Clayton     return eScriptLanguageNone;
813a7015092SGreg Clayton }
814a7015092SGreg Clayton 
815a7015092SGreg Clayton void
816a7015092SGreg Clayton SBDebugger::SetScriptLanguage (lldb::ScriptLanguage script_lang)
817a7015092SGreg Clayton {
818a7015092SGreg Clayton     if (m_opaque_sp)
819a7015092SGreg Clayton         m_opaque_sp->SetScriptLanguage (script_lang);
820a7015092SGreg Clayton }
821a7015092SGreg Clayton 
822a7015092SGreg Clayton 
823a7015092SGreg Clayton 
824a7015092SGreg Clayton 
825e40e4218SJim Ingham bool
826e40e4218SJim Ingham SBDebugger::SetUseExternalEditor (bool value)
827e40e4218SJim Ingham {
828e40e4218SJim Ingham     if (m_opaque_sp)
829e40e4218SJim Ingham         return m_opaque_sp->SetUseExternalEditor (value);
830e40e4218SJim Ingham     else
831e40e4218SJim Ingham         return false;
832e40e4218SJim Ingham }
833e40e4218SJim Ingham 
834e40e4218SJim Ingham bool
835daccaa9eSCaroline Tice SBDebugger::GetUseExternalEditor ()
836e40e4218SJim Ingham {
837e40e4218SJim Ingham     if (m_opaque_sp)
838daccaa9eSCaroline Tice         return m_opaque_sp->GetUseExternalEditor ();
839e40e4218SJim Ingham     else
840e40e4218SJim Ingham         return false;
841e40e4218SJim Ingham }
842e40e4218SJim Ingham 
843dde9cff3SCaroline Tice bool
844dde9cff3SCaroline Tice SBDebugger::GetDescription (SBStream &description)
845dde9cff3SCaroline Tice {
846dde9cff3SCaroline Tice     if (m_opaque_sp)
847dde9cff3SCaroline Tice     {
848dde9cff3SCaroline Tice         const char *name = m_opaque_sp->GetInstanceName().AsCString();
849dde9cff3SCaroline Tice         lldb::user_id_t id = m_opaque_sp->GetID();
850cfd1acedSGreg Clayton         description.Printf ("Debugger (instance: \"%s\", id: %d)", name, id);
851dde9cff3SCaroline Tice     }
852dde9cff3SCaroline Tice     else
853dde9cff3SCaroline Tice         description.Printf ("No value");
854dde9cff3SCaroline Tice 
855dde9cff3SCaroline Tice     return true;
856dde9cff3SCaroline Tice }
857efed6131SCaroline Tice 
858efed6131SCaroline Tice lldb::user_id_t
859efed6131SCaroline Tice SBDebugger::GetID()
860efed6131SCaroline Tice {
861efed6131SCaroline Tice     if (m_opaque_sp)
862efed6131SCaroline Tice         return m_opaque_sp->GetID();
863efed6131SCaroline Tice     return LLDB_INVALID_UID;
864efed6131SCaroline Tice }
865