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 
12e0d378b3SGreg Clayton #include "lldb/lldb-private.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"
182289fa48SGreg Clayton #include "lldb/API/SBError.h"
19ca93cc1dSEli Friedman #include "lldb/API/SBEvent.h"
20ca93cc1dSEli Friedman #include "lldb/API/SBFrame.h"
21ca93cc1dSEli Friedman #include "lldb/API/SBInputReader.h"
223df9a8dfSCaroline Tice #include "lldb/API/SBProcess.h"
233df9a8dfSCaroline Tice #include "lldb/API/SBSourceManager.h"
24dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
253df9a8dfSCaroline Tice #include "lldb/API/SBStringList.h"
263df9a8dfSCaroline Tice #include "lldb/API/SBTarget.h"
273df9a8dfSCaroline Tice #include "lldb/API/SBThread.h"
286eee5aa0SGreg Clayton #include "lldb/Core/Debugger.h"
296eee5aa0SGreg Clayton #include "lldb/Core/State.h"
306eee5aa0SGreg Clayton #include "lldb/Interpreter/Args.h"
316eee5aa0SGreg Clayton #include "lldb/Interpreter/CommandInterpreter.h"
326eee5aa0SGreg Clayton #include "lldb/Target/Process.h"
336eee5aa0SGreg Clayton #include "lldb/Target/TargetList.h"
3430fdc8d8SChris Lattner 
3530fdc8d8SChris Lattner using namespace lldb;
3630fdc8d8SChris Lattner using namespace lldb_private;
3730fdc8d8SChris Lattner 
3830fdc8d8SChris Lattner void
3930fdc8d8SChris Lattner SBDebugger::Initialize ()
4030fdc8d8SChris Lattner {
41431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
42ceb6b139SCaroline Tice 
43ceb6b139SCaroline Tice     if (log)
44ceb6b139SCaroline Tice         log->Printf ("SBDebugger::Initialize ()");
45ceb6b139SCaroline Tice 
46fc36f791SGreg Clayton     SBCommandInterpreter::InitializeSWIG ();
47fc36f791SGreg Clayton 
4830fdc8d8SChris Lattner     Debugger::Initialize();
4930fdc8d8SChris Lattner }
5030fdc8d8SChris Lattner 
5130fdc8d8SChris Lattner void
5230fdc8d8SChris Lattner SBDebugger::Terminate ()
5330fdc8d8SChris Lattner {
5430fdc8d8SChris Lattner     Debugger::Terminate();
5530fdc8d8SChris Lattner }
5630fdc8d8SChris Lattner 
5748e42549SGreg Clayton void
5848e42549SGreg Clayton SBDebugger::Clear ()
5948e42549SGreg Clayton {
60431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
61ceb6b139SCaroline Tice 
62ceb6b139SCaroline Tice     if (log)
6393aa84e8SGreg Clayton         log->Printf ("SBDebugger(%p)::Clear ()", m_opaque_sp.get());
643d6086f6SCaroline Tice 
653d6086f6SCaroline Tice     if (m_opaque_sp)
663d6086f6SCaroline Tice         m_opaque_sp->CleanUpInputReaders ();
67ceb6b139SCaroline Tice 
6848e42549SGreg Clayton     m_opaque_sp.reset();
6948e42549SGreg Clayton }
7048e42549SGreg Clayton 
716611103cSGreg Clayton SBDebugger
726611103cSGreg Clayton SBDebugger::Create()
736611103cSGreg Clayton {
74*66243847SJim Ingham     return SBDebugger::Create(false);
7506942690SJim Ingham }
7606942690SJim Ingham 
7706942690SJim Ingham SBDebugger
7806942690SJim Ingham SBDebugger::Create(bool source_init_files)
7906942690SJim Ingham {
80431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
81ceb6b139SCaroline Tice 
826611103cSGreg Clayton     SBDebugger debugger;
836611103cSGreg Clayton     debugger.reset(Debugger::CreateInstance());
84ceb6b139SCaroline Tice 
85ceb6b139SCaroline Tice     if (log)
86ceb6b139SCaroline Tice     {
87ceb6b139SCaroline Tice         SBStream sstr;
88ceb6b139SCaroline Tice         debugger.GetDescription (sstr);
8993aa84e8SGreg Clayton         log->Printf ("SBDebugger::Create () => SBDebugger(%p): %s", debugger.m_opaque_sp.get(), sstr.GetData());
90ceb6b139SCaroline Tice     }
91ceb6b139SCaroline Tice 
9206942690SJim Ingham     SBCommandInterpreter interp = debugger.GetCommandInterpreter();
9306942690SJim Ingham     if (source_init_files)
9406942690SJim Ingham     {
9506942690SJim Ingham         interp.get()->SkipLLDBInitFiles(false);
9606942690SJim Ingham         interp.get()->SkipAppInitFiles (false);
9706942690SJim Ingham         SBCommandReturnObject result;
9806942690SJim Ingham         interp.SourceInitFileInHomeDirectory(result);
9906942690SJim Ingham     }
10006942690SJim Ingham     else
10106942690SJim Ingham     {
10206942690SJim Ingham         interp.get()->SkipLLDBInitFiles(true);
10306942690SJim Ingham         interp.get()->SkipAppInitFiles (true);
10406942690SJim Ingham     }
1056611103cSGreg Clayton     return debugger;
1066611103cSGreg Clayton }
1076611103cSGreg Clayton 
108e02657b1SCaroline Tice void
109e02657b1SCaroline Tice SBDebugger::Destroy (SBDebugger &debugger)
110e02657b1SCaroline Tice {
111431ce678SGreg Clayton     LogSP log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
112e02657b1SCaroline Tice 
113e02657b1SCaroline Tice     if (log)
114e02657b1SCaroline Tice     {
115e02657b1SCaroline Tice         SBStream sstr;
116e02657b1SCaroline Tice         debugger.GetDescription (sstr);
117e02657b1SCaroline Tice         log->Printf ("SBDebugger::Destroy () => SBDebugger(%p): %s", debugger.m_opaque_sp.get(), sstr.GetData());
118e02657b1SCaroline Tice     }
119e02657b1SCaroline Tice 
120e02657b1SCaroline Tice     Debugger::Destroy (debugger.m_opaque_sp);
121e02657b1SCaroline Tice 
122e02657b1SCaroline Tice     if (debugger.m_opaque_sp.get() != NULL)
123e02657b1SCaroline Tice         debugger.m_opaque_sp.reset();
124e02657b1SCaroline Tice }
125e02657b1SCaroline Tice 
1266611103cSGreg Clayton SBDebugger::SBDebugger () :
1276611103cSGreg Clayton     m_opaque_sp ()
1286611103cSGreg Clayton {
1296611103cSGreg Clayton }
1306611103cSGreg Clayton 
131efabb123SGreg Clayton SBDebugger::SBDebugger(const SBDebugger &rhs) :
132efabb123SGreg Clayton     m_opaque_sp (rhs.m_opaque_sp)
133efabb123SGreg Clayton {
134efabb123SGreg Clayton }
135efabb123SGreg Clayton 
136efabb123SGreg Clayton SBDebugger &
137efabb123SGreg Clayton SBDebugger::operator = (const SBDebugger &rhs)
138efabb123SGreg Clayton {
139efabb123SGreg Clayton     if (this != &rhs)
140efabb123SGreg Clayton     {
141efabb123SGreg Clayton         m_opaque_sp = rhs.m_opaque_sp;
142efabb123SGreg Clayton     }
143efabb123SGreg Clayton     return *this;
144efabb123SGreg Clayton }
145efabb123SGreg Clayton 
1466611103cSGreg Clayton SBDebugger::~SBDebugger ()
1476611103cSGreg Clayton {
1486611103cSGreg Clayton }
1496611103cSGreg Clayton 
1506611103cSGreg Clayton bool
1516611103cSGreg Clayton SBDebugger::IsValid() const
1526611103cSGreg Clayton {
1536611103cSGreg Clayton     return m_opaque_sp.get() != NULL;
1546611103cSGreg Clayton }
1556611103cSGreg Clayton 
1566611103cSGreg Clayton 
15730fdc8d8SChris Lattner void
15830fdc8d8SChris Lattner SBDebugger::SetAsync (bool b)
15930fdc8d8SChris Lattner {
1606611103cSGreg Clayton     if (m_opaque_sp)
1616611103cSGreg Clayton         m_opaque_sp->SetAsyncExecution(b);
16230fdc8d8SChris Lattner }
16330fdc8d8SChris Lattner 
1646eee5aa0SGreg Clayton void
1656eee5aa0SGreg Clayton SBDebugger::SkipLLDBInitFiles (bool b)
1666eee5aa0SGreg Clayton {
1676eee5aa0SGreg Clayton     if (m_opaque_sp)
1686eee5aa0SGreg Clayton         m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles (b);
1696eee5aa0SGreg Clayton }
1706eee5aa0SGreg Clayton 
17116e0c686SJim Ingham void
17216e0c686SJim Ingham SBDebugger::SkipAppInitFiles (bool b)
17316e0c686SJim Ingham {
17416e0c686SJim Ingham     if (m_opaque_sp)
17516e0c686SJim Ingham         m_opaque_sp->GetCommandInterpreter().SkipAppInitFiles (b);
17616e0c686SJim Ingham }
17716e0c686SJim Ingham 
17830fdc8d8SChris Lattner // Shouldn't really be settable after initialization as this could cause lots of problems; don't want users
17930fdc8d8SChris Lattner // trying to switch modes in the middle of a debugging session.
18030fdc8d8SChris Lattner void
18130fdc8d8SChris Lattner SBDebugger::SetInputFileHandle (FILE *fh, bool transfer_ownership)
18230fdc8d8SChris Lattner {
183431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
184ceb6b139SCaroline Tice 
185ceb6b139SCaroline Tice     if (log)
186cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::SetInputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
187cfd1acedSGreg Clayton                      fh, transfer_ownership);
188ceb6b139SCaroline Tice 
1896611103cSGreg Clayton     if (m_opaque_sp)
1906611103cSGreg Clayton         m_opaque_sp->SetInputFileHandle (fh, transfer_ownership);
19130fdc8d8SChris Lattner }
19230fdc8d8SChris Lattner 
19330fdc8d8SChris Lattner void
19430fdc8d8SChris Lattner SBDebugger::SetOutputFileHandle (FILE *fh, bool transfer_ownership)
19530fdc8d8SChris Lattner {
196431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
197ceb6b139SCaroline Tice 
198ceb6b139SCaroline Tice 
199ceb6b139SCaroline Tice     if (log)
200cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::SetOutputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
201cfd1acedSGreg Clayton                      fh, transfer_ownership);
202ceb6b139SCaroline Tice 
2036611103cSGreg Clayton     if (m_opaque_sp)
2046611103cSGreg Clayton         m_opaque_sp->SetOutputFileHandle (fh, transfer_ownership);
20530fdc8d8SChris Lattner }
20630fdc8d8SChris Lattner 
20730fdc8d8SChris Lattner void
20830fdc8d8SChris Lattner SBDebugger::SetErrorFileHandle (FILE *fh, bool transfer_ownership)
20930fdc8d8SChris Lattner {
210431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
211ceb6b139SCaroline Tice 
212ceb6b139SCaroline Tice 
213ceb6b139SCaroline Tice     if (log)
214cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::SetErrorFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
215cfd1acedSGreg Clayton                      fh, transfer_ownership);
216ceb6b139SCaroline Tice 
2176611103cSGreg Clayton     if (m_opaque_sp)
2186611103cSGreg Clayton         m_opaque_sp->SetErrorFileHandle (fh, transfer_ownership);
21930fdc8d8SChris Lattner }
22030fdc8d8SChris Lattner 
22130fdc8d8SChris Lattner FILE *
22230fdc8d8SChris Lattner SBDebugger::GetInputFileHandle ()
22330fdc8d8SChris Lattner {
2246611103cSGreg Clayton     if (m_opaque_sp)
22551b1e2d2SGreg Clayton         return m_opaque_sp->GetInputFile().GetStream();
2266611103cSGreg Clayton     return NULL;
22730fdc8d8SChris Lattner }
22830fdc8d8SChris Lattner 
22930fdc8d8SChris Lattner FILE *
23030fdc8d8SChris Lattner SBDebugger::GetOutputFileHandle ()
23130fdc8d8SChris Lattner {
2326611103cSGreg Clayton     if (m_opaque_sp)
23351b1e2d2SGreg Clayton         return m_opaque_sp->GetOutputFile().GetStream();
2346611103cSGreg Clayton     return NULL;
23530fdc8d8SChris Lattner }
23630fdc8d8SChris Lattner 
23730fdc8d8SChris Lattner FILE *
23830fdc8d8SChris Lattner SBDebugger::GetErrorFileHandle ()
23930fdc8d8SChris Lattner {
2406611103cSGreg Clayton     if (m_opaque_sp)
24151b1e2d2SGreg Clayton         return m_opaque_sp->GetErrorFile().GetStream();
2426611103cSGreg Clayton     return NULL;
24330fdc8d8SChris Lattner }
24430fdc8d8SChris Lattner 
24530fdc8d8SChris Lattner SBCommandInterpreter
24630fdc8d8SChris Lattner SBDebugger::GetCommandInterpreter ()
24730fdc8d8SChris Lattner {
248431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
249ceb6b139SCaroline Tice 
2506611103cSGreg Clayton     SBCommandInterpreter sb_interpreter;
2516611103cSGreg Clayton     if (m_opaque_sp)
2526611103cSGreg Clayton         sb_interpreter.reset (&m_opaque_sp->GetCommandInterpreter());
253ceb6b139SCaroline Tice 
254750cd175SCaroline Tice     if (log)
25593aa84e8SGreg Clayton         log->Printf ("SBDebugger(%p)::GetCommandInterpreter () => SBCommandInterpreter(%p)",
256750cd175SCaroline Tice                      m_opaque_sp.get(), sb_interpreter.get());
257750cd175SCaroline Tice 
25830fdc8d8SChris Lattner     return sb_interpreter;
25930fdc8d8SChris Lattner }
26030fdc8d8SChris Lattner 
26130fdc8d8SChris Lattner void
26230fdc8d8SChris Lattner SBDebugger::HandleCommand (const char *command)
26330fdc8d8SChris Lattner {
2646611103cSGreg Clayton     if (m_opaque_sp)
2656611103cSGreg Clayton     {
266af67cecdSGreg Clayton         TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
267af67cecdSGreg Clayton         Mutex::Locker api_locker;
268af67cecdSGreg Clayton         if (target_sp)
269af67cecdSGreg Clayton             api_locker.Reset(target_sp->GetAPIMutex().GetMutex());
270af67cecdSGreg Clayton 
2716611103cSGreg Clayton         SBCommandInterpreter sb_interpreter(GetCommandInterpreter ());
27230fdc8d8SChris Lattner         SBCommandReturnObject result;
27330fdc8d8SChris Lattner 
27430fdc8d8SChris Lattner         sb_interpreter.HandleCommand (command, result, false);
27530fdc8d8SChris Lattner 
27630fdc8d8SChris Lattner         if (GetErrorFileHandle() != NULL)
27730fdc8d8SChris Lattner             result.PutError (GetErrorFileHandle());
27830fdc8d8SChris Lattner         if (GetOutputFileHandle() != NULL)
27930fdc8d8SChris Lattner             result.PutOutput (GetOutputFileHandle());
28030fdc8d8SChris Lattner 
2816611103cSGreg Clayton         if (m_opaque_sp->GetAsyncExecution() == false)
28230fdc8d8SChris Lattner         {
2836611103cSGreg Clayton             SBProcess process(GetCommandInterpreter().GetProcess ());
28430fdc8d8SChris Lattner             if (process.IsValid())
28530fdc8d8SChris Lattner             {
28630fdc8d8SChris Lattner                 EventSP event_sp;
2876611103cSGreg Clayton                 Listener &lldb_listener = m_opaque_sp->GetListener();
28830fdc8d8SChris Lattner                 while (lldb_listener.GetNextEventForBroadcaster (process.get(), event_sp))
28930fdc8d8SChris Lattner                 {
29030fdc8d8SChris Lattner                     SBEvent event(event_sp);
29130fdc8d8SChris Lattner                     HandleProcessEvent (process, event, GetOutputFileHandle(), GetErrorFileHandle());
29230fdc8d8SChris Lattner                 }
29330fdc8d8SChris Lattner             }
29430fdc8d8SChris Lattner         }
29530fdc8d8SChris Lattner     }
2966611103cSGreg Clayton }
29730fdc8d8SChris Lattner 
29830fdc8d8SChris Lattner SBListener
29930fdc8d8SChris Lattner SBDebugger::GetListener ()
30030fdc8d8SChris Lattner {
301431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
302ceb6b139SCaroline Tice 
3036611103cSGreg Clayton     SBListener sb_listener;
3046611103cSGreg Clayton     if (m_opaque_sp)
3056611103cSGreg Clayton         sb_listener.reset(&m_opaque_sp->GetListener(), false);
306ceb6b139SCaroline Tice 
307750cd175SCaroline Tice     if (log)
30893aa84e8SGreg Clayton         log->Printf ("SBDebugger(%p)::GetListener () => SBListener(%p)", m_opaque_sp.get(),
309750cd175SCaroline Tice                      sb_listener.get());
310750cd175SCaroline Tice 
31130fdc8d8SChris Lattner     return sb_listener;
31230fdc8d8SChris Lattner }
31330fdc8d8SChris Lattner 
31430fdc8d8SChris Lattner void
31530fdc8d8SChris Lattner SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, FILE *out, FILE *err)
31630fdc8d8SChris Lattner {
317af67cecdSGreg Clayton     if (!process.IsValid())
318af67cecdSGreg Clayton         return;
319af67cecdSGreg Clayton 
32030fdc8d8SChris Lattner     const uint32_t event_type = event.GetType();
32130fdc8d8SChris Lattner     char stdio_buffer[1024];
32230fdc8d8SChris Lattner     size_t len;
32330fdc8d8SChris Lattner 
324af67cecdSGreg Clayton     Mutex::Locker api_locker (process.GetTarget()->GetAPIMutex());
325af67cecdSGreg Clayton 
326af67cecdSGreg Clayton     if (event_type & (Process::eBroadcastBitSTDOUT | Process::eBroadcastBitStateChanged))
32730fdc8d8SChris Lattner     {
328af67cecdSGreg Clayton         // Drain stdout when we stop just in case we have any bytes
32930fdc8d8SChris Lattner         while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
33030fdc8d8SChris Lattner             if (out != NULL)
33130fdc8d8SChris Lattner                 ::fwrite (stdio_buffer, 1, len, out);
33230fdc8d8SChris Lattner     }
333af67cecdSGreg Clayton 
334af67cecdSGreg Clayton     if (event_type & (Process::eBroadcastBitSTDERR | Process::eBroadcastBitStateChanged))
33530fdc8d8SChris Lattner     {
336af67cecdSGreg Clayton         // Drain stderr when we stop just in case we have any bytes
33730fdc8d8SChris Lattner         while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
338af67cecdSGreg Clayton             if (err != NULL)
339af67cecdSGreg Clayton                 ::fwrite (stdio_buffer, 1, len, err);
34030fdc8d8SChris Lattner     }
341af67cecdSGreg Clayton 
342af67cecdSGreg Clayton     if (event_type & Process::eBroadcastBitStateChanged)
34330fdc8d8SChris Lattner     {
34430fdc8d8SChris Lattner         StateType event_state = SBProcess::GetStateFromEvent (event);
34530fdc8d8SChris Lattner 
34630fdc8d8SChris Lattner         if (event_state == eStateInvalid)
34730fdc8d8SChris Lattner             return;
34830fdc8d8SChris Lattner 
34930fdc8d8SChris Lattner         bool is_stopped = StateIsStoppedState (event_state);
35030fdc8d8SChris Lattner         if (!is_stopped)
3512976d00aSJim Ingham             process.ReportEventState (event, out);
35230fdc8d8SChris Lattner     }
35330fdc8d8SChris Lattner }
35430fdc8d8SChris Lattner 
35530fdc8d8SChris Lattner SBSourceManager &
35630fdc8d8SChris Lattner SBDebugger::GetSourceManager ()
35730fdc8d8SChris Lattner {
35830fdc8d8SChris Lattner     static SourceManager g_lldb_source_manager;
359efabb123SGreg Clayton     static SBSourceManager g_sb_source_manager (&g_lldb_source_manager);
36030fdc8d8SChris Lattner     return g_sb_source_manager;
36130fdc8d8SChris Lattner }
36230fdc8d8SChris Lattner 
36330fdc8d8SChris Lattner 
36430fdc8d8SChris Lattner bool
36530fdc8d8SChris Lattner SBDebugger::GetDefaultArchitecture (char *arch_name, size_t arch_name_len)
36630fdc8d8SChris Lattner {
36730fdc8d8SChris Lattner     if (arch_name && arch_name_len)
36830fdc8d8SChris Lattner     {
369431ce678SGreg Clayton         ArchSpec default_arch = Target::GetDefaultArchitecture ();
370daccaa9eSCaroline Tice 
37130fdc8d8SChris Lattner         if (default_arch.IsValid())
37230fdc8d8SChris Lattner         {
373431ce678SGreg Clayton             const std::string &triple_str = default_arch.GetTriple().str();
374431ce678SGreg Clayton             if (!triple_str.empty())
375431ce678SGreg Clayton                 ::snprintf (arch_name, arch_name_len, "%s", triple_str.c_str());
376431ce678SGreg Clayton             else
37764195a2cSGreg Clayton                 ::snprintf (arch_name, arch_name_len, "%s", default_arch.GetArchitectureName());
37830fdc8d8SChris Lattner             return true;
37930fdc8d8SChris Lattner         }
38030fdc8d8SChris Lattner     }
38130fdc8d8SChris Lattner     if (arch_name && arch_name_len)
38230fdc8d8SChris Lattner         arch_name[0] = '\0';
38330fdc8d8SChris Lattner     return false;
38430fdc8d8SChris Lattner }
38530fdc8d8SChris Lattner 
38630fdc8d8SChris Lattner 
38730fdc8d8SChris Lattner bool
38830fdc8d8SChris Lattner SBDebugger::SetDefaultArchitecture (const char *arch_name)
38930fdc8d8SChris Lattner {
39030fdc8d8SChris Lattner     if (arch_name)
39130fdc8d8SChris Lattner     {
392eb0103f2SGreg Clayton         ArchSpec arch (arch_name, NULL);
39330fdc8d8SChris Lattner         if (arch.IsValid())
39430fdc8d8SChris Lattner         {
395431ce678SGreg Clayton             Target::SetDefaultArchitecture (arch);
39630fdc8d8SChris Lattner             return true;
39730fdc8d8SChris Lattner         }
39830fdc8d8SChris Lattner     }
39930fdc8d8SChris Lattner     return false;
40030fdc8d8SChris Lattner }
40130fdc8d8SChris Lattner 
40230fdc8d8SChris Lattner ScriptLanguage
40330fdc8d8SChris Lattner SBDebugger::GetScriptingLanguage (const char *script_language_name)
40430fdc8d8SChris Lattner {
405af67cecdSGreg Clayton 
40630fdc8d8SChris Lattner     return Args::StringToScriptLanguage (script_language_name,
40730fdc8d8SChris Lattner                                          eScriptLanguageDefault,
40830fdc8d8SChris Lattner                                          NULL);
40930fdc8d8SChris Lattner }
41030fdc8d8SChris Lattner 
41130fdc8d8SChris Lattner const char *
41230fdc8d8SChris Lattner SBDebugger::GetVersionString ()
41330fdc8d8SChris Lattner {
414431ce678SGreg Clayton     return GetVersion();
41530fdc8d8SChris Lattner }
41630fdc8d8SChris Lattner 
41730fdc8d8SChris Lattner const char *
418431ce678SGreg Clayton SBDebugger::StateAsCString (StateType state)
41930fdc8d8SChris Lattner {
420c2bbb49aSCaroline Tice     return lldb_private::StateAsCString (state);
42130fdc8d8SChris Lattner }
42230fdc8d8SChris Lattner 
42330fdc8d8SChris Lattner bool
424431ce678SGreg Clayton SBDebugger::StateIsRunningState (StateType state)
42530fdc8d8SChris Lattner {
426431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4274838131bSGreg Clayton 
428c2bbb49aSCaroline Tice     const bool result = lldb_private::StateIsRunningState (state);
4294838131bSGreg Clayton     if (log)
4304838131bSGreg Clayton         log->Printf ("SBDebugger::StateIsRunningState (state=%s) => %i",
431431ce678SGreg Clayton                      StateAsCString (state), result);
4324838131bSGreg Clayton 
4334838131bSGreg Clayton     return result;
43430fdc8d8SChris Lattner }
43530fdc8d8SChris Lattner 
43630fdc8d8SChris Lattner bool
437431ce678SGreg Clayton SBDebugger::StateIsStoppedState (StateType state)
43830fdc8d8SChris Lattner {
439431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
440ceb6b139SCaroline Tice 
441c2bbb49aSCaroline Tice     const bool result = lldb_private::StateIsStoppedState (state);
442ceb6b139SCaroline Tice     if (log)
4434838131bSGreg Clayton         log->Printf ("SBDebugger::StateIsStoppedState (state=%s) => %i",
444431ce678SGreg Clayton                      StateAsCString (state), result);
445ceb6b139SCaroline Tice 
4464838131bSGreg Clayton     return result;
44730fdc8d8SChris Lattner }
44830fdc8d8SChris Lattner 
44930fdc8d8SChris Lattner 
45030fdc8d8SChris Lattner SBTarget
45130fdc8d8SChris Lattner SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename,
45230fdc8d8SChris Lattner                                                  const char *target_triple)
45330fdc8d8SChris Lattner {
4546611103cSGreg Clayton     SBTarget target;
4556611103cSGreg Clayton     if (m_opaque_sp)
4566611103cSGreg Clayton     {
45730fdc8d8SChris Lattner         ArchSpec arch;
458274060b6SGreg Clayton         FileSpec file_spec (filename, true);
459eb0103f2SGreg Clayton         arch.SetTriple (target_triple, m_opaque_sp->GetPlatformList().GetSelectedPlatform().get());
46030fdc8d8SChris Lattner         TargetSP target_sp;
461e996fd30SGreg Clayton         Error error (m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file_spec, arch, true, target_sp));
4626611103cSGreg Clayton         target.reset (target_sp);
4636611103cSGreg Clayton     }
4644838131bSGreg Clayton 
465431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4664838131bSGreg Clayton     if (log)
4674838131bSGreg Clayton     {
468cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndTargetTriple (filename=\"%s\", triple=%s) => SBTarget(%p)",
4694838131bSGreg Clayton                      m_opaque_sp.get(), filename, target_triple, target.get());
4704838131bSGreg Clayton     }
4714838131bSGreg Clayton 
47230fdc8d8SChris Lattner     return target;
47330fdc8d8SChris Lattner }
47430fdc8d8SChris Lattner 
47530fdc8d8SChris Lattner SBTarget
47664195a2cSGreg Clayton SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *arch_cstr)
47730fdc8d8SChris Lattner {
478431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
479ceb6b139SCaroline Tice 
4806611103cSGreg Clayton     SBTarget target;
4816611103cSGreg Clayton     if (m_opaque_sp)
4826611103cSGreg Clayton     {
483274060b6SGreg Clayton         FileSpec file (filename, true);
48464195a2cSGreg Clayton         ArchSpec arch;
48530fdc8d8SChris Lattner         TargetSP target_sp;
48630fdc8d8SChris Lattner         Error error;
48730fdc8d8SChris Lattner 
48864195a2cSGreg Clayton         if (arch_cstr)
489eb0103f2SGreg Clayton             arch.SetTriple (arch_cstr, m_opaque_sp->GetPlatformList().GetSelectedPlatform().get());
49064195a2cSGreg Clayton 
491e996fd30SGreg Clayton         error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, true, target_sp);
49230fdc8d8SChris Lattner 
49330fdc8d8SChris Lattner         if (error.Success())
4946611103cSGreg Clayton         {
4952976d00aSJim Ingham             m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
4966611103cSGreg Clayton             target.reset(target_sp);
4976611103cSGreg Clayton         }
4986611103cSGreg Clayton     }
499ceb6b139SCaroline Tice 
500ceb6b139SCaroline Tice     if (log)
501ceb6b139SCaroline Tice     {
502cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndArch (filename=\"%s\", arch=%s) => SBTarget(%p)",
50364195a2cSGreg Clayton                      m_opaque_sp.get(), filename, arch_cstr, target.get());
504ceb6b139SCaroline Tice     }
505ceb6b139SCaroline Tice 
5066611103cSGreg Clayton     return target;
50730fdc8d8SChris Lattner }
50830fdc8d8SChris Lattner 
50930fdc8d8SChris Lattner SBTarget
51030fdc8d8SChris Lattner SBDebugger::CreateTarget (const char *filename)
51130fdc8d8SChris Lattner {
5126611103cSGreg Clayton     SBTarget target;
5136611103cSGreg Clayton     if (m_opaque_sp)
5146611103cSGreg Clayton     {
515274060b6SGreg Clayton         FileSpec file (filename, true);
516431ce678SGreg Clayton         ArchSpec arch = Target::GetDefaultArchitecture ();
51730fdc8d8SChris Lattner         TargetSP target_sp;
51830fdc8d8SChris Lattner         Error error;
51930fdc8d8SChris Lattner 
520e996fd30SGreg Clayton         error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, true, target_sp);
52130fdc8d8SChris Lattner 
5226611103cSGreg Clayton         if (error.Success())
5236611103cSGreg Clayton         {
5242976d00aSJim Ingham             m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
5256611103cSGreg Clayton             target.reset (target_sp);
5266611103cSGreg Clayton         }
5276611103cSGreg Clayton     }
528431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5294838131bSGreg Clayton     if (log)
5304838131bSGreg Clayton     {
531cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)",
5324838131bSGreg Clayton                      m_opaque_sp.get(), filename, target.get());
5334838131bSGreg Clayton     }
5346611103cSGreg Clayton     return target;
53530fdc8d8SChris Lattner }
53630fdc8d8SChris Lattner 
5373794ad95SJohnny Chen bool
5383794ad95SJohnny Chen SBDebugger::DeleteTarget (lldb::SBTarget &target)
5393794ad95SJohnny Chen {
5403794ad95SJohnny Chen     bool result = false;
5413794ad95SJohnny Chen     if (m_opaque_sp)
5423794ad95SJohnny Chen     {
5433794ad95SJohnny Chen         // No need to lock, the target list is thread safe
5443794ad95SJohnny Chen         result = m_opaque_sp->GetTargetList().DeleteTarget (target.m_opaque_sp);
5453794ad95SJohnny Chen     }
5463794ad95SJohnny Chen 
5473794ad95SJohnny Chen     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5483794ad95SJohnny Chen     if (log)
5493794ad95SJohnny Chen     {
5503794ad95SJohnny Chen         log->Printf ("SBDebugger(%p)::DeleteTarget (SBTarget(%p)) => %i", m_opaque_sp.get(), target.m_opaque_sp.get(), result);
5513794ad95SJohnny Chen     }
5523794ad95SJohnny Chen 
5533794ad95SJohnny Chen     return result;
5543794ad95SJohnny Chen }
55530fdc8d8SChris Lattner SBTarget
55630fdc8d8SChris Lattner SBDebugger::GetTargetAtIndex (uint32_t idx)
55730fdc8d8SChris Lattner {
5586611103cSGreg Clayton     SBTarget sb_target;
5596611103cSGreg Clayton     if (m_opaque_sp)
560af67cecdSGreg Clayton     {
561af67cecdSGreg Clayton         // No need to lock, the target list is thread safe
5626611103cSGreg Clayton         sb_target.reset(m_opaque_sp->GetTargetList().GetTargetAtIndex (idx));
563af67cecdSGreg Clayton     }
56430fdc8d8SChris Lattner     return sb_target;
56530fdc8d8SChris Lattner }
56630fdc8d8SChris Lattner 
56730fdc8d8SChris Lattner SBTarget
56830fdc8d8SChris Lattner SBDebugger::FindTargetWithProcessID (pid_t pid)
56930fdc8d8SChris Lattner {
5706611103cSGreg Clayton     SBTarget sb_target;
5716611103cSGreg Clayton     if (m_opaque_sp)
572af67cecdSGreg Clayton     {
573af67cecdSGreg Clayton         // No need to lock, the target list is thread safe
5746611103cSGreg Clayton         sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid));
575af67cecdSGreg Clayton     }
57630fdc8d8SChris Lattner     return sb_target;
57730fdc8d8SChris Lattner }
57830fdc8d8SChris Lattner 
57930fdc8d8SChris Lattner SBTarget
58030fdc8d8SChris Lattner SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name)
58130fdc8d8SChris Lattner {
5826611103cSGreg Clayton     SBTarget sb_target;
5836611103cSGreg Clayton     if (m_opaque_sp && filename && filename[0])
5846611103cSGreg Clayton     {
585af67cecdSGreg Clayton         // No need to lock, the target list is thread safe
586eb0103f2SGreg Clayton         ArchSpec arch (arch_name, m_opaque_sp->GetPlatformList().GetSelectedPlatform().get());
587274060b6SGreg Clayton         TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename, false), arch_name ? &arch : NULL));
5886611103cSGreg Clayton         sb_target.reset(target_sp);
5896611103cSGreg Clayton     }
5906611103cSGreg Clayton     return sb_target;
59130fdc8d8SChris Lattner }
59230fdc8d8SChris Lattner 
59330fdc8d8SChris Lattner SBTarget
594431ce678SGreg Clayton SBDebugger::FindTargetWithLLDBProcess (const ProcessSP &process_sp)
59530fdc8d8SChris Lattner {
5966611103cSGreg Clayton     SBTarget sb_target;
5976611103cSGreg Clayton     if (m_opaque_sp)
598af67cecdSGreg Clayton     {
599af67cecdSGreg Clayton         // No need to lock, the target list is thread safe
6006611103cSGreg Clayton         sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get()));
601af67cecdSGreg Clayton     }
60230fdc8d8SChris Lattner     return sb_target;
60330fdc8d8SChris Lattner }
60430fdc8d8SChris Lattner 
60530fdc8d8SChris Lattner 
60630fdc8d8SChris Lattner uint32_t
60730fdc8d8SChris Lattner SBDebugger::GetNumTargets ()
60830fdc8d8SChris Lattner {
6096611103cSGreg Clayton     if (m_opaque_sp)
610af67cecdSGreg Clayton     {
611af67cecdSGreg Clayton         // No need to lock, the target list is thread safe
6126611103cSGreg Clayton         return m_opaque_sp->GetTargetList().GetNumTargets ();
613af67cecdSGreg Clayton     }
6146611103cSGreg Clayton     return 0;
6156611103cSGreg Clayton }
61630fdc8d8SChris Lattner 
61730fdc8d8SChris Lattner SBTarget
6182976d00aSJim Ingham SBDebugger::GetSelectedTarget ()
61930fdc8d8SChris Lattner {
620431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
621ceb6b139SCaroline Tice 
6226611103cSGreg Clayton     SBTarget sb_target;
6236611103cSGreg Clayton     if (m_opaque_sp)
624af67cecdSGreg Clayton     {
625af67cecdSGreg Clayton         // No need to lock, the target list is thread safe
6262976d00aSJim Ingham         sb_target.reset(m_opaque_sp->GetTargetList().GetSelectedTarget ());
627af67cecdSGreg Clayton     }
628ceb6b139SCaroline Tice 
629ceb6b139SCaroline Tice     if (log)
630ceb6b139SCaroline Tice     {
631ceb6b139SCaroline Tice         SBStream sstr;
632431ce678SGreg Clayton         sb_target.GetDescription (sstr, eDescriptionLevelBrief);
63393aa84e8SGreg Clayton         log->Printf ("SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s", m_opaque_sp.get(),
634750cd175SCaroline Tice                      sb_target.get(), sstr.GetData());
635ceb6b139SCaroline Tice     }
636ceb6b139SCaroline Tice 
63730fdc8d8SChris Lattner     return sb_target;
63830fdc8d8SChris Lattner }
63930fdc8d8SChris Lattner 
64030fdc8d8SChris Lattner void
64130fdc8d8SChris Lattner SBDebugger::DispatchInput (void *baton, const void *data, size_t data_len)
64230fdc8d8SChris Lattner {
643431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
644ceb6b139SCaroline Tice 
645ceb6b139SCaroline Tice     if (log)
646cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::DispatchInput (baton=%p, data=\"%.*s\", size_t=%zu)", m_opaque_sp.get(),
647cfd1acedSGreg Clayton                      baton, (int) data_len, (const char *) data, data_len);
648ceb6b139SCaroline Tice 
6496611103cSGreg Clayton     if (m_opaque_sp)
6506611103cSGreg Clayton         m_opaque_sp->DispatchInput ((const char *) data, data_len);
65130fdc8d8SChris Lattner }
65230fdc8d8SChris Lattner 
65330fdc8d8SChris Lattner void
654efed6131SCaroline Tice SBDebugger::DispatchInputInterrupt ()
655efed6131SCaroline Tice {
656efed6131SCaroline Tice     if (m_opaque_sp)
657efed6131SCaroline Tice         m_opaque_sp->DispatchInputInterrupt ();
658efed6131SCaroline Tice }
659efed6131SCaroline Tice 
660efed6131SCaroline Tice void
661efed6131SCaroline Tice SBDebugger::DispatchInputEndOfFile ()
662efed6131SCaroline Tice {
663efed6131SCaroline Tice     if (m_opaque_sp)
664efed6131SCaroline Tice         m_opaque_sp->DispatchInputEndOfFile ();
665efed6131SCaroline Tice }
6669088b068SCaroline Tice 
6679088b068SCaroline Tice bool
6689088b068SCaroline Tice SBDebugger::InputReaderIsTopReader (const lldb::SBInputReader &reader)
6699088b068SCaroline Tice {
6709088b068SCaroline Tice     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
6719088b068SCaroline Tice 
6729088b068SCaroline Tice     if (log)
6739088b068SCaroline Tice         log->Printf ("SBDebugger(%p)::InputReaderIsTopReader (SBInputReader(%p))", m_opaque_sp.get(), &reader);
6749088b068SCaroline Tice 
6759088b068SCaroline Tice     if (m_opaque_sp && reader.IsValid())
6769088b068SCaroline Tice     {
6779088b068SCaroline Tice         InputReaderSP reader_sp (*reader);
6789088b068SCaroline Tice         return m_opaque_sp->InputReaderIsTopReader (reader_sp);
6799088b068SCaroline Tice     }
6809088b068SCaroline Tice 
6819088b068SCaroline Tice     return false;
6829088b068SCaroline Tice }
6839088b068SCaroline Tice 
684efed6131SCaroline Tice 
685efed6131SCaroline Tice void
68630fdc8d8SChris Lattner SBDebugger::PushInputReader (SBInputReader &reader)
68730fdc8d8SChris Lattner {
688431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
689ceb6b139SCaroline Tice 
690ceb6b139SCaroline Tice     if (log)
69193aa84e8SGreg Clayton         log->Printf ("SBDebugger(%p)::PushInputReader (SBInputReader(%p))", m_opaque_sp.get(), &reader);
692ceb6b139SCaroline Tice 
6936611103cSGreg Clayton     if (m_opaque_sp && reader.IsValid())
69430fdc8d8SChris Lattner     {
695af67cecdSGreg Clayton         TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
696af67cecdSGreg Clayton         Mutex::Locker api_locker;
697af67cecdSGreg Clayton         if (target_sp)
698af67cecdSGreg Clayton             api_locker.Reset(target_sp->GetAPIMutex().GetMutex());
69930fdc8d8SChris Lattner         InputReaderSP reader_sp(*reader);
7006611103cSGreg Clayton         m_opaque_sp->PushInputReader (reader_sp);
70130fdc8d8SChris Lattner     }
70230fdc8d8SChris Lattner }
7036611103cSGreg Clayton 
7046611103cSGreg Clayton void
705969ed3d1SCaroline Tice SBDebugger::NotifyTopInputReader (InputReaderAction notification)
706969ed3d1SCaroline Tice {
707969ed3d1SCaroline Tice     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
708969ed3d1SCaroline Tice 
709969ed3d1SCaroline Tice     if (log)
710969ed3d1SCaroline Tice         log->Printf ("SBDebugger(%p)::NotifyTopInputReader (%d)", m_opaque_sp.get(), notification);
711969ed3d1SCaroline Tice 
712969ed3d1SCaroline Tice     if (m_opaque_sp)
713969ed3d1SCaroline Tice         m_opaque_sp->NotifyTopInputReader (notification);
714969ed3d1SCaroline Tice }
715969ed3d1SCaroline Tice 
716969ed3d1SCaroline Tice void
717431ce678SGreg Clayton SBDebugger::reset (const DebuggerSP &debugger_sp)
7186611103cSGreg Clayton {
7196611103cSGreg Clayton     m_opaque_sp = debugger_sp;
7206611103cSGreg Clayton }
7216611103cSGreg Clayton 
7226611103cSGreg Clayton Debugger *
7236611103cSGreg Clayton SBDebugger::get () const
7246611103cSGreg Clayton {
7256611103cSGreg Clayton     return m_opaque_sp.get();
7266611103cSGreg Clayton }
7276611103cSGreg Clayton 
7286611103cSGreg Clayton Debugger &
7296611103cSGreg Clayton SBDebugger::ref () const
7306611103cSGreg Clayton {
7316611103cSGreg Clayton     assert (m_opaque_sp.get());
7326611103cSGreg Clayton     return *m_opaque_sp;
7336611103cSGreg Clayton }
7346611103cSGreg Clayton 
7356611103cSGreg Clayton 
736ebc1bb27SCaroline Tice SBDebugger
737ebc1bb27SCaroline Tice SBDebugger::FindDebuggerWithID (int id)
738ebc1bb27SCaroline Tice {
739af67cecdSGreg Clayton     // No need to lock, the debugger list is thread safe
740ebc1bb27SCaroline Tice     SBDebugger sb_debugger;
741431ce678SGreg Clayton     DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id);
742ebc1bb27SCaroline Tice     if (debugger_sp)
743ebc1bb27SCaroline Tice         sb_debugger.reset (debugger_sp);
744ebc1bb27SCaroline Tice     return sb_debugger;
745ebc1bb27SCaroline Tice }
746e40e4218SJim Ingham 
747dd759857SCaroline Tice const char *
748dd759857SCaroline Tice SBDebugger::GetInstanceName()
749dd759857SCaroline Tice {
750dd759857SCaroline Tice     if (m_opaque_sp)
751dd759857SCaroline Tice         return m_opaque_sp->GetInstanceName().AsCString();
752dd759857SCaroline Tice     else
753dd759857SCaroline Tice         return NULL;
754dd759857SCaroline Tice }
755dd759857SCaroline Tice 
7563df9a8dfSCaroline Tice SBError
757dd759857SCaroline Tice SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name)
7583df9a8dfSCaroline Tice {
759431ce678SGreg Clayton     UserSettingsControllerSP root_settings_controller = Debugger::GetSettingsController();
7603df9a8dfSCaroline Tice 
761e0d378b3SGreg Clayton     Error err = root_settings_controller->SetVariable (var_name,
762e0d378b3SGreg Clayton                                                        value,
763e0d378b3SGreg Clayton                                                        eVarSetOperationAssign,
764e0d378b3SGreg Clayton                                                        true,
765101c7c20SCaroline Tice                                                        debugger_instance_name);
7663df9a8dfSCaroline Tice     SBError sb_error;
7673df9a8dfSCaroline Tice     sb_error.SetError (err);
7683df9a8dfSCaroline Tice 
7693df9a8dfSCaroline Tice     return sb_error;
7703df9a8dfSCaroline Tice }
7713df9a8dfSCaroline Tice 
772431ce678SGreg Clayton SBStringList
773dd759857SCaroline Tice SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name)
7743df9a8dfSCaroline Tice {
7753df9a8dfSCaroline Tice     SBStringList ret_value;
776e0d378b3SGreg Clayton     SettableVariableType var_type;
777431ce678SGreg Clayton     Error err;
778101c7c20SCaroline Tice 
779431ce678SGreg Clayton     UserSettingsControllerSP root_settings_controller = Debugger::GetSettingsController();
7803df9a8dfSCaroline Tice 
781daccaa9eSCaroline Tice     StringList value = root_settings_controller->GetVariable (var_name, var_type, debugger_instance_name, err);
782daccaa9eSCaroline Tice 
783daccaa9eSCaroline Tice     if (err.Success())
784daccaa9eSCaroline Tice     {
785311adf3dSChris Lattner         for (unsigned i = 0; i != value.GetSize(); ++i)
7863df9a8dfSCaroline Tice             ret_value.AppendString (value.GetStringAtIndex(i));
787daccaa9eSCaroline Tice     }
788daccaa9eSCaroline Tice     else
789daccaa9eSCaroline Tice     {
790daccaa9eSCaroline Tice         ret_value.AppendString (err.AsCString());
791daccaa9eSCaroline Tice     }
792daccaa9eSCaroline Tice 
7933df9a8dfSCaroline Tice 
7943df9a8dfSCaroline Tice     return ret_value;
7953df9a8dfSCaroline Tice }
7963df9a8dfSCaroline Tice 
797a7015092SGreg Clayton uint32_t
798a7015092SGreg Clayton SBDebugger::GetTerminalWidth () const
799a7015092SGreg Clayton {
800a7015092SGreg Clayton     if (m_opaque_sp)
801a7015092SGreg Clayton         return m_opaque_sp->GetTerminalWidth ();
802a7015092SGreg Clayton     return 0;
803a7015092SGreg Clayton }
804a7015092SGreg Clayton 
805a7015092SGreg Clayton void
806a7015092SGreg Clayton SBDebugger::SetTerminalWidth (uint32_t term_width)
807a7015092SGreg Clayton {
808a7015092SGreg Clayton     if (m_opaque_sp)
809a7015092SGreg Clayton         m_opaque_sp->SetTerminalWidth (term_width);
810a7015092SGreg Clayton }
811a7015092SGreg Clayton 
812a7015092SGreg Clayton const char *
813a7015092SGreg Clayton SBDebugger::GetPrompt() const
814a7015092SGreg Clayton {
815431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
816ceb6b139SCaroline Tice 
817ceb6b139SCaroline Tice     if (log)
818cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::GetPrompt () => \"%s\"", m_opaque_sp.get(),
819750cd175SCaroline Tice                      (m_opaque_sp ? m_opaque_sp->GetPrompt() : ""));
820ceb6b139SCaroline Tice 
821a7015092SGreg Clayton     if (m_opaque_sp)
822a7015092SGreg Clayton         return m_opaque_sp->GetPrompt ();
823a7015092SGreg Clayton     return 0;
824a7015092SGreg Clayton }
825a7015092SGreg Clayton 
826a7015092SGreg Clayton void
827a7015092SGreg Clayton SBDebugger::SetPrompt (const char *prompt)
828a7015092SGreg Clayton {
829a7015092SGreg Clayton     if (m_opaque_sp)
830a7015092SGreg Clayton         m_opaque_sp->SetPrompt (prompt);
831a7015092SGreg Clayton }
832a7015092SGreg Clayton 
833a7015092SGreg Clayton 
834431ce678SGreg Clayton ScriptLanguage
835a7015092SGreg Clayton SBDebugger::GetScriptLanguage() const
836a7015092SGreg Clayton {
837a7015092SGreg Clayton     if (m_opaque_sp)
838a7015092SGreg Clayton         return m_opaque_sp->GetScriptLanguage ();
839a7015092SGreg Clayton     return eScriptLanguageNone;
840a7015092SGreg Clayton }
841a7015092SGreg Clayton 
842a7015092SGreg Clayton void
843431ce678SGreg Clayton SBDebugger::SetScriptLanguage (ScriptLanguage script_lang)
844a7015092SGreg Clayton {
845a7015092SGreg Clayton     if (m_opaque_sp)
846af67cecdSGreg Clayton     {
847a7015092SGreg Clayton         m_opaque_sp->SetScriptLanguage (script_lang);
848a7015092SGreg Clayton     }
849af67cecdSGreg Clayton }
850a7015092SGreg Clayton 
851e40e4218SJim Ingham bool
852e40e4218SJim Ingham SBDebugger::SetUseExternalEditor (bool value)
853e40e4218SJim Ingham {
854e40e4218SJim Ingham     if (m_opaque_sp)
855e40e4218SJim Ingham         return m_opaque_sp->SetUseExternalEditor (value);
856e40e4218SJim Ingham     return false;
857e40e4218SJim Ingham }
858e40e4218SJim Ingham 
859e40e4218SJim Ingham bool
860daccaa9eSCaroline Tice SBDebugger::GetUseExternalEditor ()
861e40e4218SJim Ingham {
862e40e4218SJim Ingham     if (m_opaque_sp)
863daccaa9eSCaroline Tice         return m_opaque_sp->GetUseExternalEditor ();
864e40e4218SJim Ingham     return false;
865e40e4218SJim Ingham }
866e40e4218SJim Ingham 
867dde9cff3SCaroline Tice bool
868dde9cff3SCaroline Tice SBDebugger::GetDescription (SBStream &description)
869dde9cff3SCaroline Tice {
870dde9cff3SCaroline Tice     if (m_opaque_sp)
871dde9cff3SCaroline Tice     {
872dde9cff3SCaroline Tice         const char *name = m_opaque_sp->GetInstanceName().AsCString();
873431ce678SGreg Clayton         user_id_t id = m_opaque_sp->GetID();
874cfd1acedSGreg Clayton         description.Printf ("Debugger (instance: \"%s\", id: %d)", name, id);
875dde9cff3SCaroline Tice     }
876dde9cff3SCaroline Tice     else
877dde9cff3SCaroline Tice         description.Printf ("No value");
878dde9cff3SCaroline Tice 
879dde9cff3SCaroline Tice     return true;
880dde9cff3SCaroline Tice }
881efed6131SCaroline Tice 
882431ce678SGreg Clayton user_id_t
883efed6131SCaroline Tice SBDebugger::GetID()
884efed6131SCaroline Tice {
885efed6131SCaroline Tice     if (m_opaque_sp)
886efed6131SCaroline Tice         return m_opaque_sp->GetID();
887efed6131SCaroline Tice     return LLDB_INVALID_UID;
888efed6131SCaroline Tice }
8892289fa48SGreg Clayton 
8902289fa48SGreg Clayton 
8912289fa48SGreg Clayton SBError
8922289fa48SGreg Clayton SBDebugger::SetCurrentPlatform (const char *platform_name)
8932289fa48SGreg Clayton {
8942289fa48SGreg Clayton     SBError sb_error;
8952289fa48SGreg Clayton     if (m_opaque_sp)
8962289fa48SGreg Clayton     {
8972289fa48SGreg Clayton         PlatformSP platform_sp (Platform::Create (platform_name, sb_error.ref()));
8982289fa48SGreg Clayton 
8992289fa48SGreg Clayton         if (platform_sp)
9002289fa48SGreg Clayton         {
9012289fa48SGreg Clayton             bool make_selected = true;
9022289fa48SGreg Clayton             m_opaque_sp->GetPlatformList().Append (platform_sp, make_selected);
9032289fa48SGreg Clayton         }
9042289fa48SGreg Clayton     }
9052289fa48SGreg Clayton     return sb_error;
9062289fa48SGreg Clayton }
9072289fa48SGreg Clayton 
908fc3f027dSGreg Clayton bool
909f3dd93c8SGreg Clayton SBDebugger::SetCurrentPlatformSDKRoot (const char *sysroot)
910f3dd93c8SGreg Clayton {
911f3dd93c8SGreg Clayton     if (m_opaque_sp)
912f3dd93c8SGreg Clayton     {
913f3dd93c8SGreg Clayton         PlatformSP platform_sp (m_opaque_sp->GetPlatformList().GetSelectedPlatform());
914f3dd93c8SGreg Clayton 
915f3dd93c8SGreg Clayton         if (platform_sp)
916f3dd93c8SGreg Clayton         {
917f3dd93c8SGreg Clayton             platform_sp->SetSDKRootDirectory (ConstString (sysroot));
918f3dd93c8SGreg Clayton             return true;
919f3dd93c8SGreg Clayton         }
920f3dd93c8SGreg Clayton     }
921f3dd93c8SGreg Clayton     return false;
922f3dd93c8SGreg Clayton }
923f3dd93c8SGreg Clayton 
924f3dd93c8SGreg Clayton bool
925fc3f027dSGreg Clayton SBDebugger::GetCloseInputOnEOF () const
926fc3f027dSGreg Clayton {
927fc3f027dSGreg Clayton     if (m_opaque_sp)
928fc3f027dSGreg Clayton         return m_opaque_sp->GetCloseInputOnEOF ();
929fc3f027dSGreg Clayton     return false;
930fc3f027dSGreg Clayton }
931fc3f027dSGreg Clayton 
932fc3f027dSGreg Clayton void
933fc3f027dSGreg Clayton SBDebugger::SetCloseInputOnEOF (bool b)
934fc3f027dSGreg Clayton {
935fc3f027dSGreg Clayton     if (m_opaque_sp)
936fc3f027dSGreg Clayton         m_opaque_sp->SetCloseInputOnEOF (b);
937fc3f027dSGreg Clayton }
938