blob: 8eea87af2397de48bfd4ef2a7dd11029a1e447e1 [file] [log] [blame]
Chris Lattner24943d22010-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
Eli Friedmand6ec8aa2010-06-09 07:37:52 +000010#include "lldb/API/SBDebugger.h"
Chris Lattner24943d22010-06-08 16:52:24 +000011
Greg Claytonb3448432011-03-24 21:19:54 +000012#include "lldb/lldb-private.h"
Chris Lattner24943d22010-06-08 16:52:24 +000013
Eli Friedmand6ec8aa2010-06-09 07:37:52 +000014#include "lldb/API/SBListener.h"
15#include "lldb/API/SBBroadcaster.h"
16#include "lldb/API/SBCommandInterpreter.h"
17#include "lldb/API/SBCommandReturnObject.h"
Greg Clayton180546b2011-04-30 01:09:13 +000018#include "lldb/API/SBError.h"
Eli Friedmand6ec8aa2010-06-09 07:37:52 +000019#include "lldb/API/SBEvent.h"
20#include "lldb/API/SBFrame.h"
Eli Friedmand6ec8aa2010-06-09 07:37:52 +000021#include "lldb/API/SBInputReader.h"
Caroline Tice6e4c5ce2010-09-04 00:03:46 +000022#include "lldb/API/SBProcess.h"
23#include "lldb/API/SBSourceManager.h"
Caroline Tice98f930f2010-09-20 05:20:02 +000024#include "lldb/API/SBStream.h"
Caroline Tice6e4c5ce2010-09-04 00:03:46 +000025#include "lldb/API/SBStringList.h"
26#include "lldb/API/SBTarget.h"
27#include "lldb/API/SBThread.h"
Enrico Granata16376ed2012-02-15 02:34:21 +000028#include "lldb/API/SBTypeCategory.h"
29#include "lldb/API/SBTypeFormat.h"
30#include "lldb/API/SBTypeFilter.h"
31#include "lldb/API/SBTypeNameSpecifier.h"
32#include "lldb/API/SBTypeSummary.h"
33#include "lldb/API/SBTypeSynthetic.h"
34
35
36#include "lldb/Core/DataVisualization.h"
Greg Clayton887aa282010-10-11 01:05:37 +000037#include "lldb/Core/Debugger.h"
38#include "lldb/Core/State.h"
39#include "lldb/Interpreter/Args.h"
40#include "lldb/Interpreter/CommandInterpreter.h"
Greg Clayton3e8c25f2011-09-24 00:52:29 +000041#include "lldb/Interpreter/OptionGroupPlatform.h"
Greg Clayton887aa282010-10-11 01:05:37 +000042#include "lldb/Target/Process.h"
43#include "lldb/Target/TargetList.h"
Chris Lattner24943d22010-06-08 16:52:24 +000044
45using namespace lldb;
46using namespace lldb_private;
47
48void
49SBDebugger::Initialize ()
50{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +000051 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +000052
53 if (log)
54 log->Printf ("SBDebugger::Initialize ()");
55
Greg Claytone86cbb92011-03-22 01:14:58 +000056 SBCommandInterpreter::InitializeSWIG ();
57
Chris Lattner24943d22010-06-08 16:52:24 +000058 Debugger::Initialize();
59}
60
61void
62SBDebugger::Terminate ()
63{
64 Debugger::Terminate();
65}
66
Greg Clayton43490d12010-07-30 20:12:55 +000067void
68SBDebugger::Clear ()
69{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +000070 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +000071
72 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +000073 log->Printf ("SBDebugger(%p)::Clear ()", m_opaque_sp.get());
Caroline Ticec0446862010-12-20 18:35:50 +000074
75 if (m_opaque_sp)
76 m_opaque_sp->CleanUpInputReaders ();
Caroline Tice7826c882010-10-26 03:11:13 +000077
Greg Clayton43490d12010-07-30 20:12:55 +000078 m_opaque_sp.reset();
79}
80
Greg Clayton63094e02010-06-23 01:19:29 +000081SBDebugger
82SBDebugger::Create()
83{
Jim Ingham6c530f22012-02-21 02:23:08 +000084 return SBDebugger::Create(false, NULL, NULL);
Jim Ingham558dd5b2011-08-13 00:22:20 +000085}
86
87SBDebugger
88SBDebugger::Create(bool source_init_files)
89{
Jim Ingham6c530f22012-02-21 02:23:08 +000090 return SBDebugger::Create (source_init_files, NULL, NULL);
91}
92
93SBDebugger
94SBDebugger::Create(bool source_init_files, lldb::LogOutputCallback callback, void *baton)
95
96{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +000097 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +000098
Greg Clayton63094e02010-06-23 01:19:29 +000099 SBDebugger debugger;
Jim Ingham6c530f22012-02-21 02:23:08 +0000100 debugger.reset(Debugger::CreateInstance(callback, baton));
Caroline Tice7826c882010-10-26 03:11:13 +0000101
102 if (log)
103 {
104 SBStream sstr;
105 debugger.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000106 log->Printf ("SBDebugger::Create () => SBDebugger(%p): %s", debugger.m_opaque_sp.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000107 }
108
Jim Ingham558dd5b2011-08-13 00:22:20 +0000109 SBCommandInterpreter interp = debugger.GetCommandInterpreter();
110 if (source_init_files)
111 {
112 interp.get()->SkipLLDBInitFiles(false);
113 interp.get()->SkipAppInitFiles (false);
114 SBCommandReturnObject result;
115 interp.SourceInitFileInHomeDirectory(result);
116 }
117 else
118 {
119 interp.get()->SkipLLDBInitFiles(true);
120 interp.get()->SkipAppInitFiles (true);
121 }
Greg Clayton63094e02010-06-23 01:19:29 +0000122 return debugger;
123}
124
Caroline Ticec4ed12f2011-01-22 01:02:07 +0000125void
126SBDebugger::Destroy (SBDebugger &debugger)
127{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000128 LogSP log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticec4ed12f2011-01-22 01:02:07 +0000129
130 if (log)
131 {
132 SBStream sstr;
133 debugger.GetDescription (sstr);
134 log->Printf ("SBDebugger::Destroy () => SBDebugger(%p): %s", debugger.m_opaque_sp.get(), sstr.GetData());
135 }
136
137 Debugger::Destroy (debugger.m_opaque_sp);
138
139 if (debugger.m_opaque_sp.get() != NULL)
140 debugger.m_opaque_sp.reset();
141}
142
Greg Claytonc5486872011-12-15 04:38:41 +0000143void
144SBDebugger::MemoryPressureDetected ()
145{
Greg Clayton860b9ea2012-04-09 20:22:01 +0000146 // Since this function can be call asynchronously, we allow it to be
147 // non-mandatory. We have seen deadlocks with this function when called
148 // so we need to safeguard against this until we can determine what is
149 // causing the deadlocks.
150 const bool mandatory = false;
151 ModuleList::RemoveOrphanSharedModules(mandatory);
Greg Claytonc5486872011-12-15 04:38:41 +0000152}
153
Greg Clayton63094e02010-06-23 01:19:29 +0000154SBDebugger::SBDebugger () :
155 m_opaque_sp ()
156{
157}
158
Enrico Granata3370f0c2011-08-19 23:56:34 +0000159SBDebugger::SBDebugger(const lldb::DebuggerSP &debugger_sp) :
160 m_opaque_sp(debugger_sp)
161{
162}
163
Greg Clayton538eb822010-11-05 23:17:00 +0000164SBDebugger::SBDebugger(const SBDebugger &rhs) :
165 m_opaque_sp (rhs.m_opaque_sp)
166{
167}
168
169SBDebugger &
170SBDebugger::operator = (const SBDebugger &rhs)
171{
172 if (this != &rhs)
173 {
174 m_opaque_sp = rhs.m_opaque_sp;
175 }
176 return *this;
177}
178
Greg Clayton63094e02010-06-23 01:19:29 +0000179SBDebugger::~SBDebugger ()
180{
181}
182
183bool
184SBDebugger::IsValid() const
185{
186 return m_opaque_sp.get() != NULL;
187}
188
189
Chris Lattner24943d22010-06-08 16:52:24 +0000190void
191SBDebugger::SetAsync (bool b)
192{
Greg Clayton63094e02010-06-23 01:19:29 +0000193 if (m_opaque_sp)
194 m_opaque_sp->SetAsyncExecution(b);
Chris Lattner24943d22010-06-08 16:52:24 +0000195}
196
Jim Ingham83dd2032011-09-13 23:25:31 +0000197bool
198SBDebugger::GetAsync ()
199{
200 if (m_opaque_sp)
201 return m_opaque_sp->GetAsyncExecution();
202 else
203 return false;
204}
205
Greg Clayton887aa282010-10-11 01:05:37 +0000206void
207SBDebugger::SkipLLDBInitFiles (bool b)
208{
209 if (m_opaque_sp)
210 m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles (b);
211}
212
Jim Ingham574c3d62011-08-12 23:34:31 +0000213void
214SBDebugger::SkipAppInitFiles (bool b)
215{
216 if (m_opaque_sp)
217 m_opaque_sp->GetCommandInterpreter().SkipAppInitFiles (b);
218}
219
Chris Lattner24943d22010-06-08 16:52:24 +0000220// Shouldn't really be settable after initialization as this could cause lots of problems; don't want users
221// trying to switch modes in the middle of a debugging session.
222void
223SBDebugger::SetInputFileHandle (FILE *fh, bool transfer_ownership)
224{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000225 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000226
227 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000228 log->Printf ("SBDebugger(%p)::SetInputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
229 fh, transfer_ownership);
Caroline Tice7826c882010-10-26 03:11:13 +0000230
Greg Clayton63094e02010-06-23 01:19:29 +0000231 if (m_opaque_sp)
232 m_opaque_sp->SetInputFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000233}
234
235void
236SBDebugger::SetOutputFileHandle (FILE *fh, bool transfer_ownership)
237{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000238 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000239
240
241 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000242 log->Printf ("SBDebugger(%p)::SetOutputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
243 fh, transfer_ownership);
Caroline Tice7826c882010-10-26 03:11:13 +0000244
Greg Clayton63094e02010-06-23 01:19:29 +0000245 if (m_opaque_sp)
246 m_opaque_sp->SetOutputFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000247}
248
249void
250SBDebugger::SetErrorFileHandle (FILE *fh, bool transfer_ownership)
251{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000252 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000253
254
255 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000256 log->Printf ("SBDebugger(%p)::SetErrorFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
257 fh, transfer_ownership);
Caroline Tice7826c882010-10-26 03:11:13 +0000258
Greg Clayton63094e02010-06-23 01:19:29 +0000259 if (m_opaque_sp)
260 m_opaque_sp->SetErrorFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000261}
262
263FILE *
264SBDebugger::GetInputFileHandle ()
265{
Greg Clayton63094e02010-06-23 01:19:29 +0000266 if (m_opaque_sp)
Greg Clayton58928562011-02-09 01:08:52 +0000267 return m_opaque_sp->GetInputFile().GetStream();
Greg Clayton63094e02010-06-23 01:19:29 +0000268 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000269}
270
271FILE *
272SBDebugger::GetOutputFileHandle ()
273{
Greg Clayton63094e02010-06-23 01:19:29 +0000274 if (m_opaque_sp)
Greg Clayton58928562011-02-09 01:08:52 +0000275 return m_opaque_sp->GetOutputFile().GetStream();
Greg Clayton63094e02010-06-23 01:19:29 +0000276 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000277}
278
279FILE *
280SBDebugger::GetErrorFileHandle ()
281{
Greg Clayton63094e02010-06-23 01:19:29 +0000282 if (m_opaque_sp)
Greg Clayton58928562011-02-09 01:08:52 +0000283 return m_opaque_sp->GetErrorFile().GetStream();
Greg Clayton63094e02010-06-23 01:19:29 +0000284 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000285}
286
287SBCommandInterpreter
288SBDebugger::GetCommandInterpreter ()
289{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000290 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000291
Greg Clayton63094e02010-06-23 01:19:29 +0000292 SBCommandInterpreter sb_interpreter;
293 if (m_opaque_sp)
294 sb_interpreter.reset (&m_opaque_sp->GetCommandInterpreter());
Caroline Tice7826c882010-10-26 03:11:13 +0000295
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000296 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000297 log->Printf ("SBDebugger(%p)::GetCommandInterpreter () => SBCommandInterpreter(%p)",
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000298 m_opaque_sp.get(), sb_interpreter.get());
299
Chris Lattner24943d22010-06-08 16:52:24 +0000300 return sb_interpreter;
301}
302
303void
304SBDebugger::HandleCommand (const char *command)
305{
Greg Clayton63094e02010-06-23 01:19:29 +0000306 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000307 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000308 TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
309 Mutex::Locker api_locker;
310 if (target_sp)
Jim Ingham1b584eb2012-05-04 23:02:50 +0000311 api_locker.Lock(target_sp->GetAPIMutex());
Greg Claytonbdcda462010-12-20 20:49:23 +0000312
Greg Clayton63094e02010-06-23 01:19:29 +0000313 SBCommandInterpreter sb_interpreter(GetCommandInterpreter ());
314 SBCommandReturnObject result;
315
316 sb_interpreter.HandleCommand (command, result, false);
317
318 if (GetErrorFileHandle() != NULL)
319 result.PutError (GetErrorFileHandle());
320 if (GetOutputFileHandle() != NULL)
321 result.PutOutput (GetOutputFileHandle());
322
323 if (m_opaque_sp->GetAsyncExecution() == false)
Chris Lattner24943d22010-06-08 16:52:24 +0000324 {
Greg Clayton63094e02010-06-23 01:19:29 +0000325 SBProcess process(GetCommandInterpreter().GetProcess ());
Greg Clayton334d33a2012-01-30 07:41:31 +0000326 ProcessSP process_sp (process.GetSP());
327 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000328 {
Greg Clayton63094e02010-06-23 01:19:29 +0000329 EventSP event_sp;
330 Listener &lldb_listener = m_opaque_sp->GetListener();
Greg Clayton334d33a2012-01-30 07:41:31 +0000331 while (lldb_listener.GetNextEventForBroadcaster (process_sp.get(), event_sp))
Greg Clayton63094e02010-06-23 01:19:29 +0000332 {
333 SBEvent event(event_sp);
334 HandleProcessEvent (process, event, GetOutputFileHandle(), GetErrorFileHandle());
335 }
Chris Lattner24943d22010-06-08 16:52:24 +0000336 }
337 }
338 }
339}
340
341SBListener
342SBDebugger::GetListener ()
343{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000344 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000345
Greg Clayton63094e02010-06-23 01:19:29 +0000346 SBListener sb_listener;
347 if (m_opaque_sp)
348 sb_listener.reset(&m_opaque_sp->GetListener(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000349
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000350 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000351 log->Printf ("SBDebugger(%p)::GetListener () => SBListener(%p)", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000352 sb_listener.get());
353
Chris Lattner24943d22010-06-08 16:52:24 +0000354 return sb_listener;
355}
356
357void
358SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, FILE *out, FILE *err)
359{
Greg Claytonbdcda462010-12-20 20:49:23 +0000360 if (!process.IsValid())
361 return;
Chris Lattner24943d22010-06-08 16:52:24 +0000362
Greg Clayton334d33a2012-01-30 07:41:31 +0000363 TargetSP target_sp (process.GetTarget().GetSP());
364 if (!target_sp)
365 return;
366
Greg Claytonbdcda462010-12-20 20:49:23 +0000367 const uint32_t event_type = event.GetType();
368 char stdio_buffer[1024];
369 size_t len;
Chris Lattner24943d22010-06-08 16:52:24 +0000370
Greg Clayton334d33a2012-01-30 07:41:31 +0000371 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Claytonbdcda462010-12-20 20:49:23 +0000372
373 if (event_type & (Process::eBroadcastBitSTDOUT | Process::eBroadcastBitStateChanged))
Chris Lattner24943d22010-06-08 16:52:24 +0000374 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000375 // Drain stdout when we stop just in case we have any bytes
376 while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
377 if (out != NULL)
378 ::fwrite (stdio_buffer, 1, len, out);
379 }
380
381 if (event_type & (Process::eBroadcastBitSTDERR | Process::eBroadcastBitStateChanged))
382 {
383 // Drain stderr when we stop just in case we have any bytes
384 while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
385 if (err != NULL)
386 ::fwrite (stdio_buffer, 1, len, err);
387 }
388
389 if (event_type & Process::eBroadcastBitStateChanged)
390 {
391 StateType event_state = SBProcess::GetStateFromEvent (event);
392
393 if (event_state == eStateInvalid)
394 return;
395
396 bool is_stopped = StateIsStoppedState (event_state);
397 if (!is_stopped)
398 process.ReportEventState (event, out);
Chris Lattner24943d22010-06-08 16:52:24 +0000399 }
400}
401
Jim Inghamcc637462011-09-13 00:29:56 +0000402SBSourceManager
Chris Lattner24943d22010-06-08 16:52:24 +0000403SBDebugger::GetSourceManager ()
404{
Jim Inghamcc637462011-09-13 00:29:56 +0000405 SBSourceManager sb_source_manager (*this);
406 return sb_source_manager;
Chris Lattner24943d22010-06-08 16:52:24 +0000407}
408
409
410bool
411SBDebugger::GetDefaultArchitecture (char *arch_name, size_t arch_name_len)
412{
413 if (arch_name && arch_name_len)
414 {
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000415 ArchSpec default_arch = Target::GetDefaultArchitecture ();
Caroline Tice5bc8c972010-09-20 20:44:43 +0000416
Chris Lattner24943d22010-06-08 16:52:24 +0000417 if (default_arch.IsValid())
418 {
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000419 const std::string &triple_str = default_arch.GetTriple().str();
420 if (!triple_str.empty())
421 ::snprintf (arch_name, arch_name_len, "%s", triple_str.c_str());
422 else
423 ::snprintf (arch_name, arch_name_len, "%s", default_arch.GetArchitectureName());
Chris Lattner24943d22010-06-08 16:52:24 +0000424 return true;
425 }
426 }
427 if (arch_name && arch_name_len)
428 arch_name[0] = '\0';
429 return false;
430}
431
432
433bool
434SBDebugger::SetDefaultArchitecture (const char *arch_name)
435{
436 if (arch_name)
437 {
Greg Claytonb170aee2012-05-08 01:45:38 +0000438 ArchSpec arch (arch_name);
Chris Lattner24943d22010-06-08 16:52:24 +0000439 if (arch.IsValid())
440 {
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000441 Target::SetDefaultArchitecture (arch);
Chris Lattner24943d22010-06-08 16:52:24 +0000442 return true;
443 }
444 }
445 return false;
446}
447
448ScriptLanguage
449SBDebugger::GetScriptingLanguage (const char *script_language_name)
450{
Greg Claytonbdcda462010-12-20 20:49:23 +0000451
Chris Lattner24943d22010-06-08 16:52:24 +0000452 return Args::StringToScriptLanguage (script_language_name,
453 eScriptLanguageDefault,
454 NULL);
455}
Chris Lattner24943d22010-06-08 16:52:24 +0000456
457const char *
458SBDebugger::GetVersionString ()
459{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000460 return GetVersion();
Chris Lattner24943d22010-06-08 16:52:24 +0000461}
462
463const char *
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000464SBDebugger::StateAsCString (StateType state)
Chris Lattner24943d22010-06-08 16:52:24 +0000465{
Caroline Ticea2cffd32011-04-25 22:05:51 +0000466 return lldb_private::StateAsCString (state);
Chris Lattner24943d22010-06-08 16:52:24 +0000467}
468
469bool
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000470SBDebugger::StateIsRunningState (StateType state)
Chris Lattner24943d22010-06-08 16:52:24 +0000471{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000472 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000473
Caroline Ticea2cffd32011-04-25 22:05:51 +0000474 const bool result = lldb_private::StateIsRunningState (state);
Greg Claytona66ba462010-10-30 04:51:46 +0000475 if (log)
476 log->Printf ("SBDebugger::StateIsRunningState (state=%s) => %i",
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000477 StateAsCString (state), result);
Greg Claytona66ba462010-10-30 04:51:46 +0000478
479 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000480}
481
482bool
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000483SBDebugger::StateIsStoppedState (StateType state)
Chris Lattner24943d22010-06-08 16:52:24 +0000484{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000485 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000486
Greg Clayton20206082011-11-17 01:23:07 +0000487 const bool result = lldb_private::StateIsStoppedState (state, false);
Caroline Tice7826c882010-10-26 03:11:13 +0000488 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000489 log->Printf ("SBDebugger::StateIsStoppedState (state=%s) => %i",
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000490 StateAsCString (state), result);
Caroline Tice7826c882010-10-26 03:11:13 +0000491
Greg Claytona66ba462010-10-30 04:51:46 +0000492 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000493}
494
Greg Clayton3e8c25f2011-09-24 00:52:29 +0000495lldb::SBTarget
496SBDebugger::CreateTarget (const char *filename,
497 const char *target_triple,
498 const char *platform_name,
499 bool add_dependent_modules,
500 lldb::SBError& sb_error)
501{
502 SBTarget sb_target;
Greg Clayton334d33a2012-01-30 07:41:31 +0000503 TargetSP target_sp;
Greg Clayton3e8c25f2011-09-24 00:52:29 +0000504 if (m_opaque_sp)
505 {
506 sb_error.Clear();
507 FileSpec filename_spec (filename, true);
508 OptionGroupPlatform platform_options (false);
509 platform_options.SetPlatformName (platform_name);
510
Greg Clayton3e8c25f2011-09-24 00:52:29 +0000511 sb_error.ref() = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
512 filename_spec,
513 target_triple,
514 add_dependent_modules,
515 &platform_options,
516 target_sp);
517
518 if (sb_error.Success())
Greg Clayton334d33a2012-01-30 07:41:31 +0000519 sb_target.SetSP (target_sp);
Greg Clayton3e8c25f2011-09-24 00:52:29 +0000520 }
521 else
522 {
523 sb_error.SetErrorString("invalid target");
524 }
525
526 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
527 if (log)
528 {
529 log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\", triple=%s, platform_name=%s, add_dependent_modules=%u, error=%s) => SBTarget(%p)",
530 m_opaque_sp.get(),
531 filename,
532 target_triple,
533 platform_name,
534 add_dependent_modules,
535 sb_error.GetCString(),
Greg Clayton334d33a2012-01-30 07:41:31 +0000536 target_sp.get());
Greg Clayton3e8c25f2011-09-24 00:52:29 +0000537 }
538
539 return sb_target;
540}
Chris Lattner24943d22010-06-08 16:52:24 +0000541
542SBTarget
543SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename,
544 const char *target_triple)
545{
Greg Clayton334d33a2012-01-30 07:41:31 +0000546 SBTarget sb_target;
547 TargetSP target_sp;
Greg Clayton63094e02010-06-23 01:19:29 +0000548 if (m_opaque_sp)
549 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000550 FileSpec file_spec (filename, true);
Greg Clayton63094e02010-06-23 01:19:29 +0000551 TargetSP target_sp;
Greg Clayton3e8c25f2011-09-24 00:52:29 +0000552 const bool add_dependent_modules = true;
553 Error error (m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
554 file_spec,
555 target_triple,
556 add_dependent_modules,
557 NULL,
558 target_sp));
Greg Clayton334d33a2012-01-30 07:41:31 +0000559 sb_target.SetSP (target_sp);
Greg Clayton63094e02010-06-23 01:19:29 +0000560 }
Greg Claytona66ba462010-10-30 04:51:46 +0000561
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000562 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000563 if (log)
564 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000565 log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndTargetTriple (filename=\"%s\", triple=%s) => SBTarget(%p)",
Greg Clayton334d33a2012-01-30 07:41:31 +0000566 m_opaque_sp.get(), filename, target_triple, target_sp.get());
Greg Claytona66ba462010-10-30 04:51:46 +0000567 }
568
Greg Clayton334d33a2012-01-30 07:41:31 +0000569 return sb_target;
Chris Lattner24943d22010-06-08 16:52:24 +0000570}
571
572SBTarget
Greg Clayton940b1032011-02-23 00:35:02 +0000573SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *arch_cstr)
Chris Lattner24943d22010-06-08 16:52:24 +0000574{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000575 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000576
Greg Clayton334d33a2012-01-30 07:41:31 +0000577 SBTarget sb_target;
578 TargetSP target_sp;
Greg Clayton63094e02010-06-23 01:19:29 +0000579 if (m_opaque_sp)
580 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000581 FileSpec file (filename, true);
Greg Clayton63094e02010-06-23 01:19:29 +0000582 Error error;
Greg Clayton3e8c25f2011-09-24 00:52:29 +0000583 const bool add_dependent_modules = true;
Chris Lattner24943d22010-06-08 16:52:24 +0000584
Greg Clayton3e8c25f2011-09-24 00:52:29 +0000585 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
586 file,
587 arch_cstr,
588 add_dependent_modules,
589 NULL,
590 target_sp);
Greg Clayton63094e02010-06-23 01:19:29 +0000591
592 if (error.Success())
593 {
Jim Inghamc8332952010-08-26 21:32:51 +0000594 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Clayton334d33a2012-01-30 07:41:31 +0000595 sb_target.SetSP (target_sp);
Greg Clayton63094e02010-06-23 01:19:29 +0000596 }
Chris Lattner24943d22010-06-08 16:52:24 +0000597 }
Caroline Tice7826c882010-10-26 03:11:13 +0000598
599 if (log)
600 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000601 log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndArch (filename=\"%s\", arch=%s) => SBTarget(%p)",
Greg Clayton334d33a2012-01-30 07:41:31 +0000602 m_opaque_sp.get(), filename, arch_cstr, target_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000603 }
604
Greg Clayton334d33a2012-01-30 07:41:31 +0000605 return sb_target;
Greg Clayton63094e02010-06-23 01:19:29 +0000606}
607
608SBTarget
609SBDebugger::CreateTarget (const char *filename)
610{
Greg Clayton334d33a2012-01-30 07:41:31 +0000611 SBTarget sb_target;
612 TargetSP target_sp;
Greg Clayton63094e02010-06-23 01:19:29 +0000613 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000614 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000615 FileSpec file (filename, true);
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000616 ArchSpec arch = Target::GetDefaultArchitecture ();
Greg Clayton63094e02010-06-23 01:19:29 +0000617 Error error;
Greg Clayton3e8c25f2011-09-24 00:52:29 +0000618 const bool add_dependent_modules = true;
Greg Clayton63094e02010-06-23 01:19:29 +0000619
Greg Claytonb1db6582012-03-20 18:34:04 +0000620 PlatformSP platform_sp(m_opaque_sp->GetPlatformList().GetSelectedPlatform());
Greg Clayton3e8c25f2011-09-24 00:52:29 +0000621 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
622 file,
623 arch,
624 add_dependent_modules,
Greg Claytonb1db6582012-03-20 18:34:04 +0000625 platform_sp,
Greg Clayton3e8c25f2011-09-24 00:52:29 +0000626 target_sp);
Greg Clayton63094e02010-06-23 01:19:29 +0000627
628 if (error.Success())
629 {
Jim Inghamc8332952010-08-26 21:32:51 +0000630 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Clayton334d33a2012-01-30 07:41:31 +0000631 sb_target.SetSP (target_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000632 }
633 }
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000634 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000635 if (log)
636 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000637 log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)",
Greg Clayton334d33a2012-01-30 07:41:31 +0000638 m_opaque_sp.get(), filename, target_sp.get());
Greg Claytona66ba462010-10-30 04:51:46 +0000639 }
Greg Clayton334d33a2012-01-30 07:41:31 +0000640 return sb_target;
Chris Lattner24943d22010-06-08 16:52:24 +0000641}
642
Johnny Chen409646d2011-06-15 21:24:24 +0000643bool
644SBDebugger::DeleteTarget (lldb::SBTarget &target)
645{
646 bool result = false;
Greg Clayton334d33a2012-01-30 07:41:31 +0000647 if (m_opaque_sp)
Johnny Chen409646d2011-06-15 21:24:24 +0000648 {
Greg Clayton334d33a2012-01-30 07:41:31 +0000649 TargetSP target_sp(target.GetSP());
650 if (target_sp)
651 {
652 // No need to lock, the target list is thread safe
653 result = m_opaque_sp->GetTargetList().DeleteTarget (target_sp);
654 target_sp->Destroy();
655 target.Clear();
Greg Clayton860b9ea2012-04-09 20:22:01 +0000656 const bool mandatory = true;
657 ModuleList::RemoveOrphanSharedModules(mandatory);
Greg Clayton334d33a2012-01-30 07:41:31 +0000658 }
Johnny Chen409646d2011-06-15 21:24:24 +0000659 }
660
661 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
662 if (log)
663 {
664 log->Printf ("SBDebugger(%p)::DeleteTarget (SBTarget(%p)) => %i", m_opaque_sp.get(), target.m_opaque_sp.get(), result);
665 }
666
667 return result;
668}
Chris Lattner24943d22010-06-08 16:52:24 +0000669SBTarget
670SBDebugger::GetTargetAtIndex (uint32_t idx)
671{
Greg Clayton63094e02010-06-23 01:19:29 +0000672 SBTarget sb_target;
673 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000674 {
675 // No need to lock, the target list is thread safe
Greg Clayton334d33a2012-01-30 07:41:31 +0000676 sb_target.SetSP (m_opaque_sp->GetTargetList().GetTargetAtIndex (idx));
Greg Claytonbdcda462010-12-20 20:49:23 +0000677 }
Chris Lattner24943d22010-06-08 16:52:24 +0000678 return sb_target;
679}
680
681SBTarget
682SBDebugger::FindTargetWithProcessID (pid_t pid)
683{
Greg Clayton63094e02010-06-23 01:19:29 +0000684 SBTarget sb_target;
685 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000686 {
687 // No need to lock, the target list is thread safe
Greg Clayton334d33a2012-01-30 07:41:31 +0000688 sb_target.SetSP (m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid));
Greg Claytonbdcda462010-12-20 20:49:23 +0000689 }
Chris Lattner24943d22010-06-08 16:52:24 +0000690 return sb_target;
691}
692
693SBTarget
694SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name)
695{
Greg Clayton63094e02010-06-23 01:19:29 +0000696 SBTarget sb_target;
697 if (m_opaque_sp && filename && filename[0])
698 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000699 // No need to lock, the target list is thread safe
Greg Claytonf15996e2011-04-07 22:46:35 +0000700 ArchSpec arch (arch_name, m_opaque_sp->GetPlatformList().GetSelectedPlatform().get());
Greg Clayton537a7a82010-10-20 20:54:39 +0000701 TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename, false), arch_name ? &arch : NULL));
Greg Clayton334d33a2012-01-30 07:41:31 +0000702 sb_target.SetSP (target_sp);
Greg Clayton63094e02010-06-23 01:19:29 +0000703 }
704 return sb_target;
Chris Lattner24943d22010-06-08 16:52:24 +0000705}
706
707SBTarget
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000708SBDebugger::FindTargetWithLLDBProcess (const ProcessSP &process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000709{
Greg Clayton63094e02010-06-23 01:19:29 +0000710 SBTarget sb_target;
711 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000712 {
713 // No need to lock, the target list is thread safe
Greg Clayton334d33a2012-01-30 07:41:31 +0000714 sb_target.SetSP (m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get()));
Greg Claytonbdcda462010-12-20 20:49:23 +0000715 }
Chris Lattner24943d22010-06-08 16:52:24 +0000716 return sb_target;
717}
718
719
720uint32_t
721SBDebugger::GetNumTargets ()
722{
Greg Clayton63094e02010-06-23 01:19:29 +0000723 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000724 {
725 // No need to lock, the target list is thread safe
Greg Clayton63094e02010-06-23 01:19:29 +0000726 return m_opaque_sp->GetTargetList().GetNumTargets ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000727 }
Greg Clayton63094e02010-06-23 01:19:29 +0000728 return 0;
729}
Chris Lattner24943d22010-06-08 16:52:24 +0000730
731SBTarget
Jim Inghamc8332952010-08-26 21:32:51 +0000732SBDebugger::GetSelectedTarget ()
Chris Lattner24943d22010-06-08 16:52:24 +0000733{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000734 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000735
Greg Clayton63094e02010-06-23 01:19:29 +0000736 SBTarget sb_target;
Greg Clayton334d33a2012-01-30 07:41:31 +0000737 TargetSP target_sp;
Greg Clayton63094e02010-06-23 01:19:29 +0000738 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000739 {
740 // No need to lock, the target list is thread safe
Greg Clayton334d33a2012-01-30 07:41:31 +0000741 target_sp = m_opaque_sp->GetTargetList().GetSelectedTarget ();
742 sb_target.SetSP (target_sp);
Greg Claytonbdcda462010-12-20 20:49:23 +0000743 }
Caroline Tice7826c882010-10-26 03:11:13 +0000744
745 if (log)
746 {
747 SBStream sstr;
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000748 sb_target.GetDescription (sstr, eDescriptionLevelBrief);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000749 log->Printf ("SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s", m_opaque_sp.get(),
Greg Clayton334d33a2012-01-30 07:41:31 +0000750 target_sp.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000751 }
752
Chris Lattner24943d22010-06-08 16:52:24 +0000753 return sb_target;
754}
755
756void
Jim Ingham83dd2032011-09-13 23:25:31 +0000757SBDebugger::SetSelectedTarget (SBTarget &sb_target)
758{
759 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
760
Greg Clayton334d33a2012-01-30 07:41:31 +0000761 TargetSP target_sp (sb_target.GetSP());
Jim Ingham83dd2032011-09-13 23:25:31 +0000762 if (m_opaque_sp)
763 {
Greg Clayton334d33a2012-01-30 07:41:31 +0000764 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Jim Ingham83dd2032011-09-13 23:25:31 +0000765 }
766 if (log)
767 {
768 SBStream sstr;
769 sb_target.GetDescription (sstr, eDescriptionLevelBrief);
770 log->Printf ("SBDebugger(%p)::SetSelectedTarget () => SBTarget(%p): %s", m_opaque_sp.get(),
Greg Clayton334d33a2012-01-30 07:41:31 +0000771 target_sp.get(), sstr.GetData());
Jim Ingham83dd2032011-09-13 23:25:31 +0000772 }
773}
774
775void
Chris Lattner24943d22010-06-08 16:52:24 +0000776SBDebugger::DispatchInput (void *baton, const void *data, size_t data_len)
777{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000778 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000779
780 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000781 log->Printf ("SBDebugger(%p)::DispatchInput (baton=%p, data=\"%.*s\", size_t=%zu)", m_opaque_sp.get(),
782 baton, (int) data_len, (const char *) data, data_len);
Caroline Tice7826c882010-10-26 03:11:13 +0000783
Greg Clayton63094e02010-06-23 01:19:29 +0000784 if (m_opaque_sp)
785 m_opaque_sp->DispatchInput ((const char *) data, data_len);
Chris Lattner24943d22010-06-08 16:52:24 +0000786}
787
788void
Caroline Ticec4f55fe2010-11-19 20:47:54 +0000789SBDebugger::DispatchInputInterrupt ()
790{
791 if (m_opaque_sp)
792 m_opaque_sp->DispatchInputInterrupt ();
793}
794
795void
796SBDebugger::DispatchInputEndOfFile ()
797{
798 if (m_opaque_sp)
799 m_opaque_sp->DispatchInputEndOfFile ();
800}
Caroline Ticeb38df1e2011-05-09 23:06:58 +0000801
802bool
803SBDebugger::InputReaderIsTopReader (const lldb::SBInputReader &reader)
804{
805 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
806
807 if (log)
808 log->Printf ("SBDebugger(%p)::InputReaderIsTopReader (SBInputReader(%p))", m_opaque_sp.get(), &reader);
809
810 if (m_opaque_sp && reader.IsValid())
811 {
812 InputReaderSP reader_sp (*reader);
813 return m_opaque_sp->InputReaderIsTopReader (reader_sp);
814 }
815
816 return false;
817}
818
Caroline Ticec4f55fe2010-11-19 20:47:54 +0000819
820void
Chris Lattner24943d22010-06-08 16:52:24 +0000821SBDebugger::PushInputReader (SBInputReader &reader)
822{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000823 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000824
825 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000826 log->Printf ("SBDebugger(%p)::PushInputReader (SBInputReader(%p))", m_opaque_sp.get(), &reader);
Caroline Tice7826c882010-10-26 03:11:13 +0000827
Greg Clayton63094e02010-06-23 01:19:29 +0000828 if (m_opaque_sp && reader.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000829 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000830 TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
831 Mutex::Locker api_locker;
832 if (target_sp)
Jim Ingham1b584eb2012-05-04 23:02:50 +0000833 api_locker.Lock(target_sp->GetAPIMutex());
Chris Lattner24943d22010-06-08 16:52:24 +0000834 InputReaderSP reader_sp(*reader);
Greg Clayton63094e02010-06-23 01:19:29 +0000835 m_opaque_sp->PushInputReader (reader_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000836 }
837}
Greg Clayton63094e02010-06-23 01:19:29 +0000838
839void
Caroline Tice4a348082011-05-02 20:41:46 +0000840SBDebugger::NotifyTopInputReader (InputReaderAction notification)
841{
842 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
843
844 if (log)
845 log->Printf ("SBDebugger(%p)::NotifyTopInputReader (%d)", m_opaque_sp.get(), notification);
846
847 if (m_opaque_sp)
848 m_opaque_sp->NotifyTopInputReader (notification);
849}
850
851void
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000852SBDebugger::reset (const DebuggerSP &debugger_sp)
Greg Clayton63094e02010-06-23 01:19:29 +0000853{
854 m_opaque_sp = debugger_sp;
855}
856
857Debugger *
858SBDebugger::get () const
859{
860 return m_opaque_sp.get();
861}
862
863Debugger &
864SBDebugger::ref () const
865{
866 assert (m_opaque_sp.get());
867 return *m_opaque_sp;
868}
869
Greg Clayton15afa9f2011-10-01 02:59:24 +0000870const lldb::DebuggerSP &
871SBDebugger::get_sp () const
872{
873 return m_opaque_sp;
874}
Greg Clayton63094e02010-06-23 01:19:29 +0000875
Caroline Tice558be582010-06-30 16:22:25 +0000876SBDebugger
877SBDebugger::FindDebuggerWithID (int id)
878{
Greg Claytonbdcda462010-12-20 20:49:23 +0000879 // No need to lock, the debugger list is thread safe
Caroline Tice558be582010-06-30 16:22:25 +0000880 SBDebugger sb_debugger;
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000881 DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id);
Caroline Tice558be582010-06-30 16:22:25 +0000882 if (debugger_sp)
883 sb_debugger.reset (debugger_sp);
884 return sb_debugger;
885}
Jim Ingham74989e82010-08-30 19:44:40 +0000886
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000887const char *
888SBDebugger::GetInstanceName()
889{
890 if (m_opaque_sp)
891 return m_opaque_sp->GetInstanceName().AsCString();
892 else
893 return NULL;
894}
895
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000896SBError
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000897SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000898{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000899 UserSettingsControllerSP root_settings_controller = Debugger::GetSettingsController();
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000900
Greg Claytonb3448432011-03-24 21:19:54 +0000901 Error err = root_settings_controller->SetVariable (var_name,
902 value,
903 eVarSetOperationAssign,
904 true,
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000905 debugger_instance_name);
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000906 SBError sb_error;
907 sb_error.SetError (err);
908
909 return sb_error;
910}
911
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000912SBStringList
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000913SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000914{
915 SBStringList ret_value;
Greg Claytonb3448432011-03-24 21:19:54 +0000916 SettableVariableType var_type;
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000917 Error err;
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000918
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000919 UserSettingsControllerSP root_settings_controller = Debugger::GetSettingsController();
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000920
Caroline Tice5bc8c972010-09-20 20:44:43 +0000921 StringList value = root_settings_controller->GetVariable (var_name, var_type, debugger_instance_name, err);
922
923 if (err.Success())
924 {
925 for (unsigned i = 0; i != value.GetSize(); ++i)
926 ret_value.AppendString (value.GetStringAtIndex(i));
927 }
928 else
929 {
930 ret_value.AppendString (err.AsCString());
931 }
932
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000933
934 return ret_value;
935}
936
Greg Clayton238c0a12010-09-18 01:14:36 +0000937uint32_t
938SBDebugger::GetTerminalWidth () const
939{
940 if (m_opaque_sp)
941 return m_opaque_sp->GetTerminalWidth ();
942 return 0;
943}
944
945void
946SBDebugger::SetTerminalWidth (uint32_t term_width)
947{
948 if (m_opaque_sp)
949 m_opaque_sp->SetTerminalWidth (term_width);
950}
951
952const char *
953SBDebugger::GetPrompt() const
954{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000955 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000956
957 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000958 log->Printf ("SBDebugger(%p)::GetPrompt () => \"%s\"", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000959 (m_opaque_sp ? m_opaque_sp->GetPrompt() : ""));
Caroline Tice7826c882010-10-26 03:11:13 +0000960
Greg Clayton238c0a12010-09-18 01:14:36 +0000961 if (m_opaque_sp)
962 return m_opaque_sp->GetPrompt ();
963 return 0;
964}
965
966void
967SBDebugger::SetPrompt (const char *prompt)
968{
969 if (m_opaque_sp)
970 m_opaque_sp->SetPrompt (prompt);
971}
972
973
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000974ScriptLanguage
Greg Clayton238c0a12010-09-18 01:14:36 +0000975SBDebugger::GetScriptLanguage() const
976{
977 if (m_opaque_sp)
978 return m_opaque_sp->GetScriptLanguage ();
979 return eScriptLanguageNone;
980}
981
982void
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000983SBDebugger::SetScriptLanguage (ScriptLanguage script_lang)
Greg Clayton238c0a12010-09-18 01:14:36 +0000984{
985 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000986 {
Greg Clayton238c0a12010-09-18 01:14:36 +0000987 m_opaque_sp->SetScriptLanguage (script_lang);
Greg Claytonbdcda462010-12-20 20:49:23 +0000988 }
Greg Clayton238c0a12010-09-18 01:14:36 +0000989}
990
Jim Ingham74989e82010-08-30 19:44:40 +0000991bool
992SBDebugger::SetUseExternalEditor (bool value)
993{
994 if (m_opaque_sp)
995 return m_opaque_sp->SetUseExternalEditor (value);
Greg Claytonbdcda462010-12-20 20:49:23 +0000996 return false;
Jim Ingham74989e82010-08-30 19:44:40 +0000997}
998
999bool
Caroline Tice5bc8c972010-09-20 20:44:43 +00001000SBDebugger::GetUseExternalEditor ()
Jim Ingham74989e82010-08-30 19:44:40 +00001001{
1002 if (m_opaque_sp)
Caroline Tice5bc8c972010-09-20 20:44:43 +00001003 return m_opaque_sp->GetUseExternalEditor ();
Greg Claytonbdcda462010-12-20 20:49:23 +00001004 return false;
Jim Ingham74989e82010-08-30 19:44:40 +00001005}
1006
Caroline Tice98f930f2010-09-20 05:20:02 +00001007bool
1008SBDebugger::GetDescription (SBStream &description)
1009{
Greg Clayton96154be2011-11-13 06:57:31 +00001010 Stream &strm = description.ref();
1011
Caroline Tice98f930f2010-09-20 05:20:02 +00001012 if (m_opaque_sp)
1013 {
1014 const char *name = m_opaque_sp->GetInstanceName().AsCString();
Greg Clayton9ce9c3c2011-04-18 23:15:17 +00001015 user_id_t id = m_opaque_sp->GetID();
Greg Clayton96154be2011-11-13 06:57:31 +00001016 strm.Printf ("Debugger (instance: \"%s\", id: %llu)", name, id);
Caroline Tice98f930f2010-09-20 05:20:02 +00001017 }
1018 else
Greg Clayton96154be2011-11-13 06:57:31 +00001019 strm.PutCString ("No value");
Caroline Tice98f930f2010-09-20 05:20:02 +00001020
1021 return true;
1022}
Caroline Ticec4f55fe2010-11-19 20:47:54 +00001023
Greg Clayton9ce9c3c2011-04-18 23:15:17 +00001024user_id_t
Caroline Ticec4f55fe2010-11-19 20:47:54 +00001025SBDebugger::GetID()
1026{
1027 if (m_opaque_sp)
1028 return m_opaque_sp->GetID();
1029 return LLDB_INVALID_UID;
1030}
Greg Clayton180546b2011-04-30 01:09:13 +00001031
1032
1033SBError
1034SBDebugger::SetCurrentPlatform (const char *platform_name)
1035{
1036 SBError sb_error;
1037 if (m_opaque_sp)
1038 {
1039 PlatformSP platform_sp (Platform::Create (platform_name, sb_error.ref()));
1040
1041 if (platform_sp)
1042 {
1043 bool make_selected = true;
1044 m_opaque_sp->GetPlatformList().Append (platform_sp, make_selected);
1045 }
1046 }
1047 return sb_error;
1048}
1049
Greg Clayton421ca502011-05-29 04:06:55 +00001050bool
Greg Clayton604f0d32011-06-17 03:31:01 +00001051SBDebugger::SetCurrentPlatformSDKRoot (const char *sysroot)
1052{
1053 if (m_opaque_sp)
1054 {
1055 PlatformSP platform_sp (m_opaque_sp->GetPlatformList().GetSelectedPlatform());
1056
1057 if (platform_sp)
1058 {
1059 platform_sp->SetSDKRootDirectory (ConstString (sysroot));
1060 return true;
1061 }
1062 }
1063 return false;
1064}
1065
1066bool
Greg Clayton421ca502011-05-29 04:06:55 +00001067SBDebugger::GetCloseInputOnEOF () const
1068{
1069 if (m_opaque_sp)
1070 return m_opaque_sp->GetCloseInputOnEOF ();
1071 return false;
1072}
1073
1074void
1075SBDebugger::SetCloseInputOnEOF (bool b)
1076{
1077 if (m_opaque_sp)
1078 m_opaque_sp->SetCloseInputOnEOF (b);
1079}
Enrico Granata16376ed2012-02-15 02:34:21 +00001080
1081SBTypeCategory
1082SBDebugger::GetCategory (const char* category_name)
1083{
1084 if (!category_name || *category_name == 0)
1085 return SBTypeCategory();
1086
1087 TypeCategoryImplSP category_sp;
1088
1089 if (DataVisualization::Categories::GetCategory(ConstString(category_name), category_sp, false))
1090 return SBTypeCategory(category_sp);
1091 else
1092 return SBTypeCategory();
1093}
1094
1095SBTypeCategory
1096SBDebugger::CreateCategory (const char* category_name)
1097{
1098 if (!category_name || *category_name == 0)
1099 return SBTypeCategory();
1100
1101 TypeCategoryImplSP category_sp;
1102
1103 if (DataVisualization::Categories::GetCategory(ConstString(category_name), category_sp, true))
1104 return SBTypeCategory(category_sp);
1105 else
1106 return SBTypeCategory();
1107}
1108
1109bool
1110SBDebugger::DeleteCategory (const char* category_name)
1111{
1112 if (!category_name || *category_name == 0)
1113 return false;
1114
1115 return DataVisualization::Categories::Delete(ConstString(category_name));
1116}
1117
1118uint32_t
1119SBDebugger::GetNumCategories()
1120{
1121 return DataVisualization::Categories::GetCount();
1122}
1123
1124SBTypeCategory
1125SBDebugger::GetCategoryAtIndex (uint32_t index)
1126{
1127 return SBTypeCategory(DataVisualization::Categories::GetCategoryAtIndex(index));
1128}
1129
1130SBTypeCategory
1131SBDebugger::GetDefaultCategory()
1132{
1133 return GetCategory("default");
1134}
1135
1136SBTypeFormat
1137SBDebugger::GetFormatForType (SBTypeNameSpecifier type_name)
1138{
1139 SBTypeCategory default_category_sb = GetDefaultCategory();
1140 if (default_category_sb.GetEnabled())
1141 return default_category_sb.GetFormatForType(type_name);
1142 return SBTypeFormat();
1143}
1144
Jason Molendac48ca822012-02-21 05:33:55 +00001145#ifndef LLDB_DISABLE_PYTHON
Enrico Granata16376ed2012-02-15 02:34:21 +00001146SBTypeSummary
1147SBDebugger::GetSummaryForType (SBTypeNameSpecifier type_name)
1148{
1149 SBTypeSummary summary_chosen;
1150 uint32_t num_categories = GetNumCategories();
1151 SBTypeCategory category_sb;
1152 uint32_t prio_category = UINT32_MAX;
1153 for (uint32_t category_id = 0;
1154 category_id < num_categories;
1155 category_id++)
1156 {
1157 category_sb = GetCategoryAtIndex(category_id);
1158 if (category_sb.GetEnabled() == false)
1159 continue;
1160 SBTypeSummary summary_current = category_sb.GetSummaryForType(type_name);
1161 if (summary_current.IsValid() && (summary_chosen.IsValid() == false || (prio_category > category_sb.m_opaque_sp->GetEnabledPosition())))
1162 {
1163 prio_category = category_sb.m_opaque_sp->GetEnabledPosition();
1164 summary_chosen = summary_current;
1165 }
1166 }
1167 return summary_chosen;
1168}
Jason Molendac48ca822012-02-21 05:33:55 +00001169#endif // LLDB_DISABLE_PYTHON
Enrico Granata16376ed2012-02-15 02:34:21 +00001170
1171SBTypeFilter
1172SBDebugger::GetFilterForType (SBTypeNameSpecifier type_name)
1173{
1174 SBTypeFilter filter_chosen;
1175 uint32_t num_categories = GetNumCategories();
1176 SBTypeCategory category_sb;
1177 uint32_t prio_category = UINT32_MAX;
1178 for (uint32_t category_id = 0;
1179 category_id < num_categories;
1180 category_id++)
1181 {
1182 category_sb = GetCategoryAtIndex(category_id);
1183 if (category_sb.GetEnabled() == false)
1184 continue;
1185 SBTypeFilter filter_current = category_sb.GetFilterForType(type_name);
1186 if (filter_current.IsValid() && (filter_chosen.IsValid() == false || (prio_category > category_sb.m_opaque_sp->GetEnabledPosition())))
1187 {
1188 prio_category = category_sb.m_opaque_sp->GetEnabledPosition();
1189 filter_chosen = filter_current;
1190 }
1191 }
1192 return filter_chosen;
1193}
1194
Jason Molendac48ca822012-02-21 05:33:55 +00001195#ifndef LLDB_DISABLE_PYTHON
Enrico Granata16376ed2012-02-15 02:34:21 +00001196SBTypeSynthetic
1197SBDebugger::GetSyntheticForType (SBTypeNameSpecifier type_name)
1198{
1199 SBTypeSynthetic synth_chosen;
1200 uint32_t num_categories = GetNumCategories();
1201 SBTypeCategory category_sb;
1202 uint32_t prio_category = UINT32_MAX;
1203 for (uint32_t category_id = 0;
1204 category_id < num_categories;
1205 category_id++)
1206 {
1207 category_sb = GetCategoryAtIndex(category_id);
1208 if (category_sb.GetEnabled() == false)
1209 continue;
1210 SBTypeSynthetic synth_current = category_sb.GetSyntheticForType(type_name);
1211 if (synth_current.IsValid() && (synth_chosen.IsValid() == false || (prio_category > category_sb.m_opaque_sp->GetEnabledPosition())))
1212 {
1213 prio_category = category_sb.m_opaque_sp->GetEnabledPosition();
1214 synth_chosen = synth_current;
1215 }
1216 }
1217 return synth_chosen;
1218}
Jason Molendac48ca822012-02-21 05:33:55 +00001219#endif // LLDB_DISABLE_PYTHON
Enrico Granata16376ed2012-02-15 02:34:21 +00001220
Jim Ingham6c530f22012-02-21 02:23:08 +00001221bool
1222SBDebugger::EnableLog (const char *channel, const char **categories)
1223{
1224 if (m_opaque_sp)
1225 {
1226 uint32_t log_options = LLDB_LOG_OPTION_PREPEND_TIMESTAMP | LLDB_LOG_OPTION_PREPEND_THREAD_NAME;
1227 StreamString errors;
1228 return m_opaque_sp->EnableLog (channel, categories, NULL, log_options, errors);
1229
1230 }
1231 else
1232 return false;
1233}
Jim Inghamd8465212012-02-22 22:49:20 +00001234
1235void
1236SBDebugger::SetLoggingCallback (lldb::LogOutputCallback log_callback, void *baton)
1237{
1238 if (m_opaque_sp)
1239 {
1240 return m_opaque_sp->SetLoggingCallback (log_callback, baton);
1241 }
1242}
1243
1244