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" 286eee5aa0SGreg Clayton #include "lldb/Core/Debugger.h" 296eee5aa0SGreg Clayton #include "lldb/Core/State.h" 306eee5aa0SGreg Clayton #include "lldb/Interpreter/Args.h" 316eee5aa0SGreg Clayton #include "lldb/Interpreter/CommandInterpreter.h" 32cac9c5f9SGreg Clayton #include "lldb/Interpreter/OptionGroupPlatform.h" 336eee5aa0SGreg Clayton #include "lldb/Target/Process.h" 346eee5aa0SGreg Clayton #include "lldb/Target/TargetList.h" 3530fdc8d8SChris Lattner 3630fdc8d8SChris Lattner using namespace lldb; 3730fdc8d8SChris Lattner using namespace lldb_private; 3830fdc8d8SChris Lattner 3930fdc8d8SChris Lattner void 4030fdc8d8SChris Lattner SBDebugger::Initialize () 4130fdc8d8SChris Lattner { 42431ce678SGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 43ceb6b139SCaroline Tice 44ceb6b139SCaroline Tice if (log) 45ceb6b139SCaroline Tice log->Printf ("SBDebugger::Initialize ()"); 46ceb6b139SCaroline Tice 47fc36f791SGreg Clayton SBCommandInterpreter::InitializeSWIG (); 48fc36f791SGreg Clayton 4930fdc8d8SChris Lattner Debugger::Initialize(); 5030fdc8d8SChris Lattner } 5130fdc8d8SChris Lattner 5230fdc8d8SChris Lattner void 5330fdc8d8SChris Lattner SBDebugger::Terminate () 5430fdc8d8SChris Lattner { 5530fdc8d8SChris Lattner Debugger::Terminate(); 5630fdc8d8SChris Lattner } 5730fdc8d8SChris Lattner 5848e42549SGreg Clayton void 5948e42549SGreg Clayton SBDebugger::Clear () 6048e42549SGreg Clayton { 61431ce678SGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 62ceb6b139SCaroline Tice 63ceb6b139SCaroline Tice if (log) 6493aa84e8SGreg Clayton log->Printf ("SBDebugger(%p)::Clear ()", m_opaque_sp.get()); 653d6086f6SCaroline Tice 663d6086f6SCaroline Tice if (m_opaque_sp) 673d6086f6SCaroline Tice m_opaque_sp->CleanUpInputReaders (); 68ceb6b139SCaroline Tice 6948e42549SGreg Clayton m_opaque_sp.reset(); 7048e42549SGreg Clayton } 7148e42549SGreg Clayton 726611103cSGreg Clayton SBDebugger 736611103cSGreg Clayton SBDebugger::Create() 746611103cSGreg Clayton { 7566243847SJim Ingham return SBDebugger::Create(false); 7606942690SJim Ingham } 7706942690SJim Ingham 7806942690SJim Ingham SBDebugger 7906942690SJim Ingham SBDebugger::Create(bool source_init_files) 8006942690SJim Ingham { 81431ce678SGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 82ceb6b139SCaroline Tice 836611103cSGreg Clayton SBDebugger debugger; 846611103cSGreg Clayton debugger.reset(Debugger::CreateInstance()); 85ceb6b139SCaroline Tice 86ceb6b139SCaroline Tice if (log) 87ceb6b139SCaroline Tice { 88ceb6b139SCaroline Tice SBStream sstr; 89ceb6b139SCaroline Tice debugger.GetDescription (sstr); 9093aa84e8SGreg Clayton log->Printf ("SBDebugger::Create () => SBDebugger(%p): %s", debugger.m_opaque_sp.get(), sstr.GetData()); 91ceb6b139SCaroline Tice } 92ceb6b139SCaroline Tice 9306942690SJim Ingham SBCommandInterpreter interp = debugger.GetCommandInterpreter(); 9406942690SJim Ingham if (source_init_files) 9506942690SJim Ingham { 9606942690SJim Ingham interp.get()->SkipLLDBInitFiles(false); 9706942690SJim Ingham interp.get()->SkipAppInitFiles (false); 9806942690SJim Ingham SBCommandReturnObject result; 9906942690SJim Ingham interp.SourceInitFileInHomeDirectory(result); 10006942690SJim Ingham } 10106942690SJim Ingham else 10206942690SJim Ingham { 10306942690SJim Ingham interp.get()->SkipLLDBInitFiles(true); 10406942690SJim Ingham interp.get()->SkipAppInitFiles (true); 10506942690SJim Ingham } 1066611103cSGreg Clayton return debugger; 1076611103cSGreg Clayton } 1086611103cSGreg Clayton 109e02657b1SCaroline Tice void 110e02657b1SCaroline Tice SBDebugger::Destroy (SBDebugger &debugger) 111e02657b1SCaroline Tice { 112431ce678SGreg Clayton LogSP log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 113e02657b1SCaroline Tice 114e02657b1SCaroline Tice if (log) 115e02657b1SCaroline Tice { 116e02657b1SCaroline Tice SBStream sstr; 117e02657b1SCaroline Tice debugger.GetDescription (sstr); 118e02657b1SCaroline Tice log->Printf ("SBDebugger::Destroy () => SBDebugger(%p): %s", debugger.m_opaque_sp.get(), sstr.GetData()); 119e02657b1SCaroline Tice } 120e02657b1SCaroline Tice 121e02657b1SCaroline Tice Debugger::Destroy (debugger.m_opaque_sp); 122e02657b1SCaroline Tice 123e02657b1SCaroline Tice if (debugger.m_opaque_sp.get() != NULL) 124e02657b1SCaroline Tice debugger.m_opaque_sp.reset(); 125e02657b1SCaroline Tice } 126e02657b1SCaroline Tice 1276611103cSGreg Clayton SBDebugger::SBDebugger () : 1286611103cSGreg Clayton m_opaque_sp () 1296611103cSGreg Clayton { 1306611103cSGreg Clayton } 1316611103cSGreg Clayton 132274fd6e9SEnrico Granata SBDebugger::SBDebugger(const lldb::DebuggerSP &debugger_sp) : 133274fd6e9SEnrico Granata m_opaque_sp(debugger_sp) 134274fd6e9SEnrico Granata { 135274fd6e9SEnrico Granata } 136274fd6e9SEnrico Granata 137efabb123SGreg Clayton SBDebugger::SBDebugger(const SBDebugger &rhs) : 138efabb123SGreg Clayton m_opaque_sp (rhs.m_opaque_sp) 139efabb123SGreg Clayton { 140efabb123SGreg Clayton } 141efabb123SGreg Clayton 142efabb123SGreg Clayton SBDebugger & 143efabb123SGreg Clayton SBDebugger::operator = (const SBDebugger &rhs) 144efabb123SGreg Clayton { 145efabb123SGreg Clayton if (this != &rhs) 146efabb123SGreg Clayton { 147efabb123SGreg Clayton m_opaque_sp = rhs.m_opaque_sp; 148efabb123SGreg Clayton } 149efabb123SGreg Clayton return *this; 150efabb123SGreg Clayton } 151efabb123SGreg Clayton 1526611103cSGreg Clayton SBDebugger::~SBDebugger () 1536611103cSGreg Clayton { 1546611103cSGreg Clayton } 1556611103cSGreg Clayton 1566611103cSGreg Clayton bool 1576611103cSGreg Clayton SBDebugger::IsValid() const 1586611103cSGreg Clayton { 1596611103cSGreg Clayton return m_opaque_sp.get() != NULL; 1606611103cSGreg Clayton } 1616611103cSGreg Clayton 1626611103cSGreg Clayton 16330fdc8d8SChris Lattner void 16430fdc8d8SChris Lattner SBDebugger::SetAsync (bool b) 16530fdc8d8SChris Lattner { 1666611103cSGreg Clayton if (m_opaque_sp) 1676611103cSGreg Clayton m_opaque_sp->SetAsyncExecution(b); 16830fdc8d8SChris Lattner } 16930fdc8d8SChris Lattner 170e64f0dc7SJim Ingham bool 171e64f0dc7SJim Ingham SBDebugger::GetAsync () 172e64f0dc7SJim Ingham { 173e64f0dc7SJim Ingham if (m_opaque_sp) 174e64f0dc7SJim Ingham return m_opaque_sp->GetAsyncExecution(); 175e64f0dc7SJim Ingham else 176e64f0dc7SJim Ingham return false; 177e64f0dc7SJim Ingham } 178e64f0dc7SJim Ingham 1796eee5aa0SGreg Clayton void 1806eee5aa0SGreg Clayton SBDebugger::SkipLLDBInitFiles (bool b) 1816eee5aa0SGreg Clayton { 1826eee5aa0SGreg Clayton if (m_opaque_sp) 1836eee5aa0SGreg Clayton m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles (b); 1846eee5aa0SGreg Clayton } 1856eee5aa0SGreg Clayton 18616e0c686SJim Ingham void 18716e0c686SJim Ingham SBDebugger::SkipAppInitFiles (bool b) 18816e0c686SJim Ingham { 18916e0c686SJim Ingham if (m_opaque_sp) 19016e0c686SJim Ingham m_opaque_sp->GetCommandInterpreter().SkipAppInitFiles (b); 19116e0c686SJim Ingham } 19216e0c686SJim Ingham 19330fdc8d8SChris Lattner // Shouldn't really be settable after initialization as this could cause lots of problems; don't want users 19430fdc8d8SChris Lattner // trying to switch modes in the middle of a debugging session. 19530fdc8d8SChris Lattner void 19630fdc8d8SChris Lattner SBDebugger::SetInputFileHandle (FILE *fh, bool transfer_ownership) 19730fdc8d8SChris Lattner { 198431ce678SGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 199ceb6b139SCaroline Tice 200ceb6b139SCaroline Tice if (log) 201cfd1acedSGreg Clayton log->Printf ("SBDebugger(%p)::SetInputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(), 202cfd1acedSGreg Clayton fh, transfer_ownership); 203ceb6b139SCaroline Tice 2046611103cSGreg Clayton if (m_opaque_sp) 2056611103cSGreg Clayton m_opaque_sp->SetInputFileHandle (fh, transfer_ownership); 20630fdc8d8SChris Lattner } 20730fdc8d8SChris Lattner 20830fdc8d8SChris Lattner void 20930fdc8d8SChris Lattner SBDebugger::SetOutputFileHandle (FILE *fh, bool transfer_ownership) 21030fdc8d8SChris Lattner { 211431ce678SGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 212ceb6b139SCaroline Tice 213ceb6b139SCaroline Tice 214ceb6b139SCaroline Tice if (log) 215cfd1acedSGreg Clayton log->Printf ("SBDebugger(%p)::SetOutputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(), 216cfd1acedSGreg Clayton fh, transfer_ownership); 217ceb6b139SCaroline Tice 2186611103cSGreg Clayton if (m_opaque_sp) 2196611103cSGreg Clayton m_opaque_sp->SetOutputFileHandle (fh, transfer_ownership); 22030fdc8d8SChris Lattner } 22130fdc8d8SChris Lattner 22230fdc8d8SChris Lattner void 22330fdc8d8SChris Lattner SBDebugger::SetErrorFileHandle (FILE *fh, bool transfer_ownership) 22430fdc8d8SChris Lattner { 225431ce678SGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 226ceb6b139SCaroline Tice 227ceb6b139SCaroline Tice 228ceb6b139SCaroline Tice if (log) 229cfd1acedSGreg Clayton log->Printf ("SBDebugger(%p)::SetErrorFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(), 230cfd1acedSGreg Clayton fh, transfer_ownership); 231ceb6b139SCaroline Tice 2326611103cSGreg Clayton if (m_opaque_sp) 2336611103cSGreg Clayton m_opaque_sp->SetErrorFileHandle (fh, transfer_ownership); 23430fdc8d8SChris Lattner } 23530fdc8d8SChris Lattner 23630fdc8d8SChris Lattner FILE * 23730fdc8d8SChris Lattner SBDebugger::GetInputFileHandle () 23830fdc8d8SChris Lattner { 2396611103cSGreg Clayton if (m_opaque_sp) 24051b1e2d2SGreg Clayton return m_opaque_sp->GetInputFile().GetStream(); 2416611103cSGreg Clayton return NULL; 24230fdc8d8SChris Lattner } 24330fdc8d8SChris Lattner 24430fdc8d8SChris Lattner FILE * 24530fdc8d8SChris Lattner SBDebugger::GetOutputFileHandle () 24630fdc8d8SChris Lattner { 2476611103cSGreg Clayton if (m_opaque_sp) 24851b1e2d2SGreg Clayton return m_opaque_sp->GetOutputFile().GetStream(); 2496611103cSGreg Clayton return NULL; 25030fdc8d8SChris Lattner } 25130fdc8d8SChris Lattner 25230fdc8d8SChris Lattner FILE * 25330fdc8d8SChris Lattner SBDebugger::GetErrorFileHandle () 25430fdc8d8SChris Lattner { 2556611103cSGreg Clayton if (m_opaque_sp) 25651b1e2d2SGreg Clayton return m_opaque_sp->GetErrorFile().GetStream(); 2576611103cSGreg Clayton return NULL; 25830fdc8d8SChris Lattner } 25930fdc8d8SChris Lattner 26030fdc8d8SChris Lattner SBCommandInterpreter 26130fdc8d8SChris Lattner SBDebugger::GetCommandInterpreter () 26230fdc8d8SChris Lattner { 263431ce678SGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 264ceb6b139SCaroline Tice 2656611103cSGreg Clayton SBCommandInterpreter sb_interpreter; 2666611103cSGreg Clayton if (m_opaque_sp) 2676611103cSGreg Clayton sb_interpreter.reset (&m_opaque_sp->GetCommandInterpreter()); 268ceb6b139SCaroline Tice 269750cd175SCaroline Tice if (log) 27093aa84e8SGreg Clayton log->Printf ("SBDebugger(%p)::GetCommandInterpreter () => SBCommandInterpreter(%p)", 271750cd175SCaroline Tice m_opaque_sp.get(), sb_interpreter.get()); 272750cd175SCaroline Tice 27330fdc8d8SChris Lattner return sb_interpreter; 27430fdc8d8SChris Lattner } 27530fdc8d8SChris Lattner 27630fdc8d8SChris Lattner void 27730fdc8d8SChris Lattner SBDebugger::HandleCommand (const char *command) 27830fdc8d8SChris Lattner { 2796611103cSGreg Clayton if (m_opaque_sp) 2806611103cSGreg Clayton { 281af67cecdSGreg Clayton TargetSP target_sp (m_opaque_sp->GetSelectedTarget()); 282af67cecdSGreg Clayton Mutex::Locker api_locker; 283af67cecdSGreg Clayton if (target_sp) 284af67cecdSGreg Clayton api_locker.Reset(target_sp->GetAPIMutex().GetMutex()); 285af67cecdSGreg Clayton 2866611103cSGreg Clayton SBCommandInterpreter sb_interpreter(GetCommandInterpreter ()); 28730fdc8d8SChris Lattner SBCommandReturnObject result; 28830fdc8d8SChris Lattner 28930fdc8d8SChris Lattner sb_interpreter.HandleCommand (command, result, false); 29030fdc8d8SChris Lattner 29130fdc8d8SChris Lattner if (GetErrorFileHandle() != NULL) 29230fdc8d8SChris Lattner result.PutError (GetErrorFileHandle()); 29330fdc8d8SChris Lattner if (GetOutputFileHandle() != NULL) 29430fdc8d8SChris Lattner result.PutOutput (GetOutputFileHandle()); 29530fdc8d8SChris Lattner 2966611103cSGreg Clayton if (m_opaque_sp->GetAsyncExecution() == false) 29730fdc8d8SChris Lattner { 2986611103cSGreg Clayton SBProcess process(GetCommandInterpreter().GetProcess ()); 29930fdc8d8SChris Lattner if (process.IsValid()) 30030fdc8d8SChris Lattner { 30130fdc8d8SChris Lattner EventSP event_sp; 3026611103cSGreg Clayton Listener &lldb_listener = m_opaque_sp->GetListener(); 30330fdc8d8SChris Lattner while (lldb_listener.GetNextEventForBroadcaster (process.get(), event_sp)) 30430fdc8d8SChris Lattner { 30530fdc8d8SChris Lattner SBEvent event(event_sp); 30630fdc8d8SChris Lattner HandleProcessEvent (process, event, GetOutputFileHandle(), GetErrorFileHandle()); 30730fdc8d8SChris Lattner } 30830fdc8d8SChris Lattner } 30930fdc8d8SChris Lattner } 31030fdc8d8SChris Lattner } 3116611103cSGreg Clayton } 31230fdc8d8SChris Lattner 31330fdc8d8SChris Lattner SBListener 31430fdc8d8SChris Lattner SBDebugger::GetListener () 31530fdc8d8SChris Lattner { 316431ce678SGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 317ceb6b139SCaroline Tice 3186611103cSGreg Clayton SBListener sb_listener; 3196611103cSGreg Clayton if (m_opaque_sp) 3206611103cSGreg Clayton sb_listener.reset(&m_opaque_sp->GetListener(), false); 321ceb6b139SCaroline Tice 322750cd175SCaroline Tice if (log) 32393aa84e8SGreg Clayton log->Printf ("SBDebugger(%p)::GetListener () => SBListener(%p)", m_opaque_sp.get(), 324750cd175SCaroline Tice sb_listener.get()); 325750cd175SCaroline Tice 32630fdc8d8SChris Lattner return sb_listener; 32730fdc8d8SChris Lattner } 32830fdc8d8SChris Lattner 32930fdc8d8SChris Lattner void 33030fdc8d8SChris Lattner SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, FILE *out, FILE *err) 33130fdc8d8SChris Lattner { 332af67cecdSGreg Clayton if (!process.IsValid()) 333af67cecdSGreg Clayton return; 334af67cecdSGreg Clayton 33530fdc8d8SChris Lattner const uint32_t event_type = event.GetType(); 33630fdc8d8SChris Lattner char stdio_buffer[1024]; 33730fdc8d8SChris Lattner size_t len; 33830fdc8d8SChris Lattner 339af67cecdSGreg Clayton Mutex::Locker api_locker (process.GetTarget()->GetAPIMutex()); 340af67cecdSGreg Clayton 341af67cecdSGreg Clayton if (event_type & (Process::eBroadcastBitSTDOUT | Process::eBroadcastBitStateChanged)) 34230fdc8d8SChris Lattner { 343af67cecdSGreg Clayton // Drain stdout when we stop just in case we have any bytes 34430fdc8d8SChris Lattner while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0) 34530fdc8d8SChris Lattner if (out != NULL) 34630fdc8d8SChris Lattner ::fwrite (stdio_buffer, 1, len, out); 34730fdc8d8SChris Lattner } 348af67cecdSGreg Clayton 349af67cecdSGreg Clayton if (event_type & (Process::eBroadcastBitSTDERR | Process::eBroadcastBitStateChanged)) 35030fdc8d8SChris Lattner { 351af67cecdSGreg Clayton // Drain stderr when we stop just in case we have any bytes 35230fdc8d8SChris Lattner while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0) 353af67cecdSGreg Clayton if (err != NULL) 354af67cecdSGreg Clayton ::fwrite (stdio_buffer, 1, len, err); 35530fdc8d8SChris Lattner } 356af67cecdSGreg Clayton 357af67cecdSGreg Clayton if (event_type & Process::eBroadcastBitStateChanged) 35830fdc8d8SChris Lattner { 35930fdc8d8SChris Lattner StateType event_state = SBProcess::GetStateFromEvent (event); 36030fdc8d8SChris Lattner 36130fdc8d8SChris Lattner if (event_state == eStateInvalid) 36230fdc8d8SChris Lattner return; 36330fdc8d8SChris Lattner 36430fdc8d8SChris Lattner bool is_stopped = StateIsStoppedState (event_state); 36530fdc8d8SChris Lattner if (!is_stopped) 3662976d00aSJim Ingham process.ReportEventState (event, out); 36730fdc8d8SChris Lattner } 36830fdc8d8SChris Lattner } 36930fdc8d8SChris Lattner 370e37d605eSJim Ingham SBSourceManager 37130fdc8d8SChris Lattner SBDebugger::GetSourceManager () 37230fdc8d8SChris Lattner { 373e37d605eSJim Ingham SBSourceManager sb_source_manager (*this); 374e37d605eSJim Ingham return sb_source_manager; 37530fdc8d8SChris Lattner } 37630fdc8d8SChris Lattner 37730fdc8d8SChris Lattner 37830fdc8d8SChris Lattner bool 37930fdc8d8SChris Lattner SBDebugger::GetDefaultArchitecture (char *arch_name, size_t arch_name_len) 38030fdc8d8SChris Lattner { 38130fdc8d8SChris Lattner if (arch_name && arch_name_len) 38230fdc8d8SChris Lattner { 383431ce678SGreg Clayton ArchSpec default_arch = Target::GetDefaultArchitecture (); 384daccaa9eSCaroline Tice 38530fdc8d8SChris Lattner if (default_arch.IsValid()) 38630fdc8d8SChris Lattner { 387431ce678SGreg Clayton const std::string &triple_str = default_arch.GetTriple().str(); 388431ce678SGreg Clayton if (!triple_str.empty()) 389431ce678SGreg Clayton ::snprintf (arch_name, arch_name_len, "%s", triple_str.c_str()); 390431ce678SGreg Clayton else 39164195a2cSGreg Clayton ::snprintf (arch_name, arch_name_len, "%s", default_arch.GetArchitectureName()); 39230fdc8d8SChris Lattner return true; 39330fdc8d8SChris Lattner } 39430fdc8d8SChris Lattner } 39530fdc8d8SChris Lattner if (arch_name && arch_name_len) 39630fdc8d8SChris Lattner arch_name[0] = '\0'; 39730fdc8d8SChris Lattner return false; 39830fdc8d8SChris Lattner } 39930fdc8d8SChris Lattner 40030fdc8d8SChris Lattner 40130fdc8d8SChris Lattner bool 40230fdc8d8SChris Lattner SBDebugger::SetDefaultArchitecture (const char *arch_name) 40330fdc8d8SChris Lattner { 40430fdc8d8SChris Lattner if (arch_name) 40530fdc8d8SChris Lattner { 406eb0103f2SGreg Clayton ArchSpec arch (arch_name, NULL); 40730fdc8d8SChris Lattner if (arch.IsValid()) 40830fdc8d8SChris Lattner { 409431ce678SGreg Clayton Target::SetDefaultArchitecture (arch); 41030fdc8d8SChris Lattner return true; 41130fdc8d8SChris Lattner } 41230fdc8d8SChris Lattner } 41330fdc8d8SChris Lattner return false; 41430fdc8d8SChris Lattner } 41530fdc8d8SChris Lattner 41630fdc8d8SChris Lattner ScriptLanguage 41730fdc8d8SChris Lattner SBDebugger::GetScriptingLanguage (const char *script_language_name) 41830fdc8d8SChris Lattner { 419af67cecdSGreg Clayton 42030fdc8d8SChris Lattner return Args::StringToScriptLanguage (script_language_name, 42130fdc8d8SChris Lattner eScriptLanguageDefault, 42230fdc8d8SChris Lattner NULL); 42330fdc8d8SChris Lattner } 42430fdc8d8SChris Lattner 42530fdc8d8SChris Lattner const char * 42630fdc8d8SChris Lattner SBDebugger::GetVersionString () 42730fdc8d8SChris Lattner { 428431ce678SGreg Clayton return GetVersion(); 42930fdc8d8SChris Lattner } 43030fdc8d8SChris Lattner 43130fdc8d8SChris Lattner const char * 432431ce678SGreg Clayton SBDebugger::StateAsCString (StateType state) 43330fdc8d8SChris Lattner { 434c2bbb49aSCaroline Tice return lldb_private::StateAsCString (state); 43530fdc8d8SChris Lattner } 43630fdc8d8SChris Lattner 43730fdc8d8SChris Lattner bool 438431ce678SGreg Clayton SBDebugger::StateIsRunningState (StateType state) 43930fdc8d8SChris Lattner { 440431ce678SGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4414838131bSGreg Clayton 442c2bbb49aSCaroline Tice const bool result = lldb_private::StateIsRunningState (state); 4434838131bSGreg Clayton if (log) 4444838131bSGreg Clayton log->Printf ("SBDebugger::StateIsRunningState (state=%s) => %i", 445431ce678SGreg Clayton StateAsCString (state), result); 4464838131bSGreg Clayton 4474838131bSGreg Clayton return result; 44830fdc8d8SChris Lattner } 44930fdc8d8SChris Lattner 45030fdc8d8SChris Lattner bool 451431ce678SGreg Clayton SBDebugger::StateIsStoppedState (StateType state) 45230fdc8d8SChris Lattner { 453431ce678SGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 454ceb6b139SCaroline Tice 455c2bbb49aSCaroline Tice const bool result = lldb_private::StateIsStoppedState (state); 456ceb6b139SCaroline Tice if (log) 4574838131bSGreg Clayton log->Printf ("SBDebugger::StateIsStoppedState (state=%s) => %i", 458431ce678SGreg Clayton StateAsCString (state), result); 459ceb6b139SCaroline Tice 4604838131bSGreg Clayton return result; 46130fdc8d8SChris Lattner } 46230fdc8d8SChris Lattner 463cac9c5f9SGreg Clayton lldb::SBTarget 464cac9c5f9SGreg Clayton SBDebugger::CreateTarget (const char *filename, 465cac9c5f9SGreg Clayton const char *target_triple, 466cac9c5f9SGreg Clayton const char *platform_name, 467cac9c5f9SGreg Clayton bool add_dependent_modules, 468cac9c5f9SGreg Clayton lldb::SBError& sb_error) 469cac9c5f9SGreg Clayton { 470cac9c5f9SGreg Clayton SBTarget sb_target; 471cac9c5f9SGreg Clayton if (m_opaque_sp) 472cac9c5f9SGreg Clayton { 473cac9c5f9SGreg Clayton sb_error.Clear(); 474cac9c5f9SGreg Clayton FileSpec filename_spec (filename, true); 475cac9c5f9SGreg Clayton OptionGroupPlatform platform_options (false); 476cac9c5f9SGreg Clayton platform_options.SetPlatformName (platform_name); 477cac9c5f9SGreg Clayton 478cac9c5f9SGreg Clayton TargetSP target_sp; 479cac9c5f9SGreg Clayton sb_error.ref() = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, 480cac9c5f9SGreg Clayton filename_spec, 481cac9c5f9SGreg Clayton target_triple, 482cac9c5f9SGreg Clayton add_dependent_modules, 483cac9c5f9SGreg Clayton &platform_options, 484cac9c5f9SGreg Clayton target_sp); 485cac9c5f9SGreg Clayton 486cac9c5f9SGreg Clayton if (sb_error.Success()) 487cac9c5f9SGreg Clayton sb_target.reset (target_sp); 488cac9c5f9SGreg Clayton } 489cac9c5f9SGreg Clayton else 490cac9c5f9SGreg Clayton { 491cac9c5f9SGreg Clayton sb_error.SetErrorString("invalid target"); 492cac9c5f9SGreg Clayton } 493cac9c5f9SGreg Clayton 494cac9c5f9SGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 495cac9c5f9SGreg Clayton if (log) 496cac9c5f9SGreg Clayton { 497cac9c5f9SGreg Clayton log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\", triple=%s, platform_name=%s, add_dependent_modules=%u, error=%s) => SBTarget(%p)", 498cac9c5f9SGreg Clayton m_opaque_sp.get(), 499cac9c5f9SGreg Clayton filename, 500cac9c5f9SGreg Clayton target_triple, 501cac9c5f9SGreg Clayton platform_name, 502cac9c5f9SGreg Clayton add_dependent_modules, 503cac9c5f9SGreg Clayton sb_error.GetCString(), 504cac9c5f9SGreg Clayton sb_target.get()); 505cac9c5f9SGreg Clayton } 506cac9c5f9SGreg Clayton 507cac9c5f9SGreg Clayton return sb_target; 508cac9c5f9SGreg Clayton } 50930fdc8d8SChris Lattner 51030fdc8d8SChris Lattner SBTarget 51130fdc8d8SChris Lattner SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename, 51230fdc8d8SChris Lattner const char *target_triple) 51330fdc8d8SChris Lattner { 5146611103cSGreg Clayton SBTarget target; 5156611103cSGreg Clayton if (m_opaque_sp) 5166611103cSGreg Clayton { 517274060b6SGreg Clayton FileSpec file_spec (filename, true); 51830fdc8d8SChris Lattner TargetSP target_sp; 519cac9c5f9SGreg Clayton const bool add_dependent_modules = true; 520cac9c5f9SGreg Clayton Error error (m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, 521cac9c5f9SGreg Clayton file_spec, 522cac9c5f9SGreg Clayton target_triple, 523cac9c5f9SGreg Clayton add_dependent_modules, 524cac9c5f9SGreg Clayton NULL, 525cac9c5f9SGreg Clayton target_sp)); 5266611103cSGreg Clayton target.reset (target_sp); 5276611103cSGreg Clayton } 5284838131bSGreg Clayton 529431ce678SGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5304838131bSGreg Clayton if (log) 5314838131bSGreg Clayton { 532cfd1acedSGreg Clayton log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndTargetTriple (filename=\"%s\", triple=%s) => SBTarget(%p)", 5334838131bSGreg Clayton m_opaque_sp.get(), filename, target_triple, target.get()); 5344838131bSGreg Clayton } 5354838131bSGreg Clayton 53630fdc8d8SChris Lattner return target; 53730fdc8d8SChris Lattner } 53830fdc8d8SChris Lattner 53930fdc8d8SChris Lattner SBTarget 54064195a2cSGreg Clayton SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *arch_cstr) 54130fdc8d8SChris Lattner { 542431ce678SGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 543ceb6b139SCaroline Tice 5446611103cSGreg Clayton SBTarget target; 5456611103cSGreg Clayton if (m_opaque_sp) 5466611103cSGreg Clayton { 547274060b6SGreg Clayton FileSpec file (filename, true); 54830fdc8d8SChris Lattner TargetSP target_sp; 54930fdc8d8SChris Lattner Error error; 550cac9c5f9SGreg Clayton const bool add_dependent_modules = true; 55130fdc8d8SChris Lattner 552cac9c5f9SGreg Clayton error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, 553cac9c5f9SGreg Clayton file, 554cac9c5f9SGreg Clayton arch_cstr, 555cac9c5f9SGreg Clayton add_dependent_modules, 556cac9c5f9SGreg Clayton NULL, 557cac9c5f9SGreg Clayton target_sp); 55830fdc8d8SChris Lattner 55930fdc8d8SChris Lattner if (error.Success()) 5606611103cSGreg Clayton { 5612976d00aSJim Ingham m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get()); 5626611103cSGreg Clayton target.reset(target_sp); 5636611103cSGreg Clayton } 5646611103cSGreg Clayton } 565ceb6b139SCaroline Tice 566ceb6b139SCaroline Tice if (log) 567ceb6b139SCaroline Tice { 568cfd1acedSGreg Clayton log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndArch (filename=\"%s\", arch=%s) => SBTarget(%p)", 56964195a2cSGreg Clayton m_opaque_sp.get(), filename, arch_cstr, target.get()); 570ceb6b139SCaroline Tice } 571ceb6b139SCaroline Tice 5726611103cSGreg Clayton return target; 57330fdc8d8SChris Lattner } 57430fdc8d8SChris Lattner 57530fdc8d8SChris Lattner SBTarget 57630fdc8d8SChris Lattner SBDebugger::CreateTarget (const char *filename) 57730fdc8d8SChris Lattner { 5786611103cSGreg Clayton SBTarget target; 5796611103cSGreg Clayton if (m_opaque_sp) 5806611103cSGreg Clayton { 581274060b6SGreg Clayton FileSpec file (filename, true); 582431ce678SGreg Clayton ArchSpec arch = Target::GetDefaultArchitecture (); 58330fdc8d8SChris Lattner TargetSP target_sp; 58430fdc8d8SChris Lattner Error error; 585cac9c5f9SGreg Clayton const bool add_dependent_modules = true; 58630fdc8d8SChris Lattner 587cac9c5f9SGreg Clayton error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, 588cac9c5f9SGreg Clayton file, 589cac9c5f9SGreg Clayton arch, 590cac9c5f9SGreg Clayton add_dependent_modules, 591cac9c5f9SGreg Clayton m_opaque_sp->GetPlatformList().GetSelectedPlatform(), 592cac9c5f9SGreg Clayton target_sp); 59330fdc8d8SChris Lattner 5946611103cSGreg Clayton if (error.Success()) 5956611103cSGreg Clayton { 5962976d00aSJim Ingham m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get()); 5976611103cSGreg Clayton target.reset (target_sp); 5986611103cSGreg Clayton } 5996611103cSGreg Clayton } 600431ce678SGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6014838131bSGreg Clayton if (log) 6024838131bSGreg Clayton { 603cfd1acedSGreg Clayton log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)", 6044838131bSGreg Clayton m_opaque_sp.get(), filename, target.get()); 6054838131bSGreg Clayton } 6066611103cSGreg Clayton return target; 60730fdc8d8SChris Lattner } 60830fdc8d8SChris Lattner 6093794ad95SJohnny Chen bool 6103794ad95SJohnny Chen SBDebugger::DeleteTarget (lldb::SBTarget &target) 6113794ad95SJohnny Chen { 6123794ad95SJohnny Chen bool result = false; 6133794ad95SJohnny Chen if (m_opaque_sp) 6143794ad95SJohnny Chen { 6153794ad95SJohnny Chen // No need to lock, the target list is thread safe 6163794ad95SJohnny Chen result = m_opaque_sp->GetTargetList().DeleteTarget (target.m_opaque_sp); 6173360b411SGreg Clayton target->Destroy(); 61875340622SGreg Clayton target.Clear(); 61975340622SGreg Clayton ModuleList::RemoveOrphanSharedModules(); 6203794ad95SJohnny Chen } 6213794ad95SJohnny Chen 6223794ad95SJohnny Chen LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6233794ad95SJohnny Chen if (log) 6243794ad95SJohnny Chen { 6253794ad95SJohnny Chen log->Printf ("SBDebugger(%p)::DeleteTarget (SBTarget(%p)) => %i", m_opaque_sp.get(), target.m_opaque_sp.get(), result); 6263794ad95SJohnny Chen } 6273794ad95SJohnny Chen 6283794ad95SJohnny Chen return result; 6293794ad95SJohnny Chen } 63030fdc8d8SChris Lattner SBTarget 63130fdc8d8SChris Lattner SBDebugger::GetTargetAtIndex (uint32_t idx) 63230fdc8d8SChris Lattner { 6336611103cSGreg Clayton SBTarget sb_target; 6346611103cSGreg Clayton if (m_opaque_sp) 635af67cecdSGreg Clayton { 636af67cecdSGreg Clayton // No need to lock, the target list is thread safe 6376611103cSGreg Clayton sb_target.reset(m_opaque_sp->GetTargetList().GetTargetAtIndex (idx)); 638af67cecdSGreg Clayton } 63930fdc8d8SChris Lattner return sb_target; 64030fdc8d8SChris Lattner } 64130fdc8d8SChris Lattner 64230fdc8d8SChris Lattner SBTarget 64330fdc8d8SChris Lattner SBDebugger::FindTargetWithProcessID (pid_t pid) 64430fdc8d8SChris Lattner { 6456611103cSGreg Clayton SBTarget sb_target; 6466611103cSGreg Clayton if (m_opaque_sp) 647af67cecdSGreg Clayton { 648af67cecdSGreg Clayton // No need to lock, the target list is thread safe 6496611103cSGreg Clayton sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid)); 650af67cecdSGreg Clayton } 65130fdc8d8SChris Lattner return sb_target; 65230fdc8d8SChris Lattner } 65330fdc8d8SChris Lattner 65430fdc8d8SChris Lattner SBTarget 65530fdc8d8SChris Lattner SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name) 65630fdc8d8SChris Lattner { 6576611103cSGreg Clayton SBTarget sb_target; 6586611103cSGreg Clayton if (m_opaque_sp && filename && filename[0]) 6596611103cSGreg Clayton { 660af67cecdSGreg Clayton // No need to lock, the target list is thread safe 661eb0103f2SGreg Clayton ArchSpec arch (arch_name, m_opaque_sp->GetPlatformList().GetSelectedPlatform().get()); 662274060b6SGreg Clayton TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename, false), arch_name ? &arch : NULL)); 6636611103cSGreg Clayton sb_target.reset(target_sp); 6646611103cSGreg Clayton } 6656611103cSGreg Clayton return sb_target; 66630fdc8d8SChris Lattner } 66730fdc8d8SChris Lattner 66830fdc8d8SChris Lattner SBTarget 669431ce678SGreg Clayton SBDebugger::FindTargetWithLLDBProcess (const ProcessSP &process_sp) 67030fdc8d8SChris Lattner { 6716611103cSGreg Clayton SBTarget sb_target; 6726611103cSGreg Clayton if (m_opaque_sp) 673af67cecdSGreg Clayton { 674af67cecdSGreg Clayton // No need to lock, the target list is thread safe 6756611103cSGreg Clayton sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get())); 676af67cecdSGreg Clayton } 67730fdc8d8SChris Lattner return sb_target; 67830fdc8d8SChris Lattner } 67930fdc8d8SChris Lattner 68030fdc8d8SChris Lattner 68130fdc8d8SChris Lattner uint32_t 68230fdc8d8SChris Lattner SBDebugger::GetNumTargets () 68330fdc8d8SChris Lattner { 6846611103cSGreg Clayton if (m_opaque_sp) 685af67cecdSGreg Clayton { 686af67cecdSGreg Clayton // No need to lock, the target list is thread safe 6876611103cSGreg Clayton return m_opaque_sp->GetTargetList().GetNumTargets (); 688af67cecdSGreg Clayton } 6896611103cSGreg Clayton return 0; 6906611103cSGreg Clayton } 69130fdc8d8SChris Lattner 69230fdc8d8SChris Lattner SBTarget 6932976d00aSJim Ingham SBDebugger::GetSelectedTarget () 69430fdc8d8SChris Lattner { 695431ce678SGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 696ceb6b139SCaroline Tice 6976611103cSGreg Clayton SBTarget sb_target; 6986611103cSGreg Clayton if (m_opaque_sp) 699af67cecdSGreg Clayton { 700af67cecdSGreg Clayton // No need to lock, the target list is thread safe 7012976d00aSJim Ingham sb_target.reset(m_opaque_sp->GetTargetList().GetSelectedTarget ()); 702af67cecdSGreg Clayton } 703ceb6b139SCaroline Tice 704ceb6b139SCaroline Tice if (log) 705ceb6b139SCaroline Tice { 706ceb6b139SCaroline Tice SBStream sstr; 707431ce678SGreg Clayton sb_target.GetDescription (sstr, eDescriptionLevelBrief); 70893aa84e8SGreg Clayton log->Printf ("SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s", m_opaque_sp.get(), 709750cd175SCaroline Tice sb_target.get(), sstr.GetData()); 710ceb6b139SCaroline Tice } 711ceb6b139SCaroline Tice 71230fdc8d8SChris Lattner return sb_target; 71330fdc8d8SChris Lattner } 71430fdc8d8SChris Lattner 71530fdc8d8SChris Lattner void 716e64f0dc7SJim Ingham SBDebugger::SetSelectedTarget (SBTarget &sb_target) 717e64f0dc7SJim Ingham { 718e64f0dc7SJim Ingham LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 719e64f0dc7SJim Ingham 720e64f0dc7SJim Ingham if (m_opaque_sp) 721e64f0dc7SJim Ingham { 722e64f0dc7SJim Ingham m_opaque_sp->GetTargetList().SetSelectedTarget (sb_target.get()); 723e64f0dc7SJim Ingham } 724e64f0dc7SJim Ingham if (log) 725e64f0dc7SJim Ingham { 726e64f0dc7SJim Ingham SBStream sstr; 727e64f0dc7SJim Ingham sb_target.GetDescription (sstr, eDescriptionLevelBrief); 728e64f0dc7SJim Ingham log->Printf ("SBDebugger(%p)::SetSelectedTarget () => SBTarget(%p): %s", m_opaque_sp.get(), 729e64f0dc7SJim Ingham sb_target.get(), sstr.GetData()); 730e64f0dc7SJim Ingham } 731e64f0dc7SJim Ingham } 732e64f0dc7SJim Ingham 733e64f0dc7SJim Ingham void 73430fdc8d8SChris Lattner SBDebugger::DispatchInput (void *baton, const void *data, size_t data_len) 73530fdc8d8SChris Lattner { 736431ce678SGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 737ceb6b139SCaroline Tice 738ceb6b139SCaroline Tice if (log) 739cfd1acedSGreg Clayton log->Printf ("SBDebugger(%p)::DispatchInput (baton=%p, data=\"%.*s\", size_t=%zu)", m_opaque_sp.get(), 740cfd1acedSGreg Clayton baton, (int) data_len, (const char *) data, data_len); 741ceb6b139SCaroline Tice 7426611103cSGreg Clayton if (m_opaque_sp) 7436611103cSGreg Clayton m_opaque_sp->DispatchInput ((const char *) data, data_len); 74430fdc8d8SChris Lattner } 74530fdc8d8SChris Lattner 74630fdc8d8SChris Lattner void 747efed6131SCaroline Tice SBDebugger::DispatchInputInterrupt () 748efed6131SCaroline Tice { 749efed6131SCaroline Tice if (m_opaque_sp) 750efed6131SCaroline Tice m_opaque_sp->DispatchInputInterrupt (); 751efed6131SCaroline Tice } 752efed6131SCaroline Tice 753efed6131SCaroline Tice void 754efed6131SCaroline Tice SBDebugger::DispatchInputEndOfFile () 755efed6131SCaroline Tice { 756efed6131SCaroline Tice if (m_opaque_sp) 757efed6131SCaroline Tice m_opaque_sp->DispatchInputEndOfFile (); 758efed6131SCaroline Tice } 7599088b068SCaroline Tice 7609088b068SCaroline Tice bool 7619088b068SCaroline Tice SBDebugger::InputReaderIsTopReader (const lldb::SBInputReader &reader) 7629088b068SCaroline Tice { 7639088b068SCaroline Tice LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 7649088b068SCaroline Tice 7659088b068SCaroline Tice if (log) 7669088b068SCaroline Tice log->Printf ("SBDebugger(%p)::InputReaderIsTopReader (SBInputReader(%p))", m_opaque_sp.get(), &reader); 7679088b068SCaroline Tice 7689088b068SCaroline Tice if (m_opaque_sp && reader.IsValid()) 7699088b068SCaroline Tice { 7709088b068SCaroline Tice InputReaderSP reader_sp (*reader); 7719088b068SCaroline Tice return m_opaque_sp->InputReaderIsTopReader (reader_sp); 7729088b068SCaroline Tice } 7739088b068SCaroline Tice 7749088b068SCaroline Tice return false; 7759088b068SCaroline Tice } 7769088b068SCaroline Tice 777efed6131SCaroline Tice 778efed6131SCaroline Tice void 77930fdc8d8SChris Lattner SBDebugger::PushInputReader (SBInputReader &reader) 78030fdc8d8SChris Lattner { 781431ce678SGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 782ceb6b139SCaroline Tice 783ceb6b139SCaroline Tice if (log) 78493aa84e8SGreg Clayton log->Printf ("SBDebugger(%p)::PushInputReader (SBInputReader(%p))", m_opaque_sp.get(), &reader); 785ceb6b139SCaroline Tice 7866611103cSGreg Clayton if (m_opaque_sp && reader.IsValid()) 78730fdc8d8SChris Lattner { 788af67cecdSGreg Clayton TargetSP target_sp (m_opaque_sp->GetSelectedTarget()); 789af67cecdSGreg Clayton Mutex::Locker api_locker; 790af67cecdSGreg Clayton if (target_sp) 791af67cecdSGreg Clayton api_locker.Reset(target_sp->GetAPIMutex().GetMutex()); 79230fdc8d8SChris Lattner InputReaderSP reader_sp(*reader); 7936611103cSGreg Clayton m_opaque_sp->PushInputReader (reader_sp); 79430fdc8d8SChris Lattner } 79530fdc8d8SChris Lattner } 7966611103cSGreg Clayton 7976611103cSGreg Clayton void 798969ed3d1SCaroline Tice SBDebugger::NotifyTopInputReader (InputReaderAction notification) 799969ed3d1SCaroline Tice { 800969ed3d1SCaroline Tice LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 801969ed3d1SCaroline Tice 802969ed3d1SCaroline Tice if (log) 803969ed3d1SCaroline Tice log->Printf ("SBDebugger(%p)::NotifyTopInputReader (%d)", m_opaque_sp.get(), notification); 804969ed3d1SCaroline Tice 805969ed3d1SCaroline Tice if (m_opaque_sp) 806969ed3d1SCaroline Tice m_opaque_sp->NotifyTopInputReader (notification); 807969ed3d1SCaroline Tice } 808969ed3d1SCaroline Tice 809969ed3d1SCaroline Tice void 810431ce678SGreg Clayton SBDebugger::reset (const DebuggerSP &debugger_sp) 8116611103cSGreg Clayton { 8126611103cSGreg Clayton m_opaque_sp = debugger_sp; 8136611103cSGreg Clayton } 8146611103cSGreg Clayton 8156611103cSGreg Clayton Debugger * 8166611103cSGreg Clayton SBDebugger::get () const 8176611103cSGreg Clayton { 8186611103cSGreg Clayton return m_opaque_sp.get(); 8196611103cSGreg Clayton } 8206611103cSGreg Clayton 8216611103cSGreg Clayton Debugger & 8226611103cSGreg Clayton SBDebugger::ref () const 8236611103cSGreg Clayton { 8246611103cSGreg Clayton assert (m_opaque_sp.get()); 8256611103cSGreg Clayton return *m_opaque_sp; 8266611103cSGreg Clayton } 8276611103cSGreg Clayton 828*9a37766eSGreg Clayton const lldb::DebuggerSP & 829*9a37766eSGreg Clayton SBDebugger::get_sp () const 830*9a37766eSGreg Clayton { 831*9a37766eSGreg Clayton return m_opaque_sp; 832*9a37766eSGreg Clayton } 8336611103cSGreg Clayton 834ebc1bb27SCaroline Tice SBDebugger 835ebc1bb27SCaroline Tice SBDebugger::FindDebuggerWithID (int id) 836ebc1bb27SCaroline Tice { 837af67cecdSGreg Clayton // No need to lock, the debugger list is thread safe 838ebc1bb27SCaroline Tice SBDebugger sb_debugger; 839431ce678SGreg Clayton DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id); 840ebc1bb27SCaroline Tice if (debugger_sp) 841ebc1bb27SCaroline Tice sb_debugger.reset (debugger_sp); 842ebc1bb27SCaroline Tice return sb_debugger; 843ebc1bb27SCaroline Tice } 844e40e4218SJim Ingham 845dd759857SCaroline Tice const char * 846dd759857SCaroline Tice SBDebugger::GetInstanceName() 847dd759857SCaroline Tice { 848dd759857SCaroline Tice if (m_opaque_sp) 849dd759857SCaroline Tice return m_opaque_sp->GetInstanceName().AsCString(); 850dd759857SCaroline Tice else 851dd759857SCaroline Tice return NULL; 852dd759857SCaroline Tice } 853dd759857SCaroline Tice 8543df9a8dfSCaroline Tice SBError 855dd759857SCaroline Tice SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name) 8563df9a8dfSCaroline Tice { 857431ce678SGreg Clayton UserSettingsControllerSP root_settings_controller = Debugger::GetSettingsController(); 8583df9a8dfSCaroline Tice 859e0d378b3SGreg Clayton Error err = root_settings_controller->SetVariable (var_name, 860e0d378b3SGreg Clayton value, 861e0d378b3SGreg Clayton eVarSetOperationAssign, 862e0d378b3SGreg Clayton true, 863101c7c20SCaroline Tice debugger_instance_name); 8643df9a8dfSCaroline Tice SBError sb_error; 8653df9a8dfSCaroline Tice sb_error.SetError (err); 8663df9a8dfSCaroline Tice 8673df9a8dfSCaroline Tice return sb_error; 8683df9a8dfSCaroline Tice } 8693df9a8dfSCaroline Tice 870431ce678SGreg Clayton SBStringList 871dd759857SCaroline Tice SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name) 8723df9a8dfSCaroline Tice { 8733df9a8dfSCaroline Tice SBStringList ret_value; 874e0d378b3SGreg Clayton SettableVariableType var_type; 875431ce678SGreg Clayton Error err; 876101c7c20SCaroline Tice 877431ce678SGreg Clayton UserSettingsControllerSP root_settings_controller = Debugger::GetSettingsController(); 8783df9a8dfSCaroline Tice 879daccaa9eSCaroline Tice StringList value = root_settings_controller->GetVariable (var_name, var_type, debugger_instance_name, err); 880daccaa9eSCaroline Tice 881daccaa9eSCaroline Tice if (err.Success()) 882daccaa9eSCaroline Tice { 883311adf3dSChris Lattner for (unsigned i = 0; i != value.GetSize(); ++i) 8843df9a8dfSCaroline Tice ret_value.AppendString (value.GetStringAtIndex(i)); 885daccaa9eSCaroline Tice } 886daccaa9eSCaroline Tice else 887daccaa9eSCaroline Tice { 888daccaa9eSCaroline Tice ret_value.AppendString (err.AsCString()); 889daccaa9eSCaroline Tice } 890daccaa9eSCaroline Tice 8913df9a8dfSCaroline Tice 8923df9a8dfSCaroline Tice return ret_value; 8933df9a8dfSCaroline Tice } 8943df9a8dfSCaroline Tice 895a7015092SGreg Clayton uint32_t 896a7015092SGreg Clayton SBDebugger::GetTerminalWidth () const 897a7015092SGreg Clayton { 898a7015092SGreg Clayton if (m_opaque_sp) 899a7015092SGreg Clayton return m_opaque_sp->GetTerminalWidth (); 900a7015092SGreg Clayton return 0; 901a7015092SGreg Clayton } 902a7015092SGreg Clayton 903a7015092SGreg Clayton void 904a7015092SGreg Clayton SBDebugger::SetTerminalWidth (uint32_t term_width) 905a7015092SGreg Clayton { 906a7015092SGreg Clayton if (m_opaque_sp) 907a7015092SGreg Clayton m_opaque_sp->SetTerminalWidth (term_width); 908a7015092SGreg Clayton } 909a7015092SGreg Clayton 910a7015092SGreg Clayton const char * 911a7015092SGreg Clayton SBDebugger::GetPrompt() const 912a7015092SGreg Clayton { 913431ce678SGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 914ceb6b139SCaroline Tice 915ceb6b139SCaroline Tice if (log) 916cfd1acedSGreg Clayton log->Printf ("SBDebugger(%p)::GetPrompt () => \"%s\"", m_opaque_sp.get(), 917750cd175SCaroline Tice (m_opaque_sp ? m_opaque_sp->GetPrompt() : "")); 918ceb6b139SCaroline Tice 919a7015092SGreg Clayton if (m_opaque_sp) 920a7015092SGreg Clayton return m_opaque_sp->GetPrompt (); 921a7015092SGreg Clayton return 0; 922a7015092SGreg Clayton } 923a7015092SGreg Clayton 924a7015092SGreg Clayton void 925a7015092SGreg Clayton SBDebugger::SetPrompt (const char *prompt) 926a7015092SGreg Clayton { 927a7015092SGreg Clayton if (m_opaque_sp) 928a7015092SGreg Clayton m_opaque_sp->SetPrompt (prompt); 929a7015092SGreg Clayton } 930a7015092SGreg Clayton 931a7015092SGreg Clayton 932431ce678SGreg Clayton ScriptLanguage 933a7015092SGreg Clayton SBDebugger::GetScriptLanguage() const 934a7015092SGreg Clayton { 935a7015092SGreg Clayton if (m_opaque_sp) 936a7015092SGreg Clayton return m_opaque_sp->GetScriptLanguage (); 937a7015092SGreg Clayton return eScriptLanguageNone; 938a7015092SGreg Clayton } 939a7015092SGreg Clayton 940a7015092SGreg Clayton void 941431ce678SGreg Clayton SBDebugger::SetScriptLanguage (ScriptLanguage script_lang) 942a7015092SGreg Clayton { 943a7015092SGreg Clayton if (m_opaque_sp) 944af67cecdSGreg Clayton { 945a7015092SGreg Clayton m_opaque_sp->SetScriptLanguage (script_lang); 946a7015092SGreg Clayton } 947af67cecdSGreg Clayton } 948a7015092SGreg Clayton 949e40e4218SJim Ingham bool 950e40e4218SJim Ingham SBDebugger::SetUseExternalEditor (bool value) 951e40e4218SJim Ingham { 952e40e4218SJim Ingham if (m_opaque_sp) 953e40e4218SJim Ingham return m_opaque_sp->SetUseExternalEditor (value); 954e40e4218SJim Ingham return false; 955e40e4218SJim Ingham } 956e40e4218SJim Ingham 957e40e4218SJim Ingham bool 958daccaa9eSCaroline Tice SBDebugger::GetUseExternalEditor () 959e40e4218SJim Ingham { 960e40e4218SJim Ingham if (m_opaque_sp) 961daccaa9eSCaroline Tice return m_opaque_sp->GetUseExternalEditor (); 962e40e4218SJim Ingham return false; 963e40e4218SJim Ingham } 964e40e4218SJim Ingham 965dde9cff3SCaroline Tice bool 966dde9cff3SCaroline Tice SBDebugger::GetDescription (SBStream &description) 967dde9cff3SCaroline Tice { 968dde9cff3SCaroline Tice if (m_opaque_sp) 969dde9cff3SCaroline Tice { 970dde9cff3SCaroline Tice const char *name = m_opaque_sp->GetInstanceName().AsCString(); 971431ce678SGreg Clayton user_id_t id = m_opaque_sp->GetID(); 972cfd1acedSGreg Clayton description.Printf ("Debugger (instance: \"%s\", id: %d)", name, id); 973dde9cff3SCaroline Tice } 974dde9cff3SCaroline Tice else 975dde9cff3SCaroline Tice description.Printf ("No value"); 976dde9cff3SCaroline Tice 977dde9cff3SCaroline Tice return true; 978dde9cff3SCaroline Tice } 979efed6131SCaroline Tice 980431ce678SGreg Clayton user_id_t 981efed6131SCaroline Tice SBDebugger::GetID() 982efed6131SCaroline Tice { 983efed6131SCaroline Tice if (m_opaque_sp) 984efed6131SCaroline Tice return m_opaque_sp->GetID(); 985efed6131SCaroline Tice return LLDB_INVALID_UID; 986efed6131SCaroline Tice } 9872289fa48SGreg Clayton 9882289fa48SGreg Clayton 9892289fa48SGreg Clayton SBError 9902289fa48SGreg Clayton SBDebugger::SetCurrentPlatform (const char *platform_name) 9912289fa48SGreg Clayton { 9922289fa48SGreg Clayton SBError sb_error; 9932289fa48SGreg Clayton if (m_opaque_sp) 9942289fa48SGreg Clayton { 9952289fa48SGreg Clayton PlatformSP platform_sp (Platform::Create (platform_name, sb_error.ref())); 9962289fa48SGreg Clayton 9972289fa48SGreg Clayton if (platform_sp) 9982289fa48SGreg Clayton { 9992289fa48SGreg Clayton bool make_selected = true; 10002289fa48SGreg Clayton m_opaque_sp->GetPlatformList().Append (platform_sp, make_selected); 10012289fa48SGreg Clayton } 10022289fa48SGreg Clayton } 10032289fa48SGreg Clayton return sb_error; 10042289fa48SGreg Clayton } 10052289fa48SGreg Clayton 1006fc3f027dSGreg Clayton bool 1007f3dd93c8SGreg Clayton SBDebugger::SetCurrentPlatformSDKRoot (const char *sysroot) 1008f3dd93c8SGreg Clayton { 1009f3dd93c8SGreg Clayton if (m_opaque_sp) 1010f3dd93c8SGreg Clayton { 1011f3dd93c8SGreg Clayton PlatformSP platform_sp (m_opaque_sp->GetPlatformList().GetSelectedPlatform()); 1012f3dd93c8SGreg Clayton 1013f3dd93c8SGreg Clayton if (platform_sp) 1014f3dd93c8SGreg Clayton { 1015f3dd93c8SGreg Clayton platform_sp->SetSDKRootDirectory (ConstString (sysroot)); 1016f3dd93c8SGreg Clayton return true; 1017f3dd93c8SGreg Clayton } 1018f3dd93c8SGreg Clayton } 1019f3dd93c8SGreg Clayton return false; 1020f3dd93c8SGreg Clayton } 1021f3dd93c8SGreg Clayton 1022f3dd93c8SGreg Clayton bool 1023fc3f027dSGreg Clayton SBDebugger::GetCloseInputOnEOF () const 1024fc3f027dSGreg Clayton { 1025fc3f027dSGreg Clayton if (m_opaque_sp) 1026fc3f027dSGreg Clayton return m_opaque_sp->GetCloseInputOnEOF (); 1027fc3f027dSGreg Clayton return false; 1028fc3f027dSGreg Clayton } 1029fc3f027dSGreg Clayton 1030fc3f027dSGreg Clayton void 1031fc3f027dSGreg Clayton SBDebugger::SetCloseInputOnEOF (bool b) 1032fc3f027dSGreg Clayton { 1033fc3f027dSGreg Clayton if (m_opaque_sp) 1034fc3f027dSGreg Clayton m_opaque_sp->SetCloseInputOnEOF (b); 1035fc3f027dSGreg Clayton } 1036