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 
10dbb0abbfSEugene Zelenko // C Includes
11dbb0abbfSEugene Zelenko // C++ Includes
12dbb0abbfSEugene Zelenko // Other libraries and framework includes
13dbb0abbfSEugene Zelenko // Project includes
14ca93cc1dSEli Friedman #include "lldb/API/SBDebugger.h"
1530fdc8d8SChris Lattner 
16e0d378b3SGreg Clayton #include "lldb/lldb-private.h"
1730fdc8d8SChris Lattner 
18e6e2bb38SZachary Turner #include "lldb/API/SystemInitializerFull.h"
19ca93cc1dSEli Friedman #include "lldb/API/SBListener.h"
20ca93cc1dSEli Friedman #include "lldb/API/SBBroadcaster.h"
21ca93cc1dSEli Friedman #include "lldb/API/SBCommandInterpreter.h"
22ca93cc1dSEli Friedman #include "lldb/API/SBCommandReturnObject.h"
232289fa48SGreg Clayton #include "lldb/API/SBError.h"
24ca93cc1dSEli Friedman #include "lldb/API/SBEvent.h"
25ca93cc1dSEli Friedman #include "lldb/API/SBFrame.h"
263df9a8dfSCaroline Tice #include "lldb/API/SBProcess.h"
273df9a8dfSCaroline Tice #include "lldb/API/SBSourceManager.h"
28dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
293df9a8dfSCaroline Tice #include "lldb/API/SBStringList.h"
303df9a8dfSCaroline Tice #include "lldb/API/SBTarget.h"
313df9a8dfSCaroline Tice #include "lldb/API/SBThread.h"
32061858ceSEnrico Granata #include "lldb/API/SBTypeCategory.h"
33061858ceSEnrico Granata #include "lldb/API/SBTypeFormat.h"
34061858ceSEnrico Granata #include "lldb/API/SBTypeFilter.h"
35061858ceSEnrico Granata #include "lldb/API/SBTypeNameSpecifier.h"
36061858ceSEnrico Granata #include "lldb/API/SBTypeSummary.h"
37061858ceSEnrico Granata #include "lldb/API/SBTypeSynthetic.h"
38061858ceSEnrico Granata 
396eee5aa0SGreg Clayton #include "lldb/Core/Debugger.h"
406eee5aa0SGreg Clayton #include "lldb/Core/State.h"
4144d93782SGreg Clayton #include "lldb/Core/StreamFile.h"
425548cb50SEnrico Granata #include "lldb/DataFormatters/DataVisualization.h"
43e6e2bb38SZachary Turner #include "lldb/Initialization/SystemLifetimeManager.h"
446eee5aa0SGreg Clayton #include "lldb/Interpreter/Args.h"
456eee5aa0SGreg Clayton #include "lldb/Interpreter/CommandInterpreter.h"
46cac9c5f9SGreg Clayton #include "lldb/Interpreter/OptionGroupPlatform.h"
476eee5aa0SGreg Clayton #include "lldb/Target/Process.h"
486eee5aa0SGreg Clayton #include "lldb/Target/TargetList.h"
4930fdc8d8SChris Lattner 
50d717cc9fSEnrico Granata #include "llvm/ADT/STLExtras.h"
51e6e2bb38SZachary Turner #include "llvm/Support/ManagedStatic.h"
5258a559c0SZachary Turner #include "llvm/Support/DynamicLibrary.h"
5358a559c0SZachary Turner 
5430fdc8d8SChris Lattner using namespace lldb;
5530fdc8d8SChris Lattner using namespace lldb_private;
5630fdc8d8SChris Lattner 
5758a559c0SZachary Turner static llvm::sys::DynamicLibrary
585fb8f797SGreg Clayton LoadPlugin (const lldb::DebuggerSP &debugger_sp, const FileSpec& spec, Error& error)
595fb8f797SGreg Clayton {
6058a559c0SZachary Turner     llvm::sys::DynamicLibrary dynlib = llvm::sys::DynamicLibrary::getPermanentLibrary(spec.GetPath().c_str());
6158a559c0SZachary Turner     if (dynlib.isValid())
625fb8f797SGreg Clayton     {
635fb8f797SGreg Clayton         typedef bool (*LLDBCommandPluginInit) (lldb::SBDebugger& debugger);
645fb8f797SGreg Clayton 
655fb8f797SGreg Clayton         lldb::SBDebugger debugger_sb(debugger_sp);
665fb8f797SGreg Clayton         // This calls the bool lldb::PluginInitialize(lldb::SBDebugger debugger) function.
675fb8f797SGreg Clayton         // TODO: mangle this differently for your system - on OSX, the first underscore needs to be removed and the second one stays
6858a559c0SZachary Turner         LLDBCommandPluginInit init_func = (LLDBCommandPluginInit)dynlib.getAddressOfSymbol("_ZN4lldb16PluginInitializeENS_10SBDebuggerE");
695fb8f797SGreg Clayton         if (init_func)
705fb8f797SGreg Clayton         {
715fb8f797SGreg Clayton             if (init_func(debugger_sb))
7258a559c0SZachary Turner                 return dynlib;
735fb8f797SGreg Clayton             else
745fb8f797SGreg Clayton                 error.SetErrorString("plug-in refused to load (lldb::PluginInitialize(lldb::SBDebugger) returned false)");
755fb8f797SGreg Clayton         }
765fb8f797SGreg Clayton         else
775fb8f797SGreg Clayton         {
785fb8f797SGreg Clayton             error.SetErrorString("plug-in is missing the required initialization: lldb::PluginInitialize(lldb::SBDebugger)");
795fb8f797SGreg Clayton         }
805fb8f797SGreg Clayton     }
815fb8f797SGreg Clayton     else
825fb8f797SGreg Clayton     {
835fb8f797SGreg Clayton         if (spec.Exists())
845fb8f797SGreg Clayton             error.SetErrorString("this file does not represent a loadable dylib");
855fb8f797SGreg Clayton         else
865fb8f797SGreg Clayton             error.SetErrorString("no such file");
875fb8f797SGreg Clayton     }
8858a559c0SZachary Turner     return llvm::sys::DynamicLibrary();
895fb8f797SGreg Clayton }
905fb8f797SGreg Clayton 
91e6e2bb38SZachary Turner static llvm::ManagedStatic<SystemLifetimeManager> g_debugger_lifetime;
92e6e2bb38SZachary Turner 
93e6e2bb38SZachary Turner SBError
94e6e2bb38SZachary Turner SBInputReader::Initialize(lldb::SBDebugger &sb_debugger,
95e6e2bb38SZachary Turner                           unsigned long (*)(void *, lldb::SBInputReader *, lldb::InputReaderAction, char const *,
96e6e2bb38SZachary Turner                                             unsigned long),
97e6e2bb38SZachary Turner                           void *, lldb::InputReaderGranularity, char const *, char const *, bool)
98e6e2bb38SZachary Turner {
99e6e2bb38SZachary Turner     return SBError();
100e6e2bb38SZachary Turner }
101e6e2bb38SZachary Turner 
102e6e2bb38SZachary Turner void
103e6e2bb38SZachary Turner SBInputReader::SetIsDone(bool)
104e6e2bb38SZachary Turner {
105e6e2bb38SZachary Turner }
106dbb0abbfSEugene Zelenko 
107e6e2bb38SZachary Turner bool
108e6e2bb38SZachary Turner SBInputReader::IsActive() const
109e6e2bb38SZachary Turner {
110e6e2bb38SZachary Turner     return false;
111e6e2bb38SZachary Turner }
112e6e2bb38SZachary Turner 
113dbb0abbfSEugene Zelenko SBDebugger::SBDebugger() = default;
114dbb0abbfSEugene Zelenko 
115dbb0abbfSEugene Zelenko SBDebugger::SBDebugger(const lldb::DebuggerSP &debugger_sp) :
116dbb0abbfSEugene Zelenko     m_opaque_sp(debugger_sp)
117dbb0abbfSEugene Zelenko {
118dbb0abbfSEugene Zelenko }
119dbb0abbfSEugene Zelenko 
120dbb0abbfSEugene Zelenko SBDebugger::SBDebugger(const SBDebugger &rhs) :
121dbb0abbfSEugene Zelenko     m_opaque_sp (rhs.m_opaque_sp)
122dbb0abbfSEugene Zelenko {
123dbb0abbfSEugene Zelenko }
124dbb0abbfSEugene Zelenko 
125dbb0abbfSEugene Zelenko SBDebugger::~SBDebugger() = default;
126dbb0abbfSEugene Zelenko 
127dbb0abbfSEugene Zelenko SBDebugger &
128dbb0abbfSEugene Zelenko SBDebugger::operator = (const SBDebugger &rhs)
129dbb0abbfSEugene Zelenko {
130dbb0abbfSEugene Zelenko     if (this != &rhs)
131dbb0abbfSEugene Zelenko     {
132dbb0abbfSEugene Zelenko         m_opaque_sp = rhs.m_opaque_sp;
133dbb0abbfSEugene Zelenko     }
134dbb0abbfSEugene Zelenko     return *this;
135dbb0abbfSEugene Zelenko }
136dbb0abbfSEugene Zelenko 
13730fdc8d8SChris Lattner void
13830fdc8d8SChris Lattner SBDebugger::Initialize ()
13930fdc8d8SChris Lattner {
1405160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
141ceb6b139SCaroline Tice 
142ceb6b139SCaroline Tice     if (log)
143ceb6b139SCaroline Tice         log->Printf ("SBDebugger::Initialize ()");
144ceb6b139SCaroline Tice 
145e6e2bb38SZachary Turner     g_debugger_lifetime->Initialize(llvm::make_unique<SystemInitializerFull>(), LoadPlugin);
14630fdc8d8SChris Lattner }
14730fdc8d8SChris Lattner 
14830fdc8d8SChris Lattner void
14930fdc8d8SChris Lattner SBDebugger::Terminate ()
15030fdc8d8SChris Lattner {
151e6e2bb38SZachary Turner     g_debugger_lifetime->Terminate();
15230fdc8d8SChris Lattner }
15330fdc8d8SChris Lattner 
15448e42549SGreg Clayton void
15548e42549SGreg Clayton SBDebugger::Clear ()
15648e42549SGreg Clayton {
1575160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
158ceb6b139SCaroline Tice 
159ceb6b139SCaroline Tice     if (log)
160324a1036SSaleem Abdulrasool         log->Printf ("SBDebugger(%p)::Clear ()",
161324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_sp.get()));
1623d6086f6SCaroline Tice 
1633d6086f6SCaroline Tice     if (m_opaque_sp)
16444d93782SGreg Clayton         m_opaque_sp->ClearIOHandlers ();
165ceb6b139SCaroline Tice 
16648e42549SGreg Clayton     m_opaque_sp.reset();
16748e42549SGreg Clayton }
16848e42549SGreg Clayton 
1696611103cSGreg Clayton SBDebugger
1706611103cSGreg Clayton SBDebugger::Create()
1716611103cSGreg Clayton {
172dbb0abbfSEugene Zelenko     return SBDebugger::Create(false, nullptr, nullptr);
17306942690SJim Ingham }
17406942690SJim Ingham 
17506942690SJim Ingham SBDebugger
17606942690SJim Ingham SBDebugger::Create(bool source_init_files)
17706942690SJim Ingham {
178dbb0abbfSEugene Zelenko     return SBDebugger::Create (source_init_files, nullptr, nullptr);
179228063cdSJim Ingham }
180228063cdSJim Ingham 
181228063cdSJim Ingham SBDebugger
182228063cdSJim Ingham SBDebugger::Create(bool source_init_files, lldb::LogOutputCallback callback, void *baton)
183228063cdSJim Ingham 
184228063cdSJim Ingham {
1855160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
186ceb6b139SCaroline Tice 
1876611103cSGreg Clayton     SBDebugger debugger;
188cb172b10SGreg Clayton 
189cb172b10SGreg Clayton     // Currently we have issues if this function is called simultaneously on two different
190cb172b10SGreg Clayton     // threads. The issues mainly revolve around the fact that the lldb_private::FormatManager
191cb172b10SGreg Clayton     // uses global collections and having two threads parsing the .lldbinit files can cause
192cb172b10SGreg Clayton     // mayhem. So to get around this for now we need to use a mutex to prevent bad things
193cb172b10SGreg Clayton     // from happening.
19416ff8604SSaleem Abdulrasool     static std::recursive_mutex g_mutex;
19516ff8604SSaleem Abdulrasool     std::lock_guard<std::recursive_mutex> guard(g_mutex);
196cb172b10SGreg Clayton 
197228063cdSJim Ingham     debugger.reset(Debugger::CreateInstance(callback, baton));
198ceb6b139SCaroline Tice 
199ceb6b139SCaroline Tice     if (log)
200ceb6b139SCaroline Tice     {
201ceb6b139SCaroline Tice         SBStream sstr;
202ceb6b139SCaroline Tice         debugger.GetDescription (sstr);
203324a1036SSaleem Abdulrasool         log->Printf ("SBDebugger::Create () => SBDebugger(%p): %s",
204324a1036SSaleem Abdulrasool                      static_cast<void*>(debugger.m_opaque_sp.get()),
205324a1036SSaleem Abdulrasool                      sstr.GetData());
206ceb6b139SCaroline Tice     }
207ceb6b139SCaroline Tice 
20806942690SJim Ingham     SBCommandInterpreter interp = debugger.GetCommandInterpreter();
20906942690SJim Ingham     if (source_init_files)
21006942690SJim Ingham     {
21106942690SJim Ingham         interp.get()->SkipLLDBInitFiles(false);
21206942690SJim Ingham         interp.get()->SkipAppInitFiles (false);
21306942690SJim Ingham         SBCommandReturnObject result;
21406942690SJim Ingham         interp.SourceInitFileInHomeDirectory(result);
21506942690SJim Ingham     }
21606942690SJim Ingham     else
21706942690SJim Ingham     {
21806942690SJim Ingham         interp.get()->SkipLLDBInitFiles(true);
21906942690SJim Ingham         interp.get()->SkipAppInitFiles (true);
22006942690SJim Ingham     }
2216611103cSGreg Clayton     return debugger;
2226611103cSGreg Clayton }
2236611103cSGreg Clayton 
224e02657b1SCaroline Tice void
225e02657b1SCaroline Tice SBDebugger::Destroy (SBDebugger &debugger)
226e02657b1SCaroline Tice {
2275160ce5cSGreg Clayton     Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
228e02657b1SCaroline Tice 
229e02657b1SCaroline Tice     if (log)
230e02657b1SCaroline Tice     {
231e02657b1SCaroline Tice         SBStream sstr;
232e02657b1SCaroline Tice         debugger.GetDescription (sstr);
233324a1036SSaleem Abdulrasool         log->Printf ("SBDebugger::Destroy () => SBDebugger(%p): %s",
234324a1036SSaleem Abdulrasool                      static_cast<void*>(debugger.m_opaque_sp.get()),
235324a1036SSaleem Abdulrasool                      sstr.GetData());
236e02657b1SCaroline Tice     }
237e02657b1SCaroline Tice 
238e02657b1SCaroline Tice     Debugger::Destroy (debugger.m_opaque_sp);
239e02657b1SCaroline Tice 
240dbb0abbfSEugene Zelenko     if (debugger.m_opaque_sp.get() != nullptr)
241e02657b1SCaroline Tice         debugger.m_opaque_sp.reset();
242e02657b1SCaroline Tice }
243e02657b1SCaroline Tice 
244f9322415SGreg Clayton void
245f9322415SGreg Clayton SBDebugger::MemoryPressureDetected ()
246f9322415SGreg Clayton {
2470cd70866SGreg Clayton     // Since this function can be call asynchronously, we allow it to be
2480cd70866SGreg Clayton     // non-mandatory. We have seen deadlocks with this function when called
2490cd70866SGreg Clayton     // so we need to safeguard against this until we can determine what is
2500cd70866SGreg Clayton     // causing the deadlocks.
2515160ce5cSGreg Clayton     Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
252aebdf1beSJim Ingham 
2530cd70866SGreg Clayton     const bool mandatory = false;
254aebdf1beSJim Ingham     if (log)
255aebdf1beSJim Ingham     {
256aebdf1beSJim Ingham         log->Printf ("SBDebugger::MemoryPressureDetected (), mandatory = %d", mandatory);
257aebdf1beSJim Ingham     }
258aebdf1beSJim Ingham 
2590cd70866SGreg Clayton     ModuleList::RemoveOrphanSharedModules(mandatory);
260f9322415SGreg Clayton }
261f9322415SGreg Clayton 
2626611103cSGreg Clayton bool
2636611103cSGreg Clayton SBDebugger::IsValid() const
2646611103cSGreg Clayton {
265dbb0abbfSEugene Zelenko     return m_opaque_sp.get() != nullptr;
2666611103cSGreg Clayton }
2676611103cSGreg Clayton 
26830fdc8d8SChris Lattner void
26930fdc8d8SChris Lattner SBDebugger::SetAsync (bool b)
27030fdc8d8SChris Lattner {
2716611103cSGreg Clayton     if (m_opaque_sp)
2726611103cSGreg Clayton         m_opaque_sp->SetAsyncExecution(b);
27330fdc8d8SChris Lattner }
27430fdc8d8SChris Lattner 
275e64f0dc7SJim Ingham bool
276e64f0dc7SJim Ingham SBDebugger::GetAsync()
277e64f0dc7SJim Ingham {
278dbb0abbfSEugene Zelenko     return (m_opaque_sp ? m_opaque_sp->GetAsyncExecution() : false);
279e64f0dc7SJim Ingham }
280e64f0dc7SJim Ingham 
2816eee5aa0SGreg Clayton void
2826eee5aa0SGreg Clayton SBDebugger::SkipLLDBInitFiles (bool b)
2836eee5aa0SGreg Clayton {
2846eee5aa0SGreg Clayton     if (m_opaque_sp)
2856eee5aa0SGreg Clayton         m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles (b);
2866eee5aa0SGreg Clayton }
2876eee5aa0SGreg Clayton 
28816e0c686SJim Ingham void
28916e0c686SJim Ingham SBDebugger::SkipAppInitFiles (bool b)
29016e0c686SJim Ingham {
29116e0c686SJim Ingham     if (m_opaque_sp)
29216e0c686SJim Ingham         m_opaque_sp->GetCommandInterpreter().SkipAppInitFiles (b);
29316e0c686SJim Ingham }
29416e0c686SJim Ingham 
29530fdc8d8SChris Lattner // Shouldn't really be settable after initialization as this could cause lots of problems; don't want users
29630fdc8d8SChris Lattner // trying to switch modes in the middle of a debugging session.
29730fdc8d8SChris Lattner void
29830fdc8d8SChris Lattner SBDebugger::SetInputFileHandle (FILE *fh, bool transfer_ownership)
29930fdc8d8SChris Lattner {
3005160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
301ceb6b139SCaroline Tice 
302ceb6b139SCaroline Tice     if (log)
303324a1036SSaleem Abdulrasool         log->Printf ("SBDebugger(%p)::SetInputFileHandle (fh=%p, transfer_ownership=%i)",
304324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_sp.get()),
305324a1036SSaleem Abdulrasool                      static_cast<void*>(fh), transfer_ownership);
306ceb6b139SCaroline Tice 
3076611103cSGreg Clayton     if (m_opaque_sp)
3086611103cSGreg Clayton         m_opaque_sp->SetInputFileHandle (fh, transfer_ownership);
30930fdc8d8SChris Lattner }
31030fdc8d8SChris Lattner 
31130fdc8d8SChris Lattner void
31230fdc8d8SChris Lattner SBDebugger::SetOutputFileHandle (FILE *fh, bool transfer_ownership)
31330fdc8d8SChris Lattner {
3145160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
315ceb6b139SCaroline Tice 
316ceb6b139SCaroline Tice 
317ceb6b139SCaroline Tice     if (log)
318324a1036SSaleem Abdulrasool         log->Printf ("SBDebugger(%p)::SetOutputFileHandle (fh=%p, transfer_ownership=%i)",
319324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_sp.get()),
320324a1036SSaleem Abdulrasool                      static_cast<void*>(fh), transfer_ownership);
321ceb6b139SCaroline Tice 
3226611103cSGreg Clayton     if (m_opaque_sp)
3236611103cSGreg Clayton         m_opaque_sp->SetOutputFileHandle (fh, transfer_ownership);
32430fdc8d8SChris Lattner }
32530fdc8d8SChris Lattner 
32630fdc8d8SChris Lattner void
32730fdc8d8SChris Lattner SBDebugger::SetErrorFileHandle (FILE *fh, bool transfer_ownership)
32830fdc8d8SChris Lattner {
3295160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
330ceb6b139SCaroline Tice 
331ceb6b139SCaroline Tice 
332ceb6b139SCaroline Tice     if (log)
333324a1036SSaleem Abdulrasool         log->Printf ("SBDebugger(%p)::SetErrorFileHandle (fh=%p, transfer_ownership=%i)",
334324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_sp.get()),
335324a1036SSaleem Abdulrasool                      static_cast<void*>(fh), transfer_ownership);
336ceb6b139SCaroline Tice 
3376611103cSGreg Clayton     if (m_opaque_sp)
3386611103cSGreg Clayton         m_opaque_sp->SetErrorFileHandle (fh, transfer_ownership);
33930fdc8d8SChris Lattner }
34030fdc8d8SChris Lattner 
34130fdc8d8SChris Lattner FILE *
34230fdc8d8SChris Lattner SBDebugger::GetInputFileHandle ()
34330fdc8d8SChris Lattner {
3446611103cSGreg Clayton     if (m_opaque_sp)
34544d93782SGreg Clayton     {
34644d93782SGreg Clayton         StreamFileSP stream_file_sp (m_opaque_sp->GetInputFile());
34744d93782SGreg Clayton         if (stream_file_sp)
34844d93782SGreg Clayton             return stream_file_sp->GetFile().GetStream();
34944d93782SGreg Clayton     }
350dbb0abbfSEugene Zelenko     return nullptr;
35130fdc8d8SChris Lattner }
35230fdc8d8SChris Lattner 
35330fdc8d8SChris Lattner FILE *
35430fdc8d8SChris Lattner SBDebugger::GetOutputFileHandle ()
35530fdc8d8SChris Lattner {
3566611103cSGreg Clayton     if (m_opaque_sp)
35744d93782SGreg Clayton     {
35844d93782SGreg Clayton         StreamFileSP stream_file_sp (m_opaque_sp->GetOutputFile());
35944d93782SGreg Clayton         if (stream_file_sp)
36044d93782SGreg Clayton             return stream_file_sp->GetFile().GetStream();
36144d93782SGreg Clayton     }
362dbb0abbfSEugene Zelenko     return nullptr;
36330fdc8d8SChris Lattner }
36430fdc8d8SChris Lattner 
36530fdc8d8SChris Lattner FILE *
36630fdc8d8SChris Lattner SBDebugger::GetErrorFileHandle ()
36730fdc8d8SChris Lattner {
3686611103cSGreg Clayton     if (m_opaque_sp)
36944d93782SGreg Clayton     {
37044d93782SGreg Clayton         StreamFileSP stream_file_sp(m_opaque_sp->GetErrorFile());
37144d93782SGreg Clayton         if (stream_file_sp)
37244d93782SGreg Clayton             return stream_file_sp->GetFile().GetStream();
37344d93782SGreg Clayton     }
374dbb0abbfSEugene Zelenko     return nullptr;
37530fdc8d8SChris Lattner }
37630fdc8d8SChris Lattner 
377c5917d9aSJim Ingham void
378c5917d9aSJim Ingham SBDebugger::SaveInputTerminalState()
379c5917d9aSJim Ingham {
380c5917d9aSJim Ingham     if (m_opaque_sp)
381c5917d9aSJim Ingham         m_opaque_sp->SaveInputTerminalState();
382c5917d9aSJim Ingham }
383c5917d9aSJim Ingham 
384c5917d9aSJim Ingham void
385c5917d9aSJim Ingham SBDebugger::RestoreInputTerminalState()
386c5917d9aSJim Ingham {
387c5917d9aSJim Ingham     if (m_opaque_sp)
388c5917d9aSJim Ingham         m_opaque_sp->RestoreInputTerminalState();
389c5917d9aSJim Ingham 
390c5917d9aSJim Ingham }
39130fdc8d8SChris Lattner SBCommandInterpreter
39230fdc8d8SChris Lattner SBDebugger::GetCommandInterpreter ()
39330fdc8d8SChris Lattner {
3945160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
395ceb6b139SCaroline Tice 
3966611103cSGreg Clayton     SBCommandInterpreter sb_interpreter;
3976611103cSGreg Clayton     if (m_opaque_sp)
3986611103cSGreg Clayton         sb_interpreter.reset (&m_opaque_sp->GetCommandInterpreter());
399ceb6b139SCaroline Tice 
400750cd175SCaroline Tice     if (log)
40193aa84e8SGreg Clayton         log->Printf ("SBDebugger(%p)::GetCommandInterpreter () => SBCommandInterpreter(%p)",
402324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_sp.get()),
403324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_interpreter.get()));
404750cd175SCaroline Tice 
40530fdc8d8SChris Lattner     return sb_interpreter;
40630fdc8d8SChris Lattner }
40730fdc8d8SChris Lattner 
40830fdc8d8SChris Lattner void
40930fdc8d8SChris Lattner SBDebugger::HandleCommand (const char *command)
41030fdc8d8SChris Lattner {
4116611103cSGreg Clayton     if (m_opaque_sp)
4126611103cSGreg Clayton     {
413af67cecdSGreg Clayton         TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
414bb19a13cSSaleem Abdulrasool         std::unique_lock<std::recursive_mutex> lock;
415af67cecdSGreg Clayton         if (target_sp)
416bb19a13cSSaleem Abdulrasool             lock = std::unique_lock<std::recursive_mutex>(target_sp->GetAPIMutex());
417af67cecdSGreg Clayton 
4186611103cSGreg Clayton         SBCommandInterpreter sb_interpreter(GetCommandInterpreter ());
41930fdc8d8SChris Lattner         SBCommandReturnObject result;
42030fdc8d8SChris Lattner 
42130fdc8d8SChris Lattner         sb_interpreter.HandleCommand (command, result, false);
42230fdc8d8SChris Lattner 
423dbb0abbfSEugene Zelenko         if (GetErrorFileHandle() != nullptr)
42430fdc8d8SChris Lattner             result.PutError (GetErrorFileHandle());
425dbb0abbfSEugene Zelenko         if (GetOutputFileHandle() != nullptr)
42630fdc8d8SChris Lattner             result.PutOutput (GetOutputFileHandle());
42730fdc8d8SChris Lattner 
428dbb0abbfSEugene Zelenko         if (!m_opaque_sp->GetAsyncExecution())
42930fdc8d8SChris Lattner         {
4306611103cSGreg Clayton             SBProcess process(GetCommandInterpreter().GetProcess ());
431b9556accSGreg Clayton             ProcessSP process_sp (process.GetSP());
432b9556accSGreg Clayton             if (process_sp)
43330fdc8d8SChris Lattner             {
43430fdc8d8SChris Lattner                 EventSP event_sp;
435583bbb1dSJim Ingham                 ListenerSP lldb_listener_sp = m_opaque_sp->GetListener();
436583bbb1dSJim Ingham                 while (lldb_listener_sp->GetNextEventForBroadcaster (process_sp.get(), event_sp))
43730fdc8d8SChris Lattner                 {
43830fdc8d8SChris Lattner                     SBEvent event(event_sp);
43930fdc8d8SChris Lattner                     HandleProcessEvent (process, event, GetOutputFileHandle(), GetErrorFileHandle());
44030fdc8d8SChris Lattner                 }
44130fdc8d8SChris Lattner             }
44230fdc8d8SChris Lattner         }
44330fdc8d8SChris Lattner     }
4446611103cSGreg Clayton }
44530fdc8d8SChris Lattner 
44630fdc8d8SChris Lattner SBListener
44730fdc8d8SChris Lattner SBDebugger::GetListener ()
44830fdc8d8SChris Lattner {
4495160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
450ceb6b139SCaroline Tice 
4516611103cSGreg Clayton     SBListener sb_listener;
4526611103cSGreg Clayton     if (m_opaque_sp)
453583bbb1dSJim Ingham         sb_listener.reset(m_opaque_sp->GetListener());
454ceb6b139SCaroline Tice 
455750cd175SCaroline Tice     if (log)
456324a1036SSaleem Abdulrasool         log->Printf ("SBDebugger(%p)::GetListener () => SBListener(%p)",
457324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_sp.get()),
458324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_listener.get()));
459750cd175SCaroline Tice 
46030fdc8d8SChris Lattner     return sb_listener;
46130fdc8d8SChris Lattner }
46230fdc8d8SChris Lattner 
46330fdc8d8SChris Lattner void
46430fdc8d8SChris Lattner SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, FILE *out, FILE *err)
46530fdc8d8SChris Lattner {
466af67cecdSGreg Clayton     if (!process.IsValid())
467af67cecdSGreg Clayton         return;
468af67cecdSGreg Clayton 
469b9556accSGreg Clayton     TargetSP target_sp (process.GetTarget().GetSP());
470b9556accSGreg Clayton     if (!target_sp)
471b9556accSGreg Clayton         return;
472b9556accSGreg Clayton 
47330fdc8d8SChris Lattner     const uint32_t event_type = event.GetType();
47430fdc8d8SChris Lattner     char stdio_buffer[1024];
47530fdc8d8SChris Lattner     size_t len;
47630fdc8d8SChris Lattner 
477bb19a13cSSaleem Abdulrasool     std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
478af67cecdSGreg Clayton 
479af67cecdSGreg Clayton     if (event_type & (Process::eBroadcastBitSTDOUT | Process::eBroadcastBitStateChanged))
48030fdc8d8SChris Lattner     {
481af67cecdSGreg Clayton         // Drain stdout when we stop just in case we have any bytes
48230fdc8d8SChris Lattner         while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
483dbb0abbfSEugene Zelenko             if (out != nullptr)
48430fdc8d8SChris Lattner                 ::fwrite (stdio_buffer, 1, len, out);
48530fdc8d8SChris Lattner     }
486af67cecdSGreg Clayton 
487af67cecdSGreg Clayton     if (event_type & (Process::eBroadcastBitSTDERR | Process::eBroadcastBitStateChanged))
48830fdc8d8SChris Lattner     {
489af67cecdSGreg Clayton         // Drain stderr when we stop just in case we have any bytes
49030fdc8d8SChris Lattner         while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
491dbb0abbfSEugene Zelenko             if (err != nullptr)
492af67cecdSGreg Clayton                 ::fwrite (stdio_buffer, 1, len, err);
49330fdc8d8SChris Lattner     }
494af67cecdSGreg Clayton 
495af67cecdSGreg Clayton     if (event_type & Process::eBroadcastBitStateChanged)
49630fdc8d8SChris Lattner     {
49730fdc8d8SChris Lattner         StateType event_state = SBProcess::GetStateFromEvent (event);
49830fdc8d8SChris Lattner 
49930fdc8d8SChris Lattner         if (event_state == eStateInvalid)
50030fdc8d8SChris Lattner             return;
50130fdc8d8SChris Lattner 
50230fdc8d8SChris Lattner         bool is_stopped = StateIsStoppedState (event_state);
50330fdc8d8SChris Lattner         if (!is_stopped)
5042976d00aSJim Ingham             process.ReportEventState (event, out);
50530fdc8d8SChris Lattner     }
50630fdc8d8SChris Lattner }
50730fdc8d8SChris Lattner 
508e37d605eSJim Ingham SBSourceManager
50930fdc8d8SChris Lattner SBDebugger::GetSourceManager ()
51030fdc8d8SChris Lattner {
511e37d605eSJim Ingham     SBSourceManager sb_source_manager (*this);
512e37d605eSJim Ingham     return sb_source_manager;
51330fdc8d8SChris Lattner }
51430fdc8d8SChris Lattner 
51530fdc8d8SChris Lattner bool
51630fdc8d8SChris Lattner SBDebugger::GetDefaultArchitecture (char *arch_name, size_t arch_name_len)
51730fdc8d8SChris Lattner {
51830fdc8d8SChris Lattner     if (arch_name && arch_name_len)
51930fdc8d8SChris Lattner     {
520431ce678SGreg Clayton         ArchSpec default_arch = Target::GetDefaultArchitecture ();
521daccaa9eSCaroline Tice 
52230fdc8d8SChris Lattner         if (default_arch.IsValid())
52330fdc8d8SChris Lattner         {
524431ce678SGreg Clayton             const std::string &triple_str = default_arch.GetTriple().str();
525431ce678SGreg Clayton             if (!triple_str.empty())
526431ce678SGreg Clayton                 ::snprintf (arch_name, arch_name_len, "%s", triple_str.c_str());
527431ce678SGreg Clayton             else
52864195a2cSGreg Clayton                 ::snprintf (arch_name, arch_name_len, "%s", default_arch.GetArchitectureName());
52930fdc8d8SChris Lattner             return true;
53030fdc8d8SChris Lattner         }
53130fdc8d8SChris Lattner     }
53230fdc8d8SChris Lattner     if (arch_name && arch_name_len)
53330fdc8d8SChris Lattner         arch_name[0] = '\0';
53430fdc8d8SChris Lattner     return false;
53530fdc8d8SChris Lattner }
53630fdc8d8SChris Lattner 
53730fdc8d8SChris Lattner bool
53830fdc8d8SChris Lattner SBDebugger::SetDefaultArchitecture (const char *arch_name)
53930fdc8d8SChris Lattner {
54030fdc8d8SChris Lattner     if (arch_name)
54130fdc8d8SChris Lattner     {
54270512317SGreg Clayton         ArchSpec arch (arch_name);
54330fdc8d8SChris Lattner         if (arch.IsValid())
54430fdc8d8SChris Lattner         {
545431ce678SGreg Clayton             Target::SetDefaultArchitecture (arch);
54630fdc8d8SChris Lattner             return true;
54730fdc8d8SChris Lattner         }
54830fdc8d8SChris Lattner     }
54930fdc8d8SChris Lattner     return false;
55030fdc8d8SChris Lattner }
55130fdc8d8SChris Lattner 
55230fdc8d8SChris Lattner ScriptLanguage
55330fdc8d8SChris Lattner SBDebugger::GetScriptingLanguage(const char *script_language_name)
55430fdc8d8SChris Lattner {
55530fdc8d8SChris Lattner     return Args::StringToScriptLanguage(script_language_name,
55630fdc8d8SChris Lattner                                         eScriptLanguageDefault,
557dbb0abbfSEugene Zelenko                                         nullptr);
55830fdc8d8SChris Lattner }
55930fdc8d8SChris Lattner 
56030fdc8d8SChris Lattner const char *
56130fdc8d8SChris Lattner SBDebugger::GetVersionString ()
56230fdc8d8SChris Lattner {
563b2f1fb29SVirgile Bello     return lldb_private::GetVersion();
56430fdc8d8SChris Lattner }
56530fdc8d8SChris Lattner 
56630fdc8d8SChris Lattner const char *
567431ce678SGreg Clayton SBDebugger::StateAsCString (StateType state)
56830fdc8d8SChris Lattner {
569c2bbb49aSCaroline Tice     return lldb_private::StateAsCString (state);
57030fdc8d8SChris Lattner }
57130fdc8d8SChris Lattner 
57230fdc8d8SChris Lattner bool
573431ce678SGreg Clayton SBDebugger::StateIsRunningState (StateType state)
57430fdc8d8SChris Lattner {
5755160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5764838131bSGreg Clayton 
577c2bbb49aSCaroline Tice     const bool result = lldb_private::StateIsRunningState (state);
5784838131bSGreg Clayton     if (log)
5794838131bSGreg Clayton         log->Printf ("SBDebugger::StateIsRunningState (state=%s) => %i",
580431ce678SGreg Clayton                      StateAsCString (state), result);
5814838131bSGreg Clayton 
5824838131bSGreg Clayton     return result;
58330fdc8d8SChris Lattner }
58430fdc8d8SChris Lattner 
58530fdc8d8SChris Lattner bool
586431ce678SGreg Clayton SBDebugger::StateIsStoppedState (StateType state)
58730fdc8d8SChris Lattner {
5885160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
589ceb6b139SCaroline Tice 
5902637f825SGreg Clayton     const bool result = lldb_private::StateIsStoppedState (state, false);
591ceb6b139SCaroline Tice     if (log)
5924838131bSGreg Clayton         log->Printf ("SBDebugger::StateIsStoppedState (state=%s) => %i",
593431ce678SGreg Clayton                      StateAsCString (state), result);
594ceb6b139SCaroline Tice 
5954838131bSGreg Clayton     return result;
59630fdc8d8SChris Lattner }
59730fdc8d8SChris Lattner 
598cac9c5f9SGreg Clayton lldb::SBTarget
599cac9c5f9SGreg Clayton SBDebugger::CreateTarget (const char *filename,
600cac9c5f9SGreg Clayton                           const char *target_triple,
601cac9c5f9SGreg Clayton                           const char *platform_name,
602cac9c5f9SGreg Clayton                           bool add_dependent_modules,
603cac9c5f9SGreg Clayton                           lldb::SBError& sb_error)
604cac9c5f9SGreg Clayton {
605cac9c5f9SGreg Clayton     SBTarget sb_target;
606b9556accSGreg Clayton     TargetSP target_sp;
607cac9c5f9SGreg Clayton     if (m_opaque_sp)
608cac9c5f9SGreg Clayton     {
609cac9c5f9SGreg Clayton         sb_error.Clear();
610cac9c5f9SGreg Clayton         OptionGroupPlatform platform_options (false);
611cac9c5f9SGreg Clayton         platform_options.SetPlatformName (platform_name);
612cac9c5f9SGreg Clayton 
613cac9c5f9SGreg Clayton         sb_error.ref() = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
614a0ca6601SGreg Clayton                                                                     filename,
615cac9c5f9SGreg Clayton                                                                     target_triple,
616cac9c5f9SGreg Clayton                                                                     add_dependent_modules,
617cac9c5f9SGreg Clayton                                                                     &platform_options,
618cac9c5f9SGreg Clayton                                                                     target_sp);
619cac9c5f9SGreg Clayton 
620cac9c5f9SGreg Clayton         if (sb_error.Success())
621b9556accSGreg Clayton             sb_target.SetSP (target_sp);
622cac9c5f9SGreg Clayton     }
623cac9c5f9SGreg Clayton     else
624cac9c5f9SGreg Clayton     {
6259f521f22SJim Ingham         sb_error.SetErrorString("invalid debugger");
626cac9c5f9SGreg Clayton     }
627cac9c5f9SGreg Clayton 
6285160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
629cac9c5f9SGreg Clayton     if (log)
630cac9c5f9SGreg Clayton         log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\", triple=%s, platform_name=%s, add_dependent_modules=%u, error=%s) => SBTarget(%p)",
631324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_sp.get()), filename,
632324a1036SSaleem Abdulrasool                      target_triple, platform_name, add_dependent_modules,
633324a1036SSaleem Abdulrasool                      sb_error.GetCString(), static_cast<void*>(target_sp.get()));
634cac9c5f9SGreg Clayton 
635cac9c5f9SGreg Clayton     return sb_target;
636cac9c5f9SGreg Clayton }
63730fdc8d8SChris Lattner 
63830fdc8d8SChris Lattner SBTarget
63930fdc8d8SChris Lattner SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename,
64030fdc8d8SChris Lattner                                                  const char *target_triple)
64130fdc8d8SChris Lattner {
642b9556accSGreg Clayton     SBTarget sb_target;
643b9556accSGreg Clayton     TargetSP target_sp;
6446611103cSGreg Clayton     if (m_opaque_sp)
6456611103cSGreg Clayton     {
646cac9c5f9SGreg Clayton         const bool add_dependent_modules = true;
647cac9c5f9SGreg Clayton         Error error (m_opaque_sp->GetTargetList().CreateTarget(*m_opaque_sp,
648a0ca6601SGreg Clayton                                                                filename,
649cac9c5f9SGreg Clayton                                                                target_triple,
650cac9c5f9SGreg Clayton                                                                add_dependent_modules,
651dbb0abbfSEugene Zelenko                                                                nullptr,
652cac9c5f9SGreg Clayton                                                                target_sp));
653b9556accSGreg Clayton         sb_target.SetSP (target_sp);
6546611103cSGreg Clayton     }
6554838131bSGreg Clayton 
6565160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
6574838131bSGreg Clayton     if (log)
658cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndTargetTriple (filename=\"%s\", triple=%s) => SBTarget(%p)",
659324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_sp.get()), filename,
660324a1036SSaleem Abdulrasool                      target_triple, static_cast<void*>(target_sp.get()));
6614838131bSGreg Clayton 
662b9556accSGreg Clayton     return sb_target;
66330fdc8d8SChris Lattner }
66430fdc8d8SChris Lattner 
66530fdc8d8SChris Lattner SBTarget
66664195a2cSGreg Clayton SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *arch_cstr)
66730fdc8d8SChris Lattner {
6685160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
669ceb6b139SCaroline Tice 
670b9556accSGreg Clayton     SBTarget sb_target;
671b9556accSGreg Clayton     TargetSP target_sp;
6726611103cSGreg Clayton     if (m_opaque_sp)
6736611103cSGreg Clayton     {
67430fdc8d8SChris Lattner         Error error;
675cac9c5f9SGreg Clayton         const bool add_dependent_modules = true;
67630fdc8d8SChris Lattner 
677cac9c5f9SGreg Clayton         error = m_opaque_sp->GetTargetList().CreateTarget(*m_opaque_sp,
678a0ca6601SGreg Clayton                                                           filename,
679cac9c5f9SGreg Clayton                                                           arch_cstr,
680cac9c5f9SGreg Clayton                                                           add_dependent_modules,
681dbb0abbfSEugene Zelenko                                                           nullptr,
682cac9c5f9SGreg Clayton                                                           target_sp);
68330fdc8d8SChris Lattner 
68430fdc8d8SChris Lattner         if (error.Success())
6856611103cSGreg Clayton         {
6862976d00aSJim Ingham             m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
687b9556accSGreg Clayton             sb_target.SetSP (target_sp);
6886611103cSGreg Clayton         }
6896611103cSGreg Clayton     }
690ceb6b139SCaroline Tice 
691ceb6b139SCaroline Tice     if (log)
692cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndArch (filename=\"%s\", arch=%s) => SBTarget(%p)",
693324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_sp.get()), filename, arch_cstr,
694324a1036SSaleem Abdulrasool                      static_cast<void*>(target_sp.get()));
695ceb6b139SCaroline Tice 
696b9556accSGreg Clayton     return sb_target;
69730fdc8d8SChris Lattner }
69830fdc8d8SChris Lattner 
69930fdc8d8SChris Lattner SBTarget
70030fdc8d8SChris Lattner SBDebugger::CreateTarget (const char *filename)
70130fdc8d8SChris Lattner {
702b9556accSGreg Clayton     SBTarget sb_target;
703b9556accSGreg Clayton     TargetSP target_sp;
7046611103cSGreg Clayton     if (m_opaque_sp)
7056611103cSGreg Clayton     {
70630fdc8d8SChris Lattner         Error error;
707cac9c5f9SGreg Clayton         const bool add_dependent_modules = true;
708cac9c5f9SGreg Clayton         error = m_opaque_sp->GetTargetList().CreateTarget(*m_opaque_sp,
709a0ca6601SGreg Clayton                                                           filename,
710dbb0abbfSEugene Zelenko                                                           nullptr,
711cac9c5f9SGreg Clayton                                                           add_dependent_modules,
712dbb0abbfSEugene Zelenko                                                           nullptr,
713cac9c5f9SGreg Clayton                                                           target_sp);
71430fdc8d8SChris Lattner 
7156611103cSGreg Clayton         if (error.Success())
7166611103cSGreg Clayton         {
7172976d00aSJim Ingham             m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
718b9556accSGreg Clayton             sb_target.SetSP (target_sp);
7196611103cSGreg Clayton         }
7206611103cSGreg Clayton     }
7215160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
7224838131bSGreg Clayton     if (log)
723cfd1acedSGreg Clayton         log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)",
724324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_sp.get()), filename,
725324a1036SSaleem Abdulrasool                      static_cast<void*>(target_sp.get()));
726b9556accSGreg Clayton     return sb_target;
72730fdc8d8SChris Lattner }
72830fdc8d8SChris Lattner 
7293794ad95SJohnny Chen bool
7303794ad95SJohnny Chen SBDebugger::DeleteTarget (lldb::SBTarget &target)
7313794ad95SJohnny Chen {
7323794ad95SJohnny Chen     bool result = false;
733b9556accSGreg Clayton     if (m_opaque_sp)
734b9556accSGreg Clayton     {
735b9556accSGreg Clayton         TargetSP target_sp(target.GetSP());
736b9556accSGreg Clayton         if (target_sp)
7373794ad95SJohnny Chen         {
7383794ad95SJohnny Chen             // No need to lock, the target list is thread safe
739b9556accSGreg Clayton             result = m_opaque_sp->GetTargetList().DeleteTarget (target_sp);
740b9556accSGreg Clayton             target_sp->Destroy();
74175340622SGreg Clayton             target.Clear();
7420cd70866SGreg Clayton             const bool mandatory = true;
7430cd70866SGreg Clayton             ModuleList::RemoveOrphanSharedModules(mandatory);
7443794ad95SJohnny Chen         }
745b9556accSGreg Clayton     }
7463794ad95SJohnny Chen 
7475160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
7483794ad95SJohnny Chen     if (log)
749324a1036SSaleem Abdulrasool         log->Printf ("SBDebugger(%p)::DeleteTarget (SBTarget(%p)) => %i",
750324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_sp.get()),
751324a1036SSaleem Abdulrasool                      static_cast<void*>(target.m_opaque_sp.get()), result);
7523794ad95SJohnny Chen 
7533794ad95SJohnny Chen     return result;
7543794ad95SJohnny Chen }
755dbb0abbfSEugene Zelenko 
75630fdc8d8SChris Lattner SBTarget
75730fdc8d8SChris Lattner SBDebugger::GetTargetAtIndex (uint32_t idx)
75830fdc8d8SChris Lattner {
7596611103cSGreg Clayton     SBTarget sb_target;
7606611103cSGreg Clayton     if (m_opaque_sp)
761af67cecdSGreg Clayton     {
762af67cecdSGreg Clayton         // No need to lock, the target list is thread safe
763b9556accSGreg Clayton         sb_target.SetSP (m_opaque_sp->GetTargetList().GetTargetAtIndex (idx));
764af67cecdSGreg Clayton     }
76530fdc8d8SChris Lattner     return sb_target;
76630fdc8d8SChris Lattner }
76730fdc8d8SChris Lattner 
7688499e1a4SJim Ingham uint32_t
7698499e1a4SJim Ingham SBDebugger::GetIndexOfTarget (lldb::SBTarget target)
7708499e1a4SJim Ingham {
7718499e1a4SJim Ingham 
7728499e1a4SJim Ingham     lldb::TargetSP target_sp = target.GetSP();
7738499e1a4SJim Ingham     if (!target_sp)
7748499e1a4SJim Ingham         return UINT32_MAX;
7758499e1a4SJim Ingham 
7768499e1a4SJim Ingham     if (!m_opaque_sp)
7778499e1a4SJim Ingham         return UINT32_MAX;
7788499e1a4SJim Ingham 
7798499e1a4SJim Ingham     return m_opaque_sp->GetTargetList().GetIndexOfTarget (target.GetSP());
7808499e1a4SJim Ingham }
7818499e1a4SJim Ingham 
78230fdc8d8SChris Lattner SBTarget
783997f6f7bSVirgile Bello SBDebugger::FindTargetWithProcessID (lldb::pid_t pid)
78430fdc8d8SChris Lattner {
7856611103cSGreg Clayton     SBTarget sb_target;
7866611103cSGreg Clayton     if (m_opaque_sp)
787af67cecdSGreg Clayton     {
788af67cecdSGreg Clayton         // No need to lock, the target list is thread safe
789b9556accSGreg Clayton         sb_target.SetSP (m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid));
790af67cecdSGreg Clayton     }
79130fdc8d8SChris Lattner     return sb_target;
79230fdc8d8SChris Lattner }
79330fdc8d8SChris Lattner 
79430fdc8d8SChris Lattner SBTarget
79530fdc8d8SChris Lattner SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name)
79630fdc8d8SChris Lattner {
7976611103cSGreg Clayton     SBTarget sb_target;
7986611103cSGreg Clayton     if (m_opaque_sp && filename && filename[0])
7996611103cSGreg Clayton     {
800af67cecdSGreg Clayton         // No need to lock, the target list is thread safe
801eb0103f2SGreg Clayton         ArchSpec arch (arch_name, m_opaque_sp->GetPlatformList().GetSelectedPlatform().get());
802dbb0abbfSEugene Zelenko         TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture(FileSpec(filename, false), arch_name ? &arch : nullptr));
803b9556accSGreg Clayton         sb_target.SetSP (target_sp);
8046611103cSGreg Clayton     }
8056611103cSGreg Clayton     return sb_target;
80630fdc8d8SChris Lattner }
80730fdc8d8SChris Lattner 
80830fdc8d8SChris Lattner SBTarget
809431ce678SGreg Clayton SBDebugger::FindTargetWithLLDBProcess (const ProcessSP &process_sp)
81030fdc8d8SChris Lattner {
8116611103cSGreg Clayton     SBTarget sb_target;
8126611103cSGreg Clayton     if (m_opaque_sp)
813af67cecdSGreg Clayton     {
814af67cecdSGreg Clayton         // No need to lock, the target list is thread safe
815b9556accSGreg Clayton         sb_target.SetSP (m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get()));
816af67cecdSGreg Clayton     }
81730fdc8d8SChris Lattner     return sb_target;
81830fdc8d8SChris Lattner }
81930fdc8d8SChris Lattner 
82030fdc8d8SChris Lattner uint32_t
82130fdc8d8SChris Lattner SBDebugger::GetNumTargets ()
82230fdc8d8SChris Lattner {
8236611103cSGreg Clayton     if (m_opaque_sp)
824af67cecdSGreg Clayton     {
825af67cecdSGreg Clayton         // No need to lock, the target list is thread safe
8266611103cSGreg Clayton         return m_opaque_sp->GetTargetList().GetNumTargets ();
827af67cecdSGreg Clayton     }
8286611103cSGreg Clayton     return 0;
8296611103cSGreg Clayton }
83030fdc8d8SChris Lattner 
83130fdc8d8SChris Lattner SBTarget
8322976d00aSJim Ingham SBDebugger::GetSelectedTarget ()
83330fdc8d8SChris Lattner {
8345160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
835ceb6b139SCaroline Tice 
8366611103cSGreg Clayton     SBTarget sb_target;
837b9556accSGreg Clayton     TargetSP target_sp;
8386611103cSGreg Clayton     if (m_opaque_sp)
839af67cecdSGreg Clayton     {
840af67cecdSGreg Clayton         // No need to lock, the target list is thread safe
841b9556accSGreg Clayton         target_sp = m_opaque_sp->GetTargetList().GetSelectedTarget ();
842b9556accSGreg Clayton         sb_target.SetSP (target_sp);
843af67cecdSGreg Clayton     }
844ceb6b139SCaroline Tice 
845ceb6b139SCaroline Tice     if (log)
846ceb6b139SCaroline Tice     {
847ceb6b139SCaroline Tice         SBStream sstr;
848431ce678SGreg Clayton         sb_target.GetDescription (sstr, eDescriptionLevelBrief);
849324a1036SSaleem Abdulrasool         log->Printf ("SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s",
850324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_sp.get()),
851324a1036SSaleem Abdulrasool                      static_cast<void*>(target_sp.get()), sstr.GetData());
852ceb6b139SCaroline Tice     }
853ceb6b139SCaroline Tice 
85430fdc8d8SChris Lattner     return sb_target;
85530fdc8d8SChris Lattner }
85630fdc8d8SChris Lattner 
85730fdc8d8SChris Lattner void
858e64f0dc7SJim Ingham SBDebugger::SetSelectedTarget (SBTarget &sb_target)
859e64f0dc7SJim Ingham {
8605160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
861e64f0dc7SJim Ingham 
862b9556accSGreg Clayton     TargetSP target_sp (sb_target.GetSP());
863e64f0dc7SJim Ingham     if (m_opaque_sp)
864e64f0dc7SJim Ingham     {
865b9556accSGreg Clayton         m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
866e64f0dc7SJim Ingham     }
867e64f0dc7SJim Ingham     if (log)
868e64f0dc7SJim Ingham     {
869e64f0dc7SJim Ingham         SBStream sstr;
870e64f0dc7SJim Ingham         sb_target.GetDescription (sstr, eDescriptionLevelBrief);
871324a1036SSaleem Abdulrasool         log->Printf ("SBDebugger(%p)::SetSelectedTarget () => SBTarget(%p): %s",
872324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_sp.get()),
873324a1036SSaleem Abdulrasool                      static_cast<void*>(target_sp.get()), sstr.GetData());
874e64f0dc7SJim Ingham     }
875e64f0dc7SJim Ingham }
876e64f0dc7SJim Ingham 
877fbb76349SGreg Clayton SBPlatform
878fbb76349SGreg Clayton SBDebugger::GetSelectedPlatform()
879fbb76349SGreg Clayton {
880fbb76349SGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
881fbb76349SGreg Clayton 
882fbb76349SGreg Clayton     SBPlatform sb_platform;
883fbb76349SGreg Clayton     DebuggerSP debugger_sp(m_opaque_sp);
884fbb76349SGreg Clayton     if (debugger_sp)
885fbb76349SGreg Clayton     {
886fbb76349SGreg Clayton         sb_platform.SetSP(debugger_sp->GetPlatformList().GetSelectedPlatform());
887fbb76349SGreg Clayton     }
888fbb76349SGreg Clayton     if (log)
889324a1036SSaleem Abdulrasool         log->Printf ("SBDebugger(%p)::GetSelectedPlatform () => SBPlatform(%p): %s",
890324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_sp.get()),
891324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_platform.GetSP().get()),
892324a1036SSaleem Abdulrasool                      sb_platform.GetName());
893fbb76349SGreg Clayton     return sb_platform;
894fbb76349SGreg Clayton }
895fbb76349SGreg Clayton 
896fbb76349SGreg Clayton void
897fbb76349SGreg Clayton SBDebugger::SetSelectedPlatform(SBPlatform &sb_platform)
898fbb76349SGreg Clayton {
899fbb76349SGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
900fbb76349SGreg Clayton 
901fbb76349SGreg Clayton     DebuggerSP debugger_sp(m_opaque_sp);
902fbb76349SGreg Clayton     if (debugger_sp)
903fbb76349SGreg Clayton     {
904fbb76349SGreg Clayton         debugger_sp->GetPlatformList().SetSelectedPlatform(sb_platform.GetSP());
905fbb76349SGreg Clayton     }
906324a1036SSaleem Abdulrasool 
907fbb76349SGreg Clayton     if (log)
908324a1036SSaleem Abdulrasool         log->Printf ("SBDebugger(%p)::SetSelectedPlatform (SBPlatform(%p) %s)",
909324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_sp.get()),
910324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_platform.GetSP().get()),
911324a1036SSaleem Abdulrasool                      sb_platform.GetName());
912fbb76349SGreg Clayton }
913fbb76349SGreg Clayton 
914e64f0dc7SJim Ingham void
915c30a73adSEnrico Granata SBDebugger::DispatchInput (void* baton, const void *data, size_t data_len)
9166b09d423SEnrico Granata {
9176b09d423SEnrico Granata     DispatchInput (data,data_len);
9186b09d423SEnrico Granata }
9196b09d423SEnrico Granata 
9206b09d423SEnrico Granata void
921c3019991SFilipe Cabecinhas SBDebugger::DispatchInput (const void *data, size_t data_len)
92230fdc8d8SChris Lattner {
92344d93782SGreg Clayton //    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
92444d93782SGreg Clayton //
92544d93782SGreg Clayton //    if (log)
92644d93782SGreg Clayton //        log->Printf ("SBDebugger(%p)::DispatchInput (data=\"%.*s\", size_t=%" PRIu64 ")",
92744d93782SGreg Clayton //                     m_opaque_sp.get(),
92844d93782SGreg Clayton //                     (int) data_len,
92944d93782SGreg Clayton //                     (const char *) data,
93044d93782SGreg Clayton //                     (uint64_t)data_len);
93144d93782SGreg Clayton //
93244d93782SGreg Clayton //    if (m_opaque_sp)
93344d93782SGreg Clayton //        m_opaque_sp->DispatchInput ((const char *) data, data_len);
93430fdc8d8SChris Lattner }
93530fdc8d8SChris Lattner 
93630fdc8d8SChris Lattner void
937efed6131SCaroline Tice SBDebugger::DispatchInputInterrupt ()
938efed6131SCaroline Tice {
939efed6131SCaroline Tice     if (m_opaque_sp)
940efed6131SCaroline Tice         m_opaque_sp->DispatchInputInterrupt ();
941efed6131SCaroline Tice }
942efed6131SCaroline Tice 
943efed6131SCaroline Tice void
944efed6131SCaroline Tice SBDebugger::DispatchInputEndOfFile ()
945efed6131SCaroline Tice {
946efed6131SCaroline Tice     if (m_opaque_sp)
947efed6131SCaroline Tice         m_opaque_sp->DispatchInputEndOfFile ();
948efed6131SCaroline Tice }
9499088b068SCaroline Tice 
950efed6131SCaroline Tice void
95130fdc8d8SChris Lattner SBDebugger::PushInputReader (SBInputReader &reader)
95230fdc8d8SChris Lattner {
95330fdc8d8SChris Lattner }
9546611103cSGreg Clayton 
9556611103cSGreg Clayton void
95644d93782SGreg Clayton SBDebugger::RunCommandInterpreter (bool auto_handle_events,
95744d93782SGreg Clayton                                    bool spawn_thread)
958969ed3d1SCaroline Tice {
959969ed3d1SCaroline Tice     if (m_opaque_sp)
96026c7bf93SJim Ingham     {
96126c7bf93SJim Ingham         CommandInterpreterRunOptions options;
96226c7bf93SJim Ingham 
96326c7bf93SJim Ingham         m_opaque_sp->GetCommandInterpreter().RunCommandInterpreter(auto_handle_events,
96426c7bf93SJim Ingham                                                                    spawn_thread,
96526c7bf93SJim Ingham                                                                    options);
96626c7bf93SJim Ingham     }
96726c7bf93SJim Ingham }
96826c7bf93SJim Ingham 
96926c7bf93SJim Ingham void
97026c7bf93SJim Ingham SBDebugger::RunCommandInterpreter (bool auto_handle_events,
97126c7bf93SJim Ingham                                    bool spawn_thread,
97226c7bf93SJim Ingham                                    SBCommandInterpreterRunOptions &options,
97326c7bf93SJim Ingham                                    int  &num_errors,
974ffc9f1deSJim Ingham                                    bool &quit_requested,
975ffc9f1deSJim Ingham                                    bool &stopped_for_crash)
97626c7bf93SJim Ingham 
97726c7bf93SJim Ingham {
97826c7bf93SJim Ingham     if (m_opaque_sp)
97926c7bf93SJim Ingham     {
98026c7bf93SJim Ingham         CommandInterpreter &interp = m_opaque_sp->GetCommandInterpreter();
98126c7bf93SJim Ingham         interp.RunCommandInterpreter(auto_handle_events, spawn_thread, options.ref());
98226c7bf93SJim Ingham         num_errors = interp.GetNumErrors();
98326c7bf93SJim Ingham         quit_requested = interp.GetQuitRequested();
984ffc9f1deSJim Ingham         stopped_for_crash = interp.GetStoppedForCrash();
98526c7bf93SJim Ingham     }
986969ed3d1SCaroline Tice }
987969ed3d1SCaroline Tice 
9883e7e915dSSean Callanan SBError
9893e7e915dSSean Callanan SBDebugger::RunREPL (lldb::LanguageType language, const char *repl_options)
9903e7e915dSSean Callanan {
9913e7e915dSSean Callanan     SBError error;
9923e7e915dSSean Callanan     if (m_opaque_sp)
9933e7e915dSSean Callanan         error.ref() = m_opaque_sp->RunREPL(language, repl_options);
9943e7e915dSSean Callanan     else
9953e7e915dSSean Callanan         error.SetErrorString ("invalid debugger");
9963e7e915dSSean Callanan     return error;
9973e7e915dSSean Callanan }
9983e7e915dSSean Callanan 
999969ed3d1SCaroline Tice void
1000431ce678SGreg Clayton SBDebugger::reset (const DebuggerSP &debugger_sp)
10016611103cSGreg Clayton {
10026611103cSGreg Clayton     m_opaque_sp = debugger_sp;
10036611103cSGreg Clayton }
10046611103cSGreg Clayton 
10056611103cSGreg Clayton Debugger *
10066611103cSGreg Clayton SBDebugger::get () const
10076611103cSGreg Clayton {
10086611103cSGreg Clayton     return m_opaque_sp.get();
10096611103cSGreg Clayton }
10106611103cSGreg Clayton 
10116611103cSGreg Clayton Debugger &
10126611103cSGreg Clayton SBDebugger::ref () const
10136611103cSGreg Clayton {
10146611103cSGreg Clayton     assert (m_opaque_sp.get());
10156611103cSGreg Clayton     return *m_opaque_sp;
10166611103cSGreg Clayton }
10176611103cSGreg Clayton 
10189a37766eSGreg Clayton const lldb::DebuggerSP &
10199a37766eSGreg Clayton SBDebugger::get_sp () const
10209a37766eSGreg Clayton {
10219a37766eSGreg Clayton     return m_opaque_sp;
10229a37766eSGreg Clayton }
10236611103cSGreg Clayton 
1024ebc1bb27SCaroline Tice SBDebugger
1025ebc1bb27SCaroline Tice SBDebugger::FindDebuggerWithID (int id)
1026ebc1bb27SCaroline Tice {
1027af67cecdSGreg Clayton     // No need to lock, the debugger list is thread safe
1028ebc1bb27SCaroline Tice     SBDebugger sb_debugger;
1029431ce678SGreg Clayton     DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id);
1030ebc1bb27SCaroline Tice     if (debugger_sp)
1031ebc1bb27SCaroline Tice         sb_debugger.reset (debugger_sp);
1032ebc1bb27SCaroline Tice     return sb_debugger;
1033ebc1bb27SCaroline Tice }
1034e40e4218SJim Ingham 
1035dd759857SCaroline Tice const char *
1036dd759857SCaroline Tice SBDebugger::GetInstanceName()
1037dd759857SCaroline Tice {
1038dbb0abbfSEugene Zelenko     return (m_opaque_sp ? m_opaque_sp->GetInstanceName().AsCString() : nullptr);
1039dd759857SCaroline Tice }
1040dd759857SCaroline Tice 
10413df9a8dfSCaroline Tice SBError
1042dd759857SCaroline Tice SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name)
10433df9a8dfSCaroline Tice {
10446920b52bSGreg Clayton     SBError sb_error;
10456920b52bSGreg Clayton     DebuggerSP debugger_sp(Debugger::FindDebuggerWithInstanceName (ConstString(debugger_instance_name)));
10466920b52bSGreg Clayton     Error error;
10476920b52bSGreg Clayton     if (debugger_sp)
10486920b52bSGreg Clayton     {
10496920b52bSGreg Clayton         ExecutionContext exe_ctx (debugger_sp->GetCommandInterpreter().GetExecutionContext());
10506920b52bSGreg Clayton         error = debugger_sp->SetPropertyValue (&exe_ctx,
10516920b52bSGreg Clayton                                                eVarSetOperationAssign,
10526920b52bSGreg Clayton                                                var_name,
10536920b52bSGreg Clayton                                                value);
10546920b52bSGreg Clayton     }
10556920b52bSGreg Clayton     else
10566920b52bSGreg Clayton     {
10576920b52bSGreg Clayton         error.SetErrorStringWithFormat ("invalid debugger instance name '%s'", debugger_instance_name);
10586920b52bSGreg Clayton     }
10596920b52bSGreg Clayton     if (error.Fail())
10606920b52bSGreg Clayton         sb_error.SetError(error);
10616920b52bSGreg Clayton     return sb_error;
10623df9a8dfSCaroline Tice }
10633df9a8dfSCaroline Tice 
1064431ce678SGreg Clayton SBStringList
1065dd759857SCaroline Tice SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name)
10663df9a8dfSCaroline Tice {
10673df9a8dfSCaroline Tice     SBStringList ret_value;
10686920b52bSGreg Clayton     DebuggerSP debugger_sp(Debugger::FindDebuggerWithInstanceName (ConstString(debugger_instance_name)));
10696920b52bSGreg Clayton     Error error;
10706920b52bSGreg Clayton     if (debugger_sp)
10716920b52bSGreg Clayton     {
10726920b52bSGreg Clayton         ExecutionContext exe_ctx (debugger_sp->GetCommandInterpreter().GetExecutionContext());
10736920b52bSGreg Clayton         lldb::OptionValueSP value_sp (debugger_sp->GetPropertyValue (&exe_ctx,
10746920b52bSGreg Clayton                                                                      var_name,
10756920b52bSGreg Clayton                                                                      false,
10766920b52bSGreg Clayton                                                                      error));
10776920b52bSGreg Clayton         if (value_sp)
10786920b52bSGreg Clayton         {
10796920b52bSGreg Clayton             StreamString value_strm;
10806920b52bSGreg Clayton             value_sp->DumpValue (&exe_ctx, value_strm, OptionValue::eDumpOptionValue);
10816920b52bSGreg Clayton             const std::string &value_str = value_strm.GetString();
10826920b52bSGreg Clayton             if (!value_str.empty())
10836920b52bSGreg Clayton             {
10846920b52bSGreg Clayton                 StringList string_list;
108544d93782SGreg Clayton                 string_list.SplitIntoLines(value_str);
10866920b52bSGreg Clayton                 return SBStringList(&string_list);
10876920b52bSGreg Clayton             }
10886920b52bSGreg Clayton         }
10896920b52bSGreg Clayton     }
10906920b52bSGreg Clayton     return SBStringList();
10913df9a8dfSCaroline Tice }
10923df9a8dfSCaroline Tice 
1093a7015092SGreg Clayton uint32_t
1094a7015092SGreg Clayton SBDebugger::GetTerminalWidth() const
1095a7015092SGreg Clayton {
1096dbb0abbfSEugene Zelenko     return (m_opaque_sp ? m_opaque_sp->GetTerminalWidth() : 0);
1097a7015092SGreg Clayton }
1098a7015092SGreg Clayton 
1099a7015092SGreg Clayton void
1100a7015092SGreg Clayton SBDebugger::SetTerminalWidth (uint32_t term_width)
1101a7015092SGreg Clayton {
1102a7015092SGreg Clayton     if (m_opaque_sp)
1103a7015092SGreg Clayton         m_opaque_sp->SetTerminalWidth (term_width);
1104a7015092SGreg Clayton }
1105a7015092SGreg Clayton 
1106a7015092SGreg Clayton const char *
1107a7015092SGreg Clayton SBDebugger::GetPrompt() const
1108a7015092SGreg Clayton {
11095160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1110ceb6b139SCaroline Tice 
1111ceb6b139SCaroline Tice     if (log)
1112324a1036SSaleem Abdulrasool         log->Printf ("SBDebugger(%p)::GetPrompt () => \"%s\"",
1113324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_sp.get()),
1114750cd175SCaroline Tice                      (m_opaque_sp ? m_opaque_sp->GetPrompt() : ""));
1115ceb6b139SCaroline Tice 
1116dbb0abbfSEugene Zelenko     return (m_opaque_sp ? m_opaque_sp->GetPrompt() : nullptr);
1117a7015092SGreg Clayton }
1118a7015092SGreg Clayton 
1119a7015092SGreg Clayton void
1120a7015092SGreg Clayton SBDebugger::SetPrompt (const char *prompt)
1121a7015092SGreg Clayton {
1122a7015092SGreg Clayton     if (m_opaque_sp)
1123a7015092SGreg Clayton         m_opaque_sp->SetPrompt (prompt);
1124a7015092SGreg Clayton }
1125a7015092SGreg Clayton 
1126431ce678SGreg Clayton ScriptLanguage
1127a7015092SGreg Clayton SBDebugger::GetScriptLanguage() const
1128a7015092SGreg Clayton {
1129dbb0abbfSEugene Zelenko     return (m_opaque_sp ? m_opaque_sp->GetScriptLanguage() : eScriptLanguageNone);
1130a7015092SGreg Clayton }
1131a7015092SGreg Clayton 
1132a7015092SGreg Clayton void
1133431ce678SGreg Clayton SBDebugger::SetScriptLanguage (ScriptLanguage script_lang)
1134a7015092SGreg Clayton {
1135a7015092SGreg Clayton     if (m_opaque_sp)
1136af67cecdSGreg Clayton     {
1137a7015092SGreg Clayton         m_opaque_sp->SetScriptLanguage (script_lang);
1138a7015092SGreg Clayton     }
1139af67cecdSGreg Clayton }
1140a7015092SGreg Clayton 
1141e40e4218SJim Ingham bool
1142e40e4218SJim Ingham SBDebugger::SetUseExternalEditor(bool value)
1143e40e4218SJim Ingham {
1144dbb0abbfSEugene Zelenko     return (m_opaque_sp ? m_opaque_sp->SetUseExternalEditor(value) : false);
1145e40e4218SJim Ingham }
1146e40e4218SJim Ingham 
1147e40e4218SJim Ingham bool
1148daccaa9eSCaroline Tice SBDebugger::GetUseExternalEditor()
1149e40e4218SJim Ingham {
1150dbb0abbfSEugene Zelenko     return (m_opaque_sp ? m_opaque_sp->GetUseExternalEditor() : false);
1151e40e4218SJim Ingham }
1152e40e4218SJim Ingham 
1153dde9cff3SCaroline Tice bool
1154c3ce7f27SMichael Sartain SBDebugger::SetUseColor(bool value)
1155c3ce7f27SMichael Sartain {
1156dbb0abbfSEugene Zelenko     return (m_opaque_sp ? m_opaque_sp->SetUseColor(value) : false);
1157c3ce7f27SMichael Sartain }
1158c3ce7f27SMichael Sartain 
1159c3ce7f27SMichael Sartain bool
1160c3ce7f27SMichael Sartain SBDebugger::GetUseColor() const
1161c3ce7f27SMichael Sartain {
1162dbb0abbfSEugene Zelenko     return (m_opaque_sp ? m_opaque_sp->GetUseColor() : false);
1163c3ce7f27SMichael Sartain }
1164c3ce7f27SMichael Sartain 
1165c3ce7f27SMichael Sartain bool
1166dde9cff3SCaroline Tice SBDebugger::GetDescription (SBStream &description)
1167dde9cff3SCaroline Tice {
1168da7bc7d0SGreg Clayton     Stream &strm = description.ref();
1169da7bc7d0SGreg Clayton 
1170dde9cff3SCaroline Tice     if (m_opaque_sp)
1171dde9cff3SCaroline Tice     {
1172dde9cff3SCaroline Tice         const char *name = m_opaque_sp->GetInstanceName().AsCString();
1173431ce678SGreg Clayton         user_id_t id = m_opaque_sp->GetID();
1174d01b2953SDaniel Malea         strm.Printf ("Debugger (instance: \"%s\", id: %" PRIu64 ")", name, id);
1175dde9cff3SCaroline Tice     }
1176dde9cff3SCaroline Tice     else
1177da7bc7d0SGreg Clayton         strm.PutCString ("No value");
1178dde9cff3SCaroline Tice 
1179dde9cff3SCaroline Tice     return true;
1180dde9cff3SCaroline Tice }
1181efed6131SCaroline Tice 
1182431ce678SGreg Clayton user_id_t
1183efed6131SCaroline Tice SBDebugger::GetID()
1184efed6131SCaroline Tice {
1185dbb0abbfSEugene Zelenko     return (m_opaque_sp ? m_opaque_sp->GetID() : LLDB_INVALID_UID);
1186efed6131SCaroline Tice }
11872289fa48SGreg Clayton 
11882289fa48SGreg Clayton SBError
1189615eb7e6SGreg Clayton SBDebugger::SetCurrentPlatform (const char *platform_name_cstr)
11902289fa48SGreg Clayton {
11912289fa48SGreg Clayton     SBError sb_error;
11922289fa48SGreg Clayton     if (m_opaque_sp)
11932289fa48SGreg Clayton     {
1194615eb7e6SGreg Clayton         if (platform_name_cstr && platform_name_cstr[0])
1195615eb7e6SGreg Clayton         {
1196615eb7e6SGreg Clayton             ConstString platform_name (platform_name_cstr);
1197615eb7e6SGreg Clayton             PlatformSP platform_sp (Platform::Find (platform_name));
11982289fa48SGreg Clayton 
11992289fa48SGreg Clayton             if (platform_sp)
12002289fa48SGreg Clayton             {
1201615eb7e6SGreg Clayton                 // Already have a platform with this name, just select it
1202615eb7e6SGreg Clayton                 m_opaque_sp->GetPlatformList().SetSelectedPlatform(platform_sp);
1203615eb7e6SGreg Clayton             }
1204615eb7e6SGreg Clayton             else
1205615eb7e6SGreg Clayton             {
1206615eb7e6SGreg Clayton                 // We don't have a platform by this name yet, create one
1207615eb7e6SGreg Clayton                 platform_sp = Platform::Create (platform_name, sb_error.ref());
1208615eb7e6SGreg Clayton                 if (platform_sp)
1209615eb7e6SGreg Clayton                 {
1210615eb7e6SGreg Clayton                     // We created the platform, now append and select it
12112289fa48SGreg Clayton                     bool make_selected = true;
12122289fa48SGreg Clayton                     m_opaque_sp->GetPlatformList().Append (platform_sp, make_selected);
12132289fa48SGreg Clayton                 }
12142289fa48SGreg Clayton             }
1215615eb7e6SGreg Clayton         }
1216615eb7e6SGreg Clayton         else
1217615eb7e6SGreg Clayton         {
1218615eb7e6SGreg Clayton             sb_error.ref().SetErrorString("invalid platform name");
1219615eb7e6SGreg Clayton         }
1220615eb7e6SGreg Clayton     }
1221615eb7e6SGreg Clayton     else
1222615eb7e6SGreg Clayton     {
1223615eb7e6SGreg Clayton         sb_error.ref().SetErrorString("invalid debugger");
1224615eb7e6SGreg Clayton     }
12252289fa48SGreg Clayton     return sb_error;
12262289fa48SGreg Clayton }
12272289fa48SGreg Clayton 
1228fc3f027dSGreg Clayton bool
1229f3dd93c8SGreg Clayton SBDebugger::SetCurrentPlatformSDKRoot (const char *sysroot)
1230f3dd93c8SGreg Clayton {
1231*e1cf274bSJason Molenda     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1232f3dd93c8SGreg Clayton     if (m_opaque_sp)
1233f3dd93c8SGreg Clayton     {
1234f3dd93c8SGreg Clayton         PlatformSP platform_sp (m_opaque_sp->GetPlatformList().GetSelectedPlatform());
1235f3dd93c8SGreg Clayton 
1236f3dd93c8SGreg Clayton         if (platform_sp)
1237f3dd93c8SGreg Clayton         {
1238*e1cf274bSJason Molenda             if (log && sysroot)
1239*e1cf274bSJason Molenda                 log->Printf ("SBDebugger::SetCurrentPlatformSDKRoot (\"%s\")", sysroot);
1240f3dd93c8SGreg Clayton             platform_sp->SetSDKRootDirectory (ConstString (sysroot));
1241f3dd93c8SGreg Clayton             return true;
1242f3dd93c8SGreg Clayton         }
1243f3dd93c8SGreg Clayton     }
1244f3dd93c8SGreg Clayton     return false;
1245f3dd93c8SGreg Clayton }
1246f3dd93c8SGreg Clayton 
1247f3dd93c8SGreg Clayton bool
1248fc3f027dSGreg Clayton SBDebugger::GetCloseInputOnEOF() const
1249fc3f027dSGreg Clayton {
1250dbb0abbfSEugene Zelenko     return (m_opaque_sp ? m_opaque_sp->GetCloseInputOnEOF() : false);
1251fc3f027dSGreg Clayton }
1252fc3f027dSGreg Clayton 
1253fc3f027dSGreg Clayton void
1254fc3f027dSGreg Clayton SBDebugger::SetCloseInputOnEOF (bool b)
1255fc3f027dSGreg Clayton {
1256fc3f027dSGreg Clayton     if (m_opaque_sp)
1257fc3f027dSGreg Clayton         m_opaque_sp->SetCloseInputOnEOF (b);
1258fc3f027dSGreg Clayton }
1259061858ceSEnrico Granata 
1260061858ceSEnrico Granata SBTypeCategory
1261061858ceSEnrico Granata SBDebugger::GetCategory (const char* category_name)
1262061858ceSEnrico Granata {
1263061858ceSEnrico Granata     if (!category_name || *category_name == 0)
1264061858ceSEnrico Granata         return SBTypeCategory();
1265061858ceSEnrico Granata 
1266061858ceSEnrico Granata     TypeCategoryImplSP category_sp;
1267061858ceSEnrico Granata 
1268061858ceSEnrico Granata     if (DataVisualization::Categories::GetCategory(ConstString(category_name), category_sp, false))
1269061858ceSEnrico Granata         return SBTypeCategory(category_sp);
1270061858ceSEnrico Granata     else
1271061858ceSEnrico Granata         return SBTypeCategory();
1272061858ceSEnrico Granata }
1273061858ceSEnrico Granata 
1274061858ceSEnrico Granata SBTypeCategory
1275e242624cSEnrico Granata SBDebugger::GetCategory (lldb::LanguageType lang_type)
1276e242624cSEnrico Granata {
1277e242624cSEnrico Granata     TypeCategoryImplSP category_sp;
1278e242624cSEnrico Granata     if (DataVisualization::Categories::GetCategory(lang_type, category_sp))
1279e242624cSEnrico Granata         return SBTypeCategory(category_sp);
1280e242624cSEnrico Granata     else
1281e242624cSEnrico Granata         return SBTypeCategory();
1282e242624cSEnrico Granata }
1283e242624cSEnrico Granata 
1284e242624cSEnrico Granata SBTypeCategory
1285061858ceSEnrico Granata SBDebugger::CreateCategory (const char* category_name)
1286061858ceSEnrico Granata {
1287061858ceSEnrico Granata     if (!category_name || *category_name == 0)
1288061858ceSEnrico Granata         return SBTypeCategory();
1289061858ceSEnrico Granata 
1290061858ceSEnrico Granata     TypeCategoryImplSP category_sp;
1291061858ceSEnrico Granata 
1292061858ceSEnrico Granata     if (DataVisualization::Categories::GetCategory(ConstString(category_name), category_sp, true))
1293061858ceSEnrico Granata         return SBTypeCategory(category_sp);
1294061858ceSEnrico Granata     else
1295061858ceSEnrico Granata         return SBTypeCategory();
1296061858ceSEnrico Granata }
1297061858ceSEnrico Granata 
1298061858ceSEnrico Granata bool
1299061858ceSEnrico Granata SBDebugger::DeleteCategory (const char* category_name)
1300061858ceSEnrico Granata {
1301061858ceSEnrico Granata     if (!category_name || *category_name == 0)
1302061858ceSEnrico Granata         return false;
1303061858ceSEnrico Granata 
1304061858ceSEnrico Granata     return DataVisualization::Categories::Delete(ConstString(category_name));
1305061858ceSEnrico Granata }
1306061858ceSEnrico Granata 
1307061858ceSEnrico Granata uint32_t
1308061858ceSEnrico Granata SBDebugger::GetNumCategories()
1309061858ceSEnrico Granata {
1310061858ceSEnrico Granata     return DataVisualization::Categories::GetCount();
1311061858ceSEnrico Granata }
1312061858ceSEnrico Granata 
1313061858ceSEnrico Granata SBTypeCategory
1314061858ceSEnrico Granata SBDebugger::GetCategoryAtIndex (uint32_t index)
1315061858ceSEnrico Granata {
1316061858ceSEnrico Granata     return SBTypeCategory(DataVisualization::Categories::GetCategoryAtIndex(index));
1317061858ceSEnrico Granata }
1318061858ceSEnrico Granata 
1319061858ceSEnrico Granata SBTypeCategory
1320061858ceSEnrico Granata SBDebugger::GetDefaultCategory()
1321061858ceSEnrico Granata {
1322061858ceSEnrico Granata     return GetCategory("default");
1323061858ceSEnrico Granata }
1324061858ceSEnrico Granata 
1325061858ceSEnrico Granata SBTypeFormat
1326061858ceSEnrico Granata SBDebugger::GetFormatForType (SBTypeNameSpecifier type_name)
1327061858ceSEnrico Granata {
1328061858ceSEnrico Granata     SBTypeCategory default_category_sb = GetDefaultCategory();
1329061858ceSEnrico Granata     if (default_category_sb.GetEnabled())
1330061858ceSEnrico Granata         return default_category_sb.GetFormatForType(type_name);
1331061858ceSEnrico Granata     return SBTypeFormat();
1332061858ceSEnrico Granata }
1333061858ceSEnrico Granata 
1334cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON
1335061858ceSEnrico Granata SBTypeSummary
1336061858ceSEnrico Granata SBDebugger::GetSummaryForType (SBTypeNameSpecifier type_name)
1337061858ceSEnrico Granata {
1338dbb0abbfSEugene Zelenko     if (!type_name.IsValid())
1339a777dc2aSEnrico Granata         return SBTypeSummary();
1340a777dc2aSEnrico Granata     return SBTypeSummary(DataVisualization::GetSummaryForType(type_name.GetSP()));
1341061858ceSEnrico Granata }
1342cf7e2dc0SJason Molenda #endif // LLDB_DISABLE_PYTHON
1343061858ceSEnrico Granata 
1344061858ceSEnrico Granata SBTypeFilter
1345061858ceSEnrico Granata SBDebugger::GetFilterForType (SBTypeNameSpecifier type_name)
1346061858ceSEnrico Granata {
1347dbb0abbfSEugene Zelenko     if (!type_name.IsValid())
1348a777dc2aSEnrico Granata         return SBTypeFilter();
1349a777dc2aSEnrico Granata     return SBTypeFilter(DataVisualization::GetFilterForType(type_name.GetSP()));
1350061858ceSEnrico Granata }
1351061858ceSEnrico Granata 
1352cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON
1353061858ceSEnrico Granata SBTypeSynthetic
1354061858ceSEnrico Granata SBDebugger::GetSyntheticForType (SBTypeNameSpecifier type_name)
1355061858ceSEnrico Granata {
1356dbb0abbfSEugene Zelenko     if (!type_name.IsValid())
1357a777dc2aSEnrico Granata         return SBTypeSynthetic();
1358a777dc2aSEnrico Granata     return SBTypeSynthetic(DataVisualization::GetSyntheticForType(type_name.GetSP()));
1359061858ceSEnrico Granata }
1360cf7e2dc0SJason Molenda #endif // LLDB_DISABLE_PYTHON
1361061858ceSEnrico Granata 
1362228063cdSJim Ingham bool
1363228063cdSJim Ingham SBDebugger::EnableLog (const char *channel, const char **categories)
1364228063cdSJim Ingham {
1365228063cdSJim Ingham     if (m_opaque_sp)
1366228063cdSJim Ingham     {
1367228063cdSJim Ingham         uint32_t log_options = LLDB_LOG_OPTION_PREPEND_TIMESTAMP | LLDB_LOG_OPTION_PREPEND_THREAD_NAME;
1368228063cdSJim Ingham         StreamString errors;
1369dbb0abbfSEugene Zelenko         return m_opaque_sp->EnableLog(channel, categories, nullptr, log_options, errors);
1370228063cdSJim Ingham     }
1371228063cdSJim Ingham     else
1372228063cdSJim Ingham         return false;
1373228063cdSJim Ingham }
13744f02b22dSJim Ingham 
13754f02b22dSJim Ingham void
13764f02b22dSJim Ingham SBDebugger::SetLoggingCallback (lldb::LogOutputCallback log_callback, void *baton)
13774f02b22dSJim Ingham {
13784f02b22dSJim Ingham     if (m_opaque_sp)
13794f02b22dSJim Ingham     {
13804f02b22dSJim Ingham         return m_opaque_sp->SetLoggingCallback (log_callback, baton);
13814f02b22dSJim Ingham     }
13824f02b22dSJim Ingham }
1383