130fdc8d8SChris Lattner //===-- SBDebugger.cpp ------------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 330fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 430fdc8d8SChris Lattner // 530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 630fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 730fdc8d8SChris Lattner // 830fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 930fdc8d8SChris Lattner 10dbb0abbfSEugene Zelenko // C Includes 11dbb0abbfSEugene Zelenko // C++ Includes 12dbb0abbfSEugene Zelenko // Other libraries and framework includes 13dbb0abbfSEugene Zelenko // Project includes 14ca93cc1dSEli Friedman #include "lldb/API/SBDebugger.h" 1530fdc8d8SChris Lattner 16e0d378b3SGreg Clayton #include "lldb/lldb-private.h" 1730fdc8d8SChris Lattner 18e6e2bb38SZachary Turner #include "lldb/API/SystemInitializerFull.h" 19ca93cc1dSEli Friedman #include "lldb/API/SBListener.h" 20ca93cc1dSEli Friedman #include "lldb/API/SBBroadcaster.h" 21ca93cc1dSEli Friedman #include "lldb/API/SBCommandInterpreter.h" 22ca93cc1dSEli Friedman #include "lldb/API/SBCommandReturnObject.h" 232289fa48SGreg Clayton #include "lldb/API/SBError.h" 24ca93cc1dSEli Friedman #include "lldb/API/SBEvent.h" 25ca93cc1dSEli Friedman #include "lldb/API/SBFrame.h" 263df9a8dfSCaroline Tice #include "lldb/API/SBProcess.h" 273df9a8dfSCaroline Tice #include "lldb/API/SBSourceManager.h" 28dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 293df9a8dfSCaroline Tice #include "lldb/API/SBStringList.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/SBTypeFormat.h" 34061858ceSEnrico Granata #include "lldb/API/SBTypeFilter.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" 406eee5aa0SGreg Clayton #include "lldb/Core/State.h" 4144d93782SGreg Clayton #include "lldb/Core/StreamFile.h" 425548cb50SEnrico Granata #include "lldb/DataFormatters/DataVisualization.h" 43e6e2bb38SZachary Turner #include "lldb/Initialization/SystemLifetimeManager.h" 446eee5aa0SGreg Clayton #include "lldb/Interpreter/Args.h" 456eee5aa0SGreg Clayton #include "lldb/Interpreter/CommandInterpreter.h" 46cac9c5f9SGreg Clayton #include "lldb/Interpreter/OptionGroupPlatform.h" 476eee5aa0SGreg Clayton #include "lldb/Target/Process.h" 486eee5aa0SGreg Clayton #include "lldb/Target/TargetList.h" 4930fdc8d8SChris Lattner 50d717cc9fSEnrico Granata #include "llvm/ADT/STLExtras.h" 51e6e2bb38SZachary Turner #include "llvm/Support/ManagedStatic.h" 5258a559c0SZachary Turner #include "llvm/Support/DynamicLibrary.h" 5358a559c0SZachary Turner 5430fdc8d8SChris Lattner using namespace lldb; 5530fdc8d8SChris Lattner using namespace lldb_private; 5630fdc8d8SChris Lattner 5758a559c0SZachary Turner static llvm::sys::DynamicLibrary 585fb8f797SGreg Clayton LoadPlugin (const lldb::DebuggerSP &debugger_sp, const FileSpec& spec, Error& error) 595fb8f797SGreg Clayton { 6058a559c0SZachary Turner llvm::sys::DynamicLibrary dynlib = llvm::sys::DynamicLibrary::getPermanentLibrary(spec.GetPath().c_str()); 6158a559c0SZachary Turner if (dynlib.isValid()) 625fb8f797SGreg Clayton { 635fb8f797SGreg Clayton typedef bool (*LLDBCommandPluginInit) (lldb::SBDebugger& debugger); 645fb8f797SGreg Clayton 655fb8f797SGreg Clayton lldb::SBDebugger debugger_sb(debugger_sp); 665fb8f797SGreg Clayton // This calls the bool lldb::PluginInitialize(lldb::SBDebugger debugger) function. 675fb8f797SGreg Clayton // TODO: mangle this differently for your system - on OSX, the first underscore needs to be removed and the second one stays 6858a559c0SZachary Turner LLDBCommandPluginInit init_func = (LLDBCommandPluginInit)dynlib.getAddressOfSymbol("_ZN4lldb16PluginInitializeENS_10SBDebuggerE"); 695fb8f797SGreg Clayton if (init_func) 705fb8f797SGreg Clayton { 715fb8f797SGreg Clayton if (init_func(debugger_sb)) 7258a559c0SZachary Turner return dynlib; 735fb8f797SGreg Clayton else 745fb8f797SGreg Clayton error.SetErrorString("plug-in refused to load (lldb::PluginInitialize(lldb::SBDebugger) returned false)"); 755fb8f797SGreg Clayton } 765fb8f797SGreg Clayton else 775fb8f797SGreg Clayton { 785fb8f797SGreg Clayton error.SetErrorString("plug-in is missing the required initialization: lldb::PluginInitialize(lldb::SBDebugger)"); 795fb8f797SGreg Clayton } 805fb8f797SGreg Clayton } 815fb8f797SGreg Clayton else 825fb8f797SGreg Clayton { 835fb8f797SGreg Clayton if (spec.Exists()) 845fb8f797SGreg Clayton error.SetErrorString("this file does not represent a loadable dylib"); 855fb8f797SGreg Clayton else 865fb8f797SGreg Clayton error.SetErrorString("no such file"); 875fb8f797SGreg Clayton } 8858a559c0SZachary Turner return llvm::sys::DynamicLibrary(); 895fb8f797SGreg Clayton } 905fb8f797SGreg Clayton 91e6e2bb38SZachary Turner static llvm::ManagedStatic<SystemLifetimeManager> g_debugger_lifetime; 92e6e2bb38SZachary Turner 93e6e2bb38SZachary Turner SBError 94e6e2bb38SZachary Turner SBInputReader::Initialize(lldb::SBDebugger &sb_debugger, 95e6e2bb38SZachary Turner unsigned long (*)(void *, lldb::SBInputReader *, lldb::InputReaderAction, char const *, 96e6e2bb38SZachary Turner unsigned long), 97e6e2bb38SZachary Turner void *, lldb::InputReaderGranularity, char const *, char const *, bool) 98e6e2bb38SZachary Turner { 99e6e2bb38SZachary Turner return SBError(); 100e6e2bb38SZachary Turner } 101e6e2bb38SZachary Turner 102e6e2bb38SZachary Turner void 103e6e2bb38SZachary Turner SBInputReader::SetIsDone(bool) 104e6e2bb38SZachary Turner { 105e6e2bb38SZachary Turner } 106dbb0abbfSEugene Zelenko 107e6e2bb38SZachary Turner bool 108e6e2bb38SZachary Turner SBInputReader::IsActive() const 109e6e2bb38SZachary Turner { 110e6e2bb38SZachary Turner return false; 111e6e2bb38SZachary Turner } 112e6e2bb38SZachary Turner 113dbb0abbfSEugene Zelenko SBDebugger::SBDebugger() = default; 114dbb0abbfSEugene Zelenko 115dbb0abbfSEugene Zelenko SBDebugger::SBDebugger(const lldb::DebuggerSP &debugger_sp) : 116dbb0abbfSEugene Zelenko m_opaque_sp(debugger_sp) 117dbb0abbfSEugene Zelenko { 118dbb0abbfSEugene Zelenko } 119dbb0abbfSEugene Zelenko 120dbb0abbfSEugene Zelenko SBDebugger::SBDebugger(const SBDebugger &rhs) : 121dbb0abbfSEugene Zelenko m_opaque_sp (rhs.m_opaque_sp) 122dbb0abbfSEugene Zelenko { 123dbb0abbfSEugene Zelenko } 124dbb0abbfSEugene Zelenko 125dbb0abbfSEugene Zelenko SBDebugger::~SBDebugger() = default; 126dbb0abbfSEugene Zelenko 127dbb0abbfSEugene Zelenko SBDebugger & 128dbb0abbfSEugene Zelenko SBDebugger::operator = (const SBDebugger &rhs) 129dbb0abbfSEugene Zelenko { 130dbb0abbfSEugene Zelenko if (this != &rhs) 131dbb0abbfSEugene Zelenko { 132dbb0abbfSEugene Zelenko m_opaque_sp = rhs.m_opaque_sp; 133dbb0abbfSEugene Zelenko } 134dbb0abbfSEugene Zelenko return *this; 135dbb0abbfSEugene Zelenko } 136dbb0abbfSEugene Zelenko 13730fdc8d8SChris Lattner void 13830fdc8d8SChris Lattner SBDebugger::Initialize () 13930fdc8d8SChris Lattner { 1405160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 141ceb6b139SCaroline Tice 142ceb6b139SCaroline Tice if (log) 143ceb6b139SCaroline Tice log->Printf ("SBDebugger::Initialize ()"); 144ceb6b139SCaroline Tice 145e6e2bb38SZachary Turner g_debugger_lifetime->Initialize(llvm::make_unique<SystemInitializerFull>(), LoadPlugin); 14630fdc8d8SChris Lattner } 14730fdc8d8SChris Lattner 14830fdc8d8SChris Lattner void 14930fdc8d8SChris Lattner SBDebugger::Terminate () 15030fdc8d8SChris Lattner { 151e6e2bb38SZachary Turner g_debugger_lifetime->Terminate(); 15230fdc8d8SChris Lattner } 15330fdc8d8SChris Lattner 15448e42549SGreg Clayton void 15548e42549SGreg Clayton SBDebugger::Clear () 15648e42549SGreg Clayton { 1575160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 158ceb6b139SCaroline Tice 159ceb6b139SCaroline Tice if (log) 160324a1036SSaleem Abdulrasool log->Printf ("SBDebugger(%p)::Clear ()", 161324a1036SSaleem Abdulrasool static_cast<void*>(m_opaque_sp.get())); 1623d6086f6SCaroline Tice 1633d6086f6SCaroline Tice if (m_opaque_sp) 16444d93782SGreg Clayton m_opaque_sp->ClearIOHandlers (); 165ceb6b139SCaroline Tice 16648e42549SGreg Clayton m_opaque_sp.reset(); 16748e42549SGreg Clayton } 16848e42549SGreg Clayton 1696611103cSGreg Clayton SBDebugger 1706611103cSGreg Clayton SBDebugger::Create() 1716611103cSGreg Clayton { 172dbb0abbfSEugene Zelenko return SBDebugger::Create(false, nullptr, nullptr); 17306942690SJim Ingham } 17406942690SJim Ingham 17506942690SJim Ingham SBDebugger 17606942690SJim Ingham SBDebugger::Create(bool source_init_files) 17706942690SJim Ingham { 178dbb0abbfSEugene Zelenko return SBDebugger::Create (source_init_files, nullptr, nullptr); 179228063cdSJim Ingham } 180228063cdSJim Ingham 181228063cdSJim Ingham SBDebugger 182228063cdSJim Ingham SBDebugger::Create(bool source_init_files, lldb::LogOutputCallback callback, void *baton) 183228063cdSJim Ingham 184228063cdSJim Ingham { 1855160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 186ceb6b139SCaroline Tice 1876611103cSGreg Clayton SBDebugger debugger; 188cb172b10SGreg Clayton 189cb172b10SGreg Clayton // Currently we have issues if this function is called simultaneously on two different 190cb172b10SGreg Clayton // threads. The issues mainly revolve around the fact that the lldb_private::FormatManager 191cb172b10SGreg Clayton // uses global collections and having two threads parsing the .lldbinit files can cause 192cb172b10SGreg Clayton // mayhem. So to get around this for now we need to use a mutex to prevent bad things 193cb172b10SGreg Clayton // from happening. 19416ff8604SSaleem Abdulrasool static std::recursive_mutex g_mutex; 19516ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(g_mutex); 196cb172b10SGreg Clayton 197228063cdSJim Ingham debugger.reset(Debugger::CreateInstance(callback, baton)); 198ceb6b139SCaroline Tice 199ceb6b139SCaroline Tice if (log) 200ceb6b139SCaroline Tice { 201ceb6b139SCaroline Tice SBStream sstr; 202ceb6b139SCaroline Tice debugger.GetDescription (sstr); 203324a1036SSaleem Abdulrasool log->Printf ("SBDebugger::Create () => SBDebugger(%p): %s", 204324a1036SSaleem Abdulrasool static_cast<void*>(debugger.m_opaque_sp.get()), 205324a1036SSaleem Abdulrasool sstr.GetData()); 206ceb6b139SCaroline Tice } 207ceb6b139SCaroline Tice 20806942690SJim Ingham SBCommandInterpreter interp = debugger.GetCommandInterpreter(); 20906942690SJim Ingham if (source_init_files) 21006942690SJim Ingham { 21106942690SJim Ingham interp.get()->SkipLLDBInitFiles(false); 21206942690SJim Ingham interp.get()->SkipAppInitFiles (false); 21306942690SJim Ingham SBCommandReturnObject result; 21406942690SJim Ingham interp.SourceInitFileInHomeDirectory(result); 21506942690SJim Ingham } 21606942690SJim Ingham else 21706942690SJim Ingham { 21806942690SJim Ingham interp.get()->SkipLLDBInitFiles(true); 21906942690SJim Ingham interp.get()->SkipAppInitFiles (true); 22006942690SJim Ingham } 2216611103cSGreg Clayton return debugger; 2226611103cSGreg Clayton } 2236611103cSGreg Clayton 224e02657b1SCaroline Tice void 225e02657b1SCaroline Tice SBDebugger::Destroy (SBDebugger &debugger) 226e02657b1SCaroline Tice { 2275160ce5cSGreg Clayton Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 228e02657b1SCaroline Tice 229e02657b1SCaroline Tice if (log) 230e02657b1SCaroline Tice { 231e02657b1SCaroline Tice SBStream sstr; 232e02657b1SCaroline Tice debugger.GetDescription (sstr); 233324a1036SSaleem Abdulrasool log->Printf ("SBDebugger::Destroy () => SBDebugger(%p): %s", 234324a1036SSaleem Abdulrasool static_cast<void*>(debugger.m_opaque_sp.get()), 235324a1036SSaleem Abdulrasool sstr.GetData()); 236e02657b1SCaroline Tice } 237e02657b1SCaroline Tice 238e02657b1SCaroline Tice Debugger::Destroy (debugger.m_opaque_sp); 239e02657b1SCaroline Tice 240dbb0abbfSEugene Zelenko if (debugger.m_opaque_sp.get() != nullptr) 241e02657b1SCaroline Tice debugger.m_opaque_sp.reset(); 242e02657b1SCaroline Tice } 243e02657b1SCaroline Tice 244f9322415SGreg Clayton void 245f9322415SGreg Clayton SBDebugger::MemoryPressureDetected () 246f9322415SGreg Clayton { 2470cd70866SGreg Clayton // Since this function can be call asynchronously, we allow it to be 2480cd70866SGreg Clayton // non-mandatory. We have seen deadlocks with this function when called 2490cd70866SGreg Clayton // so we need to safeguard against this until we can determine what is 2500cd70866SGreg Clayton // causing the deadlocks. 2515160ce5cSGreg Clayton Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 252aebdf1beSJim Ingham 2530cd70866SGreg Clayton const bool mandatory = false; 254aebdf1beSJim Ingham if (log) 255aebdf1beSJim Ingham { 256aebdf1beSJim Ingham log->Printf ("SBDebugger::MemoryPressureDetected (), mandatory = %d", mandatory); 257aebdf1beSJim Ingham } 258aebdf1beSJim Ingham 2590cd70866SGreg Clayton ModuleList::RemoveOrphanSharedModules(mandatory); 260f9322415SGreg Clayton } 261f9322415SGreg Clayton 2626611103cSGreg Clayton bool 2636611103cSGreg Clayton SBDebugger::IsValid() const 2646611103cSGreg Clayton { 265dbb0abbfSEugene Zelenko return m_opaque_sp.get() != nullptr; 2666611103cSGreg Clayton } 2676611103cSGreg Clayton 26830fdc8d8SChris Lattner void 26930fdc8d8SChris Lattner SBDebugger::SetAsync (bool b) 27030fdc8d8SChris Lattner { 2716611103cSGreg Clayton if (m_opaque_sp) 2726611103cSGreg Clayton m_opaque_sp->SetAsyncExecution(b); 27330fdc8d8SChris Lattner } 27430fdc8d8SChris Lattner 275e64f0dc7SJim Ingham bool 276e64f0dc7SJim Ingham SBDebugger::GetAsync() 277e64f0dc7SJim Ingham { 278dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->GetAsyncExecution() : false); 279e64f0dc7SJim Ingham } 280e64f0dc7SJim Ingham 2816eee5aa0SGreg Clayton void 2826eee5aa0SGreg Clayton SBDebugger::SkipLLDBInitFiles (bool b) 2836eee5aa0SGreg Clayton { 2846eee5aa0SGreg Clayton if (m_opaque_sp) 2856eee5aa0SGreg Clayton m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles (b); 2866eee5aa0SGreg Clayton } 2876eee5aa0SGreg Clayton 28816e0c686SJim Ingham void 28916e0c686SJim Ingham SBDebugger::SkipAppInitFiles (bool b) 29016e0c686SJim Ingham { 29116e0c686SJim Ingham if (m_opaque_sp) 29216e0c686SJim Ingham m_opaque_sp->GetCommandInterpreter().SkipAppInitFiles (b); 29316e0c686SJim Ingham } 29416e0c686SJim Ingham 29530fdc8d8SChris Lattner // Shouldn't really be settable after initialization as this could cause lots of problems; don't want users 29630fdc8d8SChris Lattner // trying to switch modes in the middle of a debugging session. 29730fdc8d8SChris Lattner void 29830fdc8d8SChris Lattner SBDebugger::SetInputFileHandle (FILE *fh, bool transfer_ownership) 29930fdc8d8SChris Lattner { 3005160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 301ceb6b139SCaroline Tice 302ceb6b139SCaroline Tice if (log) 303324a1036SSaleem Abdulrasool log->Printf ("SBDebugger(%p)::SetInputFileHandle (fh=%p, transfer_ownership=%i)", 304324a1036SSaleem Abdulrasool static_cast<void*>(m_opaque_sp.get()), 305324a1036SSaleem Abdulrasool static_cast<void*>(fh), transfer_ownership); 306ceb6b139SCaroline Tice 3076611103cSGreg Clayton if (m_opaque_sp) 3086611103cSGreg Clayton m_opaque_sp->SetInputFileHandle (fh, transfer_ownership); 30930fdc8d8SChris Lattner } 31030fdc8d8SChris Lattner 31130fdc8d8SChris Lattner void 31230fdc8d8SChris Lattner SBDebugger::SetOutputFileHandle (FILE *fh, bool transfer_ownership) 31330fdc8d8SChris Lattner { 3145160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 315ceb6b139SCaroline Tice 316ceb6b139SCaroline Tice 317ceb6b139SCaroline Tice if (log) 318324a1036SSaleem Abdulrasool log->Printf ("SBDebugger(%p)::SetOutputFileHandle (fh=%p, transfer_ownership=%i)", 319324a1036SSaleem Abdulrasool static_cast<void*>(m_opaque_sp.get()), 320324a1036SSaleem Abdulrasool static_cast<void*>(fh), transfer_ownership); 321ceb6b139SCaroline Tice 3226611103cSGreg Clayton if (m_opaque_sp) 3236611103cSGreg Clayton m_opaque_sp->SetOutputFileHandle (fh, transfer_ownership); 32430fdc8d8SChris Lattner } 32530fdc8d8SChris Lattner 32630fdc8d8SChris Lattner void 32730fdc8d8SChris Lattner SBDebugger::SetErrorFileHandle (FILE *fh, bool transfer_ownership) 32830fdc8d8SChris Lattner { 3295160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 330ceb6b139SCaroline Tice 331ceb6b139SCaroline Tice 332ceb6b139SCaroline Tice if (log) 333324a1036SSaleem Abdulrasool log->Printf ("SBDebugger(%p)::SetErrorFileHandle (fh=%p, transfer_ownership=%i)", 334324a1036SSaleem Abdulrasool static_cast<void*>(m_opaque_sp.get()), 335324a1036SSaleem Abdulrasool static_cast<void*>(fh), transfer_ownership); 336ceb6b139SCaroline Tice 3376611103cSGreg Clayton if (m_opaque_sp) 3386611103cSGreg Clayton m_opaque_sp->SetErrorFileHandle (fh, transfer_ownership); 33930fdc8d8SChris Lattner } 34030fdc8d8SChris Lattner 34130fdc8d8SChris Lattner FILE * 34230fdc8d8SChris Lattner SBDebugger::GetInputFileHandle () 34330fdc8d8SChris Lattner { 3446611103cSGreg Clayton if (m_opaque_sp) 34544d93782SGreg Clayton { 34644d93782SGreg Clayton StreamFileSP stream_file_sp (m_opaque_sp->GetInputFile()); 34744d93782SGreg Clayton if (stream_file_sp) 34844d93782SGreg Clayton return stream_file_sp->GetFile().GetStream(); 34944d93782SGreg Clayton } 350dbb0abbfSEugene Zelenko return nullptr; 35130fdc8d8SChris Lattner } 35230fdc8d8SChris Lattner 35330fdc8d8SChris Lattner FILE * 35430fdc8d8SChris Lattner SBDebugger::GetOutputFileHandle () 35530fdc8d8SChris Lattner { 3566611103cSGreg Clayton if (m_opaque_sp) 35744d93782SGreg Clayton { 35844d93782SGreg Clayton StreamFileSP stream_file_sp (m_opaque_sp->GetOutputFile()); 35944d93782SGreg Clayton if (stream_file_sp) 36044d93782SGreg Clayton return stream_file_sp->GetFile().GetStream(); 36144d93782SGreg Clayton } 362dbb0abbfSEugene Zelenko return nullptr; 36330fdc8d8SChris Lattner } 36430fdc8d8SChris Lattner 36530fdc8d8SChris Lattner FILE * 36630fdc8d8SChris Lattner SBDebugger::GetErrorFileHandle () 36730fdc8d8SChris Lattner { 3686611103cSGreg Clayton if (m_opaque_sp) 36944d93782SGreg Clayton { 37044d93782SGreg Clayton StreamFileSP stream_file_sp(m_opaque_sp->GetErrorFile()); 37144d93782SGreg Clayton if (stream_file_sp) 37244d93782SGreg Clayton return stream_file_sp->GetFile().GetStream(); 37344d93782SGreg Clayton } 374dbb0abbfSEugene Zelenko return nullptr; 37530fdc8d8SChris Lattner } 37630fdc8d8SChris Lattner 377c5917d9aSJim Ingham void 378c5917d9aSJim Ingham SBDebugger::SaveInputTerminalState() 379c5917d9aSJim Ingham { 380c5917d9aSJim Ingham if (m_opaque_sp) 381c5917d9aSJim Ingham m_opaque_sp->SaveInputTerminalState(); 382c5917d9aSJim Ingham } 383c5917d9aSJim Ingham 384c5917d9aSJim Ingham void 385c5917d9aSJim Ingham SBDebugger::RestoreInputTerminalState() 386c5917d9aSJim Ingham { 387c5917d9aSJim Ingham if (m_opaque_sp) 388c5917d9aSJim Ingham m_opaque_sp->RestoreInputTerminalState(); 389c5917d9aSJim Ingham 390c5917d9aSJim Ingham } 39130fdc8d8SChris Lattner SBCommandInterpreter 39230fdc8d8SChris Lattner SBDebugger::GetCommandInterpreter () 39330fdc8d8SChris Lattner { 3945160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 395ceb6b139SCaroline Tice 3966611103cSGreg Clayton SBCommandInterpreter sb_interpreter; 3976611103cSGreg Clayton if (m_opaque_sp) 3986611103cSGreg Clayton sb_interpreter.reset (&m_opaque_sp->GetCommandInterpreter()); 399ceb6b139SCaroline Tice 400750cd175SCaroline Tice if (log) 40193aa84e8SGreg Clayton log->Printf ("SBDebugger(%p)::GetCommandInterpreter () => SBCommandInterpreter(%p)", 402324a1036SSaleem Abdulrasool static_cast<void*>(m_opaque_sp.get()), 403324a1036SSaleem Abdulrasool static_cast<void*>(sb_interpreter.get())); 404750cd175SCaroline Tice 40530fdc8d8SChris Lattner return sb_interpreter; 40630fdc8d8SChris Lattner } 40730fdc8d8SChris Lattner 40830fdc8d8SChris Lattner void 40930fdc8d8SChris Lattner SBDebugger::HandleCommand (const char *command) 41030fdc8d8SChris Lattner { 4116611103cSGreg Clayton if (m_opaque_sp) 4126611103cSGreg Clayton { 413af67cecdSGreg Clayton TargetSP target_sp (m_opaque_sp->GetSelectedTarget()); 414bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 415af67cecdSGreg Clayton if (target_sp) 416bb19a13cSSaleem Abdulrasool lock = std::unique_lock<std::recursive_mutex>(target_sp->GetAPIMutex()); 417af67cecdSGreg Clayton 4186611103cSGreg Clayton SBCommandInterpreter sb_interpreter(GetCommandInterpreter ()); 41930fdc8d8SChris Lattner SBCommandReturnObject result; 42030fdc8d8SChris Lattner 42130fdc8d8SChris Lattner sb_interpreter.HandleCommand (command, result, false); 42230fdc8d8SChris Lattner 423dbb0abbfSEugene Zelenko if (GetErrorFileHandle() != nullptr) 42430fdc8d8SChris Lattner result.PutError (GetErrorFileHandle()); 425dbb0abbfSEugene Zelenko if (GetOutputFileHandle() != nullptr) 42630fdc8d8SChris Lattner result.PutOutput (GetOutputFileHandle()); 42730fdc8d8SChris Lattner 428dbb0abbfSEugene Zelenko if (!m_opaque_sp->GetAsyncExecution()) 42930fdc8d8SChris Lattner { 4306611103cSGreg Clayton SBProcess process(GetCommandInterpreter().GetProcess ()); 431b9556accSGreg Clayton ProcessSP process_sp (process.GetSP()); 432b9556accSGreg Clayton if (process_sp) 43330fdc8d8SChris Lattner { 43430fdc8d8SChris Lattner EventSP event_sp; 435583bbb1dSJim Ingham ListenerSP lldb_listener_sp = m_opaque_sp->GetListener(); 436583bbb1dSJim Ingham while (lldb_listener_sp->GetNextEventForBroadcaster (process_sp.get(), event_sp)) 43730fdc8d8SChris Lattner { 43830fdc8d8SChris Lattner SBEvent event(event_sp); 43930fdc8d8SChris Lattner HandleProcessEvent (process, event, GetOutputFileHandle(), GetErrorFileHandle()); 44030fdc8d8SChris Lattner } 44130fdc8d8SChris Lattner } 44230fdc8d8SChris Lattner } 44330fdc8d8SChris Lattner } 4446611103cSGreg Clayton } 44530fdc8d8SChris Lattner 44630fdc8d8SChris Lattner SBListener 44730fdc8d8SChris Lattner SBDebugger::GetListener () 44830fdc8d8SChris Lattner { 4495160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 450ceb6b139SCaroline Tice 4516611103cSGreg Clayton SBListener sb_listener; 4526611103cSGreg Clayton if (m_opaque_sp) 453583bbb1dSJim Ingham sb_listener.reset(m_opaque_sp->GetListener()); 454ceb6b139SCaroline Tice 455750cd175SCaroline Tice if (log) 456324a1036SSaleem Abdulrasool log->Printf ("SBDebugger(%p)::GetListener () => SBListener(%p)", 457324a1036SSaleem Abdulrasool static_cast<void*>(m_opaque_sp.get()), 458324a1036SSaleem Abdulrasool static_cast<void*>(sb_listener.get())); 459750cd175SCaroline Tice 46030fdc8d8SChris Lattner return sb_listener; 46130fdc8d8SChris Lattner } 46230fdc8d8SChris Lattner 46330fdc8d8SChris Lattner void 46430fdc8d8SChris Lattner SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, FILE *out, FILE *err) 46530fdc8d8SChris Lattner { 466af67cecdSGreg Clayton if (!process.IsValid()) 467af67cecdSGreg Clayton return; 468af67cecdSGreg Clayton 469b9556accSGreg Clayton TargetSP target_sp (process.GetTarget().GetSP()); 470b9556accSGreg Clayton if (!target_sp) 471b9556accSGreg Clayton return; 472b9556accSGreg Clayton 47330fdc8d8SChris Lattner const uint32_t event_type = event.GetType(); 47430fdc8d8SChris Lattner char stdio_buffer[1024]; 47530fdc8d8SChris Lattner size_t len; 47630fdc8d8SChris Lattner 477bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex()); 478af67cecdSGreg Clayton 479af67cecdSGreg Clayton if (event_type & (Process::eBroadcastBitSTDOUT | Process::eBroadcastBitStateChanged)) 48030fdc8d8SChris Lattner { 481af67cecdSGreg Clayton // Drain stdout when we stop just in case we have any bytes 48230fdc8d8SChris Lattner while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0) 483dbb0abbfSEugene Zelenko if (out != nullptr) 48430fdc8d8SChris Lattner ::fwrite (stdio_buffer, 1, len, out); 48530fdc8d8SChris Lattner } 486af67cecdSGreg Clayton 487af67cecdSGreg Clayton if (event_type & (Process::eBroadcastBitSTDERR | Process::eBroadcastBitStateChanged)) 48830fdc8d8SChris Lattner { 489af67cecdSGreg Clayton // Drain stderr when we stop just in case we have any bytes 49030fdc8d8SChris Lattner while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0) 491dbb0abbfSEugene Zelenko if (err != nullptr) 492af67cecdSGreg Clayton ::fwrite (stdio_buffer, 1, len, err); 49330fdc8d8SChris Lattner } 494af67cecdSGreg Clayton 495af67cecdSGreg Clayton if (event_type & Process::eBroadcastBitStateChanged) 49630fdc8d8SChris Lattner { 49730fdc8d8SChris Lattner StateType event_state = SBProcess::GetStateFromEvent (event); 49830fdc8d8SChris Lattner 49930fdc8d8SChris Lattner if (event_state == eStateInvalid) 50030fdc8d8SChris Lattner return; 50130fdc8d8SChris Lattner 50230fdc8d8SChris Lattner bool is_stopped = StateIsStoppedState (event_state); 50330fdc8d8SChris Lattner if (!is_stopped) 5042976d00aSJim Ingham process.ReportEventState (event, out); 50530fdc8d8SChris Lattner } 50630fdc8d8SChris Lattner } 50730fdc8d8SChris Lattner 508e37d605eSJim Ingham SBSourceManager 50930fdc8d8SChris Lattner SBDebugger::GetSourceManager () 51030fdc8d8SChris Lattner { 511e37d605eSJim Ingham SBSourceManager sb_source_manager (*this); 512e37d605eSJim Ingham return sb_source_manager; 51330fdc8d8SChris Lattner } 51430fdc8d8SChris Lattner 51530fdc8d8SChris Lattner bool 51630fdc8d8SChris Lattner SBDebugger::GetDefaultArchitecture (char *arch_name, size_t arch_name_len) 51730fdc8d8SChris Lattner { 51830fdc8d8SChris Lattner if (arch_name && arch_name_len) 51930fdc8d8SChris Lattner { 520431ce678SGreg Clayton ArchSpec default_arch = Target::GetDefaultArchitecture (); 521daccaa9eSCaroline Tice 52230fdc8d8SChris Lattner if (default_arch.IsValid()) 52330fdc8d8SChris Lattner { 524431ce678SGreg Clayton const std::string &triple_str = default_arch.GetTriple().str(); 525431ce678SGreg Clayton if (!triple_str.empty()) 526431ce678SGreg Clayton ::snprintf (arch_name, arch_name_len, "%s", triple_str.c_str()); 527431ce678SGreg Clayton else 52864195a2cSGreg Clayton ::snprintf (arch_name, arch_name_len, "%s", default_arch.GetArchitectureName()); 52930fdc8d8SChris Lattner return true; 53030fdc8d8SChris Lattner } 53130fdc8d8SChris Lattner } 53230fdc8d8SChris Lattner if (arch_name && arch_name_len) 53330fdc8d8SChris Lattner arch_name[0] = '\0'; 53430fdc8d8SChris Lattner return false; 53530fdc8d8SChris Lattner } 53630fdc8d8SChris Lattner 53730fdc8d8SChris Lattner bool 53830fdc8d8SChris Lattner SBDebugger::SetDefaultArchitecture (const char *arch_name) 53930fdc8d8SChris Lattner { 54030fdc8d8SChris Lattner if (arch_name) 54130fdc8d8SChris Lattner { 54270512317SGreg Clayton ArchSpec arch (arch_name); 54330fdc8d8SChris Lattner if (arch.IsValid()) 54430fdc8d8SChris Lattner { 545431ce678SGreg Clayton Target::SetDefaultArchitecture (arch); 54630fdc8d8SChris Lattner return true; 54730fdc8d8SChris Lattner } 54830fdc8d8SChris Lattner } 54930fdc8d8SChris Lattner return false; 55030fdc8d8SChris Lattner } 55130fdc8d8SChris Lattner 55230fdc8d8SChris Lattner ScriptLanguage 55330fdc8d8SChris Lattner SBDebugger::GetScriptingLanguage(const char *script_language_name) 55430fdc8d8SChris Lattner { 55530fdc8d8SChris Lattner return Args::StringToScriptLanguage(script_language_name, 55630fdc8d8SChris Lattner eScriptLanguageDefault, 557dbb0abbfSEugene Zelenko nullptr); 55830fdc8d8SChris Lattner } 55930fdc8d8SChris Lattner 56030fdc8d8SChris Lattner const char * 56130fdc8d8SChris Lattner SBDebugger::GetVersionString () 56230fdc8d8SChris Lattner { 563b2f1fb29SVirgile Bello return lldb_private::GetVersion(); 56430fdc8d8SChris Lattner } 56530fdc8d8SChris Lattner 56630fdc8d8SChris Lattner const char * 567431ce678SGreg Clayton SBDebugger::StateAsCString (StateType state) 56830fdc8d8SChris Lattner { 569c2bbb49aSCaroline Tice return lldb_private::StateAsCString (state); 57030fdc8d8SChris Lattner } 57130fdc8d8SChris Lattner 57230fdc8d8SChris Lattner bool 573431ce678SGreg Clayton SBDebugger::StateIsRunningState (StateType state) 57430fdc8d8SChris Lattner { 5755160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5764838131bSGreg Clayton 577c2bbb49aSCaroline Tice const bool result = lldb_private::StateIsRunningState (state); 5784838131bSGreg Clayton if (log) 5794838131bSGreg Clayton log->Printf ("SBDebugger::StateIsRunningState (state=%s) => %i", 580431ce678SGreg Clayton StateAsCString (state), result); 5814838131bSGreg Clayton 5824838131bSGreg Clayton return result; 58330fdc8d8SChris Lattner } 58430fdc8d8SChris Lattner 58530fdc8d8SChris Lattner bool 586431ce678SGreg Clayton SBDebugger::StateIsStoppedState (StateType state) 58730fdc8d8SChris Lattner { 5885160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 589ceb6b139SCaroline Tice 5902637f825SGreg Clayton const bool result = lldb_private::StateIsStoppedState (state, false); 591ceb6b139SCaroline Tice if (log) 5924838131bSGreg Clayton log->Printf ("SBDebugger::StateIsStoppedState (state=%s) => %i", 593431ce678SGreg Clayton StateAsCString (state), result); 594ceb6b139SCaroline Tice 5954838131bSGreg Clayton return result; 59630fdc8d8SChris Lattner } 59730fdc8d8SChris Lattner 598cac9c5f9SGreg Clayton lldb::SBTarget 599cac9c5f9SGreg Clayton SBDebugger::CreateTarget (const char *filename, 600cac9c5f9SGreg Clayton const char *target_triple, 601cac9c5f9SGreg Clayton const char *platform_name, 602cac9c5f9SGreg Clayton bool add_dependent_modules, 603cac9c5f9SGreg Clayton lldb::SBError& sb_error) 604cac9c5f9SGreg Clayton { 605cac9c5f9SGreg Clayton SBTarget sb_target; 606b9556accSGreg Clayton TargetSP target_sp; 607cac9c5f9SGreg Clayton if (m_opaque_sp) 608cac9c5f9SGreg Clayton { 609cac9c5f9SGreg Clayton sb_error.Clear(); 610cac9c5f9SGreg Clayton OptionGroupPlatform platform_options (false); 611cac9c5f9SGreg Clayton platform_options.SetPlatformName (platform_name); 612cac9c5f9SGreg Clayton 613cac9c5f9SGreg Clayton sb_error.ref() = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, 614a0ca6601SGreg Clayton filename, 615cac9c5f9SGreg Clayton target_triple, 616cac9c5f9SGreg Clayton add_dependent_modules, 617cac9c5f9SGreg Clayton &platform_options, 618cac9c5f9SGreg Clayton target_sp); 619cac9c5f9SGreg Clayton 620cac9c5f9SGreg Clayton if (sb_error.Success()) 621b9556accSGreg Clayton sb_target.SetSP (target_sp); 622cac9c5f9SGreg Clayton } 623cac9c5f9SGreg Clayton else 624cac9c5f9SGreg Clayton { 6259f521f22SJim Ingham sb_error.SetErrorString("invalid debugger"); 626cac9c5f9SGreg Clayton } 627cac9c5f9SGreg Clayton 6285160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 629cac9c5f9SGreg Clayton if (log) 630cac9c5f9SGreg Clayton log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\", triple=%s, platform_name=%s, add_dependent_modules=%u, error=%s) => SBTarget(%p)", 631324a1036SSaleem Abdulrasool static_cast<void*>(m_opaque_sp.get()), filename, 632324a1036SSaleem Abdulrasool target_triple, platform_name, add_dependent_modules, 633324a1036SSaleem Abdulrasool sb_error.GetCString(), static_cast<void*>(target_sp.get())); 634cac9c5f9SGreg Clayton 635cac9c5f9SGreg Clayton return sb_target; 636cac9c5f9SGreg Clayton } 63730fdc8d8SChris Lattner 63830fdc8d8SChris Lattner SBTarget 63930fdc8d8SChris Lattner SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename, 64030fdc8d8SChris Lattner const char *target_triple) 64130fdc8d8SChris Lattner { 642b9556accSGreg Clayton SBTarget sb_target; 643b9556accSGreg Clayton TargetSP target_sp; 6446611103cSGreg Clayton if (m_opaque_sp) 6456611103cSGreg Clayton { 646cac9c5f9SGreg Clayton const bool add_dependent_modules = true; 647cac9c5f9SGreg Clayton Error error (m_opaque_sp->GetTargetList().CreateTarget(*m_opaque_sp, 648a0ca6601SGreg Clayton filename, 649cac9c5f9SGreg Clayton target_triple, 650cac9c5f9SGreg Clayton add_dependent_modules, 651dbb0abbfSEugene Zelenko nullptr, 652cac9c5f9SGreg Clayton target_sp)); 653b9556accSGreg Clayton sb_target.SetSP (target_sp); 6546611103cSGreg Clayton } 6554838131bSGreg Clayton 6565160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6574838131bSGreg Clayton if (log) 658cfd1acedSGreg Clayton log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndTargetTriple (filename=\"%s\", triple=%s) => SBTarget(%p)", 659324a1036SSaleem Abdulrasool static_cast<void*>(m_opaque_sp.get()), filename, 660324a1036SSaleem Abdulrasool target_triple, static_cast<void*>(target_sp.get())); 6614838131bSGreg Clayton 662b9556accSGreg Clayton return sb_target; 66330fdc8d8SChris Lattner } 66430fdc8d8SChris Lattner 66530fdc8d8SChris Lattner SBTarget 66664195a2cSGreg Clayton SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *arch_cstr) 66730fdc8d8SChris Lattner { 6685160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 669ceb6b139SCaroline Tice 670b9556accSGreg Clayton SBTarget sb_target; 671b9556accSGreg Clayton TargetSP target_sp; 6726611103cSGreg Clayton if (m_opaque_sp) 6736611103cSGreg Clayton { 67430fdc8d8SChris Lattner Error error; 675cac9c5f9SGreg Clayton const bool add_dependent_modules = true; 67630fdc8d8SChris Lattner 677cac9c5f9SGreg Clayton error = m_opaque_sp->GetTargetList().CreateTarget(*m_opaque_sp, 678a0ca6601SGreg Clayton filename, 679cac9c5f9SGreg Clayton arch_cstr, 680cac9c5f9SGreg Clayton add_dependent_modules, 681dbb0abbfSEugene Zelenko nullptr, 682cac9c5f9SGreg Clayton target_sp); 68330fdc8d8SChris Lattner 68430fdc8d8SChris Lattner if (error.Success()) 6856611103cSGreg Clayton { 6862976d00aSJim Ingham m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get()); 687b9556accSGreg Clayton sb_target.SetSP (target_sp); 6886611103cSGreg Clayton } 6896611103cSGreg Clayton } 690ceb6b139SCaroline Tice 691ceb6b139SCaroline Tice if (log) 692cfd1acedSGreg Clayton log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndArch (filename=\"%s\", arch=%s) => SBTarget(%p)", 693324a1036SSaleem Abdulrasool static_cast<void*>(m_opaque_sp.get()), filename, arch_cstr, 694324a1036SSaleem Abdulrasool static_cast<void*>(target_sp.get())); 695ceb6b139SCaroline Tice 696b9556accSGreg Clayton return sb_target; 69730fdc8d8SChris Lattner } 69830fdc8d8SChris Lattner 69930fdc8d8SChris Lattner SBTarget 70030fdc8d8SChris Lattner SBDebugger::CreateTarget (const char *filename) 70130fdc8d8SChris Lattner { 702b9556accSGreg Clayton SBTarget sb_target; 703b9556accSGreg Clayton TargetSP target_sp; 7046611103cSGreg Clayton if (m_opaque_sp) 7056611103cSGreg Clayton { 70630fdc8d8SChris Lattner Error error; 707cac9c5f9SGreg Clayton const bool add_dependent_modules = true; 708cac9c5f9SGreg Clayton error = m_opaque_sp->GetTargetList().CreateTarget(*m_opaque_sp, 709a0ca6601SGreg Clayton filename, 710dbb0abbfSEugene Zelenko nullptr, 711cac9c5f9SGreg Clayton add_dependent_modules, 712dbb0abbfSEugene Zelenko nullptr, 713cac9c5f9SGreg Clayton target_sp); 71430fdc8d8SChris Lattner 7156611103cSGreg Clayton if (error.Success()) 7166611103cSGreg Clayton { 7172976d00aSJim Ingham m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get()); 718b9556accSGreg Clayton sb_target.SetSP (target_sp); 7196611103cSGreg Clayton } 7206611103cSGreg Clayton } 7215160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 7224838131bSGreg Clayton if (log) 723cfd1acedSGreg Clayton log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)", 724324a1036SSaleem Abdulrasool static_cast<void*>(m_opaque_sp.get()), filename, 725324a1036SSaleem Abdulrasool static_cast<void*>(target_sp.get())); 726b9556accSGreg Clayton return sb_target; 72730fdc8d8SChris Lattner } 72830fdc8d8SChris Lattner 7293794ad95SJohnny Chen bool 7303794ad95SJohnny Chen SBDebugger::DeleteTarget (lldb::SBTarget &target) 7313794ad95SJohnny Chen { 7323794ad95SJohnny Chen bool result = false; 733b9556accSGreg Clayton if (m_opaque_sp) 734b9556accSGreg Clayton { 735b9556accSGreg Clayton TargetSP target_sp(target.GetSP()); 736b9556accSGreg Clayton if (target_sp) 7373794ad95SJohnny Chen { 7383794ad95SJohnny Chen // No need to lock, the target list is thread safe 739b9556accSGreg Clayton result = m_opaque_sp->GetTargetList().DeleteTarget (target_sp); 740b9556accSGreg Clayton target_sp->Destroy(); 74175340622SGreg Clayton target.Clear(); 7420cd70866SGreg Clayton const bool mandatory = true; 7430cd70866SGreg Clayton ModuleList::RemoveOrphanSharedModules(mandatory); 7443794ad95SJohnny Chen } 745b9556accSGreg Clayton } 7463794ad95SJohnny Chen 7475160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 7483794ad95SJohnny Chen if (log) 749324a1036SSaleem Abdulrasool log->Printf ("SBDebugger(%p)::DeleteTarget (SBTarget(%p)) => %i", 750324a1036SSaleem Abdulrasool static_cast<void*>(m_opaque_sp.get()), 751324a1036SSaleem Abdulrasool static_cast<void*>(target.m_opaque_sp.get()), result); 7523794ad95SJohnny Chen 7533794ad95SJohnny Chen return result; 7543794ad95SJohnny Chen } 755dbb0abbfSEugene Zelenko 75630fdc8d8SChris Lattner SBTarget 75730fdc8d8SChris Lattner SBDebugger::GetTargetAtIndex (uint32_t idx) 75830fdc8d8SChris Lattner { 7596611103cSGreg Clayton SBTarget sb_target; 7606611103cSGreg Clayton if (m_opaque_sp) 761af67cecdSGreg Clayton { 762af67cecdSGreg Clayton // No need to lock, the target list is thread safe 763b9556accSGreg Clayton sb_target.SetSP (m_opaque_sp->GetTargetList().GetTargetAtIndex (idx)); 764af67cecdSGreg Clayton } 76530fdc8d8SChris Lattner return sb_target; 76630fdc8d8SChris Lattner } 76730fdc8d8SChris Lattner 7688499e1a4SJim Ingham uint32_t 7698499e1a4SJim Ingham SBDebugger::GetIndexOfTarget (lldb::SBTarget target) 7708499e1a4SJim Ingham { 7718499e1a4SJim Ingham 7728499e1a4SJim Ingham lldb::TargetSP target_sp = target.GetSP(); 7738499e1a4SJim Ingham if (!target_sp) 7748499e1a4SJim Ingham return UINT32_MAX; 7758499e1a4SJim Ingham 7768499e1a4SJim Ingham if (!m_opaque_sp) 7778499e1a4SJim Ingham return UINT32_MAX; 7788499e1a4SJim Ingham 7798499e1a4SJim Ingham return m_opaque_sp->GetTargetList().GetIndexOfTarget (target.GetSP()); 7808499e1a4SJim Ingham } 7818499e1a4SJim Ingham 78230fdc8d8SChris Lattner SBTarget 783997f6f7bSVirgile Bello SBDebugger::FindTargetWithProcessID (lldb::pid_t pid) 78430fdc8d8SChris Lattner { 7856611103cSGreg Clayton SBTarget sb_target; 7866611103cSGreg Clayton if (m_opaque_sp) 787af67cecdSGreg Clayton { 788af67cecdSGreg Clayton // No need to lock, the target list is thread safe 789b9556accSGreg Clayton sb_target.SetSP (m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid)); 790af67cecdSGreg Clayton } 79130fdc8d8SChris Lattner return sb_target; 79230fdc8d8SChris Lattner } 79330fdc8d8SChris Lattner 79430fdc8d8SChris Lattner SBTarget 79530fdc8d8SChris Lattner SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name) 79630fdc8d8SChris Lattner { 7976611103cSGreg Clayton SBTarget sb_target; 7986611103cSGreg Clayton if (m_opaque_sp && filename && filename[0]) 7996611103cSGreg Clayton { 800af67cecdSGreg Clayton // No need to lock, the target list is thread safe 801eb0103f2SGreg Clayton ArchSpec arch (arch_name, m_opaque_sp->GetPlatformList().GetSelectedPlatform().get()); 802dbb0abbfSEugene Zelenko TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture(FileSpec(filename, false), arch_name ? &arch : nullptr)); 803b9556accSGreg Clayton sb_target.SetSP (target_sp); 8046611103cSGreg Clayton } 8056611103cSGreg Clayton return sb_target; 80630fdc8d8SChris Lattner } 80730fdc8d8SChris Lattner 80830fdc8d8SChris Lattner SBTarget 809431ce678SGreg Clayton SBDebugger::FindTargetWithLLDBProcess (const ProcessSP &process_sp) 81030fdc8d8SChris Lattner { 8116611103cSGreg Clayton SBTarget sb_target; 8126611103cSGreg Clayton if (m_opaque_sp) 813af67cecdSGreg Clayton { 814af67cecdSGreg Clayton // No need to lock, the target list is thread safe 815b9556accSGreg Clayton sb_target.SetSP (m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get())); 816af67cecdSGreg Clayton } 81730fdc8d8SChris Lattner return sb_target; 81830fdc8d8SChris Lattner } 81930fdc8d8SChris Lattner 82030fdc8d8SChris Lattner uint32_t 82130fdc8d8SChris Lattner SBDebugger::GetNumTargets () 82230fdc8d8SChris Lattner { 8236611103cSGreg Clayton if (m_opaque_sp) 824af67cecdSGreg Clayton { 825af67cecdSGreg Clayton // No need to lock, the target list is thread safe 8266611103cSGreg Clayton return m_opaque_sp->GetTargetList().GetNumTargets (); 827af67cecdSGreg Clayton } 8286611103cSGreg Clayton return 0; 8296611103cSGreg Clayton } 83030fdc8d8SChris Lattner 83130fdc8d8SChris Lattner SBTarget 8322976d00aSJim Ingham SBDebugger::GetSelectedTarget () 83330fdc8d8SChris Lattner { 8345160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 835ceb6b139SCaroline Tice 8366611103cSGreg Clayton SBTarget sb_target; 837b9556accSGreg Clayton TargetSP target_sp; 8386611103cSGreg Clayton if (m_opaque_sp) 839af67cecdSGreg Clayton { 840af67cecdSGreg Clayton // No need to lock, the target list is thread safe 841b9556accSGreg Clayton target_sp = m_opaque_sp->GetTargetList().GetSelectedTarget (); 842b9556accSGreg Clayton sb_target.SetSP (target_sp); 843af67cecdSGreg Clayton } 844ceb6b139SCaroline Tice 845ceb6b139SCaroline Tice if (log) 846ceb6b139SCaroline Tice { 847ceb6b139SCaroline Tice SBStream sstr; 848431ce678SGreg Clayton sb_target.GetDescription (sstr, eDescriptionLevelBrief); 849324a1036SSaleem Abdulrasool log->Printf ("SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s", 850324a1036SSaleem Abdulrasool static_cast<void*>(m_opaque_sp.get()), 851324a1036SSaleem Abdulrasool static_cast<void*>(target_sp.get()), sstr.GetData()); 852ceb6b139SCaroline Tice } 853ceb6b139SCaroline Tice 85430fdc8d8SChris Lattner return sb_target; 85530fdc8d8SChris Lattner } 85630fdc8d8SChris Lattner 85730fdc8d8SChris Lattner void 858e64f0dc7SJim Ingham SBDebugger::SetSelectedTarget (SBTarget &sb_target) 859e64f0dc7SJim Ingham { 8605160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 861e64f0dc7SJim Ingham 862b9556accSGreg Clayton TargetSP target_sp (sb_target.GetSP()); 863e64f0dc7SJim Ingham if (m_opaque_sp) 864e64f0dc7SJim Ingham { 865b9556accSGreg Clayton m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get()); 866e64f0dc7SJim Ingham } 867e64f0dc7SJim Ingham if (log) 868e64f0dc7SJim Ingham { 869e64f0dc7SJim Ingham SBStream sstr; 870e64f0dc7SJim Ingham sb_target.GetDescription (sstr, eDescriptionLevelBrief); 871324a1036SSaleem Abdulrasool log->Printf ("SBDebugger(%p)::SetSelectedTarget () => SBTarget(%p): %s", 872324a1036SSaleem Abdulrasool static_cast<void*>(m_opaque_sp.get()), 873324a1036SSaleem Abdulrasool static_cast<void*>(target_sp.get()), sstr.GetData()); 874e64f0dc7SJim Ingham } 875e64f0dc7SJim Ingham } 876e64f0dc7SJim Ingham 877fbb76349SGreg Clayton SBPlatform 878fbb76349SGreg Clayton SBDebugger::GetSelectedPlatform() 879fbb76349SGreg Clayton { 880fbb76349SGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 881fbb76349SGreg Clayton 882fbb76349SGreg Clayton SBPlatform sb_platform; 883fbb76349SGreg Clayton DebuggerSP debugger_sp(m_opaque_sp); 884fbb76349SGreg Clayton if (debugger_sp) 885fbb76349SGreg Clayton { 886fbb76349SGreg Clayton sb_platform.SetSP(debugger_sp->GetPlatformList().GetSelectedPlatform()); 887fbb76349SGreg Clayton } 888fbb76349SGreg Clayton if (log) 889324a1036SSaleem Abdulrasool log->Printf ("SBDebugger(%p)::GetSelectedPlatform () => SBPlatform(%p): %s", 890324a1036SSaleem Abdulrasool static_cast<void*>(m_opaque_sp.get()), 891324a1036SSaleem Abdulrasool static_cast<void*>(sb_platform.GetSP().get()), 892324a1036SSaleem Abdulrasool sb_platform.GetName()); 893fbb76349SGreg Clayton return sb_platform; 894fbb76349SGreg Clayton } 895fbb76349SGreg Clayton 896fbb76349SGreg Clayton void 897fbb76349SGreg Clayton SBDebugger::SetSelectedPlatform(SBPlatform &sb_platform) 898fbb76349SGreg Clayton { 899fbb76349SGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 900fbb76349SGreg Clayton 901fbb76349SGreg Clayton DebuggerSP debugger_sp(m_opaque_sp); 902fbb76349SGreg Clayton if (debugger_sp) 903fbb76349SGreg Clayton { 904fbb76349SGreg Clayton debugger_sp->GetPlatformList().SetSelectedPlatform(sb_platform.GetSP()); 905fbb76349SGreg Clayton } 906324a1036SSaleem Abdulrasool 907fbb76349SGreg Clayton if (log) 908324a1036SSaleem Abdulrasool log->Printf ("SBDebugger(%p)::SetSelectedPlatform (SBPlatform(%p) %s)", 909324a1036SSaleem Abdulrasool static_cast<void*>(m_opaque_sp.get()), 910324a1036SSaleem Abdulrasool static_cast<void*>(sb_platform.GetSP().get()), 911324a1036SSaleem Abdulrasool sb_platform.GetName()); 912fbb76349SGreg Clayton } 913fbb76349SGreg Clayton 914e64f0dc7SJim Ingham void 915c30a73adSEnrico Granata SBDebugger::DispatchInput (void* baton, const void *data, size_t data_len) 9166b09d423SEnrico Granata { 9176b09d423SEnrico Granata DispatchInput (data,data_len); 9186b09d423SEnrico Granata } 9196b09d423SEnrico Granata 9206b09d423SEnrico Granata void 921c3019991SFilipe Cabecinhas SBDebugger::DispatchInput (const void *data, size_t data_len) 92230fdc8d8SChris Lattner { 92344d93782SGreg Clayton // Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 92444d93782SGreg Clayton // 92544d93782SGreg Clayton // if (log) 92644d93782SGreg Clayton // log->Printf ("SBDebugger(%p)::DispatchInput (data=\"%.*s\", size_t=%" PRIu64 ")", 92744d93782SGreg Clayton // m_opaque_sp.get(), 92844d93782SGreg Clayton // (int) data_len, 92944d93782SGreg Clayton // (const char *) data, 93044d93782SGreg Clayton // (uint64_t)data_len); 93144d93782SGreg Clayton // 93244d93782SGreg Clayton // if (m_opaque_sp) 93344d93782SGreg Clayton // m_opaque_sp->DispatchInput ((const char *) data, data_len); 93430fdc8d8SChris Lattner } 93530fdc8d8SChris Lattner 93630fdc8d8SChris Lattner void 937efed6131SCaroline Tice SBDebugger::DispatchInputInterrupt () 938efed6131SCaroline Tice { 939efed6131SCaroline Tice if (m_opaque_sp) 940efed6131SCaroline Tice m_opaque_sp->DispatchInputInterrupt (); 941efed6131SCaroline Tice } 942efed6131SCaroline Tice 943efed6131SCaroline Tice void 944efed6131SCaroline Tice SBDebugger::DispatchInputEndOfFile () 945efed6131SCaroline Tice { 946efed6131SCaroline Tice if (m_opaque_sp) 947efed6131SCaroline Tice m_opaque_sp->DispatchInputEndOfFile (); 948efed6131SCaroline Tice } 9499088b068SCaroline Tice 950efed6131SCaroline Tice void 95130fdc8d8SChris Lattner SBDebugger::PushInputReader (SBInputReader &reader) 95230fdc8d8SChris Lattner { 95330fdc8d8SChris Lattner } 9546611103cSGreg Clayton 9556611103cSGreg Clayton void 95644d93782SGreg Clayton SBDebugger::RunCommandInterpreter (bool auto_handle_events, 95744d93782SGreg Clayton bool spawn_thread) 958969ed3d1SCaroline Tice { 959969ed3d1SCaroline Tice if (m_opaque_sp) 96026c7bf93SJim Ingham { 96126c7bf93SJim Ingham CommandInterpreterRunOptions options; 96226c7bf93SJim Ingham 96326c7bf93SJim Ingham m_opaque_sp->GetCommandInterpreter().RunCommandInterpreter(auto_handle_events, 96426c7bf93SJim Ingham spawn_thread, 96526c7bf93SJim Ingham options); 96626c7bf93SJim Ingham } 96726c7bf93SJim Ingham } 96826c7bf93SJim Ingham 96926c7bf93SJim Ingham void 97026c7bf93SJim Ingham SBDebugger::RunCommandInterpreter (bool auto_handle_events, 97126c7bf93SJim Ingham bool spawn_thread, 97226c7bf93SJim Ingham SBCommandInterpreterRunOptions &options, 97326c7bf93SJim Ingham int &num_errors, 974ffc9f1deSJim Ingham bool &quit_requested, 975ffc9f1deSJim Ingham bool &stopped_for_crash) 97626c7bf93SJim Ingham 97726c7bf93SJim Ingham { 97826c7bf93SJim Ingham if (m_opaque_sp) 97926c7bf93SJim Ingham { 98026c7bf93SJim Ingham CommandInterpreter &interp = m_opaque_sp->GetCommandInterpreter(); 98126c7bf93SJim Ingham interp.RunCommandInterpreter(auto_handle_events, spawn_thread, options.ref()); 98226c7bf93SJim Ingham num_errors = interp.GetNumErrors(); 98326c7bf93SJim Ingham quit_requested = interp.GetQuitRequested(); 984ffc9f1deSJim Ingham stopped_for_crash = interp.GetStoppedForCrash(); 98526c7bf93SJim Ingham } 986969ed3d1SCaroline Tice } 987969ed3d1SCaroline Tice 9883e7e915dSSean Callanan SBError 9893e7e915dSSean Callanan SBDebugger::RunREPL (lldb::LanguageType language, const char *repl_options) 9903e7e915dSSean Callanan { 9913e7e915dSSean Callanan SBError error; 9923e7e915dSSean Callanan if (m_opaque_sp) 9933e7e915dSSean Callanan error.ref() = m_opaque_sp->RunREPL(language, repl_options); 9943e7e915dSSean Callanan else 9953e7e915dSSean Callanan error.SetErrorString ("invalid debugger"); 9963e7e915dSSean Callanan return error; 9973e7e915dSSean Callanan } 9983e7e915dSSean Callanan 999969ed3d1SCaroline Tice void 1000431ce678SGreg Clayton SBDebugger::reset (const DebuggerSP &debugger_sp) 10016611103cSGreg Clayton { 10026611103cSGreg Clayton m_opaque_sp = debugger_sp; 10036611103cSGreg Clayton } 10046611103cSGreg Clayton 10056611103cSGreg Clayton Debugger * 10066611103cSGreg Clayton SBDebugger::get () const 10076611103cSGreg Clayton { 10086611103cSGreg Clayton return m_opaque_sp.get(); 10096611103cSGreg Clayton } 10106611103cSGreg Clayton 10116611103cSGreg Clayton Debugger & 10126611103cSGreg Clayton SBDebugger::ref () const 10136611103cSGreg Clayton { 10146611103cSGreg Clayton assert (m_opaque_sp.get()); 10156611103cSGreg Clayton return *m_opaque_sp; 10166611103cSGreg Clayton } 10176611103cSGreg Clayton 10189a37766eSGreg Clayton const lldb::DebuggerSP & 10199a37766eSGreg Clayton SBDebugger::get_sp () const 10209a37766eSGreg Clayton { 10219a37766eSGreg Clayton return m_opaque_sp; 10229a37766eSGreg Clayton } 10236611103cSGreg Clayton 1024ebc1bb27SCaroline Tice SBDebugger 1025ebc1bb27SCaroline Tice SBDebugger::FindDebuggerWithID (int id) 1026ebc1bb27SCaroline Tice { 1027af67cecdSGreg Clayton // No need to lock, the debugger list is thread safe 1028ebc1bb27SCaroline Tice SBDebugger sb_debugger; 1029431ce678SGreg Clayton DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id); 1030ebc1bb27SCaroline Tice if (debugger_sp) 1031ebc1bb27SCaroline Tice sb_debugger.reset (debugger_sp); 1032ebc1bb27SCaroline Tice return sb_debugger; 1033ebc1bb27SCaroline Tice } 1034e40e4218SJim Ingham 1035dd759857SCaroline Tice const char * 1036dd759857SCaroline Tice SBDebugger::GetInstanceName() 1037dd759857SCaroline Tice { 1038dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->GetInstanceName().AsCString() : nullptr); 1039dd759857SCaroline Tice } 1040dd759857SCaroline Tice 10413df9a8dfSCaroline Tice SBError 1042dd759857SCaroline Tice SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name) 10433df9a8dfSCaroline Tice { 10446920b52bSGreg Clayton SBError sb_error; 10456920b52bSGreg Clayton DebuggerSP debugger_sp(Debugger::FindDebuggerWithInstanceName (ConstString(debugger_instance_name))); 10466920b52bSGreg Clayton Error error; 10476920b52bSGreg Clayton if (debugger_sp) 10486920b52bSGreg Clayton { 10496920b52bSGreg Clayton ExecutionContext exe_ctx (debugger_sp->GetCommandInterpreter().GetExecutionContext()); 10506920b52bSGreg Clayton error = debugger_sp->SetPropertyValue (&exe_ctx, 10516920b52bSGreg Clayton eVarSetOperationAssign, 10526920b52bSGreg Clayton var_name, 10536920b52bSGreg Clayton value); 10546920b52bSGreg Clayton } 10556920b52bSGreg Clayton else 10566920b52bSGreg Clayton { 10576920b52bSGreg Clayton error.SetErrorStringWithFormat ("invalid debugger instance name '%s'", debugger_instance_name); 10586920b52bSGreg Clayton } 10596920b52bSGreg Clayton if (error.Fail()) 10606920b52bSGreg Clayton sb_error.SetError(error); 10616920b52bSGreg Clayton return sb_error; 10623df9a8dfSCaroline Tice } 10633df9a8dfSCaroline Tice 1064431ce678SGreg Clayton SBStringList 1065dd759857SCaroline Tice SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name) 10663df9a8dfSCaroline Tice { 10673df9a8dfSCaroline Tice SBStringList ret_value; 10686920b52bSGreg Clayton DebuggerSP debugger_sp(Debugger::FindDebuggerWithInstanceName (ConstString(debugger_instance_name))); 10696920b52bSGreg Clayton Error error; 10706920b52bSGreg Clayton if (debugger_sp) 10716920b52bSGreg Clayton { 10726920b52bSGreg Clayton ExecutionContext exe_ctx (debugger_sp->GetCommandInterpreter().GetExecutionContext()); 10736920b52bSGreg Clayton lldb::OptionValueSP value_sp (debugger_sp->GetPropertyValue (&exe_ctx, 10746920b52bSGreg Clayton var_name, 10756920b52bSGreg Clayton false, 10766920b52bSGreg Clayton error)); 10776920b52bSGreg Clayton if (value_sp) 10786920b52bSGreg Clayton { 10796920b52bSGreg Clayton StreamString value_strm; 10806920b52bSGreg Clayton value_sp->DumpValue (&exe_ctx, value_strm, OptionValue::eDumpOptionValue); 10816920b52bSGreg Clayton const std::string &value_str = value_strm.GetString(); 10826920b52bSGreg Clayton if (!value_str.empty()) 10836920b52bSGreg Clayton { 10846920b52bSGreg Clayton StringList string_list; 108544d93782SGreg Clayton string_list.SplitIntoLines(value_str); 10866920b52bSGreg Clayton return SBStringList(&string_list); 10876920b52bSGreg Clayton } 10886920b52bSGreg Clayton } 10896920b52bSGreg Clayton } 10906920b52bSGreg Clayton return SBStringList(); 10913df9a8dfSCaroline Tice } 10923df9a8dfSCaroline Tice 1093a7015092SGreg Clayton uint32_t 1094a7015092SGreg Clayton SBDebugger::GetTerminalWidth() const 1095a7015092SGreg Clayton { 1096dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->GetTerminalWidth() : 0); 1097a7015092SGreg Clayton } 1098a7015092SGreg Clayton 1099a7015092SGreg Clayton void 1100a7015092SGreg Clayton SBDebugger::SetTerminalWidth (uint32_t term_width) 1101a7015092SGreg Clayton { 1102a7015092SGreg Clayton if (m_opaque_sp) 1103a7015092SGreg Clayton m_opaque_sp->SetTerminalWidth (term_width); 1104a7015092SGreg Clayton } 1105a7015092SGreg Clayton 1106a7015092SGreg Clayton const char * 1107a7015092SGreg Clayton SBDebugger::GetPrompt() const 1108a7015092SGreg Clayton { 11095160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1110ceb6b139SCaroline Tice 1111ceb6b139SCaroline Tice if (log) 1112324a1036SSaleem Abdulrasool log->Printf ("SBDebugger(%p)::GetPrompt () => \"%s\"", 1113324a1036SSaleem Abdulrasool static_cast<void*>(m_opaque_sp.get()), 1114750cd175SCaroline Tice (m_opaque_sp ? m_opaque_sp->GetPrompt() : "")); 1115ceb6b139SCaroline Tice 1116dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->GetPrompt() : nullptr); 1117a7015092SGreg Clayton } 1118a7015092SGreg Clayton 1119a7015092SGreg Clayton void 1120a7015092SGreg Clayton SBDebugger::SetPrompt (const char *prompt) 1121a7015092SGreg Clayton { 1122a7015092SGreg Clayton if (m_opaque_sp) 1123a7015092SGreg Clayton m_opaque_sp->SetPrompt (prompt); 1124a7015092SGreg Clayton } 1125a7015092SGreg Clayton 1126431ce678SGreg Clayton ScriptLanguage 1127a7015092SGreg Clayton SBDebugger::GetScriptLanguage() const 1128a7015092SGreg Clayton { 1129dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->GetScriptLanguage() : eScriptLanguageNone); 1130a7015092SGreg Clayton } 1131a7015092SGreg Clayton 1132a7015092SGreg Clayton void 1133431ce678SGreg Clayton SBDebugger::SetScriptLanguage (ScriptLanguage script_lang) 1134a7015092SGreg Clayton { 1135a7015092SGreg Clayton if (m_opaque_sp) 1136af67cecdSGreg Clayton { 1137a7015092SGreg Clayton m_opaque_sp->SetScriptLanguage (script_lang); 1138a7015092SGreg Clayton } 1139af67cecdSGreg Clayton } 1140a7015092SGreg Clayton 1141e40e4218SJim Ingham bool 1142e40e4218SJim Ingham SBDebugger::SetUseExternalEditor(bool value) 1143e40e4218SJim Ingham { 1144dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->SetUseExternalEditor(value) : false); 1145e40e4218SJim Ingham } 1146e40e4218SJim Ingham 1147e40e4218SJim Ingham bool 1148daccaa9eSCaroline Tice SBDebugger::GetUseExternalEditor() 1149e40e4218SJim Ingham { 1150dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->GetUseExternalEditor() : false); 1151e40e4218SJim Ingham } 1152e40e4218SJim Ingham 1153dde9cff3SCaroline Tice bool 1154c3ce7f27SMichael Sartain SBDebugger::SetUseColor(bool value) 1155c3ce7f27SMichael Sartain { 1156dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->SetUseColor(value) : false); 1157c3ce7f27SMichael Sartain } 1158c3ce7f27SMichael Sartain 1159c3ce7f27SMichael Sartain bool 1160c3ce7f27SMichael Sartain SBDebugger::GetUseColor() const 1161c3ce7f27SMichael Sartain { 1162dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->GetUseColor() : false); 1163c3ce7f27SMichael Sartain } 1164c3ce7f27SMichael Sartain 1165c3ce7f27SMichael Sartain bool 1166dde9cff3SCaroline Tice SBDebugger::GetDescription (SBStream &description) 1167dde9cff3SCaroline Tice { 1168da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1169da7bc7d0SGreg Clayton 1170dde9cff3SCaroline Tice if (m_opaque_sp) 1171dde9cff3SCaroline Tice { 1172dde9cff3SCaroline Tice const char *name = m_opaque_sp->GetInstanceName().AsCString(); 1173431ce678SGreg Clayton user_id_t id = m_opaque_sp->GetID(); 1174d01b2953SDaniel Malea strm.Printf ("Debugger (instance: \"%s\", id: %" PRIu64 ")", name, id); 1175dde9cff3SCaroline Tice } 1176dde9cff3SCaroline Tice else 1177da7bc7d0SGreg Clayton strm.PutCString ("No value"); 1178dde9cff3SCaroline Tice 1179dde9cff3SCaroline Tice return true; 1180dde9cff3SCaroline Tice } 1181efed6131SCaroline Tice 1182431ce678SGreg Clayton user_id_t 1183efed6131SCaroline Tice SBDebugger::GetID() 1184efed6131SCaroline Tice { 1185dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->GetID() : LLDB_INVALID_UID); 1186efed6131SCaroline Tice } 11872289fa48SGreg Clayton 11882289fa48SGreg Clayton SBError 1189615eb7e6SGreg Clayton SBDebugger::SetCurrentPlatform (const char *platform_name_cstr) 11902289fa48SGreg Clayton { 11912289fa48SGreg Clayton SBError sb_error; 11922289fa48SGreg Clayton if (m_opaque_sp) 11932289fa48SGreg Clayton { 1194615eb7e6SGreg Clayton if (platform_name_cstr && platform_name_cstr[0]) 1195615eb7e6SGreg Clayton { 1196615eb7e6SGreg Clayton ConstString platform_name (platform_name_cstr); 1197615eb7e6SGreg Clayton PlatformSP platform_sp (Platform::Find (platform_name)); 11982289fa48SGreg Clayton 11992289fa48SGreg Clayton if (platform_sp) 12002289fa48SGreg Clayton { 1201615eb7e6SGreg Clayton // Already have a platform with this name, just select it 1202615eb7e6SGreg Clayton m_opaque_sp->GetPlatformList().SetSelectedPlatform(platform_sp); 1203615eb7e6SGreg Clayton } 1204615eb7e6SGreg Clayton else 1205615eb7e6SGreg Clayton { 1206615eb7e6SGreg Clayton // We don't have a platform by this name yet, create one 1207615eb7e6SGreg Clayton platform_sp = Platform::Create (platform_name, sb_error.ref()); 1208615eb7e6SGreg Clayton if (platform_sp) 1209615eb7e6SGreg Clayton { 1210615eb7e6SGreg Clayton // We created the platform, now append and select it 12112289fa48SGreg Clayton bool make_selected = true; 12122289fa48SGreg Clayton m_opaque_sp->GetPlatformList().Append (platform_sp, make_selected); 12132289fa48SGreg Clayton } 12142289fa48SGreg Clayton } 1215615eb7e6SGreg Clayton } 1216615eb7e6SGreg Clayton else 1217615eb7e6SGreg Clayton { 1218615eb7e6SGreg Clayton sb_error.ref().SetErrorString("invalid platform name"); 1219615eb7e6SGreg Clayton } 1220615eb7e6SGreg Clayton } 1221615eb7e6SGreg Clayton else 1222615eb7e6SGreg Clayton { 1223615eb7e6SGreg Clayton sb_error.ref().SetErrorString("invalid debugger"); 1224615eb7e6SGreg Clayton } 12252289fa48SGreg Clayton return sb_error; 12262289fa48SGreg Clayton } 12272289fa48SGreg Clayton 1228fc3f027dSGreg Clayton bool 1229f3dd93c8SGreg Clayton SBDebugger::SetCurrentPlatformSDKRoot (const char *sysroot) 1230f3dd93c8SGreg Clayton { 1231*e1cf274bSJason Molenda Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1232f3dd93c8SGreg Clayton if (m_opaque_sp) 1233f3dd93c8SGreg Clayton { 1234f3dd93c8SGreg Clayton PlatformSP platform_sp (m_opaque_sp->GetPlatformList().GetSelectedPlatform()); 1235f3dd93c8SGreg Clayton 1236f3dd93c8SGreg Clayton if (platform_sp) 1237f3dd93c8SGreg Clayton { 1238*e1cf274bSJason Molenda if (log && sysroot) 1239*e1cf274bSJason Molenda log->Printf ("SBDebugger::SetCurrentPlatformSDKRoot (\"%s\")", sysroot); 1240f3dd93c8SGreg Clayton platform_sp->SetSDKRootDirectory (ConstString (sysroot)); 1241f3dd93c8SGreg Clayton return true; 1242f3dd93c8SGreg Clayton } 1243f3dd93c8SGreg Clayton } 1244f3dd93c8SGreg Clayton return false; 1245f3dd93c8SGreg Clayton } 1246f3dd93c8SGreg Clayton 1247f3dd93c8SGreg Clayton bool 1248fc3f027dSGreg Clayton SBDebugger::GetCloseInputOnEOF() const 1249fc3f027dSGreg Clayton { 1250dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->GetCloseInputOnEOF() : false); 1251fc3f027dSGreg Clayton } 1252fc3f027dSGreg Clayton 1253fc3f027dSGreg Clayton void 1254fc3f027dSGreg Clayton SBDebugger::SetCloseInputOnEOF (bool b) 1255fc3f027dSGreg Clayton { 1256fc3f027dSGreg Clayton if (m_opaque_sp) 1257fc3f027dSGreg Clayton m_opaque_sp->SetCloseInputOnEOF (b); 1258fc3f027dSGreg Clayton } 1259061858ceSEnrico Granata 1260061858ceSEnrico Granata SBTypeCategory 1261061858ceSEnrico Granata SBDebugger::GetCategory (const char* category_name) 1262061858ceSEnrico Granata { 1263061858ceSEnrico Granata if (!category_name || *category_name == 0) 1264061858ceSEnrico Granata return SBTypeCategory(); 1265061858ceSEnrico Granata 1266061858ceSEnrico Granata TypeCategoryImplSP category_sp; 1267061858ceSEnrico Granata 1268061858ceSEnrico Granata if (DataVisualization::Categories::GetCategory(ConstString(category_name), category_sp, false)) 1269061858ceSEnrico Granata return SBTypeCategory(category_sp); 1270061858ceSEnrico Granata else 1271061858ceSEnrico Granata return SBTypeCategory(); 1272061858ceSEnrico Granata } 1273061858ceSEnrico Granata 1274061858ceSEnrico Granata SBTypeCategory 1275e242624cSEnrico Granata SBDebugger::GetCategory (lldb::LanguageType lang_type) 1276e242624cSEnrico Granata { 1277e242624cSEnrico Granata TypeCategoryImplSP category_sp; 1278e242624cSEnrico Granata if (DataVisualization::Categories::GetCategory(lang_type, category_sp)) 1279e242624cSEnrico Granata return SBTypeCategory(category_sp); 1280e242624cSEnrico Granata else 1281e242624cSEnrico Granata return SBTypeCategory(); 1282e242624cSEnrico Granata } 1283e242624cSEnrico Granata 1284e242624cSEnrico Granata SBTypeCategory 1285061858ceSEnrico Granata SBDebugger::CreateCategory (const char* category_name) 1286061858ceSEnrico Granata { 1287061858ceSEnrico Granata if (!category_name || *category_name == 0) 1288061858ceSEnrico Granata return SBTypeCategory(); 1289061858ceSEnrico Granata 1290061858ceSEnrico Granata TypeCategoryImplSP category_sp; 1291061858ceSEnrico Granata 1292061858ceSEnrico Granata if (DataVisualization::Categories::GetCategory(ConstString(category_name), category_sp, true)) 1293061858ceSEnrico Granata return SBTypeCategory(category_sp); 1294061858ceSEnrico Granata else 1295061858ceSEnrico Granata return SBTypeCategory(); 1296061858ceSEnrico Granata } 1297061858ceSEnrico Granata 1298061858ceSEnrico Granata bool 1299061858ceSEnrico Granata SBDebugger::DeleteCategory (const char* category_name) 1300061858ceSEnrico Granata { 1301061858ceSEnrico Granata if (!category_name || *category_name == 0) 1302061858ceSEnrico Granata return false; 1303061858ceSEnrico Granata 1304061858ceSEnrico Granata return DataVisualization::Categories::Delete(ConstString(category_name)); 1305061858ceSEnrico Granata } 1306061858ceSEnrico Granata 1307061858ceSEnrico Granata uint32_t 1308061858ceSEnrico Granata SBDebugger::GetNumCategories() 1309061858ceSEnrico Granata { 1310061858ceSEnrico Granata return DataVisualization::Categories::GetCount(); 1311061858ceSEnrico Granata } 1312061858ceSEnrico Granata 1313061858ceSEnrico Granata SBTypeCategory 1314061858ceSEnrico Granata SBDebugger::GetCategoryAtIndex (uint32_t index) 1315061858ceSEnrico Granata { 1316061858ceSEnrico Granata return SBTypeCategory(DataVisualization::Categories::GetCategoryAtIndex(index)); 1317061858ceSEnrico Granata } 1318061858ceSEnrico Granata 1319061858ceSEnrico Granata SBTypeCategory 1320061858ceSEnrico Granata SBDebugger::GetDefaultCategory() 1321061858ceSEnrico Granata { 1322061858ceSEnrico Granata return GetCategory("default"); 1323061858ceSEnrico Granata } 1324061858ceSEnrico Granata 1325061858ceSEnrico Granata SBTypeFormat 1326061858ceSEnrico Granata SBDebugger::GetFormatForType (SBTypeNameSpecifier type_name) 1327061858ceSEnrico Granata { 1328061858ceSEnrico Granata SBTypeCategory default_category_sb = GetDefaultCategory(); 1329061858ceSEnrico Granata if (default_category_sb.GetEnabled()) 1330061858ceSEnrico Granata return default_category_sb.GetFormatForType(type_name); 1331061858ceSEnrico Granata return SBTypeFormat(); 1332061858ceSEnrico Granata } 1333061858ceSEnrico Granata 1334cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON 1335061858ceSEnrico Granata SBTypeSummary 1336061858ceSEnrico Granata SBDebugger::GetSummaryForType (SBTypeNameSpecifier type_name) 1337061858ceSEnrico Granata { 1338dbb0abbfSEugene Zelenko if (!type_name.IsValid()) 1339a777dc2aSEnrico Granata return SBTypeSummary(); 1340a777dc2aSEnrico Granata return SBTypeSummary(DataVisualization::GetSummaryForType(type_name.GetSP())); 1341061858ceSEnrico Granata } 1342cf7e2dc0SJason Molenda #endif // LLDB_DISABLE_PYTHON 1343061858ceSEnrico Granata 1344061858ceSEnrico Granata SBTypeFilter 1345061858ceSEnrico Granata SBDebugger::GetFilterForType (SBTypeNameSpecifier type_name) 1346061858ceSEnrico Granata { 1347dbb0abbfSEugene Zelenko if (!type_name.IsValid()) 1348a777dc2aSEnrico Granata return SBTypeFilter(); 1349a777dc2aSEnrico Granata return SBTypeFilter(DataVisualization::GetFilterForType(type_name.GetSP())); 1350061858ceSEnrico Granata } 1351061858ceSEnrico Granata 1352cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON 1353061858ceSEnrico Granata SBTypeSynthetic 1354061858ceSEnrico Granata SBDebugger::GetSyntheticForType (SBTypeNameSpecifier type_name) 1355061858ceSEnrico Granata { 1356dbb0abbfSEugene Zelenko if (!type_name.IsValid()) 1357a777dc2aSEnrico Granata return SBTypeSynthetic(); 1358a777dc2aSEnrico Granata return SBTypeSynthetic(DataVisualization::GetSyntheticForType(type_name.GetSP())); 1359061858ceSEnrico Granata } 1360cf7e2dc0SJason Molenda #endif // LLDB_DISABLE_PYTHON 1361061858ceSEnrico Granata 1362228063cdSJim Ingham bool 1363228063cdSJim Ingham SBDebugger::EnableLog (const char *channel, const char **categories) 1364228063cdSJim Ingham { 1365228063cdSJim Ingham if (m_opaque_sp) 1366228063cdSJim Ingham { 1367228063cdSJim Ingham uint32_t log_options = LLDB_LOG_OPTION_PREPEND_TIMESTAMP | LLDB_LOG_OPTION_PREPEND_THREAD_NAME; 1368228063cdSJim Ingham StreamString errors; 1369dbb0abbfSEugene Zelenko return m_opaque_sp->EnableLog(channel, categories, nullptr, log_options, errors); 1370228063cdSJim Ingham } 1371228063cdSJim Ingham else 1372228063cdSJim Ingham return false; 1373228063cdSJim Ingham } 13744f02b22dSJim Ingham 13754f02b22dSJim Ingham void 13764f02b22dSJim Ingham SBDebugger::SetLoggingCallback (lldb::LogOutputCallback log_callback, void *baton) 13774f02b22dSJim Ingham { 13784f02b22dSJim Ingham if (m_opaque_sp) 13794f02b22dSJim Ingham { 13804f02b22dSJim Ingham return m_opaque_sp->SetLoggingCallback (log_callback, baton); 13814f02b22dSJim Ingham } 13824f02b22dSJim Ingham } 1383