blob: ad3dc5412c8619b36d9b8066331ed236416de7bb [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- SBDebugger.cpp ------------------------------------------*- C++ -*-===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006//
7//===----------------------------------------------------------------------===//
8
Jonas Devliegherebaf56642019-03-06 00:06:00 +00009#include "SBReproducerPrivate.h"
Alex Langfordd17cd902018-05-25 20:28:16 +000010#include "SystemInitializerFull.h"
11
Eli Friedmanca93cc12010-06-09 07:37:52 +000012#include "lldb/API/SBDebugger.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000013
Greg Claytone0d378b2011-03-24 21:19:54 +000014#include "lldb/lldb-private.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000015
Eli Friedmanca93cc12010-06-09 07:37:52 +000016#include "lldb/API/SBBroadcaster.h"
17#include "lldb/API/SBCommandInterpreter.h"
18#include "lldb/API/SBCommandReturnObject.h"
Greg Clayton2289fa42011-04-30 01:09:13 +000019#include "lldb/API/SBError.h"
Eli Friedmanca93cc12010-06-09 07:37:52 +000020#include "lldb/API/SBEvent.h"
21#include "lldb/API/SBFrame.h"
Kate Stoneb9c1b512016-09-06 20:57:50 +000022#include "lldb/API/SBListener.h"
Caroline Tice3df9a8d2010-09-04 00:03:46 +000023#include "lldb/API/SBProcess.h"
24#include "lldb/API/SBSourceManager.h"
Caroline Ticedde9cff2010-09-20 05:20:02 +000025#include "lldb/API/SBStream.h"
Caroline Tice3df9a8d2010-09-04 00:03:46 +000026#include "lldb/API/SBStringList.h"
Vadim Macagonc10e34d2017-08-09 09:20:40 +000027#include "lldb/API/SBStructuredData.h"
Caroline Tice3df9a8d2010-09-04 00:03:46 +000028#include "lldb/API/SBTarget.h"
29#include "lldb/API/SBThread.h"
Enrico Granata061858c2012-02-15 02:34:21 +000030#include "lldb/API/SBTypeCategory.h"
Enrico Granata061858c2012-02-15 02:34:21 +000031#include "lldb/API/SBTypeFilter.h"
Kate Stoneb9c1b512016-09-06 20:57:50 +000032#include "lldb/API/SBTypeFormat.h"
Enrico Granata061858c2012-02-15 02:34:21 +000033#include "lldb/API/SBTypeNameSpecifier.h"
34#include "lldb/API/SBTypeSummary.h"
35#include "lldb/API/SBTypeSynthetic.h"
36
Greg Clayton6eee5aa2010-10-11 01:05:37 +000037#include "lldb/Core/Debugger.h"
Vadim Macagonc10e34d2017-08-09 09:20:40 +000038#include "lldb/Core/PluginManager.h"
Greg Clayton44d93782014-01-27 23:43:24 +000039#include "lldb/Core/StreamFile.h"
Vadim Macagonc10e34d2017-08-09 09:20:40 +000040#include "lldb/Core/StructuredDataImpl.h"
Enrico Granata5548cb52013-01-28 23:47:25 +000041#include "lldb/DataFormatters/DataVisualization.h"
Pavel Labathf1389e92018-02-19 15:06:28 +000042#include "lldb/Host/XML.h"
Zachary Turnere6e2bb32015-03-31 21:03:22 +000043#include "lldb/Initialization/SystemLifetimeManager.h"
Greg Clayton6eee5aa2010-10-11 01:05:37 +000044#include "lldb/Interpreter/CommandInterpreter.h"
Pavel Labath47cbf4a2018-04-10 09:03:59 +000045#include "lldb/Interpreter/OptionArgParser.h"
Greg Claytoncac9c5f2011-09-24 00:52:29 +000046#include "lldb/Interpreter/OptionGroupPlatform.h"
Greg Clayton6eee5aa2010-10-11 01:05:37 +000047#include "lldb/Target/Process.h"
48#include "lldb/Target/TargetList.h"
Pavel Labath145d95c2018-04-17 18:53:35 +000049#include "lldb/Utility/Args.h"
Pavel Labathd821c992018-08-07 11:07:21 +000050#include "lldb/Utility/State.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000051
Enrico Granatad717cc92015-10-20 04:50:09 +000052#include "llvm/ADT/STLExtras.h"
Zachary Turner7b2e5a32016-09-16 19:09:12 +000053#include "llvm/ADT/StringRef.h"
Zachary Turner58a559c2014-08-27 20:15:09 +000054#include "llvm/Support/DynamicLibrary.h"
Kate Stoneb9c1b512016-09-06 20:57:50 +000055#include "llvm/Support/ManagedStatic.h"
Zachary Turner58a559c2014-08-27 20:15:09 +000056
Chris Lattner30fdc8d2010-06-08 16:52:24 +000057using namespace lldb;
58using namespace lldb_private;
59
Jonas Devlieghered77c2e02019-03-02 00:20:26 +000060/// Helper class for replaying commands through the reproducer.
61class CommandLoader {
62public:
63 CommandLoader(std::vector<std::string> files) : m_files(files) {}
64
65 static std::unique_ptr<CommandLoader> Create() {
66 repro::Loader *loader = repro::Reproducer::Instance().GetLoader();
67 if (!loader)
68 return {};
69
70 FileSpec file = loader->GetFile<repro::CommandInfo>();
71 if (!file)
72 return {};
73
74 auto error_or_file = llvm::MemoryBuffer::getFile(file.GetPath());
75 if (auto err = error_or_file.getError())
76 return {};
77
78 std::vector<std::string> files;
79 llvm::yaml::Input yin((*error_or_file)->getBuffer());
80 yin >> files;
81
82 if (auto err = yin.error())
83 return {};
84
85 return llvm::make_unique<CommandLoader>(std::move(files));
86 }
87
88 FILE *GetNextFile() {
89 if (m_index >= m_files.size())
90 return nullptr;
91 return FileSystem::Instance().Fopen(m_files[m_index++].c_str(), "r");
92 }
93
94private:
95 std::vector<std::string> m_files;
96 unsigned m_index = 0;
97};
98
Kate Stoneb9c1b512016-09-06 20:57:50 +000099static llvm::sys::DynamicLibrary LoadPlugin(const lldb::DebuggerSP &debugger_sp,
100 const FileSpec &spec,
Zachary Turner97206d52017-05-12 04:51:55 +0000101 Status &error) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000102 llvm::sys::DynamicLibrary dynlib =
103 llvm::sys::DynamicLibrary::getPermanentLibrary(spec.GetPath().c_str());
104 if (dynlib.isValid()) {
105 typedef bool (*LLDBCommandPluginInit)(lldb::SBDebugger & debugger);
106
107 lldb::SBDebugger debugger_sb(debugger_sp);
108 // This calls the bool lldb::PluginInitialize(lldb::SBDebugger debugger)
109 // function.
110 // TODO: mangle this differently for your system - on OSX, the first
111 // underscore needs to be removed and the second one stays
112 LLDBCommandPluginInit init_func =
Stephane Sezer22701b22017-10-24 23:46:00 +0000113 (LLDBCommandPluginInit)(uintptr_t)dynlib.getAddressOfSymbol(
Kate Stoneb9c1b512016-09-06 20:57:50 +0000114 "_ZN4lldb16PluginInitializeENS_10SBDebuggerE");
115 if (init_func) {
116 if (init_func(debugger_sb))
117 return dynlib;
118 else
119 error.SetErrorString("plug-in refused to load "
120 "(lldb::PluginInitialize(lldb::SBDebugger) "
121 "returned false)");
122 } else {
123 error.SetErrorString("plug-in is missing the required initialization: "
124 "lldb::PluginInitialize(lldb::SBDebugger)");
Greg Clayton5fb8f792013-12-02 19:35:49 +0000125 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000126 } else {
Jonas Devliegheredbd7fab2018-11-01 17:09:25 +0000127 if (FileSystem::Instance().Exists(spec))
Kate Stoneb9c1b512016-09-06 20:57:50 +0000128 error.SetErrorString("this file does not represent a loadable dylib");
Greg Clayton5fb8f792013-12-02 19:35:49 +0000129 else
Kate Stoneb9c1b512016-09-06 20:57:50 +0000130 error.SetErrorString("no such file");
131 }
132 return llvm::sys::DynamicLibrary();
Greg Clayton5fb8f792013-12-02 19:35:49 +0000133}
134
Zachary Turnere6e2bb32015-03-31 21:03:22 +0000135static llvm::ManagedStatic<SystemLifetimeManager> g_debugger_lifetime;
136
Kate Stoneb9c1b512016-09-06 20:57:50 +0000137SBError SBInputReader::Initialize(
138 lldb::SBDebugger &sb_debugger,
Jonas Devlieghere0d7b0c92019-03-08 19:09:27 +0000139 unsigned long (*callback)(void *, lldb::SBInputReader *,
140 lldb::InputReaderAction, char const *,
141 unsigned long),
142 void *a, lldb::InputReaderGranularity b, char const *c, char const *d,
143 bool e) {
Jonas Devlieghere7bc83562019-03-11 20:31:21 +0000144 LLDB_RECORD_DUMMY(
145 lldb::SBError, SBInputReader, Initialize,
146 (lldb::SBDebugger &,
147 unsigned long (*)(void *, lldb::SBInputReader *, lldb::InputReaderAction,
148 const char *, unsigned long),
149 void *, lldb::InputReaderGranularity, const char *, const char *, bool),
150 sb_debugger, callback, a, b, c, d, e);
Jonas Devlieghere0d7b0c92019-03-08 19:09:27 +0000151
Kate Stoneb9c1b512016-09-06 20:57:50 +0000152 return SBError();
Zachary Turnere6e2bb32015-03-31 21:03:22 +0000153}
154
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000155void SBInputReader::SetIsDone(bool b) {
156 LLDB_RECORD_METHOD(void, SBInputReader, SetIsDone, (bool), b);
157}
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +0000158
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000159bool SBInputReader::IsActive() const {
160 LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBInputReader, IsActive);
Zachary Turnere6e2bb32015-03-31 21:03:22 +0000161
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000162 return false;
163}
164
165SBDebugger::SBDebugger() { LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBDebugger); }
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +0000166
Kate Stoneb9c1b512016-09-06 20:57:50 +0000167SBDebugger::SBDebugger(const lldb::DebuggerSP &debugger_sp)
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000168 : m_opaque_sp(debugger_sp) {
169 LLDB_RECORD_CONSTRUCTOR(SBDebugger, (const lldb::DebuggerSP &), debugger_sp);
170}
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +0000171
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000172SBDebugger::SBDebugger(const SBDebugger &rhs) : m_opaque_sp(rhs.m_opaque_sp) {
173 LLDB_RECORD_CONSTRUCTOR(SBDebugger, (const lldb::SBDebugger &), rhs);
174}
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +0000175
176SBDebugger::~SBDebugger() = default;
177
Kate Stoneb9c1b512016-09-06 20:57:50 +0000178SBDebugger &SBDebugger::operator=(const SBDebugger &rhs) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000179 LLDB_RECORD_METHOD(lldb::SBDebugger &,
180 SBDebugger, operator=,(const lldb::SBDebugger &), rhs);
181
Kate Stoneb9c1b512016-09-06 20:57:50 +0000182 if (this != &rhs) {
183 m_opaque_sp = rhs.m_opaque_sp;
184 }
185 return *this;
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +0000186}
187
Kate Stoneb9c1b512016-09-06 20:57:50 +0000188void SBDebugger::Initialize() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000189 LLDB_RECORD_STATIC_METHOD_NO_ARGS(void, SBDebugger, Initialize);
Jonas Devlieghere936c6242019-02-21 22:26:16 +0000190 SBError ignored = SBDebugger::InitializeWithErrorHandling();
Jonas Devlieghere15eacd72018-12-03 17:28:29 +0000191}
192
Jonas Devlieghere936c6242019-02-21 22:26:16 +0000193lldb::SBError SBDebugger::InitializeWithErrorHandling() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000194 LLDB_RECORD_STATIC_METHOD_NO_ARGS(lldb::SBError, SBDebugger,
195 InitializeWithErrorHandling);
196
Caroline Ticeceb6b132010-10-26 03:11:13 +0000197
Caroline Ticeceb6b132010-10-26 03:11:13 +0000198
Jonas Devlieghere15eacd72018-12-03 17:28:29 +0000199 SBError error;
200 if (auto e = g_debugger_lifetime->Initialize(
Jonas Devlieghere936c6242019-02-21 22:26:16 +0000201 llvm::make_unique<SystemInitializerFull>(), LoadPlugin)) {
Jonas Devlieghere15eacd72018-12-03 17:28:29 +0000202 error.SetError(Status(std::move(e)));
203 }
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000204 return LLDB_RECORD_RESULT(error);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000205}
206
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000207void SBDebugger::Terminate() {
208 LLDB_RECORD_STATIC_METHOD_NO_ARGS(void, SBDebugger, Terminate);
209
210 g_debugger_lifetime->Terminate();
211}
Kate Stoneb9c1b512016-09-06 20:57:50 +0000212
213void SBDebugger::Clear() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000214 LLDB_RECORD_METHOD_NO_ARGS(void, SBDebugger, Clear);
215
Kate Stoneb9c1b512016-09-06 20:57:50 +0000216
217 if (m_opaque_sp)
218 m_opaque_sp->ClearIOHandlers();
219
220 m_opaque_sp.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000221}
222
Kate Stoneb9c1b512016-09-06 20:57:50 +0000223SBDebugger SBDebugger::Create() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000224 LLDB_RECORD_STATIC_METHOD_NO_ARGS(lldb::SBDebugger, SBDebugger, Create);
225
226 return LLDB_RECORD_RESULT(SBDebugger::Create(false, nullptr, nullptr));
Greg Clayton48e42542010-07-30 20:12:55 +0000227}
228
Kate Stoneb9c1b512016-09-06 20:57:50 +0000229SBDebugger SBDebugger::Create(bool source_init_files) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000230 LLDB_RECORD_STATIC_METHOD(lldb::SBDebugger, SBDebugger, Create, (bool),
231 source_init_files);
232
233 return LLDB_RECORD_RESULT(
234 SBDebugger::Create(source_init_files, nullptr, nullptr));
Jim Ingham06942692011-08-13 00:22:20 +0000235}
236
Kate Stoneb9c1b512016-09-06 20:57:50 +0000237SBDebugger SBDebugger::Create(bool source_init_files,
238 lldb::LogOutputCallback callback, void *baton)
Jim Ingham228063c2012-02-21 02:23:08 +0000239
240{
Jonas Devlieghere0d7b0c92019-03-08 19:09:27 +0000241 LLDB_RECORD_DUMMY(lldb::SBDebugger, SBDebugger, Create,
Jonas Devlieghere7bc83562019-03-11 20:31:21 +0000242 (bool, lldb::LogOutputCallback, void *), source_init_files,
243 callback, baton);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000244
Kate Stoneb9c1b512016-09-06 20:57:50 +0000245 SBDebugger debugger;
Greg Claytoncb172b12014-05-19 20:42:14 +0000246
Kate Stoneb9c1b512016-09-06 20:57:50 +0000247 // Currently we have issues if this function is called simultaneously on two
Adrian Prantl05097242018-04-30 16:49:04 +0000248 // different threads. The issues mainly revolve around the fact that the
249 // lldb_private::FormatManager uses global collections and having two threads
250 // parsing the .lldbinit files can cause mayhem. So to get around this for
251 // now we need to use a mutex to prevent bad things from happening.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000252 static std::recursive_mutex g_mutex;
253 std::lock_guard<std::recursive_mutex> guard(g_mutex);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000254
Kate Stoneb9c1b512016-09-06 20:57:50 +0000255 debugger.reset(Debugger::CreateInstance(callback, baton));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000256
Kate Stoneb9c1b512016-09-06 20:57:50 +0000257
258 SBCommandInterpreter interp = debugger.GetCommandInterpreter();
259 if (source_init_files) {
260 interp.get()->SkipLLDBInitFiles(false);
261 interp.get()->SkipAppInitFiles(false);
262 SBCommandReturnObject result;
263 interp.SourceInitFileInHomeDirectory(result);
264 } else {
265 interp.get()->SkipLLDBInitFiles(true);
266 interp.get()->SkipAppInitFiles(true);
267 }
268 return debugger;
Greg Clayton66111032010-06-23 01:19:29 +0000269}
270
Kate Stoneb9c1b512016-09-06 20:57:50 +0000271void SBDebugger::Destroy(SBDebugger &debugger) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000272 LLDB_RECORD_STATIC_METHOD(void, SBDebugger, Destroy, (lldb::SBDebugger &),
273 debugger);
274
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000275
Kate Stoneb9c1b512016-09-06 20:57:50 +0000276 Debugger::Destroy(debugger.m_opaque_sp);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000277
Kate Stoneb9c1b512016-09-06 20:57:50 +0000278 if (debugger.m_opaque_sp.get() != nullptr)
279 debugger.m_opaque_sp.reset();
Caroline Ticee02657b2011-01-22 01:02:07 +0000280}
281
Kate Stoneb9c1b512016-09-06 20:57:50 +0000282void SBDebugger::MemoryPressureDetected() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000283 LLDB_RECORD_STATIC_METHOD_NO_ARGS(void, SBDebugger, MemoryPressureDetected);
284
Adrian Prantl05097242018-04-30 16:49:04 +0000285 // Since this function can be call asynchronously, we allow it to be non-
286 // mandatory. We have seen deadlocks with this function when called so we
287 // need to safeguard against this until we can determine what is causing the
288 // deadlocks.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000289
290 const bool mandatory = false;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000291
292 ModuleList::RemoveOrphanSharedModules(mandatory);
Greg Claytonf9322412011-12-15 04:38:41 +0000293}
294
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000295bool SBDebugger::IsValid() const {
296 LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBDebugger, IsValid);
Pavel Labath7f5237b2019-03-11 13:58:46 +0000297 return this->operator bool();
298}
299SBDebugger::operator bool() const {
300 LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBDebugger, operator bool);
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000301
302 return m_opaque_sp.get() != nullptr;
303}
Kate Stoneb9c1b512016-09-06 20:57:50 +0000304
305void SBDebugger::SetAsync(bool b) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000306 LLDB_RECORD_METHOD(void, SBDebugger, SetAsync, (bool), b);
307
Kate Stoneb9c1b512016-09-06 20:57:50 +0000308 if (m_opaque_sp)
309 m_opaque_sp->SetAsyncExecution(b);
Greg Clayton66111032010-06-23 01:19:29 +0000310}
311
Kate Stoneb9c1b512016-09-06 20:57:50 +0000312bool SBDebugger::GetAsync() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000313 LLDB_RECORD_METHOD_NO_ARGS(bool, SBDebugger, GetAsync);
314
Kate Stoneb9c1b512016-09-06 20:57:50 +0000315 return (m_opaque_sp ? m_opaque_sp->GetAsyncExecution() : false);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000316}
317
Kate Stoneb9c1b512016-09-06 20:57:50 +0000318void SBDebugger::SkipLLDBInitFiles(bool b) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000319 LLDB_RECORD_METHOD(void, SBDebugger, SkipLLDBInitFiles, (bool), b);
320
Kate Stoneb9c1b512016-09-06 20:57:50 +0000321 if (m_opaque_sp)
322 m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles(b);
Jim Inghame64f0dc2011-09-13 23:25:31 +0000323}
324
Kate Stoneb9c1b512016-09-06 20:57:50 +0000325void SBDebugger::SkipAppInitFiles(bool b) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000326 LLDB_RECORD_METHOD(void, SBDebugger, SkipAppInitFiles, (bool), b);
327
Kate Stoneb9c1b512016-09-06 20:57:50 +0000328 if (m_opaque_sp)
329 m_opaque_sp->GetCommandInterpreter().SkipAppInitFiles(b);
Greg Clayton6eee5aa2010-10-11 01:05:37 +0000330}
331
Adrian Prantl05097242018-04-30 16:49:04 +0000332// Shouldn't really be settable after initialization as this could cause lots
333// of problems; don't want users trying to switch modes in the middle of a
334// debugging session.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000335void SBDebugger::SetInputFileHandle(FILE *fh, bool transfer_ownership) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000336 LLDB_RECORD_METHOD(void, SBDebugger, SetInputFileHandle, (FILE *, bool), fh,
337 transfer_ownership);
338
Jonas Devlieghered77c2e02019-03-02 00:20:26 +0000339 if (!m_opaque_sp)
340 return;
341
342 repro::DataRecorder *recorder = nullptr;
343 if (repro::Generator *g = repro::Reproducer::Instance().GetGenerator())
344 recorder = g->GetOrCreate<repro::CommandProvider>().GetNewDataRecorder();
345
346 static std::unique_ptr<CommandLoader> loader = CommandLoader::Create();
347 if (loader)
348 fh = loader->GetNextFile();
349
350 m_opaque_sp->SetInputFileHandle(fh, transfer_ownership, recorder);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000351}
352
Kate Stoneb9c1b512016-09-06 20:57:50 +0000353void SBDebugger::SetOutputFileHandle(FILE *fh, bool transfer_ownership) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000354 LLDB_RECORD_METHOD(void, SBDebugger, SetOutputFileHandle, (FILE *, bool), fh,
355 transfer_ownership);
356
Kate Stoneb9c1b512016-09-06 20:57:50 +0000357 if (m_opaque_sp)
358 m_opaque_sp->SetOutputFileHandle(fh, transfer_ownership);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000359}
360
Kate Stoneb9c1b512016-09-06 20:57:50 +0000361void SBDebugger::SetErrorFileHandle(FILE *fh, bool transfer_ownership) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000362 LLDB_RECORD_METHOD(void, SBDebugger, SetErrorFileHandle, (FILE *, bool), fh,
363 transfer_ownership);
364
Caroline Ticeceb6b132010-10-26 03:11:13 +0000365
Kate Stoneb9c1b512016-09-06 20:57:50 +0000366 if (m_opaque_sp)
367 m_opaque_sp->SetErrorFileHandle(fh, transfer_ownership);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000368}
369
Kate Stoneb9c1b512016-09-06 20:57:50 +0000370FILE *SBDebugger::GetInputFileHandle() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000371 LLDB_RECORD_METHOD_NO_ARGS(FILE *, SBDebugger, GetInputFileHandle);
372
Kate Stoneb9c1b512016-09-06 20:57:50 +0000373 if (m_opaque_sp) {
374 StreamFileSP stream_file_sp(m_opaque_sp->GetInputFile());
375 if (stream_file_sp)
376 return stream_file_sp->GetFile().GetStream();
377 }
378 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000379}
380
Kate Stoneb9c1b512016-09-06 20:57:50 +0000381FILE *SBDebugger::GetOutputFileHandle() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000382 LLDB_RECORD_METHOD_NO_ARGS(FILE *, SBDebugger, GetOutputFileHandle);
383
Kate Stoneb9c1b512016-09-06 20:57:50 +0000384 if (m_opaque_sp) {
385 StreamFileSP stream_file_sp(m_opaque_sp->GetOutputFile());
386 if (stream_file_sp)
387 return stream_file_sp->GetFile().GetStream();
388 }
389 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000390}
391
Kate Stoneb9c1b512016-09-06 20:57:50 +0000392FILE *SBDebugger::GetErrorFileHandle() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000393 LLDB_RECORD_METHOD_NO_ARGS(FILE *, SBDebugger, GetErrorFileHandle);
394
Kate Stoneb9c1b512016-09-06 20:57:50 +0000395 if (m_opaque_sp) {
396 StreamFileSP stream_file_sp(m_opaque_sp->GetErrorFile());
397 if (stream_file_sp)
398 return stream_file_sp->GetFile().GetStream();
399 }
400 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000401}
402
Kate Stoneb9c1b512016-09-06 20:57:50 +0000403void SBDebugger::SaveInputTerminalState() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000404 LLDB_RECORD_METHOD_NO_ARGS(void, SBDebugger, SaveInputTerminalState);
405
Kate Stoneb9c1b512016-09-06 20:57:50 +0000406 if (m_opaque_sp)
407 m_opaque_sp->SaveInputTerminalState();
Jim Inghamc5917d92012-11-30 20:23:19 +0000408}
409
Kate Stoneb9c1b512016-09-06 20:57:50 +0000410void SBDebugger::RestoreInputTerminalState() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000411 LLDB_RECORD_METHOD_NO_ARGS(void, SBDebugger, RestoreInputTerminalState);
412
Kate Stoneb9c1b512016-09-06 20:57:50 +0000413 if (m_opaque_sp)
414 m_opaque_sp->RestoreInputTerminalState();
Jim Inghamc5917d92012-11-30 20:23:19 +0000415}
Kate Stoneb9c1b512016-09-06 20:57:50 +0000416SBCommandInterpreter SBDebugger::GetCommandInterpreter() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000417 LLDB_RECORD_METHOD_NO_ARGS(lldb::SBCommandInterpreter, SBDebugger,
418 GetCommandInterpreter);
419
Caroline Ticeceb6b132010-10-26 03:11:13 +0000420
Kate Stoneb9c1b512016-09-06 20:57:50 +0000421 SBCommandInterpreter sb_interpreter;
422 if (m_opaque_sp)
423 sb_interpreter.reset(&m_opaque_sp->GetCommandInterpreter());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000424
Caroline Tice750cd172010-10-26 23:49:36 +0000425
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000426 return LLDB_RECORD_RESULT(sb_interpreter);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000427}
428
Kate Stoneb9c1b512016-09-06 20:57:50 +0000429void SBDebugger::HandleCommand(const char *command) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000430 LLDB_RECORD_METHOD(void, SBDebugger, HandleCommand, (const char *), command);
431
Kate Stoneb9c1b512016-09-06 20:57:50 +0000432 if (m_opaque_sp) {
433 TargetSP target_sp(m_opaque_sp->GetSelectedTarget());
434 std::unique_lock<std::recursive_mutex> lock;
435 if (target_sp)
436 lock = std::unique_lock<std::recursive_mutex>(target_sp->GetAPIMutex());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000437
Kate Stoneb9c1b512016-09-06 20:57:50 +0000438 SBCommandInterpreter sb_interpreter(GetCommandInterpreter());
439 SBCommandReturnObject result;
Greg Clayton66111032010-06-23 01:19:29 +0000440
Kate Stoneb9c1b512016-09-06 20:57:50 +0000441 sb_interpreter.HandleCommand(command, result, false);
Greg Clayton66111032010-06-23 01:19:29 +0000442
Kate Stoneb9c1b512016-09-06 20:57:50 +0000443 if (GetErrorFileHandle() != nullptr)
444 result.PutError(GetErrorFileHandle());
445 if (GetOutputFileHandle() != nullptr)
446 result.PutOutput(GetOutputFileHandle());
Greg Clayton66111032010-06-23 01:19:29 +0000447
Kate Stoneb9c1b512016-09-06 20:57:50 +0000448 if (!m_opaque_sp->GetAsyncExecution()) {
449 SBProcess process(GetCommandInterpreter().GetProcess());
450 ProcessSP process_sp(process.GetSP());
451 if (process_sp) {
452 EventSP event_sp;
453 ListenerSP lldb_listener_sp = m_opaque_sp->GetListener();
Pavel Labathd35031e12016-11-30 10:41:42 +0000454 while (lldb_listener_sp->GetEventForBroadcaster(
455 process_sp.get(), event_sp, std::chrono::seconds(0))) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000456 SBEvent event(event_sp);
457 HandleProcessEvent(process, event, GetOutputFileHandle(),
458 GetErrorFileHandle());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000459 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000460 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000461 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000462 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000463}
464
Kate Stoneb9c1b512016-09-06 20:57:50 +0000465SBListener SBDebugger::GetListener() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000466 LLDB_RECORD_METHOD_NO_ARGS(lldb::SBListener, SBDebugger, GetListener);
467
Caroline Ticeceb6b132010-10-26 03:11:13 +0000468
Kate Stoneb9c1b512016-09-06 20:57:50 +0000469 SBListener sb_listener;
470 if (m_opaque_sp)
471 sb_listener.reset(m_opaque_sp->GetListener());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000472
Caroline Tice750cd172010-10-26 23:49:36 +0000473
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000474 return LLDB_RECORD_RESULT(sb_listener);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000475}
476
Kate Stoneb9c1b512016-09-06 20:57:50 +0000477void SBDebugger::HandleProcessEvent(const SBProcess &process,
478 const SBEvent &event, FILE *out,
479 FILE *err) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000480 LLDB_RECORD_METHOD(
481 void, SBDebugger, HandleProcessEvent,
482 (const lldb::SBProcess &, const lldb::SBEvent &, FILE *, FILE *), process,
483 event, out, err);
484
Kate Stoneb9c1b512016-09-06 20:57:50 +0000485 if (!process.IsValid())
486 return;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000487
Kate Stoneb9c1b512016-09-06 20:57:50 +0000488 TargetSP target_sp(process.GetTarget().GetSP());
489 if (!target_sp)
490 return;
Greg Claytonb9556ac2012-01-30 07:41:31 +0000491
Kate Stoneb9c1b512016-09-06 20:57:50 +0000492 const uint32_t event_type = event.GetType();
493 char stdio_buffer[1024];
494 size_t len;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000495
Kate Stoneb9c1b512016-09-06 20:57:50 +0000496 std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +0000497
Kate Stoneb9c1b512016-09-06 20:57:50 +0000498 if (event_type &
499 (Process::eBroadcastBitSTDOUT | Process::eBroadcastBitStateChanged)) {
500 // Drain stdout when we stop just in case we have any bytes
501 while ((len = process.GetSTDOUT(stdio_buffer, sizeof(stdio_buffer))) > 0)
502 if (out != nullptr)
503 ::fwrite(stdio_buffer, 1, len, out);
504 }
Todd Fiala75930012016-08-19 04:21:48 +0000505
Kate Stoneb9c1b512016-09-06 20:57:50 +0000506 if (event_type &
507 (Process::eBroadcastBitSTDERR | Process::eBroadcastBitStateChanged)) {
508 // Drain stderr when we stop just in case we have any bytes
509 while ((len = process.GetSTDERR(stdio_buffer, sizeof(stdio_buffer))) > 0)
510 if (err != nullptr)
511 ::fwrite(stdio_buffer, 1, len, err);
512 }
513
514 if (event_type & Process::eBroadcastBitStateChanged) {
515 StateType event_state = SBProcess::GetStateFromEvent(event);
516
517 if (event_state == eStateInvalid)
518 return;
519
520 bool is_stopped = StateIsStoppedState(event_state);
521 if (!is_stopped)
522 process.ReportEventState(event, out);
523 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000524}
525
Kate Stoneb9c1b512016-09-06 20:57:50 +0000526SBSourceManager SBDebugger::GetSourceManager() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000527 LLDB_RECORD_METHOD_NO_ARGS(lldb::SBSourceManager, SBDebugger,
528 GetSourceManager);
529
Kate Stoneb9c1b512016-09-06 20:57:50 +0000530 SBSourceManager sb_source_manager(*this);
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000531 return LLDB_RECORD_RESULT(sb_source_manager);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000532}
533
Kate Stoneb9c1b512016-09-06 20:57:50 +0000534bool SBDebugger::GetDefaultArchitecture(char *arch_name, size_t arch_name_len) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000535 LLDB_RECORD_STATIC_METHOD(bool, SBDebugger, GetDefaultArchitecture,
536 (char *, size_t), "", arch_name_len);
537
Kate Stoneb9c1b512016-09-06 20:57:50 +0000538 if (arch_name && arch_name_len) {
539 ArchSpec default_arch = Target::GetDefaultArchitecture();
Caroline Ticedaccaa92010-09-20 20:44:43 +0000540
Kate Stoneb9c1b512016-09-06 20:57:50 +0000541 if (default_arch.IsValid()) {
542 const std::string &triple_str = default_arch.GetTriple().str();
543 if (!triple_str.empty())
544 ::snprintf(arch_name, arch_name_len, "%s", triple_str.c_str());
545 else
546 ::snprintf(arch_name, arch_name_len, "%s",
547 default_arch.GetArchitectureName());
548 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000549 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000550 }
551 if (arch_name && arch_name_len)
552 arch_name[0] = '\0';
553 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000554}
555
Kate Stoneb9c1b512016-09-06 20:57:50 +0000556bool SBDebugger::SetDefaultArchitecture(const char *arch_name) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000557 LLDB_RECORD_STATIC_METHOD(bool, SBDebugger, SetDefaultArchitecture,
558 (const char *), arch_name);
559
Kate Stoneb9c1b512016-09-06 20:57:50 +0000560 if (arch_name) {
561 ArchSpec arch(arch_name);
562 if (arch.IsValid()) {
563 Target::SetDefaultArchitecture(arch);
564 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000565 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000566 }
567 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000568}
569
570ScriptLanguage
Kate Stoneb9c1b512016-09-06 20:57:50 +0000571SBDebugger::GetScriptingLanguage(const char *script_language_name) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000572 LLDB_RECORD_METHOD(lldb::ScriptLanguage, SBDebugger, GetScriptingLanguage,
573 (const char *), script_language_name);
574
Zachary Turner7b2e5a32016-09-16 19:09:12 +0000575 if (!script_language_name) return eScriptLanguageDefault;
Pavel Labath47cbf4a2018-04-10 09:03:59 +0000576 return OptionArgParser::ToScriptLanguage(
577 llvm::StringRef(script_language_name), eScriptLanguageDefault, nullptr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000578}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000579
Kate Stoneb9c1b512016-09-06 20:57:50 +0000580const char *SBDebugger::GetVersionString() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000581 LLDB_RECORD_STATIC_METHOD_NO_ARGS(const char *, SBDebugger, GetVersionString);
582
Kate Stoneb9c1b512016-09-06 20:57:50 +0000583 return lldb_private::GetVersion();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000584}
585
Kate Stoneb9c1b512016-09-06 20:57:50 +0000586const char *SBDebugger::StateAsCString(StateType state) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000587 LLDB_RECORD_STATIC_METHOD(const char *, SBDebugger, StateAsCString,
588 (lldb::StateType), state);
589
Kate Stoneb9c1b512016-09-06 20:57:50 +0000590 return lldb_private::StateAsCString(state);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000591}
592
Pavel Labathf1389e92018-02-19 15:06:28 +0000593static void AddBoolConfigEntry(StructuredData::Dictionary &dict,
594 llvm::StringRef name, bool value,
595 llvm::StringRef description) {
596 auto entry_up = llvm::make_unique<StructuredData::Dictionary>();
597 entry_up->AddBooleanItem("value", value);
598 entry_up->AddStringItem("description", description);
599 dict.AddItem(name, std::move(entry_up));
600}
601
Pavel Labathabc0c6a2018-06-28 14:23:04 +0000602static void AddLLVMTargets(StructuredData::Dictionary &dict) {
603 auto array_up = llvm::make_unique<StructuredData::Array>();
604#define LLVM_TARGET(target) \
605 array_up->AddItem(llvm::make_unique<StructuredData::String>(#target));
606#include "llvm/Config/Targets.def"
607 auto entry_up = llvm::make_unique<StructuredData::Dictionary>();
608 entry_up->AddItem("value", std::move(array_up));
609 entry_up->AddStringItem("description", "A list of configured LLVM targets.");
610 dict.AddItem("targets", std::move(entry_up));
611}
612
Pavel Labathf1389e92018-02-19 15:06:28 +0000613SBStructuredData SBDebugger::GetBuildConfiguration() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000614 LLDB_RECORD_STATIC_METHOD_NO_ARGS(lldb::SBStructuredData, SBDebugger,
615 GetBuildConfiguration);
616
Pavel Labathf1389e92018-02-19 15:06:28 +0000617 auto config_up = llvm::make_unique<StructuredData::Dictionary>();
618 AddBoolConfigEntry(
619 *config_up, "xml", XMLDocument::XMLEnabled(),
620 "A boolean value that indicates if XML support is enabled in LLDB");
Pavel Labathabc0c6a2018-06-28 14:23:04 +0000621 AddLLVMTargets(*config_up);
Pavel Labathf1389e92018-02-19 15:06:28 +0000622
623 SBStructuredData data;
624 data.m_impl_up->SetObjectSP(std::move(config_up));
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000625 return LLDB_RECORD_RESULT(data);
Pavel Labathf1389e92018-02-19 15:06:28 +0000626}
627
Kate Stoneb9c1b512016-09-06 20:57:50 +0000628bool SBDebugger::StateIsRunningState(StateType state) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000629 LLDB_RECORD_STATIC_METHOD(bool, SBDebugger, StateIsRunningState,
630 (lldb::StateType), state);
631
Greg Clayton48381312010-10-30 04:51:46 +0000632
Kate Stoneb9c1b512016-09-06 20:57:50 +0000633 const bool result = lldb_private::StateIsRunningState(state);
Greg Clayton48381312010-10-30 04:51:46 +0000634
Kate Stoneb9c1b512016-09-06 20:57:50 +0000635 return result;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000636}
637
Kate Stoneb9c1b512016-09-06 20:57:50 +0000638bool SBDebugger::StateIsStoppedState(StateType state) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000639 LLDB_RECORD_STATIC_METHOD(bool, SBDebugger, StateIsStoppedState,
640 (lldb::StateType), state);
641
Caroline Ticeceb6b132010-10-26 03:11:13 +0000642
Kate Stoneb9c1b512016-09-06 20:57:50 +0000643 const bool result = lldb_private::StateIsStoppedState(state, false);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000644
Kate Stoneb9c1b512016-09-06 20:57:50 +0000645 return result;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000646}
647
Kate Stoneb9c1b512016-09-06 20:57:50 +0000648lldb::SBTarget SBDebugger::CreateTarget(const char *filename,
649 const char *target_triple,
650 const char *platform_name,
651 bool add_dependent_modules,
652 lldb::SBError &sb_error) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000653 LLDB_RECORD_METHOD(
654 lldb::SBTarget, SBDebugger, CreateTarget,
655 (const char *, const char *, const char *, bool, lldb::SBError &),
656 filename, target_triple, platform_name, add_dependent_modules, sb_error);
657
Kate Stoneb9c1b512016-09-06 20:57:50 +0000658 SBTarget sb_target;
659 TargetSP target_sp;
660 if (m_opaque_sp) {
661 sb_error.Clear();
662 OptionGroupPlatform platform_options(false);
663 platform_options.SetPlatformName(platform_name);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000664
Kate Stoneb9c1b512016-09-06 20:57:50 +0000665 sb_error.ref() = m_opaque_sp->GetTargetList().CreateTarget(
Jonas Devliegheref9a07e92018-09-20 09:09:05 +0000666 *m_opaque_sp, filename, target_triple,
667 add_dependent_modules ? eLoadDependentsYes : eLoadDependentsNo,
Kate Stoneb9c1b512016-09-06 20:57:50 +0000668 &platform_options, target_sp);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000669
Kate Stoneb9c1b512016-09-06 20:57:50 +0000670 if (sb_error.Success())
671 sb_target.SetSP(target_sp);
672 } else {
673 sb_error.SetErrorString("invalid debugger");
674 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000675
Kate Stoneb9c1b512016-09-06 20:57:50 +0000676 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
677 if (log)
678 log->Printf("SBDebugger(%p)::CreateTarget (filename=\"%s\", triple=%s, "
679 "platform_name=%s, add_dependent_modules=%u, error=%s) => "
680 "SBTarget(%p)",
681 static_cast<void *>(m_opaque_sp.get()), filename, target_triple,
682 platform_name, add_dependent_modules, sb_error.GetCString(),
683 static_cast<void *>(target_sp.get()));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000684
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000685 return LLDB_RECORD_RESULT(sb_target);
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000686}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000687
688SBTarget
Kate Stoneb9c1b512016-09-06 20:57:50 +0000689SBDebugger::CreateTargetWithFileAndTargetTriple(const char *filename,
690 const char *target_triple) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000691 LLDB_RECORD_METHOD(lldb::SBTarget, SBDebugger,
692 CreateTargetWithFileAndTargetTriple,
693 (const char *, const char *), filename, target_triple);
694
Kate Stoneb9c1b512016-09-06 20:57:50 +0000695 SBTarget sb_target;
696 TargetSP target_sp;
697 if (m_opaque_sp) {
698 const bool add_dependent_modules = true;
Zachary Turner97206d52017-05-12 04:51:55 +0000699 Status error(m_opaque_sp->GetTargetList().CreateTarget(
Jonas Devliegheref9a07e92018-09-20 09:09:05 +0000700 *m_opaque_sp, filename, target_triple,
701 add_dependent_modules ? eLoadDependentsYes : eLoadDependentsNo, nullptr,
Kate Stoneb9c1b512016-09-06 20:57:50 +0000702 target_sp));
703 sb_target.SetSP(target_sp);
704 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000705
Kate Stoneb9c1b512016-09-06 20:57:50 +0000706 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
707 if (log)
708 log->Printf("SBDebugger(%p)::CreateTargetWithFileAndTargetTriple "
709 "(filename=\"%s\", triple=%s) => SBTarget(%p)",
710 static_cast<void *>(m_opaque_sp.get()), filename, target_triple,
711 static_cast<void *>(target_sp.get()));
Greg Clayton48381312010-10-30 04:51:46 +0000712
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000713 return LLDB_RECORD_RESULT(sb_target);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000714}
715
Kate Stoneb9c1b512016-09-06 20:57:50 +0000716SBTarget SBDebugger::CreateTargetWithFileAndArch(const char *filename,
717 const char *arch_cstr) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000718 LLDB_RECORD_METHOD(lldb::SBTarget, SBDebugger, CreateTargetWithFileAndArch,
719 (const char *, const char *), filename, arch_cstr);
720
Kate Stoneb9c1b512016-09-06 20:57:50 +0000721 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000722
Kate Stoneb9c1b512016-09-06 20:57:50 +0000723 SBTarget sb_target;
724 TargetSP target_sp;
725 if (m_opaque_sp) {
Zachary Turner97206d52017-05-12 04:51:55 +0000726 Status error;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000727 const bool add_dependent_modules = true;
728
729 error = m_opaque_sp->GetTargetList().CreateTarget(
Jonas Devliegheref9a07e92018-09-20 09:09:05 +0000730 *m_opaque_sp, filename, arch_cstr,
731 add_dependent_modules ? eLoadDependentsYes : eLoadDependentsNo, nullptr,
Kate Stoneb9c1b512016-09-06 20:57:50 +0000732 target_sp);
733
734 if (error.Success()) {
735 m_opaque_sp->GetTargetList().SetSelectedTarget(target_sp.get());
736 sb_target.SetSP(target_sp);
Greg Clayton6920b522012-08-22 18:39:03 +0000737 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000738 }
739
740 if (log)
741 log->Printf("SBDebugger(%p)::CreateTargetWithFileAndArch (filename=\"%s\", "
742 "arch=%s) => SBTarget(%p)",
743 static_cast<void *>(m_opaque_sp.get()), filename, arch_cstr,
744 static_cast<void *>(target_sp.get()));
745
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000746 return LLDB_RECORD_RESULT(sb_target);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000747}
748
749SBTarget SBDebugger::CreateTarget(const char *filename) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000750 LLDB_RECORD_METHOD(lldb::SBTarget, SBDebugger, CreateTarget, (const char *),
751 filename);
752
Kate Stoneb9c1b512016-09-06 20:57:50 +0000753 SBTarget sb_target;
754 TargetSP target_sp;
755 if (m_opaque_sp) {
Zachary Turner97206d52017-05-12 04:51:55 +0000756 Status error;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000757 const bool add_dependent_modules = true;
758 error = m_opaque_sp->GetTargetList().CreateTarget(
Jonas Devliegheref9a07e92018-09-20 09:09:05 +0000759 *m_opaque_sp, filename, "",
760 add_dependent_modules ? eLoadDependentsYes : eLoadDependentsNo, nullptr,
761 target_sp);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000762
763 if (error.Success()) {
764 m_opaque_sp->GetTargetList().SetSelectedTarget(target_sp.get());
765 sb_target.SetSP(target_sp);
Greg Clayton6920b522012-08-22 18:39:03 +0000766 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000767 }
768 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
769 if (log)
770 log->Printf(
771 "SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)",
772 static_cast<void *>(m_opaque_sp.get()), filename,
773 static_cast<void *>(target_sp.get()));
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000774 return LLDB_RECORD_RESULT(sb_target);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000775}
776
Jim Inghamb842f2e2017-09-14 20:22:49 +0000777SBTarget SBDebugger::GetDummyTarget() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000778 LLDB_RECORD_METHOD_NO_ARGS(lldb::SBTarget, SBDebugger, GetDummyTarget);
779
Jim Inghamb842f2e2017-09-14 20:22:49 +0000780 SBTarget sb_target;
781 if (m_opaque_sp) {
782 sb_target.SetSP(m_opaque_sp->GetDummyTarget()->shared_from_this());
783 }
784 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
785 if (log)
786 log->Printf(
787 "SBDebugger(%p)::GetDummyTarget() => SBTarget(%p)",
788 static_cast<void *>(m_opaque_sp.get()),
789 static_cast<void *>(sb_target.GetSP().get()));
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000790 return LLDB_RECORD_RESULT(sb_target);
Jim Inghamb842f2e2017-09-14 20:22:49 +0000791}
792
Kate Stoneb9c1b512016-09-06 20:57:50 +0000793bool SBDebugger::DeleteTarget(lldb::SBTarget &target) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000794 LLDB_RECORD_METHOD(bool, SBDebugger, DeleteTarget, (lldb::SBTarget &),
795 target);
796
Kate Stoneb9c1b512016-09-06 20:57:50 +0000797 bool result = false;
798 if (m_opaque_sp) {
799 TargetSP target_sp(target.GetSP());
800 if (target_sp) {
801 // No need to lock, the target list is thread safe
802 result = m_opaque_sp->GetTargetList().DeleteTarget(target_sp);
803 target_sp->Destroy();
804 target.Clear();
805 const bool mandatory = true;
806 ModuleList::RemoveOrphanSharedModules(mandatory);
807 }
808 }
809
810 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
811 if (log)
812 log->Printf("SBDebugger(%p)::DeleteTarget (SBTarget(%p)) => %i",
813 static_cast<void *>(m_opaque_sp.get()),
814 static_cast<void *>(target.m_opaque_sp.get()), result);
815
816 return result;
817}
818
819SBTarget SBDebugger::GetTargetAtIndex(uint32_t idx) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000820 LLDB_RECORD_METHOD(lldb::SBTarget, SBDebugger, GetTargetAtIndex, (uint32_t),
821 idx);
822
Kate Stoneb9c1b512016-09-06 20:57:50 +0000823 SBTarget sb_target;
824 if (m_opaque_sp) {
825 // No need to lock, the target list is thread safe
826 sb_target.SetSP(m_opaque_sp->GetTargetList().GetTargetAtIndex(idx));
827 }
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000828 return LLDB_RECORD_RESULT(sb_target);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000829}
830
831uint32_t SBDebugger::GetIndexOfTarget(lldb::SBTarget target) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000832 LLDB_RECORD_METHOD(uint32_t, SBDebugger, GetIndexOfTarget, (lldb::SBTarget),
833 target);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000834
835 lldb::TargetSP target_sp = target.GetSP();
836 if (!target_sp)
837 return UINT32_MAX;
838
839 if (!m_opaque_sp)
840 return UINT32_MAX;
841
842 return m_opaque_sp->GetTargetList().GetIndexOfTarget(target.GetSP());
843}
844
845SBTarget SBDebugger::FindTargetWithProcessID(lldb::pid_t pid) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000846 LLDB_RECORD_METHOD(lldb::SBTarget, SBDebugger, FindTargetWithProcessID,
847 (lldb::pid_t), pid);
848
Kate Stoneb9c1b512016-09-06 20:57:50 +0000849 SBTarget sb_target;
850 if (m_opaque_sp) {
851 // No need to lock, the target list is thread safe
852 sb_target.SetSP(m_opaque_sp->GetTargetList().FindTargetWithProcessID(pid));
853 }
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000854 return LLDB_RECORD_RESULT(sb_target);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000855}
856
857SBTarget SBDebugger::FindTargetWithFileAndArch(const char *filename,
858 const char *arch_name) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000859 LLDB_RECORD_METHOD(lldb::SBTarget, SBDebugger, FindTargetWithFileAndArch,
860 (const char *, const char *), filename, arch_name);
861
Kate Stoneb9c1b512016-09-06 20:57:50 +0000862 SBTarget sb_target;
863 if (m_opaque_sp && filename && filename[0]) {
864 // No need to lock, the target list is thread safe
Pavel Labath7263f1b2017-10-31 10:56:03 +0000865 ArchSpec arch = Platform::GetAugmentedArchSpec(
866 m_opaque_sp->GetPlatformList().GetSelectedPlatform().get(), arch_name);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000867 TargetSP target_sp(
868 m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture(
Jonas Devlieghere8f3be7a2018-11-01 21:05:36 +0000869 FileSpec(filename), arch_name ? &arch : nullptr));
Kate Stoneb9c1b512016-09-06 20:57:50 +0000870 sb_target.SetSP(target_sp);
871 }
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000872 return LLDB_RECORD_RESULT(sb_target);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000873}
874
875SBTarget SBDebugger::FindTargetWithLLDBProcess(const ProcessSP &process_sp) {
876 SBTarget sb_target;
877 if (m_opaque_sp) {
878 // No need to lock, the target list is thread safe
879 sb_target.SetSP(
880 m_opaque_sp->GetTargetList().FindTargetWithProcess(process_sp.get()));
881 }
882 return sb_target;
883}
884
885uint32_t SBDebugger::GetNumTargets() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000886 LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBDebugger, GetNumTargets);
887
Kate Stoneb9c1b512016-09-06 20:57:50 +0000888 if (m_opaque_sp) {
889 // No need to lock, the target list is thread safe
890 return m_opaque_sp->GetTargetList().GetNumTargets();
891 }
892 return 0;
893}
894
895SBTarget SBDebugger::GetSelectedTarget() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000896 LLDB_RECORD_METHOD_NO_ARGS(lldb::SBTarget, SBDebugger, GetSelectedTarget);
897
Kate Stoneb9c1b512016-09-06 20:57:50 +0000898 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
899
900 SBTarget sb_target;
901 TargetSP target_sp;
902 if (m_opaque_sp) {
903 // No need to lock, the target list is thread safe
904 target_sp = m_opaque_sp->GetTargetList().GetSelectedTarget();
905 sb_target.SetSP(target_sp);
906 }
907
908 if (log) {
909 SBStream sstr;
910 sb_target.GetDescription(sstr, eDescriptionLevelBrief);
911 log->Printf("SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s",
912 static_cast<void *>(m_opaque_sp.get()),
913 static_cast<void *>(target_sp.get()), sstr.GetData());
914 }
915
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000916 return LLDB_RECORD_RESULT(sb_target);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000917}
918
919void SBDebugger::SetSelectedTarget(SBTarget &sb_target) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000920 LLDB_RECORD_METHOD(void, SBDebugger, SetSelectedTarget, (lldb::SBTarget &),
921 sb_target);
922
Kate Stoneb9c1b512016-09-06 20:57:50 +0000923 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
924
925 TargetSP target_sp(sb_target.GetSP());
926 if (m_opaque_sp) {
927 m_opaque_sp->GetTargetList().SetSelectedTarget(target_sp.get());
928 }
929 if (log) {
930 SBStream sstr;
931 sb_target.GetDescription(sstr, eDescriptionLevelBrief);
932 log->Printf("SBDebugger(%p)::SetSelectedTarget () => SBTarget(%p): %s",
933 static_cast<void *>(m_opaque_sp.get()),
934 static_cast<void *>(target_sp.get()), sstr.GetData());
935 }
936}
937
938SBPlatform SBDebugger::GetSelectedPlatform() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000939 LLDB_RECORD_METHOD_NO_ARGS(lldb::SBPlatform, SBDebugger, GetSelectedPlatform);
940
Kate Stoneb9c1b512016-09-06 20:57:50 +0000941 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
942
943 SBPlatform sb_platform;
944 DebuggerSP debugger_sp(m_opaque_sp);
945 if (debugger_sp) {
946 sb_platform.SetSP(debugger_sp->GetPlatformList().GetSelectedPlatform());
947 }
948 if (log)
949 log->Printf("SBDebugger(%p)::GetSelectedPlatform () => SBPlatform(%p): %s",
950 static_cast<void *>(m_opaque_sp.get()),
951 static_cast<void *>(sb_platform.GetSP().get()),
952 sb_platform.GetName());
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000953 return LLDB_RECORD_RESULT(sb_platform);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000954}
955
956void SBDebugger::SetSelectedPlatform(SBPlatform &sb_platform) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000957 LLDB_RECORD_METHOD(void, SBDebugger, SetSelectedPlatform,
958 (lldb::SBPlatform &), sb_platform);
959
Kate Stoneb9c1b512016-09-06 20:57:50 +0000960 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
961
962 DebuggerSP debugger_sp(m_opaque_sp);
963 if (debugger_sp) {
964 debugger_sp->GetPlatformList().SetSelectedPlatform(sb_platform.GetSP());
965 }
966
967 if (log)
968 log->Printf("SBDebugger(%p)::SetSelectedPlatform (SBPlatform(%p) %s)",
969 static_cast<void *>(m_opaque_sp.get()),
970 static_cast<void *>(sb_platform.GetSP().get()),
971 sb_platform.GetName());
972}
973
Vadim Macagonc10e34d2017-08-09 09:20:40 +0000974uint32_t SBDebugger::GetNumPlatforms() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000975 LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBDebugger, GetNumPlatforms);
976
Vadim Macagonc10e34d2017-08-09 09:20:40 +0000977 if (m_opaque_sp) {
978 // No need to lock, the platform list is thread safe
979 return m_opaque_sp->GetPlatformList().GetSize();
980 }
981 return 0;
982}
983
984SBPlatform SBDebugger::GetPlatformAtIndex(uint32_t idx) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000985 LLDB_RECORD_METHOD(lldb::SBPlatform, SBDebugger, GetPlatformAtIndex,
986 (uint32_t), idx);
987
Vadim Macagonc10e34d2017-08-09 09:20:40 +0000988 SBPlatform sb_platform;
989 if (m_opaque_sp) {
990 // No need to lock, the platform list is thread safe
991 sb_platform.SetSP(m_opaque_sp->GetPlatformList().GetAtIndex(idx));
992 }
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000993 return LLDB_RECORD_RESULT(sb_platform);
Vadim Macagonc10e34d2017-08-09 09:20:40 +0000994}
995
996uint32_t SBDebugger::GetNumAvailablePlatforms() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000997 LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBDebugger, GetNumAvailablePlatforms);
998
Vadim Macagonc10e34d2017-08-09 09:20:40 +0000999 uint32_t idx = 0;
1000 while (true) {
1001 if (!PluginManager::GetPlatformPluginNameAtIndex(idx)) {
1002 break;
1003 }
1004 ++idx;
1005 }
1006 // +1 for the host platform, which should always appear first in the list.
1007 return idx + 1;
1008}
1009
1010SBStructuredData SBDebugger::GetAvailablePlatformInfoAtIndex(uint32_t idx) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001011 LLDB_RECORD_METHOD(lldb::SBStructuredData, SBDebugger,
1012 GetAvailablePlatformInfoAtIndex, (uint32_t), idx);
1013
Vadim Macagonc10e34d2017-08-09 09:20:40 +00001014 SBStructuredData data;
1015 auto platform_dict = llvm::make_unique<StructuredData::Dictionary>();
1016 llvm::StringRef name_str("name"), desc_str("description");
1017
1018 if (idx == 0) {
1019 PlatformSP host_platform_sp(Platform::GetHostPlatform());
1020 platform_dict->AddStringItem(
1021 name_str, host_platform_sp->GetPluginName().GetStringRef());
1022 platform_dict->AddStringItem(
1023 desc_str, llvm::StringRef(host_platform_sp->GetDescription()));
1024 } else if (idx > 0) {
1025 const char *plugin_name =
1026 PluginManager::GetPlatformPluginNameAtIndex(idx - 1);
1027 if (!plugin_name) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001028 return LLDB_RECORD_RESULT(data);
Vadim Macagonc10e34d2017-08-09 09:20:40 +00001029 }
1030 platform_dict->AddStringItem(name_str, llvm::StringRef(plugin_name));
1031
1032 const char *plugin_desc =
1033 PluginManager::GetPlatformPluginDescriptionAtIndex(idx - 1);
1034 if (!plugin_desc) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001035 return LLDB_RECORD_RESULT(data);
Vadim Macagonc10e34d2017-08-09 09:20:40 +00001036 }
1037 platform_dict->AddStringItem(desc_str, llvm::StringRef(plugin_desc));
1038 }
1039
1040 data.m_impl_up->SetObjectSP(
1041 StructuredData::ObjectSP(platform_dict.release()));
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001042 return LLDB_RECORD_RESULT(data);
Vadim Macagonc10e34d2017-08-09 09:20:40 +00001043}
1044
Kate Stoneb9c1b512016-09-06 20:57:50 +00001045void SBDebugger::DispatchInput(void *baton, const void *data, size_t data_len) {
Jonas Devlieghere0d7b0c92019-03-08 19:09:27 +00001046 LLDB_RECORD_DUMMY(void, SBDebugger, DispatchInput,
1047 (void *, const void *, size_t), baton, data, data_len);
1048
Kate Stoneb9c1b512016-09-06 20:57:50 +00001049 DispatchInput(data, data_len);
1050}
1051
1052void SBDebugger::DispatchInput(const void *data, size_t data_len) {
Jonas Devlieghere0d7b0c92019-03-08 19:09:27 +00001053 LLDB_RECORD_DUMMY(void, SBDebugger, DispatchInput, (const void *, size_t),
1054 data, data_len);
1055
Kate Stoneb9c1b512016-09-06 20:57:50 +00001056 // Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1057 //
1058 // if (log)
1059 // log->Printf ("SBDebugger(%p)::DispatchInput (data=\"%.*s\",
1060 // size_t=%" PRIu64 ")",
1061 // m_opaque_sp.get(),
1062 // (int) data_len,
1063 // (const char *) data,
1064 // (uint64_t)data_len);
1065 //
1066 // if (m_opaque_sp)
1067 // m_opaque_sp->DispatchInput ((const char *) data, data_len);
1068}
1069
1070void SBDebugger::DispatchInputInterrupt() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001071 LLDB_RECORD_METHOD_NO_ARGS(void, SBDebugger, DispatchInputInterrupt);
1072
Kate Stoneb9c1b512016-09-06 20:57:50 +00001073 if (m_opaque_sp)
1074 m_opaque_sp->DispatchInputInterrupt();
1075}
1076
1077void SBDebugger::DispatchInputEndOfFile() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001078 LLDB_RECORD_METHOD_NO_ARGS(void, SBDebugger, DispatchInputEndOfFile);
1079
Kate Stoneb9c1b512016-09-06 20:57:50 +00001080 if (m_opaque_sp)
1081 m_opaque_sp->DispatchInputEndOfFile();
1082}
1083
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001084void SBDebugger::PushInputReader(SBInputReader &reader) {
1085 LLDB_RECORD_METHOD(void, SBDebugger, PushInputReader, (lldb::SBInputReader &),
1086 reader);
1087}
Kate Stoneb9c1b512016-09-06 20:57:50 +00001088
1089void SBDebugger::RunCommandInterpreter(bool auto_handle_events,
1090 bool spawn_thread) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001091 LLDB_RECORD_METHOD(void, SBDebugger, RunCommandInterpreter, (bool, bool),
1092 auto_handle_events, spawn_thread);
1093
Kate Stoneb9c1b512016-09-06 20:57:50 +00001094 if (m_opaque_sp) {
1095 CommandInterpreterRunOptions options;
1096
1097 m_opaque_sp->GetCommandInterpreter().RunCommandInterpreter(
1098 auto_handle_events, spawn_thread, options);
1099 }
1100}
1101
1102void SBDebugger::RunCommandInterpreter(bool auto_handle_events,
1103 bool spawn_thread,
1104 SBCommandInterpreterRunOptions &options,
1105 int &num_errors, bool &quit_requested,
1106 bool &stopped_for_crash)
1107
1108{
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001109 LLDB_RECORD_METHOD(void, SBDebugger, RunCommandInterpreter,
1110 (bool, bool, lldb::SBCommandInterpreterRunOptions &, int &,
1111 bool &, bool &),
1112 auto_handle_events, spawn_thread, options, num_errors,
1113 quit_requested, stopped_for_crash);
1114
Kate Stoneb9c1b512016-09-06 20:57:50 +00001115 if (m_opaque_sp) {
1116 CommandInterpreter &interp = m_opaque_sp->GetCommandInterpreter();
1117 interp.RunCommandInterpreter(auto_handle_events, spawn_thread,
1118 options.ref());
1119 num_errors = interp.GetNumErrors();
1120 quit_requested = interp.GetQuitRequested();
1121 stopped_for_crash = interp.GetStoppedForCrash();
1122 }
1123}
1124
1125SBError SBDebugger::RunREPL(lldb::LanguageType language,
1126 const char *repl_options) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001127 LLDB_RECORD_METHOD(lldb::SBError, SBDebugger, RunREPL,
1128 (lldb::LanguageType, const char *), language,
1129 repl_options);
1130
Kate Stoneb9c1b512016-09-06 20:57:50 +00001131 SBError error;
1132 if (m_opaque_sp)
1133 error.ref() = m_opaque_sp->RunREPL(language, repl_options);
1134 else
1135 error.SetErrorString("invalid debugger");
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001136 return LLDB_RECORD_RESULT(error);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001137}
1138
1139void SBDebugger::reset(const DebuggerSP &debugger_sp) {
1140 m_opaque_sp = debugger_sp;
1141}
1142
1143Debugger *SBDebugger::get() const { return m_opaque_sp.get(); }
1144
1145Debugger &SBDebugger::ref() const {
1146 assert(m_opaque_sp.get());
1147 return *m_opaque_sp;
1148}
1149
1150const lldb::DebuggerSP &SBDebugger::get_sp() const { return m_opaque_sp; }
1151
1152SBDebugger SBDebugger::FindDebuggerWithID(int id) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001153 LLDB_RECORD_STATIC_METHOD(lldb::SBDebugger, SBDebugger, FindDebuggerWithID,
1154 (int), id);
1155
Kate Stoneb9c1b512016-09-06 20:57:50 +00001156 // No need to lock, the debugger list is thread safe
1157 SBDebugger sb_debugger;
1158 DebuggerSP debugger_sp = Debugger::FindDebuggerWithID(id);
1159 if (debugger_sp)
1160 sb_debugger.reset(debugger_sp);
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001161 return LLDB_RECORD_RESULT(sb_debugger);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001162}
1163
1164const char *SBDebugger::GetInstanceName() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001165 LLDB_RECORD_METHOD_NO_ARGS(const char *, SBDebugger, GetInstanceName);
1166
Kate Stoneb9c1b512016-09-06 20:57:50 +00001167 return (m_opaque_sp ? m_opaque_sp->GetInstanceName().AsCString() : nullptr);
1168}
1169
1170SBError SBDebugger::SetInternalVariable(const char *var_name, const char *value,
1171 const char *debugger_instance_name) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001172 LLDB_RECORD_STATIC_METHOD(lldb::SBError, SBDebugger, SetInternalVariable,
1173 (const char *, const char *, const char *),
1174 var_name, value, debugger_instance_name);
1175
Kate Stoneb9c1b512016-09-06 20:57:50 +00001176 SBError sb_error;
1177 DebuggerSP debugger_sp(Debugger::FindDebuggerWithInstanceName(
1178 ConstString(debugger_instance_name)));
Zachary Turner97206d52017-05-12 04:51:55 +00001179 Status error;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001180 if (debugger_sp) {
1181 ExecutionContext exe_ctx(
1182 debugger_sp->GetCommandInterpreter().GetExecutionContext());
1183 error = debugger_sp->SetPropertyValue(&exe_ctx, eVarSetOperationAssign,
1184 var_name, value);
1185 } else {
1186 error.SetErrorStringWithFormat("invalid debugger instance name '%s'",
1187 debugger_instance_name);
1188 }
1189 if (error.Fail())
1190 sb_error.SetError(error);
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001191 return LLDB_RECORD_RESULT(sb_error);
Caroline Tice3df9a8d2010-09-04 00:03:46 +00001192}
1193
Greg Clayton431ce672011-04-18 23:15:17 +00001194SBStringList
Kate Stoneb9c1b512016-09-06 20:57:50 +00001195SBDebugger::GetInternalVariableValue(const char *var_name,
1196 const char *debugger_instance_name) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001197 LLDB_RECORD_STATIC_METHOD(
1198 lldb::SBStringList, SBDebugger, GetInternalVariableValue,
1199 (const char *, const char *), var_name, debugger_instance_name);
1200
Kate Stoneb9c1b512016-09-06 20:57:50 +00001201 SBStringList ret_value;
1202 DebuggerSP debugger_sp(Debugger::FindDebuggerWithInstanceName(
1203 ConstString(debugger_instance_name)));
Zachary Turner97206d52017-05-12 04:51:55 +00001204 Status error;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001205 if (debugger_sp) {
1206 ExecutionContext exe_ctx(
1207 debugger_sp->GetCommandInterpreter().GetExecutionContext());
1208 lldb::OptionValueSP value_sp(
1209 debugger_sp->GetPropertyValue(&exe_ctx, var_name, false, error));
1210 if (value_sp) {
1211 StreamString value_strm;
1212 value_sp->DumpValue(&exe_ctx, value_strm, OptionValue::eDumpOptionValue);
1213 const std::string &value_str = value_strm.GetString();
1214 if (!value_str.empty()) {
1215 StringList string_list;
1216 string_list.SplitIntoLines(value_str);
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001217 return LLDB_RECORD_RESULT(SBStringList(&string_list));
Kate Stoneb9c1b512016-09-06 20:57:50 +00001218 }
1219 }
1220 }
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001221 return LLDB_RECORD_RESULT(SBStringList());
Kate Stoneb9c1b512016-09-06 20:57:50 +00001222}
1223
1224uint32_t SBDebugger::GetTerminalWidth() const {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001225 LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBDebugger, GetTerminalWidth);
1226
Kate Stoneb9c1b512016-09-06 20:57:50 +00001227 return (m_opaque_sp ? m_opaque_sp->GetTerminalWidth() : 0);
1228}
1229
1230void SBDebugger::SetTerminalWidth(uint32_t term_width) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001231 LLDB_RECORD_METHOD(void, SBDebugger, SetTerminalWidth, (uint32_t),
1232 term_width);
1233
Kate Stoneb9c1b512016-09-06 20:57:50 +00001234 if (m_opaque_sp)
1235 m_opaque_sp->SetTerminalWidth(term_width);
1236}
1237
1238const char *SBDebugger::GetPrompt() const {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001239 LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBDebugger, GetPrompt);
1240
Kate Stoneb9c1b512016-09-06 20:57:50 +00001241 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1242
1243 if (log)
1244 log->Printf("SBDebugger(%p)::GetPrompt () => \"%s\"",
1245 static_cast<void *>(m_opaque_sp.get()),
Zachary Turner514d8cd2016-09-23 18:06:53 +00001246 (m_opaque_sp ? m_opaque_sp->GetPrompt().str().c_str() : ""));
Kate Stoneb9c1b512016-09-06 20:57:50 +00001247
Zachary Turner514d8cd2016-09-23 18:06:53 +00001248 return (m_opaque_sp ? ConstString(m_opaque_sp->GetPrompt()).GetCString()
1249 : nullptr);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001250}
1251
1252void SBDebugger::SetPrompt(const char *prompt) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001253 LLDB_RECORD_METHOD(void, SBDebugger, SetPrompt, (const char *), prompt);
1254
Kate Stoneb9c1b512016-09-06 20:57:50 +00001255 if (m_opaque_sp)
Zachary Turner514d8cd2016-09-23 18:06:53 +00001256 m_opaque_sp->SetPrompt(llvm::StringRef::withNullAsEmpty(prompt));
Kate Stoneb9c1b512016-09-06 20:57:50 +00001257}
1258
Jonas Devlieghere9e046f02018-11-13 19:18:16 +00001259const char *SBDebugger::GetReproducerPath() const {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001260 LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBDebugger, GetReproducerPath);
1261
Jonas Devlieghere9e046f02018-11-13 19:18:16 +00001262 return (m_opaque_sp
1263 ? ConstString(m_opaque_sp->GetReproducerPath()).GetCString()
1264 : nullptr);
1265}
1266
Kate Stoneb9c1b512016-09-06 20:57:50 +00001267ScriptLanguage SBDebugger::GetScriptLanguage() const {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001268 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::ScriptLanguage, SBDebugger,
1269 GetScriptLanguage);
1270
Kate Stoneb9c1b512016-09-06 20:57:50 +00001271 return (m_opaque_sp ? m_opaque_sp->GetScriptLanguage() : eScriptLanguageNone);
1272}
1273
1274void SBDebugger::SetScriptLanguage(ScriptLanguage script_lang) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001275 LLDB_RECORD_METHOD(void, SBDebugger, SetScriptLanguage,
1276 (lldb::ScriptLanguage), script_lang);
1277
Kate Stoneb9c1b512016-09-06 20:57:50 +00001278 if (m_opaque_sp) {
1279 m_opaque_sp->SetScriptLanguage(script_lang);
1280 }
1281}
1282
1283bool SBDebugger::SetUseExternalEditor(bool value) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001284 LLDB_RECORD_METHOD(bool, SBDebugger, SetUseExternalEditor, (bool), value);
1285
Kate Stoneb9c1b512016-09-06 20:57:50 +00001286 return (m_opaque_sp ? m_opaque_sp->SetUseExternalEditor(value) : false);
1287}
1288
1289bool SBDebugger::GetUseExternalEditor() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001290 LLDB_RECORD_METHOD_NO_ARGS(bool, SBDebugger, GetUseExternalEditor);
1291
Kate Stoneb9c1b512016-09-06 20:57:50 +00001292 return (m_opaque_sp ? m_opaque_sp->GetUseExternalEditor() : false);
1293}
1294
1295bool SBDebugger::SetUseColor(bool value) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001296 LLDB_RECORD_METHOD(bool, SBDebugger, SetUseColor, (bool), value);
1297
Kate Stoneb9c1b512016-09-06 20:57:50 +00001298 return (m_opaque_sp ? m_opaque_sp->SetUseColor(value) : false);
1299}
1300
1301bool SBDebugger::GetUseColor() const {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001302 LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBDebugger, GetUseColor);
1303
Kate Stoneb9c1b512016-09-06 20:57:50 +00001304 return (m_opaque_sp ? m_opaque_sp->GetUseColor() : false);
1305}
1306
1307bool SBDebugger::GetDescription(SBStream &description) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001308 LLDB_RECORD_METHOD(bool, SBDebugger, GetDescription, (lldb::SBStream &),
1309 description);
1310
Kate Stoneb9c1b512016-09-06 20:57:50 +00001311 Stream &strm = description.ref();
1312
1313 if (m_opaque_sp) {
1314 const char *name = m_opaque_sp->GetInstanceName().AsCString();
1315 user_id_t id = m_opaque_sp->GetID();
1316 strm.Printf("Debugger (instance: \"%s\", id: %" PRIu64 ")", name, id);
1317 } else
1318 strm.PutCString("No value");
1319
1320 return true;
1321}
1322
1323user_id_t SBDebugger::GetID() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001324 LLDB_RECORD_METHOD_NO_ARGS(lldb::user_id_t, SBDebugger, GetID);
1325
Kate Stoneb9c1b512016-09-06 20:57:50 +00001326 return (m_opaque_sp ? m_opaque_sp->GetID() : LLDB_INVALID_UID);
1327}
1328
1329SBError SBDebugger::SetCurrentPlatform(const char *platform_name_cstr) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001330 LLDB_RECORD_METHOD(lldb::SBError, SBDebugger, SetCurrentPlatform,
1331 (const char *), platform_name_cstr);
1332
Kate Stoneb9c1b512016-09-06 20:57:50 +00001333 SBError sb_error;
1334 if (m_opaque_sp) {
1335 if (platform_name_cstr && platform_name_cstr[0]) {
1336 ConstString platform_name(platform_name_cstr);
1337 PlatformSP platform_sp(Platform::Find(platform_name));
1338
1339 if (platform_sp) {
1340 // Already have a platform with this name, just select it
1341 m_opaque_sp->GetPlatformList().SetSelectedPlatform(platform_sp);
1342 } else {
1343 // We don't have a platform by this name yet, create one
1344 platform_sp = Platform::Create(platform_name, sb_error.ref());
1345 if (platform_sp) {
1346 // We created the platform, now append and select it
1347 bool make_selected = true;
1348 m_opaque_sp->GetPlatformList().Append(platform_sp, make_selected);
Greg Clayton6920b522012-08-22 18:39:03 +00001349 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001350 }
1351 } else {
1352 sb_error.ref().SetErrorString("invalid platform name");
Greg Clayton6920b522012-08-22 18:39:03 +00001353 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001354 } else {
1355 sb_error.ref().SetErrorString("invalid debugger");
1356 }
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001357 return LLDB_RECORD_RESULT(sb_error);
Caroline Tice3df9a8d2010-09-04 00:03:46 +00001358}
1359
Kate Stoneb9c1b512016-09-06 20:57:50 +00001360bool SBDebugger::SetCurrentPlatformSDKRoot(const char *sysroot) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001361 LLDB_RECORD_METHOD(bool, SBDebugger, SetCurrentPlatformSDKRoot,
1362 (const char *), sysroot);
1363
Kate Stoneb9c1b512016-09-06 20:57:50 +00001364 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1365 if (m_opaque_sp) {
1366 PlatformSP platform_sp(
1367 m_opaque_sp->GetPlatformList().GetSelectedPlatform());
Greg Claytona7015092010-09-18 01:14:36 +00001368
Kate Stoneb9c1b512016-09-06 20:57:50 +00001369 if (platform_sp) {
1370 if (log && sysroot)
1371 log->Printf("SBDebugger::SetCurrentPlatformSDKRoot (\"%s\")", sysroot);
1372 platform_sp->SetSDKRootDirectory(ConstString(sysroot));
1373 return true;
Greg Claytonaf67cec2010-12-20 20:49:23 +00001374 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001375 }
1376 return false;
Greg Claytona7015092010-09-18 01:14:36 +00001377}
1378
Kate Stoneb9c1b512016-09-06 20:57:50 +00001379bool SBDebugger::GetCloseInputOnEOF() const {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001380 LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBDebugger, GetCloseInputOnEOF);
1381
Kate Stoneb9c1b512016-09-06 20:57:50 +00001382 return (m_opaque_sp ? m_opaque_sp->GetCloseInputOnEOF() : false);
Jim Inghame40e4212010-08-30 19:44:40 +00001383}
1384
Kate Stoneb9c1b512016-09-06 20:57:50 +00001385void SBDebugger::SetCloseInputOnEOF(bool b) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001386 LLDB_RECORD_METHOD(void, SBDebugger, SetCloseInputOnEOF, (bool), b);
1387
Kate Stoneb9c1b512016-09-06 20:57:50 +00001388 if (m_opaque_sp)
1389 m_opaque_sp->SetCloseInputOnEOF(b);
Jim Inghame40e4212010-08-30 19:44:40 +00001390}
1391
Kate Stoneb9c1b512016-09-06 20:57:50 +00001392SBTypeCategory SBDebugger::GetCategory(const char *category_name) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001393 LLDB_RECORD_METHOD(lldb::SBTypeCategory, SBDebugger, GetCategory,
1394 (const char *), category_name);
1395
Kate Stoneb9c1b512016-09-06 20:57:50 +00001396 if (!category_name || *category_name == 0)
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001397 return LLDB_RECORD_RESULT(SBTypeCategory());
Kate Stoneb9c1b512016-09-06 20:57:50 +00001398
1399 TypeCategoryImplSP category_sp;
1400
1401 if (DataVisualization::Categories::GetCategory(ConstString(category_name),
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001402 category_sp, false)) {
1403 return LLDB_RECORD_RESULT(SBTypeCategory(category_sp));
1404 } else {
1405 return LLDB_RECORD_RESULT(SBTypeCategory());
1406 }
Michael Sartainc3ce7f272013-05-23 20:47:45 +00001407}
1408
Kate Stoneb9c1b512016-09-06 20:57:50 +00001409SBTypeCategory SBDebugger::GetCategory(lldb::LanguageType lang_type) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001410 LLDB_RECORD_METHOD(lldb::SBTypeCategory, SBDebugger, GetCategory,
1411 (lldb::LanguageType), lang_type);
1412
Kate Stoneb9c1b512016-09-06 20:57:50 +00001413 TypeCategoryImplSP category_sp;
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001414 if (DataVisualization::Categories::GetCategory(lang_type, category_sp)) {
1415 return LLDB_RECORD_RESULT(SBTypeCategory(category_sp));
1416 } else {
1417 return LLDB_RECORD_RESULT(SBTypeCategory());
1418 }
Michael Sartainc3ce7f272013-05-23 20:47:45 +00001419}
1420
Kate Stoneb9c1b512016-09-06 20:57:50 +00001421SBTypeCategory SBDebugger::CreateCategory(const char *category_name) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001422 LLDB_RECORD_METHOD(lldb::SBTypeCategory, SBDebugger, CreateCategory,
1423 (const char *), category_name);
1424
Kate Stoneb9c1b512016-09-06 20:57:50 +00001425 if (!category_name || *category_name == 0)
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001426 return LLDB_RECORD_RESULT(SBTypeCategory());
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001427
Kate Stoneb9c1b512016-09-06 20:57:50 +00001428 TypeCategoryImplSP category_sp;
1429
1430 if (DataVisualization::Categories::GetCategory(ConstString(category_name),
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001431 category_sp, true)) {
1432 return LLDB_RECORD_RESULT(SBTypeCategory(category_sp));
1433 } else {
1434 return LLDB_RECORD_RESULT(SBTypeCategory());
1435 }
Caroline Ticedde9cff2010-09-20 05:20:02 +00001436}
Caroline Ticeefed6132010-11-19 20:47:54 +00001437
Kate Stoneb9c1b512016-09-06 20:57:50 +00001438bool SBDebugger::DeleteCategory(const char *category_name) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001439 LLDB_RECORD_METHOD(bool, SBDebugger, DeleteCategory, (const char *),
1440 category_name);
1441
Kate Stoneb9c1b512016-09-06 20:57:50 +00001442 if (!category_name || *category_name == 0)
1443 return false;
1444
1445 return DataVisualization::Categories::Delete(ConstString(category_name));
Caroline Ticeefed6132010-11-19 20:47:54 +00001446}
Greg Clayton2289fa42011-04-30 01:09:13 +00001447
Kate Stoneb9c1b512016-09-06 20:57:50 +00001448uint32_t SBDebugger::GetNumCategories() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001449 LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBDebugger, GetNumCategories);
1450
Kate Stoneb9c1b512016-09-06 20:57:50 +00001451 return DataVisualization::Categories::GetCount();
Greg Clayton2289fa42011-04-30 01:09:13 +00001452}
1453
Kate Stoneb9c1b512016-09-06 20:57:50 +00001454SBTypeCategory SBDebugger::GetCategoryAtIndex(uint32_t index) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001455 LLDB_RECORD_METHOD(lldb::SBTypeCategory, SBDebugger, GetCategoryAtIndex,
1456 (uint32_t), index);
1457
1458 return LLDB_RECORD_RESULT(
1459 SBTypeCategory(DataVisualization::Categories::GetCategoryAtIndex(index)));
Kate Stoneb9c1b512016-09-06 20:57:50 +00001460}
1461
1462SBTypeCategory SBDebugger::GetDefaultCategory() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001463 LLDB_RECORD_METHOD_NO_ARGS(lldb::SBTypeCategory, SBDebugger,
1464 GetDefaultCategory);
1465
1466 return LLDB_RECORD_RESULT(GetCategory("default"));
Kate Stoneb9c1b512016-09-06 20:57:50 +00001467}
1468
1469SBTypeFormat SBDebugger::GetFormatForType(SBTypeNameSpecifier type_name) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001470 LLDB_RECORD_METHOD(lldb::SBTypeFormat, SBDebugger, GetFormatForType,
1471 (lldb::SBTypeNameSpecifier), type_name);
1472
Kate Stoneb9c1b512016-09-06 20:57:50 +00001473 SBTypeCategory default_category_sb = GetDefaultCategory();
1474 if (default_category_sb.GetEnabled())
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001475 return LLDB_RECORD_RESULT(default_category_sb.GetFormatForType(type_name));
1476 return LLDB_RECORD_RESULT(SBTypeFormat());
Kate Stoneb9c1b512016-09-06 20:57:50 +00001477}
1478
Kate Stoneb9c1b512016-09-06 20:57:50 +00001479SBTypeSummary SBDebugger::GetSummaryForType(SBTypeNameSpecifier type_name) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001480 LLDB_RECORD_METHOD(lldb::SBTypeSummary, SBDebugger, GetSummaryForType,
1481 (lldb::SBTypeNameSpecifier), type_name);
1482
Kate Stoneb9c1b512016-09-06 20:57:50 +00001483 if (!type_name.IsValid())
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001484 return LLDB_RECORD_RESULT(SBTypeSummary());
1485 return LLDB_RECORD_RESULT(
1486 SBTypeSummary(DataVisualization::GetSummaryForType(type_name.GetSP())));
Kate Stoneb9c1b512016-09-06 20:57:50 +00001487}
Kate Stoneb9c1b512016-09-06 20:57:50 +00001488
1489SBTypeFilter SBDebugger::GetFilterForType(SBTypeNameSpecifier type_name) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001490 LLDB_RECORD_METHOD(lldb::SBTypeFilter, SBDebugger, GetFilterForType,
1491 (lldb::SBTypeNameSpecifier), type_name);
1492
Kate Stoneb9c1b512016-09-06 20:57:50 +00001493 if (!type_name.IsValid())
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001494 return LLDB_RECORD_RESULT(SBTypeFilter());
1495 return LLDB_RECORD_RESULT(
1496 SBTypeFilter(DataVisualization::GetFilterForType(type_name.GetSP())));
Kate Stoneb9c1b512016-09-06 20:57:50 +00001497}
1498
Kate Stoneb9c1b512016-09-06 20:57:50 +00001499SBTypeSynthetic SBDebugger::GetSyntheticForType(SBTypeNameSpecifier type_name) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001500 LLDB_RECORD_METHOD(lldb::SBTypeSynthetic, SBDebugger, GetSyntheticForType,
1501 (lldb::SBTypeNameSpecifier), type_name);
1502
Kate Stoneb9c1b512016-09-06 20:57:50 +00001503 if (!type_name.IsValid())
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001504 return LLDB_RECORD_RESULT(SBTypeSynthetic());
1505 return LLDB_RECORD_RESULT(SBTypeSynthetic(
1506 DataVisualization::GetSyntheticForType(type_name.GetSP())));
Kate Stoneb9c1b512016-09-06 20:57:50 +00001507}
Kate Stoneb9c1b512016-09-06 20:57:50 +00001508
Pavel Labath5e336902017-03-01 10:08:40 +00001509static llvm::ArrayRef<const char *> GetCategoryArray(const char **categories) {
1510 if (categories == nullptr)
1511 return {};
1512 size_t len = 0;
1513 while (categories[len] != nullptr)
1514 ++len;
1515 return llvm::makeArrayRef(categories, len);
1516}
1517
Kate Stoneb9c1b512016-09-06 20:57:50 +00001518bool SBDebugger::EnableLog(const char *channel, const char **categories) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +00001519 LLDB_RECORD_METHOD(bool, SBDebugger, EnableLog, (const char *, const char **),
1520 channel, categories);
1521
Kate Stoneb9c1b512016-09-06 20:57:50 +00001522 if (m_opaque_sp) {
1523 uint32_t log_options =
1524 LLDB_LOG_OPTION_PREPEND_TIMESTAMP | LLDB_LOG_OPTION_PREPEND_THREAD_NAME;
Pavel Labath775588c2017-03-15 09:06:58 +00001525 std::string error;
1526 llvm::raw_string_ostream error_stream(error);
Pavel Labath5e336902017-03-01 10:08:40 +00001527 return m_opaque_sp->EnableLog(channel, GetCategoryArray(categories), "",
Pavel Labath775588c2017-03-15 09:06:58 +00001528 log_options, error_stream);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001529 } else
Greg Claytonf3dd93c2011-06-17 03:31:01 +00001530 return false;
1531}
1532
Kate Stoneb9c1b512016-09-06 20:57:50 +00001533void SBDebugger::SetLoggingCallback(lldb::LogOutputCallback log_callback,
1534 void *baton) {
Jonas Devlieghere7bc83562019-03-11 20:31:21 +00001535 LLDB_RECORD_DUMMY(void, SBDebugger, SetLoggingCallback,
1536 (lldb::LogOutputCallback, void *), log_callback, baton);
Jonas Devlieghere0d7b0c92019-03-08 19:09:27 +00001537
Kate Stoneb9c1b512016-09-06 20:57:50 +00001538 if (m_opaque_sp) {
1539 return m_opaque_sp->SetLoggingCallback(log_callback, baton);
1540 }
Jim Ingham4f02b222012-02-22 22:49:20 +00001541}
Michal Gornyae211ec2019-03-19 17:13:13 +00001542
1543namespace lldb_private {
1544namespace repro {
1545
1546template <>
1547void RegisterMethods<SBInputReader>(Registry &R) {
1548 LLDB_REGISTER_METHOD(void, SBInputReader, SetIsDone, (bool));
1549 LLDB_REGISTER_METHOD_CONST(bool, SBInputReader, IsActive, ());
1550}
1551
1552static void SetFileHandleRedirect(SBDebugger *, FILE *, bool) {
1553 // Do nothing.
1554}
1555
1556static bool GetDefaultArchitectureRedirect(char *arch_name,
1557 size_t arch_name_len) {
1558 // The function is writing to its argument. Without the redirect it would
1559 // write into the replay buffer.
1560 char buffer[1024];
1561 return SBDebugger::GetDefaultArchitecture(buffer, arch_name_len);
1562}
1563
1564template <>
1565void RegisterMethods<SBDebugger>(Registry &R) {
1566 // Custom implementation.
1567 R.Register(&invoke<void (SBDebugger::*)(
1568 FILE *, bool)>::method<&SBDebugger::SetErrorFileHandle>::doit,
1569 &SetFileHandleRedirect);
1570 R.Register(&invoke<void (SBDebugger::*)(
1571 FILE *, bool)>::method<&SBDebugger::SetOutputFileHandle>::doit,
1572 &SetFileHandleRedirect);
1573 R.Register<bool(char *, size_t)>(static_cast<bool (*)(char *, size_t)>(
1574 &SBDebugger::GetDefaultArchitecture),
1575 &GetDefaultArchitectureRedirect);
1576
1577 LLDB_REGISTER_CONSTRUCTOR(SBDebugger, ());
1578 LLDB_REGISTER_CONSTRUCTOR(SBDebugger, (const lldb::DebuggerSP &));
1579 LLDB_REGISTER_CONSTRUCTOR(SBDebugger, (const lldb::SBDebugger &));
1580 LLDB_REGISTER_METHOD(lldb::SBDebugger &,
1581 SBDebugger, operator=,(const lldb::SBDebugger &));
1582 LLDB_REGISTER_STATIC_METHOD(void, SBDebugger, Initialize, ());
1583 LLDB_REGISTER_STATIC_METHOD(lldb::SBError, SBDebugger,
1584 InitializeWithErrorHandling, ());
1585 LLDB_REGISTER_STATIC_METHOD(void, SBDebugger, Terminate, ());
1586 LLDB_REGISTER_METHOD(void, SBDebugger, Clear, ());
1587 LLDB_REGISTER_STATIC_METHOD(lldb::SBDebugger, SBDebugger, Create, ());
1588 LLDB_REGISTER_STATIC_METHOD(lldb::SBDebugger, SBDebugger, Create, (bool));
1589 LLDB_REGISTER_STATIC_METHOD(void, SBDebugger, Destroy,
1590 (lldb::SBDebugger &));
1591 LLDB_REGISTER_STATIC_METHOD(void, SBDebugger, MemoryPressureDetected, ());
1592 LLDB_REGISTER_METHOD_CONST(bool, SBDebugger, IsValid, ());
1593 LLDB_REGISTER_METHOD_CONST(bool, SBDebugger, operator bool, ());
1594 LLDB_REGISTER_METHOD(void, SBDebugger, SetAsync, (bool));
1595 LLDB_REGISTER_METHOD(bool, SBDebugger, GetAsync, ());
1596 LLDB_REGISTER_METHOD(void, SBDebugger, SkipLLDBInitFiles, (bool));
1597 LLDB_REGISTER_METHOD(void, SBDebugger, SkipAppInitFiles, (bool));
1598 LLDB_REGISTER_METHOD(void, SBDebugger, SetInputFileHandle, (FILE *, bool));
1599 LLDB_REGISTER_METHOD(FILE *, SBDebugger, GetInputFileHandle, ());
1600 LLDB_REGISTER_METHOD(FILE *, SBDebugger, GetOutputFileHandle, ());
1601 LLDB_REGISTER_METHOD(FILE *, SBDebugger, GetErrorFileHandle, ());
1602 LLDB_REGISTER_METHOD(void, SBDebugger, SaveInputTerminalState, ());
1603 LLDB_REGISTER_METHOD(void, SBDebugger, RestoreInputTerminalState, ());
1604 LLDB_REGISTER_METHOD(lldb::SBCommandInterpreter, SBDebugger,
1605 GetCommandInterpreter, ());
1606 LLDB_REGISTER_METHOD(void, SBDebugger, HandleCommand, (const char *));
1607 LLDB_REGISTER_METHOD(lldb::SBListener, SBDebugger, GetListener, ());
1608 LLDB_REGISTER_METHOD(
1609 void, SBDebugger, HandleProcessEvent,
1610 (const lldb::SBProcess &, const lldb::SBEvent &, FILE *, FILE *));
1611 LLDB_REGISTER_METHOD(lldb::SBSourceManager, SBDebugger, GetSourceManager,
1612 ());
1613 LLDB_REGISTER_STATIC_METHOD(bool, SBDebugger, SetDefaultArchitecture,
1614 (const char *));
1615 LLDB_REGISTER_METHOD(lldb::ScriptLanguage, SBDebugger, GetScriptingLanguage,
1616 (const char *));
1617 LLDB_REGISTER_STATIC_METHOD(const char *, SBDebugger, GetVersionString, ());
1618 LLDB_REGISTER_STATIC_METHOD(const char *, SBDebugger, StateAsCString,
1619 (lldb::StateType));
1620 LLDB_REGISTER_STATIC_METHOD(lldb::SBStructuredData, SBDebugger,
1621 GetBuildConfiguration, ());
1622 LLDB_REGISTER_STATIC_METHOD(bool, SBDebugger, StateIsRunningState,
1623 (lldb::StateType));
1624 LLDB_REGISTER_STATIC_METHOD(bool, SBDebugger, StateIsStoppedState,
1625 (lldb::StateType));
1626 LLDB_REGISTER_METHOD(
1627 lldb::SBTarget, SBDebugger, CreateTarget,
1628 (const char *, const char *, const char *, bool, lldb::SBError &));
1629 LLDB_REGISTER_METHOD(lldb::SBTarget, SBDebugger,
1630 CreateTargetWithFileAndTargetTriple,
1631 (const char *, const char *));
1632 LLDB_REGISTER_METHOD(lldb::SBTarget, SBDebugger,
1633 CreateTargetWithFileAndArch,
1634 (const char *, const char *));
1635 LLDB_REGISTER_METHOD(lldb::SBTarget, SBDebugger, CreateTarget,
1636 (const char *));
1637 LLDB_REGISTER_METHOD(lldb::SBTarget, SBDebugger, GetDummyTarget, ());
1638 LLDB_REGISTER_METHOD(bool, SBDebugger, DeleteTarget, (lldb::SBTarget &));
1639 LLDB_REGISTER_METHOD(lldb::SBTarget, SBDebugger, GetTargetAtIndex,
1640 (uint32_t));
1641 LLDB_REGISTER_METHOD(uint32_t, SBDebugger, GetIndexOfTarget,
1642 (lldb::SBTarget));
1643 LLDB_REGISTER_METHOD(lldb::SBTarget, SBDebugger, FindTargetWithProcessID,
1644 (lldb::pid_t));
1645 LLDB_REGISTER_METHOD(lldb::SBTarget, SBDebugger, FindTargetWithFileAndArch,
1646 (const char *, const char *));
1647 LLDB_REGISTER_METHOD(uint32_t, SBDebugger, GetNumTargets, ());
1648 LLDB_REGISTER_METHOD(lldb::SBTarget, SBDebugger, GetSelectedTarget, ());
1649 LLDB_REGISTER_METHOD(void, SBDebugger, SetSelectedTarget,
1650 (lldb::SBTarget &));
1651 LLDB_REGISTER_METHOD(lldb::SBPlatform, SBDebugger, GetSelectedPlatform, ());
1652 LLDB_REGISTER_METHOD(void, SBDebugger, SetSelectedPlatform,
1653 (lldb::SBPlatform &));
1654 LLDB_REGISTER_METHOD(uint32_t, SBDebugger, GetNumPlatforms, ());
1655 LLDB_REGISTER_METHOD(lldb::SBPlatform, SBDebugger, GetPlatformAtIndex,
1656 (uint32_t));
1657 LLDB_REGISTER_METHOD(uint32_t, SBDebugger, GetNumAvailablePlatforms, ());
1658 LLDB_REGISTER_METHOD(lldb::SBStructuredData, SBDebugger,
1659 GetAvailablePlatformInfoAtIndex, (uint32_t));
1660 LLDB_REGISTER_METHOD(void, SBDebugger, DispatchInputInterrupt, ());
1661 LLDB_REGISTER_METHOD(void, SBDebugger, DispatchInputEndOfFile, ());
1662 LLDB_REGISTER_METHOD(void, SBDebugger, PushInputReader,
1663 (lldb::SBInputReader &));
1664 LLDB_REGISTER_METHOD(void, SBDebugger, RunCommandInterpreter, (bool, bool));
1665 LLDB_REGISTER_METHOD(void, SBDebugger, RunCommandInterpreter,
1666 (bool, bool, lldb::SBCommandInterpreterRunOptions &,
1667 int &, bool &, bool &));
1668 LLDB_REGISTER_METHOD(lldb::SBError, SBDebugger, RunREPL,
1669 (lldb::LanguageType, const char *));
1670 LLDB_REGISTER_STATIC_METHOD(lldb::SBDebugger, SBDebugger,
1671 FindDebuggerWithID, (int));
1672 LLDB_REGISTER_METHOD(const char *, SBDebugger, GetInstanceName, ());
1673 LLDB_REGISTER_STATIC_METHOD(lldb::SBError, SBDebugger, SetInternalVariable,
1674 (const char *, const char *, const char *));
1675 LLDB_REGISTER_STATIC_METHOD(lldb::SBStringList, SBDebugger,
1676 GetInternalVariableValue,
1677 (const char *, const char *));
1678 LLDB_REGISTER_METHOD_CONST(uint32_t, SBDebugger, GetTerminalWidth, ());
1679 LLDB_REGISTER_METHOD(void, SBDebugger, SetTerminalWidth, (uint32_t));
1680 LLDB_REGISTER_METHOD_CONST(const char *, SBDebugger, GetPrompt, ());
1681 LLDB_REGISTER_METHOD(void, SBDebugger, SetPrompt, (const char *));
1682 LLDB_REGISTER_METHOD_CONST(const char *, SBDebugger, GetReproducerPath, ());
1683 LLDB_REGISTER_METHOD_CONST(lldb::ScriptLanguage, SBDebugger,
1684 GetScriptLanguage, ());
1685 LLDB_REGISTER_METHOD(void, SBDebugger, SetScriptLanguage,
1686 (lldb::ScriptLanguage));
1687 LLDB_REGISTER_METHOD(bool, SBDebugger, SetUseExternalEditor, (bool));
1688 LLDB_REGISTER_METHOD(bool, SBDebugger, GetUseExternalEditor, ());
1689 LLDB_REGISTER_METHOD(bool, SBDebugger, SetUseColor, (bool));
1690 LLDB_REGISTER_METHOD_CONST(bool, SBDebugger, GetUseColor, ());
1691 LLDB_REGISTER_METHOD(bool, SBDebugger, GetDescription, (lldb::SBStream &));
1692 LLDB_REGISTER_METHOD(lldb::user_id_t, SBDebugger, GetID, ());
1693 LLDB_REGISTER_METHOD(lldb::SBError, SBDebugger, SetCurrentPlatform,
1694 (const char *));
1695 LLDB_REGISTER_METHOD(bool, SBDebugger, SetCurrentPlatformSDKRoot,
1696 (const char *));
1697 LLDB_REGISTER_METHOD_CONST(bool, SBDebugger, GetCloseInputOnEOF, ());
1698 LLDB_REGISTER_METHOD(void, SBDebugger, SetCloseInputOnEOF, (bool));
1699 LLDB_REGISTER_METHOD(lldb::SBTypeCategory, SBDebugger, GetCategory,
1700 (const char *));
1701 LLDB_REGISTER_METHOD(lldb::SBTypeCategory, SBDebugger, GetCategory,
1702 (lldb::LanguageType));
1703 LLDB_REGISTER_METHOD(lldb::SBTypeCategory, SBDebugger, CreateCategory,
1704 (const char *));
1705 LLDB_REGISTER_METHOD(bool, SBDebugger, DeleteCategory, (const char *));
1706 LLDB_REGISTER_METHOD(uint32_t, SBDebugger, GetNumCategories, ());
1707 LLDB_REGISTER_METHOD(lldb::SBTypeCategory, SBDebugger, GetCategoryAtIndex,
1708 (uint32_t));
1709 LLDB_REGISTER_METHOD(lldb::SBTypeCategory, SBDebugger, GetDefaultCategory,
1710 ());
1711 LLDB_REGISTER_METHOD(lldb::SBTypeFormat, SBDebugger, GetFormatForType,
1712 (lldb::SBTypeNameSpecifier));
1713 LLDB_REGISTER_METHOD(lldb::SBTypeSummary, SBDebugger, GetSummaryForType,
1714 (lldb::SBTypeNameSpecifier));
1715 LLDB_REGISTER_METHOD(lldb::SBTypeSynthetic, SBDebugger, GetSyntheticForType,
1716 (lldb::SBTypeNameSpecifier));
1717 LLDB_REGISTER_METHOD(lldb::SBTypeFilter, SBDebugger, GetFilterForType,
1718 (lldb::SBTypeNameSpecifier));
1719 LLDB_REGISTER_METHOD(bool, SBDebugger, EnableLog,
1720 (const char *, const char **));
1721}
1722
1723}
1724}