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