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 
9baf5664fSJonas Devlieghere #include "SBReproducerPrivate.h"
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"
2196898eb6SLawrence D'Anna #include "lldb/API/SBFile.h"
22ca93cc1dSEli Friedman #include "lldb/API/SBFrame.h"
23b9c1b51eSKate Stone #include "lldb/API/SBListener.h"
243df9a8dfSCaroline Tice #include "lldb/API/SBProcess.h"
253df9a8dfSCaroline Tice #include "lldb/API/SBSourceManager.h"
26dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
273df9a8dfSCaroline Tice #include "lldb/API/SBStringList.h"
28c10e34d0SVadim Macagon #include "lldb/API/SBStructuredData.h"
293df9a8dfSCaroline Tice #include "lldb/API/SBTarget.h"
303df9a8dfSCaroline Tice #include "lldb/API/SBThread.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"
39c10e34d0SVadim Macagon #include "lldb/Core/PluginManager.h"
4044d93782SGreg Clayton #include "lldb/Core/StreamFile.h"
41c10e34d0SVadim Macagon #include "lldb/Core/StructuredDataImpl.h"
425548cb50SEnrico Granata #include "lldb/DataFormatters/DataVisualization.h"
4359998b7bSJonas Devlieghere #include "lldb/Host/Config.h"
44f1389e92SPavel Labath #include "lldb/Host/XML.h"
45e6e2bb38SZachary Turner #include "lldb/Initialization/SystemLifetimeManager.h"
466eee5aa0SGreg Clayton #include "lldb/Interpreter/CommandInterpreter.h"
4747cbf4a0SPavel Labath #include "lldb/Interpreter/OptionArgParser.h"
48cac9c5f9SGreg Clayton #include "lldb/Interpreter/OptionGroupPlatform.h"
496eee5aa0SGreg Clayton #include "lldb/Target/Process.h"
506eee5aa0SGreg Clayton #include "lldb/Target/TargetList.h"
51145d95c9SPavel Labath #include "lldb/Utility/Args.h"
52d821c997SPavel Labath #include "lldb/Utility/State.h"
5330fdc8d8SChris Lattner 
54d717cc9fSEnrico Granata #include "llvm/ADT/STLExtras.h"
557b2e5a36SZachary Turner #include "llvm/ADT/StringRef.h"
5658a559c0SZachary Turner #include "llvm/Support/DynamicLibrary.h"
57b9c1b51eSKate Stone #include "llvm/Support/ManagedStatic.h"
5858a559c0SZachary Turner 
5930fdc8d8SChris Lattner using namespace lldb;
6030fdc8d8SChris Lattner using namespace lldb_private;
6130fdc8d8SChris Lattner 
62b9c1b51eSKate Stone static llvm::sys::DynamicLibrary LoadPlugin(const lldb::DebuggerSP &debugger_sp,
63b9c1b51eSKate Stone                                             const FileSpec &spec,
6497206d57SZachary Turner                                             Status &error) {
65b9c1b51eSKate Stone   llvm::sys::DynamicLibrary dynlib =
66b9c1b51eSKate Stone       llvm::sys::DynamicLibrary::getPermanentLibrary(spec.GetPath().c_str());
67b9c1b51eSKate Stone   if (dynlib.isValid()) {
685fb8f797SGreg Clayton     typedef bool (*LLDBCommandPluginInit)(lldb::SBDebugger & debugger);
695fb8f797SGreg Clayton 
705fb8f797SGreg Clayton     lldb::SBDebugger debugger_sb(debugger_sp);
71b9c1b51eSKate Stone     // This calls the bool lldb::PluginInitialize(lldb::SBDebugger debugger)
72b9c1b51eSKate Stone     // function.
73b9c1b51eSKate Stone     // TODO: mangle this differently for your system - on OSX, the first
74b9c1b51eSKate Stone     // underscore needs to be removed and the second one stays
75b9c1b51eSKate Stone     LLDBCommandPluginInit init_func =
7622701b2fSStephane Sezer         (LLDBCommandPluginInit)(uintptr_t)dynlib.getAddressOfSymbol(
77b9c1b51eSKate Stone             "_ZN4lldb16PluginInitializeENS_10SBDebuggerE");
78b9c1b51eSKate Stone     if (init_func) {
795fb8f797SGreg Clayton       if (init_func(debugger_sb))
8058a559c0SZachary Turner         return dynlib;
815fb8f797SGreg Clayton       else
82b9c1b51eSKate Stone         error.SetErrorString("plug-in refused to load "
83b9c1b51eSKate Stone                              "(lldb::PluginInitialize(lldb::SBDebugger) "
84b9c1b51eSKate Stone                              "returned false)");
85b9c1b51eSKate Stone     } else {
86b9c1b51eSKate Stone       error.SetErrorString("plug-in is missing the required initialization: "
87b9c1b51eSKate Stone                            "lldb::PluginInitialize(lldb::SBDebugger)");
885fb8f797SGreg Clayton     }
89b9c1b51eSKate Stone   } else {
90dbd7fabaSJonas Devlieghere     if (FileSystem::Instance().Exists(spec))
915fb8f797SGreg Clayton       error.SetErrorString("this file does not represent a loadable dylib");
925fb8f797SGreg Clayton     else
935fb8f797SGreg Clayton       error.SetErrorString("no such file");
945fb8f797SGreg Clayton   }
9558a559c0SZachary Turner   return llvm::sys::DynamicLibrary();
965fb8f797SGreg Clayton }
975fb8f797SGreg Clayton 
98e6e2bb38SZachary Turner static llvm::ManagedStatic<SystemLifetimeManager> g_debugger_lifetime;
99e6e2bb38SZachary Turner 
100b9c1b51eSKate Stone SBError SBInputReader::Initialize(
101b9c1b51eSKate Stone     lldb::SBDebugger &sb_debugger,
1020d7b0c96SJonas Devlieghere     unsigned long (*callback)(void *, lldb::SBInputReader *,
1030d7b0c96SJonas Devlieghere                               lldb::InputReaderAction, char const *,
1040d7b0c96SJonas Devlieghere                               unsigned long),
1050d7b0c96SJonas Devlieghere     void *a, lldb::InputReaderGranularity b, char const *c, char const *d,
1060d7b0c96SJonas Devlieghere     bool e) {
1077bc83564SJonas Devlieghere   LLDB_RECORD_DUMMY(
1087bc83564SJonas Devlieghere       lldb::SBError, SBInputReader, Initialize,
1097bc83564SJonas Devlieghere       (lldb::SBDebugger &,
1107bc83564SJonas Devlieghere        unsigned long (*)(void *, lldb::SBInputReader *, lldb::InputReaderAction,
1117bc83564SJonas Devlieghere                          const char *, unsigned long),
1127bc83564SJonas Devlieghere        void *, lldb::InputReaderGranularity, const char *, const char *, bool),
1130d7b0c96SJonas Devlieghere       sb_debugger, callback, a, b, c, d, e);
1140d7b0c96SJonas Devlieghere 
115e6e2bb38SZachary Turner   return SBError();
116e6e2bb38SZachary Turner }
117e6e2bb38SZachary Turner 
118baf5664fSJonas Devlieghere void SBInputReader::SetIsDone(bool b) {
119baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBInputReader, SetIsDone, (bool), b);
120baf5664fSJonas Devlieghere }
121dbb0abbfSEugene Zelenko 
122baf5664fSJonas Devlieghere bool SBInputReader::IsActive() const {
123baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBInputReader, IsActive);
124e6e2bb38SZachary Turner 
125baf5664fSJonas Devlieghere   return false;
126baf5664fSJonas Devlieghere }
127baf5664fSJonas Devlieghere 
128baf5664fSJonas Devlieghere SBDebugger::SBDebugger() { LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBDebugger); }
129dbb0abbfSEugene Zelenko 
130b9c1b51eSKate Stone SBDebugger::SBDebugger(const lldb::DebuggerSP &debugger_sp)
131baf5664fSJonas Devlieghere     : m_opaque_sp(debugger_sp) {
132baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBDebugger, (const lldb::DebuggerSP &), debugger_sp);
133baf5664fSJonas Devlieghere }
134dbb0abbfSEugene Zelenko 
135baf5664fSJonas Devlieghere SBDebugger::SBDebugger(const SBDebugger &rhs) : m_opaque_sp(rhs.m_opaque_sp) {
136baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBDebugger, (const lldb::SBDebugger &), rhs);
137baf5664fSJonas Devlieghere }
138dbb0abbfSEugene Zelenko 
139dbb0abbfSEugene Zelenko SBDebugger::~SBDebugger() = default;
140dbb0abbfSEugene Zelenko 
141b9c1b51eSKate Stone SBDebugger &SBDebugger::operator=(const SBDebugger &rhs) {
142baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBDebugger &,
143baf5664fSJonas Devlieghere                      SBDebugger, operator=,(const lldb::SBDebugger &), rhs);
144baf5664fSJonas Devlieghere 
145b9c1b51eSKate Stone   if (this != &rhs) {
146dbb0abbfSEugene Zelenko     m_opaque_sp = rhs.m_opaque_sp;
147dbb0abbfSEugene Zelenko   }
148306809f2SJonas Devlieghere   return LLDB_RECORD_RESULT(*this);
149dbb0abbfSEugene Zelenko }
150dbb0abbfSEugene Zelenko 
151b9c1b51eSKate Stone void SBDebugger::Initialize() {
152baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD_NO_ARGS(void, SBDebugger, Initialize);
153936c6242SJonas Devlieghere   SBError ignored = SBDebugger::InitializeWithErrorHandling();
15415eacd74SJonas Devlieghere }
15515eacd74SJonas Devlieghere 
156936c6242SJonas Devlieghere lldb::SBError SBDebugger::InitializeWithErrorHandling() {
157baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD_NO_ARGS(lldb::SBError, SBDebugger,
158baf5664fSJonas Devlieghere                                     InitializeWithErrorHandling);
159baf5664fSJonas Devlieghere 
16015eacd74SJonas Devlieghere   SBError error;
16115eacd74SJonas Devlieghere   if (auto e = g_debugger_lifetime->Initialize(
162a8f3ae7cSJonas Devlieghere           std::make_unique<SystemInitializerFull>(), LoadPlugin)) {
16315eacd74SJonas Devlieghere     error.SetError(Status(std::move(e)));
16415eacd74SJonas Devlieghere   }
165baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(error);
16630fdc8d8SChris Lattner }
16730fdc8d8SChris Lattner 
168baf5664fSJonas Devlieghere void SBDebugger::Terminate() {
169baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD_NO_ARGS(void, SBDebugger, Terminate);
170baf5664fSJonas Devlieghere 
171baf5664fSJonas Devlieghere   g_debugger_lifetime->Terminate();
172baf5664fSJonas Devlieghere }
17330fdc8d8SChris Lattner 
174b9c1b51eSKate Stone void SBDebugger::Clear() {
175baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(void, SBDebugger, Clear);
176baf5664fSJonas Devlieghere 
1773d6086f6SCaroline Tice   if (m_opaque_sp)
17844d93782SGreg Clayton     m_opaque_sp->ClearIOHandlers();
179ceb6b139SCaroline Tice 
18048e42549SGreg Clayton   m_opaque_sp.reset();
18148e42549SGreg Clayton }
18248e42549SGreg Clayton 
183b9c1b51eSKate Stone SBDebugger SBDebugger::Create() {
184baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD_NO_ARGS(lldb::SBDebugger, SBDebugger, Create);
185baf5664fSJonas Devlieghere 
186baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(SBDebugger::Create(false, nullptr, nullptr));
18706942690SJim Ingham }
18806942690SJim Ingham 
189b9c1b51eSKate Stone SBDebugger SBDebugger::Create(bool source_init_files) {
190baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD(lldb::SBDebugger, SBDebugger, Create, (bool),
191baf5664fSJonas Devlieghere                             source_init_files);
192baf5664fSJonas Devlieghere 
193baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(
194baf5664fSJonas Devlieghere       SBDebugger::Create(source_init_files, nullptr, nullptr));
195228063cdSJim Ingham }
196228063cdSJim Ingham 
197b9c1b51eSKate Stone SBDebugger SBDebugger::Create(bool source_init_files,
198b9c1b51eSKate Stone                               lldb::LogOutputCallback callback, void *baton)
199228063cdSJim Ingham 
200228063cdSJim Ingham {
2010d7b0c96SJonas Devlieghere   LLDB_RECORD_DUMMY(lldb::SBDebugger, SBDebugger, Create,
2027bc83564SJonas Devlieghere                     (bool, lldb::LogOutputCallback, void *), source_init_files,
2037bc83564SJonas Devlieghere                     callback, baton);
204ceb6b139SCaroline Tice 
2056611103cSGreg Clayton   SBDebugger debugger;
206cb172b10SGreg Clayton 
207b9c1b51eSKate Stone   // Currently we have issues if this function is called simultaneously on two
20805097246SAdrian Prantl   // different threads. The issues mainly revolve around the fact that the
20905097246SAdrian Prantl   // lldb_private::FormatManager uses global collections and having two threads
21005097246SAdrian Prantl   // parsing the .lldbinit files can cause mayhem. So to get around this for
21105097246SAdrian Prantl   // now we need to use a mutex to prevent bad things from happening.
21216ff8604SSaleem Abdulrasool   static std::recursive_mutex g_mutex;
21316ff8604SSaleem Abdulrasool   std::lock_guard<std::recursive_mutex> guard(g_mutex);
214cb172b10SGreg Clayton 
215228063cdSJim Ingham   debugger.reset(Debugger::CreateInstance(callback, baton));
216ceb6b139SCaroline Tice 
21706942690SJim Ingham   SBCommandInterpreter interp = debugger.GetCommandInterpreter();
218b9c1b51eSKate Stone   if (source_init_files) {
21906942690SJim Ingham     interp.get()->SkipLLDBInitFiles(false);
22006942690SJim Ingham     interp.get()->SkipAppInitFiles(false);
22106942690SJim Ingham     SBCommandReturnObject result;
22206942690SJim Ingham     interp.SourceInitFileInHomeDirectory(result);
223b9c1b51eSKate Stone   } else {
22406942690SJim Ingham     interp.get()->SkipLLDBInitFiles(true);
22506942690SJim Ingham     interp.get()->SkipAppInitFiles(true);
22606942690SJim Ingham   }
2276611103cSGreg Clayton   return debugger;
2286611103cSGreg Clayton }
2296611103cSGreg Clayton 
230b9c1b51eSKate Stone void SBDebugger::Destroy(SBDebugger &debugger) {
231baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD(void, SBDebugger, Destroy, (lldb::SBDebugger &),
232baf5664fSJonas Devlieghere                             debugger);
233baf5664fSJonas Devlieghere 
234e02657b1SCaroline Tice   Debugger::Destroy(debugger.m_opaque_sp);
235e02657b1SCaroline Tice 
236dbb0abbfSEugene Zelenko   if (debugger.m_opaque_sp.get() != nullptr)
237e02657b1SCaroline Tice     debugger.m_opaque_sp.reset();
238e02657b1SCaroline Tice }
239e02657b1SCaroline Tice 
240b9c1b51eSKate Stone void SBDebugger::MemoryPressureDetected() {
241baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD_NO_ARGS(void, SBDebugger, MemoryPressureDetected);
242baf5664fSJonas Devlieghere 
24305097246SAdrian Prantl   // Since this function can be call asynchronously, we allow it to be non-
24405097246SAdrian Prantl   // mandatory. We have seen deadlocks with this function when called so we
24505097246SAdrian Prantl   // need to safeguard against this until we can determine what is causing the
24605097246SAdrian Prantl   // deadlocks.
247aebdf1beSJim Ingham 
2480cd70866SGreg Clayton   const bool mandatory = false;
249aebdf1beSJim Ingham 
2500cd70866SGreg Clayton   ModuleList::RemoveOrphanSharedModules(mandatory);
251f9322415SGreg Clayton }
252f9322415SGreg Clayton 
253baf5664fSJonas Devlieghere bool SBDebugger::IsValid() const {
254baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBDebugger, IsValid);
2557f5237bcSPavel Labath   return this->operator bool();
2567f5237bcSPavel Labath }
2577f5237bcSPavel Labath SBDebugger::operator bool() const {
2587f5237bcSPavel Labath   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBDebugger, operator bool);
259baf5664fSJonas Devlieghere 
260baf5664fSJonas Devlieghere   return m_opaque_sp.get() != nullptr;
261baf5664fSJonas Devlieghere }
2626611103cSGreg Clayton 
263b9c1b51eSKate Stone void SBDebugger::SetAsync(bool b) {
264baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBDebugger, SetAsync, (bool), b);
265baf5664fSJonas Devlieghere 
2666611103cSGreg Clayton   if (m_opaque_sp)
2676611103cSGreg Clayton     m_opaque_sp->SetAsyncExecution(b);
26830fdc8d8SChris Lattner }
26930fdc8d8SChris Lattner 
270b9c1b51eSKate Stone bool SBDebugger::GetAsync() {
271baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(bool, SBDebugger, GetAsync);
272baf5664fSJonas Devlieghere 
273dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetAsyncExecution() : false);
274e64f0dc7SJim Ingham }
275e64f0dc7SJim Ingham 
276b9c1b51eSKate Stone void SBDebugger::SkipLLDBInitFiles(bool b) {
277baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBDebugger, SkipLLDBInitFiles, (bool), b);
278baf5664fSJonas Devlieghere 
2796eee5aa0SGreg Clayton   if (m_opaque_sp)
2806eee5aa0SGreg Clayton     m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles(b);
2816eee5aa0SGreg Clayton }
2826eee5aa0SGreg Clayton 
283b9c1b51eSKate Stone void SBDebugger::SkipAppInitFiles(bool b) {
284baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBDebugger, SkipAppInitFiles, (bool), b);
285baf5664fSJonas Devlieghere 
28616e0c686SJim Ingham   if (m_opaque_sp)
28716e0c686SJim Ingham     m_opaque_sp->GetCommandInterpreter().SkipAppInitFiles(b);
28816e0c686SJim Ingham }
28916e0c686SJim Ingham 
290b9c1b51eSKate Stone void SBDebugger::SetInputFileHandle(FILE *fh, bool transfer_ownership) {
291baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBDebugger, SetInputFileHandle, (FILE *, bool), fh,
292baf5664fSJonas Devlieghere                      transfer_ownership);
293f913fd6eSLawrence D'Anna   SetInputFile((FileSP)std::make_shared<NativeFile>(fh, transfer_ownership));
29496898eb6SLawrence D'Anna }
295baf5664fSJonas Devlieghere 
296c040b30fSLawrence D'Anna SBError SBDebugger::SetInputFile(FileSP file_sp) {
297c040b30fSLawrence D'Anna   LLDB_RECORD_METHOD(SBError, SBDebugger, SetInputFile, (FileSP), file_sp);
298fe5ab6d2SJonas Devlieghere   return LLDB_RECORD_RESULT(SetInputFile(SBFile(file_sp)));
299c040b30fSLawrence D'Anna }
300c040b30fSLawrence D'Anna 
30196898eb6SLawrence D'Anna // Shouldn't really be settable after initialization as this could cause lots
30296898eb6SLawrence D'Anna // of problems; don't want users trying to switch modes in the middle of a
30396898eb6SLawrence D'Anna // debugging session.
30496898eb6SLawrence D'Anna SBError SBDebugger::SetInputFile(SBFile file) {
30596898eb6SLawrence D'Anna   LLDB_RECORD_METHOD(SBError, SBDebugger, SetInputFile, (SBFile), file);
30696898eb6SLawrence D'Anna 
30796898eb6SLawrence D'Anna   SBError error;
30896898eb6SLawrence D'Anna   if (!m_opaque_sp) {
30996898eb6SLawrence D'Anna     error.ref().SetErrorString("invalid debugger");
310fe5ab6d2SJonas Devlieghere     return LLDB_RECORD_RESULT(error);
31196898eb6SLawrence D'Anna   }
312d77c2e09SJonas Devlieghere 
313d77c2e09SJonas Devlieghere   repro::DataRecorder *recorder = nullptr;
314d77c2e09SJonas Devlieghere   if (repro::Generator *g = repro::Reproducer::Instance().GetGenerator())
315d77c2e09SJonas Devlieghere     recorder = g->GetOrCreate<repro::CommandProvider>().GetNewDataRecorder();
316d77c2e09SJonas Devlieghere 
31796898eb6SLawrence D'Anna   FileSP file_sp = file.m_opaque_sp;
31896898eb6SLawrence D'Anna 
319*1d41d1bcSEric Christopher   static std::unique_ptr<repro::MultiLoader<repro::CommandProvider>> loader =
320*1d41d1bcSEric Christopher       repro::MultiLoader<repro::CommandProvider>::Create(
321*1d41d1bcSEric Christopher           repro::Reproducer::Instance().GetLoader());
3224a491ec4SJonas Devlieghere   if (loader) {
32396898eb6SLawrence D'Anna     llvm::Optional<std::string> nextfile = loader->GetNextFile();
32496898eb6SLawrence D'Anna     FILE *fh = nextfile ? FileSystem::Instance().Fopen(nextfile->c_str(), "r")
32596898eb6SLawrence D'Anna                         : nullptr;
32696898eb6SLawrence D'Anna     // FIXME Jonas Devlieghere: shouldn't this error be propagated out to the
32796898eb6SLawrence D'Anna     // reproducer somehow if fh is NULL?
32896898eb6SLawrence D'Anna     if (fh) {
329f913fd6eSLawrence D'Anna       file_sp = std::make_shared<NativeFile>(fh, true);
33096898eb6SLawrence D'Anna     }
3314a491ec4SJonas Devlieghere   }
332d77c2e09SJonas Devlieghere 
33396898eb6SLawrence D'Anna   if (!file_sp || !file_sp->IsValid()) {
33496898eb6SLawrence D'Anna     error.ref().SetErrorString("invalid file");
335fe5ab6d2SJonas Devlieghere     return LLDB_RECORD_RESULT(error);
33696898eb6SLawrence D'Anna   }
33796898eb6SLawrence D'Anna 
33896898eb6SLawrence D'Anna   m_opaque_sp->SetInputFile(file_sp, recorder);
339fe5ab6d2SJonas Devlieghere   return LLDB_RECORD_RESULT(error);
34030fdc8d8SChris Lattner }
34130fdc8d8SChris Lattner 
342c040b30fSLawrence D'Anna SBError SBDebugger::SetOutputFile(FileSP file_sp) {
343c040b30fSLawrence D'Anna   LLDB_RECORD_METHOD(SBError, SBDebugger, SetOutputFile, (FileSP), file_sp);
344fe5ab6d2SJonas Devlieghere   return LLDB_RECORD_RESULT(SetOutputFile(SBFile(file_sp)));
345c040b30fSLawrence D'Anna }
346c040b30fSLawrence D'Anna 
347b9c1b51eSKate Stone void SBDebugger::SetOutputFileHandle(FILE *fh, bool transfer_ownership) {
348baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBDebugger, SetOutputFileHandle, (FILE *, bool), fh,
349baf5664fSJonas Devlieghere                      transfer_ownership);
350f913fd6eSLawrence D'Anna   SetOutputFile((FileSP)std::make_shared<NativeFile>(fh, transfer_ownership));
35196898eb6SLawrence D'Anna }
352baf5664fSJonas Devlieghere 
35396898eb6SLawrence D'Anna SBError SBDebugger::SetOutputFile(SBFile file) {
35496898eb6SLawrence D'Anna   LLDB_RECORD_METHOD(SBError, SBDebugger, SetOutputFile, (SBFile file), file);
35596898eb6SLawrence D'Anna   SBError error;
35696898eb6SLawrence D'Anna   if (!m_opaque_sp) {
35796898eb6SLawrence D'Anna     error.ref().SetErrorString("invalid debugger");
358fe5ab6d2SJonas Devlieghere     return LLDB_RECORD_RESULT(error);
35996898eb6SLawrence D'Anna   }
36096898eb6SLawrence D'Anna   if (!file) {
36196898eb6SLawrence D'Anna     error.ref().SetErrorString("invalid file");
362fe5ab6d2SJonas Devlieghere     return LLDB_RECORD_RESULT(error);
36396898eb6SLawrence D'Anna   }
36496898eb6SLawrence D'Anna   m_opaque_sp->SetOutputFile(file.m_opaque_sp);
365fe5ab6d2SJonas Devlieghere   return LLDB_RECORD_RESULT(error);
36630fdc8d8SChris Lattner }
36730fdc8d8SChris Lattner 
368b9c1b51eSKate Stone void SBDebugger::SetErrorFileHandle(FILE *fh, bool transfer_ownership) {
369baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBDebugger, SetErrorFileHandle, (FILE *, bool), fh,
370baf5664fSJonas Devlieghere                      transfer_ownership);
371f913fd6eSLawrence D'Anna   SetErrorFile((FileSP)std::make_shared<NativeFile>(fh, transfer_ownership));
37296898eb6SLawrence D'Anna }
373baf5664fSJonas Devlieghere 
374c040b30fSLawrence D'Anna SBError SBDebugger::SetErrorFile(FileSP file_sp) {
375c040b30fSLawrence D'Anna   LLDB_RECORD_METHOD(SBError, SBDebugger, SetErrorFile, (FileSP), file_sp);
376fe5ab6d2SJonas Devlieghere   return LLDB_RECORD_RESULT(SetErrorFile(SBFile(file_sp)));
377c040b30fSLawrence D'Anna }
378c040b30fSLawrence D'Anna 
37996898eb6SLawrence D'Anna SBError SBDebugger::SetErrorFile(SBFile file) {
38096898eb6SLawrence D'Anna   LLDB_RECORD_METHOD(SBError, SBDebugger, SetErrorFile, (SBFile file), file);
38196898eb6SLawrence D'Anna   SBError error;
38296898eb6SLawrence D'Anna   if (!m_opaque_sp) {
38396898eb6SLawrence D'Anna     error.ref().SetErrorString("invalid debugger");
384fe5ab6d2SJonas Devlieghere     return LLDB_RECORD_RESULT(error);
38596898eb6SLawrence D'Anna   }
38696898eb6SLawrence D'Anna   if (!file) {
38796898eb6SLawrence D'Anna     error.ref().SetErrorString("invalid file");
388fe5ab6d2SJonas Devlieghere     return LLDB_RECORD_RESULT(error);
38996898eb6SLawrence D'Anna   }
39096898eb6SLawrence D'Anna   m_opaque_sp->SetErrorFile(file.m_opaque_sp);
391fe5ab6d2SJonas Devlieghere   return LLDB_RECORD_RESULT(error);
39230fdc8d8SChris Lattner }
39330fdc8d8SChris Lattner 
394b9c1b51eSKate Stone FILE *SBDebugger::GetInputFileHandle() {
395baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(FILE *, SBDebugger, GetInputFileHandle);
396b9c1b51eSKate Stone   if (m_opaque_sp) {
3977ca15ba7SLawrence D'Anna     File &file_sp = m_opaque_sp->GetInputFile();
3987ca15ba7SLawrence D'Anna     return LLDB_RECORD_RESULT(file_sp.GetStream());
39944d93782SGreg Clayton   }
400fe5ab6d2SJonas Devlieghere   return LLDB_RECORD_RESULT(nullptr);
40130fdc8d8SChris Lattner }
40230fdc8d8SChris Lattner 
40396898eb6SLawrence D'Anna SBFile SBDebugger::GetInputFile() {
40496898eb6SLawrence D'Anna   LLDB_RECORD_METHOD_NO_ARGS(SBFile, SBDebugger, GetInputFile);
40596898eb6SLawrence D'Anna   if (m_opaque_sp) {
40696898eb6SLawrence D'Anna     return LLDB_RECORD_RESULT(SBFile(m_opaque_sp->GetInputFileSP()));
40796898eb6SLawrence D'Anna   }
40896898eb6SLawrence D'Anna   return LLDB_RECORD_RESULT(SBFile());
40996898eb6SLawrence D'Anna }
41096898eb6SLawrence D'Anna 
411b9c1b51eSKate Stone FILE *SBDebugger::GetOutputFileHandle() {
412baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(FILE *, SBDebugger, GetOutputFileHandle);
413b9c1b51eSKate Stone   if (m_opaque_sp) {
4147ca15ba7SLawrence D'Anna     StreamFile &stream_file = m_opaque_sp->GetOutputStream();
4157ca15ba7SLawrence D'Anna     return LLDB_RECORD_RESULT(stream_file.GetFile().GetStream());
41644d93782SGreg Clayton   }
417fe5ab6d2SJonas Devlieghere   return LLDB_RECORD_RESULT(nullptr);
41830fdc8d8SChris Lattner }
41930fdc8d8SChris Lattner 
42096898eb6SLawrence D'Anna SBFile SBDebugger::GetOutputFile() {
42196898eb6SLawrence D'Anna   LLDB_RECORD_METHOD_NO_ARGS(SBFile, SBDebugger, GetOutputFile);
42296898eb6SLawrence D'Anna   if (m_opaque_sp) {
42396898eb6SLawrence D'Anna     SBFile file(m_opaque_sp->GetOutputStream().GetFileSP());
42496898eb6SLawrence D'Anna     return LLDB_RECORD_RESULT(file);
42596898eb6SLawrence D'Anna   }
42696898eb6SLawrence D'Anna   return LLDB_RECORD_RESULT(SBFile());
42796898eb6SLawrence D'Anna }
42896898eb6SLawrence D'Anna 
429b9c1b51eSKate Stone FILE *SBDebugger::GetErrorFileHandle() {
430baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(FILE *, SBDebugger, GetErrorFileHandle);
431baf5664fSJonas Devlieghere 
432b9c1b51eSKate Stone   if (m_opaque_sp) {
4337ca15ba7SLawrence D'Anna     StreamFile &stream_file = m_opaque_sp->GetErrorStream();
4347ca15ba7SLawrence D'Anna     return LLDB_RECORD_RESULT(stream_file.GetFile().GetStream());
43544d93782SGreg Clayton   }
436fe5ab6d2SJonas Devlieghere   return LLDB_RECORD_RESULT(nullptr);
43730fdc8d8SChris Lattner }
43830fdc8d8SChris Lattner 
43996898eb6SLawrence D'Anna SBFile SBDebugger::GetErrorFile() {
44096898eb6SLawrence D'Anna   LLDB_RECORD_METHOD_NO_ARGS(SBFile, SBDebugger, GetErrorFile);
44196898eb6SLawrence D'Anna   SBFile file;
44296898eb6SLawrence D'Anna   if (m_opaque_sp) {
44396898eb6SLawrence D'Anna     SBFile file(m_opaque_sp->GetErrorStream().GetFileSP());
44496898eb6SLawrence D'Anna     return LLDB_RECORD_RESULT(file);
44596898eb6SLawrence D'Anna   }
44696898eb6SLawrence D'Anna   return LLDB_RECORD_RESULT(SBFile());
44796898eb6SLawrence D'Anna }
44896898eb6SLawrence D'Anna 
449b9c1b51eSKate Stone void SBDebugger::SaveInputTerminalState() {
450b328dcbfSJonas Devlieghere   LLDB_RECORD_DUMMY_NO_ARGS(void, SBDebugger, SaveInputTerminalState);
451baf5664fSJonas Devlieghere 
452c5917d9aSJim Ingham   if (m_opaque_sp)
453c5917d9aSJim Ingham     m_opaque_sp->SaveInputTerminalState();
454c5917d9aSJim Ingham }
455c5917d9aSJim Ingham 
456b9c1b51eSKate Stone void SBDebugger::RestoreInputTerminalState() {
457b328dcbfSJonas Devlieghere   LLDB_RECORD_DUMMY_NO_ARGS(void, SBDebugger, RestoreInputTerminalState);
458baf5664fSJonas Devlieghere 
459c5917d9aSJim Ingham   if (m_opaque_sp)
460c5917d9aSJim Ingham     m_opaque_sp->RestoreInputTerminalState();
461c5917d9aSJim Ingham }
462b9c1b51eSKate Stone SBCommandInterpreter SBDebugger::GetCommandInterpreter() {
463baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::SBCommandInterpreter, SBDebugger,
464baf5664fSJonas Devlieghere                              GetCommandInterpreter);
465baf5664fSJonas Devlieghere 
4666611103cSGreg Clayton   SBCommandInterpreter sb_interpreter;
4676611103cSGreg Clayton   if (m_opaque_sp)
4686611103cSGreg Clayton     sb_interpreter.reset(&m_opaque_sp->GetCommandInterpreter());
469ceb6b139SCaroline Tice 
470baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_interpreter);
47130fdc8d8SChris Lattner }
47230fdc8d8SChris Lattner 
473b9c1b51eSKate Stone void SBDebugger::HandleCommand(const char *command) {
474baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBDebugger, HandleCommand, (const char *), command);
475baf5664fSJonas Devlieghere 
476b9c1b51eSKate Stone   if (m_opaque_sp) {
477af67cecdSGreg Clayton     TargetSP target_sp(m_opaque_sp->GetSelectedTarget());
478bb19a13cSSaleem Abdulrasool     std::unique_lock<std::recursive_mutex> lock;
479af67cecdSGreg Clayton     if (target_sp)
480bb19a13cSSaleem Abdulrasool       lock = std::unique_lock<std::recursive_mutex>(target_sp->GetAPIMutex());
481af67cecdSGreg Clayton 
4826611103cSGreg Clayton     SBCommandInterpreter sb_interpreter(GetCommandInterpreter());
48330fdc8d8SChris Lattner     SBCommandReturnObject result;
48430fdc8d8SChris Lattner 
48530fdc8d8SChris Lattner     sb_interpreter.HandleCommand(command, result, false);
48630fdc8d8SChris Lattner 
4875da2bc22SLawrence D'Anna     result.PutError(m_opaque_sp->GetErrorStream().GetFileSP());
4885da2bc22SLawrence D'Anna     result.PutOutput(m_opaque_sp->GetOutputStream().GetFileSP());
48930fdc8d8SChris Lattner 
490b9c1b51eSKate Stone     if (!m_opaque_sp->GetAsyncExecution()) {
4916611103cSGreg Clayton       SBProcess process(GetCommandInterpreter().GetProcess());
492b9556accSGreg Clayton       ProcessSP process_sp(process.GetSP());
493b9c1b51eSKate Stone       if (process_sp) {
49430fdc8d8SChris Lattner         EventSP event_sp;
495583bbb1dSJim Ingham         ListenerSP lldb_listener_sp = m_opaque_sp->GetListener();
496d35031e1SPavel Labath         while (lldb_listener_sp->GetEventForBroadcaster(
497d35031e1SPavel Labath             process_sp.get(), event_sp, std::chrono::seconds(0))) {
49830fdc8d8SChris Lattner           SBEvent event(event_sp);
499322f12afSLawrence D'Anna           HandleProcessEvent(process, event, GetOutputFile(), GetErrorFile());
50030fdc8d8SChris Lattner         }
50130fdc8d8SChris Lattner       }
50230fdc8d8SChris Lattner     }
50330fdc8d8SChris Lattner   }
5046611103cSGreg Clayton }
50530fdc8d8SChris Lattner 
506b9c1b51eSKate Stone SBListener SBDebugger::GetListener() {
507baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::SBListener, SBDebugger, GetListener);
508baf5664fSJonas Devlieghere 
5096611103cSGreg Clayton   SBListener sb_listener;
5106611103cSGreg Clayton   if (m_opaque_sp)
511583bbb1dSJim Ingham     sb_listener.reset(m_opaque_sp->GetListener());
512ceb6b139SCaroline Tice 
513baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_listener);
51430fdc8d8SChris Lattner }
51530fdc8d8SChris Lattner 
516b9c1b51eSKate Stone void SBDebugger::HandleProcessEvent(const SBProcess &process,
517322f12afSLawrence D'Anna                                     const SBEvent &event, SBFile out,
518322f12afSLawrence D'Anna                                     SBFile err) {
519322f12afSLawrence D'Anna   LLDB_RECORD_METHOD(
520322f12afSLawrence D'Anna       void, SBDebugger, HandleProcessEvent,
521322f12afSLawrence D'Anna       (const lldb::SBProcess &, const lldb::SBEvent &, SBFile, SBFile), process,
522322f12afSLawrence D'Anna       event, out, err);
523322f12afSLawrence D'Anna 
524322f12afSLawrence D'Anna   return HandleProcessEvent(process, event, out.m_opaque_sp, err.m_opaque_sp);
525322f12afSLawrence D'Anna }
526322f12afSLawrence D'Anna 
527322f12afSLawrence D'Anna void SBDebugger::HandleProcessEvent(const SBProcess &process,
528b9c1b51eSKate Stone                                     const SBEvent &event, FILE *out,
529b9c1b51eSKate Stone                                     FILE *err) {
530baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(
531baf5664fSJonas Devlieghere       void, SBDebugger, HandleProcessEvent,
532baf5664fSJonas Devlieghere       (const lldb::SBProcess &, const lldb::SBEvent &, FILE *, FILE *), process,
533baf5664fSJonas Devlieghere       event, out, err);
534baf5664fSJonas Devlieghere 
535322f12afSLawrence D'Anna   FileSP outfile = std::make_shared<NativeFile>(out, false);
536322f12afSLawrence D'Anna   FileSP errfile = std::make_shared<NativeFile>(err, false);
537322f12afSLawrence D'Anna   return HandleProcessEvent(process, event, outfile, errfile);
538322f12afSLawrence D'Anna }
539322f12afSLawrence D'Anna 
540322f12afSLawrence D'Anna void SBDebugger::HandleProcessEvent(const SBProcess &process,
541322f12afSLawrence D'Anna                                     const SBEvent &event, FileSP out_sp,
542322f12afSLawrence D'Anna                                     FileSP err_sp) {
543322f12afSLawrence D'Anna 
544322f12afSLawrence D'Anna   LLDB_RECORD_METHOD(
545322f12afSLawrence D'Anna       void, SBDebugger, HandleProcessEvent,
546322f12afSLawrence D'Anna       (const lldb::SBProcess &, const lldb::SBEvent &, FileSP, FileSP), process,
547322f12afSLawrence D'Anna       event, out_sp, err_sp);
548322f12afSLawrence D'Anna 
549af67cecdSGreg Clayton   if (!process.IsValid())
550af67cecdSGreg Clayton     return;
551af67cecdSGreg Clayton 
552b9556accSGreg Clayton   TargetSP target_sp(process.GetTarget().GetSP());
553b9556accSGreg Clayton   if (!target_sp)
554b9556accSGreg Clayton     return;
555b9556accSGreg Clayton 
55630fdc8d8SChris Lattner   const uint32_t event_type = event.GetType();
55730fdc8d8SChris Lattner   char stdio_buffer[1024];
55830fdc8d8SChris Lattner   size_t len;
55930fdc8d8SChris Lattner 
560bb19a13cSSaleem Abdulrasool   std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
561af67cecdSGreg Clayton 
562b9c1b51eSKate Stone   if (event_type &
563b9c1b51eSKate Stone       (Process::eBroadcastBitSTDOUT | Process::eBroadcastBitStateChanged)) {
564af67cecdSGreg Clayton     // Drain stdout when we stop just in case we have any bytes
56530fdc8d8SChris Lattner     while ((len = process.GetSTDOUT(stdio_buffer, sizeof(stdio_buffer))) > 0)
566322f12afSLawrence D'Anna       if (out_sp)
567322f12afSLawrence D'Anna         out_sp->Write(stdio_buffer, len);
56830fdc8d8SChris Lattner   }
569af67cecdSGreg Clayton 
570b9c1b51eSKate Stone   if (event_type &
571b9c1b51eSKate Stone       (Process::eBroadcastBitSTDERR | Process::eBroadcastBitStateChanged)) {
572af67cecdSGreg Clayton     // Drain stderr when we stop just in case we have any bytes
57330fdc8d8SChris Lattner     while ((len = process.GetSTDERR(stdio_buffer, sizeof(stdio_buffer))) > 0)
574322f12afSLawrence D'Anna       if (err_sp)
575322f12afSLawrence D'Anna         err_sp->Write(stdio_buffer, len);
57630fdc8d8SChris Lattner   }
577af67cecdSGreg Clayton 
578b9c1b51eSKate Stone   if (event_type & Process::eBroadcastBitStateChanged) {
57930fdc8d8SChris Lattner     StateType event_state = SBProcess::GetStateFromEvent(event);
58030fdc8d8SChris Lattner 
58130fdc8d8SChris Lattner     if (event_state == eStateInvalid)
58230fdc8d8SChris Lattner       return;
58330fdc8d8SChris Lattner 
58430fdc8d8SChris Lattner     bool is_stopped = StateIsStoppedState(event_state);
58530fdc8d8SChris Lattner     if (!is_stopped)
586322f12afSLawrence D'Anna       process.ReportEventState(event, out_sp);
58730fdc8d8SChris Lattner   }
58830fdc8d8SChris Lattner }
58930fdc8d8SChris Lattner 
590b9c1b51eSKate Stone SBSourceManager SBDebugger::GetSourceManager() {
591baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::SBSourceManager, SBDebugger,
592baf5664fSJonas Devlieghere                              GetSourceManager);
593baf5664fSJonas Devlieghere 
594e37d605eSJim Ingham   SBSourceManager sb_source_manager(*this);
595baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_source_manager);
59630fdc8d8SChris Lattner }
59730fdc8d8SChris Lattner 
598b9c1b51eSKate Stone bool SBDebugger::GetDefaultArchitecture(char *arch_name, size_t arch_name_len) {
599baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD(bool, SBDebugger, GetDefaultArchitecture,
600baf5664fSJonas Devlieghere                             (char *, size_t), "", arch_name_len);
601baf5664fSJonas Devlieghere 
602b9c1b51eSKate Stone   if (arch_name && arch_name_len) {
603431ce678SGreg Clayton     ArchSpec default_arch = Target::GetDefaultArchitecture();
604daccaa9eSCaroline Tice 
605b9c1b51eSKate Stone     if (default_arch.IsValid()) {
606431ce678SGreg Clayton       const std::string &triple_str = default_arch.GetTriple().str();
607431ce678SGreg Clayton       if (!triple_str.empty())
608431ce678SGreg Clayton         ::snprintf(arch_name, arch_name_len, "%s", triple_str.c_str());
609431ce678SGreg Clayton       else
610b9c1b51eSKate Stone         ::snprintf(arch_name, arch_name_len, "%s",
611b9c1b51eSKate Stone                    default_arch.GetArchitectureName());
61230fdc8d8SChris Lattner       return true;
61330fdc8d8SChris Lattner     }
61430fdc8d8SChris Lattner   }
61530fdc8d8SChris Lattner   if (arch_name && arch_name_len)
61630fdc8d8SChris Lattner     arch_name[0] = '\0';
61730fdc8d8SChris Lattner   return false;
61830fdc8d8SChris Lattner }
61930fdc8d8SChris Lattner 
620b9c1b51eSKate Stone bool SBDebugger::SetDefaultArchitecture(const char *arch_name) {
621baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD(bool, SBDebugger, SetDefaultArchitecture,
622baf5664fSJonas Devlieghere                             (const char *), arch_name);
623baf5664fSJonas Devlieghere 
624b9c1b51eSKate Stone   if (arch_name) {
62570512317SGreg Clayton     ArchSpec arch(arch_name);
626b9c1b51eSKate Stone     if (arch.IsValid()) {
627431ce678SGreg Clayton       Target::SetDefaultArchitecture(arch);
62830fdc8d8SChris Lattner       return true;
62930fdc8d8SChris Lattner     }
63030fdc8d8SChris Lattner   }
63130fdc8d8SChris Lattner   return false;
63230fdc8d8SChris Lattner }
63330fdc8d8SChris Lattner 
63430fdc8d8SChris Lattner ScriptLanguage
635b9c1b51eSKate Stone SBDebugger::GetScriptingLanguage(const char *script_language_name) {
636baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::ScriptLanguage, SBDebugger, GetScriptingLanguage,
637baf5664fSJonas Devlieghere                      (const char *), script_language_name);
638baf5664fSJonas Devlieghere 
639d9aec34bSJonas Devlieghere   if (!script_language_name)
640d9aec34bSJonas Devlieghere     return eScriptLanguageDefault;
64147cbf4a0SPavel Labath   return OptionArgParser::ToScriptLanguage(
64247cbf4a0SPavel Labath       llvm::StringRef(script_language_name), eScriptLanguageDefault, nullptr);
64330fdc8d8SChris Lattner }
64430fdc8d8SChris Lattner 
645b9c1b51eSKate Stone const char *SBDebugger::GetVersionString() {
646baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD_NO_ARGS(const char *, SBDebugger, GetVersionString);
647baf5664fSJonas Devlieghere 
648b2f1fb29SVirgile Bello   return lldb_private::GetVersion();
64930fdc8d8SChris Lattner }
65030fdc8d8SChris Lattner 
651b9c1b51eSKate Stone const char *SBDebugger::StateAsCString(StateType state) {
652baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD(const char *, SBDebugger, StateAsCString,
653baf5664fSJonas Devlieghere                             (lldb::StateType), state);
654baf5664fSJonas Devlieghere 
655c2bbb49aSCaroline Tice   return lldb_private::StateAsCString(state);
65630fdc8d8SChris Lattner }
65730fdc8d8SChris Lattner 
658f1389e92SPavel Labath static void AddBoolConfigEntry(StructuredData::Dictionary &dict,
659f1389e92SPavel Labath                                llvm::StringRef name, bool value,
660f1389e92SPavel Labath                                llvm::StringRef description) {
661a8f3ae7cSJonas Devlieghere   auto entry_up = std::make_unique<StructuredData::Dictionary>();
662f1389e92SPavel Labath   entry_up->AddBooleanItem("value", value);
663f1389e92SPavel Labath   entry_up->AddStringItem("description", description);
664f1389e92SPavel Labath   dict.AddItem(name, std::move(entry_up));
665f1389e92SPavel Labath }
666f1389e92SPavel Labath 
667abc0c6adSPavel Labath static void AddLLVMTargets(StructuredData::Dictionary &dict) {
668a8f3ae7cSJonas Devlieghere   auto array_up = std::make_unique<StructuredData::Array>();
669abc0c6adSPavel Labath #define LLVM_TARGET(target)                                                    \
670a8f3ae7cSJonas Devlieghere   array_up->AddItem(std::make_unique<StructuredData::String>(#target));
671abc0c6adSPavel Labath #include "llvm/Config/Targets.def"
672a8f3ae7cSJonas Devlieghere   auto entry_up = std::make_unique<StructuredData::Dictionary>();
673abc0c6adSPavel Labath   entry_up->AddItem("value", std::move(array_up));
674abc0c6adSPavel Labath   entry_up->AddStringItem("description", "A list of configured LLVM targets.");
675abc0c6adSPavel Labath   dict.AddItem("targets", std::move(entry_up));
676abc0c6adSPavel Labath }
677abc0c6adSPavel Labath 
678f1389e92SPavel Labath SBStructuredData SBDebugger::GetBuildConfiguration() {
679baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD_NO_ARGS(lldb::SBStructuredData, SBDebugger,
680baf5664fSJonas Devlieghere                                     GetBuildConfiguration);
681baf5664fSJonas Devlieghere 
682a8f3ae7cSJonas Devlieghere   auto config_up = std::make_unique<StructuredData::Dictionary>();
683f1389e92SPavel Labath   AddBoolConfigEntry(
684f1389e92SPavel Labath       *config_up, "xml", XMLDocument::XMLEnabled(),
685f1389e92SPavel Labath       "A boolean value that indicates if XML support is enabled in LLDB");
686eafede2aSPavel Labath   bool have_curses = true;
687eafede2aSPavel Labath #ifdef LLDB_DISABLE_CURSES
688eafede2aSPavel Labath   have_curses = false;
689eafede2aSPavel Labath #endif
690eafede2aSPavel Labath   AddBoolConfigEntry(
691eafede2aSPavel Labath       *config_up, "curses", have_curses,
692eafede2aSPavel Labath       "A boolean value that indicates if curses support is enabled in LLDB");
693abc0c6adSPavel Labath   AddLLVMTargets(*config_up);
694f1389e92SPavel Labath 
695f1389e92SPavel Labath   SBStructuredData data;
696f1389e92SPavel Labath   data.m_impl_up->SetObjectSP(std::move(config_up));
697baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(data);
698f1389e92SPavel Labath }
699f1389e92SPavel Labath 
700b9c1b51eSKate Stone bool SBDebugger::StateIsRunningState(StateType state) {
701baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD(bool, SBDebugger, StateIsRunningState,
702baf5664fSJonas Devlieghere                             (lldb::StateType), state);
703baf5664fSJonas Devlieghere 
704c2bbb49aSCaroline Tice   const bool result = lldb_private::StateIsRunningState(state);
7054838131bSGreg Clayton 
7064838131bSGreg Clayton   return result;
70730fdc8d8SChris Lattner }
70830fdc8d8SChris Lattner 
709b9c1b51eSKate Stone bool SBDebugger::StateIsStoppedState(StateType state) {
710baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD(bool, SBDebugger, StateIsStoppedState,
711baf5664fSJonas Devlieghere                             (lldb::StateType), state);
712baf5664fSJonas Devlieghere 
7132637f825SGreg Clayton   const bool result = lldb_private::StateIsStoppedState(state, false);
714ceb6b139SCaroline Tice 
7154838131bSGreg Clayton   return result;
71630fdc8d8SChris Lattner }
71730fdc8d8SChris Lattner 
718b9c1b51eSKate Stone lldb::SBTarget SBDebugger::CreateTarget(const char *filename,
719cac9c5f9SGreg Clayton                                         const char *target_triple,
720cac9c5f9SGreg Clayton                                         const char *platform_name,
721cac9c5f9SGreg Clayton                                         bool add_dependent_modules,
722b9c1b51eSKate Stone                                         lldb::SBError &sb_error) {
723baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(
724baf5664fSJonas Devlieghere       lldb::SBTarget, SBDebugger, CreateTarget,
725baf5664fSJonas Devlieghere       (const char *, const char *, const char *, bool, lldb::SBError &),
726baf5664fSJonas Devlieghere       filename, target_triple, platform_name, add_dependent_modules, sb_error);
727baf5664fSJonas Devlieghere 
728cac9c5f9SGreg Clayton   SBTarget sb_target;
729b9556accSGreg Clayton   TargetSP target_sp;
730b9c1b51eSKate Stone   if (m_opaque_sp) {
731cac9c5f9SGreg Clayton     sb_error.Clear();
732cac9c5f9SGreg Clayton     OptionGroupPlatform platform_options(false);
733cac9c5f9SGreg Clayton     platform_options.SetPlatformName(platform_name);
734cac9c5f9SGreg Clayton 
735b9c1b51eSKate Stone     sb_error.ref() = m_opaque_sp->GetTargetList().CreateTarget(
736f9a07e9fSJonas Devlieghere         *m_opaque_sp, filename, target_triple,
737f9a07e9fSJonas Devlieghere         add_dependent_modules ? eLoadDependentsYes : eLoadDependentsNo,
738b9c1b51eSKate Stone         &platform_options, target_sp);
739cac9c5f9SGreg Clayton 
740cac9c5f9SGreg Clayton     if (sb_error.Success())
741b9556accSGreg Clayton       sb_target.SetSP(target_sp);
742b9c1b51eSKate Stone   } else {
7439f521f22SJim Ingham     sb_error.SetErrorString("invalid debugger");
744cac9c5f9SGreg Clayton   }
745cac9c5f9SGreg Clayton 
7465160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
74763e5fb76SJonas Devlieghere   LLDB_LOGF(log,
74863e5fb76SJonas Devlieghere             "SBDebugger(%p)::CreateTarget (filename=\"%s\", triple=%s, "
749b9c1b51eSKate Stone             "platform_name=%s, add_dependent_modules=%u, error=%s) => "
750b9c1b51eSKate Stone             "SBTarget(%p)",
751b9c1b51eSKate Stone             static_cast<void *>(m_opaque_sp.get()), filename, target_triple,
752b9c1b51eSKate Stone             platform_name, add_dependent_modules, sb_error.GetCString(),
753b9c1b51eSKate Stone             static_cast<void *>(target_sp.get()));
754cac9c5f9SGreg Clayton 
755baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_target);
756cac9c5f9SGreg Clayton }
75730fdc8d8SChris Lattner 
75830fdc8d8SChris Lattner SBTarget
75930fdc8d8SChris Lattner SBDebugger::CreateTargetWithFileAndTargetTriple(const char *filename,
760b9c1b51eSKate Stone                                                 const char *target_triple) {
761baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTarget, SBDebugger,
762baf5664fSJonas Devlieghere                      CreateTargetWithFileAndTargetTriple,
763baf5664fSJonas Devlieghere                      (const char *, const char *), filename, target_triple);
764baf5664fSJonas Devlieghere 
765b9556accSGreg Clayton   SBTarget sb_target;
766b9556accSGreg Clayton   TargetSP target_sp;
767b9c1b51eSKate Stone   if (m_opaque_sp) {
768cac9c5f9SGreg Clayton     const bool add_dependent_modules = true;
76997206d57SZachary Turner     Status error(m_opaque_sp->GetTargetList().CreateTarget(
770f9a07e9fSJonas Devlieghere         *m_opaque_sp, filename, target_triple,
771f9a07e9fSJonas Devlieghere         add_dependent_modules ? eLoadDependentsYes : eLoadDependentsNo, nullptr,
772cac9c5f9SGreg Clayton         target_sp));
773b9556accSGreg Clayton     sb_target.SetSP(target_sp);
7746611103cSGreg Clayton   }
7754838131bSGreg Clayton 
7765160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
77763e5fb76SJonas Devlieghere   LLDB_LOGF(log,
77863e5fb76SJonas Devlieghere             "SBDebugger(%p)::CreateTargetWithFileAndTargetTriple "
779b9c1b51eSKate Stone             "(filename=\"%s\", triple=%s) => SBTarget(%p)",
780b9c1b51eSKate Stone             static_cast<void *>(m_opaque_sp.get()), filename, target_triple,
781b9c1b51eSKate Stone             static_cast<void *>(target_sp.get()));
7824838131bSGreg Clayton 
783baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_target);
78430fdc8d8SChris Lattner }
78530fdc8d8SChris Lattner 
786b9c1b51eSKate Stone SBTarget SBDebugger::CreateTargetWithFileAndArch(const char *filename,
787b9c1b51eSKate Stone                                                  const char *arch_cstr) {
788baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTarget, SBDebugger, CreateTargetWithFileAndArch,
789baf5664fSJonas Devlieghere                      (const char *, const char *), filename, arch_cstr);
790baf5664fSJonas Devlieghere 
7915160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
792ceb6b139SCaroline Tice 
793b9556accSGreg Clayton   SBTarget sb_target;
794b9556accSGreg Clayton   TargetSP target_sp;
795b9c1b51eSKate Stone   if (m_opaque_sp) {
79697206d57SZachary Turner     Status error;
797cac9c5f9SGreg Clayton     const bool add_dependent_modules = true;
79830fdc8d8SChris Lattner 
799b9c1b51eSKate Stone     error = m_opaque_sp->GetTargetList().CreateTarget(
800f9a07e9fSJonas Devlieghere         *m_opaque_sp, filename, arch_cstr,
801f9a07e9fSJonas Devlieghere         add_dependent_modules ? eLoadDependentsYes : eLoadDependentsNo, nullptr,
802cac9c5f9SGreg Clayton         target_sp);
80330fdc8d8SChris Lattner 
804b9c1b51eSKate Stone     if (error.Success()) {
8052976d00aSJim Ingham       m_opaque_sp->GetTargetList().SetSelectedTarget(target_sp.get());
806b9556accSGreg Clayton       sb_target.SetSP(target_sp);
8076611103cSGreg Clayton     }
8086611103cSGreg Clayton   }
809ceb6b139SCaroline Tice 
81063e5fb76SJonas Devlieghere   LLDB_LOGF(log,
81163e5fb76SJonas Devlieghere             "SBDebugger(%p)::CreateTargetWithFileAndArch (filename=\"%s\", "
812b9c1b51eSKate Stone             "arch=%s) => SBTarget(%p)",
813324a1036SSaleem Abdulrasool             static_cast<void *>(m_opaque_sp.get()), filename, arch_cstr,
814324a1036SSaleem Abdulrasool             static_cast<void *>(target_sp.get()));
815ceb6b139SCaroline Tice 
816baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_target);
81730fdc8d8SChris Lattner }
81830fdc8d8SChris Lattner 
819b9c1b51eSKate Stone SBTarget SBDebugger::CreateTarget(const char *filename) {
820baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTarget, SBDebugger, CreateTarget, (const char *),
821baf5664fSJonas Devlieghere                      filename);
822baf5664fSJonas Devlieghere 
823b9556accSGreg Clayton   SBTarget sb_target;
824b9556accSGreg Clayton   TargetSP target_sp;
825b9c1b51eSKate Stone   if (m_opaque_sp) {
82697206d57SZachary Turner     Status error;
827cac9c5f9SGreg Clayton     const bool add_dependent_modules = true;
828b9c1b51eSKate Stone     error = m_opaque_sp->GetTargetList().CreateTarget(
829f9a07e9fSJonas Devlieghere         *m_opaque_sp, filename, "",
830f9a07e9fSJonas Devlieghere         add_dependent_modules ? eLoadDependentsYes : eLoadDependentsNo, nullptr,
831f9a07e9fSJonas Devlieghere         target_sp);
83230fdc8d8SChris Lattner 
833b9c1b51eSKate Stone     if (error.Success()) {
8342976d00aSJim Ingham       m_opaque_sp->GetTargetList().SetSelectedTarget(target_sp.get());
835b9556accSGreg Clayton       sb_target.SetSP(target_sp);
8366611103cSGreg Clayton     }
8376611103cSGreg Clayton   }
8385160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
83963e5fb76SJonas Devlieghere   LLDB_LOGF(log,
840b9c1b51eSKate Stone             "SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)",
841324a1036SSaleem Abdulrasool             static_cast<void *>(m_opaque_sp.get()), filename,
842324a1036SSaleem Abdulrasool             static_cast<void *>(target_sp.get()));
843baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_target);
84430fdc8d8SChris Lattner }
84530fdc8d8SChris Lattner 
846b842f2ecSJim Ingham SBTarget SBDebugger::GetDummyTarget() {
847baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::SBTarget, SBDebugger, GetDummyTarget);
848baf5664fSJonas Devlieghere 
849b842f2ecSJim Ingham   SBTarget sb_target;
850b842f2ecSJim Ingham   if (m_opaque_sp) {
851b842f2ecSJim Ingham     sb_target.SetSP(m_opaque_sp->GetDummyTarget()->shared_from_this());
852b842f2ecSJim Ingham   }
853b842f2ecSJim Ingham   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
85463e5fb76SJonas Devlieghere   LLDB_LOGF(log, "SBDebugger(%p)::GetDummyTarget() => SBTarget(%p)",
855b842f2ecSJim Ingham             static_cast<void *>(m_opaque_sp.get()),
856b842f2ecSJim Ingham             static_cast<void *>(sb_target.GetSP().get()));
857baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_target);
858b842f2ecSJim Ingham }
859b842f2ecSJim Ingham 
860b9c1b51eSKate Stone bool SBDebugger::DeleteTarget(lldb::SBTarget &target) {
861baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBDebugger, DeleteTarget, (lldb::SBTarget &),
862baf5664fSJonas Devlieghere                      target);
863baf5664fSJonas Devlieghere 
8643794ad95SJohnny Chen   bool result = false;
865b9c1b51eSKate Stone   if (m_opaque_sp) {
866b9556accSGreg Clayton     TargetSP target_sp(target.GetSP());
867b9c1b51eSKate Stone     if (target_sp) {
8683794ad95SJohnny Chen       // No need to lock, the target list is thread safe
869b9556accSGreg Clayton       result = m_opaque_sp->GetTargetList().DeleteTarget(target_sp);
870b9556accSGreg Clayton       target_sp->Destroy();
87175340622SGreg Clayton       target.Clear();
8720cd70866SGreg Clayton       const bool mandatory = true;
8730cd70866SGreg Clayton       ModuleList::RemoveOrphanSharedModules(mandatory);
8743794ad95SJohnny Chen     }
875b9556accSGreg Clayton   }
8763794ad95SJohnny Chen 
8775160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
87863e5fb76SJonas Devlieghere   LLDB_LOGF(log, "SBDebugger(%p)::DeleteTarget (SBTarget(%p)) => %i",
879324a1036SSaleem Abdulrasool             static_cast<void *>(m_opaque_sp.get()),
880324a1036SSaleem Abdulrasool             static_cast<void *>(target.m_opaque_sp.get()), result);
8813794ad95SJohnny Chen 
8823794ad95SJohnny Chen   return result;
8833794ad95SJohnny Chen }
884dbb0abbfSEugene Zelenko 
885b9c1b51eSKate Stone SBTarget SBDebugger::GetTargetAtIndex(uint32_t idx) {
886baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTarget, SBDebugger, GetTargetAtIndex, (uint32_t),
887baf5664fSJonas Devlieghere                      idx);
888baf5664fSJonas Devlieghere 
8896611103cSGreg Clayton   SBTarget sb_target;
890b9c1b51eSKate Stone   if (m_opaque_sp) {
891af67cecdSGreg Clayton     // No need to lock, the target list is thread safe
892b9556accSGreg Clayton     sb_target.SetSP(m_opaque_sp->GetTargetList().GetTargetAtIndex(idx));
893af67cecdSGreg Clayton   }
894baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_target);
89530fdc8d8SChris Lattner }
89630fdc8d8SChris Lattner 
897b9c1b51eSKate Stone uint32_t SBDebugger::GetIndexOfTarget(lldb::SBTarget target) {
898baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(uint32_t, SBDebugger, GetIndexOfTarget, (lldb::SBTarget),
899baf5664fSJonas Devlieghere                      target);
9008499e1a4SJim Ingham 
9018499e1a4SJim Ingham   lldb::TargetSP target_sp = target.GetSP();
9028499e1a4SJim Ingham   if (!target_sp)
9038499e1a4SJim Ingham     return UINT32_MAX;
9048499e1a4SJim Ingham 
9058499e1a4SJim Ingham   if (!m_opaque_sp)
9068499e1a4SJim Ingham     return UINT32_MAX;
9078499e1a4SJim Ingham 
9088499e1a4SJim Ingham   return m_opaque_sp->GetTargetList().GetIndexOfTarget(target.GetSP());
9098499e1a4SJim Ingham }
9108499e1a4SJim Ingham 
911b9c1b51eSKate Stone SBTarget SBDebugger::FindTargetWithProcessID(lldb::pid_t pid) {
912baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTarget, SBDebugger, FindTargetWithProcessID,
913baf5664fSJonas Devlieghere                      (lldb::pid_t), pid);
914baf5664fSJonas Devlieghere 
9156611103cSGreg Clayton   SBTarget sb_target;
916b9c1b51eSKate Stone   if (m_opaque_sp) {
917af67cecdSGreg Clayton     // No need to lock, the target list is thread safe
918b9556accSGreg Clayton     sb_target.SetSP(m_opaque_sp->GetTargetList().FindTargetWithProcessID(pid));
919af67cecdSGreg Clayton   }
920baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_target);
92130fdc8d8SChris Lattner }
92230fdc8d8SChris Lattner 
923b9c1b51eSKate Stone SBTarget SBDebugger::FindTargetWithFileAndArch(const char *filename,
924b9c1b51eSKate Stone                                                const char *arch_name) {
925baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTarget, SBDebugger, FindTargetWithFileAndArch,
926baf5664fSJonas Devlieghere                      (const char *, const char *), filename, arch_name);
927baf5664fSJonas Devlieghere 
9286611103cSGreg Clayton   SBTarget sb_target;
929b9c1b51eSKate Stone   if (m_opaque_sp && filename && filename[0]) {
930af67cecdSGreg Clayton     // No need to lock, the target list is thread safe
9317263f1bdSPavel Labath     ArchSpec arch = Platform::GetAugmentedArchSpec(
9327263f1bdSPavel Labath         m_opaque_sp->GetPlatformList().GetSelectedPlatform().get(), arch_name);
933b9c1b51eSKate Stone     TargetSP target_sp(
934b9c1b51eSKate Stone         m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture(
9358f3be7a3SJonas Devlieghere             FileSpec(filename), arch_name ? &arch : nullptr));
936b9556accSGreg Clayton     sb_target.SetSP(target_sp);
9376611103cSGreg Clayton   }
938baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_target);
93930fdc8d8SChris Lattner }
94030fdc8d8SChris Lattner 
941b9c1b51eSKate Stone SBTarget SBDebugger::FindTargetWithLLDBProcess(const ProcessSP &process_sp) {
9426611103cSGreg Clayton   SBTarget sb_target;
943b9c1b51eSKate Stone   if (m_opaque_sp) {
944af67cecdSGreg Clayton     // No need to lock, the target list is thread safe
945b9c1b51eSKate Stone     sb_target.SetSP(
946b9c1b51eSKate Stone         m_opaque_sp->GetTargetList().FindTargetWithProcess(process_sp.get()));
947af67cecdSGreg Clayton   }
94830fdc8d8SChris Lattner   return sb_target;
94930fdc8d8SChris Lattner }
95030fdc8d8SChris Lattner 
951b9c1b51eSKate Stone uint32_t SBDebugger::GetNumTargets() {
952baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBDebugger, GetNumTargets);
953baf5664fSJonas Devlieghere 
954b9c1b51eSKate Stone   if (m_opaque_sp) {
955af67cecdSGreg Clayton     // No need to lock, the target list is thread safe
9566611103cSGreg Clayton     return m_opaque_sp->GetTargetList().GetNumTargets();
957af67cecdSGreg Clayton   }
9586611103cSGreg Clayton   return 0;
9596611103cSGreg Clayton }
96030fdc8d8SChris Lattner 
961b9c1b51eSKate Stone SBTarget SBDebugger::GetSelectedTarget() {
962baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::SBTarget, SBDebugger, GetSelectedTarget);
963baf5664fSJonas Devlieghere 
9645160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
965ceb6b139SCaroline Tice 
9666611103cSGreg Clayton   SBTarget sb_target;
967b9556accSGreg Clayton   TargetSP target_sp;
968b9c1b51eSKate Stone   if (m_opaque_sp) {
969af67cecdSGreg Clayton     // No need to lock, the target list is thread safe
970b9556accSGreg Clayton     target_sp = m_opaque_sp->GetTargetList().GetSelectedTarget();
971b9556accSGreg Clayton     sb_target.SetSP(target_sp);
972af67cecdSGreg Clayton   }
973ceb6b139SCaroline Tice 
974b9c1b51eSKate Stone   if (log) {
975ceb6b139SCaroline Tice     SBStream sstr;
976431ce678SGreg Clayton     sb_target.GetDescription(sstr, eDescriptionLevelBrief);
97763e5fb76SJonas Devlieghere     LLDB_LOGF(log, "SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s",
978324a1036SSaleem Abdulrasool               static_cast<void *>(m_opaque_sp.get()),
979324a1036SSaleem Abdulrasool               static_cast<void *>(target_sp.get()), sstr.GetData());
980ceb6b139SCaroline Tice   }
981ceb6b139SCaroline Tice 
982baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_target);
98330fdc8d8SChris Lattner }
98430fdc8d8SChris Lattner 
985b9c1b51eSKate Stone void SBDebugger::SetSelectedTarget(SBTarget &sb_target) {
986baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBDebugger, SetSelectedTarget, (lldb::SBTarget &),
987baf5664fSJonas Devlieghere                      sb_target);
988baf5664fSJonas Devlieghere 
9895160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
990e64f0dc7SJim Ingham 
991b9556accSGreg Clayton   TargetSP target_sp(sb_target.GetSP());
992b9c1b51eSKate Stone   if (m_opaque_sp) {
993b9556accSGreg Clayton     m_opaque_sp->GetTargetList().SetSelectedTarget(target_sp.get());
994e64f0dc7SJim Ingham   }
995b9c1b51eSKate Stone   if (log) {
996e64f0dc7SJim Ingham     SBStream sstr;
997e64f0dc7SJim Ingham     sb_target.GetDescription(sstr, eDescriptionLevelBrief);
99863e5fb76SJonas Devlieghere     LLDB_LOGF(log, "SBDebugger(%p)::SetSelectedTarget () => SBTarget(%p): %s",
999324a1036SSaleem Abdulrasool               static_cast<void *>(m_opaque_sp.get()),
1000324a1036SSaleem Abdulrasool               static_cast<void *>(target_sp.get()), sstr.GetData());
1001e64f0dc7SJim Ingham   }
1002e64f0dc7SJim Ingham }
1003e64f0dc7SJim Ingham 
1004b9c1b51eSKate Stone SBPlatform SBDebugger::GetSelectedPlatform() {
1005baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::SBPlatform, SBDebugger, GetSelectedPlatform);
1006baf5664fSJonas Devlieghere 
1007fbb76349SGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1008fbb76349SGreg Clayton 
1009fbb76349SGreg Clayton   SBPlatform sb_platform;
1010fbb76349SGreg Clayton   DebuggerSP debugger_sp(m_opaque_sp);
1011b9c1b51eSKate Stone   if (debugger_sp) {
1012fbb76349SGreg Clayton     sb_platform.SetSP(debugger_sp->GetPlatformList().GetSelectedPlatform());
1013fbb76349SGreg Clayton   }
101463e5fb76SJonas Devlieghere   LLDB_LOGF(log, "SBDebugger(%p)::GetSelectedPlatform () => SBPlatform(%p): %s",
1015324a1036SSaleem Abdulrasool             static_cast<void *>(m_opaque_sp.get()),
1016324a1036SSaleem Abdulrasool             static_cast<void *>(sb_platform.GetSP().get()),
1017324a1036SSaleem Abdulrasool             sb_platform.GetName());
1018baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_platform);
1019fbb76349SGreg Clayton }
1020fbb76349SGreg Clayton 
1021b9c1b51eSKate Stone void SBDebugger::SetSelectedPlatform(SBPlatform &sb_platform) {
1022baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBDebugger, SetSelectedPlatform,
1023baf5664fSJonas Devlieghere                      (lldb::SBPlatform &), sb_platform);
1024baf5664fSJonas Devlieghere 
1025fbb76349SGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1026fbb76349SGreg Clayton 
1027fbb76349SGreg Clayton   DebuggerSP debugger_sp(m_opaque_sp);
1028b9c1b51eSKate Stone   if (debugger_sp) {
1029fbb76349SGreg Clayton     debugger_sp->GetPlatformList().SetSelectedPlatform(sb_platform.GetSP());
1030fbb76349SGreg Clayton   }
1031324a1036SSaleem Abdulrasool 
103263e5fb76SJonas Devlieghere   LLDB_LOGF(log, "SBDebugger(%p)::SetSelectedPlatform (SBPlatform(%p) %s)",
1033324a1036SSaleem Abdulrasool             static_cast<void *>(m_opaque_sp.get()),
1034324a1036SSaleem Abdulrasool             static_cast<void *>(sb_platform.GetSP().get()),
1035324a1036SSaleem Abdulrasool             sb_platform.GetName());
1036fbb76349SGreg Clayton }
1037fbb76349SGreg Clayton 
1038c10e34d0SVadim Macagon uint32_t SBDebugger::GetNumPlatforms() {
1039baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBDebugger, GetNumPlatforms);
1040baf5664fSJonas Devlieghere 
1041c10e34d0SVadim Macagon   if (m_opaque_sp) {
1042c10e34d0SVadim Macagon     // No need to lock, the platform list is thread safe
1043c10e34d0SVadim Macagon     return m_opaque_sp->GetPlatformList().GetSize();
1044c10e34d0SVadim Macagon   }
1045c10e34d0SVadim Macagon   return 0;
1046c10e34d0SVadim Macagon }
1047c10e34d0SVadim Macagon 
1048c10e34d0SVadim Macagon SBPlatform SBDebugger::GetPlatformAtIndex(uint32_t idx) {
1049baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBPlatform, SBDebugger, GetPlatformAtIndex,
1050baf5664fSJonas Devlieghere                      (uint32_t), idx);
1051baf5664fSJonas Devlieghere 
1052c10e34d0SVadim Macagon   SBPlatform sb_platform;
1053c10e34d0SVadim Macagon   if (m_opaque_sp) {
1054c10e34d0SVadim Macagon     // No need to lock, the platform list is thread safe
1055c10e34d0SVadim Macagon     sb_platform.SetSP(m_opaque_sp->GetPlatformList().GetAtIndex(idx));
1056c10e34d0SVadim Macagon   }
1057baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_platform);
1058c10e34d0SVadim Macagon }
1059c10e34d0SVadim Macagon 
1060c10e34d0SVadim Macagon uint32_t SBDebugger::GetNumAvailablePlatforms() {
1061baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBDebugger, GetNumAvailablePlatforms);
1062baf5664fSJonas Devlieghere 
1063c10e34d0SVadim Macagon   uint32_t idx = 0;
1064c10e34d0SVadim Macagon   while (true) {
1065c10e34d0SVadim Macagon     if (!PluginManager::GetPlatformPluginNameAtIndex(idx)) {
1066c10e34d0SVadim Macagon       break;
1067c10e34d0SVadim Macagon     }
1068c10e34d0SVadim Macagon     ++idx;
1069c10e34d0SVadim Macagon   }
1070c10e34d0SVadim Macagon   // +1 for the host platform, which should always appear first in the list.
1071c10e34d0SVadim Macagon   return idx + 1;
1072c10e34d0SVadim Macagon }
1073c10e34d0SVadim Macagon 
1074c10e34d0SVadim Macagon SBStructuredData SBDebugger::GetAvailablePlatformInfoAtIndex(uint32_t idx) {
1075baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBStructuredData, SBDebugger,
1076baf5664fSJonas Devlieghere                      GetAvailablePlatformInfoAtIndex, (uint32_t), idx);
1077baf5664fSJonas Devlieghere 
1078c10e34d0SVadim Macagon   SBStructuredData data;
1079a8f3ae7cSJonas Devlieghere   auto platform_dict = std::make_unique<StructuredData::Dictionary>();
1080c10e34d0SVadim Macagon   llvm::StringRef name_str("name"), desc_str("description");
1081c10e34d0SVadim Macagon 
1082c10e34d0SVadim Macagon   if (idx == 0) {
1083c10e34d0SVadim Macagon     PlatformSP host_platform_sp(Platform::GetHostPlatform());
1084c10e34d0SVadim Macagon     platform_dict->AddStringItem(
1085c10e34d0SVadim Macagon         name_str, host_platform_sp->GetPluginName().GetStringRef());
1086c10e34d0SVadim Macagon     platform_dict->AddStringItem(
1087c10e34d0SVadim Macagon         desc_str, llvm::StringRef(host_platform_sp->GetDescription()));
1088c10e34d0SVadim Macagon   } else if (idx > 0) {
1089c10e34d0SVadim Macagon     const char *plugin_name =
1090c10e34d0SVadim Macagon         PluginManager::GetPlatformPluginNameAtIndex(idx - 1);
1091c10e34d0SVadim Macagon     if (!plugin_name) {
1092baf5664fSJonas Devlieghere       return LLDB_RECORD_RESULT(data);
1093c10e34d0SVadim Macagon     }
1094c10e34d0SVadim Macagon     platform_dict->AddStringItem(name_str, llvm::StringRef(plugin_name));
1095c10e34d0SVadim Macagon 
1096c10e34d0SVadim Macagon     const char *plugin_desc =
1097c10e34d0SVadim Macagon         PluginManager::GetPlatformPluginDescriptionAtIndex(idx - 1);
1098c10e34d0SVadim Macagon     if (!plugin_desc) {
1099baf5664fSJonas Devlieghere       return LLDB_RECORD_RESULT(data);
1100c10e34d0SVadim Macagon     }
1101c10e34d0SVadim Macagon     platform_dict->AddStringItem(desc_str, llvm::StringRef(plugin_desc));
1102c10e34d0SVadim Macagon   }
1103c10e34d0SVadim Macagon 
1104c10e34d0SVadim Macagon   data.m_impl_up->SetObjectSP(
1105c10e34d0SVadim Macagon       StructuredData::ObjectSP(platform_dict.release()));
1106baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(data);
1107c10e34d0SVadim Macagon }
1108c10e34d0SVadim Macagon 
1109b9c1b51eSKate Stone void SBDebugger::DispatchInput(void *baton, const void *data, size_t data_len) {
11100d7b0c96SJonas Devlieghere   LLDB_RECORD_DUMMY(void, SBDebugger, DispatchInput,
11110d7b0c96SJonas Devlieghere                     (void *, const void *, size_t), baton, data, data_len);
11120d7b0c96SJonas Devlieghere 
11136b09d423SEnrico Granata   DispatchInput(data, data_len);
11146b09d423SEnrico Granata }
11156b09d423SEnrico Granata 
1116b9c1b51eSKate Stone void SBDebugger::DispatchInput(const void *data, size_t data_len) {
11170d7b0c96SJonas Devlieghere   LLDB_RECORD_DUMMY(void, SBDebugger, DispatchInput, (const void *, size_t),
11180d7b0c96SJonas Devlieghere                     data, data_len);
11190d7b0c96SJonas Devlieghere 
112044d93782SGreg Clayton   //    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
112144d93782SGreg Clayton   //
112244d93782SGreg Clayton   //    if (log)
112363e5fb76SJonas Devlieghere   //        LLDB_LOGF(log, "SBDebugger(%p)::DispatchInput (data=\"%.*s\",
1124b9c1b51eSKate Stone   //        size_t=%" PRIu64 ")",
112544d93782SGreg Clayton   //                     m_opaque_sp.get(),
112644d93782SGreg Clayton   //                     (int) data_len,
112744d93782SGreg Clayton   //                     (const char *) data,
112844d93782SGreg Clayton   //                     (uint64_t)data_len);
112944d93782SGreg Clayton   //
113044d93782SGreg Clayton   //    if (m_opaque_sp)
113144d93782SGreg Clayton   //        m_opaque_sp->DispatchInput ((const char *) data, data_len);
113230fdc8d8SChris Lattner }
113330fdc8d8SChris Lattner 
1134b9c1b51eSKate Stone void SBDebugger::DispatchInputInterrupt() {
1135b328dcbfSJonas Devlieghere   LLDB_RECORD_DUMMY_NO_ARGS(void, SBDebugger, DispatchInputInterrupt);
1136baf5664fSJonas Devlieghere 
1137efed6131SCaroline Tice   if (m_opaque_sp)
1138efed6131SCaroline Tice     m_opaque_sp->DispatchInputInterrupt();
1139efed6131SCaroline Tice }
1140efed6131SCaroline Tice 
1141b9c1b51eSKate Stone void SBDebugger::DispatchInputEndOfFile() {
1142baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(void, SBDebugger, DispatchInputEndOfFile);
1143baf5664fSJonas Devlieghere 
1144efed6131SCaroline Tice   if (m_opaque_sp)
1145efed6131SCaroline Tice     m_opaque_sp->DispatchInputEndOfFile();
1146efed6131SCaroline Tice }
11479088b068SCaroline Tice 
1148baf5664fSJonas Devlieghere void SBDebugger::PushInputReader(SBInputReader &reader) {
1149baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBDebugger, PushInputReader, (lldb::SBInputReader &),
1150baf5664fSJonas Devlieghere                      reader);
1151baf5664fSJonas Devlieghere }
11526611103cSGreg Clayton 
1153b9c1b51eSKate Stone void SBDebugger::RunCommandInterpreter(bool auto_handle_events,
1154b9c1b51eSKate Stone                                        bool spawn_thread) {
1155baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBDebugger, RunCommandInterpreter, (bool, bool),
1156baf5664fSJonas Devlieghere                      auto_handle_events, spawn_thread);
1157baf5664fSJonas Devlieghere 
1158b9c1b51eSKate Stone   if (m_opaque_sp) {
115926c7bf93SJim Ingham     CommandInterpreterRunOptions options;
116026c7bf93SJim Ingham 
1161b9c1b51eSKate Stone     m_opaque_sp->GetCommandInterpreter().RunCommandInterpreter(
1162b9c1b51eSKate Stone         auto_handle_events, spawn_thread, options);
116326c7bf93SJim Ingham   }
116426c7bf93SJim Ingham }
116526c7bf93SJim Ingham 
1166b9c1b51eSKate Stone void SBDebugger::RunCommandInterpreter(bool auto_handle_events,
116726c7bf93SJim Ingham                                        bool spawn_thread,
116826c7bf93SJim Ingham                                        SBCommandInterpreterRunOptions &options,
1169b9c1b51eSKate Stone                                        int &num_errors, bool &quit_requested,
1170ffc9f1deSJim Ingham                                        bool &stopped_for_crash)
117126c7bf93SJim Ingham 
117226c7bf93SJim Ingham {
1173baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBDebugger, RunCommandInterpreter,
1174baf5664fSJonas Devlieghere                      (bool, bool, lldb::SBCommandInterpreterRunOptions &, int &,
1175baf5664fSJonas Devlieghere                       bool &, bool &),
1176baf5664fSJonas Devlieghere                      auto_handle_events, spawn_thread, options, num_errors,
1177baf5664fSJonas Devlieghere                      quit_requested, stopped_for_crash);
1178baf5664fSJonas Devlieghere 
1179b9c1b51eSKate Stone   if (m_opaque_sp) {
118026c7bf93SJim Ingham     CommandInterpreter &interp = m_opaque_sp->GetCommandInterpreter();
1181b9c1b51eSKate Stone     interp.RunCommandInterpreter(auto_handle_events, spawn_thread,
1182b9c1b51eSKate Stone                                  options.ref());
118326c7bf93SJim Ingham     num_errors = interp.GetNumErrors();
118426c7bf93SJim Ingham     quit_requested = interp.GetQuitRequested();
1185ffc9f1deSJim Ingham     stopped_for_crash = interp.GetStoppedForCrash();
118626c7bf93SJim Ingham   }
1187969ed3d1SCaroline Tice }
1188969ed3d1SCaroline Tice 
1189b9c1b51eSKate Stone SBError SBDebugger::RunREPL(lldb::LanguageType language,
1190b9c1b51eSKate Stone                             const char *repl_options) {
1191baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBError, SBDebugger, RunREPL,
1192baf5664fSJonas Devlieghere                      (lldb::LanguageType, const char *), language,
1193baf5664fSJonas Devlieghere                      repl_options);
1194baf5664fSJonas Devlieghere 
11953e7e915dSSean Callanan   SBError error;
11963e7e915dSSean Callanan   if (m_opaque_sp)
11973e7e915dSSean Callanan     error.ref() = m_opaque_sp->RunREPL(language, repl_options);
11983e7e915dSSean Callanan   else
11993e7e915dSSean Callanan     error.SetErrorString("invalid debugger");
1200baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(error);
12013e7e915dSSean Callanan }
12023e7e915dSSean Callanan 
1203b9c1b51eSKate Stone void SBDebugger::reset(const DebuggerSP &debugger_sp) {
12046611103cSGreg Clayton   m_opaque_sp = debugger_sp;
12056611103cSGreg Clayton }
12066611103cSGreg Clayton 
1207b9c1b51eSKate Stone Debugger *SBDebugger::get() const { return m_opaque_sp.get(); }
12086611103cSGreg Clayton 
1209b9c1b51eSKate Stone Debugger &SBDebugger::ref() const {
12106611103cSGreg Clayton   assert(m_opaque_sp.get());
12116611103cSGreg Clayton   return *m_opaque_sp;
12126611103cSGreg Clayton }
12136611103cSGreg Clayton 
1214b9c1b51eSKate Stone const lldb::DebuggerSP &SBDebugger::get_sp() const { return m_opaque_sp; }
12156611103cSGreg Clayton 
1216b9c1b51eSKate Stone SBDebugger SBDebugger::FindDebuggerWithID(int id) {
1217baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD(lldb::SBDebugger, SBDebugger, FindDebuggerWithID,
1218baf5664fSJonas Devlieghere                             (int), id);
1219baf5664fSJonas Devlieghere 
1220af67cecdSGreg Clayton   // No need to lock, the debugger list is thread safe
1221ebc1bb27SCaroline Tice   SBDebugger sb_debugger;
1222431ce678SGreg Clayton   DebuggerSP debugger_sp = Debugger::FindDebuggerWithID(id);
1223ebc1bb27SCaroline Tice   if (debugger_sp)
1224ebc1bb27SCaroline Tice     sb_debugger.reset(debugger_sp);
1225baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_debugger);
1226ebc1bb27SCaroline Tice }
1227e40e4218SJim Ingham 
1228b9c1b51eSKate Stone const char *SBDebugger::GetInstanceName() {
1229baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(const char *, SBDebugger, GetInstanceName);
1230baf5664fSJonas Devlieghere 
1231dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetInstanceName().AsCString() : nullptr);
1232dd759857SCaroline Tice }
1233dd759857SCaroline Tice 
1234b9c1b51eSKate Stone SBError SBDebugger::SetInternalVariable(const char *var_name, const char *value,
1235b9c1b51eSKate Stone                                         const char *debugger_instance_name) {
1236baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD(lldb::SBError, SBDebugger, SetInternalVariable,
1237baf5664fSJonas Devlieghere                             (const char *, const char *, const char *),
1238baf5664fSJonas Devlieghere                             var_name, value, debugger_instance_name);
1239baf5664fSJonas Devlieghere 
12406920b52bSGreg Clayton   SBError sb_error;
1241b9c1b51eSKate Stone   DebuggerSP debugger_sp(Debugger::FindDebuggerWithInstanceName(
1242b9c1b51eSKate Stone       ConstString(debugger_instance_name)));
124397206d57SZachary Turner   Status error;
1244b9c1b51eSKate Stone   if (debugger_sp) {
1245b9c1b51eSKate Stone     ExecutionContext exe_ctx(
1246b9c1b51eSKate Stone         debugger_sp->GetCommandInterpreter().GetExecutionContext());
1247b9c1b51eSKate Stone     error = debugger_sp->SetPropertyValue(&exe_ctx, eVarSetOperationAssign,
1248b9c1b51eSKate Stone                                           var_name, value);
1249b9c1b51eSKate Stone   } else {
1250b9c1b51eSKate Stone     error.SetErrorStringWithFormat("invalid debugger instance name '%s'",
1251b9c1b51eSKate Stone                                    debugger_instance_name);
12526920b52bSGreg Clayton   }
12536920b52bSGreg Clayton   if (error.Fail())
12546920b52bSGreg Clayton     sb_error.SetError(error);
1255baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_error);
12563df9a8dfSCaroline Tice }
12573df9a8dfSCaroline Tice 
1258431ce678SGreg Clayton SBStringList
1259b9c1b51eSKate Stone SBDebugger::GetInternalVariableValue(const char *var_name,
1260b9c1b51eSKate Stone                                      const char *debugger_instance_name) {
1261baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD(
1262baf5664fSJonas Devlieghere       lldb::SBStringList, SBDebugger, GetInternalVariableValue,
1263baf5664fSJonas Devlieghere       (const char *, const char *), var_name, debugger_instance_name);
1264baf5664fSJonas Devlieghere 
12653df9a8dfSCaroline Tice   SBStringList ret_value;
1266b9c1b51eSKate Stone   DebuggerSP debugger_sp(Debugger::FindDebuggerWithInstanceName(
1267b9c1b51eSKate Stone       ConstString(debugger_instance_name)));
126897206d57SZachary Turner   Status error;
1269b9c1b51eSKate Stone   if (debugger_sp) {
1270b9c1b51eSKate Stone     ExecutionContext exe_ctx(
1271b9c1b51eSKate Stone         debugger_sp->GetCommandInterpreter().GetExecutionContext());
1272b9c1b51eSKate Stone     lldb::OptionValueSP value_sp(
1273b9c1b51eSKate Stone         debugger_sp->GetPropertyValue(&exe_ctx, var_name, false, error));
1274b9c1b51eSKate Stone     if (value_sp) {
12756920b52bSGreg Clayton       StreamString value_strm;
12766920b52bSGreg Clayton       value_sp->DumpValue(&exe_ctx, value_strm, OptionValue::eDumpOptionValue);
12776920b52bSGreg Clayton       const std::string &value_str = value_strm.GetString();
1278b9c1b51eSKate Stone       if (!value_str.empty()) {
12796920b52bSGreg Clayton         StringList string_list;
128044d93782SGreg Clayton         string_list.SplitIntoLines(value_str);
1281baf5664fSJonas Devlieghere         return LLDB_RECORD_RESULT(SBStringList(&string_list));
12826920b52bSGreg Clayton       }
12836920b52bSGreg Clayton     }
12846920b52bSGreg Clayton   }
1285baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(SBStringList());
12863df9a8dfSCaroline Tice }
12873df9a8dfSCaroline Tice 
1288b9c1b51eSKate Stone uint32_t SBDebugger::GetTerminalWidth() const {
1289baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBDebugger, GetTerminalWidth);
1290baf5664fSJonas Devlieghere 
1291dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetTerminalWidth() : 0);
1292a7015092SGreg Clayton }
1293a7015092SGreg Clayton 
1294b9c1b51eSKate Stone void SBDebugger::SetTerminalWidth(uint32_t term_width) {
1295b328dcbfSJonas Devlieghere   LLDB_RECORD_DUMMY(void, SBDebugger, SetTerminalWidth, (uint32_t), term_width);
1296baf5664fSJonas Devlieghere 
1297a7015092SGreg Clayton   if (m_opaque_sp)
1298a7015092SGreg Clayton     m_opaque_sp->SetTerminalWidth(term_width);
1299a7015092SGreg Clayton }
1300a7015092SGreg Clayton 
1301b9c1b51eSKate Stone const char *SBDebugger::GetPrompt() const {
1302baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBDebugger, GetPrompt);
1303baf5664fSJonas Devlieghere 
13045160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1305ceb6b139SCaroline Tice 
130663e5fb76SJonas Devlieghere   LLDB_LOGF(log, "SBDebugger(%p)::GetPrompt () => \"%s\"",
1307324a1036SSaleem Abdulrasool             static_cast<void *>(m_opaque_sp.get()),
1308514d8cd8SZachary Turner             (m_opaque_sp ? m_opaque_sp->GetPrompt().str().c_str() : ""));
1309ceb6b139SCaroline Tice 
1310514d8cd8SZachary Turner   return (m_opaque_sp ? ConstString(m_opaque_sp->GetPrompt()).GetCString()
1311514d8cd8SZachary Turner                       : nullptr);
1312a7015092SGreg Clayton }
1313a7015092SGreg Clayton 
1314b9c1b51eSKate Stone void SBDebugger::SetPrompt(const char *prompt) {
1315baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBDebugger, SetPrompt, (const char *), prompt);
1316baf5664fSJonas Devlieghere 
1317a7015092SGreg Clayton   if (m_opaque_sp)
1318514d8cd8SZachary Turner     m_opaque_sp->SetPrompt(llvm::StringRef::withNullAsEmpty(prompt));
1319a7015092SGreg Clayton }
1320a7015092SGreg Clayton 
13219e046f02SJonas Devlieghere const char *SBDebugger::GetReproducerPath() const {
1322baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBDebugger, GetReproducerPath);
1323baf5664fSJonas Devlieghere 
13249e046f02SJonas Devlieghere   return (m_opaque_sp
13259e046f02SJonas Devlieghere               ? ConstString(m_opaque_sp->GetReproducerPath()).GetCString()
13269e046f02SJonas Devlieghere               : nullptr);
13279e046f02SJonas Devlieghere }
13289e046f02SJonas Devlieghere 
1329b9c1b51eSKate Stone ScriptLanguage SBDebugger::GetScriptLanguage() const {
1330baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::ScriptLanguage, SBDebugger,
1331baf5664fSJonas Devlieghere                                    GetScriptLanguage);
1332baf5664fSJonas Devlieghere 
1333dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetScriptLanguage() : eScriptLanguageNone);
1334a7015092SGreg Clayton }
1335a7015092SGreg Clayton 
1336b9c1b51eSKate Stone void SBDebugger::SetScriptLanguage(ScriptLanguage script_lang) {
1337baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBDebugger, SetScriptLanguage,
1338baf5664fSJonas Devlieghere                      (lldb::ScriptLanguage), script_lang);
1339baf5664fSJonas Devlieghere 
1340b9c1b51eSKate Stone   if (m_opaque_sp) {
1341a7015092SGreg Clayton     m_opaque_sp->SetScriptLanguage(script_lang);
1342a7015092SGreg Clayton   }
1343af67cecdSGreg Clayton }
1344a7015092SGreg Clayton 
1345b9c1b51eSKate Stone bool SBDebugger::SetUseExternalEditor(bool value) {
1346baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBDebugger, SetUseExternalEditor, (bool), value);
1347baf5664fSJonas Devlieghere 
1348dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->SetUseExternalEditor(value) : false);
1349e40e4218SJim Ingham }
1350e40e4218SJim Ingham 
1351b9c1b51eSKate Stone bool SBDebugger::GetUseExternalEditor() {
1352baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(bool, SBDebugger, GetUseExternalEditor);
1353baf5664fSJonas Devlieghere 
1354dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetUseExternalEditor() : false);
1355e40e4218SJim Ingham }
1356e40e4218SJim Ingham 
1357b9c1b51eSKate Stone bool SBDebugger::SetUseColor(bool value) {
1358baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBDebugger, SetUseColor, (bool), value);
1359baf5664fSJonas Devlieghere 
1360dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->SetUseColor(value) : false);
1361c3ce7f27SMichael Sartain }
1362c3ce7f27SMichael Sartain 
1363b9c1b51eSKate Stone bool SBDebugger::GetUseColor() const {
1364baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBDebugger, GetUseColor);
1365baf5664fSJonas Devlieghere 
1366dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetUseColor() : false);
1367c3ce7f27SMichael Sartain }
1368c3ce7f27SMichael Sartain 
1369b9c1b51eSKate Stone bool SBDebugger::GetDescription(SBStream &description) {
1370baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBDebugger, GetDescription, (lldb::SBStream &),
1371baf5664fSJonas Devlieghere                      description);
1372baf5664fSJonas Devlieghere 
1373da7bc7d0SGreg Clayton   Stream &strm = description.ref();
1374da7bc7d0SGreg Clayton 
1375b9c1b51eSKate Stone   if (m_opaque_sp) {
1376dde9cff3SCaroline Tice     const char *name = m_opaque_sp->GetInstanceName().AsCString();
1377431ce678SGreg Clayton     user_id_t id = m_opaque_sp->GetID();
1378d01b2953SDaniel Malea     strm.Printf("Debugger (instance: \"%s\", id: %" PRIu64 ")", name, id);
1379b9c1b51eSKate Stone   } else
1380da7bc7d0SGreg Clayton     strm.PutCString("No value");
1381dde9cff3SCaroline Tice 
1382dde9cff3SCaroline Tice   return true;
1383dde9cff3SCaroline Tice }
1384efed6131SCaroline Tice 
1385b9c1b51eSKate Stone user_id_t SBDebugger::GetID() {
1386baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::user_id_t, SBDebugger, GetID);
1387baf5664fSJonas Devlieghere 
1388dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetID() : LLDB_INVALID_UID);
1389efed6131SCaroline Tice }
13902289fa48SGreg Clayton 
1391b9c1b51eSKate Stone SBError SBDebugger::SetCurrentPlatform(const char *platform_name_cstr) {
1392baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBError, SBDebugger, SetCurrentPlatform,
1393baf5664fSJonas Devlieghere                      (const char *), platform_name_cstr);
1394baf5664fSJonas Devlieghere 
13952289fa48SGreg Clayton   SBError sb_error;
1396b9c1b51eSKate Stone   if (m_opaque_sp) {
1397b9c1b51eSKate Stone     if (platform_name_cstr && platform_name_cstr[0]) {
1398615eb7e6SGreg Clayton       ConstString platform_name(platform_name_cstr);
1399615eb7e6SGreg Clayton       PlatformSP platform_sp(Platform::Find(platform_name));
14002289fa48SGreg Clayton 
1401b9c1b51eSKate Stone       if (platform_sp) {
1402615eb7e6SGreg Clayton         // Already have a platform with this name, just select it
1403615eb7e6SGreg Clayton         m_opaque_sp->GetPlatformList().SetSelectedPlatform(platform_sp);
1404b9c1b51eSKate Stone       } else {
1405615eb7e6SGreg Clayton         // We don't have a platform by this name yet, create one
1406615eb7e6SGreg Clayton         platform_sp = Platform::Create(platform_name, sb_error.ref());
1407b9c1b51eSKate Stone         if (platform_sp) {
1408615eb7e6SGreg Clayton           // We created the platform, now append and select it
14092289fa48SGreg Clayton           bool make_selected = true;
14102289fa48SGreg Clayton           m_opaque_sp->GetPlatformList().Append(platform_sp, make_selected);
14112289fa48SGreg Clayton         }
14122289fa48SGreg Clayton       }
1413b9c1b51eSKate Stone     } else {
1414615eb7e6SGreg Clayton       sb_error.ref().SetErrorString("invalid platform name");
1415615eb7e6SGreg Clayton     }
1416b9c1b51eSKate Stone   } else {
1417615eb7e6SGreg Clayton     sb_error.ref().SetErrorString("invalid debugger");
1418615eb7e6SGreg Clayton   }
1419baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_error);
14202289fa48SGreg Clayton }
14212289fa48SGreg Clayton 
1422b9c1b51eSKate Stone bool SBDebugger::SetCurrentPlatformSDKRoot(const char *sysroot) {
1423baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBDebugger, SetCurrentPlatformSDKRoot,
1424baf5664fSJonas Devlieghere                      (const char *), sysroot);
1425baf5664fSJonas Devlieghere 
1426e1cf274bSJason Molenda   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1427b9c1b51eSKate Stone   if (m_opaque_sp) {
1428b9c1b51eSKate Stone     PlatformSP platform_sp(
1429b9c1b51eSKate Stone         m_opaque_sp->GetPlatformList().GetSelectedPlatform());
1430f3dd93c8SGreg Clayton 
1431b9c1b51eSKate Stone     if (platform_sp) {
1432e1cf274bSJason Molenda       if (log && sysroot)
143363e5fb76SJonas Devlieghere         LLDB_LOGF(log, "SBDebugger::SetCurrentPlatformSDKRoot (\"%s\")",
143463e5fb76SJonas Devlieghere                   sysroot);
1435f3dd93c8SGreg Clayton       platform_sp->SetSDKRootDirectory(ConstString(sysroot));
1436f3dd93c8SGreg Clayton       return true;
1437f3dd93c8SGreg Clayton     }
1438f3dd93c8SGreg Clayton   }
1439f3dd93c8SGreg Clayton   return false;
1440f3dd93c8SGreg Clayton }
1441f3dd93c8SGreg Clayton 
1442b9c1b51eSKate Stone bool SBDebugger::GetCloseInputOnEOF() const {
1443baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBDebugger, GetCloseInputOnEOF);
1444baf5664fSJonas Devlieghere 
1445dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetCloseInputOnEOF() : false);
1446fc3f027dSGreg Clayton }
1447fc3f027dSGreg Clayton 
1448b9c1b51eSKate Stone void SBDebugger::SetCloseInputOnEOF(bool b) {
1449baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBDebugger, SetCloseInputOnEOF, (bool), b);
1450baf5664fSJonas Devlieghere 
1451fc3f027dSGreg Clayton   if (m_opaque_sp)
1452fc3f027dSGreg Clayton     m_opaque_sp->SetCloseInputOnEOF(b);
1453fc3f027dSGreg Clayton }
1454061858ceSEnrico Granata 
1455b9c1b51eSKate Stone SBTypeCategory SBDebugger::GetCategory(const char *category_name) {
1456baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTypeCategory, SBDebugger, GetCategory,
1457baf5664fSJonas Devlieghere                      (const char *), category_name);
1458baf5664fSJonas Devlieghere 
1459061858ceSEnrico Granata   if (!category_name || *category_name == 0)
1460baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(SBTypeCategory());
1461061858ceSEnrico Granata 
1462061858ceSEnrico Granata   TypeCategoryImplSP category_sp;
1463061858ceSEnrico Granata 
1464b9c1b51eSKate Stone   if (DataVisualization::Categories::GetCategory(ConstString(category_name),
1465baf5664fSJonas Devlieghere                                                  category_sp, false)) {
1466baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(SBTypeCategory(category_sp));
1467baf5664fSJonas Devlieghere   } else {
1468baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(SBTypeCategory());
1469baf5664fSJonas Devlieghere   }
1470061858ceSEnrico Granata }
1471061858ceSEnrico Granata 
1472b9c1b51eSKate Stone SBTypeCategory SBDebugger::GetCategory(lldb::LanguageType lang_type) {
1473baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTypeCategory, SBDebugger, GetCategory,
1474baf5664fSJonas Devlieghere                      (lldb::LanguageType), lang_type);
1475baf5664fSJonas Devlieghere 
1476e242624cSEnrico Granata   TypeCategoryImplSP category_sp;
1477baf5664fSJonas Devlieghere   if (DataVisualization::Categories::GetCategory(lang_type, category_sp)) {
1478baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(SBTypeCategory(category_sp));
1479baf5664fSJonas Devlieghere   } else {
1480baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(SBTypeCategory());
1481baf5664fSJonas Devlieghere   }
1482e242624cSEnrico Granata }
1483e242624cSEnrico Granata 
1484b9c1b51eSKate Stone SBTypeCategory SBDebugger::CreateCategory(const char *category_name) {
1485baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTypeCategory, SBDebugger, CreateCategory,
1486baf5664fSJonas Devlieghere                      (const char *), category_name);
1487baf5664fSJonas Devlieghere 
1488061858ceSEnrico Granata   if (!category_name || *category_name == 0)
1489baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(SBTypeCategory());
1490061858ceSEnrico Granata 
1491061858ceSEnrico Granata   TypeCategoryImplSP category_sp;
1492061858ceSEnrico Granata 
1493b9c1b51eSKate Stone   if (DataVisualization::Categories::GetCategory(ConstString(category_name),
1494baf5664fSJonas Devlieghere                                                  category_sp, true)) {
1495baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(SBTypeCategory(category_sp));
1496baf5664fSJonas Devlieghere   } else {
1497baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(SBTypeCategory());
1498baf5664fSJonas Devlieghere   }
1499061858ceSEnrico Granata }
1500061858ceSEnrico Granata 
1501b9c1b51eSKate Stone bool SBDebugger::DeleteCategory(const char *category_name) {
1502baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBDebugger, DeleteCategory, (const char *),
1503baf5664fSJonas Devlieghere                      category_name);
1504baf5664fSJonas Devlieghere 
1505061858ceSEnrico Granata   if (!category_name || *category_name == 0)
1506061858ceSEnrico Granata     return false;
1507061858ceSEnrico Granata 
1508061858ceSEnrico Granata   return DataVisualization::Categories::Delete(ConstString(category_name));
1509061858ceSEnrico Granata }
1510061858ceSEnrico Granata 
1511b9c1b51eSKate Stone uint32_t SBDebugger::GetNumCategories() {
1512baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBDebugger, GetNumCategories);
1513baf5664fSJonas Devlieghere 
1514061858ceSEnrico Granata   return DataVisualization::Categories::GetCount();
1515061858ceSEnrico Granata }
1516061858ceSEnrico Granata 
1517b9c1b51eSKate Stone SBTypeCategory SBDebugger::GetCategoryAtIndex(uint32_t index) {
1518baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTypeCategory, SBDebugger, GetCategoryAtIndex,
1519baf5664fSJonas Devlieghere                      (uint32_t), index);
1520baf5664fSJonas Devlieghere 
1521baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(
1522baf5664fSJonas Devlieghere       SBTypeCategory(DataVisualization::Categories::GetCategoryAtIndex(index)));
1523061858ceSEnrico Granata }
1524061858ceSEnrico Granata 
1525b9c1b51eSKate Stone SBTypeCategory SBDebugger::GetDefaultCategory() {
1526baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::SBTypeCategory, SBDebugger,
1527baf5664fSJonas Devlieghere                              GetDefaultCategory);
1528baf5664fSJonas Devlieghere 
1529baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(GetCategory("default"));
1530061858ceSEnrico Granata }
1531061858ceSEnrico Granata 
1532b9c1b51eSKate Stone SBTypeFormat SBDebugger::GetFormatForType(SBTypeNameSpecifier type_name) {
1533baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTypeFormat, SBDebugger, GetFormatForType,
1534baf5664fSJonas Devlieghere                      (lldb::SBTypeNameSpecifier), type_name);
1535baf5664fSJonas Devlieghere 
1536061858ceSEnrico Granata   SBTypeCategory default_category_sb = GetDefaultCategory();
1537061858ceSEnrico Granata   if (default_category_sb.GetEnabled())
1538baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(default_category_sb.GetFormatForType(type_name));
1539baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(SBTypeFormat());
1540061858ceSEnrico Granata }
1541061858ceSEnrico Granata 
1542b9c1b51eSKate Stone SBTypeSummary SBDebugger::GetSummaryForType(SBTypeNameSpecifier type_name) {
1543baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTypeSummary, SBDebugger, GetSummaryForType,
1544baf5664fSJonas Devlieghere                      (lldb::SBTypeNameSpecifier), type_name);
1545baf5664fSJonas Devlieghere 
1546dbb0abbfSEugene Zelenko   if (!type_name.IsValid())
1547baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(SBTypeSummary());
1548baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(
1549baf5664fSJonas Devlieghere       SBTypeSummary(DataVisualization::GetSummaryForType(type_name.GetSP())));
1550061858ceSEnrico Granata }
1551061858ceSEnrico Granata 
1552b9c1b51eSKate Stone SBTypeFilter SBDebugger::GetFilterForType(SBTypeNameSpecifier type_name) {
1553baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTypeFilter, SBDebugger, GetFilterForType,
1554baf5664fSJonas Devlieghere                      (lldb::SBTypeNameSpecifier), type_name);
1555baf5664fSJonas Devlieghere 
1556dbb0abbfSEugene Zelenko   if (!type_name.IsValid())
1557baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(SBTypeFilter());
1558baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(
1559baf5664fSJonas Devlieghere       SBTypeFilter(DataVisualization::GetFilterForType(type_name.GetSP())));
1560061858ceSEnrico Granata }
1561061858ceSEnrico Granata 
1562b9c1b51eSKate Stone SBTypeSynthetic SBDebugger::GetSyntheticForType(SBTypeNameSpecifier type_name) {
1563baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTypeSynthetic, SBDebugger, GetSyntheticForType,
1564baf5664fSJonas Devlieghere                      (lldb::SBTypeNameSpecifier), type_name);
1565baf5664fSJonas Devlieghere 
1566dbb0abbfSEugene Zelenko   if (!type_name.IsValid())
1567baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(SBTypeSynthetic());
1568baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(SBTypeSynthetic(
1569baf5664fSJonas Devlieghere       DataVisualization::GetSyntheticForType(type_name.GetSP())));
1570061858ceSEnrico Granata }
1571061858ceSEnrico Granata 
15725e336903SPavel Labath static llvm::ArrayRef<const char *> GetCategoryArray(const char **categories) {
15735e336903SPavel Labath   if (categories == nullptr)
15745e336903SPavel Labath     return {};
15755e336903SPavel Labath   size_t len = 0;
15765e336903SPavel Labath   while (categories[len] != nullptr)
15775e336903SPavel Labath     ++len;
15785e336903SPavel Labath   return llvm::makeArrayRef(categories, len);
15795e336903SPavel Labath }
15805e336903SPavel Labath 
1581b9c1b51eSKate Stone bool SBDebugger::EnableLog(const char *channel, const char **categories) {
1582baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBDebugger, EnableLog, (const char *, const char **),
1583baf5664fSJonas Devlieghere                      channel, categories);
1584baf5664fSJonas Devlieghere 
1585b9c1b51eSKate Stone   if (m_opaque_sp) {
1586b9c1b51eSKate Stone     uint32_t log_options =
1587b9c1b51eSKate Stone         LLDB_LOG_OPTION_PREPEND_TIMESTAMP | LLDB_LOG_OPTION_PREPEND_THREAD_NAME;
1588775588c0SPavel Labath     std::string error;
1589775588c0SPavel Labath     llvm::raw_string_ostream error_stream(error);
15905e336903SPavel Labath     return m_opaque_sp->EnableLog(channel, GetCategoryArray(categories), "",
1591775588c0SPavel Labath                                   log_options, error_stream);
1592b9c1b51eSKate Stone   } else
1593228063cdSJim Ingham     return false;
1594228063cdSJim Ingham }
15954f02b22dSJim Ingham 
1596b9c1b51eSKate Stone void SBDebugger::SetLoggingCallback(lldb::LogOutputCallback log_callback,
1597b9c1b51eSKate Stone                                     void *baton) {
15987bc83564SJonas Devlieghere   LLDB_RECORD_DUMMY(void, SBDebugger, SetLoggingCallback,
15997bc83564SJonas Devlieghere                     (lldb::LogOutputCallback, void *), log_callback, baton);
16000d7b0c96SJonas Devlieghere 
1601b9c1b51eSKate Stone   if (m_opaque_sp) {
16024f02b22dSJim Ingham     return m_opaque_sp->SetLoggingCallback(log_callback, baton);
16034f02b22dSJim Ingham   }
16044f02b22dSJim Ingham }
1605ae211eceSMichal Gorny 
1606ae211eceSMichal Gorny namespace lldb_private {
1607ae211eceSMichal Gorny namespace repro {
1608ae211eceSMichal Gorny 
1609d9aec34bSJonas Devlieghere template <> void RegisterMethods<SBInputReader>(Registry &R) {
1610ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBInputReader, SetIsDone, (bool));
1611ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool, SBInputReader, IsActive, ());
1612ae211eceSMichal Gorny }
1613ae211eceSMichal Gorny 
1614ae211eceSMichal Gorny static void SetFileHandleRedirect(SBDebugger *, FILE *, bool) {
1615ae211eceSMichal Gorny   // Do nothing.
1616ae211eceSMichal Gorny }
1617ae211eceSMichal Gorny 
161896898eb6SLawrence D'Anna static SBError SetFileRedirect(SBDebugger *, SBFile file) { return SBError(); }
161996898eb6SLawrence D'Anna 
1620c040b30fSLawrence D'Anna static SBError SetFileRedirect(SBDebugger *, FileSP file) { return SBError(); }
1621c040b30fSLawrence D'Anna 
1622ae211eceSMichal Gorny static bool GetDefaultArchitectureRedirect(char *arch_name,
1623ae211eceSMichal Gorny                                            size_t arch_name_len) {
1624ae211eceSMichal Gorny   // The function is writing to its argument. Without the redirect it would
1625ae211eceSMichal Gorny   // write into the replay buffer.
1626ae211eceSMichal Gorny   char buffer[1024];
1627ae211eceSMichal Gorny   return SBDebugger::GetDefaultArchitecture(buffer, arch_name_len);
1628ae211eceSMichal Gorny }
1629ae211eceSMichal Gorny 
1630d9aec34bSJonas Devlieghere template <> void RegisterMethods<SBDebugger>(Registry &R) {
1631ae211eceSMichal Gorny   // Custom implementation.
1632ae211eceSMichal Gorny   R.Register(&invoke<void (SBDebugger::*)(
1633ae211eceSMichal Gorny                  FILE *, bool)>::method<&SBDebugger::SetErrorFileHandle>::doit,
1634ae211eceSMichal Gorny              &SetFileHandleRedirect);
1635ae211eceSMichal Gorny   R.Register(&invoke<void (SBDebugger::*)(
1636ae211eceSMichal Gorny                  FILE *, bool)>::method<&SBDebugger::SetOutputFileHandle>::doit,
1637ae211eceSMichal Gorny              &SetFileHandleRedirect);
1638ae211eceSMichal Gorny   R.Register<bool(char *, size_t)>(static_cast<bool (*)(char *, size_t)>(
1639ae211eceSMichal Gorny                                        &SBDebugger::GetDefaultArchitecture),
1640ae211eceSMichal Gorny                                    &GetDefaultArchitectureRedirect);
1641ae211eceSMichal Gorny 
164296898eb6SLawrence D'Anna   R.Register(&invoke<SBError (SBDebugger::*)(
164396898eb6SLawrence D'Anna                  SBFile)>::method<&SBDebugger::SetInputFile>::doit,
164496898eb6SLawrence D'Anna              &SetFileRedirect);
164596898eb6SLawrence D'Anna   R.Register(&invoke<SBError (SBDebugger::*)(
164696898eb6SLawrence D'Anna                  SBFile)>::method<&SBDebugger::SetOutputFile>::doit,
164796898eb6SLawrence D'Anna              &SetFileRedirect);
164896898eb6SLawrence D'Anna   R.Register(&invoke<SBError (SBDebugger::*)(
164996898eb6SLawrence D'Anna                  SBFile)>::method<&SBDebugger::SetErrorFile>::doit,
165096898eb6SLawrence D'Anna              &SetFileRedirect);
165196898eb6SLawrence D'Anna 
1652c040b30fSLawrence D'Anna   R.Register(&invoke<SBError (SBDebugger::*)(
1653c040b30fSLawrence D'Anna                  FileSP)>::method<&SBDebugger::SetInputFile>::doit,
1654c040b30fSLawrence D'Anna              &SetFileRedirect);
1655c040b30fSLawrence D'Anna   R.Register(&invoke<SBError (SBDebugger::*)(
1656c040b30fSLawrence D'Anna                  FileSP)>::method<&SBDebugger::SetOutputFile>::doit,
1657c040b30fSLawrence D'Anna              &SetFileRedirect);
1658c040b30fSLawrence D'Anna   R.Register(&invoke<SBError (SBDebugger::*)(
1659c040b30fSLawrence D'Anna                  FileSP)>::method<&SBDebugger::SetErrorFile>::doit,
1660c040b30fSLawrence D'Anna              &SetFileRedirect);
1661c040b30fSLawrence D'Anna 
1662ae211eceSMichal Gorny   LLDB_REGISTER_CONSTRUCTOR(SBDebugger, ());
1663ae211eceSMichal Gorny   LLDB_REGISTER_CONSTRUCTOR(SBDebugger, (const lldb::DebuggerSP &));
1664ae211eceSMichal Gorny   LLDB_REGISTER_CONSTRUCTOR(SBDebugger, (const lldb::SBDebugger &));
1665ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBDebugger &,
1666ae211eceSMichal Gorny                        SBDebugger, operator=,(const lldb::SBDebugger &));
1667ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(void, SBDebugger, Initialize, ());
1668ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(lldb::SBError, SBDebugger,
1669ae211eceSMichal Gorny                               InitializeWithErrorHandling, ());
1670ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(void, SBDebugger, Terminate, ());
1671ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDebugger, Clear, ());
1672ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(lldb::SBDebugger, SBDebugger, Create, ());
1673ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(lldb::SBDebugger, SBDebugger, Create, (bool));
1674d9aec34bSJonas Devlieghere   LLDB_REGISTER_STATIC_METHOD(void, SBDebugger, Destroy, (lldb::SBDebugger &));
1675ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(void, SBDebugger, MemoryPressureDetected, ());
1676ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool, SBDebugger, IsValid, ());
1677ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool, SBDebugger, operator bool,());
1678ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDebugger, SetAsync, (bool));
1679ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBDebugger, GetAsync, ());
1680ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDebugger, SkipLLDBInitFiles, (bool));
1681ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDebugger, SkipAppInitFiles, (bool));
1682ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDebugger, SetInputFileHandle, (FILE *, bool));
1683ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(FILE *, SBDebugger, GetInputFileHandle, ());
1684ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(FILE *, SBDebugger, GetOutputFileHandle, ());
1685ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(FILE *, SBDebugger, GetErrorFileHandle, ());
168696898eb6SLawrence D'Anna   LLDB_REGISTER_METHOD(SBFile, SBDebugger, GetInputFile, ());
168796898eb6SLawrence D'Anna   LLDB_REGISTER_METHOD(SBFile, SBDebugger, GetOutputFile, ());
168896898eb6SLawrence D'Anna   LLDB_REGISTER_METHOD(SBFile, SBDebugger, GetErrorFile, ());
1689ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDebugger, SaveInputTerminalState, ());
1690ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDebugger, RestoreInputTerminalState, ());
1691ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBCommandInterpreter, SBDebugger,
1692ae211eceSMichal Gorny                        GetCommandInterpreter, ());
1693ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDebugger, HandleCommand, (const char *));
1694ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBListener, SBDebugger, GetListener, ());
1695ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(
1696ae211eceSMichal Gorny       void, SBDebugger, HandleProcessEvent,
1697ae211eceSMichal Gorny       (const lldb::SBProcess &, const lldb::SBEvent &, FILE *, FILE *));
1698322f12afSLawrence D'Anna   LLDB_REGISTER_METHOD(
1699322f12afSLawrence D'Anna       void, SBDebugger, HandleProcessEvent,
1700322f12afSLawrence D'Anna       (const lldb::SBProcess &, const lldb::SBEvent &, SBFile, SBFile));
1701322f12afSLawrence D'Anna   LLDB_REGISTER_METHOD(
1702322f12afSLawrence D'Anna       void, SBDebugger, HandleProcessEvent,
1703322f12afSLawrence D'Anna       (const lldb::SBProcess &, const lldb::SBEvent &, FileSP, FileSP));
1704d9aec34bSJonas Devlieghere   LLDB_REGISTER_METHOD(lldb::SBSourceManager, SBDebugger, GetSourceManager, ());
1705ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(bool, SBDebugger, SetDefaultArchitecture,
1706ae211eceSMichal Gorny                               (const char *));
1707ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::ScriptLanguage, SBDebugger, GetScriptingLanguage,
1708ae211eceSMichal Gorny                        (const char *));
1709ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(const char *, SBDebugger, GetVersionString, ());
1710ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(const char *, SBDebugger, StateAsCString,
1711ae211eceSMichal Gorny                               (lldb::StateType));
1712ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(lldb::SBStructuredData, SBDebugger,
1713ae211eceSMichal Gorny                               GetBuildConfiguration, ());
1714ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(bool, SBDebugger, StateIsRunningState,
1715ae211eceSMichal Gorny                               (lldb::StateType));
1716ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(bool, SBDebugger, StateIsStoppedState,
1717ae211eceSMichal Gorny                               (lldb::StateType));
1718ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(
1719ae211eceSMichal Gorny       lldb::SBTarget, SBDebugger, CreateTarget,
1720ae211eceSMichal Gorny       (const char *, const char *, const char *, bool, lldb::SBError &));
1721ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBTarget, SBDebugger,
1722ae211eceSMichal Gorny                        CreateTargetWithFileAndTargetTriple,
1723ae211eceSMichal Gorny                        (const char *, const char *));
1724d9aec34bSJonas Devlieghere   LLDB_REGISTER_METHOD(lldb::SBTarget, SBDebugger, CreateTargetWithFileAndArch,
1725ae211eceSMichal Gorny                        (const char *, const char *));
1726ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBTarget, SBDebugger, CreateTarget,
1727ae211eceSMichal Gorny                        (const char *));
1728ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBTarget, SBDebugger, GetDummyTarget, ());
1729ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBDebugger, DeleteTarget, (lldb::SBTarget &));
1730ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBTarget, SBDebugger, GetTargetAtIndex,
1731ae211eceSMichal Gorny                        (uint32_t));
1732ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(uint32_t, SBDebugger, GetIndexOfTarget,
1733ae211eceSMichal Gorny                        (lldb::SBTarget));
1734ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBTarget, SBDebugger, FindTargetWithProcessID,
1735ae211eceSMichal Gorny                        (lldb::pid_t));
1736ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBTarget, SBDebugger, FindTargetWithFileAndArch,
1737ae211eceSMichal Gorny                        (const char *, const char *));
1738ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(uint32_t, SBDebugger, GetNumTargets, ());
1739ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBTarget, SBDebugger, GetSelectedTarget, ());
1740d9aec34bSJonas Devlieghere   LLDB_REGISTER_METHOD(void, SBDebugger, SetSelectedTarget, (lldb::SBTarget &));
1741ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBPlatform, SBDebugger, GetSelectedPlatform, ());
1742ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDebugger, SetSelectedPlatform,
1743ae211eceSMichal Gorny                        (lldb::SBPlatform &));
1744ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(uint32_t, SBDebugger, GetNumPlatforms, ());
1745ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBPlatform, SBDebugger, GetPlatformAtIndex,
1746ae211eceSMichal Gorny                        (uint32_t));
1747ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(uint32_t, SBDebugger, GetNumAvailablePlatforms, ());
1748ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBStructuredData, SBDebugger,
1749ae211eceSMichal Gorny                        GetAvailablePlatformInfoAtIndex, (uint32_t));
1750ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDebugger, DispatchInputInterrupt, ());
1751ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDebugger, DispatchInputEndOfFile, ());
1752ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDebugger, PushInputReader,
1753ae211eceSMichal Gorny                        (lldb::SBInputReader &));
1754ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDebugger, RunCommandInterpreter, (bool, bool));
1755ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDebugger, RunCommandInterpreter,
1756ae211eceSMichal Gorny                        (bool, bool, lldb::SBCommandInterpreterRunOptions &,
1757ae211eceSMichal Gorny                         int &, bool &, bool &));
1758ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBError, SBDebugger, RunREPL,
1759ae211eceSMichal Gorny                        (lldb::LanguageType, const char *));
1760d9aec34bSJonas Devlieghere   LLDB_REGISTER_STATIC_METHOD(lldb::SBDebugger, SBDebugger, FindDebuggerWithID,
1761d9aec34bSJonas Devlieghere                               (int));
1762ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(const char *, SBDebugger, GetInstanceName, ());
1763ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(lldb::SBError, SBDebugger, SetInternalVariable,
1764ae211eceSMichal Gorny                               (const char *, const char *, const char *));
1765ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(lldb::SBStringList, SBDebugger,
1766ae211eceSMichal Gorny                               GetInternalVariableValue,
1767ae211eceSMichal Gorny                               (const char *, const char *));
1768ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(uint32_t, SBDebugger, GetTerminalWidth, ());
1769ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDebugger, SetTerminalWidth, (uint32_t));
1770ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(const char *, SBDebugger, GetPrompt, ());
1771ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDebugger, SetPrompt, (const char *));
1772ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(const char *, SBDebugger, GetReproducerPath, ());
1773ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::ScriptLanguage, SBDebugger,
1774ae211eceSMichal Gorny                              GetScriptLanguage, ());
1775ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDebugger, SetScriptLanguage,
1776ae211eceSMichal Gorny                        (lldb::ScriptLanguage));
1777ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBDebugger, SetUseExternalEditor, (bool));
1778ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBDebugger, GetUseExternalEditor, ());
1779ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBDebugger, SetUseColor, (bool));
1780ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool, SBDebugger, GetUseColor, ());
1781ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBDebugger, GetDescription, (lldb::SBStream &));
1782ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::user_id_t, SBDebugger, GetID, ());
1783ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBError, SBDebugger, SetCurrentPlatform,
1784ae211eceSMichal Gorny                        (const char *));
1785ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBDebugger, SetCurrentPlatformSDKRoot,
1786ae211eceSMichal Gorny                        (const char *));
1787ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool, SBDebugger, GetCloseInputOnEOF, ());
1788ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDebugger, SetCloseInputOnEOF, (bool));
1789ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBTypeCategory, SBDebugger, GetCategory,
1790ae211eceSMichal Gorny                        (const char *));
1791ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBTypeCategory, SBDebugger, GetCategory,
1792ae211eceSMichal Gorny                        (lldb::LanguageType));
1793ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBTypeCategory, SBDebugger, CreateCategory,
1794ae211eceSMichal Gorny                        (const char *));
1795ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBDebugger, DeleteCategory, (const char *));
1796ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(uint32_t, SBDebugger, GetNumCategories, ());
1797ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBTypeCategory, SBDebugger, GetCategoryAtIndex,
1798ae211eceSMichal Gorny                        (uint32_t));
1799ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBTypeCategory, SBDebugger, GetDefaultCategory,
1800ae211eceSMichal Gorny                        ());
1801ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBTypeFormat, SBDebugger, GetFormatForType,
1802ae211eceSMichal Gorny                        (lldb::SBTypeNameSpecifier));
1803ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBTypeSummary, SBDebugger, GetSummaryForType,
1804ae211eceSMichal Gorny                        (lldb::SBTypeNameSpecifier));
1805ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBTypeSynthetic, SBDebugger, GetSyntheticForType,
1806ae211eceSMichal Gorny                        (lldb::SBTypeNameSpecifier));
1807ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBTypeFilter, SBDebugger, GetFilterForType,
1808ae211eceSMichal Gorny                        (lldb::SBTypeNameSpecifier));
1809ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBDebugger, EnableLog,
1810ae211eceSMichal Gorny                        (const char *, const char **));
1811ae211eceSMichal Gorny }
1812ae211eceSMichal Gorny 
1813d9aec34bSJonas Devlieghere } // namespace repro
1814d9aec34bSJonas Devlieghere } // namespace lldb_private
1815