130fdc8d8SChris Lattner //===-- SBDebugger.cpp ------------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 630fdc8d8SChris Lattner // 730fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 830fdc8d8SChris Lattner 9d17cd902SAlex Langford 10d17cd902SAlex Langford #include "SystemInitializerFull.h" 11d17cd902SAlex Langford 12ca93cc1dSEli Friedman #include "lldb/API/SBDebugger.h" 1330fdc8d8SChris Lattner 14e0d378b3SGreg Clayton #include "lldb/lldb-private.h" 1530fdc8d8SChris Lattner 16ca93cc1dSEli Friedman #include "lldb/API/SBBroadcaster.h" 17ca93cc1dSEli Friedman #include "lldb/API/SBCommandInterpreter.h" 18ca93cc1dSEli Friedman #include "lldb/API/SBCommandReturnObject.h" 192289fa48SGreg Clayton #include "lldb/API/SBError.h" 20ca93cc1dSEli Friedman #include "lldb/API/SBEvent.h" 21ca93cc1dSEli Friedman #include "lldb/API/SBFrame.h" 22b9c1b51eSKate Stone #include "lldb/API/SBListener.h" 233df9a8dfSCaroline Tice #include "lldb/API/SBProcess.h" 243df9a8dfSCaroline Tice #include "lldb/API/SBSourceManager.h" 25dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 263df9a8dfSCaroline Tice #include "lldb/API/SBStringList.h" 27c10e34d0SVadim Macagon #include "lldb/API/SBStructuredData.h" 283df9a8dfSCaroline Tice #include "lldb/API/SBTarget.h" 293df9a8dfSCaroline Tice #include "lldb/API/SBThread.h" 30061858ceSEnrico Granata #include "lldb/API/SBTypeCategory.h" 31061858ceSEnrico Granata #include "lldb/API/SBTypeFilter.h" 32b9c1b51eSKate Stone #include "lldb/API/SBTypeFormat.h" 33061858ceSEnrico Granata #include "lldb/API/SBTypeNameSpecifier.h" 34061858ceSEnrico Granata #include "lldb/API/SBTypeSummary.h" 35061858ceSEnrico Granata #include "lldb/API/SBTypeSynthetic.h" 36061858ceSEnrico Granata 376eee5aa0SGreg Clayton #include "lldb/Core/Debugger.h" 38c10e34d0SVadim Macagon #include "lldb/Core/PluginManager.h" 3944d93782SGreg Clayton #include "lldb/Core/StreamFile.h" 40c10e34d0SVadim Macagon #include "lldb/Core/StructuredDataImpl.h" 415548cb50SEnrico Granata #include "lldb/DataFormatters/DataVisualization.h" 42f1389e92SPavel Labath #include "lldb/Host/XML.h" 43e6e2bb38SZachary Turner #include "lldb/Initialization/SystemLifetimeManager.h" 446eee5aa0SGreg Clayton #include "lldb/Interpreter/CommandInterpreter.h" 4547cbf4a0SPavel Labath #include "lldb/Interpreter/OptionArgParser.h" 46cac9c5f9SGreg Clayton #include "lldb/Interpreter/OptionGroupPlatform.h" 476eee5aa0SGreg Clayton #include "lldb/Target/Process.h" 486eee5aa0SGreg Clayton #include "lldb/Target/TargetList.h" 49145d95c9SPavel Labath #include "lldb/Utility/Args.h" 50d821c997SPavel Labath #include "lldb/Utility/State.h" 5130fdc8d8SChris Lattner 52d717cc9fSEnrico Granata #include "llvm/ADT/STLExtras.h" 537b2e5a36SZachary Turner #include "llvm/ADT/StringRef.h" 5458a559c0SZachary Turner #include "llvm/Support/DynamicLibrary.h" 55b9c1b51eSKate Stone #include "llvm/Support/ManagedStatic.h" 5658a559c0SZachary Turner 5730fdc8d8SChris Lattner using namespace lldb; 5830fdc8d8SChris Lattner using namespace lldb_private; 5930fdc8d8SChris Lattner 60*d77c2e09SJonas Devlieghere /// Helper class for replaying commands through the reproducer. 61*d77c2e09SJonas Devlieghere class CommandLoader { 62*d77c2e09SJonas Devlieghere public: 63*d77c2e09SJonas Devlieghere CommandLoader(std::vector<std::string> files) : m_files(files) {} 64*d77c2e09SJonas Devlieghere 65*d77c2e09SJonas Devlieghere static std::unique_ptr<CommandLoader> Create() { 66*d77c2e09SJonas Devlieghere repro::Loader *loader = repro::Reproducer::Instance().GetLoader(); 67*d77c2e09SJonas Devlieghere if (!loader) 68*d77c2e09SJonas Devlieghere return {}; 69*d77c2e09SJonas Devlieghere 70*d77c2e09SJonas Devlieghere FileSpec file = loader->GetFile<repro::CommandInfo>(); 71*d77c2e09SJonas Devlieghere if (!file) 72*d77c2e09SJonas Devlieghere return {}; 73*d77c2e09SJonas Devlieghere 74*d77c2e09SJonas Devlieghere auto error_or_file = llvm::MemoryBuffer::getFile(file.GetPath()); 75*d77c2e09SJonas Devlieghere if (auto err = error_or_file.getError()) 76*d77c2e09SJonas Devlieghere return {}; 77*d77c2e09SJonas Devlieghere 78*d77c2e09SJonas Devlieghere std::vector<std::string> files; 79*d77c2e09SJonas Devlieghere llvm::yaml::Input yin((*error_or_file)->getBuffer()); 80*d77c2e09SJonas Devlieghere yin >> files; 81*d77c2e09SJonas Devlieghere 82*d77c2e09SJonas Devlieghere if (auto err = yin.error()) 83*d77c2e09SJonas Devlieghere return {}; 84*d77c2e09SJonas Devlieghere 85*d77c2e09SJonas Devlieghere return llvm::make_unique<CommandLoader>(std::move(files)); 86*d77c2e09SJonas Devlieghere } 87*d77c2e09SJonas Devlieghere 88*d77c2e09SJonas Devlieghere FILE *GetNextFile() { 89*d77c2e09SJonas Devlieghere if (m_index >= m_files.size()) 90*d77c2e09SJonas Devlieghere return nullptr; 91*d77c2e09SJonas Devlieghere return FileSystem::Instance().Fopen(m_files[m_index++].c_str(), "r"); 92*d77c2e09SJonas Devlieghere } 93*d77c2e09SJonas Devlieghere 94*d77c2e09SJonas Devlieghere private: 95*d77c2e09SJonas Devlieghere std::vector<std::string> m_files; 96*d77c2e09SJonas Devlieghere unsigned m_index = 0; 97*d77c2e09SJonas Devlieghere }; 98*d77c2e09SJonas Devlieghere 99b9c1b51eSKate Stone static llvm::sys::DynamicLibrary LoadPlugin(const lldb::DebuggerSP &debugger_sp, 100b9c1b51eSKate Stone const FileSpec &spec, 10197206d57SZachary Turner Status &error) { 102b9c1b51eSKate Stone llvm::sys::DynamicLibrary dynlib = 103b9c1b51eSKate Stone llvm::sys::DynamicLibrary::getPermanentLibrary(spec.GetPath().c_str()); 104b9c1b51eSKate Stone if (dynlib.isValid()) { 1055fb8f797SGreg Clayton typedef bool (*LLDBCommandPluginInit)(lldb::SBDebugger & debugger); 1065fb8f797SGreg Clayton 1075fb8f797SGreg Clayton lldb::SBDebugger debugger_sb(debugger_sp); 108b9c1b51eSKate Stone // This calls the bool lldb::PluginInitialize(lldb::SBDebugger debugger) 109b9c1b51eSKate Stone // function. 110b9c1b51eSKate Stone // TODO: mangle this differently for your system - on OSX, the first 111b9c1b51eSKate Stone // underscore needs to be removed and the second one stays 112b9c1b51eSKate Stone LLDBCommandPluginInit init_func = 11322701b2fSStephane Sezer (LLDBCommandPluginInit)(uintptr_t)dynlib.getAddressOfSymbol( 114b9c1b51eSKate Stone "_ZN4lldb16PluginInitializeENS_10SBDebuggerE"); 115b9c1b51eSKate Stone if (init_func) { 1165fb8f797SGreg Clayton if (init_func(debugger_sb)) 11758a559c0SZachary Turner return dynlib; 1185fb8f797SGreg Clayton else 119b9c1b51eSKate Stone error.SetErrorString("plug-in refused to load " 120b9c1b51eSKate Stone "(lldb::PluginInitialize(lldb::SBDebugger) " 121b9c1b51eSKate Stone "returned false)"); 122b9c1b51eSKate Stone } else { 123b9c1b51eSKate Stone error.SetErrorString("plug-in is missing the required initialization: " 124b9c1b51eSKate Stone "lldb::PluginInitialize(lldb::SBDebugger)"); 1255fb8f797SGreg Clayton } 126b9c1b51eSKate Stone } else { 127dbd7fabaSJonas Devlieghere if (FileSystem::Instance().Exists(spec)) 1285fb8f797SGreg Clayton error.SetErrorString("this file does not represent a loadable dylib"); 1295fb8f797SGreg Clayton else 1305fb8f797SGreg Clayton error.SetErrorString("no such file"); 1315fb8f797SGreg Clayton } 13258a559c0SZachary Turner return llvm::sys::DynamicLibrary(); 1335fb8f797SGreg Clayton } 1345fb8f797SGreg Clayton 135e6e2bb38SZachary Turner static llvm::ManagedStatic<SystemLifetimeManager> g_debugger_lifetime; 136e6e2bb38SZachary Turner 137b9c1b51eSKate Stone SBError SBInputReader::Initialize( 138b9c1b51eSKate Stone lldb::SBDebugger &sb_debugger, 139b9c1b51eSKate Stone unsigned long (*)(void *, lldb::SBInputReader *, lldb::InputReaderAction, 140b9c1b51eSKate Stone char const *, unsigned long), 141b9c1b51eSKate Stone void *, lldb::InputReaderGranularity, char const *, char const *, bool) { 142e6e2bb38SZachary Turner return SBError(); 143e6e2bb38SZachary Turner } 144e6e2bb38SZachary Turner 145b9c1b51eSKate Stone void SBInputReader::SetIsDone(bool) {} 146dbb0abbfSEugene Zelenko 147b9c1b51eSKate Stone bool SBInputReader::IsActive() const { return false; } 148e6e2bb38SZachary Turner 149dbb0abbfSEugene Zelenko SBDebugger::SBDebugger() = default; 150dbb0abbfSEugene Zelenko 151b9c1b51eSKate Stone SBDebugger::SBDebugger(const lldb::DebuggerSP &debugger_sp) 152b9c1b51eSKate Stone : m_opaque_sp(debugger_sp) {} 153dbb0abbfSEugene Zelenko 154b9c1b51eSKate Stone SBDebugger::SBDebugger(const SBDebugger &rhs) : m_opaque_sp(rhs.m_opaque_sp) {} 155dbb0abbfSEugene Zelenko 156dbb0abbfSEugene Zelenko SBDebugger::~SBDebugger() = default; 157dbb0abbfSEugene Zelenko 158b9c1b51eSKate Stone SBDebugger &SBDebugger::operator=(const SBDebugger &rhs) { 159b9c1b51eSKate Stone if (this != &rhs) { 160dbb0abbfSEugene Zelenko m_opaque_sp = rhs.m_opaque_sp; 161dbb0abbfSEugene Zelenko } 162dbb0abbfSEugene Zelenko return *this; 163dbb0abbfSEugene Zelenko } 164dbb0abbfSEugene Zelenko 165b9c1b51eSKate Stone void SBDebugger::Initialize() { 166936c6242SJonas Devlieghere SBError ignored = SBDebugger::InitializeWithErrorHandling(); 16715eacd74SJonas Devlieghere } 16815eacd74SJonas Devlieghere 169936c6242SJonas Devlieghere lldb::SBError SBDebugger::InitializeWithErrorHandling() { 1705160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 171ceb6b139SCaroline Tice 172ceb6b139SCaroline Tice if (log) 173ceb6b139SCaroline Tice log->Printf("SBDebugger::Initialize ()"); 174ceb6b139SCaroline Tice 17515eacd74SJonas Devlieghere SBError error; 17615eacd74SJonas Devlieghere if (auto e = g_debugger_lifetime->Initialize( 177936c6242SJonas Devlieghere llvm::make_unique<SystemInitializerFull>(), LoadPlugin)) { 17815eacd74SJonas Devlieghere error.SetError(Status(std::move(e))); 17915eacd74SJonas Devlieghere } 18015eacd74SJonas Devlieghere return error; 18130fdc8d8SChris Lattner } 18230fdc8d8SChris Lattner 183b9c1b51eSKate Stone void SBDebugger::Terminate() { g_debugger_lifetime->Terminate(); } 18430fdc8d8SChris Lattner 185b9c1b51eSKate Stone void SBDebugger::Clear() { 1865160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 187ceb6b139SCaroline Tice 188ceb6b139SCaroline Tice if (log) 189324a1036SSaleem Abdulrasool log->Printf("SBDebugger(%p)::Clear ()", 190324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get())); 1913d6086f6SCaroline Tice 1923d6086f6SCaroline Tice if (m_opaque_sp) 19344d93782SGreg Clayton m_opaque_sp->ClearIOHandlers(); 194ceb6b139SCaroline Tice 19548e42549SGreg Clayton m_opaque_sp.reset(); 19648e42549SGreg Clayton } 19748e42549SGreg Clayton 198b9c1b51eSKate Stone SBDebugger SBDebugger::Create() { 199dbb0abbfSEugene Zelenko return SBDebugger::Create(false, nullptr, nullptr); 20006942690SJim Ingham } 20106942690SJim Ingham 202b9c1b51eSKate Stone SBDebugger SBDebugger::Create(bool source_init_files) { 203dbb0abbfSEugene Zelenko return SBDebugger::Create(source_init_files, nullptr, nullptr); 204228063cdSJim Ingham } 205228063cdSJim Ingham 206b9c1b51eSKate Stone SBDebugger SBDebugger::Create(bool source_init_files, 207b9c1b51eSKate Stone lldb::LogOutputCallback callback, void *baton) 208228063cdSJim Ingham 209228063cdSJim Ingham { 2105160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 211ceb6b139SCaroline Tice 2126611103cSGreg Clayton SBDebugger debugger; 213cb172b10SGreg Clayton 214b9c1b51eSKate Stone // Currently we have issues if this function is called simultaneously on two 21505097246SAdrian Prantl // different threads. The issues mainly revolve around the fact that the 21605097246SAdrian Prantl // lldb_private::FormatManager uses global collections and having two threads 21705097246SAdrian Prantl // parsing the .lldbinit files can cause mayhem. So to get around this for 21805097246SAdrian Prantl // now we need to use a mutex to prevent bad things from happening. 21916ff8604SSaleem Abdulrasool static std::recursive_mutex g_mutex; 22016ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(g_mutex); 221cb172b10SGreg Clayton 222228063cdSJim Ingham debugger.reset(Debugger::CreateInstance(callback, baton)); 223ceb6b139SCaroline Tice 224b9c1b51eSKate Stone if (log) { 225ceb6b139SCaroline Tice SBStream sstr; 226ceb6b139SCaroline Tice debugger.GetDescription(sstr); 227324a1036SSaleem Abdulrasool log->Printf("SBDebugger::Create () => SBDebugger(%p): %s", 228324a1036SSaleem Abdulrasool static_cast<void *>(debugger.m_opaque_sp.get()), 229324a1036SSaleem Abdulrasool sstr.GetData()); 230ceb6b139SCaroline Tice } 231ceb6b139SCaroline Tice 23206942690SJim Ingham SBCommandInterpreter interp = debugger.GetCommandInterpreter(); 233b9c1b51eSKate Stone if (source_init_files) { 23406942690SJim Ingham interp.get()->SkipLLDBInitFiles(false); 23506942690SJim Ingham interp.get()->SkipAppInitFiles(false); 23606942690SJim Ingham SBCommandReturnObject result; 23706942690SJim Ingham interp.SourceInitFileInHomeDirectory(result); 238b9c1b51eSKate Stone } else { 23906942690SJim Ingham interp.get()->SkipLLDBInitFiles(true); 24006942690SJim Ingham interp.get()->SkipAppInitFiles(true); 24106942690SJim Ingham } 2426611103cSGreg Clayton return debugger; 2436611103cSGreg Clayton } 2446611103cSGreg Clayton 245b9c1b51eSKate Stone void SBDebugger::Destroy(SBDebugger &debugger) { 2465160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 247e02657b1SCaroline Tice 248b9c1b51eSKate Stone if (log) { 249e02657b1SCaroline Tice SBStream sstr; 250e02657b1SCaroline Tice debugger.GetDescription(sstr); 251324a1036SSaleem Abdulrasool log->Printf("SBDebugger::Destroy () => SBDebugger(%p): %s", 252324a1036SSaleem Abdulrasool static_cast<void *>(debugger.m_opaque_sp.get()), 253324a1036SSaleem Abdulrasool sstr.GetData()); 254e02657b1SCaroline Tice } 255e02657b1SCaroline Tice 256e02657b1SCaroline Tice Debugger::Destroy(debugger.m_opaque_sp); 257e02657b1SCaroline Tice 258dbb0abbfSEugene Zelenko if (debugger.m_opaque_sp.get() != nullptr) 259e02657b1SCaroline Tice debugger.m_opaque_sp.reset(); 260e02657b1SCaroline Tice } 261e02657b1SCaroline Tice 262b9c1b51eSKate Stone void SBDebugger::MemoryPressureDetected() { 26305097246SAdrian Prantl // Since this function can be call asynchronously, we allow it to be non- 26405097246SAdrian Prantl // mandatory. We have seen deadlocks with this function when called so we 26505097246SAdrian Prantl // need to safeguard against this until we can determine what is causing the 26605097246SAdrian Prantl // deadlocks. 2675160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 268aebdf1beSJim Ingham 2690cd70866SGreg Clayton const bool mandatory = false; 270b9c1b51eSKate Stone if (log) { 271b9c1b51eSKate Stone log->Printf("SBDebugger::MemoryPressureDetected (), mandatory = %d", 272b9c1b51eSKate Stone mandatory); 273aebdf1beSJim Ingham } 274aebdf1beSJim Ingham 2750cd70866SGreg Clayton ModuleList::RemoveOrphanSharedModules(mandatory); 276f9322415SGreg Clayton } 277f9322415SGreg Clayton 278b9c1b51eSKate Stone bool SBDebugger::IsValid() const { return m_opaque_sp.get() != nullptr; } 2796611103cSGreg Clayton 280b9c1b51eSKate Stone void SBDebugger::SetAsync(bool b) { 2816611103cSGreg Clayton if (m_opaque_sp) 2826611103cSGreg Clayton m_opaque_sp->SetAsyncExecution(b); 28330fdc8d8SChris Lattner } 28430fdc8d8SChris Lattner 285b9c1b51eSKate Stone bool SBDebugger::GetAsync() { 286dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->GetAsyncExecution() : false); 287e64f0dc7SJim Ingham } 288e64f0dc7SJim Ingham 289b9c1b51eSKate Stone void SBDebugger::SkipLLDBInitFiles(bool b) { 2906eee5aa0SGreg Clayton if (m_opaque_sp) 2916eee5aa0SGreg Clayton m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles(b); 2926eee5aa0SGreg Clayton } 2936eee5aa0SGreg Clayton 294b9c1b51eSKate Stone void SBDebugger::SkipAppInitFiles(bool b) { 29516e0c686SJim Ingham if (m_opaque_sp) 29616e0c686SJim Ingham m_opaque_sp->GetCommandInterpreter().SkipAppInitFiles(b); 29716e0c686SJim Ingham } 29816e0c686SJim Ingham 29905097246SAdrian Prantl // Shouldn't really be settable after initialization as this could cause lots 30005097246SAdrian Prantl // of problems; don't want users trying to switch modes in the middle of a 30105097246SAdrian Prantl // debugging session. 302b9c1b51eSKate Stone void SBDebugger::SetInputFileHandle(FILE *fh, bool transfer_ownership) { 3035160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 304ceb6b139SCaroline Tice 305ceb6b139SCaroline Tice if (log) 306b9c1b51eSKate Stone log->Printf( 307b9c1b51eSKate Stone "SBDebugger(%p)::SetInputFileHandle (fh=%p, transfer_ownership=%i)", 308b9c1b51eSKate Stone static_cast<void *>(m_opaque_sp.get()), static_cast<void *>(fh), 309b9c1b51eSKate Stone transfer_ownership); 310ceb6b139SCaroline Tice 311*d77c2e09SJonas Devlieghere if (!m_opaque_sp) 312*d77c2e09SJonas Devlieghere return; 313*d77c2e09SJonas Devlieghere 314*d77c2e09SJonas Devlieghere repro::DataRecorder *recorder = nullptr; 315*d77c2e09SJonas Devlieghere if (repro::Generator *g = repro::Reproducer::Instance().GetGenerator()) 316*d77c2e09SJonas Devlieghere recorder = g->GetOrCreate<repro::CommandProvider>().GetNewDataRecorder(); 317*d77c2e09SJonas Devlieghere 318*d77c2e09SJonas Devlieghere static std::unique_ptr<CommandLoader> loader = CommandLoader::Create(); 319*d77c2e09SJonas Devlieghere if (loader) 320*d77c2e09SJonas Devlieghere fh = loader->GetNextFile(); 321*d77c2e09SJonas Devlieghere 322*d77c2e09SJonas Devlieghere m_opaque_sp->SetInputFileHandle(fh, transfer_ownership, recorder); 32330fdc8d8SChris Lattner } 32430fdc8d8SChris Lattner 325b9c1b51eSKate Stone void SBDebugger::SetOutputFileHandle(FILE *fh, bool transfer_ownership) { 3265160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 327ceb6b139SCaroline Tice 328ceb6b139SCaroline Tice if (log) 329b9c1b51eSKate Stone log->Printf( 330b9c1b51eSKate Stone "SBDebugger(%p)::SetOutputFileHandle (fh=%p, transfer_ownership=%i)", 331b9c1b51eSKate Stone static_cast<void *>(m_opaque_sp.get()), static_cast<void *>(fh), 332b9c1b51eSKate Stone transfer_ownership); 333ceb6b139SCaroline Tice 3346611103cSGreg Clayton if (m_opaque_sp) 3356611103cSGreg Clayton m_opaque_sp->SetOutputFileHandle(fh, transfer_ownership); 33630fdc8d8SChris Lattner } 33730fdc8d8SChris Lattner 338b9c1b51eSKate Stone void SBDebugger::SetErrorFileHandle(FILE *fh, bool transfer_ownership) { 3395160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 340ceb6b139SCaroline Tice 341ceb6b139SCaroline Tice if (log) 342b9c1b51eSKate Stone log->Printf( 343b9c1b51eSKate Stone "SBDebugger(%p)::SetErrorFileHandle (fh=%p, transfer_ownership=%i)", 344b9c1b51eSKate Stone static_cast<void *>(m_opaque_sp.get()), static_cast<void *>(fh), 345b9c1b51eSKate Stone transfer_ownership); 346ceb6b139SCaroline Tice 3476611103cSGreg Clayton if (m_opaque_sp) 3486611103cSGreg Clayton m_opaque_sp->SetErrorFileHandle(fh, transfer_ownership); 34930fdc8d8SChris Lattner } 35030fdc8d8SChris Lattner 351b9c1b51eSKate Stone FILE *SBDebugger::GetInputFileHandle() { 352b9c1b51eSKate Stone if (m_opaque_sp) { 35344d93782SGreg Clayton StreamFileSP stream_file_sp(m_opaque_sp->GetInputFile()); 35444d93782SGreg Clayton if (stream_file_sp) 35544d93782SGreg Clayton return stream_file_sp->GetFile().GetStream(); 35644d93782SGreg Clayton } 357dbb0abbfSEugene Zelenko return nullptr; 35830fdc8d8SChris Lattner } 35930fdc8d8SChris Lattner 360b9c1b51eSKate Stone FILE *SBDebugger::GetOutputFileHandle() { 361b9c1b51eSKate Stone if (m_opaque_sp) { 36244d93782SGreg Clayton StreamFileSP stream_file_sp(m_opaque_sp->GetOutputFile()); 36344d93782SGreg Clayton if (stream_file_sp) 36444d93782SGreg Clayton return stream_file_sp->GetFile().GetStream(); 36544d93782SGreg Clayton } 366dbb0abbfSEugene Zelenko return nullptr; 36730fdc8d8SChris Lattner } 36830fdc8d8SChris Lattner 369b9c1b51eSKate Stone FILE *SBDebugger::GetErrorFileHandle() { 370b9c1b51eSKate Stone if (m_opaque_sp) { 37144d93782SGreg Clayton StreamFileSP stream_file_sp(m_opaque_sp->GetErrorFile()); 37244d93782SGreg Clayton if (stream_file_sp) 37344d93782SGreg Clayton return stream_file_sp->GetFile().GetStream(); 37444d93782SGreg Clayton } 375dbb0abbfSEugene Zelenko return nullptr; 37630fdc8d8SChris Lattner } 37730fdc8d8SChris Lattner 378b9c1b51eSKate Stone void SBDebugger::SaveInputTerminalState() { 379c5917d9aSJim Ingham if (m_opaque_sp) 380c5917d9aSJim Ingham m_opaque_sp->SaveInputTerminalState(); 381c5917d9aSJim Ingham } 382c5917d9aSJim Ingham 383b9c1b51eSKate Stone void SBDebugger::RestoreInputTerminalState() { 384c5917d9aSJim Ingham if (m_opaque_sp) 385c5917d9aSJim Ingham m_opaque_sp->RestoreInputTerminalState(); 386c5917d9aSJim Ingham } 387b9c1b51eSKate Stone SBCommandInterpreter SBDebugger::GetCommandInterpreter() { 3885160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 389ceb6b139SCaroline Tice 3906611103cSGreg Clayton SBCommandInterpreter sb_interpreter; 3916611103cSGreg Clayton if (m_opaque_sp) 3926611103cSGreg Clayton sb_interpreter.reset(&m_opaque_sp->GetCommandInterpreter()); 393ceb6b139SCaroline Tice 394750cd175SCaroline Tice if (log) 395b9c1b51eSKate Stone log->Printf( 396b9c1b51eSKate Stone "SBDebugger(%p)::GetCommandInterpreter () => SBCommandInterpreter(%p)", 397324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get()), 398324a1036SSaleem Abdulrasool static_cast<void *>(sb_interpreter.get())); 399750cd175SCaroline Tice 40030fdc8d8SChris Lattner return sb_interpreter; 40130fdc8d8SChris Lattner } 40230fdc8d8SChris Lattner 403b9c1b51eSKate Stone void SBDebugger::HandleCommand(const char *command) { 404b9c1b51eSKate Stone if (m_opaque_sp) { 405af67cecdSGreg Clayton TargetSP target_sp(m_opaque_sp->GetSelectedTarget()); 406bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 407af67cecdSGreg Clayton if (target_sp) 408bb19a13cSSaleem Abdulrasool lock = std::unique_lock<std::recursive_mutex>(target_sp->GetAPIMutex()); 409af67cecdSGreg Clayton 4106611103cSGreg Clayton SBCommandInterpreter sb_interpreter(GetCommandInterpreter()); 41130fdc8d8SChris Lattner SBCommandReturnObject result; 41230fdc8d8SChris Lattner 41330fdc8d8SChris Lattner sb_interpreter.HandleCommand(command, result, false); 41430fdc8d8SChris Lattner 415dbb0abbfSEugene Zelenko if (GetErrorFileHandle() != nullptr) 41630fdc8d8SChris Lattner result.PutError(GetErrorFileHandle()); 417dbb0abbfSEugene Zelenko if (GetOutputFileHandle() != nullptr) 41830fdc8d8SChris Lattner result.PutOutput(GetOutputFileHandle()); 41930fdc8d8SChris Lattner 420b9c1b51eSKate Stone if (!m_opaque_sp->GetAsyncExecution()) { 4216611103cSGreg Clayton SBProcess process(GetCommandInterpreter().GetProcess()); 422b9556accSGreg Clayton ProcessSP process_sp(process.GetSP()); 423b9c1b51eSKate Stone if (process_sp) { 42430fdc8d8SChris Lattner EventSP event_sp; 425583bbb1dSJim Ingham ListenerSP lldb_listener_sp = m_opaque_sp->GetListener(); 426d35031e1SPavel Labath while (lldb_listener_sp->GetEventForBroadcaster( 427d35031e1SPavel Labath process_sp.get(), event_sp, std::chrono::seconds(0))) { 42830fdc8d8SChris Lattner SBEvent event(event_sp); 429b9c1b51eSKate Stone HandleProcessEvent(process, event, GetOutputFileHandle(), 430b9c1b51eSKate Stone GetErrorFileHandle()); 43130fdc8d8SChris Lattner } 43230fdc8d8SChris Lattner } 43330fdc8d8SChris Lattner } 43430fdc8d8SChris Lattner } 4356611103cSGreg Clayton } 43630fdc8d8SChris Lattner 437b9c1b51eSKate Stone SBListener SBDebugger::GetListener() { 4385160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 439ceb6b139SCaroline Tice 4406611103cSGreg Clayton SBListener sb_listener; 4416611103cSGreg Clayton if (m_opaque_sp) 442583bbb1dSJim Ingham sb_listener.reset(m_opaque_sp->GetListener()); 443ceb6b139SCaroline Tice 444750cd175SCaroline Tice if (log) 445324a1036SSaleem Abdulrasool log->Printf("SBDebugger(%p)::GetListener () => SBListener(%p)", 446324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get()), 447324a1036SSaleem Abdulrasool static_cast<void *>(sb_listener.get())); 448750cd175SCaroline Tice 44930fdc8d8SChris Lattner return sb_listener; 45030fdc8d8SChris Lattner } 45130fdc8d8SChris Lattner 452b9c1b51eSKate Stone void SBDebugger::HandleProcessEvent(const SBProcess &process, 453b9c1b51eSKate Stone const SBEvent &event, FILE *out, 454b9c1b51eSKate Stone FILE *err) { 455af67cecdSGreg Clayton if (!process.IsValid()) 456af67cecdSGreg Clayton return; 457af67cecdSGreg Clayton 458b9556accSGreg Clayton TargetSP target_sp(process.GetTarget().GetSP()); 459b9556accSGreg Clayton if (!target_sp) 460b9556accSGreg Clayton return; 461b9556accSGreg Clayton 46230fdc8d8SChris Lattner const uint32_t event_type = event.GetType(); 46330fdc8d8SChris Lattner char stdio_buffer[1024]; 46430fdc8d8SChris Lattner size_t len; 46530fdc8d8SChris Lattner 466bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 467af67cecdSGreg Clayton 468b9c1b51eSKate Stone if (event_type & 469b9c1b51eSKate Stone (Process::eBroadcastBitSTDOUT | Process::eBroadcastBitStateChanged)) { 470af67cecdSGreg Clayton // Drain stdout when we stop just in case we have any bytes 47130fdc8d8SChris Lattner while ((len = process.GetSTDOUT(stdio_buffer, sizeof(stdio_buffer))) > 0) 472dbb0abbfSEugene Zelenko if (out != nullptr) 47330fdc8d8SChris Lattner ::fwrite(stdio_buffer, 1, len, out); 47430fdc8d8SChris Lattner } 475af67cecdSGreg Clayton 476b9c1b51eSKate Stone if (event_type & 477b9c1b51eSKate Stone (Process::eBroadcastBitSTDERR | Process::eBroadcastBitStateChanged)) { 478af67cecdSGreg Clayton // Drain stderr when we stop just in case we have any bytes 47930fdc8d8SChris Lattner while ((len = process.GetSTDERR(stdio_buffer, sizeof(stdio_buffer))) > 0) 480dbb0abbfSEugene Zelenko if (err != nullptr) 481af67cecdSGreg Clayton ::fwrite(stdio_buffer, 1, len, err); 48230fdc8d8SChris Lattner } 483af67cecdSGreg Clayton 484b9c1b51eSKate Stone if (event_type & Process::eBroadcastBitStateChanged) { 48530fdc8d8SChris Lattner StateType event_state = SBProcess::GetStateFromEvent(event); 48630fdc8d8SChris Lattner 48730fdc8d8SChris Lattner if (event_state == eStateInvalid) 48830fdc8d8SChris Lattner return; 48930fdc8d8SChris Lattner 49030fdc8d8SChris Lattner bool is_stopped = StateIsStoppedState(event_state); 49130fdc8d8SChris Lattner if (!is_stopped) 4922976d00aSJim Ingham process.ReportEventState(event, out); 49330fdc8d8SChris Lattner } 49430fdc8d8SChris Lattner } 49530fdc8d8SChris Lattner 496b9c1b51eSKate Stone SBSourceManager SBDebugger::GetSourceManager() { 497e37d605eSJim Ingham SBSourceManager sb_source_manager(*this); 498e37d605eSJim Ingham return sb_source_manager; 49930fdc8d8SChris Lattner } 50030fdc8d8SChris Lattner 501b9c1b51eSKate Stone bool SBDebugger::GetDefaultArchitecture(char *arch_name, size_t arch_name_len) { 502b9c1b51eSKate Stone if (arch_name && arch_name_len) { 503431ce678SGreg Clayton ArchSpec default_arch = Target::GetDefaultArchitecture(); 504daccaa9eSCaroline Tice 505b9c1b51eSKate Stone if (default_arch.IsValid()) { 506431ce678SGreg Clayton const std::string &triple_str = default_arch.GetTriple().str(); 507431ce678SGreg Clayton if (!triple_str.empty()) 508431ce678SGreg Clayton ::snprintf(arch_name, arch_name_len, "%s", triple_str.c_str()); 509431ce678SGreg Clayton else 510b9c1b51eSKate Stone ::snprintf(arch_name, arch_name_len, "%s", 511b9c1b51eSKate Stone default_arch.GetArchitectureName()); 51230fdc8d8SChris Lattner return true; 51330fdc8d8SChris Lattner } 51430fdc8d8SChris Lattner } 51530fdc8d8SChris Lattner if (arch_name && arch_name_len) 51630fdc8d8SChris Lattner arch_name[0] = '\0'; 51730fdc8d8SChris Lattner return false; 51830fdc8d8SChris Lattner } 51930fdc8d8SChris Lattner 520b9c1b51eSKate Stone bool SBDebugger::SetDefaultArchitecture(const char *arch_name) { 521b9c1b51eSKate Stone if (arch_name) { 52270512317SGreg Clayton ArchSpec arch(arch_name); 523b9c1b51eSKate Stone if (arch.IsValid()) { 524431ce678SGreg Clayton Target::SetDefaultArchitecture(arch); 52530fdc8d8SChris Lattner return true; 52630fdc8d8SChris Lattner } 52730fdc8d8SChris Lattner } 52830fdc8d8SChris Lattner return false; 52930fdc8d8SChris Lattner } 53030fdc8d8SChris Lattner 53130fdc8d8SChris Lattner ScriptLanguage 532b9c1b51eSKate Stone SBDebugger::GetScriptingLanguage(const char *script_language_name) { 5337b2e5a36SZachary Turner if (!script_language_name) return eScriptLanguageDefault; 53447cbf4a0SPavel Labath return OptionArgParser::ToScriptLanguage( 53547cbf4a0SPavel Labath llvm::StringRef(script_language_name), eScriptLanguageDefault, nullptr); 53630fdc8d8SChris Lattner } 53730fdc8d8SChris Lattner 538b9c1b51eSKate Stone const char *SBDebugger::GetVersionString() { 539b2f1fb29SVirgile Bello return lldb_private::GetVersion(); 54030fdc8d8SChris Lattner } 54130fdc8d8SChris Lattner 542b9c1b51eSKate Stone const char *SBDebugger::StateAsCString(StateType state) { 543c2bbb49aSCaroline Tice return lldb_private::StateAsCString(state); 54430fdc8d8SChris Lattner } 54530fdc8d8SChris Lattner 546f1389e92SPavel Labath static void AddBoolConfigEntry(StructuredData::Dictionary &dict, 547f1389e92SPavel Labath llvm::StringRef name, bool value, 548f1389e92SPavel Labath llvm::StringRef description) { 549f1389e92SPavel Labath auto entry_up = llvm::make_unique<StructuredData::Dictionary>(); 550f1389e92SPavel Labath entry_up->AddBooleanItem("value", value); 551f1389e92SPavel Labath entry_up->AddStringItem("description", description); 552f1389e92SPavel Labath dict.AddItem(name, std::move(entry_up)); 553f1389e92SPavel Labath } 554f1389e92SPavel Labath 555abc0c6adSPavel Labath static void AddLLVMTargets(StructuredData::Dictionary &dict) { 556abc0c6adSPavel Labath auto array_up = llvm::make_unique<StructuredData::Array>(); 557abc0c6adSPavel Labath #define LLVM_TARGET(target) \ 558abc0c6adSPavel Labath array_up->AddItem(llvm::make_unique<StructuredData::String>(#target)); 559abc0c6adSPavel Labath #include "llvm/Config/Targets.def" 560abc0c6adSPavel Labath auto entry_up = llvm::make_unique<StructuredData::Dictionary>(); 561abc0c6adSPavel Labath entry_up->AddItem("value", std::move(array_up)); 562abc0c6adSPavel Labath entry_up->AddStringItem("description", "A list of configured LLVM targets."); 563abc0c6adSPavel Labath dict.AddItem("targets", std::move(entry_up)); 564abc0c6adSPavel Labath } 565abc0c6adSPavel Labath 566f1389e92SPavel Labath SBStructuredData SBDebugger::GetBuildConfiguration() { 567f1389e92SPavel Labath auto config_up = llvm::make_unique<StructuredData::Dictionary>(); 568f1389e92SPavel Labath AddBoolConfigEntry( 569f1389e92SPavel Labath *config_up, "xml", XMLDocument::XMLEnabled(), 570f1389e92SPavel Labath "A boolean value that indicates if XML support is enabled in LLDB"); 571abc0c6adSPavel Labath AddLLVMTargets(*config_up); 572f1389e92SPavel Labath 573f1389e92SPavel Labath SBStructuredData data; 574f1389e92SPavel Labath data.m_impl_up->SetObjectSP(std::move(config_up)); 575f1389e92SPavel Labath return data; 576f1389e92SPavel Labath } 577f1389e92SPavel Labath 578b9c1b51eSKate Stone bool SBDebugger::StateIsRunningState(StateType state) { 5795160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 5804838131bSGreg Clayton 581c2bbb49aSCaroline Tice const bool result = lldb_private::StateIsRunningState(state); 5824838131bSGreg Clayton if (log) 5834838131bSGreg Clayton log->Printf("SBDebugger::StateIsRunningState (state=%s) => %i", 584431ce678SGreg Clayton StateAsCString(state), result); 5854838131bSGreg Clayton 5864838131bSGreg Clayton return result; 58730fdc8d8SChris Lattner } 58830fdc8d8SChris Lattner 589b9c1b51eSKate Stone bool SBDebugger::StateIsStoppedState(StateType state) { 5905160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 591ceb6b139SCaroline Tice 5922637f825SGreg Clayton const bool result = lldb_private::StateIsStoppedState(state, false); 593ceb6b139SCaroline Tice if (log) 5944838131bSGreg Clayton log->Printf("SBDebugger::StateIsStoppedState (state=%s) => %i", 595431ce678SGreg Clayton StateAsCString(state), result); 596ceb6b139SCaroline Tice 5974838131bSGreg Clayton return result; 59830fdc8d8SChris Lattner } 59930fdc8d8SChris Lattner 600b9c1b51eSKate Stone lldb::SBTarget SBDebugger::CreateTarget(const char *filename, 601cac9c5f9SGreg Clayton const char *target_triple, 602cac9c5f9SGreg Clayton const char *platform_name, 603cac9c5f9SGreg Clayton bool add_dependent_modules, 604b9c1b51eSKate Stone lldb::SBError &sb_error) { 605cac9c5f9SGreg Clayton SBTarget sb_target; 606b9556accSGreg Clayton TargetSP target_sp; 607b9c1b51eSKate Stone if (m_opaque_sp) { 608cac9c5f9SGreg Clayton sb_error.Clear(); 609cac9c5f9SGreg Clayton OptionGroupPlatform platform_options(false); 610cac9c5f9SGreg Clayton platform_options.SetPlatformName(platform_name); 611cac9c5f9SGreg Clayton 612b9c1b51eSKate Stone sb_error.ref() = m_opaque_sp->GetTargetList().CreateTarget( 613f9a07e9fSJonas Devlieghere *m_opaque_sp, filename, target_triple, 614f9a07e9fSJonas Devlieghere add_dependent_modules ? eLoadDependentsYes : eLoadDependentsNo, 615b9c1b51eSKate Stone &platform_options, target_sp); 616cac9c5f9SGreg Clayton 617cac9c5f9SGreg Clayton if (sb_error.Success()) 618b9556accSGreg Clayton sb_target.SetSP(target_sp); 619b9c1b51eSKate Stone } else { 6209f521f22SJim Ingham sb_error.SetErrorString("invalid debugger"); 621cac9c5f9SGreg Clayton } 622cac9c5f9SGreg Clayton 6235160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 624cac9c5f9SGreg Clayton if (log) 625b9c1b51eSKate Stone log->Printf("SBDebugger(%p)::CreateTarget (filename=\"%s\", triple=%s, " 626b9c1b51eSKate Stone "platform_name=%s, add_dependent_modules=%u, error=%s) => " 627b9c1b51eSKate Stone "SBTarget(%p)", 628b9c1b51eSKate Stone static_cast<void *>(m_opaque_sp.get()), filename, target_triple, 629b9c1b51eSKate Stone platform_name, add_dependent_modules, sb_error.GetCString(), 630b9c1b51eSKate Stone static_cast<void *>(target_sp.get())); 631cac9c5f9SGreg Clayton 632cac9c5f9SGreg Clayton return sb_target; 633cac9c5f9SGreg Clayton } 63430fdc8d8SChris Lattner 63530fdc8d8SChris Lattner SBTarget 63630fdc8d8SChris Lattner SBDebugger::CreateTargetWithFileAndTargetTriple(const char *filename, 637b9c1b51eSKate Stone const char *target_triple) { 638b9556accSGreg Clayton SBTarget sb_target; 639b9556accSGreg Clayton TargetSP target_sp; 640b9c1b51eSKate Stone if (m_opaque_sp) { 641cac9c5f9SGreg Clayton const bool add_dependent_modules = true; 64297206d57SZachary Turner Status error(m_opaque_sp->GetTargetList().CreateTarget( 643f9a07e9fSJonas Devlieghere *m_opaque_sp, filename, target_triple, 644f9a07e9fSJonas Devlieghere add_dependent_modules ? eLoadDependentsYes : eLoadDependentsNo, nullptr, 645cac9c5f9SGreg Clayton target_sp)); 646b9556accSGreg Clayton sb_target.SetSP(target_sp); 6476611103cSGreg Clayton } 6484838131bSGreg Clayton 6495160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 6504838131bSGreg Clayton if (log) 651b9c1b51eSKate Stone log->Printf("SBDebugger(%p)::CreateTargetWithFileAndTargetTriple " 652b9c1b51eSKate Stone "(filename=\"%s\", triple=%s) => SBTarget(%p)", 653b9c1b51eSKate Stone static_cast<void *>(m_opaque_sp.get()), filename, target_triple, 654b9c1b51eSKate Stone static_cast<void *>(target_sp.get())); 6554838131bSGreg Clayton 656b9556accSGreg Clayton return sb_target; 65730fdc8d8SChris Lattner } 65830fdc8d8SChris Lattner 659b9c1b51eSKate Stone SBTarget SBDebugger::CreateTargetWithFileAndArch(const char *filename, 660b9c1b51eSKate Stone const char *arch_cstr) { 6615160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 662ceb6b139SCaroline Tice 663b9556accSGreg Clayton SBTarget sb_target; 664b9556accSGreg Clayton TargetSP target_sp; 665b9c1b51eSKate Stone if (m_opaque_sp) { 66697206d57SZachary Turner Status error; 667cac9c5f9SGreg Clayton const bool add_dependent_modules = true; 66830fdc8d8SChris Lattner 669b9c1b51eSKate Stone error = m_opaque_sp->GetTargetList().CreateTarget( 670f9a07e9fSJonas Devlieghere *m_opaque_sp, filename, arch_cstr, 671f9a07e9fSJonas Devlieghere add_dependent_modules ? eLoadDependentsYes : eLoadDependentsNo, nullptr, 672cac9c5f9SGreg Clayton target_sp); 67330fdc8d8SChris Lattner 674b9c1b51eSKate Stone if (error.Success()) { 6752976d00aSJim Ingham m_opaque_sp->GetTargetList().SetSelectedTarget(target_sp.get()); 676b9556accSGreg Clayton sb_target.SetSP(target_sp); 6776611103cSGreg Clayton } 6786611103cSGreg Clayton } 679ceb6b139SCaroline Tice 680ceb6b139SCaroline Tice if (log) 681b9c1b51eSKate Stone log->Printf("SBDebugger(%p)::CreateTargetWithFileAndArch (filename=\"%s\", " 682b9c1b51eSKate Stone "arch=%s) => SBTarget(%p)", 683324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get()), filename, arch_cstr, 684324a1036SSaleem Abdulrasool static_cast<void *>(target_sp.get())); 685ceb6b139SCaroline Tice 686b9556accSGreg Clayton return sb_target; 68730fdc8d8SChris Lattner } 68830fdc8d8SChris Lattner 689b9c1b51eSKate Stone SBTarget SBDebugger::CreateTarget(const char *filename) { 690b9556accSGreg Clayton SBTarget sb_target; 691b9556accSGreg Clayton TargetSP target_sp; 692b9c1b51eSKate Stone if (m_opaque_sp) { 69397206d57SZachary Turner Status error; 694cac9c5f9SGreg Clayton const bool add_dependent_modules = true; 695b9c1b51eSKate Stone error = m_opaque_sp->GetTargetList().CreateTarget( 696f9a07e9fSJonas Devlieghere *m_opaque_sp, filename, "", 697f9a07e9fSJonas Devlieghere add_dependent_modules ? eLoadDependentsYes : eLoadDependentsNo, nullptr, 698f9a07e9fSJonas Devlieghere target_sp); 69930fdc8d8SChris Lattner 700b9c1b51eSKate Stone if (error.Success()) { 7012976d00aSJim Ingham m_opaque_sp->GetTargetList().SetSelectedTarget(target_sp.get()); 702b9556accSGreg Clayton sb_target.SetSP(target_sp); 7036611103cSGreg Clayton } 7046611103cSGreg Clayton } 7055160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 7064838131bSGreg Clayton if (log) 707b9c1b51eSKate Stone log->Printf( 708b9c1b51eSKate Stone "SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)", 709324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get()), filename, 710324a1036SSaleem Abdulrasool static_cast<void *>(target_sp.get())); 711b9556accSGreg Clayton return sb_target; 71230fdc8d8SChris Lattner } 71330fdc8d8SChris Lattner 714b842f2ecSJim Ingham SBTarget SBDebugger::GetDummyTarget() { 715b842f2ecSJim Ingham SBTarget sb_target; 716b842f2ecSJim Ingham if (m_opaque_sp) { 717b842f2ecSJim Ingham sb_target.SetSP(m_opaque_sp->GetDummyTarget()->shared_from_this()); 718b842f2ecSJim Ingham } 719b842f2ecSJim Ingham Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 720b842f2ecSJim Ingham if (log) 721b842f2ecSJim Ingham log->Printf( 722b842f2ecSJim Ingham "SBDebugger(%p)::GetDummyTarget() => SBTarget(%p)", 723b842f2ecSJim Ingham static_cast<void *>(m_opaque_sp.get()), 724b842f2ecSJim Ingham static_cast<void *>(sb_target.GetSP().get())); 725b842f2ecSJim Ingham return sb_target; 726b842f2ecSJim Ingham } 727b842f2ecSJim Ingham 728b9c1b51eSKate Stone bool SBDebugger::DeleteTarget(lldb::SBTarget &target) { 7293794ad95SJohnny Chen bool result = false; 730b9c1b51eSKate Stone if (m_opaque_sp) { 731b9556accSGreg Clayton TargetSP target_sp(target.GetSP()); 732b9c1b51eSKate Stone if (target_sp) { 7333794ad95SJohnny Chen // No need to lock, the target list is thread safe 734b9556accSGreg Clayton result = m_opaque_sp->GetTargetList().DeleteTarget(target_sp); 735b9556accSGreg Clayton target_sp->Destroy(); 73675340622SGreg Clayton target.Clear(); 7370cd70866SGreg Clayton const bool mandatory = true; 7380cd70866SGreg Clayton ModuleList::RemoveOrphanSharedModules(mandatory); 7393794ad95SJohnny Chen } 740b9556accSGreg Clayton } 7413794ad95SJohnny Chen 7425160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 7433794ad95SJohnny Chen if (log) 744324a1036SSaleem Abdulrasool log->Printf("SBDebugger(%p)::DeleteTarget (SBTarget(%p)) => %i", 745324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get()), 746324a1036SSaleem Abdulrasool static_cast<void *>(target.m_opaque_sp.get()), result); 7473794ad95SJohnny Chen 7483794ad95SJohnny Chen return result; 7493794ad95SJohnny Chen } 750dbb0abbfSEugene Zelenko 751b9c1b51eSKate Stone SBTarget SBDebugger::GetTargetAtIndex(uint32_t idx) { 7526611103cSGreg Clayton SBTarget sb_target; 753b9c1b51eSKate Stone if (m_opaque_sp) { 754af67cecdSGreg Clayton // No need to lock, the target list is thread safe 755b9556accSGreg Clayton sb_target.SetSP(m_opaque_sp->GetTargetList().GetTargetAtIndex(idx)); 756af67cecdSGreg Clayton } 75730fdc8d8SChris Lattner return sb_target; 75830fdc8d8SChris Lattner } 75930fdc8d8SChris Lattner 760b9c1b51eSKate Stone uint32_t SBDebugger::GetIndexOfTarget(lldb::SBTarget target) { 7618499e1a4SJim Ingham 7628499e1a4SJim Ingham lldb::TargetSP target_sp = target.GetSP(); 7638499e1a4SJim Ingham if (!target_sp) 7648499e1a4SJim Ingham return UINT32_MAX; 7658499e1a4SJim Ingham 7668499e1a4SJim Ingham if (!m_opaque_sp) 7678499e1a4SJim Ingham return UINT32_MAX; 7688499e1a4SJim Ingham 7698499e1a4SJim Ingham return m_opaque_sp->GetTargetList().GetIndexOfTarget(target.GetSP()); 7708499e1a4SJim Ingham } 7718499e1a4SJim Ingham 772b9c1b51eSKate Stone SBTarget SBDebugger::FindTargetWithProcessID(lldb::pid_t pid) { 7736611103cSGreg Clayton SBTarget sb_target; 774b9c1b51eSKate Stone if (m_opaque_sp) { 775af67cecdSGreg Clayton // No need to lock, the target list is thread safe 776b9556accSGreg Clayton sb_target.SetSP(m_opaque_sp->GetTargetList().FindTargetWithProcessID(pid)); 777af67cecdSGreg Clayton } 77830fdc8d8SChris Lattner return sb_target; 77930fdc8d8SChris Lattner } 78030fdc8d8SChris Lattner 781b9c1b51eSKate Stone SBTarget SBDebugger::FindTargetWithFileAndArch(const char *filename, 782b9c1b51eSKate Stone const char *arch_name) { 7836611103cSGreg Clayton SBTarget sb_target; 784b9c1b51eSKate Stone if (m_opaque_sp && filename && filename[0]) { 785af67cecdSGreg Clayton // No need to lock, the target list is thread safe 7867263f1bdSPavel Labath ArchSpec arch = Platform::GetAugmentedArchSpec( 7877263f1bdSPavel Labath m_opaque_sp->GetPlatformList().GetSelectedPlatform().get(), arch_name); 788b9c1b51eSKate Stone TargetSP target_sp( 789b9c1b51eSKate Stone m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture( 7908f3be7a3SJonas Devlieghere FileSpec(filename), arch_name ? &arch : nullptr)); 791b9556accSGreg Clayton sb_target.SetSP(target_sp); 7926611103cSGreg Clayton } 7936611103cSGreg Clayton return sb_target; 79430fdc8d8SChris Lattner } 79530fdc8d8SChris Lattner 796b9c1b51eSKate Stone SBTarget SBDebugger::FindTargetWithLLDBProcess(const ProcessSP &process_sp) { 7976611103cSGreg Clayton SBTarget sb_target; 798b9c1b51eSKate Stone if (m_opaque_sp) { 799af67cecdSGreg Clayton // No need to lock, the target list is thread safe 800b9c1b51eSKate Stone sb_target.SetSP( 801b9c1b51eSKate Stone m_opaque_sp->GetTargetList().FindTargetWithProcess(process_sp.get())); 802af67cecdSGreg Clayton } 80330fdc8d8SChris Lattner return sb_target; 80430fdc8d8SChris Lattner } 80530fdc8d8SChris Lattner 806b9c1b51eSKate Stone uint32_t SBDebugger::GetNumTargets() { 807b9c1b51eSKate Stone if (m_opaque_sp) { 808af67cecdSGreg Clayton // No need to lock, the target list is thread safe 8096611103cSGreg Clayton return m_opaque_sp->GetTargetList().GetNumTargets(); 810af67cecdSGreg Clayton } 8116611103cSGreg Clayton return 0; 8126611103cSGreg Clayton } 81330fdc8d8SChris Lattner 814b9c1b51eSKate Stone SBTarget SBDebugger::GetSelectedTarget() { 8155160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 816ceb6b139SCaroline Tice 8176611103cSGreg Clayton SBTarget sb_target; 818b9556accSGreg Clayton TargetSP target_sp; 819b9c1b51eSKate Stone if (m_opaque_sp) { 820af67cecdSGreg Clayton // No need to lock, the target list is thread safe 821b9556accSGreg Clayton target_sp = m_opaque_sp->GetTargetList().GetSelectedTarget(); 822b9556accSGreg Clayton sb_target.SetSP(target_sp); 823af67cecdSGreg Clayton } 824ceb6b139SCaroline Tice 825b9c1b51eSKate Stone if (log) { 826ceb6b139SCaroline Tice SBStream sstr; 827431ce678SGreg Clayton sb_target.GetDescription(sstr, eDescriptionLevelBrief); 828324a1036SSaleem Abdulrasool log->Printf("SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s", 829324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get()), 830324a1036SSaleem Abdulrasool static_cast<void *>(target_sp.get()), sstr.GetData()); 831ceb6b139SCaroline Tice } 832ceb6b139SCaroline Tice 83330fdc8d8SChris Lattner return sb_target; 83430fdc8d8SChris Lattner } 83530fdc8d8SChris Lattner 836b9c1b51eSKate Stone void SBDebugger::SetSelectedTarget(SBTarget &sb_target) { 8375160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 838e64f0dc7SJim Ingham 839b9556accSGreg Clayton TargetSP target_sp(sb_target.GetSP()); 840b9c1b51eSKate Stone if (m_opaque_sp) { 841b9556accSGreg Clayton m_opaque_sp->GetTargetList().SetSelectedTarget(target_sp.get()); 842e64f0dc7SJim Ingham } 843b9c1b51eSKate Stone if (log) { 844e64f0dc7SJim Ingham SBStream sstr; 845e64f0dc7SJim Ingham sb_target.GetDescription(sstr, eDescriptionLevelBrief); 846324a1036SSaleem Abdulrasool log->Printf("SBDebugger(%p)::SetSelectedTarget () => SBTarget(%p): %s", 847324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get()), 848324a1036SSaleem Abdulrasool static_cast<void *>(target_sp.get()), sstr.GetData()); 849e64f0dc7SJim Ingham } 850e64f0dc7SJim Ingham } 851e64f0dc7SJim Ingham 852b9c1b51eSKate Stone SBPlatform SBDebugger::GetSelectedPlatform() { 853fbb76349SGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 854fbb76349SGreg Clayton 855fbb76349SGreg Clayton SBPlatform sb_platform; 856fbb76349SGreg Clayton DebuggerSP debugger_sp(m_opaque_sp); 857b9c1b51eSKate Stone if (debugger_sp) { 858fbb76349SGreg Clayton sb_platform.SetSP(debugger_sp->GetPlatformList().GetSelectedPlatform()); 859fbb76349SGreg Clayton } 860fbb76349SGreg Clayton if (log) 861324a1036SSaleem Abdulrasool log->Printf("SBDebugger(%p)::GetSelectedPlatform () => SBPlatform(%p): %s", 862324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get()), 863324a1036SSaleem Abdulrasool static_cast<void *>(sb_platform.GetSP().get()), 864324a1036SSaleem Abdulrasool sb_platform.GetName()); 865fbb76349SGreg Clayton return sb_platform; 866fbb76349SGreg Clayton } 867fbb76349SGreg Clayton 868b9c1b51eSKate Stone void SBDebugger::SetSelectedPlatform(SBPlatform &sb_platform) { 869fbb76349SGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 870fbb76349SGreg Clayton 871fbb76349SGreg Clayton DebuggerSP debugger_sp(m_opaque_sp); 872b9c1b51eSKate Stone if (debugger_sp) { 873fbb76349SGreg Clayton debugger_sp->GetPlatformList().SetSelectedPlatform(sb_platform.GetSP()); 874fbb76349SGreg Clayton } 875324a1036SSaleem Abdulrasool 876fbb76349SGreg Clayton if (log) 877324a1036SSaleem Abdulrasool log->Printf("SBDebugger(%p)::SetSelectedPlatform (SBPlatform(%p) %s)", 878324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get()), 879324a1036SSaleem Abdulrasool static_cast<void *>(sb_platform.GetSP().get()), 880324a1036SSaleem Abdulrasool sb_platform.GetName()); 881fbb76349SGreg Clayton } 882fbb76349SGreg Clayton 883c10e34d0SVadim Macagon uint32_t SBDebugger::GetNumPlatforms() { 884c10e34d0SVadim Macagon if (m_opaque_sp) { 885c10e34d0SVadim Macagon // No need to lock, the platform list is thread safe 886c10e34d0SVadim Macagon return m_opaque_sp->GetPlatformList().GetSize(); 887c10e34d0SVadim Macagon } 888c10e34d0SVadim Macagon return 0; 889c10e34d0SVadim Macagon } 890c10e34d0SVadim Macagon 891c10e34d0SVadim Macagon SBPlatform SBDebugger::GetPlatformAtIndex(uint32_t idx) { 892c10e34d0SVadim Macagon SBPlatform sb_platform; 893c10e34d0SVadim Macagon if (m_opaque_sp) { 894c10e34d0SVadim Macagon // No need to lock, the platform list is thread safe 895c10e34d0SVadim Macagon sb_platform.SetSP(m_opaque_sp->GetPlatformList().GetAtIndex(idx)); 896c10e34d0SVadim Macagon } 897c10e34d0SVadim Macagon return sb_platform; 898c10e34d0SVadim Macagon } 899c10e34d0SVadim Macagon 900c10e34d0SVadim Macagon uint32_t SBDebugger::GetNumAvailablePlatforms() { 901c10e34d0SVadim Macagon uint32_t idx = 0; 902c10e34d0SVadim Macagon while (true) { 903c10e34d0SVadim Macagon if (!PluginManager::GetPlatformPluginNameAtIndex(idx)) { 904c10e34d0SVadim Macagon break; 905c10e34d0SVadim Macagon } 906c10e34d0SVadim Macagon ++idx; 907c10e34d0SVadim Macagon } 908c10e34d0SVadim Macagon // +1 for the host platform, which should always appear first in the list. 909c10e34d0SVadim Macagon return idx + 1; 910c10e34d0SVadim Macagon } 911c10e34d0SVadim Macagon 912c10e34d0SVadim Macagon SBStructuredData SBDebugger::GetAvailablePlatformInfoAtIndex(uint32_t idx) { 913c10e34d0SVadim Macagon SBStructuredData data; 914c10e34d0SVadim Macagon auto platform_dict = llvm::make_unique<StructuredData::Dictionary>(); 915c10e34d0SVadim Macagon llvm::StringRef name_str("name"), desc_str("description"); 916c10e34d0SVadim Macagon 917c10e34d0SVadim Macagon if (idx == 0) { 918c10e34d0SVadim Macagon PlatformSP host_platform_sp(Platform::GetHostPlatform()); 919c10e34d0SVadim Macagon platform_dict->AddStringItem( 920c10e34d0SVadim Macagon name_str, host_platform_sp->GetPluginName().GetStringRef()); 921c10e34d0SVadim Macagon platform_dict->AddStringItem( 922c10e34d0SVadim Macagon desc_str, llvm::StringRef(host_platform_sp->GetDescription())); 923c10e34d0SVadim Macagon } else if (idx > 0) { 924c10e34d0SVadim Macagon const char *plugin_name = 925c10e34d0SVadim Macagon PluginManager::GetPlatformPluginNameAtIndex(idx - 1); 926c10e34d0SVadim Macagon if (!plugin_name) { 927c10e34d0SVadim Macagon return data; 928c10e34d0SVadim Macagon } 929c10e34d0SVadim Macagon platform_dict->AddStringItem(name_str, llvm::StringRef(plugin_name)); 930c10e34d0SVadim Macagon 931c10e34d0SVadim Macagon const char *plugin_desc = 932c10e34d0SVadim Macagon PluginManager::GetPlatformPluginDescriptionAtIndex(idx - 1); 933c10e34d0SVadim Macagon if (!plugin_desc) { 934c10e34d0SVadim Macagon return data; 935c10e34d0SVadim Macagon } 936c10e34d0SVadim Macagon platform_dict->AddStringItem(desc_str, llvm::StringRef(plugin_desc)); 937c10e34d0SVadim Macagon } 938c10e34d0SVadim Macagon 939c10e34d0SVadim Macagon data.m_impl_up->SetObjectSP( 940c10e34d0SVadim Macagon StructuredData::ObjectSP(platform_dict.release())); 941c10e34d0SVadim Macagon return data; 942c10e34d0SVadim Macagon } 943c10e34d0SVadim Macagon 944b9c1b51eSKate Stone void SBDebugger::DispatchInput(void *baton, const void *data, size_t data_len) { 9456b09d423SEnrico Granata DispatchInput(data, data_len); 9466b09d423SEnrico Granata } 9476b09d423SEnrico Granata 948b9c1b51eSKate Stone void SBDebugger::DispatchInput(const void *data, size_t data_len) { 94944d93782SGreg Clayton // Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 95044d93782SGreg Clayton // 95144d93782SGreg Clayton // if (log) 952b9c1b51eSKate Stone // log->Printf ("SBDebugger(%p)::DispatchInput (data=\"%.*s\", 953b9c1b51eSKate Stone // size_t=%" PRIu64 ")", 95444d93782SGreg Clayton // m_opaque_sp.get(), 95544d93782SGreg Clayton // (int) data_len, 95644d93782SGreg Clayton // (const char *) data, 95744d93782SGreg Clayton // (uint64_t)data_len); 95844d93782SGreg Clayton // 95944d93782SGreg Clayton // if (m_opaque_sp) 96044d93782SGreg Clayton // m_opaque_sp->DispatchInput ((const char *) data, data_len); 96130fdc8d8SChris Lattner } 96230fdc8d8SChris Lattner 963b9c1b51eSKate Stone void SBDebugger::DispatchInputInterrupt() { 964efed6131SCaroline Tice if (m_opaque_sp) 965efed6131SCaroline Tice m_opaque_sp->DispatchInputInterrupt(); 966efed6131SCaroline Tice } 967efed6131SCaroline Tice 968b9c1b51eSKate Stone void SBDebugger::DispatchInputEndOfFile() { 969efed6131SCaroline Tice if (m_opaque_sp) 970efed6131SCaroline Tice m_opaque_sp->DispatchInputEndOfFile(); 971efed6131SCaroline Tice } 9729088b068SCaroline Tice 973b9c1b51eSKate Stone void SBDebugger::PushInputReader(SBInputReader &reader) {} 9746611103cSGreg Clayton 975b9c1b51eSKate Stone void SBDebugger::RunCommandInterpreter(bool auto_handle_events, 976b9c1b51eSKate Stone bool spawn_thread) { 977b9c1b51eSKate Stone if (m_opaque_sp) { 97826c7bf93SJim Ingham CommandInterpreterRunOptions options; 97926c7bf93SJim Ingham 980b9c1b51eSKate Stone m_opaque_sp->GetCommandInterpreter().RunCommandInterpreter( 981b9c1b51eSKate Stone auto_handle_events, spawn_thread, options); 98226c7bf93SJim Ingham } 98326c7bf93SJim Ingham } 98426c7bf93SJim Ingham 985b9c1b51eSKate Stone void SBDebugger::RunCommandInterpreter(bool auto_handle_events, 98626c7bf93SJim Ingham bool spawn_thread, 98726c7bf93SJim Ingham SBCommandInterpreterRunOptions &options, 988b9c1b51eSKate Stone int &num_errors, bool &quit_requested, 989ffc9f1deSJim Ingham bool &stopped_for_crash) 99026c7bf93SJim Ingham 99126c7bf93SJim Ingham { 992b9c1b51eSKate Stone if (m_opaque_sp) { 99326c7bf93SJim Ingham CommandInterpreter &interp = m_opaque_sp->GetCommandInterpreter(); 994b9c1b51eSKate Stone interp.RunCommandInterpreter(auto_handle_events, spawn_thread, 995b9c1b51eSKate Stone options.ref()); 99626c7bf93SJim Ingham num_errors = interp.GetNumErrors(); 99726c7bf93SJim Ingham quit_requested = interp.GetQuitRequested(); 998ffc9f1deSJim Ingham stopped_for_crash = interp.GetStoppedForCrash(); 99926c7bf93SJim Ingham } 1000969ed3d1SCaroline Tice } 1001969ed3d1SCaroline Tice 1002b9c1b51eSKate Stone SBError SBDebugger::RunREPL(lldb::LanguageType language, 1003b9c1b51eSKate Stone const char *repl_options) { 10043e7e915dSSean Callanan SBError error; 10053e7e915dSSean Callanan if (m_opaque_sp) 10063e7e915dSSean Callanan error.ref() = m_opaque_sp->RunREPL(language, repl_options); 10073e7e915dSSean Callanan else 10083e7e915dSSean Callanan error.SetErrorString("invalid debugger"); 10093e7e915dSSean Callanan return error; 10103e7e915dSSean Callanan } 10113e7e915dSSean Callanan 1012b9c1b51eSKate Stone void SBDebugger::reset(const DebuggerSP &debugger_sp) { 10136611103cSGreg Clayton m_opaque_sp = debugger_sp; 10146611103cSGreg Clayton } 10156611103cSGreg Clayton 1016b9c1b51eSKate Stone Debugger *SBDebugger::get() const { return m_opaque_sp.get(); } 10176611103cSGreg Clayton 1018b9c1b51eSKate Stone Debugger &SBDebugger::ref() const { 10196611103cSGreg Clayton assert(m_opaque_sp.get()); 10206611103cSGreg Clayton return *m_opaque_sp; 10216611103cSGreg Clayton } 10226611103cSGreg Clayton 1023b9c1b51eSKate Stone const lldb::DebuggerSP &SBDebugger::get_sp() const { return m_opaque_sp; } 10246611103cSGreg Clayton 1025b9c1b51eSKate Stone SBDebugger SBDebugger::FindDebuggerWithID(int id) { 1026af67cecdSGreg Clayton // No need to lock, the debugger list is thread safe 1027ebc1bb27SCaroline Tice SBDebugger sb_debugger; 1028431ce678SGreg Clayton DebuggerSP debugger_sp = Debugger::FindDebuggerWithID(id); 1029ebc1bb27SCaroline Tice if (debugger_sp) 1030ebc1bb27SCaroline Tice sb_debugger.reset(debugger_sp); 1031ebc1bb27SCaroline Tice return sb_debugger; 1032ebc1bb27SCaroline Tice } 1033e40e4218SJim Ingham 1034b9c1b51eSKate Stone const char *SBDebugger::GetInstanceName() { 1035dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->GetInstanceName().AsCString() : nullptr); 1036dd759857SCaroline Tice } 1037dd759857SCaroline Tice 1038b9c1b51eSKate Stone SBError SBDebugger::SetInternalVariable(const char *var_name, const char *value, 1039b9c1b51eSKate Stone const char *debugger_instance_name) { 10406920b52bSGreg Clayton SBError sb_error; 1041b9c1b51eSKate Stone DebuggerSP debugger_sp(Debugger::FindDebuggerWithInstanceName( 1042b9c1b51eSKate Stone ConstString(debugger_instance_name))); 104397206d57SZachary Turner Status error; 1044b9c1b51eSKate Stone if (debugger_sp) { 1045b9c1b51eSKate Stone ExecutionContext exe_ctx( 1046b9c1b51eSKate Stone debugger_sp->GetCommandInterpreter().GetExecutionContext()); 1047b9c1b51eSKate Stone error = debugger_sp->SetPropertyValue(&exe_ctx, eVarSetOperationAssign, 1048b9c1b51eSKate Stone var_name, value); 1049b9c1b51eSKate Stone } else { 1050b9c1b51eSKate Stone error.SetErrorStringWithFormat("invalid debugger instance name '%s'", 1051b9c1b51eSKate Stone debugger_instance_name); 10526920b52bSGreg Clayton } 10536920b52bSGreg Clayton if (error.Fail()) 10546920b52bSGreg Clayton sb_error.SetError(error); 10556920b52bSGreg Clayton return sb_error; 10563df9a8dfSCaroline Tice } 10573df9a8dfSCaroline Tice 1058431ce678SGreg Clayton SBStringList 1059b9c1b51eSKate Stone SBDebugger::GetInternalVariableValue(const char *var_name, 1060b9c1b51eSKate Stone const char *debugger_instance_name) { 10613df9a8dfSCaroline Tice SBStringList ret_value; 1062b9c1b51eSKate Stone DebuggerSP debugger_sp(Debugger::FindDebuggerWithInstanceName( 1063b9c1b51eSKate Stone ConstString(debugger_instance_name))); 106497206d57SZachary Turner Status error; 1065b9c1b51eSKate Stone if (debugger_sp) { 1066b9c1b51eSKate Stone ExecutionContext exe_ctx( 1067b9c1b51eSKate Stone debugger_sp->GetCommandInterpreter().GetExecutionContext()); 1068b9c1b51eSKate Stone lldb::OptionValueSP value_sp( 1069b9c1b51eSKate Stone debugger_sp->GetPropertyValue(&exe_ctx, var_name, false, error)); 1070b9c1b51eSKate Stone if (value_sp) { 10716920b52bSGreg Clayton StreamString value_strm; 10726920b52bSGreg Clayton value_sp->DumpValue(&exe_ctx, value_strm, OptionValue::eDumpOptionValue); 10736920b52bSGreg Clayton const std::string &value_str = value_strm.GetString(); 1074b9c1b51eSKate Stone if (!value_str.empty()) { 10756920b52bSGreg Clayton StringList string_list; 107644d93782SGreg Clayton string_list.SplitIntoLines(value_str); 10776920b52bSGreg Clayton return SBStringList(&string_list); 10786920b52bSGreg Clayton } 10796920b52bSGreg Clayton } 10806920b52bSGreg Clayton } 10816920b52bSGreg Clayton return SBStringList(); 10823df9a8dfSCaroline Tice } 10833df9a8dfSCaroline Tice 1084b9c1b51eSKate Stone uint32_t SBDebugger::GetTerminalWidth() const { 1085dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->GetTerminalWidth() : 0); 1086a7015092SGreg Clayton } 1087a7015092SGreg Clayton 1088b9c1b51eSKate Stone void SBDebugger::SetTerminalWidth(uint32_t term_width) { 1089a7015092SGreg Clayton if (m_opaque_sp) 1090a7015092SGreg Clayton m_opaque_sp->SetTerminalWidth(term_width); 1091a7015092SGreg Clayton } 1092a7015092SGreg Clayton 1093b9c1b51eSKate Stone const char *SBDebugger::GetPrompt() const { 10945160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1095ceb6b139SCaroline Tice 1096ceb6b139SCaroline Tice if (log) 1097324a1036SSaleem Abdulrasool log->Printf("SBDebugger(%p)::GetPrompt () => \"%s\"", 1098324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get()), 1099514d8cd8SZachary Turner (m_opaque_sp ? m_opaque_sp->GetPrompt().str().c_str() : "")); 1100ceb6b139SCaroline Tice 1101514d8cd8SZachary Turner return (m_opaque_sp ? ConstString(m_opaque_sp->GetPrompt()).GetCString() 1102514d8cd8SZachary Turner : nullptr); 1103a7015092SGreg Clayton } 1104a7015092SGreg Clayton 1105b9c1b51eSKate Stone void SBDebugger::SetPrompt(const char *prompt) { 1106a7015092SGreg Clayton if (m_opaque_sp) 1107514d8cd8SZachary Turner m_opaque_sp->SetPrompt(llvm::StringRef::withNullAsEmpty(prompt)); 1108a7015092SGreg Clayton } 1109a7015092SGreg Clayton 11109e046f02SJonas Devlieghere const char *SBDebugger::GetReproducerPath() const { 11119e046f02SJonas Devlieghere return (m_opaque_sp 11129e046f02SJonas Devlieghere ? ConstString(m_opaque_sp->GetReproducerPath()).GetCString() 11139e046f02SJonas Devlieghere : nullptr); 11149e046f02SJonas Devlieghere } 11159e046f02SJonas Devlieghere 1116b9c1b51eSKate Stone ScriptLanguage SBDebugger::GetScriptLanguage() const { 1117dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->GetScriptLanguage() : eScriptLanguageNone); 1118a7015092SGreg Clayton } 1119a7015092SGreg Clayton 1120b9c1b51eSKate Stone void SBDebugger::SetScriptLanguage(ScriptLanguage script_lang) { 1121b9c1b51eSKate Stone if (m_opaque_sp) { 1122a7015092SGreg Clayton m_opaque_sp->SetScriptLanguage(script_lang); 1123a7015092SGreg Clayton } 1124af67cecdSGreg Clayton } 1125a7015092SGreg Clayton 1126b9c1b51eSKate Stone bool SBDebugger::SetUseExternalEditor(bool value) { 1127dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->SetUseExternalEditor(value) : false); 1128e40e4218SJim Ingham } 1129e40e4218SJim Ingham 1130b9c1b51eSKate Stone bool SBDebugger::GetUseExternalEditor() { 1131dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->GetUseExternalEditor() : false); 1132e40e4218SJim Ingham } 1133e40e4218SJim Ingham 1134b9c1b51eSKate Stone bool SBDebugger::SetUseColor(bool value) { 1135dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->SetUseColor(value) : false); 1136c3ce7f27SMichael Sartain } 1137c3ce7f27SMichael Sartain 1138b9c1b51eSKate Stone bool SBDebugger::GetUseColor() const { 1139dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->GetUseColor() : false); 1140c3ce7f27SMichael Sartain } 1141c3ce7f27SMichael Sartain 1142b9c1b51eSKate Stone bool SBDebugger::GetDescription(SBStream &description) { 1143da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1144da7bc7d0SGreg Clayton 1145b9c1b51eSKate Stone if (m_opaque_sp) { 1146dde9cff3SCaroline Tice const char *name = m_opaque_sp->GetInstanceName().AsCString(); 1147431ce678SGreg Clayton user_id_t id = m_opaque_sp->GetID(); 1148d01b2953SDaniel Malea strm.Printf("Debugger (instance: \"%s\", id: %" PRIu64 ")", name, id); 1149b9c1b51eSKate Stone } else 1150da7bc7d0SGreg Clayton strm.PutCString("No value"); 1151dde9cff3SCaroline Tice 1152dde9cff3SCaroline Tice return true; 1153dde9cff3SCaroline Tice } 1154efed6131SCaroline Tice 1155b9c1b51eSKate Stone user_id_t SBDebugger::GetID() { 1156dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->GetID() : LLDB_INVALID_UID); 1157efed6131SCaroline Tice } 11582289fa48SGreg Clayton 1159b9c1b51eSKate Stone SBError SBDebugger::SetCurrentPlatform(const char *platform_name_cstr) { 11602289fa48SGreg Clayton SBError sb_error; 1161b9c1b51eSKate Stone if (m_opaque_sp) { 1162b9c1b51eSKate Stone if (platform_name_cstr && platform_name_cstr[0]) { 1163615eb7e6SGreg Clayton ConstString platform_name(platform_name_cstr); 1164615eb7e6SGreg Clayton PlatformSP platform_sp(Platform::Find(platform_name)); 11652289fa48SGreg Clayton 1166b9c1b51eSKate Stone if (platform_sp) { 1167615eb7e6SGreg Clayton // Already have a platform with this name, just select it 1168615eb7e6SGreg Clayton m_opaque_sp->GetPlatformList().SetSelectedPlatform(platform_sp); 1169b9c1b51eSKate Stone } else { 1170615eb7e6SGreg Clayton // We don't have a platform by this name yet, create one 1171615eb7e6SGreg Clayton platform_sp = Platform::Create(platform_name, sb_error.ref()); 1172b9c1b51eSKate Stone if (platform_sp) { 1173615eb7e6SGreg Clayton // We created the platform, now append and select it 11742289fa48SGreg Clayton bool make_selected = true; 11752289fa48SGreg Clayton m_opaque_sp->GetPlatformList().Append(platform_sp, make_selected); 11762289fa48SGreg Clayton } 11772289fa48SGreg Clayton } 1178b9c1b51eSKate Stone } else { 1179615eb7e6SGreg Clayton sb_error.ref().SetErrorString("invalid platform name"); 1180615eb7e6SGreg Clayton } 1181b9c1b51eSKate Stone } else { 1182615eb7e6SGreg Clayton sb_error.ref().SetErrorString("invalid debugger"); 1183615eb7e6SGreg Clayton } 11842289fa48SGreg Clayton return sb_error; 11852289fa48SGreg Clayton } 11862289fa48SGreg Clayton 1187b9c1b51eSKate Stone bool SBDebugger::SetCurrentPlatformSDKRoot(const char *sysroot) { 1188e1cf274bSJason Molenda Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1189b9c1b51eSKate Stone if (m_opaque_sp) { 1190b9c1b51eSKate Stone PlatformSP platform_sp( 1191b9c1b51eSKate Stone m_opaque_sp->GetPlatformList().GetSelectedPlatform()); 1192f3dd93c8SGreg Clayton 1193b9c1b51eSKate Stone if (platform_sp) { 1194e1cf274bSJason Molenda if (log && sysroot) 1195e1cf274bSJason Molenda log->Printf("SBDebugger::SetCurrentPlatformSDKRoot (\"%s\")", sysroot); 1196f3dd93c8SGreg Clayton platform_sp->SetSDKRootDirectory(ConstString(sysroot)); 1197f3dd93c8SGreg Clayton return true; 1198f3dd93c8SGreg Clayton } 1199f3dd93c8SGreg Clayton } 1200f3dd93c8SGreg Clayton return false; 1201f3dd93c8SGreg Clayton } 1202f3dd93c8SGreg Clayton 1203b9c1b51eSKate Stone bool SBDebugger::GetCloseInputOnEOF() const { 1204dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->GetCloseInputOnEOF() : false); 1205fc3f027dSGreg Clayton } 1206fc3f027dSGreg Clayton 1207b9c1b51eSKate Stone void SBDebugger::SetCloseInputOnEOF(bool b) { 1208fc3f027dSGreg Clayton if (m_opaque_sp) 1209fc3f027dSGreg Clayton m_opaque_sp->SetCloseInputOnEOF(b); 1210fc3f027dSGreg Clayton } 1211061858ceSEnrico Granata 1212b9c1b51eSKate Stone SBTypeCategory SBDebugger::GetCategory(const char *category_name) { 1213061858ceSEnrico Granata if (!category_name || *category_name == 0) 1214061858ceSEnrico Granata return SBTypeCategory(); 1215061858ceSEnrico Granata 1216061858ceSEnrico Granata TypeCategoryImplSP category_sp; 1217061858ceSEnrico Granata 1218b9c1b51eSKate Stone if (DataVisualization::Categories::GetCategory(ConstString(category_name), 1219b9c1b51eSKate Stone category_sp, false)) 1220061858ceSEnrico Granata return SBTypeCategory(category_sp); 1221061858ceSEnrico Granata else 1222061858ceSEnrico Granata return SBTypeCategory(); 1223061858ceSEnrico Granata } 1224061858ceSEnrico Granata 1225b9c1b51eSKate Stone SBTypeCategory SBDebugger::GetCategory(lldb::LanguageType lang_type) { 1226e242624cSEnrico Granata TypeCategoryImplSP category_sp; 1227e242624cSEnrico Granata if (DataVisualization::Categories::GetCategory(lang_type, category_sp)) 1228e242624cSEnrico Granata return SBTypeCategory(category_sp); 1229e242624cSEnrico Granata else 1230e242624cSEnrico Granata return SBTypeCategory(); 1231e242624cSEnrico Granata } 1232e242624cSEnrico Granata 1233b9c1b51eSKate Stone SBTypeCategory SBDebugger::CreateCategory(const char *category_name) { 1234061858ceSEnrico Granata if (!category_name || *category_name == 0) 1235061858ceSEnrico Granata return SBTypeCategory(); 1236061858ceSEnrico Granata 1237061858ceSEnrico Granata TypeCategoryImplSP category_sp; 1238061858ceSEnrico Granata 1239b9c1b51eSKate Stone if (DataVisualization::Categories::GetCategory(ConstString(category_name), 1240b9c1b51eSKate Stone category_sp, true)) 1241061858ceSEnrico Granata return SBTypeCategory(category_sp); 1242061858ceSEnrico Granata else 1243061858ceSEnrico Granata return SBTypeCategory(); 1244061858ceSEnrico Granata } 1245061858ceSEnrico Granata 1246b9c1b51eSKate Stone bool SBDebugger::DeleteCategory(const char *category_name) { 1247061858ceSEnrico Granata if (!category_name || *category_name == 0) 1248061858ceSEnrico Granata return false; 1249061858ceSEnrico Granata 1250061858ceSEnrico Granata return DataVisualization::Categories::Delete(ConstString(category_name)); 1251061858ceSEnrico Granata } 1252061858ceSEnrico Granata 1253b9c1b51eSKate Stone uint32_t SBDebugger::GetNumCategories() { 1254061858ceSEnrico Granata return DataVisualization::Categories::GetCount(); 1255061858ceSEnrico Granata } 1256061858ceSEnrico Granata 1257b9c1b51eSKate Stone SBTypeCategory SBDebugger::GetCategoryAtIndex(uint32_t index) { 1258b9c1b51eSKate Stone return SBTypeCategory( 1259b9c1b51eSKate Stone DataVisualization::Categories::GetCategoryAtIndex(index)); 1260061858ceSEnrico Granata } 1261061858ceSEnrico Granata 1262b9c1b51eSKate Stone SBTypeCategory SBDebugger::GetDefaultCategory() { 1263061858ceSEnrico Granata return GetCategory("default"); 1264061858ceSEnrico Granata } 1265061858ceSEnrico Granata 1266b9c1b51eSKate Stone SBTypeFormat SBDebugger::GetFormatForType(SBTypeNameSpecifier type_name) { 1267061858ceSEnrico Granata SBTypeCategory default_category_sb = GetDefaultCategory(); 1268061858ceSEnrico Granata if (default_category_sb.GetEnabled()) 1269061858ceSEnrico Granata return default_category_sb.GetFormatForType(type_name); 1270061858ceSEnrico Granata return SBTypeFormat(); 1271061858ceSEnrico Granata } 1272061858ceSEnrico Granata 1273cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON 1274b9c1b51eSKate Stone SBTypeSummary SBDebugger::GetSummaryForType(SBTypeNameSpecifier type_name) { 1275dbb0abbfSEugene Zelenko if (!type_name.IsValid()) 1276a777dc2aSEnrico Granata return SBTypeSummary(); 1277a777dc2aSEnrico Granata return SBTypeSummary(DataVisualization::GetSummaryForType(type_name.GetSP())); 1278061858ceSEnrico Granata } 1279cf7e2dc0SJason Molenda #endif // LLDB_DISABLE_PYTHON 1280061858ceSEnrico Granata 1281b9c1b51eSKate Stone SBTypeFilter SBDebugger::GetFilterForType(SBTypeNameSpecifier type_name) { 1282dbb0abbfSEugene Zelenko if (!type_name.IsValid()) 1283a777dc2aSEnrico Granata return SBTypeFilter(); 1284a777dc2aSEnrico Granata return SBTypeFilter(DataVisualization::GetFilterForType(type_name.GetSP())); 1285061858ceSEnrico Granata } 1286061858ceSEnrico Granata 1287cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON 1288b9c1b51eSKate Stone SBTypeSynthetic SBDebugger::GetSyntheticForType(SBTypeNameSpecifier type_name) { 1289dbb0abbfSEugene Zelenko if (!type_name.IsValid()) 1290a777dc2aSEnrico Granata return SBTypeSynthetic(); 1291b9c1b51eSKate Stone return SBTypeSynthetic( 1292b9c1b51eSKate Stone DataVisualization::GetSyntheticForType(type_name.GetSP())); 1293061858ceSEnrico Granata } 1294cf7e2dc0SJason Molenda #endif // LLDB_DISABLE_PYTHON 1295061858ceSEnrico Granata 12965e336903SPavel Labath static llvm::ArrayRef<const char *> GetCategoryArray(const char **categories) { 12975e336903SPavel Labath if (categories == nullptr) 12985e336903SPavel Labath return {}; 12995e336903SPavel Labath size_t len = 0; 13005e336903SPavel Labath while (categories[len] != nullptr) 13015e336903SPavel Labath ++len; 13025e336903SPavel Labath return llvm::makeArrayRef(categories, len); 13035e336903SPavel Labath } 13045e336903SPavel Labath 1305b9c1b51eSKate Stone bool SBDebugger::EnableLog(const char *channel, const char **categories) { 1306b9c1b51eSKate Stone if (m_opaque_sp) { 1307b9c1b51eSKate Stone uint32_t log_options = 1308b9c1b51eSKate Stone LLDB_LOG_OPTION_PREPEND_TIMESTAMP | LLDB_LOG_OPTION_PREPEND_THREAD_NAME; 1309775588c0SPavel Labath std::string error; 1310775588c0SPavel Labath llvm::raw_string_ostream error_stream(error); 13115e336903SPavel Labath return m_opaque_sp->EnableLog(channel, GetCategoryArray(categories), "", 1312775588c0SPavel Labath log_options, error_stream); 1313b9c1b51eSKate Stone } else 1314228063cdSJim Ingham return false; 1315228063cdSJim Ingham } 13164f02b22dSJim Ingham 1317b9c1b51eSKate Stone void SBDebugger::SetLoggingCallback(lldb::LogOutputCallback log_callback, 1318b9c1b51eSKate Stone void *baton) { 1319b9c1b51eSKate Stone if (m_opaque_sp) { 13204f02b22dSJim Ingham return m_opaque_sp->SetLoggingCallback(log_callback, baton); 13214f02b22dSJim Ingham } 13224f02b22dSJim Ingham } 1323