blob: a95f2ffc06d950ac1de771250b337f4c4ecf2651 [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 Clayton66111032010-06-23 01:19:29 +0000718 Error error;
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000719 const bool add_dependent_modules = true;
Greg Claytonbf702ce2014-11-13 18:30:06 +0000720 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
Greg Claytona0ca6602012-10-18 16:33:33 +0000721 filename,
Greg Claytonbf702ce2014-11-13 18:30:06 +0000722 NULL,
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000723 add_dependent_modules,
Greg Claytonbf702ce2014-11-13 18:30:06 +0000724 NULL,
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000725 target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000726
727 if (error.Success())
728 {
Jim Ingham2976d002010-08-26 21:32:51 +0000729 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Claytonb9556ac2012-01-30 07:41:31 +0000730 sb_target.SetSP (target_sp);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000731 }
732 }
Greg Clayton5160ce52013-03-27 23:08:40 +0000733 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000734 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000735 log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)",
736 static_cast<void*>(m_opaque_sp.get()), filename,
737 static_cast<void*>(target_sp.get()));
Greg Claytonb9556ac2012-01-30 07:41:31 +0000738 return sb_target;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000739}
740
Johnny Chen3794ad92011-06-15 21:24:24 +0000741bool
742SBDebugger::DeleteTarget (lldb::SBTarget &target)
743{
744 bool result = false;
Greg Claytonb9556ac2012-01-30 07:41:31 +0000745 if (m_opaque_sp)
Johnny Chen3794ad92011-06-15 21:24:24 +0000746 {
Greg Claytonb9556ac2012-01-30 07:41:31 +0000747 TargetSP target_sp(target.GetSP());
748 if (target_sp)
749 {
750 // No need to lock, the target list is thread safe
751 result = m_opaque_sp->GetTargetList().DeleteTarget (target_sp);
752 target_sp->Destroy();
753 target.Clear();
Greg Clayton0cd70862012-04-09 20:22:01 +0000754 const bool mandatory = true;
755 ModuleList::RemoveOrphanSharedModules(mandatory);
Greg Claytonb9556ac2012-01-30 07:41:31 +0000756 }
Johnny Chen3794ad92011-06-15 21:24:24 +0000757 }
758
Greg Clayton5160ce52013-03-27 23:08:40 +0000759 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Johnny Chen3794ad92011-06-15 21:24:24 +0000760 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000761 log->Printf ("SBDebugger(%p)::DeleteTarget (SBTarget(%p)) => %i",
762 static_cast<void*>(m_opaque_sp.get()),
763 static_cast<void*>(target.m_opaque_sp.get()), result);
Johnny Chen3794ad92011-06-15 21:24:24 +0000764
765 return result;
766}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000767SBTarget
768SBDebugger::GetTargetAtIndex (uint32_t idx)
769{
Greg Clayton66111032010-06-23 01:19:29 +0000770 SBTarget sb_target;
771 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000772 {
773 // No need to lock, the target list is thread safe
Greg Claytonb9556ac2012-01-30 07:41:31 +0000774 sb_target.SetSP (m_opaque_sp->GetTargetList().GetTargetAtIndex (idx));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000775 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000776 return sb_target;
777}
778
Jim Ingham8499e1a2012-05-08 23:06:07 +0000779uint32_t
780SBDebugger::GetIndexOfTarget (lldb::SBTarget target)
781{
782
783 lldb::TargetSP target_sp = target.GetSP();
784 if (!target_sp)
785 return UINT32_MAX;
786
787 if (!m_opaque_sp)
788 return UINT32_MAX;
789
790 return m_opaque_sp->GetTargetList().GetIndexOfTarget (target.GetSP());
791}
792
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000793SBTarget
Virgile Bello997f6f72013-09-05 16:53:14 +0000794SBDebugger::FindTargetWithProcessID (lldb::pid_t pid)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000795{
Greg Clayton66111032010-06-23 01:19:29 +0000796 SBTarget sb_target;
797 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000798 {
799 // No need to lock, the target list is thread safe
Greg Claytonb9556ac2012-01-30 07:41:31 +0000800 sb_target.SetSP (m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000801 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000802 return sb_target;
803}
804
805SBTarget
806SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name)
807{
Greg Clayton66111032010-06-23 01:19:29 +0000808 SBTarget sb_target;
809 if (m_opaque_sp && filename && filename[0])
810 {
Greg Claytonaf67cec2010-12-20 20:49:23 +0000811 // No need to lock, the target list is thread safe
Greg Claytoneb0103f2011-04-07 22:46:35 +0000812 ArchSpec arch (arch_name, m_opaque_sp->GetPlatformList().GetSelectedPlatform().get());
Greg Clayton274060b2010-10-20 20:54:39 +0000813 TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename, false), arch_name ? &arch : NULL));
Greg Claytonb9556ac2012-01-30 07:41:31 +0000814 sb_target.SetSP (target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000815 }
816 return sb_target;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000817}
818
819SBTarget
Greg Clayton431ce672011-04-18 23:15:17 +0000820SBDebugger::FindTargetWithLLDBProcess (const ProcessSP &process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000821{
Greg Clayton66111032010-06-23 01:19:29 +0000822 SBTarget sb_target;
823 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000824 {
825 // No need to lock, the target list is thread safe
Greg Claytonb9556ac2012-01-30 07:41:31 +0000826 sb_target.SetSP (m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get()));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000827 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000828 return sb_target;
829}
830
831
832uint32_t
833SBDebugger::GetNumTargets ()
834{
Greg Clayton66111032010-06-23 01:19:29 +0000835 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000836 {
837 // No need to lock, the target list is thread safe
Greg Clayton66111032010-06-23 01:19:29 +0000838 return m_opaque_sp->GetTargetList().GetNumTargets ();
Greg Claytonaf67cec2010-12-20 20:49:23 +0000839 }
Greg Clayton66111032010-06-23 01:19:29 +0000840 return 0;
841}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000842
843SBTarget
Jim Ingham2976d002010-08-26 21:32:51 +0000844SBDebugger::GetSelectedTarget ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000845{
Greg Clayton5160ce52013-03-27 23:08:40 +0000846 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000847
Greg Clayton66111032010-06-23 01:19:29 +0000848 SBTarget sb_target;
Greg Claytonb9556ac2012-01-30 07:41:31 +0000849 TargetSP target_sp;
Greg Clayton66111032010-06-23 01:19:29 +0000850 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000851 {
852 // No need to lock, the target list is thread safe
Greg Claytonb9556ac2012-01-30 07:41:31 +0000853 target_sp = m_opaque_sp->GetTargetList().GetSelectedTarget ();
854 sb_target.SetSP (target_sp);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000855 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000856
857 if (log)
858 {
859 SBStream sstr;
Greg Clayton431ce672011-04-18 23:15:17 +0000860 sb_target.GetDescription (sstr, eDescriptionLevelBrief);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000861 log->Printf ("SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s",
862 static_cast<void*>(m_opaque_sp.get()),
863 static_cast<void*>(target_sp.get()), sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000864 }
865
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000866 return sb_target;
867}
868
869void
Jim Inghame64f0dc2011-09-13 23:25:31 +0000870SBDebugger::SetSelectedTarget (SBTarget &sb_target)
871{
Greg Clayton5160ce52013-03-27 23:08:40 +0000872 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Inghame64f0dc2011-09-13 23:25:31 +0000873
Greg Claytonb9556ac2012-01-30 07:41:31 +0000874 TargetSP target_sp (sb_target.GetSP());
Jim Inghame64f0dc2011-09-13 23:25:31 +0000875 if (m_opaque_sp)
876 {
Greg Claytonb9556ac2012-01-30 07:41:31 +0000877 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Jim Inghame64f0dc2011-09-13 23:25:31 +0000878 }
879 if (log)
880 {
881 SBStream sstr;
882 sb_target.GetDescription (sstr, eDescriptionLevelBrief);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000883 log->Printf ("SBDebugger(%p)::SetSelectedTarget () => SBTarget(%p): %s",
884 static_cast<void*>(m_opaque_sp.get()),
885 static_cast<void*>(target_sp.get()), sstr.GetData());
Jim Inghame64f0dc2011-09-13 23:25:31 +0000886 }
887}
888
Greg Claytonfbb76342013-11-20 21:07:01 +0000889SBPlatform
890SBDebugger::GetSelectedPlatform()
891{
892 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
893
894 SBPlatform sb_platform;
895 DebuggerSP debugger_sp(m_opaque_sp);
896 if (debugger_sp)
897 {
898 sb_platform.SetSP(debugger_sp->GetPlatformList().GetSelectedPlatform());
899 }
900 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000901 log->Printf ("SBDebugger(%p)::GetSelectedPlatform () => SBPlatform(%p): %s",
902 static_cast<void*>(m_opaque_sp.get()),
903 static_cast<void*>(sb_platform.GetSP().get()),
904 sb_platform.GetName());
Greg Claytonfbb76342013-11-20 21:07:01 +0000905 return sb_platform;
906}
907
908void
909SBDebugger::SetSelectedPlatform(SBPlatform &sb_platform)
910{
911 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000912
Greg Claytonfbb76342013-11-20 21:07:01 +0000913 DebuggerSP debugger_sp(m_opaque_sp);
914 if (debugger_sp)
915 {
916 debugger_sp->GetPlatformList().SetSelectedPlatform(sb_platform.GetSP());
917 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000918
Greg Claytonfbb76342013-11-20 21:07:01 +0000919 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000920 log->Printf ("SBDebugger(%p)::SetSelectedPlatform (SBPlatform(%p) %s)",
921 static_cast<void*>(m_opaque_sp.get()),
922 static_cast<void*>(sb_platform.GetSP().get()),
923 sb_platform.GetName());
Greg Claytonfbb76342013-11-20 21:07:01 +0000924}
925
Jim Inghame64f0dc2011-09-13 23:25:31 +0000926void
Enrico Granatac30a73a2012-09-06 22:02:28 +0000927SBDebugger::DispatchInput (void* baton, const void *data, size_t data_len)
Enrico Granata6b09d422012-09-06 21:58:25 +0000928{
929 DispatchInput (data,data_len);
930}
931
932void
Filipe Cabecinhasc3019992012-08-20 16:21:04 +0000933SBDebugger::DispatchInput (const void *data, size_t data_len)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000934{
Greg Clayton44d93782014-01-27 23:43:24 +0000935// Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
936//
937// if (log)
938// log->Printf ("SBDebugger(%p)::DispatchInput (data=\"%.*s\", size_t=%" PRIu64 ")",
939// m_opaque_sp.get(),
940// (int) data_len,
941// (const char *) data,
942// (uint64_t)data_len);
943//
944// if (m_opaque_sp)
945// m_opaque_sp->DispatchInput ((const char *) data, data_len);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000946}
947
948void
Caroline Ticeefed6132010-11-19 20:47:54 +0000949SBDebugger::DispatchInputInterrupt ()
950{
951 if (m_opaque_sp)
952 m_opaque_sp->DispatchInputInterrupt ();
953}
954
955void
956SBDebugger::DispatchInputEndOfFile ()
957{
958 if (m_opaque_sp)
959 m_opaque_sp->DispatchInputEndOfFile ();
960}
961
962void
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000963SBDebugger::PushInputReader (SBInputReader &reader)
964{
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000965}
Greg Clayton66111032010-06-23 01:19:29 +0000966
967void
Greg Clayton44d93782014-01-27 23:43:24 +0000968SBDebugger::RunCommandInterpreter (bool auto_handle_events,
969 bool spawn_thread)
Caroline Tice969ed3d2011-05-02 20:41:46 +0000970{
Caroline Tice969ed3d2011-05-02 20:41:46 +0000971 if (m_opaque_sp)
Jim Ingham26c7bf92014-10-11 00:38:27 +0000972 {
973 CommandInterpreterRunOptions options;
974
975 m_opaque_sp->GetCommandInterpreter().RunCommandInterpreter(auto_handle_events,
976 spawn_thread,
977 options);
978 }
979}
980
981void
982SBDebugger::RunCommandInterpreter (bool auto_handle_events,
983 bool spawn_thread,
984 SBCommandInterpreterRunOptions &options,
985 int &num_errors,
Jim Inghamffc9f1d2014-10-14 01:20:07 +0000986 bool &quit_requested,
987 bool &stopped_for_crash)
Jim Ingham26c7bf92014-10-11 00:38:27 +0000988
989{
990 if (m_opaque_sp)
991 {
992 CommandInterpreter &interp = m_opaque_sp->GetCommandInterpreter();
993 interp.RunCommandInterpreter(auto_handle_events, spawn_thread, options.ref());
994 num_errors = interp.GetNumErrors();
995 quit_requested = interp.GetQuitRequested();
Jim Inghamffc9f1d2014-10-14 01:20:07 +0000996 stopped_for_crash = interp.GetStoppedForCrash();
Jim Ingham26c7bf92014-10-11 00:38:27 +0000997 }
Caroline Tice969ed3d2011-05-02 20:41:46 +0000998}
999
1000void
Greg Clayton431ce672011-04-18 23:15:17 +00001001SBDebugger::reset (const DebuggerSP &debugger_sp)
Greg Clayton66111032010-06-23 01:19:29 +00001002{
1003 m_opaque_sp = debugger_sp;
1004}
1005
1006Debugger *
1007SBDebugger::get () const
1008{
1009 return m_opaque_sp.get();
1010}
1011
1012Debugger &
1013SBDebugger::ref () const
1014{
1015 assert (m_opaque_sp.get());
1016 return *m_opaque_sp;
1017}
1018
Greg Clayton9a377662011-10-01 02:59:24 +00001019const lldb::DebuggerSP &
1020SBDebugger::get_sp () const
1021{
1022 return m_opaque_sp;
1023}
Greg Clayton66111032010-06-23 01:19:29 +00001024
Caroline Ticeebc1bb22010-06-30 16:22:25 +00001025SBDebugger
1026SBDebugger::FindDebuggerWithID (int id)
1027{
Greg Claytonaf67cec2010-12-20 20:49:23 +00001028 // No need to lock, the debugger list is thread safe
Caroline Ticeebc1bb22010-06-30 16:22:25 +00001029 SBDebugger sb_debugger;
Greg Clayton431ce672011-04-18 23:15:17 +00001030 DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id);
Caroline Ticeebc1bb22010-06-30 16:22:25 +00001031 if (debugger_sp)
1032 sb_debugger.reset (debugger_sp);
1033 return sb_debugger;
1034}
Jim Inghame40e4212010-08-30 19:44:40 +00001035
Caroline Ticedd759852010-09-09 17:45:09 +00001036const char *
1037SBDebugger::GetInstanceName()
1038{
Greg Clayton6920b522012-08-22 18:39:03 +00001039 if (m_opaque_sp)
1040 return m_opaque_sp->GetInstanceName().AsCString();
1041 else
Caroline Ticedd759852010-09-09 17:45:09 +00001042 return NULL;
1043}
1044
Caroline Tice3df9a8d2010-09-04 00:03:46 +00001045SBError
Caroline Ticedd759852010-09-09 17:45:09 +00001046SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name)
Caroline Tice3df9a8d2010-09-04 00:03:46 +00001047{
Greg Clayton6920b522012-08-22 18:39:03 +00001048 SBError sb_error;
1049 DebuggerSP debugger_sp(Debugger::FindDebuggerWithInstanceName (ConstString(debugger_instance_name)));
1050 Error error;
1051 if (debugger_sp)
1052 {
1053 ExecutionContext exe_ctx (debugger_sp->GetCommandInterpreter().GetExecutionContext());
1054 error = debugger_sp->SetPropertyValue (&exe_ctx,
1055 eVarSetOperationAssign,
1056 var_name,
1057 value);
1058 }
1059 else
1060 {
1061 error.SetErrorStringWithFormat ("invalid debugger instance name '%s'", debugger_instance_name);
1062 }
1063 if (error.Fail())
1064 sb_error.SetError(error);
1065 return sb_error;
Caroline Tice3df9a8d2010-09-04 00:03:46 +00001066}
1067
Greg Clayton431ce672011-04-18 23:15:17 +00001068SBStringList
Caroline Ticedd759852010-09-09 17:45:09 +00001069SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name)
Caroline Tice3df9a8d2010-09-04 00:03:46 +00001070{
1071 SBStringList ret_value;
Greg Clayton6920b522012-08-22 18:39:03 +00001072 DebuggerSP debugger_sp(Debugger::FindDebuggerWithInstanceName (ConstString(debugger_instance_name)));
1073 Error error;
1074 if (debugger_sp)
1075 {
1076 ExecutionContext exe_ctx (debugger_sp->GetCommandInterpreter().GetExecutionContext());
1077 lldb::OptionValueSP value_sp (debugger_sp->GetPropertyValue (&exe_ctx,
1078 var_name,
1079 false,
1080 error));
1081 if (value_sp)
1082 {
1083 StreamString value_strm;
1084 value_sp->DumpValue (&exe_ctx, value_strm, OptionValue::eDumpOptionValue);
1085 const std::string &value_str = value_strm.GetString();
1086 if (!value_str.empty())
1087 {
1088 StringList string_list;
Greg Clayton44d93782014-01-27 23:43:24 +00001089 string_list.SplitIntoLines(value_str);
Greg Clayton6920b522012-08-22 18:39:03 +00001090 return SBStringList(&string_list);
1091 }
1092 }
1093 }
1094 return SBStringList();
Caroline Tice3df9a8d2010-09-04 00:03:46 +00001095}
1096
Greg Claytona7015092010-09-18 01:14:36 +00001097uint32_t
1098SBDebugger::GetTerminalWidth () const
1099{
1100 if (m_opaque_sp)
1101 return m_opaque_sp->GetTerminalWidth ();
1102 return 0;
1103}
1104
1105void
1106SBDebugger::SetTerminalWidth (uint32_t term_width)
1107{
1108 if (m_opaque_sp)
1109 m_opaque_sp->SetTerminalWidth (term_width);
1110}
1111
1112const char *
1113SBDebugger::GetPrompt() const
1114{
Greg Clayton5160ce52013-03-27 23:08:40 +00001115 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001116
Caroline Ticeceb6b132010-10-26 03:11:13 +00001117 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001118 log->Printf ("SBDebugger(%p)::GetPrompt () => \"%s\"",
1119 static_cast<void*>(m_opaque_sp.get()),
Caroline Tice750cd172010-10-26 23:49:36 +00001120 (m_opaque_sp ? m_opaque_sp->GetPrompt() : ""));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001121
Greg Claytona7015092010-09-18 01:14:36 +00001122 if (m_opaque_sp)
1123 return m_opaque_sp->GetPrompt ();
1124 return 0;
1125}
1126
1127void
1128SBDebugger::SetPrompt (const char *prompt)
1129{
1130 if (m_opaque_sp)
1131 m_opaque_sp->SetPrompt (prompt);
1132}
1133
1134
Greg Clayton431ce672011-04-18 23:15:17 +00001135ScriptLanguage
Greg Claytona7015092010-09-18 01:14:36 +00001136SBDebugger::GetScriptLanguage() const
1137{
1138 if (m_opaque_sp)
1139 return m_opaque_sp->GetScriptLanguage ();
1140 return eScriptLanguageNone;
1141}
1142
1143void
Greg Clayton431ce672011-04-18 23:15:17 +00001144SBDebugger::SetScriptLanguage (ScriptLanguage script_lang)
Greg Claytona7015092010-09-18 01:14:36 +00001145{
1146 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +00001147 {
Greg Claytona7015092010-09-18 01:14:36 +00001148 m_opaque_sp->SetScriptLanguage (script_lang);
Greg Claytonaf67cec2010-12-20 20:49:23 +00001149 }
Greg Claytona7015092010-09-18 01:14:36 +00001150}
1151
Jim Inghame40e4212010-08-30 19:44:40 +00001152bool
1153SBDebugger::SetUseExternalEditor (bool value)
1154{
1155 if (m_opaque_sp)
1156 return m_opaque_sp->SetUseExternalEditor (value);
Greg Claytonaf67cec2010-12-20 20:49:23 +00001157 return false;
Jim Inghame40e4212010-08-30 19:44:40 +00001158}
1159
1160bool
Caroline Ticedaccaa92010-09-20 20:44:43 +00001161SBDebugger::GetUseExternalEditor ()
Jim Inghame40e4212010-08-30 19:44:40 +00001162{
1163 if (m_opaque_sp)
Caroline Ticedaccaa92010-09-20 20:44:43 +00001164 return m_opaque_sp->GetUseExternalEditor ();
Greg Claytonaf67cec2010-12-20 20:49:23 +00001165 return false;
Jim Inghame40e4212010-08-30 19:44:40 +00001166}
1167
Caroline Ticedde9cff2010-09-20 05:20:02 +00001168bool
Michael Sartainc3ce7f272013-05-23 20:47:45 +00001169SBDebugger::SetUseColor (bool value)
1170{
1171 if (m_opaque_sp)
1172 return m_opaque_sp->SetUseColor (value);
1173 return false;
1174}
1175
1176bool
1177SBDebugger::GetUseColor () const
1178{
1179 if (m_opaque_sp)
1180 return m_opaque_sp->GetUseColor ();
1181 return false;
1182}
1183
1184bool
Caroline Ticedde9cff2010-09-20 05:20:02 +00001185SBDebugger::GetDescription (SBStream &description)
1186{
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001187 Stream &strm = description.ref();
1188
Caroline Ticedde9cff2010-09-20 05:20:02 +00001189 if (m_opaque_sp)
1190 {
1191 const char *name = m_opaque_sp->GetInstanceName().AsCString();
Greg Clayton431ce672011-04-18 23:15:17 +00001192 user_id_t id = m_opaque_sp->GetID();
Daniel Malead01b2952012-11-29 21:49:15 +00001193 strm.Printf ("Debugger (instance: \"%s\", id: %" PRIu64 ")", name, id);
Caroline Ticedde9cff2010-09-20 05:20:02 +00001194 }
1195 else
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001196 strm.PutCString ("No value");
Caroline Ticedde9cff2010-09-20 05:20:02 +00001197
1198 return true;
1199}
Caroline Ticeefed6132010-11-19 20:47:54 +00001200
Greg Clayton431ce672011-04-18 23:15:17 +00001201user_id_t
Caroline Ticeefed6132010-11-19 20:47:54 +00001202SBDebugger::GetID()
1203{
1204 if (m_opaque_sp)
1205 return m_opaque_sp->GetID();
1206 return LLDB_INVALID_UID;
1207}
Greg Clayton2289fa42011-04-30 01:09:13 +00001208
1209
1210SBError
Greg Clayton615eb7e2014-09-19 20:11:50 +00001211SBDebugger::SetCurrentPlatform (const char *platform_name_cstr)
Greg Clayton2289fa42011-04-30 01:09:13 +00001212{
1213 SBError sb_error;
1214 if (m_opaque_sp)
1215 {
Greg Clayton615eb7e2014-09-19 20:11:50 +00001216 if (platform_name_cstr && platform_name_cstr[0])
Greg Clayton2289fa42011-04-30 01:09:13 +00001217 {
Greg Clayton615eb7e2014-09-19 20:11:50 +00001218 ConstString platform_name (platform_name_cstr);
1219 PlatformSP platform_sp (Platform::Find (platform_name));
1220
1221 if (platform_sp)
1222 {
1223 // Already have a platform with this name, just select it
1224 m_opaque_sp->GetPlatformList().SetSelectedPlatform(platform_sp);
1225 }
1226 else
1227 {
1228 // We don't have a platform by this name yet, create one
1229 platform_sp = Platform::Create (platform_name, sb_error.ref());
1230 if (platform_sp)
1231 {
1232 // We created the platform, now append and select it
1233 bool make_selected = true;
1234 m_opaque_sp->GetPlatformList().Append (platform_sp, make_selected);
1235 }
1236 }
Greg Clayton2289fa42011-04-30 01:09:13 +00001237 }
Greg Clayton615eb7e2014-09-19 20:11:50 +00001238 else
1239 {
1240 sb_error.ref().SetErrorString("invalid platform name");
1241 }
1242 }
1243 else
1244 {
1245 sb_error.ref().SetErrorString("invalid debugger");
Greg Clayton2289fa42011-04-30 01:09:13 +00001246 }
1247 return sb_error;
1248}
1249
Greg Claytonfc3f0272011-05-29 04:06:55 +00001250bool
Greg Claytonf3dd93c2011-06-17 03:31:01 +00001251SBDebugger::SetCurrentPlatformSDKRoot (const char *sysroot)
1252{
1253 if (m_opaque_sp)
1254 {
1255 PlatformSP platform_sp (m_opaque_sp->GetPlatformList().GetSelectedPlatform());
1256
1257 if (platform_sp)
1258 {
1259 platform_sp->SetSDKRootDirectory (ConstString (sysroot));
1260 return true;
1261 }
1262 }
1263 return false;
1264}
1265
1266bool
Greg Claytonfc3f0272011-05-29 04:06:55 +00001267SBDebugger::GetCloseInputOnEOF () const
1268{
1269 if (m_opaque_sp)
1270 return m_opaque_sp->GetCloseInputOnEOF ();
1271 return false;
1272}
1273
1274void
1275SBDebugger::SetCloseInputOnEOF (bool b)
1276{
1277 if (m_opaque_sp)
1278 m_opaque_sp->SetCloseInputOnEOF (b);
1279}
Enrico Granata061858c2012-02-15 02:34:21 +00001280
1281SBTypeCategory
1282SBDebugger::GetCategory (const char* category_name)
1283{
1284 if (!category_name || *category_name == 0)
1285 return SBTypeCategory();
1286
1287 TypeCategoryImplSP category_sp;
1288
1289 if (DataVisualization::Categories::GetCategory(ConstString(category_name), category_sp, false))
1290 return SBTypeCategory(category_sp);
1291 else
1292 return SBTypeCategory();
1293}
1294
1295SBTypeCategory
1296SBDebugger::CreateCategory (const char* category_name)
1297{
1298 if (!category_name || *category_name == 0)
1299 return SBTypeCategory();
1300
1301 TypeCategoryImplSP category_sp;
1302
1303 if (DataVisualization::Categories::GetCategory(ConstString(category_name), category_sp, true))
1304 return SBTypeCategory(category_sp);
1305 else
1306 return SBTypeCategory();
1307}
1308
1309bool
1310SBDebugger::DeleteCategory (const char* category_name)
1311{
1312 if (!category_name || *category_name == 0)
1313 return false;
1314
1315 return DataVisualization::Categories::Delete(ConstString(category_name));
1316}
1317
1318uint32_t
1319SBDebugger::GetNumCategories()
1320{
1321 return DataVisualization::Categories::GetCount();
1322}
1323
1324SBTypeCategory
1325SBDebugger::GetCategoryAtIndex (uint32_t index)
1326{
1327 return SBTypeCategory(DataVisualization::Categories::GetCategoryAtIndex(index));
1328}
1329
1330SBTypeCategory
1331SBDebugger::GetDefaultCategory()
1332{
1333 return GetCategory("default");
1334}
1335
1336SBTypeFormat
1337SBDebugger::GetFormatForType (SBTypeNameSpecifier type_name)
1338{
1339 SBTypeCategory default_category_sb = GetDefaultCategory();
1340 if (default_category_sb.GetEnabled())
1341 return default_category_sb.GetFormatForType(type_name);
1342 return SBTypeFormat();
1343}
1344
Jason Molendacf7e2dc2012-02-21 05:33:55 +00001345#ifndef LLDB_DISABLE_PYTHON
Enrico Granata061858c2012-02-15 02:34:21 +00001346SBTypeSummary
1347SBDebugger::GetSummaryForType (SBTypeNameSpecifier type_name)
1348{
Enrico Granataa777dc22012-05-08 21:49:57 +00001349 if (type_name.IsValid() == false)
1350 return SBTypeSummary();
1351 return SBTypeSummary(DataVisualization::GetSummaryForType(type_name.GetSP()));
Enrico Granata061858c2012-02-15 02:34:21 +00001352}
Jason Molendacf7e2dc2012-02-21 05:33:55 +00001353#endif // LLDB_DISABLE_PYTHON
Enrico Granata061858c2012-02-15 02:34:21 +00001354
1355SBTypeFilter
1356SBDebugger::GetFilterForType (SBTypeNameSpecifier type_name)
1357{
Enrico Granataa777dc22012-05-08 21:49:57 +00001358 if (type_name.IsValid() == false)
1359 return SBTypeFilter();
1360 return SBTypeFilter(DataVisualization::GetFilterForType(type_name.GetSP()));
Enrico Granata061858c2012-02-15 02:34:21 +00001361}
1362
Jason Molendacf7e2dc2012-02-21 05:33:55 +00001363#ifndef LLDB_DISABLE_PYTHON
Enrico Granata061858c2012-02-15 02:34:21 +00001364SBTypeSynthetic
1365SBDebugger::GetSyntheticForType (SBTypeNameSpecifier type_name)
1366{
Enrico Granataa777dc22012-05-08 21:49:57 +00001367 if (type_name.IsValid() == false)
1368 return SBTypeSynthetic();
1369 return SBTypeSynthetic(DataVisualization::GetSyntheticForType(type_name.GetSP()));
Enrico Granata061858c2012-02-15 02:34:21 +00001370}
Jason Molendacf7e2dc2012-02-21 05:33:55 +00001371#endif // LLDB_DISABLE_PYTHON
Enrico Granata061858c2012-02-15 02:34:21 +00001372
Jim Ingham228063c2012-02-21 02:23:08 +00001373bool
1374SBDebugger::EnableLog (const char *channel, const char **categories)
1375{
1376 if (m_opaque_sp)
1377 {
1378 uint32_t log_options = LLDB_LOG_OPTION_PREPEND_TIMESTAMP | LLDB_LOG_OPTION_PREPEND_THREAD_NAME;
1379 StreamString errors;
1380 return m_opaque_sp->EnableLog (channel, categories, NULL, log_options, errors);
1381
1382 }
1383 else
1384 return false;
1385}
Jim Ingham4f02b222012-02-22 22:49:20 +00001386
1387void
1388SBDebugger::SetLoggingCallback (lldb::LogOutputCallback log_callback, void *baton)
1389{
1390 if (m_opaque_sp)
1391 {
1392 return m_opaque_sp->SetLoggingCallback (log_callback, baton);
1393 }
1394}
1395
1396