blob: 6628c1aa1f599d332f273a7651e60dd6c1626e95 [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 Clayton3e8c25f2011-09-24 00:52:29 +0000615 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
616 file,
617 arch,
618 add_dependent_modules,
619 m_opaque_sp->GetPlatformList().GetSelectedPlatform(),
620 target_sp);
Greg Clayton63094e02010-06-23 01:19:29 +0000621
622 if (error.Success())
623 {
Jim Inghamc8332952010-08-26 21:32:51 +0000624 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Clayton334d33a2012-01-30 07:41:31 +0000625 sb_target.SetSP (target_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000626 }
627 }
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000628 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000629 if (log)
630 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000631 log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)",
Greg Clayton334d33a2012-01-30 07:41:31 +0000632 m_opaque_sp.get(), filename, target_sp.get());
Greg Claytona66ba462010-10-30 04:51:46 +0000633 }
Greg Clayton334d33a2012-01-30 07:41:31 +0000634 return sb_target;
Chris Lattner24943d22010-06-08 16:52:24 +0000635}
636
Johnny Chen409646d2011-06-15 21:24:24 +0000637bool
638SBDebugger::DeleteTarget (lldb::SBTarget &target)
639{
640 bool result = false;
Greg Clayton334d33a2012-01-30 07:41:31 +0000641 if (m_opaque_sp)
Johnny Chen409646d2011-06-15 21:24:24 +0000642 {
Greg Clayton334d33a2012-01-30 07:41:31 +0000643 TargetSP target_sp(target.GetSP());
644 if (target_sp)
645 {
646 // No need to lock, the target list is thread safe
647 result = m_opaque_sp->GetTargetList().DeleteTarget (target_sp);
648 target_sp->Destroy();
649 target.Clear();
650 ModuleList::RemoveOrphanSharedModules();
651 }
Johnny Chen409646d2011-06-15 21:24:24 +0000652 }
653
654 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
655 if (log)
656 {
657 log->Printf ("SBDebugger(%p)::DeleteTarget (SBTarget(%p)) => %i", m_opaque_sp.get(), target.m_opaque_sp.get(), result);
658 }
659
660 return result;
661}
Chris Lattner24943d22010-06-08 16:52:24 +0000662SBTarget
663SBDebugger::GetTargetAtIndex (uint32_t idx)
664{
Greg Clayton63094e02010-06-23 01:19:29 +0000665 SBTarget sb_target;
666 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000667 {
668 // No need to lock, the target list is thread safe
Greg Clayton334d33a2012-01-30 07:41:31 +0000669 sb_target.SetSP (m_opaque_sp->GetTargetList().GetTargetAtIndex (idx));
Greg Claytonbdcda462010-12-20 20:49:23 +0000670 }
Chris Lattner24943d22010-06-08 16:52:24 +0000671 return sb_target;
672}
673
674SBTarget
675SBDebugger::FindTargetWithProcessID (pid_t pid)
676{
Greg Clayton63094e02010-06-23 01:19:29 +0000677 SBTarget sb_target;
678 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000679 {
680 // No need to lock, the target list is thread safe
Greg Clayton334d33a2012-01-30 07:41:31 +0000681 sb_target.SetSP (m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid));
Greg Claytonbdcda462010-12-20 20:49:23 +0000682 }
Chris Lattner24943d22010-06-08 16:52:24 +0000683 return sb_target;
684}
685
686SBTarget
687SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name)
688{
Greg Clayton63094e02010-06-23 01:19:29 +0000689 SBTarget sb_target;
690 if (m_opaque_sp && filename && filename[0])
691 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000692 // No need to lock, the target list is thread safe
Greg Claytonf15996e2011-04-07 22:46:35 +0000693 ArchSpec arch (arch_name, m_opaque_sp->GetPlatformList().GetSelectedPlatform().get());
Greg Clayton537a7a82010-10-20 20:54:39 +0000694 TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename, false), arch_name ? &arch : NULL));
Greg Clayton334d33a2012-01-30 07:41:31 +0000695 sb_target.SetSP (target_sp);
Greg Clayton63094e02010-06-23 01:19:29 +0000696 }
697 return sb_target;
Chris Lattner24943d22010-06-08 16:52:24 +0000698}
699
700SBTarget
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000701SBDebugger::FindTargetWithLLDBProcess (const ProcessSP &process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000702{
Greg Clayton63094e02010-06-23 01:19:29 +0000703 SBTarget sb_target;
704 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000705 {
706 // No need to lock, the target list is thread safe
Greg Clayton334d33a2012-01-30 07:41:31 +0000707 sb_target.SetSP (m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get()));
Greg Claytonbdcda462010-12-20 20:49:23 +0000708 }
Chris Lattner24943d22010-06-08 16:52:24 +0000709 return sb_target;
710}
711
712
713uint32_t
714SBDebugger::GetNumTargets ()
715{
Greg Clayton63094e02010-06-23 01:19:29 +0000716 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000717 {
718 // No need to lock, the target list is thread safe
Greg Clayton63094e02010-06-23 01:19:29 +0000719 return m_opaque_sp->GetTargetList().GetNumTargets ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000720 }
Greg Clayton63094e02010-06-23 01:19:29 +0000721 return 0;
722}
Chris Lattner24943d22010-06-08 16:52:24 +0000723
724SBTarget
Jim Inghamc8332952010-08-26 21:32:51 +0000725SBDebugger::GetSelectedTarget ()
Chris Lattner24943d22010-06-08 16:52:24 +0000726{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000727 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000728
Greg Clayton63094e02010-06-23 01:19:29 +0000729 SBTarget sb_target;
Greg Clayton334d33a2012-01-30 07:41:31 +0000730 TargetSP target_sp;
Greg Clayton63094e02010-06-23 01:19:29 +0000731 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000732 {
733 // No need to lock, the target list is thread safe
Greg Clayton334d33a2012-01-30 07:41:31 +0000734 target_sp = m_opaque_sp->GetTargetList().GetSelectedTarget ();
735 sb_target.SetSP (target_sp);
Greg Claytonbdcda462010-12-20 20:49:23 +0000736 }
Caroline Tice7826c882010-10-26 03:11:13 +0000737
738 if (log)
739 {
740 SBStream sstr;
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000741 sb_target.GetDescription (sstr, eDescriptionLevelBrief);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000742 log->Printf ("SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s", m_opaque_sp.get(),
Greg Clayton334d33a2012-01-30 07:41:31 +0000743 target_sp.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000744 }
745
Chris Lattner24943d22010-06-08 16:52:24 +0000746 return sb_target;
747}
748
749void
Jim Ingham83dd2032011-09-13 23:25:31 +0000750SBDebugger::SetSelectedTarget (SBTarget &sb_target)
751{
752 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
753
Greg Clayton334d33a2012-01-30 07:41:31 +0000754 TargetSP target_sp (sb_target.GetSP());
Jim Ingham83dd2032011-09-13 23:25:31 +0000755 if (m_opaque_sp)
756 {
Greg Clayton334d33a2012-01-30 07:41:31 +0000757 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Jim Ingham83dd2032011-09-13 23:25:31 +0000758 }
759 if (log)
760 {
761 SBStream sstr;
762 sb_target.GetDescription (sstr, eDescriptionLevelBrief);
763 log->Printf ("SBDebugger(%p)::SetSelectedTarget () => SBTarget(%p): %s", m_opaque_sp.get(),
Greg Clayton334d33a2012-01-30 07:41:31 +0000764 target_sp.get(), sstr.GetData());
Jim Ingham83dd2032011-09-13 23:25:31 +0000765 }
766}
767
768void
Chris Lattner24943d22010-06-08 16:52:24 +0000769SBDebugger::DispatchInput (void *baton, const void *data, size_t data_len)
770{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000771 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000772
773 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000774 log->Printf ("SBDebugger(%p)::DispatchInput (baton=%p, data=\"%.*s\", size_t=%zu)", m_opaque_sp.get(),
775 baton, (int) data_len, (const char *) data, data_len);
Caroline Tice7826c882010-10-26 03:11:13 +0000776
Greg Clayton63094e02010-06-23 01:19:29 +0000777 if (m_opaque_sp)
778 m_opaque_sp->DispatchInput ((const char *) data, data_len);
Chris Lattner24943d22010-06-08 16:52:24 +0000779}
780
781void
Caroline Ticec4f55fe2010-11-19 20:47:54 +0000782SBDebugger::DispatchInputInterrupt ()
783{
784 if (m_opaque_sp)
785 m_opaque_sp->DispatchInputInterrupt ();
786}
787
788void
789SBDebugger::DispatchInputEndOfFile ()
790{
791 if (m_opaque_sp)
792 m_opaque_sp->DispatchInputEndOfFile ();
793}
Caroline Ticeb38df1e2011-05-09 23:06:58 +0000794
795bool
796SBDebugger::InputReaderIsTopReader (const lldb::SBInputReader &reader)
797{
798 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
799
800 if (log)
801 log->Printf ("SBDebugger(%p)::InputReaderIsTopReader (SBInputReader(%p))", m_opaque_sp.get(), &reader);
802
803 if (m_opaque_sp && reader.IsValid())
804 {
805 InputReaderSP reader_sp (*reader);
806 return m_opaque_sp->InputReaderIsTopReader (reader_sp);
807 }
808
809 return false;
810}
811
Caroline Ticec4f55fe2010-11-19 20:47:54 +0000812
813void
Chris Lattner24943d22010-06-08 16:52:24 +0000814SBDebugger::PushInputReader (SBInputReader &reader)
815{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000816 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000817
818 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000819 log->Printf ("SBDebugger(%p)::PushInputReader (SBInputReader(%p))", m_opaque_sp.get(), &reader);
Caroline Tice7826c882010-10-26 03:11:13 +0000820
Greg Clayton63094e02010-06-23 01:19:29 +0000821 if (m_opaque_sp && reader.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000822 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000823 TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
824 Mutex::Locker api_locker;
825 if (target_sp)
826 api_locker.Reset(target_sp->GetAPIMutex().GetMutex());
Chris Lattner24943d22010-06-08 16:52:24 +0000827 InputReaderSP reader_sp(*reader);
Greg Clayton63094e02010-06-23 01:19:29 +0000828 m_opaque_sp->PushInputReader (reader_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000829 }
830}
Greg Clayton63094e02010-06-23 01:19:29 +0000831
832void
Caroline Tice4a348082011-05-02 20:41:46 +0000833SBDebugger::NotifyTopInputReader (InputReaderAction notification)
834{
835 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
836
837 if (log)
838 log->Printf ("SBDebugger(%p)::NotifyTopInputReader (%d)", m_opaque_sp.get(), notification);
839
840 if (m_opaque_sp)
841 m_opaque_sp->NotifyTopInputReader (notification);
842}
843
844void
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000845SBDebugger::reset (const DebuggerSP &debugger_sp)
Greg Clayton63094e02010-06-23 01:19:29 +0000846{
847 m_opaque_sp = debugger_sp;
848}
849
850Debugger *
851SBDebugger::get () const
852{
853 return m_opaque_sp.get();
854}
855
856Debugger &
857SBDebugger::ref () const
858{
859 assert (m_opaque_sp.get());
860 return *m_opaque_sp;
861}
862
Greg Clayton15afa9f2011-10-01 02:59:24 +0000863const lldb::DebuggerSP &
864SBDebugger::get_sp () const
865{
866 return m_opaque_sp;
867}
Greg Clayton63094e02010-06-23 01:19:29 +0000868
Caroline Tice558be582010-06-30 16:22:25 +0000869SBDebugger
870SBDebugger::FindDebuggerWithID (int id)
871{
Greg Claytonbdcda462010-12-20 20:49:23 +0000872 // No need to lock, the debugger list is thread safe
Caroline Tice558be582010-06-30 16:22:25 +0000873 SBDebugger sb_debugger;
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000874 DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id);
Caroline Tice558be582010-06-30 16:22:25 +0000875 if (debugger_sp)
876 sb_debugger.reset (debugger_sp);
877 return sb_debugger;
878}
Jim Ingham74989e82010-08-30 19:44:40 +0000879
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000880const char *
881SBDebugger::GetInstanceName()
882{
883 if (m_opaque_sp)
884 return m_opaque_sp->GetInstanceName().AsCString();
885 else
886 return NULL;
887}
888
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000889SBError
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000890SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000891{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000892 UserSettingsControllerSP root_settings_controller = Debugger::GetSettingsController();
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000893
Greg Claytonb3448432011-03-24 21:19:54 +0000894 Error err = root_settings_controller->SetVariable (var_name,
895 value,
896 eVarSetOperationAssign,
897 true,
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000898 debugger_instance_name);
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000899 SBError sb_error;
900 sb_error.SetError (err);
901
902 return sb_error;
903}
904
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000905SBStringList
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000906SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000907{
908 SBStringList ret_value;
Greg Claytonb3448432011-03-24 21:19:54 +0000909 SettableVariableType var_type;
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000910 Error err;
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000911
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000912 UserSettingsControllerSP root_settings_controller = Debugger::GetSettingsController();
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000913
Caroline Tice5bc8c972010-09-20 20:44:43 +0000914 StringList value = root_settings_controller->GetVariable (var_name, var_type, debugger_instance_name, err);
915
916 if (err.Success())
917 {
918 for (unsigned i = 0; i != value.GetSize(); ++i)
919 ret_value.AppendString (value.GetStringAtIndex(i));
920 }
921 else
922 {
923 ret_value.AppendString (err.AsCString());
924 }
925
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000926
927 return ret_value;
928}
929
Greg Clayton238c0a12010-09-18 01:14:36 +0000930uint32_t
931SBDebugger::GetTerminalWidth () const
932{
933 if (m_opaque_sp)
934 return m_opaque_sp->GetTerminalWidth ();
935 return 0;
936}
937
938void
939SBDebugger::SetTerminalWidth (uint32_t term_width)
940{
941 if (m_opaque_sp)
942 m_opaque_sp->SetTerminalWidth (term_width);
943}
944
945const char *
946SBDebugger::GetPrompt() const
947{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000948 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000949
950 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000951 log->Printf ("SBDebugger(%p)::GetPrompt () => \"%s\"", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000952 (m_opaque_sp ? m_opaque_sp->GetPrompt() : ""));
Caroline Tice7826c882010-10-26 03:11:13 +0000953
Greg Clayton238c0a12010-09-18 01:14:36 +0000954 if (m_opaque_sp)
955 return m_opaque_sp->GetPrompt ();
956 return 0;
957}
958
959void
960SBDebugger::SetPrompt (const char *prompt)
961{
962 if (m_opaque_sp)
963 m_opaque_sp->SetPrompt (prompt);
964}
965
966
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000967ScriptLanguage
Greg Clayton238c0a12010-09-18 01:14:36 +0000968SBDebugger::GetScriptLanguage() const
969{
970 if (m_opaque_sp)
971 return m_opaque_sp->GetScriptLanguage ();
972 return eScriptLanguageNone;
973}
974
975void
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000976SBDebugger::SetScriptLanguage (ScriptLanguage script_lang)
Greg Clayton238c0a12010-09-18 01:14:36 +0000977{
978 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000979 {
Greg Clayton238c0a12010-09-18 01:14:36 +0000980 m_opaque_sp->SetScriptLanguage (script_lang);
Greg Claytonbdcda462010-12-20 20:49:23 +0000981 }
Greg Clayton238c0a12010-09-18 01:14:36 +0000982}
983
Jim Ingham74989e82010-08-30 19:44:40 +0000984bool
985SBDebugger::SetUseExternalEditor (bool value)
986{
987 if (m_opaque_sp)
988 return m_opaque_sp->SetUseExternalEditor (value);
Greg Claytonbdcda462010-12-20 20:49:23 +0000989 return false;
Jim Ingham74989e82010-08-30 19:44:40 +0000990}
991
992bool
Caroline Tice5bc8c972010-09-20 20:44:43 +0000993SBDebugger::GetUseExternalEditor ()
Jim Ingham74989e82010-08-30 19:44:40 +0000994{
995 if (m_opaque_sp)
Caroline Tice5bc8c972010-09-20 20:44:43 +0000996 return m_opaque_sp->GetUseExternalEditor ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000997 return false;
Jim Ingham74989e82010-08-30 19:44:40 +0000998}
999
Caroline Tice98f930f2010-09-20 05:20:02 +00001000bool
1001SBDebugger::GetDescription (SBStream &description)
1002{
Greg Clayton96154be2011-11-13 06:57:31 +00001003 Stream &strm = description.ref();
1004
Caroline Tice98f930f2010-09-20 05:20:02 +00001005 if (m_opaque_sp)
1006 {
1007 const char *name = m_opaque_sp->GetInstanceName().AsCString();
Greg Clayton9ce9c3c2011-04-18 23:15:17 +00001008 user_id_t id = m_opaque_sp->GetID();
Greg Clayton96154be2011-11-13 06:57:31 +00001009 strm.Printf ("Debugger (instance: \"%s\", id: %llu)", name, id);
Caroline Tice98f930f2010-09-20 05:20:02 +00001010 }
1011 else
Greg Clayton96154be2011-11-13 06:57:31 +00001012 strm.PutCString ("No value");
Caroline Tice98f930f2010-09-20 05:20:02 +00001013
1014 return true;
1015}
Caroline Ticec4f55fe2010-11-19 20:47:54 +00001016
Greg Clayton9ce9c3c2011-04-18 23:15:17 +00001017user_id_t
Caroline Ticec4f55fe2010-11-19 20:47:54 +00001018SBDebugger::GetID()
1019{
1020 if (m_opaque_sp)
1021 return m_opaque_sp->GetID();
1022 return LLDB_INVALID_UID;
1023}
Greg Clayton180546b2011-04-30 01:09:13 +00001024
1025
1026SBError
1027SBDebugger::SetCurrentPlatform (const char *platform_name)
1028{
1029 SBError sb_error;
1030 if (m_opaque_sp)
1031 {
1032 PlatformSP platform_sp (Platform::Create (platform_name, sb_error.ref()));
1033
1034 if (platform_sp)
1035 {
1036 bool make_selected = true;
1037 m_opaque_sp->GetPlatformList().Append (platform_sp, make_selected);
1038 }
1039 }
1040 return sb_error;
1041}
1042
Greg Clayton421ca502011-05-29 04:06:55 +00001043bool
Greg Clayton604f0d32011-06-17 03:31:01 +00001044SBDebugger::SetCurrentPlatformSDKRoot (const char *sysroot)
1045{
1046 if (m_opaque_sp)
1047 {
1048 PlatformSP platform_sp (m_opaque_sp->GetPlatformList().GetSelectedPlatform());
1049
1050 if (platform_sp)
1051 {
1052 platform_sp->SetSDKRootDirectory (ConstString (sysroot));
1053 return true;
1054 }
1055 }
1056 return false;
1057}
1058
1059bool
Greg Clayton421ca502011-05-29 04:06:55 +00001060SBDebugger::GetCloseInputOnEOF () const
1061{
1062 if (m_opaque_sp)
1063 return m_opaque_sp->GetCloseInputOnEOF ();
1064 return false;
1065}
1066
1067void
1068SBDebugger::SetCloseInputOnEOF (bool b)
1069{
1070 if (m_opaque_sp)
1071 m_opaque_sp->SetCloseInputOnEOF (b);
1072}
Enrico Granata16376ed2012-02-15 02:34:21 +00001073
1074SBTypeCategory
1075SBDebugger::GetCategory (const char* category_name)
1076{
1077 if (!category_name || *category_name == 0)
1078 return SBTypeCategory();
1079
1080 TypeCategoryImplSP category_sp;
1081
1082 if (DataVisualization::Categories::GetCategory(ConstString(category_name), category_sp, false))
1083 return SBTypeCategory(category_sp);
1084 else
1085 return SBTypeCategory();
1086}
1087
1088SBTypeCategory
1089SBDebugger::CreateCategory (const char* category_name)
1090{
1091 if (!category_name || *category_name == 0)
1092 return SBTypeCategory();
1093
1094 TypeCategoryImplSP category_sp;
1095
1096 if (DataVisualization::Categories::GetCategory(ConstString(category_name), category_sp, true))
1097 return SBTypeCategory(category_sp);
1098 else
1099 return SBTypeCategory();
1100}
1101
1102bool
1103SBDebugger::DeleteCategory (const char* category_name)
1104{
1105 if (!category_name || *category_name == 0)
1106 return false;
1107
1108 return DataVisualization::Categories::Delete(ConstString(category_name));
1109}
1110
1111uint32_t
1112SBDebugger::GetNumCategories()
1113{
1114 return DataVisualization::Categories::GetCount();
1115}
1116
1117SBTypeCategory
1118SBDebugger::GetCategoryAtIndex (uint32_t index)
1119{
1120 return SBTypeCategory(DataVisualization::Categories::GetCategoryAtIndex(index));
1121}
1122
1123SBTypeCategory
1124SBDebugger::GetDefaultCategory()
1125{
1126 return GetCategory("default");
1127}
1128
1129SBTypeFormat
1130SBDebugger::GetFormatForType (SBTypeNameSpecifier type_name)
1131{
1132 SBTypeCategory default_category_sb = GetDefaultCategory();
1133 if (default_category_sb.GetEnabled())
1134 return default_category_sb.GetFormatForType(type_name);
1135 return SBTypeFormat();
1136}
1137
Jason Molendac48ca822012-02-21 05:33:55 +00001138#ifndef LLDB_DISABLE_PYTHON
Enrico Granata16376ed2012-02-15 02:34:21 +00001139SBTypeSummary
1140SBDebugger::GetSummaryForType (SBTypeNameSpecifier type_name)
1141{
1142 SBTypeSummary summary_chosen;
1143 uint32_t num_categories = GetNumCategories();
1144 SBTypeCategory category_sb;
1145 uint32_t prio_category = UINT32_MAX;
1146 for (uint32_t category_id = 0;
1147 category_id < num_categories;
1148 category_id++)
1149 {
1150 category_sb = GetCategoryAtIndex(category_id);
1151 if (category_sb.GetEnabled() == false)
1152 continue;
1153 SBTypeSummary summary_current = category_sb.GetSummaryForType(type_name);
1154 if (summary_current.IsValid() && (summary_chosen.IsValid() == false || (prio_category > category_sb.m_opaque_sp->GetEnabledPosition())))
1155 {
1156 prio_category = category_sb.m_opaque_sp->GetEnabledPosition();
1157 summary_chosen = summary_current;
1158 }
1159 }
1160 return summary_chosen;
1161}
Jason Molendac48ca822012-02-21 05:33:55 +00001162#endif // LLDB_DISABLE_PYTHON
Enrico Granata16376ed2012-02-15 02:34:21 +00001163
1164SBTypeFilter
1165SBDebugger::GetFilterForType (SBTypeNameSpecifier type_name)
1166{
1167 SBTypeFilter filter_chosen;
1168 uint32_t num_categories = GetNumCategories();
1169 SBTypeCategory category_sb;
1170 uint32_t prio_category = UINT32_MAX;
1171 for (uint32_t category_id = 0;
1172 category_id < num_categories;
1173 category_id++)
1174 {
1175 category_sb = GetCategoryAtIndex(category_id);
1176 if (category_sb.GetEnabled() == false)
1177 continue;
1178 SBTypeFilter filter_current = category_sb.GetFilterForType(type_name);
1179 if (filter_current.IsValid() && (filter_chosen.IsValid() == false || (prio_category > category_sb.m_opaque_sp->GetEnabledPosition())))
1180 {
1181 prio_category = category_sb.m_opaque_sp->GetEnabledPosition();
1182 filter_chosen = filter_current;
1183 }
1184 }
1185 return filter_chosen;
1186}
1187
Jason Molendac48ca822012-02-21 05:33:55 +00001188#ifndef LLDB_DISABLE_PYTHON
Enrico Granata16376ed2012-02-15 02:34:21 +00001189SBTypeSynthetic
1190SBDebugger::GetSyntheticForType (SBTypeNameSpecifier type_name)
1191{
1192 SBTypeSynthetic synth_chosen;
1193 uint32_t num_categories = GetNumCategories();
1194 SBTypeCategory category_sb;
1195 uint32_t prio_category = UINT32_MAX;
1196 for (uint32_t category_id = 0;
1197 category_id < num_categories;
1198 category_id++)
1199 {
1200 category_sb = GetCategoryAtIndex(category_id);
1201 if (category_sb.GetEnabled() == false)
1202 continue;
1203 SBTypeSynthetic synth_current = category_sb.GetSyntheticForType(type_name);
1204 if (synth_current.IsValid() && (synth_chosen.IsValid() == false || (prio_category > category_sb.m_opaque_sp->GetEnabledPosition())))
1205 {
1206 prio_category = category_sb.m_opaque_sp->GetEnabledPosition();
1207 synth_chosen = synth_current;
1208 }
1209 }
1210 return synth_chosen;
1211}
Jason Molendac48ca822012-02-21 05:33:55 +00001212#endif // LLDB_DISABLE_PYTHON
Enrico Granata16376ed2012-02-15 02:34:21 +00001213
Jim Ingham6c530f22012-02-21 02:23:08 +00001214bool
1215SBDebugger::EnableLog (const char *channel, const char **categories)
1216{
1217 if (m_opaque_sp)
1218 {
1219 uint32_t log_options = LLDB_LOG_OPTION_PREPEND_TIMESTAMP | LLDB_LOG_OPTION_PREPEND_THREAD_NAME;
1220 StreamString errors;
1221 return m_opaque_sp->EnableLog (channel, categories, NULL, log_options, errors);
1222
1223 }
1224 else
1225 return false;
1226}