180814287SRaphael Isemann //===-- SBDebugger.cpp ----------------------------------------------------===//
230fdc8d8SChris Lattner //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
630fdc8d8SChris Lattner //
730fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
830fdc8d8SChris Lattner 
9c34698a8SPavel Labath #include "lldb/API/SBDebugger.h"
10d17cd902SAlex Langford #include "SystemInitializerFull.h"
111755f5b1SJonas Devlieghere #include "lldb/Utility/Instrumentation.h"
12c34698a8SPavel Labath #include "lldb/Utility/LLDBLog.h"
1330fdc8d8SChris Lattner 
14ca93cc1dSEli Friedman #include "lldb/API/SBBroadcaster.h"
15ca93cc1dSEli Friedman #include "lldb/API/SBCommandInterpreter.h"
164b354039SJonas Devlieghere #include "lldb/API/SBCommandInterpreterRunOptions.h"
17ca93cc1dSEli Friedman #include "lldb/API/SBCommandReturnObject.h"
182289fa48SGreg Clayton #include "lldb/API/SBError.h"
19ca93cc1dSEli Friedman #include "lldb/API/SBEvent.h"
2096898eb6SLawrence D'Anna #include "lldb/API/SBFile.h"
21ca93cc1dSEli Friedman #include "lldb/API/SBFrame.h"
22b9c1b51eSKate Stone #include "lldb/API/SBListener.h"
233df9a8dfSCaroline Tice #include "lldb/API/SBProcess.h"
243df9a8dfSCaroline Tice #include "lldb/API/SBSourceManager.h"
25dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
263df9a8dfSCaroline Tice #include "lldb/API/SBStringList.h"
27c10e34d0SVadim Macagon #include "lldb/API/SBStructuredData.h"
283df9a8dfSCaroline Tice #include "lldb/API/SBTarget.h"
293df9a8dfSCaroline Tice #include "lldb/API/SBThread.h"
3050f93679SJakob Johnson #include "lldb/API/SBTrace.h"
31061858ceSEnrico Granata #include "lldb/API/SBTypeCategory.h"
32061858ceSEnrico Granata #include "lldb/API/SBTypeFilter.h"
33b9c1b51eSKate Stone #include "lldb/API/SBTypeFormat.h"
34061858ceSEnrico Granata #include "lldb/API/SBTypeNameSpecifier.h"
35061858ceSEnrico Granata #include "lldb/API/SBTypeSummary.h"
36061858ceSEnrico Granata #include "lldb/API/SBTypeSynthetic.h"
37061858ceSEnrico Granata 
386eee5aa0SGreg Clayton #include "lldb/Core/Debugger.h"
395e65e79bSJonas Devlieghere #include "lldb/Core/DebuggerEvents.h"
40c10e34d0SVadim Macagon #include "lldb/Core/PluginManager.h"
41e122877fSGreg Clayton #include "lldb/Core/Progress.h"
4244d93782SGreg Clayton #include "lldb/Core/StreamFile.h"
43c10e34d0SVadim Macagon #include "lldb/Core/StructuredDataImpl.h"
445548cb50SEnrico Granata #include "lldb/DataFormatters/DataVisualization.h"
4559998b7bSJonas Devlieghere #include "lldb/Host/Config.h"
46f1389e92SPavel Labath #include "lldb/Host/XML.h"
47e6e2bb38SZachary Turner #include "lldb/Initialization/SystemLifetimeManager.h"
486eee5aa0SGreg Clayton #include "lldb/Interpreter/CommandInterpreter.h"
4947cbf4a0SPavel Labath #include "lldb/Interpreter/OptionArgParser.h"
50cac9c5f9SGreg Clayton #include "lldb/Interpreter/OptionGroupPlatform.h"
516eee5aa0SGreg Clayton #include "lldb/Target/Process.h"
526eee5aa0SGreg Clayton #include "lldb/Target/TargetList.h"
53145d95c9SPavel Labath #include "lldb/Utility/Args.h"
54d821c997SPavel Labath #include "lldb/Utility/State.h"
55ccf1469aSJonas Devlieghere #include "lldb/Version/Version.h"
5630fdc8d8SChris Lattner 
57d717cc9fSEnrico Granata #include "llvm/ADT/STLExtras.h"
587b2e5a36SZachary Turner #include "llvm/ADT/StringRef.h"
5958a559c0SZachary Turner #include "llvm/Support/DynamicLibrary.h"
60b9c1b51eSKate Stone #include "llvm/Support/ManagedStatic.h"
61ee2d9b87SJonas Devlieghere #include "llvm/Support/PrettyStackTrace.h"
62ee2d9b87SJonas Devlieghere #include "llvm/Support/Signals.h"
6358a559c0SZachary Turner 
6430fdc8d8SChris Lattner using namespace lldb;
6530fdc8d8SChris Lattner using namespace lldb_private;
6630fdc8d8SChris Lattner 
LoadPlugin(const lldb::DebuggerSP & debugger_sp,const FileSpec & spec,Status & error)67b9c1b51eSKate Stone static llvm::sys::DynamicLibrary LoadPlugin(const lldb::DebuggerSP &debugger_sp,
68b9c1b51eSKate Stone                                             const FileSpec &spec,
6997206d57SZachary Turner                                             Status &error) {
70b9c1b51eSKate Stone   llvm::sys::DynamicLibrary dynlib =
71b9c1b51eSKate Stone       llvm::sys::DynamicLibrary::getPermanentLibrary(spec.GetPath().c_str());
72b9c1b51eSKate Stone   if (dynlib.isValid()) {
735fb8f797SGreg Clayton     typedef bool (*LLDBCommandPluginInit)(lldb::SBDebugger & debugger);
745fb8f797SGreg Clayton 
755fb8f797SGreg Clayton     lldb::SBDebugger debugger_sb(debugger_sp);
76b9c1b51eSKate Stone     // This calls the bool lldb::PluginInitialize(lldb::SBDebugger debugger)
77b9c1b51eSKate Stone     // function.
78b9c1b51eSKate Stone     // TODO: mangle this differently for your system - on OSX, the first
79b9c1b51eSKate Stone     // underscore needs to be removed and the second one stays
80b9c1b51eSKate Stone     LLDBCommandPluginInit init_func =
8122701b2fSStephane Sezer         (LLDBCommandPluginInit)(uintptr_t)dynlib.getAddressOfSymbol(
82b9c1b51eSKate Stone             "_ZN4lldb16PluginInitializeENS_10SBDebuggerE");
83b9c1b51eSKate Stone     if (init_func) {
845fb8f797SGreg Clayton       if (init_func(debugger_sb))
8558a559c0SZachary Turner         return dynlib;
865fb8f797SGreg Clayton       else
87b9c1b51eSKate Stone         error.SetErrorString("plug-in refused to load "
88b9c1b51eSKate Stone                              "(lldb::PluginInitialize(lldb::SBDebugger) "
89b9c1b51eSKate Stone                              "returned false)");
90b9c1b51eSKate Stone     } else {
91b9c1b51eSKate Stone       error.SetErrorString("plug-in is missing the required initialization: "
92b9c1b51eSKate Stone                            "lldb::PluginInitialize(lldb::SBDebugger)");
935fb8f797SGreg Clayton     }
94b9c1b51eSKate Stone   } else {
95dbd7fabaSJonas Devlieghere     if (FileSystem::Instance().Exists(spec))
965fb8f797SGreg Clayton       error.SetErrorString("this file does not represent a loadable dylib");
975fb8f797SGreg Clayton     else
985fb8f797SGreg Clayton       error.SetErrorString("no such file");
995fb8f797SGreg Clayton   }
10058a559c0SZachary Turner   return llvm::sys::DynamicLibrary();
1015fb8f797SGreg Clayton }
1025fb8f797SGreg Clayton 
103e6e2bb38SZachary Turner static llvm::ManagedStatic<SystemLifetimeManager> g_debugger_lifetime;
104e6e2bb38SZachary Turner 
Initialize(lldb::SBDebugger & sb_debugger,unsigned long (* callback)(void *,lldb::SBInputReader *,lldb::InputReaderAction,char const *,unsigned long),void * a,lldb::InputReaderGranularity b,char const * c,char const * d,bool e)105b9c1b51eSKate Stone SBError SBInputReader::Initialize(
106b9c1b51eSKate Stone     lldb::SBDebugger &sb_debugger,
1070d7b0c96SJonas Devlieghere     unsigned long (*callback)(void *, lldb::SBInputReader *,
1080d7b0c96SJonas Devlieghere                               lldb::InputReaderAction, char const *,
1090d7b0c96SJonas Devlieghere                               unsigned long),
1100d7b0c96SJonas Devlieghere     void *a, lldb::InputReaderGranularity b, char const *c, char const *d,
1110d7b0c96SJonas Devlieghere     bool e) {
1121755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, sb_debugger, callback, a, b, c, d, e);
1130d7b0c96SJonas Devlieghere 
114e6e2bb38SZachary Turner   return SBError();
115e6e2bb38SZachary Turner }
116e6e2bb38SZachary Turner 
SetIsDone(bool b)1171755f5b1SJonas Devlieghere void SBInputReader::SetIsDone(bool b) { LLDB_INSTRUMENT_VA(this, b); }
118dbb0abbfSEugene Zelenko 
IsActive() const119baf5664fSJonas Devlieghere bool SBInputReader::IsActive() const {
1201755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
121e6e2bb38SZachary Turner 
122baf5664fSJonas Devlieghere   return false;
123baf5664fSJonas Devlieghere }
124baf5664fSJonas Devlieghere 
SBDebugger()1251755f5b1SJonas Devlieghere SBDebugger::SBDebugger() { LLDB_INSTRUMENT_VA(this); }
126dbb0abbfSEugene Zelenko 
SBDebugger(const lldb::DebuggerSP & debugger_sp)127b9c1b51eSKate Stone SBDebugger::SBDebugger(const lldb::DebuggerSP &debugger_sp)
128baf5664fSJonas Devlieghere     : m_opaque_sp(debugger_sp) {
1291755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, debugger_sp);
130baf5664fSJonas Devlieghere }
131dbb0abbfSEugene Zelenko 
SBDebugger(const SBDebugger & rhs)132baf5664fSJonas Devlieghere SBDebugger::SBDebugger(const SBDebugger &rhs) : m_opaque_sp(rhs.m_opaque_sp) {
1331755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
134baf5664fSJonas Devlieghere }
135dbb0abbfSEugene Zelenko 
136dbb0abbfSEugene Zelenko SBDebugger::~SBDebugger() = default;
137dbb0abbfSEugene Zelenko 
operator =(const SBDebugger & rhs)138b9c1b51eSKate Stone SBDebugger &SBDebugger::operator=(const SBDebugger &rhs) {
1391755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
140baf5664fSJonas Devlieghere 
141b9c1b51eSKate Stone   if (this != &rhs) {
142dbb0abbfSEugene Zelenko     m_opaque_sp = rhs.m_opaque_sp;
143dbb0abbfSEugene Zelenko   }
144d232abc3SJonas Devlieghere   return *this;
145dbb0abbfSEugene Zelenko }
146dbb0abbfSEugene Zelenko 
GetBroadcasterClass()147e122877fSGreg Clayton const char *SBDebugger::GetBroadcasterClass() {
1481755f5b1SJonas Devlieghere   LLDB_INSTRUMENT();
149e122877fSGreg Clayton 
150e122877fSGreg Clayton   return Debugger::GetStaticBroadcasterClass().AsCString();
151e122877fSGreg Clayton }
152e122877fSGreg Clayton 
GetProgressFromEvent(const lldb::SBEvent & event,uint64_t & progress_id,uint64_t & completed,uint64_t & total,bool & is_debugger_specific)153e122877fSGreg Clayton const char *SBDebugger::GetProgressFromEvent(const lldb::SBEvent &event,
154e122877fSGreg Clayton                                              uint64_t &progress_id,
155e122877fSGreg Clayton                                              uint64_t &completed,
156e122877fSGreg Clayton                                              uint64_t &total,
157e122877fSGreg Clayton                                              bool &is_debugger_specific) {
158425880edSMed Ismail Bennani   LLDB_INSTRUMENT_VA(event);
1595e65e79bSJonas Devlieghere   const ProgressEventData *progress_data =
1605e65e79bSJonas Devlieghere       ProgressEventData::GetEventDataFromEvent(event.get());
161e122877fSGreg Clayton   if (progress_data == nullptr)
162e122877fSGreg Clayton     return nullptr;
163e122877fSGreg Clayton   progress_id = progress_data->GetID();
164e122877fSGreg Clayton   completed = progress_data->GetCompleted();
165e122877fSGreg Clayton   total = progress_data->GetTotal();
166e122877fSGreg Clayton   is_debugger_specific = progress_data->IsDebuggerSpecific();
167d232abc3SJonas Devlieghere   return progress_data->GetMessage().c_str();
168e122877fSGreg Clayton }
169e122877fSGreg Clayton 
170ff9e596bSJonas Devlieghere lldb::SBStructuredData
GetDiagnosticFromEvent(const lldb::SBEvent & event)171ff9e596bSJonas Devlieghere SBDebugger::GetDiagnosticFromEvent(const lldb::SBEvent &event) {
172ff9e596bSJonas Devlieghere   LLDB_INSTRUMENT_VA(event);
173ff9e596bSJonas Devlieghere 
174ff9e596bSJonas Devlieghere   const DiagnosticEventData *diagnostic_data =
175ff9e596bSJonas Devlieghere       DiagnosticEventData::GetEventDataFromEvent(event.get());
176ff9e596bSJonas Devlieghere   if (!diagnostic_data)
177ff9e596bSJonas Devlieghere     return {};
178ff9e596bSJonas Devlieghere 
179ff9e596bSJonas Devlieghere   auto dictionary = std::make_unique<StructuredData::Dictionary>();
180ff9e596bSJonas Devlieghere   dictionary->AddStringItem("message", diagnostic_data->GetMessage());
181ff9e596bSJonas Devlieghere   dictionary->AddStringItem("type", diagnostic_data->GetPrefix());
182ff9e596bSJonas Devlieghere   dictionary->AddBooleanItem("debugger_specific",
183ff9e596bSJonas Devlieghere                              diagnostic_data->IsDebuggerSpecific());
184ff9e596bSJonas Devlieghere 
185ff9e596bSJonas Devlieghere   SBStructuredData data;
186ff9e596bSJonas Devlieghere   data.m_impl_up->SetObjectSP(std::move(dictionary));
187ff9e596bSJonas Devlieghere   return data;
188ff9e596bSJonas Devlieghere }
189ff9e596bSJonas Devlieghere 
GetBroadcaster()190e122877fSGreg Clayton SBBroadcaster SBDebugger::GetBroadcaster() {
1911755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
192e122877fSGreg Clayton   SBBroadcaster broadcaster(&m_opaque_sp->GetBroadcaster(), false);
193d232abc3SJonas Devlieghere   return broadcaster;
194e122877fSGreg Clayton }
195e122877fSGreg Clayton 
Initialize()196b9c1b51eSKate Stone void SBDebugger::Initialize() {
1971755f5b1SJonas Devlieghere   LLDB_INSTRUMENT();
198936c6242SJonas Devlieghere   SBError ignored = SBDebugger::InitializeWithErrorHandling();
19915eacd74SJonas Devlieghere }
20015eacd74SJonas Devlieghere 
InitializeWithErrorHandling()201936c6242SJonas Devlieghere lldb::SBError SBDebugger::InitializeWithErrorHandling() {
2021755f5b1SJonas Devlieghere   LLDB_INSTRUMENT();
203baf5664fSJonas Devlieghere 
20415eacd74SJonas Devlieghere   SBError error;
20515eacd74SJonas Devlieghere   if (auto e = g_debugger_lifetime->Initialize(
206a8f3ae7cSJonas Devlieghere           std::make_unique<SystemInitializerFull>(), LoadPlugin)) {
20715eacd74SJonas Devlieghere     error.SetError(Status(std::move(e)));
20815eacd74SJonas Devlieghere   }
209d232abc3SJonas Devlieghere   return error;
21030fdc8d8SChris Lattner }
21130fdc8d8SChris Lattner 
PrintStackTraceOnError()212ee2d9b87SJonas Devlieghere void SBDebugger::PrintStackTraceOnError() {
213ee2d9b87SJonas Devlieghere   LLDB_INSTRUMENT();
214ee2d9b87SJonas Devlieghere 
215ee2d9b87SJonas Devlieghere   llvm::EnablePrettyStackTrace();
2168ece6b78SJonas Devlieghere   static std::string executable =
2178ece6b78SJonas Devlieghere       llvm::sys::fs::getMainExecutable(nullptr, nullptr);
2188ece6b78SJonas Devlieghere   llvm::sys::PrintStackTraceOnErrorSignal(executable);
219ee2d9b87SJonas Devlieghere }
220ee2d9b87SJonas Devlieghere 
Terminate()221baf5664fSJonas Devlieghere void SBDebugger::Terminate() {
2221755f5b1SJonas Devlieghere   LLDB_INSTRUMENT();
223baf5664fSJonas Devlieghere 
224baf5664fSJonas Devlieghere   g_debugger_lifetime->Terminate();
225baf5664fSJonas Devlieghere }
22630fdc8d8SChris Lattner 
Clear()227b9c1b51eSKate Stone void SBDebugger::Clear() {
2281755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
229baf5664fSJonas Devlieghere 
2303d6086f6SCaroline Tice   if (m_opaque_sp)
23144d93782SGreg Clayton     m_opaque_sp->ClearIOHandlers();
232ceb6b139SCaroline Tice 
23348e42549SGreg Clayton   m_opaque_sp.reset();
23448e42549SGreg Clayton }
23548e42549SGreg Clayton 
Create()236b9c1b51eSKate Stone SBDebugger SBDebugger::Create() {
2371755f5b1SJonas Devlieghere   LLDB_INSTRUMENT();
238baf5664fSJonas Devlieghere 
239d232abc3SJonas Devlieghere   return SBDebugger::Create(false, nullptr, nullptr);
24006942690SJim Ingham }
24106942690SJim Ingham 
Create(bool source_init_files)242b9c1b51eSKate Stone SBDebugger SBDebugger::Create(bool source_init_files) {
2431755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(source_init_files);
244baf5664fSJonas Devlieghere 
245d232abc3SJonas Devlieghere   return SBDebugger::Create(source_init_files, nullptr, nullptr);
246228063cdSJim Ingham }
247228063cdSJim Ingham 
Create(bool source_init_files,lldb::LogOutputCallback callback,void * baton)248b9c1b51eSKate Stone SBDebugger SBDebugger::Create(bool source_init_files,
249b9c1b51eSKate Stone                               lldb::LogOutputCallback callback, void *baton)
250228063cdSJim Ingham 
251228063cdSJim Ingham {
2521755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(source_init_files, callback, baton);
253ceb6b139SCaroline Tice 
2546611103cSGreg Clayton   SBDebugger debugger;
255cb172b10SGreg Clayton 
256b9c1b51eSKate Stone   // Currently we have issues if this function is called simultaneously on two
25705097246SAdrian Prantl   // different threads. The issues mainly revolve around the fact that the
25805097246SAdrian Prantl   // lldb_private::FormatManager uses global collections and having two threads
25905097246SAdrian Prantl   // parsing the .lldbinit files can cause mayhem. So to get around this for
26005097246SAdrian Prantl   // now we need to use a mutex to prevent bad things from happening.
26116ff8604SSaleem Abdulrasool   static std::recursive_mutex g_mutex;
26216ff8604SSaleem Abdulrasool   std::lock_guard<std::recursive_mutex> guard(g_mutex);
263cb172b10SGreg Clayton 
264228063cdSJim Ingham   debugger.reset(Debugger::CreateInstance(callback, baton));
265ceb6b139SCaroline Tice 
26606942690SJim Ingham   SBCommandInterpreter interp = debugger.GetCommandInterpreter();
267b9c1b51eSKate Stone   if (source_init_files) {
26806942690SJim Ingham     interp.get()->SkipLLDBInitFiles(false);
26906942690SJim Ingham     interp.get()->SkipAppInitFiles(false);
27006942690SJim Ingham     SBCommandReturnObject result;
2716c99a346SPavel Labath     interp.SourceInitFileInGlobalDirectory(result);
272868b45b5SMed Ismail Bennani     interp.SourceInitFileInHomeDirectory(result, false);
273b9c1b51eSKate Stone   } else {
27406942690SJim Ingham     interp.get()->SkipLLDBInitFiles(true);
27506942690SJim Ingham     interp.get()->SkipAppInitFiles(true);
27606942690SJim Ingham   }
2776611103cSGreg Clayton   return debugger;
2786611103cSGreg Clayton }
2796611103cSGreg Clayton 
Destroy(SBDebugger & debugger)280b9c1b51eSKate Stone void SBDebugger::Destroy(SBDebugger &debugger) {
2811755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(debugger);
282baf5664fSJonas Devlieghere 
283e02657b1SCaroline Tice   Debugger::Destroy(debugger.m_opaque_sp);
284e02657b1SCaroline Tice 
285dbb0abbfSEugene Zelenko   if (debugger.m_opaque_sp.get() != nullptr)
286e02657b1SCaroline Tice     debugger.m_opaque_sp.reset();
287e02657b1SCaroline Tice }
288e02657b1SCaroline Tice 
MemoryPressureDetected()289b9c1b51eSKate Stone void SBDebugger::MemoryPressureDetected() {
2901755f5b1SJonas Devlieghere   LLDB_INSTRUMENT();
291baf5664fSJonas Devlieghere 
29205097246SAdrian Prantl   // Since this function can be call asynchronously, we allow it to be non-
29305097246SAdrian Prantl   // mandatory. We have seen deadlocks with this function when called so we
29405097246SAdrian Prantl   // need to safeguard against this until we can determine what is causing the
29505097246SAdrian Prantl   // deadlocks.
296aebdf1beSJim Ingham 
2970cd70866SGreg Clayton   const bool mandatory = false;
298aebdf1beSJim Ingham 
2990cd70866SGreg Clayton   ModuleList::RemoveOrphanSharedModules(mandatory);
300f9322415SGreg Clayton }
301f9322415SGreg Clayton 
IsValid() const302baf5664fSJonas Devlieghere bool SBDebugger::IsValid() const {
3031755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
3047f5237bcSPavel Labath   return this->operator bool();
3057f5237bcSPavel Labath }
operator bool() const3067f5237bcSPavel Labath SBDebugger::operator bool() const {
3071755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
308baf5664fSJonas Devlieghere 
309baf5664fSJonas Devlieghere   return m_opaque_sp.get() != nullptr;
310baf5664fSJonas Devlieghere }
3116611103cSGreg Clayton 
SetAsync(bool b)312b9c1b51eSKate Stone void SBDebugger::SetAsync(bool b) {
3131755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, b);
314baf5664fSJonas Devlieghere 
3156611103cSGreg Clayton   if (m_opaque_sp)
3166611103cSGreg Clayton     m_opaque_sp->SetAsyncExecution(b);
31730fdc8d8SChris Lattner }
31830fdc8d8SChris Lattner 
GetAsync()319b9c1b51eSKate Stone bool SBDebugger::GetAsync() {
3201755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
321baf5664fSJonas Devlieghere 
322dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetAsyncExecution() : false);
323e64f0dc7SJim Ingham }
324e64f0dc7SJim Ingham 
SkipLLDBInitFiles(bool b)325b9c1b51eSKate Stone void SBDebugger::SkipLLDBInitFiles(bool b) {
3261755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, b);
327baf5664fSJonas Devlieghere 
3286eee5aa0SGreg Clayton   if (m_opaque_sp)
3296eee5aa0SGreg Clayton     m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles(b);
3306eee5aa0SGreg Clayton }
3316eee5aa0SGreg Clayton 
SkipAppInitFiles(bool b)332b9c1b51eSKate Stone void SBDebugger::SkipAppInitFiles(bool b) {
3331755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, b);
334baf5664fSJonas Devlieghere 
33516e0c686SJim Ingham   if (m_opaque_sp)
33616e0c686SJim Ingham     m_opaque_sp->GetCommandInterpreter().SkipAppInitFiles(b);
33716e0c686SJim Ingham }
33816e0c686SJim Ingham 
SetInputFileHandle(FILE * fh,bool transfer_ownership)339b9c1b51eSKate Stone void SBDebugger::SetInputFileHandle(FILE *fh, bool transfer_ownership) {
3401755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, fh, transfer_ownership);
341f23b829aSLevon Ter-Grigoryan   if (m_opaque_sp)
342f23b829aSLevon Ter-Grigoryan     m_opaque_sp->SetInputFile(
343f23b829aSLevon Ter-Grigoryan         (FileSP)std::make_shared<NativeFile>(fh, transfer_ownership));
34496898eb6SLawrence D'Anna }
345baf5664fSJonas Devlieghere 
SetInputString(const char * data)346f23b829aSLevon Ter-Grigoryan SBError SBDebugger::SetInputString(const char *data) {
3471755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, data);
348f23b829aSLevon Ter-Grigoryan   SBError sb_error;
349f23b829aSLevon Ter-Grigoryan   if (data == nullptr) {
350f23b829aSLevon Ter-Grigoryan     sb_error.SetErrorString("String data is null");
351d232abc3SJonas Devlieghere     return sb_error;
352f23b829aSLevon Ter-Grigoryan   }
353f23b829aSLevon Ter-Grigoryan 
354f23b829aSLevon Ter-Grigoryan   size_t size = strlen(data);
355f23b829aSLevon Ter-Grigoryan   if (size == 0) {
356f23b829aSLevon Ter-Grigoryan     sb_error.SetErrorString("String data is empty");
357d232abc3SJonas Devlieghere     return sb_error;
358f23b829aSLevon Ter-Grigoryan   }
359f23b829aSLevon Ter-Grigoryan 
360f23b829aSLevon Ter-Grigoryan   if (!m_opaque_sp) {
361f23b829aSLevon Ter-Grigoryan     sb_error.SetErrorString("invalid debugger");
362d232abc3SJonas Devlieghere     return sb_error;
363f23b829aSLevon Ter-Grigoryan   }
364f23b829aSLevon Ter-Grigoryan 
365f23b829aSLevon Ter-Grigoryan   sb_error.SetError(m_opaque_sp->SetInputString(data));
366d232abc3SJonas Devlieghere   return sb_error;
367c040b30fSLawrence D'Anna }
368c040b30fSLawrence D'Anna 
36996898eb6SLawrence D'Anna // Shouldn't really be settable after initialization as this could cause lots
37096898eb6SLawrence D'Anna // of problems; don't want users trying to switch modes in the middle of a
37196898eb6SLawrence D'Anna // debugging session.
SetInputFile(SBFile file)37296898eb6SLawrence D'Anna SBError SBDebugger::SetInputFile(SBFile file) {
3731755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, file);
37496898eb6SLawrence D'Anna 
37596898eb6SLawrence D'Anna   SBError error;
37696898eb6SLawrence D'Anna   if (!m_opaque_sp) {
37796898eb6SLawrence D'Anna     error.ref().SetErrorString("invalid debugger");
378d232abc3SJonas Devlieghere     return error;
37996898eb6SLawrence D'Anna   }
380f23b829aSLevon Ter-Grigoryan   error.SetError(m_opaque_sp->SetInputFile(file.m_opaque_sp));
381d232abc3SJonas Devlieghere   return error;
38296898eb6SLawrence D'Anna }
38396898eb6SLawrence D'Anna 
SetInputFile(FileSP file_sp)384f23b829aSLevon Ter-Grigoryan SBError SBDebugger::SetInputFile(FileSP file_sp) {
3851755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, file_sp);
386d232abc3SJonas Devlieghere   return SetInputFile(SBFile(file_sp));
38730fdc8d8SChris Lattner }
38830fdc8d8SChris Lattner 
SetOutputFile(FileSP file_sp)389c040b30fSLawrence D'Anna SBError SBDebugger::SetOutputFile(FileSP file_sp) {
3901755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, file_sp);
391d232abc3SJonas Devlieghere   return SetOutputFile(SBFile(file_sp));
392c040b30fSLawrence D'Anna }
393c040b30fSLawrence D'Anna 
SetOutputFileHandle(FILE * fh,bool transfer_ownership)394b9c1b51eSKate Stone void SBDebugger::SetOutputFileHandle(FILE *fh, bool transfer_ownership) {
3951755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, fh, transfer_ownership);
396f913fd6eSLawrence D'Anna   SetOutputFile((FileSP)std::make_shared<NativeFile>(fh, transfer_ownership));
39796898eb6SLawrence D'Anna }
398baf5664fSJonas Devlieghere 
SetOutputFile(SBFile file)39996898eb6SLawrence D'Anna SBError SBDebugger::SetOutputFile(SBFile file) {
4001755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, file);
40196898eb6SLawrence D'Anna   SBError error;
40296898eb6SLawrence D'Anna   if (!m_opaque_sp) {
40396898eb6SLawrence D'Anna     error.ref().SetErrorString("invalid debugger");
404d232abc3SJonas Devlieghere     return error;
40596898eb6SLawrence D'Anna   }
40696898eb6SLawrence D'Anna   if (!file) {
40796898eb6SLawrence D'Anna     error.ref().SetErrorString("invalid file");
408d232abc3SJonas Devlieghere     return error;
40996898eb6SLawrence D'Anna   }
41096898eb6SLawrence D'Anna   m_opaque_sp->SetOutputFile(file.m_opaque_sp);
411d232abc3SJonas Devlieghere   return error;
41230fdc8d8SChris Lattner }
41330fdc8d8SChris Lattner 
SetErrorFileHandle(FILE * fh,bool transfer_ownership)414b9c1b51eSKate Stone void SBDebugger::SetErrorFileHandle(FILE *fh, bool transfer_ownership) {
4151755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, fh, transfer_ownership);
416f913fd6eSLawrence D'Anna   SetErrorFile((FileSP)std::make_shared<NativeFile>(fh, transfer_ownership));
41796898eb6SLawrence D'Anna }
418baf5664fSJonas Devlieghere 
SetErrorFile(FileSP file_sp)419c040b30fSLawrence D'Anna SBError SBDebugger::SetErrorFile(FileSP file_sp) {
4201755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, file_sp);
421d232abc3SJonas Devlieghere   return SetErrorFile(SBFile(file_sp));
422c040b30fSLawrence D'Anna }
423c040b30fSLawrence D'Anna 
SetErrorFile(SBFile file)42496898eb6SLawrence D'Anna SBError SBDebugger::SetErrorFile(SBFile file) {
4251755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, file);
42696898eb6SLawrence D'Anna   SBError error;
42796898eb6SLawrence D'Anna   if (!m_opaque_sp) {
42896898eb6SLawrence D'Anna     error.ref().SetErrorString("invalid debugger");
429d232abc3SJonas Devlieghere     return error;
43096898eb6SLawrence D'Anna   }
43196898eb6SLawrence D'Anna   if (!file) {
43296898eb6SLawrence D'Anna     error.ref().SetErrorString("invalid file");
433d232abc3SJonas Devlieghere     return error;
43496898eb6SLawrence D'Anna   }
43596898eb6SLawrence D'Anna   m_opaque_sp->SetErrorFile(file.m_opaque_sp);
436d232abc3SJonas Devlieghere   return error;
43730fdc8d8SChris Lattner }
43830fdc8d8SChris Lattner 
GetInputFileHandle()439b9c1b51eSKate Stone FILE *SBDebugger::GetInputFileHandle() {
4401755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
441b9c1b51eSKate Stone   if (m_opaque_sp) {
4427ca15ba7SLawrence D'Anna     File &file_sp = m_opaque_sp->GetInputFile();
443d232abc3SJonas Devlieghere     return file_sp.GetStream();
44444d93782SGreg Clayton   }
445d232abc3SJonas Devlieghere   return nullptr;
44630fdc8d8SChris Lattner }
44730fdc8d8SChris Lattner 
GetInputFile()44896898eb6SLawrence D'Anna SBFile SBDebugger::GetInputFile() {
4491755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
45096898eb6SLawrence D'Anna   if (m_opaque_sp) {
451d232abc3SJonas Devlieghere     return SBFile(m_opaque_sp->GetInputFileSP());
45296898eb6SLawrence D'Anna   }
453d232abc3SJonas Devlieghere   return SBFile();
45496898eb6SLawrence D'Anna }
45596898eb6SLawrence D'Anna 
GetOutputFileHandle()456b9c1b51eSKate Stone FILE *SBDebugger::GetOutputFileHandle() {
4571755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
458b9c1b51eSKate Stone   if (m_opaque_sp) {
4597ca15ba7SLawrence D'Anna     StreamFile &stream_file = m_opaque_sp->GetOutputStream();
460d232abc3SJonas Devlieghere     return stream_file.GetFile().GetStream();
46144d93782SGreg Clayton   }
462d232abc3SJonas Devlieghere   return nullptr;
46330fdc8d8SChris Lattner }
46430fdc8d8SChris Lattner 
GetOutputFile()46596898eb6SLawrence D'Anna SBFile SBDebugger::GetOutputFile() {
4661755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
46796898eb6SLawrence D'Anna   if (m_opaque_sp) {
46896898eb6SLawrence D'Anna     SBFile file(m_opaque_sp->GetOutputStream().GetFileSP());
469d232abc3SJonas Devlieghere     return file;
47096898eb6SLawrence D'Anna   }
471d232abc3SJonas Devlieghere   return SBFile();
47296898eb6SLawrence D'Anna }
47396898eb6SLawrence D'Anna 
GetErrorFileHandle()474b9c1b51eSKate Stone FILE *SBDebugger::GetErrorFileHandle() {
4751755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
476baf5664fSJonas Devlieghere 
477b9c1b51eSKate Stone   if (m_opaque_sp) {
4787ca15ba7SLawrence D'Anna     StreamFile &stream_file = m_opaque_sp->GetErrorStream();
479d232abc3SJonas Devlieghere     return stream_file.GetFile().GetStream();
48044d93782SGreg Clayton   }
481d232abc3SJonas Devlieghere   return nullptr;
48230fdc8d8SChris Lattner }
48330fdc8d8SChris Lattner 
GetErrorFile()48496898eb6SLawrence D'Anna SBFile SBDebugger::GetErrorFile() {
4851755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
48696898eb6SLawrence D'Anna   SBFile file;
48796898eb6SLawrence D'Anna   if (m_opaque_sp) {
48896898eb6SLawrence D'Anna     SBFile file(m_opaque_sp->GetErrorStream().GetFileSP());
489d232abc3SJonas Devlieghere     return file;
49096898eb6SLawrence D'Anna   }
491d232abc3SJonas Devlieghere   return SBFile();
49296898eb6SLawrence D'Anna }
49396898eb6SLawrence D'Anna 
SaveInputTerminalState()494b9c1b51eSKate Stone void SBDebugger::SaveInputTerminalState() {
4951755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
496baf5664fSJonas Devlieghere 
497c5917d9aSJim Ingham   if (m_opaque_sp)
498c5917d9aSJim Ingham     m_opaque_sp->SaveInputTerminalState();
499c5917d9aSJim Ingham }
500c5917d9aSJim Ingham 
RestoreInputTerminalState()501b9c1b51eSKate Stone void SBDebugger::RestoreInputTerminalState() {
5021755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
503baf5664fSJonas Devlieghere 
504c5917d9aSJim Ingham   if (m_opaque_sp)
505c5917d9aSJim Ingham     m_opaque_sp->RestoreInputTerminalState();
506c5917d9aSJim Ingham }
GetCommandInterpreter()507b9c1b51eSKate Stone SBCommandInterpreter SBDebugger::GetCommandInterpreter() {
5081755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
509baf5664fSJonas Devlieghere 
5106611103cSGreg Clayton   SBCommandInterpreter sb_interpreter;
5116611103cSGreg Clayton   if (m_opaque_sp)
5126611103cSGreg Clayton     sb_interpreter.reset(&m_opaque_sp->GetCommandInterpreter());
513ceb6b139SCaroline Tice 
514d232abc3SJonas Devlieghere   return sb_interpreter;
51530fdc8d8SChris Lattner }
51630fdc8d8SChris Lattner 
HandleCommand(const char * command)517b9c1b51eSKate Stone void SBDebugger::HandleCommand(const char *command) {
5181755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, command);
519baf5664fSJonas Devlieghere 
520b9c1b51eSKate Stone   if (m_opaque_sp) {
521af67cecdSGreg Clayton     TargetSP target_sp(m_opaque_sp->GetSelectedTarget());
522bb19a13cSSaleem Abdulrasool     std::unique_lock<std::recursive_mutex> lock;
523af67cecdSGreg Clayton     if (target_sp)
524bb19a13cSSaleem Abdulrasool       lock = std::unique_lock<std::recursive_mutex>(target_sp->GetAPIMutex());
525af67cecdSGreg Clayton 
5266611103cSGreg Clayton     SBCommandInterpreter sb_interpreter(GetCommandInterpreter());
52730fdc8d8SChris Lattner     SBCommandReturnObject result;
52830fdc8d8SChris Lattner 
52930fdc8d8SChris Lattner     sb_interpreter.HandleCommand(command, result, false);
53030fdc8d8SChris Lattner 
5315da2bc22SLawrence D'Anna     result.PutError(m_opaque_sp->GetErrorStream().GetFileSP());
5325da2bc22SLawrence D'Anna     result.PutOutput(m_opaque_sp->GetOutputStream().GetFileSP());
53330fdc8d8SChris Lattner 
534b9c1b51eSKate Stone     if (!m_opaque_sp->GetAsyncExecution()) {
5356611103cSGreg Clayton       SBProcess process(GetCommandInterpreter().GetProcess());
536b9556accSGreg Clayton       ProcessSP process_sp(process.GetSP());
537b9c1b51eSKate Stone       if (process_sp) {
53830fdc8d8SChris Lattner         EventSP event_sp;
539583bbb1dSJim Ingham         ListenerSP lldb_listener_sp = m_opaque_sp->GetListener();
540d35031e1SPavel Labath         while (lldb_listener_sp->GetEventForBroadcaster(
541d35031e1SPavel Labath             process_sp.get(), event_sp, std::chrono::seconds(0))) {
54230fdc8d8SChris Lattner           SBEvent event(event_sp);
543322f12afSLawrence D'Anna           HandleProcessEvent(process, event, GetOutputFile(), GetErrorFile());
54430fdc8d8SChris Lattner         }
54530fdc8d8SChris Lattner       }
54630fdc8d8SChris Lattner     }
54730fdc8d8SChris Lattner   }
5486611103cSGreg Clayton }
54930fdc8d8SChris Lattner 
GetListener()550b9c1b51eSKate Stone SBListener SBDebugger::GetListener() {
5511755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
552baf5664fSJonas Devlieghere 
5536611103cSGreg Clayton   SBListener sb_listener;
5546611103cSGreg Clayton   if (m_opaque_sp)
555583bbb1dSJim Ingham     sb_listener.reset(m_opaque_sp->GetListener());
556ceb6b139SCaroline Tice 
557d232abc3SJonas Devlieghere   return sb_listener;
55830fdc8d8SChris Lattner }
55930fdc8d8SChris Lattner 
HandleProcessEvent(const SBProcess & process,const SBEvent & event,SBFile out,SBFile err)560b9c1b51eSKate Stone void SBDebugger::HandleProcessEvent(const SBProcess &process,
561322f12afSLawrence D'Anna                                     const SBEvent &event, SBFile out,
562322f12afSLawrence D'Anna                                     SBFile err) {
5631755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, process, event, out, err);
564322f12afSLawrence D'Anna 
565322f12afSLawrence D'Anna   return HandleProcessEvent(process, event, out.m_opaque_sp, err.m_opaque_sp);
566322f12afSLawrence D'Anna }
567322f12afSLawrence D'Anna 
HandleProcessEvent(const SBProcess & process,const SBEvent & event,FILE * out,FILE * err)568322f12afSLawrence D'Anna void SBDebugger::HandleProcessEvent(const SBProcess &process,
569b9c1b51eSKate Stone                                     const SBEvent &event, FILE *out,
570b9c1b51eSKate Stone                                     FILE *err) {
5711755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, process, event, out, err);
572baf5664fSJonas Devlieghere 
573322f12afSLawrence D'Anna   FileSP outfile = std::make_shared<NativeFile>(out, false);
574322f12afSLawrence D'Anna   FileSP errfile = std::make_shared<NativeFile>(err, false);
575322f12afSLawrence D'Anna   return HandleProcessEvent(process, event, outfile, errfile);
576322f12afSLawrence D'Anna }
577322f12afSLawrence D'Anna 
HandleProcessEvent(const SBProcess & process,const SBEvent & event,FileSP out_sp,FileSP err_sp)578322f12afSLawrence D'Anna void SBDebugger::HandleProcessEvent(const SBProcess &process,
579322f12afSLawrence D'Anna                                     const SBEvent &event, FileSP out_sp,
580322f12afSLawrence D'Anna                                     FileSP err_sp) {
581322f12afSLawrence D'Anna 
5821755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, process, event, out_sp, err_sp);
583322f12afSLawrence D'Anna 
584af67cecdSGreg Clayton   if (!process.IsValid())
585af67cecdSGreg Clayton     return;
586af67cecdSGreg Clayton 
587b9556accSGreg Clayton   TargetSP target_sp(process.GetTarget().GetSP());
588b9556accSGreg Clayton   if (!target_sp)
589b9556accSGreg Clayton     return;
590b9556accSGreg Clayton 
59130fdc8d8SChris Lattner   const uint32_t event_type = event.GetType();
59230fdc8d8SChris Lattner   char stdio_buffer[1024];
59330fdc8d8SChris Lattner   size_t len;
59430fdc8d8SChris Lattner 
595bb19a13cSSaleem Abdulrasool   std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
596af67cecdSGreg Clayton 
597b9c1b51eSKate Stone   if (event_type &
598b9c1b51eSKate Stone       (Process::eBroadcastBitSTDOUT | Process::eBroadcastBitStateChanged)) {
599af67cecdSGreg Clayton     // Drain stdout when we stop just in case we have any bytes
60030fdc8d8SChris Lattner     while ((len = process.GetSTDOUT(stdio_buffer, sizeof(stdio_buffer))) > 0)
601322f12afSLawrence D'Anna       if (out_sp)
602322f12afSLawrence D'Anna         out_sp->Write(stdio_buffer, len);
60330fdc8d8SChris Lattner   }
604af67cecdSGreg Clayton 
605b9c1b51eSKate Stone   if (event_type &
606b9c1b51eSKate Stone       (Process::eBroadcastBitSTDERR | Process::eBroadcastBitStateChanged)) {
607af67cecdSGreg Clayton     // Drain stderr when we stop just in case we have any bytes
60830fdc8d8SChris Lattner     while ((len = process.GetSTDERR(stdio_buffer, sizeof(stdio_buffer))) > 0)
609322f12afSLawrence D'Anna       if (err_sp)
610322f12afSLawrence D'Anna         err_sp->Write(stdio_buffer, len);
61130fdc8d8SChris Lattner   }
612af67cecdSGreg Clayton 
613b9c1b51eSKate Stone   if (event_type & Process::eBroadcastBitStateChanged) {
61430fdc8d8SChris Lattner     StateType event_state = SBProcess::GetStateFromEvent(event);
61530fdc8d8SChris Lattner 
61630fdc8d8SChris Lattner     if (event_state == eStateInvalid)
61730fdc8d8SChris Lattner       return;
61830fdc8d8SChris Lattner 
61930fdc8d8SChris Lattner     bool is_stopped = StateIsStoppedState(event_state);
62030fdc8d8SChris Lattner     if (!is_stopped)
621322f12afSLawrence D'Anna       process.ReportEventState(event, out_sp);
62230fdc8d8SChris Lattner   }
62330fdc8d8SChris Lattner }
62430fdc8d8SChris Lattner 
GetSourceManager()625b9c1b51eSKate Stone SBSourceManager SBDebugger::GetSourceManager() {
6261755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
627baf5664fSJonas Devlieghere 
628e37d605eSJim Ingham   SBSourceManager sb_source_manager(*this);
629d232abc3SJonas Devlieghere   return sb_source_manager;
63030fdc8d8SChris Lattner }
63130fdc8d8SChris Lattner 
GetDefaultArchitecture(char * arch_name,size_t arch_name_len)632b9c1b51eSKate Stone bool SBDebugger::GetDefaultArchitecture(char *arch_name, size_t arch_name_len) {
6331755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(arch_name, arch_name_len);
634baf5664fSJonas Devlieghere 
635b9c1b51eSKate Stone   if (arch_name && arch_name_len) {
636431ce678SGreg Clayton     ArchSpec default_arch = Target::GetDefaultArchitecture();
637daccaa9eSCaroline Tice 
638b9c1b51eSKate Stone     if (default_arch.IsValid()) {
639431ce678SGreg Clayton       const std::string &triple_str = default_arch.GetTriple().str();
640431ce678SGreg Clayton       if (!triple_str.empty())
641431ce678SGreg Clayton         ::snprintf(arch_name, arch_name_len, "%s", triple_str.c_str());
642431ce678SGreg Clayton       else
643b9c1b51eSKate Stone         ::snprintf(arch_name, arch_name_len, "%s",
644b9c1b51eSKate Stone                    default_arch.GetArchitectureName());
64530fdc8d8SChris Lattner       return true;
64630fdc8d8SChris Lattner     }
64730fdc8d8SChris Lattner   }
64830fdc8d8SChris Lattner   if (arch_name && arch_name_len)
64930fdc8d8SChris Lattner     arch_name[0] = '\0';
65030fdc8d8SChris Lattner   return false;
65130fdc8d8SChris Lattner }
65230fdc8d8SChris Lattner 
SetDefaultArchitecture(const char * arch_name)653b9c1b51eSKate Stone bool SBDebugger::SetDefaultArchitecture(const char *arch_name) {
6541755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(arch_name);
655baf5664fSJonas Devlieghere 
656b9c1b51eSKate Stone   if (arch_name) {
65770512317SGreg Clayton     ArchSpec arch(arch_name);
658b9c1b51eSKate Stone     if (arch.IsValid()) {
659431ce678SGreg Clayton       Target::SetDefaultArchitecture(arch);
66030fdc8d8SChris Lattner       return true;
66130fdc8d8SChris Lattner     }
66230fdc8d8SChris Lattner   }
66330fdc8d8SChris Lattner   return false;
66430fdc8d8SChris Lattner }
66530fdc8d8SChris Lattner 
66630fdc8d8SChris Lattner ScriptLanguage
GetScriptingLanguage(const char * script_language_name)667b9c1b51eSKate Stone SBDebugger::GetScriptingLanguage(const char *script_language_name) {
6681755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, script_language_name);
669baf5664fSJonas Devlieghere 
670d9aec34bSJonas Devlieghere   if (!script_language_name)
671d9aec34bSJonas Devlieghere     return eScriptLanguageDefault;
67247cbf4a0SPavel Labath   return OptionArgParser::ToScriptLanguage(
67347cbf4a0SPavel Labath       llvm::StringRef(script_language_name), eScriptLanguageDefault, nullptr);
67430fdc8d8SChris Lattner }
67530fdc8d8SChris Lattner 
676bbef51ebSLawrence D'Anna SBStructuredData
GetScriptInterpreterInfo(lldb::ScriptLanguage language)677bbef51ebSLawrence D'Anna SBDebugger::GetScriptInterpreterInfo(lldb::ScriptLanguage language) {
6781755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, language);
679bbef51ebSLawrence D'Anna   SBStructuredData data;
680bbef51ebSLawrence D'Anna   if (m_opaque_sp) {
681bbef51ebSLawrence D'Anna     lldb_private::ScriptInterpreter *interp =
682bbef51ebSLawrence D'Anna         m_opaque_sp->GetScriptInterpreter(language);
683bbef51ebSLawrence D'Anna     if (interp) {
684bbef51ebSLawrence D'Anna       data.m_impl_up->SetObjectSP(interp->GetInterpreterInfo());
685bbef51ebSLawrence D'Anna     }
686bbef51ebSLawrence D'Anna   }
687d232abc3SJonas Devlieghere   return data;
688bbef51ebSLawrence D'Anna }
689bbef51ebSLawrence D'Anna 
GetVersionString()690b9c1b51eSKate Stone const char *SBDebugger::GetVersionString() {
6911755f5b1SJonas Devlieghere   LLDB_INSTRUMENT();
692baf5664fSJonas Devlieghere 
693b2f1fb29SVirgile Bello   return lldb_private::GetVersion();
69430fdc8d8SChris Lattner }
69530fdc8d8SChris Lattner 
StateAsCString(StateType state)696b9c1b51eSKate Stone const char *SBDebugger::StateAsCString(StateType state) {
6971755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(state);
698baf5664fSJonas Devlieghere 
699c2bbb49aSCaroline Tice   return lldb_private::StateAsCString(state);
70030fdc8d8SChris Lattner }
70130fdc8d8SChris Lattner 
AddBoolConfigEntry(StructuredData::Dictionary & dict,llvm::StringRef name,bool value,llvm::StringRef description)702f1389e92SPavel Labath static void AddBoolConfigEntry(StructuredData::Dictionary &dict,
703f1389e92SPavel Labath                                llvm::StringRef name, bool value,
704f1389e92SPavel Labath                                llvm::StringRef description) {
705a8f3ae7cSJonas Devlieghere   auto entry_up = std::make_unique<StructuredData::Dictionary>();
706f1389e92SPavel Labath   entry_up->AddBooleanItem("value", value);
707f1389e92SPavel Labath   entry_up->AddStringItem("description", description);
708f1389e92SPavel Labath   dict.AddItem(name, std::move(entry_up));
709f1389e92SPavel Labath }
710f1389e92SPavel Labath 
AddLLVMTargets(StructuredData::Dictionary & dict)711abc0c6adSPavel Labath static void AddLLVMTargets(StructuredData::Dictionary &dict) {
712a8f3ae7cSJonas Devlieghere   auto array_up = std::make_unique<StructuredData::Array>();
713abc0c6adSPavel Labath #define LLVM_TARGET(target)                                                    \
714a8f3ae7cSJonas Devlieghere   array_up->AddItem(std::make_unique<StructuredData::String>(#target));
715abc0c6adSPavel Labath #include "llvm/Config/Targets.def"
716a8f3ae7cSJonas Devlieghere   auto entry_up = std::make_unique<StructuredData::Dictionary>();
717abc0c6adSPavel Labath   entry_up->AddItem("value", std::move(array_up));
718abc0c6adSPavel Labath   entry_up->AddStringItem("description", "A list of configured LLVM targets.");
719abc0c6adSPavel Labath   dict.AddItem("targets", std::move(entry_up));
720abc0c6adSPavel Labath }
721abc0c6adSPavel Labath 
GetBuildConfiguration()722f1389e92SPavel Labath SBStructuredData SBDebugger::GetBuildConfiguration() {
7231755f5b1SJonas Devlieghere   LLDB_INSTRUMENT();
724baf5664fSJonas Devlieghere 
725a8f3ae7cSJonas Devlieghere   auto config_up = std::make_unique<StructuredData::Dictionary>();
726f1389e92SPavel Labath   AddBoolConfigEntry(
727f1389e92SPavel Labath       *config_up, "xml", XMLDocument::XMLEnabled(),
728f1389e92SPavel Labath       "A boolean value that indicates if XML support is enabled in LLDB");
729eafede2aSPavel Labath   AddBoolConfigEntry(
730a4304f96SJonas Devlieghere       *config_up, "curses", LLDB_ENABLE_CURSES,
731eafede2aSPavel Labath       "A boolean value that indicates if curses support is enabled in LLDB");
7326cc3ee17SJonas Devlieghere   AddBoolConfigEntry(
7336cc3ee17SJonas Devlieghere       *config_up, "editline", LLDB_ENABLE_LIBEDIT,
7346cc3ee17SJonas Devlieghere       "A boolean value that indicates if editline support is enabled in LLDB");
7356cc3ee17SJonas Devlieghere   AddBoolConfigEntry(
7366cc3ee17SJonas Devlieghere       *config_up, "lzma", LLDB_ENABLE_LZMA,
7376cc3ee17SJonas Devlieghere       "A boolean value that indicates if lzma support is enabled in LLDB");
7386cc3ee17SJonas Devlieghere   AddBoolConfigEntry(
7396cc3ee17SJonas Devlieghere       *config_up, "python", LLDB_ENABLE_PYTHON,
7406cc3ee17SJonas Devlieghere       "A boolean value that indicates if python support is enabled in LLDB");
7416cc3ee17SJonas Devlieghere   AddBoolConfigEntry(
7426cc3ee17SJonas Devlieghere       *config_up, "lua", LLDB_ENABLE_LUA,
7436cc3ee17SJonas Devlieghere       "A boolean value that indicates if lua support is enabled in LLDB");
7449c7fbc3fSMichał Górny   AddBoolConfigEntry(*config_up, "fbsdvmcore", LLDB_ENABLE_FBSDVMCORE,
7459c7fbc3fSMichał Górny                      "A boolean value that indicates if fbsdvmcore support is "
7469c7fbc3fSMichał Górny                      "enabled in LLDB");
747abc0c6adSPavel Labath   AddLLVMTargets(*config_up);
748f1389e92SPavel Labath 
749f1389e92SPavel Labath   SBStructuredData data;
750f1389e92SPavel Labath   data.m_impl_up->SetObjectSP(std::move(config_up));
751d232abc3SJonas Devlieghere   return data;
752f1389e92SPavel Labath }
753f1389e92SPavel Labath 
StateIsRunningState(StateType state)754b9c1b51eSKate Stone bool SBDebugger::StateIsRunningState(StateType state) {
7551755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(state);
756baf5664fSJonas Devlieghere 
757c2bbb49aSCaroline Tice   const bool result = lldb_private::StateIsRunningState(state);
7584838131bSGreg Clayton 
7594838131bSGreg Clayton   return result;
76030fdc8d8SChris Lattner }
76130fdc8d8SChris Lattner 
StateIsStoppedState(StateType state)762b9c1b51eSKate Stone bool SBDebugger::StateIsStoppedState(StateType state) {
7631755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(state);
764baf5664fSJonas Devlieghere 
7652637f825SGreg Clayton   const bool result = lldb_private::StateIsStoppedState(state, false);
766ceb6b139SCaroline Tice 
7674838131bSGreg Clayton   return result;
76830fdc8d8SChris Lattner }
76930fdc8d8SChris Lattner 
CreateTarget(const char * filename,const char * target_triple,const char * platform_name,bool add_dependent_modules,lldb::SBError & sb_error)770b9c1b51eSKate Stone lldb::SBTarget SBDebugger::CreateTarget(const char *filename,
771cac9c5f9SGreg Clayton                                         const char *target_triple,
772cac9c5f9SGreg Clayton                                         const char *platform_name,
773cac9c5f9SGreg Clayton                                         bool add_dependent_modules,
774b9c1b51eSKate Stone                                         lldb::SBError &sb_error) {
7751755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, filename, target_triple, platform_name,
7761755f5b1SJonas Devlieghere                      add_dependent_modules, sb_error);
777baf5664fSJonas Devlieghere 
778cac9c5f9SGreg Clayton   SBTarget sb_target;
779b9556accSGreg Clayton   TargetSP target_sp;
780b9c1b51eSKate Stone   if (m_opaque_sp) {
781cac9c5f9SGreg Clayton     sb_error.Clear();
782cac9c5f9SGreg Clayton     OptionGroupPlatform platform_options(false);
783cac9c5f9SGreg Clayton     platform_options.SetPlatformName(platform_name);
784cac9c5f9SGreg Clayton 
785b9c1b51eSKate Stone     sb_error.ref() = m_opaque_sp->GetTargetList().CreateTarget(
786f9a07e9fSJonas Devlieghere         *m_opaque_sp, filename, target_triple,
787f9a07e9fSJonas Devlieghere         add_dependent_modules ? eLoadDependentsYes : eLoadDependentsNo,
788b9c1b51eSKate Stone         &platform_options, target_sp);
789cac9c5f9SGreg Clayton 
790cac9c5f9SGreg Clayton     if (sb_error.Success())
791b9556accSGreg Clayton       sb_target.SetSP(target_sp);
792b9c1b51eSKate Stone   } else {
7939f521f22SJim Ingham     sb_error.SetErrorString("invalid debugger");
794cac9c5f9SGreg Clayton   }
795cac9c5f9SGreg Clayton 
796a007a6d8SPavel Labath   Log *log = GetLog(LLDBLog::API);
79763e5fb76SJonas Devlieghere   LLDB_LOGF(log,
79863e5fb76SJonas Devlieghere             "SBDebugger(%p)::CreateTarget (filename=\"%s\", triple=%s, "
799b9c1b51eSKate Stone             "platform_name=%s, add_dependent_modules=%u, error=%s) => "
800b9c1b51eSKate Stone             "SBTarget(%p)",
801b9c1b51eSKate Stone             static_cast<void *>(m_opaque_sp.get()), filename, target_triple,
802b9c1b51eSKate Stone             platform_name, add_dependent_modules, sb_error.GetCString(),
803b9c1b51eSKate Stone             static_cast<void *>(target_sp.get()));
804cac9c5f9SGreg Clayton 
805d232abc3SJonas Devlieghere   return sb_target;
806cac9c5f9SGreg Clayton }
80730fdc8d8SChris Lattner 
80830fdc8d8SChris Lattner SBTarget
CreateTargetWithFileAndTargetTriple(const char * filename,const char * target_triple)80930fdc8d8SChris Lattner SBDebugger::CreateTargetWithFileAndTargetTriple(const char *filename,
810b9c1b51eSKate Stone                                                 const char *target_triple) {
8111755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, filename, target_triple);
812baf5664fSJonas Devlieghere 
813b9556accSGreg Clayton   SBTarget sb_target;
814b9556accSGreg Clayton   TargetSP target_sp;
815b9c1b51eSKate Stone   if (m_opaque_sp) {
816cac9c5f9SGreg Clayton     const bool add_dependent_modules = true;
81797206d57SZachary Turner     Status error(m_opaque_sp->GetTargetList().CreateTarget(
818f9a07e9fSJonas Devlieghere         *m_opaque_sp, filename, target_triple,
819f9a07e9fSJonas Devlieghere         add_dependent_modules ? eLoadDependentsYes : eLoadDependentsNo, nullptr,
820cac9c5f9SGreg Clayton         target_sp));
821b9556accSGreg Clayton     sb_target.SetSP(target_sp);
8226611103cSGreg Clayton   }
8234838131bSGreg Clayton 
824a007a6d8SPavel Labath   Log *log = GetLog(LLDBLog::API);
82563e5fb76SJonas Devlieghere   LLDB_LOGF(log,
82663e5fb76SJonas Devlieghere             "SBDebugger(%p)::CreateTargetWithFileAndTargetTriple "
827b9c1b51eSKate Stone             "(filename=\"%s\", triple=%s) => SBTarget(%p)",
828b9c1b51eSKate Stone             static_cast<void *>(m_opaque_sp.get()), filename, target_triple,
829b9c1b51eSKate Stone             static_cast<void *>(target_sp.get()));
8304838131bSGreg Clayton 
831d232abc3SJonas Devlieghere   return sb_target;
83230fdc8d8SChris Lattner }
83330fdc8d8SChris Lattner 
CreateTargetWithFileAndArch(const char * filename,const char * arch_cstr)834b9c1b51eSKate Stone SBTarget SBDebugger::CreateTargetWithFileAndArch(const char *filename,
835b9c1b51eSKate Stone                                                  const char *arch_cstr) {
8361755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, filename, arch_cstr);
837baf5664fSJonas Devlieghere 
838a007a6d8SPavel Labath   Log *log = GetLog(LLDBLog::API);
839ceb6b139SCaroline Tice 
840b9556accSGreg Clayton   SBTarget sb_target;
841b9556accSGreg Clayton   TargetSP target_sp;
842b9c1b51eSKate Stone   if (m_opaque_sp) {
84397206d57SZachary Turner     Status error;
8447636b1f6SJim Ingham     if (arch_cstr == nullptr) {
8457636b1f6SJim Ingham       // The version of CreateTarget that takes an ArchSpec won't accept an
8467636b1f6SJim Ingham       // empty ArchSpec, so when the arch hasn't been specified, we need to
8477636b1f6SJim Ingham       // call the target triple version.
8481755f5b1SJonas Devlieghere       error = m_opaque_sp->GetTargetList().CreateTarget(
8491755f5b1SJonas Devlieghere           *m_opaque_sp, filename, arch_cstr, eLoadDependentsYes, nullptr,
8501755f5b1SJonas Devlieghere           target_sp);
8517636b1f6SJim Ingham     } else {
8521755f5b1SJonas Devlieghere       PlatformSP platform_sp =
8531755f5b1SJonas Devlieghere           m_opaque_sp->GetPlatformList().GetSelectedPlatform();
8541755f5b1SJonas Devlieghere       ArchSpec arch =
8551755f5b1SJonas Devlieghere           Platform::GetAugmentedArchSpec(platform_sp.get(), arch_cstr);
8567636b1f6SJim Ingham       if (arch.IsValid())
8571755f5b1SJonas Devlieghere         error = m_opaque_sp->GetTargetList().CreateTarget(
8581755f5b1SJonas Devlieghere             *m_opaque_sp, filename, arch, eLoadDependentsYes, platform_sp,
8591755f5b1SJonas Devlieghere             target_sp);
8607636b1f6SJim Ingham       else
8617636b1f6SJim Ingham         error.SetErrorStringWithFormat("invalid arch_cstr: %s", arch_cstr);
8627636b1f6SJim Ingham     }
8632634ec6cSTatyana Krasnukha     if (error.Success())
864b9556accSGreg Clayton       sb_target.SetSP(target_sp);
8656611103cSGreg Clayton   }
866ceb6b139SCaroline Tice 
86763e5fb76SJonas Devlieghere   LLDB_LOGF(log,
86863e5fb76SJonas Devlieghere             "SBDebugger(%p)::CreateTargetWithFileAndArch (filename=\"%s\", "
869b9c1b51eSKate Stone             "arch=%s) => SBTarget(%p)",
8707636b1f6SJim Ingham             static_cast<void *>(m_opaque_sp.get()),
8717636b1f6SJim Ingham             filename ? filename : "<unspecified>",
8727636b1f6SJim Ingham             arch_cstr ? arch_cstr : "<unspecified>",
873324a1036SSaleem Abdulrasool             static_cast<void *>(target_sp.get()));
874ceb6b139SCaroline Tice 
875d232abc3SJonas Devlieghere   return sb_target;
87630fdc8d8SChris Lattner }
87730fdc8d8SChris Lattner 
CreateTarget(const char * filename)878b9c1b51eSKate Stone SBTarget SBDebugger::CreateTarget(const char *filename) {
8791755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, filename);
880baf5664fSJonas Devlieghere 
881b9556accSGreg Clayton   SBTarget sb_target;
882b9556accSGreg Clayton   TargetSP target_sp;
883b9c1b51eSKate Stone   if (m_opaque_sp) {
88497206d57SZachary Turner     Status error;
885cac9c5f9SGreg Clayton     const bool add_dependent_modules = true;
886b9c1b51eSKate Stone     error = m_opaque_sp->GetTargetList().CreateTarget(
887f9a07e9fSJonas Devlieghere         *m_opaque_sp, filename, "",
888f9a07e9fSJonas Devlieghere         add_dependent_modules ? eLoadDependentsYes : eLoadDependentsNo, nullptr,
889f9a07e9fSJonas Devlieghere         target_sp);
89030fdc8d8SChris Lattner 
8912634ec6cSTatyana Krasnukha     if (error.Success())
892b9556accSGreg Clayton       sb_target.SetSP(target_sp);
8936611103cSGreg Clayton   }
894a007a6d8SPavel Labath   Log *log = GetLog(LLDBLog::API);
89563e5fb76SJonas Devlieghere   LLDB_LOGF(log,
896b9c1b51eSKate Stone             "SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)",
897324a1036SSaleem Abdulrasool             static_cast<void *>(m_opaque_sp.get()), filename,
898324a1036SSaleem Abdulrasool             static_cast<void *>(target_sp.get()));
899d232abc3SJonas Devlieghere   return sb_target;
90030fdc8d8SChris Lattner }
90130fdc8d8SChris Lattner 
GetDummyTarget()902b842f2ecSJim Ingham SBTarget SBDebugger::GetDummyTarget() {
9031755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
904baf5664fSJonas Devlieghere 
905b842f2ecSJim Ingham   SBTarget sb_target;
906b842f2ecSJim Ingham   if (m_opaque_sp) {
907b2fa3b92SJonas Devlieghere     sb_target.SetSP(m_opaque_sp->GetDummyTarget().shared_from_this());
908b842f2ecSJim Ingham   }
909a007a6d8SPavel Labath   Log *log = GetLog(LLDBLog::API);
91063e5fb76SJonas Devlieghere   LLDB_LOGF(log, "SBDebugger(%p)::GetDummyTarget() => SBTarget(%p)",
911b842f2ecSJim Ingham             static_cast<void *>(m_opaque_sp.get()),
912b842f2ecSJim Ingham             static_cast<void *>(sb_target.GetSP().get()));
913d232abc3SJonas Devlieghere   return sb_target;
914b842f2ecSJim Ingham }
915b842f2ecSJim Ingham 
DeleteTarget(lldb::SBTarget & target)916b9c1b51eSKate Stone bool SBDebugger::DeleteTarget(lldb::SBTarget &target) {
9171755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, target);
918baf5664fSJonas Devlieghere 
9193794ad95SJohnny Chen   bool result = false;
920b9c1b51eSKate Stone   if (m_opaque_sp) {
921b9556accSGreg Clayton     TargetSP target_sp(target.GetSP());
922b9c1b51eSKate Stone     if (target_sp) {
9233794ad95SJohnny Chen       // No need to lock, the target list is thread safe
924b9556accSGreg Clayton       result = m_opaque_sp->GetTargetList().DeleteTarget(target_sp);
925b9556accSGreg Clayton       target_sp->Destroy();
92675340622SGreg Clayton       target.Clear();
9273794ad95SJohnny Chen     }
928b9556accSGreg Clayton   }
9293794ad95SJohnny Chen 
930a007a6d8SPavel Labath   Log *log = GetLog(LLDBLog::API);
93163e5fb76SJonas Devlieghere   LLDB_LOGF(log, "SBDebugger(%p)::DeleteTarget (SBTarget(%p)) => %i",
932324a1036SSaleem Abdulrasool             static_cast<void *>(m_opaque_sp.get()),
933324a1036SSaleem Abdulrasool             static_cast<void *>(target.m_opaque_sp.get()), result);
9343794ad95SJohnny Chen 
9353794ad95SJohnny Chen   return result;
9363794ad95SJohnny Chen }
937dbb0abbfSEugene Zelenko 
GetTargetAtIndex(uint32_t idx)938b9c1b51eSKate Stone SBTarget SBDebugger::GetTargetAtIndex(uint32_t idx) {
9391755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, idx);
940baf5664fSJonas Devlieghere 
9416611103cSGreg Clayton   SBTarget sb_target;
942b9c1b51eSKate Stone   if (m_opaque_sp) {
943af67cecdSGreg Clayton     // No need to lock, the target list is thread safe
944b9556accSGreg Clayton     sb_target.SetSP(m_opaque_sp->GetTargetList().GetTargetAtIndex(idx));
945af67cecdSGreg Clayton   }
946d232abc3SJonas Devlieghere   return sb_target;
94730fdc8d8SChris Lattner }
94830fdc8d8SChris Lattner 
GetIndexOfTarget(lldb::SBTarget target)949b9c1b51eSKate Stone uint32_t SBDebugger::GetIndexOfTarget(lldb::SBTarget target) {
9501755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, target);
9518499e1a4SJim Ingham 
9528499e1a4SJim Ingham   lldb::TargetSP target_sp = target.GetSP();
9538499e1a4SJim Ingham   if (!target_sp)
9548499e1a4SJim Ingham     return UINT32_MAX;
9558499e1a4SJim Ingham 
9568499e1a4SJim Ingham   if (!m_opaque_sp)
9578499e1a4SJim Ingham     return UINT32_MAX;
9588499e1a4SJim Ingham 
9598499e1a4SJim Ingham   return m_opaque_sp->GetTargetList().GetIndexOfTarget(target.GetSP());
9608499e1a4SJim Ingham }
9618499e1a4SJim Ingham 
FindTargetWithProcessID(lldb::pid_t pid)962b9c1b51eSKate Stone SBTarget SBDebugger::FindTargetWithProcessID(lldb::pid_t pid) {
9631755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, pid);
964baf5664fSJonas Devlieghere 
9656611103cSGreg Clayton   SBTarget sb_target;
966b9c1b51eSKate Stone   if (m_opaque_sp) {
967af67cecdSGreg Clayton     // No need to lock, the target list is thread safe
968b9556accSGreg Clayton     sb_target.SetSP(m_opaque_sp->GetTargetList().FindTargetWithProcessID(pid));
969af67cecdSGreg Clayton   }
970d232abc3SJonas Devlieghere   return sb_target;
97130fdc8d8SChris Lattner }
97230fdc8d8SChris Lattner 
FindTargetWithFileAndArch(const char * filename,const char * arch_name)973b9c1b51eSKate Stone SBTarget SBDebugger::FindTargetWithFileAndArch(const char *filename,
974b9c1b51eSKate Stone                                                const char *arch_name) {
9751755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, filename, arch_name);
976baf5664fSJonas Devlieghere 
9776611103cSGreg Clayton   SBTarget sb_target;
978b9c1b51eSKate Stone   if (m_opaque_sp && filename && filename[0]) {
979af67cecdSGreg Clayton     // No need to lock, the target list is thread safe
9807263f1bdSPavel Labath     ArchSpec arch = Platform::GetAugmentedArchSpec(
9817263f1bdSPavel Labath         m_opaque_sp->GetPlatformList().GetSelectedPlatform().get(), arch_name);
982b9c1b51eSKate Stone     TargetSP target_sp(
983b9c1b51eSKate Stone         m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture(
9848f3be7a3SJonas Devlieghere             FileSpec(filename), arch_name ? &arch : nullptr));
985b9556accSGreg Clayton     sb_target.SetSP(target_sp);
9866611103cSGreg Clayton   }
987d232abc3SJonas Devlieghere   return sb_target;
98830fdc8d8SChris Lattner }
98930fdc8d8SChris Lattner 
FindTargetWithLLDBProcess(const ProcessSP & process_sp)990b9c1b51eSKate Stone SBTarget SBDebugger::FindTargetWithLLDBProcess(const ProcessSP &process_sp) {
9916611103cSGreg Clayton   SBTarget sb_target;
992b9c1b51eSKate Stone   if (m_opaque_sp) {
993af67cecdSGreg Clayton     // No need to lock, the target list is thread safe
994b9c1b51eSKate Stone     sb_target.SetSP(
995b9c1b51eSKate Stone         m_opaque_sp->GetTargetList().FindTargetWithProcess(process_sp.get()));
996af67cecdSGreg Clayton   }
99730fdc8d8SChris Lattner   return sb_target;
99830fdc8d8SChris Lattner }
99930fdc8d8SChris Lattner 
GetNumTargets()1000b9c1b51eSKate Stone uint32_t SBDebugger::GetNumTargets() {
10011755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1002baf5664fSJonas Devlieghere 
1003b9c1b51eSKate Stone   if (m_opaque_sp) {
1004af67cecdSGreg Clayton     // No need to lock, the target list is thread safe
10056611103cSGreg Clayton     return m_opaque_sp->GetTargetList().GetNumTargets();
1006af67cecdSGreg Clayton   }
10076611103cSGreg Clayton   return 0;
10086611103cSGreg Clayton }
100930fdc8d8SChris Lattner 
GetSelectedTarget()1010b9c1b51eSKate Stone SBTarget SBDebugger::GetSelectedTarget() {
10111755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1012baf5664fSJonas Devlieghere 
1013a007a6d8SPavel Labath   Log *log = GetLog(LLDBLog::API);
1014ceb6b139SCaroline Tice 
10156611103cSGreg Clayton   SBTarget sb_target;
1016b9556accSGreg Clayton   TargetSP target_sp;
1017b9c1b51eSKate Stone   if (m_opaque_sp) {
1018af67cecdSGreg Clayton     // No need to lock, the target list is thread safe
1019b9556accSGreg Clayton     target_sp = m_opaque_sp->GetTargetList().GetSelectedTarget();
1020b9556accSGreg Clayton     sb_target.SetSP(target_sp);
1021af67cecdSGreg Clayton   }
1022ceb6b139SCaroline Tice 
1023b9c1b51eSKate Stone   if (log) {
1024ceb6b139SCaroline Tice     SBStream sstr;
1025431ce678SGreg Clayton     sb_target.GetDescription(sstr, eDescriptionLevelBrief);
102663e5fb76SJonas Devlieghere     LLDB_LOGF(log, "SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s",
1027324a1036SSaleem Abdulrasool               static_cast<void *>(m_opaque_sp.get()),
1028324a1036SSaleem Abdulrasool               static_cast<void *>(target_sp.get()), sstr.GetData());
1029ceb6b139SCaroline Tice   }
1030ceb6b139SCaroline Tice 
1031d232abc3SJonas Devlieghere   return sb_target;
103230fdc8d8SChris Lattner }
103330fdc8d8SChris Lattner 
SetSelectedTarget(SBTarget & sb_target)1034b9c1b51eSKate Stone void SBDebugger::SetSelectedTarget(SBTarget &sb_target) {
10351755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, sb_target);
1036baf5664fSJonas Devlieghere 
1037a007a6d8SPavel Labath   Log *log = GetLog(LLDBLog::API);
1038e64f0dc7SJim Ingham 
1039b9556accSGreg Clayton   TargetSP target_sp(sb_target.GetSP());
1040b9c1b51eSKate Stone   if (m_opaque_sp) {
10412634ec6cSTatyana Krasnukha     m_opaque_sp->GetTargetList().SetSelectedTarget(target_sp);
1042e64f0dc7SJim Ingham   }
1043b9c1b51eSKate Stone   if (log) {
1044e64f0dc7SJim Ingham     SBStream sstr;
1045e64f0dc7SJim Ingham     sb_target.GetDescription(sstr, eDescriptionLevelBrief);
104663e5fb76SJonas Devlieghere     LLDB_LOGF(log, "SBDebugger(%p)::SetSelectedTarget () => SBTarget(%p): %s",
1047324a1036SSaleem Abdulrasool               static_cast<void *>(m_opaque_sp.get()),
1048324a1036SSaleem Abdulrasool               static_cast<void *>(target_sp.get()), sstr.GetData());
1049e64f0dc7SJim Ingham   }
1050e64f0dc7SJim Ingham }
1051e64f0dc7SJim Ingham 
GetSelectedPlatform()1052b9c1b51eSKate Stone SBPlatform SBDebugger::GetSelectedPlatform() {
10531755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1054baf5664fSJonas Devlieghere 
1055a007a6d8SPavel Labath   Log *log = GetLog(LLDBLog::API);
1056fbb76349SGreg Clayton 
1057fbb76349SGreg Clayton   SBPlatform sb_platform;
1058fbb76349SGreg Clayton   DebuggerSP debugger_sp(m_opaque_sp);
1059b9c1b51eSKate Stone   if (debugger_sp) {
1060fbb76349SGreg Clayton     sb_platform.SetSP(debugger_sp->GetPlatformList().GetSelectedPlatform());
1061fbb76349SGreg Clayton   }
106263e5fb76SJonas Devlieghere   LLDB_LOGF(log, "SBDebugger(%p)::GetSelectedPlatform () => SBPlatform(%p): %s",
1063324a1036SSaleem Abdulrasool             static_cast<void *>(m_opaque_sp.get()),
1064324a1036SSaleem Abdulrasool             static_cast<void *>(sb_platform.GetSP().get()),
1065324a1036SSaleem Abdulrasool             sb_platform.GetName());
1066d232abc3SJonas Devlieghere   return sb_platform;
1067fbb76349SGreg Clayton }
1068fbb76349SGreg Clayton 
SetSelectedPlatform(SBPlatform & sb_platform)1069b9c1b51eSKate Stone void SBDebugger::SetSelectedPlatform(SBPlatform &sb_platform) {
10701755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, sb_platform);
1071baf5664fSJonas Devlieghere 
1072a007a6d8SPavel Labath   Log *log = GetLog(LLDBLog::API);
1073fbb76349SGreg Clayton 
1074fbb76349SGreg Clayton   DebuggerSP debugger_sp(m_opaque_sp);
1075b9c1b51eSKate Stone   if (debugger_sp) {
1076fbb76349SGreg Clayton     debugger_sp->GetPlatformList().SetSelectedPlatform(sb_platform.GetSP());
1077fbb76349SGreg Clayton   }
1078324a1036SSaleem Abdulrasool 
107963e5fb76SJonas Devlieghere   LLDB_LOGF(log, "SBDebugger(%p)::SetSelectedPlatform (SBPlatform(%p) %s)",
1080324a1036SSaleem Abdulrasool             static_cast<void *>(m_opaque_sp.get()),
1081324a1036SSaleem Abdulrasool             static_cast<void *>(sb_platform.GetSP().get()),
1082324a1036SSaleem Abdulrasool             sb_platform.GetName());
1083fbb76349SGreg Clayton }
1084fbb76349SGreg Clayton 
GetNumPlatforms()1085c10e34d0SVadim Macagon uint32_t SBDebugger::GetNumPlatforms() {
10861755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1087baf5664fSJonas Devlieghere 
1088c10e34d0SVadim Macagon   if (m_opaque_sp) {
1089c10e34d0SVadim Macagon     // No need to lock, the platform list is thread safe
1090c10e34d0SVadim Macagon     return m_opaque_sp->GetPlatformList().GetSize();
1091c10e34d0SVadim Macagon   }
1092c10e34d0SVadim Macagon   return 0;
1093c10e34d0SVadim Macagon }
1094c10e34d0SVadim Macagon 
GetPlatformAtIndex(uint32_t idx)1095c10e34d0SVadim Macagon SBPlatform SBDebugger::GetPlatformAtIndex(uint32_t idx) {
10961755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, idx);
1097baf5664fSJonas Devlieghere 
1098c10e34d0SVadim Macagon   SBPlatform sb_platform;
1099c10e34d0SVadim Macagon   if (m_opaque_sp) {
1100c10e34d0SVadim Macagon     // No need to lock, the platform list is thread safe
1101c10e34d0SVadim Macagon     sb_platform.SetSP(m_opaque_sp->GetPlatformList().GetAtIndex(idx));
1102c10e34d0SVadim Macagon   }
1103d232abc3SJonas Devlieghere   return sb_platform;
1104c10e34d0SVadim Macagon }
1105c10e34d0SVadim Macagon 
GetNumAvailablePlatforms()1106c10e34d0SVadim Macagon uint32_t SBDebugger::GetNumAvailablePlatforms() {
11071755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1108baf5664fSJonas Devlieghere 
1109c10e34d0SVadim Macagon   uint32_t idx = 0;
1110c10e34d0SVadim Macagon   while (true) {
1111a458ef4fSPavel Labath     if (PluginManager::GetPlatformPluginNameAtIndex(idx).empty()) {
1112c10e34d0SVadim Macagon       break;
1113c10e34d0SVadim Macagon     }
1114c10e34d0SVadim Macagon     ++idx;
1115c10e34d0SVadim Macagon   }
1116c10e34d0SVadim Macagon   // +1 for the host platform, which should always appear first in the list.
1117c10e34d0SVadim Macagon   return idx + 1;
1118c10e34d0SVadim Macagon }
1119c10e34d0SVadim Macagon 
GetAvailablePlatformInfoAtIndex(uint32_t idx)1120c10e34d0SVadim Macagon SBStructuredData SBDebugger::GetAvailablePlatformInfoAtIndex(uint32_t idx) {
11211755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, idx);
1122baf5664fSJonas Devlieghere 
1123c10e34d0SVadim Macagon   SBStructuredData data;
1124a8f3ae7cSJonas Devlieghere   auto platform_dict = std::make_unique<StructuredData::Dictionary>();
1125c10e34d0SVadim Macagon   llvm::StringRef name_str("name"), desc_str("description");
1126c10e34d0SVadim Macagon 
1127c10e34d0SVadim Macagon   if (idx == 0) {
1128c10e34d0SVadim Macagon     PlatformSP host_platform_sp(Platform::GetHostPlatform());
1129a3939e15SPavel Labath     platform_dict->AddStringItem(name_str, host_platform_sp->GetPluginName());
1130c10e34d0SVadim Macagon     platform_dict->AddStringItem(
1131c10e34d0SVadim Macagon         desc_str, llvm::StringRef(host_platform_sp->GetDescription()));
1132c10e34d0SVadim Macagon   } else if (idx > 0) {
1133a458ef4fSPavel Labath     llvm::StringRef plugin_name =
1134c10e34d0SVadim Macagon         PluginManager::GetPlatformPluginNameAtIndex(idx - 1);
1135a458ef4fSPavel Labath     if (plugin_name.empty()) {
1136d232abc3SJonas Devlieghere       return data;
1137c10e34d0SVadim Macagon     }
1138c10e34d0SVadim Macagon     platform_dict->AddStringItem(name_str, llvm::StringRef(plugin_name));
1139c10e34d0SVadim Macagon 
1140a458ef4fSPavel Labath     llvm::StringRef plugin_desc =
1141c10e34d0SVadim Macagon         PluginManager::GetPlatformPluginDescriptionAtIndex(idx - 1);
1142c10e34d0SVadim Macagon     platform_dict->AddStringItem(desc_str, llvm::StringRef(plugin_desc));
1143c10e34d0SVadim Macagon   }
1144c10e34d0SVadim Macagon 
1145c10e34d0SVadim Macagon   data.m_impl_up->SetObjectSP(
1146c10e34d0SVadim Macagon       StructuredData::ObjectSP(platform_dict.release()));
1147d232abc3SJonas Devlieghere   return data;
1148c10e34d0SVadim Macagon }
1149c10e34d0SVadim Macagon 
DispatchInput(void * baton,const void * data,size_t data_len)1150b9c1b51eSKate Stone void SBDebugger::DispatchInput(void *baton, const void *data, size_t data_len) {
11511755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, baton, data, data_len);
11520d7b0c96SJonas Devlieghere 
11536b09d423SEnrico Granata   DispatchInput(data, data_len);
11546b09d423SEnrico Granata }
11556b09d423SEnrico Granata 
DispatchInput(const void * data,size_t data_len)1156b9c1b51eSKate Stone void SBDebugger::DispatchInput(const void *data, size_t data_len) {
11571755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, data, data_len);
11580d7b0c96SJonas Devlieghere 
1159a007a6d8SPavel Labath   //    Log *log(GetLog (LLDBLog::API));
116044d93782SGreg Clayton   //
116144d93782SGreg Clayton   //    if (log)
116263e5fb76SJonas Devlieghere   //        LLDB_LOGF(log, "SBDebugger(%p)::DispatchInput (data=\"%.*s\",
1163b9c1b51eSKate Stone   //        size_t=%" PRIu64 ")",
116444d93782SGreg Clayton   //                     m_opaque_sp.get(),
116544d93782SGreg Clayton   //                     (int) data_len,
116644d93782SGreg Clayton   //                     (const char *) data,
116744d93782SGreg Clayton   //                     (uint64_t)data_len);
116844d93782SGreg Clayton   //
116944d93782SGreg Clayton   //    if (m_opaque_sp)
117044d93782SGreg Clayton   //        m_opaque_sp->DispatchInput ((const char *) data, data_len);
117130fdc8d8SChris Lattner }
117230fdc8d8SChris Lattner 
DispatchInputInterrupt()1173b9c1b51eSKate Stone void SBDebugger::DispatchInputInterrupt() {
11741755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1175baf5664fSJonas Devlieghere 
1176efed6131SCaroline Tice   if (m_opaque_sp)
1177efed6131SCaroline Tice     m_opaque_sp->DispatchInputInterrupt();
1178efed6131SCaroline Tice }
1179efed6131SCaroline Tice 
DispatchInputEndOfFile()1180b9c1b51eSKate Stone void SBDebugger::DispatchInputEndOfFile() {
11811755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1182baf5664fSJonas Devlieghere 
1183efed6131SCaroline Tice   if (m_opaque_sp)
1184efed6131SCaroline Tice     m_opaque_sp->DispatchInputEndOfFile();
1185efed6131SCaroline Tice }
11869088b068SCaroline Tice 
PushInputReader(SBInputReader & reader)1187baf5664fSJonas Devlieghere void SBDebugger::PushInputReader(SBInputReader &reader) {
11881755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, reader);
1189baf5664fSJonas Devlieghere }
11906611103cSGreg Clayton 
RunCommandInterpreter(bool auto_handle_events,bool spawn_thread)1191b9c1b51eSKate Stone void SBDebugger::RunCommandInterpreter(bool auto_handle_events,
1192b9c1b51eSKate Stone                                        bool spawn_thread) {
11931755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, auto_handle_events, spawn_thread);
1194baf5664fSJonas Devlieghere 
1195b9c1b51eSKate Stone   if (m_opaque_sp) {
119626c7bf93SJim Ingham     CommandInterpreterRunOptions options;
119732c32246SJonas Devlieghere     options.SetAutoHandleEvents(auto_handle_events);
119832c32246SJonas Devlieghere     options.SetSpawnThread(spawn_thread);
119932c32246SJonas Devlieghere     m_opaque_sp->GetCommandInterpreter().RunCommandInterpreter(options);
120026c7bf93SJim Ingham   }
120126c7bf93SJim Ingham }
120226c7bf93SJim Ingham 
RunCommandInterpreter(bool auto_handle_events,bool spawn_thread,SBCommandInterpreterRunOptions & options,int & num_errors,bool & quit_requested,bool & stopped_for_crash)1203b9c1b51eSKate Stone void SBDebugger::RunCommandInterpreter(bool auto_handle_events,
120426c7bf93SJim Ingham                                        bool spawn_thread,
120526c7bf93SJim Ingham                                        SBCommandInterpreterRunOptions &options,
1206b9c1b51eSKate Stone                                        int &num_errors, bool &quit_requested,
1207ffc9f1deSJim Ingham                                        bool &stopped_for_crash)
120826c7bf93SJim Ingham 
120926c7bf93SJim Ingham {
12101755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, auto_handle_events, spawn_thread, options,
12111755f5b1SJonas Devlieghere                      num_errors, quit_requested, stopped_for_crash);
1212baf5664fSJonas Devlieghere 
1213b9c1b51eSKate Stone   if (m_opaque_sp) {
121432c32246SJonas Devlieghere     options.SetAutoHandleEvents(auto_handle_events);
121532c32246SJonas Devlieghere     options.SetSpawnThread(spawn_thread);
121626c7bf93SJim Ingham     CommandInterpreter &interp = m_opaque_sp->GetCommandInterpreter();
12171bff0928SJonas Devlieghere     CommandInterpreterRunResult result =
121832c32246SJonas Devlieghere         interp.RunCommandInterpreter(options.ref());
12191bff0928SJonas Devlieghere     num_errors = result.GetNumErrors();
12201bff0928SJonas Devlieghere     quit_requested =
12211bff0928SJonas Devlieghere         result.IsResult(lldb::eCommandInterpreterResultQuitRequested);
12221bff0928SJonas Devlieghere     stopped_for_crash =
12231bff0928SJonas Devlieghere         result.IsResult(lldb::eCommandInterpreterResultInferiorCrash);
122426c7bf93SJim Ingham   }
1225969ed3d1SCaroline Tice }
1226969ed3d1SCaroline Tice 
RunCommandInterpreter(const SBCommandInterpreterRunOptions & options)12274c67b119SJonas Devlieghere SBCommandInterpreterRunResult SBDebugger::RunCommandInterpreter(
12284c67b119SJonas Devlieghere     const SBCommandInterpreterRunOptions &options) {
12291755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, options);
12304c67b119SJonas Devlieghere 
12314c67b119SJonas Devlieghere   if (!m_opaque_sp)
1232d232abc3SJonas Devlieghere     return SBCommandInterpreterRunResult();
12334c67b119SJonas Devlieghere 
12344c67b119SJonas Devlieghere   CommandInterpreter &interp = m_opaque_sp->GetCommandInterpreter();
12354c67b119SJonas Devlieghere   CommandInterpreterRunResult result =
12364c67b119SJonas Devlieghere       interp.RunCommandInterpreter(options.ref());
12374c67b119SJonas Devlieghere 
1238d232abc3SJonas Devlieghere   return SBCommandInterpreterRunResult(result);
12394c67b119SJonas Devlieghere }
12404c67b119SJonas Devlieghere 
RunREPL(lldb::LanguageType language,const char * repl_options)1241b9c1b51eSKate Stone SBError SBDebugger::RunREPL(lldb::LanguageType language,
1242b9c1b51eSKate Stone                             const char *repl_options) {
12431755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, language, repl_options);
1244baf5664fSJonas Devlieghere 
12453e7e915dSSean Callanan   SBError error;
12463e7e915dSSean Callanan   if (m_opaque_sp)
12473e7e915dSSean Callanan     error.ref() = m_opaque_sp->RunREPL(language, repl_options);
12483e7e915dSSean Callanan   else
12493e7e915dSSean Callanan     error.SetErrorString("invalid debugger");
1250d232abc3SJonas Devlieghere   return error;
12513e7e915dSSean Callanan }
12523e7e915dSSean Callanan 
reset(const DebuggerSP & debugger_sp)1253b9c1b51eSKate Stone void SBDebugger::reset(const DebuggerSP &debugger_sp) {
12546611103cSGreg Clayton   m_opaque_sp = debugger_sp;
12556611103cSGreg Clayton }
12566611103cSGreg Clayton 
get() const1257b9c1b51eSKate Stone Debugger *SBDebugger::get() const { return m_opaque_sp.get(); }
12586611103cSGreg Clayton 
ref() const1259b9c1b51eSKate Stone Debugger &SBDebugger::ref() const {
12606611103cSGreg Clayton   assert(m_opaque_sp.get());
12616611103cSGreg Clayton   return *m_opaque_sp;
12626611103cSGreg Clayton }
12636611103cSGreg Clayton 
get_sp() const1264b9c1b51eSKate Stone const lldb::DebuggerSP &SBDebugger::get_sp() const { return m_opaque_sp; }
12656611103cSGreg Clayton 
FindDebuggerWithID(int id)1266b9c1b51eSKate Stone SBDebugger SBDebugger::FindDebuggerWithID(int id) {
12671755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(id);
1268baf5664fSJonas Devlieghere 
1269af67cecdSGreg Clayton   // No need to lock, the debugger list is thread safe
1270ebc1bb27SCaroline Tice   SBDebugger sb_debugger;
1271431ce678SGreg Clayton   DebuggerSP debugger_sp = Debugger::FindDebuggerWithID(id);
1272ebc1bb27SCaroline Tice   if (debugger_sp)
1273ebc1bb27SCaroline Tice     sb_debugger.reset(debugger_sp);
1274d232abc3SJonas Devlieghere   return sb_debugger;
1275ebc1bb27SCaroline Tice }
1276e40e4218SJim Ingham 
GetInstanceName()1277b9c1b51eSKate Stone const char *SBDebugger::GetInstanceName() {
12781755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1279baf5664fSJonas Devlieghere 
1280dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetInstanceName().AsCString() : nullptr);
1281dd759857SCaroline Tice }
1282dd759857SCaroline Tice 
SetInternalVariable(const char * var_name,const char * value,const char * debugger_instance_name)1283b9c1b51eSKate Stone SBError SBDebugger::SetInternalVariable(const char *var_name, const char *value,
1284b9c1b51eSKate Stone                                         const char *debugger_instance_name) {
12851755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(var_name, value, debugger_instance_name);
1286baf5664fSJonas Devlieghere 
12876920b52bSGreg Clayton   SBError sb_error;
1288b9c1b51eSKate Stone   DebuggerSP debugger_sp(Debugger::FindDebuggerWithInstanceName(
1289b9c1b51eSKate Stone       ConstString(debugger_instance_name)));
129097206d57SZachary Turner   Status error;
1291b9c1b51eSKate Stone   if (debugger_sp) {
12920f2be195SRaphael Isemann     ExecutionContext exe_ctx(
12930f2be195SRaphael Isemann         debugger_sp->GetCommandInterpreter().GetExecutionContext());
1294b9c1b51eSKate Stone     error = debugger_sp->SetPropertyValue(&exe_ctx, eVarSetOperationAssign,
1295b9c1b51eSKate Stone                                           var_name, value);
1296b9c1b51eSKate Stone   } else {
1297b9c1b51eSKate Stone     error.SetErrorStringWithFormat("invalid debugger instance name '%s'",
1298b9c1b51eSKate Stone                                    debugger_instance_name);
12996920b52bSGreg Clayton   }
13006920b52bSGreg Clayton   if (error.Fail())
13016920b52bSGreg Clayton     sb_error.SetError(error);
1302d232abc3SJonas Devlieghere   return sb_error;
13033df9a8dfSCaroline Tice }
13043df9a8dfSCaroline Tice 
1305431ce678SGreg Clayton SBStringList
GetInternalVariableValue(const char * var_name,const char * debugger_instance_name)1306b9c1b51eSKate Stone SBDebugger::GetInternalVariableValue(const char *var_name,
1307b9c1b51eSKate Stone                                      const char *debugger_instance_name) {
13081755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(var_name, debugger_instance_name);
1309baf5664fSJonas Devlieghere 
1310b9c1b51eSKate Stone   DebuggerSP debugger_sp(Debugger::FindDebuggerWithInstanceName(
1311b9c1b51eSKate Stone       ConstString(debugger_instance_name)));
131297206d57SZachary Turner   Status error;
1313b9c1b51eSKate Stone   if (debugger_sp) {
13140f2be195SRaphael Isemann     ExecutionContext exe_ctx(
13150f2be195SRaphael Isemann         debugger_sp->GetCommandInterpreter().GetExecutionContext());
1316b9c1b51eSKate Stone     lldb::OptionValueSP value_sp(
1317b9c1b51eSKate Stone         debugger_sp->GetPropertyValue(&exe_ctx, var_name, false, error));
1318b9c1b51eSKate Stone     if (value_sp) {
13196920b52bSGreg Clayton       StreamString value_strm;
13206920b52bSGreg Clayton       value_sp->DumpValue(&exe_ctx, value_strm, OptionValue::eDumpOptionValue);
1321adcd0268SBenjamin Kramer       const std::string &value_str = std::string(value_strm.GetString());
1322b9c1b51eSKate Stone       if (!value_str.empty()) {
13236920b52bSGreg Clayton         StringList string_list;
132444d93782SGreg Clayton         string_list.SplitIntoLines(value_str);
1325d232abc3SJonas Devlieghere         return SBStringList(&string_list);
13266920b52bSGreg Clayton       }
13276920b52bSGreg Clayton     }
13286920b52bSGreg Clayton   }
1329d232abc3SJonas Devlieghere   return SBStringList();
13303df9a8dfSCaroline Tice }
13313df9a8dfSCaroline Tice 
GetTerminalWidth() const1332b9c1b51eSKate Stone uint32_t SBDebugger::GetTerminalWidth() const {
13331755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1334baf5664fSJonas Devlieghere 
1335dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetTerminalWidth() : 0);
1336a7015092SGreg Clayton }
1337a7015092SGreg Clayton 
SetTerminalWidth(uint32_t term_width)1338b9c1b51eSKate Stone void SBDebugger::SetTerminalWidth(uint32_t term_width) {
13391755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, term_width);
1340baf5664fSJonas Devlieghere 
1341a7015092SGreg Clayton   if (m_opaque_sp)
1342a7015092SGreg Clayton     m_opaque_sp->SetTerminalWidth(term_width);
1343a7015092SGreg Clayton }
1344a7015092SGreg Clayton 
GetPrompt() const1345b9c1b51eSKate Stone const char *SBDebugger::GetPrompt() const {
13461755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1347baf5664fSJonas Devlieghere 
1348a007a6d8SPavel Labath   Log *log = GetLog(LLDBLog::API);
1349ceb6b139SCaroline Tice 
135063e5fb76SJonas Devlieghere   LLDB_LOGF(log, "SBDebugger(%p)::GetPrompt () => \"%s\"",
1351324a1036SSaleem Abdulrasool             static_cast<void *>(m_opaque_sp.get()),
1352514d8cd8SZachary Turner             (m_opaque_sp ? m_opaque_sp->GetPrompt().str().c_str() : ""));
1353ceb6b139SCaroline Tice 
1354514d8cd8SZachary Turner   return (m_opaque_sp ? ConstString(m_opaque_sp->GetPrompt()).GetCString()
1355514d8cd8SZachary Turner                       : nullptr);
1356a7015092SGreg Clayton }
1357a7015092SGreg Clayton 
SetPrompt(const char * prompt)1358b9c1b51eSKate Stone void SBDebugger::SetPrompt(const char *prompt) {
13591755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, prompt);
1360baf5664fSJonas Devlieghere 
1361a7015092SGreg Clayton   if (m_opaque_sp)
1362bbea3610SRaphael Isemann     m_opaque_sp->SetPrompt(llvm::StringRef(prompt));
1363a7015092SGreg Clayton }
1364a7015092SGreg Clayton 
GetReproducerPath() const13659e046f02SJonas Devlieghere const char *SBDebugger::GetReproducerPath() const {
13661755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1367baf5664fSJonas Devlieghere 
13689e046f02SJonas Devlieghere   return (m_opaque_sp
13699e046f02SJonas Devlieghere               ? ConstString(m_opaque_sp->GetReproducerPath()).GetCString()
13709e046f02SJonas Devlieghere               : nullptr);
13719e046f02SJonas Devlieghere }
13729e046f02SJonas Devlieghere 
GetScriptLanguage() const1373b9c1b51eSKate Stone ScriptLanguage SBDebugger::GetScriptLanguage() const {
13741755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1375baf5664fSJonas Devlieghere 
1376dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetScriptLanguage() : eScriptLanguageNone);
1377a7015092SGreg Clayton }
1378a7015092SGreg Clayton 
SetScriptLanguage(ScriptLanguage script_lang)1379b9c1b51eSKate Stone void SBDebugger::SetScriptLanguage(ScriptLanguage script_lang) {
13801755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, script_lang);
1381baf5664fSJonas Devlieghere 
1382b9c1b51eSKate Stone   if (m_opaque_sp) {
1383a7015092SGreg Clayton     m_opaque_sp->SetScriptLanguage(script_lang);
1384a7015092SGreg Clayton   }
1385af67cecdSGreg Clayton }
1386a7015092SGreg Clayton 
GetREPLLanguage() const138746a28a95SJonas Devlieghere LanguageType SBDebugger::GetREPLLanguage() const {
13881755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
138946a28a95SJonas Devlieghere 
139046a28a95SJonas Devlieghere   return (m_opaque_sp ? m_opaque_sp->GetREPLLanguage() : eLanguageTypeUnknown);
139146a28a95SJonas Devlieghere }
139246a28a95SJonas Devlieghere 
SetREPLLanguage(LanguageType repl_lang)139346a28a95SJonas Devlieghere void SBDebugger::SetREPLLanguage(LanguageType repl_lang) {
13941755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, repl_lang);
139546a28a95SJonas Devlieghere 
139646a28a95SJonas Devlieghere   if (m_opaque_sp) {
139746a28a95SJonas Devlieghere     m_opaque_sp->SetREPLLanguage(repl_lang);
139846a28a95SJonas Devlieghere   }
139946a28a95SJonas Devlieghere }
140046a28a95SJonas Devlieghere 
SetUseExternalEditor(bool value)1401b9c1b51eSKate Stone bool SBDebugger::SetUseExternalEditor(bool value) {
14021755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, value);
1403baf5664fSJonas Devlieghere 
1404dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->SetUseExternalEditor(value) : false);
1405e40e4218SJim Ingham }
1406e40e4218SJim Ingham 
GetUseExternalEditor()1407b9c1b51eSKate Stone bool SBDebugger::GetUseExternalEditor() {
14081755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1409baf5664fSJonas Devlieghere 
1410dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetUseExternalEditor() : false);
1411e40e4218SJim Ingham }
1412e40e4218SJim Ingham 
SetUseColor(bool value)1413b9c1b51eSKate Stone bool SBDebugger::SetUseColor(bool value) {
14141755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, value);
1415baf5664fSJonas Devlieghere 
1416dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->SetUseColor(value) : false);
1417c3ce7f27SMichael Sartain }
1418c3ce7f27SMichael Sartain 
GetUseColor() const1419b9c1b51eSKate Stone bool SBDebugger::GetUseColor() const {
14201755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1421baf5664fSJonas Devlieghere 
1422dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetUseColor() : false);
1423c3ce7f27SMichael Sartain }
1424c3ce7f27SMichael Sartain 
SetUseSourceCache(bool value)1425acae69d0SEmre Kultursay bool SBDebugger::SetUseSourceCache(bool value) {
14261755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, value);
1427acae69d0SEmre Kultursay 
1428acae69d0SEmre Kultursay   return (m_opaque_sp ? m_opaque_sp->SetUseSourceCache(value) : false);
1429acae69d0SEmre Kultursay }
1430acae69d0SEmre Kultursay 
GetUseSourceCache() const1431acae69d0SEmre Kultursay bool SBDebugger::GetUseSourceCache() const {
14321755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1433acae69d0SEmre Kultursay 
1434acae69d0SEmre Kultursay   return (m_opaque_sp ? m_opaque_sp->GetUseSourceCache() : false);
1435acae69d0SEmre Kultursay }
1436acae69d0SEmre Kultursay 
GetDescription(SBStream & description)1437b9c1b51eSKate Stone bool SBDebugger::GetDescription(SBStream &description) {
14381755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, description);
1439baf5664fSJonas Devlieghere 
1440da7bc7d0SGreg Clayton   Stream &strm = description.ref();
1441da7bc7d0SGreg Clayton 
1442b9c1b51eSKate Stone   if (m_opaque_sp) {
1443dde9cff3SCaroline Tice     const char *name = m_opaque_sp->GetInstanceName().AsCString();
1444431ce678SGreg Clayton     user_id_t id = m_opaque_sp->GetID();
1445d01b2953SDaniel Malea     strm.Printf("Debugger (instance: \"%s\", id: %" PRIu64 ")", name, id);
1446b9c1b51eSKate Stone   } else
1447da7bc7d0SGreg Clayton     strm.PutCString("No value");
1448dde9cff3SCaroline Tice 
1449dde9cff3SCaroline Tice   return true;
1450dde9cff3SCaroline Tice }
1451efed6131SCaroline Tice 
GetID()1452b9c1b51eSKate Stone user_id_t SBDebugger::GetID() {
14531755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1454baf5664fSJonas Devlieghere 
1455dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetID() : LLDB_INVALID_UID);
1456efed6131SCaroline Tice }
14572289fa48SGreg Clayton 
SetCurrentPlatform(const char * platform_name_cstr)1458b9c1b51eSKate Stone SBError SBDebugger::SetCurrentPlatform(const char *platform_name_cstr) {
14591755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, platform_name_cstr);
1460baf5664fSJonas Devlieghere 
14612289fa48SGreg Clayton   SBError sb_error;
1462b9c1b51eSKate Stone   if (m_opaque_sp) {
1463b9c1b51eSKate Stone     if (platform_name_cstr && platform_name_cstr[0]) {
1464af921006SPavel Labath       PlatformList &platforms = m_opaque_sp->GetPlatformList();
1465af921006SPavel Labath       if (PlatformSP platform_sp = platforms.GetOrCreate(platform_name_cstr))
1466af921006SPavel Labath         platforms.SetSelectedPlatform(platform_sp);
1467af921006SPavel Labath       else
1468af921006SPavel Labath         sb_error.ref().SetErrorString("platform not found");
1469b9c1b51eSKate Stone     } else {
1470615eb7e6SGreg Clayton       sb_error.ref().SetErrorString("invalid platform name");
1471615eb7e6SGreg Clayton     }
1472b9c1b51eSKate Stone   } else {
1473615eb7e6SGreg Clayton     sb_error.ref().SetErrorString("invalid debugger");
1474615eb7e6SGreg Clayton   }
1475d232abc3SJonas Devlieghere   return sb_error;
14762289fa48SGreg Clayton }
14772289fa48SGreg Clayton 
SetCurrentPlatformSDKRoot(const char * sysroot)1478b9c1b51eSKate Stone bool SBDebugger::SetCurrentPlatformSDKRoot(const char *sysroot) {
14791755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, sysroot);
1480baf5664fSJonas Devlieghere 
148190342453SPavel Labath   if (SBPlatform platform = GetSelectedPlatform()) {
148290342453SPavel Labath     platform.SetSDKRoot(sysroot);
1483f3dd93c8SGreg Clayton     return true;
1484f3dd93c8SGreg Clayton   }
1485f3dd93c8SGreg Clayton   return false;
1486f3dd93c8SGreg Clayton }
1487f3dd93c8SGreg Clayton 
GetCloseInputOnEOF() const1488b9c1b51eSKate Stone bool SBDebugger::GetCloseInputOnEOF() const {
14891755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1490baf5664fSJonas Devlieghere 
1491dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetCloseInputOnEOF() : false);
1492fc3f027dSGreg Clayton }
1493fc3f027dSGreg Clayton 
SetCloseInputOnEOF(bool b)1494b9c1b51eSKate Stone void SBDebugger::SetCloseInputOnEOF(bool b) {
14951755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, b);
1496baf5664fSJonas Devlieghere 
1497fc3f027dSGreg Clayton   if (m_opaque_sp)
1498fc3f027dSGreg Clayton     m_opaque_sp->SetCloseInputOnEOF(b);
1499fc3f027dSGreg Clayton }
1500061858ceSEnrico Granata 
GetCategory(const char * category_name)1501b9c1b51eSKate Stone SBTypeCategory SBDebugger::GetCategory(const char *category_name) {
15021755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, category_name);
1503baf5664fSJonas Devlieghere 
1504061858ceSEnrico Granata   if (!category_name || *category_name == 0)
1505d232abc3SJonas Devlieghere     return SBTypeCategory();
1506061858ceSEnrico Granata 
1507061858ceSEnrico Granata   TypeCategoryImplSP category_sp;
1508061858ceSEnrico Granata 
1509b9c1b51eSKate Stone   if (DataVisualization::Categories::GetCategory(ConstString(category_name),
1510baf5664fSJonas Devlieghere                                                  category_sp, false)) {
1511d232abc3SJonas Devlieghere     return SBTypeCategory(category_sp);
1512baf5664fSJonas Devlieghere   } else {
1513d232abc3SJonas Devlieghere     return SBTypeCategory();
1514baf5664fSJonas Devlieghere   }
1515061858ceSEnrico Granata }
1516061858ceSEnrico Granata 
GetCategory(lldb::LanguageType lang_type)1517b9c1b51eSKate Stone SBTypeCategory SBDebugger::GetCategory(lldb::LanguageType lang_type) {
15181755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, lang_type);
1519baf5664fSJonas Devlieghere 
1520e242624cSEnrico Granata   TypeCategoryImplSP category_sp;
1521baf5664fSJonas Devlieghere   if (DataVisualization::Categories::GetCategory(lang_type, category_sp)) {
1522d232abc3SJonas Devlieghere     return SBTypeCategory(category_sp);
1523baf5664fSJonas Devlieghere   } else {
1524d232abc3SJonas Devlieghere     return SBTypeCategory();
1525baf5664fSJonas Devlieghere   }
1526e242624cSEnrico Granata }
1527e242624cSEnrico Granata 
CreateCategory(const char * category_name)1528b9c1b51eSKate Stone SBTypeCategory SBDebugger::CreateCategory(const char *category_name) {
15291755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, category_name);
1530baf5664fSJonas Devlieghere 
1531061858ceSEnrico Granata   if (!category_name || *category_name == 0)
1532d232abc3SJonas Devlieghere     return SBTypeCategory();
1533061858ceSEnrico Granata 
1534061858ceSEnrico Granata   TypeCategoryImplSP category_sp;
1535061858ceSEnrico Granata 
1536b9c1b51eSKate Stone   if (DataVisualization::Categories::GetCategory(ConstString(category_name),
1537baf5664fSJonas Devlieghere                                                  category_sp, true)) {
1538d232abc3SJonas Devlieghere     return SBTypeCategory(category_sp);
1539baf5664fSJonas Devlieghere   } else {
1540d232abc3SJonas Devlieghere     return SBTypeCategory();
1541baf5664fSJonas Devlieghere   }
1542061858ceSEnrico Granata }
1543061858ceSEnrico Granata 
DeleteCategory(const char * category_name)1544b9c1b51eSKate Stone bool SBDebugger::DeleteCategory(const char *category_name) {
15451755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, category_name);
1546baf5664fSJonas Devlieghere 
1547061858ceSEnrico Granata   if (!category_name || *category_name == 0)
1548061858ceSEnrico Granata     return false;
1549061858ceSEnrico Granata 
1550061858ceSEnrico Granata   return DataVisualization::Categories::Delete(ConstString(category_name));
1551061858ceSEnrico Granata }
1552061858ceSEnrico Granata 
GetNumCategories()1553b9c1b51eSKate Stone uint32_t SBDebugger::GetNumCategories() {
15541755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1555baf5664fSJonas Devlieghere 
1556061858ceSEnrico Granata   return DataVisualization::Categories::GetCount();
1557061858ceSEnrico Granata }
1558061858ceSEnrico Granata 
GetCategoryAtIndex(uint32_t index)1559b9c1b51eSKate Stone SBTypeCategory SBDebugger::GetCategoryAtIndex(uint32_t index) {
15601755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, index);
1561baf5664fSJonas Devlieghere 
1562d232abc3SJonas Devlieghere   return SBTypeCategory(
1563d232abc3SJonas Devlieghere       DataVisualization::Categories::GetCategoryAtIndex(index));
1564061858ceSEnrico Granata }
1565061858ceSEnrico Granata 
GetDefaultCategory()1566b9c1b51eSKate Stone SBTypeCategory SBDebugger::GetDefaultCategory() {
15671755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1568baf5664fSJonas Devlieghere 
1569d232abc3SJonas Devlieghere   return GetCategory("default");
1570061858ceSEnrico Granata }
1571061858ceSEnrico Granata 
GetFormatForType(SBTypeNameSpecifier type_name)1572b9c1b51eSKate Stone SBTypeFormat SBDebugger::GetFormatForType(SBTypeNameSpecifier type_name) {
15731755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, type_name);
1574baf5664fSJonas Devlieghere 
1575061858ceSEnrico Granata   SBTypeCategory default_category_sb = GetDefaultCategory();
1576061858ceSEnrico Granata   if (default_category_sb.GetEnabled())
1577d232abc3SJonas Devlieghere     return default_category_sb.GetFormatForType(type_name);
1578d232abc3SJonas Devlieghere   return SBTypeFormat();
1579061858ceSEnrico Granata }
1580061858ceSEnrico Granata 
GetSummaryForType(SBTypeNameSpecifier type_name)1581b9c1b51eSKate Stone SBTypeSummary SBDebugger::GetSummaryForType(SBTypeNameSpecifier type_name) {
15821755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, type_name);
1583baf5664fSJonas Devlieghere 
1584dbb0abbfSEugene Zelenko   if (!type_name.IsValid())
1585d232abc3SJonas Devlieghere     return SBTypeSummary();
1586d232abc3SJonas Devlieghere   return SBTypeSummary(DataVisualization::GetSummaryForType(type_name.GetSP()));
1587061858ceSEnrico Granata }
1588061858ceSEnrico Granata 
GetFilterForType(SBTypeNameSpecifier type_name)1589b9c1b51eSKate Stone SBTypeFilter SBDebugger::GetFilterForType(SBTypeNameSpecifier type_name) {
15901755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, type_name);
1591baf5664fSJonas Devlieghere 
1592dbb0abbfSEugene Zelenko   if (!type_name.IsValid())
1593d232abc3SJonas Devlieghere     return SBTypeFilter();
1594d232abc3SJonas Devlieghere   return SBTypeFilter(DataVisualization::GetFilterForType(type_name.GetSP()));
1595061858ceSEnrico Granata }
1596061858ceSEnrico Granata 
GetSyntheticForType(SBTypeNameSpecifier type_name)1597b9c1b51eSKate Stone SBTypeSynthetic SBDebugger::GetSyntheticForType(SBTypeNameSpecifier type_name) {
15981755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, type_name);
1599baf5664fSJonas Devlieghere 
1600dbb0abbfSEugene Zelenko   if (!type_name.IsValid())
1601d232abc3SJonas Devlieghere     return SBTypeSynthetic();
1602d232abc3SJonas Devlieghere   return SBTypeSynthetic(
1603d232abc3SJonas Devlieghere       DataVisualization::GetSyntheticForType(type_name.GetSP()));
1604061858ceSEnrico Granata }
1605061858ceSEnrico Granata 
GetCategoryArray(const char ** categories)16065e336903SPavel Labath static llvm::ArrayRef<const char *> GetCategoryArray(const char **categories) {
16075e336903SPavel Labath   if (categories == nullptr)
16085e336903SPavel Labath     return {};
16095e336903SPavel Labath   size_t len = 0;
16105e336903SPavel Labath   while (categories[len] != nullptr)
16115e336903SPavel Labath     ++len;
16125e336903SPavel Labath   return llvm::makeArrayRef(categories, len);
16135e336903SPavel Labath }
16145e336903SPavel Labath 
EnableLog(const char * channel,const char ** categories)1615b9c1b51eSKate Stone bool SBDebugger::EnableLog(const char *channel, const char **categories) {
16161755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, channel, categories);
1617baf5664fSJonas Devlieghere 
1618b9c1b51eSKate Stone   if (m_opaque_sp) {
1619b9c1b51eSKate Stone     uint32_t log_options =
1620b9c1b51eSKate Stone         LLDB_LOG_OPTION_PREPEND_TIMESTAMP | LLDB_LOG_OPTION_PREPEND_THREAD_NAME;
1621775588c0SPavel Labath     std::string error;
1622775588c0SPavel Labath     llvm::raw_string_ostream error_stream(error);
16235e336903SPavel Labath     return m_opaque_sp->EnableLog(channel, GetCategoryArray(categories), "",
1624*be265d25SJonas Devlieghere                                   log_options, /*buffer_size=*/0,
1625*be265d25SJonas Devlieghere                                   eLogHandlerStream, error_stream);
1626b9c1b51eSKate Stone   } else
1627228063cdSJim Ingham     return false;
1628228063cdSJim Ingham }
16294f02b22dSJim Ingham 
SetLoggingCallback(lldb::LogOutputCallback log_callback,void * baton)1630b9c1b51eSKate Stone void SBDebugger::SetLoggingCallback(lldb::LogOutputCallback log_callback,
1631b9c1b51eSKate Stone                                     void *baton) {
16321755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, log_callback, baton);
16330d7b0c96SJonas Devlieghere 
1634b9c1b51eSKate Stone   if (m_opaque_sp) {
16354f02b22dSJim Ingham     return m_opaque_sp->SetLoggingCallback(log_callback, baton);
16364f02b22dSJim Ingham   }
16374f02b22dSJim Ingham }
163850f93679SJakob Johnson 
163950f93679SJakob Johnson SBTrace
LoadTraceFromFile(SBError & error,const SBFileSpec & trace_description_file)164050f93679SJakob Johnson SBDebugger::LoadTraceFromFile(SBError &error,
164150f93679SJakob Johnson                               const SBFileSpec &trace_description_file) {
164250f93679SJakob Johnson   LLDB_INSTRUMENT_VA(this, error, trace_description_file);
164350f93679SJakob Johnson   return SBTrace::LoadTraceFromFile(error, *this, trace_description_file);
164450f93679SJakob Johnson }
1645