SBDebugger.cpp revision 263367
1//===-- SBDebugger.cpp ------------------------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/lldb-python.h"
11
12#include "lldb/API/SBDebugger.h"
13
14#include "lldb/lldb-private.h"
15
16#include "lldb/API/SBListener.h"
17#include "lldb/API/SBBroadcaster.h"
18#include "lldb/API/SBCommandInterpreter.h"
19#include "lldb/API/SBCommandReturnObject.h"
20#include "lldb/API/SBError.h"
21#include "lldb/API/SBEvent.h"
22#include "lldb/API/SBFrame.h"
23#include "lldb/API/SBInputReader.h"
24#include "lldb/API/SBProcess.h"
25#include "lldb/API/SBSourceManager.h"
26#include "lldb/API/SBStream.h"
27#include "lldb/API/SBStringList.h"
28#include "lldb/API/SBTarget.h"
29#include "lldb/API/SBThread.h"
30#include "lldb/API/SBTypeCategory.h"
31#include "lldb/API/SBTypeFormat.h"
32#include "lldb/API/SBTypeFilter.h"
33#include "lldb/API/SBTypeNameSpecifier.h"
34#include "lldb/API/SBTypeSummary.h"
35#include "lldb/API/SBTypeSynthetic.h"
36
37
38#include "lldb/Core/Debugger.h"
39#include "lldb/Core/State.h"
40#include "lldb/DataFormatters/DataVisualization.h"
41#include "lldb/Host/DynamicLibrary.h"
42#include "lldb/Interpreter/Args.h"
43#include "lldb/Interpreter/CommandInterpreter.h"
44#include "lldb/Interpreter/OptionGroupPlatform.h"
45#include "lldb/Target/Process.h"
46#include "lldb/Target/TargetList.h"
47
48using namespace lldb;
49using namespace lldb_private;
50
51
52static lldb::DynamicLibrarySP
53LoadPlugin (const lldb::DebuggerSP &debugger_sp, const FileSpec& spec, Error& error)
54{
55    lldb::DynamicLibrarySP dynlib_sp(new lldb_private::DynamicLibrary(spec));
56    if (dynlib_sp && dynlib_sp->IsValid())
57    {
58        typedef bool (*LLDBCommandPluginInit) (lldb::SBDebugger& debugger);
59
60        lldb::SBDebugger debugger_sb(debugger_sp);
61        // This calls the bool lldb::PluginInitialize(lldb::SBDebugger debugger) function.
62        // TODO: mangle this differently for your system - on OSX, the first underscore needs to be removed and the second one stays
63        LLDBCommandPluginInit init_func = dynlib_sp->GetSymbol<LLDBCommandPluginInit>("_ZN4lldb16PluginInitializeENS_10SBDebuggerE");
64        if (init_func)
65        {
66            if (init_func(debugger_sb))
67                return dynlib_sp;
68            else
69                error.SetErrorString("plug-in refused to load (lldb::PluginInitialize(lldb::SBDebugger) returned false)");
70        }
71        else
72        {
73            error.SetErrorString("plug-in is missing the required initialization: lldb::PluginInitialize(lldb::SBDebugger)");
74        }
75    }
76    else
77    {
78        if (spec.Exists())
79            error.SetErrorString("this file does not represent a loadable dylib");
80        else
81            error.SetErrorString("no such file");
82    }
83    return lldb::DynamicLibrarySP();
84}
85
86void
87SBDebugger::Initialize ()
88{
89    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
90
91    if (log)
92        log->Printf ("SBDebugger::Initialize ()");
93
94    SBCommandInterpreter::InitializeSWIG ();
95
96    Debugger::Initialize(LoadPlugin);
97}
98
99void
100SBDebugger::Terminate ()
101{
102    Debugger::Terminate();
103}
104
105void
106SBDebugger::Clear ()
107{
108    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
109
110    if (log)
111        log->Printf ("SBDebugger(%p)::Clear ()", m_opaque_sp.get());
112
113    if (m_opaque_sp)
114        m_opaque_sp->CleanUpInputReaders ();
115
116    m_opaque_sp.reset();
117}
118
119SBDebugger
120SBDebugger::Create()
121{
122    return SBDebugger::Create(false, NULL, NULL);
123}
124
125SBDebugger
126SBDebugger::Create(bool source_init_files)
127{
128    return SBDebugger::Create (source_init_files, NULL, NULL);
129}
130
131SBDebugger
132SBDebugger::Create(bool source_init_files, lldb::LogOutputCallback callback, void *baton)
133
134{
135    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
136
137    SBDebugger debugger;
138    debugger.reset(Debugger::CreateInstance(callback, baton));
139
140    if (log)
141    {
142        SBStream sstr;
143        debugger.GetDescription (sstr);
144        log->Printf ("SBDebugger::Create () => SBDebugger(%p): %s", debugger.m_opaque_sp.get(), sstr.GetData());
145    }
146
147    SBCommandInterpreter interp = debugger.GetCommandInterpreter();
148    if (source_init_files)
149    {
150        interp.get()->SkipLLDBInitFiles(false);
151        interp.get()->SkipAppInitFiles (false);
152        SBCommandReturnObject result;
153        interp.SourceInitFileInHomeDirectory(result);
154    }
155    else
156    {
157        interp.get()->SkipLLDBInitFiles(true);
158        interp.get()->SkipAppInitFiles (true);
159    }
160    return debugger;
161}
162
163void
164SBDebugger::Destroy (SBDebugger &debugger)
165{
166    Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
167
168    if (log)
169    {
170        SBStream sstr;
171        debugger.GetDescription (sstr);
172        log->Printf ("SBDebugger::Destroy () => SBDebugger(%p): %s", debugger.m_opaque_sp.get(), sstr.GetData());
173    }
174
175    Debugger::Destroy (debugger.m_opaque_sp);
176
177    if (debugger.m_opaque_sp.get() != NULL)
178        debugger.m_opaque_sp.reset();
179}
180
181void
182SBDebugger::MemoryPressureDetected ()
183{
184    // Since this function can be call asynchronously, we allow it to be
185    // non-mandatory. We have seen deadlocks with this function when called
186    // so we need to safeguard against this until we can determine what is
187    // causing the deadlocks.
188    Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
189
190    const bool mandatory = false;
191    if (log)
192    {
193        log->Printf ("SBDebugger::MemoryPressureDetected (), mandatory = %d", mandatory);
194    }
195
196    ModuleList::RemoveOrphanSharedModules(mandatory);
197}
198
199SBDebugger::SBDebugger () :
200    m_opaque_sp ()
201{
202}
203
204SBDebugger::SBDebugger(const lldb::DebuggerSP &debugger_sp) :
205    m_opaque_sp(debugger_sp)
206{
207}
208
209SBDebugger::SBDebugger(const SBDebugger &rhs) :
210    m_opaque_sp (rhs.m_opaque_sp)
211{
212}
213
214SBDebugger &
215SBDebugger::operator = (const SBDebugger &rhs)
216{
217    if (this != &rhs)
218    {
219        m_opaque_sp = rhs.m_opaque_sp;
220    }
221    return *this;
222}
223
224SBDebugger::~SBDebugger ()
225{
226}
227
228bool
229SBDebugger::IsValid() const
230{
231    return m_opaque_sp.get() != NULL;
232}
233
234
235void
236SBDebugger::SetAsync (bool b)
237{
238    if (m_opaque_sp)
239        m_opaque_sp->SetAsyncExecution(b);
240}
241
242bool
243SBDebugger::GetAsync ()
244{
245    if (m_opaque_sp)
246        return m_opaque_sp->GetAsyncExecution();
247    else
248        return false;
249}
250
251void
252SBDebugger::SkipLLDBInitFiles (bool b)
253{
254    if (m_opaque_sp)
255        m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles (b);
256}
257
258void
259SBDebugger::SkipAppInitFiles (bool b)
260{
261    if (m_opaque_sp)
262        m_opaque_sp->GetCommandInterpreter().SkipAppInitFiles (b);
263}
264
265// Shouldn't really be settable after initialization as this could cause lots of problems; don't want users
266// trying to switch modes in the middle of a debugging session.
267void
268SBDebugger::SetInputFileHandle (FILE *fh, bool transfer_ownership)
269{
270    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
271
272    if (log)
273        log->Printf ("SBDebugger(%p)::SetInputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
274                     fh, transfer_ownership);
275
276    if (m_opaque_sp)
277        m_opaque_sp->SetInputFileHandle (fh, transfer_ownership);
278}
279
280void
281SBDebugger::SetOutputFileHandle (FILE *fh, bool transfer_ownership)
282{
283    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
284
285
286    if (log)
287        log->Printf ("SBDebugger(%p)::SetOutputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
288                     fh, transfer_ownership);
289
290    if (m_opaque_sp)
291        m_opaque_sp->SetOutputFileHandle (fh, transfer_ownership);
292}
293
294void
295SBDebugger::SetErrorFileHandle (FILE *fh, bool transfer_ownership)
296{
297    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
298
299
300    if (log)
301        log->Printf ("SBDebugger(%p)::SetErrorFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
302                     fh, transfer_ownership);
303
304    if (m_opaque_sp)
305        m_opaque_sp->SetErrorFileHandle (fh, transfer_ownership);
306}
307
308FILE *
309SBDebugger::GetInputFileHandle ()
310{
311    if (m_opaque_sp)
312        return m_opaque_sp->GetInputFile().GetStream();
313    return NULL;
314}
315
316FILE *
317SBDebugger::GetOutputFileHandle ()
318{
319    if (m_opaque_sp)
320        return m_opaque_sp->GetOutputFile().GetStream();
321    return NULL;
322}
323
324FILE *
325SBDebugger::GetErrorFileHandle ()
326{
327    if (m_opaque_sp)
328        return m_opaque_sp->GetErrorFile().GetStream();
329    return NULL;
330}
331
332void
333SBDebugger::SaveInputTerminalState()
334{
335    if (m_opaque_sp)
336        m_opaque_sp->SaveInputTerminalState();
337}
338
339void
340SBDebugger::RestoreInputTerminalState()
341{
342    if (m_opaque_sp)
343        m_opaque_sp->RestoreInputTerminalState();
344
345}
346SBCommandInterpreter
347SBDebugger::GetCommandInterpreter ()
348{
349    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
350
351    SBCommandInterpreter sb_interpreter;
352    if (m_opaque_sp)
353        sb_interpreter.reset (&m_opaque_sp->GetCommandInterpreter());
354
355    if (log)
356        log->Printf ("SBDebugger(%p)::GetCommandInterpreter () => SBCommandInterpreter(%p)",
357                     m_opaque_sp.get(), sb_interpreter.get());
358
359    return sb_interpreter;
360}
361
362void
363SBDebugger::HandleCommand (const char *command)
364{
365    if (m_opaque_sp)
366    {
367        TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
368        Mutex::Locker api_locker;
369        if (target_sp)
370            api_locker.Lock(target_sp->GetAPIMutex());
371
372        SBCommandInterpreter sb_interpreter(GetCommandInterpreter ());
373        SBCommandReturnObject result;
374
375        sb_interpreter.HandleCommand (command, result, false);
376
377        if (GetErrorFileHandle() != NULL)
378            result.PutError (GetErrorFileHandle());
379        if (GetOutputFileHandle() != NULL)
380            result.PutOutput (GetOutputFileHandle());
381
382        if (m_opaque_sp->GetAsyncExecution() == false)
383        {
384            SBProcess process(GetCommandInterpreter().GetProcess ());
385            ProcessSP process_sp (process.GetSP());
386            if (process_sp)
387            {
388                EventSP event_sp;
389                Listener &lldb_listener = m_opaque_sp->GetListener();
390                while (lldb_listener.GetNextEventForBroadcaster (process_sp.get(), event_sp))
391                {
392                    SBEvent event(event_sp);
393                    HandleProcessEvent (process, event, GetOutputFileHandle(), GetErrorFileHandle());
394                }
395            }
396        }
397    }
398}
399
400SBListener
401SBDebugger::GetListener ()
402{
403    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
404
405    SBListener sb_listener;
406    if (m_opaque_sp)
407        sb_listener.reset(&m_opaque_sp->GetListener(), false);
408
409    if (log)
410        log->Printf ("SBDebugger(%p)::GetListener () => SBListener(%p)", m_opaque_sp.get(),
411                     sb_listener.get());
412
413    return sb_listener;
414}
415
416void
417SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, FILE *out, FILE *err)
418{
419    if (!process.IsValid())
420        return;
421
422    TargetSP target_sp (process.GetTarget().GetSP());
423    if (!target_sp)
424        return;
425
426    const uint32_t event_type = event.GetType();
427    char stdio_buffer[1024];
428    size_t len;
429
430    Mutex::Locker api_locker (target_sp->GetAPIMutex());
431
432    if (event_type & (Process::eBroadcastBitSTDOUT | Process::eBroadcastBitStateChanged))
433    {
434        // Drain stdout when we stop just in case we have any bytes
435        while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
436            if (out != NULL)
437                ::fwrite (stdio_buffer, 1, len, out);
438    }
439
440    if (event_type & (Process::eBroadcastBitSTDERR | Process::eBroadcastBitStateChanged))
441    {
442        // Drain stderr when we stop just in case we have any bytes
443        while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
444            if (err != NULL)
445                ::fwrite (stdio_buffer, 1, len, err);
446    }
447
448    if (event_type & Process::eBroadcastBitStateChanged)
449    {
450        StateType event_state = SBProcess::GetStateFromEvent (event);
451
452        if (event_state == eStateInvalid)
453            return;
454
455        bool is_stopped = StateIsStoppedState (event_state);
456        if (!is_stopped)
457            process.ReportEventState (event, out);
458    }
459}
460
461SBSourceManager
462SBDebugger::GetSourceManager ()
463{
464    SBSourceManager sb_source_manager (*this);
465    return sb_source_manager;
466}
467
468
469bool
470SBDebugger::GetDefaultArchitecture (char *arch_name, size_t arch_name_len)
471{
472    if (arch_name && arch_name_len)
473    {
474        ArchSpec default_arch = Target::GetDefaultArchitecture ();
475
476        if (default_arch.IsValid())
477        {
478            const std::string &triple_str = default_arch.GetTriple().str();
479            if (!triple_str.empty())
480                ::snprintf (arch_name, arch_name_len, "%s", triple_str.c_str());
481            else
482                ::snprintf (arch_name, arch_name_len, "%s", default_arch.GetArchitectureName());
483            return true;
484        }
485    }
486    if (arch_name && arch_name_len)
487        arch_name[0] = '\0';
488    return false;
489}
490
491
492bool
493SBDebugger::SetDefaultArchitecture (const char *arch_name)
494{
495    if (arch_name)
496    {
497        ArchSpec arch (arch_name);
498        if (arch.IsValid())
499        {
500            Target::SetDefaultArchitecture (arch);
501            return true;
502        }
503    }
504    return false;
505}
506
507ScriptLanguage
508SBDebugger::GetScriptingLanguage (const char *script_language_name)
509{
510
511    return Args::StringToScriptLanguage (script_language_name,
512                                         eScriptLanguageDefault,
513                                         NULL);
514}
515
516const char *
517SBDebugger::GetVersionString ()
518{
519    return lldb_private::GetVersion();
520}
521
522const char *
523SBDebugger::StateAsCString (StateType state)
524{
525    return lldb_private::StateAsCString (state);
526}
527
528bool
529SBDebugger::StateIsRunningState (StateType state)
530{
531    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
532
533    const bool result = lldb_private::StateIsRunningState (state);
534    if (log)
535        log->Printf ("SBDebugger::StateIsRunningState (state=%s) => %i",
536                     StateAsCString (state), result);
537
538    return result;
539}
540
541bool
542SBDebugger::StateIsStoppedState (StateType state)
543{
544    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
545
546    const bool result = lldb_private::StateIsStoppedState (state, false);
547    if (log)
548        log->Printf ("SBDebugger::StateIsStoppedState (state=%s) => %i",
549                     StateAsCString (state), result);
550
551    return result;
552}
553
554lldb::SBTarget
555SBDebugger::CreateTarget (const char *filename,
556                          const char *target_triple,
557                          const char *platform_name,
558                          bool add_dependent_modules,
559                          lldb::SBError& sb_error)
560{
561    SBTarget sb_target;
562    TargetSP target_sp;
563    if (m_opaque_sp)
564    {
565        sb_error.Clear();
566        OptionGroupPlatform platform_options (false);
567        platform_options.SetPlatformName (platform_name);
568
569        sb_error.ref() = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
570                                                                    filename,
571                                                                    target_triple,
572                                                                    add_dependent_modules,
573                                                                    &platform_options,
574                                                                    target_sp);
575
576        if (sb_error.Success())
577            sb_target.SetSP (target_sp);
578    }
579    else
580    {
581        sb_error.SetErrorString("invalid target");
582    }
583
584    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
585    if (log)
586    {
587        log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\", triple=%s, platform_name=%s, add_dependent_modules=%u, error=%s) => SBTarget(%p)",
588                     m_opaque_sp.get(),
589                     filename,
590                     target_triple,
591                     platform_name,
592                     add_dependent_modules,
593                     sb_error.GetCString(),
594                     target_sp.get());
595    }
596
597    return sb_target;
598}
599
600SBTarget
601SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename,
602                                                 const char *target_triple)
603{
604    SBTarget sb_target;
605    TargetSP target_sp;
606    if (m_opaque_sp)
607    {
608        const bool add_dependent_modules = true;
609        Error error (m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
610                                                                filename,
611                                                                target_triple,
612                                                                add_dependent_modules,
613                                                                NULL,
614                                                                target_sp));
615        sb_target.SetSP (target_sp);
616    }
617
618    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
619    if (log)
620    {
621        log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndTargetTriple (filename=\"%s\", triple=%s) => SBTarget(%p)",
622                     m_opaque_sp.get(), filename, target_triple, target_sp.get());
623    }
624
625    return sb_target;
626}
627
628SBTarget
629SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *arch_cstr)
630{
631    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
632
633    SBTarget sb_target;
634    TargetSP target_sp;
635    if (m_opaque_sp)
636    {
637        Error error;
638        const bool add_dependent_modules = true;
639
640        error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
641                                                           filename,
642                                                           arch_cstr,
643                                                           add_dependent_modules,
644                                                           NULL,
645                                                           target_sp);
646
647        if (error.Success())
648        {
649            m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
650            sb_target.SetSP (target_sp);
651        }
652    }
653
654    if (log)
655    {
656        log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndArch (filename=\"%s\", arch=%s) => SBTarget(%p)",
657                     m_opaque_sp.get(), filename, arch_cstr, target_sp.get());
658    }
659
660    return sb_target;
661}
662
663SBTarget
664SBDebugger::CreateTarget (const char *filename)
665{
666    SBTarget sb_target;
667    TargetSP target_sp;
668    if (m_opaque_sp)
669    {
670        ArchSpec arch = Target::GetDefaultArchitecture ();
671        Error error;
672        const bool add_dependent_modules = true;
673
674        PlatformSP platform_sp(m_opaque_sp->GetPlatformList().GetSelectedPlatform());
675        error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
676                                                           filename,
677                                                           arch,
678                                                           add_dependent_modules,
679                                                           platform_sp,
680                                                           target_sp);
681
682        if (error.Success())
683        {
684            m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
685            sb_target.SetSP (target_sp);
686        }
687    }
688    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
689    if (log)
690    {
691        log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)",
692                     m_opaque_sp.get(), filename, target_sp.get());
693    }
694    return sb_target;
695}
696
697bool
698SBDebugger::DeleteTarget (lldb::SBTarget &target)
699{
700    bool result = false;
701    if (m_opaque_sp)
702    {
703        TargetSP target_sp(target.GetSP());
704        if (target_sp)
705        {
706            // No need to lock, the target list is thread safe
707            result = m_opaque_sp->GetTargetList().DeleteTarget (target_sp);
708            target_sp->Destroy();
709            target.Clear();
710            const bool mandatory = true;
711            ModuleList::RemoveOrphanSharedModules(mandatory);
712        }
713    }
714
715    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
716    if (log)
717    {
718        log->Printf ("SBDebugger(%p)::DeleteTarget (SBTarget(%p)) => %i", m_opaque_sp.get(), target.m_opaque_sp.get(), result);
719    }
720
721    return result;
722}
723SBTarget
724SBDebugger::GetTargetAtIndex (uint32_t idx)
725{
726    SBTarget sb_target;
727    if (m_opaque_sp)
728    {
729        // No need to lock, the target list is thread safe
730        sb_target.SetSP (m_opaque_sp->GetTargetList().GetTargetAtIndex (idx));
731    }
732    return sb_target;
733}
734
735uint32_t
736SBDebugger::GetIndexOfTarget (lldb::SBTarget target)
737{
738
739    lldb::TargetSP target_sp = target.GetSP();
740    if (!target_sp)
741        return UINT32_MAX;
742
743    if (!m_opaque_sp)
744        return UINT32_MAX;
745
746    return m_opaque_sp->GetTargetList().GetIndexOfTarget (target.GetSP());
747}
748
749SBTarget
750SBDebugger::FindTargetWithProcessID (lldb::pid_t pid)
751{
752    SBTarget sb_target;
753    if (m_opaque_sp)
754    {
755        // No need to lock, the target list is thread safe
756        sb_target.SetSP (m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid));
757    }
758    return sb_target;
759}
760
761SBTarget
762SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name)
763{
764    SBTarget sb_target;
765    if (m_opaque_sp && filename && filename[0])
766    {
767        // No need to lock, the target list is thread safe
768        ArchSpec arch (arch_name, m_opaque_sp->GetPlatformList().GetSelectedPlatform().get());
769        TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename, false), arch_name ? &arch : NULL));
770        sb_target.SetSP (target_sp);
771    }
772    return sb_target;
773}
774
775SBTarget
776SBDebugger::FindTargetWithLLDBProcess (const ProcessSP &process_sp)
777{
778    SBTarget sb_target;
779    if (m_opaque_sp)
780    {
781        // No need to lock, the target list is thread safe
782        sb_target.SetSP (m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get()));
783    }
784    return sb_target;
785}
786
787
788uint32_t
789SBDebugger::GetNumTargets ()
790{
791    if (m_opaque_sp)
792    {
793        // No need to lock, the target list is thread safe
794        return m_opaque_sp->GetTargetList().GetNumTargets ();
795    }
796    return 0;
797}
798
799SBTarget
800SBDebugger::GetSelectedTarget ()
801{
802    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
803
804    SBTarget sb_target;
805    TargetSP target_sp;
806    if (m_opaque_sp)
807    {
808        // No need to lock, the target list is thread safe
809        target_sp = m_opaque_sp->GetTargetList().GetSelectedTarget ();
810        sb_target.SetSP (target_sp);
811    }
812
813    if (log)
814    {
815        SBStream sstr;
816        sb_target.GetDescription (sstr, eDescriptionLevelBrief);
817        log->Printf ("SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s", m_opaque_sp.get(),
818                     target_sp.get(), sstr.GetData());
819    }
820
821    return sb_target;
822}
823
824void
825SBDebugger::SetSelectedTarget (SBTarget &sb_target)
826{
827    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
828
829    TargetSP target_sp (sb_target.GetSP());
830    if (m_opaque_sp)
831    {
832        m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
833    }
834    if (log)
835    {
836        SBStream sstr;
837        sb_target.GetDescription (sstr, eDescriptionLevelBrief);
838        log->Printf ("SBDebugger(%p)::SetSelectedTarget () => SBTarget(%p): %s", m_opaque_sp.get(),
839                     target_sp.get(), sstr.GetData());
840    }
841}
842
843SBPlatform
844SBDebugger::GetSelectedPlatform()
845{
846    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
847
848    SBPlatform sb_platform;
849    DebuggerSP debugger_sp(m_opaque_sp);
850    if (debugger_sp)
851    {
852        sb_platform.SetSP(debugger_sp->GetPlatformList().GetSelectedPlatform());
853    }
854    if (log)
855    {
856        log->Printf ("SBDebugger(%p)::GetSelectedPlatform () => SBPlatform(%p): %s", m_opaque_sp.get(),
857                     sb_platform.GetSP().get(), sb_platform.GetName());
858    }
859    return sb_platform;
860}
861
862void
863SBDebugger::SetSelectedPlatform(SBPlatform &sb_platform)
864{
865    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
866
867    DebuggerSP debugger_sp(m_opaque_sp);
868    if (debugger_sp)
869    {
870        debugger_sp->GetPlatformList().SetSelectedPlatform(sb_platform.GetSP());
871    }
872    if (log)
873    {
874        log->Printf ("SBDebugger(%p)::SetSelectedPlatform (SBPlatform(%p) %s)", m_opaque_sp.get(),
875                     sb_platform.GetSP().get(), sb_platform.GetName());
876    }
877}
878
879void
880SBDebugger::DispatchInput (void* baton, const void *data, size_t data_len)
881{
882    DispatchInput (data,data_len);
883}
884
885void
886SBDebugger::DispatchInput (const void *data, size_t data_len)
887{
888    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
889
890    if (log)
891        log->Printf ("SBDebugger(%p)::DispatchInput (data=\"%.*s\", size_t=%" PRIu64 ")",
892                     m_opaque_sp.get(),
893                     (int) data_len,
894                     (const char *) data,
895                     (uint64_t)data_len);
896
897    if (m_opaque_sp)
898        m_opaque_sp->DispatchInput ((const char *) data, data_len);
899}
900
901void
902SBDebugger::DispatchInputInterrupt ()
903{
904    if (m_opaque_sp)
905        m_opaque_sp->DispatchInputInterrupt ();
906}
907
908void
909SBDebugger::DispatchInputEndOfFile ()
910{
911    if (m_opaque_sp)
912        m_opaque_sp->DispatchInputEndOfFile ();
913}
914
915bool
916SBDebugger::InputReaderIsTopReader (const lldb::SBInputReader &reader)
917{
918    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
919
920    if (log)
921        log->Printf ("SBDebugger(%p)::InputReaderIsTopReader (SBInputReader(%p))", m_opaque_sp.get(), &reader);
922
923    if (m_opaque_sp && reader.IsValid())
924    {
925        InputReaderSP reader_sp (*reader);
926        return m_opaque_sp->InputReaderIsTopReader (reader_sp);
927    }
928
929    return false;
930}
931
932
933void
934SBDebugger::PushInputReader (SBInputReader &reader)
935{
936    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
937
938    if (log)
939        log->Printf ("SBDebugger(%p)::PushInputReader (SBInputReader(%p))", m_opaque_sp.get(), &reader);
940
941    if (m_opaque_sp && reader.IsValid())
942    {
943        TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
944        Mutex::Locker api_locker;
945        if (target_sp)
946            api_locker.Lock(target_sp->GetAPIMutex());
947        InputReaderSP reader_sp(*reader);
948        m_opaque_sp->PushInputReader (reader_sp);
949    }
950}
951
952void
953SBDebugger::NotifyTopInputReader (InputReaderAction notification)
954{
955    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
956
957    if (log)
958        log->Printf ("SBDebugger(%p)::NotifyTopInputReader (%d)", m_opaque_sp.get(), notification);
959
960    if (m_opaque_sp)
961        m_opaque_sp->NotifyTopInputReader (notification);
962}
963
964void
965SBDebugger::reset (const DebuggerSP &debugger_sp)
966{
967    m_opaque_sp = debugger_sp;
968}
969
970Debugger *
971SBDebugger::get () const
972{
973    return m_opaque_sp.get();
974}
975
976Debugger &
977SBDebugger::ref () const
978{
979    assert (m_opaque_sp.get());
980    return *m_opaque_sp;
981}
982
983const lldb::DebuggerSP &
984SBDebugger::get_sp () const
985{
986    return m_opaque_sp;
987}
988
989SBDebugger
990SBDebugger::FindDebuggerWithID (int id)
991{
992    // No need to lock, the debugger list is thread safe
993    SBDebugger sb_debugger;
994    DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id);
995    if (debugger_sp)
996        sb_debugger.reset (debugger_sp);
997    return sb_debugger;
998}
999
1000const char *
1001SBDebugger::GetInstanceName()
1002{
1003    if (m_opaque_sp)
1004        return m_opaque_sp->GetInstanceName().AsCString();
1005    else
1006        return NULL;
1007}
1008
1009SBError
1010SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name)
1011{
1012    SBError sb_error;
1013    DebuggerSP debugger_sp(Debugger::FindDebuggerWithInstanceName (ConstString(debugger_instance_name)));
1014    Error error;
1015    if (debugger_sp)
1016    {
1017        ExecutionContext exe_ctx (debugger_sp->GetCommandInterpreter().GetExecutionContext());
1018        error = debugger_sp->SetPropertyValue (&exe_ctx,
1019                                               eVarSetOperationAssign,
1020                                               var_name,
1021                                               value);
1022    }
1023    else
1024    {
1025        error.SetErrorStringWithFormat ("invalid debugger instance name '%s'", debugger_instance_name);
1026    }
1027    if (error.Fail())
1028        sb_error.SetError(error);
1029    return sb_error;
1030}
1031
1032SBStringList
1033SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name)
1034{
1035    SBStringList ret_value;
1036    DebuggerSP debugger_sp(Debugger::FindDebuggerWithInstanceName (ConstString(debugger_instance_name)));
1037    Error error;
1038    if (debugger_sp)
1039    {
1040        ExecutionContext exe_ctx (debugger_sp->GetCommandInterpreter().GetExecutionContext());
1041        lldb::OptionValueSP value_sp (debugger_sp->GetPropertyValue (&exe_ctx,
1042                                                                     var_name,
1043                                                                     false,
1044                                                                     error));
1045        if (value_sp)
1046        {
1047            StreamString value_strm;
1048            value_sp->DumpValue (&exe_ctx, value_strm, OptionValue::eDumpOptionValue);
1049            const std::string &value_str = value_strm.GetString();
1050            if (!value_str.empty())
1051            {
1052                StringList string_list;
1053                string_list.SplitIntoLines(value_str.c_str(), value_str.size());
1054                return SBStringList(&string_list);
1055            }
1056        }
1057    }
1058    return SBStringList();
1059}
1060
1061uint32_t
1062SBDebugger::GetTerminalWidth () const
1063{
1064    if (m_opaque_sp)
1065        return m_opaque_sp->GetTerminalWidth ();
1066    return 0;
1067}
1068
1069void
1070SBDebugger::SetTerminalWidth (uint32_t term_width)
1071{
1072    if (m_opaque_sp)
1073        m_opaque_sp->SetTerminalWidth (term_width);
1074}
1075
1076const char *
1077SBDebugger::GetPrompt() const
1078{
1079    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1080
1081    if (log)
1082        log->Printf ("SBDebugger(%p)::GetPrompt () => \"%s\"", m_opaque_sp.get(),
1083                     (m_opaque_sp ? m_opaque_sp->GetPrompt() : ""));
1084
1085    if (m_opaque_sp)
1086        return m_opaque_sp->GetPrompt ();
1087    return 0;
1088}
1089
1090void
1091SBDebugger::SetPrompt (const char *prompt)
1092{
1093    if (m_opaque_sp)
1094        m_opaque_sp->SetPrompt (prompt);
1095}
1096
1097
1098ScriptLanguage
1099SBDebugger::GetScriptLanguage() const
1100{
1101    if (m_opaque_sp)
1102        return m_opaque_sp->GetScriptLanguage ();
1103    return eScriptLanguageNone;
1104}
1105
1106void
1107SBDebugger::SetScriptLanguage (ScriptLanguage script_lang)
1108{
1109    if (m_opaque_sp)
1110    {
1111        m_opaque_sp->SetScriptLanguage (script_lang);
1112    }
1113}
1114
1115bool
1116SBDebugger::SetUseExternalEditor (bool value)
1117{
1118    if (m_opaque_sp)
1119        return m_opaque_sp->SetUseExternalEditor (value);
1120    return false;
1121}
1122
1123bool
1124SBDebugger::GetUseExternalEditor ()
1125{
1126    if (m_opaque_sp)
1127        return m_opaque_sp->GetUseExternalEditor ();
1128    return false;
1129}
1130
1131bool
1132SBDebugger::SetUseColor (bool value)
1133{
1134    if (m_opaque_sp)
1135        return m_opaque_sp->SetUseColor (value);
1136    return false;
1137}
1138
1139bool
1140SBDebugger::GetUseColor () const
1141{
1142    if (m_opaque_sp)
1143        return m_opaque_sp->GetUseColor ();
1144    return false;
1145}
1146
1147bool
1148SBDebugger::GetDescription (SBStream &description)
1149{
1150    Stream &strm = description.ref();
1151
1152    if (m_opaque_sp)
1153    {
1154        const char *name = m_opaque_sp->GetInstanceName().AsCString();
1155        user_id_t id = m_opaque_sp->GetID();
1156        strm.Printf ("Debugger (instance: \"%s\", id: %" PRIu64 ")", name, id);
1157    }
1158    else
1159        strm.PutCString ("No value");
1160
1161    return true;
1162}
1163
1164user_id_t
1165SBDebugger::GetID()
1166{
1167    if (m_opaque_sp)
1168        return m_opaque_sp->GetID();
1169    return LLDB_INVALID_UID;
1170}
1171
1172
1173SBError
1174SBDebugger::SetCurrentPlatform (const char *platform_name)
1175{
1176    SBError sb_error;
1177    if (m_opaque_sp)
1178    {
1179        PlatformSP platform_sp (Platform::Create (platform_name, sb_error.ref()));
1180
1181        if (platform_sp)
1182        {
1183            bool make_selected = true;
1184            m_opaque_sp->GetPlatformList().Append (platform_sp, make_selected);
1185        }
1186    }
1187    return sb_error;
1188}
1189
1190bool
1191SBDebugger::SetCurrentPlatformSDKRoot (const char *sysroot)
1192{
1193    if (m_opaque_sp)
1194    {
1195        PlatformSP platform_sp (m_opaque_sp->GetPlatformList().GetSelectedPlatform());
1196
1197        if (platform_sp)
1198        {
1199            platform_sp->SetSDKRootDirectory (ConstString (sysroot));
1200            return true;
1201        }
1202    }
1203    return false;
1204}
1205
1206bool
1207SBDebugger::GetCloseInputOnEOF () const
1208{
1209    if (m_opaque_sp)
1210        return m_opaque_sp->GetCloseInputOnEOF ();
1211    return false;
1212}
1213
1214void
1215SBDebugger::SetCloseInputOnEOF (bool b)
1216{
1217    if (m_opaque_sp)
1218        m_opaque_sp->SetCloseInputOnEOF (b);
1219}
1220
1221SBTypeCategory
1222SBDebugger::GetCategory (const char* category_name)
1223{
1224    if (!category_name || *category_name == 0)
1225        return SBTypeCategory();
1226
1227    TypeCategoryImplSP category_sp;
1228
1229    if (DataVisualization::Categories::GetCategory(ConstString(category_name), category_sp, false))
1230        return SBTypeCategory(category_sp);
1231    else
1232        return SBTypeCategory();
1233}
1234
1235SBTypeCategory
1236SBDebugger::CreateCategory (const char* category_name)
1237{
1238    if (!category_name || *category_name == 0)
1239        return SBTypeCategory();
1240
1241    TypeCategoryImplSP category_sp;
1242
1243    if (DataVisualization::Categories::GetCategory(ConstString(category_name), category_sp, true))
1244        return SBTypeCategory(category_sp);
1245    else
1246        return SBTypeCategory();
1247}
1248
1249bool
1250SBDebugger::DeleteCategory (const char* category_name)
1251{
1252    if (!category_name || *category_name == 0)
1253        return false;
1254
1255    return DataVisualization::Categories::Delete(ConstString(category_name));
1256}
1257
1258uint32_t
1259SBDebugger::GetNumCategories()
1260{
1261    return DataVisualization::Categories::GetCount();
1262}
1263
1264SBTypeCategory
1265SBDebugger::GetCategoryAtIndex (uint32_t index)
1266{
1267    return SBTypeCategory(DataVisualization::Categories::GetCategoryAtIndex(index));
1268}
1269
1270SBTypeCategory
1271SBDebugger::GetDefaultCategory()
1272{
1273    return GetCategory("default");
1274}
1275
1276SBTypeFormat
1277SBDebugger::GetFormatForType (SBTypeNameSpecifier type_name)
1278{
1279    SBTypeCategory default_category_sb = GetDefaultCategory();
1280    if (default_category_sb.GetEnabled())
1281        return default_category_sb.GetFormatForType(type_name);
1282    return SBTypeFormat();
1283}
1284
1285#ifndef LLDB_DISABLE_PYTHON
1286SBTypeSummary
1287SBDebugger::GetSummaryForType (SBTypeNameSpecifier type_name)
1288{
1289    if (type_name.IsValid() == false)
1290        return SBTypeSummary();
1291    return SBTypeSummary(DataVisualization::GetSummaryForType(type_name.GetSP()));
1292}
1293#endif // LLDB_DISABLE_PYTHON
1294
1295SBTypeFilter
1296SBDebugger::GetFilterForType (SBTypeNameSpecifier type_name)
1297{
1298    if (type_name.IsValid() == false)
1299        return SBTypeFilter();
1300    return SBTypeFilter(DataVisualization::GetFilterForType(type_name.GetSP()));
1301}
1302
1303#ifndef LLDB_DISABLE_PYTHON
1304SBTypeSynthetic
1305SBDebugger::GetSyntheticForType (SBTypeNameSpecifier type_name)
1306{
1307    if (type_name.IsValid() == false)
1308        return SBTypeSynthetic();
1309    return SBTypeSynthetic(DataVisualization::GetSyntheticForType(type_name.GetSP()));
1310}
1311#endif // LLDB_DISABLE_PYTHON
1312
1313bool
1314SBDebugger::EnableLog (const char *channel, const char **categories)
1315{
1316    if (m_opaque_sp)
1317    {
1318        uint32_t log_options = LLDB_LOG_OPTION_PREPEND_TIMESTAMP | LLDB_LOG_OPTION_PREPEND_THREAD_NAME;
1319        StreamString errors;
1320        return m_opaque_sp->EnableLog (channel, categories, NULL, log_options, errors);
1321
1322    }
1323    else
1324        return false;
1325}
1326
1327void
1328SBDebugger::SetLoggingCallback (lldb::LogOutputCallback log_callback, void *baton)
1329{
1330    if (m_opaque_sp)
1331    {
1332        return m_opaque_sp->SetLoggingCallback (log_callback, baton);
1333    }
1334}
1335
1336
1337