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"
43f1389e92SPavel Labath #include "lldb/Host/XML.h"
44e6e2bb38SZachary Turner #include "lldb/Initialization/SystemLifetimeManager.h"
456eee5aa0SGreg Clayton #include "lldb/Interpreter/CommandInterpreter.h"
4647cbf4a0SPavel Labath #include "lldb/Interpreter/OptionArgParser.h"
47cac9c5f9SGreg Clayton #include "lldb/Interpreter/OptionGroupPlatform.h"
486eee5aa0SGreg Clayton #include "lldb/Target/Process.h"
496eee5aa0SGreg Clayton #include "lldb/Target/TargetList.h"
50145d95c9SPavel Labath #include "lldb/Utility/Args.h"
51d821c997SPavel Labath #include "lldb/Utility/State.h"
5230fdc8d8SChris Lattner 
53d717cc9fSEnrico Granata #include "llvm/ADT/STLExtras.h"
547b2e5a36SZachary Turner #include "llvm/ADT/StringRef.h"
5558a559c0SZachary Turner #include "llvm/Support/DynamicLibrary.h"
56b9c1b51eSKate Stone #include "llvm/Support/ManagedStatic.h"
5758a559c0SZachary Turner 
5830fdc8d8SChris Lattner using namespace lldb;
5930fdc8d8SChris Lattner using namespace lldb_private;
6030fdc8d8SChris Lattner 
61b9c1b51eSKate Stone static llvm::sys::DynamicLibrary LoadPlugin(const lldb::DebuggerSP &debugger_sp,
62b9c1b51eSKate Stone                                             const FileSpec &spec,
6397206d57SZachary Turner                                             Status &error) {
64b9c1b51eSKate Stone   llvm::sys::DynamicLibrary dynlib =
65b9c1b51eSKate Stone       llvm::sys::DynamicLibrary::getPermanentLibrary(spec.GetPath().c_str());
66b9c1b51eSKate Stone   if (dynlib.isValid()) {
675fb8f797SGreg Clayton     typedef bool (*LLDBCommandPluginInit)(lldb::SBDebugger & debugger);
685fb8f797SGreg Clayton 
695fb8f797SGreg Clayton     lldb::SBDebugger debugger_sb(debugger_sp);
70b9c1b51eSKate Stone     // This calls the bool lldb::PluginInitialize(lldb::SBDebugger debugger)
71b9c1b51eSKate Stone     // function.
72b9c1b51eSKate Stone     // TODO: mangle this differently for your system - on OSX, the first
73b9c1b51eSKate Stone     // underscore needs to be removed and the second one stays
74b9c1b51eSKate Stone     LLDBCommandPluginInit init_func =
7522701b2fSStephane Sezer         (LLDBCommandPluginInit)(uintptr_t)dynlib.getAddressOfSymbol(
76b9c1b51eSKate Stone             "_ZN4lldb16PluginInitializeENS_10SBDebuggerE");
77b9c1b51eSKate Stone     if (init_func) {
785fb8f797SGreg Clayton       if (init_func(debugger_sb))
7958a559c0SZachary Turner         return dynlib;
805fb8f797SGreg Clayton       else
81b9c1b51eSKate Stone         error.SetErrorString("plug-in refused to load "
82b9c1b51eSKate Stone                              "(lldb::PluginInitialize(lldb::SBDebugger) "
83b9c1b51eSKate Stone                              "returned false)");
84b9c1b51eSKate Stone     } else {
85b9c1b51eSKate Stone       error.SetErrorString("plug-in is missing the required initialization: "
86b9c1b51eSKate Stone                            "lldb::PluginInitialize(lldb::SBDebugger)");
875fb8f797SGreg Clayton     }
88b9c1b51eSKate Stone   } else {
89dbd7fabaSJonas Devlieghere     if (FileSystem::Instance().Exists(spec))
905fb8f797SGreg Clayton       error.SetErrorString("this file does not represent a loadable dylib");
915fb8f797SGreg Clayton     else
925fb8f797SGreg Clayton       error.SetErrorString("no such file");
935fb8f797SGreg Clayton   }
9458a559c0SZachary Turner   return llvm::sys::DynamicLibrary();
955fb8f797SGreg Clayton }
965fb8f797SGreg Clayton 
97e6e2bb38SZachary Turner static llvm::ManagedStatic<SystemLifetimeManager> g_debugger_lifetime;
98e6e2bb38SZachary Turner 
99b9c1b51eSKate Stone SBError SBInputReader::Initialize(
100b9c1b51eSKate Stone     lldb::SBDebugger &sb_debugger,
1010d7b0c96SJonas Devlieghere     unsigned long (*callback)(void *, lldb::SBInputReader *,
1020d7b0c96SJonas Devlieghere                               lldb::InputReaderAction, char const *,
1030d7b0c96SJonas Devlieghere                               unsigned long),
1040d7b0c96SJonas Devlieghere     void *a, lldb::InputReaderGranularity b, char const *c, char const *d,
1050d7b0c96SJonas Devlieghere     bool e) {
1067bc83564SJonas Devlieghere   LLDB_RECORD_DUMMY(
1077bc83564SJonas Devlieghere       lldb::SBError, SBInputReader, Initialize,
1087bc83564SJonas Devlieghere       (lldb::SBDebugger &,
1097bc83564SJonas Devlieghere        unsigned long (*)(void *, lldb::SBInputReader *, lldb::InputReaderAction,
1107bc83564SJonas Devlieghere                          const char *, unsigned long),
1117bc83564SJonas Devlieghere        void *, lldb::InputReaderGranularity, const char *, const char *, bool),
1120d7b0c96SJonas Devlieghere       sb_debugger, callback, a, b, c, d, e);
1130d7b0c96SJonas Devlieghere 
114e6e2bb38SZachary Turner   return SBError();
115e6e2bb38SZachary Turner }
116e6e2bb38SZachary Turner 
117baf5664fSJonas Devlieghere void SBInputReader::SetIsDone(bool b) {
118baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBInputReader, SetIsDone, (bool), b);
119baf5664fSJonas Devlieghere }
120dbb0abbfSEugene Zelenko 
121baf5664fSJonas Devlieghere bool SBInputReader::IsActive() const {
122baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBInputReader, IsActive);
123e6e2bb38SZachary Turner 
124baf5664fSJonas Devlieghere   return false;
125baf5664fSJonas Devlieghere }
126baf5664fSJonas Devlieghere 
127baf5664fSJonas Devlieghere SBDebugger::SBDebugger() { LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBDebugger); }
128dbb0abbfSEugene Zelenko 
129b9c1b51eSKate Stone SBDebugger::SBDebugger(const lldb::DebuggerSP &debugger_sp)
130baf5664fSJonas Devlieghere     : m_opaque_sp(debugger_sp) {
131baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBDebugger, (const lldb::DebuggerSP &), debugger_sp);
132baf5664fSJonas Devlieghere }
133dbb0abbfSEugene Zelenko 
134baf5664fSJonas Devlieghere SBDebugger::SBDebugger(const SBDebugger &rhs) : m_opaque_sp(rhs.m_opaque_sp) {
135baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBDebugger, (const lldb::SBDebugger &), rhs);
136baf5664fSJonas Devlieghere }
137dbb0abbfSEugene Zelenko 
138dbb0abbfSEugene Zelenko SBDebugger::~SBDebugger() = default;
139dbb0abbfSEugene Zelenko 
140b9c1b51eSKate Stone SBDebugger &SBDebugger::operator=(const SBDebugger &rhs) {
141baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBDebugger &,
142baf5664fSJonas Devlieghere                      SBDebugger, operator=,(const lldb::SBDebugger &), rhs);
143baf5664fSJonas Devlieghere 
144b9c1b51eSKate Stone   if (this != &rhs) {
145dbb0abbfSEugene Zelenko     m_opaque_sp = rhs.m_opaque_sp;
146dbb0abbfSEugene Zelenko   }
147306809f2SJonas Devlieghere   return LLDB_RECORD_RESULT(*this);
148dbb0abbfSEugene Zelenko }
149dbb0abbfSEugene Zelenko 
150b9c1b51eSKate Stone void SBDebugger::Initialize() {
151baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD_NO_ARGS(void, SBDebugger, Initialize);
152936c6242SJonas Devlieghere   SBError ignored = SBDebugger::InitializeWithErrorHandling();
15315eacd74SJonas Devlieghere }
15415eacd74SJonas Devlieghere 
155936c6242SJonas Devlieghere lldb::SBError SBDebugger::InitializeWithErrorHandling() {
156baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD_NO_ARGS(lldb::SBError, SBDebugger,
157baf5664fSJonas Devlieghere                                     InitializeWithErrorHandling);
158baf5664fSJonas Devlieghere 
15915eacd74SJonas Devlieghere   SBError error;
16015eacd74SJonas Devlieghere   if (auto e = g_debugger_lifetime->Initialize(
161a8f3ae7cSJonas Devlieghere           std::make_unique<SystemInitializerFull>(), LoadPlugin)) {
16215eacd74SJonas Devlieghere     error.SetError(Status(std::move(e)));
16315eacd74SJonas Devlieghere   }
164baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(error);
16530fdc8d8SChris Lattner }
16630fdc8d8SChris Lattner 
167baf5664fSJonas Devlieghere void SBDebugger::Terminate() {
168baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD_NO_ARGS(void, SBDebugger, Terminate);
169baf5664fSJonas Devlieghere 
170baf5664fSJonas Devlieghere   g_debugger_lifetime->Terminate();
171baf5664fSJonas Devlieghere }
17230fdc8d8SChris Lattner 
173b9c1b51eSKate Stone void SBDebugger::Clear() {
174baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(void, SBDebugger, Clear);
175baf5664fSJonas Devlieghere 
1763d6086f6SCaroline Tice   if (m_opaque_sp)
17744d93782SGreg Clayton     m_opaque_sp->ClearIOHandlers();
178ceb6b139SCaroline Tice 
17948e42549SGreg Clayton   m_opaque_sp.reset();
18048e42549SGreg Clayton }
18148e42549SGreg Clayton 
182b9c1b51eSKate Stone SBDebugger SBDebugger::Create() {
183baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD_NO_ARGS(lldb::SBDebugger, SBDebugger, Create);
184baf5664fSJonas Devlieghere 
185baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(SBDebugger::Create(false, nullptr, nullptr));
18606942690SJim Ingham }
18706942690SJim Ingham 
188b9c1b51eSKate Stone SBDebugger SBDebugger::Create(bool source_init_files) {
189baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD(lldb::SBDebugger, SBDebugger, Create, (bool),
190baf5664fSJonas Devlieghere                             source_init_files);
191baf5664fSJonas Devlieghere 
192baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(
193baf5664fSJonas Devlieghere       SBDebugger::Create(source_init_files, nullptr, nullptr));
194228063cdSJim Ingham }
195228063cdSJim Ingham 
196b9c1b51eSKate Stone SBDebugger SBDebugger::Create(bool source_init_files,
197b9c1b51eSKate Stone                               lldb::LogOutputCallback callback, void *baton)
198228063cdSJim Ingham 
199228063cdSJim Ingham {
2000d7b0c96SJonas Devlieghere   LLDB_RECORD_DUMMY(lldb::SBDebugger, SBDebugger, Create,
2017bc83564SJonas Devlieghere                     (bool, lldb::LogOutputCallback, void *), source_init_files,
2027bc83564SJonas Devlieghere                     callback, baton);
203ceb6b139SCaroline Tice 
2046611103cSGreg Clayton   SBDebugger debugger;
205cb172b10SGreg Clayton 
206b9c1b51eSKate Stone   // Currently we have issues if this function is called simultaneously on two
20705097246SAdrian Prantl   // different threads. The issues mainly revolve around the fact that the
20805097246SAdrian Prantl   // lldb_private::FormatManager uses global collections and having two threads
20905097246SAdrian Prantl   // parsing the .lldbinit files can cause mayhem. So to get around this for
21005097246SAdrian Prantl   // now we need to use a mutex to prevent bad things from happening.
21116ff8604SSaleem Abdulrasool   static std::recursive_mutex g_mutex;
21216ff8604SSaleem Abdulrasool   std::lock_guard<std::recursive_mutex> guard(g_mutex);
213cb172b10SGreg Clayton 
214228063cdSJim Ingham   debugger.reset(Debugger::CreateInstance(callback, baton));
215ceb6b139SCaroline Tice 
21606942690SJim Ingham   SBCommandInterpreter interp = debugger.GetCommandInterpreter();
217b9c1b51eSKate Stone   if (source_init_files) {
21806942690SJim Ingham     interp.get()->SkipLLDBInitFiles(false);
21906942690SJim Ingham     interp.get()->SkipAppInitFiles(false);
22006942690SJim Ingham     SBCommandReturnObject result;
22106942690SJim Ingham     interp.SourceInitFileInHomeDirectory(result);
222b9c1b51eSKate Stone   } else {
22306942690SJim Ingham     interp.get()->SkipLLDBInitFiles(true);
22406942690SJim Ingham     interp.get()->SkipAppInitFiles(true);
22506942690SJim Ingham   }
2266611103cSGreg Clayton   return debugger;
2276611103cSGreg Clayton }
2286611103cSGreg Clayton 
229b9c1b51eSKate Stone void SBDebugger::Destroy(SBDebugger &debugger) {
230baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD(void, SBDebugger, Destroy, (lldb::SBDebugger &),
231baf5664fSJonas Devlieghere                             debugger);
232baf5664fSJonas Devlieghere 
233e02657b1SCaroline Tice   Debugger::Destroy(debugger.m_opaque_sp);
234e02657b1SCaroline Tice 
235dbb0abbfSEugene Zelenko   if (debugger.m_opaque_sp.get() != nullptr)
236e02657b1SCaroline Tice     debugger.m_opaque_sp.reset();
237e02657b1SCaroline Tice }
238e02657b1SCaroline Tice 
239b9c1b51eSKate Stone void SBDebugger::MemoryPressureDetected() {
240baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD_NO_ARGS(void, SBDebugger, MemoryPressureDetected);
241baf5664fSJonas Devlieghere 
24205097246SAdrian Prantl   // Since this function can be call asynchronously, we allow it to be non-
24305097246SAdrian Prantl   // mandatory. We have seen deadlocks with this function when called so we
24405097246SAdrian Prantl   // need to safeguard against this until we can determine what is causing the
24505097246SAdrian Prantl   // deadlocks.
246aebdf1beSJim Ingham 
2470cd70866SGreg Clayton   const bool mandatory = false;
248aebdf1beSJim Ingham 
2490cd70866SGreg Clayton   ModuleList::RemoveOrphanSharedModules(mandatory);
250f9322415SGreg Clayton }
251f9322415SGreg Clayton 
252baf5664fSJonas Devlieghere bool SBDebugger::IsValid() const {
253baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBDebugger, IsValid);
2547f5237bcSPavel Labath   return this->operator bool();
2557f5237bcSPavel Labath }
2567f5237bcSPavel Labath SBDebugger::operator bool() const {
2577f5237bcSPavel Labath   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBDebugger, operator bool);
258baf5664fSJonas Devlieghere 
259baf5664fSJonas Devlieghere   return m_opaque_sp.get() != nullptr;
260baf5664fSJonas Devlieghere }
2616611103cSGreg Clayton 
262b9c1b51eSKate Stone void SBDebugger::SetAsync(bool b) {
263baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBDebugger, SetAsync, (bool), b);
264baf5664fSJonas Devlieghere 
2656611103cSGreg Clayton   if (m_opaque_sp)
2666611103cSGreg Clayton     m_opaque_sp->SetAsyncExecution(b);
26730fdc8d8SChris Lattner }
26830fdc8d8SChris Lattner 
269b9c1b51eSKate Stone bool SBDebugger::GetAsync() {
270baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(bool, SBDebugger, GetAsync);
271baf5664fSJonas Devlieghere 
272dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetAsyncExecution() : false);
273e64f0dc7SJim Ingham }
274e64f0dc7SJim Ingham 
275b9c1b51eSKate Stone void SBDebugger::SkipLLDBInitFiles(bool b) {
276baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBDebugger, SkipLLDBInitFiles, (bool), b);
277baf5664fSJonas Devlieghere 
2786eee5aa0SGreg Clayton   if (m_opaque_sp)
2796eee5aa0SGreg Clayton     m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles(b);
2806eee5aa0SGreg Clayton }
2816eee5aa0SGreg Clayton 
282b9c1b51eSKate Stone void SBDebugger::SkipAppInitFiles(bool b) {
283baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBDebugger, SkipAppInitFiles, (bool), b);
284baf5664fSJonas Devlieghere 
28516e0c686SJim Ingham   if (m_opaque_sp)
28616e0c686SJim Ingham     m_opaque_sp->GetCommandInterpreter().SkipAppInitFiles(b);
28716e0c686SJim Ingham }
28816e0c686SJim Ingham 
289b9c1b51eSKate Stone void SBDebugger::SetInputFileHandle(FILE *fh, bool transfer_ownership) {
290baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBDebugger, SetInputFileHandle, (FILE *, bool), fh,
291baf5664fSJonas Devlieghere                      transfer_ownership);
292f913fd6eSLawrence D'Anna   SetInputFile((FileSP)std::make_shared<NativeFile>(fh, transfer_ownership));
29396898eb6SLawrence D'Anna }
294baf5664fSJonas Devlieghere 
295c040b30fSLawrence D'Anna SBError SBDebugger::SetInputFile(FileSP file_sp) {
296c040b30fSLawrence D'Anna   LLDB_RECORD_METHOD(SBError, SBDebugger, SetInputFile, (FileSP), file_sp);
297*fe5ab6d2SJonas Devlieghere   return LLDB_RECORD_RESULT(SetInputFile(SBFile(file_sp)));
298c040b30fSLawrence D'Anna }
299c040b30fSLawrence D'Anna 
30096898eb6SLawrence D'Anna // Shouldn't really be settable after initialization as this could cause lots
30196898eb6SLawrence D'Anna // of problems; don't want users trying to switch modes in the middle of a
30296898eb6SLawrence D'Anna // debugging session.
30396898eb6SLawrence D'Anna SBError SBDebugger::SetInputFile(SBFile file) {
30496898eb6SLawrence D'Anna   LLDB_RECORD_METHOD(SBError, SBDebugger, SetInputFile, (SBFile), file);
30596898eb6SLawrence D'Anna 
30696898eb6SLawrence D'Anna   SBError error;
30796898eb6SLawrence D'Anna   if (!m_opaque_sp) {
30896898eb6SLawrence D'Anna     error.ref().SetErrorString("invalid debugger");
309*fe5ab6d2SJonas Devlieghere     return LLDB_RECORD_RESULT(error);
31096898eb6SLawrence D'Anna   }
311d77c2e09SJonas Devlieghere 
312d77c2e09SJonas Devlieghere   repro::DataRecorder *recorder = nullptr;
313d77c2e09SJonas Devlieghere   if (repro::Generator *g = repro::Reproducer::Instance().GetGenerator())
314d77c2e09SJonas Devlieghere     recorder = g->GetOrCreate<repro::CommandProvider>().GetNewDataRecorder();
315d77c2e09SJonas Devlieghere 
31696898eb6SLawrence D'Anna   FileSP file_sp = file.m_opaque_sp;
31796898eb6SLawrence D'Anna 
3184a491ec4SJonas Devlieghere   static std::unique_ptr<repro::CommandLoader> loader =
3194a491ec4SJonas Devlieghere       repro::CommandLoader::Create(repro::Reproducer::Instance().GetLoader());
3204a491ec4SJonas Devlieghere   if (loader) {
32196898eb6SLawrence D'Anna     llvm::Optional<std::string> nextfile = loader->GetNextFile();
32296898eb6SLawrence D'Anna     FILE *fh = nextfile ? FileSystem::Instance().Fopen(nextfile->c_str(), "r")
32396898eb6SLawrence D'Anna                         : nullptr;
32496898eb6SLawrence D'Anna     // FIXME Jonas Devlieghere: shouldn't this error be propagated out to the
32596898eb6SLawrence D'Anna     // reproducer somehow if fh is NULL?
32696898eb6SLawrence D'Anna     if (fh) {
327f913fd6eSLawrence D'Anna       file_sp = std::make_shared<NativeFile>(fh, true);
32896898eb6SLawrence D'Anna     }
3294a491ec4SJonas Devlieghere   }
330d77c2e09SJonas Devlieghere 
33196898eb6SLawrence D'Anna   if (!file_sp || !file_sp->IsValid()) {
33296898eb6SLawrence D'Anna     error.ref().SetErrorString("invalid file");
333*fe5ab6d2SJonas Devlieghere     return LLDB_RECORD_RESULT(error);
33496898eb6SLawrence D'Anna   }
33596898eb6SLawrence D'Anna 
33696898eb6SLawrence D'Anna   m_opaque_sp->SetInputFile(file_sp, recorder);
337*fe5ab6d2SJonas Devlieghere   return LLDB_RECORD_RESULT(error);
33830fdc8d8SChris Lattner }
33930fdc8d8SChris Lattner 
340c040b30fSLawrence D'Anna SBError SBDebugger::SetOutputFile(FileSP file_sp) {
341c040b30fSLawrence D'Anna   LLDB_RECORD_METHOD(SBError, SBDebugger, SetOutputFile, (FileSP), file_sp);
342*fe5ab6d2SJonas Devlieghere   return LLDB_RECORD_RESULT(SetOutputFile(SBFile(file_sp)));
343c040b30fSLawrence D'Anna }
344c040b30fSLawrence D'Anna 
345b9c1b51eSKate Stone void SBDebugger::SetOutputFileHandle(FILE *fh, bool transfer_ownership) {
346baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBDebugger, SetOutputFileHandle, (FILE *, bool), fh,
347baf5664fSJonas Devlieghere                      transfer_ownership);
348f913fd6eSLawrence D'Anna   SetOutputFile((FileSP)std::make_shared<NativeFile>(fh, transfer_ownership));
34996898eb6SLawrence D'Anna }
350baf5664fSJonas Devlieghere 
35196898eb6SLawrence D'Anna SBError SBDebugger::SetOutputFile(SBFile file) {
35296898eb6SLawrence D'Anna   LLDB_RECORD_METHOD(SBError, SBDebugger, SetOutputFile, (SBFile file), file);
35396898eb6SLawrence D'Anna   SBError error;
35496898eb6SLawrence D'Anna   if (!m_opaque_sp) {
35596898eb6SLawrence D'Anna     error.ref().SetErrorString("invalid debugger");
356*fe5ab6d2SJonas Devlieghere     return LLDB_RECORD_RESULT(error);
35796898eb6SLawrence D'Anna   }
35896898eb6SLawrence D'Anna   if (!file) {
35996898eb6SLawrence D'Anna     error.ref().SetErrorString("invalid file");
360*fe5ab6d2SJonas Devlieghere     return LLDB_RECORD_RESULT(error);
36196898eb6SLawrence D'Anna   }
36296898eb6SLawrence D'Anna   m_opaque_sp->SetOutputFile(file.m_opaque_sp);
363*fe5ab6d2SJonas Devlieghere   return LLDB_RECORD_RESULT(error);
36430fdc8d8SChris Lattner }
36530fdc8d8SChris Lattner 
366b9c1b51eSKate Stone void SBDebugger::SetErrorFileHandle(FILE *fh, bool transfer_ownership) {
367baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBDebugger, SetErrorFileHandle, (FILE *, bool), fh,
368baf5664fSJonas Devlieghere                      transfer_ownership);
369f913fd6eSLawrence D'Anna   SetErrorFile((FileSP)std::make_shared<NativeFile>(fh, transfer_ownership));
37096898eb6SLawrence D'Anna }
371baf5664fSJonas Devlieghere 
372c040b30fSLawrence D'Anna SBError SBDebugger::SetErrorFile(FileSP file_sp) {
373c040b30fSLawrence D'Anna   LLDB_RECORD_METHOD(SBError, SBDebugger, SetErrorFile, (FileSP), file_sp);
374*fe5ab6d2SJonas Devlieghere   return LLDB_RECORD_RESULT(SetErrorFile(SBFile(file_sp)));
375c040b30fSLawrence D'Anna }
376c040b30fSLawrence D'Anna 
37796898eb6SLawrence D'Anna SBError SBDebugger::SetErrorFile(SBFile file) {
37896898eb6SLawrence D'Anna   LLDB_RECORD_METHOD(SBError, SBDebugger, SetErrorFile, (SBFile file), file);
37996898eb6SLawrence D'Anna   SBError error;
38096898eb6SLawrence D'Anna   if (!m_opaque_sp) {
38196898eb6SLawrence D'Anna     error.ref().SetErrorString("invalid debugger");
382*fe5ab6d2SJonas Devlieghere     return LLDB_RECORD_RESULT(error);
38396898eb6SLawrence D'Anna   }
38496898eb6SLawrence D'Anna   if (!file) {
38596898eb6SLawrence D'Anna     error.ref().SetErrorString("invalid file");
386*fe5ab6d2SJonas Devlieghere     return LLDB_RECORD_RESULT(error);
38796898eb6SLawrence D'Anna   }
38896898eb6SLawrence D'Anna   m_opaque_sp->SetErrorFile(file.m_opaque_sp);
389*fe5ab6d2SJonas Devlieghere   return LLDB_RECORD_RESULT(error);
39030fdc8d8SChris Lattner }
39130fdc8d8SChris Lattner 
392b9c1b51eSKate Stone FILE *SBDebugger::GetInputFileHandle() {
393baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(FILE *, SBDebugger, GetInputFileHandle);
394b9c1b51eSKate Stone   if (m_opaque_sp) {
3957ca15ba7SLawrence D'Anna     File &file_sp = m_opaque_sp->GetInputFile();
3967ca15ba7SLawrence D'Anna     return LLDB_RECORD_RESULT(file_sp.GetStream());
39744d93782SGreg Clayton   }
398*fe5ab6d2SJonas Devlieghere   return LLDB_RECORD_RESULT(nullptr);
39930fdc8d8SChris Lattner }
40030fdc8d8SChris Lattner 
40196898eb6SLawrence D'Anna SBFile SBDebugger::GetInputFile() {
40296898eb6SLawrence D'Anna   LLDB_RECORD_METHOD_NO_ARGS(SBFile, SBDebugger, GetInputFile);
40396898eb6SLawrence D'Anna   if (m_opaque_sp) {
40496898eb6SLawrence D'Anna     return LLDB_RECORD_RESULT(SBFile(m_opaque_sp->GetInputFileSP()));
40596898eb6SLawrence D'Anna   }
40696898eb6SLawrence D'Anna   return LLDB_RECORD_RESULT(SBFile());
40796898eb6SLawrence D'Anna }
40896898eb6SLawrence D'Anna 
409b9c1b51eSKate Stone FILE *SBDebugger::GetOutputFileHandle() {
410baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(FILE *, SBDebugger, GetOutputFileHandle);
411b9c1b51eSKate Stone   if (m_opaque_sp) {
4127ca15ba7SLawrence D'Anna     StreamFile &stream_file = m_opaque_sp->GetOutputStream();
4137ca15ba7SLawrence D'Anna     return LLDB_RECORD_RESULT(stream_file.GetFile().GetStream());
41444d93782SGreg Clayton   }
415*fe5ab6d2SJonas Devlieghere   return LLDB_RECORD_RESULT(nullptr);
41630fdc8d8SChris Lattner }
41730fdc8d8SChris Lattner 
41896898eb6SLawrence D'Anna SBFile SBDebugger::GetOutputFile() {
41996898eb6SLawrence D'Anna   LLDB_RECORD_METHOD_NO_ARGS(SBFile, SBDebugger, GetOutputFile);
42096898eb6SLawrence D'Anna   if (m_opaque_sp) {
42196898eb6SLawrence D'Anna     SBFile file(m_opaque_sp->GetOutputStream().GetFileSP());
42296898eb6SLawrence D'Anna     return LLDB_RECORD_RESULT(file);
42396898eb6SLawrence D'Anna   }
42496898eb6SLawrence D'Anna   return LLDB_RECORD_RESULT(SBFile());
42596898eb6SLawrence D'Anna }
42696898eb6SLawrence D'Anna 
427b9c1b51eSKate Stone FILE *SBDebugger::GetErrorFileHandle() {
428baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(FILE *, SBDebugger, GetErrorFileHandle);
429baf5664fSJonas Devlieghere 
430b9c1b51eSKate Stone   if (m_opaque_sp) {
4317ca15ba7SLawrence D'Anna     StreamFile &stream_file = m_opaque_sp->GetErrorStream();
4327ca15ba7SLawrence D'Anna     return LLDB_RECORD_RESULT(stream_file.GetFile().GetStream());
43344d93782SGreg Clayton   }
434*fe5ab6d2SJonas Devlieghere   return LLDB_RECORD_RESULT(nullptr);
43530fdc8d8SChris Lattner }
43630fdc8d8SChris Lattner 
43796898eb6SLawrence D'Anna SBFile SBDebugger::GetErrorFile() {
43896898eb6SLawrence D'Anna   LLDB_RECORD_METHOD_NO_ARGS(SBFile, SBDebugger, GetErrorFile);
43996898eb6SLawrence D'Anna   SBFile file;
44096898eb6SLawrence D'Anna   if (m_opaque_sp) {
44196898eb6SLawrence D'Anna     SBFile file(m_opaque_sp->GetErrorStream().GetFileSP());
44296898eb6SLawrence D'Anna     return LLDB_RECORD_RESULT(file);
44396898eb6SLawrence D'Anna   }
44496898eb6SLawrence D'Anna   return LLDB_RECORD_RESULT(SBFile());
44596898eb6SLawrence D'Anna }
44696898eb6SLawrence D'Anna 
447b9c1b51eSKate Stone void SBDebugger::SaveInputTerminalState() {
448b328dcbfSJonas Devlieghere   LLDB_RECORD_DUMMY_NO_ARGS(void, SBDebugger, SaveInputTerminalState);
449baf5664fSJonas Devlieghere 
450c5917d9aSJim Ingham   if (m_opaque_sp)
451c5917d9aSJim Ingham     m_opaque_sp->SaveInputTerminalState();
452c5917d9aSJim Ingham }
453c5917d9aSJim Ingham 
454b9c1b51eSKate Stone void SBDebugger::RestoreInputTerminalState() {
455b328dcbfSJonas Devlieghere   LLDB_RECORD_DUMMY_NO_ARGS(void, SBDebugger, RestoreInputTerminalState);
456baf5664fSJonas Devlieghere 
457c5917d9aSJim Ingham   if (m_opaque_sp)
458c5917d9aSJim Ingham     m_opaque_sp->RestoreInputTerminalState();
459c5917d9aSJim Ingham }
460b9c1b51eSKate Stone SBCommandInterpreter SBDebugger::GetCommandInterpreter() {
461baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::SBCommandInterpreter, SBDebugger,
462baf5664fSJonas Devlieghere                              GetCommandInterpreter);
463baf5664fSJonas Devlieghere 
4646611103cSGreg Clayton   SBCommandInterpreter sb_interpreter;
4656611103cSGreg Clayton   if (m_opaque_sp)
4666611103cSGreg Clayton     sb_interpreter.reset(&m_opaque_sp->GetCommandInterpreter());
467ceb6b139SCaroline Tice 
468baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_interpreter);
46930fdc8d8SChris Lattner }
47030fdc8d8SChris Lattner 
471b9c1b51eSKate Stone void SBDebugger::HandleCommand(const char *command) {
472baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBDebugger, HandleCommand, (const char *), command);
473baf5664fSJonas Devlieghere 
474b9c1b51eSKate Stone   if (m_opaque_sp) {
475af67cecdSGreg Clayton     TargetSP target_sp(m_opaque_sp->GetSelectedTarget());
476bb19a13cSSaleem Abdulrasool     std::unique_lock<std::recursive_mutex> lock;
477af67cecdSGreg Clayton     if (target_sp)
478bb19a13cSSaleem Abdulrasool       lock = std::unique_lock<std::recursive_mutex>(target_sp->GetAPIMutex());
479af67cecdSGreg Clayton 
4806611103cSGreg Clayton     SBCommandInterpreter sb_interpreter(GetCommandInterpreter());
48130fdc8d8SChris Lattner     SBCommandReturnObject result;
48230fdc8d8SChris Lattner 
48330fdc8d8SChris Lattner     sb_interpreter.HandleCommand(command, result, false);
48430fdc8d8SChris Lattner 
4855da2bc22SLawrence D'Anna     result.PutError(m_opaque_sp->GetErrorStream().GetFileSP());
4865da2bc22SLawrence D'Anna     result.PutOutput(m_opaque_sp->GetOutputStream().GetFileSP());
48730fdc8d8SChris Lattner 
488b9c1b51eSKate Stone     if (!m_opaque_sp->GetAsyncExecution()) {
4896611103cSGreg Clayton       SBProcess process(GetCommandInterpreter().GetProcess());
490b9556accSGreg Clayton       ProcessSP process_sp(process.GetSP());
491b9c1b51eSKate Stone       if (process_sp) {
49230fdc8d8SChris Lattner         EventSP event_sp;
493583bbb1dSJim Ingham         ListenerSP lldb_listener_sp = m_opaque_sp->GetListener();
494d35031e1SPavel Labath         while (lldb_listener_sp->GetEventForBroadcaster(
495d35031e1SPavel Labath             process_sp.get(), event_sp, std::chrono::seconds(0))) {
49630fdc8d8SChris Lattner           SBEvent event(event_sp);
497322f12afSLawrence D'Anna           HandleProcessEvent(process, event, GetOutputFile(), GetErrorFile());
49830fdc8d8SChris Lattner         }
49930fdc8d8SChris Lattner       }
50030fdc8d8SChris Lattner     }
50130fdc8d8SChris Lattner   }
5026611103cSGreg Clayton }
50330fdc8d8SChris Lattner 
504b9c1b51eSKate Stone SBListener SBDebugger::GetListener() {
505baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::SBListener, SBDebugger, GetListener);
506baf5664fSJonas Devlieghere 
5076611103cSGreg Clayton   SBListener sb_listener;
5086611103cSGreg Clayton   if (m_opaque_sp)
509583bbb1dSJim Ingham     sb_listener.reset(m_opaque_sp->GetListener());
510ceb6b139SCaroline Tice 
511baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_listener);
51230fdc8d8SChris Lattner }
51330fdc8d8SChris Lattner 
514b9c1b51eSKate Stone void SBDebugger::HandleProcessEvent(const SBProcess &process,
515322f12afSLawrence D'Anna                                     const SBEvent &event, SBFile out,
516322f12afSLawrence D'Anna                                     SBFile err) {
517322f12afSLawrence D'Anna   LLDB_RECORD_METHOD(
518322f12afSLawrence D'Anna       void, SBDebugger, HandleProcessEvent,
519322f12afSLawrence D'Anna       (const lldb::SBProcess &, const lldb::SBEvent &, SBFile, SBFile), process,
520322f12afSLawrence D'Anna       event, out, err);
521322f12afSLawrence D'Anna 
522322f12afSLawrence D'Anna   return HandleProcessEvent(process, event, out.m_opaque_sp, err.m_opaque_sp);
523322f12afSLawrence D'Anna }
524322f12afSLawrence D'Anna 
525322f12afSLawrence D'Anna void SBDebugger::HandleProcessEvent(const SBProcess &process,
526b9c1b51eSKate Stone                                     const SBEvent &event, FILE *out,
527b9c1b51eSKate Stone                                     FILE *err) {
528baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(
529baf5664fSJonas Devlieghere       void, SBDebugger, HandleProcessEvent,
530baf5664fSJonas Devlieghere       (const lldb::SBProcess &, const lldb::SBEvent &, FILE *, FILE *), process,
531baf5664fSJonas Devlieghere       event, out, err);
532baf5664fSJonas Devlieghere 
533322f12afSLawrence D'Anna   FileSP outfile = std::make_shared<NativeFile>(out, false);
534322f12afSLawrence D'Anna   FileSP errfile = std::make_shared<NativeFile>(err, false);
535322f12afSLawrence D'Anna   return HandleProcessEvent(process, event, outfile, errfile);
536322f12afSLawrence D'Anna }
537322f12afSLawrence D'Anna 
538322f12afSLawrence D'Anna void SBDebugger::HandleProcessEvent(const SBProcess &process,
539322f12afSLawrence D'Anna                                     const SBEvent &event, FileSP out_sp,
540322f12afSLawrence D'Anna                                     FileSP err_sp) {
541322f12afSLawrence D'Anna 
542322f12afSLawrence D'Anna   LLDB_RECORD_METHOD(
543322f12afSLawrence D'Anna       void, SBDebugger, HandleProcessEvent,
544322f12afSLawrence D'Anna       (const lldb::SBProcess &, const lldb::SBEvent &, FileSP, FileSP), process,
545322f12afSLawrence D'Anna       event, out_sp, err_sp);
546322f12afSLawrence D'Anna 
547af67cecdSGreg Clayton   if (!process.IsValid())
548af67cecdSGreg Clayton     return;
549af67cecdSGreg Clayton 
550b9556accSGreg Clayton   TargetSP target_sp(process.GetTarget().GetSP());
551b9556accSGreg Clayton   if (!target_sp)
552b9556accSGreg Clayton     return;
553b9556accSGreg Clayton 
55430fdc8d8SChris Lattner   const uint32_t event_type = event.GetType();
55530fdc8d8SChris Lattner   char stdio_buffer[1024];
55630fdc8d8SChris Lattner   size_t len;
55730fdc8d8SChris Lattner 
558bb19a13cSSaleem Abdulrasool   std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
559af67cecdSGreg Clayton 
560b9c1b51eSKate Stone   if (event_type &
561b9c1b51eSKate Stone       (Process::eBroadcastBitSTDOUT | Process::eBroadcastBitStateChanged)) {
562af67cecdSGreg Clayton     // Drain stdout when we stop just in case we have any bytes
56330fdc8d8SChris Lattner     while ((len = process.GetSTDOUT(stdio_buffer, sizeof(stdio_buffer))) > 0)
564322f12afSLawrence D'Anna       if (out_sp)
565322f12afSLawrence D'Anna         out_sp->Write(stdio_buffer, len);
56630fdc8d8SChris Lattner   }
567af67cecdSGreg Clayton 
568b9c1b51eSKate Stone   if (event_type &
569b9c1b51eSKate Stone       (Process::eBroadcastBitSTDERR | Process::eBroadcastBitStateChanged)) {
570af67cecdSGreg Clayton     // Drain stderr when we stop just in case we have any bytes
57130fdc8d8SChris Lattner     while ((len = process.GetSTDERR(stdio_buffer, sizeof(stdio_buffer))) > 0)
572322f12afSLawrence D'Anna       if (err_sp)
573322f12afSLawrence D'Anna         err_sp->Write(stdio_buffer, len);
57430fdc8d8SChris Lattner   }
575af67cecdSGreg Clayton 
576b9c1b51eSKate Stone   if (event_type & Process::eBroadcastBitStateChanged) {
57730fdc8d8SChris Lattner     StateType event_state = SBProcess::GetStateFromEvent(event);
57830fdc8d8SChris Lattner 
57930fdc8d8SChris Lattner     if (event_state == eStateInvalid)
58030fdc8d8SChris Lattner       return;
58130fdc8d8SChris Lattner 
58230fdc8d8SChris Lattner     bool is_stopped = StateIsStoppedState(event_state);
58330fdc8d8SChris Lattner     if (!is_stopped)
584322f12afSLawrence D'Anna       process.ReportEventState(event, out_sp);
58530fdc8d8SChris Lattner   }
58630fdc8d8SChris Lattner }
58730fdc8d8SChris Lattner 
588b9c1b51eSKate Stone SBSourceManager SBDebugger::GetSourceManager() {
589baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::SBSourceManager, SBDebugger,
590baf5664fSJonas Devlieghere                              GetSourceManager);
591baf5664fSJonas Devlieghere 
592e37d605eSJim Ingham   SBSourceManager sb_source_manager(*this);
593baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_source_manager);
59430fdc8d8SChris Lattner }
59530fdc8d8SChris Lattner 
596b9c1b51eSKate Stone bool SBDebugger::GetDefaultArchitecture(char *arch_name, size_t arch_name_len) {
597baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD(bool, SBDebugger, GetDefaultArchitecture,
598baf5664fSJonas Devlieghere                             (char *, size_t), "", arch_name_len);
599baf5664fSJonas Devlieghere 
600b9c1b51eSKate Stone   if (arch_name && arch_name_len) {
601431ce678SGreg Clayton     ArchSpec default_arch = Target::GetDefaultArchitecture();
602daccaa9eSCaroline Tice 
603b9c1b51eSKate Stone     if (default_arch.IsValid()) {
604431ce678SGreg Clayton       const std::string &triple_str = default_arch.GetTriple().str();
605431ce678SGreg Clayton       if (!triple_str.empty())
606431ce678SGreg Clayton         ::snprintf(arch_name, arch_name_len, "%s", triple_str.c_str());
607431ce678SGreg Clayton       else
608b9c1b51eSKate Stone         ::snprintf(arch_name, arch_name_len, "%s",
609b9c1b51eSKate Stone                    default_arch.GetArchitectureName());
61030fdc8d8SChris Lattner       return true;
61130fdc8d8SChris Lattner     }
61230fdc8d8SChris Lattner   }
61330fdc8d8SChris Lattner   if (arch_name && arch_name_len)
61430fdc8d8SChris Lattner     arch_name[0] = '\0';
61530fdc8d8SChris Lattner   return false;
61630fdc8d8SChris Lattner }
61730fdc8d8SChris Lattner 
618b9c1b51eSKate Stone bool SBDebugger::SetDefaultArchitecture(const char *arch_name) {
619baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD(bool, SBDebugger, SetDefaultArchitecture,
620baf5664fSJonas Devlieghere                             (const char *), arch_name);
621baf5664fSJonas Devlieghere 
622b9c1b51eSKate Stone   if (arch_name) {
62370512317SGreg Clayton     ArchSpec arch(arch_name);
624b9c1b51eSKate Stone     if (arch.IsValid()) {
625431ce678SGreg Clayton       Target::SetDefaultArchitecture(arch);
62630fdc8d8SChris Lattner       return true;
62730fdc8d8SChris Lattner     }
62830fdc8d8SChris Lattner   }
62930fdc8d8SChris Lattner   return false;
63030fdc8d8SChris Lattner }
63130fdc8d8SChris Lattner 
63230fdc8d8SChris Lattner ScriptLanguage
633b9c1b51eSKate Stone SBDebugger::GetScriptingLanguage(const char *script_language_name) {
634baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::ScriptLanguage, SBDebugger, GetScriptingLanguage,
635baf5664fSJonas Devlieghere                      (const char *), script_language_name);
636baf5664fSJonas Devlieghere 
637d9aec34bSJonas Devlieghere   if (!script_language_name)
638d9aec34bSJonas Devlieghere     return eScriptLanguageDefault;
63947cbf4a0SPavel Labath   return OptionArgParser::ToScriptLanguage(
64047cbf4a0SPavel Labath       llvm::StringRef(script_language_name), eScriptLanguageDefault, nullptr);
64130fdc8d8SChris Lattner }
64230fdc8d8SChris Lattner 
643b9c1b51eSKate Stone const char *SBDebugger::GetVersionString() {
644baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD_NO_ARGS(const char *, SBDebugger, GetVersionString);
645baf5664fSJonas Devlieghere 
646b2f1fb29SVirgile Bello   return lldb_private::GetVersion();
64730fdc8d8SChris Lattner }
64830fdc8d8SChris Lattner 
649b9c1b51eSKate Stone const char *SBDebugger::StateAsCString(StateType state) {
650baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD(const char *, SBDebugger, StateAsCString,
651baf5664fSJonas Devlieghere                             (lldb::StateType), state);
652baf5664fSJonas Devlieghere 
653c2bbb49aSCaroline Tice   return lldb_private::StateAsCString(state);
65430fdc8d8SChris Lattner }
65530fdc8d8SChris Lattner 
656f1389e92SPavel Labath static void AddBoolConfigEntry(StructuredData::Dictionary &dict,
657f1389e92SPavel Labath                                llvm::StringRef name, bool value,
658f1389e92SPavel Labath                                llvm::StringRef description) {
659a8f3ae7cSJonas Devlieghere   auto entry_up = std::make_unique<StructuredData::Dictionary>();
660f1389e92SPavel Labath   entry_up->AddBooleanItem("value", value);
661f1389e92SPavel Labath   entry_up->AddStringItem("description", description);
662f1389e92SPavel Labath   dict.AddItem(name, std::move(entry_up));
663f1389e92SPavel Labath }
664f1389e92SPavel Labath 
665abc0c6adSPavel Labath static void AddLLVMTargets(StructuredData::Dictionary &dict) {
666a8f3ae7cSJonas Devlieghere   auto array_up = std::make_unique<StructuredData::Array>();
667abc0c6adSPavel Labath #define LLVM_TARGET(target)                                                    \
668a8f3ae7cSJonas Devlieghere   array_up->AddItem(std::make_unique<StructuredData::String>(#target));
669abc0c6adSPavel Labath #include "llvm/Config/Targets.def"
670a8f3ae7cSJonas Devlieghere   auto entry_up = std::make_unique<StructuredData::Dictionary>();
671abc0c6adSPavel Labath   entry_up->AddItem("value", std::move(array_up));
672abc0c6adSPavel Labath   entry_up->AddStringItem("description", "A list of configured LLVM targets.");
673abc0c6adSPavel Labath   dict.AddItem("targets", std::move(entry_up));
674abc0c6adSPavel Labath }
675abc0c6adSPavel Labath 
676f1389e92SPavel Labath SBStructuredData SBDebugger::GetBuildConfiguration() {
677baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD_NO_ARGS(lldb::SBStructuredData, SBDebugger,
678baf5664fSJonas Devlieghere                                     GetBuildConfiguration);
679baf5664fSJonas Devlieghere 
680a8f3ae7cSJonas Devlieghere   auto config_up = std::make_unique<StructuredData::Dictionary>();
681f1389e92SPavel Labath   AddBoolConfigEntry(
682f1389e92SPavel Labath       *config_up, "xml", XMLDocument::XMLEnabled(),
683f1389e92SPavel Labath       "A boolean value that indicates if XML support is enabled in LLDB");
684eafede2aSPavel Labath   bool have_curses = true;
685eafede2aSPavel Labath #ifdef LLDB_DISABLE_CURSES
686eafede2aSPavel Labath   have_curses = false;
687eafede2aSPavel Labath #endif
688eafede2aSPavel Labath   AddBoolConfigEntry(
689eafede2aSPavel Labath       *config_up, "curses", have_curses,
690eafede2aSPavel Labath       "A boolean value that indicates if curses support is enabled in LLDB");
691abc0c6adSPavel Labath   AddLLVMTargets(*config_up);
692f1389e92SPavel Labath 
693f1389e92SPavel Labath   SBStructuredData data;
694f1389e92SPavel Labath   data.m_impl_up->SetObjectSP(std::move(config_up));
695baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(data);
696f1389e92SPavel Labath }
697f1389e92SPavel Labath 
698b9c1b51eSKate Stone bool SBDebugger::StateIsRunningState(StateType state) {
699baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD(bool, SBDebugger, StateIsRunningState,
700baf5664fSJonas Devlieghere                             (lldb::StateType), state);
701baf5664fSJonas Devlieghere 
702c2bbb49aSCaroline Tice   const bool result = lldb_private::StateIsRunningState(state);
7034838131bSGreg Clayton 
7044838131bSGreg Clayton   return result;
70530fdc8d8SChris Lattner }
70630fdc8d8SChris Lattner 
707b9c1b51eSKate Stone bool SBDebugger::StateIsStoppedState(StateType state) {
708baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD(bool, SBDebugger, StateIsStoppedState,
709baf5664fSJonas Devlieghere                             (lldb::StateType), state);
710baf5664fSJonas Devlieghere 
7112637f825SGreg Clayton   const bool result = lldb_private::StateIsStoppedState(state, false);
712ceb6b139SCaroline Tice 
7134838131bSGreg Clayton   return result;
71430fdc8d8SChris Lattner }
71530fdc8d8SChris Lattner 
716b9c1b51eSKate Stone lldb::SBTarget SBDebugger::CreateTarget(const char *filename,
717cac9c5f9SGreg Clayton                                         const char *target_triple,
718cac9c5f9SGreg Clayton                                         const char *platform_name,
719cac9c5f9SGreg Clayton                                         bool add_dependent_modules,
720b9c1b51eSKate Stone                                         lldb::SBError &sb_error) {
721baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(
722baf5664fSJonas Devlieghere       lldb::SBTarget, SBDebugger, CreateTarget,
723baf5664fSJonas Devlieghere       (const char *, const char *, const char *, bool, lldb::SBError &),
724baf5664fSJonas Devlieghere       filename, target_triple, platform_name, add_dependent_modules, sb_error);
725baf5664fSJonas Devlieghere 
726cac9c5f9SGreg Clayton   SBTarget sb_target;
727b9556accSGreg Clayton   TargetSP target_sp;
728b9c1b51eSKate Stone   if (m_opaque_sp) {
729cac9c5f9SGreg Clayton     sb_error.Clear();
730cac9c5f9SGreg Clayton     OptionGroupPlatform platform_options(false);
731cac9c5f9SGreg Clayton     platform_options.SetPlatformName(platform_name);
732cac9c5f9SGreg Clayton 
733b9c1b51eSKate Stone     sb_error.ref() = m_opaque_sp->GetTargetList().CreateTarget(
734f9a07e9fSJonas Devlieghere         *m_opaque_sp, filename, target_triple,
735f9a07e9fSJonas Devlieghere         add_dependent_modules ? eLoadDependentsYes : eLoadDependentsNo,
736b9c1b51eSKate Stone         &platform_options, target_sp);
737cac9c5f9SGreg Clayton 
738cac9c5f9SGreg Clayton     if (sb_error.Success())
739b9556accSGreg Clayton       sb_target.SetSP(target_sp);
740b9c1b51eSKate Stone   } else {
7419f521f22SJim Ingham     sb_error.SetErrorString("invalid debugger");
742cac9c5f9SGreg Clayton   }
743cac9c5f9SGreg Clayton 
7445160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
74563e5fb76SJonas Devlieghere   LLDB_LOGF(log,
74663e5fb76SJonas Devlieghere             "SBDebugger(%p)::CreateTarget (filename=\"%s\", triple=%s, "
747b9c1b51eSKate Stone             "platform_name=%s, add_dependent_modules=%u, error=%s) => "
748b9c1b51eSKate Stone             "SBTarget(%p)",
749b9c1b51eSKate Stone             static_cast<void *>(m_opaque_sp.get()), filename, target_triple,
750b9c1b51eSKate Stone             platform_name, add_dependent_modules, sb_error.GetCString(),
751b9c1b51eSKate Stone             static_cast<void *>(target_sp.get()));
752cac9c5f9SGreg Clayton 
753baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_target);
754cac9c5f9SGreg Clayton }
75530fdc8d8SChris Lattner 
75630fdc8d8SChris Lattner SBTarget
75730fdc8d8SChris Lattner SBDebugger::CreateTargetWithFileAndTargetTriple(const char *filename,
758b9c1b51eSKate Stone                                                 const char *target_triple) {
759baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTarget, SBDebugger,
760baf5664fSJonas Devlieghere                      CreateTargetWithFileAndTargetTriple,
761baf5664fSJonas Devlieghere                      (const char *, const char *), filename, target_triple);
762baf5664fSJonas Devlieghere 
763b9556accSGreg Clayton   SBTarget sb_target;
764b9556accSGreg Clayton   TargetSP target_sp;
765b9c1b51eSKate Stone   if (m_opaque_sp) {
766cac9c5f9SGreg Clayton     const bool add_dependent_modules = true;
76797206d57SZachary Turner     Status error(m_opaque_sp->GetTargetList().CreateTarget(
768f9a07e9fSJonas Devlieghere         *m_opaque_sp, filename, target_triple,
769f9a07e9fSJonas Devlieghere         add_dependent_modules ? eLoadDependentsYes : eLoadDependentsNo, nullptr,
770cac9c5f9SGreg Clayton         target_sp));
771b9556accSGreg Clayton     sb_target.SetSP(target_sp);
7726611103cSGreg Clayton   }
7734838131bSGreg Clayton 
7745160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
77563e5fb76SJonas Devlieghere   LLDB_LOGF(log,
77663e5fb76SJonas Devlieghere             "SBDebugger(%p)::CreateTargetWithFileAndTargetTriple "
777b9c1b51eSKate Stone             "(filename=\"%s\", triple=%s) => SBTarget(%p)",
778b9c1b51eSKate Stone             static_cast<void *>(m_opaque_sp.get()), filename, target_triple,
779b9c1b51eSKate Stone             static_cast<void *>(target_sp.get()));
7804838131bSGreg Clayton 
781baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_target);
78230fdc8d8SChris Lattner }
78330fdc8d8SChris Lattner 
784b9c1b51eSKate Stone SBTarget SBDebugger::CreateTargetWithFileAndArch(const char *filename,
785b9c1b51eSKate Stone                                                  const char *arch_cstr) {
786baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTarget, SBDebugger, CreateTargetWithFileAndArch,
787baf5664fSJonas Devlieghere                      (const char *, const char *), filename, arch_cstr);
788baf5664fSJonas Devlieghere 
7895160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
790ceb6b139SCaroline Tice 
791b9556accSGreg Clayton   SBTarget sb_target;
792b9556accSGreg Clayton   TargetSP target_sp;
793b9c1b51eSKate Stone   if (m_opaque_sp) {
79497206d57SZachary Turner     Status error;
795cac9c5f9SGreg Clayton     const bool add_dependent_modules = true;
79630fdc8d8SChris Lattner 
797b9c1b51eSKate Stone     error = m_opaque_sp->GetTargetList().CreateTarget(
798f9a07e9fSJonas Devlieghere         *m_opaque_sp, filename, arch_cstr,
799f9a07e9fSJonas Devlieghere         add_dependent_modules ? eLoadDependentsYes : eLoadDependentsNo, nullptr,
800cac9c5f9SGreg Clayton         target_sp);
80130fdc8d8SChris Lattner 
802b9c1b51eSKate Stone     if (error.Success()) {
8032976d00aSJim Ingham       m_opaque_sp->GetTargetList().SetSelectedTarget(target_sp.get());
804b9556accSGreg Clayton       sb_target.SetSP(target_sp);
8056611103cSGreg Clayton     }
8066611103cSGreg Clayton   }
807ceb6b139SCaroline Tice 
80863e5fb76SJonas Devlieghere   LLDB_LOGF(log,
80963e5fb76SJonas Devlieghere             "SBDebugger(%p)::CreateTargetWithFileAndArch (filename=\"%s\", "
810b9c1b51eSKate Stone             "arch=%s) => SBTarget(%p)",
811324a1036SSaleem Abdulrasool             static_cast<void *>(m_opaque_sp.get()), filename, arch_cstr,
812324a1036SSaleem Abdulrasool             static_cast<void *>(target_sp.get()));
813ceb6b139SCaroline Tice 
814baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_target);
81530fdc8d8SChris Lattner }
81630fdc8d8SChris Lattner 
817b9c1b51eSKate Stone SBTarget SBDebugger::CreateTarget(const char *filename) {
818baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTarget, SBDebugger, CreateTarget, (const char *),
819baf5664fSJonas Devlieghere                      filename);
820baf5664fSJonas Devlieghere 
821b9556accSGreg Clayton   SBTarget sb_target;
822b9556accSGreg Clayton   TargetSP target_sp;
823b9c1b51eSKate Stone   if (m_opaque_sp) {
82497206d57SZachary Turner     Status error;
825cac9c5f9SGreg Clayton     const bool add_dependent_modules = true;
826b9c1b51eSKate Stone     error = m_opaque_sp->GetTargetList().CreateTarget(
827f9a07e9fSJonas Devlieghere         *m_opaque_sp, filename, "",
828f9a07e9fSJonas Devlieghere         add_dependent_modules ? eLoadDependentsYes : eLoadDependentsNo, nullptr,
829f9a07e9fSJonas Devlieghere         target_sp);
83030fdc8d8SChris Lattner 
831b9c1b51eSKate Stone     if (error.Success()) {
8322976d00aSJim Ingham       m_opaque_sp->GetTargetList().SetSelectedTarget(target_sp.get());
833b9556accSGreg Clayton       sb_target.SetSP(target_sp);
8346611103cSGreg Clayton     }
8356611103cSGreg Clayton   }
8365160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
83763e5fb76SJonas Devlieghere   LLDB_LOGF(log,
838b9c1b51eSKate Stone             "SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)",
839324a1036SSaleem Abdulrasool             static_cast<void *>(m_opaque_sp.get()), filename,
840324a1036SSaleem Abdulrasool             static_cast<void *>(target_sp.get()));
841baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_target);
84230fdc8d8SChris Lattner }
84330fdc8d8SChris Lattner 
844b842f2ecSJim Ingham SBTarget SBDebugger::GetDummyTarget() {
845baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::SBTarget, SBDebugger, GetDummyTarget);
846baf5664fSJonas Devlieghere 
847b842f2ecSJim Ingham   SBTarget sb_target;
848b842f2ecSJim Ingham   if (m_opaque_sp) {
849b842f2ecSJim Ingham     sb_target.SetSP(m_opaque_sp->GetDummyTarget()->shared_from_this());
850b842f2ecSJim Ingham   }
851b842f2ecSJim Ingham   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
85263e5fb76SJonas Devlieghere   LLDB_LOGF(log, "SBDebugger(%p)::GetDummyTarget() => SBTarget(%p)",
853b842f2ecSJim Ingham             static_cast<void *>(m_opaque_sp.get()),
854b842f2ecSJim Ingham             static_cast<void *>(sb_target.GetSP().get()));
855baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_target);
856b842f2ecSJim Ingham }
857b842f2ecSJim Ingham 
858b9c1b51eSKate Stone bool SBDebugger::DeleteTarget(lldb::SBTarget &target) {
859baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBDebugger, DeleteTarget, (lldb::SBTarget &),
860baf5664fSJonas Devlieghere                      target);
861baf5664fSJonas Devlieghere 
8623794ad95SJohnny Chen   bool result = false;
863b9c1b51eSKate Stone   if (m_opaque_sp) {
864b9556accSGreg Clayton     TargetSP target_sp(target.GetSP());
865b9c1b51eSKate Stone     if (target_sp) {
8663794ad95SJohnny Chen       // No need to lock, the target list is thread safe
867b9556accSGreg Clayton       result = m_opaque_sp->GetTargetList().DeleteTarget(target_sp);
868b9556accSGreg Clayton       target_sp->Destroy();
86975340622SGreg Clayton       target.Clear();
8700cd70866SGreg Clayton       const bool mandatory = true;
8710cd70866SGreg Clayton       ModuleList::RemoveOrphanSharedModules(mandatory);
8723794ad95SJohnny Chen     }
873b9556accSGreg Clayton   }
8743794ad95SJohnny Chen 
8755160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
87663e5fb76SJonas Devlieghere   LLDB_LOGF(log, "SBDebugger(%p)::DeleteTarget (SBTarget(%p)) => %i",
877324a1036SSaleem Abdulrasool             static_cast<void *>(m_opaque_sp.get()),
878324a1036SSaleem Abdulrasool             static_cast<void *>(target.m_opaque_sp.get()), result);
8793794ad95SJohnny Chen 
8803794ad95SJohnny Chen   return result;
8813794ad95SJohnny Chen }
882dbb0abbfSEugene Zelenko 
883b9c1b51eSKate Stone SBTarget SBDebugger::GetTargetAtIndex(uint32_t idx) {
884baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTarget, SBDebugger, GetTargetAtIndex, (uint32_t),
885baf5664fSJonas Devlieghere                      idx);
886baf5664fSJonas Devlieghere 
8876611103cSGreg Clayton   SBTarget sb_target;
888b9c1b51eSKate Stone   if (m_opaque_sp) {
889af67cecdSGreg Clayton     // No need to lock, the target list is thread safe
890b9556accSGreg Clayton     sb_target.SetSP(m_opaque_sp->GetTargetList().GetTargetAtIndex(idx));
891af67cecdSGreg Clayton   }
892baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_target);
89330fdc8d8SChris Lattner }
89430fdc8d8SChris Lattner 
895b9c1b51eSKate Stone uint32_t SBDebugger::GetIndexOfTarget(lldb::SBTarget target) {
896baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(uint32_t, SBDebugger, GetIndexOfTarget, (lldb::SBTarget),
897baf5664fSJonas Devlieghere                      target);
8988499e1a4SJim Ingham 
8998499e1a4SJim Ingham   lldb::TargetSP target_sp = target.GetSP();
9008499e1a4SJim Ingham   if (!target_sp)
9018499e1a4SJim Ingham     return UINT32_MAX;
9028499e1a4SJim Ingham 
9038499e1a4SJim Ingham   if (!m_opaque_sp)
9048499e1a4SJim Ingham     return UINT32_MAX;
9058499e1a4SJim Ingham 
9068499e1a4SJim Ingham   return m_opaque_sp->GetTargetList().GetIndexOfTarget(target.GetSP());
9078499e1a4SJim Ingham }
9088499e1a4SJim Ingham 
909b9c1b51eSKate Stone SBTarget SBDebugger::FindTargetWithProcessID(lldb::pid_t pid) {
910baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTarget, SBDebugger, FindTargetWithProcessID,
911baf5664fSJonas Devlieghere                      (lldb::pid_t), pid);
912baf5664fSJonas Devlieghere 
9136611103cSGreg Clayton   SBTarget sb_target;
914b9c1b51eSKate Stone   if (m_opaque_sp) {
915af67cecdSGreg Clayton     // No need to lock, the target list is thread safe
916b9556accSGreg Clayton     sb_target.SetSP(m_opaque_sp->GetTargetList().FindTargetWithProcessID(pid));
917af67cecdSGreg Clayton   }
918baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_target);
91930fdc8d8SChris Lattner }
92030fdc8d8SChris Lattner 
921b9c1b51eSKate Stone SBTarget SBDebugger::FindTargetWithFileAndArch(const char *filename,
922b9c1b51eSKate Stone                                                const char *arch_name) {
923baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTarget, SBDebugger, FindTargetWithFileAndArch,
924baf5664fSJonas Devlieghere                      (const char *, const char *), filename, arch_name);
925baf5664fSJonas Devlieghere 
9266611103cSGreg Clayton   SBTarget sb_target;
927b9c1b51eSKate Stone   if (m_opaque_sp && filename && filename[0]) {
928af67cecdSGreg Clayton     // No need to lock, the target list is thread safe
9297263f1bdSPavel Labath     ArchSpec arch = Platform::GetAugmentedArchSpec(
9307263f1bdSPavel Labath         m_opaque_sp->GetPlatformList().GetSelectedPlatform().get(), arch_name);
931b9c1b51eSKate Stone     TargetSP target_sp(
932b9c1b51eSKate Stone         m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture(
9338f3be7a3SJonas Devlieghere             FileSpec(filename), arch_name ? &arch : nullptr));
934b9556accSGreg Clayton     sb_target.SetSP(target_sp);
9356611103cSGreg Clayton   }
936baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_target);
93730fdc8d8SChris Lattner }
93830fdc8d8SChris Lattner 
939b9c1b51eSKate Stone SBTarget SBDebugger::FindTargetWithLLDBProcess(const ProcessSP &process_sp) {
9406611103cSGreg Clayton   SBTarget sb_target;
941b9c1b51eSKate Stone   if (m_opaque_sp) {
942af67cecdSGreg Clayton     // No need to lock, the target list is thread safe
943b9c1b51eSKate Stone     sb_target.SetSP(
944b9c1b51eSKate Stone         m_opaque_sp->GetTargetList().FindTargetWithProcess(process_sp.get()));
945af67cecdSGreg Clayton   }
94630fdc8d8SChris Lattner   return sb_target;
94730fdc8d8SChris Lattner }
94830fdc8d8SChris Lattner 
949b9c1b51eSKate Stone uint32_t SBDebugger::GetNumTargets() {
950baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBDebugger, GetNumTargets);
951baf5664fSJonas Devlieghere 
952b9c1b51eSKate Stone   if (m_opaque_sp) {
953af67cecdSGreg Clayton     // No need to lock, the target list is thread safe
9546611103cSGreg Clayton     return m_opaque_sp->GetTargetList().GetNumTargets();
955af67cecdSGreg Clayton   }
9566611103cSGreg Clayton   return 0;
9576611103cSGreg Clayton }
95830fdc8d8SChris Lattner 
959b9c1b51eSKate Stone SBTarget SBDebugger::GetSelectedTarget() {
960baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::SBTarget, SBDebugger, GetSelectedTarget);
961baf5664fSJonas Devlieghere 
9625160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
963ceb6b139SCaroline Tice 
9646611103cSGreg Clayton   SBTarget sb_target;
965b9556accSGreg Clayton   TargetSP target_sp;
966b9c1b51eSKate Stone   if (m_opaque_sp) {
967af67cecdSGreg Clayton     // No need to lock, the target list is thread safe
968b9556accSGreg Clayton     target_sp = m_opaque_sp->GetTargetList().GetSelectedTarget();
969b9556accSGreg Clayton     sb_target.SetSP(target_sp);
970af67cecdSGreg Clayton   }
971ceb6b139SCaroline Tice 
972b9c1b51eSKate Stone   if (log) {
973ceb6b139SCaroline Tice     SBStream sstr;
974431ce678SGreg Clayton     sb_target.GetDescription(sstr, eDescriptionLevelBrief);
97563e5fb76SJonas Devlieghere     LLDB_LOGF(log, "SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s",
976324a1036SSaleem Abdulrasool               static_cast<void *>(m_opaque_sp.get()),
977324a1036SSaleem Abdulrasool               static_cast<void *>(target_sp.get()), sstr.GetData());
978ceb6b139SCaroline Tice   }
979ceb6b139SCaroline Tice 
980baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_target);
98130fdc8d8SChris Lattner }
98230fdc8d8SChris Lattner 
983b9c1b51eSKate Stone void SBDebugger::SetSelectedTarget(SBTarget &sb_target) {
984baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBDebugger, SetSelectedTarget, (lldb::SBTarget &),
985baf5664fSJonas Devlieghere                      sb_target);
986baf5664fSJonas Devlieghere 
9875160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
988e64f0dc7SJim Ingham 
989b9556accSGreg Clayton   TargetSP target_sp(sb_target.GetSP());
990b9c1b51eSKate Stone   if (m_opaque_sp) {
991b9556accSGreg Clayton     m_opaque_sp->GetTargetList().SetSelectedTarget(target_sp.get());
992e64f0dc7SJim Ingham   }
993b9c1b51eSKate Stone   if (log) {
994e64f0dc7SJim Ingham     SBStream sstr;
995e64f0dc7SJim Ingham     sb_target.GetDescription(sstr, eDescriptionLevelBrief);
99663e5fb76SJonas Devlieghere     LLDB_LOGF(log, "SBDebugger(%p)::SetSelectedTarget () => SBTarget(%p): %s",
997324a1036SSaleem Abdulrasool               static_cast<void *>(m_opaque_sp.get()),
998324a1036SSaleem Abdulrasool               static_cast<void *>(target_sp.get()), sstr.GetData());
999e64f0dc7SJim Ingham   }
1000e64f0dc7SJim Ingham }
1001e64f0dc7SJim Ingham 
1002b9c1b51eSKate Stone SBPlatform SBDebugger::GetSelectedPlatform() {
1003baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::SBPlatform, SBDebugger, GetSelectedPlatform);
1004baf5664fSJonas Devlieghere 
1005fbb76349SGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1006fbb76349SGreg Clayton 
1007fbb76349SGreg Clayton   SBPlatform sb_platform;
1008fbb76349SGreg Clayton   DebuggerSP debugger_sp(m_opaque_sp);
1009b9c1b51eSKate Stone   if (debugger_sp) {
1010fbb76349SGreg Clayton     sb_platform.SetSP(debugger_sp->GetPlatformList().GetSelectedPlatform());
1011fbb76349SGreg Clayton   }
101263e5fb76SJonas Devlieghere   LLDB_LOGF(log, "SBDebugger(%p)::GetSelectedPlatform () => SBPlatform(%p): %s",
1013324a1036SSaleem Abdulrasool             static_cast<void *>(m_opaque_sp.get()),
1014324a1036SSaleem Abdulrasool             static_cast<void *>(sb_platform.GetSP().get()),
1015324a1036SSaleem Abdulrasool             sb_platform.GetName());
1016baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_platform);
1017fbb76349SGreg Clayton }
1018fbb76349SGreg Clayton 
1019b9c1b51eSKate Stone void SBDebugger::SetSelectedPlatform(SBPlatform &sb_platform) {
1020baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBDebugger, SetSelectedPlatform,
1021baf5664fSJonas Devlieghere                      (lldb::SBPlatform &), sb_platform);
1022baf5664fSJonas Devlieghere 
1023fbb76349SGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1024fbb76349SGreg Clayton 
1025fbb76349SGreg Clayton   DebuggerSP debugger_sp(m_opaque_sp);
1026b9c1b51eSKate Stone   if (debugger_sp) {
1027fbb76349SGreg Clayton     debugger_sp->GetPlatformList().SetSelectedPlatform(sb_platform.GetSP());
1028fbb76349SGreg Clayton   }
1029324a1036SSaleem Abdulrasool 
103063e5fb76SJonas Devlieghere   LLDB_LOGF(log, "SBDebugger(%p)::SetSelectedPlatform (SBPlatform(%p) %s)",
1031324a1036SSaleem Abdulrasool             static_cast<void *>(m_opaque_sp.get()),
1032324a1036SSaleem Abdulrasool             static_cast<void *>(sb_platform.GetSP().get()),
1033324a1036SSaleem Abdulrasool             sb_platform.GetName());
1034fbb76349SGreg Clayton }
1035fbb76349SGreg Clayton 
1036c10e34d0SVadim Macagon uint32_t SBDebugger::GetNumPlatforms() {
1037baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBDebugger, GetNumPlatforms);
1038baf5664fSJonas Devlieghere 
1039c10e34d0SVadim Macagon   if (m_opaque_sp) {
1040c10e34d0SVadim Macagon     // No need to lock, the platform list is thread safe
1041c10e34d0SVadim Macagon     return m_opaque_sp->GetPlatformList().GetSize();
1042c10e34d0SVadim Macagon   }
1043c10e34d0SVadim Macagon   return 0;
1044c10e34d0SVadim Macagon }
1045c10e34d0SVadim Macagon 
1046c10e34d0SVadim Macagon SBPlatform SBDebugger::GetPlatformAtIndex(uint32_t idx) {
1047baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBPlatform, SBDebugger, GetPlatformAtIndex,
1048baf5664fSJonas Devlieghere                      (uint32_t), idx);
1049baf5664fSJonas Devlieghere 
1050c10e34d0SVadim Macagon   SBPlatform sb_platform;
1051c10e34d0SVadim Macagon   if (m_opaque_sp) {
1052c10e34d0SVadim Macagon     // No need to lock, the platform list is thread safe
1053c10e34d0SVadim Macagon     sb_platform.SetSP(m_opaque_sp->GetPlatformList().GetAtIndex(idx));
1054c10e34d0SVadim Macagon   }
1055baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_platform);
1056c10e34d0SVadim Macagon }
1057c10e34d0SVadim Macagon 
1058c10e34d0SVadim Macagon uint32_t SBDebugger::GetNumAvailablePlatforms() {
1059baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBDebugger, GetNumAvailablePlatforms);
1060baf5664fSJonas Devlieghere 
1061c10e34d0SVadim Macagon   uint32_t idx = 0;
1062c10e34d0SVadim Macagon   while (true) {
1063c10e34d0SVadim Macagon     if (!PluginManager::GetPlatformPluginNameAtIndex(idx)) {
1064c10e34d0SVadim Macagon       break;
1065c10e34d0SVadim Macagon     }
1066c10e34d0SVadim Macagon     ++idx;
1067c10e34d0SVadim Macagon   }
1068c10e34d0SVadim Macagon   // +1 for the host platform, which should always appear first in the list.
1069c10e34d0SVadim Macagon   return idx + 1;
1070c10e34d0SVadim Macagon }
1071c10e34d0SVadim Macagon 
1072c10e34d0SVadim Macagon SBStructuredData SBDebugger::GetAvailablePlatformInfoAtIndex(uint32_t idx) {
1073baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBStructuredData, SBDebugger,
1074baf5664fSJonas Devlieghere                      GetAvailablePlatformInfoAtIndex, (uint32_t), idx);
1075baf5664fSJonas Devlieghere 
1076c10e34d0SVadim Macagon   SBStructuredData data;
1077a8f3ae7cSJonas Devlieghere   auto platform_dict = std::make_unique<StructuredData::Dictionary>();
1078c10e34d0SVadim Macagon   llvm::StringRef name_str("name"), desc_str("description");
1079c10e34d0SVadim Macagon 
1080c10e34d0SVadim Macagon   if (idx == 0) {
1081c10e34d0SVadim Macagon     PlatformSP host_platform_sp(Platform::GetHostPlatform());
1082c10e34d0SVadim Macagon     platform_dict->AddStringItem(
1083c10e34d0SVadim Macagon         name_str, host_platform_sp->GetPluginName().GetStringRef());
1084c10e34d0SVadim Macagon     platform_dict->AddStringItem(
1085c10e34d0SVadim Macagon         desc_str, llvm::StringRef(host_platform_sp->GetDescription()));
1086c10e34d0SVadim Macagon   } else if (idx > 0) {
1087c10e34d0SVadim Macagon     const char *plugin_name =
1088c10e34d0SVadim Macagon         PluginManager::GetPlatformPluginNameAtIndex(idx - 1);
1089c10e34d0SVadim Macagon     if (!plugin_name) {
1090baf5664fSJonas Devlieghere       return LLDB_RECORD_RESULT(data);
1091c10e34d0SVadim Macagon     }
1092c10e34d0SVadim Macagon     platform_dict->AddStringItem(name_str, llvm::StringRef(plugin_name));
1093c10e34d0SVadim Macagon 
1094c10e34d0SVadim Macagon     const char *plugin_desc =
1095c10e34d0SVadim Macagon         PluginManager::GetPlatformPluginDescriptionAtIndex(idx - 1);
1096c10e34d0SVadim Macagon     if (!plugin_desc) {
1097baf5664fSJonas Devlieghere       return LLDB_RECORD_RESULT(data);
1098c10e34d0SVadim Macagon     }
1099c10e34d0SVadim Macagon     platform_dict->AddStringItem(desc_str, llvm::StringRef(plugin_desc));
1100c10e34d0SVadim Macagon   }
1101c10e34d0SVadim Macagon 
1102c10e34d0SVadim Macagon   data.m_impl_up->SetObjectSP(
1103c10e34d0SVadim Macagon       StructuredData::ObjectSP(platform_dict.release()));
1104baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(data);
1105c10e34d0SVadim Macagon }
1106c10e34d0SVadim Macagon 
1107b9c1b51eSKate Stone void SBDebugger::DispatchInput(void *baton, const void *data, size_t data_len) {
11080d7b0c96SJonas Devlieghere   LLDB_RECORD_DUMMY(void, SBDebugger, DispatchInput,
11090d7b0c96SJonas Devlieghere                     (void *, const void *, size_t), baton, data, data_len);
11100d7b0c96SJonas Devlieghere 
11116b09d423SEnrico Granata   DispatchInput(data, data_len);
11126b09d423SEnrico Granata }
11136b09d423SEnrico Granata 
1114b9c1b51eSKate Stone void SBDebugger::DispatchInput(const void *data, size_t data_len) {
11150d7b0c96SJonas Devlieghere   LLDB_RECORD_DUMMY(void, SBDebugger, DispatchInput, (const void *, size_t),
11160d7b0c96SJonas Devlieghere                     data, data_len);
11170d7b0c96SJonas Devlieghere 
111844d93782SGreg Clayton   //    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
111944d93782SGreg Clayton   //
112044d93782SGreg Clayton   //    if (log)
112163e5fb76SJonas Devlieghere   //        LLDB_LOGF(log, "SBDebugger(%p)::DispatchInput (data=\"%.*s\",
1122b9c1b51eSKate Stone   //        size_t=%" PRIu64 ")",
112344d93782SGreg Clayton   //                     m_opaque_sp.get(),
112444d93782SGreg Clayton   //                     (int) data_len,
112544d93782SGreg Clayton   //                     (const char *) data,
112644d93782SGreg Clayton   //                     (uint64_t)data_len);
112744d93782SGreg Clayton   //
112844d93782SGreg Clayton   //    if (m_opaque_sp)
112944d93782SGreg Clayton   //        m_opaque_sp->DispatchInput ((const char *) data, data_len);
113030fdc8d8SChris Lattner }
113130fdc8d8SChris Lattner 
1132b9c1b51eSKate Stone void SBDebugger::DispatchInputInterrupt() {
1133b328dcbfSJonas Devlieghere   LLDB_RECORD_DUMMY_NO_ARGS(void, SBDebugger, DispatchInputInterrupt);
1134baf5664fSJonas Devlieghere 
1135efed6131SCaroline Tice   if (m_opaque_sp)
1136efed6131SCaroline Tice     m_opaque_sp->DispatchInputInterrupt();
1137efed6131SCaroline Tice }
1138efed6131SCaroline Tice 
1139b9c1b51eSKate Stone void SBDebugger::DispatchInputEndOfFile() {
1140baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(void, SBDebugger, DispatchInputEndOfFile);
1141baf5664fSJonas Devlieghere 
1142efed6131SCaroline Tice   if (m_opaque_sp)
1143efed6131SCaroline Tice     m_opaque_sp->DispatchInputEndOfFile();
1144efed6131SCaroline Tice }
11459088b068SCaroline Tice 
1146baf5664fSJonas Devlieghere void SBDebugger::PushInputReader(SBInputReader &reader) {
1147baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBDebugger, PushInputReader, (lldb::SBInputReader &),
1148baf5664fSJonas Devlieghere                      reader);
1149baf5664fSJonas Devlieghere }
11506611103cSGreg Clayton 
1151b9c1b51eSKate Stone void SBDebugger::RunCommandInterpreter(bool auto_handle_events,
1152b9c1b51eSKate Stone                                        bool spawn_thread) {
1153baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBDebugger, RunCommandInterpreter, (bool, bool),
1154baf5664fSJonas Devlieghere                      auto_handle_events, spawn_thread);
1155baf5664fSJonas Devlieghere 
1156b9c1b51eSKate Stone   if (m_opaque_sp) {
115726c7bf93SJim Ingham     CommandInterpreterRunOptions options;
115826c7bf93SJim Ingham 
1159b9c1b51eSKate Stone     m_opaque_sp->GetCommandInterpreter().RunCommandInterpreter(
1160b9c1b51eSKate Stone         auto_handle_events, spawn_thread, options);
116126c7bf93SJim Ingham   }
116226c7bf93SJim Ingham }
116326c7bf93SJim Ingham 
1164b9c1b51eSKate Stone void SBDebugger::RunCommandInterpreter(bool auto_handle_events,
116526c7bf93SJim Ingham                                        bool spawn_thread,
116626c7bf93SJim Ingham                                        SBCommandInterpreterRunOptions &options,
1167b9c1b51eSKate Stone                                        int &num_errors, bool &quit_requested,
1168ffc9f1deSJim Ingham                                        bool &stopped_for_crash)
116926c7bf93SJim Ingham 
117026c7bf93SJim Ingham {
1171baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBDebugger, RunCommandInterpreter,
1172baf5664fSJonas Devlieghere                      (bool, bool, lldb::SBCommandInterpreterRunOptions &, int &,
1173baf5664fSJonas Devlieghere                       bool &, bool &),
1174baf5664fSJonas Devlieghere                      auto_handle_events, spawn_thread, options, num_errors,
1175baf5664fSJonas Devlieghere                      quit_requested, stopped_for_crash);
1176baf5664fSJonas Devlieghere 
1177b9c1b51eSKate Stone   if (m_opaque_sp) {
117826c7bf93SJim Ingham     CommandInterpreter &interp = m_opaque_sp->GetCommandInterpreter();
1179b9c1b51eSKate Stone     interp.RunCommandInterpreter(auto_handle_events, spawn_thread,
1180b9c1b51eSKate Stone                                  options.ref());
118126c7bf93SJim Ingham     num_errors = interp.GetNumErrors();
118226c7bf93SJim Ingham     quit_requested = interp.GetQuitRequested();
1183ffc9f1deSJim Ingham     stopped_for_crash = interp.GetStoppedForCrash();
118426c7bf93SJim Ingham   }
1185969ed3d1SCaroline Tice }
1186969ed3d1SCaroline Tice 
1187b9c1b51eSKate Stone SBError SBDebugger::RunREPL(lldb::LanguageType language,
1188b9c1b51eSKate Stone                             const char *repl_options) {
1189baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBError, SBDebugger, RunREPL,
1190baf5664fSJonas Devlieghere                      (lldb::LanguageType, const char *), language,
1191baf5664fSJonas Devlieghere                      repl_options);
1192baf5664fSJonas Devlieghere 
11933e7e915dSSean Callanan   SBError error;
11943e7e915dSSean Callanan   if (m_opaque_sp)
11953e7e915dSSean Callanan     error.ref() = m_opaque_sp->RunREPL(language, repl_options);
11963e7e915dSSean Callanan   else
11973e7e915dSSean Callanan     error.SetErrorString("invalid debugger");
1198baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(error);
11993e7e915dSSean Callanan }
12003e7e915dSSean Callanan 
1201b9c1b51eSKate Stone void SBDebugger::reset(const DebuggerSP &debugger_sp) {
12026611103cSGreg Clayton   m_opaque_sp = debugger_sp;
12036611103cSGreg Clayton }
12046611103cSGreg Clayton 
1205b9c1b51eSKate Stone Debugger *SBDebugger::get() const { return m_opaque_sp.get(); }
12066611103cSGreg Clayton 
1207b9c1b51eSKate Stone Debugger &SBDebugger::ref() const {
12086611103cSGreg Clayton   assert(m_opaque_sp.get());
12096611103cSGreg Clayton   return *m_opaque_sp;
12106611103cSGreg Clayton }
12116611103cSGreg Clayton 
1212b9c1b51eSKate Stone const lldb::DebuggerSP &SBDebugger::get_sp() const { return m_opaque_sp; }
12136611103cSGreg Clayton 
1214b9c1b51eSKate Stone SBDebugger SBDebugger::FindDebuggerWithID(int id) {
1215baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD(lldb::SBDebugger, SBDebugger, FindDebuggerWithID,
1216baf5664fSJonas Devlieghere                             (int), id);
1217baf5664fSJonas Devlieghere 
1218af67cecdSGreg Clayton   // No need to lock, the debugger list is thread safe
1219ebc1bb27SCaroline Tice   SBDebugger sb_debugger;
1220431ce678SGreg Clayton   DebuggerSP debugger_sp = Debugger::FindDebuggerWithID(id);
1221ebc1bb27SCaroline Tice   if (debugger_sp)
1222ebc1bb27SCaroline Tice     sb_debugger.reset(debugger_sp);
1223baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_debugger);
1224ebc1bb27SCaroline Tice }
1225e40e4218SJim Ingham 
1226b9c1b51eSKate Stone const char *SBDebugger::GetInstanceName() {
1227baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(const char *, SBDebugger, GetInstanceName);
1228baf5664fSJonas Devlieghere 
1229dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetInstanceName().AsCString() : nullptr);
1230dd759857SCaroline Tice }
1231dd759857SCaroline Tice 
1232b9c1b51eSKate Stone SBError SBDebugger::SetInternalVariable(const char *var_name, const char *value,
1233b9c1b51eSKate Stone                                         const char *debugger_instance_name) {
1234baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD(lldb::SBError, SBDebugger, SetInternalVariable,
1235baf5664fSJonas Devlieghere                             (const char *, const char *, const char *),
1236baf5664fSJonas Devlieghere                             var_name, value, debugger_instance_name);
1237baf5664fSJonas Devlieghere 
12386920b52bSGreg Clayton   SBError sb_error;
1239b9c1b51eSKate Stone   DebuggerSP debugger_sp(Debugger::FindDebuggerWithInstanceName(
1240b9c1b51eSKate Stone       ConstString(debugger_instance_name)));
124197206d57SZachary Turner   Status error;
1242b9c1b51eSKate Stone   if (debugger_sp) {
1243b9c1b51eSKate Stone     ExecutionContext exe_ctx(
1244b9c1b51eSKate Stone         debugger_sp->GetCommandInterpreter().GetExecutionContext());
1245b9c1b51eSKate Stone     error = debugger_sp->SetPropertyValue(&exe_ctx, eVarSetOperationAssign,
1246b9c1b51eSKate Stone                                           var_name, value);
1247b9c1b51eSKate Stone   } else {
1248b9c1b51eSKate Stone     error.SetErrorStringWithFormat("invalid debugger instance name '%s'",
1249b9c1b51eSKate Stone                                    debugger_instance_name);
12506920b52bSGreg Clayton   }
12516920b52bSGreg Clayton   if (error.Fail())
12526920b52bSGreg Clayton     sb_error.SetError(error);
1253baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_error);
12543df9a8dfSCaroline Tice }
12553df9a8dfSCaroline Tice 
1256431ce678SGreg Clayton SBStringList
1257b9c1b51eSKate Stone SBDebugger::GetInternalVariableValue(const char *var_name,
1258b9c1b51eSKate Stone                                      const char *debugger_instance_name) {
1259baf5664fSJonas Devlieghere   LLDB_RECORD_STATIC_METHOD(
1260baf5664fSJonas Devlieghere       lldb::SBStringList, SBDebugger, GetInternalVariableValue,
1261baf5664fSJonas Devlieghere       (const char *, const char *), var_name, debugger_instance_name);
1262baf5664fSJonas Devlieghere 
12633df9a8dfSCaroline Tice   SBStringList ret_value;
1264b9c1b51eSKate Stone   DebuggerSP debugger_sp(Debugger::FindDebuggerWithInstanceName(
1265b9c1b51eSKate Stone       ConstString(debugger_instance_name)));
126697206d57SZachary Turner   Status error;
1267b9c1b51eSKate Stone   if (debugger_sp) {
1268b9c1b51eSKate Stone     ExecutionContext exe_ctx(
1269b9c1b51eSKate Stone         debugger_sp->GetCommandInterpreter().GetExecutionContext());
1270b9c1b51eSKate Stone     lldb::OptionValueSP value_sp(
1271b9c1b51eSKate Stone         debugger_sp->GetPropertyValue(&exe_ctx, var_name, false, error));
1272b9c1b51eSKate Stone     if (value_sp) {
12736920b52bSGreg Clayton       StreamString value_strm;
12746920b52bSGreg Clayton       value_sp->DumpValue(&exe_ctx, value_strm, OptionValue::eDumpOptionValue);
12756920b52bSGreg Clayton       const std::string &value_str = value_strm.GetString();
1276b9c1b51eSKate Stone       if (!value_str.empty()) {
12776920b52bSGreg Clayton         StringList string_list;
127844d93782SGreg Clayton         string_list.SplitIntoLines(value_str);
1279baf5664fSJonas Devlieghere         return LLDB_RECORD_RESULT(SBStringList(&string_list));
12806920b52bSGreg Clayton       }
12816920b52bSGreg Clayton     }
12826920b52bSGreg Clayton   }
1283baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(SBStringList());
12843df9a8dfSCaroline Tice }
12853df9a8dfSCaroline Tice 
1286b9c1b51eSKate Stone uint32_t SBDebugger::GetTerminalWidth() const {
1287baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBDebugger, GetTerminalWidth);
1288baf5664fSJonas Devlieghere 
1289dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetTerminalWidth() : 0);
1290a7015092SGreg Clayton }
1291a7015092SGreg Clayton 
1292b9c1b51eSKate Stone void SBDebugger::SetTerminalWidth(uint32_t term_width) {
1293b328dcbfSJonas Devlieghere   LLDB_RECORD_DUMMY(void, SBDebugger, SetTerminalWidth, (uint32_t), term_width);
1294baf5664fSJonas Devlieghere 
1295a7015092SGreg Clayton   if (m_opaque_sp)
1296a7015092SGreg Clayton     m_opaque_sp->SetTerminalWidth(term_width);
1297a7015092SGreg Clayton }
1298a7015092SGreg Clayton 
1299b9c1b51eSKate Stone const char *SBDebugger::GetPrompt() const {
1300baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBDebugger, GetPrompt);
1301baf5664fSJonas Devlieghere 
13025160ce5cSGreg Clayton   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1303ceb6b139SCaroline Tice 
130463e5fb76SJonas Devlieghere   LLDB_LOGF(log, "SBDebugger(%p)::GetPrompt () => \"%s\"",
1305324a1036SSaleem Abdulrasool             static_cast<void *>(m_opaque_sp.get()),
1306514d8cd8SZachary Turner             (m_opaque_sp ? m_opaque_sp->GetPrompt().str().c_str() : ""));
1307ceb6b139SCaroline Tice 
1308514d8cd8SZachary Turner   return (m_opaque_sp ? ConstString(m_opaque_sp->GetPrompt()).GetCString()
1309514d8cd8SZachary Turner                       : nullptr);
1310a7015092SGreg Clayton }
1311a7015092SGreg Clayton 
1312b9c1b51eSKate Stone void SBDebugger::SetPrompt(const char *prompt) {
1313baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBDebugger, SetPrompt, (const char *), prompt);
1314baf5664fSJonas Devlieghere 
1315a7015092SGreg Clayton   if (m_opaque_sp)
1316514d8cd8SZachary Turner     m_opaque_sp->SetPrompt(llvm::StringRef::withNullAsEmpty(prompt));
1317a7015092SGreg Clayton }
1318a7015092SGreg Clayton 
13199e046f02SJonas Devlieghere const char *SBDebugger::GetReproducerPath() const {
1320baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBDebugger, GetReproducerPath);
1321baf5664fSJonas Devlieghere 
13229e046f02SJonas Devlieghere   return (m_opaque_sp
13239e046f02SJonas Devlieghere               ? ConstString(m_opaque_sp->GetReproducerPath()).GetCString()
13249e046f02SJonas Devlieghere               : nullptr);
13259e046f02SJonas Devlieghere }
13269e046f02SJonas Devlieghere 
1327b9c1b51eSKate Stone ScriptLanguage SBDebugger::GetScriptLanguage() const {
1328baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::ScriptLanguage, SBDebugger,
1329baf5664fSJonas Devlieghere                                    GetScriptLanguage);
1330baf5664fSJonas Devlieghere 
1331dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetScriptLanguage() : eScriptLanguageNone);
1332a7015092SGreg Clayton }
1333a7015092SGreg Clayton 
1334b9c1b51eSKate Stone void SBDebugger::SetScriptLanguage(ScriptLanguage script_lang) {
1335baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBDebugger, SetScriptLanguage,
1336baf5664fSJonas Devlieghere                      (lldb::ScriptLanguage), script_lang);
1337baf5664fSJonas Devlieghere 
1338b9c1b51eSKate Stone   if (m_opaque_sp) {
1339a7015092SGreg Clayton     m_opaque_sp->SetScriptLanguage(script_lang);
1340a7015092SGreg Clayton   }
1341af67cecdSGreg Clayton }
1342a7015092SGreg Clayton 
1343b9c1b51eSKate Stone bool SBDebugger::SetUseExternalEditor(bool value) {
1344baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBDebugger, SetUseExternalEditor, (bool), value);
1345baf5664fSJonas Devlieghere 
1346dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->SetUseExternalEditor(value) : false);
1347e40e4218SJim Ingham }
1348e40e4218SJim Ingham 
1349b9c1b51eSKate Stone bool SBDebugger::GetUseExternalEditor() {
1350baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(bool, SBDebugger, GetUseExternalEditor);
1351baf5664fSJonas Devlieghere 
1352dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetUseExternalEditor() : false);
1353e40e4218SJim Ingham }
1354e40e4218SJim Ingham 
1355b9c1b51eSKate Stone bool SBDebugger::SetUseColor(bool value) {
1356baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBDebugger, SetUseColor, (bool), value);
1357baf5664fSJonas Devlieghere 
1358dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->SetUseColor(value) : false);
1359c3ce7f27SMichael Sartain }
1360c3ce7f27SMichael Sartain 
1361b9c1b51eSKate Stone bool SBDebugger::GetUseColor() const {
1362baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBDebugger, GetUseColor);
1363baf5664fSJonas Devlieghere 
1364dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetUseColor() : false);
1365c3ce7f27SMichael Sartain }
1366c3ce7f27SMichael Sartain 
1367b9c1b51eSKate Stone bool SBDebugger::GetDescription(SBStream &description) {
1368baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBDebugger, GetDescription, (lldb::SBStream &),
1369baf5664fSJonas Devlieghere                      description);
1370baf5664fSJonas Devlieghere 
1371da7bc7d0SGreg Clayton   Stream &strm = description.ref();
1372da7bc7d0SGreg Clayton 
1373b9c1b51eSKate Stone   if (m_opaque_sp) {
1374dde9cff3SCaroline Tice     const char *name = m_opaque_sp->GetInstanceName().AsCString();
1375431ce678SGreg Clayton     user_id_t id = m_opaque_sp->GetID();
1376d01b2953SDaniel Malea     strm.Printf("Debugger (instance: \"%s\", id: %" PRIu64 ")", name, id);
1377b9c1b51eSKate Stone   } else
1378da7bc7d0SGreg Clayton     strm.PutCString("No value");
1379dde9cff3SCaroline Tice 
1380dde9cff3SCaroline Tice   return true;
1381dde9cff3SCaroline Tice }
1382efed6131SCaroline Tice 
1383b9c1b51eSKate Stone user_id_t SBDebugger::GetID() {
1384baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::user_id_t, SBDebugger, GetID);
1385baf5664fSJonas Devlieghere 
1386dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetID() : LLDB_INVALID_UID);
1387efed6131SCaroline Tice }
13882289fa48SGreg Clayton 
1389b9c1b51eSKate Stone SBError SBDebugger::SetCurrentPlatform(const char *platform_name_cstr) {
1390baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBError, SBDebugger, SetCurrentPlatform,
1391baf5664fSJonas Devlieghere                      (const char *), platform_name_cstr);
1392baf5664fSJonas Devlieghere 
13932289fa48SGreg Clayton   SBError sb_error;
1394b9c1b51eSKate Stone   if (m_opaque_sp) {
1395b9c1b51eSKate Stone     if (platform_name_cstr && platform_name_cstr[0]) {
1396615eb7e6SGreg Clayton       ConstString platform_name(platform_name_cstr);
1397615eb7e6SGreg Clayton       PlatformSP platform_sp(Platform::Find(platform_name));
13982289fa48SGreg Clayton 
1399b9c1b51eSKate Stone       if (platform_sp) {
1400615eb7e6SGreg Clayton         // Already have a platform with this name, just select it
1401615eb7e6SGreg Clayton         m_opaque_sp->GetPlatformList().SetSelectedPlatform(platform_sp);
1402b9c1b51eSKate Stone       } else {
1403615eb7e6SGreg Clayton         // We don't have a platform by this name yet, create one
1404615eb7e6SGreg Clayton         platform_sp = Platform::Create(platform_name, sb_error.ref());
1405b9c1b51eSKate Stone         if (platform_sp) {
1406615eb7e6SGreg Clayton           // We created the platform, now append and select it
14072289fa48SGreg Clayton           bool make_selected = true;
14082289fa48SGreg Clayton           m_opaque_sp->GetPlatformList().Append(platform_sp, make_selected);
14092289fa48SGreg Clayton         }
14102289fa48SGreg Clayton       }
1411b9c1b51eSKate Stone     } else {
1412615eb7e6SGreg Clayton       sb_error.ref().SetErrorString("invalid platform name");
1413615eb7e6SGreg Clayton     }
1414b9c1b51eSKate Stone   } else {
1415615eb7e6SGreg Clayton     sb_error.ref().SetErrorString("invalid debugger");
1416615eb7e6SGreg Clayton   }
1417baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_error);
14182289fa48SGreg Clayton }
14192289fa48SGreg Clayton 
1420b9c1b51eSKate Stone bool SBDebugger::SetCurrentPlatformSDKRoot(const char *sysroot) {
1421baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBDebugger, SetCurrentPlatformSDKRoot,
1422baf5664fSJonas Devlieghere                      (const char *), sysroot);
1423baf5664fSJonas Devlieghere 
1424e1cf274bSJason Molenda   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1425b9c1b51eSKate Stone   if (m_opaque_sp) {
1426b9c1b51eSKate Stone     PlatformSP platform_sp(
1427b9c1b51eSKate Stone         m_opaque_sp->GetPlatformList().GetSelectedPlatform());
1428f3dd93c8SGreg Clayton 
1429b9c1b51eSKate Stone     if (platform_sp) {
1430e1cf274bSJason Molenda       if (log && sysroot)
143163e5fb76SJonas Devlieghere         LLDB_LOGF(log, "SBDebugger::SetCurrentPlatformSDKRoot (\"%s\")",
143263e5fb76SJonas Devlieghere                   sysroot);
1433f3dd93c8SGreg Clayton       platform_sp->SetSDKRootDirectory(ConstString(sysroot));
1434f3dd93c8SGreg Clayton       return true;
1435f3dd93c8SGreg Clayton     }
1436f3dd93c8SGreg Clayton   }
1437f3dd93c8SGreg Clayton   return false;
1438f3dd93c8SGreg Clayton }
1439f3dd93c8SGreg Clayton 
1440b9c1b51eSKate Stone bool SBDebugger::GetCloseInputOnEOF() const {
1441baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBDebugger, GetCloseInputOnEOF);
1442baf5664fSJonas Devlieghere 
1443dbb0abbfSEugene Zelenko   return (m_opaque_sp ? m_opaque_sp->GetCloseInputOnEOF() : false);
1444fc3f027dSGreg Clayton }
1445fc3f027dSGreg Clayton 
1446b9c1b51eSKate Stone void SBDebugger::SetCloseInputOnEOF(bool b) {
1447baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBDebugger, SetCloseInputOnEOF, (bool), b);
1448baf5664fSJonas Devlieghere 
1449fc3f027dSGreg Clayton   if (m_opaque_sp)
1450fc3f027dSGreg Clayton     m_opaque_sp->SetCloseInputOnEOF(b);
1451fc3f027dSGreg Clayton }
1452061858ceSEnrico Granata 
1453b9c1b51eSKate Stone SBTypeCategory SBDebugger::GetCategory(const char *category_name) {
1454baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTypeCategory, SBDebugger, GetCategory,
1455baf5664fSJonas Devlieghere                      (const char *), category_name);
1456baf5664fSJonas Devlieghere 
1457061858ceSEnrico Granata   if (!category_name || *category_name == 0)
1458baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(SBTypeCategory());
1459061858ceSEnrico Granata 
1460061858ceSEnrico Granata   TypeCategoryImplSP category_sp;
1461061858ceSEnrico Granata 
1462b9c1b51eSKate Stone   if (DataVisualization::Categories::GetCategory(ConstString(category_name),
1463baf5664fSJonas Devlieghere                                                  category_sp, false)) {
1464baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(SBTypeCategory(category_sp));
1465baf5664fSJonas Devlieghere   } else {
1466baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(SBTypeCategory());
1467baf5664fSJonas Devlieghere   }
1468061858ceSEnrico Granata }
1469061858ceSEnrico Granata 
1470b9c1b51eSKate Stone SBTypeCategory SBDebugger::GetCategory(lldb::LanguageType lang_type) {
1471baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTypeCategory, SBDebugger, GetCategory,
1472baf5664fSJonas Devlieghere                      (lldb::LanguageType), lang_type);
1473baf5664fSJonas Devlieghere 
1474e242624cSEnrico Granata   TypeCategoryImplSP category_sp;
1475baf5664fSJonas Devlieghere   if (DataVisualization::Categories::GetCategory(lang_type, category_sp)) {
1476baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(SBTypeCategory(category_sp));
1477baf5664fSJonas Devlieghere   } else {
1478baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(SBTypeCategory());
1479baf5664fSJonas Devlieghere   }
1480e242624cSEnrico Granata }
1481e242624cSEnrico Granata 
1482b9c1b51eSKate Stone SBTypeCategory SBDebugger::CreateCategory(const char *category_name) {
1483baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTypeCategory, SBDebugger, CreateCategory,
1484baf5664fSJonas Devlieghere                      (const char *), category_name);
1485baf5664fSJonas Devlieghere 
1486061858ceSEnrico Granata   if (!category_name || *category_name == 0)
1487baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(SBTypeCategory());
1488061858ceSEnrico Granata 
1489061858ceSEnrico Granata   TypeCategoryImplSP category_sp;
1490061858ceSEnrico Granata 
1491b9c1b51eSKate Stone   if (DataVisualization::Categories::GetCategory(ConstString(category_name),
1492baf5664fSJonas Devlieghere                                                  category_sp, true)) {
1493baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(SBTypeCategory(category_sp));
1494baf5664fSJonas Devlieghere   } else {
1495baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(SBTypeCategory());
1496baf5664fSJonas Devlieghere   }
1497061858ceSEnrico Granata }
1498061858ceSEnrico Granata 
1499b9c1b51eSKate Stone bool SBDebugger::DeleteCategory(const char *category_name) {
1500baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBDebugger, DeleteCategory, (const char *),
1501baf5664fSJonas Devlieghere                      category_name);
1502baf5664fSJonas Devlieghere 
1503061858ceSEnrico Granata   if (!category_name || *category_name == 0)
1504061858ceSEnrico Granata     return false;
1505061858ceSEnrico Granata 
1506061858ceSEnrico Granata   return DataVisualization::Categories::Delete(ConstString(category_name));
1507061858ceSEnrico Granata }
1508061858ceSEnrico Granata 
1509b9c1b51eSKate Stone uint32_t SBDebugger::GetNumCategories() {
1510baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBDebugger, GetNumCategories);
1511baf5664fSJonas Devlieghere 
1512061858ceSEnrico Granata   return DataVisualization::Categories::GetCount();
1513061858ceSEnrico Granata }
1514061858ceSEnrico Granata 
1515b9c1b51eSKate Stone SBTypeCategory SBDebugger::GetCategoryAtIndex(uint32_t index) {
1516baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTypeCategory, SBDebugger, GetCategoryAtIndex,
1517baf5664fSJonas Devlieghere                      (uint32_t), index);
1518baf5664fSJonas Devlieghere 
1519baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(
1520baf5664fSJonas Devlieghere       SBTypeCategory(DataVisualization::Categories::GetCategoryAtIndex(index)));
1521061858ceSEnrico Granata }
1522061858ceSEnrico Granata 
1523b9c1b51eSKate Stone SBTypeCategory SBDebugger::GetDefaultCategory() {
1524baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::SBTypeCategory, SBDebugger,
1525baf5664fSJonas Devlieghere                              GetDefaultCategory);
1526baf5664fSJonas Devlieghere 
1527baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(GetCategory("default"));
1528061858ceSEnrico Granata }
1529061858ceSEnrico Granata 
1530b9c1b51eSKate Stone SBTypeFormat SBDebugger::GetFormatForType(SBTypeNameSpecifier type_name) {
1531baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTypeFormat, SBDebugger, GetFormatForType,
1532baf5664fSJonas Devlieghere                      (lldb::SBTypeNameSpecifier), type_name);
1533baf5664fSJonas Devlieghere 
1534061858ceSEnrico Granata   SBTypeCategory default_category_sb = GetDefaultCategory();
1535061858ceSEnrico Granata   if (default_category_sb.GetEnabled())
1536baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(default_category_sb.GetFormatForType(type_name));
1537baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(SBTypeFormat());
1538061858ceSEnrico Granata }
1539061858ceSEnrico Granata 
1540b9c1b51eSKate Stone SBTypeSummary SBDebugger::GetSummaryForType(SBTypeNameSpecifier type_name) {
1541baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTypeSummary, SBDebugger, GetSummaryForType,
1542baf5664fSJonas Devlieghere                      (lldb::SBTypeNameSpecifier), type_name);
1543baf5664fSJonas Devlieghere 
1544dbb0abbfSEugene Zelenko   if (!type_name.IsValid())
1545baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(SBTypeSummary());
1546baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(
1547baf5664fSJonas Devlieghere       SBTypeSummary(DataVisualization::GetSummaryForType(type_name.GetSP())));
1548061858ceSEnrico Granata }
1549061858ceSEnrico Granata 
1550b9c1b51eSKate Stone SBTypeFilter SBDebugger::GetFilterForType(SBTypeNameSpecifier type_name) {
1551baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTypeFilter, SBDebugger, GetFilterForType,
1552baf5664fSJonas Devlieghere                      (lldb::SBTypeNameSpecifier), type_name);
1553baf5664fSJonas Devlieghere 
1554dbb0abbfSEugene Zelenko   if (!type_name.IsValid())
1555baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(SBTypeFilter());
1556baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(
1557baf5664fSJonas Devlieghere       SBTypeFilter(DataVisualization::GetFilterForType(type_name.GetSP())));
1558061858ceSEnrico Granata }
1559061858ceSEnrico Granata 
1560b9c1b51eSKate Stone SBTypeSynthetic SBDebugger::GetSyntheticForType(SBTypeNameSpecifier type_name) {
1561baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTypeSynthetic, SBDebugger, GetSyntheticForType,
1562baf5664fSJonas Devlieghere                      (lldb::SBTypeNameSpecifier), type_name);
1563baf5664fSJonas Devlieghere 
1564dbb0abbfSEugene Zelenko   if (!type_name.IsValid())
1565baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(SBTypeSynthetic());
1566baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(SBTypeSynthetic(
1567baf5664fSJonas Devlieghere       DataVisualization::GetSyntheticForType(type_name.GetSP())));
1568061858ceSEnrico Granata }
1569061858ceSEnrico Granata 
15705e336903SPavel Labath static llvm::ArrayRef<const char *> GetCategoryArray(const char **categories) {
15715e336903SPavel Labath   if (categories == nullptr)
15725e336903SPavel Labath     return {};
15735e336903SPavel Labath   size_t len = 0;
15745e336903SPavel Labath   while (categories[len] != nullptr)
15755e336903SPavel Labath     ++len;
15765e336903SPavel Labath   return llvm::makeArrayRef(categories, len);
15775e336903SPavel Labath }
15785e336903SPavel Labath 
1579b9c1b51eSKate Stone bool SBDebugger::EnableLog(const char *channel, const char **categories) {
1580baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBDebugger, EnableLog, (const char *, const char **),
1581baf5664fSJonas Devlieghere                      channel, categories);
1582baf5664fSJonas Devlieghere 
1583b9c1b51eSKate Stone   if (m_opaque_sp) {
1584b9c1b51eSKate Stone     uint32_t log_options =
1585b9c1b51eSKate Stone         LLDB_LOG_OPTION_PREPEND_TIMESTAMP | LLDB_LOG_OPTION_PREPEND_THREAD_NAME;
1586775588c0SPavel Labath     std::string error;
1587775588c0SPavel Labath     llvm::raw_string_ostream error_stream(error);
15885e336903SPavel Labath     return m_opaque_sp->EnableLog(channel, GetCategoryArray(categories), "",
1589775588c0SPavel Labath                                   log_options, error_stream);
1590b9c1b51eSKate Stone   } else
1591228063cdSJim Ingham     return false;
1592228063cdSJim Ingham }
15934f02b22dSJim Ingham 
1594b9c1b51eSKate Stone void SBDebugger::SetLoggingCallback(lldb::LogOutputCallback log_callback,
1595b9c1b51eSKate Stone                                     void *baton) {
15967bc83564SJonas Devlieghere   LLDB_RECORD_DUMMY(void, SBDebugger, SetLoggingCallback,
15977bc83564SJonas Devlieghere                     (lldb::LogOutputCallback, void *), log_callback, baton);
15980d7b0c96SJonas Devlieghere 
1599b9c1b51eSKate Stone   if (m_opaque_sp) {
16004f02b22dSJim Ingham     return m_opaque_sp->SetLoggingCallback(log_callback, baton);
16014f02b22dSJim Ingham   }
16024f02b22dSJim Ingham }
1603ae211eceSMichal Gorny 
1604ae211eceSMichal Gorny namespace lldb_private {
1605ae211eceSMichal Gorny namespace repro {
1606ae211eceSMichal Gorny 
1607d9aec34bSJonas Devlieghere template <> void RegisterMethods<SBInputReader>(Registry &R) {
1608ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBInputReader, SetIsDone, (bool));
1609ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool, SBInputReader, IsActive, ());
1610ae211eceSMichal Gorny }
1611ae211eceSMichal Gorny 
1612ae211eceSMichal Gorny static void SetFileHandleRedirect(SBDebugger *, FILE *, bool) {
1613ae211eceSMichal Gorny   // Do nothing.
1614ae211eceSMichal Gorny }
1615ae211eceSMichal Gorny 
161696898eb6SLawrence D'Anna static SBError SetFileRedirect(SBDebugger *, SBFile file) { return SBError(); }
161796898eb6SLawrence D'Anna 
1618c040b30fSLawrence D'Anna static SBError SetFileRedirect(SBDebugger *, FileSP file) { return SBError(); }
1619c040b30fSLawrence D'Anna 
1620ae211eceSMichal Gorny static bool GetDefaultArchitectureRedirect(char *arch_name,
1621ae211eceSMichal Gorny                                            size_t arch_name_len) {
1622ae211eceSMichal Gorny   // The function is writing to its argument. Without the redirect it would
1623ae211eceSMichal Gorny   // write into the replay buffer.
1624ae211eceSMichal Gorny   char buffer[1024];
1625ae211eceSMichal Gorny   return SBDebugger::GetDefaultArchitecture(buffer, arch_name_len);
1626ae211eceSMichal Gorny }
1627ae211eceSMichal Gorny 
1628d9aec34bSJonas Devlieghere template <> void RegisterMethods<SBDebugger>(Registry &R) {
1629ae211eceSMichal Gorny   // Custom implementation.
1630ae211eceSMichal Gorny   R.Register(&invoke<void (SBDebugger::*)(
1631ae211eceSMichal Gorny                  FILE *, bool)>::method<&SBDebugger::SetErrorFileHandle>::doit,
1632ae211eceSMichal Gorny              &SetFileHandleRedirect);
1633ae211eceSMichal Gorny   R.Register(&invoke<void (SBDebugger::*)(
1634ae211eceSMichal Gorny                  FILE *, bool)>::method<&SBDebugger::SetOutputFileHandle>::doit,
1635ae211eceSMichal Gorny              &SetFileHandleRedirect);
1636ae211eceSMichal Gorny   R.Register<bool(char *, size_t)>(static_cast<bool (*)(char *, size_t)>(
1637ae211eceSMichal Gorny                                        &SBDebugger::GetDefaultArchitecture),
1638ae211eceSMichal Gorny                                    &GetDefaultArchitectureRedirect);
1639ae211eceSMichal Gorny 
164096898eb6SLawrence D'Anna   R.Register(&invoke<SBError (SBDebugger::*)(
164196898eb6SLawrence D'Anna                  SBFile)>::method<&SBDebugger::SetInputFile>::doit,
164296898eb6SLawrence D'Anna              &SetFileRedirect);
164396898eb6SLawrence D'Anna   R.Register(&invoke<SBError (SBDebugger::*)(
164496898eb6SLawrence D'Anna                  SBFile)>::method<&SBDebugger::SetOutputFile>::doit,
164596898eb6SLawrence D'Anna              &SetFileRedirect);
164696898eb6SLawrence D'Anna   R.Register(&invoke<SBError (SBDebugger::*)(
164796898eb6SLawrence D'Anna                  SBFile)>::method<&SBDebugger::SetErrorFile>::doit,
164896898eb6SLawrence D'Anna              &SetFileRedirect);
164996898eb6SLawrence D'Anna 
1650c040b30fSLawrence D'Anna   R.Register(&invoke<SBError (SBDebugger::*)(
1651c040b30fSLawrence D'Anna                  FileSP)>::method<&SBDebugger::SetInputFile>::doit,
1652c040b30fSLawrence D'Anna              &SetFileRedirect);
1653c040b30fSLawrence D'Anna   R.Register(&invoke<SBError (SBDebugger::*)(
1654c040b30fSLawrence D'Anna                  FileSP)>::method<&SBDebugger::SetOutputFile>::doit,
1655c040b30fSLawrence D'Anna              &SetFileRedirect);
1656c040b30fSLawrence D'Anna   R.Register(&invoke<SBError (SBDebugger::*)(
1657c040b30fSLawrence D'Anna                  FileSP)>::method<&SBDebugger::SetErrorFile>::doit,
1658c040b30fSLawrence D'Anna              &SetFileRedirect);
1659c040b30fSLawrence D'Anna 
1660ae211eceSMichal Gorny   LLDB_REGISTER_CONSTRUCTOR(SBDebugger, ());
1661ae211eceSMichal Gorny   LLDB_REGISTER_CONSTRUCTOR(SBDebugger, (const lldb::DebuggerSP &));
1662ae211eceSMichal Gorny   LLDB_REGISTER_CONSTRUCTOR(SBDebugger, (const lldb::SBDebugger &));
1663ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBDebugger &,
1664ae211eceSMichal Gorny                        SBDebugger, operator=,(const lldb::SBDebugger &));
1665ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(void, SBDebugger, Initialize, ());
1666ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(lldb::SBError, SBDebugger,
1667ae211eceSMichal Gorny                               InitializeWithErrorHandling, ());
1668ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(void, SBDebugger, Terminate, ());
1669ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDebugger, Clear, ());
1670ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(lldb::SBDebugger, SBDebugger, Create, ());
1671ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(lldb::SBDebugger, SBDebugger, Create, (bool));
1672d9aec34bSJonas Devlieghere   LLDB_REGISTER_STATIC_METHOD(void, SBDebugger, Destroy, (lldb::SBDebugger &));
1673ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(void, SBDebugger, MemoryPressureDetected, ());
1674ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool, SBDebugger, IsValid, ());
1675ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool, SBDebugger, operator bool,());
1676ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDebugger, SetAsync, (bool));
1677ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBDebugger, GetAsync, ());
1678ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDebugger, SkipLLDBInitFiles, (bool));
1679ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDebugger, SkipAppInitFiles, (bool));
1680ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDebugger, SetInputFileHandle, (FILE *, bool));
1681ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(FILE *, SBDebugger, GetInputFileHandle, ());
1682ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(FILE *, SBDebugger, GetOutputFileHandle, ());
1683ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(FILE *, SBDebugger, GetErrorFileHandle, ());
168496898eb6SLawrence D'Anna   LLDB_REGISTER_METHOD(SBFile, SBDebugger, GetInputFile, ());
168596898eb6SLawrence D'Anna   LLDB_REGISTER_METHOD(SBFile, SBDebugger, GetOutputFile, ());
168696898eb6SLawrence D'Anna   LLDB_REGISTER_METHOD(SBFile, SBDebugger, GetErrorFile, ());
1687ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDebugger, SaveInputTerminalState, ());
1688ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDebugger, RestoreInputTerminalState, ());
1689ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBCommandInterpreter, SBDebugger,
1690ae211eceSMichal Gorny                        GetCommandInterpreter, ());
1691ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDebugger, HandleCommand, (const char *));
1692ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBListener, SBDebugger, GetListener, ());
1693ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(
1694ae211eceSMichal Gorny       void, SBDebugger, HandleProcessEvent,
1695ae211eceSMichal Gorny       (const lldb::SBProcess &, const lldb::SBEvent &, FILE *, FILE *));
1696322f12afSLawrence D'Anna   LLDB_REGISTER_METHOD(
1697322f12afSLawrence D'Anna       void, SBDebugger, HandleProcessEvent,
1698322f12afSLawrence D'Anna       (const lldb::SBProcess &, const lldb::SBEvent &, SBFile, SBFile));
1699322f12afSLawrence D'Anna   LLDB_REGISTER_METHOD(
1700322f12afSLawrence D'Anna       void, SBDebugger, HandleProcessEvent,
1701322f12afSLawrence D'Anna       (const lldb::SBProcess &, const lldb::SBEvent &, FileSP, FileSP));
1702d9aec34bSJonas Devlieghere   LLDB_REGISTER_METHOD(lldb::SBSourceManager, SBDebugger, GetSourceManager, ());
1703ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(bool, SBDebugger, SetDefaultArchitecture,
1704ae211eceSMichal Gorny                               (const char *));
1705ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::ScriptLanguage, SBDebugger, GetScriptingLanguage,
1706ae211eceSMichal Gorny                        (const char *));
1707ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(const char *, SBDebugger, GetVersionString, ());
1708ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(const char *, SBDebugger, StateAsCString,
1709ae211eceSMichal Gorny                               (lldb::StateType));
1710ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(lldb::SBStructuredData, SBDebugger,
1711ae211eceSMichal Gorny                               GetBuildConfiguration, ());
1712ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(bool, SBDebugger, StateIsRunningState,
1713ae211eceSMichal Gorny                               (lldb::StateType));
1714ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(bool, SBDebugger, StateIsStoppedState,
1715ae211eceSMichal Gorny                               (lldb::StateType));
1716ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(
1717ae211eceSMichal Gorny       lldb::SBTarget, SBDebugger, CreateTarget,
1718ae211eceSMichal Gorny       (const char *, const char *, const char *, bool, lldb::SBError &));
1719ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBTarget, SBDebugger,
1720ae211eceSMichal Gorny                        CreateTargetWithFileAndTargetTriple,
1721ae211eceSMichal Gorny                        (const char *, const char *));
1722d9aec34bSJonas Devlieghere   LLDB_REGISTER_METHOD(lldb::SBTarget, SBDebugger, CreateTargetWithFileAndArch,
1723ae211eceSMichal Gorny                        (const char *, const char *));
1724ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBTarget, SBDebugger, CreateTarget,
1725ae211eceSMichal Gorny                        (const char *));
1726ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBTarget, SBDebugger, GetDummyTarget, ());
1727ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBDebugger, DeleteTarget, (lldb::SBTarget &));
1728ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBTarget, SBDebugger, GetTargetAtIndex,
1729ae211eceSMichal Gorny                        (uint32_t));
1730ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(uint32_t, SBDebugger, GetIndexOfTarget,
1731ae211eceSMichal Gorny                        (lldb::SBTarget));
1732ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBTarget, SBDebugger, FindTargetWithProcessID,
1733ae211eceSMichal Gorny                        (lldb::pid_t));
1734ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBTarget, SBDebugger, FindTargetWithFileAndArch,
1735ae211eceSMichal Gorny                        (const char *, const char *));
1736ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(uint32_t, SBDebugger, GetNumTargets, ());
1737ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBTarget, SBDebugger, GetSelectedTarget, ());
1738d9aec34bSJonas Devlieghere   LLDB_REGISTER_METHOD(void, SBDebugger, SetSelectedTarget, (lldb::SBTarget &));
1739ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBPlatform, SBDebugger, GetSelectedPlatform, ());
1740ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDebugger, SetSelectedPlatform,
1741ae211eceSMichal Gorny                        (lldb::SBPlatform &));
1742ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(uint32_t, SBDebugger, GetNumPlatforms, ());
1743ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBPlatform, SBDebugger, GetPlatformAtIndex,
1744ae211eceSMichal Gorny                        (uint32_t));
1745ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(uint32_t, SBDebugger, GetNumAvailablePlatforms, ());
1746ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBStructuredData, SBDebugger,
1747ae211eceSMichal Gorny                        GetAvailablePlatformInfoAtIndex, (uint32_t));
1748ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDebugger, DispatchInputInterrupt, ());
1749ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDebugger, DispatchInputEndOfFile, ());
1750ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDebugger, PushInputReader,
1751ae211eceSMichal Gorny                        (lldb::SBInputReader &));
1752ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDebugger, RunCommandInterpreter, (bool, bool));
1753ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDebugger, RunCommandInterpreter,
1754ae211eceSMichal Gorny                        (bool, bool, lldb::SBCommandInterpreterRunOptions &,
1755ae211eceSMichal Gorny                         int &, bool &, bool &));
1756ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBError, SBDebugger, RunREPL,
1757ae211eceSMichal Gorny                        (lldb::LanguageType, const char *));
1758d9aec34bSJonas Devlieghere   LLDB_REGISTER_STATIC_METHOD(lldb::SBDebugger, SBDebugger, FindDebuggerWithID,
1759d9aec34bSJonas Devlieghere                               (int));
1760ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(const char *, SBDebugger, GetInstanceName, ());
1761ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(lldb::SBError, SBDebugger, SetInternalVariable,
1762ae211eceSMichal Gorny                               (const char *, const char *, const char *));
1763ae211eceSMichal Gorny   LLDB_REGISTER_STATIC_METHOD(lldb::SBStringList, SBDebugger,
1764ae211eceSMichal Gorny                               GetInternalVariableValue,
1765ae211eceSMichal Gorny                               (const char *, const char *));
1766ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(uint32_t, SBDebugger, GetTerminalWidth, ());
1767ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDebugger, SetTerminalWidth, (uint32_t));
1768ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(const char *, SBDebugger, GetPrompt, ());
1769ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDebugger, SetPrompt, (const char *));
1770ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(const char *, SBDebugger, GetReproducerPath, ());
1771ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::ScriptLanguage, SBDebugger,
1772ae211eceSMichal Gorny                              GetScriptLanguage, ());
1773ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDebugger, SetScriptLanguage,
1774ae211eceSMichal Gorny                        (lldb::ScriptLanguage));
1775ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBDebugger, SetUseExternalEditor, (bool));
1776ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBDebugger, GetUseExternalEditor, ());
1777ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBDebugger, SetUseColor, (bool));
1778ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool, SBDebugger, GetUseColor, ());
1779ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBDebugger, GetDescription, (lldb::SBStream &));
1780ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::user_id_t, SBDebugger, GetID, ());
1781ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBError, SBDebugger, SetCurrentPlatform,
1782ae211eceSMichal Gorny                        (const char *));
1783ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBDebugger, SetCurrentPlatformSDKRoot,
1784ae211eceSMichal Gorny                        (const char *));
1785ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool, SBDebugger, GetCloseInputOnEOF, ());
1786ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDebugger, SetCloseInputOnEOF, (bool));
1787ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBTypeCategory, SBDebugger, GetCategory,
1788ae211eceSMichal Gorny                        (const char *));
1789ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBTypeCategory, SBDebugger, GetCategory,
1790ae211eceSMichal Gorny                        (lldb::LanguageType));
1791ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBTypeCategory, SBDebugger, CreateCategory,
1792ae211eceSMichal Gorny                        (const char *));
1793ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBDebugger, DeleteCategory, (const char *));
1794ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(uint32_t, SBDebugger, GetNumCategories, ());
1795ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBTypeCategory, SBDebugger, GetCategoryAtIndex,
1796ae211eceSMichal Gorny                        (uint32_t));
1797ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBTypeCategory, SBDebugger, GetDefaultCategory,
1798ae211eceSMichal Gorny                        ());
1799ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBTypeFormat, SBDebugger, GetFormatForType,
1800ae211eceSMichal Gorny                        (lldb::SBTypeNameSpecifier));
1801ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBTypeSummary, SBDebugger, GetSummaryForType,
1802ae211eceSMichal Gorny                        (lldb::SBTypeNameSpecifier));
1803ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBTypeSynthetic, SBDebugger, GetSyntheticForType,
1804ae211eceSMichal Gorny                        (lldb::SBTypeNameSpecifier));
1805ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBTypeFilter, SBDebugger, GetFilterForType,
1806ae211eceSMichal Gorny                        (lldb::SBTypeNameSpecifier));
1807ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBDebugger, EnableLog,
1808ae211eceSMichal Gorny                        (const char *, const char **));
1809ae211eceSMichal Gorny }
1810ae211eceSMichal Gorny 
1811d9aec34bSJonas Devlieghere } // namespace repro
1812d9aec34bSJonas Devlieghere } // namespace lldb_private
1813