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 10ca93cc1dSEli Friedman #include "lldb/API/SBDebugger.h" 1130fdc8d8SChris Lattner 12e0d378b3SGreg Clayton #include "lldb/lldb-private.h" 1330fdc8d8SChris Lattner 14ca93cc1dSEli Friedman #include "lldb/API/SBListener.h" 15ca93cc1dSEli Friedman #include "lldb/API/SBBroadcaster.h" 16ca93cc1dSEli Friedman #include "lldb/API/SBCommandInterpreter.h" 17ca93cc1dSEli Friedman #include "lldb/API/SBCommandReturnObject.h" 182289fa48SGreg Clayton #include "lldb/API/SBError.h" 19ca93cc1dSEli Friedman #include "lldb/API/SBEvent.h" 20ca93cc1dSEli Friedman #include "lldb/API/SBFrame.h" 21ca93cc1dSEli Friedman #include "lldb/API/SBInputReader.h" 223df9a8dfSCaroline Tice #include "lldb/API/SBProcess.h" 233df9a8dfSCaroline Tice #include "lldb/API/SBSourceManager.h" 24dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 253df9a8dfSCaroline Tice #include "lldb/API/SBStringList.h" 263df9a8dfSCaroline Tice #include "lldb/API/SBTarget.h" 273df9a8dfSCaroline Tice #include "lldb/API/SBThread.h" 28061858ceSEnrico Granata #include "lldb/API/SBTypeCategory.h" 29061858ceSEnrico Granata #include "lldb/API/SBTypeFormat.h" 30061858ceSEnrico Granata #include "lldb/API/SBTypeFilter.h" 31061858ceSEnrico Granata #include "lldb/API/SBTypeNameSpecifier.h" 32061858ceSEnrico Granata #include "lldb/API/SBTypeSummary.h" 33061858ceSEnrico Granata #include "lldb/API/SBTypeSynthetic.h" 34061858ceSEnrico Granata 35061858ceSEnrico Granata 36061858ceSEnrico Granata #include "lldb/Core/DataVisualization.h" 376eee5aa0SGreg Clayton #include "lldb/Core/Debugger.h" 386eee5aa0SGreg Clayton #include "lldb/Core/State.h" 396eee5aa0SGreg Clayton #include "lldb/Interpreter/Args.h" 406eee5aa0SGreg Clayton #include "lldb/Interpreter/CommandInterpreter.h" 41cac9c5f9SGreg Clayton #include "lldb/Interpreter/OptionGroupPlatform.h" 426eee5aa0SGreg Clayton #include "lldb/Target/Process.h" 436eee5aa0SGreg Clayton #include "lldb/Target/TargetList.h" 4430fdc8d8SChris Lattner 4530fdc8d8SChris Lattner using namespace lldb; 4630fdc8d8SChris Lattner using namespace lldb_private; 4730fdc8d8SChris Lattner 4830fdc8d8SChris Lattner void 4930fdc8d8SChris Lattner SBDebugger::Initialize () 5030fdc8d8SChris Lattner { 51431ce678SGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 52ceb6b139SCaroline Tice 53ceb6b139SCaroline Tice if (log) 54ceb6b139SCaroline Tice log->Printf ("SBDebugger::Initialize ()"); 55ceb6b139SCaroline Tice 56fc36f791SGreg Clayton SBCommandInterpreter::InitializeSWIG (); 57fc36f791SGreg Clayton 5830fdc8d8SChris Lattner Debugger::Initialize(); 5930fdc8d8SChris Lattner } 6030fdc8d8SChris Lattner 6130fdc8d8SChris Lattner void 6230fdc8d8SChris Lattner SBDebugger::Terminate () 6330fdc8d8SChris Lattner { 6430fdc8d8SChris Lattner Debugger::Terminate(); 6530fdc8d8SChris Lattner } 6630fdc8d8SChris Lattner 6748e42549SGreg Clayton void 6848e42549SGreg Clayton SBDebugger::Clear () 6948e42549SGreg Clayton { 70431ce678SGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 71ceb6b139SCaroline Tice 72ceb6b139SCaroline Tice if (log) 7393aa84e8SGreg Clayton log->Printf ("SBDebugger(%p)::Clear ()", m_opaque_sp.get()); 743d6086f6SCaroline Tice 753d6086f6SCaroline Tice if (m_opaque_sp) 763d6086f6SCaroline Tice m_opaque_sp->CleanUpInputReaders (); 77ceb6b139SCaroline Tice 7848e42549SGreg Clayton m_opaque_sp.reset(); 7948e42549SGreg Clayton } 8048e42549SGreg Clayton 816611103cSGreg Clayton SBDebugger 826611103cSGreg Clayton SBDebugger::Create() 836611103cSGreg Clayton { 84228063cdSJim Ingham return SBDebugger::Create(false, NULL, NULL); 8506942690SJim Ingham } 8606942690SJim Ingham 8706942690SJim Ingham SBDebugger 8806942690SJim Ingham SBDebugger::Create(bool source_init_files) 8906942690SJim Ingham { 90228063cdSJim Ingham return SBDebugger::Create (source_init_files, NULL, NULL); 91228063cdSJim Ingham } 92228063cdSJim Ingham 93228063cdSJim Ingham SBDebugger 94228063cdSJim Ingham SBDebugger::Create(bool source_init_files, lldb::LogOutputCallback callback, void *baton) 95228063cdSJim Ingham 96228063cdSJim Ingham { 97431ce678SGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 98ceb6b139SCaroline Tice 996611103cSGreg Clayton SBDebugger debugger; 100228063cdSJim Ingham debugger.reset(Debugger::CreateInstance(callback, baton)); 101ceb6b139SCaroline Tice 102ceb6b139SCaroline Tice if (log) 103ceb6b139SCaroline Tice { 104ceb6b139SCaroline Tice SBStream sstr; 105ceb6b139SCaroline Tice debugger.GetDescription (sstr); 10693aa84e8SGreg Clayton log->Printf ("SBDebugger::Create () => SBDebugger(%p): %s", debugger.m_opaque_sp.get(), sstr.GetData()); 107ceb6b139SCaroline Tice } 108ceb6b139SCaroline Tice 10906942690SJim Ingham SBCommandInterpreter interp = debugger.GetCommandInterpreter(); 11006942690SJim Ingham if (source_init_files) 11106942690SJim Ingham { 11206942690SJim Ingham interp.get()->SkipLLDBInitFiles(false); 11306942690SJim Ingham interp.get()->SkipAppInitFiles (false); 11406942690SJim Ingham SBCommandReturnObject result; 11506942690SJim Ingham interp.SourceInitFileInHomeDirectory(result); 11606942690SJim Ingham } 11706942690SJim Ingham else 11806942690SJim Ingham { 11906942690SJim Ingham interp.get()->SkipLLDBInitFiles(true); 12006942690SJim Ingham interp.get()->SkipAppInitFiles (true); 12106942690SJim Ingham } 1226611103cSGreg Clayton return debugger; 1236611103cSGreg Clayton } 1246611103cSGreg Clayton 125e02657b1SCaroline Tice void 126e02657b1SCaroline Tice SBDebugger::Destroy (SBDebugger &debugger) 127e02657b1SCaroline Tice { 128431ce678SGreg Clayton LogSP log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 129e02657b1SCaroline Tice 130e02657b1SCaroline Tice if (log) 131e02657b1SCaroline Tice { 132e02657b1SCaroline Tice SBStream sstr; 133e02657b1SCaroline Tice debugger.GetDescription (sstr); 134e02657b1SCaroline Tice log->Printf ("SBDebugger::Destroy () => SBDebugger(%p): %s", debugger.m_opaque_sp.get(), sstr.GetData()); 135e02657b1SCaroline Tice } 136e02657b1SCaroline Tice 137e02657b1SCaroline Tice Debugger::Destroy (debugger.m_opaque_sp); 138e02657b1SCaroline Tice 139e02657b1SCaroline Tice if (debugger.m_opaque_sp.get() != NULL) 140e02657b1SCaroline Tice debugger.m_opaque_sp.reset(); 141e02657b1SCaroline Tice } 142e02657b1SCaroline Tice 143f9322415SGreg Clayton void 144f9322415SGreg Clayton SBDebugger::MemoryPressureDetected () 145f9322415SGreg Clayton { 1460cd70866SGreg Clayton // Since this function can be call asynchronously, we allow it to be 1470cd70866SGreg Clayton // non-mandatory. We have seen deadlocks with this function when called 1480cd70866SGreg Clayton // so we need to safeguard against this until we can determine what is 1490cd70866SGreg Clayton // causing the deadlocks. 1500cd70866SGreg Clayton const bool mandatory = false; 1510cd70866SGreg Clayton ModuleList::RemoveOrphanSharedModules(mandatory); 152f9322415SGreg Clayton } 153f9322415SGreg Clayton 1546611103cSGreg Clayton SBDebugger::SBDebugger () : 1556611103cSGreg Clayton m_opaque_sp () 1566611103cSGreg Clayton { 1576611103cSGreg Clayton } 1586611103cSGreg Clayton 159274fd6e9SEnrico Granata SBDebugger::SBDebugger(const lldb::DebuggerSP &debugger_sp) : 160274fd6e9SEnrico Granata m_opaque_sp(debugger_sp) 161274fd6e9SEnrico Granata { 162274fd6e9SEnrico Granata } 163274fd6e9SEnrico Granata 164efabb123SGreg Clayton SBDebugger::SBDebugger(const SBDebugger &rhs) : 165efabb123SGreg Clayton m_opaque_sp (rhs.m_opaque_sp) 166efabb123SGreg Clayton { 167efabb123SGreg Clayton } 168efabb123SGreg Clayton 169efabb123SGreg Clayton SBDebugger & 170efabb123SGreg Clayton SBDebugger::operator = (const SBDebugger &rhs) 171efabb123SGreg Clayton { 172efabb123SGreg Clayton if (this != &rhs) 173efabb123SGreg Clayton { 174efabb123SGreg Clayton m_opaque_sp = rhs.m_opaque_sp; 175efabb123SGreg Clayton } 176efabb123SGreg Clayton return *this; 177efabb123SGreg Clayton } 178efabb123SGreg Clayton 1796611103cSGreg Clayton SBDebugger::~SBDebugger () 1806611103cSGreg Clayton { 1816611103cSGreg Clayton } 1826611103cSGreg Clayton 1836611103cSGreg Clayton bool 1846611103cSGreg Clayton SBDebugger::IsValid() const 1856611103cSGreg Clayton { 1866611103cSGreg Clayton return m_opaque_sp.get() != NULL; 1876611103cSGreg Clayton } 1886611103cSGreg Clayton 1896611103cSGreg Clayton 19030fdc8d8SChris Lattner void 19130fdc8d8SChris Lattner SBDebugger::SetAsync (bool b) 19230fdc8d8SChris Lattner { 1936611103cSGreg Clayton if (m_opaque_sp) 1946611103cSGreg Clayton m_opaque_sp->SetAsyncExecution(b); 19530fdc8d8SChris Lattner } 19630fdc8d8SChris Lattner 197e64f0dc7SJim Ingham bool 198e64f0dc7SJim Ingham SBDebugger::GetAsync () 199e64f0dc7SJim Ingham { 200e64f0dc7SJim Ingham if (m_opaque_sp) 201e64f0dc7SJim Ingham return m_opaque_sp->GetAsyncExecution(); 202e64f0dc7SJim Ingham else 203e64f0dc7SJim Ingham return false; 204e64f0dc7SJim Ingham } 205e64f0dc7SJim Ingham 2066eee5aa0SGreg Clayton void 2076eee5aa0SGreg Clayton SBDebugger::SkipLLDBInitFiles (bool b) 2086eee5aa0SGreg Clayton { 2096eee5aa0SGreg Clayton if (m_opaque_sp) 2106eee5aa0SGreg Clayton m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles (b); 2116eee5aa0SGreg Clayton } 2126eee5aa0SGreg Clayton 21316e0c686SJim Ingham void 21416e0c686SJim Ingham SBDebugger::SkipAppInitFiles (bool b) 21516e0c686SJim Ingham { 21616e0c686SJim Ingham if (m_opaque_sp) 21716e0c686SJim Ingham m_opaque_sp->GetCommandInterpreter().SkipAppInitFiles (b); 21816e0c686SJim Ingham } 21916e0c686SJim Ingham 22030fdc8d8SChris Lattner // Shouldn't really be settable after initialization as this could cause lots of problems; don't want users 22130fdc8d8SChris Lattner // trying to switch modes in the middle of a debugging session. 22230fdc8d8SChris Lattner void 22330fdc8d8SChris Lattner SBDebugger::SetInputFileHandle (FILE *fh, bool transfer_ownership) 22430fdc8d8SChris Lattner { 225431ce678SGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 226ceb6b139SCaroline Tice 227ceb6b139SCaroline Tice if (log) 228cfd1acedSGreg Clayton log->Printf ("SBDebugger(%p)::SetInputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(), 229cfd1acedSGreg Clayton fh, transfer_ownership); 230ceb6b139SCaroline Tice 2316611103cSGreg Clayton if (m_opaque_sp) 2326611103cSGreg Clayton m_opaque_sp->SetInputFileHandle (fh, transfer_ownership); 23330fdc8d8SChris Lattner } 23430fdc8d8SChris Lattner 23530fdc8d8SChris Lattner void 23630fdc8d8SChris Lattner SBDebugger::SetOutputFileHandle (FILE *fh, bool transfer_ownership) 23730fdc8d8SChris Lattner { 238431ce678SGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 239ceb6b139SCaroline Tice 240ceb6b139SCaroline Tice 241ceb6b139SCaroline Tice if (log) 242cfd1acedSGreg Clayton log->Printf ("SBDebugger(%p)::SetOutputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(), 243cfd1acedSGreg Clayton fh, transfer_ownership); 244ceb6b139SCaroline Tice 2456611103cSGreg Clayton if (m_opaque_sp) 2466611103cSGreg Clayton m_opaque_sp->SetOutputFileHandle (fh, transfer_ownership); 24730fdc8d8SChris Lattner } 24830fdc8d8SChris Lattner 24930fdc8d8SChris Lattner void 25030fdc8d8SChris Lattner SBDebugger::SetErrorFileHandle (FILE *fh, bool transfer_ownership) 25130fdc8d8SChris Lattner { 252431ce678SGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 253ceb6b139SCaroline Tice 254ceb6b139SCaroline Tice 255ceb6b139SCaroline Tice if (log) 256cfd1acedSGreg Clayton log->Printf ("SBDebugger(%p)::SetErrorFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(), 257cfd1acedSGreg Clayton fh, transfer_ownership); 258ceb6b139SCaroline Tice 2596611103cSGreg Clayton if (m_opaque_sp) 2606611103cSGreg Clayton m_opaque_sp->SetErrorFileHandle (fh, transfer_ownership); 26130fdc8d8SChris Lattner } 26230fdc8d8SChris Lattner 26330fdc8d8SChris Lattner FILE * 26430fdc8d8SChris Lattner SBDebugger::GetInputFileHandle () 26530fdc8d8SChris Lattner { 2666611103cSGreg Clayton if (m_opaque_sp) 26751b1e2d2SGreg Clayton return m_opaque_sp->GetInputFile().GetStream(); 2686611103cSGreg Clayton return NULL; 26930fdc8d8SChris Lattner } 27030fdc8d8SChris Lattner 27130fdc8d8SChris Lattner FILE * 27230fdc8d8SChris Lattner SBDebugger::GetOutputFileHandle () 27330fdc8d8SChris Lattner { 2746611103cSGreg Clayton if (m_opaque_sp) 27551b1e2d2SGreg Clayton return m_opaque_sp->GetOutputFile().GetStream(); 2766611103cSGreg Clayton return NULL; 27730fdc8d8SChris Lattner } 27830fdc8d8SChris Lattner 27930fdc8d8SChris Lattner FILE * 28030fdc8d8SChris Lattner SBDebugger::GetErrorFileHandle () 28130fdc8d8SChris Lattner { 2826611103cSGreg Clayton if (m_opaque_sp) 28351b1e2d2SGreg Clayton return m_opaque_sp->GetErrorFile().GetStream(); 2846611103cSGreg Clayton return NULL; 28530fdc8d8SChris Lattner } 28630fdc8d8SChris Lattner 28730fdc8d8SChris Lattner SBCommandInterpreter 28830fdc8d8SChris Lattner SBDebugger::GetCommandInterpreter () 28930fdc8d8SChris Lattner { 290431ce678SGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 291ceb6b139SCaroline Tice 2926611103cSGreg Clayton SBCommandInterpreter sb_interpreter; 2936611103cSGreg Clayton if (m_opaque_sp) 2946611103cSGreg Clayton sb_interpreter.reset (&m_opaque_sp->GetCommandInterpreter()); 295ceb6b139SCaroline Tice 296750cd175SCaroline Tice if (log) 29793aa84e8SGreg Clayton log->Printf ("SBDebugger(%p)::GetCommandInterpreter () => SBCommandInterpreter(%p)", 298750cd175SCaroline Tice m_opaque_sp.get(), sb_interpreter.get()); 299750cd175SCaroline Tice 30030fdc8d8SChris Lattner return sb_interpreter; 30130fdc8d8SChris Lattner } 30230fdc8d8SChris Lattner 30330fdc8d8SChris Lattner void 30430fdc8d8SChris Lattner SBDebugger::HandleCommand (const char *command) 30530fdc8d8SChris Lattner { 3066611103cSGreg Clayton if (m_opaque_sp) 3076611103cSGreg Clayton { 308af67cecdSGreg Clayton TargetSP target_sp (m_opaque_sp->GetSelectedTarget()); 309af67cecdSGreg Clayton Mutex::Locker api_locker; 310af67cecdSGreg Clayton if (target_sp) 31110ebffa4SJim Ingham api_locker.Lock(target_sp->GetAPIMutex()); 312af67cecdSGreg Clayton 3136611103cSGreg Clayton SBCommandInterpreter sb_interpreter(GetCommandInterpreter ()); 31430fdc8d8SChris Lattner SBCommandReturnObject result; 31530fdc8d8SChris Lattner 31630fdc8d8SChris Lattner sb_interpreter.HandleCommand (command, result, false); 31730fdc8d8SChris Lattner 31830fdc8d8SChris Lattner if (GetErrorFileHandle() != NULL) 31930fdc8d8SChris Lattner result.PutError (GetErrorFileHandle()); 32030fdc8d8SChris Lattner if (GetOutputFileHandle() != NULL) 32130fdc8d8SChris Lattner result.PutOutput (GetOutputFileHandle()); 32230fdc8d8SChris Lattner 3236611103cSGreg Clayton if (m_opaque_sp->GetAsyncExecution() == false) 32430fdc8d8SChris Lattner { 3256611103cSGreg Clayton SBProcess process(GetCommandInterpreter().GetProcess ()); 326b9556accSGreg Clayton ProcessSP process_sp (process.GetSP()); 327b9556accSGreg Clayton if (process_sp) 32830fdc8d8SChris Lattner { 32930fdc8d8SChris Lattner EventSP event_sp; 3306611103cSGreg Clayton Listener &lldb_listener = m_opaque_sp->GetListener(); 331b9556accSGreg Clayton while (lldb_listener.GetNextEventForBroadcaster (process_sp.get(), event_sp)) 33230fdc8d8SChris Lattner { 33330fdc8d8SChris Lattner SBEvent event(event_sp); 33430fdc8d8SChris Lattner HandleProcessEvent (process, event, GetOutputFileHandle(), GetErrorFileHandle()); 33530fdc8d8SChris Lattner } 33630fdc8d8SChris Lattner } 33730fdc8d8SChris Lattner } 33830fdc8d8SChris Lattner } 3396611103cSGreg Clayton } 34030fdc8d8SChris Lattner 34130fdc8d8SChris Lattner SBListener 34230fdc8d8SChris Lattner SBDebugger::GetListener () 34330fdc8d8SChris Lattner { 344431ce678SGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 345ceb6b139SCaroline Tice 3466611103cSGreg Clayton SBListener sb_listener; 3476611103cSGreg Clayton if (m_opaque_sp) 3486611103cSGreg Clayton sb_listener.reset(&m_opaque_sp->GetListener(), false); 349ceb6b139SCaroline Tice 350750cd175SCaroline Tice if (log) 35193aa84e8SGreg Clayton log->Printf ("SBDebugger(%p)::GetListener () => SBListener(%p)", m_opaque_sp.get(), 352750cd175SCaroline Tice sb_listener.get()); 353750cd175SCaroline Tice 35430fdc8d8SChris Lattner return sb_listener; 35530fdc8d8SChris Lattner } 35630fdc8d8SChris Lattner 35730fdc8d8SChris Lattner void 35830fdc8d8SChris Lattner SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, FILE *out, FILE *err) 35930fdc8d8SChris Lattner { 360af67cecdSGreg Clayton if (!process.IsValid()) 361af67cecdSGreg Clayton return; 362af67cecdSGreg Clayton 363b9556accSGreg Clayton TargetSP target_sp (process.GetTarget().GetSP()); 364b9556accSGreg Clayton if (!target_sp) 365b9556accSGreg Clayton return; 366b9556accSGreg Clayton 36730fdc8d8SChris Lattner const uint32_t event_type = event.GetType(); 36830fdc8d8SChris Lattner char stdio_buffer[1024]; 36930fdc8d8SChris Lattner size_t len; 37030fdc8d8SChris Lattner 371b9556accSGreg Clayton Mutex::Locker api_locker (target_sp->GetAPIMutex()); 372af67cecdSGreg Clayton 373af67cecdSGreg Clayton if (event_type & (Process::eBroadcastBitSTDOUT | Process::eBroadcastBitStateChanged)) 37430fdc8d8SChris Lattner { 375af67cecdSGreg Clayton // Drain stdout when we stop just in case we have any bytes 37630fdc8d8SChris Lattner while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0) 37730fdc8d8SChris Lattner if (out != NULL) 37830fdc8d8SChris Lattner ::fwrite (stdio_buffer, 1, len, out); 37930fdc8d8SChris Lattner } 380af67cecdSGreg Clayton 381af67cecdSGreg Clayton if (event_type & (Process::eBroadcastBitSTDERR | Process::eBroadcastBitStateChanged)) 38230fdc8d8SChris Lattner { 383af67cecdSGreg Clayton // Drain stderr when we stop just in case we have any bytes 38430fdc8d8SChris Lattner while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0) 385af67cecdSGreg Clayton if (err != NULL) 386af67cecdSGreg Clayton ::fwrite (stdio_buffer, 1, len, err); 38730fdc8d8SChris Lattner } 388af67cecdSGreg Clayton 389af67cecdSGreg Clayton if (event_type & Process::eBroadcastBitStateChanged) 39030fdc8d8SChris Lattner { 39130fdc8d8SChris Lattner StateType event_state = SBProcess::GetStateFromEvent (event); 39230fdc8d8SChris Lattner 39330fdc8d8SChris Lattner if (event_state == eStateInvalid) 39430fdc8d8SChris Lattner return; 39530fdc8d8SChris Lattner 39630fdc8d8SChris Lattner bool is_stopped = StateIsStoppedState (event_state); 39730fdc8d8SChris Lattner if (!is_stopped) 3982976d00aSJim Ingham process.ReportEventState (event, out); 39930fdc8d8SChris Lattner } 40030fdc8d8SChris Lattner } 40130fdc8d8SChris Lattner 402e37d605eSJim Ingham SBSourceManager 40330fdc8d8SChris Lattner SBDebugger::GetSourceManager () 40430fdc8d8SChris Lattner { 405e37d605eSJim Ingham SBSourceManager sb_source_manager (*this); 406e37d605eSJim Ingham return sb_source_manager; 40730fdc8d8SChris Lattner } 40830fdc8d8SChris Lattner 40930fdc8d8SChris Lattner 41030fdc8d8SChris Lattner bool 41130fdc8d8SChris Lattner SBDebugger::GetDefaultArchitecture (char *arch_name, size_t arch_name_len) 41230fdc8d8SChris Lattner { 41330fdc8d8SChris Lattner if (arch_name && arch_name_len) 41430fdc8d8SChris Lattner { 415431ce678SGreg Clayton ArchSpec default_arch = Target::GetDefaultArchitecture (); 416daccaa9eSCaroline Tice 41730fdc8d8SChris Lattner if (default_arch.IsValid()) 41830fdc8d8SChris Lattner { 419431ce678SGreg Clayton const std::string &triple_str = default_arch.GetTriple().str(); 420431ce678SGreg Clayton if (!triple_str.empty()) 421431ce678SGreg Clayton ::snprintf (arch_name, arch_name_len, "%s", triple_str.c_str()); 422431ce678SGreg Clayton else 42364195a2cSGreg Clayton ::snprintf (arch_name, arch_name_len, "%s", default_arch.GetArchitectureName()); 42430fdc8d8SChris Lattner return true; 42530fdc8d8SChris Lattner } 42630fdc8d8SChris Lattner } 42730fdc8d8SChris Lattner if (arch_name && arch_name_len) 42830fdc8d8SChris Lattner arch_name[0] = '\0'; 42930fdc8d8SChris Lattner return false; 43030fdc8d8SChris Lattner } 43130fdc8d8SChris Lattner 43230fdc8d8SChris Lattner 43330fdc8d8SChris Lattner bool 43430fdc8d8SChris Lattner SBDebugger::SetDefaultArchitecture (const char *arch_name) 43530fdc8d8SChris Lattner { 43630fdc8d8SChris Lattner if (arch_name) 43730fdc8d8SChris Lattner { 43870512317SGreg Clayton ArchSpec arch (arch_name); 43930fdc8d8SChris Lattner if (arch.IsValid()) 44030fdc8d8SChris Lattner { 441431ce678SGreg Clayton Target::SetDefaultArchitecture (arch); 44230fdc8d8SChris Lattner return true; 44330fdc8d8SChris Lattner } 44430fdc8d8SChris Lattner } 44530fdc8d8SChris Lattner return false; 44630fdc8d8SChris Lattner } 44730fdc8d8SChris Lattner 44830fdc8d8SChris Lattner ScriptLanguage 44930fdc8d8SChris Lattner SBDebugger::GetScriptingLanguage (const char *script_language_name) 45030fdc8d8SChris Lattner { 451af67cecdSGreg Clayton 45230fdc8d8SChris Lattner return Args::StringToScriptLanguage (script_language_name, 45330fdc8d8SChris Lattner eScriptLanguageDefault, 45430fdc8d8SChris Lattner NULL); 45530fdc8d8SChris Lattner } 45630fdc8d8SChris Lattner 45730fdc8d8SChris Lattner const char * 45830fdc8d8SChris Lattner SBDebugger::GetVersionString () 45930fdc8d8SChris Lattner { 460431ce678SGreg Clayton return GetVersion(); 46130fdc8d8SChris Lattner } 46230fdc8d8SChris Lattner 46330fdc8d8SChris Lattner const char * 464431ce678SGreg Clayton SBDebugger::StateAsCString (StateType state) 46530fdc8d8SChris Lattner { 466c2bbb49aSCaroline Tice return lldb_private::StateAsCString (state); 46730fdc8d8SChris Lattner } 46830fdc8d8SChris Lattner 46930fdc8d8SChris Lattner bool 470431ce678SGreg Clayton SBDebugger::StateIsRunningState (StateType state) 47130fdc8d8SChris Lattner { 472431ce678SGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4734838131bSGreg Clayton 474c2bbb49aSCaroline Tice const bool result = lldb_private::StateIsRunningState (state); 4754838131bSGreg Clayton if (log) 4764838131bSGreg Clayton log->Printf ("SBDebugger::StateIsRunningState (state=%s) => %i", 477431ce678SGreg Clayton StateAsCString (state), result); 4784838131bSGreg Clayton 4794838131bSGreg Clayton return result; 48030fdc8d8SChris Lattner } 48130fdc8d8SChris Lattner 48230fdc8d8SChris Lattner bool 483431ce678SGreg Clayton SBDebugger::StateIsStoppedState (StateType state) 48430fdc8d8SChris Lattner { 485431ce678SGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 486ceb6b139SCaroline Tice 4872637f825SGreg Clayton const bool result = lldb_private::StateIsStoppedState (state, false); 488ceb6b139SCaroline Tice if (log) 4894838131bSGreg Clayton log->Printf ("SBDebugger::StateIsStoppedState (state=%s) => %i", 490431ce678SGreg Clayton StateAsCString (state), result); 491ceb6b139SCaroline Tice 4924838131bSGreg Clayton return result; 49330fdc8d8SChris Lattner } 49430fdc8d8SChris Lattner 495cac9c5f9SGreg Clayton lldb::SBTarget 496cac9c5f9SGreg Clayton SBDebugger::CreateTarget (const char *filename, 497cac9c5f9SGreg Clayton const char *target_triple, 498cac9c5f9SGreg Clayton const char *platform_name, 499cac9c5f9SGreg Clayton bool add_dependent_modules, 500cac9c5f9SGreg Clayton lldb::SBError& sb_error) 501cac9c5f9SGreg Clayton { 502cac9c5f9SGreg Clayton SBTarget sb_target; 503b9556accSGreg Clayton TargetSP target_sp; 504cac9c5f9SGreg Clayton if (m_opaque_sp) 505cac9c5f9SGreg Clayton { 506cac9c5f9SGreg Clayton sb_error.Clear(); 507cac9c5f9SGreg Clayton FileSpec filename_spec (filename, true); 508cac9c5f9SGreg Clayton OptionGroupPlatform platform_options (false); 509cac9c5f9SGreg Clayton platform_options.SetPlatformName (platform_name); 510cac9c5f9SGreg Clayton 511cac9c5f9SGreg Clayton sb_error.ref() = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, 512cac9c5f9SGreg Clayton filename_spec, 513cac9c5f9SGreg Clayton target_triple, 514cac9c5f9SGreg Clayton add_dependent_modules, 515cac9c5f9SGreg Clayton &platform_options, 516cac9c5f9SGreg Clayton target_sp); 517cac9c5f9SGreg Clayton 518cac9c5f9SGreg Clayton if (sb_error.Success()) 519b9556accSGreg Clayton sb_target.SetSP (target_sp); 520cac9c5f9SGreg Clayton } 521cac9c5f9SGreg Clayton else 522cac9c5f9SGreg Clayton { 523cac9c5f9SGreg Clayton sb_error.SetErrorString("invalid target"); 524cac9c5f9SGreg Clayton } 525cac9c5f9SGreg Clayton 526cac9c5f9SGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 527cac9c5f9SGreg Clayton if (log) 528cac9c5f9SGreg Clayton { 529cac9c5f9SGreg Clayton log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\", triple=%s, platform_name=%s, add_dependent_modules=%u, error=%s) => SBTarget(%p)", 530cac9c5f9SGreg Clayton m_opaque_sp.get(), 531cac9c5f9SGreg Clayton filename, 532cac9c5f9SGreg Clayton target_triple, 533cac9c5f9SGreg Clayton platform_name, 534cac9c5f9SGreg Clayton add_dependent_modules, 535cac9c5f9SGreg Clayton sb_error.GetCString(), 536b9556accSGreg Clayton target_sp.get()); 537cac9c5f9SGreg Clayton } 538cac9c5f9SGreg Clayton 539cac9c5f9SGreg Clayton return sb_target; 540cac9c5f9SGreg Clayton } 54130fdc8d8SChris Lattner 54230fdc8d8SChris Lattner SBTarget 54330fdc8d8SChris Lattner SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename, 54430fdc8d8SChris Lattner const char *target_triple) 54530fdc8d8SChris Lattner { 546b9556accSGreg Clayton SBTarget sb_target; 547b9556accSGreg Clayton TargetSP target_sp; 5486611103cSGreg Clayton if (m_opaque_sp) 5496611103cSGreg Clayton { 550274060b6SGreg Clayton FileSpec file_spec (filename, true); 55130fdc8d8SChris Lattner TargetSP target_sp; 552cac9c5f9SGreg Clayton const bool add_dependent_modules = true; 553cac9c5f9SGreg Clayton Error error (m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, 554cac9c5f9SGreg Clayton file_spec, 555cac9c5f9SGreg Clayton target_triple, 556cac9c5f9SGreg Clayton add_dependent_modules, 557cac9c5f9SGreg Clayton NULL, 558cac9c5f9SGreg Clayton target_sp)); 559b9556accSGreg Clayton sb_target.SetSP (target_sp); 5606611103cSGreg Clayton } 5614838131bSGreg Clayton 562431ce678SGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5634838131bSGreg Clayton if (log) 5644838131bSGreg Clayton { 565cfd1acedSGreg Clayton log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndTargetTriple (filename=\"%s\", triple=%s) => SBTarget(%p)", 566b9556accSGreg Clayton m_opaque_sp.get(), filename, target_triple, target_sp.get()); 5674838131bSGreg Clayton } 5684838131bSGreg Clayton 569b9556accSGreg Clayton return sb_target; 57030fdc8d8SChris Lattner } 57130fdc8d8SChris Lattner 57230fdc8d8SChris Lattner SBTarget 57364195a2cSGreg Clayton SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *arch_cstr) 57430fdc8d8SChris Lattner { 575431ce678SGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 576ceb6b139SCaroline Tice 577b9556accSGreg Clayton SBTarget sb_target; 578b9556accSGreg Clayton TargetSP target_sp; 5796611103cSGreg Clayton if (m_opaque_sp) 5806611103cSGreg Clayton { 581274060b6SGreg Clayton FileSpec file (filename, true); 58230fdc8d8SChris Lattner Error error; 583cac9c5f9SGreg Clayton const bool add_dependent_modules = true; 58430fdc8d8SChris Lattner 585cac9c5f9SGreg Clayton error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, 586cac9c5f9SGreg Clayton file, 587cac9c5f9SGreg Clayton arch_cstr, 588cac9c5f9SGreg Clayton add_dependent_modules, 589cac9c5f9SGreg Clayton NULL, 590cac9c5f9SGreg Clayton target_sp); 59130fdc8d8SChris Lattner 59230fdc8d8SChris Lattner if (error.Success()) 5936611103cSGreg Clayton { 5942976d00aSJim Ingham m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get()); 595b9556accSGreg Clayton sb_target.SetSP (target_sp); 5966611103cSGreg Clayton } 5976611103cSGreg Clayton } 598ceb6b139SCaroline Tice 599ceb6b139SCaroline Tice if (log) 600ceb6b139SCaroline Tice { 601cfd1acedSGreg Clayton log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndArch (filename=\"%s\", arch=%s) => SBTarget(%p)", 602b9556accSGreg Clayton m_opaque_sp.get(), filename, arch_cstr, target_sp.get()); 603ceb6b139SCaroline Tice } 604ceb6b139SCaroline Tice 605b9556accSGreg Clayton return sb_target; 60630fdc8d8SChris Lattner } 60730fdc8d8SChris Lattner 60830fdc8d8SChris Lattner SBTarget 60930fdc8d8SChris Lattner SBDebugger::CreateTarget (const char *filename) 61030fdc8d8SChris Lattner { 611b9556accSGreg Clayton SBTarget sb_target; 612b9556accSGreg Clayton TargetSP target_sp; 6136611103cSGreg Clayton if (m_opaque_sp) 6146611103cSGreg Clayton { 615274060b6SGreg Clayton FileSpec file (filename, true); 616431ce678SGreg Clayton ArchSpec arch = Target::GetDefaultArchitecture (); 61730fdc8d8SChris Lattner Error error; 618cac9c5f9SGreg Clayton const bool add_dependent_modules = true; 61930fdc8d8SChris Lattner 620b3a40ba8SGreg Clayton PlatformSP platform_sp(m_opaque_sp->GetPlatformList().GetSelectedPlatform()); 621cac9c5f9SGreg Clayton error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, 622cac9c5f9SGreg Clayton file, 623cac9c5f9SGreg Clayton arch, 624cac9c5f9SGreg Clayton add_dependent_modules, 625b3a40ba8SGreg Clayton platform_sp, 626cac9c5f9SGreg Clayton target_sp); 62730fdc8d8SChris Lattner 6286611103cSGreg Clayton if (error.Success()) 6296611103cSGreg Clayton { 6302976d00aSJim Ingham m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get()); 631b9556accSGreg Clayton sb_target.SetSP (target_sp); 6326611103cSGreg Clayton } 6336611103cSGreg Clayton } 634431ce678SGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6354838131bSGreg Clayton if (log) 6364838131bSGreg Clayton { 637cfd1acedSGreg Clayton log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)", 638b9556accSGreg Clayton m_opaque_sp.get(), filename, target_sp.get()); 6394838131bSGreg Clayton } 640b9556accSGreg Clayton return sb_target; 64130fdc8d8SChris Lattner } 64230fdc8d8SChris Lattner 6433794ad95SJohnny Chen bool 6443794ad95SJohnny Chen SBDebugger::DeleteTarget (lldb::SBTarget &target) 6453794ad95SJohnny Chen { 6463794ad95SJohnny Chen bool result = false; 647b9556accSGreg Clayton if (m_opaque_sp) 648b9556accSGreg Clayton { 649b9556accSGreg Clayton TargetSP target_sp(target.GetSP()); 650b9556accSGreg Clayton if (target_sp) 6513794ad95SJohnny Chen { 6523794ad95SJohnny Chen // No need to lock, the target list is thread safe 653b9556accSGreg Clayton result = m_opaque_sp->GetTargetList().DeleteTarget (target_sp); 654b9556accSGreg Clayton target_sp->Destroy(); 65575340622SGreg Clayton target.Clear(); 6560cd70866SGreg Clayton const bool mandatory = true; 6570cd70866SGreg Clayton ModuleList::RemoveOrphanSharedModules(mandatory); 6583794ad95SJohnny Chen } 659b9556accSGreg Clayton } 6603794ad95SJohnny Chen 6613794ad95SJohnny Chen LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6623794ad95SJohnny Chen if (log) 6633794ad95SJohnny Chen { 6643794ad95SJohnny Chen log->Printf ("SBDebugger(%p)::DeleteTarget (SBTarget(%p)) => %i", m_opaque_sp.get(), target.m_opaque_sp.get(), result); 6653794ad95SJohnny Chen } 6663794ad95SJohnny Chen 6673794ad95SJohnny Chen return result; 6683794ad95SJohnny Chen } 66930fdc8d8SChris Lattner SBTarget 67030fdc8d8SChris Lattner SBDebugger::GetTargetAtIndex (uint32_t idx) 67130fdc8d8SChris Lattner { 6726611103cSGreg Clayton SBTarget sb_target; 6736611103cSGreg Clayton if (m_opaque_sp) 674af67cecdSGreg Clayton { 675af67cecdSGreg Clayton // No need to lock, the target list is thread safe 676b9556accSGreg Clayton sb_target.SetSP (m_opaque_sp->GetTargetList().GetTargetAtIndex (idx)); 677af67cecdSGreg Clayton } 67830fdc8d8SChris Lattner return sb_target; 67930fdc8d8SChris Lattner } 68030fdc8d8SChris Lattner 68130fdc8d8SChris Lattner SBTarget 68230fdc8d8SChris Lattner SBDebugger::FindTargetWithProcessID (pid_t pid) 68330fdc8d8SChris Lattner { 6846611103cSGreg Clayton SBTarget sb_target; 6856611103cSGreg Clayton if (m_opaque_sp) 686af67cecdSGreg Clayton { 687af67cecdSGreg Clayton // No need to lock, the target list is thread safe 688b9556accSGreg Clayton sb_target.SetSP (m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid)); 689af67cecdSGreg Clayton } 69030fdc8d8SChris Lattner return sb_target; 69130fdc8d8SChris Lattner } 69230fdc8d8SChris Lattner 69330fdc8d8SChris Lattner SBTarget 69430fdc8d8SChris Lattner SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name) 69530fdc8d8SChris Lattner { 6966611103cSGreg Clayton SBTarget sb_target; 6976611103cSGreg Clayton if (m_opaque_sp && filename && filename[0]) 6986611103cSGreg Clayton { 699af67cecdSGreg Clayton // No need to lock, the target list is thread safe 700eb0103f2SGreg Clayton ArchSpec arch (arch_name, m_opaque_sp->GetPlatformList().GetSelectedPlatform().get()); 701274060b6SGreg Clayton TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename, false), arch_name ? &arch : NULL)); 702b9556accSGreg Clayton sb_target.SetSP (target_sp); 7036611103cSGreg Clayton } 7046611103cSGreg Clayton return sb_target; 70530fdc8d8SChris Lattner } 70630fdc8d8SChris Lattner 70730fdc8d8SChris Lattner SBTarget 708431ce678SGreg Clayton SBDebugger::FindTargetWithLLDBProcess (const ProcessSP &process_sp) 70930fdc8d8SChris Lattner { 7106611103cSGreg Clayton SBTarget sb_target; 7116611103cSGreg Clayton if (m_opaque_sp) 712af67cecdSGreg Clayton { 713af67cecdSGreg Clayton // No need to lock, the target list is thread safe 714b9556accSGreg Clayton sb_target.SetSP (m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get())); 715af67cecdSGreg Clayton } 71630fdc8d8SChris Lattner return sb_target; 71730fdc8d8SChris Lattner } 71830fdc8d8SChris Lattner 71930fdc8d8SChris Lattner 72030fdc8d8SChris Lattner uint32_t 72130fdc8d8SChris Lattner SBDebugger::GetNumTargets () 72230fdc8d8SChris Lattner { 7236611103cSGreg Clayton if (m_opaque_sp) 724af67cecdSGreg Clayton { 725af67cecdSGreg Clayton // No need to lock, the target list is thread safe 7266611103cSGreg Clayton return m_opaque_sp->GetTargetList().GetNumTargets (); 727af67cecdSGreg Clayton } 7286611103cSGreg Clayton return 0; 7296611103cSGreg Clayton } 73030fdc8d8SChris Lattner 73130fdc8d8SChris Lattner SBTarget 7322976d00aSJim Ingham SBDebugger::GetSelectedTarget () 73330fdc8d8SChris Lattner { 734431ce678SGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 735ceb6b139SCaroline Tice 7366611103cSGreg Clayton SBTarget sb_target; 737b9556accSGreg Clayton TargetSP target_sp; 7386611103cSGreg Clayton if (m_opaque_sp) 739af67cecdSGreg Clayton { 740af67cecdSGreg Clayton // No need to lock, the target list is thread safe 741b9556accSGreg Clayton target_sp = m_opaque_sp->GetTargetList().GetSelectedTarget (); 742b9556accSGreg Clayton sb_target.SetSP (target_sp); 743af67cecdSGreg Clayton } 744ceb6b139SCaroline Tice 745ceb6b139SCaroline Tice if (log) 746ceb6b139SCaroline Tice { 747ceb6b139SCaroline Tice SBStream sstr; 748431ce678SGreg Clayton sb_target.GetDescription (sstr, eDescriptionLevelBrief); 74993aa84e8SGreg Clayton log->Printf ("SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s", m_opaque_sp.get(), 750b9556accSGreg Clayton target_sp.get(), sstr.GetData()); 751ceb6b139SCaroline Tice } 752ceb6b139SCaroline Tice 75330fdc8d8SChris Lattner return sb_target; 75430fdc8d8SChris Lattner } 75530fdc8d8SChris Lattner 75630fdc8d8SChris Lattner void 757e64f0dc7SJim Ingham SBDebugger::SetSelectedTarget (SBTarget &sb_target) 758e64f0dc7SJim Ingham { 759e64f0dc7SJim Ingham LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 760e64f0dc7SJim Ingham 761b9556accSGreg Clayton TargetSP target_sp (sb_target.GetSP()); 762e64f0dc7SJim Ingham if (m_opaque_sp) 763e64f0dc7SJim Ingham { 764b9556accSGreg Clayton m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get()); 765e64f0dc7SJim Ingham } 766e64f0dc7SJim Ingham if (log) 767e64f0dc7SJim Ingham { 768e64f0dc7SJim Ingham SBStream sstr; 769e64f0dc7SJim Ingham sb_target.GetDescription (sstr, eDescriptionLevelBrief); 770e64f0dc7SJim Ingham log->Printf ("SBDebugger(%p)::SetSelectedTarget () => SBTarget(%p): %s", m_opaque_sp.get(), 771b9556accSGreg Clayton target_sp.get(), sstr.GetData()); 772e64f0dc7SJim Ingham } 773e64f0dc7SJim Ingham } 774e64f0dc7SJim Ingham 775e64f0dc7SJim Ingham void 77630fdc8d8SChris Lattner SBDebugger::DispatchInput (void *baton, const void *data, size_t data_len) 77730fdc8d8SChris Lattner { 778431ce678SGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 779ceb6b139SCaroline Tice 780ceb6b139SCaroline Tice if (log) 781cfd1acedSGreg Clayton log->Printf ("SBDebugger(%p)::DispatchInput (baton=%p, data=\"%.*s\", size_t=%zu)", m_opaque_sp.get(), 782cfd1acedSGreg Clayton baton, (int) data_len, (const char *) data, data_len); 783ceb6b139SCaroline Tice 7846611103cSGreg Clayton if (m_opaque_sp) 7856611103cSGreg Clayton m_opaque_sp->DispatchInput ((const char *) data, data_len); 78630fdc8d8SChris Lattner } 78730fdc8d8SChris Lattner 78830fdc8d8SChris Lattner void 789efed6131SCaroline Tice SBDebugger::DispatchInputInterrupt () 790efed6131SCaroline Tice { 791efed6131SCaroline Tice if (m_opaque_sp) 792efed6131SCaroline Tice m_opaque_sp->DispatchInputInterrupt (); 793efed6131SCaroline Tice } 794efed6131SCaroline Tice 795efed6131SCaroline Tice void 796efed6131SCaroline Tice SBDebugger::DispatchInputEndOfFile () 797efed6131SCaroline Tice { 798efed6131SCaroline Tice if (m_opaque_sp) 799efed6131SCaroline Tice m_opaque_sp->DispatchInputEndOfFile (); 800efed6131SCaroline Tice } 8019088b068SCaroline Tice 8029088b068SCaroline Tice bool 8039088b068SCaroline Tice SBDebugger::InputReaderIsTopReader (const lldb::SBInputReader &reader) 8049088b068SCaroline Tice { 8059088b068SCaroline Tice LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 8069088b068SCaroline Tice 8079088b068SCaroline Tice if (log) 8089088b068SCaroline Tice log->Printf ("SBDebugger(%p)::InputReaderIsTopReader (SBInputReader(%p))", m_opaque_sp.get(), &reader); 8099088b068SCaroline Tice 8109088b068SCaroline Tice if (m_opaque_sp && reader.IsValid()) 8119088b068SCaroline Tice { 8129088b068SCaroline Tice InputReaderSP reader_sp (*reader); 8139088b068SCaroline Tice return m_opaque_sp->InputReaderIsTopReader (reader_sp); 8149088b068SCaroline Tice } 8159088b068SCaroline Tice 8169088b068SCaroline Tice return false; 8179088b068SCaroline Tice } 8189088b068SCaroline Tice 819efed6131SCaroline Tice 820efed6131SCaroline Tice void 82130fdc8d8SChris Lattner SBDebugger::PushInputReader (SBInputReader &reader) 82230fdc8d8SChris Lattner { 823431ce678SGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 824ceb6b139SCaroline Tice 825ceb6b139SCaroline Tice if (log) 82693aa84e8SGreg Clayton log->Printf ("SBDebugger(%p)::PushInputReader (SBInputReader(%p))", m_opaque_sp.get(), &reader); 827ceb6b139SCaroline Tice 8286611103cSGreg Clayton if (m_opaque_sp && reader.IsValid()) 82930fdc8d8SChris Lattner { 830af67cecdSGreg Clayton TargetSP target_sp (m_opaque_sp->GetSelectedTarget()); 831af67cecdSGreg Clayton Mutex::Locker api_locker; 832af67cecdSGreg Clayton if (target_sp) 83310ebffa4SJim Ingham api_locker.Lock(target_sp->GetAPIMutex()); 83430fdc8d8SChris Lattner InputReaderSP reader_sp(*reader); 8356611103cSGreg Clayton m_opaque_sp->PushInputReader (reader_sp); 83630fdc8d8SChris Lattner } 83730fdc8d8SChris Lattner } 8386611103cSGreg Clayton 8396611103cSGreg Clayton void 840969ed3d1SCaroline Tice SBDebugger::NotifyTopInputReader (InputReaderAction notification) 841969ed3d1SCaroline Tice { 842969ed3d1SCaroline Tice LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 843969ed3d1SCaroline Tice 844969ed3d1SCaroline Tice if (log) 845969ed3d1SCaroline Tice log->Printf ("SBDebugger(%p)::NotifyTopInputReader (%d)", m_opaque_sp.get(), notification); 846969ed3d1SCaroline Tice 847969ed3d1SCaroline Tice if (m_opaque_sp) 848969ed3d1SCaroline Tice m_opaque_sp->NotifyTopInputReader (notification); 849969ed3d1SCaroline Tice } 850969ed3d1SCaroline Tice 851969ed3d1SCaroline Tice void 852431ce678SGreg Clayton SBDebugger::reset (const DebuggerSP &debugger_sp) 8536611103cSGreg Clayton { 8546611103cSGreg Clayton m_opaque_sp = debugger_sp; 8556611103cSGreg Clayton } 8566611103cSGreg Clayton 8576611103cSGreg Clayton Debugger * 8586611103cSGreg Clayton SBDebugger::get () const 8596611103cSGreg Clayton { 8606611103cSGreg Clayton return m_opaque_sp.get(); 8616611103cSGreg Clayton } 8626611103cSGreg Clayton 8636611103cSGreg Clayton Debugger & 8646611103cSGreg Clayton SBDebugger::ref () const 8656611103cSGreg Clayton { 8666611103cSGreg Clayton assert (m_opaque_sp.get()); 8676611103cSGreg Clayton return *m_opaque_sp; 8686611103cSGreg Clayton } 8696611103cSGreg Clayton 8709a37766eSGreg Clayton const lldb::DebuggerSP & 8719a37766eSGreg Clayton SBDebugger::get_sp () const 8729a37766eSGreg Clayton { 8739a37766eSGreg Clayton return m_opaque_sp; 8749a37766eSGreg Clayton } 8756611103cSGreg Clayton 876ebc1bb27SCaroline Tice SBDebugger 877ebc1bb27SCaroline Tice SBDebugger::FindDebuggerWithID (int id) 878ebc1bb27SCaroline Tice { 879af67cecdSGreg Clayton // No need to lock, the debugger list is thread safe 880ebc1bb27SCaroline Tice SBDebugger sb_debugger; 881431ce678SGreg Clayton DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id); 882ebc1bb27SCaroline Tice if (debugger_sp) 883ebc1bb27SCaroline Tice sb_debugger.reset (debugger_sp); 884ebc1bb27SCaroline Tice return sb_debugger; 885ebc1bb27SCaroline Tice } 886e40e4218SJim Ingham 887dd759857SCaroline Tice const char * 888dd759857SCaroline Tice SBDebugger::GetInstanceName() 889dd759857SCaroline Tice { 890dd759857SCaroline Tice if (m_opaque_sp) 891dd759857SCaroline Tice return m_opaque_sp->GetInstanceName().AsCString(); 892dd759857SCaroline Tice else 893dd759857SCaroline Tice return NULL; 894dd759857SCaroline Tice } 895dd759857SCaroline Tice 8963df9a8dfSCaroline Tice SBError 897dd759857SCaroline Tice SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name) 8983df9a8dfSCaroline Tice { 899431ce678SGreg Clayton UserSettingsControllerSP root_settings_controller = Debugger::GetSettingsController(); 9003df9a8dfSCaroline Tice 901e0d378b3SGreg Clayton Error err = root_settings_controller->SetVariable (var_name, 902e0d378b3SGreg Clayton value, 903e0d378b3SGreg Clayton eVarSetOperationAssign, 904e0d378b3SGreg Clayton true, 905101c7c20SCaroline Tice debugger_instance_name); 9063df9a8dfSCaroline Tice SBError sb_error; 9073df9a8dfSCaroline Tice sb_error.SetError (err); 9083df9a8dfSCaroline Tice 9093df9a8dfSCaroline Tice return sb_error; 9103df9a8dfSCaroline Tice } 9113df9a8dfSCaroline Tice 912431ce678SGreg Clayton SBStringList 913dd759857SCaroline Tice SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name) 9143df9a8dfSCaroline Tice { 9153df9a8dfSCaroline Tice SBStringList ret_value; 916e0d378b3SGreg Clayton SettableVariableType var_type; 917431ce678SGreg Clayton Error err; 918101c7c20SCaroline Tice 919431ce678SGreg Clayton UserSettingsControllerSP root_settings_controller = Debugger::GetSettingsController(); 9203df9a8dfSCaroline Tice 921daccaa9eSCaroline Tice StringList value = root_settings_controller->GetVariable (var_name, var_type, debugger_instance_name, err); 922daccaa9eSCaroline Tice 923daccaa9eSCaroline Tice if (err.Success()) 924daccaa9eSCaroline Tice { 925311adf3dSChris Lattner for (unsigned i = 0; i != value.GetSize(); ++i) 9263df9a8dfSCaroline Tice ret_value.AppendString (value.GetStringAtIndex(i)); 927daccaa9eSCaroline Tice } 928daccaa9eSCaroline Tice else 929daccaa9eSCaroline Tice { 930daccaa9eSCaroline Tice ret_value.AppendString (err.AsCString()); 931daccaa9eSCaroline Tice } 932daccaa9eSCaroline Tice 9333df9a8dfSCaroline Tice 9343df9a8dfSCaroline Tice return ret_value; 9353df9a8dfSCaroline Tice } 9363df9a8dfSCaroline Tice 937a7015092SGreg Clayton uint32_t 938a7015092SGreg Clayton SBDebugger::GetTerminalWidth () const 939a7015092SGreg Clayton { 940a7015092SGreg Clayton if (m_opaque_sp) 941a7015092SGreg Clayton return m_opaque_sp->GetTerminalWidth (); 942a7015092SGreg Clayton return 0; 943a7015092SGreg Clayton } 944a7015092SGreg Clayton 945a7015092SGreg Clayton void 946a7015092SGreg Clayton SBDebugger::SetTerminalWidth (uint32_t term_width) 947a7015092SGreg Clayton { 948a7015092SGreg Clayton if (m_opaque_sp) 949a7015092SGreg Clayton m_opaque_sp->SetTerminalWidth (term_width); 950a7015092SGreg Clayton } 951a7015092SGreg Clayton 952a7015092SGreg Clayton const char * 953a7015092SGreg Clayton SBDebugger::GetPrompt() const 954a7015092SGreg Clayton { 955431ce678SGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 956ceb6b139SCaroline Tice 957ceb6b139SCaroline Tice if (log) 958cfd1acedSGreg Clayton log->Printf ("SBDebugger(%p)::GetPrompt () => \"%s\"", m_opaque_sp.get(), 959750cd175SCaroline Tice (m_opaque_sp ? m_opaque_sp->GetPrompt() : "")); 960ceb6b139SCaroline Tice 961a7015092SGreg Clayton if (m_opaque_sp) 962a7015092SGreg Clayton return m_opaque_sp->GetPrompt (); 963a7015092SGreg Clayton return 0; 964a7015092SGreg Clayton } 965a7015092SGreg Clayton 966a7015092SGreg Clayton void 967a7015092SGreg Clayton SBDebugger::SetPrompt (const char *prompt) 968a7015092SGreg Clayton { 969a7015092SGreg Clayton if (m_opaque_sp) 970a7015092SGreg Clayton m_opaque_sp->SetPrompt (prompt); 971a7015092SGreg Clayton } 972a7015092SGreg Clayton 973a7015092SGreg Clayton 974431ce678SGreg Clayton ScriptLanguage 975a7015092SGreg Clayton SBDebugger::GetScriptLanguage() const 976a7015092SGreg Clayton { 977a7015092SGreg Clayton if (m_opaque_sp) 978a7015092SGreg Clayton return m_opaque_sp->GetScriptLanguage (); 979a7015092SGreg Clayton return eScriptLanguageNone; 980a7015092SGreg Clayton } 981a7015092SGreg Clayton 982a7015092SGreg Clayton void 983431ce678SGreg Clayton SBDebugger::SetScriptLanguage (ScriptLanguage script_lang) 984a7015092SGreg Clayton { 985a7015092SGreg Clayton if (m_opaque_sp) 986af67cecdSGreg Clayton { 987a7015092SGreg Clayton m_opaque_sp->SetScriptLanguage (script_lang); 988a7015092SGreg Clayton } 989af67cecdSGreg Clayton } 990a7015092SGreg Clayton 991e40e4218SJim Ingham bool 992e40e4218SJim Ingham SBDebugger::SetUseExternalEditor (bool value) 993e40e4218SJim Ingham { 994e40e4218SJim Ingham if (m_opaque_sp) 995e40e4218SJim Ingham return m_opaque_sp->SetUseExternalEditor (value); 996e40e4218SJim Ingham return false; 997e40e4218SJim Ingham } 998e40e4218SJim Ingham 999e40e4218SJim Ingham bool 1000daccaa9eSCaroline Tice SBDebugger::GetUseExternalEditor () 1001e40e4218SJim Ingham { 1002e40e4218SJim Ingham if (m_opaque_sp) 1003daccaa9eSCaroline Tice return m_opaque_sp->GetUseExternalEditor (); 1004e40e4218SJim Ingham return false; 1005e40e4218SJim Ingham } 1006e40e4218SJim Ingham 1007dde9cff3SCaroline Tice bool 1008dde9cff3SCaroline Tice SBDebugger::GetDescription (SBStream &description) 1009dde9cff3SCaroline Tice { 1010da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1011da7bc7d0SGreg Clayton 1012dde9cff3SCaroline Tice if (m_opaque_sp) 1013dde9cff3SCaroline Tice { 1014dde9cff3SCaroline Tice const char *name = m_opaque_sp->GetInstanceName().AsCString(); 1015431ce678SGreg Clayton user_id_t id = m_opaque_sp->GetID(); 1016da7bc7d0SGreg Clayton strm.Printf ("Debugger (instance: \"%s\", id: %llu)", name, id); 1017dde9cff3SCaroline Tice } 1018dde9cff3SCaroline Tice else 1019da7bc7d0SGreg Clayton strm.PutCString ("No value"); 1020dde9cff3SCaroline Tice 1021dde9cff3SCaroline Tice return true; 1022dde9cff3SCaroline Tice } 1023efed6131SCaroline Tice 1024431ce678SGreg Clayton user_id_t 1025efed6131SCaroline Tice SBDebugger::GetID() 1026efed6131SCaroline Tice { 1027efed6131SCaroline Tice if (m_opaque_sp) 1028efed6131SCaroline Tice return m_opaque_sp->GetID(); 1029efed6131SCaroline Tice return LLDB_INVALID_UID; 1030efed6131SCaroline Tice } 10312289fa48SGreg Clayton 10322289fa48SGreg Clayton 10332289fa48SGreg Clayton SBError 10342289fa48SGreg Clayton SBDebugger::SetCurrentPlatform (const char *platform_name) 10352289fa48SGreg Clayton { 10362289fa48SGreg Clayton SBError sb_error; 10372289fa48SGreg Clayton if (m_opaque_sp) 10382289fa48SGreg Clayton { 10392289fa48SGreg Clayton PlatformSP platform_sp (Platform::Create (platform_name, sb_error.ref())); 10402289fa48SGreg Clayton 10412289fa48SGreg Clayton if (platform_sp) 10422289fa48SGreg Clayton { 10432289fa48SGreg Clayton bool make_selected = true; 10442289fa48SGreg Clayton m_opaque_sp->GetPlatformList().Append (platform_sp, make_selected); 10452289fa48SGreg Clayton } 10462289fa48SGreg Clayton } 10472289fa48SGreg Clayton return sb_error; 10482289fa48SGreg Clayton } 10492289fa48SGreg Clayton 1050fc3f027dSGreg Clayton bool 1051f3dd93c8SGreg Clayton SBDebugger::SetCurrentPlatformSDKRoot (const char *sysroot) 1052f3dd93c8SGreg Clayton { 1053f3dd93c8SGreg Clayton if (m_opaque_sp) 1054f3dd93c8SGreg Clayton { 1055f3dd93c8SGreg Clayton PlatformSP platform_sp (m_opaque_sp->GetPlatformList().GetSelectedPlatform()); 1056f3dd93c8SGreg Clayton 1057f3dd93c8SGreg Clayton if (platform_sp) 1058f3dd93c8SGreg Clayton { 1059f3dd93c8SGreg Clayton platform_sp->SetSDKRootDirectory (ConstString (sysroot)); 1060f3dd93c8SGreg Clayton return true; 1061f3dd93c8SGreg Clayton } 1062f3dd93c8SGreg Clayton } 1063f3dd93c8SGreg Clayton return false; 1064f3dd93c8SGreg Clayton } 1065f3dd93c8SGreg Clayton 1066f3dd93c8SGreg Clayton bool 1067fc3f027dSGreg Clayton SBDebugger::GetCloseInputOnEOF () const 1068fc3f027dSGreg Clayton { 1069fc3f027dSGreg Clayton if (m_opaque_sp) 1070fc3f027dSGreg Clayton return m_opaque_sp->GetCloseInputOnEOF (); 1071fc3f027dSGreg Clayton return false; 1072fc3f027dSGreg Clayton } 1073fc3f027dSGreg Clayton 1074fc3f027dSGreg Clayton void 1075fc3f027dSGreg Clayton SBDebugger::SetCloseInputOnEOF (bool b) 1076fc3f027dSGreg Clayton { 1077fc3f027dSGreg Clayton if (m_opaque_sp) 1078fc3f027dSGreg Clayton m_opaque_sp->SetCloseInputOnEOF (b); 1079fc3f027dSGreg Clayton } 1080061858ceSEnrico Granata 1081061858ceSEnrico Granata SBTypeCategory 1082061858ceSEnrico Granata SBDebugger::GetCategory (const char* category_name) 1083061858ceSEnrico Granata { 1084061858ceSEnrico Granata if (!category_name || *category_name == 0) 1085061858ceSEnrico Granata return SBTypeCategory(); 1086061858ceSEnrico Granata 1087061858ceSEnrico Granata TypeCategoryImplSP category_sp; 1088061858ceSEnrico Granata 1089061858ceSEnrico Granata if (DataVisualization::Categories::GetCategory(ConstString(category_name), category_sp, false)) 1090061858ceSEnrico Granata return SBTypeCategory(category_sp); 1091061858ceSEnrico Granata else 1092061858ceSEnrico Granata return SBTypeCategory(); 1093061858ceSEnrico Granata } 1094061858ceSEnrico Granata 1095061858ceSEnrico Granata SBTypeCategory 1096061858ceSEnrico Granata SBDebugger::CreateCategory (const char* category_name) 1097061858ceSEnrico Granata { 1098061858ceSEnrico Granata if (!category_name || *category_name == 0) 1099061858ceSEnrico Granata return SBTypeCategory(); 1100061858ceSEnrico Granata 1101061858ceSEnrico Granata TypeCategoryImplSP category_sp; 1102061858ceSEnrico Granata 1103061858ceSEnrico Granata if (DataVisualization::Categories::GetCategory(ConstString(category_name), category_sp, true)) 1104061858ceSEnrico Granata return SBTypeCategory(category_sp); 1105061858ceSEnrico Granata else 1106061858ceSEnrico Granata return SBTypeCategory(); 1107061858ceSEnrico Granata } 1108061858ceSEnrico Granata 1109061858ceSEnrico Granata bool 1110061858ceSEnrico Granata SBDebugger::DeleteCategory (const char* category_name) 1111061858ceSEnrico Granata { 1112061858ceSEnrico Granata if (!category_name || *category_name == 0) 1113061858ceSEnrico Granata return false; 1114061858ceSEnrico Granata 1115061858ceSEnrico Granata return DataVisualization::Categories::Delete(ConstString(category_name)); 1116061858ceSEnrico Granata } 1117061858ceSEnrico Granata 1118061858ceSEnrico Granata uint32_t 1119061858ceSEnrico Granata SBDebugger::GetNumCategories() 1120061858ceSEnrico Granata { 1121061858ceSEnrico Granata return DataVisualization::Categories::GetCount(); 1122061858ceSEnrico Granata } 1123061858ceSEnrico Granata 1124061858ceSEnrico Granata SBTypeCategory 1125061858ceSEnrico Granata SBDebugger::GetCategoryAtIndex (uint32_t index) 1126061858ceSEnrico Granata { 1127061858ceSEnrico Granata return SBTypeCategory(DataVisualization::Categories::GetCategoryAtIndex(index)); 1128061858ceSEnrico Granata } 1129061858ceSEnrico Granata 1130061858ceSEnrico Granata SBTypeCategory 1131061858ceSEnrico Granata SBDebugger::GetDefaultCategory() 1132061858ceSEnrico Granata { 1133061858ceSEnrico Granata return GetCategory("default"); 1134061858ceSEnrico Granata } 1135061858ceSEnrico Granata 1136061858ceSEnrico Granata SBTypeFormat 1137061858ceSEnrico Granata SBDebugger::GetFormatForType (SBTypeNameSpecifier type_name) 1138061858ceSEnrico Granata { 1139061858ceSEnrico Granata SBTypeCategory default_category_sb = GetDefaultCategory(); 1140061858ceSEnrico Granata if (default_category_sb.GetEnabled()) 1141061858ceSEnrico Granata return default_category_sb.GetFormatForType(type_name); 1142061858ceSEnrico Granata return SBTypeFormat(); 1143061858ceSEnrico Granata } 1144061858ceSEnrico Granata 1145cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON 1146061858ceSEnrico Granata SBTypeSummary 1147061858ceSEnrico Granata SBDebugger::GetSummaryForType (SBTypeNameSpecifier type_name) 1148061858ceSEnrico Granata { 1149*a777dc2aSEnrico Granata if (type_name.IsValid() == false) 1150*a777dc2aSEnrico Granata return SBTypeSummary(); 1151*a777dc2aSEnrico Granata return SBTypeSummary(DataVisualization::GetSummaryForType(type_name.GetSP())); 1152061858ceSEnrico Granata } 1153cf7e2dc0SJason Molenda #endif // LLDB_DISABLE_PYTHON 1154061858ceSEnrico Granata 1155061858ceSEnrico Granata SBTypeFilter 1156061858ceSEnrico Granata SBDebugger::GetFilterForType (SBTypeNameSpecifier type_name) 1157061858ceSEnrico Granata { 1158*a777dc2aSEnrico Granata if (type_name.IsValid() == false) 1159*a777dc2aSEnrico Granata return SBTypeFilter(); 1160*a777dc2aSEnrico Granata return SBTypeFilter(DataVisualization::GetFilterForType(type_name.GetSP())); 1161061858ceSEnrico Granata } 1162061858ceSEnrico Granata 1163cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON 1164061858ceSEnrico Granata SBTypeSynthetic 1165061858ceSEnrico Granata SBDebugger::GetSyntheticForType (SBTypeNameSpecifier type_name) 1166061858ceSEnrico Granata { 1167*a777dc2aSEnrico Granata if (type_name.IsValid() == false) 1168*a777dc2aSEnrico Granata return SBTypeSynthetic(); 1169*a777dc2aSEnrico Granata return SBTypeSynthetic(DataVisualization::GetSyntheticForType(type_name.GetSP())); 1170061858ceSEnrico Granata } 1171cf7e2dc0SJason Molenda #endif // LLDB_DISABLE_PYTHON 1172061858ceSEnrico Granata 1173228063cdSJim Ingham bool 1174228063cdSJim Ingham SBDebugger::EnableLog (const char *channel, const char **categories) 1175228063cdSJim Ingham { 1176228063cdSJim Ingham if (m_opaque_sp) 1177228063cdSJim Ingham { 1178228063cdSJim Ingham uint32_t log_options = LLDB_LOG_OPTION_PREPEND_TIMESTAMP | LLDB_LOG_OPTION_PREPEND_THREAD_NAME; 1179228063cdSJim Ingham StreamString errors; 1180228063cdSJim Ingham return m_opaque_sp->EnableLog (channel, categories, NULL, log_options, errors); 1181228063cdSJim Ingham 1182228063cdSJim Ingham } 1183228063cdSJim Ingham else 1184228063cdSJim Ingham return false; 1185228063cdSJim Ingham } 11864f02b22dSJim Ingham 11874f02b22dSJim Ingham void 11884f02b22dSJim Ingham SBDebugger::SetLoggingCallback (lldb::LogOutputCallback log_callback, void *baton) 11894f02b22dSJim Ingham { 11904f02b22dSJim Ingham if (m_opaque_sp) 11914f02b22dSJim Ingham { 11924f02b22dSJim Ingham return m_opaque_sp->SetLoggingCallback (log_callback, baton); 11934f02b22dSJim Ingham } 11944f02b22dSJim Ingham } 11954f02b22dSJim Ingham 11964f02b22dSJim Ingham 1197