blob: f5e71d5f1a07b44a25b4d9c2837d289521aa7cc5 [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 Clayton6eee5aa2010-10-11 01:05:37 +000041#include "lldb/Interpreter/Args.h"
42#include "lldb/Interpreter/CommandInterpreter.h"
Greg Claytoncac9c5f2011-09-24 00:52:29 +000043#include "lldb/Interpreter/OptionGroupPlatform.h"
Greg Clayton6eee5aa2010-10-11 01:05:37 +000044#include "lldb/Target/Process.h"
45#include "lldb/Target/TargetList.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000046
47using namespace lldb;
48using namespace lldb_private;
49
50void
51SBDebugger::Initialize ()
52{
Greg Clayton5160ce52013-03-27 23:08:40 +000053 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +000054
55 if (log)
56 log->Printf ("SBDebugger::Initialize ()");
57
Greg Claytonfc36f7912011-03-22 01:14:58 +000058 SBCommandInterpreter::InitializeSWIG ();
59
Chris Lattner30fdc8d2010-06-08 16:52:24 +000060 Debugger::Initialize();
61}
62
63void
64SBDebugger::Terminate ()
65{
66 Debugger::Terminate();
67}
68
Greg Clayton48e42542010-07-30 20:12:55 +000069void
70SBDebugger::Clear ()
71{
Greg Clayton5160ce52013-03-27 23:08:40 +000072 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +000073
74 if (log)
Greg Clayton93aa84e2010-10-29 04:59:35 +000075 log->Printf ("SBDebugger(%p)::Clear ()", m_opaque_sp.get());
Caroline Tice3d6086f2010-12-20 18:35:50 +000076
77 if (m_opaque_sp)
78 m_opaque_sp->CleanUpInputReaders ();
Caroline Ticeceb6b132010-10-26 03:11:13 +000079
Greg Clayton48e42542010-07-30 20:12:55 +000080 m_opaque_sp.reset();
81}
82
Greg Clayton66111032010-06-23 01:19:29 +000083SBDebugger
84SBDebugger::Create()
85{
Jim Ingham228063c2012-02-21 02:23:08 +000086 return SBDebugger::Create(false, NULL, NULL);
Jim Ingham06942692011-08-13 00:22:20 +000087}
88
89SBDebugger
90SBDebugger::Create(bool source_init_files)
91{
Jim Ingham228063c2012-02-21 02:23:08 +000092 return SBDebugger::Create (source_init_files, NULL, NULL);
93}
94
95SBDebugger
96SBDebugger::Create(bool source_init_files, lldb::LogOutputCallback callback, void *baton)
97
98{
Greg Clayton5160ce52013-03-27 23:08:40 +000099 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000100
Greg Clayton66111032010-06-23 01:19:29 +0000101 SBDebugger debugger;
Jim Ingham228063c2012-02-21 02:23:08 +0000102 debugger.reset(Debugger::CreateInstance(callback, baton));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000103
104 if (log)
105 {
106 SBStream sstr;
107 debugger.GetDescription (sstr);
Greg Clayton93aa84e2010-10-29 04:59:35 +0000108 log->Printf ("SBDebugger::Create () => SBDebugger(%p): %s", debugger.m_opaque_sp.get(), sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000109 }
110
Jim Ingham06942692011-08-13 00:22:20 +0000111 SBCommandInterpreter interp = debugger.GetCommandInterpreter();
112 if (source_init_files)
113 {
114 interp.get()->SkipLLDBInitFiles(false);
115 interp.get()->SkipAppInitFiles (false);
116 SBCommandReturnObject result;
117 interp.SourceInitFileInHomeDirectory(result);
118 }
119 else
120 {
121 interp.get()->SkipLLDBInitFiles(true);
122 interp.get()->SkipAppInitFiles (true);
123 }
Greg Clayton66111032010-06-23 01:19:29 +0000124 return debugger;
125}
126
Caroline Ticee02657b2011-01-22 01:02:07 +0000127void
128SBDebugger::Destroy (SBDebugger &debugger)
129{
Greg Clayton5160ce52013-03-27 23:08:40 +0000130 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticee02657b2011-01-22 01:02:07 +0000131
132 if (log)
133 {
134 SBStream sstr;
135 debugger.GetDescription (sstr);
136 log->Printf ("SBDebugger::Destroy () => SBDebugger(%p): %s", debugger.m_opaque_sp.get(), sstr.GetData());
137 }
138
139 Debugger::Destroy (debugger.m_opaque_sp);
140
141 if (debugger.m_opaque_sp.get() != NULL)
142 debugger.m_opaque_sp.reset();
143}
144
Greg Claytonf9322412011-12-15 04:38:41 +0000145void
146SBDebugger::MemoryPressureDetected ()
147{
Greg Clayton0cd70862012-04-09 20:22:01 +0000148 // Since this function can be call asynchronously, we allow it to be
149 // non-mandatory. We have seen deadlocks with this function when called
150 // so we need to safeguard against this until we can determine what is
151 // causing the deadlocks.
Greg Clayton5160ce52013-03-27 23:08:40 +0000152 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Inghamaebdf1b2012-06-07 19:08:07 +0000153
Greg Clayton0cd70862012-04-09 20:22:01 +0000154 const bool mandatory = false;
Jim Inghamaebdf1b2012-06-07 19:08:07 +0000155 if (log)
156 {
157 log->Printf ("SBDebugger::MemoryPressureDetected (), mandatory = %d", mandatory);
158 }
159
Greg Clayton0cd70862012-04-09 20:22:01 +0000160 ModuleList::RemoveOrphanSharedModules(mandatory);
Greg Claytonf9322412011-12-15 04:38:41 +0000161}
162
Greg Clayton66111032010-06-23 01:19:29 +0000163SBDebugger::SBDebugger () :
164 m_opaque_sp ()
165{
166}
167
Enrico Granata274fd6e2011-08-19 23:56:34 +0000168SBDebugger::SBDebugger(const lldb::DebuggerSP &debugger_sp) :
169 m_opaque_sp(debugger_sp)
170{
171}
172
Greg Claytonefabb122010-11-05 23:17:00 +0000173SBDebugger::SBDebugger(const SBDebugger &rhs) :
174 m_opaque_sp (rhs.m_opaque_sp)
175{
176}
177
178SBDebugger &
179SBDebugger::operator = (const SBDebugger &rhs)
180{
181 if (this != &rhs)
182 {
183 m_opaque_sp = rhs.m_opaque_sp;
184 }
185 return *this;
186}
187
Greg Clayton66111032010-06-23 01:19:29 +0000188SBDebugger::~SBDebugger ()
189{
190}
191
192bool
193SBDebugger::IsValid() const
194{
195 return m_opaque_sp.get() != NULL;
196}
197
198
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000199void
200SBDebugger::SetAsync (bool b)
201{
Greg Clayton66111032010-06-23 01:19:29 +0000202 if (m_opaque_sp)
203 m_opaque_sp->SetAsyncExecution(b);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000204}
205
Jim Inghame64f0dc2011-09-13 23:25:31 +0000206bool
207SBDebugger::GetAsync ()
208{
209 if (m_opaque_sp)
210 return m_opaque_sp->GetAsyncExecution();
211 else
212 return false;
213}
214
Greg Clayton6eee5aa2010-10-11 01:05:37 +0000215void
216SBDebugger::SkipLLDBInitFiles (bool b)
217{
218 if (m_opaque_sp)
219 m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles (b);
220}
221
Jim Ingham16e0c682011-08-12 23:34:31 +0000222void
223SBDebugger::SkipAppInitFiles (bool b)
224{
225 if (m_opaque_sp)
226 m_opaque_sp->GetCommandInterpreter().SkipAppInitFiles (b);
227}
228
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000229// Shouldn't really be settable after initialization as this could cause lots of problems; don't want users
230// trying to switch modes in the middle of a debugging session.
231void
232SBDebugger::SetInputFileHandle (FILE *fh, bool transfer_ownership)
233{
Greg Clayton5160ce52013-03-27 23:08:40 +0000234 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000235
236 if (log)
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000237 log->Printf ("SBDebugger(%p)::SetInputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
238 fh, transfer_ownership);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000239
Greg Clayton66111032010-06-23 01:19:29 +0000240 if (m_opaque_sp)
241 m_opaque_sp->SetInputFileHandle (fh, transfer_ownership);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000242}
243
244void
245SBDebugger::SetOutputFileHandle (FILE *fh, bool transfer_ownership)
246{
Greg Clayton5160ce52013-03-27 23:08:40 +0000247 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000248
249
250 if (log)
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000251 log->Printf ("SBDebugger(%p)::SetOutputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
252 fh, transfer_ownership);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000253
Greg Clayton66111032010-06-23 01:19:29 +0000254 if (m_opaque_sp)
255 m_opaque_sp->SetOutputFileHandle (fh, transfer_ownership);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000256}
257
258void
259SBDebugger::SetErrorFileHandle (FILE *fh, bool transfer_ownership)
260{
Greg Clayton5160ce52013-03-27 23:08:40 +0000261 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000262
263
264 if (log)
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000265 log->Printf ("SBDebugger(%p)::SetErrorFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
266 fh, transfer_ownership);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000267
Greg Clayton66111032010-06-23 01:19:29 +0000268 if (m_opaque_sp)
269 m_opaque_sp->SetErrorFileHandle (fh, transfer_ownership);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000270}
271
272FILE *
273SBDebugger::GetInputFileHandle ()
274{
Greg Clayton66111032010-06-23 01:19:29 +0000275 if (m_opaque_sp)
Greg Clayton51b1e2d2011-02-09 01:08:52 +0000276 return m_opaque_sp->GetInputFile().GetStream();
Greg Clayton66111032010-06-23 01:19:29 +0000277 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000278}
279
280FILE *
281SBDebugger::GetOutputFileHandle ()
282{
Greg Clayton66111032010-06-23 01:19:29 +0000283 if (m_opaque_sp)
Greg Clayton51b1e2d2011-02-09 01:08:52 +0000284 return m_opaque_sp->GetOutputFile().GetStream();
Greg Clayton66111032010-06-23 01:19:29 +0000285 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000286}
287
288FILE *
289SBDebugger::GetErrorFileHandle ()
290{
Greg Clayton66111032010-06-23 01:19:29 +0000291 if (m_opaque_sp)
Greg Clayton51b1e2d2011-02-09 01:08:52 +0000292 return m_opaque_sp->GetErrorFile().GetStream();
Greg Clayton66111032010-06-23 01:19:29 +0000293 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000294}
295
Jim Inghamc5917d92012-11-30 20:23:19 +0000296void
297SBDebugger::SaveInputTerminalState()
298{
299 if (m_opaque_sp)
300 m_opaque_sp->SaveInputTerminalState();
301}
302
303void
304SBDebugger::RestoreInputTerminalState()
305{
306 if (m_opaque_sp)
307 m_opaque_sp->RestoreInputTerminalState();
308
309}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000310SBCommandInterpreter
311SBDebugger::GetCommandInterpreter ()
312{
Greg Clayton5160ce52013-03-27 23:08:40 +0000313 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000314
Greg Clayton66111032010-06-23 01:19:29 +0000315 SBCommandInterpreter sb_interpreter;
316 if (m_opaque_sp)
317 sb_interpreter.reset (&m_opaque_sp->GetCommandInterpreter());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000318
Caroline Tice750cd172010-10-26 23:49:36 +0000319 if (log)
Greg Clayton93aa84e2010-10-29 04:59:35 +0000320 log->Printf ("SBDebugger(%p)::GetCommandInterpreter () => SBCommandInterpreter(%p)",
Caroline Tice750cd172010-10-26 23:49:36 +0000321 m_opaque_sp.get(), sb_interpreter.get());
322
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000323 return sb_interpreter;
324}
325
326void
327SBDebugger::HandleCommand (const char *command)
328{
Greg Clayton66111032010-06-23 01:19:29 +0000329 if (m_opaque_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000330 {
Greg Claytonaf67cec2010-12-20 20:49:23 +0000331 TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
332 Mutex::Locker api_locker;
333 if (target_sp)
Jim Ingham10ebffa2012-05-04 23:02:50 +0000334 api_locker.Lock(target_sp->GetAPIMutex());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000335
Greg Clayton66111032010-06-23 01:19:29 +0000336 SBCommandInterpreter sb_interpreter(GetCommandInterpreter ());
337 SBCommandReturnObject result;
338
339 sb_interpreter.HandleCommand (command, result, false);
340
341 if (GetErrorFileHandle() != NULL)
342 result.PutError (GetErrorFileHandle());
343 if (GetOutputFileHandle() != NULL)
344 result.PutOutput (GetOutputFileHandle());
345
346 if (m_opaque_sp->GetAsyncExecution() == false)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000347 {
Greg Clayton66111032010-06-23 01:19:29 +0000348 SBProcess process(GetCommandInterpreter().GetProcess ());
Greg Claytonb9556ac2012-01-30 07:41:31 +0000349 ProcessSP process_sp (process.GetSP());
350 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000351 {
Greg Clayton66111032010-06-23 01:19:29 +0000352 EventSP event_sp;
353 Listener &lldb_listener = m_opaque_sp->GetListener();
Greg Claytonb9556ac2012-01-30 07:41:31 +0000354 while (lldb_listener.GetNextEventForBroadcaster (process_sp.get(), event_sp))
Greg Clayton66111032010-06-23 01:19:29 +0000355 {
356 SBEvent event(event_sp);
357 HandleProcessEvent (process, event, GetOutputFileHandle(), GetErrorFileHandle());
358 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000359 }
360 }
361 }
362}
363
364SBListener
365SBDebugger::GetListener ()
366{
Greg Clayton5160ce52013-03-27 23:08:40 +0000367 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000368
Greg Clayton66111032010-06-23 01:19:29 +0000369 SBListener sb_listener;
370 if (m_opaque_sp)
371 sb_listener.reset(&m_opaque_sp->GetListener(), false);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000372
Caroline Tice750cd172010-10-26 23:49:36 +0000373 if (log)
Greg Clayton93aa84e2010-10-29 04:59:35 +0000374 log->Printf ("SBDebugger(%p)::GetListener () => SBListener(%p)", m_opaque_sp.get(),
Caroline Tice750cd172010-10-26 23:49:36 +0000375 sb_listener.get());
376
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000377 return sb_listener;
378}
379
380void
381SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, FILE *out, FILE *err)
382{
Greg Claytonaf67cec2010-12-20 20:49:23 +0000383 if (!process.IsValid())
384 return;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000385
Greg Claytonb9556ac2012-01-30 07:41:31 +0000386 TargetSP target_sp (process.GetTarget().GetSP());
387 if (!target_sp)
388 return;
389
Greg Claytonaf67cec2010-12-20 20:49:23 +0000390 const uint32_t event_type = event.GetType();
391 char stdio_buffer[1024];
392 size_t len;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000393
Greg Claytonb9556ac2012-01-30 07:41:31 +0000394 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000395
396 if (event_type & (Process::eBroadcastBitSTDOUT | Process::eBroadcastBitStateChanged))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000397 {
Greg Claytonaf67cec2010-12-20 20:49:23 +0000398 // Drain stdout when we stop just in case we have any bytes
399 while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
400 if (out != NULL)
401 ::fwrite (stdio_buffer, 1, len, out);
402 }
403
404 if (event_type & (Process::eBroadcastBitSTDERR | Process::eBroadcastBitStateChanged))
405 {
406 // Drain stderr when we stop just in case we have any bytes
407 while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
408 if (err != NULL)
409 ::fwrite (stdio_buffer, 1, len, err);
410 }
411
412 if (event_type & Process::eBroadcastBitStateChanged)
413 {
414 StateType event_state = SBProcess::GetStateFromEvent (event);
415
416 if (event_state == eStateInvalid)
417 return;
418
419 bool is_stopped = StateIsStoppedState (event_state);
420 if (!is_stopped)
421 process.ReportEventState (event, out);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000422 }
423}
424
Jim Inghame37d6052011-09-13 00:29:56 +0000425SBSourceManager
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000426SBDebugger::GetSourceManager ()
427{
Jim Inghame37d6052011-09-13 00:29:56 +0000428 SBSourceManager sb_source_manager (*this);
429 return sb_source_manager;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000430}
431
432
433bool
434SBDebugger::GetDefaultArchitecture (char *arch_name, size_t arch_name_len)
435{
436 if (arch_name && arch_name_len)
437 {
Greg Clayton431ce672011-04-18 23:15:17 +0000438 ArchSpec default_arch = Target::GetDefaultArchitecture ();
Caroline Ticedaccaa92010-09-20 20:44:43 +0000439
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000440 if (default_arch.IsValid())
441 {
Greg Clayton431ce672011-04-18 23:15:17 +0000442 const std::string &triple_str = default_arch.GetTriple().str();
443 if (!triple_str.empty())
444 ::snprintf (arch_name, arch_name_len, "%s", triple_str.c_str());
445 else
446 ::snprintf (arch_name, arch_name_len, "%s", default_arch.GetArchitectureName());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000447 return true;
448 }
449 }
450 if (arch_name && arch_name_len)
451 arch_name[0] = '\0';
452 return false;
453}
454
455
456bool
457SBDebugger::SetDefaultArchitecture (const char *arch_name)
458{
459 if (arch_name)
460 {
Greg Clayton70512312012-05-08 01:45:38 +0000461 ArchSpec arch (arch_name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000462 if (arch.IsValid())
463 {
Greg Clayton431ce672011-04-18 23:15:17 +0000464 Target::SetDefaultArchitecture (arch);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000465 return true;
466 }
467 }
468 return false;
469}
470
471ScriptLanguage
472SBDebugger::GetScriptingLanguage (const char *script_language_name)
473{
Greg Claytonaf67cec2010-12-20 20:49:23 +0000474
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000475 return Args::StringToScriptLanguage (script_language_name,
476 eScriptLanguageDefault,
477 NULL);
478}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000479
480const char *
481SBDebugger::GetVersionString ()
482{
Greg Clayton431ce672011-04-18 23:15:17 +0000483 return GetVersion();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000484}
485
486const char *
Greg Clayton431ce672011-04-18 23:15:17 +0000487SBDebugger::StateAsCString (StateType state)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000488{
Caroline Ticec2bbb492011-04-25 22:05:51 +0000489 return lldb_private::StateAsCString (state);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000490}
491
492bool
Greg Clayton431ce672011-04-18 23:15:17 +0000493SBDebugger::StateIsRunningState (StateType state)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000494{
Greg Clayton5160ce52013-03-27 23:08:40 +0000495 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000496
Caroline Ticec2bbb492011-04-25 22:05:51 +0000497 const bool result = lldb_private::StateIsRunningState (state);
Greg Clayton48381312010-10-30 04:51:46 +0000498 if (log)
499 log->Printf ("SBDebugger::StateIsRunningState (state=%s) => %i",
Greg Clayton431ce672011-04-18 23:15:17 +0000500 StateAsCString (state), result);
Greg Clayton48381312010-10-30 04:51:46 +0000501
502 return result;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000503}
504
505bool
Greg Clayton431ce672011-04-18 23:15:17 +0000506SBDebugger::StateIsStoppedState (StateType state)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000507{
Greg Clayton5160ce52013-03-27 23:08:40 +0000508 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000509
Greg Clayton2637f822011-11-17 01:23:07 +0000510 const bool result = lldb_private::StateIsStoppedState (state, false);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000511 if (log)
Greg Clayton48381312010-10-30 04:51:46 +0000512 log->Printf ("SBDebugger::StateIsStoppedState (state=%s) => %i",
Greg Clayton431ce672011-04-18 23:15:17 +0000513 StateAsCString (state), result);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000514
Greg Clayton48381312010-10-30 04:51:46 +0000515 return result;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000516}
517
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000518lldb::SBTarget
519SBDebugger::CreateTarget (const char *filename,
520 const char *target_triple,
521 const char *platform_name,
522 bool add_dependent_modules,
523 lldb::SBError& sb_error)
524{
525 SBTarget sb_target;
Greg Claytonb9556ac2012-01-30 07:41:31 +0000526 TargetSP target_sp;
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000527 if (m_opaque_sp)
528 {
529 sb_error.Clear();
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000530 OptionGroupPlatform platform_options (false);
531 platform_options.SetPlatformName (platform_name);
532
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000533 sb_error.ref() = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
Greg Claytona0ca6602012-10-18 16:33:33 +0000534 filename,
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000535 target_triple,
536 add_dependent_modules,
537 &platform_options,
538 target_sp);
539
540 if (sb_error.Success())
Greg Claytonb9556ac2012-01-30 07:41:31 +0000541 sb_target.SetSP (target_sp);
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000542 }
543 else
544 {
545 sb_error.SetErrorString("invalid target");
546 }
547
Greg Clayton5160ce52013-03-27 23:08:40 +0000548 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000549 if (log)
550 {
551 log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\", triple=%s, platform_name=%s, add_dependent_modules=%u, error=%s) => SBTarget(%p)",
552 m_opaque_sp.get(),
553 filename,
554 target_triple,
555 platform_name,
556 add_dependent_modules,
557 sb_error.GetCString(),
Greg Claytonb9556ac2012-01-30 07:41:31 +0000558 target_sp.get());
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000559 }
560
561 return sb_target;
562}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000563
564SBTarget
565SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename,
566 const char *target_triple)
567{
Greg Claytonb9556ac2012-01-30 07:41:31 +0000568 SBTarget sb_target;
569 TargetSP target_sp;
Greg Clayton66111032010-06-23 01:19:29 +0000570 if (m_opaque_sp)
571 {
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000572 const bool add_dependent_modules = true;
573 Error error (m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
Greg Claytona0ca6602012-10-18 16:33:33 +0000574 filename,
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000575 target_triple,
576 add_dependent_modules,
577 NULL,
578 target_sp));
Greg Claytonb9556ac2012-01-30 07:41:31 +0000579 sb_target.SetSP (target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000580 }
Greg Clayton48381312010-10-30 04:51:46 +0000581
Greg Clayton5160ce52013-03-27 23:08:40 +0000582 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000583 if (log)
584 {
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000585 log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndTargetTriple (filename=\"%s\", triple=%s) => SBTarget(%p)",
Greg Claytonb9556ac2012-01-30 07:41:31 +0000586 m_opaque_sp.get(), filename, target_triple, target_sp.get());
Greg Clayton48381312010-10-30 04:51:46 +0000587 }
588
Greg Claytonb9556ac2012-01-30 07:41:31 +0000589 return sb_target;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000590}
591
592SBTarget
Greg Clayton64195a22011-02-23 00:35:02 +0000593SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *arch_cstr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000594{
Greg Clayton5160ce52013-03-27 23:08:40 +0000595 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000596
Greg Claytonb9556ac2012-01-30 07:41:31 +0000597 SBTarget sb_target;
598 TargetSP target_sp;
Greg Clayton66111032010-06-23 01:19:29 +0000599 if (m_opaque_sp)
600 {
Greg Clayton66111032010-06-23 01:19:29 +0000601 Error error;
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000602 const bool add_dependent_modules = true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000603
Greg Claytona0ca6602012-10-18 16:33:33 +0000604 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
605 filename,
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000606 arch_cstr,
607 add_dependent_modules,
608 NULL,
609 target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000610
611 if (error.Success())
612 {
Jim Ingham2976d002010-08-26 21:32:51 +0000613 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Claytonb9556ac2012-01-30 07:41:31 +0000614 sb_target.SetSP (target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000615 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000616 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000617
618 if (log)
619 {
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000620 log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndArch (filename=\"%s\", arch=%s) => SBTarget(%p)",
Greg Claytonb9556ac2012-01-30 07:41:31 +0000621 m_opaque_sp.get(), filename, arch_cstr, target_sp.get());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000622 }
623
Greg Claytonb9556ac2012-01-30 07:41:31 +0000624 return sb_target;
Greg Clayton66111032010-06-23 01:19:29 +0000625}
626
627SBTarget
628SBDebugger::CreateTarget (const char *filename)
629{
Greg Claytonb9556ac2012-01-30 07:41:31 +0000630 SBTarget sb_target;
631 TargetSP target_sp;
Greg Clayton66111032010-06-23 01:19:29 +0000632 if (m_opaque_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000633 {
Greg Clayton431ce672011-04-18 23:15:17 +0000634 ArchSpec arch = Target::GetDefaultArchitecture ();
Greg Clayton66111032010-06-23 01:19:29 +0000635 Error error;
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000636 const bool add_dependent_modules = true;
Greg Clayton66111032010-06-23 01:19:29 +0000637
Greg Claytonb3a40ba2012-03-20 18:34:04 +0000638 PlatformSP platform_sp(m_opaque_sp->GetPlatformList().GetSelectedPlatform());
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000639 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
Greg Claytona0ca6602012-10-18 16:33:33 +0000640 filename,
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000641 arch,
642 add_dependent_modules,
Greg Claytonb3a40ba2012-03-20 18:34:04 +0000643 platform_sp,
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000644 target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000645
646 if (error.Success())
647 {
Jim Ingham2976d002010-08-26 21:32:51 +0000648 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Claytonb9556ac2012-01-30 07:41:31 +0000649 sb_target.SetSP (target_sp);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000650 }
651 }
Greg Clayton5160ce52013-03-27 23:08:40 +0000652 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000653 if (log)
654 {
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000655 log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)",
Greg Claytonb9556ac2012-01-30 07:41:31 +0000656 m_opaque_sp.get(), filename, target_sp.get());
Greg Clayton48381312010-10-30 04:51:46 +0000657 }
Greg Claytonb9556ac2012-01-30 07:41:31 +0000658 return sb_target;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000659}
660
Johnny Chen3794ad92011-06-15 21:24:24 +0000661bool
662SBDebugger::DeleteTarget (lldb::SBTarget &target)
663{
664 bool result = false;
Greg Claytonb9556ac2012-01-30 07:41:31 +0000665 if (m_opaque_sp)
Johnny Chen3794ad92011-06-15 21:24:24 +0000666 {
Greg Claytonb9556ac2012-01-30 07:41:31 +0000667 TargetSP target_sp(target.GetSP());
668 if (target_sp)
669 {
670 // No need to lock, the target list is thread safe
671 result = m_opaque_sp->GetTargetList().DeleteTarget (target_sp);
672 target_sp->Destroy();
673 target.Clear();
Greg Clayton0cd70862012-04-09 20:22:01 +0000674 const bool mandatory = true;
675 ModuleList::RemoveOrphanSharedModules(mandatory);
Greg Claytonb9556ac2012-01-30 07:41:31 +0000676 }
Johnny Chen3794ad92011-06-15 21:24:24 +0000677 }
678
Greg Clayton5160ce52013-03-27 23:08:40 +0000679 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Johnny Chen3794ad92011-06-15 21:24:24 +0000680 if (log)
681 {
682 log->Printf ("SBDebugger(%p)::DeleteTarget (SBTarget(%p)) => %i", m_opaque_sp.get(), target.m_opaque_sp.get(), result);
683 }
684
685 return result;
686}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000687SBTarget
688SBDebugger::GetTargetAtIndex (uint32_t idx)
689{
Greg Clayton66111032010-06-23 01:19:29 +0000690 SBTarget sb_target;
691 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000692 {
693 // No need to lock, the target list is thread safe
Greg Claytonb9556ac2012-01-30 07:41:31 +0000694 sb_target.SetSP (m_opaque_sp->GetTargetList().GetTargetAtIndex (idx));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000695 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000696 return sb_target;
697}
698
Jim Ingham8499e1a2012-05-08 23:06:07 +0000699uint32_t
700SBDebugger::GetIndexOfTarget (lldb::SBTarget target)
701{
702
703 lldb::TargetSP target_sp = target.GetSP();
704 if (!target_sp)
705 return UINT32_MAX;
706
707 if (!m_opaque_sp)
708 return UINT32_MAX;
709
710 return m_opaque_sp->GetTargetList().GetIndexOfTarget (target.GetSP());
711}
712
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000713SBTarget
714SBDebugger::FindTargetWithProcessID (pid_t pid)
715{
Greg Clayton66111032010-06-23 01:19:29 +0000716 SBTarget sb_target;
717 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000718 {
719 // No need to lock, the target list is thread safe
Greg Claytonb9556ac2012-01-30 07:41:31 +0000720 sb_target.SetSP (m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000721 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000722 return sb_target;
723}
724
725SBTarget
726SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name)
727{
Greg Clayton66111032010-06-23 01:19:29 +0000728 SBTarget sb_target;
729 if (m_opaque_sp && filename && filename[0])
730 {
Greg Claytonaf67cec2010-12-20 20:49:23 +0000731 // No need to lock, the target list is thread safe
Greg Claytoneb0103f2011-04-07 22:46:35 +0000732 ArchSpec arch (arch_name, m_opaque_sp->GetPlatformList().GetSelectedPlatform().get());
Greg Clayton274060b2010-10-20 20:54:39 +0000733 TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename, false), arch_name ? &arch : NULL));
Greg Claytonb9556ac2012-01-30 07:41:31 +0000734 sb_target.SetSP (target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000735 }
736 return sb_target;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000737}
738
739SBTarget
Greg Clayton431ce672011-04-18 23:15:17 +0000740SBDebugger::FindTargetWithLLDBProcess (const ProcessSP &process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000741{
Greg Clayton66111032010-06-23 01:19:29 +0000742 SBTarget sb_target;
743 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000744 {
745 // No need to lock, the target list is thread safe
Greg Claytonb9556ac2012-01-30 07:41:31 +0000746 sb_target.SetSP (m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get()));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000747 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000748 return sb_target;
749}
750
751
752uint32_t
753SBDebugger::GetNumTargets ()
754{
Greg Clayton66111032010-06-23 01:19:29 +0000755 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000756 {
757 // No need to lock, the target list is thread safe
Greg Clayton66111032010-06-23 01:19:29 +0000758 return m_opaque_sp->GetTargetList().GetNumTargets ();
Greg Claytonaf67cec2010-12-20 20:49:23 +0000759 }
Greg Clayton66111032010-06-23 01:19:29 +0000760 return 0;
761}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000762
763SBTarget
Jim Ingham2976d002010-08-26 21:32:51 +0000764SBDebugger::GetSelectedTarget ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000765{
Greg Clayton5160ce52013-03-27 23:08:40 +0000766 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000767
Greg Clayton66111032010-06-23 01:19:29 +0000768 SBTarget sb_target;
Greg Claytonb9556ac2012-01-30 07:41:31 +0000769 TargetSP target_sp;
Greg Clayton66111032010-06-23 01:19:29 +0000770 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000771 {
772 // No need to lock, the target list is thread safe
Greg Claytonb9556ac2012-01-30 07:41:31 +0000773 target_sp = m_opaque_sp->GetTargetList().GetSelectedTarget ();
774 sb_target.SetSP (target_sp);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000775 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000776
777 if (log)
778 {
779 SBStream sstr;
Greg Clayton431ce672011-04-18 23:15:17 +0000780 sb_target.GetDescription (sstr, eDescriptionLevelBrief);
Greg Clayton93aa84e2010-10-29 04:59:35 +0000781 log->Printf ("SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s", m_opaque_sp.get(),
Greg Claytonb9556ac2012-01-30 07:41:31 +0000782 target_sp.get(), sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000783 }
784
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000785 return sb_target;
786}
787
788void
Jim Inghame64f0dc2011-09-13 23:25:31 +0000789SBDebugger::SetSelectedTarget (SBTarget &sb_target)
790{
Greg Clayton5160ce52013-03-27 23:08:40 +0000791 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Inghame64f0dc2011-09-13 23:25:31 +0000792
Greg Claytonb9556ac2012-01-30 07:41:31 +0000793 TargetSP target_sp (sb_target.GetSP());
Jim Inghame64f0dc2011-09-13 23:25:31 +0000794 if (m_opaque_sp)
795 {
Greg Claytonb9556ac2012-01-30 07:41:31 +0000796 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Jim Inghame64f0dc2011-09-13 23:25:31 +0000797 }
798 if (log)
799 {
800 SBStream sstr;
801 sb_target.GetDescription (sstr, eDescriptionLevelBrief);
802 log->Printf ("SBDebugger(%p)::SetSelectedTarget () => SBTarget(%p): %s", m_opaque_sp.get(),
Greg Claytonb9556ac2012-01-30 07:41:31 +0000803 target_sp.get(), sstr.GetData());
Jim Inghame64f0dc2011-09-13 23:25:31 +0000804 }
805}
806
807void
Enrico Granatac30a73a2012-09-06 22:02:28 +0000808SBDebugger::DispatchInput (void* baton, const void *data, size_t data_len)
Enrico Granata6b09d422012-09-06 21:58:25 +0000809{
810 DispatchInput (data,data_len);
811}
812
813void
Filipe Cabecinhasc3019992012-08-20 16:21:04 +0000814SBDebugger::DispatchInput (const void *data, size_t data_len)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000815{
Greg Clayton5160ce52013-03-27 23:08:40 +0000816 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000817
818 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000819 log->Printf ("SBDebugger(%p)::DispatchInput (data=\"%.*s\", size_t=%" PRIu64 ")",
Greg Clayton43e0af02012-09-18 18:04:04 +0000820 m_opaque_sp.get(),
821 (int) data_len,
822 (const char *) data,
823 (uint64_t)data_len);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000824
Greg Clayton66111032010-06-23 01:19:29 +0000825 if (m_opaque_sp)
826 m_opaque_sp->DispatchInput ((const char *) data, data_len);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000827}
828
829void
Caroline Ticeefed6132010-11-19 20:47:54 +0000830SBDebugger::DispatchInputInterrupt ()
831{
832 if (m_opaque_sp)
833 m_opaque_sp->DispatchInputInterrupt ();
834}
835
836void
837SBDebugger::DispatchInputEndOfFile ()
838{
839 if (m_opaque_sp)
840 m_opaque_sp->DispatchInputEndOfFile ();
841}
Caroline Tice9088b062011-05-09 23:06:58 +0000842
843bool
844SBDebugger::InputReaderIsTopReader (const lldb::SBInputReader &reader)
845{
Greg Clayton5160ce52013-03-27 23:08:40 +0000846 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice9088b062011-05-09 23:06:58 +0000847
848 if (log)
849 log->Printf ("SBDebugger(%p)::InputReaderIsTopReader (SBInputReader(%p))", m_opaque_sp.get(), &reader);
850
851 if (m_opaque_sp && reader.IsValid())
852 {
853 InputReaderSP reader_sp (*reader);
854 return m_opaque_sp->InputReaderIsTopReader (reader_sp);
855 }
856
857 return false;
858}
859
Caroline Ticeefed6132010-11-19 20:47:54 +0000860
861void
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000862SBDebugger::PushInputReader (SBInputReader &reader)
863{
Greg Clayton5160ce52013-03-27 23:08:40 +0000864 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000865
866 if (log)
Greg Clayton93aa84e2010-10-29 04:59:35 +0000867 log->Printf ("SBDebugger(%p)::PushInputReader (SBInputReader(%p))", m_opaque_sp.get(), &reader);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000868
Greg Clayton66111032010-06-23 01:19:29 +0000869 if (m_opaque_sp && reader.IsValid())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000870 {
Greg Claytonaf67cec2010-12-20 20:49:23 +0000871 TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
872 Mutex::Locker api_locker;
873 if (target_sp)
Jim Ingham10ebffa2012-05-04 23:02:50 +0000874 api_locker.Lock(target_sp->GetAPIMutex());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000875 InputReaderSP reader_sp(*reader);
Greg Clayton66111032010-06-23 01:19:29 +0000876 m_opaque_sp->PushInputReader (reader_sp);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000877 }
878}
Greg Clayton66111032010-06-23 01:19:29 +0000879
880void
Caroline Tice969ed3d2011-05-02 20:41:46 +0000881SBDebugger::NotifyTopInputReader (InputReaderAction notification)
882{
Greg Clayton5160ce52013-03-27 23:08:40 +0000883 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice969ed3d2011-05-02 20:41:46 +0000884
885 if (log)
886 log->Printf ("SBDebugger(%p)::NotifyTopInputReader (%d)", m_opaque_sp.get(), notification);
887
888 if (m_opaque_sp)
889 m_opaque_sp->NotifyTopInputReader (notification);
890}
891
892void
Greg Clayton431ce672011-04-18 23:15:17 +0000893SBDebugger::reset (const DebuggerSP &debugger_sp)
Greg Clayton66111032010-06-23 01:19:29 +0000894{
895 m_opaque_sp = debugger_sp;
896}
897
898Debugger *
899SBDebugger::get () const
900{
901 return m_opaque_sp.get();
902}
903
904Debugger &
905SBDebugger::ref () const
906{
907 assert (m_opaque_sp.get());
908 return *m_opaque_sp;
909}
910
Greg Clayton9a377662011-10-01 02:59:24 +0000911const lldb::DebuggerSP &
912SBDebugger::get_sp () const
913{
914 return m_opaque_sp;
915}
Greg Clayton66111032010-06-23 01:19:29 +0000916
Caroline Ticeebc1bb22010-06-30 16:22:25 +0000917SBDebugger
918SBDebugger::FindDebuggerWithID (int id)
919{
Greg Claytonaf67cec2010-12-20 20:49:23 +0000920 // No need to lock, the debugger list is thread safe
Caroline Ticeebc1bb22010-06-30 16:22:25 +0000921 SBDebugger sb_debugger;
Greg Clayton431ce672011-04-18 23:15:17 +0000922 DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id);
Caroline Ticeebc1bb22010-06-30 16:22:25 +0000923 if (debugger_sp)
924 sb_debugger.reset (debugger_sp);
925 return sb_debugger;
926}
Jim Inghame40e4212010-08-30 19:44:40 +0000927
Caroline Ticedd759852010-09-09 17:45:09 +0000928const char *
929SBDebugger::GetInstanceName()
930{
Greg Clayton6920b522012-08-22 18:39:03 +0000931 if (m_opaque_sp)
932 return m_opaque_sp->GetInstanceName().AsCString();
933 else
Caroline Ticedd759852010-09-09 17:45:09 +0000934 return NULL;
935}
936
Caroline Tice3df9a8d2010-09-04 00:03:46 +0000937SBError
Caroline Ticedd759852010-09-09 17:45:09 +0000938SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name)
Caroline Tice3df9a8d2010-09-04 00:03:46 +0000939{
Greg Clayton6920b522012-08-22 18:39:03 +0000940 SBError sb_error;
941 DebuggerSP debugger_sp(Debugger::FindDebuggerWithInstanceName (ConstString(debugger_instance_name)));
942 Error error;
943 if (debugger_sp)
944 {
945 ExecutionContext exe_ctx (debugger_sp->GetCommandInterpreter().GetExecutionContext());
946 error = debugger_sp->SetPropertyValue (&exe_ctx,
947 eVarSetOperationAssign,
948 var_name,
949 value);
950 }
951 else
952 {
953 error.SetErrorStringWithFormat ("invalid debugger instance name '%s'", debugger_instance_name);
954 }
955 if (error.Fail())
956 sb_error.SetError(error);
957 return sb_error;
Caroline Tice3df9a8d2010-09-04 00:03:46 +0000958}
959
Greg Clayton431ce672011-04-18 23:15:17 +0000960SBStringList
Caroline Ticedd759852010-09-09 17:45:09 +0000961SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name)
Caroline Tice3df9a8d2010-09-04 00:03:46 +0000962{
963 SBStringList ret_value;
Greg Clayton6920b522012-08-22 18:39:03 +0000964 DebuggerSP debugger_sp(Debugger::FindDebuggerWithInstanceName (ConstString(debugger_instance_name)));
965 Error error;
966 if (debugger_sp)
967 {
968 ExecutionContext exe_ctx (debugger_sp->GetCommandInterpreter().GetExecutionContext());
969 lldb::OptionValueSP value_sp (debugger_sp->GetPropertyValue (&exe_ctx,
970 var_name,
971 false,
972 error));
973 if (value_sp)
974 {
975 StreamString value_strm;
976 value_sp->DumpValue (&exe_ctx, value_strm, OptionValue::eDumpOptionValue);
977 const std::string &value_str = value_strm.GetString();
978 if (!value_str.empty())
979 {
980 StringList string_list;
981 string_list.SplitIntoLines(value_str.c_str(), value_str.size());
982 return SBStringList(&string_list);
983 }
984 }
985 }
986 return SBStringList();
Caroline Tice3df9a8d2010-09-04 00:03:46 +0000987}
988
Greg Claytona7015092010-09-18 01:14:36 +0000989uint32_t
990SBDebugger::GetTerminalWidth () const
991{
992 if (m_opaque_sp)
993 return m_opaque_sp->GetTerminalWidth ();
994 return 0;
995}
996
997void
998SBDebugger::SetTerminalWidth (uint32_t term_width)
999{
1000 if (m_opaque_sp)
1001 m_opaque_sp->SetTerminalWidth (term_width);
1002}
1003
1004const char *
1005SBDebugger::GetPrompt() const
1006{
Greg Clayton5160ce52013-03-27 23:08:40 +00001007 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001008
1009 if (log)
Greg Claytoncfd1ace2010-10-31 03:01:06 +00001010 log->Printf ("SBDebugger(%p)::GetPrompt () => \"%s\"", m_opaque_sp.get(),
Caroline Tice750cd172010-10-26 23:49:36 +00001011 (m_opaque_sp ? m_opaque_sp->GetPrompt() : ""));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001012
Greg Claytona7015092010-09-18 01:14:36 +00001013 if (m_opaque_sp)
1014 return m_opaque_sp->GetPrompt ();
1015 return 0;
1016}
1017
1018void
1019SBDebugger::SetPrompt (const char *prompt)
1020{
1021 if (m_opaque_sp)
1022 m_opaque_sp->SetPrompt (prompt);
1023}
1024
1025
Greg Clayton431ce672011-04-18 23:15:17 +00001026ScriptLanguage
Greg Claytona7015092010-09-18 01:14:36 +00001027SBDebugger::GetScriptLanguage() const
1028{
1029 if (m_opaque_sp)
1030 return m_opaque_sp->GetScriptLanguage ();
1031 return eScriptLanguageNone;
1032}
1033
1034void
Greg Clayton431ce672011-04-18 23:15:17 +00001035SBDebugger::SetScriptLanguage (ScriptLanguage script_lang)
Greg Claytona7015092010-09-18 01:14:36 +00001036{
1037 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +00001038 {
Greg Claytona7015092010-09-18 01:14:36 +00001039 m_opaque_sp->SetScriptLanguage (script_lang);
Greg Claytonaf67cec2010-12-20 20:49:23 +00001040 }
Greg Claytona7015092010-09-18 01:14:36 +00001041}
1042
Jim Inghame40e4212010-08-30 19:44:40 +00001043bool
1044SBDebugger::SetUseExternalEditor (bool value)
1045{
1046 if (m_opaque_sp)
1047 return m_opaque_sp->SetUseExternalEditor (value);
Greg Claytonaf67cec2010-12-20 20:49:23 +00001048 return false;
Jim Inghame40e4212010-08-30 19:44:40 +00001049}
1050
1051bool
Caroline Ticedaccaa92010-09-20 20:44:43 +00001052SBDebugger::GetUseExternalEditor ()
Jim Inghame40e4212010-08-30 19:44:40 +00001053{
1054 if (m_opaque_sp)
Caroline Ticedaccaa92010-09-20 20:44:43 +00001055 return m_opaque_sp->GetUseExternalEditor ();
Greg Claytonaf67cec2010-12-20 20:49:23 +00001056 return false;
Jim Inghame40e4212010-08-30 19:44:40 +00001057}
1058
Caroline Ticedde9cff2010-09-20 05:20:02 +00001059bool
Michael Sartainc3ce7f272013-05-23 20:47:45 +00001060SBDebugger::SetUseColor (bool value)
1061{
1062 if (m_opaque_sp)
1063 return m_opaque_sp->SetUseColor (value);
1064 return false;
1065}
1066
1067bool
1068SBDebugger::GetUseColor () const
1069{
1070 if (m_opaque_sp)
1071 return m_opaque_sp->GetUseColor ();
1072 return false;
1073}
1074
1075bool
Caroline Ticedde9cff2010-09-20 05:20:02 +00001076SBDebugger::GetDescription (SBStream &description)
1077{
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001078 Stream &strm = description.ref();
1079
Caroline Ticedde9cff2010-09-20 05:20:02 +00001080 if (m_opaque_sp)
1081 {
1082 const char *name = m_opaque_sp->GetInstanceName().AsCString();
Greg Clayton431ce672011-04-18 23:15:17 +00001083 user_id_t id = m_opaque_sp->GetID();
Daniel Malead01b2952012-11-29 21:49:15 +00001084 strm.Printf ("Debugger (instance: \"%s\", id: %" PRIu64 ")", name, id);
Caroline Ticedde9cff2010-09-20 05:20:02 +00001085 }
1086 else
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001087 strm.PutCString ("No value");
Caroline Ticedde9cff2010-09-20 05:20:02 +00001088
1089 return true;
1090}
Caroline Ticeefed6132010-11-19 20:47:54 +00001091
Greg Clayton431ce672011-04-18 23:15:17 +00001092user_id_t
Caroline Ticeefed6132010-11-19 20:47:54 +00001093SBDebugger::GetID()
1094{
1095 if (m_opaque_sp)
1096 return m_opaque_sp->GetID();
1097 return LLDB_INVALID_UID;
1098}
Greg Clayton2289fa42011-04-30 01:09:13 +00001099
1100
1101SBError
1102SBDebugger::SetCurrentPlatform (const char *platform_name)
1103{
1104 SBError sb_error;
1105 if (m_opaque_sp)
1106 {
1107 PlatformSP platform_sp (Platform::Create (platform_name, sb_error.ref()));
1108
1109 if (platform_sp)
1110 {
1111 bool make_selected = true;
1112 m_opaque_sp->GetPlatformList().Append (platform_sp, make_selected);
1113 }
1114 }
1115 return sb_error;
1116}
1117
Greg Claytonfc3f0272011-05-29 04:06:55 +00001118bool
Greg Claytonf3dd93c2011-06-17 03:31:01 +00001119SBDebugger::SetCurrentPlatformSDKRoot (const char *sysroot)
1120{
1121 if (m_opaque_sp)
1122 {
1123 PlatformSP platform_sp (m_opaque_sp->GetPlatformList().GetSelectedPlatform());
1124
1125 if (platform_sp)
1126 {
1127 platform_sp->SetSDKRootDirectory (ConstString (sysroot));
1128 return true;
1129 }
1130 }
1131 return false;
1132}
1133
1134bool
Greg Claytonfc3f0272011-05-29 04:06:55 +00001135SBDebugger::GetCloseInputOnEOF () const
1136{
1137 if (m_opaque_sp)
1138 return m_opaque_sp->GetCloseInputOnEOF ();
1139 return false;
1140}
1141
1142void
1143SBDebugger::SetCloseInputOnEOF (bool b)
1144{
1145 if (m_opaque_sp)
1146 m_opaque_sp->SetCloseInputOnEOF (b);
1147}
Enrico Granata061858c2012-02-15 02:34:21 +00001148
1149SBTypeCategory
1150SBDebugger::GetCategory (const char* category_name)
1151{
1152 if (!category_name || *category_name == 0)
1153 return SBTypeCategory();
1154
1155 TypeCategoryImplSP category_sp;
1156
1157 if (DataVisualization::Categories::GetCategory(ConstString(category_name), category_sp, false))
1158 return SBTypeCategory(category_sp);
1159 else
1160 return SBTypeCategory();
1161}
1162
1163SBTypeCategory
1164SBDebugger::CreateCategory (const char* category_name)
1165{
1166 if (!category_name || *category_name == 0)
1167 return SBTypeCategory();
1168
1169 TypeCategoryImplSP category_sp;
1170
1171 if (DataVisualization::Categories::GetCategory(ConstString(category_name), category_sp, true))
1172 return SBTypeCategory(category_sp);
1173 else
1174 return SBTypeCategory();
1175}
1176
1177bool
1178SBDebugger::DeleteCategory (const char* category_name)
1179{
1180 if (!category_name || *category_name == 0)
1181 return false;
1182
1183 return DataVisualization::Categories::Delete(ConstString(category_name));
1184}
1185
1186uint32_t
1187SBDebugger::GetNumCategories()
1188{
1189 return DataVisualization::Categories::GetCount();
1190}
1191
1192SBTypeCategory
1193SBDebugger::GetCategoryAtIndex (uint32_t index)
1194{
1195 return SBTypeCategory(DataVisualization::Categories::GetCategoryAtIndex(index));
1196}
1197
1198SBTypeCategory
1199SBDebugger::GetDefaultCategory()
1200{
1201 return GetCategory("default");
1202}
1203
1204SBTypeFormat
1205SBDebugger::GetFormatForType (SBTypeNameSpecifier type_name)
1206{
1207 SBTypeCategory default_category_sb = GetDefaultCategory();
1208 if (default_category_sb.GetEnabled())
1209 return default_category_sb.GetFormatForType(type_name);
1210 return SBTypeFormat();
1211}
1212
Jason Molendacf7e2dc2012-02-21 05:33:55 +00001213#ifndef LLDB_DISABLE_PYTHON
Enrico Granata061858c2012-02-15 02:34:21 +00001214SBTypeSummary
1215SBDebugger::GetSummaryForType (SBTypeNameSpecifier type_name)
1216{
Enrico Granataa777dc22012-05-08 21:49:57 +00001217 if (type_name.IsValid() == false)
1218 return SBTypeSummary();
1219 return SBTypeSummary(DataVisualization::GetSummaryForType(type_name.GetSP()));
Enrico Granata061858c2012-02-15 02:34:21 +00001220}
Jason Molendacf7e2dc2012-02-21 05:33:55 +00001221#endif // LLDB_DISABLE_PYTHON
Enrico Granata061858c2012-02-15 02:34:21 +00001222
1223SBTypeFilter
1224SBDebugger::GetFilterForType (SBTypeNameSpecifier type_name)
1225{
Enrico Granataa777dc22012-05-08 21:49:57 +00001226 if (type_name.IsValid() == false)
1227 return SBTypeFilter();
1228 return SBTypeFilter(DataVisualization::GetFilterForType(type_name.GetSP()));
Enrico Granata061858c2012-02-15 02:34:21 +00001229}
1230
Jason Molendacf7e2dc2012-02-21 05:33:55 +00001231#ifndef LLDB_DISABLE_PYTHON
Enrico Granata061858c2012-02-15 02:34:21 +00001232SBTypeSynthetic
1233SBDebugger::GetSyntheticForType (SBTypeNameSpecifier type_name)
1234{
Enrico Granataa777dc22012-05-08 21:49:57 +00001235 if (type_name.IsValid() == false)
1236 return SBTypeSynthetic();
1237 return SBTypeSynthetic(DataVisualization::GetSyntheticForType(type_name.GetSP()));
Enrico Granata061858c2012-02-15 02:34:21 +00001238}
Jason Molendacf7e2dc2012-02-21 05:33:55 +00001239#endif // LLDB_DISABLE_PYTHON
Enrico Granata061858c2012-02-15 02:34:21 +00001240
Jim Ingham228063c2012-02-21 02:23:08 +00001241bool
1242SBDebugger::EnableLog (const char *channel, const char **categories)
1243{
1244 if (m_opaque_sp)
1245 {
1246 uint32_t log_options = LLDB_LOG_OPTION_PREPEND_TIMESTAMP | LLDB_LOG_OPTION_PREPEND_THREAD_NAME;
1247 StreamString errors;
1248 return m_opaque_sp->EnableLog (channel, categories, NULL, log_options, errors);
1249
1250 }
1251 else
1252 return false;
1253}
Jim Ingham4f02b222012-02-22 22:49:20 +00001254
1255void
1256SBDebugger::SetLoggingCallback (lldb::LogOutputCallback log_callback, void *baton)
1257{
1258 if (m_opaque_sp)
1259 {
1260 return m_opaque_sp->SetLoggingCallback (log_callback, baton);
1261 }
1262}
1263
1264