blob: a655950926fc0e7fa12c8765042a68d6ecb5e72a [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 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
Zachary Turner58a559c2014-08-27 20:15:09 +000047#include "llvm/Support/DynamicLibrary.h"
48
Chris Lattner30fdc8d2010-06-08 16:52:24 +000049using namespace lldb;
50using namespace lldb_private;
51
Greg Clayton5fb8f792013-12-02 19:35:49 +000052
Greg Clayton44d93782014-01-27 23:43:24 +000053SBInputReader::SBInputReader()
54{
55}
56SBInputReader::~SBInputReader()
57{
58}
59
60SBError
61SBInputReader::Initialize(lldb::SBDebugger& sb_debugger, unsigned long (*)(void*, lldb::SBInputReader*, lldb::InputReaderAction, char const*, unsigned long), void*, lldb::InputReaderGranularity, char const*, char const*, bool)
62{
63 return SBError();
64}
65
66void
67SBInputReader::SetIsDone(bool)
68{
69}
70bool
71SBInputReader::IsActive() const
72{
73 return false;
74}
75
Zachary Turner58a559c2014-08-27 20:15:09 +000076static llvm::sys::DynamicLibrary
Greg Clayton5fb8f792013-12-02 19:35:49 +000077LoadPlugin (const lldb::DebuggerSP &debugger_sp, const FileSpec& spec, Error& error)
78{
Zachary Turner58a559c2014-08-27 20:15:09 +000079 llvm::sys::DynamicLibrary dynlib = llvm::sys::DynamicLibrary::getPermanentLibrary(spec.GetPath().c_str());
80 if (dynlib.isValid())
Greg Clayton5fb8f792013-12-02 19:35:49 +000081 {
82 typedef bool (*LLDBCommandPluginInit) (lldb::SBDebugger& debugger);
83
84 lldb::SBDebugger debugger_sb(debugger_sp);
85 // This calls the bool lldb::PluginInitialize(lldb::SBDebugger debugger) function.
86 // TODO: mangle this differently for your system - on OSX, the first underscore needs to be removed and the second one stays
Zachary Turner58a559c2014-08-27 20:15:09 +000087 LLDBCommandPluginInit init_func = (LLDBCommandPluginInit)dynlib.getAddressOfSymbol("_ZN4lldb16PluginInitializeENS_10SBDebuggerE");
Greg Clayton5fb8f792013-12-02 19:35:49 +000088 if (init_func)
89 {
90 if (init_func(debugger_sb))
Zachary Turner58a559c2014-08-27 20:15:09 +000091 return dynlib;
Greg Clayton5fb8f792013-12-02 19:35:49 +000092 else
93 error.SetErrorString("plug-in refused to load (lldb::PluginInitialize(lldb::SBDebugger) returned false)");
94 }
95 else
96 {
97 error.SetErrorString("plug-in is missing the required initialization: lldb::PluginInitialize(lldb::SBDebugger)");
98 }
99 }
100 else
101 {
102 if (spec.Exists())
103 error.SetErrorString("this file does not represent a loadable dylib");
104 else
105 error.SetErrorString("no such file");
106 }
Zachary Turner58a559c2014-08-27 20:15:09 +0000107 return llvm::sys::DynamicLibrary();
Greg Clayton5fb8f792013-12-02 19:35:49 +0000108}
109
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000110void
111SBDebugger::Initialize ()
112{
Greg Clayton5160ce52013-03-27 23:08:40 +0000113 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000114
115 if (log)
116 log->Printf ("SBDebugger::Initialize ()");
117
Greg Claytonfc36f7912011-03-22 01:14:58 +0000118 SBCommandInterpreter::InitializeSWIG ();
119
Greg Clayton5fb8f792013-12-02 19:35:49 +0000120 Debugger::Initialize(LoadPlugin);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000121}
122
123void
124SBDebugger::Terminate ()
125{
126 Debugger::Terminate();
127}
128
Greg Clayton48e42542010-07-30 20:12:55 +0000129void
130SBDebugger::Clear ()
131{
Greg Clayton5160ce52013-03-27 23:08:40 +0000132 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000133
134 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000135 log->Printf ("SBDebugger(%p)::Clear ()",
136 static_cast<void*>(m_opaque_sp.get()));
137
Caroline Tice3d6086f2010-12-20 18:35:50 +0000138 if (m_opaque_sp)
Greg Clayton44d93782014-01-27 23:43:24 +0000139 m_opaque_sp->ClearIOHandlers ();
Caroline Ticeceb6b132010-10-26 03:11:13 +0000140
Greg Clayton48e42542010-07-30 20:12:55 +0000141 m_opaque_sp.reset();
142}
143
Greg Clayton66111032010-06-23 01:19:29 +0000144SBDebugger
145SBDebugger::Create()
146{
Jim Ingham228063c2012-02-21 02:23:08 +0000147 return SBDebugger::Create(false, NULL, NULL);
Jim Ingham06942692011-08-13 00:22:20 +0000148}
149
150SBDebugger
151SBDebugger::Create(bool source_init_files)
152{
Jim Ingham228063c2012-02-21 02:23:08 +0000153 return SBDebugger::Create (source_init_files, NULL, NULL);
154}
155
156SBDebugger
157SBDebugger::Create(bool source_init_files, lldb::LogOutputCallback callback, void *baton)
158
159{
Greg Clayton5160ce52013-03-27 23:08:40 +0000160 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000161
Greg Clayton66111032010-06-23 01:19:29 +0000162 SBDebugger debugger;
Greg Claytoncb172b12014-05-19 20:42:14 +0000163
164 // Currently we have issues if this function is called simultaneously on two different
165 // threads. The issues mainly revolve around the fact that the lldb_private::FormatManager
166 // uses global collections and having two threads parsing the .lldbinit files can cause
167 // mayhem. So to get around this for now we need to use a mutex to prevent bad things
168 // from happening.
169 static Mutex g_mutex(Mutex::eMutexTypeRecursive);
170 Mutex::Locker locker(g_mutex);
171
Jim Ingham228063c2012-02-21 02:23:08 +0000172 debugger.reset(Debugger::CreateInstance(callback, baton));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000173
174 if (log)
175 {
176 SBStream sstr;
177 debugger.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000178 log->Printf ("SBDebugger::Create () => SBDebugger(%p): %s",
179 static_cast<void*>(debugger.m_opaque_sp.get()),
180 sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000181 }
182
Jim Ingham06942692011-08-13 00:22:20 +0000183 SBCommandInterpreter interp = debugger.GetCommandInterpreter();
184 if (source_init_files)
185 {
186 interp.get()->SkipLLDBInitFiles(false);
187 interp.get()->SkipAppInitFiles (false);
188 SBCommandReturnObject result;
189 interp.SourceInitFileInHomeDirectory(result);
190 }
191 else
192 {
193 interp.get()->SkipLLDBInitFiles(true);
194 interp.get()->SkipAppInitFiles (true);
195 }
Greg Clayton66111032010-06-23 01:19:29 +0000196 return debugger;
197}
198
Caroline Ticee02657b2011-01-22 01:02:07 +0000199void
200SBDebugger::Destroy (SBDebugger &debugger)
201{
Greg Clayton5160ce52013-03-27 23:08:40 +0000202 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000203
Caroline Ticee02657b2011-01-22 01:02:07 +0000204 if (log)
205 {
206 SBStream sstr;
207 debugger.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000208 log->Printf ("SBDebugger::Destroy () => SBDebugger(%p): %s",
209 static_cast<void*>(debugger.m_opaque_sp.get()),
210 sstr.GetData());
Caroline Ticee02657b2011-01-22 01:02:07 +0000211 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000212
Caroline Ticee02657b2011-01-22 01:02:07 +0000213 Debugger::Destroy (debugger.m_opaque_sp);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000214
Caroline Ticee02657b2011-01-22 01:02:07 +0000215 if (debugger.m_opaque_sp.get() != NULL)
216 debugger.m_opaque_sp.reset();
217}
218
Greg Claytonf9322412011-12-15 04:38:41 +0000219void
220SBDebugger::MemoryPressureDetected ()
221{
Greg Clayton0cd70862012-04-09 20:22:01 +0000222 // Since this function can be call asynchronously, we allow it to be
223 // non-mandatory. We have seen deadlocks with this function when called
224 // so we need to safeguard against this until we can determine what is
225 // causing the deadlocks.
Greg Clayton5160ce52013-03-27 23:08:40 +0000226 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Inghamaebdf1b2012-06-07 19:08:07 +0000227
Greg Clayton0cd70862012-04-09 20:22:01 +0000228 const bool mandatory = false;
Jim Inghamaebdf1b2012-06-07 19:08:07 +0000229 if (log)
230 {
231 log->Printf ("SBDebugger::MemoryPressureDetected (), mandatory = %d", mandatory);
232 }
233
Greg Clayton0cd70862012-04-09 20:22:01 +0000234 ModuleList::RemoveOrphanSharedModules(mandatory);
Greg Claytonf9322412011-12-15 04:38:41 +0000235}
236
Greg Clayton66111032010-06-23 01:19:29 +0000237SBDebugger::SBDebugger () :
238 m_opaque_sp ()
239{
240}
241
Enrico Granata274fd6e2011-08-19 23:56:34 +0000242SBDebugger::SBDebugger(const lldb::DebuggerSP &debugger_sp) :
243 m_opaque_sp(debugger_sp)
244{
245}
246
Greg Claytonefabb122010-11-05 23:17:00 +0000247SBDebugger::SBDebugger(const SBDebugger &rhs) :
248 m_opaque_sp (rhs.m_opaque_sp)
249{
250}
251
252SBDebugger &
253SBDebugger::operator = (const SBDebugger &rhs)
254{
255 if (this != &rhs)
256 {
257 m_opaque_sp = rhs.m_opaque_sp;
258 }
259 return *this;
260}
261
Greg Clayton66111032010-06-23 01:19:29 +0000262SBDebugger::~SBDebugger ()
263{
264}
265
266bool
267SBDebugger::IsValid() const
268{
269 return m_opaque_sp.get() != NULL;
270}
271
272
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000273void
274SBDebugger::SetAsync (bool b)
275{
Greg Clayton66111032010-06-23 01:19:29 +0000276 if (m_opaque_sp)
277 m_opaque_sp->SetAsyncExecution(b);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000278}
279
Jim Inghame64f0dc2011-09-13 23:25:31 +0000280bool
281SBDebugger::GetAsync ()
282{
283 if (m_opaque_sp)
284 return m_opaque_sp->GetAsyncExecution();
285 else
286 return false;
287}
288
Greg Clayton6eee5aa2010-10-11 01:05:37 +0000289void
290SBDebugger::SkipLLDBInitFiles (bool b)
291{
292 if (m_opaque_sp)
293 m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles (b);
294}
295
Jim Ingham16e0c682011-08-12 23:34:31 +0000296void
297SBDebugger::SkipAppInitFiles (bool b)
298{
299 if (m_opaque_sp)
300 m_opaque_sp->GetCommandInterpreter().SkipAppInitFiles (b);
301}
302
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000303// Shouldn't really be settable after initialization as this could cause lots of problems; don't want users
304// trying to switch modes in the middle of a debugging session.
305void
306SBDebugger::SetInputFileHandle (FILE *fh, bool transfer_ownership)
307{
Greg Clayton5160ce52013-03-27 23:08:40 +0000308 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000309
310 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000311 log->Printf ("SBDebugger(%p)::SetInputFileHandle (fh=%p, transfer_ownership=%i)",
312 static_cast<void*>(m_opaque_sp.get()),
313 static_cast<void*>(fh), transfer_ownership);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000314
Greg Clayton66111032010-06-23 01:19:29 +0000315 if (m_opaque_sp)
316 m_opaque_sp->SetInputFileHandle (fh, transfer_ownership);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000317}
318
319void
320SBDebugger::SetOutputFileHandle (FILE *fh, bool transfer_ownership)
321{
Greg Clayton5160ce52013-03-27 23:08:40 +0000322 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000323
324
325 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000326 log->Printf ("SBDebugger(%p)::SetOutputFileHandle (fh=%p, transfer_ownership=%i)",
327 static_cast<void*>(m_opaque_sp.get()),
328 static_cast<void*>(fh), transfer_ownership);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000329
Greg Clayton66111032010-06-23 01:19:29 +0000330 if (m_opaque_sp)
331 m_opaque_sp->SetOutputFileHandle (fh, transfer_ownership);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000332}
333
334void
335SBDebugger::SetErrorFileHandle (FILE *fh, bool transfer_ownership)
336{
Greg Clayton5160ce52013-03-27 23:08:40 +0000337 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000338
339
340 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000341 log->Printf ("SBDebugger(%p)::SetErrorFileHandle (fh=%p, transfer_ownership=%i)",
342 static_cast<void*>(m_opaque_sp.get()),
343 static_cast<void*>(fh), transfer_ownership);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000344
Greg Clayton66111032010-06-23 01:19:29 +0000345 if (m_opaque_sp)
346 m_opaque_sp->SetErrorFileHandle (fh, transfer_ownership);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000347}
348
349FILE *
350SBDebugger::GetInputFileHandle ()
351{
Greg Clayton66111032010-06-23 01:19:29 +0000352 if (m_opaque_sp)
Greg Clayton44d93782014-01-27 23:43:24 +0000353 {
354 StreamFileSP stream_file_sp (m_opaque_sp->GetInputFile());
355 if (stream_file_sp)
356 return stream_file_sp->GetFile().GetStream();
357 }
Greg Clayton66111032010-06-23 01:19:29 +0000358 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000359}
360
361FILE *
362SBDebugger::GetOutputFileHandle ()
363{
Greg Clayton66111032010-06-23 01:19:29 +0000364 if (m_opaque_sp)
Greg Clayton44d93782014-01-27 23:43:24 +0000365 {
366 StreamFileSP stream_file_sp (m_opaque_sp->GetOutputFile());
367 if (stream_file_sp)
368 return stream_file_sp->GetFile().GetStream();
369 }
Greg Clayton66111032010-06-23 01:19:29 +0000370 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000371}
372
373FILE *
374SBDebugger::GetErrorFileHandle ()
375{
Greg Clayton66111032010-06-23 01:19:29 +0000376 if (m_opaque_sp)
Greg Clayton44d93782014-01-27 23:43:24 +0000377 if (m_opaque_sp)
378 {
379 StreamFileSP stream_file_sp (m_opaque_sp->GetErrorFile());
380 if (stream_file_sp)
381 return stream_file_sp->GetFile().GetStream();
382 }
Greg Clayton66111032010-06-23 01:19:29 +0000383 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000384}
385
Jim Inghamc5917d92012-11-30 20:23:19 +0000386void
387SBDebugger::SaveInputTerminalState()
388{
389 if (m_opaque_sp)
390 m_opaque_sp->SaveInputTerminalState();
391}
392
393void
394SBDebugger::RestoreInputTerminalState()
395{
396 if (m_opaque_sp)
397 m_opaque_sp->RestoreInputTerminalState();
398
399}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000400SBCommandInterpreter
401SBDebugger::GetCommandInterpreter ()
402{
Greg Clayton5160ce52013-03-27 23:08:40 +0000403 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000404
Greg Clayton66111032010-06-23 01:19:29 +0000405 SBCommandInterpreter sb_interpreter;
406 if (m_opaque_sp)
407 sb_interpreter.reset (&m_opaque_sp->GetCommandInterpreter());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000408
Caroline Tice750cd172010-10-26 23:49:36 +0000409 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000410 log->Printf ("SBDebugger(%p)::GetCommandInterpreter () => SBCommandInterpreter(%p)",
411 static_cast<void*>(m_opaque_sp.get()),
412 static_cast<void*>(sb_interpreter.get()));
Caroline Tice750cd172010-10-26 23:49:36 +0000413
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000414 return sb_interpreter;
415}
416
417void
418SBDebugger::HandleCommand (const char *command)
419{
Greg Clayton66111032010-06-23 01:19:29 +0000420 if (m_opaque_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000421 {
Greg Claytonaf67cec2010-12-20 20:49:23 +0000422 TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
423 Mutex::Locker api_locker;
424 if (target_sp)
Jim Ingham10ebffa2012-05-04 23:02:50 +0000425 api_locker.Lock(target_sp->GetAPIMutex());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000426
Greg Clayton66111032010-06-23 01:19:29 +0000427 SBCommandInterpreter sb_interpreter(GetCommandInterpreter ());
428 SBCommandReturnObject result;
429
430 sb_interpreter.HandleCommand (command, result, false);
431
432 if (GetErrorFileHandle() != NULL)
433 result.PutError (GetErrorFileHandle());
434 if (GetOutputFileHandle() != NULL)
435 result.PutOutput (GetOutputFileHandle());
436
437 if (m_opaque_sp->GetAsyncExecution() == false)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000438 {
Greg Clayton66111032010-06-23 01:19:29 +0000439 SBProcess process(GetCommandInterpreter().GetProcess ());
Greg Claytonb9556ac2012-01-30 07:41:31 +0000440 ProcessSP process_sp (process.GetSP());
441 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000442 {
Greg Clayton66111032010-06-23 01:19:29 +0000443 EventSP event_sp;
444 Listener &lldb_listener = m_opaque_sp->GetListener();
Greg Claytonb9556ac2012-01-30 07:41:31 +0000445 while (lldb_listener.GetNextEventForBroadcaster (process_sp.get(), event_sp))
Greg Clayton66111032010-06-23 01:19:29 +0000446 {
447 SBEvent event(event_sp);
448 HandleProcessEvent (process, event, GetOutputFileHandle(), GetErrorFileHandle());
449 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000450 }
451 }
452 }
453}
454
455SBListener
456SBDebugger::GetListener ()
457{
Greg Clayton5160ce52013-03-27 23:08:40 +0000458 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000459
Greg Clayton66111032010-06-23 01:19:29 +0000460 SBListener sb_listener;
461 if (m_opaque_sp)
462 sb_listener.reset(&m_opaque_sp->GetListener(), false);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000463
Caroline Tice750cd172010-10-26 23:49:36 +0000464 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000465 log->Printf ("SBDebugger(%p)::GetListener () => SBListener(%p)",
466 static_cast<void*>(m_opaque_sp.get()),
467 static_cast<void*>(sb_listener.get()));
Caroline Tice750cd172010-10-26 23:49:36 +0000468
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000469 return sb_listener;
470}
471
472void
473SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, FILE *out, FILE *err)
474{
Greg Claytonaf67cec2010-12-20 20:49:23 +0000475 if (!process.IsValid())
476 return;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000477
Greg Claytonb9556ac2012-01-30 07:41:31 +0000478 TargetSP target_sp (process.GetTarget().GetSP());
479 if (!target_sp)
480 return;
481
Greg Claytonaf67cec2010-12-20 20:49:23 +0000482 const uint32_t event_type = event.GetType();
483 char stdio_buffer[1024];
484 size_t len;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000485
Greg Claytonb9556ac2012-01-30 07:41:31 +0000486 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000487
488 if (event_type & (Process::eBroadcastBitSTDOUT | Process::eBroadcastBitStateChanged))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000489 {
Greg Claytonaf67cec2010-12-20 20:49:23 +0000490 // Drain stdout when we stop just in case we have any bytes
491 while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
492 if (out != NULL)
493 ::fwrite (stdio_buffer, 1, len, out);
494 }
495
496 if (event_type & (Process::eBroadcastBitSTDERR | Process::eBroadcastBitStateChanged))
497 {
498 // Drain stderr when we stop just in case we have any bytes
499 while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
500 if (err != NULL)
501 ::fwrite (stdio_buffer, 1, len, err);
502 }
503
504 if (event_type & Process::eBroadcastBitStateChanged)
505 {
506 StateType event_state = SBProcess::GetStateFromEvent (event);
507
508 if (event_state == eStateInvalid)
509 return;
510
511 bool is_stopped = StateIsStoppedState (event_state);
512 if (!is_stopped)
513 process.ReportEventState (event, out);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000514 }
515}
516
Jim Inghame37d6052011-09-13 00:29:56 +0000517SBSourceManager
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000518SBDebugger::GetSourceManager ()
519{
Jim Inghame37d6052011-09-13 00:29:56 +0000520 SBSourceManager sb_source_manager (*this);
521 return sb_source_manager;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000522}
523
524
525bool
526SBDebugger::GetDefaultArchitecture (char *arch_name, size_t arch_name_len)
527{
528 if (arch_name && arch_name_len)
529 {
Greg Clayton431ce672011-04-18 23:15:17 +0000530 ArchSpec default_arch = Target::GetDefaultArchitecture ();
Caroline Ticedaccaa92010-09-20 20:44:43 +0000531
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000532 if (default_arch.IsValid())
533 {
Greg Clayton431ce672011-04-18 23:15:17 +0000534 const std::string &triple_str = default_arch.GetTriple().str();
535 if (!triple_str.empty())
536 ::snprintf (arch_name, arch_name_len, "%s", triple_str.c_str());
537 else
538 ::snprintf (arch_name, arch_name_len, "%s", default_arch.GetArchitectureName());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000539 return true;
540 }
541 }
542 if (arch_name && arch_name_len)
543 arch_name[0] = '\0';
544 return false;
545}
546
547
548bool
549SBDebugger::SetDefaultArchitecture (const char *arch_name)
550{
551 if (arch_name)
552 {
Greg Clayton70512312012-05-08 01:45:38 +0000553 ArchSpec arch (arch_name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000554 if (arch.IsValid())
555 {
Greg Clayton431ce672011-04-18 23:15:17 +0000556 Target::SetDefaultArchitecture (arch);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000557 return true;
558 }
559 }
560 return false;
561}
562
563ScriptLanguage
564SBDebugger::GetScriptingLanguage (const char *script_language_name)
565{
Greg Claytonaf67cec2010-12-20 20:49:23 +0000566
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000567 return Args::StringToScriptLanguage (script_language_name,
568 eScriptLanguageDefault,
569 NULL);
570}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000571
572const char *
573SBDebugger::GetVersionString ()
574{
Virgile Bellob2f1fb22013-08-23 12:44:05 +0000575 return lldb_private::GetVersion();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000576}
577
578const char *
Greg Clayton431ce672011-04-18 23:15:17 +0000579SBDebugger::StateAsCString (StateType state)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000580{
Caroline Ticec2bbb492011-04-25 22:05:51 +0000581 return lldb_private::StateAsCString (state);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000582}
583
584bool
Greg Clayton431ce672011-04-18 23:15:17 +0000585SBDebugger::StateIsRunningState (StateType state)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000586{
Greg Clayton5160ce52013-03-27 23:08:40 +0000587 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000588
Caroline Ticec2bbb492011-04-25 22:05:51 +0000589 const bool result = lldb_private::StateIsRunningState (state);
Greg Clayton48381312010-10-30 04:51:46 +0000590 if (log)
591 log->Printf ("SBDebugger::StateIsRunningState (state=%s) => %i",
Greg Clayton431ce672011-04-18 23:15:17 +0000592 StateAsCString (state), result);
Greg Clayton48381312010-10-30 04:51:46 +0000593
594 return result;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000595}
596
597bool
Greg Clayton431ce672011-04-18 23:15:17 +0000598SBDebugger::StateIsStoppedState (StateType state)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000599{
Greg Clayton5160ce52013-03-27 23:08:40 +0000600 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000601
Greg Clayton2637f822011-11-17 01:23:07 +0000602 const bool result = lldb_private::StateIsStoppedState (state, false);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000603 if (log)
Greg Clayton48381312010-10-30 04:51:46 +0000604 log->Printf ("SBDebugger::StateIsStoppedState (state=%s) => %i",
Greg Clayton431ce672011-04-18 23:15:17 +0000605 StateAsCString (state), result);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000606
Greg Clayton48381312010-10-30 04:51:46 +0000607 return result;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000608}
609
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000610lldb::SBTarget
611SBDebugger::CreateTarget (const char *filename,
612 const char *target_triple,
613 const char *platform_name,
614 bool add_dependent_modules,
615 lldb::SBError& sb_error)
616{
617 SBTarget sb_target;
Greg Claytonb9556ac2012-01-30 07:41:31 +0000618 TargetSP target_sp;
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000619 if (m_opaque_sp)
620 {
621 sb_error.Clear();
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000622 OptionGroupPlatform platform_options (false);
623 platform_options.SetPlatformName (platform_name);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000624
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000625 sb_error.ref() = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
Greg Claytona0ca6602012-10-18 16:33:33 +0000626 filename,
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000627 target_triple,
628 add_dependent_modules,
629 &platform_options,
630 target_sp);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000631
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000632 if (sb_error.Success())
Greg Claytonb9556ac2012-01-30 07:41:31 +0000633 sb_target.SetSP (target_sp);
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000634 }
635 else
636 {
637 sb_error.SetErrorString("invalid target");
638 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000639
Greg Clayton5160ce52013-03-27 23:08:40 +0000640 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000641 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000642 log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\", triple=%s, platform_name=%s, add_dependent_modules=%u, error=%s) => SBTarget(%p)",
643 static_cast<void*>(m_opaque_sp.get()), filename,
644 target_triple, platform_name, add_dependent_modules,
645 sb_error.GetCString(), static_cast<void*>(target_sp.get()));
646
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000647 return sb_target;
648}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000649
650SBTarget
651SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename,
652 const char *target_triple)
653{
Greg Claytonb9556ac2012-01-30 07:41:31 +0000654 SBTarget sb_target;
655 TargetSP target_sp;
Greg Clayton66111032010-06-23 01:19:29 +0000656 if (m_opaque_sp)
657 {
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000658 const bool add_dependent_modules = true;
659 Error error (m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
Greg Claytona0ca6602012-10-18 16:33:33 +0000660 filename,
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000661 target_triple,
662 add_dependent_modules,
663 NULL,
664 target_sp));
Greg Claytonb9556ac2012-01-30 07:41:31 +0000665 sb_target.SetSP (target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000666 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000667
Greg Clayton5160ce52013-03-27 23:08:40 +0000668 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000669 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000670 log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndTargetTriple (filename=\"%s\", triple=%s) => SBTarget(%p)",
671 static_cast<void*>(m_opaque_sp.get()), filename,
672 target_triple, static_cast<void*>(target_sp.get()));
Greg Clayton48381312010-10-30 04:51:46 +0000673
Greg Claytonb9556ac2012-01-30 07:41:31 +0000674 return sb_target;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000675}
676
677SBTarget
Greg Clayton64195a22011-02-23 00:35:02 +0000678SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *arch_cstr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000679{
Greg Clayton5160ce52013-03-27 23:08:40 +0000680 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000681
Greg Claytonb9556ac2012-01-30 07:41:31 +0000682 SBTarget sb_target;
683 TargetSP target_sp;
Greg Clayton66111032010-06-23 01:19:29 +0000684 if (m_opaque_sp)
685 {
Greg Clayton66111032010-06-23 01:19:29 +0000686 Error error;
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000687 const bool add_dependent_modules = true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000688
Greg Claytona0ca6602012-10-18 16:33:33 +0000689 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
690 filename,
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000691 arch_cstr,
692 add_dependent_modules,
693 NULL,
694 target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000695
696 if (error.Success())
697 {
Jim Ingham2976d002010-08-26 21:32:51 +0000698 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Claytonb9556ac2012-01-30 07:41:31 +0000699 sb_target.SetSP (target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000700 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000701 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000702
703 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000704 log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndArch (filename=\"%s\", arch=%s) => SBTarget(%p)",
705 static_cast<void*>(m_opaque_sp.get()), filename, arch_cstr,
706 static_cast<void*>(target_sp.get()));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000707
Greg Claytonb9556ac2012-01-30 07:41:31 +0000708 return sb_target;
Greg Clayton66111032010-06-23 01:19:29 +0000709}
710
711SBTarget
712SBDebugger::CreateTarget (const char *filename)
713{
Greg Claytonb9556ac2012-01-30 07:41:31 +0000714 SBTarget sb_target;
715 TargetSP target_sp;
Greg Clayton66111032010-06-23 01:19:29 +0000716 if (m_opaque_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000717 {
Greg Clayton431ce672011-04-18 23:15:17 +0000718 ArchSpec arch = Target::GetDefaultArchitecture ();
Greg Clayton66111032010-06-23 01:19:29 +0000719 Error error;
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000720 const bool add_dependent_modules = true;
Greg Clayton66111032010-06-23 01:19:29 +0000721
Greg Claytonb3a40ba2012-03-20 18:34:04 +0000722 PlatformSP platform_sp(m_opaque_sp->GetPlatformList().GetSelectedPlatform());
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000723 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
Greg Claytona0ca6602012-10-18 16:33:33 +0000724 filename,
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000725 arch,
726 add_dependent_modules,
Greg Claytonb3a40ba2012-03-20 18:34:04 +0000727 platform_sp,
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000728 target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000729
730 if (error.Success())
731 {
Jim Ingham2976d002010-08-26 21:32:51 +0000732 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Claytonb9556ac2012-01-30 07:41:31 +0000733 sb_target.SetSP (target_sp);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000734 }
735 }
Greg Clayton5160ce52013-03-27 23:08:40 +0000736 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000737 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000738 log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)",
739 static_cast<void*>(m_opaque_sp.get()), filename,
740 static_cast<void*>(target_sp.get()));
Greg Claytonb9556ac2012-01-30 07:41:31 +0000741 return sb_target;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000742}
743
Johnny Chen3794ad92011-06-15 21:24:24 +0000744bool
745SBDebugger::DeleteTarget (lldb::SBTarget &target)
746{
747 bool result = false;
Greg Claytonb9556ac2012-01-30 07:41:31 +0000748 if (m_opaque_sp)
Johnny Chen3794ad92011-06-15 21:24:24 +0000749 {
Greg Claytonb9556ac2012-01-30 07:41:31 +0000750 TargetSP target_sp(target.GetSP());
751 if (target_sp)
752 {
753 // No need to lock, the target list is thread safe
754 result = m_opaque_sp->GetTargetList().DeleteTarget (target_sp);
755 target_sp->Destroy();
756 target.Clear();
Greg Clayton0cd70862012-04-09 20:22:01 +0000757 const bool mandatory = true;
758 ModuleList::RemoveOrphanSharedModules(mandatory);
Greg Claytonb9556ac2012-01-30 07:41:31 +0000759 }
Johnny Chen3794ad92011-06-15 21:24:24 +0000760 }
761
Greg Clayton5160ce52013-03-27 23:08:40 +0000762 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Johnny Chen3794ad92011-06-15 21:24:24 +0000763 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000764 log->Printf ("SBDebugger(%p)::DeleteTarget (SBTarget(%p)) => %i",
765 static_cast<void*>(m_opaque_sp.get()),
766 static_cast<void*>(target.m_opaque_sp.get()), result);
Johnny Chen3794ad92011-06-15 21:24:24 +0000767
768 return result;
769}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000770SBTarget
771SBDebugger::GetTargetAtIndex (uint32_t idx)
772{
Greg Clayton66111032010-06-23 01:19:29 +0000773 SBTarget sb_target;
774 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000775 {
776 // No need to lock, the target list is thread safe
Greg Claytonb9556ac2012-01-30 07:41:31 +0000777 sb_target.SetSP (m_opaque_sp->GetTargetList().GetTargetAtIndex (idx));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000778 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000779 return sb_target;
780}
781
Jim Ingham8499e1a2012-05-08 23:06:07 +0000782uint32_t
783SBDebugger::GetIndexOfTarget (lldb::SBTarget target)
784{
785
786 lldb::TargetSP target_sp = target.GetSP();
787 if (!target_sp)
788 return UINT32_MAX;
789
790 if (!m_opaque_sp)
791 return UINT32_MAX;
792
793 return m_opaque_sp->GetTargetList().GetIndexOfTarget (target.GetSP());
794}
795
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000796SBTarget
Virgile Bello997f6f72013-09-05 16:53:14 +0000797SBDebugger::FindTargetWithProcessID (lldb::pid_t pid)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000798{
Greg Clayton66111032010-06-23 01:19:29 +0000799 SBTarget sb_target;
800 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000801 {
802 // No need to lock, the target list is thread safe
Greg Claytonb9556ac2012-01-30 07:41:31 +0000803 sb_target.SetSP (m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000804 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000805 return sb_target;
806}
807
808SBTarget
809SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name)
810{
Greg Clayton66111032010-06-23 01:19:29 +0000811 SBTarget sb_target;
812 if (m_opaque_sp && filename && filename[0])
813 {
Greg Claytonaf67cec2010-12-20 20:49:23 +0000814 // No need to lock, the target list is thread safe
Greg Claytoneb0103f2011-04-07 22:46:35 +0000815 ArchSpec arch (arch_name, m_opaque_sp->GetPlatformList().GetSelectedPlatform().get());
Greg Clayton274060b2010-10-20 20:54:39 +0000816 TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename, false), arch_name ? &arch : NULL));
Greg Claytonb9556ac2012-01-30 07:41:31 +0000817 sb_target.SetSP (target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000818 }
819 return sb_target;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000820}
821
822SBTarget
Greg Clayton431ce672011-04-18 23:15:17 +0000823SBDebugger::FindTargetWithLLDBProcess (const ProcessSP &process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000824{
Greg Clayton66111032010-06-23 01:19:29 +0000825 SBTarget sb_target;
826 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000827 {
828 // No need to lock, the target list is thread safe
Greg Claytonb9556ac2012-01-30 07:41:31 +0000829 sb_target.SetSP (m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get()));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000830 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000831 return sb_target;
832}
833
834
835uint32_t
836SBDebugger::GetNumTargets ()
837{
Greg Clayton66111032010-06-23 01:19:29 +0000838 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000839 {
840 // No need to lock, the target list is thread safe
Greg Clayton66111032010-06-23 01:19:29 +0000841 return m_opaque_sp->GetTargetList().GetNumTargets ();
Greg Claytonaf67cec2010-12-20 20:49:23 +0000842 }
Greg Clayton66111032010-06-23 01:19:29 +0000843 return 0;
844}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000845
846SBTarget
Jim Ingham2976d002010-08-26 21:32:51 +0000847SBDebugger::GetSelectedTarget ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000848{
Greg Clayton5160ce52013-03-27 23:08:40 +0000849 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000850
Greg Clayton66111032010-06-23 01:19:29 +0000851 SBTarget sb_target;
Greg Claytonb9556ac2012-01-30 07:41:31 +0000852 TargetSP target_sp;
Greg Clayton66111032010-06-23 01:19:29 +0000853 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000854 {
855 // No need to lock, the target list is thread safe
Greg Claytonb9556ac2012-01-30 07:41:31 +0000856 target_sp = m_opaque_sp->GetTargetList().GetSelectedTarget ();
857 sb_target.SetSP (target_sp);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000858 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000859
860 if (log)
861 {
862 SBStream sstr;
Greg Clayton431ce672011-04-18 23:15:17 +0000863 sb_target.GetDescription (sstr, eDescriptionLevelBrief);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000864 log->Printf ("SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s",
865 static_cast<void*>(m_opaque_sp.get()),
866 static_cast<void*>(target_sp.get()), sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000867 }
868
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000869 return sb_target;
870}
871
872void
Jim Inghame64f0dc2011-09-13 23:25:31 +0000873SBDebugger::SetSelectedTarget (SBTarget &sb_target)
874{
Greg Clayton5160ce52013-03-27 23:08:40 +0000875 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Inghame64f0dc2011-09-13 23:25:31 +0000876
Greg Claytonb9556ac2012-01-30 07:41:31 +0000877 TargetSP target_sp (sb_target.GetSP());
Jim Inghame64f0dc2011-09-13 23:25:31 +0000878 if (m_opaque_sp)
879 {
Greg Claytonb9556ac2012-01-30 07:41:31 +0000880 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Jim Inghame64f0dc2011-09-13 23:25:31 +0000881 }
882 if (log)
883 {
884 SBStream sstr;
885 sb_target.GetDescription (sstr, eDescriptionLevelBrief);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000886 log->Printf ("SBDebugger(%p)::SetSelectedTarget () => SBTarget(%p): %s",
887 static_cast<void*>(m_opaque_sp.get()),
888 static_cast<void*>(target_sp.get()), sstr.GetData());
Jim Inghame64f0dc2011-09-13 23:25:31 +0000889 }
890}
891
Greg Claytonfbb76342013-11-20 21:07:01 +0000892SBPlatform
893SBDebugger::GetSelectedPlatform()
894{
895 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
896
897 SBPlatform sb_platform;
898 DebuggerSP debugger_sp(m_opaque_sp);
899 if (debugger_sp)
900 {
901 sb_platform.SetSP(debugger_sp->GetPlatformList().GetSelectedPlatform());
902 }
903 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000904 log->Printf ("SBDebugger(%p)::GetSelectedPlatform () => SBPlatform(%p): %s",
905 static_cast<void*>(m_opaque_sp.get()),
906 static_cast<void*>(sb_platform.GetSP().get()),
907 sb_platform.GetName());
Greg Claytonfbb76342013-11-20 21:07:01 +0000908 return sb_platform;
909}
910
911void
912SBDebugger::SetSelectedPlatform(SBPlatform &sb_platform)
913{
914 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000915
Greg Claytonfbb76342013-11-20 21:07:01 +0000916 DebuggerSP debugger_sp(m_opaque_sp);
917 if (debugger_sp)
918 {
919 debugger_sp->GetPlatformList().SetSelectedPlatform(sb_platform.GetSP());
920 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000921
Greg Claytonfbb76342013-11-20 21:07:01 +0000922 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000923 log->Printf ("SBDebugger(%p)::SetSelectedPlatform (SBPlatform(%p) %s)",
924 static_cast<void*>(m_opaque_sp.get()),
925 static_cast<void*>(sb_platform.GetSP().get()),
926 sb_platform.GetName());
Greg Claytonfbb76342013-11-20 21:07:01 +0000927}
928
Jim Inghame64f0dc2011-09-13 23:25:31 +0000929void
Enrico Granatac30a73a2012-09-06 22:02:28 +0000930SBDebugger::DispatchInput (void* baton, const void *data, size_t data_len)
Enrico Granata6b09d422012-09-06 21:58:25 +0000931{
932 DispatchInput (data,data_len);
933}
934
935void
Filipe Cabecinhasc3019992012-08-20 16:21:04 +0000936SBDebugger::DispatchInput (const void *data, size_t data_len)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000937{
Greg Clayton44d93782014-01-27 23:43:24 +0000938// Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
939//
940// if (log)
941// log->Printf ("SBDebugger(%p)::DispatchInput (data=\"%.*s\", size_t=%" PRIu64 ")",
942// m_opaque_sp.get(),
943// (int) data_len,
944// (const char *) data,
945// (uint64_t)data_len);
946//
947// if (m_opaque_sp)
948// m_opaque_sp->DispatchInput ((const char *) data, data_len);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000949}
950
951void
Caroline Ticeefed6132010-11-19 20:47:54 +0000952SBDebugger::DispatchInputInterrupt ()
953{
954 if (m_opaque_sp)
955 m_opaque_sp->DispatchInputInterrupt ();
956}
957
958void
959SBDebugger::DispatchInputEndOfFile ()
960{
961 if (m_opaque_sp)
962 m_opaque_sp->DispatchInputEndOfFile ();
963}
964
965void
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000966SBDebugger::PushInputReader (SBInputReader &reader)
967{
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000968}
Greg Clayton66111032010-06-23 01:19:29 +0000969
970void
Greg Clayton44d93782014-01-27 23:43:24 +0000971SBDebugger::RunCommandInterpreter (bool auto_handle_events,
972 bool spawn_thread)
Caroline Tice969ed3d2011-05-02 20:41:46 +0000973{
Caroline Tice969ed3d2011-05-02 20:41:46 +0000974 if (m_opaque_sp)
Jim Ingham26c7bf92014-10-11 00:38:27 +0000975 {
976 CommandInterpreterRunOptions options;
977
978 m_opaque_sp->GetCommandInterpreter().RunCommandInterpreter(auto_handle_events,
979 spawn_thread,
980 options);
981 }
982}
983
984void
985SBDebugger::RunCommandInterpreter (bool auto_handle_events,
986 bool spawn_thread,
987 SBCommandInterpreterRunOptions &options,
988 int &num_errors,
989 bool &quit_requested)
990
991{
992 if (m_opaque_sp)
993 {
994 CommandInterpreter &interp = m_opaque_sp->GetCommandInterpreter();
995 interp.RunCommandInterpreter(auto_handle_events, spawn_thread, options.ref());
996 num_errors = interp.GetNumErrors();
997 quit_requested = interp.GetQuitRequested();
998 }
Caroline Tice969ed3d2011-05-02 20:41:46 +0000999}
1000
1001void
Greg Clayton431ce672011-04-18 23:15:17 +00001002SBDebugger::reset (const DebuggerSP &debugger_sp)
Greg Clayton66111032010-06-23 01:19:29 +00001003{
1004 m_opaque_sp = debugger_sp;
1005}
1006
1007Debugger *
1008SBDebugger::get () const
1009{
1010 return m_opaque_sp.get();
1011}
1012
1013Debugger &
1014SBDebugger::ref () const
1015{
1016 assert (m_opaque_sp.get());
1017 return *m_opaque_sp;
1018}
1019
Greg Clayton9a377662011-10-01 02:59:24 +00001020const lldb::DebuggerSP &
1021SBDebugger::get_sp () const
1022{
1023 return m_opaque_sp;
1024}
Greg Clayton66111032010-06-23 01:19:29 +00001025
Caroline Ticeebc1bb22010-06-30 16:22:25 +00001026SBDebugger
1027SBDebugger::FindDebuggerWithID (int id)
1028{
Greg Claytonaf67cec2010-12-20 20:49:23 +00001029 // No need to lock, the debugger list is thread safe
Caroline Ticeebc1bb22010-06-30 16:22:25 +00001030 SBDebugger sb_debugger;
Greg Clayton431ce672011-04-18 23:15:17 +00001031 DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id);
Caroline Ticeebc1bb22010-06-30 16:22:25 +00001032 if (debugger_sp)
1033 sb_debugger.reset (debugger_sp);
1034 return sb_debugger;
1035}
Jim Inghame40e4212010-08-30 19:44:40 +00001036
Caroline Ticedd759852010-09-09 17:45:09 +00001037const char *
1038SBDebugger::GetInstanceName()
1039{
Greg Clayton6920b522012-08-22 18:39:03 +00001040 if (m_opaque_sp)
1041 return m_opaque_sp->GetInstanceName().AsCString();
1042 else
Caroline Ticedd759852010-09-09 17:45:09 +00001043 return NULL;
1044}
1045
Caroline Tice3df9a8d2010-09-04 00:03:46 +00001046SBError
Caroline Ticedd759852010-09-09 17:45:09 +00001047SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name)
Caroline Tice3df9a8d2010-09-04 00:03:46 +00001048{
Greg Clayton6920b522012-08-22 18:39:03 +00001049 SBError sb_error;
1050 DebuggerSP debugger_sp(Debugger::FindDebuggerWithInstanceName (ConstString(debugger_instance_name)));
1051 Error error;
1052 if (debugger_sp)
1053 {
1054 ExecutionContext exe_ctx (debugger_sp->GetCommandInterpreter().GetExecutionContext());
1055 error = debugger_sp->SetPropertyValue (&exe_ctx,
1056 eVarSetOperationAssign,
1057 var_name,
1058 value);
1059 }
1060 else
1061 {
1062 error.SetErrorStringWithFormat ("invalid debugger instance name '%s'", debugger_instance_name);
1063 }
1064 if (error.Fail())
1065 sb_error.SetError(error);
1066 return sb_error;
Caroline Tice3df9a8d2010-09-04 00:03:46 +00001067}
1068
Greg Clayton431ce672011-04-18 23:15:17 +00001069SBStringList
Caroline Ticedd759852010-09-09 17:45:09 +00001070SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name)
Caroline Tice3df9a8d2010-09-04 00:03:46 +00001071{
1072 SBStringList ret_value;
Greg Clayton6920b522012-08-22 18:39:03 +00001073 DebuggerSP debugger_sp(Debugger::FindDebuggerWithInstanceName (ConstString(debugger_instance_name)));
1074 Error error;
1075 if (debugger_sp)
1076 {
1077 ExecutionContext exe_ctx (debugger_sp->GetCommandInterpreter().GetExecutionContext());
1078 lldb::OptionValueSP value_sp (debugger_sp->GetPropertyValue (&exe_ctx,
1079 var_name,
1080 false,
1081 error));
1082 if (value_sp)
1083 {
1084 StreamString value_strm;
1085 value_sp->DumpValue (&exe_ctx, value_strm, OptionValue::eDumpOptionValue);
1086 const std::string &value_str = value_strm.GetString();
1087 if (!value_str.empty())
1088 {
1089 StringList string_list;
Greg Clayton44d93782014-01-27 23:43:24 +00001090 string_list.SplitIntoLines(value_str);
Greg Clayton6920b522012-08-22 18:39:03 +00001091 return SBStringList(&string_list);
1092 }
1093 }
1094 }
1095 return SBStringList();
Caroline Tice3df9a8d2010-09-04 00:03:46 +00001096}
1097
Greg Claytona7015092010-09-18 01:14:36 +00001098uint32_t
1099SBDebugger::GetTerminalWidth () const
1100{
1101 if (m_opaque_sp)
1102 return m_opaque_sp->GetTerminalWidth ();
1103 return 0;
1104}
1105
1106void
1107SBDebugger::SetTerminalWidth (uint32_t term_width)
1108{
1109 if (m_opaque_sp)
1110 m_opaque_sp->SetTerminalWidth (term_width);
1111}
1112
1113const char *
1114SBDebugger::GetPrompt() const
1115{
Greg Clayton5160ce52013-03-27 23:08:40 +00001116 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001117
Caroline Ticeceb6b132010-10-26 03:11:13 +00001118 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001119 log->Printf ("SBDebugger(%p)::GetPrompt () => \"%s\"",
1120 static_cast<void*>(m_opaque_sp.get()),
Caroline Tice750cd172010-10-26 23:49:36 +00001121 (m_opaque_sp ? m_opaque_sp->GetPrompt() : ""));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001122
Greg Claytona7015092010-09-18 01:14:36 +00001123 if (m_opaque_sp)
1124 return m_opaque_sp->GetPrompt ();
1125 return 0;
1126}
1127
1128void
1129SBDebugger::SetPrompt (const char *prompt)
1130{
1131 if (m_opaque_sp)
1132 m_opaque_sp->SetPrompt (prompt);
1133}
1134
1135
Greg Clayton431ce672011-04-18 23:15:17 +00001136ScriptLanguage
Greg Claytona7015092010-09-18 01:14:36 +00001137SBDebugger::GetScriptLanguage() const
1138{
1139 if (m_opaque_sp)
1140 return m_opaque_sp->GetScriptLanguage ();
1141 return eScriptLanguageNone;
1142}
1143
1144void
Greg Clayton431ce672011-04-18 23:15:17 +00001145SBDebugger::SetScriptLanguage (ScriptLanguage script_lang)
Greg Claytona7015092010-09-18 01:14:36 +00001146{
1147 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +00001148 {
Greg Claytona7015092010-09-18 01:14:36 +00001149 m_opaque_sp->SetScriptLanguage (script_lang);
Greg Claytonaf67cec2010-12-20 20:49:23 +00001150 }
Greg Claytona7015092010-09-18 01:14:36 +00001151}
1152
Jim Inghame40e4212010-08-30 19:44:40 +00001153bool
1154SBDebugger::SetUseExternalEditor (bool value)
1155{
1156 if (m_opaque_sp)
1157 return m_opaque_sp->SetUseExternalEditor (value);
Greg Claytonaf67cec2010-12-20 20:49:23 +00001158 return false;
Jim Inghame40e4212010-08-30 19:44:40 +00001159}
1160
1161bool
Caroline Ticedaccaa92010-09-20 20:44:43 +00001162SBDebugger::GetUseExternalEditor ()
Jim Inghame40e4212010-08-30 19:44:40 +00001163{
1164 if (m_opaque_sp)
Caroline Ticedaccaa92010-09-20 20:44:43 +00001165 return m_opaque_sp->GetUseExternalEditor ();
Greg Claytonaf67cec2010-12-20 20:49:23 +00001166 return false;
Jim Inghame40e4212010-08-30 19:44:40 +00001167}
1168
Caroline Ticedde9cff2010-09-20 05:20:02 +00001169bool
Michael Sartainc3ce7f272013-05-23 20:47:45 +00001170SBDebugger::SetUseColor (bool value)
1171{
1172 if (m_opaque_sp)
1173 return m_opaque_sp->SetUseColor (value);
1174 return false;
1175}
1176
1177bool
1178SBDebugger::GetUseColor () const
1179{
1180 if (m_opaque_sp)
1181 return m_opaque_sp->GetUseColor ();
1182 return false;
1183}
1184
1185bool
Caroline Ticedde9cff2010-09-20 05:20:02 +00001186SBDebugger::GetDescription (SBStream &description)
1187{
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001188 Stream &strm = description.ref();
1189
Caroline Ticedde9cff2010-09-20 05:20:02 +00001190 if (m_opaque_sp)
1191 {
1192 const char *name = m_opaque_sp->GetInstanceName().AsCString();
Greg Clayton431ce672011-04-18 23:15:17 +00001193 user_id_t id = m_opaque_sp->GetID();
Daniel Malead01b2952012-11-29 21:49:15 +00001194 strm.Printf ("Debugger (instance: \"%s\", id: %" PRIu64 ")", name, id);
Caroline Ticedde9cff2010-09-20 05:20:02 +00001195 }
1196 else
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001197 strm.PutCString ("No value");
Caroline Ticedde9cff2010-09-20 05:20:02 +00001198
1199 return true;
1200}
Caroline Ticeefed6132010-11-19 20:47:54 +00001201
Greg Clayton431ce672011-04-18 23:15:17 +00001202user_id_t
Caroline Ticeefed6132010-11-19 20:47:54 +00001203SBDebugger::GetID()
1204{
1205 if (m_opaque_sp)
1206 return m_opaque_sp->GetID();
1207 return LLDB_INVALID_UID;
1208}
Greg Clayton2289fa42011-04-30 01:09:13 +00001209
1210
1211SBError
Greg Clayton615eb7e2014-09-19 20:11:50 +00001212SBDebugger::SetCurrentPlatform (const char *platform_name_cstr)
Greg Clayton2289fa42011-04-30 01:09:13 +00001213{
1214 SBError sb_error;
1215 if (m_opaque_sp)
1216 {
Greg Clayton615eb7e2014-09-19 20:11:50 +00001217 if (platform_name_cstr && platform_name_cstr[0])
Greg Clayton2289fa42011-04-30 01:09:13 +00001218 {
Greg Clayton615eb7e2014-09-19 20:11:50 +00001219 ConstString platform_name (platform_name_cstr);
1220 PlatformSP platform_sp (Platform::Find (platform_name));
1221
1222 if (platform_sp)
1223 {
1224 // Already have a platform with this name, just select it
1225 m_opaque_sp->GetPlatformList().SetSelectedPlatform(platform_sp);
1226 }
1227 else
1228 {
1229 // We don't have a platform by this name yet, create one
1230 platform_sp = Platform::Create (platform_name, sb_error.ref());
1231 if (platform_sp)
1232 {
1233 // We created the platform, now append and select it
1234 bool make_selected = true;
1235 m_opaque_sp->GetPlatformList().Append (platform_sp, make_selected);
1236 }
1237 }
Greg Clayton2289fa42011-04-30 01:09:13 +00001238 }
Greg Clayton615eb7e2014-09-19 20:11:50 +00001239 else
1240 {
1241 sb_error.ref().SetErrorString("invalid platform name");
1242 }
1243 }
1244 else
1245 {
1246 sb_error.ref().SetErrorString("invalid debugger");
Greg Clayton2289fa42011-04-30 01:09:13 +00001247 }
1248 return sb_error;
1249}
1250
Greg Claytonfc3f0272011-05-29 04:06:55 +00001251bool
Greg Claytonf3dd93c2011-06-17 03:31:01 +00001252SBDebugger::SetCurrentPlatformSDKRoot (const char *sysroot)
1253{
1254 if (m_opaque_sp)
1255 {
1256 PlatformSP platform_sp (m_opaque_sp->GetPlatformList().GetSelectedPlatform());
1257
1258 if (platform_sp)
1259 {
1260 platform_sp->SetSDKRootDirectory (ConstString (sysroot));
1261 return true;
1262 }
1263 }
1264 return false;
1265}
1266
1267bool
Greg Claytonfc3f0272011-05-29 04:06:55 +00001268SBDebugger::GetCloseInputOnEOF () const
1269{
1270 if (m_opaque_sp)
1271 return m_opaque_sp->GetCloseInputOnEOF ();
1272 return false;
1273}
1274
1275void
1276SBDebugger::SetCloseInputOnEOF (bool b)
1277{
1278 if (m_opaque_sp)
1279 m_opaque_sp->SetCloseInputOnEOF (b);
1280}
Enrico Granata061858c2012-02-15 02:34:21 +00001281
1282SBTypeCategory
1283SBDebugger::GetCategory (const char* category_name)
1284{
1285 if (!category_name || *category_name == 0)
1286 return SBTypeCategory();
1287
1288 TypeCategoryImplSP category_sp;
1289
1290 if (DataVisualization::Categories::GetCategory(ConstString(category_name), category_sp, false))
1291 return SBTypeCategory(category_sp);
1292 else
1293 return SBTypeCategory();
1294}
1295
1296SBTypeCategory
1297SBDebugger::CreateCategory (const char* category_name)
1298{
1299 if (!category_name || *category_name == 0)
1300 return SBTypeCategory();
1301
1302 TypeCategoryImplSP category_sp;
1303
1304 if (DataVisualization::Categories::GetCategory(ConstString(category_name), category_sp, true))
1305 return SBTypeCategory(category_sp);
1306 else
1307 return SBTypeCategory();
1308}
1309
1310bool
1311SBDebugger::DeleteCategory (const char* category_name)
1312{
1313 if (!category_name || *category_name == 0)
1314 return false;
1315
1316 return DataVisualization::Categories::Delete(ConstString(category_name));
1317}
1318
1319uint32_t
1320SBDebugger::GetNumCategories()
1321{
1322 return DataVisualization::Categories::GetCount();
1323}
1324
1325SBTypeCategory
1326SBDebugger::GetCategoryAtIndex (uint32_t index)
1327{
1328 return SBTypeCategory(DataVisualization::Categories::GetCategoryAtIndex(index));
1329}
1330
1331SBTypeCategory
1332SBDebugger::GetDefaultCategory()
1333{
1334 return GetCategory("default");
1335}
1336
1337SBTypeFormat
1338SBDebugger::GetFormatForType (SBTypeNameSpecifier type_name)
1339{
1340 SBTypeCategory default_category_sb = GetDefaultCategory();
1341 if (default_category_sb.GetEnabled())
1342 return default_category_sb.GetFormatForType(type_name);
1343 return SBTypeFormat();
1344}
1345
Jason Molendacf7e2dc2012-02-21 05:33:55 +00001346#ifndef LLDB_DISABLE_PYTHON
Enrico Granata061858c2012-02-15 02:34:21 +00001347SBTypeSummary
1348SBDebugger::GetSummaryForType (SBTypeNameSpecifier type_name)
1349{
Enrico Granataa777dc22012-05-08 21:49:57 +00001350 if (type_name.IsValid() == false)
1351 return SBTypeSummary();
1352 return SBTypeSummary(DataVisualization::GetSummaryForType(type_name.GetSP()));
Enrico Granata061858c2012-02-15 02:34:21 +00001353}
Jason Molendacf7e2dc2012-02-21 05:33:55 +00001354#endif // LLDB_DISABLE_PYTHON
Enrico Granata061858c2012-02-15 02:34:21 +00001355
1356SBTypeFilter
1357SBDebugger::GetFilterForType (SBTypeNameSpecifier type_name)
1358{
Enrico Granataa777dc22012-05-08 21:49:57 +00001359 if (type_name.IsValid() == false)
1360 return SBTypeFilter();
1361 return SBTypeFilter(DataVisualization::GetFilterForType(type_name.GetSP()));
Enrico Granata061858c2012-02-15 02:34:21 +00001362}
1363
Jason Molendacf7e2dc2012-02-21 05:33:55 +00001364#ifndef LLDB_DISABLE_PYTHON
Enrico Granata061858c2012-02-15 02:34:21 +00001365SBTypeSynthetic
1366SBDebugger::GetSyntheticForType (SBTypeNameSpecifier type_name)
1367{
Enrico Granataa777dc22012-05-08 21:49:57 +00001368 if (type_name.IsValid() == false)
1369 return SBTypeSynthetic();
1370 return SBTypeSynthetic(DataVisualization::GetSyntheticForType(type_name.GetSP()));
Enrico Granata061858c2012-02-15 02:34:21 +00001371}
Jason Molendacf7e2dc2012-02-21 05:33:55 +00001372#endif // LLDB_DISABLE_PYTHON
Enrico Granata061858c2012-02-15 02:34:21 +00001373
Jim Ingham228063c2012-02-21 02:23:08 +00001374bool
1375SBDebugger::EnableLog (const char *channel, const char **categories)
1376{
1377 if (m_opaque_sp)
1378 {
1379 uint32_t log_options = LLDB_LOG_OPTION_PREPEND_TIMESTAMP | LLDB_LOG_OPTION_PREPEND_THREAD_NAME;
1380 StreamString errors;
1381 return m_opaque_sp->EnableLog (channel, categories, NULL, log_options, errors);
1382
1383 }
1384 else
1385 return false;
1386}
Jim Ingham4f02b222012-02-22 22:49:20 +00001387
1388void
1389SBDebugger::SetLoggingCallback (lldb::LogOutputCallback log_callback, void *baton)
1390{
1391 if (m_opaque_sp)
1392 {
1393 return m_opaque_sp->SetLoggingCallback (log_callback, baton);
1394 }
1395}
1396
1397