blob: 10c0b7dea208f32368edd982aca1be4d805516d7 [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- SBDebugger.cpp ------------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Daniel Malea93a64302012-12-05 00:20:57 +000010#include "lldb/lldb-python.h"
11
Eli Friedmanca93cc12010-06-09 07:37:52 +000012#include "lldb/API/SBDebugger.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000013
Greg Claytone0d378b2011-03-24 21:19:54 +000014#include "lldb/lldb-private.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000015
Eli Friedmanca93cc12010-06-09 07:37:52 +000016#include "lldb/API/SBListener.h"
17#include "lldb/API/SBBroadcaster.h"
18#include "lldb/API/SBCommandInterpreter.h"
19#include "lldb/API/SBCommandReturnObject.h"
Greg Clayton2289fa42011-04-30 01:09:13 +000020#include "lldb/API/SBError.h"
Eli Friedmanca93cc12010-06-09 07:37:52 +000021#include "lldb/API/SBEvent.h"
22#include "lldb/API/SBFrame.h"
Eli Friedmanca93cc12010-06-09 07:37:52 +000023#include "lldb/API/SBInputReader.h"
Caroline Tice3df9a8d2010-09-04 00:03:46 +000024#include "lldb/API/SBProcess.h"
25#include "lldb/API/SBSourceManager.h"
Caroline Ticedde9cff2010-09-20 05:20:02 +000026#include "lldb/API/SBStream.h"
Caroline Tice3df9a8d2010-09-04 00:03:46 +000027#include "lldb/API/SBStringList.h"
28#include "lldb/API/SBTarget.h"
29#include "lldb/API/SBThread.h"
Enrico Granata061858c2012-02-15 02:34:21 +000030#include "lldb/API/SBTypeCategory.h"
31#include "lldb/API/SBTypeFormat.h"
32#include "lldb/API/SBTypeFilter.h"
33#include "lldb/API/SBTypeNameSpecifier.h"
34#include "lldb/API/SBTypeSummary.h"
35#include "lldb/API/SBTypeSynthetic.h"
36
37
Greg Clayton6eee5aa2010-10-11 01:05:37 +000038#include "lldb/Core/Debugger.h"
39#include "lldb/Core/State.h"
Enrico Granata5548cb52013-01-28 23:47:25 +000040#include "lldb/DataFormatters/DataVisualization.h"
Greg Clayton5fb8f792013-12-02 19:35:49 +000041#include "lldb/Host/DynamicLibrary.h"
Greg Clayton6eee5aa2010-10-11 01:05:37 +000042#include "lldb/Interpreter/Args.h"
43#include "lldb/Interpreter/CommandInterpreter.h"
Greg Claytoncac9c5f2011-09-24 00:52:29 +000044#include "lldb/Interpreter/OptionGroupPlatform.h"
Greg Clayton6eee5aa2010-10-11 01:05:37 +000045#include "lldb/Target/Process.h"
46#include "lldb/Target/TargetList.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000047
48using namespace lldb;
49using namespace lldb_private;
50
Greg Clayton5fb8f792013-12-02 19:35:49 +000051
52static lldb::DynamicLibrarySP
53LoadPlugin (const lldb::DebuggerSP &debugger_sp, const FileSpec& spec, Error& error)
54{
55 lldb::DynamicLibrarySP dynlib_sp(new lldb_private::DynamicLibrary(spec));
56 if (dynlib_sp && dynlib_sp->IsValid())
57 {
58 typedef bool (*LLDBCommandPluginInit) (lldb::SBDebugger& debugger);
59
60 lldb::SBDebugger debugger_sb(debugger_sp);
61 // This calls the bool lldb::PluginInitialize(lldb::SBDebugger debugger) function.
62 // TODO: mangle this differently for your system - on OSX, the first underscore needs to be removed and the second one stays
63 LLDBCommandPluginInit init_func = dynlib_sp->GetSymbol<LLDBCommandPluginInit>("_ZN4lldb16PluginInitializeENS_10SBDebuggerE");
64 if (init_func)
65 {
66 if (init_func(debugger_sb))
67 return dynlib_sp;
68 else
69 error.SetErrorString("plug-in refused to load (lldb::PluginInitialize(lldb::SBDebugger) returned false)");
70 }
71 else
72 {
73 error.SetErrorString("plug-in is missing the required initialization: lldb::PluginInitialize(lldb::SBDebugger)");
74 }
75 }
76 else
77 {
78 if (spec.Exists())
79 error.SetErrorString("this file does not represent a loadable dylib");
80 else
81 error.SetErrorString("no such file");
82 }
83 return lldb::DynamicLibrarySP();
84}
85
Chris Lattner30fdc8d2010-06-08 16:52:24 +000086void
87SBDebugger::Initialize ()
88{
Greg Clayton5160ce52013-03-27 23:08:40 +000089 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +000090
91 if (log)
92 log->Printf ("SBDebugger::Initialize ()");
93
Greg Claytonfc36f7912011-03-22 01:14:58 +000094 SBCommandInterpreter::InitializeSWIG ();
95
Greg Clayton5fb8f792013-12-02 19:35:49 +000096 Debugger::Initialize(LoadPlugin);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000097}
98
99void
100SBDebugger::Terminate ()
101{
102 Debugger::Terminate();
103}
104
Greg Clayton48e42542010-07-30 20:12:55 +0000105void
106SBDebugger::Clear ()
107{
Greg Clayton5160ce52013-03-27 23:08:40 +0000108 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000109
110 if (log)
Greg Clayton93aa84e2010-10-29 04:59:35 +0000111 log->Printf ("SBDebugger(%p)::Clear ()", m_opaque_sp.get());
Caroline Tice3d6086f2010-12-20 18:35:50 +0000112
113 if (m_opaque_sp)
114 m_opaque_sp->CleanUpInputReaders ();
Caroline Ticeceb6b132010-10-26 03:11:13 +0000115
Greg Clayton48e42542010-07-30 20:12:55 +0000116 m_opaque_sp.reset();
117}
118
Greg Clayton66111032010-06-23 01:19:29 +0000119SBDebugger
120SBDebugger::Create()
121{
Jim Ingham228063c2012-02-21 02:23:08 +0000122 return SBDebugger::Create(false, NULL, NULL);
Jim Ingham06942692011-08-13 00:22:20 +0000123}
124
125SBDebugger
126SBDebugger::Create(bool source_init_files)
127{
Jim Ingham228063c2012-02-21 02:23:08 +0000128 return SBDebugger::Create (source_init_files, NULL, NULL);
129}
130
131SBDebugger
132SBDebugger::Create(bool source_init_files, lldb::LogOutputCallback callback, void *baton)
133
134{
Greg Clayton5160ce52013-03-27 23:08:40 +0000135 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000136
Greg Clayton66111032010-06-23 01:19:29 +0000137 SBDebugger debugger;
Jim Ingham228063c2012-02-21 02:23:08 +0000138 debugger.reset(Debugger::CreateInstance(callback, baton));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000139
140 if (log)
141 {
142 SBStream sstr;
143 debugger.GetDescription (sstr);
Greg Clayton93aa84e2010-10-29 04:59:35 +0000144 log->Printf ("SBDebugger::Create () => SBDebugger(%p): %s", debugger.m_opaque_sp.get(), sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000145 }
146
Jim Ingham06942692011-08-13 00:22:20 +0000147 SBCommandInterpreter interp = debugger.GetCommandInterpreter();
148 if (source_init_files)
149 {
150 interp.get()->SkipLLDBInitFiles(false);
151 interp.get()->SkipAppInitFiles (false);
152 SBCommandReturnObject result;
153 interp.SourceInitFileInHomeDirectory(result);
154 }
155 else
156 {
157 interp.get()->SkipLLDBInitFiles(true);
158 interp.get()->SkipAppInitFiles (true);
159 }
Greg Clayton66111032010-06-23 01:19:29 +0000160 return debugger;
161}
162
Caroline Ticee02657b2011-01-22 01:02:07 +0000163void
164SBDebugger::Destroy (SBDebugger &debugger)
165{
Greg Clayton5160ce52013-03-27 23:08:40 +0000166 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticee02657b2011-01-22 01:02:07 +0000167
168 if (log)
169 {
170 SBStream sstr;
171 debugger.GetDescription (sstr);
172 log->Printf ("SBDebugger::Destroy () => SBDebugger(%p): %s", debugger.m_opaque_sp.get(), sstr.GetData());
173 }
174
175 Debugger::Destroy (debugger.m_opaque_sp);
176
177 if (debugger.m_opaque_sp.get() != NULL)
178 debugger.m_opaque_sp.reset();
179}
180
Greg Claytonf9322412011-12-15 04:38:41 +0000181void
182SBDebugger::MemoryPressureDetected ()
183{
Greg Clayton0cd70862012-04-09 20:22:01 +0000184 // Since this function can be call asynchronously, we allow it to be
185 // non-mandatory. We have seen deadlocks with this function when called
186 // so we need to safeguard against this until we can determine what is
187 // causing the deadlocks.
Greg Clayton5160ce52013-03-27 23:08:40 +0000188 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Inghamaebdf1b2012-06-07 19:08:07 +0000189
Greg Clayton0cd70862012-04-09 20:22:01 +0000190 const bool mandatory = false;
Jim Inghamaebdf1b2012-06-07 19:08:07 +0000191 if (log)
192 {
193 log->Printf ("SBDebugger::MemoryPressureDetected (), mandatory = %d", mandatory);
194 }
195
Greg Clayton0cd70862012-04-09 20:22:01 +0000196 ModuleList::RemoveOrphanSharedModules(mandatory);
Greg Claytonf9322412011-12-15 04:38:41 +0000197}
198
Greg Clayton66111032010-06-23 01:19:29 +0000199SBDebugger::SBDebugger () :
200 m_opaque_sp ()
201{
202}
203
Enrico Granata274fd6e2011-08-19 23:56:34 +0000204SBDebugger::SBDebugger(const lldb::DebuggerSP &debugger_sp) :
205 m_opaque_sp(debugger_sp)
206{
207}
208
Greg Claytonefabb122010-11-05 23:17:00 +0000209SBDebugger::SBDebugger(const SBDebugger &rhs) :
210 m_opaque_sp (rhs.m_opaque_sp)
211{
212}
213
214SBDebugger &
215SBDebugger::operator = (const SBDebugger &rhs)
216{
217 if (this != &rhs)
218 {
219 m_opaque_sp = rhs.m_opaque_sp;
220 }
221 return *this;
222}
223
Greg Clayton66111032010-06-23 01:19:29 +0000224SBDebugger::~SBDebugger ()
225{
226}
227
228bool
229SBDebugger::IsValid() const
230{
231 return m_opaque_sp.get() != NULL;
232}
233
234
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000235void
236SBDebugger::SetAsync (bool b)
237{
Greg Clayton66111032010-06-23 01:19:29 +0000238 if (m_opaque_sp)
239 m_opaque_sp->SetAsyncExecution(b);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000240}
241
Jim Inghame64f0dc2011-09-13 23:25:31 +0000242bool
243SBDebugger::GetAsync ()
244{
245 if (m_opaque_sp)
246 return m_opaque_sp->GetAsyncExecution();
247 else
248 return false;
249}
250
Greg Clayton6eee5aa2010-10-11 01:05:37 +0000251void
252SBDebugger::SkipLLDBInitFiles (bool b)
253{
254 if (m_opaque_sp)
255 m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles (b);
256}
257
Jim Ingham16e0c682011-08-12 23:34:31 +0000258void
259SBDebugger::SkipAppInitFiles (bool b)
260{
261 if (m_opaque_sp)
262 m_opaque_sp->GetCommandInterpreter().SkipAppInitFiles (b);
263}
264
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000265// Shouldn't really be settable after initialization as this could cause lots of problems; don't want users
266// trying to switch modes in the middle of a debugging session.
267void
268SBDebugger::SetInputFileHandle (FILE *fh, bool transfer_ownership)
269{
Greg Clayton5160ce52013-03-27 23:08:40 +0000270 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000271
272 if (log)
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000273 log->Printf ("SBDebugger(%p)::SetInputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
274 fh, transfer_ownership);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000275
Greg Clayton66111032010-06-23 01:19:29 +0000276 if (m_opaque_sp)
277 m_opaque_sp->SetInputFileHandle (fh, transfer_ownership);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000278}
279
280void
281SBDebugger::SetOutputFileHandle (FILE *fh, bool transfer_ownership)
282{
Greg Clayton5160ce52013-03-27 23:08:40 +0000283 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000284
285
286 if (log)
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000287 log->Printf ("SBDebugger(%p)::SetOutputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
288 fh, transfer_ownership);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000289
Greg Clayton66111032010-06-23 01:19:29 +0000290 if (m_opaque_sp)
291 m_opaque_sp->SetOutputFileHandle (fh, transfer_ownership);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000292}
293
294void
295SBDebugger::SetErrorFileHandle (FILE *fh, bool transfer_ownership)
296{
Greg Clayton5160ce52013-03-27 23:08:40 +0000297 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000298
299
300 if (log)
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000301 log->Printf ("SBDebugger(%p)::SetErrorFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
302 fh, transfer_ownership);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000303
Greg Clayton66111032010-06-23 01:19:29 +0000304 if (m_opaque_sp)
305 m_opaque_sp->SetErrorFileHandle (fh, transfer_ownership);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000306}
307
308FILE *
309SBDebugger::GetInputFileHandle ()
310{
Greg Clayton66111032010-06-23 01:19:29 +0000311 if (m_opaque_sp)
Greg Clayton51b1e2d2011-02-09 01:08:52 +0000312 return m_opaque_sp->GetInputFile().GetStream();
Greg Clayton66111032010-06-23 01:19:29 +0000313 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000314}
315
316FILE *
317SBDebugger::GetOutputFileHandle ()
318{
Greg Clayton66111032010-06-23 01:19:29 +0000319 if (m_opaque_sp)
Greg Clayton51b1e2d2011-02-09 01:08:52 +0000320 return m_opaque_sp->GetOutputFile().GetStream();
Greg Clayton66111032010-06-23 01:19:29 +0000321 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000322}
323
324FILE *
325SBDebugger::GetErrorFileHandle ()
326{
Greg Clayton66111032010-06-23 01:19:29 +0000327 if (m_opaque_sp)
Greg Clayton51b1e2d2011-02-09 01:08:52 +0000328 return m_opaque_sp->GetErrorFile().GetStream();
Greg Clayton66111032010-06-23 01:19:29 +0000329 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000330}
331
Jim Inghamc5917d92012-11-30 20:23:19 +0000332void
333SBDebugger::SaveInputTerminalState()
334{
335 if (m_opaque_sp)
336 m_opaque_sp->SaveInputTerminalState();
337}
338
339void
340SBDebugger::RestoreInputTerminalState()
341{
342 if (m_opaque_sp)
343 m_opaque_sp->RestoreInputTerminalState();
344
345}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000346SBCommandInterpreter
347SBDebugger::GetCommandInterpreter ()
348{
Greg Clayton5160ce52013-03-27 23:08:40 +0000349 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000350
Greg Clayton66111032010-06-23 01:19:29 +0000351 SBCommandInterpreter sb_interpreter;
352 if (m_opaque_sp)
353 sb_interpreter.reset (&m_opaque_sp->GetCommandInterpreter());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000354
Caroline Tice750cd172010-10-26 23:49:36 +0000355 if (log)
Greg Clayton93aa84e2010-10-29 04:59:35 +0000356 log->Printf ("SBDebugger(%p)::GetCommandInterpreter () => SBCommandInterpreter(%p)",
Caroline Tice750cd172010-10-26 23:49:36 +0000357 m_opaque_sp.get(), sb_interpreter.get());
358
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000359 return sb_interpreter;
360}
361
362void
363SBDebugger::HandleCommand (const char *command)
364{
Greg Clayton66111032010-06-23 01:19:29 +0000365 if (m_opaque_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000366 {
Greg Claytonaf67cec2010-12-20 20:49:23 +0000367 TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
368 Mutex::Locker api_locker;
369 if (target_sp)
Jim Ingham10ebffa2012-05-04 23:02:50 +0000370 api_locker.Lock(target_sp->GetAPIMutex());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000371
Greg Clayton66111032010-06-23 01:19:29 +0000372 SBCommandInterpreter sb_interpreter(GetCommandInterpreter ());
373 SBCommandReturnObject result;
374
375 sb_interpreter.HandleCommand (command, result, false);
376
377 if (GetErrorFileHandle() != NULL)
378 result.PutError (GetErrorFileHandle());
379 if (GetOutputFileHandle() != NULL)
380 result.PutOutput (GetOutputFileHandle());
381
382 if (m_opaque_sp->GetAsyncExecution() == false)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000383 {
Greg Clayton66111032010-06-23 01:19:29 +0000384 SBProcess process(GetCommandInterpreter().GetProcess ());
Greg Claytonb9556ac2012-01-30 07:41:31 +0000385 ProcessSP process_sp (process.GetSP());
386 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000387 {
Greg Clayton66111032010-06-23 01:19:29 +0000388 EventSP event_sp;
389 Listener &lldb_listener = m_opaque_sp->GetListener();
Greg Claytonb9556ac2012-01-30 07:41:31 +0000390 while (lldb_listener.GetNextEventForBroadcaster (process_sp.get(), event_sp))
Greg Clayton66111032010-06-23 01:19:29 +0000391 {
392 SBEvent event(event_sp);
393 HandleProcessEvent (process, event, GetOutputFileHandle(), GetErrorFileHandle());
394 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000395 }
396 }
397 }
398}
399
400SBListener
401SBDebugger::GetListener ()
402{
Greg Clayton5160ce52013-03-27 23:08:40 +0000403 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000404
Greg Clayton66111032010-06-23 01:19:29 +0000405 SBListener sb_listener;
406 if (m_opaque_sp)
407 sb_listener.reset(&m_opaque_sp->GetListener(), false);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000408
Caroline Tice750cd172010-10-26 23:49:36 +0000409 if (log)
Greg Clayton93aa84e2010-10-29 04:59:35 +0000410 log->Printf ("SBDebugger(%p)::GetListener () => SBListener(%p)", m_opaque_sp.get(),
Caroline Tice750cd172010-10-26 23:49:36 +0000411 sb_listener.get());
412
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000413 return sb_listener;
414}
415
416void
417SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, FILE *out, FILE *err)
418{
Greg Claytonaf67cec2010-12-20 20:49:23 +0000419 if (!process.IsValid())
420 return;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000421
Greg Claytonb9556ac2012-01-30 07:41:31 +0000422 TargetSP target_sp (process.GetTarget().GetSP());
423 if (!target_sp)
424 return;
425
Greg Claytonaf67cec2010-12-20 20:49:23 +0000426 const uint32_t event_type = event.GetType();
427 char stdio_buffer[1024];
428 size_t len;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000429
Greg Claytonb9556ac2012-01-30 07:41:31 +0000430 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000431
432 if (event_type & (Process::eBroadcastBitSTDOUT | Process::eBroadcastBitStateChanged))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000433 {
Greg Claytonaf67cec2010-12-20 20:49:23 +0000434 // Drain stdout when we stop just in case we have any bytes
435 while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
436 if (out != NULL)
437 ::fwrite (stdio_buffer, 1, len, out);
438 }
439
440 if (event_type & (Process::eBroadcastBitSTDERR | Process::eBroadcastBitStateChanged))
441 {
442 // Drain stderr when we stop just in case we have any bytes
443 while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
444 if (err != NULL)
445 ::fwrite (stdio_buffer, 1, len, err);
446 }
447
448 if (event_type & Process::eBroadcastBitStateChanged)
449 {
450 StateType event_state = SBProcess::GetStateFromEvent (event);
451
452 if (event_state == eStateInvalid)
453 return;
454
455 bool is_stopped = StateIsStoppedState (event_state);
456 if (!is_stopped)
457 process.ReportEventState (event, out);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000458 }
459}
460
Jim Inghame37d6052011-09-13 00:29:56 +0000461SBSourceManager
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000462SBDebugger::GetSourceManager ()
463{
Jim Inghame37d6052011-09-13 00:29:56 +0000464 SBSourceManager sb_source_manager (*this);
465 return sb_source_manager;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000466}
467
468
469bool
470SBDebugger::GetDefaultArchitecture (char *arch_name, size_t arch_name_len)
471{
472 if (arch_name && arch_name_len)
473 {
Greg Clayton431ce672011-04-18 23:15:17 +0000474 ArchSpec default_arch = Target::GetDefaultArchitecture ();
Caroline Ticedaccaa92010-09-20 20:44:43 +0000475
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000476 if (default_arch.IsValid())
477 {
Greg Clayton431ce672011-04-18 23:15:17 +0000478 const std::string &triple_str = default_arch.GetTriple().str();
479 if (!triple_str.empty())
480 ::snprintf (arch_name, arch_name_len, "%s", triple_str.c_str());
481 else
482 ::snprintf (arch_name, arch_name_len, "%s", default_arch.GetArchitectureName());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000483 return true;
484 }
485 }
486 if (arch_name && arch_name_len)
487 arch_name[0] = '\0';
488 return false;
489}
490
491
492bool
493SBDebugger::SetDefaultArchitecture (const char *arch_name)
494{
495 if (arch_name)
496 {
Greg Clayton70512312012-05-08 01:45:38 +0000497 ArchSpec arch (arch_name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000498 if (arch.IsValid())
499 {
Greg Clayton431ce672011-04-18 23:15:17 +0000500 Target::SetDefaultArchitecture (arch);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000501 return true;
502 }
503 }
504 return false;
505}
506
507ScriptLanguage
508SBDebugger::GetScriptingLanguage (const char *script_language_name)
509{
Greg Claytonaf67cec2010-12-20 20:49:23 +0000510
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000511 return Args::StringToScriptLanguage (script_language_name,
512 eScriptLanguageDefault,
513 NULL);
514}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000515
516const char *
517SBDebugger::GetVersionString ()
518{
Virgile Bellob2f1fb22013-08-23 12:44:05 +0000519 return lldb_private::GetVersion();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000520}
521
522const char *
Greg Clayton431ce672011-04-18 23:15:17 +0000523SBDebugger::StateAsCString (StateType state)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000524{
Caroline Ticec2bbb492011-04-25 22:05:51 +0000525 return lldb_private::StateAsCString (state);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000526}
527
528bool
Greg Clayton431ce672011-04-18 23:15:17 +0000529SBDebugger::StateIsRunningState (StateType state)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000530{
Greg Clayton5160ce52013-03-27 23:08:40 +0000531 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000532
Caroline Ticec2bbb492011-04-25 22:05:51 +0000533 const bool result = lldb_private::StateIsRunningState (state);
Greg Clayton48381312010-10-30 04:51:46 +0000534 if (log)
535 log->Printf ("SBDebugger::StateIsRunningState (state=%s) => %i",
Greg Clayton431ce672011-04-18 23:15:17 +0000536 StateAsCString (state), result);
Greg Clayton48381312010-10-30 04:51:46 +0000537
538 return result;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000539}
540
541bool
Greg Clayton431ce672011-04-18 23:15:17 +0000542SBDebugger::StateIsStoppedState (StateType state)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000543{
Greg Clayton5160ce52013-03-27 23:08:40 +0000544 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000545
Greg Clayton2637f822011-11-17 01:23:07 +0000546 const bool result = lldb_private::StateIsStoppedState (state, false);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000547 if (log)
Greg Clayton48381312010-10-30 04:51:46 +0000548 log->Printf ("SBDebugger::StateIsStoppedState (state=%s) => %i",
Greg Clayton431ce672011-04-18 23:15:17 +0000549 StateAsCString (state), result);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000550
Greg Clayton48381312010-10-30 04:51:46 +0000551 return result;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000552}
553
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000554lldb::SBTarget
555SBDebugger::CreateTarget (const char *filename,
556 const char *target_triple,
557 const char *platform_name,
558 bool add_dependent_modules,
559 lldb::SBError& sb_error)
560{
561 SBTarget sb_target;
Greg Claytonb9556ac2012-01-30 07:41:31 +0000562 TargetSP target_sp;
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000563 if (m_opaque_sp)
564 {
565 sb_error.Clear();
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000566 OptionGroupPlatform platform_options (false);
567 platform_options.SetPlatformName (platform_name);
568
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000569 sb_error.ref() = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
Greg Claytona0ca6602012-10-18 16:33:33 +0000570 filename,
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000571 target_triple,
572 add_dependent_modules,
573 &platform_options,
574 target_sp);
575
576 if (sb_error.Success())
Greg Claytonb9556ac2012-01-30 07:41:31 +0000577 sb_target.SetSP (target_sp);
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000578 }
579 else
580 {
581 sb_error.SetErrorString("invalid target");
582 }
583
Greg Clayton5160ce52013-03-27 23:08:40 +0000584 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000585 if (log)
586 {
587 log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\", triple=%s, platform_name=%s, add_dependent_modules=%u, error=%s) => SBTarget(%p)",
588 m_opaque_sp.get(),
589 filename,
590 target_triple,
591 platform_name,
592 add_dependent_modules,
593 sb_error.GetCString(),
Greg Claytonb9556ac2012-01-30 07:41:31 +0000594 target_sp.get());
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000595 }
596
597 return sb_target;
598}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000599
600SBTarget
601SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename,
602 const char *target_triple)
603{
Greg Claytonb9556ac2012-01-30 07:41:31 +0000604 SBTarget sb_target;
605 TargetSP target_sp;
Greg Clayton66111032010-06-23 01:19:29 +0000606 if (m_opaque_sp)
607 {
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000608 const bool add_dependent_modules = true;
609 Error error (m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
Greg Claytona0ca6602012-10-18 16:33:33 +0000610 filename,
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000611 target_triple,
612 add_dependent_modules,
613 NULL,
614 target_sp));
Greg Claytonb9556ac2012-01-30 07:41:31 +0000615 sb_target.SetSP (target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000616 }
Greg Clayton48381312010-10-30 04:51:46 +0000617
Greg Clayton5160ce52013-03-27 23:08:40 +0000618 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000619 if (log)
620 {
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000621 log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndTargetTriple (filename=\"%s\", triple=%s) => SBTarget(%p)",
Greg Claytonb9556ac2012-01-30 07:41:31 +0000622 m_opaque_sp.get(), filename, target_triple, target_sp.get());
Greg Clayton48381312010-10-30 04:51:46 +0000623 }
624
Greg Claytonb9556ac2012-01-30 07:41:31 +0000625 return sb_target;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000626}
627
628SBTarget
Greg Clayton64195a22011-02-23 00:35:02 +0000629SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *arch_cstr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000630{
Greg Clayton5160ce52013-03-27 23:08:40 +0000631 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000632
Greg Claytonb9556ac2012-01-30 07:41:31 +0000633 SBTarget sb_target;
634 TargetSP target_sp;
Greg Clayton66111032010-06-23 01:19:29 +0000635 if (m_opaque_sp)
636 {
Greg Clayton66111032010-06-23 01:19:29 +0000637 Error error;
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000638 const bool add_dependent_modules = true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000639
Greg Claytona0ca6602012-10-18 16:33:33 +0000640 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
641 filename,
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000642 arch_cstr,
643 add_dependent_modules,
644 NULL,
645 target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000646
647 if (error.Success())
648 {
Jim Ingham2976d002010-08-26 21:32:51 +0000649 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Claytonb9556ac2012-01-30 07:41:31 +0000650 sb_target.SetSP (target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000651 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000652 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000653
654 if (log)
655 {
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000656 log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndArch (filename=\"%s\", arch=%s) => SBTarget(%p)",
Greg Claytonb9556ac2012-01-30 07:41:31 +0000657 m_opaque_sp.get(), filename, arch_cstr, target_sp.get());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000658 }
659
Greg Claytonb9556ac2012-01-30 07:41:31 +0000660 return sb_target;
Greg Clayton66111032010-06-23 01:19:29 +0000661}
662
663SBTarget
664SBDebugger::CreateTarget (const char *filename)
665{
Greg Claytonb9556ac2012-01-30 07:41:31 +0000666 SBTarget sb_target;
667 TargetSP target_sp;
Greg Clayton66111032010-06-23 01:19:29 +0000668 if (m_opaque_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000669 {
Greg Clayton431ce672011-04-18 23:15:17 +0000670 ArchSpec arch = Target::GetDefaultArchitecture ();
Greg Clayton66111032010-06-23 01:19:29 +0000671 Error error;
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000672 const bool add_dependent_modules = true;
Greg Clayton66111032010-06-23 01:19:29 +0000673
Greg Claytonb3a40ba2012-03-20 18:34:04 +0000674 PlatformSP platform_sp(m_opaque_sp->GetPlatformList().GetSelectedPlatform());
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000675 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
Greg Claytona0ca6602012-10-18 16:33:33 +0000676 filename,
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000677 arch,
678 add_dependent_modules,
Greg Claytonb3a40ba2012-03-20 18:34:04 +0000679 platform_sp,
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000680 target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000681
682 if (error.Success())
683 {
Jim Ingham2976d002010-08-26 21:32:51 +0000684 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Claytonb9556ac2012-01-30 07:41:31 +0000685 sb_target.SetSP (target_sp);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000686 }
687 }
Greg Clayton5160ce52013-03-27 23:08:40 +0000688 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000689 if (log)
690 {
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000691 log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)",
Greg Claytonb9556ac2012-01-30 07:41:31 +0000692 m_opaque_sp.get(), filename, target_sp.get());
Greg Clayton48381312010-10-30 04:51:46 +0000693 }
Greg Claytonb9556ac2012-01-30 07:41:31 +0000694 return sb_target;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000695}
696
Johnny Chen3794ad92011-06-15 21:24:24 +0000697bool
698SBDebugger::DeleteTarget (lldb::SBTarget &target)
699{
700 bool result = false;
Greg Claytonb9556ac2012-01-30 07:41:31 +0000701 if (m_opaque_sp)
Johnny Chen3794ad92011-06-15 21:24:24 +0000702 {
Greg Claytonb9556ac2012-01-30 07:41:31 +0000703 TargetSP target_sp(target.GetSP());
704 if (target_sp)
705 {
706 // No need to lock, the target list is thread safe
707 result = m_opaque_sp->GetTargetList().DeleteTarget (target_sp);
708 target_sp->Destroy();
709 target.Clear();
Greg Clayton0cd70862012-04-09 20:22:01 +0000710 const bool mandatory = true;
711 ModuleList::RemoveOrphanSharedModules(mandatory);
Greg Claytonb9556ac2012-01-30 07:41:31 +0000712 }
Johnny Chen3794ad92011-06-15 21:24:24 +0000713 }
714
Greg Clayton5160ce52013-03-27 23:08:40 +0000715 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Johnny Chen3794ad92011-06-15 21:24:24 +0000716 if (log)
717 {
718 log->Printf ("SBDebugger(%p)::DeleteTarget (SBTarget(%p)) => %i", m_opaque_sp.get(), target.m_opaque_sp.get(), result);
719 }
720
721 return result;
722}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000723SBTarget
724SBDebugger::GetTargetAtIndex (uint32_t idx)
725{
Greg Clayton66111032010-06-23 01:19:29 +0000726 SBTarget sb_target;
727 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000728 {
729 // No need to lock, the target list is thread safe
Greg Claytonb9556ac2012-01-30 07:41:31 +0000730 sb_target.SetSP (m_opaque_sp->GetTargetList().GetTargetAtIndex (idx));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000731 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000732 return sb_target;
733}
734
Jim Ingham8499e1a2012-05-08 23:06:07 +0000735uint32_t
736SBDebugger::GetIndexOfTarget (lldb::SBTarget target)
737{
738
739 lldb::TargetSP target_sp = target.GetSP();
740 if (!target_sp)
741 return UINT32_MAX;
742
743 if (!m_opaque_sp)
744 return UINT32_MAX;
745
746 return m_opaque_sp->GetTargetList().GetIndexOfTarget (target.GetSP());
747}
748
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000749SBTarget
Virgile Bello997f6f72013-09-05 16:53:14 +0000750SBDebugger::FindTargetWithProcessID (lldb::pid_t pid)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000751{
Greg Clayton66111032010-06-23 01:19:29 +0000752 SBTarget sb_target;
753 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000754 {
755 // No need to lock, the target list is thread safe
Greg Claytonb9556ac2012-01-30 07:41:31 +0000756 sb_target.SetSP (m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000757 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000758 return sb_target;
759}
760
761SBTarget
762SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name)
763{
Greg Clayton66111032010-06-23 01:19:29 +0000764 SBTarget sb_target;
765 if (m_opaque_sp && filename && filename[0])
766 {
Greg Claytonaf67cec2010-12-20 20:49:23 +0000767 // No need to lock, the target list is thread safe
Greg Claytoneb0103f2011-04-07 22:46:35 +0000768 ArchSpec arch (arch_name, m_opaque_sp->GetPlatformList().GetSelectedPlatform().get());
Greg Clayton274060b2010-10-20 20:54:39 +0000769 TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename, false), arch_name ? &arch : NULL));
Greg Claytonb9556ac2012-01-30 07:41:31 +0000770 sb_target.SetSP (target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000771 }
772 return sb_target;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000773}
774
775SBTarget
Greg Clayton431ce672011-04-18 23:15:17 +0000776SBDebugger::FindTargetWithLLDBProcess (const ProcessSP &process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000777{
Greg Clayton66111032010-06-23 01:19:29 +0000778 SBTarget sb_target;
779 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000780 {
781 // No need to lock, the target list is thread safe
Greg Claytonb9556ac2012-01-30 07:41:31 +0000782 sb_target.SetSP (m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get()));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000783 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000784 return sb_target;
785}
786
787
788uint32_t
789SBDebugger::GetNumTargets ()
790{
Greg Clayton66111032010-06-23 01:19:29 +0000791 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000792 {
793 // No need to lock, the target list is thread safe
Greg Clayton66111032010-06-23 01:19:29 +0000794 return m_opaque_sp->GetTargetList().GetNumTargets ();
Greg Claytonaf67cec2010-12-20 20:49:23 +0000795 }
Greg Clayton66111032010-06-23 01:19:29 +0000796 return 0;
797}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000798
799SBTarget
Jim Ingham2976d002010-08-26 21:32:51 +0000800SBDebugger::GetSelectedTarget ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000801{
Greg Clayton5160ce52013-03-27 23:08:40 +0000802 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000803
Greg Clayton66111032010-06-23 01:19:29 +0000804 SBTarget sb_target;
Greg Claytonb9556ac2012-01-30 07:41:31 +0000805 TargetSP target_sp;
Greg Clayton66111032010-06-23 01:19:29 +0000806 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000807 {
808 // No need to lock, the target list is thread safe
Greg Claytonb9556ac2012-01-30 07:41:31 +0000809 target_sp = m_opaque_sp->GetTargetList().GetSelectedTarget ();
810 sb_target.SetSP (target_sp);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000811 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000812
813 if (log)
814 {
815 SBStream sstr;
Greg Clayton431ce672011-04-18 23:15:17 +0000816 sb_target.GetDescription (sstr, eDescriptionLevelBrief);
Greg Clayton93aa84e2010-10-29 04:59:35 +0000817 log->Printf ("SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s", m_opaque_sp.get(),
Greg Claytonb9556ac2012-01-30 07:41:31 +0000818 target_sp.get(), sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000819 }
820
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000821 return sb_target;
822}
823
824void
Jim Inghame64f0dc2011-09-13 23:25:31 +0000825SBDebugger::SetSelectedTarget (SBTarget &sb_target)
826{
Greg Clayton5160ce52013-03-27 23:08:40 +0000827 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Inghame64f0dc2011-09-13 23:25:31 +0000828
Greg Claytonb9556ac2012-01-30 07:41:31 +0000829 TargetSP target_sp (sb_target.GetSP());
Jim Inghame64f0dc2011-09-13 23:25:31 +0000830 if (m_opaque_sp)
831 {
Greg Claytonb9556ac2012-01-30 07:41:31 +0000832 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Jim Inghame64f0dc2011-09-13 23:25:31 +0000833 }
834 if (log)
835 {
836 SBStream sstr;
837 sb_target.GetDescription (sstr, eDescriptionLevelBrief);
838 log->Printf ("SBDebugger(%p)::SetSelectedTarget () => SBTarget(%p): %s", m_opaque_sp.get(),
Greg Claytonb9556ac2012-01-30 07:41:31 +0000839 target_sp.get(), sstr.GetData());
Jim Inghame64f0dc2011-09-13 23:25:31 +0000840 }
841}
842
Greg Claytonfbb76342013-11-20 21:07:01 +0000843SBPlatform
844SBDebugger::GetSelectedPlatform()
845{
846 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
847
848 SBPlatform sb_platform;
849 DebuggerSP debugger_sp(m_opaque_sp);
850 if (debugger_sp)
851 {
852 sb_platform.SetSP(debugger_sp->GetPlatformList().GetSelectedPlatform());
853 }
854 if (log)
855 {
856 log->Printf ("SBDebugger(%p)::GetSelectedPlatform () => SBPlatform(%p): %s", m_opaque_sp.get(),
857 sb_platform.GetSP().get(), sb_platform.GetName());
858 }
859 return sb_platform;
860}
861
862void
863SBDebugger::SetSelectedPlatform(SBPlatform &sb_platform)
864{
865 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
866
867 DebuggerSP debugger_sp(m_opaque_sp);
868 if (debugger_sp)
869 {
870 debugger_sp->GetPlatformList().SetSelectedPlatform(sb_platform.GetSP());
871 }
872 if (log)
873 {
874 log->Printf ("SBDebugger(%p)::SetSelectedPlatform (SBPlatform(%p) %s)", m_opaque_sp.get(),
875 sb_platform.GetSP().get(), sb_platform.GetName());
876 }
877}
878
Jim Inghame64f0dc2011-09-13 23:25:31 +0000879void
Enrico Granatac30a73a2012-09-06 22:02:28 +0000880SBDebugger::DispatchInput (void* baton, const void *data, size_t data_len)
Enrico Granata6b09d422012-09-06 21:58:25 +0000881{
882 DispatchInput (data,data_len);
883}
884
885void
Filipe Cabecinhasc3019992012-08-20 16:21:04 +0000886SBDebugger::DispatchInput (const void *data, size_t data_len)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000887{
Greg Clayton5160ce52013-03-27 23:08:40 +0000888 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000889
890 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000891 log->Printf ("SBDebugger(%p)::DispatchInput (data=\"%.*s\", size_t=%" PRIu64 ")",
Greg Clayton43e0af02012-09-18 18:04:04 +0000892 m_opaque_sp.get(),
893 (int) data_len,
894 (const char *) data,
895 (uint64_t)data_len);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000896
Greg Clayton66111032010-06-23 01:19:29 +0000897 if (m_opaque_sp)
898 m_opaque_sp->DispatchInput ((const char *) data, data_len);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000899}
900
901void
Caroline Ticeefed6132010-11-19 20:47:54 +0000902SBDebugger::DispatchInputInterrupt ()
903{
904 if (m_opaque_sp)
905 m_opaque_sp->DispatchInputInterrupt ();
906}
907
908void
909SBDebugger::DispatchInputEndOfFile ()
910{
911 if (m_opaque_sp)
912 m_opaque_sp->DispatchInputEndOfFile ();
913}
Caroline Tice9088b062011-05-09 23:06:58 +0000914
915bool
916SBDebugger::InputReaderIsTopReader (const lldb::SBInputReader &reader)
917{
Greg Clayton5160ce52013-03-27 23:08:40 +0000918 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice9088b062011-05-09 23:06:58 +0000919
920 if (log)
921 log->Printf ("SBDebugger(%p)::InputReaderIsTopReader (SBInputReader(%p))", m_opaque_sp.get(), &reader);
922
923 if (m_opaque_sp && reader.IsValid())
924 {
925 InputReaderSP reader_sp (*reader);
926 return m_opaque_sp->InputReaderIsTopReader (reader_sp);
927 }
928
929 return false;
930}
931
Caroline Ticeefed6132010-11-19 20:47:54 +0000932
933void
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000934SBDebugger::PushInputReader (SBInputReader &reader)
935{
Greg Clayton5160ce52013-03-27 23:08:40 +0000936 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000937
938 if (log)
Greg Clayton93aa84e2010-10-29 04:59:35 +0000939 log->Printf ("SBDebugger(%p)::PushInputReader (SBInputReader(%p))", m_opaque_sp.get(), &reader);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000940
Greg Clayton66111032010-06-23 01:19:29 +0000941 if (m_opaque_sp && reader.IsValid())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000942 {
Greg Claytonaf67cec2010-12-20 20:49:23 +0000943 TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
944 Mutex::Locker api_locker;
945 if (target_sp)
Jim Ingham10ebffa2012-05-04 23:02:50 +0000946 api_locker.Lock(target_sp->GetAPIMutex());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000947 InputReaderSP reader_sp(*reader);
Greg Clayton66111032010-06-23 01:19:29 +0000948 m_opaque_sp->PushInputReader (reader_sp);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000949 }
950}
Greg Clayton66111032010-06-23 01:19:29 +0000951
952void
Caroline Tice969ed3d2011-05-02 20:41:46 +0000953SBDebugger::NotifyTopInputReader (InputReaderAction notification)
954{
Greg Clayton5160ce52013-03-27 23:08:40 +0000955 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice969ed3d2011-05-02 20:41:46 +0000956
957 if (log)
958 log->Printf ("SBDebugger(%p)::NotifyTopInputReader (%d)", m_opaque_sp.get(), notification);
959
960 if (m_opaque_sp)
961 m_opaque_sp->NotifyTopInputReader (notification);
962}
963
964void
Greg Clayton431ce672011-04-18 23:15:17 +0000965SBDebugger::reset (const DebuggerSP &debugger_sp)
Greg Clayton66111032010-06-23 01:19:29 +0000966{
967 m_opaque_sp = debugger_sp;
968}
969
970Debugger *
971SBDebugger::get () const
972{
973 return m_opaque_sp.get();
974}
975
976Debugger &
977SBDebugger::ref () const
978{
979 assert (m_opaque_sp.get());
980 return *m_opaque_sp;
981}
982
Greg Clayton9a377662011-10-01 02:59:24 +0000983const lldb::DebuggerSP &
984SBDebugger::get_sp () const
985{
986 return m_opaque_sp;
987}
Greg Clayton66111032010-06-23 01:19:29 +0000988
Caroline Ticeebc1bb22010-06-30 16:22:25 +0000989SBDebugger
990SBDebugger::FindDebuggerWithID (int id)
991{
Greg Claytonaf67cec2010-12-20 20:49:23 +0000992 // No need to lock, the debugger list is thread safe
Caroline Ticeebc1bb22010-06-30 16:22:25 +0000993 SBDebugger sb_debugger;
Greg Clayton431ce672011-04-18 23:15:17 +0000994 DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id);
Caroline Ticeebc1bb22010-06-30 16:22:25 +0000995 if (debugger_sp)
996 sb_debugger.reset (debugger_sp);
997 return sb_debugger;
998}
Jim Inghame40e4212010-08-30 19:44:40 +0000999
Caroline Ticedd759852010-09-09 17:45:09 +00001000const char *
1001SBDebugger::GetInstanceName()
1002{
Greg Clayton6920b522012-08-22 18:39:03 +00001003 if (m_opaque_sp)
1004 return m_opaque_sp->GetInstanceName().AsCString();
1005 else
Caroline Ticedd759852010-09-09 17:45:09 +00001006 return NULL;
1007}
1008
Caroline Tice3df9a8d2010-09-04 00:03:46 +00001009SBError
Caroline Ticedd759852010-09-09 17:45:09 +00001010SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name)
Caroline Tice3df9a8d2010-09-04 00:03:46 +00001011{
Greg Clayton6920b522012-08-22 18:39:03 +00001012 SBError sb_error;
1013 DebuggerSP debugger_sp(Debugger::FindDebuggerWithInstanceName (ConstString(debugger_instance_name)));
1014 Error error;
1015 if (debugger_sp)
1016 {
1017 ExecutionContext exe_ctx (debugger_sp->GetCommandInterpreter().GetExecutionContext());
1018 error = debugger_sp->SetPropertyValue (&exe_ctx,
1019 eVarSetOperationAssign,
1020 var_name,
1021 value);
1022 }
1023 else
1024 {
1025 error.SetErrorStringWithFormat ("invalid debugger instance name '%s'", debugger_instance_name);
1026 }
1027 if (error.Fail())
1028 sb_error.SetError(error);
1029 return sb_error;
Caroline Tice3df9a8d2010-09-04 00:03:46 +00001030}
1031
Greg Clayton431ce672011-04-18 23:15:17 +00001032SBStringList
Caroline Ticedd759852010-09-09 17:45:09 +00001033SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name)
Caroline Tice3df9a8d2010-09-04 00:03:46 +00001034{
1035 SBStringList ret_value;
Greg Clayton6920b522012-08-22 18:39:03 +00001036 DebuggerSP debugger_sp(Debugger::FindDebuggerWithInstanceName (ConstString(debugger_instance_name)));
1037 Error error;
1038 if (debugger_sp)
1039 {
1040 ExecutionContext exe_ctx (debugger_sp->GetCommandInterpreter().GetExecutionContext());
1041 lldb::OptionValueSP value_sp (debugger_sp->GetPropertyValue (&exe_ctx,
1042 var_name,
1043 false,
1044 error));
1045 if (value_sp)
1046 {
1047 StreamString value_strm;
1048 value_sp->DumpValue (&exe_ctx, value_strm, OptionValue::eDumpOptionValue);
1049 const std::string &value_str = value_strm.GetString();
1050 if (!value_str.empty())
1051 {
1052 StringList string_list;
1053 string_list.SplitIntoLines(value_str.c_str(), value_str.size());
1054 return SBStringList(&string_list);
1055 }
1056 }
1057 }
1058 return SBStringList();
Caroline Tice3df9a8d2010-09-04 00:03:46 +00001059}
1060
Greg Claytona7015092010-09-18 01:14:36 +00001061uint32_t
1062SBDebugger::GetTerminalWidth () const
1063{
1064 if (m_opaque_sp)
1065 return m_opaque_sp->GetTerminalWidth ();
1066 return 0;
1067}
1068
1069void
1070SBDebugger::SetTerminalWidth (uint32_t term_width)
1071{
1072 if (m_opaque_sp)
1073 m_opaque_sp->SetTerminalWidth (term_width);
1074}
1075
1076const char *
1077SBDebugger::GetPrompt() const
1078{
Greg Clayton5160ce52013-03-27 23:08:40 +00001079 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001080
1081 if (log)
Greg Claytoncfd1ace2010-10-31 03:01:06 +00001082 log->Printf ("SBDebugger(%p)::GetPrompt () => \"%s\"", m_opaque_sp.get(),
Caroline Tice750cd172010-10-26 23:49:36 +00001083 (m_opaque_sp ? m_opaque_sp->GetPrompt() : ""));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001084
Greg Claytona7015092010-09-18 01:14:36 +00001085 if (m_opaque_sp)
1086 return m_opaque_sp->GetPrompt ();
1087 return 0;
1088}
1089
1090void
1091SBDebugger::SetPrompt (const char *prompt)
1092{
1093 if (m_opaque_sp)
1094 m_opaque_sp->SetPrompt (prompt);
1095}
1096
1097
Greg Clayton431ce672011-04-18 23:15:17 +00001098ScriptLanguage
Greg Claytona7015092010-09-18 01:14:36 +00001099SBDebugger::GetScriptLanguage() const
1100{
1101 if (m_opaque_sp)
1102 return m_opaque_sp->GetScriptLanguage ();
1103 return eScriptLanguageNone;
1104}
1105
1106void
Greg Clayton431ce672011-04-18 23:15:17 +00001107SBDebugger::SetScriptLanguage (ScriptLanguage script_lang)
Greg Claytona7015092010-09-18 01:14:36 +00001108{
1109 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +00001110 {
Greg Claytona7015092010-09-18 01:14:36 +00001111 m_opaque_sp->SetScriptLanguage (script_lang);
Greg Claytonaf67cec2010-12-20 20:49:23 +00001112 }
Greg Claytona7015092010-09-18 01:14:36 +00001113}
1114
Jim Inghame40e4212010-08-30 19:44:40 +00001115bool
1116SBDebugger::SetUseExternalEditor (bool value)
1117{
1118 if (m_opaque_sp)
1119 return m_opaque_sp->SetUseExternalEditor (value);
Greg Claytonaf67cec2010-12-20 20:49:23 +00001120 return false;
Jim Inghame40e4212010-08-30 19:44:40 +00001121}
1122
1123bool
Caroline Ticedaccaa92010-09-20 20:44:43 +00001124SBDebugger::GetUseExternalEditor ()
Jim Inghame40e4212010-08-30 19:44:40 +00001125{
1126 if (m_opaque_sp)
Caroline Ticedaccaa92010-09-20 20:44:43 +00001127 return m_opaque_sp->GetUseExternalEditor ();
Greg Claytonaf67cec2010-12-20 20:49:23 +00001128 return false;
Jim Inghame40e4212010-08-30 19:44:40 +00001129}
1130
Caroline Ticedde9cff2010-09-20 05:20:02 +00001131bool
Michael Sartainc3ce7f272013-05-23 20:47:45 +00001132SBDebugger::SetUseColor (bool value)
1133{
1134 if (m_opaque_sp)
1135 return m_opaque_sp->SetUseColor (value);
1136 return false;
1137}
1138
1139bool
1140SBDebugger::GetUseColor () const
1141{
1142 if (m_opaque_sp)
1143 return m_opaque_sp->GetUseColor ();
1144 return false;
1145}
1146
1147bool
Caroline Ticedde9cff2010-09-20 05:20:02 +00001148SBDebugger::GetDescription (SBStream &description)
1149{
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001150 Stream &strm = description.ref();
1151
Caroline Ticedde9cff2010-09-20 05:20:02 +00001152 if (m_opaque_sp)
1153 {
1154 const char *name = m_opaque_sp->GetInstanceName().AsCString();
Greg Clayton431ce672011-04-18 23:15:17 +00001155 user_id_t id = m_opaque_sp->GetID();
Daniel Malead01b2952012-11-29 21:49:15 +00001156 strm.Printf ("Debugger (instance: \"%s\", id: %" PRIu64 ")", name, id);
Caroline Ticedde9cff2010-09-20 05:20:02 +00001157 }
1158 else
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001159 strm.PutCString ("No value");
Caroline Ticedde9cff2010-09-20 05:20:02 +00001160
1161 return true;
1162}
Caroline Ticeefed6132010-11-19 20:47:54 +00001163
Greg Clayton431ce672011-04-18 23:15:17 +00001164user_id_t
Caroline Ticeefed6132010-11-19 20:47:54 +00001165SBDebugger::GetID()
1166{
1167 if (m_opaque_sp)
1168 return m_opaque_sp->GetID();
1169 return LLDB_INVALID_UID;
1170}
Greg Clayton2289fa42011-04-30 01:09:13 +00001171
1172
1173SBError
1174SBDebugger::SetCurrentPlatform (const char *platform_name)
1175{
1176 SBError sb_error;
1177 if (m_opaque_sp)
1178 {
1179 PlatformSP platform_sp (Platform::Create (platform_name, sb_error.ref()));
1180
1181 if (platform_sp)
1182 {
1183 bool make_selected = true;
1184 m_opaque_sp->GetPlatformList().Append (platform_sp, make_selected);
1185 }
1186 }
1187 return sb_error;
1188}
1189
Greg Claytonfc3f0272011-05-29 04:06:55 +00001190bool
Greg Claytonf3dd93c2011-06-17 03:31:01 +00001191SBDebugger::SetCurrentPlatformSDKRoot (const char *sysroot)
1192{
1193 if (m_opaque_sp)
1194 {
1195 PlatformSP platform_sp (m_opaque_sp->GetPlatformList().GetSelectedPlatform());
1196
1197 if (platform_sp)
1198 {
1199 platform_sp->SetSDKRootDirectory (ConstString (sysroot));
1200 return true;
1201 }
1202 }
1203 return false;
1204}
1205
1206bool
Greg Claytonfc3f0272011-05-29 04:06:55 +00001207SBDebugger::GetCloseInputOnEOF () const
1208{
1209 if (m_opaque_sp)
1210 return m_opaque_sp->GetCloseInputOnEOF ();
1211 return false;
1212}
1213
1214void
1215SBDebugger::SetCloseInputOnEOF (bool b)
1216{
1217 if (m_opaque_sp)
1218 m_opaque_sp->SetCloseInputOnEOF (b);
1219}
Enrico Granata061858c2012-02-15 02:34:21 +00001220
1221SBTypeCategory
1222SBDebugger::GetCategory (const char* category_name)
1223{
1224 if (!category_name || *category_name == 0)
1225 return SBTypeCategory();
1226
1227 TypeCategoryImplSP category_sp;
1228
1229 if (DataVisualization::Categories::GetCategory(ConstString(category_name), category_sp, false))
1230 return SBTypeCategory(category_sp);
1231 else
1232 return SBTypeCategory();
1233}
1234
1235SBTypeCategory
1236SBDebugger::CreateCategory (const char* category_name)
1237{
1238 if (!category_name || *category_name == 0)
1239 return SBTypeCategory();
1240
1241 TypeCategoryImplSP category_sp;
1242
1243 if (DataVisualization::Categories::GetCategory(ConstString(category_name), category_sp, true))
1244 return SBTypeCategory(category_sp);
1245 else
1246 return SBTypeCategory();
1247}
1248
1249bool
1250SBDebugger::DeleteCategory (const char* category_name)
1251{
1252 if (!category_name || *category_name == 0)
1253 return false;
1254
1255 return DataVisualization::Categories::Delete(ConstString(category_name));
1256}
1257
1258uint32_t
1259SBDebugger::GetNumCategories()
1260{
1261 return DataVisualization::Categories::GetCount();
1262}
1263
1264SBTypeCategory
1265SBDebugger::GetCategoryAtIndex (uint32_t index)
1266{
1267 return SBTypeCategory(DataVisualization::Categories::GetCategoryAtIndex(index));
1268}
1269
1270SBTypeCategory
1271SBDebugger::GetDefaultCategory()
1272{
1273 return GetCategory("default");
1274}
1275
1276SBTypeFormat
1277SBDebugger::GetFormatForType (SBTypeNameSpecifier type_name)
1278{
1279 SBTypeCategory default_category_sb = GetDefaultCategory();
1280 if (default_category_sb.GetEnabled())
1281 return default_category_sb.GetFormatForType(type_name);
1282 return SBTypeFormat();
1283}
1284
Jason Molendacf7e2dc2012-02-21 05:33:55 +00001285#ifndef LLDB_DISABLE_PYTHON
Enrico Granata061858c2012-02-15 02:34:21 +00001286SBTypeSummary
1287SBDebugger::GetSummaryForType (SBTypeNameSpecifier type_name)
1288{
Enrico Granataa777dc22012-05-08 21:49:57 +00001289 if (type_name.IsValid() == false)
1290 return SBTypeSummary();
1291 return SBTypeSummary(DataVisualization::GetSummaryForType(type_name.GetSP()));
Enrico Granata061858c2012-02-15 02:34:21 +00001292}
Jason Molendacf7e2dc2012-02-21 05:33:55 +00001293#endif // LLDB_DISABLE_PYTHON
Enrico Granata061858c2012-02-15 02:34:21 +00001294
1295SBTypeFilter
1296SBDebugger::GetFilterForType (SBTypeNameSpecifier type_name)
1297{
Enrico Granataa777dc22012-05-08 21:49:57 +00001298 if (type_name.IsValid() == false)
1299 return SBTypeFilter();
1300 return SBTypeFilter(DataVisualization::GetFilterForType(type_name.GetSP()));
Enrico Granata061858c2012-02-15 02:34:21 +00001301}
1302
Jason Molendacf7e2dc2012-02-21 05:33:55 +00001303#ifndef LLDB_DISABLE_PYTHON
Enrico Granata061858c2012-02-15 02:34:21 +00001304SBTypeSynthetic
1305SBDebugger::GetSyntheticForType (SBTypeNameSpecifier type_name)
1306{
Enrico Granataa777dc22012-05-08 21:49:57 +00001307 if (type_name.IsValid() == false)
1308 return SBTypeSynthetic();
1309 return SBTypeSynthetic(DataVisualization::GetSyntheticForType(type_name.GetSP()));
Enrico Granata061858c2012-02-15 02:34:21 +00001310}
Jason Molendacf7e2dc2012-02-21 05:33:55 +00001311#endif // LLDB_DISABLE_PYTHON
Enrico Granata061858c2012-02-15 02:34:21 +00001312
Jim Ingham228063c2012-02-21 02:23:08 +00001313bool
1314SBDebugger::EnableLog (const char *channel, const char **categories)
1315{
1316 if (m_opaque_sp)
1317 {
1318 uint32_t log_options = LLDB_LOG_OPTION_PREPEND_TIMESTAMP | LLDB_LOG_OPTION_PREPEND_THREAD_NAME;
1319 StreamString errors;
1320 return m_opaque_sp->EnableLog (channel, categories, NULL, log_options, errors);
1321
1322 }
1323 else
1324 return false;
1325}
Jim Ingham4f02b222012-02-22 22:49:20 +00001326
1327void
1328SBDebugger::SetLoggingCallback (lldb::LogOutputCallback log_callback, void *baton)
1329{
1330 if (m_opaque_sp)
1331 {
1332 return m_opaque_sp->SetLoggingCallback (log_callback, baton);
1333 }
1334}
1335
1336