blob: b61acd75f62c114e770439c00fc0083f7e74b025 [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{
146 ModuleList::RemoveOrphanSharedModules();
147}
148
Greg Clayton63094e02010-06-23 01:19:29 +0000149SBDebugger::SBDebugger () :
150 m_opaque_sp ()
151{
152}
153
Enrico Granata3370f0c2011-08-19 23:56:34 +0000154SBDebugger::SBDebugger(const lldb::DebuggerSP &debugger_sp) :
155 m_opaque_sp(debugger_sp)
156{
157}
158
Greg Clayton538eb822010-11-05 23:17:00 +0000159SBDebugger::SBDebugger(const SBDebugger &rhs) :
160 m_opaque_sp (rhs.m_opaque_sp)
161{
162}
163
164SBDebugger &
165SBDebugger::operator = (const SBDebugger &rhs)
166{
167 if (this != &rhs)
168 {
169 m_opaque_sp = rhs.m_opaque_sp;
170 }
171 return *this;
172}
173
Greg Clayton63094e02010-06-23 01:19:29 +0000174SBDebugger::~SBDebugger ()
175{
176}
177
178bool
179SBDebugger::IsValid() const
180{
181 return m_opaque_sp.get() != NULL;
182}
183
184
Chris Lattner24943d22010-06-08 16:52:24 +0000185void
186SBDebugger::SetAsync (bool b)
187{
Greg Clayton63094e02010-06-23 01:19:29 +0000188 if (m_opaque_sp)
189 m_opaque_sp->SetAsyncExecution(b);
Chris Lattner24943d22010-06-08 16:52:24 +0000190}
191
Jim Ingham83dd2032011-09-13 23:25:31 +0000192bool
193SBDebugger::GetAsync ()
194{
195 if (m_opaque_sp)
196 return m_opaque_sp->GetAsyncExecution();
197 else
198 return false;
199}
200
Greg Clayton887aa282010-10-11 01:05:37 +0000201void
202SBDebugger::SkipLLDBInitFiles (bool b)
203{
204 if (m_opaque_sp)
205 m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles (b);
206}
207
Jim Ingham574c3d62011-08-12 23:34:31 +0000208void
209SBDebugger::SkipAppInitFiles (bool b)
210{
211 if (m_opaque_sp)
212 m_opaque_sp->GetCommandInterpreter().SkipAppInitFiles (b);
213}
214
Chris Lattner24943d22010-06-08 16:52:24 +0000215// Shouldn't really be settable after initialization as this could cause lots of problems; don't want users
216// trying to switch modes in the middle of a debugging session.
217void
218SBDebugger::SetInputFileHandle (FILE *fh, bool transfer_ownership)
219{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000220 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000221
222 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000223 log->Printf ("SBDebugger(%p)::SetInputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
224 fh, transfer_ownership);
Caroline Tice7826c882010-10-26 03:11:13 +0000225
Greg Clayton63094e02010-06-23 01:19:29 +0000226 if (m_opaque_sp)
227 m_opaque_sp->SetInputFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000228}
229
230void
231SBDebugger::SetOutputFileHandle (FILE *fh, bool transfer_ownership)
232{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000233 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000234
235
236 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000237 log->Printf ("SBDebugger(%p)::SetOutputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
238 fh, transfer_ownership);
Caroline Tice7826c882010-10-26 03:11:13 +0000239
Greg Clayton63094e02010-06-23 01:19:29 +0000240 if (m_opaque_sp)
241 m_opaque_sp->SetOutputFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000242}
243
244void
245SBDebugger::SetErrorFileHandle (FILE *fh, bool transfer_ownership)
246{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000247 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000248
249
250 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000251 log->Printf ("SBDebugger(%p)::SetErrorFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
252 fh, transfer_ownership);
Caroline Tice7826c882010-10-26 03:11:13 +0000253
Greg Clayton63094e02010-06-23 01:19:29 +0000254 if (m_opaque_sp)
255 m_opaque_sp->SetErrorFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000256}
257
258FILE *
259SBDebugger::GetInputFileHandle ()
260{
Greg Clayton63094e02010-06-23 01:19:29 +0000261 if (m_opaque_sp)
Greg Clayton58928562011-02-09 01:08:52 +0000262 return m_opaque_sp->GetInputFile().GetStream();
Greg Clayton63094e02010-06-23 01:19:29 +0000263 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000264}
265
266FILE *
267SBDebugger::GetOutputFileHandle ()
268{
Greg Clayton63094e02010-06-23 01:19:29 +0000269 if (m_opaque_sp)
Greg Clayton58928562011-02-09 01:08:52 +0000270 return m_opaque_sp->GetOutputFile().GetStream();
Greg Clayton63094e02010-06-23 01:19:29 +0000271 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000272}
273
274FILE *
275SBDebugger::GetErrorFileHandle ()
276{
Greg Clayton63094e02010-06-23 01:19:29 +0000277 if (m_opaque_sp)
Greg Clayton58928562011-02-09 01:08:52 +0000278 return m_opaque_sp->GetErrorFile().GetStream();
Greg Clayton63094e02010-06-23 01:19:29 +0000279 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000280}
281
282SBCommandInterpreter
283SBDebugger::GetCommandInterpreter ()
284{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000285 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000286
Greg Clayton63094e02010-06-23 01:19:29 +0000287 SBCommandInterpreter sb_interpreter;
288 if (m_opaque_sp)
289 sb_interpreter.reset (&m_opaque_sp->GetCommandInterpreter());
Caroline Tice7826c882010-10-26 03:11:13 +0000290
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000291 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000292 log->Printf ("SBDebugger(%p)::GetCommandInterpreter () => SBCommandInterpreter(%p)",
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000293 m_opaque_sp.get(), sb_interpreter.get());
294
Chris Lattner24943d22010-06-08 16:52:24 +0000295 return sb_interpreter;
296}
297
298void
299SBDebugger::HandleCommand (const char *command)
300{
Greg Clayton63094e02010-06-23 01:19:29 +0000301 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000302 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000303 TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
304 Mutex::Locker api_locker;
305 if (target_sp)
306 api_locker.Reset(target_sp->GetAPIMutex().GetMutex());
307
Greg Clayton63094e02010-06-23 01:19:29 +0000308 SBCommandInterpreter sb_interpreter(GetCommandInterpreter ());
309 SBCommandReturnObject result;
310
311 sb_interpreter.HandleCommand (command, result, false);
312
313 if (GetErrorFileHandle() != NULL)
314 result.PutError (GetErrorFileHandle());
315 if (GetOutputFileHandle() != NULL)
316 result.PutOutput (GetOutputFileHandle());
317
318 if (m_opaque_sp->GetAsyncExecution() == false)
Chris Lattner24943d22010-06-08 16:52:24 +0000319 {
Greg Clayton63094e02010-06-23 01:19:29 +0000320 SBProcess process(GetCommandInterpreter().GetProcess ());
Greg Clayton334d33a2012-01-30 07:41:31 +0000321 ProcessSP process_sp (process.GetSP());
322 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000323 {
Greg Clayton63094e02010-06-23 01:19:29 +0000324 EventSP event_sp;
325 Listener &lldb_listener = m_opaque_sp->GetListener();
Greg Clayton334d33a2012-01-30 07:41:31 +0000326 while (lldb_listener.GetNextEventForBroadcaster (process_sp.get(), event_sp))
Greg Clayton63094e02010-06-23 01:19:29 +0000327 {
328 SBEvent event(event_sp);
329 HandleProcessEvent (process, event, GetOutputFileHandle(), GetErrorFileHandle());
330 }
Chris Lattner24943d22010-06-08 16:52:24 +0000331 }
332 }
333 }
334}
335
336SBListener
337SBDebugger::GetListener ()
338{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000339 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000340
Greg Clayton63094e02010-06-23 01:19:29 +0000341 SBListener sb_listener;
342 if (m_opaque_sp)
343 sb_listener.reset(&m_opaque_sp->GetListener(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000344
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000345 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000346 log->Printf ("SBDebugger(%p)::GetListener () => SBListener(%p)", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000347 sb_listener.get());
348
Chris Lattner24943d22010-06-08 16:52:24 +0000349 return sb_listener;
350}
351
352void
353SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, FILE *out, FILE *err)
354{
Greg Claytonbdcda462010-12-20 20:49:23 +0000355 if (!process.IsValid())
356 return;
Chris Lattner24943d22010-06-08 16:52:24 +0000357
Greg Clayton334d33a2012-01-30 07:41:31 +0000358 TargetSP target_sp (process.GetTarget().GetSP());
359 if (!target_sp)
360 return;
361
Greg Claytonbdcda462010-12-20 20:49:23 +0000362 const uint32_t event_type = event.GetType();
363 char stdio_buffer[1024];
364 size_t len;
Chris Lattner24943d22010-06-08 16:52:24 +0000365
Greg Clayton334d33a2012-01-30 07:41:31 +0000366 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Claytonbdcda462010-12-20 20:49:23 +0000367
368 if (event_type & (Process::eBroadcastBitSTDOUT | Process::eBroadcastBitStateChanged))
Chris Lattner24943d22010-06-08 16:52:24 +0000369 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000370 // Drain stdout when we stop just in case we have any bytes
371 while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
372 if (out != NULL)
373 ::fwrite (stdio_buffer, 1, len, out);
374 }
375
376 if (event_type & (Process::eBroadcastBitSTDERR | Process::eBroadcastBitStateChanged))
377 {
378 // Drain stderr when we stop just in case we have any bytes
379 while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
380 if (err != NULL)
381 ::fwrite (stdio_buffer, 1, len, err);
382 }
383
384 if (event_type & Process::eBroadcastBitStateChanged)
385 {
386 StateType event_state = SBProcess::GetStateFromEvent (event);
387
388 if (event_state == eStateInvalid)
389 return;
390
391 bool is_stopped = StateIsStoppedState (event_state);
392 if (!is_stopped)
393 process.ReportEventState (event, out);
Chris Lattner24943d22010-06-08 16:52:24 +0000394 }
395}
396
Jim Inghamcc637462011-09-13 00:29:56 +0000397SBSourceManager
Chris Lattner24943d22010-06-08 16:52:24 +0000398SBDebugger::GetSourceManager ()
399{
Jim Inghamcc637462011-09-13 00:29:56 +0000400 SBSourceManager sb_source_manager (*this);
401 return sb_source_manager;
Chris Lattner24943d22010-06-08 16:52:24 +0000402}
403
404
405bool
406SBDebugger::GetDefaultArchitecture (char *arch_name, size_t arch_name_len)
407{
408 if (arch_name && arch_name_len)
409 {
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000410 ArchSpec default_arch = Target::GetDefaultArchitecture ();
Caroline Tice5bc8c972010-09-20 20:44:43 +0000411
Chris Lattner24943d22010-06-08 16:52:24 +0000412 if (default_arch.IsValid())
413 {
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000414 const std::string &triple_str = default_arch.GetTriple().str();
415 if (!triple_str.empty())
416 ::snprintf (arch_name, arch_name_len, "%s", triple_str.c_str());
417 else
418 ::snprintf (arch_name, arch_name_len, "%s", default_arch.GetArchitectureName());
Chris Lattner24943d22010-06-08 16:52:24 +0000419 return true;
420 }
421 }
422 if (arch_name && arch_name_len)
423 arch_name[0] = '\0';
424 return false;
425}
426
427
428bool
429SBDebugger::SetDefaultArchitecture (const char *arch_name)
430{
431 if (arch_name)
432 {
Greg Claytonf15996e2011-04-07 22:46:35 +0000433 ArchSpec arch (arch_name, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000434 if (arch.IsValid())
435 {
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000436 Target::SetDefaultArchitecture (arch);
Chris Lattner24943d22010-06-08 16:52:24 +0000437 return true;
438 }
439 }
440 return false;
441}
442
443ScriptLanguage
444SBDebugger::GetScriptingLanguage (const char *script_language_name)
445{
Greg Claytonbdcda462010-12-20 20:49:23 +0000446
Chris Lattner24943d22010-06-08 16:52:24 +0000447 return Args::StringToScriptLanguage (script_language_name,
448 eScriptLanguageDefault,
449 NULL);
450}
Chris Lattner24943d22010-06-08 16:52:24 +0000451
452const char *
453SBDebugger::GetVersionString ()
454{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000455 return GetVersion();
Chris Lattner24943d22010-06-08 16:52:24 +0000456}
457
458const char *
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000459SBDebugger::StateAsCString (StateType state)
Chris Lattner24943d22010-06-08 16:52:24 +0000460{
Caroline Ticea2cffd32011-04-25 22:05:51 +0000461 return lldb_private::StateAsCString (state);
Chris Lattner24943d22010-06-08 16:52:24 +0000462}
463
464bool
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000465SBDebugger::StateIsRunningState (StateType state)
Chris Lattner24943d22010-06-08 16:52:24 +0000466{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000467 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000468
Caroline Ticea2cffd32011-04-25 22:05:51 +0000469 const bool result = lldb_private::StateIsRunningState (state);
Greg Claytona66ba462010-10-30 04:51:46 +0000470 if (log)
471 log->Printf ("SBDebugger::StateIsRunningState (state=%s) => %i",
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000472 StateAsCString (state), result);
Greg Claytona66ba462010-10-30 04:51:46 +0000473
474 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000475}
476
477bool
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000478SBDebugger::StateIsStoppedState (StateType state)
Chris Lattner24943d22010-06-08 16:52:24 +0000479{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000480 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000481
Greg Clayton20206082011-11-17 01:23:07 +0000482 const bool result = lldb_private::StateIsStoppedState (state, false);
Caroline Tice7826c882010-10-26 03:11:13 +0000483 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000484 log->Printf ("SBDebugger::StateIsStoppedState (state=%s) => %i",
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000485 StateAsCString (state), result);
Caroline Tice7826c882010-10-26 03:11:13 +0000486
Greg Claytona66ba462010-10-30 04:51:46 +0000487 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000488}
489
Greg Clayton3e8c25f2011-09-24 00:52:29 +0000490lldb::SBTarget
491SBDebugger::CreateTarget (const char *filename,
492 const char *target_triple,
493 const char *platform_name,
494 bool add_dependent_modules,
495 lldb::SBError& sb_error)
496{
497 SBTarget sb_target;
Greg Clayton334d33a2012-01-30 07:41:31 +0000498 TargetSP target_sp;
Greg Clayton3e8c25f2011-09-24 00:52:29 +0000499 if (m_opaque_sp)
500 {
501 sb_error.Clear();
502 FileSpec filename_spec (filename, true);
503 OptionGroupPlatform platform_options (false);
504 platform_options.SetPlatformName (platform_name);
505
Greg Clayton3e8c25f2011-09-24 00:52:29 +0000506 sb_error.ref() = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
507 filename_spec,
508 target_triple,
509 add_dependent_modules,
510 &platform_options,
511 target_sp);
512
513 if (sb_error.Success())
Greg Clayton334d33a2012-01-30 07:41:31 +0000514 sb_target.SetSP (target_sp);
Greg Clayton3e8c25f2011-09-24 00:52:29 +0000515 }
516 else
517 {
518 sb_error.SetErrorString("invalid target");
519 }
520
521 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
522 if (log)
523 {
524 log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\", triple=%s, platform_name=%s, add_dependent_modules=%u, error=%s) => SBTarget(%p)",
525 m_opaque_sp.get(),
526 filename,
527 target_triple,
528 platform_name,
529 add_dependent_modules,
530 sb_error.GetCString(),
Greg Clayton334d33a2012-01-30 07:41:31 +0000531 target_sp.get());
Greg Clayton3e8c25f2011-09-24 00:52:29 +0000532 }
533
534 return sb_target;
535}
Chris Lattner24943d22010-06-08 16:52:24 +0000536
537SBTarget
538SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename,
539 const char *target_triple)
540{
Greg Clayton334d33a2012-01-30 07:41:31 +0000541 SBTarget sb_target;
542 TargetSP target_sp;
Greg Clayton63094e02010-06-23 01:19:29 +0000543 if (m_opaque_sp)
544 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000545 FileSpec file_spec (filename, true);
Greg Clayton63094e02010-06-23 01:19:29 +0000546 TargetSP target_sp;
Greg Clayton3e8c25f2011-09-24 00:52:29 +0000547 const bool add_dependent_modules = true;
548 Error error (m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
549 file_spec,
550 target_triple,
551 add_dependent_modules,
552 NULL,
553 target_sp));
Greg Clayton334d33a2012-01-30 07:41:31 +0000554 sb_target.SetSP (target_sp);
Greg Clayton63094e02010-06-23 01:19:29 +0000555 }
Greg Claytona66ba462010-10-30 04:51:46 +0000556
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000557 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000558 if (log)
559 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000560 log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndTargetTriple (filename=\"%s\", triple=%s) => SBTarget(%p)",
Greg Clayton334d33a2012-01-30 07:41:31 +0000561 m_opaque_sp.get(), filename, target_triple, target_sp.get());
Greg Claytona66ba462010-10-30 04:51:46 +0000562 }
563
Greg Clayton334d33a2012-01-30 07:41:31 +0000564 return sb_target;
Chris Lattner24943d22010-06-08 16:52:24 +0000565}
566
567SBTarget
Greg Clayton940b1032011-02-23 00:35:02 +0000568SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *arch_cstr)
Chris Lattner24943d22010-06-08 16:52:24 +0000569{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000570 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000571
Greg Clayton334d33a2012-01-30 07:41:31 +0000572 SBTarget sb_target;
573 TargetSP target_sp;
Greg Clayton63094e02010-06-23 01:19:29 +0000574 if (m_opaque_sp)
575 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000576 FileSpec file (filename, true);
Greg Clayton63094e02010-06-23 01:19:29 +0000577 Error error;
Greg Clayton3e8c25f2011-09-24 00:52:29 +0000578 const bool add_dependent_modules = true;
Chris Lattner24943d22010-06-08 16:52:24 +0000579
Greg Clayton3e8c25f2011-09-24 00:52:29 +0000580 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
581 file,
582 arch_cstr,
583 add_dependent_modules,
584 NULL,
585 target_sp);
Greg Clayton63094e02010-06-23 01:19:29 +0000586
587 if (error.Success())
588 {
Jim Inghamc8332952010-08-26 21:32:51 +0000589 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Clayton334d33a2012-01-30 07:41:31 +0000590 sb_target.SetSP (target_sp);
Greg Clayton63094e02010-06-23 01:19:29 +0000591 }
Chris Lattner24943d22010-06-08 16:52:24 +0000592 }
Caroline Tice7826c882010-10-26 03:11:13 +0000593
594 if (log)
595 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000596 log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndArch (filename=\"%s\", arch=%s) => SBTarget(%p)",
Greg Clayton334d33a2012-01-30 07:41:31 +0000597 m_opaque_sp.get(), filename, arch_cstr, target_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000598 }
599
Greg Clayton334d33a2012-01-30 07:41:31 +0000600 return sb_target;
Greg Clayton63094e02010-06-23 01:19:29 +0000601}
602
603SBTarget
604SBDebugger::CreateTarget (const char *filename)
605{
Greg Clayton334d33a2012-01-30 07:41:31 +0000606 SBTarget sb_target;
607 TargetSP target_sp;
Greg Clayton63094e02010-06-23 01:19:29 +0000608 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000609 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000610 FileSpec file (filename, true);
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000611 ArchSpec arch = Target::GetDefaultArchitecture ();
Greg Clayton63094e02010-06-23 01:19:29 +0000612 Error error;
Greg Clayton3e8c25f2011-09-24 00:52:29 +0000613 const bool add_dependent_modules = true;
Greg Clayton63094e02010-06-23 01:19:29 +0000614
Greg Claytonb1db6582012-03-20 18:34:04 +0000615 PlatformSP platform_sp(m_opaque_sp->GetPlatformList().GetSelectedPlatform());
Greg Clayton3e8c25f2011-09-24 00:52:29 +0000616 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
617 file,
618 arch,
619 add_dependent_modules,
Greg Claytonb1db6582012-03-20 18:34:04 +0000620 platform_sp,
Greg Clayton3e8c25f2011-09-24 00:52:29 +0000621 target_sp);
Greg Clayton63094e02010-06-23 01:19:29 +0000622
623 if (error.Success())
624 {
Jim Inghamc8332952010-08-26 21:32:51 +0000625 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Clayton334d33a2012-01-30 07:41:31 +0000626 sb_target.SetSP (target_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000627 }
628 }
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000629 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000630 if (log)
631 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000632 log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)",
Greg Clayton334d33a2012-01-30 07:41:31 +0000633 m_opaque_sp.get(), filename, target_sp.get());
Greg Claytona66ba462010-10-30 04:51:46 +0000634 }
Greg Clayton334d33a2012-01-30 07:41:31 +0000635 return sb_target;
Chris Lattner24943d22010-06-08 16:52:24 +0000636}
637
Johnny Chen409646d2011-06-15 21:24:24 +0000638bool
639SBDebugger::DeleteTarget (lldb::SBTarget &target)
640{
641 bool result = false;
Greg Clayton334d33a2012-01-30 07:41:31 +0000642 if (m_opaque_sp)
Johnny Chen409646d2011-06-15 21:24:24 +0000643 {
Greg Clayton334d33a2012-01-30 07:41:31 +0000644 TargetSP target_sp(target.GetSP());
645 if (target_sp)
646 {
647 // No need to lock, the target list is thread safe
648 result = m_opaque_sp->GetTargetList().DeleteTarget (target_sp);
649 target_sp->Destroy();
650 target.Clear();
651 ModuleList::RemoveOrphanSharedModules();
652 }
Johnny Chen409646d2011-06-15 21:24:24 +0000653 }
654
655 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
656 if (log)
657 {
658 log->Printf ("SBDebugger(%p)::DeleteTarget (SBTarget(%p)) => %i", m_opaque_sp.get(), target.m_opaque_sp.get(), result);
659 }
660
661 return result;
662}
Chris Lattner24943d22010-06-08 16:52:24 +0000663SBTarget
664SBDebugger::GetTargetAtIndex (uint32_t idx)
665{
Greg Clayton63094e02010-06-23 01:19:29 +0000666 SBTarget sb_target;
667 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000668 {
669 // No need to lock, the target list is thread safe
Greg Clayton334d33a2012-01-30 07:41:31 +0000670 sb_target.SetSP (m_opaque_sp->GetTargetList().GetTargetAtIndex (idx));
Greg Claytonbdcda462010-12-20 20:49:23 +0000671 }
Chris Lattner24943d22010-06-08 16:52:24 +0000672 return sb_target;
673}
674
675SBTarget
676SBDebugger::FindTargetWithProcessID (pid_t pid)
677{
Greg Clayton63094e02010-06-23 01:19:29 +0000678 SBTarget sb_target;
679 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000680 {
681 // No need to lock, the target list is thread safe
Greg Clayton334d33a2012-01-30 07:41:31 +0000682 sb_target.SetSP (m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid));
Greg Claytonbdcda462010-12-20 20:49:23 +0000683 }
Chris Lattner24943d22010-06-08 16:52:24 +0000684 return sb_target;
685}
686
687SBTarget
688SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name)
689{
Greg Clayton63094e02010-06-23 01:19:29 +0000690 SBTarget sb_target;
691 if (m_opaque_sp && filename && filename[0])
692 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000693 // No need to lock, the target list is thread safe
Greg Claytonf15996e2011-04-07 22:46:35 +0000694 ArchSpec arch (arch_name, m_opaque_sp->GetPlatformList().GetSelectedPlatform().get());
Greg Clayton537a7a82010-10-20 20:54:39 +0000695 TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename, false), arch_name ? &arch : NULL));
Greg Clayton334d33a2012-01-30 07:41:31 +0000696 sb_target.SetSP (target_sp);
Greg Clayton63094e02010-06-23 01:19:29 +0000697 }
698 return sb_target;
Chris Lattner24943d22010-06-08 16:52:24 +0000699}
700
701SBTarget
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000702SBDebugger::FindTargetWithLLDBProcess (const ProcessSP &process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000703{
Greg Clayton63094e02010-06-23 01:19:29 +0000704 SBTarget sb_target;
705 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000706 {
707 // No need to lock, the target list is thread safe
Greg Clayton334d33a2012-01-30 07:41:31 +0000708 sb_target.SetSP (m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get()));
Greg Claytonbdcda462010-12-20 20:49:23 +0000709 }
Chris Lattner24943d22010-06-08 16:52:24 +0000710 return sb_target;
711}
712
713
714uint32_t
715SBDebugger::GetNumTargets ()
716{
Greg Clayton63094e02010-06-23 01:19:29 +0000717 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000718 {
719 // No need to lock, the target list is thread safe
Greg Clayton63094e02010-06-23 01:19:29 +0000720 return m_opaque_sp->GetTargetList().GetNumTargets ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000721 }
Greg Clayton63094e02010-06-23 01:19:29 +0000722 return 0;
723}
Chris Lattner24943d22010-06-08 16:52:24 +0000724
725SBTarget
Jim Inghamc8332952010-08-26 21:32:51 +0000726SBDebugger::GetSelectedTarget ()
Chris Lattner24943d22010-06-08 16:52:24 +0000727{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000728 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000729
Greg Clayton63094e02010-06-23 01:19:29 +0000730 SBTarget sb_target;
Greg Clayton334d33a2012-01-30 07:41:31 +0000731 TargetSP target_sp;
Greg Clayton63094e02010-06-23 01:19:29 +0000732 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000733 {
734 // No need to lock, the target list is thread safe
Greg Clayton334d33a2012-01-30 07:41:31 +0000735 target_sp = m_opaque_sp->GetTargetList().GetSelectedTarget ();
736 sb_target.SetSP (target_sp);
Greg Claytonbdcda462010-12-20 20:49:23 +0000737 }
Caroline Tice7826c882010-10-26 03:11:13 +0000738
739 if (log)
740 {
741 SBStream sstr;
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000742 sb_target.GetDescription (sstr, eDescriptionLevelBrief);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000743 log->Printf ("SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s", m_opaque_sp.get(),
Greg Clayton334d33a2012-01-30 07:41:31 +0000744 target_sp.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000745 }
746
Chris Lattner24943d22010-06-08 16:52:24 +0000747 return sb_target;
748}
749
750void
Jim Ingham83dd2032011-09-13 23:25:31 +0000751SBDebugger::SetSelectedTarget (SBTarget &sb_target)
752{
753 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
754
Greg Clayton334d33a2012-01-30 07:41:31 +0000755 TargetSP target_sp (sb_target.GetSP());
Jim Ingham83dd2032011-09-13 23:25:31 +0000756 if (m_opaque_sp)
757 {
Greg Clayton334d33a2012-01-30 07:41:31 +0000758 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Jim Ingham83dd2032011-09-13 23:25:31 +0000759 }
760 if (log)
761 {
762 SBStream sstr;
763 sb_target.GetDescription (sstr, eDescriptionLevelBrief);
764 log->Printf ("SBDebugger(%p)::SetSelectedTarget () => SBTarget(%p): %s", m_opaque_sp.get(),
Greg Clayton334d33a2012-01-30 07:41:31 +0000765 target_sp.get(), sstr.GetData());
Jim Ingham83dd2032011-09-13 23:25:31 +0000766 }
767}
768
769void
Chris Lattner24943d22010-06-08 16:52:24 +0000770SBDebugger::DispatchInput (void *baton, const void *data, size_t data_len)
771{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000772 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000773
774 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000775 log->Printf ("SBDebugger(%p)::DispatchInput (baton=%p, data=\"%.*s\", size_t=%zu)", m_opaque_sp.get(),
776 baton, (int) data_len, (const char *) data, data_len);
Caroline Tice7826c882010-10-26 03:11:13 +0000777
Greg Clayton63094e02010-06-23 01:19:29 +0000778 if (m_opaque_sp)
779 m_opaque_sp->DispatchInput ((const char *) data, data_len);
Chris Lattner24943d22010-06-08 16:52:24 +0000780}
781
782void
Caroline Ticec4f55fe2010-11-19 20:47:54 +0000783SBDebugger::DispatchInputInterrupt ()
784{
785 if (m_opaque_sp)
786 m_opaque_sp->DispatchInputInterrupt ();
787}
788
789void
790SBDebugger::DispatchInputEndOfFile ()
791{
792 if (m_opaque_sp)
793 m_opaque_sp->DispatchInputEndOfFile ();
794}
Caroline Ticeb38df1e2011-05-09 23:06:58 +0000795
796bool
797SBDebugger::InputReaderIsTopReader (const lldb::SBInputReader &reader)
798{
799 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
800
801 if (log)
802 log->Printf ("SBDebugger(%p)::InputReaderIsTopReader (SBInputReader(%p))", m_opaque_sp.get(), &reader);
803
804 if (m_opaque_sp && reader.IsValid())
805 {
806 InputReaderSP reader_sp (*reader);
807 return m_opaque_sp->InputReaderIsTopReader (reader_sp);
808 }
809
810 return false;
811}
812
Caroline Ticec4f55fe2010-11-19 20:47:54 +0000813
814void
Chris Lattner24943d22010-06-08 16:52:24 +0000815SBDebugger::PushInputReader (SBInputReader &reader)
816{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000817 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000818
819 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000820 log->Printf ("SBDebugger(%p)::PushInputReader (SBInputReader(%p))", m_opaque_sp.get(), &reader);
Caroline Tice7826c882010-10-26 03:11:13 +0000821
Greg Clayton63094e02010-06-23 01:19:29 +0000822 if (m_opaque_sp && reader.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000823 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000824 TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
825 Mutex::Locker api_locker;
826 if (target_sp)
827 api_locker.Reset(target_sp->GetAPIMutex().GetMutex());
Chris Lattner24943d22010-06-08 16:52:24 +0000828 InputReaderSP reader_sp(*reader);
Greg Clayton63094e02010-06-23 01:19:29 +0000829 m_opaque_sp->PushInputReader (reader_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000830 }
831}
Greg Clayton63094e02010-06-23 01:19:29 +0000832
833void
Caroline Tice4a348082011-05-02 20:41:46 +0000834SBDebugger::NotifyTopInputReader (InputReaderAction notification)
835{
836 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
837
838 if (log)
839 log->Printf ("SBDebugger(%p)::NotifyTopInputReader (%d)", m_opaque_sp.get(), notification);
840
841 if (m_opaque_sp)
842 m_opaque_sp->NotifyTopInputReader (notification);
843}
844
845void
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000846SBDebugger::reset (const DebuggerSP &debugger_sp)
Greg Clayton63094e02010-06-23 01:19:29 +0000847{
848 m_opaque_sp = debugger_sp;
849}
850
851Debugger *
852SBDebugger::get () const
853{
854 return m_opaque_sp.get();
855}
856
857Debugger &
858SBDebugger::ref () const
859{
860 assert (m_opaque_sp.get());
861 return *m_opaque_sp;
862}
863
Greg Clayton15afa9f2011-10-01 02:59:24 +0000864const lldb::DebuggerSP &
865SBDebugger::get_sp () const
866{
867 return m_opaque_sp;
868}
Greg Clayton63094e02010-06-23 01:19:29 +0000869
Caroline Tice558be582010-06-30 16:22:25 +0000870SBDebugger
871SBDebugger::FindDebuggerWithID (int id)
872{
Greg Claytonbdcda462010-12-20 20:49:23 +0000873 // No need to lock, the debugger list is thread safe
Caroline Tice558be582010-06-30 16:22:25 +0000874 SBDebugger sb_debugger;
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000875 DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id);
Caroline Tice558be582010-06-30 16:22:25 +0000876 if (debugger_sp)
877 sb_debugger.reset (debugger_sp);
878 return sb_debugger;
879}
Jim Ingham74989e82010-08-30 19:44:40 +0000880
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000881const char *
882SBDebugger::GetInstanceName()
883{
884 if (m_opaque_sp)
885 return m_opaque_sp->GetInstanceName().AsCString();
886 else
887 return NULL;
888}
889
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000890SBError
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000891SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000892{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000893 UserSettingsControllerSP root_settings_controller = Debugger::GetSettingsController();
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000894
Greg Claytonb3448432011-03-24 21:19:54 +0000895 Error err = root_settings_controller->SetVariable (var_name,
896 value,
897 eVarSetOperationAssign,
898 true,
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000899 debugger_instance_name);
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000900 SBError sb_error;
901 sb_error.SetError (err);
902
903 return sb_error;
904}
905
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000906SBStringList
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000907SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000908{
909 SBStringList ret_value;
Greg Claytonb3448432011-03-24 21:19:54 +0000910 SettableVariableType var_type;
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000911 Error err;
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000912
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000913 UserSettingsControllerSP root_settings_controller = Debugger::GetSettingsController();
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000914
Caroline Tice5bc8c972010-09-20 20:44:43 +0000915 StringList value = root_settings_controller->GetVariable (var_name, var_type, debugger_instance_name, err);
916
917 if (err.Success())
918 {
919 for (unsigned i = 0; i != value.GetSize(); ++i)
920 ret_value.AppendString (value.GetStringAtIndex(i));
921 }
922 else
923 {
924 ret_value.AppendString (err.AsCString());
925 }
926
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000927
928 return ret_value;
929}
930
Greg Clayton238c0a12010-09-18 01:14:36 +0000931uint32_t
932SBDebugger::GetTerminalWidth () const
933{
934 if (m_opaque_sp)
935 return m_opaque_sp->GetTerminalWidth ();
936 return 0;
937}
938
939void
940SBDebugger::SetTerminalWidth (uint32_t term_width)
941{
942 if (m_opaque_sp)
943 m_opaque_sp->SetTerminalWidth (term_width);
944}
945
946const char *
947SBDebugger::GetPrompt() const
948{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000949 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000950
951 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000952 log->Printf ("SBDebugger(%p)::GetPrompt () => \"%s\"", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000953 (m_opaque_sp ? m_opaque_sp->GetPrompt() : ""));
Caroline Tice7826c882010-10-26 03:11:13 +0000954
Greg Clayton238c0a12010-09-18 01:14:36 +0000955 if (m_opaque_sp)
956 return m_opaque_sp->GetPrompt ();
957 return 0;
958}
959
960void
961SBDebugger::SetPrompt (const char *prompt)
962{
963 if (m_opaque_sp)
964 m_opaque_sp->SetPrompt (prompt);
965}
966
967
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000968ScriptLanguage
Greg Clayton238c0a12010-09-18 01:14:36 +0000969SBDebugger::GetScriptLanguage() const
970{
971 if (m_opaque_sp)
972 return m_opaque_sp->GetScriptLanguage ();
973 return eScriptLanguageNone;
974}
975
976void
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000977SBDebugger::SetScriptLanguage (ScriptLanguage script_lang)
Greg Clayton238c0a12010-09-18 01:14:36 +0000978{
979 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000980 {
Greg Clayton238c0a12010-09-18 01:14:36 +0000981 m_opaque_sp->SetScriptLanguage (script_lang);
Greg Claytonbdcda462010-12-20 20:49:23 +0000982 }
Greg Clayton238c0a12010-09-18 01:14:36 +0000983}
984
Jim Ingham74989e82010-08-30 19:44:40 +0000985bool
986SBDebugger::SetUseExternalEditor (bool value)
987{
988 if (m_opaque_sp)
989 return m_opaque_sp->SetUseExternalEditor (value);
Greg Claytonbdcda462010-12-20 20:49:23 +0000990 return false;
Jim Ingham74989e82010-08-30 19:44:40 +0000991}
992
993bool
Caroline Tice5bc8c972010-09-20 20:44:43 +0000994SBDebugger::GetUseExternalEditor ()
Jim Ingham74989e82010-08-30 19:44:40 +0000995{
996 if (m_opaque_sp)
Caroline Tice5bc8c972010-09-20 20:44:43 +0000997 return m_opaque_sp->GetUseExternalEditor ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000998 return false;
Jim Ingham74989e82010-08-30 19:44:40 +0000999}
1000
Caroline Tice98f930f2010-09-20 05:20:02 +00001001bool
1002SBDebugger::GetDescription (SBStream &description)
1003{
Greg Clayton96154be2011-11-13 06:57:31 +00001004 Stream &strm = description.ref();
1005
Caroline Tice98f930f2010-09-20 05:20:02 +00001006 if (m_opaque_sp)
1007 {
1008 const char *name = m_opaque_sp->GetInstanceName().AsCString();
Greg Clayton9ce9c3c2011-04-18 23:15:17 +00001009 user_id_t id = m_opaque_sp->GetID();
Greg Clayton96154be2011-11-13 06:57:31 +00001010 strm.Printf ("Debugger (instance: \"%s\", id: %llu)", name, id);
Caroline Tice98f930f2010-09-20 05:20:02 +00001011 }
1012 else
Greg Clayton96154be2011-11-13 06:57:31 +00001013 strm.PutCString ("No value");
Caroline Tice98f930f2010-09-20 05:20:02 +00001014
1015 return true;
1016}
Caroline Ticec4f55fe2010-11-19 20:47:54 +00001017
Greg Clayton9ce9c3c2011-04-18 23:15:17 +00001018user_id_t
Caroline Ticec4f55fe2010-11-19 20:47:54 +00001019SBDebugger::GetID()
1020{
1021 if (m_opaque_sp)
1022 return m_opaque_sp->GetID();
1023 return LLDB_INVALID_UID;
1024}
Greg Clayton180546b2011-04-30 01:09:13 +00001025
1026
1027SBError
1028SBDebugger::SetCurrentPlatform (const char *platform_name)
1029{
1030 SBError sb_error;
1031 if (m_opaque_sp)
1032 {
1033 PlatformSP platform_sp (Platform::Create (platform_name, sb_error.ref()));
1034
1035 if (platform_sp)
1036 {
1037 bool make_selected = true;
1038 m_opaque_sp->GetPlatformList().Append (platform_sp, make_selected);
1039 }
1040 }
1041 return sb_error;
1042}
1043
Greg Clayton421ca502011-05-29 04:06:55 +00001044bool
Greg Clayton604f0d32011-06-17 03:31:01 +00001045SBDebugger::SetCurrentPlatformSDKRoot (const char *sysroot)
1046{
1047 if (m_opaque_sp)
1048 {
1049 PlatformSP platform_sp (m_opaque_sp->GetPlatformList().GetSelectedPlatform());
1050
1051 if (platform_sp)
1052 {
1053 platform_sp->SetSDKRootDirectory (ConstString (sysroot));
1054 return true;
1055 }
1056 }
1057 return false;
1058}
1059
1060bool
Greg Clayton421ca502011-05-29 04:06:55 +00001061SBDebugger::GetCloseInputOnEOF () const
1062{
1063 if (m_opaque_sp)
1064 return m_opaque_sp->GetCloseInputOnEOF ();
1065 return false;
1066}
1067
1068void
1069SBDebugger::SetCloseInputOnEOF (bool b)
1070{
1071 if (m_opaque_sp)
1072 m_opaque_sp->SetCloseInputOnEOF (b);
1073}
Enrico Granata16376ed2012-02-15 02:34:21 +00001074
1075SBTypeCategory
1076SBDebugger::GetCategory (const char* category_name)
1077{
1078 if (!category_name || *category_name == 0)
1079 return SBTypeCategory();
1080
1081 TypeCategoryImplSP category_sp;
1082
1083 if (DataVisualization::Categories::GetCategory(ConstString(category_name), category_sp, false))
1084 return SBTypeCategory(category_sp);
1085 else
1086 return SBTypeCategory();
1087}
1088
1089SBTypeCategory
1090SBDebugger::CreateCategory (const char* category_name)
1091{
1092 if (!category_name || *category_name == 0)
1093 return SBTypeCategory();
1094
1095 TypeCategoryImplSP category_sp;
1096
1097 if (DataVisualization::Categories::GetCategory(ConstString(category_name), category_sp, true))
1098 return SBTypeCategory(category_sp);
1099 else
1100 return SBTypeCategory();
1101}
1102
1103bool
1104SBDebugger::DeleteCategory (const char* category_name)
1105{
1106 if (!category_name || *category_name == 0)
1107 return false;
1108
1109 return DataVisualization::Categories::Delete(ConstString(category_name));
1110}
1111
1112uint32_t
1113SBDebugger::GetNumCategories()
1114{
1115 return DataVisualization::Categories::GetCount();
1116}
1117
1118SBTypeCategory
1119SBDebugger::GetCategoryAtIndex (uint32_t index)
1120{
1121 return SBTypeCategory(DataVisualization::Categories::GetCategoryAtIndex(index));
1122}
1123
1124SBTypeCategory
1125SBDebugger::GetDefaultCategory()
1126{
1127 return GetCategory("default");
1128}
1129
1130SBTypeFormat
1131SBDebugger::GetFormatForType (SBTypeNameSpecifier type_name)
1132{
1133 SBTypeCategory default_category_sb = GetDefaultCategory();
1134 if (default_category_sb.GetEnabled())
1135 return default_category_sb.GetFormatForType(type_name);
1136 return SBTypeFormat();
1137}
1138
Jason Molendac48ca822012-02-21 05:33:55 +00001139#ifndef LLDB_DISABLE_PYTHON
Enrico Granata16376ed2012-02-15 02:34:21 +00001140SBTypeSummary
1141SBDebugger::GetSummaryForType (SBTypeNameSpecifier type_name)
1142{
1143 SBTypeSummary summary_chosen;
1144 uint32_t num_categories = GetNumCategories();
1145 SBTypeCategory category_sb;
1146 uint32_t prio_category = UINT32_MAX;
1147 for (uint32_t category_id = 0;
1148 category_id < num_categories;
1149 category_id++)
1150 {
1151 category_sb = GetCategoryAtIndex(category_id);
1152 if (category_sb.GetEnabled() == false)
1153 continue;
1154 SBTypeSummary summary_current = category_sb.GetSummaryForType(type_name);
1155 if (summary_current.IsValid() && (summary_chosen.IsValid() == false || (prio_category > category_sb.m_opaque_sp->GetEnabledPosition())))
1156 {
1157 prio_category = category_sb.m_opaque_sp->GetEnabledPosition();
1158 summary_chosen = summary_current;
1159 }
1160 }
1161 return summary_chosen;
1162}
Jason Molendac48ca822012-02-21 05:33:55 +00001163#endif // LLDB_DISABLE_PYTHON
Enrico Granata16376ed2012-02-15 02:34:21 +00001164
1165SBTypeFilter
1166SBDebugger::GetFilterForType (SBTypeNameSpecifier type_name)
1167{
1168 SBTypeFilter filter_chosen;
1169 uint32_t num_categories = GetNumCategories();
1170 SBTypeCategory category_sb;
1171 uint32_t prio_category = UINT32_MAX;
1172 for (uint32_t category_id = 0;
1173 category_id < num_categories;
1174 category_id++)
1175 {
1176 category_sb = GetCategoryAtIndex(category_id);
1177 if (category_sb.GetEnabled() == false)
1178 continue;
1179 SBTypeFilter filter_current = category_sb.GetFilterForType(type_name);
1180 if (filter_current.IsValid() && (filter_chosen.IsValid() == false || (prio_category > category_sb.m_opaque_sp->GetEnabledPosition())))
1181 {
1182 prio_category = category_sb.m_opaque_sp->GetEnabledPosition();
1183 filter_chosen = filter_current;
1184 }
1185 }
1186 return filter_chosen;
1187}
1188
Jason Molendac48ca822012-02-21 05:33:55 +00001189#ifndef LLDB_DISABLE_PYTHON
Enrico Granata16376ed2012-02-15 02:34:21 +00001190SBTypeSynthetic
1191SBDebugger::GetSyntheticForType (SBTypeNameSpecifier type_name)
1192{
1193 SBTypeSynthetic synth_chosen;
1194 uint32_t num_categories = GetNumCategories();
1195 SBTypeCategory category_sb;
1196 uint32_t prio_category = UINT32_MAX;
1197 for (uint32_t category_id = 0;
1198 category_id < num_categories;
1199 category_id++)
1200 {
1201 category_sb = GetCategoryAtIndex(category_id);
1202 if (category_sb.GetEnabled() == false)
1203 continue;
1204 SBTypeSynthetic synth_current = category_sb.GetSyntheticForType(type_name);
1205 if (synth_current.IsValid() && (synth_chosen.IsValid() == false || (prio_category > category_sb.m_opaque_sp->GetEnabledPosition())))
1206 {
1207 prio_category = category_sb.m_opaque_sp->GetEnabledPosition();
1208 synth_chosen = synth_current;
1209 }
1210 }
1211 return synth_chosen;
1212}
Jason Molendac48ca822012-02-21 05:33:55 +00001213#endif // LLDB_DISABLE_PYTHON
Enrico Granata16376ed2012-02-15 02:34:21 +00001214
Jim Ingham6c530f22012-02-21 02:23:08 +00001215bool
1216SBDebugger::EnableLog (const char *channel, const char **categories)
1217{
1218 if (m_opaque_sp)
1219 {
1220 uint32_t log_options = LLDB_LOG_OPTION_PREPEND_TIMESTAMP | LLDB_LOG_OPTION_PREPEND_THREAD_NAME;
1221 StreamString errors;
1222 return m_opaque_sp->EnableLog (channel, categories, NULL, log_options, errors);
1223
1224 }
1225 else
1226 return false;
1227}
Jim Inghamd8465212012-02-22 22:49:20 +00001228
1229void
1230SBDebugger::SetLoggingCallback (lldb::LogOutputCallback log_callback, void *baton)
1231{
1232 if (m_opaque_sp)
1233 {
1234 return m_opaque_sp->SetLoggingCallback (log_callback, baton);
1235 }
1236}
1237
1238