130fdc8d8SChris Lattner //===-- SBDebugger.cpp ------------------------------------------*- C++ -*-===//
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 
9d17cd902SAlex Langford 
10d17cd902SAlex Langford #include "SystemInitializerFull.h"
11d17cd902SAlex Langford 
12ca93cc1dSEli Friedman #include "lldb/API/SBDebugger.h"
1330fdc8d8SChris Lattner 
14e0d378b3SGreg Clayton #include "lldb/lldb-private.h"
1530fdc8d8SChris Lattner 
16ca93cc1dSEli Friedman #include "lldb/API/SBBroadcaster.h"
17ca93cc1dSEli Friedman #include "lldb/API/SBCommandInterpreter.h"
18ca93cc1dSEli Friedman #include "lldb/API/SBCommandReturnObject.h"
192289fa48SGreg Clayton #include "lldb/API/SBError.h"
20ca93cc1dSEli Friedman #include "lldb/API/SBEvent.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"
30061858ceSEnrico Granata #include "lldb/API/SBTypeCategory.h"
31061858ceSEnrico Granata #include "lldb/API/SBTypeFilter.h"
32b9c1b51eSKate Stone #include "lldb/API/SBTypeFormat.h"
33061858ceSEnrico Granata #include "lldb/API/SBTypeNameSpecifier.h"
34061858ceSEnrico Granata #include "lldb/API/SBTypeSummary.h"
35061858ceSEnrico Granata #include "lldb/API/SBTypeSynthetic.h"
36061858ceSEnrico Granata 
376eee5aa0SGreg Clayton #include "lldb/Core/Debugger.h"
38c10e34d0SVadim Macagon #include "lldb/Core/PluginManager.h"
3944d93782SGreg Clayton #include "lldb/Core/StreamFile.h"
40c10e34d0SVadim Macagon #include "lldb/Core/StructuredDataImpl.h"
415548cb50SEnrico Granata #include "lldb/DataFormatters/DataVisualization.h"
42f1389e92SPavel Labath #include "lldb/Host/XML.h"
43e6e2bb38SZachary Turner #include "lldb/Initialization/SystemLifetimeManager.h"
446eee5aa0SGreg Clayton #include "lldb/Interpreter/CommandInterpreter.h"
4547cbf4a0SPavel Labath #include "lldb/Interpreter/OptionArgParser.h"
46cac9c5f9SGreg Clayton #include "lldb/Interpreter/OptionGroupPlatform.h"
476eee5aa0SGreg Clayton #include "lldb/Target/Process.h"
486eee5aa0SGreg Clayton #include "lldb/Target/TargetList.h"
49145d95c9SPavel Labath #include "lldb/Utility/Args.h"
50d821c997SPavel Labath #include "lldb/Utility/State.h"
5130fdc8d8SChris Lattner 
52d717cc9fSEnrico Granata #include "llvm/ADT/STLExtras.h"
537b2e5a36SZachary Turner #include "llvm/ADT/StringRef.h"
5458a559c0SZachary Turner #include "llvm/Support/DynamicLibrary.h"
55b9c1b51eSKate Stone #include "llvm/Support/ManagedStatic.h"
5658a559c0SZachary Turner 
5730fdc8d8SChris Lattner using namespace lldb;
5830fdc8d8SChris Lattner using namespace lldb_private;
5930fdc8d8SChris Lattner 
60*d77c2e09SJonas Devlieghere /// Helper class for replaying commands through the reproducer.
61*d77c2e09SJonas Devlieghere class CommandLoader {
62*d77c2e09SJonas Devlieghere public:
63*d77c2e09SJonas Devlieghere   CommandLoader(std::vector<std::string> files) : m_files(files) {}
64*d77c2e09SJonas Devlieghere 
65*d77c2e09SJonas Devlieghere   static std::unique_ptr<CommandLoader> Create() {
66*d77c2e09SJonas Devlieghere     repro::Loader *loader = repro::Reproducer::Instance().GetLoader();
67*d77c2e09SJonas Devlieghere     if (!loader)
68*d77c2e09SJonas Devlieghere       return {};
69*d77c2e09SJonas Devlieghere 
70*d77c2e09SJonas Devlieghere     FileSpec file = loader->GetFile<repro::CommandInfo>();
71*d77c2e09SJonas Devlieghere     if (!file)
72*d77c2e09SJonas Devlieghere       return {};
73*d77c2e09SJonas Devlieghere 
74*d77c2e09SJonas Devlieghere     auto error_or_file = llvm::MemoryBuffer::getFile(file.GetPath());
75*d77c2e09SJonas Devlieghere     if (auto err = error_or_file.getError())
76*d77c2e09SJonas Devlieghere       return {};
77*d77c2e09SJonas Devlieghere 
78*d77c2e09SJonas Devlieghere     std::vector<std::string> files;
79*d77c2e09SJonas Devlieghere     llvm::yaml::Input yin((*error_or_file)->getBuffer());
80*d77c2e09SJonas Devlieghere     yin >> files;
81*d77c2e09SJonas Devlieghere 
82*d77c2e09SJonas Devlieghere     if (auto err = yin.error())
83*d77c2e09SJonas Devlieghere       return {};
84*d77c2e09SJonas Devlieghere 
85*d77c2e09SJonas Devlieghere     return llvm::make_unique<CommandLoader>(std::move(files));
86*d77c2e09SJonas Devlieghere   }
87*d77c2e09SJonas Devlieghere 
88*d77c2e09SJonas Devlieghere   FILE *GetNextFile() {
89*d77c2e09SJonas Devlieghere     if (m_index >= m_files.size())
90*d77c2e09SJonas Devlieghere       return nullptr;
91*d77c2e09SJonas Devlieghere     return FileSystem::Instance().Fopen(m_files[m_index++].c_str(), "r");
92*d77c2e09SJonas Devlieghere   }
93*d77c2e09SJonas Devlieghere 
94*d77c2e09SJonas Devlieghere private:
95*d77c2e09SJonas Devlieghere   std::vector<std::string> m_files;
96*d77c2e09SJonas Devlieghere   unsigned m_index = 0;
97*d77c2e09SJonas Devlieghere };
98*d77c2e09SJonas Devlieghere 
99b9c1b51eSKate Stone static llvm::sys::DynamicLibrary LoadPlugin(const lldb::DebuggerSP &debugger_sp,
100b9c1b51eSKate Stone                                             const FileSpec &spec,
10197206d57SZachary Turner                                             Status &error) {
102b9c1b51eSKate Stone   llvm::sys::DynamicLibrary dynlib =
103b9c1b51eSKate Stone       llvm::sys::DynamicLibrary::getPermanentLibrary(spec.GetPath().c_str());
104b9c1b51eSKate Stone   if (dynlib.isValid()) {
1055fb8f797SGreg Clayton     typedef bool (*LLDBCommandPluginInit)(lldb::SBDebugger & debugger);
1065fb8f797SGreg Clayton 
1075fb8f797SGreg Clayton     lldb::SBDebugger debugger_sb(debugger_sp);
108b9c1b51eSKate Stone     // This calls the bool lldb::PluginInitialize(lldb::SBDebugger debugger)
109b9c1b51eSKate Stone     // function.
110b9c1b51eSKate Stone     // TODO: mangle this differently for your system - on OSX, the first
111b9c1b51eSKate Stone     // underscore needs to be removed and the second one stays
112b9c1b51eSKate Stone     LLDBCommandPluginInit init_func =
11322701b2fSStephane Sezer         (LLDBCommandPluginInit)(uintptr_t)dynlib.getAddressOfSymbol(
114b9c1b51eSKate Stone             "_ZN4lldb16PluginInitializeENS_10SBDebuggerE");
115b9c1b51eSKate Stone     if (init_func) {
1165fb8f797SGreg Clayton       if (init_func(debugger_sb))
11758a559c0SZachary Turner         return dynlib;
1185fb8f797SGreg Clayton       else
119b9c1b51eSKate Stone         error.SetErrorString("plug-in refused to load "
120b9c1b51eSKate Stone                              "(lldb::PluginInitialize(lldb::SBDebugger) "
121b9c1b51eSKate Stone                              "returned false)");
122b9c1b51eSKate Stone     } else {
123b9c1b51eSKate Stone       error.SetErrorString("plug-in is missing the required initialization: "
124b9c1b51eSKate Stone                            "lldb::PluginInitialize(lldb::SBDebugger)");
1255fb8f797SGreg Clayton     }
126b9c1b51eSKate Stone   } else {
127dbd7fabaSJonas Devlieghere     if (FileSystem::Instance().Exists(spec))
1285fb8f797SGreg Clayton       error.SetErrorString("this file does not represent a loadable dylib");
1295fb8f797SGreg Clayton     else
1305fb8f797SGreg Clayton       error.SetErrorString("no such file");
1315fb8f797SGreg Clayton   }
13258a559c0SZachary Turner   return llvm::sys::DynamicLibrary();
1335fb8f797SGreg Clayton }
1345fb8f797SGreg Clayton 
135e6e2bb38SZachary Turner static llvm::ManagedStatic<SystemLifetimeManager> g_debugger_lifetime;
136e6e2bb38SZachary Turner 
137b9c1b51eSKate Stone SBError SBInputReader::Initialize(
138b9c1b51eSKate Stone     lldb::SBDebugger &sb_debugger,
139b9c1b51eSKate Stone     unsigned long (*)(void *, lldb::SBInputReader *, lldb::InputReaderAction,
140b9c1b51eSKate Stone                       char const *, unsigned long),
141b9c1b51eSKate Stone     void *, lldb::InputReaderGranularity, char const *, char const *, bool) {
142e6e2bb38SZachary Turner   return SBError();
143e6e2bb38SZachary Turner }
144e6e2bb38SZachary Turner 
145b9c1b51eSKate Stone void SBInputReader::SetIsDone(bool) {}
146dbb0abbfSEugene Zelenko 
147b9c1b51eSKate Stone bool SBInputReader::IsActive() const { return false; }
148e6e2bb38SZachary Turner 
149dbb0abbfSEugene Zelenko SBDebugger::SBDebugger() = default;
150dbb0abbfSEugene Zelenko 
151b9c1b51eSKate Stone SBDebugger::SBDebugger(const lldb::DebuggerSP &debugger_sp)
152b9c1b51eSKate Stone     : m_opaque_sp(debugger_sp) {}
153dbb0abbfSEugene Zelenko 
154b9c1b51eSKate Stone SBDebugger::SBDebugger(const SBDebugger &rhs) : m_opaque_sp(rhs.m_opaque_sp) {}
155dbb0abbfSEugene Zelenko 
156dbb0abbfSEugene Zelenko SBDebugger::~SBDebugger() = default;
157dbb0abbfSEugene Zelenko 
158b9c1b51eSKate Stone SBDebugger &SBDebugger::operator=(const SBDebugger &rhs) {
159b9c1b51eSKate Stone   if (this != &rhs) {
160dbb0abbfSEugene Zelenko     m_opaque_sp = rhs.m_opaque_sp;
161dbb0abbfSEugene Zelenko   }
162dbb0abbfSEugene Zelenko   return *this;
163dbb0abbfSEugene Zelenko }
164dbb0abbfSEugene Zelenko 
165b9c1b51eSKate Stone void SBDebugger::Initialize() {
166936c6242SJonas Devlieghere   SBError ignored = SBDebugger::InitializeWithErrorHandling();
16715eacd74SJonas Devlieghere }
16815eacd74SJonas Devlieghere 
169936c6242SJonas Devlieghere lldb::SBError SBDebugger::InitializeWithErrorHandling() {
1705160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
171ceb6b139SCaroline Tice 
172ceb6b139SCaroline Tice   if (log)
173ceb6b139SCaroline Tice     log->Printf("SBDebugger::Initialize ()");
174ceb6b139SCaroline Tice 
17515eacd74SJonas Devlieghere   SBError error;
17615eacd74SJonas Devlieghere   if (auto e = g_debugger_lifetime->Initialize(
177936c6242SJonas Devlieghere           llvm::make_unique<SystemInitializerFull>(), LoadPlugin)) {
17815eacd74SJonas Devlieghere     error.SetError(Status(std::move(e)));
17915eacd74SJonas Devlieghere   }
18015eacd74SJonas Devlieghere   return error;
18130fdc8d8SChris Lattner }
18230fdc8d8SChris Lattner 
183b9c1b51eSKate Stone void SBDebugger::Terminate() { g_debugger_lifetime->Terminate(); }
18430fdc8d8SChris Lattner 
185b9c1b51eSKate Stone void SBDebugger::Clear() {
1865160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
187ceb6b139SCaroline Tice 
188ceb6b139SCaroline Tice   if (log)
189324a1036SSaleem Abdulrasool     log->Printf("SBDebugger(%p)::Clear ()",
190324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_sp.get()));
1913d6086f6SCaroline Tice 
1923d6086f6SCaroline Tice   if (m_opaque_sp)
19344d93782SGreg Clayton     m_opaque_sp->ClearIOHandlers();
194ceb6b139SCaroline Tice 
19548e42549SGreg Clayton   m_opaque_sp.reset();
19648e42549SGreg Clayton }
19748e42549SGreg Clayton 
198b9c1b51eSKate Stone SBDebugger SBDebugger::Create() {
199dbb0abbfSEugene Zelenko   return SBDebugger::Create(false, nullptr, nullptr);
20006942690SJim Ingham }
20106942690SJim Ingham 
202b9c1b51eSKate Stone SBDebugger SBDebugger::Create(bool source_init_files) {
203dbb0abbfSEugene Zelenko   return SBDebugger::Create(source_init_files, nullptr, nullptr);
204228063cdSJim Ingham }
205228063cdSJim Ingham 
206b9c1b51eSKate Stone SBDebugger SBDebugger::Create(bool source_init_files,
207b9c1b51eSKate Stone                               lldb::LogOutputCallback callback, void *baton)
208228063cdSJim Ingham 
209228063cdSJim Ingham {
2105160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
211ceb6b139SCaroline Tice 
2126611103cSGreg Clayton   SBDebugger debugger;
213cb172b10SGreg Clayton 
214b9c1b51eSKate Stone   // Currently we have issues if this function is called simultaneously on two
21505097246SAdrian Prantl   // different threads. The issues mainly revolve around the fact that the
21605097246SAdrian Prantl   // lldb_private::FormatManager uses global collections and having two threads
21705097246SAdrian Prantl   // parsing the .lldbinit files can cause mayhem. So to get around this for
21805097246SAdrian Prantl   // now we need to use a mutex to prevent bad things from happening.
21916ff8604SSaleem Abdulrasool   static std::recursive_mutex g_mutex;
22016ff8604SSaleem Abdulrasool   std::lock_guard<std::recursive_mutex> guard(g_mutex);
221cb172b10SGreg Clayton 
222228063cdSJim Ingham   debugger.reset(Debugger::CreateInstance(callback, baton));
223ceb6b139SCaroline Tice 
224b9c1b51eSKate Stone   if (log) {
225ceb6b139SCaroline Tice     SBStream sstr;
226ceb6b139SCaroline Tice     debugger.GetDescription(sstr);
227324a1036SSaleem Abdulrasool     log->Printf("SBDebugger::Create () => SBDebugger(%p): %s",
228324a1036SSaleem Abdulrasool                 static_cast<void *>(debugger.m_opaque_sp.get()),
229324a1036SSaleem Abdulrasool                 sstr.GetData());
230ceb6b139SCaroline Tice   }
231ceb6b139SCaroline Tice 
23206942690SJim Ingham   SBCommandInterpreter interp = debugger.GetCommandInterpreter();
233b9c1b51eSKate Stone   if (source_init_files) {
23406942690SJim Ingham     interp.get()->SkipLLDBInitFiles(false);
23506942690SJim Ingham     interp.get()->SkipAppInitFiles(false);
23606942690SJim Ingham     SBCommandReturnObject result;
23706942690SJim Ingham     interp.SourceInitFileInHomeDirectory(result);
238b9c1b51eSKate Stone   } else {
23906942690SJim Ingham     interp.get()->SkipLLDBInitFiles(true);
24006942690SJim Ingham     interp.get()->SkipAppInitFiles(true);
24106942690SJim Ingham   }
2426611103cSGreg Clayton   return debugger;
2436611103cSGreg Clayton }
2446611103cSGreg Clayton 
245b9c1b51eSKate Stone void SBDebugger::Destroy(SBDebugger &debugger) {
2465160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
247e02657b1SCaroline Tice 
248b9c1b51eSKate Stone   if (log) {
249e02657b1SCaroline Tice     SBStream sstr;
250e02657b1SCaroline Tice     debugger.GetDescription(sstr);
251324a1036SSaleem Abdulrasool     log->Printf("SBDebugger::Destroy () => SBDebugger(%p): %s",
252324a1036SSaleem Abdulrasool                 static_cast<void *>(debugger.m_opaque_sp.get()),
253324a1036SSaleem Abdulrasool                 sstr.GetData());
254e02657b1SCaroline Tice   }
255e02657b1SCaroline Tice 
256e02657b1SCaroline Tice   Debugger::Destroy(debugger.m_opaque_sp);
257e02657b1SCaroline Tice 
258dbb0abbfSEugene Zelenko   if (debugger.m_opaque_sp.get() != nullptr)
259e02657b1SCaroline Tice     debugger.m_opaque_sp.reset();
260e02657b1SCaroline Tice }
261e02657b1SCaroline Tice 
262b9c1b51eSKate Stone void SBDebugger::MemoryPressureDetected() {
26305097246SAdrian Prantl   // Since this function can be call asynchronously, we allow it to be non-
26405097246SAdrian Prantl   // mandatory. We have seen deadlocks with this function when called so we
26505097246SAdrian Prantl   // need to safeguard against this until we can determine what is causing the
26605097246SAdrian Prantl   // deadlocks.
2675160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
268aebdf1beSJim Ingham 
2690cd70866SGreg Clayton   const bool mandatory = false;
270b9c1b51eSKate Stone   if (log) {
271b9c1b51eSKate Stone     log->Printf("SBDebugger::MemoryPressureDetected (), mandatory = %d",
272b9c1b51eSKate Stone                 mandatory);
273aebdf1beSJim Ingham   }
274aebdf1beSJim Ingham 
2750cd70866SGreg Clayton   ModuleList::RemoveOrphanSharedModules(mandatory);
276f9322415SGreg Clayton }
277f9322415SGreg Clayton 
278b9c1b51eSKate Stone bool SBDebugger::IsValid() const { return m_opaque_sp.get() != nullptr; }
2796611103cSGreg Clayton 
280b9c1b51eSKate Stone void SBDebugger::SetAsync(bool b) {
2816611103cSGreg Clayton   if (m_opaque_sp)
2826611103cSGreg Clayton     m_opaque_sp->SetAsyncExecution(b);
28330fdc8d8SChris Lattner }
28430fdc8d8SChris Lattner 
285b9c1b51eSKate Stone bool SBDebugger::GetAsync() {
286dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetAsyncExecution() : false);
287e64f0dc7SJim Ingham }
288e64f0dc7SJim Ingham 
289b9c1b51eSKate Stone void SBDebugger::SkipLLDBInitFiles(bool b) {
2906eee5aa0SGreg Clayton   if (m_opaque_sp)
2916eee5aa0SGreg Clayton     m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles(b);
2926eee5aa0SGreg Clayton }
2936eee5aa0SGreg Clayton 
294b9c1b51eSKate Stone void SBDebugger::SkipAppInitFiles(bool b) {
29516e0c686SJim Ingham   if (m_opaque_sp)
29616e0c686SJim Ingham     m_opaque_sp->GetCommandInterpreter().SkipAppInitFiles(b);
29716e0c686SJim Ingham }
29816e0c686SJim Ingham 
29905097246SAdrian Prantl // Shouldn't really be settable after initialization as this could cause lots
30005097246SAdrian Prantl // of problems; don't want users trying to switch modes in the middle of a
30105097246SAdrian Prantl // debugging session.
302b9c1b51eSKate Stone void SBDebugger::SetInputFileHandle(FILE *fh, bool transfer_ownership) {
3035160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
304ceb6b139SCaroline Tice 
305ceb6b139SCaroline Tice   if (log)
306b9c1b51eSKate Stone     log->Printf(
307b9c1b51eSKate Stone         "SBDebugger(%p)::SetInputFileHandle (fh=%p, transfer_ownership=%i)",
308b9c1b51eSKate Stone         static_cast<void *>(m_opaque_sp.get()), static_cast<void *>(fh),
309b9c1b51eSKate Stone         transfer_ownership);
310ceb6b139SCaroline Tice 
311*d77c2e09SJonas Devlieghere   if (!m_opaque_sp)
312*d77c2e09SJonas Devlieghere     return;
313*d77c2e09SJonas Devlieghere 
314*d77c2e09SJonas Devlieghere   repro::DataRecorder *recorder = nullptr;
315*d77c2e09SJonas Devlieghere   if (repro::Generator *g = repro::Reproducer::Instance().GetGenerator())
316*d77c2e09SJonas Devlieghere     recorder = g->GetOrCreate<repro::CommandProvider>().GetNewDataRecorder();
317*d77c2e09SJonas Devlieghere 
318*d77c2e09SJonas Devlieghere   static std::unique_ptr<CommandLoader> loader = CommandLoader::Create();
319*d77c2e09SJonas Devlieghere   if (loader)
320*d77c2e09SJonas Devlieghere     fh = loader->GetNextFile();
321*d77c2e09SJonas Devlieghere 
322*d77c2e09SJonas Devlieghere   m_opaque_sp->SetInputFileHandle(fh, transfer_ownership, recorder);
32330fdc8d8SChris Lattner }
32430fdc8d8SChris Lattner 
325b9c1b51eSKate Stone void SBDebugger::SetOutputFileHandle(FILE *fh, bool transfer_ownership) {
3265160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
327ceb6b139SCaroline Tice 
328ceb6b139SCaroline Tice   if (log)
329b9c1b51eSKate Stone     log->Printf(
330b9c1b51eSKate Stone         "SBDebugger(%p)::SetOutputFileHandle (fh=%p, transfer_ownership=%i)",
331b9c1b51eSKate Stone         static_cast<void *>(m_opaque_sp.get()), static_cast<void *>(fh),
332b9c1b51eSKate Stone         transfer_ownership);
333ceb6b139SCaroline Tice 
3346611103cSGreg Clayton   if (m_opaque_sp)
3356611103cSGreg Clayton     m_opaque_sp->SetOutputFileHandle(fh, transfer_ownership);
33630fdc8d8SChris Lattner }
33730fdc8d8SChris Lattner 
338b9c1b51eSKate Stone void SBDebugger::SetErrorFileHandle(FILE *fh, bool transfer_ownership) {
3395160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
340ceb6b139SCaroline Tice 
341ceb6b139SCaroline Tice   if (log)
342b9c1b51eSKate Stone     log->Printf(
343b9c1b51eSKate Stone         "SBDebugger(%p)::SetErrorFileHandle (fh=%p, transfer_ownership=%i)",
344b9c1b51eSKate Stone         static_cast<void *>(m_opaque_sp.get()), static_cast<void *>(fh),
345b9c1b51eSKate Stone         transfer_ownership);
346ceb6b139SCaroline Tice 
3476611103cSGreg Clayton   if (m_opaque_sp)
3486611103cSGreg Clayton     m_opaque_sp->SetErrorFileHandle(fh, transfer_ownership);
34930fdc8d8SChris Lattner }
35030fdc8d8SChris Lattner 
351b9c1b51eSKate Stone FILE *SBDebugger::GetInputFileHandle() {
352b9c1b51eSKate Stone   if (m_opaque_sp) {
35344d93782SGreg Clayton     StreamFileSP stream_file_sp(m_opaque_sp->GetInputFile());
35444d93782SGreg Clayton     if (stream_file_sp)
35544d93782SGreg Clayton       return stream_file_sp->GetFile().GetStream();
35644d93782SGreg Clayton   }
357dbb0abbfSEugene Zelenko   return nullptr;
35830fdc8d8SChris Lattner }
35930fdc8d8SChris Lattner 
360b9c1b51eSKate Stone FILE *SBDebugger::GetOutputFileHandle() {
361b9c1b51eSKate Stone   if (m_opaque_sp) {
36244d93782SGreg Clayton     StreamFileSP stream_file_sp(m_opaque_sp->GetOutputFile());
36344d93782SGreg Clayton     if (stream_file_sp)
36444d93782SGreg Clayton       return stream_file_sp->GetFile().GetStream();
36544d93782SGreg Clayton   }
366dbb0abbfSEugene Zelenko   return nullptr;
36730fdc8d8SChris Lattner }
36830fdc8d8SChris Lattner 
369b9c1b51eSKate Stone FILE *SBDebugger::GetErrorFileHandle() {
370b9c1b51eSKate Stone   if (m_opaque_sp) {
37144d93782SGreg Clayton     StreamFileSP stream_file_sp(m_opaque_sp->GetErrorFile());
37244d93782SGreg Clayton     if (stream_file_sp)
37344d93782SGreg Clayton       return stream_file_sp->GetFile().GetStream();
37444d93782SGreg Clayton   }
375dbb0abbfSEugene Zelenko   return nullptr;
37630fdc8d8SChris Lattner }
37730fdc8d8SChris Lattner 
378b9c1b51eSKate Stone void SBDebugger::SaveInputTerminalState() {
379c5917d9aSJim Ingham   if (m_opaque_sp)
380c5917d9aSJim Ingham     m_opaque_sp->SaveInputTerminalState();
381c5917d9aSJim Ingham }
382c5917d9aSJim Ingham 
383b9c1b51eSKate Stone void SBDebugger::RestoreInputTerminalState() {
384c5917d9aSJim Ingham   if (m_opaque_sp)
385c5917d9aSJim Ingham     m_opaque_sp->RestoreInputTerminalState();
386c5917d9aSJim Ingham }
387b9c1b51eSKate Stone SBCommandInterpreter SBDebugger::GetCommandInterpreter() {
3885160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
389ceb6b139SCaroline Tice 
3906611103cSGreg Clayton   SBCommandInterpreter sb_interpreter;
3916611103cSGreg Clayton   if (m_opaque_sp)
3926611103cSGreg Clayton     sb_interpreter.reset(&m_opaque_sp->GetCommandInterpreter());
393ceb6b139SCaroline Tice 
394750cd175SCaroline Tice   if (log)
395b9c1b51eSKate Stone     log->Printf(
396b9c1b51eSKate Stone         "SBDebugger(%p)::GetCommandInterpreter () => SBCommandInterpreter(%p)",
397324a1036SSaleem Abdulrasool         static_cast<void *>(m_opaque_sp.get()),
398324a1036SSaleem Abdulrasool         static_cast<void *>(sb_interpreter.get()));
399750cd175SCaroline Tice 
40030fdc8d8SChris Lattner   return sb_interpreter;
40130fdc8d8SChris Lattner }
40230fdc8d8SChris Lattner 
403b9c1b51eSKate Stone void SBDebugger::HandleCommand(const char *command) {
404b9c1b51eSKate Stone   if (m_opaque_sp) {
405af67cecdSGreg Clayton     TargetSP target_sp(m_opaque_sp->GetSelectedTarget());
406bb19a13cSSaleem Abdulrasool     std::unique_lock<std::recursive_mutex> lock;
407af67cecdSGreg Clayton     if (target_sp)
408bb19a13cSSaleem Abdulrasool       lock = std::unique_lock<std::recursive_mutex>(target_sp->GetAPIMutex());
409af67cecdSGreg Clayton 
4106611103cSGreg Clayton     SBCommandInterpreter sb_interpreter(GetCommandInterpreter());
41130fdc8d8SChris Lattner     SBCommandReturnObject result;
41230fdc8d8SChris Lattner 
41330fdc8d8SChris Lattner     sb_interpreter.HandleCommand(command, result, false);
41430fdc8d8SChris Lattner 
415dbb0abbfSEugene Zelenko     if (GetErrorFileHandle() != nullptr)
41630fdc8d8SChris Lattner       result.PutError(GetErrorFileHandle());
417dbb0abbfSEugene Zelenko     if (GetOutputFileHandle() != nullptr)
41830fdc8d8SChris Lattner       result.PutOutput(GetOutputFileHandle());
41930fdc8d8SChris Lattner 
420b9c1b51eSKate Stone     if (!m_opaque_sp->GetAsyncExecution()) {
4216611103cSGreg Clayton       SBProcess process(GetCommandInterpreter().GetProcess());
422b9556accSGreg Clayton       ProcessSP process_sp(process.GetSP());
423b9c1b51eSKate Stone       if (process_sp) {
42430fdc8d8SChris Lattner         EventSP event_sp;
425583bbb1dSJim Ingham         ListenerSP lldb_listener_sp = m_opaque_sp->GetListener();
426d35031e1SPavel Labath         while (lldb_listener_sp->GetEventForBroadcaster(
427d35031e1SPavel Labath             process_sp.get(), event_sp, std::chrono::seconds(0))) {
42830fdc8d8SChris Lattner           SBEvent event(event_sp);
429b9c1b51eSKate Stone           HandleProcessEvent(process, event, GetOutputFileHandle(),
430b9c1b51eSKate Stone                              GetErrorFileHandle());
43130fdc8d8SChris Lattner         }
43230fdc8d8SChris Lattner       }
43330fdc8d8SChris Lattner     }
43430fdc8d8SChris Lattner   }
4356611103cSGreg Clayton }
43630fdc8d8SChris Lattner 
437b9c1b51eSKate Stone SBListener SBDebugger::GetListener() {
4385160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
439ceb6b139SCaroline Tice 
4406611103cSGreg Clayton   SBListener sb_listener;
4416611103cSGreg Clayton   if (m_opaque_sp)
442583bbb1dSJim Ingham     sb_listener.reset(m_opaque_sp->GetListener());
443ceb6b139SCaroline Tice 
444750cd175SCaroline Tice   if (log)
445324a1036SSaleem Abdulrasool     log->Printf("SBDebugger(%p)::GetListener () => SBListener(%p)",
446324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_sp.get()),
447324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_listener.get()));
448750cd175SCaroline Tice 
44930fdc8d8SChris Lattner   return sb_listener;
45030fdc8d8SChris Lattner }
45130fdc8d8SChris Lattner 
452b9c1b51eSKate Stone void SBDebugger::HandleProcessEvent(const SBProcess &process,
453b9c1b51eSKate Stone                                     const SBEvent &event, FILE *out,
454b9c1b51eSKate Stone                                     FILE *err) {
455af67cecdSGreg Clayton   if (!process.IsValid())
456af67cecdSGreg Clayton     return;
457af67cecdSGreg Clayton 
458b9556accSGreg Clayton   TargetSP target_sp(process.GetTarget().GetSP());
459b9556accSGreg Clayton   if (!target_sp)
460b9556accSGreg Clayton     return;
461b9556accSGreg Clayton 
46230fdc8d8SChris Lattner   const uint32_t event_type = event.GetType();
46330fdc8d8SChris Lattner   char stdio_buffer[1024];
46430fdc8d8SChris Lattner   size_t len;
46530fdc8d8SChris Lattner 
466bb19a13cSSaleem Abdulrasool   std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
467af67cecdSGreg Clayton 
468b9c1b51eSKate Stone   if (event_type &
469b9c1b51eSKate Stone       (Process::eBroadcastBitSTDOUT | Process::eBroadcastBitStateChanged)) {
470af67cecdSGreg Clayton     // Drain stdout when we stop just in case we have any bytes
47130fdc8d8SChris Lattner     while ((len = process.GetSTDOUT(stdio_buffer, sizeof(stdio_buffer))) > 0)
472dbb0abbfSEugene Zelenko       if (out != nullptr)
47330fdc8d8SChris Lattner         ::fwrite(stdio_buffer, 1, len, out);
47430fdc8d8SChris Lattner   }
475af67cecdSGreg Clayton 
476b9c1b51eSKate Stone   if (event_type &
477b9c1b51eSKate Stone       (Process::eBroadcastBitSTDERR | Process::eBroadcastBitStateChanged)) {
478af67cecdSGreg Clayton     // Drain stderr when we stop just in case we have any bytes
47930fdc8d8SChris Lattner     while ((len = process.GetSTDERR(stdio_buffer, sizeof(stdio_buffer))) > 0)
480dbb0abbfSEugene Zelenko       if (err != nullptr)
481af67cecdSGreg Clayton         ::fwrite(stdio_buffer, 1, len, err);
48230fdc8d8SChris Lattner   }
483af67cecdSGreg Clayton 
484b9c1b51eSKate Stone   if (event_type & Process::eBroadcastBitStateChanged) {
48530fdc8d8SChris Lattner     StateType event_state = SBProcess::GetStateFromEvent(event);
48630fdc8d8SChris Lattner 
48730fdc8d8SChris Lattner     if (event_state == eStateInvalid)
48830fdc8d8SChris Lattner       return;
48930fdc8d8SChris Lattner 
49030fdc8d8SChris Lattner     bool is_stopped = StateIsStoppedState(event_state);
49130fdc8d8SChris Lattner     if (!is_stopped)
4922976d00aSJim Ingham       process.ReportEventState(event, out);
49330fdc8d8SChris Lattner   }
49430fdc8d8SChris Lattner }
49530fdc8d8SChris Lattner 
496b9c1b51eSKate Stone SBSourceManager SBDebugger::GetSourceManager() {
497e37d605eSJim Ingham   SBSourceManager sb_source_manager(*this);
498e37d605eSJim Ingham   return sb_source_manager;
49930fdc8d8SChris Lattner }
50030fdc8d8SChris Lattner 
501b9c1b51eSKate Stone bool SBDebugger::GetDefaultArchitecture(char *arch_name, size_t arch_name_len) {
502b9c1b51eSKate Stone   if (arch_name && arch_name_len) {
503431ce678SGreg Clayton     ArchSpec default_arch = Target::GetDefaultArchitecture();
504daccaa9eSCaroline Tice 
505b9c1b51eSKate Stone     if (default_arch.IsValid()) {
506431ce678SGreg Clayton       const std::string &triple_str = default_arch.GetTriple().str();
507431ce678SGreg Clayton       if (!triple_str.empty())
508431ce678SGreg Clayton         ::snprintf(arch_name, arch_name_len, "%s", triple_str.c_str());
509431ce678SGreg Clayton       else
510b9c1b51eSKate Stone         ::snprintf(arch_name, arch_name_len, "%s",
511b9c1b51eSKate Stone                    default_arch.GetArchitectureName());
51230fdc8d8SChris Lattner       return true;
51330fdc8d8SChris Lattner     }
51430fdc8d8SChris Lattner   }
51530fdc8d8SChris Lattner   if (arch_name && arch_name_len)
51630fdc8d8SChris Lattner     arch_name[0] = '\0';
51730fdc8d8SChris Lattner   return false;
51830fdc8d8SChris Lattner }
51930fdc8d8SChris Lattner 
520b9c1b51eSKate Stone bool SBDebugger::SetDefaultArchitecture(const char *arch_name) {
521b9c1b51eSKate Stone   if (arch_name) {
52270512317SGreg Clayton     ArchSpec arch(arch_name);
523b9c1b51eSKate Stone     if (arch.IsValid()) {
524431ce678SGreg Clayton       Target::SetDefaultArchitecture(arch);
52530fdc8d8SChris Lattner       return true;
52630fdc8d8SChris Lattner     }
52730fdc8d8SChris Lattner   }
52830fdc8d8SChris Lattner   return false;
52930fdc8d8SChris Lattner }
53030fdc8d8SChris Lattner 
53130fdc8d8SChris Lattner ScriptLanguage
532b9c1b51eSKate Stone SBDebugger::GetScriptingLanguage(const char *script_language_name) {
5337b2e5a36SZachary Turner   if (!script_language_name) return eScriptLanguageDefault;
53447cbf4a0SPavel Labath   return OptionArgParser::ToScriptLanguage(
53547cbf4a0SPavel Labath       llvm::StringRef(script_language_name), eScriptLanguageDefault, nullptr);
53630fdc8d8SChris Lattner }
53730fdc8d8SChris Lattner 
538b9c1b51eSKate Stone const char *SBDebugger::GetVersionString() {
539b2f1fb29SVirgile Bello   return lldb_private::GetVersion();
54030fdc8d8SChris Lattner }
54130fdc8d8SChris Lattner 
542b9c1b51eSKate Stone const char *SBDebugger::StateAsCString(StateType state) {
543c2bbb49aSCaroline Tice   return lldb_private::StateAsCString(state);
54430fdc8d8SChris Lattner }
54530fdc8d8SChris Lattner 
546f1389e92SPavel Labath static void AddBoolConfigEntry(StructuredData::Dictionary &dict,
547f1389e92SPavel Labath                                llvm::StringRef name, bool value,
548f1389e92SPavel Labath                                llvm::StringRef description) {
549f1389e92SPavel Labath   auto entry_up = llvm::make_unique<StructuredData::Dictionary>();
550f1389e92SPavel Labath   entry_up->AddBooleanItem("value", value);
551f1389e92SPavel Labath   entry_up->AddStringItem("description", description);
552f1389e92SPavel Labath   dict.AddItem(name, std::move(entry_up));
553f1389e92SPavel Labath }
554f1389e92SPavel Labath 
555abc0c6adSPavel Labath static void AddLLVMTargets(StructuredData::Dictionary &dict) {
556abc0c6adSPavel Labath   auto array_up = llvm::make_unique<StructuredData::Array>();
557abc0c6adSPavel Labath #define LLVM_TARGET(target)                                                    \
558abc0c6adSPavel Labath   array_up->AddItem(llvm::make_unique<StructuredData::String>(#target));
559abc0c6adSPavel Labath #include "llvm/Config/Targets.def"
560abc0c6adSPavel Labath   auto entry_up = llvm::make_unique<StructuredData::Dictionary>();
561abc0c6adSPavel Labath   entry_up->AddItem("value", std::move(array_up));
562abc0c6adSPavel Labath   entry_up->AddStringItem("description", "A list of configured LLVM targets.");
563abc0c6adSPavel Labath   dict.AddItem("targets", std::move(entry_up));
564abc0c6adSPavel Labath }
565abc0c6adSPavel Labath 
566f1389e92SPavel Labath SBStructuredData SBDebugger::GetBuildConfiguration() {
567f1389e92SPavel Labath   auto config_up = llvm::make_unique<StructuredData::Dictionary>();
568f1389e92SPavel Labath   AddBoolConfigEntry(
569f1389e92SPavel Labath       *config_up, "xml", XMLDocument::XMLEnabled(),
570f1389e92SPavel Labath       "A boolean value that indicates if XML support is enabled in LLDB");
571abc0c6adSPavel Labath   AddLLVMTargets(*config_up);
572f1389e92SPavel Labath 
573f1389e92SPavel Labath   SBStructuredData data;
574f1389e92SPavel Labath   data.m_impl_up->SetObjectSP(std::move(config_up));
575f1389e92SPavel Labath   return data;
576f1389e92SPavel Labath }
577f1389e92SPavel Labath 
578b9c1b51eSKate Stone bool SBDebugger::StateIsRunningState(StateType state) {
5795160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
5804838131bSGreg Clayton 
581c2bbb49aSCaroline Tice   const bool result = lldb_private::StateIsRunningState(state);
5824838131bSGreg Clayton   if (log)
5834838131bSGreg Clayton     log->Printf("SBDebugger::StateIsRunningState (state=%s) => %i",
584431ce678SGreg Clayton                 StateAsCString(state), result);
5854838131bSGreg Clayton 
5864838131bSGreg Clayton   return result;
58730fdc8d8SChris Lattner }
58830fdc8d8SChris Lattner 
589b9c1b51eSKate Stone bool SBDebugger::StateIsStoppedState(StateType state) {
5905160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
591ceb6b139SCaroline Tice 
5922637f825SGreg Clayton   const bool result = lldb_private::StateIsStoppedState(state, false);
593ceb6b139SCaroline Tice   if (log)
5944838131bSGreg Clayton     log->Printf("SBDebugger::StateIsStoppedState (state=%s) => %i",
595431ce678SGreg Clayton                 StateAsCString(state), result);
596ceb6b139SCaroline Tice 
5974838131bSGreg Clayton   return result;
59830fdc8d8SChris Lattner }
59930fdc8d8SChris Lattner 
600b9c1b51eSKate Stone lldb::SBTarget SBDebugger::CreateTarget(const char *filename,
601cac9c5f9SGreg Clayton                                         const char *target_triple,
602cac9c5f9SGreg Clayton                                         const char *platform_name,
603cac9c5f9SGreg Clayton                                         bool add_dependent_modules,
604b9c1b51eSKate Stone                                         lldb::SBError &sb_error) {
605cac9c5f9SGreg Clayton   SBTarget sb_target;
606b9556accSGreg Clayton   TargetSP target_sp;
607b9c1b51eSKate Stone   if (m_opaque_sp) {
608cac9c5f9SGreg Clayton     sb_error.Clear();
609cac9c5f9SGreg Clayton     OptionGroupPlatform platform_options(false);
610cac9c5f9SGreg Clayton     platform_options.SetPlatformName(platform_name);
611cac9c5f9SGreg Clayton 
612b9c1b51eSKate Stone     sb_error.ref() = m_opaque_sp->GetTargetList().CreateTarget(
613f9a07e9fSJonas Devlieghere         *m_opaque_sp, filename, target_triple,
614f9a07e9fSJonas Devlieghere         add_dependent_modules ? eLoadDependentsYes : eLoadDependentsNo,
615b9c1b51eSKate Stone         &platform_options, target_sp);
616cac9c5f9SGreg Clayton 
617cac9c5f9SGreg Clayton     if (sb_error.Success())
618b9556accSGreg Clayton       sb_target.SetSP(target_sp);
619b9c1b51eSKate Stone   } else {
6209f521f22SJim Ingham     sb_error.SetErrorString("invalid debugger");
621cac9c5f9SGreg Clayton   }
622cac9c5f9SGreg Clayton 
6235160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
624cac9c5f9SGreg Clayton   if (log)
625b9c1b51eSKate Stone     log->Printf("SBDebugger(%p)::CreateTarget (filename=\"%s\", triple=%s, "
626b9c1b51eSKate Stone                 "platform_name=%s, add_dependent_modules=%u, error=%s) => "
627b9c1b51eSKate Stone                 "SBTarget(%p)",
628b9c1b51eSKate Stone                 static_cast<void *>(m_opaque_sp.get()), filename, target_triple,
629b9c1b51eSKate Stone                 platform_name, add_dependent_modules, sb_error.GetCString(),
630b9c1b51eSKate Stone                 static_cast<void *>(target_sp.get()));
631cac9c5f9SGreg Clayton 
632cac9c5f9SGreg Clayton   return sb_target;
633cac9c5f9SGreg Clayton }
63430fdc8d8SChris Lattner 
63530fdc8d8SChris Lattner SBTarget
63630fdc8d8SChris Lattner SBDebugger::CreateTargetWithFileAndTargetTriple(const char *filename,
637b9c1b51eSKate Stone                                                 const char *target_triple) {
638b9556accSGreg Clayton   SBTarget sb_target;
639b9556accSGreg Clayton   TargetSP target_sp;
640b9c1b51eSKate Stone   if (m_opaque_sp) {
641cac9c5f9SGreg Clayton     const bool add_dependent_modules = true;
64297206d57SZachary Turner     Status error(m_opaque_sp->GetTargetList().CreateTarget(
643f9a07e9fSJonas Devlieghere         *m_opaque_sp, filename, target_triple,
644f9a07e9fSJonas Devlieghere         add_dependent_modules ? eLoadDependentsYes : eLoadDependentsNo, nullptr,
645cac9c5f9SGreg Clayton         target_sp));
646b9556accSGreg Clayton     sb_target.SetSP(target_sp);
6476611103cSGreg Clayton   }
6484838131bSGreg Clayton 
6495160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
6504838131bSGreg Clayton   if (log)
651b9c1b51eSKate Stone     log->Printf("SBDebugger(%p)::CreateTargetWithFileAndTargetTriple "
652b9c1b51eSKate Stone                 "(filename=\"%s\", triple=%s) => SBTarget(%p)",
653b9c1b51eSKate Stone                 static_cast<void *>(m_opaque_sp.get()), filename, target_triple,
654b9c1b51eSKate Stone                 static_cast<void *>(target_sp.get()));
6554838131bSGreg Clayton 
656b9556accSGreg Clayton   return sb_target;
65730fdc8d8SChris Lattner }
65830fdc8d8SChris Lattner 
659b9c1b51eSKate Stone SBTarget SBDebugger::CreateTargetWithFileAndArch(const char *filename,
660b9c1b51eSKate Stone                                                  const char *arch_cstr) {
6615160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
662ceb6b139SCaroline Tice 
663b9556accSGreg Clayton   SBTarget sb_target;
664b9556accSGreg Clayton   TargetSP target_sp;
665b9c1b51eSKate Stone   if (m_opaque_sp) {
66697206d57SZachary Turner     Status error;
667cac9c5f9SGreg Clayton     const bool add_dependent_modules = true;
66830fdc8d8SChris Lattner 
669b9c1b51eSKate Stone     error = m_opaque_sp->GetTargetList().CreateTarget(
670f9a07e9fSJonas Devlieghere         *m_opaque_sp, filename, arch_cstr,
671f9a07e9fSJonas Devlieghere         add_dependent_modules ? eLoadDependentsYes : eLoadDependentsNo, nullptr,
672cac9c5f9SGreg Clayton         target_sp);
67330fdc8d8SChris Lattner 
674b9c1b51eSKate Stone     if (error.Success()) {
6752976d00aSJim Ingham       m_opaque_sp->GetTargetList().SetSelectedTarget(target_sp.get());
676b9556accSGreg Clayton       sb_target.SetSP(target_sp);
6776611103cSGreg Clayton     }
6786611103cSGreg Clayton   }
679ceb6b139SCaroline Tice 
680ceb6b139SCaroline Tice   if (log)
681b9c1b51eSKate Stone     log->Printf("SBDebugger(%p)::CreateTargetWithFileAndArch (filename=\"%s\", "
682b9c1b51eSKate Stone                 "arch=%s) => SBTarget(%p)",
683324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_sp.get()), filename, arch_cstr,
684324a1036SSaleem Abdulrasool                 static_cast<void *>(target_sp.get()));
685ceb6b139SCaroline Tice 
686b9556accSGreg Clayton   return sb_target;
68730fdc8d8SChris Lattner }
68830fdc8d8SChris Lattner 
689b9c1b51eSKate Stone SBTarget SBDebugger::CreateTarget(const char *filename) {
690b9556accSGreg Clayton   SBTarget sb_target;
691b9556accSGreg Clayton   TargetSP target_sp;
692b9c1b51eSKate Stone   if (m_opaque_sp) {
69397206d57SZachary Turner     Status error;
694cac9c5f9SGreg Clayton     const bool add_dependent_modules = true;
695b9c1b51eSKate Stone     error = m_opaque_sp->GetTargetList().CreateTarget(
696f9a07e9fSJonas Devlieghere         *m_opaque_sp, filename, "",
697f9a07e9fSJonas Devlieghere         add_dependent_modules ? eLoadDependentsYes : eLoadDependentsNo, nullptr,
698f9a07e9fSJonas Devlieghere         target_sp);
69930fdc8d8SChris Lattner 
700b9c1b51eSKate Stone     if (error.Success()) {
7012976d00aSJim Ingham       m_opaque_sp->GetTargetList().SetSelectedTarget(target_sp.get());
702b9556accSGreg Clayton       sb_target.SetSP(target_sp);
7036611103cSGreg Clayton     }
7046611103cSGreg Clayton   }
7055160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
7064838131bSGreg Clayton   if (log)
707b9c1b51eSKate Stone     log->Printf(
708b9c1b51eSKate Stone         "SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)",
709324a1036SSaleem Abdulrasool         static_cast<void *>(m_opaque_sp.get()), filename,
710324a1036SSaleem Abdulrasool         static_cast<void *>(target_sp.get()));
711b9556accSGreg Clayton   return sb_target;
71230fdc8d8SChris Lattner }
71330fdc8d8SChris Lattner 
714b842f2ecSJim Ingham SBTarget SBDebugger::GetDummyTarget() {
715b842f2ecSJim Ingham   SBTarget sb_target;
716b842f2ecSJim Ingham   if (m_opaque_sp) {
717b842f2ecSJim Ingham       sb_target.SetSP(m_opaque_sp->GetDummyTarget()->shared_from_this());
718b842f2ecSJim Ingham   }
719b842f2ecSJim Ingham   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
720b842f2ecSJim Ingham   if (log)
721b842f2ecSJim Ingham     log->Printf(
722b842f2ecSJim Ingham         "SBDebugger(%p)::GetDummyTarget() => SBTarget(%p)",
723b842f2ecSJim Ingham         static_cast<void *>(m_opaque_sp.get()),
724b842f2ecSJim Ingham         static_cast<void *>(sb_target.GetSP().get()));
725b842f2ecSJim Ingham   return sb_target;
726b842f2ecSJim Ingham }
727b842f2ecSJim Ingham 
728b9c1b51eSKate Stone bool SBDebugger::DeleteTarget(lldb::SBTarget &target) {
7293794ad95SJohnny Chen   bool result = false;
730b9c1b51eSKate Stone   if (m_opaque_sp) {
731b9556accSGreg Clayton     TargetSP target_sp(target.GetSP());
732b9c1b51eSKate Stone     if (target_sp) {
7333794ad95SJohnny Chen       // No need to lock, the target list is thread safe
734b9556accSGreg Clayton       result = m_opaque_sp->GetTargetList().DeleteTarget(target_sp);
735b9556accSGreg Clayton       target_sp->Destroy();
73675340622SGreg Clayton       target.Clear();
7370cd70866SGreg Clayton       const bool mandatory = true;
7380cd70866SGreg Clayton       ModuleList::RemoveOrphanSharedModules(mandatory);
7393794ad95SJohnny Chen     }
740b9556accSGreg Clayton   }
7413794ad95SJohnny Chen 
7425160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
7433794ad95SJohnny Chen   if (log)
744324a1036SSaleem Abdulrasool     log->Printf("SBDebugger(%p)::DeleteTarget (SBTarget(%p)) => %i",
745324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_sp.get()),
746324a1036SSaleem Abdulrasool                 static_cast<void *>(target.m_opaque_sp.get()), result);
7473794ad95SJohnny Chen 
7483794ad95SJohnny Chen   return result;
7493794ad95SJohnny Chen }
750dbb0abbfSEugene Zelenko 
751b9c1b51eSKate Stone SBTarget SBDebugger::GetTargetAtIndex(uint32_t idx) {
7526611103cSGreg Clayton   SBTarget sb_target;
753b9c1b51eSKate Stone   if (m_opaque_sp) {
754af67cecdSGreg Clayton     // No need to lock, the target list is thread safe
755b9556accSGreg Clayton     sb_target.SetSP(m_opaque_sp->GetTargetList().GetTargetAtIndex(idx));
756af67cecdSGreg Clayton   }
75730fdc8d8SChris Lattner   return sb_target;
75830fdc8d8SChris Lattner }
75930fdc8d8SChris Lattner 
760b9c1b51eSKate Stone uint32_t SBDebugger::GetIndexOfTarget(lldb::SBTarget target) {
7618499e1a4SJim Ingham 
7628499e1a4SJim Ingham   lldb::TargetSP target_sp = target.GetSP();
7638499e1a4SJim Ingham   if (!target_sp)
7648499e1a4SJim Ingham     return UINT32_MAX;
7658499e1a4SJim Ingham 
7668499e1a4SJim Ingham   if (!m_opaque_sp)
7678499e1a4SJim Ingham     return UINT32_MAX;
7688499e1a4SJim Ingham 
7698499e1a4SJim Ingham   return m_opaque_sp->GetTargetList().GetIndexOfTarget(target.GetSP());
7708499e1a4SJim Ingham }
7718499e1a4SJim Ingham 
772b9c1b51eSKate Stone SBTarget SBDebugger::FindTargetWithProcessID(lldb::pid_t pid) {
7736611103cSGreg Clayton   SBTarget sb_target;
774b9c1b51eSKate Stone   if (m_opaque_sp) {
775af67cecdSGreg Clayton     // No need to lock, the target list is thread safe
776b9556accSGreg Clayton     sb_target.SetSP(m_opaque_sp->GetTargetList().FindTargetWithProcessID(pid));
777af67cecdSGreg Clayton   }
77830fdc8d8SChris Lattner   return sb_target;
77930fdc8d8SChris Lattner }
78030fdc8d8SChris Lattner 
781b9c1b51eSKate Stone SBTarget SBDebugger::FindTargetWithFileAndArch(const char *filename,
782b9c1b51eSKate Stone                                                const char *arch_name) {
7836611103cSGreg Clayton   SBTarget sb_target;
784b9c1b51eSKate Stone   if (m_opaque_sp && filename && filename[0]) {
785af67cecdSGreg Clayton     // No need to lock, the target list is thread safe
7867263f1bdSPavel Labath     ArchSpec arch = Platform::GetAugmentedArchSpec(
7877263f1bdSPavel Labath         m_opaque_sp->GetPlatformList().GetSelectedPlatform().get(), arch_name);
788b9c1b51eSKate Stone     TargetSP target_sp(
789b9c1b51eSKate Stone         m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture(
7908f3be7a3SJonas Devlieghere             FileSpec(filename), arch_name ? &arch : nullptr));
791b9556accSGreg Clayton     sb_target.SetSP(target_sp);
7926611103cSGreg Clayton   }
7936611103cSGreg Clayton   return sb_target;
79430fdc8d8SChris Lattner }
79530fdc8d8SChris Lattner 
796b9c1b51eSKate Stone SBTarget SBDebugger::FindTargetWithLLDBProcess(const ProcessSP &process_sp) {
7976611103cSGreg Clayton   SBTarget sb_target;
798b9c1b51eSKate Stone   if (m_opaque_sp) {
799af67cecdSGreg Clayton     // No need to lock, the target list is thread safe
800b9c1b51eSKate Stone     sb_target.SetSP(
801b9c1b51eSKate Stone         m_opaque_sp->GetTargetList().FindTargetWithProcess(process_sp.get()));
802af67cecdSGreg Clayton   }
80330fdc8d8SChris Lattner   return sb_target;
80430fdc8d8SChris Lattner }
80530fdc8d8SChris Lattner 
806b9c1b51eSKate Stone uint32_t SBDebugger::GetNumTargets() {
807b9c1b51eSKate Stone   if (m_opaque_sp) {
808af67cecdSGreg Clayton     // No need to lock, the target list is thread safe
8096611103cSGreg Clayton     return m_opaque_sp->GetTargetList().GetNumTargets();
810af67cecdSGreg Clayton   }
8116611103cSGreg Clayton   return 0;
8126611103cSGreg Clayton }
81330fdc8d8SChris Lattner 
814b9c1b51eSKate Stone SBTarget SBDebugger::GetSelectedTarget() {
8155160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
816ceb6b139SCaroline Tice 
8176611103cSGreg Clayton   SBTarget sb_target;
818b9556accSGreg Clayton   TargetSP target_sp;
819b9c1b51eSKate Stone   if (m_opaque_sp) {
820af67cecdSGreg Clayton     // No need to lock, the target list is thread safe
821b9556accSGreg Clayton     target_sp = m_opaque_sp->GetTargetList().GetSelectedTarget();
822b9556accSGreg Clayton     sb_target.SetSP(target_sp);
823af67cecdSGreg Clayton   }
824ceb6b139SCaroline Tice 
825b9c1b51eSKate Stone   if (log) {
826ceb6b139SCaroline Tice     SBStream sstr;
827431ce678SGreg Clayton     sb_target.GetDescription(sstr, eDescriptionLevelBrief);
828324a1036SSaleem Abdulrasool     log->Printf("SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s",
829324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_sp.get()),
830324a1036SSaleem Abdulrasool                 static_cast<void *>(target_sp.get()), sstr.GetData());
831ceb6b139SCaroline Tice   }
832ceb6b139SCaroline Tice 
83330fdc8d8SChris Lattner   return sb_target;
83430fdc8d8SChris Lattner }
83530fdc8d8SChris Lattner 
836b9c1b51eSKate Stone void SBDebugger::SetSelectedTarget(SBTarget &sb_target) {
8375160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
838e64f0dc7SJim Ingham 
839b9556accSGreg Clayton   TargetSP target_sp(sb_target.GetSP());
840b9c1b51eSKate Stone   if (m_opaque_sp) {
841b9556accSGreg Clayton     m_opaque_sp->GetTargetList().SetSelectedTarget(target_sp.get());
842e64f0dc7SJim Ingham   }
843b9c1b51eSKate Stone   if (log) {
844e64f0dc7SJim Ingham     SBStream sstr;
845e64f0dc7SJim Ingham     sb_target.GetDescription(sstr, eDescriptionLevelBrief);
846324a1036SSaleem Abdulrasool     log->Printf("SBDebugger(%p)::SetSelectedTarget () => SBTarget(%p): %s",
847324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_sp.get()),
848324a1036SSaleem Abdulrasool                 static_cast<void *>(target_sp.get()), sstr.GetData());
849e64f0dc7SJim Ingham   }
850e64f0dc7SJim Ingham }
851e64f0dc7SJim Ingham 
852b9c1b51eSKate Stone SBPlatform SBDebugger::GetSelectedPlatform() {
853fbb76349SGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
854fbb76349SGreg Clayton 
855fbb76349SGreg Clayton   SBPlatform sb_platform;
856fbb76349SGreg Clayton   DebuggerSP debugger_sp(m_opaque_sp);
857b9c1b51eSKate Stone   if (debugger_sp) {
858fbb76349SGreg Clayton     sb_platform.SetSP(debugger_sp->GetPlatformList().GetSelectedPlatform());
859fbb76349SGreg Clayton   }
860fbb76349SGreg Clayton   if (log)
861324a1036SSaleem Abdulrasool     log->Printf("SBDebugger(%p)::GetSelectedPlatform () => SBPlatform(%p): %s",
862324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_sp.get()),
863324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_platform.GetSP().get()),
864324a1036SSaleem Abdulrasool                 sb_platform.GetName());
865fbb76349SGreg Clayton   return sb_platform;
866fbb76349SGreg Clayton }
867fbb76349SGreg Clayton 
868b9c1b51eSKate Stone void SBDebugger::SetSelectedPlatform(SBPlatform &sb_platform) {
869fbb76349SGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
870fbb76349SGreg Clayton 
871fbb76349SGreg Clayton   DebuggerSP debugger_sp(m_opaque_sp);
872b9c1b51eSKate Stone   if (debugger_sp) {
873fbb76349SGreg Clayton     debugger_sp->GetPlatformList().SetSelectedPlatform(sb_platform.GetSP());
874fbb76349SGreg Clayton   }
875324a1036SSaleem Abdulrasool 
876fbb76349SGreg Clayton   if (log)
877324a1036SSaleem Abdulrasool     log->Printf("SBDebugger(%p)::SetSelectedPlatform (SBPlatform(%p) %s)",
878324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_sp.get()),
879324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_platform.GetSP().get()),
880324a1036SSaleem Abdulrasool                 sb_platform.GetName());
881fbb76349SGreg Clayton }
882fbb76349SGreg Clayton 
883c10e34d0SVadim Macagon uint32_t SBDebugger::GetNumPlatforms() {
884c10e34d0SVadim Macagon   if (m_opaque_sp) {
885c10e34d0SVadim Macagon     // No need to lock, the platform list is thread safe
886c10e34d0SVadim Macagon     return m_opaque_sp->GetPlatformList().GetSize();
887c10e34d0SVadim Macagon   }
888c10e34d0SVadim Macagon   return 0;
889c10e34d0SVadim Macagon }
890c10e34d0SVadim Macagon 
891c10e34d0SVadim Macagon SBPlatform SBDebugger::GetPlatformAtIndex(uint32_t idx) {
892c10e34d0SVadim Macagon   SBPlatform sb_platform;
893c10e34d0SVadim Macagon   if (m_opaque_sp) {
894c10e34d0SVadim Macagon     // No need to lock, the platform list is thread safe
895c10e34d0SVadim Macagon     sb_platform.SetSP(m_opaque_sp->GetPlatformList().GetAtIndex(idx));
896c10e34d0SVadim Macagon   }
897c10e34d0SVadim Macagon   return sb_platform;
898c10e34d0SVadim Macagon }
899c10e34d0SVadim Macagon 
900c10e34d0SVadim Macagon uint32_t SBDebugger::GetNumAvailablePlatforms() {
901c10e34d0SVadim Macagon   uint32_t idx = 0;
902c10e34d0SVadim Macagon   while (true) {
903c10e34d0SVadim Macagon     if (!PluginManager::GetPlatformPluginNameAtIndex(idx)) {
904c10e34d0SVadim Macagon       break;
905c10e34d0SVadim Macagon     }
906c10e34d0SVadim Macagon     ++idx;
907c10e34d0SVadim Macagon   }
908c10e34d0SVadim Macagon   // +1 for the host platform, which should always appear first in the list.
909c10e34d0SVadim Macagon   return idx + 1;
910c10e34d0SVadim Macagon }
911c10e34d0SVadim Macagon 
912c10e34d0SVadim Macagon SBStructuredData SBDebugger::GetAvailablePlatformInfoAtIndex(uint32_t idx) {
913c10e34d0SVadim Macagon   SBStructuredData data;
914c10e34d0SVadim Macagon   auto platform_dict = llvm::make_unique<StructuredData::Dictionary>();
915c10e34d0SVadim Macagon   llvm::StringRef name_str("name"), desc_str("description");
916c10e34d0SVadim Macagon 
917c10e34d0SVadim Macagon   if (idx == 0) {
918c10e34d0SVadim Macagon     PlatformSP host_platform_sp(Platform::GetHostPlatform());
919c10e34d0SVadim Macagon     platform_dict->AddStringItem(
920c10e34d0SVadim Macagon         name_str, host_platform_sp->GetPluginName().GetStringRef());
921c10e34d0SVadim Macagon     platform_dict->AddStringItem(
922c10e34d0SVadim Macagon         desc_str, llvm::StringRef(host_platform_sp->GetDescription()));
923c10e34d0SVadim Macagon   } else if (idx > 0) {
924c10e34d0SVadim Macagon     const char *plugin_name =
925c10e34d0SVadim Macagon         PluginManager::GetPlatformPluginNameAtIndex(idx - 1);
926c10e34d0SVadim Macagon     if (!plugin_name) {
927c10e34d0SVadim Macagon       return data;
928c10e34d0SVadim Macagon     }
929c10e34d0SVadim Macagon     platform_dict->AddStringItem(name_str, llvm::StringRef(plugin_name));
930c10e34d0SVadim Macagon 
931c10e34d0SVadim Macagon     const char *plugin_desc =
932c10e34d0SVadim Macagon         PluginManager::GetPlatformPluginDescriptionAtIndex(idx - 1);
933c10e34d0SVadim Macagon     if (!plugin_desc) {
934c10e34d0SVadim Macagon       return data;
935c10e34d0SVadim Macagon     }
936c10e34d0SVadim Macagon     platform_dict->AddStringItem(desc_str, llvm::StringRef(plugin_desc));
937c10e34d0SVadim Macagon   }
938c10e34d0SVadim Macagon 
939c10e34d0SVadim Macagon   data.m_impl_up->SetObjectSP(
940c10e34d0SVadim Macagon       StructuredData::ObjectSP(platform_dict.release()));
941c10e34d0SVadim Macagon   return data;
942c10e34d0SVadim Macagon }
943c10e34d0SVadim Macagon 
944b9c1b51eSKate Stone void SBDebugger::DispatchInput(void *baton, const void *data, size_t data_len) {
9456b09d423SEnrico Granata   DispatchInput(data, data_len);
9466b09d423SEnrico Granata }
9476b09d423SEnrico Granata 
948b9c1b51eSKate Stone void SBDebugger::DispatchInput(const void *data, size_t data_len) {
94944d93782SGreg Clayton   //    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
95044d93782SGreg Clayton   //
95144d93782SGreg Clayton   //    if (log)
952b9c1b51eSKate Stone   //        log->Printf ("SBDebugger(%p)::DispatchInput (data=\"%.*s\",
953b9c1b51eSKate Stone   //        size_t=%" PRIu64 ")",
95444d93782SGreg Clayton   //                     m_opaque_sp.get(),
95544d93782SGreg Clayton   //                     (int) data_len,
95644d93782SGreg Clayton   //                     (const char *) data,
95744d93782SGreg Clayton   //                     (uint64_t)data_len);
95844d93782SGreg Clayton   //
95944d93782SGreg Clayton   //    if (m_opaque_sp)
96044d93782SGreg Clayton   //        m_opaque_sp->DispatchInput ((const char *) data, data_len);
96130fdc8d8SChris Lattner }
96230fdc8d8SChris Lattner 
963b9c1b51eSKate Stone void SBDebugger::DispatchInputInterrupt() {
964efed6131SCaroline Tice   if (m_opaque_sp)
965efed6131SCaroline Tice     m_opaque_sp->DispatchInputInterrupt();
966efed6131SCaroline Tice }
967efed6131SCaroline Tice 
968b9c1b51eSKate Stone void SBDebugger::DispatchInputEndOfFile() {
969efed6131SCaroline Tice   if (m_opaque_sp)
970efed6131SCaroline Tice     m_opaque_sp->DispatchInputEndOfFile();
971efed6131SCaroline Tice }
9729088b068SCaroline Tice 
973b9c1b51eSKate Stone void SBDebugger::PushInputReader(SBInputReader &reader) {}
9746611103cSGreg Clayton 
975b9c1b51eSKate Stone void SBDebugger::RunCommandInterpreter(bool auto_handle_events,
976b9c1b51eSKate Stone                                        bool spawn_thread) {
977b9c1b51eSKate Stone   if (m_opaque_sp) {
97826c7bf93SJim Ingham     CommandInterpreterRunOptions options;
97926c7bf93SJim Ingham 
980b9c1b51eSKate Stone     m_opaque_sp->GetCommandInterpreter().RunCommandInterpreter(
981b9c1b51eSKate Stone         auto_handle_events, spawn_thread, options);
98226c7bf93SJim Ingham   }
98326c7bf93SJim Ingham }
98426c7bf93SJim Ingham 
985b9c1b51eSKate Stone void SBDebugger::RunCommandInterpreter(bool auto_handle_events,
98626c7bf93SJim Ingham                                        bool spawn_thread,
98726c7bf93SJim Ingham                                        SBCommandInterpreterRunOptions &options,
988b9c1b51eSKate Stone                                        int &num_errors, bool &quit_requested,
989ffc9f1deSJim Ingham                                        bool &stopped_for_crash)
99026c7bf93SJim Ingham 
99126c7bf93SJim Ingham {
992b9c1b51eSKate Stone   if (m_opaque_sp) {
99326c7bf93SJim Ingham     CommandInterpreter &interp = m_opaque_sp->GetCommandInterpreter();
994b9c1b51eSKate Stone     interp.RunCommandInterpreter(auto_handle_events, spawn_thread,
995b9c1b51eSKate Stone                                  options.ref());
99626c7bf93SJim Ingham     num_errors = interp.GetNumErrors();
99726c7bf93SJim Ingham     quit_requested = interp.GetQuitRequested();
998ffc9f1deSJim Ingham     stopped_for_crash = interp.GetStoppedForCrash();
99926c7bf93SJim Ingham   }
1000969ed3d1SCaroline Tice }
1001969ed3d1SCaroline Tice 
1002b9c1b51eSKate Stone SBError SBDebugger::RunREPL(lldb::LanguageType language,
1003b9c1b51eSKate Stone                             const char *repl_options) {
10043e7e915dSSean Callanan   SBError error;
10053e7e915dSSean Callanan   if (m_opaque_sp)
10063e7e915dSSean Callanan     error.ref() = m_opaque_sp->RunREPL(language, repl_options);
10073e7e915dSSean Callanan   else
10083e7e915dSSean Callanan     error.SetErrorString("invalid debugger");
10093e7e915dSSean Callanan   return error;
10103e7e915dSSean Callanan }
10113e7e915dSSean Callanan 
1012b9c1b51eSKate Stone void SBDebugger::reset(const DebuggerSP &debugger_sp) {
10136611103cSGreg Clayton   m_opaque_sp = debugger_sp;
10146611103cSGreg Clayton }
10156611103cSGreg Clayton 
1016b9c1b51eSKate Stone Debugger *SBDebugger::get() const { return m_opaque_sp.get(); }
10176611103cSGreg Clayton 
1018b9c1b51eSKate Stone Debugger &SBDebugger::ref() const {
10196611103cSGreg Clayton   assert(m_opaque_sp.get());
10206611103cSGreg Clayton   return *m_opaque_sp;
10216611103cSGreg Clayton }
10226611103cSGreg Clayton 
1023b9c1b51eSKate Stone const lldb::DebuggerSP &SBDebugger::get_sp() const { return m_opaque_sp; }
10246611103cSGreg Clayton 
1025b9c1b51eSKate Stone SBDebugger SBDebugger::FindDebuggerWithID(int id) {
1026af67cecdSGreg Clayton   // No need to lock, the debugger list is thread safe
1027ebc1bb27SCaroline Tice   SBDebugger sb_debugger;
1028431ce678SGreg Clayton   DebuggerSP debugger_sp = Debugger::FindDebuggerWithID(id);
1029ebc1bb27SCaroline Tice   if (debugger_sp)
1030ebc1bb27SCaroline Tice     sb_debugger.reset(debugger_sp);
1031ebc1bb27SCaroline Tice   return sb_debugger;
1032ebc1bb27SCaroline Tice }
1033e40e4218SJim Ingham 
1034b9c1b51eSKate Stone const char *SBDebugger::GetInstanceName() {
1035dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetInstanceName().AsCString() : nullptr);
1036dd759857SCaroline Tice }
1037dd759857SCaroline Tice 
1038b9c1b51eSKate Stone SBError SBDebugger::SetInternalVariable(const char *var_name, const char *value,
1039b9c1b51eSKate Stone                                         const char *debugger_instance_name) {
10406920b52bSGreg Clayton   SBError sb_error;
1041b9c1b51eSKate Stone   DebuggerSP debugger_sp(Debugger::FindDebuggerWithInstanceName(
1042b9c1b51eSKate Stone       ConstString(debugger_instance_name)));
104397206d57SZachary Turner   Status error;
1044b9c1b51eSKate Stone   if (debugger_sp) {
1045b9c1b51eSKate Stone     ExecutionContext exe_ctx(
1046b9c1b51eSKate Stone         debugger_sp->GetCommandInterpreter().GetExecutionContext());
1047b9c1b51eSKate Stone     error = debugger_sp->SetPropertyValue(&exe_ctx, eVarSetOperationAssign,
1048b9c1b51eSKate Stone                                           var_name, value);
1049b9c1b51eSKate Stone   } else {
1050b9c1b51eSKate Stone     error.SetErrorStringWithFormat("invalid debugger instance name '%s'",
1051b9c1b51eSKate Stone                                    debugger_instance_name);
10526920b52bSGreg Clayton   }
10536920b52bSGreg Clayton   if (error.Fail())
10546920b52bSGreg Clayton     sb_error.SetError(error);
10556920b52bSGreg Clayton   return sb_error;
10563df9a8dfSCaroline Tice }
10573df9a8dfSCaroline Tice 
1058431ce678SGreg Clayton SBStringList
1059b9c1b51eSKate Stone SBDebugger::GetInternalVariableValue(const char *var_name,
1060b9c1b51eSKate Stone                                      const char *debugger_instance_name) {
10613df9a8dfSCaroline Tice   SBStringList ret_value;
1062b9c1b51eSKate Stone   DebuggerSP debugger_sp(Debugger::FindDebuggerWithInstanceName(
1063b9c1b51eSKate Stone       ConstString(debugger_instance_name)));
106497206d57SZachary Turner   Status error;
1065b9c1b51eSKate Stone   if (debugger_sp) {
1066b9c1b51eSKate Stone     ExecutionContext exe_ctx(
1067b9c1b51eSKate Stone         debugger_sp->GetCommandInterpreter().GetExecutionContext());
1068b9c1b51eSKate Stone     lldb::OptionValueSP value_sp(
1069b9c1b51eSKate Stone         debugger_sp->GetPropertyValue(&exe_ctx, var_name, false, error));
1070b9c1b51eSKate Stone     if (value_sp) {
10716920b52bSGreg Clayton       StreamString value_strm;
10726920b52bSGreg Clayton       value_sp->DumpValue(&exe_ctx, value_strm, OptionValue::eDumpOptionValue);
10736920b52bSGreg Clayton       const std::string &value_str = value_strm.GetString();
1074b9c1b51eSKate Stone       if (!value_str.empty()) {
10756920b52bSGreg Clayton         StringList string_list;
107644d93782SGreg Clayton         string_list.SplitIntoLines(value_str);
10776920b52bSGreg Clayton         return SBStringList(&string_list);
10786920b52bSGreg Clayton       }
10796920b52bSGreg Clayton     }
10806920b52bSGreg Clayton   }
10816920b52bSGreg Clayton   return SBStringList();
10823df9a8dfSCaroline Tice }
10833df9a8dfSCaroline Tice 
1084b9c1b51eSKate Stone uint32_t SBDebugger::GetTerminalWidth() const {
1085dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetTerminalWidth() : 0);
1086a7015092SGreg Clayton }
1087a7015092SGreg Clayton 
1088b9c1b51eSKate Stone void SBDebugger::SetTerminalWidth(uint32_t term_width) {
1089a7015092SGreg Clayton   if (m_opaque_sp)
1090a7015092SGreg Clayton     m_opaque_sp->SetTerminalWidth(term_width);
1091a7015092SGreg Clayton }
1092a7015092SGreg Clayton 
1093b9c1b51eSKate Stone const char *SBDebugger::GetPrompt() const {
10945160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1095ceb6b139SCaroline Tice 
1096ceb6b139SCaroline Tice   if (log)
1097324a1036SSaleem Abdulrasool     log->Printf("SBDebugger(%p)::GetPrompt () => \"%s\"",
1098324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_sp.get()),
1099514d8cd8SZachary Turner                 (m_opaque_sp ? m_opaque_sp->GetPrompt().str().c_str() : ""));
1100ceb6b139SCaroline Tice 
1101514d8cd8SZachary Turner   return (m_opaque_sp ? ConstString(m_opaque_sp->GetPrompt()).GetCString()
1102514d8cd8SZachary Turner                       : nullptr);
1103a7015092SGreg Clayton }
1104a7015092SGreg Clayton 
1105b9c1b51eSKate Stone void SBDebugger::SetPrompt(const char *prompt) {
1106a7015092SGreg Clayton   if (m_opaque_sp)
1107514d8cd8SZachary Turner     m_opaque_sp->SetPrompt(llvm::StringRef::withNullAsEmpty(prompt));
1108a7015092SGreg Clayton }
1109a7015092SGreg Clayton 
11109e046f02SJonas Devlieghere const char *SBDebugger::GetReproducerPath() const {
11119e046f02SJonas Devlieghere   return (m_opaque_sp
11129e046f02SJonas Devlieghere               ? ConstString(m_opaque_sp->GetReproducerPath()).GetCString()
11139e046f02SJonas Devlieghere               : nullptr);
11149e046f02SJonas Devlieghere }
11159e046f02SJonas Devlieghere 
1116b9c1b51eSKate Stone ScriptLanguage SBDebugger::GetScriptLanguage() const {
1117dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetScriptLanguage() : eScriptLanguageNone);
1118a7015092SGreg Clayton }
1119a7015092SGreg Clayton 
1120b9c1b51eSKate Stone void SBDebugger::SetScriptLanguage(ScriptLanguage script_lang) {
1121b9c1b51eSKate Stone   if (m_opaque_sp) {
1122a7015092SGreg Clayton     m_opaque_sp->SetScriptLanguage(script_lang);
1123a7015092SGreg Clayton   }
1124af67cecdSGreg Clayton }
1125a7015092SGreg Clayton 
1126b9c1b51eSKate Stone bool SBDebugger::SetUseExternalEditor(bool value) {
1127dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->SetUseExternalEditor(value) : false);
1128e40e4218SJim Ingham }
1129e40e4218SJim Ingham 
1130b9c1b51eSKate Stone bool SBDebugger::GetUseExternalEditor() {
1131dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetUseExternalEditor() : false);
1132e40e4218SJim Ingham }
1133e40e4218SJim Ingham 
1134b9c1b51eSKate Stone bool SBDebugger::SetUseColor(bool value) {
1135dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->SetUseColor(value) : false);
1136c3ce7f27SMichael Sartain }
1137c3ce7f27SMichael Sartain 
1138b9c1b51eSKate Stone bool SBDebugger::GetUseColor() const {
1139dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetUseColor() : false);
1140c3ce7f27SMichael Sartain }
1141c3ce7f27SMichael Sartain 
1142b9c1b51eSKate Stone bool SBDebugger::GetDescription(SBStream &description) {
1143da7bc7d0SGreg Clayton   Stream &strm = description.ref();
1144da7bc7d0SGreg Clayton 
1145b9c1b51eSKate Stone   if (m_opaque_sp) {
1146dde9cff3SCaroline Tice     const char *name = m_opaque_sp->GetInstanceName().AsCString();
1147431ce678SGreg Clayton     user_id_t id = m_opaque_sp->GetID();
1148d01b2953SDaniel Malea     strm.Printf("Debugger (instance: \"%s\", id: %" PRIu64 ")", name, id);
1149b9c1b51eSKate Stone   } else
1150da7bc7d0SGreg Clayton     strm.PutCString("No value");
1151dde9cff3SCaroline Tice 
1152dde9cff3SCaroline Tice   return true;
1153dde9cff3SCaroline Tice }
1154efed6131SCaroline Tice 
1155b9c1b51eSKate Stone user_id_t SBDebugger::GetID() {
1156dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetID() : LLDB_INVALID_UID);
1157efed6131SCaroline Tice }
11582289fa48SGreg Clayton 
1159b9c1b51eSKate Stone SBError SBDebugger::SetCurrentPlatform(const char *platform_name_cstr) {
11602289fa48SGreg Clayton   SBError sb_error;
1161b9c1b51eSKate Stone   if (m_opaque_sp) {
1162b9c1b51eSKate Stone     if (platform_name_cstr && platform_name_cstr[0]) {
1163615eb7e6SGreg Clayton       ConstString platform_name(platform_name_cstr);
1164615eb7e6SGreg Clayton       PlatformSP platform_sp(Platform::Find(platform_name));
11652289fa48SGreg Clayton 
1166b9c1b51eSKate Stone       if (platform_sp) {
1167615eb7e6SGreg Clayton         // Already have a platform with this name, just select it
1168615eb7e6SGreg Clayton         m_opaque_sp->GetPlatformList().SetSelectedPlatform(platform_sp);
1169b9c1b51eSKate Stone       } else {
1170615eb7e6SGreg Clayton         // We don't have a platform by this name yet, create one
1171615eb7e6SGreg Clayton         platform_sp = Platform::Create(platform_name, sb_error.ref());
1172b9c1b51eSKate Stone         if (platform_sp) {
1173615eb7e6SGreg Clayton           // We created the platform, now append and select it
11742289fa48SGreg Clayton           bool make_selected = true;
11752289fa48SGreg Clayton           m_opaque_sp->GetPlatformList().Append(platform_sp, make_selected);
11762289fa48SGreg Clayton         }
11772289fa48SGreg Clayton       }
1178b9c1b51eSKate Stone     } else {
1179615eb7e6SGreg Clayton       sb_error.ref().SetErrorString("invalid platform name");
1180615eb7e6SGreg Clayton     }
1181b9c1b51eSKate Stone   } else {
1182615eb7e6SGreg Clayton     sb_error.ref().SetErrorString("invalid debugger");
1183615eb7e6SGreg Clayton   }
11842289fa48SGreg Clayton   return sb_error;
11852289fa48SGreg Clayton }
11862289fa48SGreg Clayton 
1187b9c1b51eSKate Stone bool SBDebugger::SetCurrentPlatformSDKRoot(const char *sysroot) {
1188e1cf274bSJason Molenda   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1189b9c1b51eSKate Stone   if (m_opaque_sp) {
1190b9c1b51eSKate Stone     PlatformSP platform_sp(
1191b9c1b51eSKate Stone         m_opaque_sp->GetPlatformList().GetSelectedPlatform());
1192f3dd93c8SGreg Clayton 
1193b9c1b51eSKate Stone     if (platform_sp) {
1194e1cf274bSJason Molenda       if (log && sysroot)
1195e1cf274bSJason Molenda         log->Printf("SBDebugger::SetCurrentPlatformSDKRoot (\"%s\")", sysroot);
1196f3dd93c8SGreg Clayton       platform_sp->SetSDKRootDirectory(ConstString(sysroot));
1197f3dd93c8SGreg Clayton       return true;
1198f3dd93c8SGreg Clayton     }
1199f3dd93c8SGreg Clayton   }
1200f3dd93c8SGreg Clayton   return false;
1201f3dd93c8SGreg Clayton }
1202f3dd93c8SGreg Clayton 
1203b9c1b51eSKate Stone bool SBDebugger::GetCloseInputOnEOF() const {
1204dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetCloseInputOnEOF() : false);
1205fc3f027dSGreg Clayton }
1206fc3f027dSGreg Clayton 
1207b9c1b51eSKate Stone void SBDebugger::SetCloseInputOnEOF(bool b) {
1208fc3f027dSGreg Clayton   if (m_opaque_sp)
1209fc3f027dSGreg Clayton     m_opaque_sp->SetCloseInputOnEOF(b);
1210fc3f027dSGreg Clayton }
1211061858ceSEnrico Granata 
1212b9c1b51eSKate Stone SBTypeCategory SBDebugger::GetCategory(const char *category_name) {
1213061858ceSEnrico Granata   if (!category_name || *category_name == 0)
1214061858ceSEnrico Granata     return SBTypeCategory();
1215061858ceSEnrico Granata 
1216061858ceSEnrico Granata   TypeCategoryImplSP category_sp;
1217061858ceSEnrico Granata 
1218b9c1b51eSKate Stone   if (DataVisualization::Categories::GetCategory(ConstString(category_name),
1219b9c1b51eSKate Stone                                                  category_sp, false))
1220061858ceSEnrico Granata     return SBTypeCategory(category_sp);
1221061858ceSEnrico Granata   else
1222061858ceSEnrico Granata     return SBTypeCategory();
1223061858ceSEnrico Granata }
1224061858ceSEnrico Granata 
1225b9c1b51eSKate Stone SBTypeCategory SBDebugger::GetCategory(lldb::LanguageType lang_type) {
1226e242624cSEnrico Granata   TypeCategoryImplSP category_sp;
1227e242624cSEnrico Granata   if (DataVisualization::Categories::GetCategory(lang_type, category_sp))
1228e242624cSEnrico Granata     return SBTypeCategory(category_sp);
1229e242624cSEnrico Granata   else
1230e242624cSEnrico Granata     return SBTypeCategory();
1231e242624cSEnrico Granata }
1232e242624cSEnrico Granata 
1233b9c1b51eSKate Stone SBTypeCategory SBDebugger::CreateCategory(const char *category_name) {
1234061858ceSEnrico Granata   if (!category_name || *category_name == 0)
1235061858ceSEnrico Granata     return SBTypeCategory();
1236061858ceSEnrico Granata 
1237061858ceSEnrico Granata   TypeCategoryImplSP category_sp;
1238061858ceSEnrico Granata 
1239b9c1b51eSKate Stone   if (DataVisualization::Categories::GetCategory(ConstString(category_name),
1240b9c1b51eSKate Stone                                                  category_sp, true))
1241061858ceSEnrico Granata     return SBTypeCategory(category_sp);
1242061858ceSEnrico Granata   else
1243061858ceSEnrico Granata     return SBTypeCategory();
1244061858ceSEnrico Granata }
1245061858ceSEnrico Granata 
1246b9c1b51eSKate Stone bool SBDebugger::DeleteCategory(const char *category_name) {
1247061858ceSEnrico Granata   if (!category_name || *category_name == 0)
1248061858ceSEnrico Granata     return false;
1249061858ceSEnrico Granata 
1250061858ceSEnrico Granata   return DataVisualization::Categories::Delete(ConstString(category_name));
1251061858ceSEnrico Granata }
1252061858ceSEnrico Granata 
1253b9c1b51eSKate Stone uint32_t SBDebugger::GetNumCategories() {
1254061858ceSEnrico Granata   return DataVisualization::Categories::GetCount();
1255061858ceSEnrico Granata }
1256061858ceSEnrico Granata 
1257b9c1b51eSKate Stone SBTypeCategory SBDebugger::GetCategoryAtIndex(uint32_t index) {
1258b9c1b51eSKate Stone   return SBTypeCategory(
1259b9c1b51eSKate Stone       DataVisualization::Categories::GetCategoryAtIndex(index));
1260061858ceSEnrico Granata }
1261061858ceSEnrico Granata 
1262b9c1b51eSKate Stone SBTypeCategory SBDebugger::GetDefaultCategory() {
1263061858ceSEnrico Granata   return GetCategory("default");
1264061858ceSEnrico Granata }
1265061858ceSEnrico Granata 
1266b9c1b51eSKate Stone SBTypeFormat SBDebugger::GetFormatForType(SBTypeNameSpecifier type_name) {
1267061858ceSEnrico Granata   SBTypeCategory default_category_sb = GetDefaultCategory();
1268061858ceSEnrico Granata   if (default_category_sb.GetEnabled())
1269061858ceSEnrico Granata     return default_category_sb.GetFormatForType(type_name);
1270061858ceSEnrico Granata   return SBTypeFormat();
1271061858ceSEnrico Granata }
1272061858ceSEnrico Granata 
1273cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON
1274b9c1b51eSKate Stone SBTypeSummary SBDebugger::GetSummaryForType(SBTypeNameSpecifier type_name) {
1275dbb0abbfSEugene Zelenko   if (!type_name.IsValid())
1276a777dc2aSEnrico Granata     return SBTypeSummary();
1277a777dc2aSEnrico Granata   return SBTypeSummary(DataVisualization::GetSummaryForType(type_name.GetSP()));
1278061858ceSEnrico Granata }
1279cf7e2dc0SJason Molenda #endif // LLDB_DISABLE_PYTHON
1280061858ceSEnrico Granata 
1281b9c1b51eSKate Stone SBTypeFilter SBDebugger::GetFilterForType(SBTypeNameSpecifier type_name) {
1282dbb0abbfSEugene Zelenko   if (!type_name.IsValid())
1283a777dc2aSEnrico Granata     return SBTypeFilter();
1284a777dc2aSEnrico Granata   return SBTypeFilter(DataVisualization::GetFilterForType(type_name.GetSP()));
1285061858ceSEnrico Granata }
1286061858ceSEnrico Granata 
1287cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON
1288b9c1b51eSKate Stone SBTypeSynthetic SBDebugger::GetSyntheticForType(SBTypeNameSpecifier type_name) {
1289dbb0abbfSEugene Zelenko   if (!type_name.IsValid())
1290a777dc2aSEnrico Granata     return SBTypeSynthetic();
1291b9c1b51eSKate Stone   return SBTypeSynthetic(
1292b9c1b51eSKate Stone       DataVisualization::GetSyntheticForType(type_name.GetSP()));
1293061858ceSEnrico Granata }
1294cf7e2dc0SJason Molenda #endif // LLDB_DISABLE_PYTHON
1295061858ceSEnrico Granata 
12965e336903SPavel Labath static llvm::ArrayRef<const char *> GetCategoryArray(const char **categories) {
12975e336903SPavel Labath   if (categories == nullptr)
12985e336903SPavel Labath     return {};
12995e336903SPavel Labath   size_t len = 0;
13005e336903SPavel Labath   while (categories[len] != nullptr)
13015e336903SPavel Labath     ++len;
13025e336903SPavel Labath   return llvm::makeArrayRef(categories, len);
13035e336903SPavel Labath }
13045e336903SPavel Labath 
1305b9c1b51eSKate Stone bool SBDebugger::EnableLog(const char *channel, const char **categories) {
1306b9c1b51eSKate Stone   if (m_opaque_sp) {
1307b9c1b51eSKate Stone     uint32_t log_options =
1308b9c1b51eSKate Stone         LLDB_LOG_OPTION_PREPEND_TIMESTAMP | LLDB_LOG_OPTION_PREPEND_THREAD_NAME;
1309775588c0SPavel Labath     std::string error;
1310775588c0SPavel Labath     llvm::raw_string_ostream error_stream(error);
13115e336903SPavel Labath     return m_opaque_sp->EnableLog(channel, GetCategoryArray(categories), "",
1312775588c0SPavel Labath                                   log_options, error_stream);
1313b9c1b51eSKate Stone   } else
1314228063cdSJim Ingham     return false;
1315228063cdSJim Ingham }
13164f02b22dSJim Ingham 
1317b9c1b51eSKate Stone void SBDebugger::SetLoggingCallback(lldb::LogOutputCallback log_callback,
1318b9c1b51eSKate Stone                                     void *baton) {
1319b9c1b51eSKate Stone   if (m_opaque_sp) {
13204f02b22dSJim Ingham     return m_opaque_sp->SetLoggingCallback(log_callback, baton);
13214f02b22dSJim Ingham   }
13224f02b22dSJim Ingham }
1323