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"
32cac9c5f9SGreg Clayton #include "lldb/Interpreter/OptionGroupPlatform.h"
336eee5aa0SGreg Clayton #include "lldb/Target/Process.h"
346eee5aa0SGreg Clayton #include "lldb/Target/TargetList.h"
3530fdc8d8SChris Lattner 
3630fdc8d8SChris Lattner using namespace lldb;
3730fdc8d8SChris Lattner using namespace lldb_private;
3830fdc8d8SChris Lattner 
3930fdc8d8SChris Lattner void
4030fdc8d8SChris Lattner SBDebugger::Initialize ()
4130fdc8d8SChris Lattner {
42431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
43ceb6b139SCaroline Tice 
44ceb6b139SCaroline Tice     if (log)
45ceb6b139SCaroline Tice         log->Printf ("SBDebugger::Initialize ()");
46ceb6b139SCaroline Tice 
47fc36f791SGreg Clayton     SBCommandInterpreter::InitializeSWIG ();
48fc36f791SGreg Clayton 
4930fdc8d8SChris Lattner     Debugger::Initialize();
5030fdc8d8SChris Lattner }
5130fdc8d8SChris Lattner 
5230fdc8d8SChris Lattner void
5330fdc8d8SChris Lattner SBDebugger::Terminate ()
5430fdc8d8SChris Lattner {
5530fdc8d8SChris Lattner     Debugger::Terminate();
5630fdc8d8SChris Lattner }
5730fdc8d8SChris Lattner 
5848e42549SGreg Clayton void
5948e42549SGreg Clayton SBDebugger::Clear ()
6048e42549SGreg Clayton {
61431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
62ceb6b139SCaroline Tice 
63ceb6b139SCaroline Tice     if (log)
6493aa84e8SGreg Clayton         log->Printf ("SBDebugger(%p)::Clear ()", m_opaque_sp.get());
653d6086f6SCaroline Tice 
663d6086f6SCaroline Tice     if (m_opaque_sp)
673d6086f6SCaroline Tice         m_opaque_sp->CleanUpInputReaders ();
68ceb6b139SCaroline Tice 
6948e42549SGreg Clayton     m_opaque_sp.reset();
7048e42549SGreg Clayton }
7148e42549SGreg Clayton 
726611103cSGreg Clayton SBDebugger
736611103cSGreg Clayton SBDebugger::Create()
746611103cSGreg Clayton {
7566243847SJim Ingham     return SBDebugger::Create(false);
7606942690SJim Ingham }
7706942690SJim Ingham 
7806942690SJim Ingham SBDebugger
7906942690SJim Ingham SBDebugger::Create(bool source_init_files)
8006942690SJim Ingham {
81431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
82ceb6b139SCaroline Tice 
836611103cSGreg Clayton     SBDebugger debugger;
846611103cSGreg Clayton     debugger.reset(Debugger::CreateInstance());
85ceb6b139SCaroline Tice 
86ceb6b139SCaroline Tice     if (log)
87ceb6b139SCaroline Tice     {
88ceb6b139SCaroline Tice         SBStream sstr;
89ceb6b139SCaroline Tice         debugger.GetDescription (sstr);
9093aa84e8SGreg Clayton         log->Printf ("SBDebugger::Create () => SBDebugger(%p): %s", debugger.m_opaque_sp.get(), sstr.GetData());
91ceb6b139SCaroline Tice     }
92ceb6b139SCaroline Tice 
9306942690SJim Ingham     SBCommandInterpreter interp = debugger.GetCommandInterpreter();
9406942690SJim Ingham     if (source_init_files)
9506942690SJim Ingham     {
9606942690SJim Ingham         interp.get()->SkipLLDBInitFiles(false);
9706942690SJim Ingham         interp.get()->SkipAppInitFiles (false);
9806942690SJim Ingham         SBCommandReturnObject result;
9906942690SJim Ingham         interp.SourceInitFileInHomeDirectory(result);
10006942690SJim Ingham     }
10106942690SJim Ingham     else
10206942690SJim Ingham     {
10306942690SJim Ingham         interp.get()->SkipLLDBInitFiles(true);
10406942690SJim Ingham         interp.get()->SkipAppInitFiles (true);
10506942690SJim Ingham     }
1066611103cSGreg Clayton     return debugger;
1076611103cSGreg Clayton }
1086611103cSGreg Clayton 
109e02657b1SCaroline Tice void
110e02657b1SCaroline Tice SBDebugger::Destroy (SBDebugger &debugger)
111e02657b1SCaroline Tice {
112431ce678SGreg Clayton     LogSP log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
113e02657b1SCaroline Tice 
114e02657b1SCaroline Tice     if (log)
115e02657b1SCaroline Tice     {
116e02657b1SCaroline Tice         SBStream sstr;
117e02657b1SCaroline Tice         debugger.GetDescription (sstr);
118e02657b1SCaroline Tice         log->Printf ("SBDebugger::Destroy () => SBDebugger(%p): %s", debugger.m_opaque_sp.get(), sstr.GetData());
119e02657b1SCaroline Tice     }
120e02657b1SCaroline Tice 
121e02657b1SCaroline Tice     Debugger::Destroy (debugger.m_opaque_sp);
122e02657b1SCaroline Tice 
123e02657b1SCaroline Tice     if (debugger.m_opaque_sp.get() != NULL)
124e02657b1SCaroline Tice         debugger.m_opaque_sp.reset();
125e02657b1SCaroline Tice }
126e02657b1SCaroline Tice 
1276611103cSGreg Clayton SBDebugger::SBDebugger () :
1286611103cSGreg Clayton     m_opaque_sp ()
1296611103cSGreg Clayton {
1306611103cSGreg Clayton }
1316611103cSGreg Clayton 
132274fd6e9SEnrico Granata SBDebugger::SBDebugger(const lldb::DebuggerSP &debugger_sp) :
133274fd6e9SEnrico Granata     m_opaque_sp(debugger_sp)
134274fd6e9SEnrico Granata {
135274fd6e9SEnrico Granata }
136274fd6e9SEnrico Granata 
137efabb123SGreg Clayton SBDebugger::SBDebugger(const SBDebugger &rhs) :
138efabb123SGreg Clayton     m_opaque_sp (rhs.m_opaque_sp)
139efabb123SGreg Clayton {
140efabb123SGreg Clayton }
141efabb123SGreg Clayton 
142efabb123SGreg Clayton SBDebugger &
143efabb123SGreg Clayton SBDebugger::operator = (const SBDebugger &rhs)
144efabb123SGreg Clayton {
145efabb123SGreg Clayton     if (this != &rhs)
146efabb123SGreg Clayton     {
147efabb123SGreg Clayton         m_opaque_sp = rhs.m_opaque_sp;
148efabb123SGreg Clayton     }
149efabb123SGreg Clayton     return *this;
150efabb123SGreg Clayton }
151efabb123SGreg Clayton 
1526611103cSGreg Clayton SBDebugger::~SBDebugger ()
1536611103cSGreg Clayton {
1546611103cSGreg Clayton }
1556611103cSGreg Clayton 
1566611103cSGreg Clayton bool
1576611103cSGreg Clayton SBDebugger::IsValid() const
1586611103cSGreg Clayton {
1596611103cSGreg Clayton     return m_opaque_sp.get() != NULL;
1606611103cSGreg Clayton }
1616611103cSGreg Clayton 
1626611103cSGreg Clayton 
16330fdc8d8SChris Lattner void
16430fdc8d8SChris Lattner SBDebugger::SetAsync (bool b)
16530fdc8d8SChris Lattner {
1666611103cSGreg Clayton     if (m_opaque_sp)
1676611103cSGreg Clayton         m_opaque_sp->SetAsyncExecution(b);
16830fdc8d8SChris Lattner }
16930fdc8d8SChris Lattner 
170e64f0dc7SJim Ingham bool
171e64f0dc7SJim Ingham SBDebugger::GetAsync ()
172e64f0dc7SJim Ingham {
173e64f0dc7SJim Ingham     if (m_opaque_sp)
174e64f0dc7SJim Ingham         return m_opaque_sp->GetAsyncExecution();
175e64f0dc7SJim Ingham     else
176e64f0dc7SJim Ingham         return false;
177e64f0dc7SJim Ingham }
178e64f0dc7SJim Ingham 
1796eee5aa0SGreg Clayton void
1806eee5aa0SGreg Clayton SBDebugger::SkipLLDBInitFiles (bool b)
1816eee5aa0SGreg Clayton {
1826eee5aa0SGreg Clayton     if (m_opaque_sp)
1836eee5aa0SGreg Clayton         m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles (b);
1846eee5aa0SGreg Clayton }
1856eee5aa0SGreg Clayton 
18616e0c686SJim Ingham void
18716e0c686SJim Ingham SBDebugger::SkipAppInitFiles (bool b)
18816e0c686SJim Ingham {
18916e0c686SJim Ingham     if (m_opaque_sp)
19016e0c686SJim Ingham         m_opaque_sp->GetCommandInterpreter().SkipAppInitFiles (b);
19116e0c686SJim Ingham }
19216e0c686SJim Ingham 
19330fdc8d8SChris Lattner // Shouldn't really be settable after initialization as this could cause lots of problems; don't want users
19430fdc8d8SChris Lattner // trying to switch modes in the middle of a debugging session.
19530fdc8d8SChris Lattner void
19630fdc8d8SChris Lattner SBDebugger::SetInputFileHandle (FILE *fh, bool transfer_ownership)
19730fdc8d8SChris Lattner {
198431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
199ceb6b139SCaroline Tice 
200ceb6b139SCaroline Tice     if (log)
201cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::SetInputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
202cfd1acedSGreg Clayton                      fh, transfer_ownership);
203ceb6b139SCaroline Tice 
2046611103cSGreg Clayton     if (m_opaque_sp)
2056611103cSGreg Clayton         m_opaque_sp->SetInputFileHandle (fh, transfer_ownership);
20630fdc8d8SChris Lattner }
20730fdc8d8SChris Lattner 
20830fdc8d8SChris Lattner void
20930fdc8d8SChris Lattner SBDebugger::SetOutputFileHandle (FILE *fh, bool transfer_ownership)
21030fdc8d8SChris Lattner {
211431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
212ceb6b139SCaroline Tice 
213ceb6b139SCaroline Tice 
214ceb6b139SCaroline Tice     if (log)
215cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::SetOutputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
216cfd1acedSGreg Clayton                      fh, transfer_ownership);
217ceb6b139SCaroline Tice 
2186611103cSGreg Clayton     if (m_opaque_sp)
2196611103cSGreg Clayton         m_opaque_sp->SetOutputFileHandle (fh, transfer_ownership);
22030fdc8d8SChris Lattner }
22130fdc8d8SChris Lattner 
22230fdc8d8SChris Lattner void
22330fdc8d8SChris Lattner SBDebugger::SetErrorFileHandle (FILE *fh, bool transfer_ownership)
22430fdc8d8SChris Lattner {
225431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
226ceb6b139SCaroline Tice 
227ceb6b139SCaroline Tice 
228ceb6b139SCaroline Tice     if (log)
229cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::SetErrorFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
230cfd1acedSGreg Clayton                      fh, transfer_ownership);
231ceb6b139SCaroline Tice 
2326611103cSGreg Clayton     if (m_opaque_sp)
2336611103cSGreg Clayton         m_opaque_sp->SetErrorFileHandle (fh, transfer_ownership);
23430fdc8d8SChris Lattner }
23530fdc8d8SChris Lattner 
23630fdc8d8SChris Lattner FILE *
23730fdc8d8SChris Lattner SBDebugger::GetInputFileHandle ()
23830fdc8d8SChris Lattner {
2396611103cSGreg Clayton     if (m_opaque_sp)
24051b1e2d2SGreg Clayton         return m_opaque_sp->GetInputFile().GetStream();
2416611103cSGreg Clayton     return NULL;
24230fdc8d8SChris Lattner }
24330fdc8d8SChris Lattner 
24430fdc8d8SChris Lattner FILE *
24530fdc8d8SChris Lattner SBDebugger::GetOutputFileHandle ()
24630fdc8d8SChris Lattner {
2476611103cSGreg Clayton     if (m_opaque_sp)
24851b1e2d2SGreg Clayton         return m_opaque_sp->GetOutputFile().GetStream();
2496611103cSGreg Clayton     return NULL;
25030fdc8d8SChris Lattner }
25130fdc8d8SChris Lattner 
25230fdc8d8SChris Lattner FILE *
25330fdc8d8SChris Lattner SBDebugger::GetErrorFileHandle ()
25430fdc8d8SChris Lattner {
2556611103cSGreg Clayton     if (m_opaque_sp)
25651b1e2d2SGreg Clayton         return m_opaque_sp->GetErrorFile().GetStream();
2576611103cSGreg Clayton     return NULL;
25830fdc8d8SChris Lattner }
25930fdc8d8SChris Lattner 
26030fdc8d8SChris Lattner SBCommandInterpreter
26130fdc8d8SChris Lattner SBDebugger::GetCommandInterpreter ()
26230fdc8d8SChris Lattner {
263431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
264ceb6b139SCaroline Tice 
2656611103cSGreg Clayton     SBCommandInterpreter sb_interpreter;
2666611103cSGreg Clayton     if (m_opaque_sp)
2676611103cSGreg Clayton         sb_interpreter.reset (&m_opaque_sp->GetCommandInterpreter());
268ceb6b139SCaroline Tice 
269750cd175SCaroline Tice     if (log)
27093aa84e8SGreg Clayton         log->Printf ("SBDebugger(%p)::GetCommandInterpreter () => SBCommandInterpreter(%p)",
271750cd175SCaroline Tice                      m_opaque_sp.get(), sb_interpreter.get());
272750cd175SCaroline Tice 
27330fdc8d8SChris Lattner     return sb_interpreter;
27430fdc8d8SChris Lattner }
27530fdc8d8SChris Lattner 
27630fdc8d8SChris Lattner void
27730fdc8d8SChris Lattner SBDebugger::HandleCommand (const char *command)
27830fdc8d8SChris Lattner {
2796611103cSGreg Clayton     if (m_opaque_sp)
2806611103cSGreg Clayton     {
281af67cecdSGreg Clayton         TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
282af67cecdSGreg Clayton         Mutex::Locker api_locker;
283af67cecdSGreg Clayton         if (target_sp)
284af67cecdSGreg Clayton             api_locker.Reset(target_sp->GetAPIMutex().GetMutex());
285af67cecdSGreg Clayton 
2866611103cSGreg Clayton         SBCommandInterpreter sb_interpreter(GetCommandInterpreter ());
28730fdc8d8SChris Lattner         SBCommandReturnObject result;
28830fdc8d8SChris Lattner 
28930fdc8d8SChris Lattner         sb_interpreter.HandleCommand (command, result, false);
29030fdc8d8SChris Lattner 
29130fdc8d8SChris Lattner         if (GetErrorFileHandle() != NULL)
29230fdc8d8SChris Lattner             result.PutError (GetErrorFileHandle());
29330fdc8d8SChris Lattner         if (GetOutputFileHandle() != NULL)
29430fdc8d8SChris Lattner             result.PutOutput (GetOutputFileHandle());
29530fdc8d8SChris Lattner 
2966611103cSGreg Clayton         if (m_opaque_sp->GetAsyncExecution() == false)
29730fdc8d8SChris Lattner         {
2986611103cSGreg Clayton             SBProcess process(GetCommandInterpreter().GetProcess ());
29930fdc8d8SChris Lattner             if (process.IsValid())
30030fdc8d8SChris Lattner             {
30130fdc8d8SChris Lattner                 EventSP event_sp;
3026611103cSGreg Clayton                 Listener &lldb_listener = m_opaque_sp->GetListener();
30330fdc8d8SChris Lattner                 while (lldb_listener.GetNextEventForBroadcaster (process.get(), event_sp))
30430fdc8d8SChris Lattner                 {
30530fdc8d8SChris Lattner                     SBEvent event(event_sp);
30630fdc8d8SChris Lattner                     HandleProcessEvent (process, event, GetOutputFileHandle(), GetErrorFileHandle());
30730fdc8d8SChris Lattner                 }
30830fdc8d8SChris Lattner             }
30930fdc8d8SChris Lattner         }
31030fdc8d8SChris Lattner     }
3116611103cSGreg Clayton }
31230fdc8d8SChris Lattner 
31330fdc8d8SChris Lattner SBListener
31430fdc8d8SChris Lattner SBDebugger::GetListener ()
31530fdc8d8SChris Lattner {
316431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
317ceb6b139SCaroline Tice 
3186611103cSGreg Clayton     SBListener sb_listener;
3196611103cSGreg Clayton     if (m_opaque_sp)
3206611103cSGreg Clayton         sb_listener.reset(&m_opaque_sp->GetListener(), false);
321ceb6b139SCaroline Tice 
322750cd175SCaroline Tice     if (log)
32393aa84e8SGreg Clayton         log->Printf ("SBDebugger(%p)::GetListener () => SBListener(%p)", m_opaque_sp.get(),
324750cd175SCaroline Tice                      sb_listener.get());
325750cd175SCaroline Tice 
32630fdc8d8SChris Lattner     return sb_listener;
32730fdc8d8SChris Lattner }
32830fdc8d8SChris Lattner 
32930fdc8d8SChris Lattner void
33030fdc8d8SChris Lattner SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, FILE *out, FILE *err)
33130fdc8d8SChris Lattner {
332af67cecdSGreg Clayton     if (!process.IsValid())
333af67cecdSGreg Clayton         return;
334af67cecdSGreg Clayton 
33530fdc8d8SChris Lattner     const uint32_t event_type = event.GetType();
33630fdc8d8SChris Lattner     char stdio_buffer[1024];
33730fdc8d8SChris Lattner     size_t len;
33830fdc8d8SChris Lattner 
339af67cecdSGreg Clayton     Mutex::Locker api_locker (process.GetTarget()->GetAPIMutex());
340af67cecdSGreg Clayton 
341af67cecdSGreg Clayton     if (event_type & (Process::eBroadcastBitSTDOUT | Process::eBroadcastBitStateChanged))
34230fdc8d8SChris Lattner     {
343af67cecdSGreg Clayton         // Drain stdout when we stop just in case we have any bytes
34430fdc8d8SChris Lattner         while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
34530fdc8d8SChris Lattner             if (out != NULL)
34630fdc8d8SChris Lattner                 ::fwrite (stdio_buffer, 1, len, out);
34730fdc8d8SChris Lattner     }
348af67cecdSGreg Clayton 
349af67cecdSGreg Clayton     if (event_type & (Process::eBroadcastBitSTDERR | Process::eBroadcastBitStateChanged))
35030fdc8d8SChris Lattner     {
351af67cecdSGreg Clayton         // Drain stderr when we stop just in case we have any bytes
35230fdc8d8SChris Lattner         while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
353af67cecdSGreg Clayton             if (err != NULL)
354af67cecdSGreg Clayton                 ::fwrite (stdio_buffer, 1, len, err);
35530fdc8d8SChris Lattner     }
356af67cecdSGreg Clayton 
357af67cecdSGreg Clayton     if (event_type & Process::eBroadcastBitStateChanged)
35830fdc8d8SChris Lattner     {
35930fdc8d8SChris Lattner         StateType event_state = SBProcess::GetStateFromEvent (event);
36030fdc8d8SChris Lattner 
36130fdc8d8SChris Lattner         if (event_state == eStateInvalid)
36230fdc8d8SChris Lattner             return;
36330fdc8d8SChris Lattner 
36430fdc8d8SChris Lattner         bool is_stopped = StateIsStoppedState (event_state);
36530fdc8d8SChris Lattner         if (!is_stopped)
3662976d00aSJim Ingham             process.ReportEventState (event, out);
36730fdc8d8SChris Lattner     }
36830fdc8d8SChris Lattner }
36930fdc8d8SChris Lattner 
370e37d605eSJim Ingham SBSourceManager
37130fdc8d8SChris Lattner SBDebugger::GetSourceManager ()
37230fdc8d8SChris Lattner {
373e37d605eSJim Ingham     SBSourceManager sb_source_manager (*this);
374e37d605eSJim Ingham     return sb_source_manager;
37530fdc8d8SChris Lattner }
37630fdc8d8SChris Lattner 
37730fdc8d8SChris Lattner 
37830fdc8d8SChris Lattner bool
37930fdc8d8SChris Lattner SBDebugger::GetDefaultArchitecture (char *arch_name, size_t arch_name_len)
38030fdc8d8SChris Lattner {
38130fdc8d8SChris Lattner     if (arch_name && arch_name_len)
38230fdc8d8SChris Lattner     {
383431ce678SGreg Clayton         ArchSpec default_arch = Target::GetDefaultArchitecture ();
384daccaa9eSCaroline Tice 
38530fdc8d8SChris Lattner         if (default_arch.IsValid())
38630fdc8d8SChris Lattner         {
387431ce678SGreg Clayton             const std::string &triple_str = default_arch.GetTriple().str();
388431ce678SGreg Clayton             if (!triple_str.empty())
389431ce678SGreg Clayton                 ::snprintf (arch_name, arch_name_len, "%s", triple_str.c_str());
390431ce678SGreg Clayton             else
39164195a2cSGreg Clayton                 ::snprintf (arch_name, arch_name_len, "%s", default_arch.GetArchitectureName());
39230fdc8d8SChris Lattner             return true;
39330fdc8d8SChris Lattner         }
39430fdc8d8SChris Lattner     }
39530fdc8d8SChris Lattner     if (arch_name && arch_name_len)
39630fdc8d8SChris Lattner         arch_name[0] = '\0';
39730fdc8d8SChris Lattner     return false;
39830fdc8d8SChris Lattner }
39930fdc8d8SChris Lattner 
40030fdc8d8SChris Lattner 
40130fdc8d8SChris Lattner bool
40230fdc8d8SChris Lattner SBDebugger::SetDefaultArchitecture (const char *arch_name)
40330fdc8d8SChris Lattner {
40430fdc8d8SChris Lattner     if (arch_name)
40530fdc8d8SChris Lattner     {
406eb0103f2SGreg Clayton         ArchSpec arch (arch_name, NULL);
40730fdc8d8SChris Lattner         if (arch.IsValid())
40830fdc8d8SChris Lattner         {
409431ce678SGreg Clayton             Target::SetDefaultArchitecture (arch);
41030fdc8d8SChris Lattner             return true;
41130fdc8d8SChris Lattner         }
41230fdc8d8SChris Lattner     }
41330fdc8d8SChris Lattner     return false;
41430fdc8d8SChris Lattner }
41530fdc8d8SChris Lattner 
41630fdc8d8SChris Lattner ScriptLanguage
41730fdc8d8SChris Lattner SBDebugger::GetScriptingLanguage (const char *script_language_name)
41830fdc8d8SChris Lattner {
419af67cecdSGreg Clayton 
42030fdc8d8SChris Lattner     return Args::StringToScriptLanguage (script_language_name,
42130fdc8d8SChris Lattner                                          eScriptLanguageDefault,
42230fdc8d8SChris Lattner                                          NULL);
42330fdc8d8SChris Lattner }
42430fdc8d8SChris Lattner 
42530fdc8d8SChris Lattner const char *
42630fdc8d8SChris Lattner SBDebugger::GetVersionString ()
42730fdc8d8SChris Lattner {
428431ce678SGreg Clayton     return GetVersion();
42930fdc8d8SChris Lattner }
43030fdc8d8SChris Lattner 
43130fdc8d8SChris Lattner const char *
432431ce678SGreg Clayton SBDebugger::StateAsCString (StateType state)
43330fdc8d8SChris Lattner {
434c2bbb49aSCaroline Tice     return lldb_private::StateAsCString (state);
43530fdc8d8SChris Lattner }
43630fdc8d8SChris Lattner 
43730fdc8d8SChris Lattner bool
438431ce678SGreg Clayton SBDebugger::StateIsRunningState (StateType state)
43930fdc8d8SChris Lattner {
440431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4414838131bSGreg Clayton 
442c2bbb49aSCaroline Tice     const bool result = lldb_private::StateIsRunningState (state);
4434838131bSGreg Clayton     if (log)
4444838131bSGreg Clayton         log->Printf ("SBDebugger::StateIsRunningState (state=%s) => %i",
445431ce678SGreg Clayton                      StateAsCString (state), result);
4464838131bSGreg Clayton 
4474838131bSGreg Clayton     return result;
44830fdc8d8SChris Lattner }
44930fdc8d8SChris Lattner 
45030fdc8d8SChris Lattner bool
451431ce678SGreg Clayton SBDebugger::StateIsStoppedState (StateType state)
45230fdc8d8SChris Lattner {
453431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
454ceb6b139SCaroline Tice 
455c2bbb49aSCaroline Tice     const bool result = lldb_private::StateIsStoppedState (state);
456ceb6b139SCaroline Tice     if (log)
4574838131bSGreg Clayton         log->Printf ("SBDebugger::StateIsStoppedState (state=%s) => %i",
458431ce678SGreg Clayton                      StateAsCString (state), result);
459ceb6b139SCaroline Tice 
4604838131bSGreg Clayton     return result;
46130fdc8d8SChris Lattner }
46230fdc8d8SChris Lattner 
463cac9c5f9SGreg Clayton lldb::SBTarget
464cac9c5f9SGreg Clayton SBDebugger::CreateTarget (const char *filename,
465cac9c5f9SGreg Clayton                           const char *target_triple,
466cac9c5f9SGreg Clayton                           const char *platform_name,
467cac9c5f9SGreg Clayton                           bool add_dependent_modules,
468cac9c5f9SGreg Clayton                           lldb::SBError& sb_error)
469cac9c5f9SGreg Clayton {
470cac9c5f9SGreg Clayton     SBTarget sb_target;
471cac9c5f9SGreg Clayton     if (m_opaque_sp)
472cac9c5f9SGreg Clayton     {
473cac9c5f9SGreg Clayton         sb_error.Clear();
474cac9c5f9SGreg Clayton         FileSpec filename_spec (filename, true);
475cac9c5f9SGreg Clayton         OptionGroupPlatform platform_options (false);
476cac9c5f9SGreg Clayton         platform_options.SetPlatformName (platform_name);
477cac9c5f9SGreg Clayton 
478cac9c5f9SGreg Clayton         TargetSP target_sp;
479cac9c5f9SGreg Clayton         sb_error.ref() = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
480cac9c5f9SGreg Clayton                                                                     filename_spec,
481cac9c5f9SGreg Clayton                                                                     target_triple,
482cac9c5f9SGreg Clayton                                                                     add_dependent_modules,
483cac9c5f9SGreg Clayton                                                                     &platform_options,
484cac9c5f9SGreg Clayton                                                                     target_sp);
485cac9c5f9SGreg Clayton 
486cac9c5f9SGreg Clayton         if (sb_error.Success())
487cac9c5f9SGreg Clayton             sb_target.reset (target_sp);
488cac9c5f9SGreg Clayton     }
489cac9c5f9SGreg Clayton     else
490cac9c5f9SGreg Clayton     {
491cac9c5f9SGreg Clayton         sb_error.SetErrorString("invalid target");
492cac9c5f9SGreg Clayton     }
493cac9c5f9SGreg Clayton 
494cac9c5f9SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
495cac9c5f9SGreg Clayton     if (log)
496cac9c5f9SGreg Clayton     {
497cac9c5f9SGreg Clayton         log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\", triple=%s, platform_name=%s, add_dependent_modules=%u, error=%s) => SBTarget(%p)",
498cac9c5f9SGreg Clayton                      m_opaque_sp.get(),
499cac9c5f9SGreg Clayton                      filename,
500cac9c5f9SGreg Clayton                      target_triple,
501cac9c5f9SGreg Clayton                      platform_name,
502cac9c5f9SGreg Clayton                      add_dependent_modules,
503cac9c5f9SGreg Clayton                      sb_error.GetCString(),
504cac9c5f9SGreg Clayton                      sb_target.get());
505cac9c5f9SGreg Clayton     }
506cac9c5f9SGreg Clayton 
507cac9c5f9SGreg Clayton     return sb_target;
508cac9c5f9SGreg Clayton }
50930fdc8d8SChris Lattner 
51030fdc8d8SChris Lattner SBTarget
51130fdc8d8SChris Lattner SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename,
51230fdc8d8SChris Lattner                                                  const char *target_triple)
51330fdc8d8SChris Lattner {
5146611103cSGreg Clayton     SBTarget target;
5156611103cSGreg Clayton     if (m_opaque_sp)
5166611103cSGreg Clayton     {
517274060b6SGreg Clayton         FileSpec file_spec (filename, true);
51830fdc8d8SChris Lattner         TargetSP target_sp;
519cac9c5f9SGreg Clayton         const bool add_dependent_modules = true;
520cac9c5f9SGreg Clayton         Error error (m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
521cac9c5f9SGreg Clayton                                                                 file_spec,
522cac9c5f9SGreg Clayton                                                                 target_triple,
523cac9c5f9SGreg Clayton                                                                 add_dependent_modules,
524cac9c5f9SGreg Clayton                                                                 NULL,
525cac9c5f9SGreg Clayton                                                                 target_sp));
5266611103cSGreg Clayton         target.reset (target_sp);
5276611103cSGreg Clayton     }
5284838131bSGreg Clayton 
529431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5304838131bSGreg Clayton     if (log)
5314838131bSGreg Clayton     {
532cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndTargetTriple (filename=\"%s\", triple=%s) => SBTarget(%p)",
5334838131bSGreg Clayton                      m_opaque_sp.get(), filename, target_triple, target.get());
5344838131bSGreg Clayton     }
5354838131bSGreg Clayton 
53630fdc8d8SChris Lattner     return target;
53730fdc8d8SChris Lattner }
53830fdc8d8SChris Lattner 
53930fdc8d8SChris Lattner SBTarget
54064195a2cSGreg Clayton SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *arch_cstr)
54130fdc8d8SChris Lattner {
542431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
543ceb6b139SCaroline Tice 
5446611103cSGreg Clayton     SBTarget target;
5456611103cSGreg Clayton     if (m_opaque_sp)
5466611103cSGreg Clayton     {
547274060b6SGreg Clayton         FileSpec file (filename, true);
54830fdc8d8SChris Lattner         TargetSP target_sp;
54930fdc8d8SChris Lattner         Error error;
550cac9c5f9SGreg Clayton         const bool add_dependent_modules = true;
55130fdc8d8SChris Lattner 
552cac9c5f9SGreg Clayton         error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
553cac9c5f9SGreg Clayton                                                            file,
554cac9c5f9SGreg Clayton                                                            arch_cstr,
555cac9c5f9SGreg Clayton                                                            add_dependent_modules,
556cac9c5f9SGreg Clayton                                                            NULL,
557cac9c5f9SGreg Clayton                                                            target_sp);
55830fdc8d8SChris Lattner 
55930fdc8d8SChris Lattner         if (error.Success())
5606611103cSGreg Clayton         {
5612976d00aSJim Ingham             m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
5626611103cSGreg Clayton             target.reset(target_sp);
5636611103cSGreg Clayton         }
5646611103cSGreg Clayton     }
565ceb6b139SCaroline Tice 
566ceb6b139SCaroline Tice     if (log)
567ceb6b139SCaroline Tice     {
568cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndArch (filename=\"%s\", arch=%s) => SBTarget(%p)",
56964195a2cSGreg Clayton                      m_opaque_sp.get(), filename, arch_cstr, target.get());
570ceb6b139SCaroline Tice     }
571ceb6b139SCaroline Tice 
5726611103cSGreg Clayton     return target;
57330fdc8d8SChris Lattner }
57430fdc8d8SChris Lattner 
57530fdc8d8SChris Lattner SBTarget
57630fdc8d8SChris Lattner SBDebugger::CreateTarget (const char *filename)
57730fdc8d8SChris Lattner {
5786611103cSGreg Clayton     SBTarget target;
5796611103cSGreg Clayton     if (m_opaque_sp)
5806611103cSGreg Clayton     {
581274060b6SGreg Clayton         FileSpec file (filename, true);
582431ce678SGreg Clayton         ArchSpec arch = Target::GetDefaultArchitecture ();
58330fdc8d8SChris Lattner         TargetSP target_sp;
58430fdc8d8SChris Lattner         Error error;
585cac9c5f9SGreg Clayton         const bool add_dependent_modules = true;
58630fdc8d8SChris Lattner 
587cac9c5f9SGreg Clayton         error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
588cac9c5f9SGreg Clayton                                                            file,
589cac9c5f9SGreg Clayton                                                            arch,
590cac9c5f9SGreg Clayton                                                            add_dependent_modules,
591cac9c5f9SGreg Clayton                                                            m_opaque_sp->GetPlatformList().GetSelectedPlatform(),
592cac9c5f9SGreg Clayton                                                            target_sp);
59330fdc8d8SChris Lattner 
5946611103cSGreg Clayton         if (error.Success())
5956611103cSGreg Clayton         {
5962976d00aSJim Ingham             m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
5976611103cSGreg Clayton             target.reset (target_sp);
5986611103cSGreg Clayton         }
5996611103cSGreg Clayton     }
600431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
6014838131bSGreg Clayton     if (log)
6024838131bSGreg Clayton     {
603cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)",
6044838131bSGreg Clayton                      m_opaque_sp.get(), filename, target.get());
6054838131bSGreg Clayton     }
6066611103cSGreg Clayton     return target;
60730fdc8d8SChris Lattner }
60830fdc8d8SChris Lattner 
6093794ad95SJohnny Chen bool
6103794ad95SJohnny Chen SBDebugger::DeleteTarget (lldb::SBTarget &target)
6113794ad95SJohnny Chen {
6123794ad95SJohnny Chen     bool result = false;
6133794ad95SJohnny Chen     if (m_opaque_sp)
6143794ad95SJohnny Chen     {
6153794ad95SJohnny Chen         // No need to lock, the target list is thread safe
6163794ad95SJohnny Chen         result = m_opaque_sp->GetTargetList().DeleteTarget (target.m_opaque_sp);
6173360b411SGreg Clayton         target->Destroy();
61875340622SGreg Clayton         target.Clear();
61975340622SGreg Clayton         ModuleList::RemoveOrphanSharedModules();
6203794ad95SJohnny Chen     }
6213794ad95SJohnny Chen 
6223794ad95SJohnny Chen     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
6233794ad95SJohnny Chen     if (log)
6243794ad95SJohnny Chen     {
6253794ad95SJohnny Chen         log->Printf ("SBDebugger(%p)::DeleteTarget (SBTarget(%p)) => %i", m_opaque_sp.get(), target.m_opaque_sp.get(), result);
6263794ad95SJohnny Chen     }
6273794ad95SJohnny Chen 
6283794ad95SJohnny Chen     return result;
6293794ad95SJohnny Chen }
63030fdc8d8SChris Lattner SBTarget
63130fdc8d8SChris Lattner SBDebugger::GetTargetAtIndex (uint32_t idx)
63230fdc8d8SChris Lattner {
6336611103cSGreg Clayton     SBTarget sb_target;
6346611103cSGreg Clayton     if (m_opaque_sp)
635af67cecdSGreg Clayton     {
636af67cecdSGreg Clayton         // No need to lock, the target list is thread safe
6376611103cSGreg Clayton         sb_target.reset(m_opaque_sp->GetTargetList().GetTargetAtIndex (idx));
638af67cecdSGreg Clayton     }
63930fdc8d8SChris Lattner     return sb_target;
64030fdc8d8SChris Lattner }
64130fdc8d8SChris Lattner 
64230fdc8d8SChris Lattner SBTarget
64330fdc8d8SChris Lattner SBDebugger::FindTargetWithProcessID (pid_t pid)
64430fdc8d8SChris Lattner {
6456611103cSGreg Clayton     SBTarget sb_target;
6466611103cSGreg Clayton     if (m_opaque_sp)
647af67cecdSGreg Clayton     {
648af67cecdSGreg Clayton         // No need to lock, the target list is thread safe
6496611103cSGreg Clayton         sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid));
650af67cecdSGreg Clayton     }
65130fdc8d8SChris Lattner     return sb_target;
65230fdc8d8SChris Lattner }
65330fdc8d8SChris Lattner 
65430fdc8d8SChris Lattner SBTarget
65530fdc8d8SChris Lattner SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name)
65630fdc8d8SChris Lattner {
6576611103cSGreg Clayton     SBTarget sb_target;
6586611103cSGreg Clayton     if (m_opaque_sp && filename && filename[0])
6596611103cSGreg Clayton     {
660af67cecdSGreg Clayton         // No need to lock, the target list is thread safe
661eb0103f2SGreg Clayton         ArchSpec arch (arch_name, m_opaque_sp->GetPlatformList().GetSelectedPlatform().get());
662274060b6SGreg Clayton         TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename, false), arch_name ? &arch : NULL));
6636611103cSGreg Clayton         sb_target.reset(target_sp);
6646611103cSGreg Clayton     }
6656611103cSGreg Clayton     return sb_target;
66630fdc8d8SChris Lattner }
66730fdc8d8SChris Lattner 
66830fdc8d8SChris Lattner SBTarget
669431ce678SGreg Clayton SBDebugger::FindTargetWithLLDBProcess (const ProcessSP &process_sp)
67030fdc8d8SChris Lattner {
6716611103cSGreg Clayton     SBTarget sb_target;
6726611103cSGreg Clayton     if (m_opaque_sp)
673af67cecdSGreg Clayton     {
674af67cecdSGreg Clayton         // No need to lock, the target list is thread safe
6756611103cSGreg Clayton         sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get()));
676af67cecdSGreg Clayton     }
67730fdc8d8SChris Lattner     return sb_target;
67830fdc8d8SChris Lattner }
67930fdc8d8SChris Lattner 
68030fdc8d8SChris Lattner 
68130fdc8d8SChris Lattner uint32_t
68230fdc8d8SChris Lattner SBDebugger::GetNumTargets ()
68330fdc8d8SChris Lattner {
6846611103cSGreg Clayton     if (m_opaque_sp)
685af67cecdSGreg Clayton     {
686af67cecdSGreg Clayton         // No need to lock, the target list is thread safe
6876611103cSGreg Clayton         return m_opaque_sp->GetTargetList().GetNumTargets ();
688af67cecdSGreg Clayton     }
6896611103cSGreg Clayton     return 0;
6906611103cSGreg Clayton }
69130fdc8d8SChris Lattner 
69230fdc8d8SChris Lattner SBTarget
6932976d00aSJim Ingham SBDebugger::GetSelectedTarget ()
69430fdc8d8SChris Lattner {
695431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
696ceb6b139SCaroline Tice 
6976611103cSGreg Clayton     SBTarget sb_target;
6986611103cSGreg Clayton     if (m_opaque_sp)
699af67cecdSGreg Clayton     {
700af67cecdSGreg Clayton         // No need to lock, the target list is thread safe
7012976d00aSJim Ingham         sb_target.reset(m_opaque_sp->GetTargetList().GetSelectedTarget ());
702af67cecdSGreg Clayton     }
703ceb6b139SCaroline Tice 
704ceb6b139SCaroline Tice     if (log)
705ceb6b139SCaroline Tice     {
706ceb6b139SCaroline Tice         SBStream sstr;
707431ce678SGreg Clayton         sb_target.GetDescription (sstr, eDescriptionLevelBrief);
70893aa84e8SGreg Clayton         log->Printf ("SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s", m_opaque_sp.get(),
709750cd175SCaroline Tice                      sb_target.get(), sstr.GetData());
710ceb6b139SCaroline Tice     }
711ceb6b139SCaroline Tice 
71230fdc8d8SChris Lattner     return sb_target;
71330fdc8d8SChris Lattner }
71430fdc8d8SChris Lattner 
71530fdc8d8SChris Lattner void
716e64f0dc7SJim Ingham SBDebugger::SetSelectedTarget (SBTarget &sb_target)
717e64f0dc7SJim Ingham {
718e64f0dc7SJim Ingham     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
719e64f0dc7SJim Ingham 
720e64f0dc7SJim Ingham     if (m_opaque_sp)
721e64f0dc7SJim Ingham     {
722e64f0dc7SJim Ingham         m_opaque_sp->GetTargetList().SetSelectedTarget (sb_target.get());
723e64f0dc7SJim Ingham     }
724e64f0dc7SJim Ingham     if (log)
725e64f0dc7SJim Ingham     {
726e64f0dc7SJim Ingham         SBStream sstr;
727e64f0dc7SJim Ingham         sb_target.GetDescription (sstr, eDescriptionLevelBrief);
728e64f0dc7SJim Ingham         log->Printf ("SBDebugger(%p)::SetSelectedTarget () => SBTarget(%p): %s", m_opaque_sp.get(),
729e64f0dc7SJim Ingham                      sb_target.get(), sstr.GetData());
730e64f0dc7SJim Ingham     }
731e64f0dc7SJim Ingham }
732e64f0dc7SJim Ingham 
733e64f0dc7SJim Ingham void
73430fdc8d8SChris Lattner SBDebugger::DispatchInput (void *baton, const void *data, size_t data_len)
73530fdc8d8SChris Lattner {
736431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
737ceb6b139SCaroline Tice 
738ceb6b139SCaroline Tice     if (log)
739cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::DispatchInput (baton=%p, data=\"%.*s\", size_t=%zu)", m_opaque_sp.get(),
740cfd1acedSGreg Clayton                      baton, (int) data_len, (const char *) data, data_len);
741ceb6b139SCaroline Tice 
7426611103cSGreg Clayton     if (m_opaque_sp)
7436611103cSGreg Clayton         m_opaque_sp->DispatchInput ((const char *) data, data_len);
74430fdc8d8SChris Lattner }
74530fdc8d8SChris Lattner 
74630fdc8d8SChris Lattner void
747efed6131SCaroline Tice SBDebugger::DispatchInputInterrupt ()
748efed6131SCaroline Tice {
749efed6131SCaroline Tice     if (m_opaque_sp)
750efed6131SCaroline Tice         m_opaque_sp->DispatchInputInterrupt ();
751efed6131SCaroline Tice }
752efed6131SCaroline Tice 
753efed6131SCaroline Tice void
754efed6131SCaroline Tice SBDebugger::DispatchInputEndOfFile ()
755efed6131SCaroline Tice {
756efed6131SCaroline Tice     if (m_opaque_sp)
757efed6131SCaroline Tice         m_opaque_sp->DispatchInputEndOfFile ();
758efed6131SCaroline Tice }
7599088b068SCaroline Tice 
7609088b068SCaroline Tice bool
7619088b068SCaroline Tice SBDebugger::InputReaderIsTopReader (const lldb::SBInputReader &reader)
7629088b068SCaroline Tice {
7639088b068SCaroline Tice     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
7649088b068SCaroline Tice 
7659088b068SCaroline Tice     if (log)
7669088b068SCaroline Tice         log->Printf ("SBDebugger(%p)::InputReaderIsTopReader (SBInputReader(%p))", m_opaque_sp.get(), &reader);
7679088b068SCaroline Tice 
7689088b068SCaroline Tice     if (m_opaque_sp && reader.IsValid())
7699088b068SCaroline Tice     {
7709088b068SCaroline Tice         InputReaderSP reader_sp (*reader);
7719088b068SCaroline Tice         return m_opaque_sp->InputReaderIsTopReader (reader_sp);
7729088b068SCaroline Tice     }
7739088b068SCaroline Tice 
7749088b068SCaroline Tice     return false;
7759088b068SCaroline Tice }
7769088b068SCaroline Tice 
777efed6131SCaroline Tice 
778efed6131SCaroline Tice void
77930fdc8d8SChris Lattner SBDebugger::PushInputReader (SBInputReader &reader)
78030fdc8d8SChris Lattner {
781431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
782ceb6b139SCaroline Tice 
783ceb6b139SCaroline Tice     if (log)
78493aa84e8SGreg Clayton         log->Printf ("SBDebugger(%p)::PushInputReader (SBInputReader(%p))", m_opaque_sp.get(), &reader);
785ceb6b139SCaroline Tice 
7866611103cSGreg Clayton     if (m_opaque_sp && reader.IsValid())
78730fdc8d8SChris Lattner     {
788af67cecdSGreg Clayton         TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
789af67cecdSGreg Clayton         Mutex::Locker api_locker;
790af67cecdSGreg Clayton         if (target_sp)
791af67cecdSGreg Clayton             api_locker.Reset(target_sp->GetAPIMutex().GetMutex());
79230fdc8d8SChris Lattner         InputReaderSP reader_sp(*reader);
7936611103cSGreg Clayton         m_opaque_sp->PushInputReader (reader_sp);
79430fdc8d8SChris Lattner     }
79530fdc8d8SChris Lattner }
7966611103cSGreg Clayton 
7976611103cSGreg Clayton void
798969ed3d1SCaroline Tice SBDebugger::NotifyTopInputReader (InputReaderAction notification)
799969ed3d1SCaroline Tice {
800969ed3d1SCaroline Tice     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
801969ed3d1SCaroline Tice 
802969ed3d1SCaroline Tice     if (log)
803969ed3d1SCaroline Tice         log->Printf ("SBDebugger(%p)::NotifyTopInputReader (%d)", m_opaque_sp.get(), notification);
804969ed3d1SCaroline Tice 
805969ed3d1SCaroline Tice     if (m_opaque_sp)
806969ed3d1SCaroline Tice         m_opaque_sp->NotifyTopInputReader (notification);
807969ed3d1SCaroline Tice }
808969ed3d1SCaroline Tice 
809969ed3d1SCaroline Tice void
810431ce678SGreg Clayton SBDebugger::reset (const DebuggerSP &debugger_sp)
8116611103cSGreg Clayton {
8126611103cSGreg Clayton     m_opaque_sp = debugger_sp;
8136611103cSGreg Clayton }
8146611103cSGreg Clayton 
8156611103cSGreg Clayton Debugger *
8166611103cSGreg Clayton SBDebugger::get () const
8176611103cSGreg Clayton {
8186611103cSGreg Clayton     return m_opaque_sp.get();
8196611103cSGreg Clayton }
8206611103cSGreg Clayton 
8216611103cSGreg Clayton Debugger &
8226611103cSGreg Clayton SBDebugger::ref () const
8236611103cSGreg Clayton {
8246611103cSGreg Clayton     assert (m_opaque_sp.get());
8256611103cSGreg Clayton     return *m_opaque_sp;
8266611103cSGreg Clayton }
8276611103cSGreg Clayton 
828*9a37766eSGreg Clayton const lldb::DebuggerSP &
829*9a37766eSGreg Clayton SBDebugger::get_sp () const
830*9a37766eSGreg Clayton {
831*9a37766eSGreg Clayton     return m_opaque_sp;
832*9a37766eSGreg Clayton }
8336611103cSGreg Clayton 
834ebc1bb27SCaroline Tice SBDebugger
835ebc1bb27SCaroline Tice SBDebugger::FindDebuggerWithID (int id)
836ebc1bb27SCaroline Tice {
837af67cecdSGreg Clayton     // No need to lock, the debugger list is thread safe
838ebc1bb27SCaroline Tice     SBDebugger sb_debugger;
839431ce678SGreg Clayton     DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id);
840ebc1bb27SCaroline Tice     if (debugger_sp)
841ebc1bb27SCaroline Tice         sb_debugger.reset (debugger_sp);
842ebc1bb27SCaroline Tice     return sb_debugger;
843ebc1bb27SCaroline Tice }
844e40e4218SJim Ingham 
845dd759857SCaroline Tice const char *
846dd759857SCaroline Tice SBDebugger::GetInstanceName()
847dd759857SCaroline Tice {
848dd759857SCaroline Tice     if (m_opaque_sp)
849dd759857SCaroline Tice         return m_opaque_sp->GetInstanceName().AsCString();
850dd759857SCaroline Tice     else
851dd759857SCaroline Tice         return NULL;
852dd759857SCaroline Tice }
853dd759857SCaroline Tice 
8543df9a8dfSCaroline Tice SBError
855dd759857SCaroline Tice SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name)
8563df9a8dfSCaroline Tice {
857431ce678SGreg Clayton     UserSettingsControllerSP root_settings_controller = Debugger::GetSettingsController();
8583df9a8dfSCaroline Tice 
859e0d378b3SGreg Clayton     Error err = root_settings_controller->SetVariable (var_name,
860e0d378b3SGreg Clayton                                                        value,
861e0d378b3SGreg Clayton                                                        eVarSetOperationAssign,
862e0d378b3SGreg Clayton                                                        true,
863101c7c20SCaroline Tice                                                        debugger_instance_name);
8643df9a8dfSCaroline Tice     SBError sb_error;
8653df9a8dfSCaroline Tice     sb_error.SetError (err);
8663df9a8dfSCaroline Tice 
8673df9a8dfSCaroline Tice     return sb_error;
8683df9a8dfSCaroline Tice }
8693df9a8dfSCaroline Tice 
870431ce678SGreg Clayton SBStringList
871dd759857SCaroline Tice SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name)
8723df9a8dfSCaroline Tice {
8733df9a8dfSCaroline Tice     SBStringList ret_value;
874e0d378b3SGreg Clayton     SettableVariableType var_type;
875431ce678SGreg Clayton     Error err;
876101c7c20SCaroline Tice 
877431ce678SGreg Clayton     UserSettingsControllerSP root_settings_controller = Debugger::GetSettingsController();
8783df9a8dfSCaroline Tice 
879daccaa9eSCaroline Tice     StringList value = root_settings_controller->GetVariable (var_name, var_type, debugger_instance_name, err);
880daccaa9eSCaroline Tice 
881daccaa9eSCaroline Tice     if (err.Success())
882daccaa9eSCaroline Tice     {
883311adf3dSChris Lattner         for (unsigned i = 0; i != value.GetSize(); ++i)
8843df9a8dfSCaroline Tice             ret_value.AppendString (value.GetStringAtIndex(i));
885daccaa9eSCaroline Tice     }
886daccaa9eSCaroline Tice     else
887daccaa9eSCaroline Tice     {
888daccaa9eSCaroline Tice         ret_value.AppendString (err.AsCString());
889daccaa9eSCaroline Tice     }
890daccaa9eSCaroline Tice 
8913df9a8dfSCaroline Tice 
8923df9a8dfSCaroline Tice     return ret_value;
8933df9a8dfSCaroline Tice }
8943df9a8dfSCaroline Tice 
895a7015092SGreg Clayton uint32_t
896a7015092SGreg Clayton SBDebugger::GetTerminalWidth () const
897a7015092SGreg Clayton {
898a7015092SGreg Clayton     if (m_opaque_sp)
899a7015092SGreg Clayton         return m_opaque_sp->GetTerminalWidth ();
900a7015092SGreg Clayton     return 0;
901a7015092SGreg Clayton }
902a7015092SGreg Clayton 
903a7015092SGreg Clayton void
904a7015092SGreg Clayton SBDebugger::SetTerminalWidth (uint32_t term_width)
905a7015092SGreg Clayton {
906a7015092SGreg Clayton     if (m_opaque_sp)
907a7015092SGreg Clayton         m_opaque_sp->SetTerminalWidth (term_width);
908a7015092SGreg Clayton }
909a7015092SGreg Clayton 
910a7015092SGreg Clayton const char *
911a7015092SGreg Clayton SBDebugger::GetPrompt() const
912a7015092SGreg Clayton {
913431ce678SGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
914ceb6b139SCaroline Tice 
915ceb6b139SCaroline Tice     if (log)
916cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::GetPrompt () => \"%s\"", m_opaque_sp.get(),
917750cd175SCaroline Tice                      (m_opaque_sp ? m_opaque_sp->GetPrompt() : ""));
918ceb6b139SCaroline Tice 
919a7015092SGreg Clayton     if (m_opaque_sp)
920a7015092SGreg Clayton         return m_opaque_sp->GetPrompt ();
921a7015092SGreg Clayton     return 0;
922a7015092SGreg Clayton }
923a7015092SGreg Clayton 
924a7015092SGreg Clayton void
925a7015092SGreg Clayton SBDebugger::SetPrompt (const char *prompt)
926a7015092SGreg Clayton {
927a7015092SGreg Clayton     if (m_opaque_sp)
928a7015092SGreg Clayton         m_opaque_sp->SetPrompt (prompt);
929a7015092SGreg Clayton }
930a7015092SGreg Clayton 
931a7015092SGreg Clayton 
932431ce678SGreg Clayton ScriptLanguage
933a7015092SGreg Clayton SBDebugger::GetScriptLanguage() const
934a7015092SGreg Clayton {
935a7015092SGreg Clayton     if (m_opaque_sp)
936a7015092SGreg Clayton         return m_opaque_sp->GetScriptLanguage ();
937a7015092SGreg Clayton     return eScriptLanguageNone;
938a7015092SGreg Clayton }
939a7015092SGreg Clayton 
940a7015092SGreg Clayton void
941431ce678SGreg Clayton SBDebugger::SetScriptLanguage (ScriptLanguage script_lang)
942a7015092SGreg Clayton {
943a7015092SGreg Clayton     if (m_opaque_sp)
944af67cecdSGreg Clayton     {
945a7015092SGreg Clayton         m_opaque_sp->SetScriptLanguage (script_lang);
946a7015092SGreg Clayton     }
947af67cecdSGreg Clayton }
948a7015092SGreg Clayton 
949e40e4218SJim Ingham bool
950e40e4218SJim Ingham SBDebugger::SetUseExternalEditor (bool value)
951e40e4218SJim Ingham {
952e40e4218SJim Ingham     if (m_opaque_sp)
953e40e4218SJim Ingham         return m_opaque_sp->SetUseExternalEditor (value);
954e40e4218SJim Ingham     return false;
955e40e4218SJim Ingham }
956e40e4218SJim Ingham 
957e40e4218SJim Ingham bool
958daccaa9eSCaroline Tice SBDebugger::GetUseExternalEditor ()
959e40e4218SJim Ingham {
960e40e4218SJim Ingham     if (m_opaque_sp)
961daccaa9eSCaroline Tice         return m_opaque_sp->GetUseExternalEditor ();
962e40e4218SJim Ingham     return false;
963e40e4218SJim Ingham }
964e40e4218SJim Ingham 
965dde9cff3SCaroline Tice bool
966dde9cff3SCaroline Tice SBDebugger::GetDescription (SBStream &description)
967dde9cff3SCaroline Tice {
968dde9cff3SCaroline Tice     if (m_opaque_sp)
969dde9cff3SCaroline Tice     {
970dde9cff3SCaroline Tice         const char *name = m_opaque_sp->GetInstanceName().AsCString();
971431ce678SGreg Clayton         user_id_t id = m_opaque_sp->GetID();
972cfd1acedSGreg Clayton         description.Printf ("Debugger (instance: \"%s\", id: %d)", name, id);
973dde9cff3SCaroline Tice     }
974dde9cff3SCaroline Tice     else
975dde9cff3SCaroline Tice         description.Printf ("No value");
976dde9cff3SCaroline Tice 
977dde9cff3SCaroline Tice     return true;
978dde9cff3SCaroline Tice }
979efed6131SCaroline Tice 
980431ce678SGreg Clayton user_id_t
981efed6131SCaroline Tice SBDebugger::GetID()
982efed6131SCaroline Tice {
983efed6131SCaroline Tice     if (m_opaque_sp)
984efed6131SCaroline Tice         return m_opaque_sp->GetID();
985efed6131SCaroline Tice     return LLDB_INVALID_UID;
986efed6131SCaroline Tice }
9872289fa48SGreg Clayton 
9882289fa48SGreg Clayton 
9892289fa48SGreg Clayton SBError
9902289fa48SGreg Clayton SBDebugger::SetCurrentPlatform (const char *platform_name)
9912289fa48SGreg Clayton {
9922289fa48SGreg Clayton     SBError sb_error;
9932289fa48SGreg Clayton     if (m_opaque_sp)
9942289fa48SGreg Clayton     {
9952289fa48SGreg Clayton         PlatformSP platform_sp (Platform::Create (platform_name, sb_error.ref()));
9962289fa48SGreg Clayton 
9972289fa48SGreg Clayton         if (platform_sp)
9982289fa48SGreg Clayton         {
9992289fa48SGreg Clayton             bool make_selected = true;
10002289fa48SGreg Clayton             m_opaque_sp->GetPlatformList().Append (platform_sp, make_selected);
10012289fa48SGreg Clayton         }
10022289fa48SGreg Clayton     }
10032289fa48SGreg Clayton     return sb_error;
10042289fa48SGreg Clayton }
10052289fa48SGreg Clayton 
1006fc3f027dSGreg Clayton bool
1007f3dd93c8SGreg Clayton SBDebugger::SetCurrentPlatformSDKRoot (const char *sysroot)
1008f3dd93c8SGreg Clayton {
1009f3dd93c8SGreg Clayton     if (m_opaque_sp)
1010f3dd93c8SGreg Clayton     {
1011f3dd93c8SGreg Clayton         PlatformSP platform_sp (m_opaque_sp->GetPlatformList().GetSelectedPlatform());
1012f3dd93c8SGreg Clayton 
1013f3dd93c8SGreg Clayton         if (platform_sp)
1014f3dd93c8SGreg Clayton         {
1015f3dd93c8SGreg Clayton             platform_sp->SetSDKRootDirectory (ConstString (sysroot));
1016f3dd93c8SGreg Clayton             return true;
1017f3dd93c8SGreg Clayton         }
1018f3dd93c8SGreg Clayton     }
1019f3dd93c8SGreg Clayton     return false;
1020f3dd93c8SGreg Clayton }
1021f3dd93c8SGreg Clayton 
1022f3dd93c8SGreg Clayton bool
1023fc3f027dSGreg Clayton SBDebugger::GetCloseInputOnEOF () const
1024fc3f027dSGreg Clayton {
1025fc3f027dSGreg Clayton     if (m_opaque_sp)
1026fc3f027dSGreg Clayton         return m_opaque_sp->GetCloseInputOnEOF ();
1027fc3f027dSGreg Clayton     return false;
1028fc3f027dSGreg Clayton }
1029fc3f027dSGreg Clayton 
1030fc3f027dSGreg Clayton void
1031fc3f027dSGreg Clayton SBDebugger::SetCloseInputOnEOF (bool b)
1032fc3f027dSGreg Clayton {
1033fc3f027dSGreg Clayton     if (m_opaque_sp)
1034fc3f027dSGreg Clayton         m_opaque_sp->SetCloseInputOnEOF (b);
1035fc3f027dSGreg Clayton }
1036