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 {
7466243847SJim 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 
131*274fd6e9SEnrico Granata SBDebugger::SBDebugger(const lldb::DebuggerSP &debugger_sp) :
132*274fd6e9SEnrico Granata     m_opaque_sp(debugger_sp)
133*274fd6e9SEnrico Granata {
134*274fd6e9SEnrico Granata }
135*274fd6e9SEnrico Granata 
136efabb123SGreg Clayton SBDebugger::SBDebugger(const SBDebugger &rhs) :
137efabb123SGreg Clayton     m_opaque_sp (rhs.m_opaque_sp)
138efabb123SGreg Clayton {
139efabb123SGreg Clayton }
140efabb123SGreg Clayton 
141efabb123SGreg Clayton SBDebugger &
142efabb123SGreg Clayton SBDebugger::operator = (const SBDebugger &rhs)
143efabb123SGreg Clayton {
144efabb123SGreg Clayton     if (this != &rhs)
145efabb123SGreg Clayton     {
146efabb123SGreg Clayton         m_opaque_sp = rhs.m_opaque_sp;
147efabb123SGreg Clayton     }
148efabb123SGreg Clayton     return *this;
149efabb123SGreg Clayton }
150efabb123SGreg Clayton 
1516611103cSGreg Clayton SBDebugger::~SBDebugger ()
1526611103cSGreg Clayton {
1536611103cSGreg Clayton }
1546611103cSGreg Clayton 
1556611103cSGreg Clayton bool
1566611103cSGreg Clayton SBDebugger::IsValid() const
1576611103cSGreg Clayton {
1586611103cSGreg Clayton     return m_opaque_sp.get() != NULL;
1596611103cSGreg Clayton }
1606611103cSGreg Clayton 
1616611103cSGreg Clayton 
16230fdc8d8SChris Lattner void
16330fdc8d8SChris Lattner SBDebugger::SetAsync (bool b)
16430fdc8d8SChris Lattner {
1656611103cSGreg Clayton     if (m_opaque_sp)
1666611103cSGreg Clayton         m_opaque_sp->SetAsyncExecution(b);
16730fdc8d8SChris Lattner }
16830fdc8d8SChris Lattner 
1696eee5aa0SGreg Clayton void
1706eee5aa0SGreg Clayton SBDebugger::SkipLLDBInitFiles (bool b)
1716eee5aa0SGreg Clayton {
1726eee5aa0SGreg Clayton     if (m_opaque_sp)
1736eee5aa0SGreg Clayton         m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles (b);
1746eee5aa0SGreg Clayton }
1756eee5aa0SGreg Clayton 
17616e0c686SJim Ingham void
17716e0c686SJim Ingham SBDebugger::SkipAppInitFiles (bool b)
17816e0c686SJim Ingham {
17916e0c686SJim Ingham     if (m_opaque_sp)
18016e0c686SJim Ingham         m_opaque_sp->GetCommandInterpreter().SkipAppInitFiles (b);
18116e0c686SJim Ingham }
18216e0c686SJim Ingham 
18330fdc8d8SChris Lattner // Shouldn't really be settable after initialization as this could cause lots of problems; don't want users
18430fdc8d8SChris Lattner // trying to switch modes in the middle of a debugging session.
18530fdc8d8SChris Lattner void
18630fdc8d8SChris Lattner SBDebugger::SetInputFileHandle (FILE *fh, bool transfer_ownership)
18730fdc8d8SChris Lattner {
188431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
189ceb6b139SCaroline Tice 
190ceb6b139SCaroline Tice     if (log)
191cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::SetInputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
192cfd1acedSGreg Clayton                      fh, transfer_ownership);
193ceb6b139SCaroline Tice 
1946611103cSGreg Clayton     if (m_opaque_sp)
1956611103cSGreg Clayton         m_opaque_sp->SetInputFileHandle (fh, transfer_ownership);
19630fdc8d8SChris Lattner }
19730fdc8d8SChris Lattner 
19830fdc8d8SChris Lattner void
19930fdc8d8SChris Lattner SBDebugger::SetOutputFileHandle (FILE *fh, bool transfer_ownership)
20030fdc8d8SChris Lattner {
201431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
202ceb6b139SCaroline Tice 
203ceb6b139SCaroline Tice 
204ceb6b139SCaroline Tice     if (log)
205cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::SetOutputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
206cfd1acedSGreg Clayton                      fh, transfer_ownership);
207ceb6b139SCaroline Tice 
2086611103cSGreg Clayton     if (m_opaque_sp)
2096611103cSGreg Clayton         m_opaque_sp->SetOutputFileHandle (fh, transfer_ownership);
21030fdc8d8SChris Lattner }
21130fdc8d8SChris Lattner 
21230fdc8d8SChris Lattner void
21330fdc8d8SChris Lattner SBDebugger::SetErrorFileHandle (FILE *fh, bool transfer_ownership)
21430fdc8d8SChris Lattner {
215431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
216ceb6b139SCaroline Tice 
217ceb6b139SCaroline Tice 
218ceb6b139SCaroline Tice     if (log)
219cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::SetErrorFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
220cfd1acedSGreg Clayton                      fh, transfer_ownership);
221ceb6b139SCaroline Tice 
2226611103cSGreg Clayton     if (m_opaque_sp)
2236611103cSGreg Clayton         m_opaque_sp->SetErrorFileHandle (fh, transfer_ownership);
22430fdc8d8SChris Lattner }
22530fdc8d8SChris Lattner 
22630fdc8d8SChris Lattner FILE *
22730fdc8d8SChris Lattner SBDebugger::GetInputFileHandle ()
22830fdc8d8SChris Lattner {
2296611103cSGreg Clayton     if (m_opaque_sp)
23051b1e2d2SGreg Clayton         return m_opaque_sp->GetInputFile().GetStream();
2316611103cSGreg Clayton     return NULL;
23230fdc8d8SChris Lattner }
23330fdc8d8SChris Lattner 
23430fdc8d8SChris Lattner FILE *
23530fdc8d8SChris Lattner SBDebugger::GetOutputFileHandle ()
23630fdc8d8SChris Lattner {
2376611103cSGreg Clayton     if (m_opaque_sp)
23851b1e2d2SGreg Clayton         return m_opaque_sp->GetOutputFile().GetStream();
2396611103cSGreg Clayton     return NULL;
24030fdc8d8SChris Lattner }
24130fdc8d8SChris Lattner 
24230fdc8d8SChris Lattner FILE *
24330fdc8d8SChris Lattner SBDebugger::GetErrorFileHandle ()
24430fdc8d8SChris Lattner {
2456611103cSGreg Clayton     if (m_opaque_sp)
24651b1e2d2SGreg Clayton         return m_opaque_sp->GetErrorFile().GetStream();
2476611103cSGreg Clayton     return NULL;
24830fdc8d8SChris Lattner }
24930fdc8d8SChris Lattner 
25030fdc8d8SChris Lattner SBCommandInterpreter
25130fdc8d8SChris Lattner SBDebugger::GetCommandInterpreter ()
25230fdc8d8SChris Lattner {
253431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
254ceb6b139SCaroline Tice 
2556611103cSGreg Clayton     SBCommandInterpreter sb_interpreter;
2566611103cSGreg Clayton     if (m_opaque_sp)
2576611103cSGreg Clayton         sb_interpreter.reset (&m_opaque_sp->GetCommandInterpreter());
258ceb6b139SCaroline Tice 
259750cd175SCaroline Tice     if (log)
26093aa84e8SGreg Clayton         log->Printf ("SBDebugger(%p)::GetCommandInterpreter () => SBCommandInterpreter(%p)",
261750cd175SCaroline Tice                      m_opaque_sp.get(), sb_interpreter.get());
262750cd175SCaroline Tice 
26330fdc8d8SChris Lattner     return sb_interpreter;
26430fdc8d8SChris Lattner }
26530fdc8d8SChris Lattner 
26630fdc8d8SChris Lattner void
26730fdc8d8SChris Lattner SBDebugger::HandleCommand (const char *command)
26830fdc8d8SChris Lattner {
2696611103cSGreg Clayton     if (m_opaque_sp)
2706611103cSGreg Clayton     {
271af67cecdSGreg Clayton         TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
272af67cecdSGreg Clayton         Mutex::Locker api_locker;
273af67cecdSGreg Clayton         if (target_sp)
274af67cecdSGreg Clayton             api_locker.Reset(target_sp->GetAPIMutex().GetMutex());
275af67cecdSGreg Clayton 
2766611103cSGreg Clayton         SBCommandInterpreter sb_interpreter(GetCommandInterpreter ());
27730fdc8d8SChris Lattner         SBCommandReturnObject result;
27830fdc8d8SChris Lattner 
27930fdc8d8SChris Lattner         sb_interpreter.HandleCommand (command, result, false);
28030fdc8d8SChris Lattner 
28130fdc8d8SChris Lattner         if (GetErrorFileHandle() != NULL)
28230fdc8d8SChris Lattner             result.PutError (GetErrorFileHandle());
28330fdc8d8SChris Lattner         if (GetOutputFileHandle() != NULL)
28430fdc8d8SChris Lattner             result.PutOutput (GetOutputFileHandle());
28530fdc8d8SChris Lattner 
2866611103cSGreg Clayton         if (m_opaque_sp->GetAsyncExecution() == false)
28730fdc8d8SChris Lattner         {
2886611103cSGreg Clayton             SBProcess process(GetCommandInterpreter().GetProcess ());
28930fdc8d8SChris Lattner             if (process.IsValid())
29030fdc8d8SChris Lattner             {
29130fdc8d8SChris Lattner                 EventSP event_sp;
2926611103cSGreg Clayton                 Listener &lldb_listener = m_opaque_sp->GetListener();
29330fdc8d8SChris Lattner                 while (lldb_listener.GetNextEventForBroadcaster (process.get(), event_sp))
29430fdc8d8SChris Lattner                 {
29530fdc8d8SChris Lattner                     SBEvent event(event_sp);
29630fdc8d8SChris Lattner                     HandleProcessEvent (process, event, GetOutputFileHandle(), GetErrorFileHandle());
29730fdc8d8SChris Lattner                 }
29830fdc8d8SChris Lattner             }
29930fdc8d8SChris Lattner         }
30030fdc8d8SChris Lattner     }
3016611103cSGreg Clayton }
30230fdc8d8SChris Lattner 
30330fdc8d8SChris Lattner SBListener
30430fdc8d8SChris Lattner SBDebugger::GetListener ()
30530fdc8d8SChris Lattner {
306431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
307ceb6b139SCaroline Tice 
3086611103cSGreg Clayton     SBListener sb_listener;
3096611103cSGreg Clayton     if (m_opaque_sp)
3106611103cSGreg Clayton         sb_listener.reset(&m_opaque_sp->GetListener(), false);
311ceb6b139SCaroline Tice 
312750cd175SCaroline Tice     if (log)
31393aa84e8SGreg Clayton         log->Printf ("SBDebugger(%p)::GetListener () => SBListener(%p)", m_opaque_sp.get(),
314750cd175SCaroline Tice                      sb_listener.get());
315750cd175SCaroline Tice 
31630fdc8d8SChris Lattner     return sb_listener;
31730fdc8d8SChris Lattner }
31830fdc8d8SChris Lattner 
31930fdc8d8SChris Lattner void
32030fdc8d8SChris Lattner SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, FILE *out, FILE *err)
32130fdc8d8SChris Lattner {
322af67cecdSGreg Clayton     if (!process.IsValid())
323af67cecdSGreg Clayton         return;
324af67cecdSGreg Clayton 
32530fdc8d8SChris Lattner     const uint32_t event_type = event.GetType();
32630fdc8d8SChris Lattner     char stdio_buffer[1024];
32730fdc8d8SChris Lattner     size_t len;
32830fdc8d8SChris Lattner 
329af67cecdSGreg Clayton     Mutex::Locker api_locker (process.GetTarget()->GetAPIMutex());
330af67cecdSGreg Clayton 
331af67cecdSGreg Clayton     if (event_type & (Process::eBroadcastBitSTDOUT | Process::eBroadcastBitStateChanged))
33230fdc8d8SChris Lattner     {
333af67cecdSGreg Clayton         // Drain stdout when we stop just in case we have any bytes
33430fdc8d8SChris Lattner         while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
33530fdc8d8SChris Lattner             if (out != NULL)
33630fdc8d8SChris Lattner                 ::fwrite (stdio_buffer, 1, len, out);
33730fdc8d8SChris Lattner     }
338af67cecdSGreg Clayton 
339af67cecdSGreg Clayton     if (event_type & (Process::eBroadcastBitSTDERR | Process::eBroadcastBitStateChanged))
34030fdc8d8SChris Lattner     {
341af67cecdSGreg Clayton         // Drain stderr when we stop just in case we have any bytes
34230fdc8d8SChris Lattner         while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
343af67cecdSGreg Clayton             if (err != NULL)
344af67cecdSGreg Clayton                 ::fwrite (stdio_buffer, 1, len, err);
34530fdc8d8SChris Lattner     }
346af67cecdSGreg Clayton 
347af67cecdSGreg Clayton     if (event_type & Process::eBroadcastBitStateChanged)
34830fdc8d8SChris Lattner     {
34930fdc8d8SChris Lattner         StateType event_state = SBProcess::GetStateFromEvent (event);
35030fdc8d8SChris Lattner 
35130fdc8d8SChris Lattner         if (event_state == eStateInvalid)
35230fdc8d8SChris Lattner             return;
35330fdc8d8SChris Lattner 
35430fdc8d8SChris Lattner         bool is_stopped = StateIsStoppedState (event_state);
35530fdc8d8SChris Lattner         if (!is_stopped)
3562976d00aSJim Ingham             process.ReportEventState (event, out);
35730fdc8d8SChris Lattner     }
35830fdc8d8SChris Lattner }
35930fdc8d8SChris Lattner 
36030fdc8d8SChris Lattner SBSourceManager &
36130fdc8d8SChris Lattner SBDebugger::GetSourceManager ()
36230fdc8d8SChris Lattner {
36330fdc8d8SChris Lattner     static SourceManager g_lldb_source_manager;
364efabb123SGreg Clayton     static SBSourceManager g_sb_source_manager (&g_lldb_source_manager);
36530fdc8d8SChris Lattner     return g_sb_source_manager;
36630fdc8d8SChris Lattner }
36730fdc8d8SChris Lattner 
36830fdc8d8SChris Lattner 
36930fdc8d8SChris Lattner bool
37030fdc8d8SChris Lattner SBDebugger::GetDefaultArchitecture (char *arch_name, size_t arch_name_len)
37130fdc8d8SChris Lattner {
37230fdc8d8SChris Lattner     if (arch_name && arch_name_len)
37330fdc8d8SChris Lattner     {
374431ce678SGreg Clayton         ArchSpec default_arch = Target::GetDefaultArchitecture ();
375daccaa9eSCaroline Tice 
37630fdc8d8SChris Lattner         if (default_arch.IsValid())
37730fdc8d8SChris Lattner         {
378431ce678SGreg Clayton             const std::string &triple_str = default_arch.GetTriple().str();
379431ce678SGreg Clayton             if (!triple_str.empty())
380431ce678SGreg Clayton                 ::snprintf (arch_name, arch_name_len, "%s", triple_str.c_str());
381431ce678SGreg Clayton             else
38264195a2cSGreg Clayton                 ::snprintf (arch_name, arch_name_len, "%s", default_arch.GetArchitectureName());
38330fdc8d8SChris Lattner             return true;
38430fdc8d8SChris Lattner         }
38530fdc8d8SChris Lattner     }
38630fdc8d8SChris Lattner     if (arch_name && arch_name_len)
38730fdc8d8SChris Lattner         arch_name[0] = '\0';
38830fdc8d8SChris Lattner     return false;
38930fdc8d8SChris Lattner }
39030fdc8d8SChris Lattner 
39130fdc8d8SChris Lattner 
39230fdc8d8SChris Lattner bool
39330fdc8d8SChris Lattner SBDebugger::SetDefaultArchitecture (const char *arch_name)
39430fdc8d8SChris Lattner {
39530fdc8d8SChris Lattner     if (arch_name)
39630fdc8d8SChris Lattner     {
397eb0103f2SGreg Clayton         ArchSpec arch (arch_name, NULL);
39830fdc8d8SChris Lattner         if (arch.IsValid())
39930fdc8d8SChris Lattner         {
400431ce678SGreg Clayton             Target::SetDefaultArchitecture (arch);
40130fdc8d8SChris Lattner             return true;
40230fdc8d8SChris Lattner         }
40330fdc8d8SChris Lattner     }
40430fdc8d8SChris Lattner     return false;
40530fdc8d8SChris Lattner }
40630fdc8d8SChris Lattner 
40730fdc8d8SChris Lattner ScriptLanguage
40830fdc8d8SChris Lattner SBDebugger::GetScriptingLanguage (const char *script_language_name)
40930fdc8d8SChris Lattner {
410af67cecdSGreg Clayton 
41130fdc8d8SChris Lattner     return Args::StringToScriptLanguage (script_language_name,
41230fdc8d8SChris Lattner                                          eScriptLanguageDefault,
41330fdc8d8SChris Lattner                                          NULL);
41430fdc8d8SChris Lattner }
41530fdc8d8SChris Lattner 
41630fdc8d8SChris Lattner const char *
41730fdc8d8SChris Lattner SBDebugger::GetVersionString ()
41830fdc8d8SChris Lattner {
419431ce678SGreg Clayton     return GetVersion();
42030fdc8d8SChris Lattner }
42130fdc8d8SChris Lattner 
42230fdc8d8SChris Lattner const char *
423431ce678SGreg Clayton SBDebugger::StateAsCString (StateType state)
42430fdc8d8SChris Lattner {
425c2bbb49aSCaroline Tice     return lldb_private::StateAsCString (state);
42630fdc8d8SChris Lattner }
42730fdc8d8SChris Lattner 
42830fdc8d8SChris Lattner bool
429431ce678SGreg Clayton SBDebugger::StateIsRunningState (StateType state)
43030fdc8d8SChris Lattner {
431431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4324838131bSGreg Clayton 
433c2bbb49aSCaroline Tice     const bool result = lldb_private::StateIsRunningState (state);
4344838131bSGreg Clayton     if (log)
4354838131bSGreg Clayton         log->Printf ("SBDebugger::StateIsRunningState (state=%s) => %i",
436431ce678SGreg Clayton                      StateAsCString (state), result);
4374838131bSGreg Clayton 
4384838131bSGreg Clayton     return result;
43930fdc8d8SChris Lattner }
44030fdc8d8SChris Lattner 
44130fdc8d8SChris Lattner bool
442431ce678SGreg Clayton SBDebugger::StateIsStoppedState (StateType state)
44330fdc8d8SChris Lattner {
444431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
445ceb6b139SCaroline Tice 
446c2bbb49aSCaroline Tice     const bool result = lldb_private::StateIsStoppedState (state);
447ceb6b139SCaroline Tice     if (log)
4484838131bSGreg Clayton         log->Printf ("SBDebugger::StateIsStoppedState (state=%s) => %i",
449431ce678SGreg Clayton                      StateAsCString (state), result);
450ceb6b139SCaroline Tice 
4514838131bSGreg Clayton     return result;
45230fdc8d8SChris Lattner }
45330fdc8d8SChris Lattner 
45430fdc8d8SChris Lattner 
45530fdc8d8SChris Lattner SBTarget
45630fdc8d8SChris Lattner SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename,
45730fdc8d8SChris Lattner                                                  const char *target_triple)
45830fdc8d8SChris Lattner {
4596611103cSGreg Clayton     SBTarget target;
4606611103cSGreg Clayton     if (m_opaque_sp)
4616611103cSGreg Clayton     {
46230fdc8d8SChris Lattner         ArchSpec arch;
463274060b6SGreg Clayton         FileSpec file_spec (filename, true);
464eb0103f2SGreg Clayton         arch.SetTriple (target_triple, m_opaque_sp->GetPlatformList().GetSelectedPlatform().get());
46530fdc8d8SChris Lattner         TargetSP target_sp;
466e996fd30SGreg Clayton         Error error (m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file_spec, arch, true, target_sp));
4676611103cSGreg Clayton         target.reset (target_sp);
4686611103cSGreg Clayton     }
4694838131bSGreg Clayton 
470431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4714838131bSGreg Clayton     if (log)
4724838131bSGreg Clayton     {
473cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndTargetTriple (filename=\"%s\", triple=%s) => SBTarget(%p)",
4744838131bSGreg Clayton                      m_opaque_sp.get(), filename, target_triple, target.get());
4754838131bSGreg Clayton     }
4764838131bSGreg Clayton 
47730fdc8d8SChris Lattner     return target;
47830fdc8d8SChris Lattner }
47930fdc8d8SChris Lattner 
48030fdc8d8SChris Lattner SBTarget
48164195a2cSGreg Clayton SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *arch_cstr)
48230fdc8d8SChris Lattner {
483431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
484ceb6b139SCaroline Tice 
4856611103cSGreg Clayton     SBTarget target;
4866611103cSGreg Clayton     if (m_opaque_sp)
4876611103cSGreg Clayton     {
488274060b6SGreg Clayton         FileSpec file (filename, true);
48964195a2cSGreg Clayton         ArchSpec arch;
49030fdc8d8SChris Lattner         TargetSP target_sp;
49130fdc8d8SChris Lattner         Error error;
49230fdc8d8SChris Lattner 
49364195a2cSGreg Clayton         if (arch_cstr)
494eb0103f2SGreg Clayton             arch.SetTriple (arch_cstr, m_opaque_sp->GetPlatformList().GetSelectedPlatform().get());
49564195a2cSGreg Clayton 
496e996fd30SGreg Clayton         error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, true, target_sp);
49730fdc8d8SChris Lattner 
49830fdc8d8SChris Lattner         if (error.Success())
4996611103cSGreg Clayton         {
5002976d00aSJim Ingham             m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
5016611103cSGreg Clayton             target.reset(target_sp);
5026611103cSGreg Clayton         }
5036611103cSGreg Clayton     }
504ceb6b139SCaroline Tice 
505ceb6b139SCaroline Tice     if (log)
506ceb6b139SCaroline Tice     {
507cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndArch (filename=\"%s\", arch=%s) => SBTarget(%p)",
50864195a2cSGreg Clayton                      m_opaque_sp.get(), filename, arch_cstr, target.get());
509ceb6b139SCaroline Tice     }
510ceb6b139SCaroline Tice 
5116611103cSGreg Clayton     return target;
51230fdc8d8SChris Lattner }
51330fdc8d8SChris Lattner 
51430fdc8d8SChris Lattner SBTarget
51530fdc8d8SChris Lattner SBDebugger::CreateTarget (const char *filename)
51630fdc8d8SChris Lattner {
5176611103cSGreg Clayton     SBTarget target;
5186611103cSGreg Clayton     if (m_opaque_sp)
5196611103cSGreg Clayton     {
520274060b6SGreg Clayton         FileSpec file (filename, true);
521431ce678SGreg Clayton         ArchSpec arch = Target::GetDefaultArchitecture ();
52230fdc8d8SChris Lattner         TargetSP target_sp;
52330fdc8d8SChris Lattner         Error error;
52430fdc8d8SChris Lattner 
525e996fd30SGreg Clayton         error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, true, target_sp);
52630fdc8d8SChris Lattner 
5276611103cSGreg Clayton         if (error.Success())
5286611103cSGreg Clayton         {
5292976d00aSJim Ingham             m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
5306611103cSGreg Clayton             target.reset (target_sp);
5316611103cSGreg Clayton         }
5326611103cSGreg Clayton     }
533431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5344838131bSGreg Clayton     if (log)
5354838131bSGreg Clayton     {
536cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)",
5374838131bSGreg Clayton                      m_opaque_sp.get(), filename, target.get());
5384838131bSGreg Clayton     }
5396611103cSGreg Clayton     return target;
54030fdc8d8SChris Lattner }
54130fdc8d8SChris Lattner 
5423794ad95SJohnny Chen bool
5433794ad95SJohnny Chen SBDebugger::DeleteTarget (lldb::SBTarget &target)
5443794ad95SJohnny Chen {
5453794ad95SJohnny Chen     bool result = false;
5463794ad95SJohnny Chen     if (m_opaque_sp)
5473794ad95SJohnny Chen     {
5483794ad95SJohnny Chen         // No need to lock, the target list is thread safe
5493794ad95SJohnny Chen         result = m_opaque_sp->GetTargetList().DeleteTarget (target.m_opaque_sp);
5503794ad95SJohnny Chen     }
5513794ad95SJohnny Chen 
5523794ad95SJohnny Chen     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5533794ad95SJohnny Chen     if (log)
5543794ad95SJohnny Chen     {
5553794ad95SJohnny Chen         log->Printf ("SBDebugger(%p)::DeleteTarget (SBTarget(%p)) => %i", m_opaque_sp.get(), target.m_opaque_sp.get(), result);
5563794ad95SJohnny Chen     }
5573794ad95SJohnny Chen 
5583794ad95SJohnny Chen     return result;
5593794ad95SJohnny Chen }
56030fdc8d8SChris Lattner SBTarget
56130fdc8d8SChris Lattner SBDebugger::GetTargetAtIndex (uint32_t idx)
56230fdc8d8SChris Lattner {
5636611103cSGreg Clayton     SBTarget sb_target;
5646611103cSGreg Clayton     if (m_opaque_sp)
565af67cecdSGreg Clayton     {
566af67cecdSGreg Clayton         // No need to lock, the target list is thread safe
5676611103cSGreg Clayton         sb_target.reset(m_opaque_sp->GetTargetList().GetTargetAtIndex (idx));
568af67cecdSGreg Clayton     }
56930fdc8d8SChris Lattner     return sb_target;
57030fdc8d8SChris Lattner }
57130fdc8d8SChris Lattner 
57230fdc8d8SChris Lattner SBTarget
57330fdc8d8SChris Lattner SBDebugger::FindTargetWithProcessID (pid_t pid)
57430fdc8d8SChris Lattner {
5756611103cSGreg Clayton     SBTarget sb_target;
5766611103cSGreg Clayton     if (m_opaque_sp)
577af67cecdSGreg Clayton     {
578af67cecdSGreg Clayton         // No need to lock, the target list is thread safe
5796611103cSGreg Clayton         sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid));
580af67cecdSGreg Clayton     }
58130fdc8d8SChris Lattner     return sb_target;
58230fdc8d8SChris Lattner }
58330fdc8d8SChris Lattner 
58430fdc8d8SChris Lattner SBTarget
58530fdc8d8SChris Lattner SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name)
58630fdc8d8SChris Lattner {
5876611103cSGreg Clayton     SBTarget sb_target;
5886611103cSGreg Clayton     if (m_opaque_sp && filename && filename[0])
5896611103cSGreg Clayton     {
590af67cecdSGreg Clayton         // No need to lock, the target list is thread safe
591eb0103f2SGreg Clayton         ArchSpec arch (arch_name, m_opaque_sp->GetPlatformList().GetSelectedPlatform().get());
592274060b6SGreg Clayton         TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename, false), arch_name ? &arch : NULL));
5936611103cSGreg Clayton         sb_target.reset(target_sp);
5946611103cSGreg Clayton     }
5956611103cSGreg Clayton     return sb_target;
59630fdc8d8SChris Lattner }
59730fdc8d8SChris Lattner 
59830fdc8d8SChris Lattner SBTarget
599431ce678SGreg Clayton SBDebugger::FindTargetWithLLDBProcess (const ProcessSP &process_sp)
60030fdc8d8SChris Lattner {
6016611103cSGreg Clayton     SBTarget sb_target;
6026611103cSGreg Clayton     if (m_opaque_sp)
603af67cecdSGreg Clayton     {
604af67cecdSGreg Clayton         // No need to lock, the target list is thread safe
6056611103cSGreg Clayton         sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get()));
606af67cecdSGreg Clayton     }
60730fdc8d8SChris Lattner     return sb_target;
60830fdc8d8SChris Lattner }
60930fdc8d8SChris Lattner 
61030fdc8d8SChris Lattner 
61130fdc8d8SChris Lattner uint32_t
61230fdc8d8SChris Lattner SBDebugger::GetNumTargets ()
61330fdc8d8SChris Lattner {
6146611103cSGreg Clayton     if (m_opaque_sp)
615af67cecdSGreg Clayton     {
616af67cecdSGreg Clayton         // No need to lock, the target list is thread safe
6176611103cSGreg Clayton         return m_opaque_sp->GetTargetList().GetNumTargets ();
618af67cecdSGreg Clayton     }
6196611103cSGreg Clayton     return 0;
6206611103cSGreg Clayton }
62130fdc8d8SChris Lattner 
62230fdc8d8SChris Lattner SBTarget
6232976d00aSJim Ingham SBDebugger::GetSelectedTarget ()
62430fdc8d8SChris Lattner {
625431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
626ceb6b139SCaroline Tice 
6276611103cSGreg Clayton     SBTarget sb_target;
6286611103cSGreg Clayton     if (m_opaque_sp)
629af67cecdSGreg Clayton     {
630af67cecdSGreg Clayton         // No need to lock, the target list is thread safe
6312976d00aSJim Ingham         sb_target.reset(m_opaque_sp->GetTargetList().GetSelectedTarget ());
632af67cecdSGreg Clayton     }
633ceb6b139SCaroline Tice 
634ceb6b139SCaroline Tice     if (log)
635ceb6b139SCaroline Tice     {
636ceb6b139SCaroline Tice         SBStream sstr;
637431ce678SGreg Clayton         sb_target.GetDescription (sstr, eDescriptionLevelBrief);
63893aa84e8SGreg Clayton         log->Printf ("SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s", m_opaque_sp.get(),
639750cd175SCaroline Tice                      sb_target.get(), sstr.GetData());
640ceb6b139SCaroline Tice     }
641ceb6b139SCaroline Tice 
64230fdc8d8SChris Lattner     return sb_target;
64330fdc8d8SChris Lattner }
64430fdc8d8SChris Lattner 
64530fdc8d8SChris Lattner void
64630fdc8d8SChris Lattner SBDebugger::DispatchInput (void *baton, const void *data, size_t data_len)
64730fdc8d8SChris Lattner {
648431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
649ceb6b139SCaroline Tice 
650ceb6b139SCaroline Tice     if (log)
651cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::DispatchInput (baton=%p, data=\"%.*s\", size_t=%zu)", m_opaque_sp.get(),
652cfd1acedSGreg Clayton                      baton, (int) data_len, (const char *) data, data_len);
653ceb6b139SCaroline Tice 
6546611103cSGreg Clayton     if (m_opaque_sp)
6556611103cSGreg Clayton         m_opaque_sp->DispatchInput ((const char *) data, data_len);
65630fdc8d8SChris Lattner }
65730fdc8d8SChris Lattner 
65830fdc8d8SChris Lattner void
659efed6131SCaroline Tice SBDebugger::DispatchInputInterrupt ()
660efed6131SCaroline Tice {
661efed6131SCaroline Tice     if (m_opaque_sp)
662efed6131SCaroline Tice         m_opaque_sp->DispatchInputInterrupt ();
663efed6131SCaroline Tice }
664efed6131SCaroline Tice 
665efed6131SCaroline Tice void
666efed6131SCaroline Tice SBDebugger::DispatchInputEndOfFile ()
667efed6131SCaroline Tice {
668efed6131SCaroline Tice     if (m_opaque_sp)
669efed6131SCaroline Tice         m_opaque_sp->DispatchInputEndOfFile ();
670efed6131SCaroline Tice }
6719088b068SCaroline Tice 
6729088b068SCaroline Tice bool
6739088b068SCaroline Tice SBDebugger::InputReaderIsTopReader (const lldb::SBInputReader &reader)
6749088b068SCaroline Tice {
6759088b068SCaroline Tice     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
6769088b068SCaroline Tice 
6779088b068SCaroline Tice     if (log)
6789088b068SCaroline Tice         log->Printf ("SBDebugger(%p)::InputReaderIsTopReader (SBInputReader(%p))", m_opaque_sp.get(), &reader);
6799088b068SCaroline Tice 
6809088b068SCaroline Tice     if (m_opaque_sp && reader.IsValid())
6819088b068SCaroline Tice     {
6829088b068SCaroline Tice         InputReaderSP reader_sp (*reader);
6839088b068SCaroline Tice         return m_opaque_sp->InputReaderIsTopReader (reader_sp);
6849088b068SCaroline Tice     }
6859088b068SCaroline Tice 
6869088b068SCaroline Tice     return false;
6879088b068SCaroline Tice }
6889088b068SCaroline Tice 
689efed6131SCaroline Tice 
690efed6131SCaroline Tice void
69130fdc8d8SChris Lattner SBDebugger::PushInputReader (SBInputReader &reader)
69230fdc8d8SChris Lattner {
693431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
694ceb6b139SCaroline Tice 
695ceb6b139SCaroline Tice     if (log)
69693aa84e8SGreg Clayton         log->Printf ("SBDebugger(%p)::PushInputReader (SBInputReader(%p))", m_opaque_sp.get(), &reader);
697ceb6b139SCaroline Tice 
6986611103cSGreg Clayton     if (m_opaque_sp && reader.IsValid())
69930fdc8d8SChris Lattner     {
700af67cecdSGreg Clayton         TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
701af67cecdSGreg Clayton         Mutex::Locker api_locker;
702af67cecdSGreg Clayton         if (target_sp)
703af67cecdSGreg Clayton             api_locker.Reset(target_sp->GetAPIMutex().GetMutex());
70430fdc8d8SChris Lattner         InputReaderSP reader_sp(*reader);
7056611103cSGreg Clayton         m_opaque_sp->PushInputReader (reader_sp);
70630fdc8d8SChris Lattner     }
70730fdc8d8SChris Lattner }
7086611103cSGreg Clayton 
7096611103cSGreg Clayton void
710969ed3d1SCaroline Tice SBDebugger::NotifyTopInputReader (InputReaderAction notification)
711969ed3d1SCaroline Tice {
712969ed3d1SCaroline Tice     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
713969ed3d1SCaroline Tice 
714969ed3d1SCaroline Tice     if (log)
715969ed3d1SCaroline Tice         log->Printf ("SBDebugger(%p)::NotifyTopInputReader (%d)", m_opaque_sp.get(), notification);
716969ed3d1SCaroline Tice 
717969ed3d1SCaroline Tice     if (m_opaque_sp)
718969ed3d1SCaroline Tice         m_opaque_sp->NotifyTopInputReader (notification);
719969ed3d1SCaroline Tice }
720969ed3d1SCaroline Tice 
721969ed3d1SCaroline Tice void
722431ce678SGreg Clayton SBDebugger::reset (const DebuggerSP &debugger_sp)
7236611103cSGreg Clayton {
7246611103cSGreg Clayton     m_opaque_sp = debugger_sp;
7256611103cSGreg Clayton }
7266611103cSGreg Clayton 
7276611103cSGreg Clayton Debugger *
7286611103cSGreg Clayton SBDebugger::get () const
7296611103cSGreg Clayton {
7306611103cSGreg Clayton     return m_opaque_sp.get();
7316611103cSGreg Clayton }
7326611103cSGreg Clayton 
7336611103cSGreg Clayton Debugger &
7346611103cSGreg Clayton SBDebugger::ref () const
7356611103cSGreg Clayton {
7366611103cSGreg Clayton     assert (m_opaque_sp.get());
7376611103cSGreg Clayton     return *m_opaque_sp;
7386611103cSGreg Clayton }
7396611103cSGreg Clayton 
7406611103cSGreg Clayton 
741ebc1bb27SCaroline Tice SBDebugger
742ebc1bb27SCaroline Tice SBDebugger::FindDebuggerWithID (int id)
743ebc1bb27SCaroline Tice {
744af67cecdSGreg Clayton     // No need to lock, the debugger list is thread safe
745ebc1bb27SCaroline Tice     SBDebugger sb_debugger;
746431ce678SGreg Clayton     DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id);
747ebc1bb27SCaroline Tice     if (debugger_sp)
748ebc1bb27SCaroline Tice         sb_debugger.reset (debugger_sp);
749ebc1bb27SCaroline Tice     return sb_debugger;
750ebc1bb27SCaroline Tice }
751e40e4218SJim Ingham 
752dd759857SCaroline Tice const char *
753dd759857SCaroline Tice SBDebugger::GetInstanceName()
754dd759857SCaroline Tice {
755dd759857SCaroline Tice     if (m_opaque_sp)
756dd759857SCaroline Tice         return m_opaque_sp->GetInstanceName().AsCString();
757dd759857SCaroline Tice     else
758dd759857SCaroline Tice         return NULL;
759dd759857SCaroline Tice }
760dd759857SCaroline Tice 
7613df9a8dfSCaroline Tice SBError
762dd759857SCaroline Tice SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name)
7633df9a8dfSCaroline Tice {
764431ce678SGreg Clayton     UserSettingsControllerSP root_settings_controller = Debugger::GetSettingsController();
7653df9a8dfSCaroline Tice 
766e0d378b3SGreg Clayton     Error err = root_settings_controller->SetVariable (var_name,
767e0d378b3SGreg Clayton                                                        value,
768e0d378b3SGreg Clayton                                                        eVarSetOperationAssign,
769e0d378b3SGreg Clayton                                                        true,
770101c7c20SCaroline Tice                                                        debugger_instance_name);
7713df9a8dfSCaroline Tice     SBError sb_error;
7723df9a8dfSCaroline Tice     sb_error.SetError (err);
7733df9a8dfSCaroline Tice 
7743df9a8dfSCaroline Tice     return sb_error;
7753df9a8dfSCaroline Tice }
7763df9a8dfSCaroline Tice 
777431ce678SGreg Clayton SBStringList
778dd759857SCaroline Tice SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name)
7793df9a8dfSCaroline Tice {
7803df9a8dfSCaroline Tice     SBStringList ret_value;
781e0d378b3SGreg Clayton     SettableVariableType var_type;
782431ce678SGreg Clayton     Error err;
783101c7c20SCaroline Tice 
784431ce678SGreg Clayton     UserSettingsControllerSP root_settings_controller = Debugger::GetSettingsController();
7853df9a8dfSCaroline Tice 
786daccaa9eSCaroline Tice     StringList value = root_settings_controller->GetVariable (var_name, var_type, debugger_instance_name, err);
787daccaa9eSCaroline Tice 
788daccaa9eSCaroline Tice     if (err.Success())
789daccaa9eSCaroline Tice     {
790311adf3dSChris Lattner         for (unsigned i = 0; i != value.GetSize(); ++i)
7913df9a8dfSCaroline Tice             ret_value.AppendString (value.GetStringAtIndex(i));
792daccaa9eSCaroline Tice     }
793daccaa9eSCaroline Tice     else
794daccaa9eSCaroline Tice     {
795daccaa9eSCaroline Tice         ret_value.AppendString (err.AsCString());
796daccaa9eSCaroline Tice     }
797daccaa9eSCaroline Tice 
7983df9a8dfSCaroline Tice 
7993df9a8dfSCaroline Tice     return ret_value;
8003df9a8dfSCaroline Tice }
8013df9a8dfSCaroline Tice 
802a7015092SGreg Clayton uint32_t
803a7015092SGreg Clayton SBDebugger::GetTerminalWidth () const
804a7015092SGreg Clayton {
805a7015092SGreg Clayton     if (m_opaque_sp)
806a7015092SGreg Clayton         return m_opaque_sp->GetTerminalWidth ();
807a7015092SGreg Clayton     return 0;
808a7015092SGreg Clayton }
809a7015092SGreg Clayton 
810a7015092SGreg Clayton void
811a7015092SGreg Clayton SBDebugger::SetTerminalWidth (uint32_t term_width)
812a7015092SGreg Clayton {
813a7015092SGreg Clayton     if (m_opaque_sp)
814a7015092SGreg Clayton         m_opaque_sp->SetTerminalWidth (term_width);
815a7015092SGreg Clayton }
816a7015092SGreg Clayton 
817a7015092SGreg Clayton const char *
818a7015092SGreg Clayton SBDebugger::GetPrompt() const
819a7015092SGreg Clayton {
820431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
821ceb6b139SCaroline Tice 
822ceb6b139SCaroline Tice     if (log)
823cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::GetPrompt () => \"%s\"", m_opaque_sp.get(),
824750cd175SCaroline Tice                      (m_opaque_sp ? m_opaque_sp->GetPrompt() : ""));
825ceb6b139SCaroline Tice 
826a7015092SGreg Clayton     if (m_opaque_sp)
827a7015092SGreg Clayton         return m_opaque_sp->GetPrompt ();
828a7015092SGreg Clayton     return 0;
829a7015092SGreg Clayton }
830a7015092SGreg Clayton 
831a7015092SGreg Clayton void
832a7015092SGreg Clayton SBDebugger::SetPrompt (const char *prompt)
833a7015092SGreg Clayton {
834a7015092SGreg Clayton     if (m_opaque_sp)
835a7015092SGreg Clayton         m_opaque_sp->SetPrompt (prompt);
836a7015092SGreg Clayton }
837a7015092SGreg Clayton 
838a7015092SGreg Clayton 
839431ce678SGreg Clayton ScriptLanguage
840a7015092SGreg Clayton SBDebugger::GetScriptLanguage() const
841a7015092SGreg Clayton {
842a7015092SGreg Clayton     if (m_opaque_sp)
843a7015092SGreg Clayton         return m_opaque_sp->GetScriptLanguage ();
844a7015092SGreg Clayton     return eScriptLanguageNone;
845a7015092SGreg Clayton }
846a7015092SGreg Clayton 
847a7015092SGreg Clayton void
848431ce678SGreg Clayton SBDebugger::SetScriptLanguage (ScriptLanguage script_lang)
849a7015092SGreg Clayton {
850a7015092SGreg Clayton     if (m_opaque_sp)
851af67cecdSGreg Clayton     {
852a7015092SGreg Clayton         m_opaque_sp->SetScriptLanguage (script_lang);
853a7015092SGreg Clayton     }
854af67cecdSGreg Clayton }
855a7015092SGreg Clayton 
856e40e4218SJim Ingham bool
857e40e4218SJim Ingham SBDebugger::SetUseExternalEditor (bool value)
858e40e4218SJim Ingham {
859e40e4218SJim Ingham     if (m_opaque_sp)
860e40e4218SJim Ingham         return m_opaque_sp->SetUseExternalEditor (value);
861e40e4218SJim Ingham     return false;
862e40e4218SJim Ingham }
863e40e4218SJim Ingham 
864e40e4218SJim Ingham bool
865daccaa9eSCaroline Tice SBDebugger::GetUseExternalEditor ()
866e40e4218SJim Ingham {
867e40e4218SJim Ingham     if (m_opaque_sp)
868daccaa9eSCaroline Tice         return m_opaque_sp->GetUseExternalEditor ();
869e40e4218SJim Ingham     return false;
870e40e4218SJim Ingham }
871e40e4218SJim Ingham 
872dde9cff3SCaroline Tice bool
873dde9cff3SCaroline Tice SBDebugger::GetDescription (SBStream &description)
874dde9cff3SCaroline Tice {
875dde9cff3SCaroline Tice     if (m_opaque_sp)
876dde9cff3SCaroline Tice     {
877dde9cff3SCaroline Tice         const char *name = m_opaque_sp->GetInstanceName().AsCString();
878431ce678SGreg Clayton         user_id_t id = m_opaque_sp->GetID();
879cfd1acedSGreg Clayton         description.Printf ("Debugger (instance: \"%s\", id: %d)", name, id);
880dde9cff3SCaroline Tice     }
881dde9cff3SCaroline Tice     else
882dde9cff3SCaroline Tice         description.Printf ("No value");
883dde9cff3SCaroline Tice 
884dde9cff3SCaroline Tice     return true;
885dde9cff3SCaroline Tice }
886efed6131SCaroline Tice 
887431ce678SGreg Clayton user_id_t
888efed6131SCaroline Tice SBDebugger::GetID()
889efed6131SCaroline Tice {
890efed6131SCaroline Tice     if (m_opaque_sp)
891efed6131SCaroline Tice         return m_opaque_sp->GetID();
892efed6131SCaroline Tice     return LLDB_INVALID_UID;
893efed6131SCaroline Tice }
8942289fa48SGreg Clayton 
8952289fa48SGreg Clayton 
8962289fa48SGreg Clayton SBError
8972289fa48SGreg Clayton SBDebugger::SetCurrentPlatform (const char *platform_name)
8982289fa48SGreg Clayton {
8992289fa48SGreg Clayton     SBError sb_error;
9002289fa48SGreg Clayton     if (m_opaque_sp)
9012289fa48SGreg Clayton     {
9022289fa48SGreg Clayton         PlatformSP platform_sp (Platform::Create (platform_name, sb_error.ref()));
9032289fa48SGreg Clayton 
9042289fa48SGreg Clayton         if (platform_sp)
9052289fa48SGreg Clayton         {
9062289fa48SGreg Clayton             bool make_selected = true;
9072289fa48SGreg Clayton             m_opaque_sp->GetPlatformList().Append (platform_sp, make_selected);
9082289fa48SGreg Clayton         }
9092289fa48SGreg Clayton     }
9102289fa48SGreg Clayton     return sb_error;
9112289fa48SGreg Clayton }
9122289fa48SGreg Clayton 
913fc3f027dSGreg Clayton bool
914f3dd93c8SGreg Clayton SBDebugger::SetCurrentPlatformSDKRoot (const char *sysroot)
915f3dd93c8SGreg Clayton {
916f3dd93c8SGreg Clayton     if (m_opaque_sp)
917f3dd93c8SGreg Clayton     {
918f3dd93c8SGreg Clayton         PlatformSP platform_sp (m_opaque_sp->GetPlatformList().GetSelectedPlatform());
919f3dd93c8SGreg Clayton 
920f3dd93c8SGreg Clayton         if (platform_sp)
921f3dd93c8SGreg Clayton         {
922f3dd93c8SGreg Clayton             platform_sp->SetSDKRootDirectory (ConstString (sysroot));
923f3dd93c8SGreg Clayton             return true;
924f3dd93c8SGreg Clayton         }
925f3dd93c8SGreg Clayton     }
926f3dd93c8SGreg Clayton     return false;
927f3dd93c8SGreg Clayton }
928f3dd93c8SGreg Clayton 
929f3dd93c8SGreg Clayton bool
930fc3f027dSGreg Clayton SBDebugger::GetCloseInputOnEOF () const
931fc3f027dSGreg Clayton {
932fc3f027dSGreg Clayton     if (m_opaque_sp)
933fc3f027dSGreg Clayton         return m_opaque_sp->GetCloseInputOnEOF ();
934fc3f027dSGreg Clayton     return false;
935fc3f027dSGreg Clayton }
936fc3f027dSGreg Clayton 
937fc3f027dSGreg Clayton void
938fc3f027dSGreg Clayton SBDebugger::SetCloseInputOnEOF (bool b)
939fc3f027dSGreg Clayton {
940fc3f027dSGreg Clayton     if (m_opaque_sp)
941fc3f027dSGreg Clayton         m_opaque_sp->SetCloseInputOnEOF (b);
942fc3f027dSGreg Clayton }
943