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 9baf5664fSJonas Devlieghere #include "SBReproducerPrivate.h" 10d17cd902SAlex Langford #include "SystemInitializerFull.h" 11d17cd902SAlex Langford 12ca93cc1dSEli Friedman #include "lldb/API/SBDebugger.h" 1330fdc8d8SChris Lattner 14e0d378b3SGreg Clayton #include "lldb/lldb-private.h" 1530fdc8d8SChris Lattner 16ca93cc1dSEli Friedman #include "lldb/API/SBBroadcaster.h" 17ca93cc1dSEli Friedman #include "lldb/API/SBCommandInterpreter.h" 184b354039SJonas Devlieghere #include "lldb/API/SBCommandInterpreterRunOptions.h" 19ca93cc1dSEli Friedman #include "lldb/API/SBCommandReturnObject.h" 202289fa48SGreg Clayton #include "lldb/API/SBError.h" 21ca93cc1dSEli Friedman #include "lldb/API/SBEvent.h" 2296898eb6SLawrence D'Anna #include "lldb/API/SBFile.h" 23ca93cc1dSEli Friedman #include "lldb/API/SBFrame.h" 24b9c1b51eSKate Stone #include "lldb/API/SBListener.h" 253df9a8dfSCaroline Tice #include "lldb/API/SBProcess.h" 263df9a8dfSCaroline Tice #include "lldb/API/SBSourceManager.h" 27dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 283df9a8dfSCaroline Tice #include "lldb/API/SBStringList.h" 29c10e34d0SVadim Macagon #include "lldb/API/SBStructuredData.h" 303df9a8dfSCaroline Tice #include "lldb/API/SBTarget.h" 313df9a8dfSCaroline Tice #include "lldb/API/SBThread.h" 32061858ceSEnrico Granata #include "lldb/API/SBTypeCategory.h" 33061858ceSEnrico Granata #include "lldb/API/SBTypeFilter.h" 34b9c1b51eSKate Stone #include "lldb/API/SBTypeFormat.h" 35061858ceSEnrico Granata #include "lldb/API/SBTypeNameSpecifier.h" 36061858ceSEnrico Granata #include "lldb/API/SBTypeSummary.h" 37061858ceSEnrico Granata #include "lldb/API/SBTypeSynthetic.h" 38061858ceSEnrico Granata 396eee5aa0SGreg Clayton #include "lldb/Core/Debugger.h" 40c10e34d0SVadim Macagon #include "lldb/Core/PluginManager.h" 4144d93782SGreg Clayton #include "lldb/Core/StreamFile.h" 42c10e34d0SVadim Macagon #include "lldb/Core/StructuredDataImpl.h" 435548cb50SEnrico Granata #include "lldb/DataFormatters/DataVisualization.h" 4459998b7bSJonas Devlieghere #include "lldb/Host/Config.h" 45f1389e92SPavel Labath #include "lldb/Host/XML.h" 46e6e2bb38SZachary Turner #include "lldb/Initialization/SystemLifetimeManager.h" 476eee5aa0SGreg Clayton #include "lldb/Interpreter/CommandInterpreter.h" 4847cbf4a0SPavel Labath #include "lldb/Interpreter/OptionArgParser.h" 49cac9c5f9SGreg Clayton #include "lldb/Interpreter/OptionGroupPlatform.h" 506eee5aa0SGreg Clayton #include "lldb/Target/Process.h" 516eee5aa0SGreg Clayton #include "lldb/Target/TargetList.h" 52145d95c9SPavel Labath #include "lldb/Utility/Args.h" 53d821c997SPavel Labath #include "lldb/Utility/State.h" 5430fdc8d8SChris Lattner 55d717cc9fSEnrico Granata #include "llvm/ADT/STLExtras.h" 567b2e5a36SZachary Turner #include "llvm/ADT/StringRef.h" 5758a559c0SZachary Turner #include "llvm/Support/DynamicLibrary.h" 58b9c1b51eSKate Stone #include "llvm/Support/ManagedStatic.h" 5958a559c0SZachary Turner 6030fdc8d8SChris Lattner using namespace lldb; 6130fdc8d8SChris Lattner using namespace lldb_private; 6230fdc8d8SChris Lattner 63b9c1b51eSKate Stone static llvm::sys::DynamicLibrary LoadPlugin(const lldb::DebuggerSP &debugger_sp, 64b9c1b51eSKate Stone const FileSpec &spec, 6597206d57SZachary Turner Status &error) { 66b9c1b51eSKate Stone llvm::sys::DynamicLibrary dynlib = 67b9c1b51eSKate Stone llvm::sys::DynamicLibrary::getPermanentLibrary(spec.GetPath().c_str()); 68b9c1b51eSKate Stone if (dynlib.isValid()) { 695fb8f797SGreg Clayton typedef bool (*LLDBCommandPluginInit)(lldb::SBDebugger & debugger); 705fb8f797SGreg Clayton 715fb8f797SGreg Clayton lldb::SBDebugger debugger_sb(debugger_sp); 72b9c1b51eSKate Stone // This calls the bool lldb::PluginInitialize(lldb::SBDebugger debugger) 73b9c1b51eSKate Stone // function. 74b9c1b51eSKate Stone // TODO: mangle this differently for your system - on OSX, the first 75b9c1b51eSKate Stone // underscore needs to be removed and the second one stays 76b9c1b51eSKate Stone LLDBCommandPluginInit init_func = 7722701b2fSStephane Sezer (LLDBCommandPluginInit)(uintptr_t)dynlib.getAddressOfSymbol( 78b9c1b51eSKate Stone "_ZN4lldb16PluginInitializeENS_10SBDebuggerE"); 79b9c1b51eSKate Stone if (init_func) { 805fb8f797SGreg Clayton if (init_func(debugger_sb)) 8158a559c0SZachary Turner return dynlib; 825fb8f797SGreg Clayton else 83b9c1b51eSKate Stone error.SetErrorString("plug-in refused to load " 84b9c1b51eSKate Stone "(lldb::PluginInitialize(lldb::SBDebugger) " 85b9c1b51eSKate Stone "returned false)"); 86b9c1b51eSKate Stone } else { 87b9c1b51eSKate Stone error.SetErrorString("plug-in is missing the required initialization: " 88b9c1b51eSKate Stone "lldb::PluginInitialize(lldb::SBDebugger)"); 895fb8f797SGreg Clayton } 90b9c1b51eSKate Stone } else { 91dbd7fabaSJonas Devlieghere if (FileSystem::Instance().Exists(spec)) 925fb8f797SGreg Clayton error.SetErrorString("this file does not represent a loadable dylib"); 935fb8f797SGreg Clayton else 945fb8f797SGreg Clayton error.SetErrorString("no such file"); 955fb8f797SGreg Clayton } 9658a559c0SZachary Turner return llvm::sys::DynamicLibrary(); 975fb8f797SGreg Clayton } 985fb8f797SGreg Clayton 99e6e2bb38SZachary Turner static llvm::ManagedStatic<SystemLifetimeManager> g_debugger_lifetime; 100e6e2bb38SZachary Turner 101b9c1b51eSKate Stone SBError SBInputReader::Initialize( 102b9c1b51eSKate Stone lldb::SBDebugger &sb_debugger, 1030d7b0c96SJonas Devlieghere unsigned long (*callback)(void *, lldb::SBInputReader *, 1040d7b0c96SJonas Devlieghere lldb::InputReaderAction, char const *, 1050d7b0c96SJonas Devlieghere unsigned long), 1060d7b0c96SJonas Devlieghere void *a, lldb::InputReaderGranularity b, char const *c, char const *d, 1070d7b0c96SJonas Devlieghere bool e) { 1087bc83564SJonas Devlieghere LLDB_RECORD_DUMMY( 1097bc83564SJonas Devlieghere lldb::SBError, SBInputReader, Initialize, 1107bc83564SJonas Devlieghere (lldb::SBDebugger &, 1117bc83564SJonas Devlieghere unsigned long (*)(void *, lldb::SBInputReader *, lldb::InputReaderAction, 1127bc83564SJonas Devlieghere const char *, unsigned long), 1137bc83564SJonas Devlieghere void *, lldb::InputReaderGranularity, const char *, const char *, bool), 1140d7b0c96SJonas Devlieghere sb_debugger, callback, a, b, c, d, e); 1150d7b0c96SJonas Devlieghere 116e6e2bb38SZachary Turner return SBError(); 117e6e2bb38SZachary Turner } 118e6e2bb38SZachary Turner 119baf5664fSJonas Devlieghere void SBInputReader::SetIsDone(bool b) { 120baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBInputReader, SetIsDone, (bool), b); 121baf5664fSJonas Devlieghere } 122dbb0abbfSEugene Zelenko 123baf5664fSJonas Devlieghere bool SBInputReader::IsActive() const { 124baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBInputReader, IsActive); 125e6e2bb38SZachary Turner 126baf5664fSJonas Devlieghere return false; 127baf5664fSJonas Devlieghere } 128baf5664fSJonas Devlieghere 129baf5664fSJonas Devlieghere SBDebugger::SBDebugger() { LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBDebugger); } 130dbb0abbfSEugene Zelenko 131b9c1b51eSKate Stone SBDebugger::SBDebugger(const lldb::DebuggerSP &debugger_sp) 132baf5664fSJonas Devlieghere : m_opaque_sp(debugger_sp) { 133baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBDebugger, (const lldb::DebuggerSP &), debugger_sp); 134baf5664fSJonas Devlieghere } 135dbb0abbfSEugene Zelenko 136baf5664fSJonas Devlieghere SBDebugger::SBDebugger(const SBDebugger &rhs) : m_opaque_sp(rhs.m_opaque_sp) { 137baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBDebugger, (const lldb::SBDebugger &), rhs); 138baf5664fSJonas Devlieghere } 139dbb0abbfSEugene Zelenko 140dbb0abbfSEugene Zelenko SBDebugger::~SBDebugger() = default; 141dbb0abbfSEugene Zelenko 142b9c1b51eSKate Stone SBDebugger &SBDebugger::operator=(const SBDebugger &rhs) { 143baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBDebugger &, 144baf5664fSJonas Devlieghere SBDebugger, operator=,(const lldb::SBDebugger &), rhs); 145baf5664fSJonas Devlieghere 146b9c1b51eSKate Stone if (this != &rhs) { 147dbb0abbfSEugene Zelenko m_opaque_sp = rhs.m_opaque_sp; 148dbb0abbfSEugene Zelenko } 149306809f2SJonas Devlieghere return LLDB_RECORD_RESULT(*this); 150dbb0abbfSEugene Zelenko } 151dbb0abbfSEugene Zelenko 152b9c1b51eSKate Stone void SBDebugger::Initialize() { 153baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD_NO_ARGS(void, SBDebugger, Initialize); 154936c6242SJonas Devlieghere SBError ignored = SBDebugger::InitializeWithErrorHandling(); 15515eacd74SJonas Devlieghere } 15615eacd74SJonas Devlieghere 157936c6242SJonas Devlieghere lldb::SBError SBDebugger::InitializeWithErrorHandling() { 158baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD_NO_ARGS(lldb::SBError, SBDebugger, 159baf5664fSJonas Devlieghere InitializeWithErrorHandling); 160baf5664fSJonas Devlieghere 16115eacd74SJonas Devlieghere SBError error; 16215eacd74SJonas Devlieghere if (auto e = g_debugger_lifetime->Initialize( 163a8f3ae7cSJonas Devlieghere std::make_unique<SystemInitializerFull>(), LoadPlugin)) { 16415eacd74SJonas Devlieghere error.SetError(Status(std::move(e))); 16515eacd74SJonas Devlieghere } 166baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(error); 16730fdc8d8SChris Lattner } 16830fdc8d8SChris Lattner 169baf5664fSJonas Devlieghere void SBDebugger::Terminate() { 170baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD_NO_ARGS(void, SBDebugger, Terminate); 171baf5664fSJonas Devlieghere 172baf5664fSJonas Devlieghere g_debugger_lifetime->Terminate(); 173baf5664fSJonas Devlieghere } 17430fdc8d8SChris Lattner 175b9c1b51eSKate Stone void SBDebugger::Clear() { 176baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(void, SBDebugger, Clear); 177baf5664fSJonas Devlieghere 1783d6086f6SCaroline Tice if (m_opaque_sp) 17944d93782SGreg Clayton m_opaque_sp->ClearIOHandlers(); 180ceb6b139SCaroline Tice 18148e42549SGreg Clayton m_opaque_sp.reset(); 18248e42549SGreg Clayton } 18348e42549SGreg Clayton 184b9c1b51eSKate Stone SBDebugger SBDebugger::Create() { 185baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD_NO_ARGS(lldb::SBDebugger, SBDebugger, Create); 186baf5664fSJonas Devlieghere 187baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBDebugger::Create(false, nullptr, nullptr)); 18806942690SJim Ingham } 18906942690SJim Ingham 190b9c1b51eSKate Stone SBDebugger SBDebugger::Create(bool source_init_files) { 191baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD(lldb::SBDebugger, SBDebugger, Create, (bool), 192baf5664fSJonas Devlieghere source_init_files); 193baf5664fSJonas Devlieghere 194baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT( 195baf5664fSJonas Devlieghere SBDebugger::Create(source_init_files, nullptr, nullptr)); 196228063cdSJim Ingham } 197228063cdSJim Ingham 198b9c1b51eSKate Stone SBDebugger SBDebugger::Create(bool source_init_files, 199b9c1b51eSKate Stone lldb::LogOutputCallback callback, void *baton) 200228063cdSJim Ingham 201228063cdSJim Ingham { 2020d7b0c96SJonas Devlieghere LLDB_RECORD_DUMMY(lldb::SBDebugger, SBDebugger, Create, 2037bc83564SJonas Devlieghere (bool, lldb::LogOutputCallback, void *), source_init_files, 2047bc83564SJonas Devlieghere callback, baton); 205ceb6b139SCaroline Tice 2066611103cSGreg Clayton SBDebugger debugger; 207cb172b10SGreg Clayton 208b9c1b51eSKate Stone // Currently we have issues if this function is called simultaneously on two 20905097246SAdrian Prantl // different threads. The issues mainly revolve around the fact that the 21005097246SAdrian Prantl // lldb_private::FormatManager uses global collections and having two threads 21105097246SAdrian Prantl // parsing the .lldbinit files can cause mayhem. So to get around this for 21205097246SAdrian Prantl // now we need to use a mutex to prevent bad things from happening. 21316ff8604SSaleem Abdulrasool static std::recursive_mutex g_mutex; 21416ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(g_mutex); 215cb172b10SGreg Clayton 216228063cdSJim Ingham debugger.reset(Debugger::CreateInstance(callback, baton)); 217ceb6b139SCaroline Tice 21806942690SJim Ingham SBCommandInterpreter interp = debugger.GetCommandInterpreter(); 219b9c1b51eSKate Stone if (source_init_files) { 22006942690SJim Ingham interp.get()->SkipLLDBInitFiles(false); 22106942690SJim Ingham interp.get()->SkipAppInitFiles(false); 22206942690SJim Ingham SBCommandReturnObject result; 22306942690SJim Ingham interp.SourceInitFileInHomeDirectory(result); 224b9c1b51eSKate Stone } else { 22506942690SJim Ingham interp.get()->SkipLLDBInitFiles(true); 22606942690SJim Ingham interp.get()->SkipAppInitFiles(true); 22706942690SJim Ingham } 2286611103cSGreg Clayton return debugger; 2296611103cSGreg Clayton } 2306611103cSGreg Clayton 231b9c1b51eSKate Stone void SBDebugger::Destroy(SBDebugger &debugger) { 232baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD(void, SBDebugger, Destroy, (lldb::SBDebugger &), 233baf5664fSJonas Devlieghere debugger); 234baf5664fSJonas Devlieghere 235e02657b1SCaroline Tice Debugger::Destroy(debugger.m_opaque_sp); 236e02657b1SCaroline Tice 237dbb0abbfSEugene Zelenko if (debugger.m_opaque_sp.get() != nullptr) 238e02657b1SCaroline Tice debugger.m_opaque_sp.reset(); 239e02657b1SCaroline Tice } 240e02657b1SCaroline Tice 241b9c1b51eSKate Stone void SBDebugger::MemoryPressureDetected() { 242baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD_NO_ARGS(void, SBDebugger, MemoryPressureDetected); 243baf5664fSJonas Devlieghere 24405097246SAdrian Prantl // Since this function can be call asynchronously, we allow it to be non- 24505097246SAdrian Prantl // mandatory. We have seen deadlocks with this function when called so we 24605097246SAdrian Prantl // need to safeguard against this until we can determine what is causing the 24705097246SAdrian Prantl // deadlocks. 248aebdf1beSJim Ingham 2490cd70866SGreg Clayton const bool mandatory = false; 250aebdf1beSJim Ingham 2510cd70866SGreg Clayton ModuleList::RemoveOrphanSharedModules(mandatory); 252f9322415SGreg Clayton } 253f9322415SGreg Clayton 254baf5664fSJonas Devlieghere bool SBDebugger::IsValid() const { 255baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBDebugger, IsValid); 2567f5237bcSPavel Labath return this->operator bool(); 2577f5237bcSPavel Labath } 2587f5237bcSPavel Labath SBDebugger::operator bool() const { 2597f5237bcSPavel Labath LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBDebugger, operator bool); 260baf5664fSJonas Devlieghere 261baf5664fSJonas Devlieghere return m_opaque_sp.get() != nullptr; 262baf5664fSJonas Devlieghere } 2636611103cSGreg Clayton 264b9c1b51eSKate Stone void SBDebugger::SetAsync(bool b) { 265baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBDebugger, SetAsync, (bool), b); 266baf5664fSJonas Devlieghere 2676611103cSGreg Clayton if (m_opaque_sp) 2686611103cSGreg Clayton m_opaque_sp->SetAsyncExecution(b); 26930fdc8d8SChris Lattner } 27030fdc8d8SChris Lattner 271b9c1b51eSKate Stone bool SBDebugger::GetAsync() { 272baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(bool, SBDebugger, GetAsync); 273baf5664fSJonas Devlieghere 274dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->GetAsyncExecution() : false); 275e64f0dc7SJim Ingham } 276e64f0dc7SJim Ingham 277b9c1b51eSKate Stone void SBDebugger::SkipLLDBInitFiles(bool b) { 278baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBDebugger, SkipLLDBInitFiles, (bool), b); 279baf5664fSJonas Devlieghere 2806eee5aa0SGreg Clayton if (m_opaque_sp) 2816eee5aa0SGreg Clayton m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles(b); 2826eee5aa0SGreg Clayton } 2836eee5aa0SGreg Clayton 284b9c1b51eSKate Stone void SBDebugger::SkipAppInitFiles(bool b) { 285baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBDebugger, SkipAppInitFiles, (bool), b); 286baf5664fSJonas Devlieghere 28716e0c686SJim Ingham if (m_opaque_sp) 28816e0c686SJim Ingham m_opaque_sp->GetCommandInterpreter().SkipAppInitFiles(b); 28916e0c686SJim Ingham } 29016e0c686SJim Ingham 291b9c1b51eSKate Stone void SBDebugger::SetInputFileHandle(FILE *fh, bool transfer_ownership) { 292baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBDebugger, SetInputFileHandle, (FILE *, bool), fh, 293baf5664fSJonas Devlieghere transfer_ownership); 294f913fd6eSLawrence D'Anna SetInputFile((FileSP)std::make_shared<NativeFile>(fh, transfer_ownership)); 29596898eb6SLawrence D'Anna } 296baf5664fSJonas Devlieghere 297c040b30fSLawrence D'Anna SBError SBDebugger::SetInputFile(FileSP file_sp) { 298c040b30fSLawrence D'Anna LLDB_RECORD_METHOD(SBError, SBDebugger, SetInputFile, (FileSP), file_sp); 299fe5ab6d2SJonas Devlieghere return LLDB_RECORD_RESULT(SetInputFile(SBFile(file_sp))); 300c040b30fSLawrence D'Anna } 301c040b30fSLawrence D'Anna 30296898eb6SLawrence D'Anna // Shouldn't really be settable after initialization as this could cause lots 30396898eb6SLawrence D'Anna // of problems; don't want users trying to switch modes in the middle of a 30496898eb6SLawrence D'Anna // debugging session. 30596898eb6SLawrence D'Anna SBError SBDebugger::SetInputFile(SBFile file) { 30696898eb6SLawrence D'Anna LLDB_RECORD_METHOD(SBError, SBDebugger, SetInputFile, (SBFile), file); 30796898eb6SLawrence D'Anna 30896898eb6SLawrence D'Anna SBError error; 30996898eb6SLawrence D'Anna if (!m_opaque_sp) { 31096898eb6SLawrence D'Anna error.ref().SetErrorString("invalid debugger"); 311fe5ab6d2SJonas Devlieghere return LLDB_RECORD_RESULT(error); 31296898eb6SLawrence D'Anna } 313d77c2e09SJonas Devlieghere 314d77c2e09SJonas Devlieghere repro::DataRecorder *recorder = nullptr; 315d77c2e09SJonas Devlieghere if (repro::Generator *g = repro::Reproducer::Instance().GetGenerator()) 316*169c8320SJonas Devlieghere recorder = g->GetOrCreate<repro::CommandProvider>().GetNewRecorder(); 317d77c2e09SJonas Devlieghere 31896898eb6SLawrence D'Anna FileSP file_sp = file.m_opaque_sp; 31996898eb6SLawrence D'Anna 3201d41d1bcSEric Christopher static std::unique_ptr<repro::MultiLoader<repro::CommandProvider>> loader = 3211d41d1bcSEric Christopher repro::MultiLoader<repro::CommandProvider>::Create( 3221d41d1bcSEric Christopher repro::Reproducer::Instance().GetLoader()); 3234a491ec4SJonas Devlieghere if (loader) { 32496898eb6SLawrence D'Anna llvm::Optional<std::string> nextfile = loader->GetNextFile(); 32596898eb6SLawrence D'Anna FILE *fh = nextfile ? FileSystem::Instance().Fopen(nextfile->c_str(), "r") 32696898eb6SLawrence D'Anna : nullptr; 32796898eb6SLawrence D'Anna // FIXME Jonas Devlieghere: shouldn't this error be propagated out to the 32896898eb6SLawrence D'Anna // reproducer somehow if fh is NULL? 32996898eb6SLawrence D'Anna if (fh) { 330f913fd6eSLawrence D'Anna file_sp = std::make_shared<NativeFile>(fh, true); 33196898eb6SLawrence D'Anna } 3324a491ec4SJonas Devlieghere } 333d77c2e09SJonas Devlieghere 33496898eb6SLawrence D'Anna if (!file_sp || !file_sp->IsValid()) { 33596898eb6SLawrence D'Anna error.ref().SetErrorString("invalid file"); 336fe5ab6d2SJonas Devlieghere return LLDB_RECORD_RESULT(error); 33796898eb6SLawrence D'Anna } 33896898eb6SLawrence D'Anna 33996898eb6SLawrence D'Anna m_opaque_sp->SetInputFile(file_sp, recorder); 340fe5ab6d2SJonas Devlieghere return LLDB_RECORD_RESULT(error); 34130fdc8d8SChris Lattner } 34230fdc8d8SChris Lattner 343c040b30fSLawrence D'Anna SBError SBDebugger::SetOutputFile(FileSP file_sp) { 344c040b30fSLawrence D'Anna LLDB_RECORD_METHOD(SBError, SBDebugger, SetOutputFile, (FileSP), file_sp); 345fe5ab6d2SJonas Devlieghere return LLDB_RECORD_RESULT(SetOutputFile(SBFile(file_sp))); 346c040b30fSLawrence D'Anna } 347c040b30fSLawrence D'Anna 348b9c1b51eSKate Stone void SBDebugger::SetOutputFileHandle(FILE *fh, bool transfer_ownership) { 349baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBDebugger, SetOutputFileHandle, (FILE *, bool), fh, 350baf5664fSJonas Devlieghere transfer_ownership); 351f913fd6eSLawrence D'Anna SetOutputFile((FileSP)std::make_shared<NativeFile>(fh, transfer_ownership)); 35296898eb6SLawrence D'Anna } 353baf5664fSJonas Devlieghere 35496898eb6SLawrence D'Anna SBError SBDebugger::SetOutputFile(SBFile file) { 35596898eb6SLawrence D'Anna LLDB_RECORD_METHOD(SBError, SBDebugger, SetOutputFile, (SBFile file), file); 35696898eb6SLawrence D'Anna SBError error; 35796898eb6SLawrence D'Anna if (!m_opaque_sp) { 35896898eb6SLawrence D'Anna error.ref().SetErrorString("invalid debugger"); 359fe5ab6d2SJonas Devlieghere return LLDB_RECORD_RESULT(error); 36096898eb6SLawrence D'Anna } 36196898eb6SLawrence D'Anna if (!file) { 36296898eb6SLawrence D'Anna error.ref().SetErrorString("invalid file"); 363fe5ab6d2SJonas Devlieghere return LLDB_RECORD_RESULT(error); 36496898eb6SLawrence D'Anna } 36596898eb6SLawrence D'Anna m_opaque_sp->SetOutputFile(file.m_opaque_sp); 366fe5ab6d2SJonas Devlieghere return LLDB_RECORD_RESULT(error); 36730fdc8d8SChris Lattner } 36830fdc8d8SChris Lattner 369b9c1b51eSKate Stone void SBDebugger::SetErrorFileHandle(FILE *fh, bool transfer_ownership) { 370baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBDebugger, SetErrorFileHandle, (FILE *, bool), fh, 371baf5664fSJonas Devlieghere transfer_ownership); 372f913fd6eSLawrence D'Anna SetErrorFile((FileSP)std::make_shared<NativeFile>(fh, transfer_ownership)); 37396898eb6SLawrence D'Anna } 374baf5664fSJonas Devlieghere 375c040b30fSLawrence D'Anna SBError SBDebugger::SetErrorFile(FileSP file_sp) { 376c040b30fSLawrence D'Anna LLDB_RECORD_METHOD(SBError, SBDebugger, SetErrorFile, (FileSP), file_sp); 377fe5ab6d2SJonas Devlieghere return LLDB_RECORD_RESULT(SetErrorFile(SBFile(file_sp))); 378c040b30fSLawrence D'Anna } 379c040b30fSLawrence D'Anna 38096898eb6SLawrence D'Anna SBError SBDebugger::SetErrorFile(SBFile file) { 38196898eb6SLawrence D'Anna LLDB_RECORD_METHOD(SBError, SBDebugger, SetErrorFile, (SBFile file), file); 38296898eb6SLawrence D'Anna SBError error; 38396898eb6SLawrence D'Anna if (!m_opaque_sp) { 38496898eb6SLawrence D'Anna error.ref().SetErrorString("invalid debugger"); 385fe5ab6d2SJonas Devlieghere return LLDB_RECORD_RESULT(error); 38696898eb6SLawrence D'Anna } 38796898eb6SLawrence D'Anna if (!file) { 38896898eb6SLawrence D'Anna error.ref().SetErrorString("invalid file"); 389fe5ab6d2SJonas Devlieghere return LLDB_RECORD_RESULT(error); 39096898eb6SLawrence D'Anna } 39196898eb6SLawrence D'Anna m_opaque_sp->SetErrorFile(file.m_opaque_sp); 392fe5ab6d2SJonas Devlieghere return LLDB_RECORD_RESULT(error); 39330fdc8d8SChris Lattner } 39430fdc8d8SChris Lattner 395b9c1b51eSKate Stone FILE *SBDebugger::GetInputFileHandle() { 396baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(FILE *, SBDebugger, GetInputFileHandle); 397b9c1b51eSKate Stone if (m_opaque_sp) { 3987ca15ba7SLawrence D'Anna File &file_sp = m_opaque_sp->GetInputFile(); 3997ca15ba7SLawrence D'Anna return LLDB_RECORD_RESULT(file_sp.GetStream()); 40044d93782SGreg Clayton } 401fe5ab6d2SJonas Devlieghere return LLDB_RECORD_RESULT(nullptr); 40230fdc8d8SChris Lattner } 40330fdc8d8SChris Lattner 40496898eb6SLawrence D'Anna SBFile SBDebugger::GetInputFile() { 40596898eb6SLawrence D'Anna LLDB_RECORD_METHOD_NO_ARGS(SBFile, SBDebugger, GetInputFile); 40696898eb6SLawrence D'Anna if (m_opaque_sp) { 40796898eb6SLawrence D'Anna return LLDB_RECORD_RESULT(SBFile(m_opaque_sp->GetInputFileSP())); 40896898eb6SLawrence D'Anna } 40996898eb6SLawrence D'Anna return LLDB_RECORD_RESULT(SBFile()); 41096898eb6SLawrence D'Anna } 41196898eb6SLawrence D'Anna 412b9c1b51eSKate Stone FILE *SBDebugger::GetOutputFileHandle() { 413baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(FILE *, SBDebugger, GetOutputFileHandle); 414b9c1b51eSKate Stone if (m_opaque_sp) { 4157ca15ba7SLawrence D'Anna StreamFile &stream_file = m_opaque_sp->GetOutputStream(); 4167ca15ba7SLawrence D'Anna return LLDB_RECORD_RESULT(stream_file.GetFile().GetStream()); 41744d93782SGreg Clayton } 418fe5ab6d2SJonas Devlieghere return LLDB_RECORD_RESULT(nullptr); 41930fdc8d8SChris Lattner } 42030fdc8d8SChris Lattner 42196898eb6SLawrence D'Anna SBFile SBDebugger::GetOutputFile() { 42296898eb6SLawrence D'Anna LLDB_RECORD_METHOD_NO_ARGS(SBFile, SBDebugger, GetOutputFile); 42396898eb6SLawrence D'Anna if (m_opaque_sp) { 42496898eb6SLawrence D'Anna SBFile file(m_opaque_sp->GetOutputStream().GetFileSP()); 42596898eb6SLawrence D'Anna return LLDB_RECORD_RESULT(file); 42696898eb6SLawrence D'Anna } 42796898eb6SLawrence D'Anna return LLDB_RECORD_RESULT(SBFile()); 42896898eb6SLawrence D'Anna } 42996898eb6SLawrence D'Anna 430b9c1b51eSKate Stone FILE *SBDebugger::GetErrorFileHandle() { 431baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(FILE *, SBDebugger, GetErrorFileHandle); 432baf5664fSJonas Devlieghere 433b9c1b51eSKate Stone if (m_opaque_sp) { 4347ca15ba7SLawrence D'Anna StreamFile &stream_file = m_opaque_sp->GetErrorStream(); 4357ca15ba7SLawrence D'Anna return LLDB_RECORD_RESULT(stream_file.GetFile().GetStream()); 43644d93782SGreg Clayton } 437fe5ab6d2SJonas Devlieghere return LLDB_RECORD_RESULT(nullptr); 43830fdc8d8SChris Lattner } 43930fdc8d8SChris Lattner 44096898eb6SLawrence D'Anna SBFile SBDebugger::GetErrorFile() { 44196898eb6SLawrence D'Anna LLDB_RECORD_METHOD_NO_ARGS(SBFile, SBDebugger, GetErrorFile); 44296898eb6SLawrence D'Anna SBFile file; 44396898eb6SLawrence D'Anna if (m_opaque_sp) { 44496898eb6SLawrence D'Anna SBFile file(m_opaque_sp->GetErrorStream().GetFileSP()); 44596898eb6SLawrence D'Anna return LLDB_RECORD_RESULT(file); 44696898eb6SLawrence D'Anna } 44796898eb6SLawrence D'Anna return LLDB_RECORD_RESULT(SBFile()); 44896898eb6SLawrence D'Anna } 44996898eb6SLawrence D'Anna 450b9c1b51eSKate Stone void SBDebugger::SaveInputTerminalState() { 451b328dcbfSJonas Devlieghere LLDB_RECORD_DUMMY_NO_ARGS(void, SBDebugger, SaveInputTerminalState); 452baf5664fSJonas Devlieghere 453c5917d9aSJim Ingham if (m_opaque_sp) 454c5917d9aSJim Ingham m_opaque_sp->SaveInputTerminalState(); 455c5917d9aSJim Ingham } 456c5917d9aSJim Ingham 457b9c1b51eSKate Stone void SBDebugger::RestoreInputTerminalState() { 458b328dcbfSJonas Devlieghere LLDB_RECORD_DUMMY_NO_ARGS(void, SBDebugger, RestoreInputTerminalState); 459baf5664fSJonas Devlieghere 460c5917d9aSJim Ingham if (m_opaque_sp) 461c5917d9aSJim Ingham m_opaque_sp->RestoreInputTerminalState(); 462c5917d9aSJim Ingham } 463b9c1b51eSKate Stone SBCommandInterpreter SBDebugger::GetCommandInterpreter() { 464baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::SBCommandInterpreter, SBDebugger, 465baf5664fSJonas Devlieghere GetCommandInterpreter); 466baf5664fSJonas Devlieghere 4676611103cSGreg Clayton SBCommandInterpreter sb_interpreter; 4686611103cSGreg Clayton if (m_opaque_sp) 4696611103cSGreg Clayton sb_interpreter.reset(&m_opaque_sp->GetCommandInterpreter()); 470ceb6b139SCaroline Tice 471baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_interpreter); 47230fdc8d8SChris Lattner } 47330fdc8d8SChris Lattner 474b9c1b51eSKate Stone void SBDebugger::HandleCommand(const char *command) { 475baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBDebugger, HandleCommand, (const char *), command); 476baf5664fSJonas Devlieghere 477b9c1b51eSKate Stone if (m_opaque_sp) { 478af67cecdSGreg Clayton TargetSP target_sp(m_opaque_sp->GetSelectedTarget()); 479bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 480af67cecdSGreg Clayton if (target_sp) 481bb19a13cSSaleem Abdulrasool lock = std::unique_lock<std::recursive_mutex>(target_sp->GetAPIMutex()); 482af67cecdSGreg Clayton 4836611103cSGreg Clayton SBCommandInterpreter sb_interpreter(GetCommandInterpreter()); 48430fdc8d8SChris Lattner SBCommandReturnObject result; 48530fdc8d8SChris Lattner 48630fdc8d8SChris Lattner sb_interpreter.HandleCommand(command, result, false); 48730fdc8d8SChris Lattner 4885da2bc22SLawrence D'Anna result.PutError(m_opaque_sp->GetErrorStream().GetFileSP()); 4895da2bc22SLawrence D'Anna result.PutOutput(m_opaque_sp->GetOutputStream().GetFileSP()); 49030fdc8d8SChris Lattner 491b9c1b51eSKate Stone if (!m_opaque_sp->GetAsyncExecution()) { 4926611103cSGreg Clayton SBProcess process(GetCommandInterpreter().GetProcess()); 493b9556accSGreg Clayton ProcessSP process_sp(process.GetSP()); 494b9c1b51eSKate Stone if (process_sp) { 49530fdc8d8SChris Lattner EventSP event_sp; 496583bbb1dSJim Ingham ListenerSP lldb_listener_sp = m_opaque_sp->GetListener(); 497d35031e1SPavel Labath while (lldb_listener_sp->GetEventForBroadcaster( 498d35031e1SPavel Labath process_sp.get(), event_sp, std::chrono::seconds(0))) { 49930fdc8d8SChris Lattner SBEvent event(event_sp); 500322f12afSLawrence D'Anna HandleProcessEvent(process, event, GetOutputFile(), GetErrorFile()); 50130fdc8d8SChris Lattner } 50230fdc8d8SChris Lattner } 50330fdc8d8SChris Lattner } 50430fdc8d8SChris Lattner } 5056611103cSGreg Clayton } 50630fdc8d8SChris Lattner 507b9c1b51eSKate Stone SBListener SBDebugger::GetListener() { 508baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::SBListener, SBDebugger, GetListener); 509baf5664fSJonas Devlieghere 5106611103cSGreg Clayton SBListener sb_listener; 5116611103cSGreg Clayton if (m_opaque_sp) 512583bbb1dSJim Ingham sb_listener.reset(m_opaque_sp->GetListener()); 513ceb6b139SCaroline Tice 514baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_listener); 51530fdc8d8SChris Lattner } 51630fdc8d8SChris Lattner 517b9c1b51eSKate Stone void SBDebugger::HandleProcessEvent(const SBProcess &process, 518322f12afSLawrence D'Anna const SBEvent &event, SBFile out, 519322f12afSLawrence D'Anna SBFile err) { 520322f12afSLawrence D'Anna LLDB_RECORD_METHOD( 521322f12afSLawrence D'Anna void, SBDebugger, HandleProcessEvent, 522322f12afSLawrence D'Anna (const lldb::SBProcess &, const lldb::SBEvent &, SBFile, SBFile), process, 523322f12afSLawrence D'Anna event, out, err); 524322f12afSLawrence D'Anna 525322f12afSLawrence D'Anna return HandleProcessEvent(process, event, out.m_opaque_sp, err.m_opaque_sp); 526322f12afSLawrence D'Anna } 527322f12afSLawrence D'Anna 528322f12afSLawrence D'Anna void SBDebugger::HandleProcessEvent(const SBProcess &process, 529b9c1b51eSKate Stone const SBEvent &event, FILE *out, 530b9c1b51eSKate Stone FILE *err) { 531baf5664fSJonas Devlieghere LLDB_RECORD_METHOD( 532baf5664fSJonas Devlieghere void, SBDebugger, HandleProcessEvent, 533baf5664fSJonas Devlieghere (const lldb::SBProcess &, const lldb::SBEvent &, FILE *, FILE *), process, 534baf5664fSJonas Devlieghere event, out, err); 535baf5664fSJonas Devlieghere 536322f12afSLawrence D'Anna FileSP outfile = std::make_shared<NativeFile>(out, false); 537322f12afSLawrence D'Anna FileSP errfile = std::make_shared<NativeFile>(err, false); 538322f12afSLawrence D'Anna return HandleProcessEvent(process, event, outfile, errfile); 539322f12afSLawrence D'Anna } 540322f12afSLawrence D'Anna 541322f12afSLawrence D'Anna void SBDebugger::HandleProcessEvent(const SBProcess &process, 542322f12afSLawrence D'Anna const SBEvent &event, FileSP out_sp, 543322f12afSLawrence D'Anna FileSP err_sp) { 544322f12afSLawrence D'Anna 545322f12afSLawrence D'Anna LLDB_RECORD_METHOD( 546322f12afSLawrence D'Anna void, SBDebugger, HandleProcessEvent, 547322f12afSLawrence D'Anna (const lldb::SBProcess &, const lldb::SBEvent &, FileSP, FileSP), process, 548322f12afSLawrence D'Anna event, out_sp, err_sp); 549322f12afSLawrence D'Anna 550af67cecdSGreg Clayton if (!process.IsValid()) 551af67cecdSGreg Clayton return; 552af67cecdSGreg Clayton 553b9556accSGreg Clayton TargetSP target_sp(process.GetTarget().GetSP()); 554b9556accSGreg Clayton if (!target_sp) 555b9556accSGreg Clayton return; 556b9556accSGreg Clayton 55730fdc8d8SChris Lattner const uint32_t event_type = event.GetType(); 55830fdc8d8SChris Lattner char stdio_buffer[1024]; 55930fdc8d8SChris Lattner size_t len; 56030fdc8d8SChris Lattner 561bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 562af67cecdSGreg Clayton 563b9c1b51eSKate Stone if (event_type & 564b9c1b51eSKate Stone (Process::eBroadcastBitSTDOUT | Process::eBroadcastBitStateChanged)) { 565af67cecdSGreg Clayton // Drain stdout when we stop just in case we have any bytes 56630fdc8d8SChris Lattner while ((len = process.GetSTDOUT(stdio_buffer, sizeof(stdio_buffer))) > 0) 567322f12afSLawrence D'Anna if (out_sp) 568322f12afSLawrence D'Anna out_sp->Write(stdio_buffer, len); 56930fdc8d8SChris Lattner } 570af67cecdSGreg Clayton 571b9c1b51eSKate Stone if (event_type & 572b9c1b51eSKate Stone (Process::eBroadcastBitSTDERR | Process::eBroadcastBitStateChanged)) { 573af67cecdSGreg Clayton // Drain stderr when we stop just in case we have any bytes 57430fdc8d8SChris Lattner while ((len = process.GetSTDERR(stdio_buffer, sizeof(stdio_buffer))) > 0) 575322f12afSLawrence D'Anna if (err_sp) 576322f12afSLawrence D'Anna err_sp->Write(stdio_buffer, len); 57730fdc8d8SChris Lattner } 578af67cecdSGreg Clayton 579b9c1b51eSKate Stone if (event_type & Process::eBroadcastBitStateChanged) { 58030fdc8d8SChris Lattner StateType event_state = SBProcess::GetStateFromEvent(event); 58130fdc8d8SChris Lattner 58230fdc8d8SChris Lattner if (event_state == eStateInvalid) 58330fdc8d8SChris Lattner return; 58430fdc8d8SChris Lattner 58530fdc8d8SChris Lattner bool is_stopped = StateIsStoppedState(event_state); 58630fdc8d8SChris Lattner if (!is_stopped) 587322f12afSLawrence D'Anna process.ReportEventState(event, out_sp); 58830fdc8d8SChris Lattner } 58930fdc8d8SChris Lattner } 59030fdc8d8SChris Lattner 591b9c1b51eSKate Stone SBSourceManager SBDebugger::GetSourceManager() { 592baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::SBSourceManager, SBDebugger, 593baf5664fSJonas Devlieghere GetSourceManager); 594baf5664fSJonas Devlieghere 595e37d605eSJim Ingham SBSourceManager sb_source_manager(*this); 596baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_source_manager); 59730fdc8d8SChris Lattner } 59830fdc8d8SChris Lattner 599b9c1b51eSKate Stone bool SBDebugger::GetDefaultArchitecture(char *arch_name, size_t arch_name_len) { 600e687aa82SJonas Devlieghere LLDB_RECORD_CHAR_PTR_STATIC_METHOD(bool, SBDebugger, GetDefaultArchitecture, 601e687aa82SJonas Devlieghere (char *, size_t), arch_name, "", 602e687aa82SJonas Devlieghere arch_name_len); 603baf5664fSJonas Devlieghere 604b9c1b51eSKate Stone if (arch_name && arch_name_len) { 605431ce678SGreg Clayton ArchSpec default_arch = Target::GetDefaultArchitecture(); 606daccaa9eSCaroline Tice 607b9c1b51eSKate Stone if (default_arch.IsValid()) { 608431ce678SGreg Clayton const std::string &triple_str = default_arch.GetTriple().str(); 609431ce678SGreg Clayton if (!triple_str.empty()) 610431ce678SGreg Clayton ::snprintf(arch_name, arch_name_len, "%s", triple_str.c_str()); 611431ce678SGreg Clayton else 612b9c1b51eSKate Stone ::snprintf(arch_name, arch_name_len, "%s", 613b9c1b51eSKate Stone default_arch.GetArchitectureName()); 61430fdc8d8SChris Lattner return true; 61530fdc8d8SChris Lattner } 61630fdc8d8SChris Lattner } 61730fdc8d8SChris Lattner if (arch_name && arch_name_len) 61830fdc8d8SChris Lattner arch_name[0] = '\0'; 61930fdc8d8SChris Lattner return false; 62030fdc8d8SChris Lattner } 62130fdc8d8SChris Lattner 622b9c1b51eSKate Stone bool SBDebugger::SetDefaultArchitecture(const char *arch_name) { 623baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD(bool, SBDebugger, SetDefaultArchitecture, 624baf5664fSJonas Devlieghere (const char *), arch_name); 625baf5664fSJonas Devlieghere 626b9c1b51eSKate Stone if (arch_name) { 62770512317SGreg Clayton ArchSpec arch(arch_name); 628b9c1b51eSKate Stone if (arch.IsValid()) { 629431ce678SGreg Clayton Target::SetDefaultArchitecture(arch); 63030fdc8d8SChris Lattner return true; 63130fdc8d8SChris Lattner } 63230fdc8d8SChris Lattner } 63330fdc8d8SChris Lattner return false; 63430fdc8d8SChris Lattner } 63530fdc8d8SChris Lattner 63630fdc8d8SChris Lattner ScriptLanguage 637b9c1b51eSKate Stone SBDebugger::GetScriptingLanguage(const char *script_language_name) { 638baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::ScriptLanguage, SBDebugger, GetScriptingLanguage, 639baf5664fSJonas Devlieghere (const char *), script_language_name); 640baf5664fSJonas Devlieghere 641d9aec34bSJonas Devlieghere if (!script_language_name) 642d9aec34bSJonas Devlieghere return eScriptLanguageDefault; 64347cbf4a0SPavel Labath return OptionArgParser::ToScriptLanguage( 64447cbf4a0SPavel Labath llvm::StringRef(script_language_name), eScriptLanguageDefault, nullptr); 64530fdc8d8SChris Lattner } 64630fdc8d8SChris Lattner 647b9c1b51eSKate Stone const char *SBDebugger::GetVersionString() { 648baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD_NO_ARGS(const char *, SBDebugger, GetVersionString); 649baf5664fSJonas Devlieghere 650b2f1fb29SVirgile Bello return lldb_private::GetVersion(); 65130fdc8d8SChris Lattner } 65230fdc8d8SChris Lattner 653b9c1b51eSKate Stone const char *SBDebugger::StateAsCString(StateType state) { 654baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD(const char *, SBDebugger, StateAsCString, 655baf5664fSJonas Devlieghere (lldb::StateType), state); 656baf5664fSJonas Devlieghere 657c2bbb49aSCaroline Tice return lldb_private::StateAsCString(state); 65830fdc8d8SChris Lattner } 65930fdc8d8SChris Lattner 660f1389e92SPavel Labath static void AddBoolConfigEntry(StructuredData::Dictionary &dict, 661f1389e92SPavel Labath llvm::StringRef name, bool value, 662f1389e92SPavel Labath llvm::StringRef description) { 663a8f3ae7cSJonas Devlieghere auto entry_up = std::make_unique<StructuredData::Dictionary>(); 664f1389e92SPavel Labath entry_up->AddBooleanItem("value", value); 665f1389e92SPavel Labath entry_up->AddStringItem("description", description); 666f1389e92SPavel Labath dict.AddItem(name, std::move(entry_up)); 667f1389e92SPavel Labath } 668f1389e92SPavel Labath 669abc0c6adSPavel Labath static void AddLLVMTargets(StructuredData::Dictionary &dict) { 670a8f3ae7cSJonas Devlieghere auto array_up = std::make_unique<StructuredData::Array>(); 671abc0c6adSPavel Labath #define LLVM_TARGET(target) \ 672a8f3ae7cSJonas Devlieghere array_up->AddItem(std::make_unique<StructuredData::String>(#target)); 673abc0c6adSPavel Labath #include "llvm/Config/Targets.def" 674a8f3ae7cSJonas Devlieghere auto entry_up = std::make_unique<StructuredData::Dictionary>(); 675abc0c6adSPavel Labath entry_up->AddItem("value", std::move(array_up)); 676abc0c6adSPavel Labath entry_up->AddStringItem("description", "A list of configured LLVM targets."); 677abc0c6adSPavel Labath dict.AddItem("targets", std::move(entry_up)); 678abc0c6adSPavel Labath } 679abc0c6adSPavel Labath 680f1389e92SPavel Labath SBStructuredData SBDebugger::GetBuildConfiguration() { 681baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD_NO_ARGS(lldb::SBStructuredData, SBDebugger, 682baf5664fSJonas Devlieghere GetBuildConfiguration); 683baf5664fSJonas Devlieghere 684a8f3ae7cSJonas Devlieghere auto config_up = std::make_unique<StructuredData::Dictionary>(); 685f1389e92SPavel Labath AddBoolConfigEntry( 686f1389e92SPavel Labath *config_up, "xml", XMLDocument::XMLEnabled(), 687f1389e92SPavel Labath "A boolean value that indicates if XML support is enabled in LLDB"); 688eafede2aSPavel Labath AddBoolConfigEntry( 689a4304f96SJonas Devlieghere *config_up, "curses", LLDB_ENABLE_CURSES, 690eafede2aSPavel Labath "A boolean value that indicates if curses support is enabled in LLDB"); 6916cc3ee17SJonas Devlieghere AddBoolConfigEntry( 6926cc3ee17SJonas Devlieghere *config_up, "editline", LLDB_ENABLE_LIBEDIT, 6936cc3ee17SJonas Devlieghere "A boolean value that indicates if editline support is enabled in LLDB"); 6946cc3ee17SJonas Devlieghere AddBoolConfigEntry( 6956cc3ee17SJonas Devlieghere *config_up, "lzma", LLDB_ENABLE_LZMA, 6966cc3ee17SJonas Devlieghere "A boolean value that indicates if lzma support is enabled in LLDB"); 6976cc3ee17SJonas Devlieghere AddBoolConfigEntry( 6986cc3ee17SJonas Devlieghere *config_up, "python", LLDB_ENABLE_PYTHON, 6996cc3ee17SJonas Devlieghere "A boolean value that indicates if python support is enabled in LLDB"); 7006cc3ee17SJonas Devlieghere AddBoolConfigEntry( 7016cc3ee17SJonas Devlieghere *config_up, "lua", LLDB_ENABLE_LUA, 7026cc3ee17SJonas Devlieghere "A boolean value that indicates if lua support is enabled in LLDB"); 703abc0c6adSPavel Labath AddLLVMTargets(*config_up); 704f1389e92SPavel Labath 705f1389e92SPavel Labath SBStructuredData data; 706f1389e92SPavel Labath data.m_impl_up->SetObjectSP(std::move(config_up)); 707baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(data); 708f1389e92SPavel Labath } 709f1389e92SPavel Labath 710b9c1b51eSKate Stone bool SBDebugger::StateIsRunningState(StateType state) { 711baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD(bool, SBDebugger, StateIsRunningState, 712baf5664fSJonas Devlieghere (lldb::StateType), state); 713baf5664fSJonas Devlieghere 714c2bbb49aSCaroline Tice const bool result = lldb_private::StateIsRunningState(state); 7154838131bSGreg Clayton 7164838131bSGreg Clayton return result; 71730fdc8d8SChris Lattner } 71830fdc8d8SChris Lattner 719b9c1b51eSKate Stone bool SBDebugger::StateIsStoppedState(StateType state) { 720baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD(bool, SBDebugger, StateIsStoppedState, 721baf5664fSJonas Devlieghere (lldb::StateType), state); 722baf5664fSJonas Devlieghere 7232637f825SGreg Clayton const bool result = lldb_private::StateIsStoppedState(state, false); 724ceb6b139SCaroline Tice 7254838131bSGreg Clayton return result; 72630fdc8d8SChris Lattner } 72730fdc8d8SChris Lattner 728b9c1b51eSKate Stone lldb::SBTarget SBDebugger::CreateTarget(const char *filename, 729cac9c5f9SGreg Clayton const char *target_triple, 730cac9c5f9SGreg Clayton const char *platform_name, 731cac9c5f9SGreg Clayton bool add_dependent_modules, 732b9c1b51eSKate Stone lldb::SBError &sb_error) { 733baf5664fSJonas Devlieghere LLDB_RECORD_METHOD( 734baf5664fSJonas Devlieghere lldb::SBTarget, SBDebugger, CreateTarget, 735baf5664fSJonas Devlieghere (const char *, const char *, const char *, bool, lldb::SBError &), 736baf5664fSJonas Devlieghere filename, target_triple, platform_name, add_dependent_modules, sb_error); 737baf5664fSJonas Devlieghere 738cac9c5f9SGreg Clayton SBTarget sb_target; 739b9556accSGreg Clayton TargetSP target_sp; 740b9c1b51eSKate Stone if (m_opaque_sp) { 741cac9c5f9SGreg Clayton sb_error.Clear(); 742cac9c5f9SGreg Clayton OptionGroupPlatform platform_options(false); 743cac9c5f9SGreg Clayton platform_options.SetPlatformName(platform_name); 744cac9c5f9SGreg Clayton 745b9c1b51eSKate Stone sb_error.ref() = m_opaque_sp->GetTargetList().CreateTarget( 746f9a07e9fSJonas Devlieghere *m_opaque_sp, filename, target_triple, 747f9a07e9fSJonas Devlieghere add_dependent_modules ? eLoadDependentsYes : eLoadDependentsNo, 748b9c1b51eSKate Stone &platform_options, target_sp); 749cac9c5f9SGreg Clayton 750cac9c5f9SGreg Clayton if (sb_error.Success()) 751b9556accSGreg Clayton sb_target.SetSP(target_sp); 752b9c1b51eSKate Stone } else { 7539f521f22SJim Ingham sb_error.SetErrorString("invalid debugger"); 754cac9c5f9SGreg Clayton } 755cac9c5f9SGreg Clayton 7565160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 75763e5fb76SJonas Devlieghere LLDB_LOGF(log, 75863e5fb76SJonas Devlieghere "SBDebugger(%p)::CreateTarget (filename=\"%s\", triple=%s, " 759b9c1b51eSKate Stone "platform_name=%s, add_dependent_modules=%u, error=%s) => " 760b9c1b51eSKate Stone "SBTarget(%p)", 761b9c1b51eSKate Stone static_cast<void *>(m_opaque_sp.get()), filename, target_triple, 762b9c1b51eSKate Stone platform_name, add_dependent_modules, sb_error.GetCString(), 763b9c1b51eSKate Stone static_cast<void *>(target_sp.get())); 764cac9c5f9SGreg Clayton 765baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_target); 766cac9c5f9SGreg Clayton } 76730fdc8d8SChris Lattner 76830fdc8d8SChris Lattner SBTarget 76930fdc8d8SChris Lattner SBDebugger::CreateTargetWithFileAndTargetTriple(const char *filename, 770b9c1b51eSKate Stone const char *target_triple) { 771baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBTarget, SBDebugger, 772baf5664fSJonas Devlieghere CreateTargetWithFileAndTargetTriple, 773baf5664fSJonas Devlieghere (const char *, const char *), filename, target_triple); 774baf5664fSJonas Devlieghere 775b9556accSGreg Clayton SBTarget sb_target; 776b9556accSGreg Clayton TargetSP target_sp; 777b9c1b51eSKate Stone if (m_opaque_sp) { 778cac9c5f9SGreg Clayton const bool add_dependent_modules = true; 77997206d57SZachary Turner Status error(m_opaque_sp->GetTargetList().CreateTarget( 780f9a07e9fSJonas Devlieghere *m_opaque_sp, filename, target_triple, 781f9a07e9fSJonas Devlieghere add_dependent_modules ? eLoadDependentsYes : eLoadDependentsNo, nullptr, 782cac9c5f9SGreg Clayton target_sp)); 783b9556accSGreg Clayton sb_target.SetSP(target_sp); 7846611103cSGreg Clayton } 7854838131bSGreg Clayton 7865160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 78763e5fb76SJonas Devlieghere LLDB_LOGF(log, 78863e5fb76SJonas Devlieghere "SBDebugger(%p)::CreateTargetWithFileAndTargetTriple " 789b9c1b51eSKate Stone "(filename=\"%s\", triple=%s) => SBTarget(%p)", 790b9c1b51eSKate Stone static_cast<void *>(m_opaque_sp.get()), filename, target_triple, 791b9c1b51eSKate Stone static_cast<void *>(target_sp.get())); 7924838131bSGreg Clayton 793baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_target); 79430fdc8d8SChris Lattner } 79530fdc8d8SChris Lattner 796b9c1b51eSKate Stone SBTarget SBDebugger::CreateTargetWithFileAndArch(const char *filename, 797b9c1b51eSKate Stone const char *arch_cstr) { 798baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBTarget, SBDebugger, CreateTargetWithFileAndArch, 799baf5664fSJonas Devlieghere (const char *, const char *), filename, arch_cstr); 800baf5664fSJonas Devlieghere 8015160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 802ceb6b139SCaroline Tice 803b9556accSGreg Clayton SBTarget sb_target; 804b9556accSGreg Clayton TargetSP target_sp; 805b9c1b51eSKate Stone if (m_opaque_sp) { 80697206d57SZachary Turner Status error; 807cac9c5f9SGreg Clayton const bool add_dependent_modules = true; 80830fdc8d8SChris Lattner 809b9c1b51eSKate Stone error = m_opaque_sp->GetTargetList().CreateTarget( 810f9a07e9fSJonas Devlieghere *m_opaque_sp, filename, arch_cstr, 811f9a07e9fSJonas Devlieghere add_dependent_modules ? eLoadDependentsYes : eLoadDependentsNo, nullptr, 812cac9c5f9SGreg Clayton target_sp); 81330fdc8d8SChris Lattner 814b9c1b51eSKate Stone if (error.Success()) { 8152976d00aSJim Ingham m_opaque_sp->GetTargetList().SetSelectedTarget(target_sp.get()); 816b9556accSGreg Clayton sb_target.SetSP(target_sp); 8176611103cSGreg Clayton } 8186611103cSGreg Clayton } 819ceb6b139SCaroline Tice 82063e5fb76SJonas Devlieghere LLDB_LOGF(log, 82163e5fb76SJonas Devlieghere "SBDebugger(%p)::CreateTargetWithFileAndArch (filename=\"%s\", " 822b9c1b51eSKate Stone "arch=%s) => SBTarget(%p)", 823324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get()), filename, arch_cstr, 824324a1036SSaleem Abdulrasool static_cast<void *>(target_sp.get())); 825ceb6b139SCaroline Tice 826baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_target); 82730fdc8d8SChris Lattner } 82830fdc8d8SChris Lattner 829b9c1b51eSKate Stone SBTarget SBDebugger::CreateTarget(const char *filename) { 830baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBTarget, SBDebugger, CreateTarget, (const char *), 831baf5664fSJonas Devlieghere filename); 832baf5664fSJonas Devlieghere 833b9556accSGreg Clayton SBTarget sb_target; 834b9556accSGreg Clayton TargetSP target_sp; 835b9c1b51eSKate Stone if (m_opaque_sp) { 83697206d57SZachary Turner Status error; 837cac9c5f9SGreg Clayton const bool add_dependent_modules = true; 838b9c1b51eSKate Stone error = m_opaque_sp->GetTargetList().CreateTarget( 839f9a07e9fSJonas Devlieghere *m_opaque_sp, filename, "", 840f9a07e9fSJonas Devlieghere add_dependent_modules ? eLoadDependentsYes : eLoadDependentsNo, nullptr, 841f9a07e9fSJonas Devlieghere target_sp); 84230fdc8d8SChris Lattner 843b9c1b51eSKate Stone if (error.Success()) { 8442976d00aSJim Ingham m_opaque_sp->GetTargetList().SetSelectedTarget(target_sp.get()); 845b9556accSGreg Clayton sb_target.SetSP(target_sp); 8466611103cSGreg Clayton } 8476611103cSGreg Clayton } 8485160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 84963e5fb76SJonas Devlieghere LLDB_LOGF(log, 850b9c1b51eSKate Stone "SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)", 851324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get()), filename, 852324a1036SSaleem Abdulrasool static_cast<void *>(target_sp.get())); 853baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_target); 85430fdc8d8SChris Lattner } 85530fdc8d8SChris Lattner 856b842f2ecSJim Ingham SBTarget SBDebugger::GetDummyTarget() { 857baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::SBTarget, SBDebugger, GetDummyTarget); 858baf5664fSJonas Devlieghere 859b842f2ecSJim Ingham SBTarget sb_target; 860b842f2ecSJim Ingham if (m_opaque_sp) { 861b842f2ecSJim Ingham sb_target.SetSP(m_opaque_sp->GetDummyTarget()->shared_from_this()); 862b842f2ecSJim Ingham } 863b842f2ecSJim Ingham Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 86463e5fb76SJonas Devlieghere LLDB_LOGF(log, "SBDebugger(%p)::GetDummyTarget() => SBTarget(%p)", 865b842f2ecSJim Ingham static_cast<void *>(m_opaque_sp.get()), 866b842f2ecSJim Ingham static_cast<void *>(sb_target.GetSP().get())); 867baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_target); 868b842f2ecSJim Ingham } 869b842f2ecSJim Ingham 870b9c1b51eSKate Stone bool SBDebugger::DeleteTarget(lldb::SBTarget &target) { 871baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBDebugger, DeleteTarget, (lldb::SBTarget &), 872baf5664fSJonas Devlieghere target); 873baf5664fSJonas Devlieghere 8743794ad95SJohnny Chen bool result = false; 875b9c1b51eSKate Stone if (m_opaque_sp) { 876b9556accSGreg Clayton TargetSP target_sp(target.GetSP()); 877b9c1b51eSKate Stone if (target_sp) { 8783794ad95SJohnny Chen // No need to lock, the target list is thread safe 879b9556accSGreg Clayton result = m_opaque_sp->GetTargetList().DeleteTarget(target_sp); 880b9556accSGreg Clayton target_sp->Destroy(); 88175340622SGreg Clayton target.Clear(); 8820cd70866SGreg Clayton const bool mandatory = true; 8830cd70866SGreg Clayton ModuleList::RemoveOrphanSharedModules(mandatory); 8843794ad95SJohnny Chen } 885b9556accSGreg Clayton } 8863794ad95SJohnny Chen 8875160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 88863e5fb76SJonas Devlieghere LLDB_LOGF(log, "SBDebugger(%p)::DeleteTarget (SBTarget(%p)) => %i", 889324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get()), 890324a1036SSaleem Abdulrasool static_cast<void *>(target.m_opaque_sp.get()), result); 8913794ad95SJohnny Chen 8923794ad95SJohnny Chen return result; 8933794ad95SJohnny Chen } 894dbb0abbfSEugene Zelenko 895b9c1b51eSKate Stone SBTarget SBDebugger::GetTargetAtIndex(uint32_t idx) { 896baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBTarget, SBDebugger, GetTargetAtIndex, (uint32_t), 897baf5664fSJonas Devlieghere idx); 898baf5664fSJonas Devlieghere 8996611103cSGreg Clayton SBTarget sb_target; 900b9c1b51eSKate Stone if (m_opaque_sp) { 901af67cecdSGreg Clayton // No need to lock, the target list is thread safe 902b9556accSGreg Clayton sb_target.SetSP(m_opaque_sp->GetTargetList().GetTargetAtIndex(idx)); 903af67cecdSGreg Clayton } 904baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_target); 90530fdc8d8SChris Lattner } 90630fdc8d8SChris Lattner 907b9c1b51eSKate Stone uint32_t SBDebugger::GetIndexOfTarget(lldb::SBTarget target) { 908baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(uint32_t, SBDebugger, GetIndexOfTarget, (lldb::SBTarget), 909baf5664fSJonas Devlieghere target); 9108499e1a4SJim Ingham 9118499e1a4SJim Ingham lldb::TargetSP target_sp = target.GetSP(); 9128499e1a4SJim Ingham if (!target_sp) 9138499e1a4SJim Ingham return UINT32_MAX; 9148499e1a4SJim Ingham 9158499e1a4SJim Ingham if (!m_opaque_sp) 9168499e1a4SJim Ingham return UINT32_MAX; 9178499e1a4SJim Ingham 9188499e1a4SJim Ingham return m_opaque_sp->GetTargetList().GetIndexOfTarget(target.GetSP()); 9198499e1a4SJim Ingham } 9208499e1a4SJim Ingham 921b9c1b51eSKate Stone SBTarget SBDebugger::FindTargetWithProcessID(lldb::pid_t pid) { 922baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBTarget, SBDebugger, FindTargetWithProcessID, 923baf5664fSJonas Devlieghere (lldb::pid_t), pid); 924baf5664fSJonas Devlieghere 9256611103cSGreg Clayton SBTarget sb_target; 926b9c1b51eSKate Stone if (m_opaque_sp) { 927af67cecdSGreg Clayton // No need to lock, the target list is thread safe 928b9556accSGreg Clayton sb_target.SetSP(m_opaque_sp->GetTargetList().FindTargetWithProcessID(pid)); 929af67cecdSGreg Clayton } 930baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_target); 93130fdc8d8SChris Lattner } 93230fdc8d8SChris Lattner 933b9c1b51eSKate Stone SBTarget SBDebugger::FindTargetWithFileAndArch(const char *filename, 934b9c1b51eSKate Stone const char *arch_name) { 935baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBTarget, SBDebugger, FindTargetWithFileAndArch, 936baf5664fSJonas Devlieghere (const char *, const char *), filename, arch_name); 937baf5664fSJonas Devlieghere 9386611103cSGreg Clayton SBTarget sb_target; 939b9c1b51eSKate Stone if (m_opaque_sp && filename && filename[0]) { 940af67cecdSGreg Clayton // No need to lock, the target list is thread safe 9417263f1bdSPavel Labath ArchSpec arch = Platform::GetAugmentedArchSpec( 9427263f1bdSPavel Labath m_opaque_sp->GetPlatformList().GetSelectedPlatform().get(), arch_name); 943b9c1b51eSKate Stone TargetSP target_sp( 944b9c1b51eSKate Stone m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture( 9458f3be7a3SJonas Devlieghere FileSpec(filename), arch_name ? &arch : nullptr)); 946b9556accSGreg Clayton sb_target.SetSP(target_sp); 9476611103cSGreg Clayton } 948baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_target); 94930fdc8d8SChris Lattner } 95030fdc8d8SChris Lattner 951b9c1b51eSKate Stone SBTarget SBDebugger::FindTargetWithLLDBProcess(const ProcessSP &process_sp) { 9526611103cSGreg Clayton SBTarget sb_target; 953b9c1b51eSKate Stone if (m_opaque_sp) { 954af67cecdSGreg Clayton // No need to lock, the target list is thread safe 955b9c1b51eSKate Stone sb_target.SetSP( 956b9c1b51eSKate Stone m_opaque_sp->GetTargetList().FindTargetWithProcess(process_sp.get())); 957af67cecdSGreg Clayton } 95830fdc8d8SChris Lattner return sb_target; 95930fdc8d8SChris Lattner } 96030fdc8d8SChris Lattner 961b9c1b51eSKate Stone uint32_t SBDebugger::GetNumTargets() { 962baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBDebugger, GetNumTargets); 963baf5664fSJonas Devlieghere 964b9c1b51eSKate Stone if (m_opaque_sp) { 965af67cecdSGreg Clayton // No need to lock, the target list is thread safe 9666611103cSGreg Clayton return m_opaque_sp->GetTargetList().GetNumTargets(); 967af67cecdSGreg Clayton } 9686611103cSGreg Clayton return 0; 9696611103cSGreg Clayton } 97030fdc8d8SChris Lattner 971b9c1b51eSKate Stone SBTarget SBDebugger::GetSelectedTarget() { 972baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::SBTarget, SBDebugger, GetSelectedTarget); 973baf5664fSJonas Devlieghere 9745160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 975ceb6b139SCaroline Tice 9766611103cSGreg Clayton SBTarget sb_target; 977b9556accSGreg Clayton TargetSP target_sp; 978b9c1b51eSKate Stone if (m_opaque_sp) { 979af67cecdSGreg Clayton // No need to lock, the target list is thread safe 980b9556accSGreg Clayton target_sp = m_opaque_sp->GetTargetList().GetSelectedTarget(); 981b9556accSGreg Clayton sb_target.SetSP(target_sp); 982af67cecdSGreg Clayton } 983ceb6b139SCaroline Tice 984b9c1b51eSKate Stone if (log) { 985ceb6b139SCaroline Tice SBStream sstr; 986431ce678SGreg Clayton sb_target.GetDescription(sstr, eDescriptionLevelBrief); 98763e5fb76SJonas Devlieghere LLDB_LOGF(log, "SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s", 988324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get()), 989324a1036SSaleem Abdulrasool static_cast<void *>(target_sp.get()), sstr.GetData()); 990ceb6b139SCaroline Tice } 991ceb6b139SCaroline Tice 992baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_target); 99330fdc8d8SChris Lattner } 99430fdc8d8SChris Lattner 995b9c1b51eSKate Stone void SBDebugger::SetSelectedTarget(SBTarget &sb_target) { 996baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBDebugger, SetSelectedTarget, (lldb::SBTarget &), 997baf5664fSJonas Devlieghere sb_target); 998baf5664fSJonas Devlieghere 9995160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1000e64f0dc7SJim Ingham 1001b9556accSGreg Clayton TargetSP target_sp(sb_target.GetSP()); 1002b9c1b51eSKate Stone if (m_opaque_sp) { 1003b9556accSGreg Clayton m_opaque_sp->GetTargetList().SetSelectedTarget(target_sp.get()); 1004e64f0dc7SJim Ingham } 1005b9c1b51eSKate Stone if (log) { 1006e64f0dc7SJim Ingham SBStream sstr; 1007e64f0dc7SJim Ingham sb_target.GetDescription(sstr, eDescriptionLevelBrief); 100863e5fb76SJonas Devlieghere LLDB_LOGF(log, "SBDebugger(%p)::SetSelectedTarget () => SBTarget(%p): %s", 1009324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get()), 1010324a1036SSaleem Abdulrasool static_cast<void *>(target_sp.get()), sstr.GetData()); 1011e64f0dc7SJim Ingham } 1012e64f0dc7SJim Ingham } 1013e64f0dc7SJim Ingham 1014b9c1b51eSKate Stone SBPlatform SBDebugger::GetSelectedPlatform() { 1015baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::SBPlatform, SBDebugger, GetSelectedPlatform); 1016baf5664fSJonas Devlieghere 1017fbb76349SGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1018fbb76349SGreg Clayton 1019fbb76349SGreg Clayton SBPlatform sb_platform; 1020fbb76349SGreg Clayton DebuggerSP debugger_sp(m_opaque_sp); 1021b9c1b51eSKate Stone if (debugger_sp) { 1022fbb76349SGreg Clayton sb_platform.SetSP(debugger_sp->GetPlatformList().GetSelectedPlatform()); 1023fbb76349SGreg Clayton } 102463e5fb76SJonas Devlieghere LLDB_LOGF(log, "SBDebugger(%p)::GetSelectedPlatform () => SBPlatform(%p): %s", 1025324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get()), 1026324a1036SSaleem Abdulrasool static_cast<void *>(sb_platform.GetSP().get()), 1027324a1036SSaleem Abdulrasool sb_platform.GetName()); 1028baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_platform); 1029fbb76349SGreg Clayton } 1030fbb76349SGreg Clayton 1031b9c1b51eSKate Stone void SBDebugger::SetSelectedPlatform(SBPlatform &sb_platform) { 1032baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBDebugger, SetSelectedPlatform, 1033baf5664fSJonas Devlieghere (lldb::SBPlatform &), sb_platform); 1034baf5664fSJonas Devlieghere 1035fbb76349SGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1036fbb76349SGreg Clayton 1037fbb76349SGreg Clayton DebuggerSP debugger_sp(m_opaque_sp); 1038b9c1b51eSKate Stone if (debugger_sp) { 1039fbb76349SGreg Clayton debugger_sp->GetPlatformList().SetSelectedPlatform(sb_platform.GetSP()); 1040fbb76349SGreg Clayton } 1041324a1036SSaleem Abdulrasool 104263e5fb76SJonas Devlieghere LLDB_LOGF(log, "SBDebugger(%p)::SetSelectedPlatform (SBPlatform(%p) %s)", 1043324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get()), 1044324a1036SSaleem Abdulrasool static_cast<void *>(sb_platform.GetSP().get()), 1045324a1036SSaleem Abdulrasool sb_platform.GetName()); 1046fbb76349SGreg Clayton } 1047fbb76349SGreg Clayton 1048c10e34d0SVadim Macagon uint32_t SBDebugger::GetNumPlatforms() { 1049baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBDebugger, GetNumPlatforms); 1050baf5664fSJonas Devlieghere 1051c10e34d0SVadim Macagon if (m_opaque_sp) { 1052c10e34d0SVadim Macagon // No need to lock, the platform list is thread safe 1053c10e34d0SVadim Macagon return m_opaque_sp->GetPlatformList().GetSize(); 1054c10e34d0SVadim Macagon } 1055c10e34d0SVadim Macagon return 0; 1056c10e34d0SVadim Macagon } 1057c10e34d0SVadim Macagon 1058c10e34d0SVadim Macagon SBPlatform SBDebugger::GetPlatformAtIndex(uint32_t idx) { 1059baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBPlatform, SBDebugger, GetPlatformAtIndex, 1060baf5664fSJonas Devlieghere (uint32_t), idx); 1061baf5664fSJonas Devlieghere 1062c10e34d0SVadim Macagon SBPlatform sb_platform; 1063c10e34d0SVadim Macagon if (m_opaque_sp) { 1064c10e34d0SVadim Macagon // No need to lock, the platform list is thread safe 1065c10e34d0SVadim Macagon sb_platform.SetSP(m_opaque_sp->GetPlatformList().GetAtIndex(idx)); 1066c10e34d0SVadim Macagon } 1067baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_platform); 1068c10e34d0SVadim Macagon } 1069c10e34d0SVadim Macagon 1070c10e34d0SVadim Macagon uint32_t SBDebugger::GetNumAvailablePlatforms() { 1071baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBDebugger, GetNumAvailablePlatforms); 1072baf5664fSJonas Devlieghere 1073c10e34d0SVadim Macagon uint32_t idx = 0; 1074c10e34d0SVadim Macagon while (true) { 1075c10e34d0SVadim Macagon if (!PluginManager::GetPlatformPluginNameAtIndex(idx)) { 1076c10e34d0SVadim Macagon break; 1077c10e34d0SVadim Macagon } 1078c10e34d0SVadim Macagon ++idx; 1079c10e34d0SVadim Macagon } 1080c10e34d0SVadim Macagon // +1 for the host platform, which should always appear first in the list. 1081c10e34d0SVadim Macagon return idx + 1; 1082c10e34d0SVadim Macagon } 1083c10e34d0SVadim Macagon 1084c10e34d0SVadim Macagon SBStructuredData SBDebugger::GetAvailablePlatformInfoAtIndex(uint32_t idx) { 1085baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBStructuredData, SBDebugger, 1086baf5664fSJonas Devlieghere GetAvailablePlatformInfoAtIndex, (uint32_t), idx); 1087baf5664fSJonas Devlieghere 1088c10e34d0SVadim Macagon SBStructuredData data; 1089a8f3ae7cSJonas Devlieghere auto platform_dict = std::make_unique<StructuredData::Dictionary>(); 1090c10e34d0SVadim Macagon llvm::StringRef name_str("name"), desc_str("description"); 1091c10e34d0SVadim Macagon 1092c10e34d0SVadim Macagon if (idx == 0) { 1093c10e34d0SVadim Macagon PlatformSP host_platform_sp(Platform::GetHostPlatform()); 1094c10e34d0SVadim Macagon platform_dict->AddStringItem( 1095c10e34d0SVadim Macagon name_str, host_platform_sp->GetPluginName().GetStringRef()); 1096c10e34d0SVadim Macagon platform_dict->AddStringItem( 1097c10e34d0SVadim Macagon desc_str, llvm::StringRef(host_platform_sp->GetDescription())); 1098c10e34d0SVadim Macagon } else if (idx > 0) { 1099c10e34d0SVadim Macagon const char *plugin_name = 1100c10e34d0SVadim Macagon PluginManager::GetPlatformPluginNameAtIndex(idx - 1); 1101c10e34d0SVadim Macagon if (!plugin_name) { 1102baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(data); 1103c10e34d0SVadim Macagon } 1104c10e34d0SVadim Macagon platform_dict->AddStringItem(name_str, llvm::StringRef(plugin_name)); 1105c10e34d0SVadim Macagon 1106c10e34d0SVadim Macagon const char *plugin_desc = 1107c10e34d0SVadim Macagon PluginManager::GetPlatformPluginDescriptionAtIndex(idx - 1); 1108c10e34d0SVadim Macagon if (!plugin_desc) { 1109baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(data); 1110c10e34d0SVadim Macagon } 1111c10e34d0SVadim Macagon platform_dict->AddStringItem(desc_str, llvm::StringRef(plugin_desc)); 1112c10e34d0SVadim Macagon } 1113c10e34d0SVadim Macagon 1114c10e34d0SVadim Macagon data.m_impl_up->SetObjectSP( 1115c10e34d0SVadim Macagon StructuredData::ObjectSP(platform_dict.release())); 1116baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(data); 1117c10e34d0SVadim Macagon } 1118c10e34d0SVadim Macagon 1119b9c1b51eSKate Stone void SBDebugger::DispatchInput(void *baton, const void *data, size_t data_len) { 11200d7b0c96SJonas Devlieghere LLDB_RECORD_DUMMY(void, SBDebugger, DispatchInput, 11210d7b0c96SJonas Devlieghere (void *, const void *, size_t), baton, data, data_len); 11220d7b0c96SJonas Devlieghere 11236b09d423SEnrico Granata DispatchInput(data, data_len); 11246b09d423SEnrico Granata } 11256b09d423SEnrico Granata 1126b9c1b51eSKate Stone void SBDebugger::DispatchInput(const void *data, size_t data_len) { 11270d7b0c96SJonas Devlieghere LLDB_RECORD_DUMMY(void, SBDebugger, DispatchInput, (const void *, size_t), 11280d7b0c96SJonas Devlieghere data, data_len); 11290d7b0c96SJonas Devlieghere 113044d93782SGreg Clayton // Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 113144d93782SGreg Clayton // 113244d93782SGreg Clayton // if (log) 113363e5fb76SJonas Devlieghere // LLDB_LOGF(log, "SBDebugger(%p)::DispatchInput (data=\"%.*s\", 1134b9c1b51eSKate Stone // size_t=%" PRIu64 ")", 113544d93782SGreg Clayton // m_opaque_sp.get(), 113644d93782SGreg Clayton // (int) data_len, 113744d93782SGreg Clayton // (const char *) data, 113844d93782SGreg Clayton // (uint64_t)data_len); 113944d93782SGreg Clayton // 114044d93782SGreg Clayton // if (m_opaque_sp) 114144d93782SGreg Clayton // m_opaque_sp->DispatchInput ((const char *) data, data_len); 114230fdc8d8SChris Lattner } 114330fdc8d8SChris Lattner 1144b9c1b51eSKate Stone void SBDebugger::DispatchInputInterrupt() { 1145b328dcbfSJonas Devlieghere LLDB_RECORD_DUMMY_NO_ARGS(void, SBDebugger, DispatchInputInterrupt); 1146baf5664fSJonas Devlieghere 1147efed6131SCaroline Tice if (m_opaque_sp) 1148efed6131SCaroline Tice m_opaque_sp->DispatchInputInterrupt(); 1149efed6131SCaroline Tice } 1150efed6131SCaroline Tice 1151b9c1b51eSKate Stone void SBDebugger::DispatchInputEndOfFile() { 1152baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(void, SBDebugger, DispatchInputEndOfFile); 1153baf5664fSJonas Devlieghere 1154efed6131SCaroline Tice if (m_opaque_sp) 1155efed6131SCaroline Tice m_opaque_sp->DispatchInputEndOfFile(); 1156efed6131SCaroline Tice } 11579088b068SCaroline Tice 1158baf5664fSJonas Devlieghere void SBDebugger::PushInputReader(SBInputReader &reader) { 1159baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBDebugger, PushInputReader, (lldb::SBInputReader &), 1160baf5664fSJonas Devlieghere reader); 1161baf5664fSJonas Devlieghere } 11626611103cSGreg Clayton 1163b9c1b51eSKate Stone void SBDebugger::RunCommandInterpreter(bool auto_handle_events, 1164b9c1b51eSKate Stone bool spawn_thread) { 1165baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBDebugger, RunCommandInterpreter, (bool, bool), 1166baf5664fSJonas Devlieghere auto_handle_events, spawn_thread); 1167baf5664fSJonas Devlieghere 1168b9c1b51eSKate Stone if (m_opaque_sp) { 116926c7bf93SJim Ingham CommandInterpreterRunOptions options; 117032c32246SJonas Devlieghere options.SetAutoHandleEvents(auto_handle_events); 117132c32246SJonas Devlieghere options.SetSpawnThread(spawn_thread); 117232c32246SJonas Devlieghere m_opaque_sp->GetCommandInterpreter().RunCommandInterpreter(options); 117326c7bf93SJim Ingham } 117426c7bf93SJim Ingham } 117526c7bf93SJim Ingham 1176b9c1b51eSKate Stone void SBDebugger::RunCommandInterpreter(bool auto_handle_events, 117726c7bf93SJim Ingham bool spawn_thread, 117826c7bf93SJim Ingham SBCommandInterpreterRunOptions &options, 1179b9c1b51eSKate Stone int &num_errors, bool &quit_requested, 1180ffc9f1deSJim Ingham bool &stopped_for_crash) 118126c7bf93SJim Ingham 118226c7bf93SJim Ingham { 1183baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBDebugger, RunCommandInterpreter, 1184baf5664fSJonas Devlieghere (bool, bool, lldb::SBCommandInterpreterRunOptions &, int &, 1185baf5664fSJonas Devlieghere bool &, bool &), 1186baf5664fSJonas Devlieghere auto_handle_events, spawn_thread, options, num_errors, 1187baf5664fSJonas Devlieghere quit_requested, stopped_for_crash); 1188baf5664fSJonas Devlieghere 1189b9c1b51eSKate Stone if (m_opaque_sp) { 119032c32246SJonas Devlieghere options.SetAutoHandleEvents(auto_handle_events); 119132c32246SJonas Devlieghere options.SetSpawnThread(spawn_thread); 119226c7bf93SJim Ingham CommandInterpreter &interp = m_opaque_sp->GetCommandInterpreter(); 11931bff0928SJonas Devlieghere CommandInterpreterRunResult result = 119432c32246SJonas Devlieghere interp.RunCommandInterpreter(options.ref()); 11951bff0928SJonas Devlieghere num_errors = result.GetNumErrors(); 11961bff0928SJonas Devlieghere quit_requested = 11971bff0928SJonas Devlieghere result.IsResult(lldb::eCommandInterpreterResultQuitRequested); 11981bff0928SJonas Devlieghere stopped_for_crash = 11991bff0928SJonas Devlieghere result.IsResult(lldb::eCommandInterpreterResultInferiorCrash); 120026c7bf93SJim Ingham } 1201969ed3d1SCaroline Tice } 1202969ed3d1SCaroline Tice 12034c67b119SJonas Devlieghere SBCommandInterpreterRunResult SBDebugger::RunCommandInterpreter( 12044c67b119SJonas Devlieghere const SBCommandInterpreterRunOptions &options) { 12054c67b119SJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBCommandInterpreterRunResult, SBDebugger, 12064c67b119SJonas Devlieghere RunCommandInterpreter, 12074c67b119SJonas Devlieghere (const lldb::SBCommandInterpreterRunOptions &), options); 12084c67b119SJonas Devlieghere 12094c67b119SJonas Devlieghere if (!m_opaque_sp) 12104c67b119SJonas Devlieghere return LLDB_RECORD_RESULT(SBCommandInterpreterRunResult()); 12114c67b119SJonas Devlieghere 12124c67b119SJonas Devlieghere CommandInterpreter &interp = m_opaque_sp->GetCommandInterpreter(); 12134c67b119SJonas Devlieghere CommandInterpreterRunResult result = 12144c67b119SJonas Devlieghere interp.RunCommandInterpreter(options.ref()); 12154c67b119SJonas Devlieghere 12164c67b119SJonas Devlieghere return LLDB_RECORD_RESULT(SBCommandInterpreterRunResult(result)); 12174c67b119SJonas Devlieghere } 12184c67b119SJonas Devlieghere 1219b9c1b51eSKate Stone SBError SBDebugger::RunREPL(lldb::LanguageType language, 1220b9c1b51eSKate Stone const char *repl_options) { 1221baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBError, SBDebugger, RunREPL, 1222baf5664fSJonas Devlieghere (lldb::LanguageType, const char *), language, 1223baf5664fSJonas Devlieghere repl_options); 1224baf5664fSJonas Devlieghere 12253e7e915dSSean Callanan SBError error; 12263e7e915dSSean Callanan if (m_opaque_sp) 12273e7e915dSSean Callanan error.ref() = m_opaque_sp->RunREPL(language, repl_options); 12283e7e915dSSean Callanan else 12293e7e915dSSean Callanan error.SetErrorString("invalid debugger"); 1230baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(error); 12313e7e915dSSean Callanan } 12323e7e915dSSean Callanan 1233b9c1b51eSKate Stone void SBDebugger::reset(const DebuggerSP &debugger_sp) { 12346611103cSGreg Clayton m_opaque_sp = debugger_sp; 12356611103cSGreg Clayton } 12366611103cSGreg Clayton 1237b9c1b51eSKate Stone Debugger *SBDebugger::get() const { return m_opaque_sp.get(); } 12386611103cSGreg Clayton 1239b9c1b51eSKate Stone Debugger &SBDebugger::ref() const { 12406611103cSGreg Clayton assert(m_opaque_sp.get()); 12416611103cSGreg Clayton return *m_opaque_sp; 12426611103cSGreg Clayton } 12436611103cSGreg Clayton 1244b9c1b51eSKate Stone const lldb::DebuggerSP &SBDebugger::get_sp() const { return m_opaque_sp; } 12456611103cSGreg Clayton 1246b9c1b51eSKate Stone SBDebugger SBDebugger::FindDebuggerWithID(int id) { 1247baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD(lldb::SBDebugger, SBDebugger, FindDebuggerWithID, 1248baf5664fSJonas Devlieghere (int), id); 1249baf5664fSJonas Devlieghere 1250af67cecdSGreg Clayton // No need to lock, the debugger list is thread safe 1251ebc1bb27SCaroline Tice SBDebugger sb_debugger; 1252431ce678SGreg Clayton DebuggerSP debugger_sp = Debugger::FindDebuggerWithID(id); 1253ebc1bb27SCaroline Tice if (debugger_sp) 1254ebc1bb27SCaroline Tice sb_debugger.reset(debugger_sp); 1255baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_debugger); 1256ebc1bb27SCaroline Tice } 1257e40e4218SJim Ingham 1258b9c1b51eSKate Stone const char *SBDebugger::GetInstanceName() { 1259baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(const char *, SBDebugger, GetInstanceName); 1260baf5664fSJonas Devlieghere 1261dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->GetInstanceName().AsCString() : nullptr); 1262dd759857SCaroline Tice } 1263dd759857SCaroline Tice 1264b9c1b51eSKate Stone SBError SBDebugger::SetInternalVariable(const char *var_name, const char *value, 1265b9c1b51eSKate Stone const char *debugger_instance_name) { 1266baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD(lldb::SBError, SBDebugger, SetInternalVariable, 1267baf5664fSJonas Devlieghere (const char *, const char *, const char *), 1268baf5664fSJonas Devlieghere var_name, value, debugger_instance_name); 1269baf5664fSJonas Devlieghere 12706920b52bSGreg Clayton SBError sb_error; 1271b9c1b51eSKate Stone DebuggerSP debugger_sp(Debugger::FindDebuggerWithInstanceName( 1272b9c1b51eSKate Stone ConstString(debugger_instance_name))); 127397206d57SZachary Turner Status error; 1274b9c1b51eSKate Stone if (debugger_sp) { 1275b9c1b51eSKate Stone ExecutionContext exe_ctx( 1276b9c1b51eSKate Stone debugger_sp->GetCommandInterpreter().GetExecutionContext()); 1277b9c1b51eSKate Stone error = debugger_sp->SetPropertyValue(&exe_ctx, eVarSetOperationAssign, 1278b9c1b51eSKate Stone var_name, value); 1279b9c1b51eSKate Stone } else { 1280b9c1b51eSKate Stone error.SetErrorStringWithFormat("invalid debugger instance name '%s'", 1281b9c1b51eSKate Stone debugger_instance_name); 12826920b52bSGreg Clayton } 12836920b52bSGreg Clayton if (error.Fail()) 12846920b52bSGreg Clayton sb_error.SetError(error); 1285baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_error); 12863df9a8dfSCaroline Tice } 12873df9a8dfSCaroline Tice 1288431ce678SGreg Clayton SBStringList 1289b9c1b51eSKate Stone SBDebugger::GetInternalVariableValue(const char *var_name, 1290b9c1b51eSKate Stone const char *debugger_instance_name) { 1291baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD( 1292baf5664fSJonas Devlieghere lldb::SBStringList, SBDebugger, GetInternalVariableValue, 1293baf5664fSJonas Devlieghere (const char *, const char *), var_name, debugger_instance_name); 1294baf5664fSJonas Devlieghere 12953df9a8dfSCaroline Tice SBStringList ret_value; 1296b9c1b51eSKate Stone DebuggerSP debugger_sp(Debugger::FindDebuggerWithInstanceName( 1297b9c1b51eSKate Stone ConstString(debugger_instance_name))); 129897206d57SZachary Turner Status error; 1299b9c1b51eSKate Stone if (debugger_sp) { 1300b9c1b51eSKate Stone ExecutionContext exe_ctx( 1301b9c1b51eSKate Stone debugger_sp->GetCommandInterpreter().GetExecutionContext()); 1302b9c1b51eSKate Stone lldb::OptionValueSP value_sp( 1303b9c1b51eSKate Stone debugger_sp->GetPropertyValue(&exe_ctx, var_name, false, error)); 1304b9c1b51eSKate Stone if (value_sp) { 13056920b52bSGreg Clayton StreamString value_strm; 13066920b52bSGreg Clayton value_sp->DumpValue(&exe_ctx, value_strm, OptionValue::eDumpOptionValue); 1307adcd0268SBenjamin Kramer const std::string &value_str = std::string(value_strm.GetString()); 1308b9c1b51eSKate Stone if (!value_str.empty()) { 13096920b52bSGreg Clayton StringList string_list; 131044d93782SGreg Clayton string_list.SplitIntoLines(value_str); 1311baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBStringList(&string_list)); 13126920b52bSGreg Clayton } 13136920b52bSGreg Clayton } 13146920b52bSGreg Clayton } 1315baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBStringList()); 13163df9a8dfSCaroline Tice } 13173df9a8dfSCaroline Tice 1318b9c1b51eSKate Stone uint32_t SBDebugger::GetTerminalWidth() const { 1319baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBDebugger, GetTerminalWidth); 1320baf5664fSJonas Devlieghere 1321dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->GetTerminalWidth() : 0); 1322a7015092SGreg Clayton } 1323a7015092SGreg Clayton 1324b9c1b51eSKate Stone void SBDebugger::SetTerminalWidth(uint32_t term_width) { 1325b328dcbfSJonas Devlieghere LLDB_RECORD_DUMMY(void, SBDebugger, SetTerminalWidth, (uint32_t), term_width); 1326baf5664fSJonas Devlieghere 1327a7015092SGreg Clayton if (m_opaque_sp) 1328a7015092SGreg Clayton m_opaque_sp->SetTerminalWidth(term_width); 1329a7015092SGreg Clayton } 1330a7015092SGreg Clayton 1331b9c1b51eSKate Stone const char *SBDebugger::GetPrompt() const { 1332baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBDebugger, GetPrompt); 1333baf5664fSJonas Devlieghere 13345160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1335ceb6b139SCaroline Tice 133663e5fb76SJonas Devlieghere LLDB_LOGF(log, "SBDebugger(%p)::GetPrompt () => \"%s\"", 1337324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get()), 1338514d8cd8SZachary Turner (m_opaque_sp ? m_opaque_sp->GetPrompt().str().c_str() : "")); 1339ceb6b139SCaroline Tice 1340514d8cd8SZachary Turner return (m_opaque_sp ? ConstString(m_opaque_sp->GetPrompt()).GetCString() 1341514d8cd8SZachary Turner : nullptr); 1342a7015092SGreg Clayton } 1343a7015092SGreg Clayton 1344b9c1b51eSKate Stone void SBDebugger::SetPrompt(const char *prompt) { 1345baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBDebugger, SetPrompt, (const char *), prompt); 1346baf5664fSJonas Devlieghere 1347a7015092SGreg Clayton if (m_opaque_sp) 1348514d8cd8SZachary Turner m_opaque_sp->SetPrompt(llvm::StringRef::withNullAsEmpty(prompt)); 1349a7015092SGreg Clayton } 1350a7015092SGreg Clayton 13519e046f02SJonas Devlieghere const char *SBDebugger::GetReproducerPath() const { 1352baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBDebugger, GetReproducerPath); 1353baf5664fSJonas Devlieghere 13549e046f02SJonas Devlieghere return (m_opaque_sp 13559e046f02SJonas Devlieghere ? ConstString(m_opaque_sp->GetReproducerPath()).GetCString() 13569e046f02SJonas Devlieghere : nullptr); 13579e046f02SJonas Devlieghere } 13589e046f02SJonas Devlieghere 1359b9c1b51eSKate Stone ScriptLanguage SBDebugger::GetScriptLanguage() const { 1360baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::ScriptLanguage, SBDebugger, 1361baf5664fSJonas Devlieghere GetScriptLanguage); 1362baf5664fSJonas Devlieghere 1363dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->GetScriptLanguage() : eScriptLanguageNone); 1364a7015092SGreg Clayton } 1365a7015092SGreg Clayton 1366b9c1b51eSKate Stone void SBDebugger::SetScriptLanguage(ScriptLanguage script_lang) { 1367baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBDebugger, SetScriptLanguage, 1368baf5664fSJonas Devlieghere (lldb::ScriptLanguage), script_lang); 1369baf5664fSJonas Devlieghere 1370b9c1b51eSKate Stone if (m_opaque_sp) { 1371a7015092SGreg Clayton m_opaque_sp->SetScriptLanguage(script_lang); 1372a7015092SGreg Clayton } 1373af67cecdSGreg Clayton } 1374a7015092SGreg Clayton 1375b9c1b51eSKate Stone bool SBDebugger::SetUseExternalEditor(bool value) { 1376baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBDebugger, SetUseExternalEditor, (bool), value); 1377baf5664fSJonas Devlieghere 1378dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->SetUseExternalEditor(value) : false); 1379e40e4218SJim Ingham } 1380e40e4218SJim Ingham 1381b9c1b51eSKate Stone bool SBDebugger::GetUseExternalEditor() { 1382baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(bool, SBDebugger, GetUseExternalEditor); 1383baf5664fSJonas Devlieghere 1384dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->GetUseExternalEditor() : false); 1385e40e4218SJim Ingham } 1386e40e4218SJim Ingham 1387b9c1b51eSKate Stone bool SBDebugger::SetUseColor(bool value) { 1388baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBDebugger, SetUseColor, (bool), value); 1389baf5664fSJonas Devlieghere 1390dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->SetUseColor(value) : false); 1391c3ce7f27SMichael Sartain } 1392c3ce7f27SMichael Sartain 1393b9c1b51eSKate Stone bool SBDebugger::GetUseColor() const { 1394baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBDebugger, GetUseColor); 1395baf5664fSJonas Devlieghere 1396dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->GetUseColor() : false); 1397c3ce7f27SMichael Sartain } 1398c3ce7f27SMichael Sartain 1399acae69d0SEmre Kultursay bool SBDebugger::SetUseSourceCache(bool value) { 1400acae69d0SEmre Kultursay LLDB_RECORD_METHOD(bool, SBDebugger, SetUseSourceCache, (bool), value); 1401acae69d0SEmre Kultursay 1402acae69d0SEmre Kultursay return (m_opaque_sp ? m_opaque_sp->SetUseSourceCache(value) : false); 1403acae69d0SEmre Kultursay } 1404acae69d0SEmre Kultursay 1405acae69d0SEmre Kultursay bool SBDebugger::GetUseSourceCache() const { 1406acae69d0SEmre Kultursay LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBDebugger, GetUseSourceCache); 1407acae69d0SEmre Kultursay 1408acae69d0SEmre Kultursay return (m_opaque_sp ? m_opaque_sp->GetUseSourceCache() : false); 1409acae69d0SEmre Kultursay } 1410acae69d0SEmre Kultursay 1411b9c1b51eSKate Stone bool SBDebugger::GetDescription(SBStream &description) { 1412baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBDebugger, GetDescription, (lldb::SBStream &), 1413baf5664fSJonas Devlieghere description); 1414baf5664fSJonas Devlieghere 1415da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1416da7bc7d0SGreg Clayton 1417b9c1b51eSKate Stone if (m_opaque_sp) { 1418dde9cff3SCaroline Tice const char *name = m_opaque_sp->GetInstanceName().AsCString(); 1419431ce678SGreg Clayton user_id_t id = m_opaque_sp->GetID(); 1420d01b2953SDaniel Malea strm.Printf("Debugger (instance: \"%s\", id: %" PRIu64 ")", name, id); 1421b9c1b51eSKate Stone } else 1422da7bc7d0SGreg Clayton strm.PutCString("No value"); 1423dde9cff3SCaroline Tice 1424dde9cff3SCaroline Tice return true; 1425dde9cff3SCaroline Tice } 1426efed6131SCaroline Tice 1427b9c1b51eSKate Stone user_id_t SBDebugger::GetID() { 1428baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::user_id_t, SBDebugger, GetID); 1429baf5664fSJonas Devlieghere 1430dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->GetID() : LLDB_INVALID_UID); 1431efed6131SCaroline Tice } 14322289fa48SGreg Clayton 1433b9c1b51eSKate Stone SBError SBDebugger::SetCurrentPlatform(const char *platform_name_cstr) { 1434baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBError, SBDebugger, SetCurrentPlatform, 1435baf5664fSJonas Devlieghere (const char *), platform_name_cstr); 1436baf5664fSJonas Devlieghere 14372289fa48SGreg Clayton SBError sb_error; 1438b9c1b51eSKate Stone if (m_opaque_sp) { 1439b9c1b51eSKate Stone if (platform_name_cstr && platform_name_cstr[0]) { 1440615eb7e6SGreg Clayton ConstString platform_name(platform_name_cstr); 1441615eb7e6SGreg Clayton PlatformSP platform_sp(Platform::Find(platform_name)); 14422289fa48SGreg Clayton 1443b9c1b51eSKate Stone if (platform_sp) { 1444615eb7e6SGreg Clayton // Already have a platform with this name, just select it 1445615eb7e6SGreg Clayton m_opaque_sp->GetPlatformList().SetSelectedPlatform(platform_sp); 1446b9c1b51eSKate Stone } else { 1447615eb7e6SGreg Clayton // We don't have a platform by this name yet, create one 1448615eb7e6SGreg Clayton platform_sp = Platform::Create(platform_name, sb_error.ref()); 1449b9c1b51eSKate Stone if (platform_sp) { 1450615eb7e6SGreg Clayton // We created the platform, now append and select it 14512289fa48SGreg Clayton bool make_selected = true; 14522289fa48SGreg Clayton m_opaque_sp->GetPlatformList().Append(platform_sp, make_selected); 14532289fa48SGreg Clayton } 14542289fa48SGreg Clayton } 1455b9c1b51eSKate Stone } else { 1456615eb7e6SGreg Clayton sb_error.ref().SetErrorString("invalid platform name"); 1457615eb7e6SGreg Clayton } 1458b9c1b51eSKate Stone } else { 1459615eb7e6SGreg Clayton sb_error.ref().SetErrorString("invalid debugger"); 1460615eb7e6SGreg Clayton } 1461baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_error); 14622289fa48SGreg Clayton } 14632289fa48SGreg Clayton 1464b9c1b51eSKate Stone bool SBDebugger::SetCurrentPlatformSDKRoot(const char *sysroot) { 1465baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBDebugger, SetCurrentPlatformSDKRoot, 1466baf5664fSJonas Devlieghere (const char *), sysroot); 1467baf5664fSJonas Devlieghere 1468e1cf274bSJason Molenda Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1469b9c1b51eSKate Stone if (m_opaque_sp) { 1470b9c1b51eSKate Stone PlatformSP platform_sp( 1471b9c1b51eSKate Stone m_opaque_sp->GetPlatformList().GetSelectedPlatform()); 1472f3dd93c8SGreg Clayton 1473b9c1b51eSKate Stone if (platform_sp) { 1474e1cf274bSJason Molenda if (log && sysroot) 147563e5fb76SJonas Devlieghere LLDB_LOGF(log, "SBDebugger::SetCurrentPlatformSDKRoot (\"%s\")", 147663e5fb76SJonas Devlieghere sysroot); 1477f3dd93c8SGreg Clayton platform_sp->SetSDKRootDirectory(ConstString(sysroot)); 1478f3dd93c8SGreg Clayton return true; 1479f3dd93c8SGreg Clayton } 1480f3dd93c8SGreg Clayton } 1481f3dd93c8SGreg Clayton return false; 1482f3dd93c8SGreg Clayton } 1483f3dd93c8SGreg Clayton 1484b9c1b51eSKate Stone bool SBDebugger::GetCloseInputOnEOF() const { 1485baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBDebugger, GetCloseInputOnEOF); 1486baf5664fSJonas Devlieghere 1487dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->GetCloseInputOnEOF() : false); 1488fc3f027dSGreg Clayton } 1489fc3f027dSGreg Clayton 1490b9c1b51eSKate Stone void SBDebugger::SetCloseInputOnEOF(bool b) { 1491baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBDebugger, SetCloseInputOnEOF, (bool), b); 1492baf5664fSJonas Devlieghere 1493fc3f027dSGreg Clayton if (m_opaque_sp) 1494fc3f027dSGreg Clayton m_opaque_sp->SetCloseInputOnEOF(b); 1495fc3f027dSGreg Clayton } 1496061858ceSEnrico Granata 1497b9c1b51eSKate Stone SBTypeCategory SBDebugger::GetCategory(const char *category_name) { 1498baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBTypeCategory, SBDebugger, GetCategory, 1499baf5664fSJonas Devlieghere (const char *), category_name); 1500baf5664fSJonas Devlieghere 1501061858ceSEnrico Granata if (!category_name || *category_name == 0) 1502baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBTypeCategory()); 1503061858ceSEnrico Granata 1504061858ceSEnrico Granata TypeCategoryImplSP category_sp; 1505061858ceSEnrico Granata 1506b9c1b51eSKate Stone if (DataVisualization::Categories::GetCategory(ConstString(category_name), 1507baf5664fSJonas Devlieghere category_sp, false)) { 1508baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBTypeCategory(category_sp)); 1509baf5664fSJonas Devlieghere } else { 1510baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBTypeCategory()); 1511baf5664fSJonas Devlieghere } 1512061858ceSEnrico Granata } 1513061858ceSEnrico Granata 1514b9c1b51eSKate Stone SBTypeCategory SBDebugger::GetCategory(lldb::LanguageType lang_type) { 1515baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBTypeCategory, SBDebugger, GetCategory, 1516baf5664fSJonas Devlieghere (lldb::LanguageType), lang_type); 1517baf5664fSJonas Devlieghere 1518e242624cSEnrico Granata TypeCategoryImplSP category_sp; 1519baf5664fSJonas Devlieghere if (DataVisualization::Categories::GetCategory(lang_type, category_sp)) { 1520baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBTypeCategory(category_sp)); 1521baf5664fSJonas Devlieghere } else { 1522baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBTypeCategory()); 1523baf5664fSJonas Devlieghere } 1524e242624cSEnrico Granata } 1525e242624cSEnrico Granata 1526b9c1b51eSKate Stone SBTypeCategory SBDebugger::CreateCategory(const char *category_name) { 1527baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBTypeCategory, SBDebugger, CreateCategory, 1528baf5664fSJonas Devlieghere (const char *), category_name); 1529baf5664fSJonas Devlieghere 1530061858ceSEnrico Granata if (!category_name || *category_name == 0) 1531baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBTypeCategory()); 1532061858ceSEnrico Granata 1533061858ceSEnrico Granata TypeCategoryImplSP category_sp; 1534061858ceSEnrico Granata 1535b9c1b51eSKate Stone if (DataVisualization::Categories::GetCategory(ConstString(category_name), 1536baf5664fSJonas Devlieghere category_sp, true)) { 1537baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBTypeCategory(category_sp)); 1538baf5664fSJonas Devlieghere } else { 1539baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBTypeCategory()); 1540baf5664fSJonas Devlieghere } 1541061858ceSEnrico Granata } 1542061858ceSEnrico Granata 1543b9c1b51eSKate Stone bool SBDebugger::DeleteCategory(const char *category_name) { 1544baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBDebugger, DeleteCategory, (const char *), 1545baf5664fSJonas Devlieghere 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 1553b9c1b51eSKate Stone uint32_t SBDebugger::GetNumCategories() { 1554baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBDebugger, GetNumCategories); 1555baf5664fSJonas Devlieghere 1556061858ceSEnrico Granata return DataVisualization::Categories::GetCount(); 1557061858ceSEnrico Granata } 1558061858ceSEnrico Granata 1559b9c1b51eSKate Stone SBTypeCategory SBDebugger::GetCategoryAtIndex(uint32_t index) { 1560baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBTypeCategory, SBDebugger, GetCategoryAtIndex, 1561baf5664fSJonas Devlieghere (uint32_t), index); 1562baf5664fSJonas Devlieghere 1563baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT( 1564baf5664fSJonas Devlieghere SBTypeCategory(DataVisualization::Categories::GetCategoryAtIndex(index))); 1565061858ceSEnrico Granata } 1566061858ceSEnrico Granata 1567b9c1b51eSKate Stone SBTypeCategory SBDebugger::GetDefaultCategory() { 1568baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::SBTypeCategory, SBDebugger, 1569baf5664fSJonas Devlieghere GetDefaultCategory); 1570baf5664fSJonas Devlieghere 1571baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(GetCategory("default")); 1572061858ceSEnrico Granata } 1573061858ceSEnrico Granata 1574b9c1b51eSKate Stone SBTypeFormat SBDebugger::GetFormatForType(SBTypeNameSpecifier type_name) { 1575baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBTypeFormat, SBDebugger, GetFormatForType, 1576baf5664fSJonas Devlieghere (lldb::SBTypeNameSpecifier), type_name); 1577baf5664fSJonas Devlieghere 1578061858ceSEnrico Granata SBTypeCategory default_category_sb = GetDefaultCategory(); 1579061858ceSEnrico Granata if (default_category_sb.GetEnabled()) 1580baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(default_category_sb.GetFormatForType(type_name)); 1581baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBTypeFormat()); 1582061858ceSEnrico Granata } 1583061858ceSEnrico Granata 1584b9c1b51eSKate Stone SBTypeSummary SBDebugger::GetSummaryForType(SBTypeNameSpecifier type_name) { 1585baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBTypeSummary, SBDebugger, GetSummaryForType, 1586baf5664fSJonas Devlieghere (lldb::SBTypeNameSpecifier), type_name); 1587baf5664fSJonas Devlieghere 1588dbb0abbfSEugene Zelenko if (!type_name.IsValid()) 1589baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBTypeSummary()); 1590baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT( 1591baf5664fSJonas Devlieghere SBTypeSummary(DataVisualization::GetSummaryForType(type_name.GetSP()))); 1592061858ceSEnrico Granata } 1593061858ceSEnrico Granata 1594b9c1b51eSKate Stone SBTypeFilter SBDebugger::GetFilterForType(SBTypeNameSpecifier type_name) { 1595baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBTypeFilter, SBDebugger, GetFilterForType, 1596baf5664fSJonas Devlieghere (lldb::SBTypeNameSpecifier), type_name); 1597baf5664fSJonas Devlieghere 1598dbb0abbfSEugene Zelenko if (!type_name.IsValid()) 1599baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBTypeFilter()); 1600baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT( 1601baf5664fSJonas Devlieghere SBTypeFilter(DataVisualization::GetFilterForType(type_name.GetSP()))); 1602061858ceSEnrico Granata } 1603061858ceSEnrico Granata 1604b9c1b51eSKate Stone SBTypeSynthetic SBDebugger::GetSyntheticForType(SBTypeNameSpecifier type_name) { 1605baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBTypeSynthetic, SBDebugger, GetSyntheticForType, 1606baf5664fSJonas Devlieghere (lldb::SBTypeNameSpecifier), type_name); 1607baf5664fSJonas Devlieghere 1608dbb0abbfSEugene Zelenko if (!type_name.IsValid()) 1609baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBTypeSynthetic()); 1610baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBTypeSynthetic( 1611baf5664fSJonas Devlieghere DataVisualization::GetSyntheticForType(type_name.GetSP()))); 1612061858ceSEnrico Granata } 1613061858ceSEnrico Granata 16145e336903SPavel Labath static llvm::ArrayRef<const char *> GetCategoryArray(const char **categories) { 16155e336903SPavel Labath if (categories == nullptr) 16165e336903SPavel Labath return {}; 16175e336903SPavel Labath size_t len = 0; 16185e336903SPavel Labath while (categories[len] != nullptr) 16195e336903SPavel Labath ++len; 16205e336903SPavel Labath return llvm::makeArrayRef(categories, len); 16215e336903SPavel Labath } 16225e336903SPavel Labath 1623b9c1b51eSKate Stone bool SBDebugger::EnableLog(const char *channel, const char **categories) { 1624baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBDebugger, EnableLog, (const char *, const char **), 1625baf5664fSJonas Devlieghere channel, categories); 1626baf5664fSJonas Devlieghere 1627b9c1b51eSKate Stone if (m_opaque_sp) { 1628b9c1b51eSKate Stone uint32_t log_options = 1629b9c1b51eSKate Stone LLDB_LOG_OPTION_PREPEND_TIMESTAMP | LLDB_LOG_OPTION_PREPEND_THREAD_NAME; 1630775588c0SPavel Labath std::string error; 1631775588c0SPavel Labath llvm::raw_string_ostream error_stream(error); 16325e336903SPavel Labath return m_opaque_sp->EnableLog(channel, GetCategoryArray(categories), "", 1633775588c0SPavel Labath log_options, error_stream); 1634b9c1b51eSKate Stone } else 1635228063cdSJim Ingham return false; 1636228063cdSJim Ingham } 16374f02b22dSJim Ingham 1638b9c1b51eSKate Stone void SBDebugger::SetLoggingCallback(lldb::LogOutputCallback log_callback, 1639b9c1b51eSKate Stone void *baton) { 16407bc83564SJonas Devlieghere LLDB_RECORD_DUMMY(void, SBDebugger, SetLoggingCallback, 16417bc83564SJonas Devlieghere (lldb::LogOutputCallback, void *), log_callback, baton); 16420d7b0c96SJonas Devlieghere 1643b9c1b51eSKate Stone if (m_opaque_sp) { 16444f02b22dSJim Ingham return m_opaque_sp->SetLoggingCallback(log_callback, baton); 16454f02b22dSJim Ingham } 16464f02b22dSJim Ingham } 1647ae211eceSMichal Gorny 1648ae211eceSMichal Gorny namespace lldb_private { 1649ae211eceSMichal Gorny namespace repro { 1650ae211eceSMichal Gorny 1651d9aec34bSJonas Devlieghere template <> void RegisterMethods<SBInputReader>(Registry &R) { 1652ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBInputReader, SetIsDone, (bool)); 1653ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBInputReader, IsActive, ()); 1654ae211eceSMichal Gorny } 1655ae211eceSMichal Gorny 1656ae211eceSMichal Gorny static void SetFileHandleRedirect(SBDebugger *, FILE *, bool) { 1657ae211eceSMichal Gorny // Do nothing. 1658ae211eceSMichal Gorny } 1659ae211eceSMichal Gorny 166096898eb6SLawrence D'Anna static SBError SetFileRedirect(SBDebugger *, SBFile file) { return SBError(); } 166196898eb6SLawrence D'Anna 1662c040b30fSLawrence D'Anna static SBError SetFileRedirect(SBDebugger *, FileSP file) { return SBError(); } 1663c040b30fSLawrence D'Anna 1664d9aec34bSJonas Devlieghere template <> void RegisterMethods<SBDebugger>(Registry &R) { 1665ae211eceSMichal Gorny // Custom implementation. 1666950a8aa1SJonas Devlieghere R.Register(&invoke<void (SBDebugger::*)(FILE *, bool)>::method< 1667950a8aa1SJonas Devlieghere &SBDebugger::SetErrorFileHandle>::record, 1668ae211eceSMichal Gorny &SetFileHandleRedirect); 1669950a8aa1SJonas Devlieghere R.Register(&invoke<void (SBDebugger::*)(FILE *, bool)>::method< 1670950a8aa1SJonas Devlieghere &SBDebugger::SetOutputFileHandle>::record, 1671ae211eceSMichal Gorny &SetFileHandleRedirect); 1672ae211eceSMichal Gorny 167396898eb6SLawrence D'Anna R.Register(&invoke<SBError (SBDebugger::*)( 1674950a8aa1SJonas Devlieghere SBFile)>::method<&SBDebugger::SetInputFile>::record, 167596898eb6SLawrence D'Anna &SetFileRedirect); 167696898eb6SLawrence D'Anna R.Register(&invoke<SBError (SBDebugger::*)( 1677950a8aa1SJonas Devlieghere SBFile)>::method<&SBDebugger::SetOutputFile>::record, 167896898eb6SLawrence D'Anna &SetFileRedirect); 167996898eb6SLawrence D'Anna R.Register(&invoke<SBError (SBDebugger::*)( 1680950a8aa1SJonas Devlieghere SBFile)>::method<&SBDebugger::SetErrorFile>::record, 168196898eb6SLawrence D'Anna &SetFileRedirect); 168296898eb6SLawrence D'Anna 1683c040b30fSLawrence D'Anna R.Register(&invoke<SBError (SBDebugger::*)( 1684950a8aa1SJonas Devlieghere FileSP)>::method<&SBDebugger::SetInputFile>::record, 1685c040b30fSLawrence D'Anna &SetFileRedirect); 1686c040b30fSLawrence D'Anna R.Register(&invoke<SBError (SBDebugger::*)( 1687950a8aa1SJonas Devlieghere FileSP)>::method<&SBDebugger::SetOutputFile>::record, 1688c040b30fSLawrence D'Anna &SetFileRedirect); 1689c040b30fSLawrence D'Anna R.Register(&invoke<SBError (SBDebugger::*)( 1690950a8aa1SJonas Devlieghere FileSP)>::method<&SBDebugger::SetErrorFile>::record, 1691c040b30fSLawrence D'Anna &SetFileRedirect); 1692c040b30fSLawrence D'Anna 1693e687aa82SJonas Devlieghere LLDB_REGISTER_CHAR_PTR_METHOD_STATIC(bool, SBDebugger, 16942f025bb8SJonas Devlieghere GetDefaultArchitecture); 16952f025bb8SJonas Devlieghere 1696ae211eceSMichal Gorny LLDB_REGISTER_CONSTRUCTOR(SBDebugger, ()); 1697ae211eceSMichal Gorny LLDB_REGISTER_CONSTRUCTOR(SBDebugger, (const lldb::DebuggerSP &)); 1698ae211eceSMichal Gorny LLDB_REGISTER_CONSTRUCTOR(SBDebugger, (const lldb::SBDebugger &)); 1699ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBDebugger &, 1700ae211eceSMichal Gorny SBDebugger, operator=,(const lldb::SBDebugger &)); 1701ae211eceSMichal Gorny LLDB_REGISTER_STATIC_METHOD(void, SBDebugger, Initialize, ()); 1702ae211eceSMichal Gorny LLDB_REGISTER_STATIC_METHOD(lldb::SBError, SBDebugger, 1703ae211eceSMichal Gorny InitializeWithErrorHandling, ()); 1704ae211eceSMichal Gorny LLDB_REGISTER_STATIC_METHOD(void, SBDebugger, Terminate, ()); 1705ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBDebugger, Clear, ()); 1706ae211eceSMichal Gorny LLDB_REGISTER_STATIC_METHOD(lldb::SBDebugger, SBDebugger, Create, ()); 1707ae211eceSMichal Gorny LLDB_REGISTER_STATIC_METHOD(lldb::SBDebugger, SBDebugger, Create, (bool)); 1708d9aec34bSJonas Devlieghere LLDB_REGISTER_STATIC_METHOD(void, SBDebugger, Destroy, (lldb::SBDebugger &)); 1709ae211eceSMichal Gorny LLDB_REGISTER_STATIC_METHOD(void, SBDebugger, MemoryPressureDetected, ()); 1710ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBDebugger, IsValid, ()); 1711ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBDebugger, operator bool,()); 1712ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBDebugger, SetAsync, (bool)); 1713ae211eceSMichal Gorny LLDB_REGISTER_METHOD(bool, SBDebugger, GetAsync, ()); 1714ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBDebugger, SkipLLDBInitFiles, (bool)); 1715ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBDebugger, SkipAppInitFiles, (bool)); 1716ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBDebugger, SetInputFileHandle, (FILE *, bool)); 1717ae211eceSMichal Gorny LLDB_REGISTER_METHOD(FILE *, SBDebugger, GetInputFileHandle, ()); 1718ae211eceSMichal Gorny LLDB_REGISTER_METHOD(FILE *, SBDebugger, GetOutputFileHandle, ()); 1719ae211eceSMichal Gorny LLDB_REGISTER_METHOD(FILE *, SBDebugger, GetErrorFileHandle, ()); 172096898eb6SLawrence D'Anna LLDB_REGISTER_METHOD(SBFile, SBDebugger, GetInputFile, ()); 172196898eb6SLawrence D'Anna LLDB_REGISTER_METHOD(SBFile, SBDebugger, GetOutputFile, ()); 172296898eb6SLawrence D'Anna LLDB_REGISTER_METHOD(SBFile, SBDebugger, GetErrorFile, ()); 1723ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBDebugger, SaveInputTerminalState, ()); 1724ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBDebugger, RestoreInputTerminalState, ()); 1725ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBCommandInterpreter, SBDebugger, 1726ae211eceSMichal Gorny GetCommandInterpreter, ()); 1727ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBDebugger, HandleCommand, (const char *)); 1728ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBListener, SBDebugger, GetListener, ()); 1729ae211eceSMichal Gorny LLDB_REGISTER_METHOD( 1730ae211eceSMichal Gorny void, SBDebugger, HandleProcessEvent, 1731ae211eceSMichal Gorny (const lldb::SBProcess &, const lldb::SBEvent &, FILE *, FILE *)); 1732322f12afSLawrence D'Anna LLDB_REGISTER_METHOD( 1733322f12afSLawrence D'Anna void, SBDebugger, HandleProcessEvent, 1734322f12afSLawrence D'Anna (const lldb::SBProcess &, const lldb::SBEvent &, SBFile, SBFile)); 1735322f12afSLawrence D'Anna LLDB_REGISTER_METHOD( 1736322f12afSLawrence D'Anna void, SBDebugger, HandleProcessEvent, 1737322f12afSLawrence D'Anna (const lldb::SBProcess &, const lldb::SBEvent &, FileSP, FileSP)); 1738d9aec34bSJonas Devlieghere LLDB_REGISTER_METHOD(lldb::SBSourceManager, SBDebugger, GetSourceManager, ()); 1739ae211eceSMichal Gorny LLDB_REGISTER_STATIC_METHOD(bool, SBDebugger, SetDefaultArchitecture, 1740ae211eceSMichal Gorny (const char *)); 1741ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::ScriptLanguage, SBDebugger, GetScriptingLanguage, 1742ae211eceSMichal Gorny (const char *)); 1743ae211eceSMichal Gorny LLDB_REGISTER_STATIC_METHOD(const char *, SBDebugger, GetVersionString, ()); 1744ae211eceSMichal Gorny LLDB_REGISTER_STATIC_METHOD(const char *, SBDebugger, StateAsCString, 1745ae211eceSMichal Gorny (lldb::StateType)); 1746ae211eceSMichal Gorny LLDB_REGISTER_STATIC_METHOD(lldb::SBStructuredData, SBDebugger, 1747ae211eceSMichal Gorny GetBuildConfiguration, ()); 1748ae211eceSMichal Gorny LLDB_REGISTER_STATIC_METHOD(bool, SBDebugger, StateIsRunningState, 1749ae211eceSMichal Gorny (lldb::StateType)); 1750ae211eceSMichal Gorny LLDB_REGISTER_STATIC_METHOD(bool, SBDebugger, StateIsStoppedState, 1751ae211eceSMichal Gorny (lldb::StateType)); 1752ae211eceSMichal Gorny LLDB_REGISTER_METHOD( 1753ae211eceSMichal Gorny lldb::SBTarget, SBDebugger, CreateTarget, 1754ae211eceSMichal Gorny (const char *, const char *, const char *, bool, lldb::SBError &)); 1755ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBTarget, SBDebugger, 1756ae211eceSMichal Gorny CreateTargetWithFileAndTargetTriple, 1757ae211eceSMichal Gorny (const char *, const char *)); 1758d9aec34bSJonas Devlieghere LLDB_REGISTER_METHOD(lldb::SBTarget, SBDebugger, CreateTargetWithFileAndArch, 1759ae211eceSMichal Gorny (const char *, const char *)); 1760ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBTarget, SBDebugger, CreateTarget, 1761ae211eceSMichal Gorny (const char *)); 1762ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBTarget, SBDebugger, GetDummyTarget, ()); 1763ae211eceSMichal Gorny LLDB_REGISTER_METHOD(bool, SBDebugger, DeleteTarget, (lldb::SBTarget &)); 1764ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBTarget, SBDebugger, GetTargetAtIndex, 1765ae211eceSMichal Gorny (uint32_t)); 1766ae211eceSMichal Gorny LLDB_REGISTER_METHOD(uint32_t, SBDebugger, GetIndexOfTarget, 1767ae211eceSMichal Gorny (lldb::SBTarget)); 1768ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBTarget, SBDebugger, FindTargetWithProcessID, 1769ae211eceSMichal Gorny (lldb::pid_t)); 1770ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBTarget, SBDebugger, FindTargetWithFileAndArch, 1771ae211eceSMichal Gorny (const char *, const char *)); 1772ae211eceSMichal Gorny LLDB_REGISTER_METHOD(uint32_t, SBDebugger, GetNumTargets, ()); 1773ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBTarget, SBDebugger, GetSelectedTarget, ()); 1774d9aec34bSJonas Devlieghere LLDB_REGISTER_METHOD(void, SBDebugger, SetSelectedTarget, (lldb::SBTarget &)); 1775ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBPlatform, SBDebugger, GetSelectedPlatform, ()); 1776ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBDebugger, SetSelectedPlatform, 1777ae211eceSMichal Gorny (lldb::SBPlatform &)); 1778ae211eceSMichal Gorny LLDB_REGISTER_METHOD(uint32_t, SBDebugger, GetNumPlatforms, ()); 1779ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBPlatform, SBDebugger, GetPlatformAtIndex, 1780ae211eceSMichal Gorny (uint32_t)); 1781ae211eceSMichal Gorny LLDB_REGISTER_METHOD(uint32_t, SBDebugger, GetNumAvailablePlatforms, ()); 1782ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBStructuredData, SBDebugger, 1783ae211eceSMichal Gorny GetAvailablePlatformInfoAtIndex, (uint32_t)); 1784ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBDebugger, DispatchInputInterrupt, ()); 1785ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBDebugger, DispatchInputEndOfFile, ()); 1786ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBDebugger, PushInputReader, 1787ae211eceSMichal Gorny (lldb::SBInputReader &)); 1788ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBDebugger, RunCommandInterpreter, (bool, bool)); 1789ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBDebugger, RunCommandInterpreter, 1790ae211eceSMichal Gorny (bool, bool, lldb::SBCommandInterpreterRunOptions &, 1791ae211eceSMichal Gorny int &, bool &, bool &)); 1792ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBError, SBDebugger, RunREPL, 1793ae211eceSMichal Gorny (lldb::LanguageType, const char *)); 1794d9aec34bSJonas Devlieghere LLDB_REGISTER_STATIC_METHOD(lldb::SBDebugger, SBDebugger, FindDebuggerWithID, 1795d9aec34bSJonas Devlieghere (int)); 1796ae211eceSMichal Gorny LLDB_REGISTER_METHOD(const char *, SBDebugger, GetInstanceName, ()); 1797ae211eceSMichal Gorny LLDB_REGISTER_STATIC_METHOD(lldb::SBError, SBDebugger, SetInternalVariable, 1798ae211eceSMichal Gorny (const char *, const char *, const char *)); 1799ae211eceSMichal Gorny LLDB_REGISTER_STATIC_METHOD(lldb::SBStringList, SBDebugger, 1800ae211eceSMichal Gorny GetInternalVariableValue, 1801ae211eceSMichal Gorny (const char *, const char *)); 1802ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(uint32_t, SBDebugger, GetTerminalWidth, ()); 1803ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBDebugger, SetTerminalWidth, (uint32_t)); 1804ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(const char *, SBDebugger, GetPrompt, ()); 1805ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBDebugger, SetPrompt, (const char *)); 1806ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(const char *, SBDebugger, GetReproducerPath, ()); 1807ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::ScriptLanguage, SBDebugger, 1808ae211eceSMichal Gorny GetScriptLanguage, ()); 1809ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBDebugger, SetScriptLanguage, 1810ae211eceSMichal Gorny (lldb::ScriptLanguage)); 1811ae211eceSMichal Gorny LLDB_REGISTER_METHOD(bool, SBDebugger, SetUseExternalEditor, (bool)); 1812ae211eceSMichal Gorny LLDB_REGISTER_METHOD(bool, SBDebugger, GetUseExternalEditor, ()); 1813ae211eceSMichal Gorny LLDB_REGISTER_METHOD(bool, SBDebugger, SetUseColor, (bool)); 1814ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBDebugger, GetUseColor, ()); 1815ae211eceSMichal Gorny LLDB_REGISTER_METHOD(bool, SBDebugger, GetDescription, (lldb::SBStream &)); 1816ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::user_id_t, SBDebugger, GetID, ()); 1817ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBError, SBDebugger, SetCurrentPlatform, 1818ae211eceSMichal Gorny (const char *)); 1819ae211eceSMichal Gorny LLDB_REGISTER_METHOD(bool, SBDebugger, SetCurrentPlatformSDKRoot, 1820ae211eceSMichal Gorny (const char *)); 1821ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBDebugger, GetCloseInputOnEOF, ()); 1822ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBDebugger, SetCloseInputOnEOF, (bool)); 1823ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBTypeCategory, SBDebugger, GetCategory, 1824ae211eceSMichal Gorny (const char *)); 1825ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBTypeCategory, SBDebugger, GetCategory, 1826ae211eceSMichal Gorny (lldb::LanguageType)); 1827ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBTypeCategory, SBDebugger, CreateCategory, 1828ae211eceSMichal Gorny (const char *)); 1829ae211eceSMichal Gorny LLDB_REGISTER_METHOD(bool, SBDebugger, DeleteCategory, (const char *)); 1830ae211eceSMichal Gorny LLDB_REGISTER_METHOD(uint32_t, SBDebugger, GetNumCategories, ()); 1831ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBTypeCategory, SBDebugger, GetCategoryAtIndex, 1832ae211eceSMichal Gorny (uint32_t)); 1833ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBTypeCategory, SBDebugger, GetDefaultCategory, 1834ae211eceSMichal Gorny ()); 1835ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBTypeFormat, SBDebugger, GetFormatForType, 1836ae211eceSMichal Gorny (lldb::SBTypeNameSpecifier)); 1837ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBTypeSummary, SBDebugger, GetSummaryForType, 1838ae211eceSMichal Gorny (lldb::SBTypeNameSpecifier)); 1839ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBTypeSynthetic, SBDebugger, GetSyntheticForType, 1840ae211eceSMichal Gorny (lldb::SBTypeNameSpecifier)); 1841ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBTypeFilter, SBDebugger, GetFilterForType, 1842ae211eceSMichal Gorny (lldb::SBTypeNameSpecifier)); 1843ae211eceSMichal Gorny LLDB_REGISTER_METHOD(bool, SBDebugger, EnableLog, 1844ae211eceSMichal Gorny (const char *, const char **)); 18454c67b119SJonas Devlieghere LLDB_REGISTER_METHOD(lldb::SBCommandInterpreterRunResult, SBDebugger, 18464c67b119SJonas Devlieghere RunCommandInterpreter, 18474c67b119SJonas Devlieghere (const lldb::SBCommandInterpreterRunOptions &)); 1848ae211eceSMichal Gorny } 1849ae211eceSMichal Gorny 1850d9aec34bSJonas Devlieghere } // namespace repro 1851d9aec34bSJonas Devlieghere } // namespace lldb_private 1852