blob: 8d6887a6c28064945d89851d7c3b61966ead50e1 [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"
Caroline Tice3df9a8d2010-09-04 00:03:46 +000023#include "lldb/API/SBProcess.h"
24#include "lldb/API/SBSourceManager.h"
Caroline Ticedde9cff2010-09-20 05:20:02 +000025#include "lldb/API/SBStream.h"
Caroline Tice3df9a8d2010-09-04 00:03:46 +000026#include "lldb/API/SBStringList.h"
27#include "lldb/API/SBTarget.h"
28#include "lldb/API/SBThread.h"
Enrico Granata061858c2012-02-15 02:34:21 +000029#include "lldb/API/SBTypeCategory.h"
30#include "lldb/API/SBTypeFormat.h"
31#include "lldb/API/SBTypeFilter.h"
32#include "lldb/API/SBTypeNameSpecifier.h"
33#include "lldb/API/SBTypeSummary.h"
34#include "lldb/API/SBTypeSynthetic.h"
35
36
Greg Clayton6eee5aa2010-10-11 01:05:37 +000037#include "lldb/Core/Debugger.h"
38#include "lldb/Core/State.h"
Greg Clayton44d93782014-01-27 23:43:24 +000039#include "lldb/Core/StreamFile.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
Greg Clayton44d93782014-01-27 23:43:24 +000052SBInputReader::SBInputReader()
53{
54}
55SBInputReader::~SBInputReader()
56{
57}
58
59SBError
60SBInputReader::Initialize(lldb::SBDebugger& sb_debugger, unsigned long (*)(void*, lldb::SBInputReader*, lldb::InputReaderAction, char const*, unsigned long), void*, lldb::InputReaderGranularity, char const*, char const*, bool)
61{
62 return SBError();
63}
64
65void
66SBInputReader::SetIsDone(bool)
67{
68}
69bool
70SBInputReader::IsActive() const
71{
72 return false;
73}
74
Greg Clayton5fb8f792013-12-02 19:35:49 +000075static lldb::DynamicLibrarySP
76LoadPlugin (const lldb::DebuggerSP &debugger_sp, const FileSpec& spec, Error& error)
77{
78 lldb::DynamicLibrarySP dynlib_sp(new lldb_private::DynamicLibrary(spec));
79 if (dynlib_sp && dynlib_sp->IsValid())
80 {
81 typedef bool (*LLDBCommandPluginInit) (lldb::SBDebugger& debugger);
82
83 lldb::SBDebugger debugger_sb(debugger_sp);
84 // This calls the bool lldb::PluginInitialize(lldb::SBDebugger debugger) function.
85 // TODO: mangle this differently for your system - on OSX, the first underscore needs to be removed and the second one stays
86 LLDBCommandPluginInit init_func = dynlib_sp->GetSymbol<LLDBCommandPluginInit>("_ZN4lldb16PluginInitializeENS_10SBDebuggerE");
87 if (init_func)
88 {
89 if (init_func(debugger_sb))
90 return dynlib_sp;
91 else
92 error.SetErrorString("plug-in refused to load (lldb::PluginInitialize(lldb::SBDebugger) returned false)");
93 }
94 else
95 {
96 error.SetErrorString("plug-in is missing the required initialization: lldb::PluginInitialize(lldb::SBDebugger)");
97 }
98 }
99 else
100 {
101 if (spec.Exists())
102 error.SetErrorString("this file does not represent a loadable dylib");
103 else
104 error.SetErrorString("no such file");
105 }
106 return lldb::DynamicLibrarySP();
107}
108
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000109void
110SBDebugger::Initialize ()
111{
Greg Clayton5160ce52013-03-27 23:08:40 +0000112 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000113
114 if (log)
115 log->Printf ("SBDebugger::Initialize ()");
116
Greg Claytonfc36f7912011-03-22 01:14:58 +0000117 SBCommandInterpreter::InitializeSWIG ();
118
Greg Clayton5fb8f792013-12-02 19:35:49 +0000119 Debugger::Initialize(LoadPlugin);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000120}
121
122void
123SBDebugger::Terminate ()
124{
125 Debugger::Terminate();
126}
127
Greg Clayton48e42542010-07-30 20:12:55 +0000128void
129SBDebugger::Clear ()
130{
Greg Clayton5160ce52013-03-27 23:08:40 +0000131 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000132
133 if (log)
Greg Clayton93aa84e2010-10-29 04:59:35 +0000134 log->Printf ("SBDebugger(%p)::Clear ()", m_opaque_sp.get());
Caroline Tice3d6086f2010-12-20 18:35:50 +0000135
136 if (m_opaque_sp)
Greg Clayton44d93782014-01-27 23:43:24 +0000137 m_opaque_sp->ClearIOHandlers ();
Caroline Ticeceb6b132010-10-26 03:11:13 +0000138
Greg Clayton48e42542010-07-30 20:12:55 +0000139 m_opaque_sp.reset();
140}
141
Greg Clayton66111032010-06-23 01:19:29 +0000142SBDebugger
143SBDebugger::Create()
144{
Jim Ingham228063c2012-02-21 02:23:08 +0000145 return SBDebugger::Create(false, NULL, NULL);
Jim Ingham06942692011-08-13 00:22:20 +0000146}
147
148SBDebugger
149SBDebugger::Create(bool source_init_files)
150{
Jim Ingham228063c2012-02-21 02:23:08 +0000151 return SBDebugger::Create (source_init_files, NULL, NULL);
152}
153
154SBDebugger
155SBDebugger::Create(bool source_init_files, lldb::LogOutputCallback callback, void *baton)
156
157{
Greg Clayton5160ce52013-03-27 23:08:40 +0000158 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000159
Greg Clayton66111032010-06-23 01:19:29 +0000160 SBDebugger debugger;
Jim Ingham228063c2012-02-21 02:23:08 +0000161 debugger.reset(Debugger::CreateInstance(callback, baton));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000162
163 if (log)
164 {
165 SBStream sstr;
166 debugger.GetDescription (sstr);
Greg Clayton93aa84e2010-10-29 04:59:35 +0000167 log->Printf ("SBDebugger::Create () => SBDebugger(%p): %s", debugger.m_opaque_sp.get(), sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000168 }
169
Jim Ingham06942692011-08-13 00:22:20 +0000170 SBCommandInterpreter interp = debugger.GetCommandInterpreter();
171 if (source_init_files)
172 {
173 interp.get()->SkipLLDBInitFiles(false);
174 interp.get()->SkipAppInitFiles (false);
175 SBCommandReturnObject result;
176 interp.SourceInitFileInHomeDirectory(result);
177 }
178 else
179 {
180 interp.get()->SkipLLDBInitFiles(true);
181 interp.get()->SkipAppInitFiles (true);
182 }
Greg Clayton66111032010-06-23 01:19:29 +0000183 return debugger;
184}
185
Caroline Ticee02657b2011-01-22 01:02:07 +0000186void
187SBDebugger::Destroy (SBDebugger &debugger)
188{
Greg Clayton5160ce52013-03-27 23:08:40 +0000189 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticee02657b2011-01-22 01:02:07 +0000190
191 if (log)
192 {
193 SBStream sstr;
194 debugger.GetDescription (sstr);
195 log->Printf ("SBDebugger::Destroy () => SBDebugger(%p): %s", debugger.m_opaque_sp.get(), sstr.GetData());
196 }
197
198 Debugger::Destroy (debugger.m_opaque_sp);
199
200 if (debugger.m_opaque_sp.get() != NULL)
201 debugger.m_opaque_sp.reset();
202}
203
Greg Claytonf9322412011-12-15 04:38:41 +0000204void
205SBDebugger::MemoryPressureDetected ()
206{
Greg Clayton0cd70862012-04-09 20:22:01 +0000207 // Since this function can be call asynchronously, we allow it to be
208 // non-mandatory. We have seen deadlocks with this function when called
209 // so we need to safeguard against this until we can determine what is
210 // causing the deadlocks.
Greg Clayton5160ce52013-03-27 23:08:40 +0000211 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Inghamaebdf1b2012-06-07 19:08:07 +0000212
Greg Clayton0cd70862012-04-09 20:22:01 +0000213 const bool mandatory = false;
Jim Inghamaebdf1b2012-06-07 19:08:07 +0000214 if (log)
215 {
216 log->Printf ("SBDebugger::MemoryPressureDetected (), mandatory = %d", mandatory);
217 }
218
Greg Clayton0cd70862012-04-09 20:22:01 +0000219 ModuleList::RemoveOrphanSharedModules(mandatory);
Greg Claytonf9322412011-12-15 04:38:41 +0000220}
221
Greg Clayton66111032010-06-23 01:19:29 +0000222SBDebugger::SBDebugger () :
223 m_opaque_sp ()
224{
225}
226
Enrico Granata274fd6e2011-08-19 23:56:34 +0000227SBDebugger::SBDebugger(const lldb::DebuggerSP &debugger_sp) :
228 m_opaque_sp(debugger_sp)
229{
230}
231
Greg Claytonefabb122010-11-05 23:17:00 +0000232SBDebugger::SBDebugger(const SBDebugger &rhs) :
233 m_opaque_sp (rhs.m_opaque_sp)
234{
235}
236
237SBDebugger &
238SBDebugger::operator = (const SBDebugger &rhs)
239{
240 if (this != &rhs)
241 {
242 m_opaque_sp = rhs.m_opaque_sp;
243 }
244 return *this;
245}
246
Greg Clayton66111032010-06-23 01:19:29 +0000247SBDebugger::~SBDebugger ()
248{
249}
250
251bool
252SBDebugger::IsValid() const
253{
254 return m_opaque_sp.get() != NULL;
255}
256
257
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000258void
259SBDebugger::SetAsync (bool b)
260{
Greg Clayton66111032010-06-23 01:19:29 +0000261 if (m_opaque_sp)
262 m_opaque_sp->SetAsyncExecution(b);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000263}
264
Jim Inghame64f0dc2011-09-13 23:25:31 +0000265bool
266SBDebugger::GetAsync ()
267{
268 if (m_opaque_sp)
269 return m_opaque_sp->GetAsyncExecution();
270 else
271 return false;
272}
273
Greg Clayton6eee5aa2010-10-11 01:05:37 +0000274void
275SBDebugger::SkipLLDBInitFiles (bool b)
276{
277 if (m_opaque_sp)
278 m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles (b);
279}
280
Jim Ingham16e0c682011-08-12 23:34:31 +0000281void
282SBDebugger::SkipAppInitFiles (bool b)
283{
284 if (m_opaque_sp)
285 m_opaque_sp->GetCommandInterpreter().SkipAppInitFiles (b);
286}
287
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000288// Shouldn't really be settable after initialization as this could cause lots of problems; don't want users
289// trying to switch modes in the middle of a debugging session.
290void
291SBDebugger::SetInputFileHandle (FILE *fh, bool transfer_ownership)
292{
Greg Clayton5160ce52013-03-27 23:08:40 +0000293 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000294
295 if (log)
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000296 log->Printf ("SBDebugger(%p)::SetInputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
297 fh, transfer_ownership);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000298
Greg Clayton66111032010-06-23 01:19:29 +0000299 if (m_opaque_sp)
300 m_opaque_sp->SetInputFileHandle (fh, transfer_ownership);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000301}
302
303void
304SBDebugger::SetOutputFileHandle (FILE *fh, bool transfer_ownership)
305{
Greg Clayton5160ce52013-03-27 23:08:40 +0000306 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000307
308
309 if (log)
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000310 log->Printf ("SBDebugger(%p)::SetOutputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
311 fh, transfer_ownership);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000312
Greg Clayton66111032010-06-23 01:19:29 +0000313 if (m_opaque_sp)
314 m_opaque_sp->SetOutputFileHandle (fh, transfer_ownership);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000315}
316
317void
318SBDebugger::SetErrorFileHandle (FILE *fh, bool transfer_ownership)
319{
Greg Clayton5160ce52013-03-27 23:08:40 +0000320 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000321
322
323 if (log)
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000324 log->Printf ("SBDebugger(%p)::SetErrorFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
325 fh, transfer_ownership);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000326
Greg Clayton66111032010-06-23 01:19:29 +0000327 if (m_opaque_sp)
328 m_opaque_sp->SetErrorFileHandle (fh, transfer_ownership);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000329}
330
331FILE *
332SBDebugger::GetInputFileHandle ()
333{
Greg Clayton66111032010-06-23 01:19:29 +0000334 if (m_opaque_sp)
Greg Clayton44d93782014-01-27 23:43:24 +0000335 {
336 StreamFileSP stream_file_sp (m_opaque_sp->GetInputFile());
337 if (stream_file_sp)
338 return stream_file_sp->GetFile().GetStream();
339 }
Greg Clayton66111032010-06-23 01:19:29 +0000340 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000341}
342
343FILE *
344SBDebugger::GetOutputFileHandle ()
345{
Greg Clayton66111032010-06-23 01:19:29 +0000346 if (m_opaque_sp)
Greg Clayton44d93782014-01-27 23:43:24 +0000347 {
348 StreamFileSP stream_file_sp (m_opaque_sp->GetOutputFile());
349 if (stream_file_sp)
350 return stream_file_sp->GetFile().GetStream();
351 }
Greg Clayton66111032010-06-23 01:19:29 +0000352 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000353}
354
355FILE *
356SBDebugger::GetErrorFileHandle ()
357{
Greg Clayton66111032010-06-23 01:19:29 +0000358 if (m_opaque_sp)
Greg Clayton44d93782014-01-27 23:43:24 +0000359 if (m_opaque_sp)
360 {
361 StreamFileSP stream_file_sp (m_opaque_sp->GetErrorFile());
362 if (stream_file_sp)
363 return stream_file_sp->GetFile().GetStream();
364 }
Greg Clayton66111032010-06-23 01:19:29 +0000365 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000366}
367
Jim Inghamc5917d92012-11-30 20:23:19 +0000368void
369SBDebugger::SaveInputTerminalState()
370{
371 if (m_opaque_sp)
372 m_opaque_sp->SaveInputTerminalState();
373}
374
375void
376SBDebugger::RestoreInputTerminalState()
377{
378 if (m_opaque_sp)
379 m_opaque_sp->RestoreInputTerminalState();
380
381}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000382SBCommandInterpreter
383SBDebugger::GetCommandInterpreter ()
384{
Greg Clayton5160ce52013-03-27 23:08:40 +0000385 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000386
Greg Clayton66111032010-06-23 01:19:29 +0000387 SBCommandInterpreter sb_interpreter;
388 if (m_opaque_sp)
389 sb_interpreter.reset (&m_opaque_sp->GetCommandInterpreter());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000390
Caroline Tice750cd172010-10-26 23:49:36 +0000391 if (log)
Greg Clayton93aa84e2010-10-29 04:59:35 +0000392 log->Printf ("SBDebugger(%p)::GetCommandInterpreter () => SBCommandInterpreter(%p)",
Caroline Tice750cd172010-10-26 23:49:36 +0000393 m_opaque_sp.get(), sb_interpreter.get());
394
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000395 return sb_interpreter;
396}
397
398void
399SBDebugger::HandleCommand (const char *command)
400{
Greg Clayton66111032010-06-23 01:19:29 +0000401 if (m_opaque_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000402 {
Greg Claytonaf67cec2010-12-20 20:49:23 +0000403 TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
404 Mutex::Locker api_locker;
405 if (target_sp)
Jim Ingham10ebffa2012-05-04 23:02:50 +0000406 api_locker.Lock(target_sp->GetAPIMutex());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000407
Greg Clayton66111032010-06-23 01:19:29 +0000408 SBCommandInterpreter sb_interpreter(GetCommandInterpreter ());
409 SBCommandReturnObject result;
410
411 sb_interpreter.HandleCommand (command, result, false);
412
413 if (GetErrorFileHandle() != NULL)
414 result.PutError (GetErrorFileHandle());
415 if (GetOutputFileHandle() != NULL)
416 result.PutOutput (GetOutputFileHandle());
417
418 if (m_opaque_sp->GetAsyncExecution() == false)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000419 {
Greg Clayton66111032010-06-23 01:19:29 +0000420 SBProcess process(GetCommandInterpreter().GetProcess ());
Greg Claytonb9556ac2012-01-30 07:41:31 +0000421 ProcessSP process_sp (process.GetSP());
422 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000423 {
Greg Clayton66111032010-06-23 01:19:29 +0000424 EventSP event_sp;
425 Listener &lldb_listener = m_opaque_sp->GetListener();
Greg Claytonb9556ac2012-01-30 07:41:31 +0000426 while (lldb_listener.GetNextEventForBroadcaster (process_sp.get(), event_sp))
Greg Clayton66111032010-06-23 01:19:29 +0000427 {
428 SBEvent event(event_sp);
429 HandleProcessEvent (process, event, GetOutputFileHandle(), GetErrorFileHandle());
430 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000431 }
432 }
433 }
434}
435
436SBListener
437SBDebugger::GetListener ()
438{
Greg Clayton5160ce52013-03-27 23:08:40 +0000439 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000440
Greg Clayton66111032010-06-23 01:19:29 +0000441 SBListener sb_listener;
442 if (m_opaque_sp)
443 sb_listener.reset(&m_opaque_sp->GetListener(), false);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000444
Caroline Tice750cd172010-10-26 23:49:36 +0000445 if (log)
Greg Clayton93aa84e2010-10-29 04:59:35 +0000446 log->Printf ("SBDebugger(%p)::GetListener () => SBListener(%p)", m_opaque_sp.get(),
Caroline Tice750cd172010-10-26 23:49:36 +0000447 sb_listener.get());
448
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000449 return sb_listener;
450}
451
452void
453SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, FILE *out, FILE *err)
454{
Greg Claytonaf67cec2010-12-20 20:49:23 +0000455 if (!process.IsValid())
456 return;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000457
Greg Claytonb9556ac2012-01-30 07:41:31 +0000458 TargetSP target_sp (process.GetTarget().GetSP());
459 if (!target_sp)
460 return;
461
Greg Claytonaf67cec2010-12-20 20:49:23 +0000462 const uint32_t event_type = event.GetType();
463 char stdio_buffer[1024];
464 size_t len;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000465
Greg Claytonb9556ac2012-01-30 07:41:31 +0000466 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000467
468 if (event_type & (Process::eBroadcastBitSTDOUT | Process::eBroadcastBitStateChanged))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000469 {
Greg Claytonaf67cec2010-12-20 20:49:23 +0000470 // Drain stdout when we stop just in case we have any bytes
471 while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
472 if (out != NULL)
473 ::fwrite (stdio_buffer, 1, len, out);
474 }
475
476 if (event_type & (Process::eBroadcastBitSTDERR | Process::eBroadcastBitStateChanged))
477 {
478 // Drain stderr when we stop just in case we have any bytes
479 while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
480 if (err != NULL)
481 ::fwrite (stdio_buffer, 1, len, err);
482 }
483
484 if (event_type & Process::eBroadcastBitStateChanged)
485 {
486 StateType event_state = SBProcess::GetStateFromEvent (event);
487
488 if (event_state == eStateInvalid)
489 return;
490
491 bool is_stopped = StateIsStoppedState (event_state);
492 if (!is_stopped)
493 process.ReportEventState (event, out);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000494 }
495}
496
Jim Inghame37d6052011-09-13 00:29:56 +0000497SBSourceManager
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000498SBDebugger::GetSourceManager ()
499{
Jim Inghame37d6052011-09-13 00:29:56 +0000500 SBSourceManager sb_source_manager (*this);
501 return sb_source_manager;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000502}
503
504
505bool
506SBDebugger::GetDefaultArchitecture (char *arch_name, size_t arch_name_len)
507{
508 if (arch_name && arch_name_len)
509 {
Greg Clayton431ce672011-04-18 23:15:17 +0000510 ArchSpec default_arch = Target::GetDefaultArchitecture ();
Caroline Ticedaccaa92010-09-20 20:44:43 +0000511
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000512 if (default_arch.IsValid())
513 {
Greg Clayton431ce672011-04-18 23:15:17 +0000514 const std::string &triple_str = default_arch.GetTriple().str();
515 if (!triple_str.empty())
516 ::snprintf (arch_name, arch_name_len, "%s", triple_str.c_str());
517 else
518 ::snprintf (arch_name, arch_name_len, "%s", default_arch.GetArchitectureName());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000519 return true;
520 }
521 }
522 if (arch_name && arch_name_len)
523 arch_name[0] = '\0';
524 return false;
525}
526
527
528bool
529SBDebugger::SetDefaultArchitecture (const char *arch_name)
530{
531 if (arch_name)
532 {
Greg Clayton70512312012-05-08 01:45:38 +0000533 ArchSpec arch (arch_name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000534 if (arch.IsValid())
535 {
Greg Clayton431ce672011-04-18 23:15:17 +0000536 Target::SetDefaultArchitecture (arch);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000537 return true;
538 }
539 }
540 return false;
541}
542
543ScriptLanguage
544SBDebugger::GetScriptingLanguage (const char *script_language_name)
545{
Greg Claytonaf67cec2010-12-20 20:49:23 +0000546
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000547 return Args::StringToScriptLanguage (script_language_name,
548 eScriptLanguageDefault,
549 NULL);
550}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000551
552const char *
553SBDebugger::GetVersionString ()
554{
Virgile Bellob2f1fb22013-08-23 12:44:05 +0000555 return lldb_private::GetVersion();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000556}
557
558const char *
Greg Clayton431ce672011-04-18 23:15:17 +0000559SBDebugger::StateAsCString (StateType state)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000560{
Caroline Ticec2bbb492011-04-25 22:05:51 +0000561 return lldb_private::StateAsCString (state);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000562}
563
564bool
Greg Clayton431ce672011-04-18 23:15:17 +0000565SBDebugger::StateIsRunningState (StateType state)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000566{
Greg Clayton5160ce52013-03-27 23:08:40 +0000567 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000568
Caroline Ticec2bbb492011-04-25 22:05:51 +0000569 const bool result = lldb_private::StateIsRunningState (state);
Greg Clayton48381312010-10-30 04:51:46 +0000570 if (log)
571 log->Printf ("SBDebugger::StateIsRunningState (state=%s) => %i",
Greg Clayton431ce672011-04-18 23:15:17 +0000572 StateAsCString (state), result);
Greg Clayton48381312010-10-30 04:51:46 +0000573
574 return result;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000575}
576
577bool
Greg Clayton431ce672011-04-18 23:15:17 +0000578SBDebugger::StateIsStoppedState (StateType state)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000579{
Greg Clayton5160ce52013-03-27 23:08:40 +0000580 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000581
Greg Clayton2637f822011-11-17 01:23:07 +0000582 const bool result = lldb_private::StateIsStoppedState (state, false);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000583 if (log)
Greg Clayton48381312010-10-30 04:51:46 +0000584 log->Printf ("SBDebugger::StateIsStoppedState (state=%s) => %i",
Greg Clayton431ce672011-04-18 23:15:17 +0000585 StateAsCString (state), result);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000586
Greg Clayton48381312010-10-30 04:51:46 +0000587 return result;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000588}
589
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000590lldb::SBTarget
591SBDebugger::CreateTarget (const char *filename,
592 const char *target_triple,
593 const char *platform_name,
594 bool add_dependent_modules,
595 lldb::SBError& sb_error)
596{
597 SBTarget sb_target;
Greg Claytonb9556ac2012-01-30 07:41:31 +0000598 TargetSP target_sp;
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000599 if (m_opaque_sp)
600 {
601 sb_error.Clear();
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000602 OptionGroupPlatform platform_options (false);
603 platform_options.SetPlatformName (platform_name);
604
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000605 sb_error.ref() = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
Greg Claytona0ca6602012-10-18 16:33:33 +0000606 filename,
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000607 target_triple,
608 add_dependent_modules,
609 &platform_options,
610 target_sp);
611
612 if (sb_error.Success())
Greg Claytonb9556ac2012-01-30 07:41:31 +0000613 sb_target.SetSP (target_sp);
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000614 }
615 else
616 {
617 sb_error.SetErrorString("invalid target");
618 }
619
Greg Clayton5160ce52013-03-27 23:08:40 +0000620 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000621 if (log)
622 {
623 log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\", triple=%s, platform_name=%s, add_dependent_modules=%u, error=%s) => SBTarget(%p)",
624 m_opaque_sp.get(),
625 filename,
626 target_triple,
627 platform_name,
628 add_dependent_modules,
629 sb_error.GetCString(),
Greg Claytonb9556ac2012-01-30 07:41:31 +0000630 target_sp.get());
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000631 }
632
633 return sb_target;
634}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000635
636SBTarget
637SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename,
638 const char *target_triple)
639{
Greg Claytonb9556ac2012-01-30 07:41:31 +0000640 SBTarget sb_target;
641 TargetSP target_sp;
Greg Clayton66111032010-06-23 01:19:29 +0000642 if (m_opaque_sp)
643 {
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000644 const bool add_dependent_modules = true;
645 Error error (m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
Greg Claytona0ca6602012-10-18 16:33:33 +0000646 filename,
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000647 target_triple,
648 add_dependent_modules,
649 NULL,
650 target_sp));
Greg Claytonb9556ac2012-01-30 07:41:31 +0000651 sb_target.SetSP (target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000652 }
Greg Clayton48381312010-10-30 04:51:46 +0000653
Greg Clayton5160ce52013-03-27 23:08:40 +0000654 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000655 if (log)
656 {
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000657 log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndTargetTriple (filename=\"%s\", triple=%s) => SBTarget(%p)",
Greg Claytonb9556ac2012-01-30 07:41:31 +0000658 m_opaque_sp.get(), filename, target_triple, target_sp.get());
Greg Clayton48381312010-10-30 04:51:46 +0000659 }
660
Greg Claytonb9556ac2012-01-30 07:41:31 +0000661 return sb_target;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000662}
663
664SBTarget
Greg Clayton64195a22011-02-23 00:35:02 +0000665SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *arch_cstr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000666{
Greg Clayton5160ce52013-03-27 23:08:40 +0000667 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000668
Greg Claytonb9556ac2012-01-30 07:41:31 +0000669 SBTarget sb_target;
670 TargetSP target_sp;
Greg Clayton66111032010-06-23 01:19:29 +0000671 if (m_opaque_sp)
672 {
Greg Clayton66111032010-06-23 01:19:29 +0000673 Error error;
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000674 const bool add_dependent_modules = true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000675
Greg Claytona0ca6602012-10-18 16:33:33 +0000676 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
677 filename,
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000678 arch_cstr,
679 add_dependent_modules,
680 NULL,
681 target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000682
683 if (error.Success())
684 {
Jim Ingham2976d002010-08-26 21:32:51 +0000685 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Claytonb9556ac2012-01-30 07:41:31 +0000686 sb_target.SetSP (target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000687 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000688 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000689
690 if (log)
691 {
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000692 log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndArch (filename=\"%s\", arch=%s) => SBTarget(%p)",
Greg Claytonb9556ac2012-01-30 07:41:31 +0000693 m_opaque_sp.get(), filename, arch_cstr, target_sp.get());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000694 }
695
Greg Claytonb9556ac2012-01-30 07:41:31 +0000696 return sb_target;
Greg Clayton66111032010-06-23 01:19:29 +0000697}
698
699SBTarget
700SBDebugger::CreateTarget (const char *filename)
701{
Greg Claytonb9556ac2012-01-30 07:41:31 +0000702 SBTarget sb_target;
703 TargetSP target_sp;
Greg Clayton66111032010-06-23 01:19:29 +0000704 if (m_opaque_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000705 {
Greg Clayton431ce672011-04-18 23:15:17 +0000706 ArchSpec arch = Target::GetDefaultArchitecture ();
Greg Clayton66111032010-06-23 01:19:29 +0000707 Error error;
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000708 const bool add_dependent_modules = true;
Greg Clayton66111032010-06-23 01:19:29 +0000709
Greg Claytonb3a40ba2012-03-20 18:34:04 +0000710 PlatformSP platform_sp(m_opaque_sp->GetPlatformList().GetSelectedPlatform());
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000711 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
Greg Claytona0ca6602012-10-18 16:33:33 +0000712 filename,
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000713 arch,
714 add_dependent_modules,
Greg Claytonb3a40ba2012-03-20 18:34:04 +0000715 platform_sp,
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000716 target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000717
718 if (error.Success())
719 {
Jim Ingham2976d002010-08-26 21:32:51 +0000720 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Claytonb9556ac2012-01-30 07:41:31 +0000721 sb_target.SetSP (target_sp);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000722 }
723 }
Greg Clayton5160ce52013-03-27 23:08:40 +0000724 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000725 if (log)
726 {
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000727 log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)",
Greg Claytonb9556ac2012-01-30 07:41:31 +0000728 m_opaque_sp.get(), filename, target_sp.get());
Greg Clayton48381312010-10-30 04:51:46 +0000729 }
Greg Claytonb9556ac2012-01-30 07:41:31 +0000730 return sb_target;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000731}
732
Johnny Chen3794ad92011-06-15 21:24:24 +0000733bool
734SBDebugger::DeleteTarget (lldb::SBTarget &target)
735{
736 bool result = false;
Greg Claytonb9556ac2012-01-30 07:41:31 +0000737 if (m_opaque_sp)
Johnny Chen3794ad92011-06-15 21:24:24 +0000738 {
Greg Claytonb9556ac2012-01-30 07:41:31 +0000739 TargetSP target_sp(target.GetSP());
740 if (target_sp)
741 {
742 // No need to lock, the target list is thread safe
743 result = m_opaque_sp->GetTargetList().DeleteTarget (target_sp);
744 target_sp->Destroy();
745 target.Clear();
Greg Clayton0cd70862012-04-09 20:22:01 +0000746 const bool mandatory = true;
747 ModuleList::RemoveOrphanSharedModules(mandatory);
Greg Claytonb9556ac2012-01-30 07:41:31 +0000748 }
Johnny Chen3794ad92011-06-15 21:24:24 +0000749 }
750
Greg Clayton5160ce52013-03-27 23:08:40 +0000751 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Johnny Chen3794ad92011-06-15 21:24:24 +0000752 if (log)
753 {
754 log->Printf ("SBDebugger(%p)::DeleteTarget (SBTarget(%p)) => %i", m_opaque_sp.get(), target.m_opaque_sp.get(), result);
755 }
756
757 return result;
758}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000759SBTarget
760SBDebugger::GetTargetAtIndex (uint32_t idx)
761{
Greg Clayton66111032010-06-23 01:19:29 +0000762 SBTarget sb_target;
763 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000764 {
765 // No need to lock, the target list is thread safe
Greg Claytonb9556ac2012-01-30 07:41:31 +0000766 sb_target.SetSP (m_opaque_sp->GetTargetList().GetTargetAtIndex (idx));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000767 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000768 return sb_target;
769}
770
Jim Ingham8499e1a2012-05-08 23:06:07 +0000771uint32_t
772SBDebugger::GetIndexOfTarget (lldb::SBTarget target)
773{
774
775 lldb::TargetSP target_sp = target.GetSP();
776 if (!target_sp)
777 return UINT32_MAX;
778
779 if (!m_opaque_sp)
780 return UINT32_MAX;
781
782 return m_opaque_sp->GetTargetList().GetIndexOfTarget (target.GetSP());
783}
784
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000785SBTarget
Virgile Bello997f6f72013-09-05 16:53:14 +0000786SBDebugger::FindTargetWithProcessID (lldb::pid_t pid)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000787{
Greg Clayton66111032010-06-23 01:19:29 +0000788 SBTarget sb_target;
789 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000790 {
791 // No need to lock, the target list is thread safe
Greg Claytonb9556ac2012-01-30 07:41:31 +0000792 sb_target.SetSP (m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000793 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000794 return sb_target;
795}
796
797SBTarget
798SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name)
799{
Greg Clayton66111032010-06-23 01:19:29 +0000800 SBTarget sb_target;
801 if (m_opaque_sp && filename && filename[0])
802 {
Greg Claytonaf67cec2010-12-20 20:49:23 +0000803 // No need to lock, the target list is thread safe
Greg Claytoneb0103f2011-04-07 22:46:35 +0000804 ArchSpec arch (arch_name, m_opaque_sp->GetPlatformList().GetSelectedPlatform().get());
Greg Clayton274060b2010-10-20 20:54:39 +0000805 TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename, false), arch_name ? &arch : NULL));
Greg Claytonb9556ac2012-01-30 07:41:31 +0000806 sb_target.SetSP (target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000807 }
808 return sb_target;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000809}
810
811SBTarget
Greg Clayton431ce672011-04-18 23:15:17 +0000812SBDebugger::FindTargetWithLLDBProcess (const ProcessSP &process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000813{
Greg Clayton66111032010-06-23 01:19:29 +0000814 SBTarget sb_target;
815 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000816 {
817 // No need to lock, the target list is thread safe
Greg Claytonb9556ac2012-01-30 07:41:31 +0000818 sb_target.SetSP (m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get()));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000819 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000820 return sb_target;
821}
822
823
824uint32_t
825SBDebugger::GetNumTargets ()
826{
Greg Clayton66111032010-06-23 01:19:29 +0000827 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000828 {
829 // No need to lock, the target list is thread safe
Greg Clayton66111032010-06-23 01:19:29 +0000830 return m_opaque_sp->GetTargetList().GetNumTargets ();
Greg Claytonaf67cec2010-12-20 20:49:23 +0000831 }
Greg Clayton66111032010-06-23 01:19:29 +0000832 return 0;
833}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000834
835SBTarget
Jim Ingham2976d002010-08-26 21:32:51 +0000836SBDebugger::GetSelectedTarget ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000837{
Greg Clayton5160ce52013-03-27 23:08:40 +0000838 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000839
Greg Clayton66111032010-06-23 01:19:29 +0000840 SBTarget sb_target;
Greg Claytonb9556ac2012-01-30 07:41:31 +0000841 TargetSP target_sp;
Greg Clayton66111032010-06-23 01:19:29 +0000842 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000843 {
844 // No need to lock, the target list is thread safe
Greg Claytonb9556ac2012-01-30 07:41:31 +0000845 target_sp = m_opaque_sp->GetTargetList().GetSelectedTarget ();
846 sb_target.SetSP (target_sp);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000847 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000848
849 if (log)
850 {
851 SBStream sstr;
Greg Clayton431ce672011-04-18 23:15:17 +0000852 sb_target.GetDescription (sstr, eDescriptionLevelBrief);
Greg Clayton93aa84e2010-10-29 04:59:35 +0000853 log->Printf ("SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s", m_opaque_sp.get(),
Greg Claytonb9556ac2012-01-30 07:41:31 +0000854 target_sp.get(), sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000855 }
856
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000857 return sb_target;
858}
859
860void
Jim Inghame64f0dc2011-09-13 23:25:31 +0000861SBDebugger::SetSelectedTarget (SBTarget &sb_target)
862{
Greg Clayton5160ce52013-03-27 23:08:40 +0000863 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Inghame64f0dc2011-09-13 23:25:31 +0000864
Greg Claytonb9556ac2012-01-30 07:41:31 +0000865 TargetSP target_sp (sb_target.GetSP());
Jim Inghame64f0dc2011-09-13 23:25:31 +0000866 if (m_opaque_sp)
867 {
Greg Claytonb9556ac2012-01-30 07:41:31 +0000868 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Jim Inghame64f0dc2011-09-13 23:25:31 +0000869 }
870 if (log)
871 {
872 SBStream sstr;
873 sb_target.GetDescription (sstr, eDescriptionLevelBrief);
874 log->Printf ("SBDebugger(%p)::SetSelectedTarget () => SBTarget(%p): %s", m_opaque_sp.get(),
Greg Claytonb9556ac2012-01-30 07:41:31 +0000875 target_sp.get(), sstr.GetData());
Jim Inghame64f0dc2011-09-13 23:25:31 +0000876 }
877}
878
Greg Claytonfbb76342013-11-20 21:07:01 +0000879SBPlatform
880SBDebugger::GetSelectedPlatform()
881{
882 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
883
884 SBPlatform sb_platform;
885 DebuggerSP debugger_sp(m_opaque_sp);
886 if (debugger_sp)
887 {
888 sb_platform.SetSP(debugger_sp->GetPlatformList().GetSelectedPlatform());
889 }
890 if (log)
891 {
892 log->Printf ("SBDebugger(%p)::GetSelectedPlatform () => SBPlatform(%p): %s", m_opaque_sp.get(),
893 sb_platform.GetSP().get(), sb_platform.GetName());
894 }
895 return sb_platform;
896}
897
898void
899SBDebugger::SetSelectedPlatform(SBPlatform &sb_platform)
900{
901 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
902
903 DebuggerSP debugger_sp(m_opaque_sp);
904 if (debugger_sp)
905 {
906 debugger_sp->GetPlatformList().SetSelectedPlatform(sb_platform.GetSP());
907 }
908 if (log)
909 {
910 log->Printf ("SBDebugger(%p)::SetSelectedPlatform (SBPlatform(%p) %s)", m_opaque_sp.get(),
911 sb_platform.GetSP().get(), sb_platform.GetName());
912 }
913}
914
Jim Inghame64f0dc2011-09-13 23:25:31 +0000915void
Enrico Granatac30a73a2012-09-06 22:02:28 +0000916SBDebugger::DispatchInput (void* baton, const void *data, size_t data_len)
Enrico Granata6b09d422012-09-06 21:58:25 +0000917{
918 DispatchInput (data,data_len);
919}
920
921void
Filipe Cabecinhasc3019992012-08-20 16:21:04 +0000922SBDebugger::DispatchInput (const void *data, size_t data_len)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000923{
Greg Clayton44d93782014-01-27 23:43:24 +0000924// Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
925//
926// if (log)
927// log->Printf ("SBDebugger(%p)::DispatchInput (data=\"%.*s\", size_t=%" PRIu64 ")",
928// m_opaque_sp.get(),
929// (int) data_len,
930// (const char *) data,
931// (uint64_t)data_len);
932//
933// if (m_opaque_sp)
934// m_opaque_sp->DispatchInput ((const char *) data, data_len);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000935}
936
937void
Caroline Ticeefed6132010-11-19 20:47:54 +0000938SBDebugger::DispatchInputInterrupt ()
939{
940 if (m_opaque_sp)
941 m_opaque_sp->DispatchInputInterrupt ();
942}
943
944void
945SBDebugger::DispatchInputEndOfFile ()
946{
947 if (m_opaque_sp)
948 m_opaque_sp->DispatchInputEndOfFile ();
949}
950
951void
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000952SBDebugger::PushInputReader (SBInputReader &reader)
953{
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000954}
Greg Clayton66111032010-06-23 01:19:29 +0000955
956void
Greg Clayton44d93782014-01-27 23:43:24 +0000957SBDebugger::RunCommandInterpreter (bool auto_handle_events,
958 bool spawn_thread)
Caroline Tice969ed3d2011-05-02 20:41:46 +0000959{
Caroline Tice969ed3d2011-05-02 20:41:46 +0000960 if (m_opaque_sp)
Greg Clayton44d93782014-01-27 23:43:24 +0000961 m_opaque_sp->GetCommandInterpreter().RunCommandInterpreter(auto_handle_events, spawn_thread);
Caroline Tice969ed3d2011-05-02 20:41:46 +0000962}
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;
Greg Clayton44d93782014-01-27 23:43:24 +00001053 string_list.SplitIntoLines(value_str);
Greg Clayton6920b522012-08-22 18:39:03 +00001054 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