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 
86e02657b1SCaroline Tice void
87e02657b1SCaroline Tice SBDebugger::Destroy (SBDebugger &debugger)
88e02657b1SCaroline Tice {
89e02657b1SCaroline Tice     LogSP log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
90e02657b1SCaroline Tice 
91e02657b1SCaroline Tice     if (log)
92e02657b1SCaroline Tice     {
93e02657b1SCaroline Tice         SBStream sstr;
94e02657b1SCaroline Tice         debugger.GetDescription (sstr);
95e02657b1SCaroline Tice         log->Printf ("SBDebugger::Destroy () => SBDebugger(%p): %s", debugger.m_opaque_sp.get(), sstr.GetData());
96e02657b1SCaroline Tice     }
97e02657b1SCaroline Tice 
98e02657b1SCaroline Tice     Debugger::Destroy (debugger.m_opaque_sp);
99e02657b1SCaroline Tice 
100e02657b1SCaroline Tice     if (debugger.m_opaque_sp.get() != NULL)
101e02657b1SCaroline Tice         debugger.m_opaque_sp.reset();
102e02657b1SCaroline Tice }
103e02657b1SCaroline Tice 
1046611103cSGreg Clayton SBDebugger::SBDebugger () :
1056611103cSGreg Clayton     m_opaque_sp ()
1066611103cSGreg Clayton {
1076611103cSGreg Clayton }
1086611103cSGreg Clayton 
109efabb123SGreg Clayton SBDebugger::SBDebugger(const SBDebugger &rhs) :
110efabb123SGreg Clayton     m_opaque_sp (rhs.m_opaque_sp)
111efabb123SGreg Clayton {
112efabb123SGreg Clayton }
113efabb123SGreg Clayton 
114efabb123SGreg Clayton SBDebugger &
115efabb123SGreg Clayton SBDebugger::operator = (const SBDebugger &rhs)
116efabb123SGreg Clayton {
117efabb123SGreg Clayton     if (this != &rhs)
118efabb123SGreg Clayton     {
119efabb123SGreg Clayton         m_opaque_sp = rhs.m_opaque_sp;
120efabb123SGreg Clayton     }
121efabb123SGreg Clayton     return *this;
122efabb123SGreg Clayton }
123efabb123SGreg Clayton 
1246611103cSGreg Clayton SBDebugger::~SBDebugger ()
1256611103cSGreg Clayton {
1266611103cSGreg Clayton }
1276611103cSGreg Clayton 
1286611103cSGreg Clayton bool
1296611103cSGreg Clayton SBDebugger::IsValid() const
1306611103cSGreg Clayton {
1316611103cSGreg Clayton     return m_opaque_sp.get() != NULL;
1326611103cSGreg Clayton }
1336611103cSGreg Clayton 
1346611103cSGreg Clayton 
13530fdc8d8SChris Lattner void
13630fdc8d8SChris Lattner SBDebugger::SetAsync (bool b)
13730fdc8d8SChris Lattner {
1386611103cSGreg Clayton     if (m_opaque_sp)
1396611103cSGreg Clayton         m_opaque_sp->SetAsyncExecution(b);
14030fdc8d8SChris Lattner }
14130fdc8d8SChris Lattner 
1426eee5aa0SGreg Clayton void
1436eee5aa0SGreg Clayton SBDebugger::SkipLLDBInitFiles (bool b)
1446eee5aa0SGreg Clayton {
1456eee5aa0SGreg Clayton     if (m_opaque_sp)
1466eee5aa0SGreg Clayton         m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles (b);
1476eee5aa0SGreg Clayton }
1486eee5aa0SGreg Clayton 
14930fdc8d8SChris Lattner // Shouldn't really be settable after initialization as this could cause lots of problems; don't want users
15030fdc8d8SChris Lattner // trying to switch modes in the middle of a debugging session.
15130fdc8d8SChris Lattner void
15230fdc8d8SChris Lattner SBDebugger::SetInputFileHandle (FILE *fh, bool transfer_ownership)
15330fdc8d8SChris Lattner {
1542d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
155ceb6b139SCaroline Tice 
156ceb6b139SCaroline Tice     if (log)
157cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::SetInputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
158cfd1acedSGreg Clayton                      fh, transfer_ownership);
159ceb6b139SCaroline Tice 
1606611103cSGreg Clayton     if (m_opaque_sp)
1616611103cSGreg Clayton         m_opaque_sp->SetInputFileHandle (fh, transfer_ownership);
16230fdc8d8SChris Lattner }
16330fdc8d8SChris Lattner 
16430fdc8d8SChris Lattner void
16530fdc8d8SChris Lattner SBDebugger::SetOutputFileHandle (FILE *fh, bool transfer_ownership)
16630fdc8d8SChris Lattner {
1672d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
168ceb6b139SCaroline Tice 
169ceb6b139SCaroline Tice 
170ceb6b139SCaroline Tice     if (log)
171cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::SetOutputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
172cfd1acedSGreg Clayton                      fh, transfer_ownership);
173ceb6b139SCaroline Tice 
1746611103cSGreg Clayton     if (m_opaque_sp)
1756611103cSGreg Clayton         m_opaque_sp->SetOutputFileHandle (fh, transfer_ownership);
17630fdc8d8SChris Lattner }
17730fdc8d8SChris Lattner 
17830fdc8d8SChris Lattner void
17930fdc8d8SChris Lattner SBDebugger::SetErrorFileHandle (FILE *fh, bool transfer_ownership)
18030fdc8d8SChris Lattner {
1812d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
182ceb6b139SCaroline Tice 
183ceb6b139SCaroline Tice 
184ceb6b139SCaroline Tice     if (log)
185cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::SetErrorFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
186cfd1acedSGreg Clayton                      fh, transfer_ownership);
187ceb6b139SCaroline Tice 
1886611103cSGreg Clayton     if (m_opaque_sp)
1896611103cSGreg Clayton         m_opaque_sp->SetErrorFileHandle (fh, transfer_ownership);
19030fdc8d8SChris Lattner }
19130fdc8d8SChris Lattner 
19230fdc8d8SChris Lattner FILE *
19330fdc8d8SChris Lattner SBDebugger::GetInputFileHandle ()
19430fdc8d8SChris Lattner {
1956611103cSGreg Clayton     if (m_opaque_sp)
196*51b1e2d2SGreg Clayton         return m_opaque_sp->GetInputFile().GetStream();
1976611103cSGreg Clayton     return NULL;
19830fdc8d8SChris Lattner }
19930fdc8d8SChris Lattner 
20030fdc8d8SChris Lattner FILE *
20130fdc8d8SChris Lattner SBDebugger::GetOutputFileHandle ()
20230fdc8d8SChris Lattner {
2036611103cSGreg Clayton     if (m_opaque_sp)
204*51b1e2d2SGreg Clayton         return m_opaque_sp->GetOutputFile().GetStream();
2056611103cSGreg Clayton     return NULL;
20630fdc8d8SChris Lattner }
20730fdc8d8SChris Lattner 
20830fdc8d8SChris Lattner FILE *
20930fdc8d8SChris Lattner SBDebugger::GetErrorFileHandle ()
21030fdc8d8SChris Lattner {
2116611103cSGreg Clayton     if (m_opaque_sp)
212*51b1e2d2SGreg Clayton         return m_opaque_sp->GetErrorFile().GetStream();
2136611103cSGreg Clayton     return NULL;
21430fdc8d8SChris Lattner }
21530fdc8d8SChris Lattner 
21630fdc8d8SChris Lattner SBCommandInterpreter
21730fdc8d8SChris Lattner SBDebugger::GetCommandInterpreter ()
21830fdc8d8SChris Lattner {
2192d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
220ceb6b139SCaroline Tice 
2216611103cSGreg Clayton     SBCommandInterpreter sb_interpreter;
2226611103cSGreg Clayton     if (m_opaque_sp)
2236611103cSGreg Clayton         sb_interpreter.reset (&m_opaque_sp->GetCommandInterpreter());
224ceb6b139SCaroline Tice 
225750cd175SCaroline Tice     if (log)
22693aa84e8SGreg Clayton         log->Printf ("SBDebugger(%p)::GetCommandInterpreter () => SBCommandInterpreter(%p)",
227750cd175SCaroline Tice                      m_opaque_sp.get(), sb_interpreter.get());
228750cd175SCaroline Tice 
22930fdc8d8SChris Lattner     return sb_interpreter;
23030fdc8d8SChris Lattner }
23130fdc8d8SChris Lattner 
23230fdc8d8SChris Lattner void
23330fdc8d8SChris Lattner SBDebugger::HandleCommand (const char *command)
23430fdc8d8SChris Lattner {
2356611103cSGreg Clayton     if (m_opaque_sp)
2366611103cSGreg Clayton     {
237af67cecdSGreg Clayton         TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
238af67cecdSGreg Clayton         Mutex::Locker api_locker;
239af67cecdSGreg Clayton         if (target_sp)
240af67cecdSGreg Clayton             api_locker.Reset(target_sp->GetAPIMutex().GetMutex());
241af67cecdSGreg Clayton 
2426611103cSGreg Clayton         SBCommandInterpreter sb_interpreter(GetCommandInterpreter ());
24330fdc8d8SChris Lattner         SBCommandReturnObject result;
24430fdc8d8SChris Lattner 
24530fdc8d8SChris Lattner         sb_interpreter.HandleCommand (command, result, false);
24630fdc8d8SChris Lattner 
24730fdc8d8SChris Lattner         if (GetErrorFileHandle() != NULL)
24830fdc8d8SChris Lattner             result.PutError (GetErrorFileHandle());
24930fdc8d8SChris Lattner         if (GetOutputFileHandle() != NULL)
25030fdc8d8SChris Lattner             result.PutOutput (GetOutputFileHandle());
25130fdc8d8SChris Lattner 
2526611103cSGreg Clayton         if (m_opaque_sp->GetAsyncExecution() == false)
25330fdc8d8SChris Lattner         {
2546611103cSGreg Clayton             SBProcess process(GetCommandInterpreter().GetProcess ());
25530fdc8d8SChris Lattner             if (process.IsValid())
25630fdc8d8SChris Lattner             {
25730fdc8d8SChris Lattner                 EventSP event_sp;
2586611103cSGreg Clayton                 Listener &lldb_listener = m_opaque_sp->GetListener();
25930fdc8d8SChris Lattner                 while (lldb_listener.GetNextEventForBroadcaster (process.get(), event_sp))
26030fdc8d8SChris Lattner                 {
26130fdc8d8SChris Lattner                     SBEvent event(event_sp);
26230fdc8d8SChris Lattner                     HandleProcessEvent (process, event, GetOutputFileHandle(), GetErrorFileHandle());
26330fdc8d8SChris Lattner                 }
26430fdc8d8SChris Lattner             }
26530fdc8d8SChris Lattner         }
26630fdc8d8SChris Lattner     }
2676611103cSGreg Clayton }
26830fdc8d8SChris Lattner 
26930fdc8d8SChris Lattner SBListener
27030fdc8d8SChris Lattner SBDebugger::GetListener ()
27130fdc8d8SChris Lattner {
2722d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
273ceb6b139SCaroline Tice 
2746611103cSGreg Clayton     SBListener sb_listener;
2756611103cSGreg Clayton     if (m_opaque_sp)
2766611103cSGreg Clayton         sb_listener.reset(&m_opaque_sp->GetListener(), false);
277ceb6b139SCaroline Tice 
278750cd175SCaroline Tice     if (log)
27993aa84e8SGreg Clayton         log->Printf ("SBDebugger(%p)::GetListener () => SBListener(%p)", m_opaque_sp.get(),
280750cd175SCaroline Tice                      sb_listener.get());
281750cd175SCaroline Tice 
28230fdc8d8SChris Lattner     return sb_listener;
28330fdc8d8SChris Lattner }
28430fdc8d8SChris Lattner 
28530fdc8d8SChris Lattner void
28630fdc8d8SChris Lattner SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, FILE *out, FILE *err)
28730fdc8d8SChris Lattner {
288af67cecdSGreg Clayton     if (!process.IsValid())
289af67cecdSGreg Clayton         return;
290af67cecdSGreg Clayton 
29130fdc8d8SChris Lattner     const uint32_t event_type = event.GetType();
29230fdc8d8SChris Lattner     char stdio_buffer[1024];
29330fdc8d8SChris Lattner     size_t len;
29430fdc8d8SChris Lattner 
295af67cecdSGreg Clayton     Mutex::Locker api_locker (process.GetTarget()->GetAPIMutex());
296af67cecdSGreg Clayton 
297af67cecdSGreg Clayton     if (event_type & (Process::eBroadcastBitSTDOUT | Process::eBroadcastBitStateChanged))
29830fdc8d8SChris Lattner     {
299af67cecdSGreg Clayton         // Drain stdout when we stop just in case we have any bytes
30030fdc8d8SChris Lattner         while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
30130fdc8d8SChris Lattner             if (out != NULL)
30230fdc8d8SChris Lattner                 ::fwrite (stdio_buffer, 1, len, out);
30330fdc8d8SChris Lattner     }
304af67cecdSGreg Clayton 
305af67cecdSGreg Clayton     if (event_type & (Process::eBroadcastBitSTDERR | Process::eBroadcastBitStateChanged))
30630fdc8d8SChris Lattner     {
307af67cecdSGreg Clayton         // Drain stderr when we stop just in case we have any bytes
30830fdc8d8SChris Lattner         while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
309af67cecdSGreg Clayton             if (err != NULL)
310af67cecdSGreg Clayton                 ::fwrite (stdio_buffer, 1, len, err);
31130fdc8d8SChris Lattner     }
312af67cecdSGreg Clayton 
313af67cecdSGreg Clayton     if (event_type & Process::eBroadcastBitStateChanged)
31430fdc8d8SChris Lattner     {
31530fdc8d8SChris Lattner         StateType event_state = SBProcess::GetStateFromEvent (event);
31630fdc8d8SChris Lattner 
31730fdc8d8SChris Lattner         if (event_state == eStateInvalid)
31830fdc8d8SChris Lattner             return;
31930fdc8d8SChris Lattner 
32030fdc8d8SChris Lattner         bool is_stopped = StateIsStoppedState (event_state);
32130fdc8d8SChris Lattner         if (!is_stopped)
3222976d00aSJim Ingham             process.ReportEventState (event, out);
32330fdc8d8SChris Lattner     }
32430fdc8d8SChris Lattner }
32530fdc8d8SChris Lattner 
32630fdc8d8SChris Lattner SBSourceManager &
32730fdc8d8SChris Lattner SBDebugger::GetSourceManager ()
32830fdc8d8SChris Lattner {
32930fdc8d8SChris Lattner     static SourceManager g_lldb_source_manager;
330efabb123SGreg Clayton     static SBSourceManager g_sb_source_manager (&g_lldb_source_manager);
33130fdc8d8SChris Lattner     return g_sb_source_manager;
33230fdc8d8SChris Lattner }
33330fdc8d8SChris Lattner 
33430fdc8d8SChris Lattner 
33530fdc8d8SChris Lattner bool
33630fdc8d8SChris Lattner SBDebugger::GetDefaultArchitecture (char *arch_name, size_t arch_name_len)
33730fdc8d8SChris Lattner {
33830fdc8d8SChris Lattner     if (arch_name && arch_name_len)
33930fdc8d8SChris Lattner     {
340daccaa9eSCaroline Tice         ArchSpec default_arch = lldb_private::Target::GetDefaultArchitecture ();
341daccaa9eSCaroline Tice 
34230fdc8d8SChris Lattner         if (default_arch.IsValid())
34330fdc8d8SChris Lattner         {
34430fdc8d8SChris Lattner             ::snprintf (arch_name, arch_name_len, "%s", default_arch.AsCString());
34530fdc8d8SChris Lattner             return true;
34630fdc8d8SChris Lattner         }
34730fdc8d8SChris Lattner     }
34830fdc8d8SChris Lattner     if (arch_name && arch_name_len)
34930fdc8d8SChris Lattner         arch_name[0] = '\0';
35030fdc8d8SChris Lattner     return false;
35130fdc8d8SChris Lattner }
35230fdc8d8SChris Lattner 
35330fdc8d8SChris Lattner 
35430fdc8d8SChris Lattner bool
35530fdc8d8SChris Lattner SBDebugger::SetDefaultArchitecture (const char *arch_name)
35630fdc8d8SChris Lattner {
35730fdc8d8SChris Lattner     if (arch_name)
35830fdc8d8SChris Lattner     {
35930fdc8d8SChris Lattner         ArchSpec arch (arch_name);
36030fdc8d8SChris Lattner         if (arch.IsValid())
36130fdc8d8SChris Lattner         {
362daccaa9eSCaroline Tice             lldb_private::Target::SetDefaultArchitecture (arch);
36330fdc8d8SChris Lattner             return true;
36430fdc8d8SChris Lattner         }
36530fdc8d8SChris Lattner     }
36630fdc8d8SChris Lattner     return false;
36730fdc8d8SChris Lattner }
36830fdc8d8SChris Lattner 
36930fdc8d8SChris Lattner ScriptLanguage
37030fdc8d8SChris Lattner SBDebugger::GetScriptingLanguage (const char *script_language_name)
37130fdc8d8SChris Lattner {
372af67cecdSGreg Clayton 
37330fdc8d8SChris Lattner     return Args::StringToScriptLanguage (script_language_name,
37430fdc8d8SChris Lattner                                          eScriptLanguageDefault,
37530fdc8d8SChris Lattner                                          NULL);
37630fdc8d8SChris Lattner }
37730fdc8d8SChris Lattner 
37830fdc8d8SChris Lattner const char *
37930fdc8d8SChris Lattner SBDebugger::GetVersionString ()
38030fdc8d8SChris Lattner {
38130fdc8d8SChris Lattner     return lldb_private::GetVersion();
38230fdc8d8SChris Lattner }
38330fdc8d8SChris Lattner 
38430fdc8d8SChris Lattner const char *
38530fdc8d8SChris Lattner SBDebugger::StateAsCString (lldb::StateType state)
38630fdc8d8SChris Lattner {
38730fdc8d8SChris Lattner     return lldb_private::StateAsCString (state);
38830fdc8d8SChris Lattner }
38930fdc8d8SChris Lattner 
39030fdc8d8SChris Lattner bool
39130fdc8d8SChris Lattner SBDebugger::StateIsRunningState (lldb::StateType state)
39230fdc8d8SChris Lattner {
3932d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3944838131bSGreg Clayton 
3954838131bSGreg Clayton     const bool result = lldb_private::StateIsRunningState (state);
3964838131bSGreg Clayton     if (log)
3974838131bSGreg Clayton         log->Printf ("SBDebugger::StateIsRunningState (state=%s) => %i",
3984838131bSGreg Clayton                      lldb_private::StateAsCString (state), result);
3994838131bSGreg Clayton 
4004838131bSGreg Clayton     return result;
40130fdc8d8SChris Lattner }
40230fdc8d8SChris Lattner 
40330fdc8d8SChris Lattner bool
40430fdc8d8SChris Lattner SBDebugger::StateIsStoppedState (lldb::StateType state)
40530fdc8d8SChris Lattner {
4062d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
407ceb6b139SCaroline Tice 
4084838131bSGreg Clayton     const bool result = lldb_private::StateIsStoppedState (state);
409ceb6b139SCaroline Tice     if (log)
4104838131bSGreg Clayton         log->Printf ("SBDebugger::StateIsStoppedState (state=%s) => %i",
4114838131bSGreg Clayton                      lldb_private::StateAsCString (state), result);
412ceb6b139SCaroline Tice 
4134838131bSGreg Clayton     return result;
41430fdc8d8SChris Lattner }
41530fdc8d8SChris Lattner 
41630fdc8d8SChris Lattner 
41730fdc8d8SChris Lattner SBTarget
41830fdc8d8SChris Lattner SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename,
41930fdc8d8SChris Lattner                                                  const char *target_triple)
42030fdc8d8SChris Lattner {
4216611103cSGreg Clayton     SBTarget target;
4226611103cSGreg Clayton     if (m_opaque_sp)
4236611103cSGreg Clayton     {
42430fdc8d8SChris Lattner         ArchSpec arch;
425274060b6SGreg Clayton         FileSpec file_spec (filename, true);
42630fdc8d8SChris Lattner         arch.SetArchFromTargetTriple(target_triple);
42730fdc8d8SChris Lattner         TargetSP target_sp;
4286611103cSGreg Clayton         Error error (m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file_spec, arch, NULL, true, target_sp));
4296611103cSGreg Clayton         target.reset (target_sp);
4306611103cSGreg Clayton     }
4314838131bSGreg Clayton 
4322d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4334838131bSGreg Clayton     if (log)
4344838131bSGreg Clayton     {
435cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndTargetTriple (filename=\"%s\", triple=%s) => SBTarget(%p)",
4364838131bSGreg Clayton                      m_opaque_sp.get(), filename, target_triple, target.get());
4374838131bSGreg Clayton     }
4384838131bSGreg Clayton 
43930fdc8d8SChris Lattner     return target;
44030fdc8d8SChris Lattner }
44130fdc8d8SChris Lattner 
44230fdc8d8SChris Lattner SBTarget
44330fdc8d8SChris Lattner SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *archname)
44430fdc8d8SChris Lattner {
4452d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
446ceb6b139SCaroline Tice 
4476611103cSGreg Clayton     SBTarget target;
4486611103cSGreg Clayton     if (m_opaque_sp)
4496611103cSGreg Clayton     {
450274060b6SGreg Clayton         FileSpec file (filename, true);
451daccaa9eSCaroline Tice         ArchSpec arch = lldb_private::Target::GetDefaultArchitecture ();
45230fdc8d8SChris Lattner         TargetSP target_sp;
45330fdc8d8SChris Lattner         Error error;
45430fdc8d8SChris Lattner 
45530fdc8d8SChris Lattner         if (archname != NULL)
45630fdc8d8SChris Lattner         {
45730fdc8d8SChris Lattner             ArchSpec arch2 (archname);
4586611103cSGreg Clayton             error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch2, NULL, true, target_sp);
45930fdc8d8SChris Lattner         }
46030fdc8d8SChris Lattner         else
46130fdc8d8SChris Lattner         {
46230fdc8d8SChris Lattner             if (!arch.IsValid())
46330fdc8d8SChris Lattner                 arch = LLDB_ARCH_DEFAULT;
46430fdc8d8SChris Lattner 
4656611103cSGreg Clayton             error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
46630fdc8d8SChris Lattner 
46730fdc8d8SChris Lattner             if (error.Fail())
46830fdc8d8SChris Lattner             {
46930fdc8d8SChris Lattner                 if (arch == LLDB_ARCH_DEFAULT_32BIT)
47030fdc8d8SChris Lattner                     arch = LLDB_ARCH_DEFAULT_64BIT;
47130fdc8d8SChris Lattner                 else
47230fdc8d8SChris Lattner                     arch = LLDB_ARCH_DEFAULT_32BIT;
47330fdc8d8SChris Lattner 
4746611103cSGreg Clayton                 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
47530fdc8d8SChris Lattner             }
47630fdc8d8SChris Lattner         }
47730fdc8d8SChris Lattner 
47830fdc8d8SChris Lattner         if (error.Success())
4796611103cSGreg Clayton         {
4802976d00aSJim Ingham             m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
4816611103cSGreg Clayton             target.reset(target_sp);
4826611103cSGreg Clayton         }
4836611103cSGreg Clayton     }
484ceb6b139SCaroline Tice 
485ceb6b139SCaroline Tice     if (log)
486ceb6b139SCaroline Tice     {
487cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndArch (filename=\"%s\", arch=%s) => SBTarget(%p)",
4884838131bSGreg Clayton                      m_opaque_sp.get(), filename, archname, target.get());
489ceb6b139SCaroline Tice     }
490ceb6b139SCaroline Tice 
4916611103cSGreg Clayton     return target;
49230fdc8d8SChris Lattner }
49330fdc8d8SChris Lattner 
49430fdc8d8SChris Lattner SBTarget
49530fdc8d8SChris Lattner SBDebugger::CreateTarget (const char *filename)
49630fdc8d8SChris Lattner {
4976611103cSGreg Clayton     SBTarget target;
4986611103cSGreg Clayton     if (m_opaque_sp)
4996611103cSGreg Clayton     {
500274060b6SGreg Clayton         FileSpec file (filename, true);
501daccaa9eSCaroline Tice         ArchSpec arch = lldb_private::Target::GetDefaultArchitecture ();
50230fdc8d8SChris Lattner         TargetSP target_sp;
50330fdc8d8SChris Lattner         Error error;
50430fdc8d8SChris Lattner 
50530fdc8d8SChris Lattner         if (!arch.IsValid())
50630fdc8d8SChris Lattner             arch = LLDB_ARCH_DEFAULT;
50730fdc8d8SChris Lattner 
5086611103cSGreg Clayton         error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
50930fdc8d8SChris Lattner 
51030fdc8d8SChris Lattner         if (error.Fail())
51130fdc8d8SChris Lattner         {
51230fdc8d8SChris Lattner             if (arch == LLDB_ARCH_DEFAULT_32BIT)
51330fdc8d8SChris Lattner                 arch = LLDB_ARCH_DEFAULT_64BIT;
51430fdc8d8SChris Lattner             else
51530fdc8d8SChris Lattner                 arch = LLDB_ARCH_DEFAULT_32BIT;
51630fdc8d8SChris Lattner 
5176611103cSGreg Clayton             error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
51830fdc8d8SChris Lattner         }
51930fdc8d8SChris Lattner 
5206611103cSGreg Clayton         if (error.Success())
5216611103cSGreg Clayton         {
5222976d00aSJim Ingham             m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
5236611103cSGreg Clayton             target.reset (target_sp);
5246611103cSGreg Clayton         }
5256611103cSGreg Clayton     }
5262d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5274838131bSGreg Clayton     if (log)
5284838131bSGreg Clayton     {
529cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)",
5304838131bSGreg Clayton                      m_opaque_sp.get(), filename, target.get());
5314838131bSGreg Clayton     }
5326611103cSGreg Clayton     return target;
53330fdc8d8SChris Lattner }
53430fdc8d8SChris Lattner 
53530fdc8d8SChris Lattner SBTarget
53630fdc8d8SChris Lattner SBDebugger::GetTargetAtIndex (uint32_t idx)
53730fdc8d8SChris Lattner {
5386611103cSGreg Clayton     SBTarget sb_target;
5396611103cSGreg Clayton     if (m_opaque_sp)
540af67cecdSGreg Clayton     {
541af67cecdSGreg Clayton         // No need to lock, the target list is thread safe
5426611103cSGreg Clayton         sb_target.reset(m_opaque_sp->GetTargetList().GetTargetAtIndex (idx));
543af67cecdSGreg Clayton     }
54430fdc8d8SChris Lattner     return sb_target;
54530fdc8d8SChris Lattner }
54630fdc8d8SChris Lattner 
54730fdc8d8SChris Lattner SBTarget
54830fdc8d8SChris Lattner SBDebugger::FindTargetWithProcessID (pid_t pid)
54930fdc8d8SChris Lattner {
5506611103cSGreg Clayton     SBTarget sb_target;
5516611103cSGreg Clayton     if (m_opaque_sp)
552af67cecdSGreg Clayton     {
553af67cecdSGreg Clayton         // No need to lock, the target list is thread safe
5546611103cSGreg Clayton         sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid));
555af67cecdSGreg Clayton     }
55630fdc8d8SChris Lattner     return sb_target;
55730fdc8d8SChris Lattner }
55830fdc8d8SChris Lattner 
55930fdc8d8SChris Lattner SBTarget
56030fdc8d8SChris Lattner SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name)
56130fdc8d8SChris Lattner {
5626611103cSGreg Clayton     SBTarget sb_target;
5636611103cSGreg Clayton     if (m_opaque_sp && filename && filename[0])
5646611103cSGreg Clayton     {
565af67cecdSGreg Clayton         // No need to lock, the target list is thread safe
56630fdc8d8SChris Lattner         ArchSpec arch;
56730fdc8d8SChris Lattner         if (arch_name)
56830fdc8d8SChris Lattner             arch.SetArch(arch_name);
569274060b6SGreg Clayton         TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename, false), arch_name ? &arch : NULL));
5706611103cSGreg Clayton         sb_target.reset(target_sp);
5716611103cSGreg Clayton     }
5726611103cSGreg Clayton     return sb_target;
57330fdc8d8SChris Lattner }
57430fdc8d8SChris Lattner 
57530fdc8d8SChris Lattner SBTarget
57630fdc8d8SChris Lattner SBDebugger::FindTargetWithLLDBProcess (const lldb::ProcessSP &process_sp)
57730fdc8d8SChris Lattner {
5786611103cSGreg Clayton     SBTarget sb_target;
5796611103cSGreg Clayton     if (m_opaque_sp)
580af67cecdSGreg Clayton     {
581af67cecdSGreg Clayton         // No need to lock, the target list is thread safe
5826611103cSGreg Clayton         sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get()));
583af67cecdSGreg Clayton     }
58430fdc8d8SChris Lattner     return sb_target;
58530fdc8d8SChris Lattner }
58630fdc8d8SChris Lattner 
58730fdc8d8SChris Lattner 
58830fdc8d8SChris Lattner uint32_t
58930fdc8d8SChris Lattner SBDebugger::GetNumTargets ()
59030fdc8d8SChris Lattner {
5916611103cSGreg Clayton     if (m_opaque_sp)
592af67cecdSGreg Clayton     {
593af67cecdSGreg Clayton         // No need to lock, the target list is thread safe
5946611103cSGreg Clayton         return m_opaque_sp->GetTargetList().GetNumTargets ();
595af67cecdSGreg Clayton     }
5966611103cSGreg Clayton     return 0;
5976611103cSGreg Clayton }
59830fdc8d8SChris Lattner 
59930fdc8d8SChris Lattner SBTarget
6002976d00aSJim Ingham SBDebugger::GetSelectedTarget ()
60130fdc8d8SChris Lattner {
6022d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
603ceb6b139SCaroline Tice 
6046611103cSGreg Clayton     SBTarget sb_target;
6056611103cSGreg Clayton     if (m_opaque_sp)
606af67cecdSGreg Clayton     {
607af67cecdSGreg Clayton         // No need to lock, the target list is thread safe
6082976d00aSJim Ingham         sb_target.reset(m_opaque_sp->GetTargetList().GetSelectedTarget ());
609af67cecdSGreg Clayton     }
610ceb6b139SCaroline Tice 
611ceb6b139SCaroline Tice     if (log)
612ceb6b139SCaroline Tice     {
613ceb6b139SCaroline Tice         SBStream sstr;
614ceb6b139SCaroline Tice         sb_target.GetDescription (sstr, lldb::eDescriptionLevelBrief);
61593aa84e8SGreg Clayton         log->Printf ("SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s", m_opaque_sp.get(),
616750cd175SCaroline Tice                      sb_target.get(), sstr.GetData());
617ceb6b139SCaroline Tice     }
618ceb6b139SCaroline Tice 
61930fdc8d8SChris Lattner     return sb_target;
62030fdc8d8SChris Lattner }
62130fdc8d8SChris Lattner 
62230fdc8d8SChris Lattner void
62330fdc8d8SChris Lattner SBDebugger::DispatchInput (void *baton, const void *data, size_t data_len)
62430fdc8d8SChris Lattner {
6252d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
626ceb6b139SCaroline Tice 
627ceb6b139SCaroline Tice     if (log)
628cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::DispatchInput (baton=%p, data=\"%.*s\", size_t=%zu)", m_opaque_sp.get(),
629cfd1acedSGreg Clayton                      baton, (int) data_len, (const char *) data, data_len);
630ceb6b139SCaroline Tice 
6316611103cSGreg Clayton     if (m_opaque_sp)
6326611103cSGreg Clayton         m_opaque_sp->DispatchInput ((const char *) data, data_len);
63330fdc8d8SChris Lattner }
63430fdc8d8SChris Lattner 
63530fdc8d8SChris Lattner void
636efed6131SCaroline Tice SBDebugger::DispatchInputInterrupt ()
637efed6131SCaroline Tice {
638efed6131SCaroline Tice     if (m_opaque_sp)
639efed6131SCaroline Tice         m_opaque_sp->DispatchInputInterrupt ();
640efed6131SCaroline Tice }
641efed6131SCaroline Tice 
642efed6131SCaroline Tice void
643efed6131SCaroline Tice SBDebugger::DispatchInputEndOfFile ()
644efed6131SCaroline Tice {
645efed6131SCaroline Tice     if (m_opaque_sp)
646efed6131SCaroline Tice         m_opaque_sp->DispatchInputEndOfFile ();
647efed6131SCaroline Tice }
648efed6131SCaroline Tice 
649efed6131SCaroline Tice void
65030fdc8d8SChris Lattner SBDebugger::PushInputReader (SBInputReader &reader)
65130fdc8d8SChris Lattner {
6522d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
653ceb6b139SCaroline Tice 
654ceb6b139SCaroline Tice     if (log)
65593aa84e8SGreg Clayton         log->Printf ("SBDebugger(%p)::PushInputReader (SBInputReader(%p))", m_opaque_sp.get(), &reader);
656ceb6b139SCaroline Tice 
6576611103cSGreg Clayton     if (m_opaque_sp && reader.IsValid())
65830fdc8d8SChris Lattner     {
659af67cecdSGreg Clayton         TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
660af67cecdSGreg Clayton         Mutex::Locker api_locker;
661af67cecdSGreg Clayton         if (target_sp)
662af67cecdSGreg Clayton             api_locker.Reset(target_sp->GetAPIMutex().GetMutex());
66330fdc8d8SChris Lattner         InputReaderSP reader_sp(*reader);
6646611103cSGreg Clayton         m_opaque_sp->PushInputReader (reader_sp);
66530fdc8d8SChris Lattner     }
66630fdc8d8SChris Lattner }
6676611103cSGreg Clayton 
6686611103cSGreg Clayton void
6696611103cSGreg Clayton SBDebugger::reset (const lldb::DebuggerSP &debugger_sp)
6706611103cSGreg Clayton {
6716611103cSGreg Clayton     m_opaque_sp = debugger_sp;
6726611103cSGreg Clayton }
6736611103cSGreg Clayton 
6746611103cSGreg Clayton Debugger *
6756611103cSGreg Clayton SBDebugger::get () const
6766611103cSGreg Clayton {
6776611103cSGreg Clayton     return m_opaque_sp.get();
6786611103cSGreg Clayton }
6796611103cSGreg Clayton 
6806611103cSGreg Clayton Debugger &
6816611103cSGreg Clayton SBDebugger::ref () const
6826611103cSGreg Clayton {
6836611103cSGreg Clayton     assert (m_opaque_sp.get());
6846611103cSGreg Clayton     return *m_opaque_sp;
6856611103cSGreg Clayton }
6866611103cSGreg Clayton 
6876611103cSGreg Clayton 
688ebc1bb27SCaroline Tice SBDebugger
689ebc1bb27SCaroline Tice SBDebugger::FindDebuggerWithID (int id)
690ebc1bb27SCaroline Tice {
691af67cecdSGreg Clayton     // No need to lock, the debugger list is thread safe
692ebc1bb27SCaroline Tice     SBDebugger sb_debugger;
693ebc1bb27SCaroline Tice     lldb::DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id);
694ebc1bb27SCaroline Tice     if (debugger_sp)
695ebc1bb27SCaroline Tice         sb_debugger.reset (debugger_sp);
696ebc1bb27SCaroline Tice     return sb_debugger;
697ebc1bb27SCaroline Tice }
698e40e4218SJim Ingham 
699dd759857SCaroline Tice const char *
700dd759857SCaroline Tice SBDebugger::GetInstanceName()
701dd759857SCaroline Tice {
702dd759857SCaroline Tice     if (m_opaque_sp)
703dd759857SCaroline Tice         return m_opaque_sp->GetInstanceName().AsCString();
704dd759857SCaroline Tice     else
705dd759857SCaroline Tice         return NULL;
706dd759857SCaroline Tice }
707dd759857SCaroline Tice 
7083df9a8dfSCaroline Tice SBError
709dd759857SCaroline Tice SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name)
7103df9a8dfSCaroline Tice {
7113df9a8dfSCaroline Tice     lldb::UserSettingsControllerSP root_settings_controller = lldb_private::Debugger::GetSettingsController();
7123df9a8dfSCaroline Tice 
7131559a46bSCaroline Tice     Error err = root_settings_controller->SetVariable (var_name, value, lldb::eVarSetOperationAssign, true,
714101c7c20SCaroline Tice                                                        debugger_instance_name);
7153df9a8dfSCaroline Tice     SBError sb_error;
7163df9a8dfSCaroline Tice     sb_error.SetError (err);
7173df9a8dfSCaroline Tice 
7183df9a8dfSCaroline Tice     return sb_error;
7193df9a8dfSCaroline Tice }
7203df9a8dfSCaroline Tice 
7213df9a8dfSCaroline Tice lldb::SBStringList
722dd759857SCaroline Tice SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name)
7233df9a8dfSCaroline Tice {
7243df9a8dfSCaroline Tice     SBStringList ret_value;
725101c7c20SCaroline Tice     lldb::SettableVariableType var_type;
726508265afSJohnny Chen     lldb_private::Error err;
727101c7c20SCaroline Tice 
7283df9a8dfSCaroline Tice     lldb::UserSettingsControllerSP root_settings_controller = lldb_private::Debugger::GetSettingsController();
7293df9a8dfSCaroline Tice 
730daccaa9eSCaroline Tice     StringList value = root_settings_controller->GetVariable (var_name, var_type, debugger_instance_name, err);
731daccaa9eSCaroline Tice 
732daccaa9eSCaroline Tice     if (err.Success())
733daccaa9eSCaroline Tice     {
734311adf3dSChris Lattner         for (unsigned i = 0; i != value.GetSize(); ++i)
7353df9a8dfSCaroline Tice             ret_value.AppendString (value.GetStringAtIndex(i));
736daccaa9eSCaroline Tice     }
737daccaa9eSCaroline Tice     else
738daccaa9eSCaroline Tice     {
739daccaa9eSCaroline Tice         ret_value.AppendString (err.AsCString());
740daccaa9eSCaroline Tice     }
741daccaa9eSCaroline Tice 
7423df9a8dfSCaroline Tice 
7433df9a8dfSCaroline Tice     return ret_value;
7443df9a8dfSCaroline Tice }
7453df9a8dfSCaroline Tice 
746a7015092SGreg Clayton uint32_t
747a7015092SGreg Clayton SBDebugger::GetTerminalWidth () const
748a7015092SGreg Clayton {
749a7015092SGreg Clayton     if (m_opaque_sp)
750a7015092SGreg Clayton         return m_opaque_sp->GetTerminalWidth ();
751a7015092SGreg Clayton     return 0;
752a7015092SGreg Clayton }
753a7015092SGreg Clayton 
754a7015092SGreg Clayton void
755a7015092SGreg Clayton SBDebugger::SetTerminalWidth (uint32_t term_width)
756a7015092SGreg Clayton {
757a7015092SGreg Clayton     if (m_opaque_sp)
758a7015092SGreg Clayton         m_opaque_sp->SetTerminalWidth (term_width);
759a7015092SGreg Clayton }
760a7015092SGreg Clayton 
761a7015092SGreg Clayton const char *
762a7015092SGreg Clayton SBDebugger::GetPrompt() const
763a7015092SGreg Clayton {
7642d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
765ceb6b139SCaroline Tice 
766ceb6b139SCaroline Tice     if (log)
767cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::GetPrompt () => \"%s\"", m_opaque_sp.get(),
768750cd175SCaroline Tice                      (m_opaque_sp ? m_opaque_sp->GetPrompt() : ""));
769ceb6b139SCaroline Tice 
770a7015092SGreg Clayton     if (m_opaque_sp)
771a7015092SGreg Clayton         return m_opaque_sp->GetPrompt ();
772a7015092SGreg Clayton     return 0;
773a7015092SGreg Clayton }
774a7015092SGreg Clayton 
775a7015092SGreg Clayton void
776a7015092SGreg Clayton SBDebugger::SetPrompt (const char *prompt)
777a7015092SGreg Clayton {
778a7015092SGreg Clayton     if (m_opaque_sp)
779a7015092SGreg Clayton         m_opaque_sp->SetPrompt (prompt);
780a7015092SGreg Clayton }
781a7015092SGreg Clayton 
782a7015092SGreg Clayton 
783a7015092SGreg Clayton lldb::ScriptLanguage
784a7015092SGreg Clayton SBDebugger::GetScriptLanguage() const
785a7015092SGreg Clayton {
786a7015092SGreg Clayton     if (m_opaque_sp)
787a7015092SGreg Clayton         return m_opaque_sp->GetScriptLanguage ();
788a7015092SGreg Clayton     return eScriptLanguageNone;
789a7015092SGreg Clayton }
790a7015092SGreg Clayton 
791a7015092SGreg Clayton void
792a7015092SGreg Clayton SBDebugger::SetScriptLanguage (lldb::ScriptLanguage script_lang)
793a7015092SGreg Clayton {
794a7015092SGreg Clayton     if (m_opaque_sp)
795af67cecdSGreg Clayton     {
796a7015092SGreg Clayton         m_opaque_sp->SetScriptLanguage (script_lang);
797a7015092SGreg Clayton     }
798af67cecdSGreg Clayton }
799a7015092SGreg Clayton 
800e40e4218SJim Ingham bool
801e40e4218SJim Ingham SBDebugger::SetUseExternalEditor (bool value)
802e40e4218SJim Ingham {
803e40e4218SJim Ingham     if (m_opaque_sp)
804e40e4218SJim Ingham         return m_opaque_sp->SetUseExternalEditor (value);
805e40e4218SJim Ingham     return false;
806e40e4218SJim Ingham }
807e40e4218SJim Ingham 
808e40e4218SJim Ingham bool
809daccaa9eSCaroline Tice SBDebugger::GetUseExternalEditor ()
810e40e4218SJim Ingham {
811e40e4218SJim Ingham     if (m_opaque_sp)
812daccaa9eSCaroline Tice         return m_opaque_sp->GetUseExternalEditor ();
813e40e4218SJim Ingham     return false;
814e40e4218SJim Ingham }
815e40e4218SJim Ingham 
816dde9cff3SCaroline Tice bool
817dde9cff3SCaroline Tice SBDebugger::GetDescription (SBStream &description)
818dde9cff3SCaroline Tice {
819dde9cff3SCaroline Tice     if (m_opaque_sp)
820dde9cff3SCaroline Tice     {
821dde9cff3SCaroline Tice         const char *name = m_opaque_sp->GetInstanceName().AsCString();
822dde9cff3SCaroline Tice         lldb::user_id_t id = m_opaque_sp->GetID();
823cfd1acedSGreg Clayton         description.Printf ("Debugger (instance: \"%s\", id: %d)", name, id);
824dde9cff3SCaroline Tice     }
825dde9cff3SCaroline Tice     else
826dde9cff3SCaroline Tice         description.Printf ("No value");
827dde9cff3SCaroline Tice 
828dde9cff3SCaroline Tice     return true;
829dde9cff3SCaroline Tice }
830efed6131SCaroline Tice 
831efed6131SCaroline Tice lldb::user_id_t
832efed6131SCaroline Tice SBDebugger::GetID()
833efed6131SCaroline Tice {
834efed6131SCaroline Tice     if (m_opaque_sp)
835efed6131SCaroline Tice         return m_opaque_sp->GetID();
836efed6131SCaroline Tice     return LLDB_INVALID_UID;
837efed6131SCaroline Tice }
838