blob: f98ca35f813f76b1e5ae56744032ed7128e42a5b [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 Ingham7bbebaf2011-08-13 00:56:10 +000084 return SBDebugger::Create(false);
Jim Ingham558dd5b2011-08-13 00:22:20 +000085}
86
87SBDebugger
88SBDebugger::Create(bool source_init_files)
89{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +000090 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +000091
Greg Clayton63094e02010-06-23 01:19:29 +000092 SBDebugger debugger;
93 debugger.reset(Debugger::CreateInstance());
Caroline Tice7826c882010-10-26 03:11:13 +000094
95 if (log)
96 {
97 SBStream sstr;
98 debugger.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +000099 log->Printf ("SBDebugger::Create () => SBDebugger(%p): %s", debugger.m_opaque_sp.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000100 }
101
Jim Ingham558dd5b2011-08-13 00:22:20 +0000102 SBCommandInterpreter interp = debugger.GetCommandInterpreter();
103 if (source_init_files)
104 {
105 interp.get()->SkipLLDBInitFiles(false);
106 interp.get()->SkipAppInitFiles (false);
107 SBCommandReturnObject result;
108 interp.SourceInitFileInHomeDirectory(result);
109 }
110 else
111 {
112 interp.get()->SkipLLDBInitFiles(true);
113 interp.get()->SkipAppInitFiles (true);
114 }
Greg Clayton63094e02010-06-23 01:19:29 +0000115 return debugger;
116}
117
Caroline Ticec4ed12f2011-01-22 01:02:07 +0000118void
119SBDebugger::Destroy (SBDebugger &debugger)
120{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000121 LogSP log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticec4ed12f2011-01-22 01:02:07 +0000122
123 if (log)
124 {
125 SBStream sstr;
126 debugger.GetDescription (sstr);
127 log->Printf ("SBDebugger::Destroy () => SBDebugger(%p): %s", debugger.m_opaque_sp.get(), sstr.GetData());
128 }
129
130 Debugger::Destroy (debugger.m_opaque_sp);
131
132 if (debugger.m_opaque_sp.get() != NULL)
133 debugger.m_opaque_sp.reset();
134}
135
Greg Claytonc5486872011-12-15 04:38:41 +0000136void
137SBDebugger::MemoryPressureDetected ()
138{
139 ModuleList::RemoveOrphanSharedModules();
140}
141
Greg Clayton63094e02010-06-23 01:19:29 +0000142SBDebugger::SBDebugger () :
143 m_opaque_sp ()
144{
145}
146
Enrico Granata3370f0c2011-08-19 23:56:34 +0000147SBDebugger::SBDebugger(const lldb::DebuggerSP &debugger_sp) :
148 m_opaque_sp(debugger_sp)
149{
150}
151
Greg Clayton538eb822010-11-05 23:17:00 +0000152SBDebugger::SBDebugger(const SBDebugger &rhs) :
153 m_opaque_sp (rhs.m_opaque_sp)
154{
155}
156
157SBDebugger &
158SBDebugger::operator = (const SBDebugger &rhs)
159{
160 if (this != &rhs)
161 {
162 m_opaque_sp = rhs.m_opaque_sp;
163 }
164 return *this;
165}
166
Greg Clayton63094e02010-06-23 01:19:29 +0000167SBDebugger::~SBDebugger ()
168{
169}
170
171bool
172SBDebugger::IsValid() const
173{
174 return m_opaque_sp.get() != NULL;
175}
176
177
Chris Lattner24943d22010-06-08 16:52:24 +0000178void
179SBDebugger::SetAsync (bool b)
180{
Greg Clayton63094e02010-06-23 01:19:29 +0000181 if (m_opaque_sp)
182 m_opaque_sp->SetAsyncExecution(b);
Chris Lattner24943d22010-06-08 16:52:24 +0000183}
184
Jim Ingham83dd2032011-09-13 23:25:31 +0000185bool
186SBDebugger::GetAsync ()
187{
188 if (m_opaque_sp)
189 return m_opaque_sp->GetAsyncExecution();
190 else
191 return false;
192}
193
Greg Clayton887aa282010-10-11 01:05:37 +0000194void
195SBDebugger::SkipLLDBInitFiles (bool b)
196{
197 if (m_opaque_sp)
198 m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles (b);
199}
200
Jim Ingham574c3d62011-08-12 23:34:31 +0000201void
202SBDebugger::SkipAppInitFiles (bool b)
203{
204 if (m_opaque_sp)
205 m_opaque_sp->GetCommandInterpreter().SkipAppInitFiles (b);
206}
207
Chris Lattner24943d22010-06-08 16:52:24 +0000208// Shouldn't really be settable after initialization as this could cause lots of problems; don't want users
209// trying to switch modes in the middle of a debugging session.
210void
211SBDebugger::SetInputFileHandle (FILE *fh, bool transfer_ownership)
212{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000213 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000214
215 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000216 log->Printf ("SBDebugger(%p)::SetInputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
217 fh, transfer_ownership);
Caroline Tice7826c882010-10-26 03:11:13 +0000218
Greg Clayton63094e02010-06-23 01:19:29 +0000219 if (m_opaque_sp)
220 m_opaque_sp->SetInputFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000221}
222
223void
224SBDebugger::SetOutputFileHandle (FILE *fh, bool transfer_ownership)
225{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000226 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000227
228
229 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000230 log->Printf ("SBDebugger(%p)::SetOutputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
231 fh, transfer_ownership);
Caroline Tice7826c882010-10-26 03:11:13 +0000232
Greg Clayton63094e02010-06-23 01:19:29 +0000233 if (m_opaque_sp)
234 m_opaque_sp->SetOutputFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000235}
236
237void
238SBDebugger::SetErrorFileHandle (FILE *fh, bool transfer_ownership)
239{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000240 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000241
242
243 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000244 log->Printf ("SBDebugger(%p)::SetErrorFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
245 fh, transfer_ownership);
Caroline Tice7826c882010-10-26 03:11:13 +0000246
Greg Clayton63094e02010-06-23 01:19:29 +0000247 if (m_opaque_sp)
248 m_opaque_sp->SetErrorFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000249}
250
251FILE *
252SBDebugger::GetInputFileHandle ()
253{
Greg Clayton63094e02010-06-23 01:19:29 +0000254 if (m_opaque_sp)
Greg Clayton58928562011-02-09 01:08:52 +0000255 return m_opaque_sp->GetInputFile().GetStream();
Greg Clayton63094e02010-06-23 01:19:29 +0000256 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000257}
258
259FILE *
260SBDebugger::GetOutputFileHandle ()
261{
Greg Clayton63094e02010-06-23 01:19:29 +0000262 if (m_opaque_sp)
Greg Clayton58928562011-02-09 01:08:52 +0000263 return m_opaque_sp->GetOutputFile().GetStream();
Greg Clayton63094e02010-06-23 01:19:29 +0000264 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000265}
266
267FILE *
268SBDebugger::GetErrorFileHandle ()
269{
Greg Clayton63094e02010-06-23 01:19:29 +0000270 if (m_opaque_sp)
Greg Clayton58928562011-02-09 01:08:52 +0000271 return m_opaque_sp->GetErrorFile().GetStream();
Greg Clayton63094e02010-06-23 01:19:29 +0000272 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000273}
274
275SBCommandInterpreter
276SBDebugger::GetCommandInterpreter ()
277{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000278 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000279
Greg Clayton63094e02010-06-23 01:19:29 +0000280 SBCommandInterpreter sb_interpreter;
281 if (m_opaque_sp)
282 sb_interpreter.reset (&m_opaque_sp->GetCommandInterpreter());
Caroline Tice7826c882010-10-26 03:11:13 +0000283
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000284 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000285 log->Printf ("SBDebugger(%p)::GetCommandInterpreter () => SBCommandInterpreter(%p)",
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000286 m_opaque_sp.get(), sb_interpreter.get());
287
Chris Lattner24943d22010-06-08 16:52:24 +0000288 return sb_interpreter;
289}
290
291void
292SBDebugger::HandleCommand (const char *command)
293{
Greg Clayton63094e02010-06-23 01:19:29 +0000294 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000295 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000296 TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
297 Mutex::Locker api_locker;
298 if (target_sp)
299 api_locker.Reset(target_sp->GetAPIMutex().GetMutex());
300
Greg Clayton63094e02010-06-23 01:19:29 +0000301 SBCommandInterpreter sb_interpreter(GetCommandInterpreter ());
302 SBCommandReturnObject result;
303
304 sb_interpreter.HandleCommand (command, result, false);
305
306 if (GetErrorFileHandle() != NULL)
307 result.PutError (GetErrorFileHandle());
308 if (GetOutputFileHandle() != NULL)
309 result.PutOutput (GetOutputFileHandle());
310
311 if (m_opaque_sp->GetAsyncExecution() == false)
Chris Lattner24943d22010-06-08 16:52:24 +0000312 {
Greg Clayton63094e02010-06-23 01:19:29 +0000313 SBProcess process(GetCommandInterpreter().GetProcess ());
Greg Clayton334d33a2012-01-30 07:41:31 +0000314 ProcessSP process_sp (process.GetSP());
315 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000316 {
Greg Clayton63094e02010-06-23 01:19:29 +0000317 EventSP event_sp;
318 Listener &lldb_listener = m_opaque_sp->GetListener();
Greg Clayton334d33a2012-01-30 07:41:31 +0000319 while (lldb_listener.GetNextEventForBroadcaster (process_sp.get(), event_sp))
Greg Clayton63094e02010-06-23 01:19:29 +0000320 {
321 SBEvent event(event_sp);
322 HandleProcessEvent (process, event, GetOutputFileHandle(), GetErrorFileHandle());
323 }
Chris Lattner24943d22010-06-08 16:52:24 +0000324 }
325 }
326 }
327}
328
329SBListener
330SBDebugger::GetListener ()
331{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000332 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000333
Greg Clayton63094e02010-06-23 01:19:29 +0000334 SBListener sb_listener;
335 if (m_opaque_sp)
336 sb_listener.reset(&m_opaque_sp->GetListener(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000337
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000338 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000339 log->Printf ("SBDebugger(%p)::GetListener () => SBListener(%p)", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000340 sb_listener.get());
341
Chris Lattner24943d22010-06-08 16:52:24 +0000342 return sb_listener;
343}
344
345void
346SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, FILE *out, FILE *err)
347{
Greg Claytonbdcda462010-12-20 20:49:23 +0000348 if (!process.IsValid())
349 return;
Chris Lattner24943d22010-06-08 16:52:24 +0000350
Greg Clayton334d33a2012-01-30 07:41:31 +0000351 TargetSP target_sp (process.GetTarget().GetSP());
352 if (!target_sp)
353 return;
354
Greg Claytonbdcda462010-12-20 20:49:23 +0000355 const uint32_t event_type = event.GetType();
356 char stdio_buffer[1024];
357 size_t len;
Chris Lattner24943d22010-06-08 16:52:24 +0000358
Greg Clayton334d33a2012-01-30 07:41:31 +0000359 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Claytonbdcda462010-12-20 20:49:23 +0000360
361 if (event_type & (Process::eBroadcastBitSTDOUT | Process::eBroadcastBitStateChanged))
Chris Lattner24943d22010-06-08 16:52:24 +0000362 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000363 // Drain stdout when we stop just in case we have any bytes
364 while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
365 if (out != NULL)
366 ::fwrite (stdio_buffer, 1, len, out);
367 }
368
369 if (event_type & (Process::eBroadcastBitSTDERR | Process::eBroadcastBitStateChanged))
370 {
371 // Drain stderr when we stop just in case we have any bytes
372 while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
373 if (err != NULL)
374 ::fwrite (stdio_buffer, 1, len, err);
375 }
376
377 if (event_type & Process::eBroadcastBitStateChanged)
378 {
379 StateType event_state = SBProcess::GetStateFromEvent (event);
380
381 if (event_state == eStateInvalid)
382 return;
383
384 bool is_stopped = StateIsStoppedState (event_state);
385 if (!is_stopped)
386 process.ReportEventState (event, out);
Chris Lattner24943d22010-06-08 16:52:24 +0000387 }
388}
389
Jim Inghamcc637462011-09-13 00:29:56 +0000390SBSourceManager
Chris Lattner24943d22010-06-08 16:52:24 +0000391SBDebugger::GetSourceManager ()
392{
Jim Inghamcc637462011-09-13 00:29:56 +0000393 SBSourceManager sb_source_manager (*this);
394 return sb_source_manager;
Chris Lattner24943d22010-06-08 16:52:24 +0000395}
396
397
398bool
399SBDebugger::GetDefaultArchitecture (char *arch_name, size_t arch_name_len)
400{
401 if (arch_name && arch_name_len)
402 {
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000403 ArchSpec default_arch = Target::GetDefaultArchitecture ();
Caroline Tice5bc8c972010-09-20 20:44:43 +0000404
Chris Lattner24943d22010-06-08 16:52:24 +0000405 if (default_arch.IsValid())
406 {
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000407 const std::string &triple_str = default_arch.GetTriple().str();
408 if (!triple_str.empty())
409 ::snprintf (arch_name, arch_name_len, "%s", triple_str.c_str());
410 else
411 ::snprintf (arch_name, arch_name_len, "%s", default_arch.GetArchitectureName());
Chris Lattner24943d22010-06-08 16:52:24 +0000412 return true;
413 }
414 }
415 if (arch_name && arch_name_len)
416 arch_name[0] = '\0';
417 return false;
418}
419
420
421bool
422SBDebugger::SetDefaultArchitecture (const char *arch_name)
423{
424 if (arch_name)
425 {
Greg Claytonf15996e2011-04-07 22:46:35 +0000426 ArchSpec arch (arch_name, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000427 if (arch.IsValid())
428 {
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000429 Target::SetDefaultArchitecture (arch);
Chris Lattner24943d22010-06-08 16:52:24 +0000430 return true;
431 }
432 }
433 return false;
434}
435
436ScriptLanguage
437SBDebugger::GetScriptingLanguage (const char *script_language_name)
438{
Greg Claytonbdcda462010-12-20 20:49:23 +0000439
Chris Lattner24943d22010-06-08 16:52:24 +0000440 return Args::StringToScriptLanguage (script_language_name,
441 eScriptLanguageDefault,
442 NULL);
443}
Chris Lattner24943d22010-06-08 16:52:24 +0000444
445const char *
446SBDebugger::GetVersionString ()
447{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000448 return GetVersion();
Chris Lattner24943d22010-06-08 16:52:24 +0000449}
450
451const char *
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000452SBDebugger::StateAsCString (StateType state)
Chris Lattner24943d22010-06-08 16:52:24 +0000453{
Caroline Ticea2cffd32011-04-25 22:05:51 +0000454 return lldb_private::StateAsCString (state);
Chris Lattner24943d22010-06-08 16:52:24 +0000455}
456
457bool
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000458SBDebugger::StateIsRunningState (StateType state)
Chris Lattner24943d22010-06-08 16:52:24 +0000459{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000460 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000461
Caroline Ticea2cffd32011-04-25 22:05:51 +0000462 const bool result = lldb_private::StateIsRunningState (state);
Greg Claytona66ba462010-10-30 04:51:46 +0000463 if (log)
464 log->Printf ("SBDebugger::StateIsRunningState (state=%s) => %i",
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000465 StateAsCString (state), result);
Greg Claytona66ba462010-10-30 04:51:46 +0000466
467 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000468}
469
470bool
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000471SBDebugger::StateIsStoppedState (StateType state)
Chris Lattner24943d22010-06-08 16:52:24 +0000472{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000473 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000474
Greg Clayton20206082011-11-17 01:23:07 +0000475 const bool result = lldb_private::StateIsStoppedState (state, false);
Caroline Tice7826c882010-10-26 03:11:13 +0000476 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000477 log->Printf ("SBDebugger::StateIsStoppedState (state=%s) => %i",
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000478 StateAsCString (state), result);
Caroline Tice7826c882010-10-26 03:11:13 +0000479
Greg Claytona66ba462010-10-30 04:51:46 +0000480 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000481}
482
Greg Clayton3e8c25f2011-09-24 00:52:29 +0000483lldb::SBTarget
484SBDebugger::CreateTarget (const char *filename,
485 const char *target_triple,
486 const char *platform_name,
487 bool add_dependent_modules,
488 lldb::SBError& sb_error)
489{
490 SBTarget sb_target;
Greg Clayton334d33a2012-01-30 07:41:31 +0000491 TargetSP target_sp;
Greg Clayton3e8c25f2011-09-24 00:52:29 +0000492 if (m_opaque_sp)
493 {
494 sb_error.Clear();
495 FileSpec filename_spec (filename, true);
496 OptionGroupPlatform platform_options (false);
497 platform_options.SetPlatformName (platform_name);
498
Greg Clayton3e8c25f2011-09-24 00:52:29 +0000499 sb_error.ref() = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
500 filename_spec,
501 target_triple,
502 add_dependent_modules,
503 &platform_options,
504 target_sp);
505
506 if (sb_error.Success())
Greg Clayton334d33a2012-01-30 07:41:31 +0000507 sb_target.SetSP (target_sp);
Greg Clayton3e8c25f2011-09-24 00:52:29 +0000508 }
509 else
510 {
511 sb_error.SetErrorString("invalid target");
512 }
513
514 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
515 if (log)
516 {
517 log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\", triple=%s, platform_name=%s, add_dependent_modules=%u, error=%s) => SBTarget(%p)",
518 m_opaque_sp.get(),
519 filename,
520 target_triple,
521 platform_name,
522 add_dependent_modules,
523 sb_error.GetCString(),
Greg Clayton334d33a2012-01-30 07:41:31 +0000524 target_sp.get());
Greg Clayton3e8c25f2011-09-24 00:52:29 +0000525 }
526
527 return sb_target;
528}
Chris Lattner24943d22010-06-08 16:52:24 +0000529
530SBTarget
531SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename,
532 const char *target_triple)
533{
Greg Clayton334d33a2012-01-30 07:41:31 +0000534 SBTarget sb_target;
535 TargetSP target_sp;
Greg Clayton63094e02010-06-23 01:19:29 +0000536 if (m_opaque_sp)
537 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000538 FileSpec file_spec (filename, true);
Greg Clayton63094e02010-06-23 01:19:29 +0000539 TargetSP target_sp;
Greg Clayton3e8c25f2011-09-24 00:52:29 +0000540 const bool add_dependent_modules = true;
541 Error error (m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
542 file_spec,
543 target_triple,
544 add_dependent_modules,
545 NULL,
546 target_sp));
Greg Clayton334d33a2012-01-30 07:41:31 +0000547 sb_target.SetSP (target_sp);
Greg Clayton63094e02010-06-23 01:19:29 +0000548 }
Greg Claytona66ba462010-10-30 04:51:46 +0000549
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000550 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000551 if (log)
552 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000553 log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndTargetTriple (filename=\"%s\", triple=%s) => SBTarget(%p)",
Greg Clayton334d33a2012-01-30 07:41:31 +0000554 m_opaque_sp.get(), filename, target_triple, target_sp.get());
Greg Claytona66ba462010-10-30 04:51:46 +0000555 }
556
Greg Clayton334d33a2012-01-30 07:41:31 +0000557 return sb_target;
Chris Lattner24943d22010-06-08 16:52:24 +0000558}
559
560SBTarget
Greg Clayton940b1032011-02-23 00:35:02 +0000561SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *arch_cstr)
Chris Lattner24943d22010-06-08 16:52:24 +0000562{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000563 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000564
Greg Clayton334d33a2012-01-30 07:41:31 +0000565 SBTarget sb_target;
566 TargetSP target_sp;
Greg Clayton63094e02010-06-23 01:19:29 +0000567 if (m_opaque_sp)
568 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000569 FileSpec file (filename, true);
Greg Clayton63094e02010-06-23 01:19:29 +0000570 Error error;
Greg Clayton3e8c25f2011-09-24 00:52:29 +0000571 const bool add_dependent_modules = true;
Chris Lattner24943d22010-06-08 16:52:24 +0000572
Greg Clayton3e8c25f2011-09-24 00:52:29 +0000573 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
574 file,
575 arch_cstr,
576 add_dependent_modules,
577 NULL,
578 target_sp);
Greg Clayton63094e02010-06-23 01:19:29 +0000579
580 if (error.Success())
581 {
Jim Inghamc8332952010-08-26 21:32:51 +0000582 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Clayton334d33a2012-01-30 07:41:31 +0000583 sb_target.SetSP (target_sp);
Greg Clayton63094e02010-06-23 01:19:29 +0000584 }
Chris Lattner24943d22010-06-08 16:52:24 +0000585 }
Caroline Tice7826c882010-10-26 03:11:13 +0000586
587 if (log)
588 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000589 log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndArch (filename=\"%s\", arch=%s) => SBTarget(%p)",
Greg Clayton334d33a2012-01-30 07:41:31 +0000590 m_opaque_sp.get(), filename, arch_cstr, target_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000591 }
592
Greg Clayton334d33a2012-01-30 07:41:31 +0000593 return sb_target;
Greg Clayton63094e02010-06-23 01:19:29 +0000594}
595
596SBTarget
597SBDebugger::CreateTarget (const char *filename)
598{
Greg Clayton334d33a2012-01-30 07:41:31 +0000599 SBTarget sb_target;
600 TargetSP target_sp;
Greg Clayton63094e02010-06-23 01:19:29 +0000601 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000602 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000603 FileSpec file (filename, true);
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000604 ArchSpec arch = Target::GetDefaultArchitecture ();
Greg Clayton63094e02010-06-23 01:19:29 +0000605 Error error;
Greg Clayton3e8c25f2011-09-24 00:52:29 +0000606 const bool add_dependent_modules = true;
Greg Clayton63094e02010-06-23 01:19:29 +0000607
Greg Clayton3e8c25f2011-09-24 00:52:29 +0000608 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
609 file,
610 arch,
611 add_dependent_modules,
612 m_opaque_sp->GetPlatformList().GetSelectedPlatform(),
613 target_sp);
Greg Clayton63094e02010-06-23 01:19:29 +0000614
615 if (error.Success())
616 {
Jim Inghamc8332952010-08-26 21:32:51 +0000617 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Clayton334d33a2012-01-30 07:41:31 +0000618 sb_target.SetSP (target_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000619 }
620 }
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000621 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000622 if (log)
623 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000624 log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)",
Greg Clayton334d33a2012-01-30 07:41:31 +0000625 m_opaque_sp.get(), filename, target_sp.get());
Greg Claytona66ba462010-10-30 04:51:46 +0000626 }
Greg Clayton334d33a2012-01-30 07:41:31 +0000627 return sb_target;
Chris Lattner24943d22010-06-08 16:52:24 +0000628}
629
Johnny Chen409646d2011-06-15 21:24:24 +0000630bool
631SBDebugger::DeleteTarget (lldb::SBTarget &target)
632{
633 bool result = false;
Greg Clayton334d33a2012-01-30 07:41:31 +0000634 if (m_opaque_sp)
Johnny Chen409646d2011-06-15 21:24:24 +0000635 {
Greg Clayton334d33a2012-01-30 07:41:31 +0000636 TargetSP target_sp(target.GetSP());
637 if (target_sp)
638 {
639 // No need to lock, the target list is thread safe
640 result = m_opaque_sp->GetTargetList().DeleteTarget (target_sp);
641 target_sp->Destroy();
642 target.Clear();
643 ModuleList::RemoveOrphanSharedModules();
644 }
Johnny Chen409646d2011-06-15 21:24:24 +0000645 }
646
647 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
648 if (log)
649 {
650 log->Printf ("SBDebugger(%p)::DeleteTarget (SBTarget(%p)) => %i", m_opaque_sp.get(), target.m_opaque_sp.get(), result);
651 }
652
653 return result;
654}
Chris Lattner24943d22010-06-08 16:52:24 +0000655SBTarget
656SBDebugger::GetTargetAtIndex (uint32_t idx)
657{
Greg Clayton63094e02010-06-23 01:19:29 +0000658 SBTarget sb_target;
659 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000660 {
661 // No need to lock, the target list is thread safe
Greg Clayton334d33a2012-01-30 07:41:31 +0000662 sb_target.SetSP (m_opaque_sp->GetTargetList().GetTargetAtIndex (idx));
Greg Claytonbdcda462010-12-20 20:49:23 +0000663 }
Chris Lattner24943d22010-06-08 16:52:24 +0000664 return sb_target;
665}
666
667SBTarget
668SBDebugger::FindTargetWithProcessID (pid_t pid)
669{
Greg Clayton63094e02010-06-23 01:19:29 +0000670 SBTarget sb_target;
671 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000672 {
673 // No need to lock, the target list is thread safe
Greg Clayton334d33a2012-01-30 07:41:31 +0000674 sb_target.SetSP (m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid));
Greg Claytonbdcda462010-12-20 20:49:23 +0000675 }
Chris Lattner24943d22010-06-08 16:52:24 +0000676 return sb_target;
677}
678
679SBTarget
680SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name)
681{
Greg Clayton63094e02010-06-23 01:19:29 +0000682 SBTarget sb_target;
683 if (m_opaque_sp && filename && filename[0])
684 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000685 // No need to lock, the target list is thread safe
Greg Claytonf15996e2011-04-07 22:46:35 +0000686 ArchSpec arch (arch_name, m_opaque_sp->GetPlatformList().GetSelectedPlatform().get());
Greg Clayton537a7a82010-10-20 20:54:39 +0000687 TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename, false), arch_name ? &arch : NULL));
Greg Clayton334d33a2012-01-30 07:41:31 +0000688 sb_target.SetSP (target_sp);
Greg Clayton63094e02010-06-23 01:19:29 +0000689 }
690 return sb_target;
Chris Lattner24943d22010-06-08 16:52:24 +0000691}
692
693SBTarget
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000694SBDebugger::FindTargetWithLLDBProcess (const ProcessSP &process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000695{
Greg Clayton63094e02010-06-23 01:19:29 +0000696 SBTarget sb_target;
697 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000698 {
699 // No need to lock, the target list is thread safe
Greg Clayton334d33a2012-01-30 07:41:31 +0000700 sb_target.SetSP (m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get()));
Greg Claytonbdcda462010-12-20 20:49:23 +0000701 }
Chris Lattner24943d22010-06-08 16:52:24 +0000702 return sb_target;
703}
704
705
706uint32_t
707SBDebugger::GetNumTargets ()
708{
Greg Clayton63094e02010-06-23 01:19:29 +0000709 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000710 {
711 // No need to lock, the target list is thread safe
Greg Clayton63094e02010-06-23 01:19:29 +0000712 return m_opaque_sp->GetTargetList().GetNumTargets ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000713 }
Greg Clayton63094e02010-06-23 01:19:29 +0000714 return 0;
715}
Chris Lattner24943d22010-06-08 16:52:24 +0000716
717SBTarget
Jim Inghamc8332952010-08-26 21:32:51 +0000718SBDebugger::GetSelectedTarget ()
Chris Lattner24943d22010-06-08 16:52:24 +0000719{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000720 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000721
Greg Clayton63094e02010-06-23 01:19:29 +0000722 SBTarget sb_target;
Greg Clayton334d33a2012-01-30 07:41:31 +0000723 TargetSP target_sp;
Greg Clayton63094e02010-06-23 01:19:29 +0000724 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000725 {
726 // No need to lock, the target list is thread safe
Greg Clayton334d33a2012-01-30 07:41:31 +0000727 target_sp = m_opaque_sp->GetTargetList().GetSelectedTarget ();
728 sb_target.SetSP (target_sp);
Greg Claytonbdcda462010-12-20 20:49:23 +0000729 }
Caroline Tice7826c882010-10-26 03:11:13 +0000730
731 if (log)
732 {
733 SBStream sstr;
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000734 sb_target.GetDescription (sstr, eDescriptionLevelBrief);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000735 log->Printf ("SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s", m_opaque_sp.get(),
Greg Clayton334d33a2012-01-30 07:41:31 +0000736 target_sp.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000737 }
738
Chris Lattner24943d22010-06-08 16:52:24 +0000739 return sb_target;
740}
741
742void
Jim Ingham83dd2032011-09-13 23:25:31 +0000743SBDebugger::SetSelectedTarget (SBTarget &sb_target)
744{
745 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
746
Greg Clayton334d33a2012-01-30 07:41:31 +0000747 TargetSP target_sp (sb_target.GetSP());
Jim Ingham83dd2032011-09-13 23:25:31 +0000748 if (m_opaque_sp)
749 {
Greg Clayton334d33a2012-01-30 07:41:31 +0000750 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Jim Ingham83dd2032011-09-13 23:25:31 +0000751 }
752 if (log)
753 {
754 SBStream sstr;
755 sb_target.GetDescription (sstr, eDescriptionLevelBrief);
756 log->Printf ("SBDebugger(%p)::SetSelectedTarget () => SBTarget(%p): %s", m_opaque_sp.get(),
Greg Clayton334d33a2012-01-30 07:41:31 +0000757 target_sp.get(), sstr.GetData());
Jim Ingham83dd2032011-09-13 23:25:31 +0000758 }
759}
760
761void
Chris Lattner24943d22010-06-08 16:52:24 +0000762SBDebugger::DispatchInput (void *baton, const void *data, size_t data_len)
763{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000764 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000765
766 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000767 log->Printf ("SBDebugger(%p)::DispatchInput (baton=%p, data=\"%.*s\", size_t=%zu)", m_opaque_sp.get(),
768 baton, (int) data_len, (const char *) data, data_len);
Caroline Tice7826c882010-10-26 03:11:13 +0000769
Greg Clayton63094e02010-06-23 01:19:29 +0000770 if (m_opaque_sp)
771 m_opaque_sp->DispatchInput ((const char *) data, data_len);
Chris Lattner24943d22010-06-08 16:52:24 +0000772}
773
774void
Caroline Ticec4f55fe2010-11-19 20:47:54 +0000775SBDebugger::DispatchInputInterrupt ()
776{
777 if (m_opaque_sp)
778 m_opaque_sp->DispatchInputInterrupt ();
779}
780
781void
782SBDebugger::DispatchInputEndOfFile ()
783{
784 if (m_opaque_sp)
785 m_opaque_sp->DispatchInputEndOfFile ();
786}
Caroline Ticeb38df1e2011-05-09 23:06:58 +0000787
788bool
789SBDebugger::InputReaderIsTopReader (const lldb::SBInputReader &reader)
790{
791 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
792
793 if (log)
794 log->Printf ("SBDebugger(%p)::InputReaderIsTopReader (SBInputReader(%p))", m_opaque_sp.get(), &reader);
795
796 if (m_opaque_sp && reader.IsValid())
797 {
798 InputReaderSP reader_sp (*reader);
799 return m_opaque_sp->InputReaderIsTopReader (reader_sp);
800 }
801
802 return false;
803}
804
Caroline Ticec4f55fe2010-11-19 20:47:54 +0000805
806void
Chris Lattner24943d22010-06-08 16:52:24 +0000807SBDebugger::PushInputReader (SBInputReader &reader)
808{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000809 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000810
811 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000812 log->Printf ("SBDebugger(%p)::PushInputReader (SBInputReader(%p))", m_opaque_sp.get(), &reader);
Caroline Tice7826c882010-10-26 03:11:13 +0000813
Greg Clayton63094e02010-06-23 01:19:29 +0000814 if (m_opaque_sp && reader.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000815 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000816 TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
817 Mutex::Locker api_locker;
818 if (target_sp)
819 api_locker.Reset(target_sp->GetAPIMutex().GetMutex());
Chris Lattner24943d22010-06-08 16:52:24 +0000820 InputReaderSP reader_sp(*reader);
Greg Clayton63094e02010-06-23 01:19:29 +0000821 m_opaque_sp->PushInputReader (reader_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000822 }
823}
Greg Clayton63094e02010-06-23 01:19:29 +0000824
825void
Caroline Tice4a348082011-05-02 20:41:46 +0000826SBDebugger::NotifyTopInputReader (InputReaderAction notification)
827{
828 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
829
830 if (log)
831 log->Printf ("SBDebugger(%p)::NotifyTopInputReader (%d)", m_opaque_sp.get(), notification);
832
833 if (m_opaque_sp)
834 m_opaque_sp->NotifyTopInputReader (notification);
835}
836
837void
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000838SBDebugger::reset (const DebuggerSP &debugger_sp)
Greg Clayton63094e02010-06-23 01:19:29 +0000839{
840 m_opaque_sp = debugger_sp;
841}
842
843Debugger *
844SBDebugger::get () const
845{
846 return m_opaque_sp.get();
847}
848
849Debugger &
850SBDebugger::ref () const
851{
852 assert (m_opaque_sp.get());
853 return *m_opaque_sp;
854}
855
Greg Clayton15afa9f2011-10-01 02:59:24 +0000856const lldb::DebuggerSP &
857SBDebugger::get_sp () const
858{
859 return m_opaque_sp;
860}
Greg Clayton63094e02010-06-23 01:19:29 +0000861
Caroline Tice558be582010-06-30 16:22:25 +0000862SBDebugger
863SBDebugger::FindDebuggerWithID (int id)
864{
Greg Claytonbdcda462010-12-20 20:49:23 +0000865 // No need to lock, the debugger list is thread safe
Caroline Tice558be582010-06-30 16:22:25 +0000866 SBDebugger sb_debugger;
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000867 DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id);
Caroline Tice558be582010-06-30 16:22:25 +0000868 if (debugger_sp)
869 sb_debugger.reset (debugger_sp);
870 return sb_debugger;
871}
Jim Ingham74989e82010-08-30 19:44:40 +0000872
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000873const char *
874SBDebugger::GetInstanceName()
875{
876 if (m_opaque_sp)
877 return m_opaque_sp->GetInstanceName().AsCString();
878 else
879 return NULL;
880}
881
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000882SBError
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000883SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000884{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000885 UserSettingsControllerSP root_settings_controller = Debugger::GetSettingsController();
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000886
Greg Claytonb3448432011-03-24 21:19:54 +0000887 Error err = root_settings_controller->SetVariable (var_name,
888 value,
889 eVarSetOperationAssign,
890 true,
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000891 debugger_instance_name);
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000892 SBError sb_error;
893 sb_error.SetError (err);
894
895 return sb_error;
896}
897
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000898SBStringList
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000899SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000900{
901 SBStringList ret_value;
Greg Claytonb3448432011-03-24 21:19:54 +0000902 SettableVariableType var_type;
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000903 Error err;
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000904
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000905 UserSettingsControllerSP root_settings_controller = Debugger::GetSettingsController();
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000906
Caroline Tice5bc8c972010-09-20 20:44:43 +0000907 StringList value = root_settings_controller->GetVariable (var_name, var_type, debugger_instance_name, err);
908
909 if (err.Success())
910 {
911 for (unsigned i = 0; i != value.GetSize(); ++i)
912 ret_value.AppendString (value.GetStringAtIndex(i));
913 }
914 else
915 {
916 ret_value.AppendString (err.AsCString());
917 }
918
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000919
920 return ret_value;
921}
922
Greg Clayton238c0a12010-09-18 01:14:36 +0000923uint32_t
924SBDebugger::GetTerminalWidth () const
925{
926 if (m_opaque_sp)
927 return m_opaque_sp->GetTerminalWidth ();
928 return 0;
929}
930
931void
932SBDebugger::SetTerminalWidth (uint32_t term_width)
933{
934 if (m_opaque_sp)
935 m_opaque_sp->SetTerminalWidth (term_width);
936}
937
938const char *
939SBDebugger::GetPrompt() const
940{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000941 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000942
943 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000944 log->Printf ("SBDebugger(%p)::GetPrompt () => \"%s\"", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000945 (m_opaque_sp ? m_opaque_sp->GetPrompt() : ""));
Caroline Tice7826c882010-10-26 03:11:13 +0000946
Greg Clayton238c0a12010-09-18 01:14:36 +0000947 if (m_opaque_sp)
948 return m_opaque_sp->GetPrompt ();
949 return 0;
950}
951
952void
953SBDebugger::SetPrompt (const char *prompt)
954{
955 if (m_opaque_sp)
956 m_opaque_sp->SetPrompt (prompt);
957}
958
959
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000960ScriptLanguage
Greg Clayton238c0a12010-09-18 01:14:36 +0000961SBDebugger::GetScriptLanguage() const
962{
963 if (m_opaque_sp)
964 return m_opaque_sp->GetScriptLanguage ();
965 return eScriptLanguageNone;
966}
967
968void
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000969SBDebugger::SetScriptLanguage (ScriptLanguage script_lang)
Greg Clayton238c0a12010-09-18 01:14:36 +0000970{
971 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000972 {
Greg Clayton238c0a12010-09-18 01:14:36 +0000973 m_opaque_sp->SetScriptLanguage (script_lang);
Greg Claytonbdcda462010-12-20 20:49:23 +0000974 }
Greg Clayton238c0a12010-09-18 01:14:36 +0000975}
976
Jim Ingham74989e82010-08-30 19:44:40 +0000977bool
978SBDebugger::SetUseExternalEditor (bool value)
979{
980 if (m_opaque_sp)
981 return m_opaque_sp->SetUseExternalEditor (value);
Greg Claytonbdcda462010-12-20 20:49:23 +0000982 return false;
Jim Ingham74989e82010-08-30 19:44:40 +0000983}
984
985bool
Caroline Tice5bc8c972010-09-20 20:44:43 +0000986SBDebugger::GetUseExternalEditor ()
Jim Ingham74989e82010-08-30 19:44:40 +0000987{
988 if (m_opaque_sp)
Caroline Tice5bc8c972010-09-20 20:44:43 +0000989 return m_opaque_sp->GetUseExternalEditor ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000990 return false;
Jim Ingham74989e82010-08-30 19:44:40 +0000991}
992
Caroline Tice98f930f2010-09-20 05:20:02 +0000993bool
994SBDebugger::GetDescription (SBStream &description)
995{
Greg Clayton96154be2011-11-13 06:57:31 +0000996 Stream &strm = description.ref();
997
Caroline Tice98f930f2010-09-20 05:20:02 +0000998 if (m_opaque_sp)
999 {
1000 const char *name = m_opaque_sp->GetInstanceName().AsCString();
Greg Clayton9ce9c3c2011-04-18 23:15:17 +00001001 user_id_t id = m_opaque_sp->GetID();
Greg Clayton96154be2011-11-13 06:57:31 +00001002 strm.Printf ("Debugger (instance: \"%s\", id: %llu)", name, id);
Caroline Tice98f930f2010-09-20 05:20:02 +00001003 }
1004 else
Greg Clayton96154be2011-11-13 06:57:31 +00001005 strm.PutCString ("No value");
Caroline Tice98f930f2010-09-20 05:20:02 +00001006
1007 return true;
1008}
Caroline Ticec4f55fe2010-11-19 20:47:54 +00001009
Greg Clayton9ce9c3c2011-04-18 23:15:17 +00001010user_id_t
Caroline Ticec4f55fe2010-11-19 20:47:54 +00001011SBDebugger::GetID()
1012{
1013 if (m_opaque_sp)
1014 return m_opaque_sp->GetID();
1015 return LLDB_INVALID_UID;
1016}
Greg Clayton180546b2011-04-30 01:09:13 +00001017
1018
1019SBError
1020SBDebugger::SetCurrentPlatform (const char *platform_name)
1021{
1022 SBError sb_error;
1023 if (m_opaque_sp)
1024 {
1025 PlatformSP platform_sp (Platform::Create (platform_name, sb_error.ref()));
1026
1027 if (platform_sp)
1028 {
1029 bool make_selected = true;
1030 m_opaque_sp->GetPlatformList().Append (platform_sp, make_selected);
1031 }
1032 }
1033 return sb_error;
1034}
1035
Greg Clayton421ca502011-05-29 04:06:55 +00001036bool
Greg Clayton604f0d32011-06-17 03:31:01 +00001037SBDebugger::SetCurrentPlatformSDKRoot (const char *sysroot)
1038{
1039 if (m_opaque_sp)
1040 {
1041 PlatformSP platform_sp (m_opaque_sp->GetPlatformList().GetSelectedPlatform());
1042
1043 if (platform_sp)
1044 {
1045 platform_sp->SetSDKRootDirectory (ConstString (sysroot));
1046 return true;
1047 }
1048 }
1049 return false;
1050}
1051
1052bool
Greg Clayton421ca502011-05-29 04:06:55 +00001053SBDebugger::GetCloseInputOnEOF () const
1054{
1055 if (m_opaque_sp)
1056 return m_opaque_sp->GetCloseInputOnEOF ();
1057 return false;
1058}
1059
1060void
1061SBDebugger::SetCloseInputOnEOF (bool b)
1062{
1063 if (m_opaque_sp)
1064 m_opaque_sp->SetCloseInputOnEOF (b);
1065}
Enrico Granata16376ed2012-02-15 02:34:21 +00001066
1067SBTypeCategory
1068SBDebugger::GetCategory (const char* category_name)
1069{
1070 if (!category_name || *category_name == 0)
1071 return SBTypeCategory();
1072
1073 TypeCategoryImplSP category_sp;
1074
1075 if (DataVisualization::Categories::GetCategory(ConstString(category_name), category_sp, false))
1076 return SBTypeCategory(category_sp);
1077 else
1078 return SBTypeCategory();
1079}
1080
1081SBTypeCategory
1082SBDebugger::CreateCategory (const char* category_name)
1083{
1084 if (!category_name || *category_name == 0)
1085 return SBTypeCategory();
1086
1087 TypeCategoryImplSP category_sp;
1088
1089 if (DataVisualization::Categories::GetCategory(ConstString(category_name), category_sp, true))
1090 return SBTypeCategory(category_sp);
1091 else
1092 return SBTypeCategory();
1093}
1094
1095bool
1096SBDebugger::DeleteCategory (const char* category_name)
1097{
1098 if (!category_name || *category_name == 0)
1099 return false;
1100
1101 return DataVisualization::Categories::Delete(ConstString(category_name));
1102}
1103
1104uint32_t
1105SBDebugger::GetNumCategories()
1106{
1107 return DataVisualization::Categories::GetCount();
1108}
1109
1110SBTypeCategory
1111SBDebugger::GetCategoryAtIndex (uint32_t index)
1112{
1113 return SBTypeCategory(DataVisualization::Categories::GetCategoryAtIndex(index));
1114}
1115
1116SBTypeCategory
1117SBDebugger::GetDefaultCategory()
1118{
1119 return GetCategory("default");
1120}
1121
1122SBTypeFormat
1123SBDebugger::GetFormatForType (SBTypeNameSpecifier type_name)
1124{
1125 SBTypeCategory default_category_sb = GetDefaultCategory();
1126 if (default_category_sb.GetEnabled())
1127 return default_category_sb.GetFormatForType(type_name);
1128 return SBTypeFormat();
1129}
1130
1131SBTypeSummary
1132SBDebugger::GetSummaryForType (SBTypeNameSpecifier type_name)
1133{
1134 SBTypeSummary summary_chosen;
1135 uint32_t num_categories = GetNumCategories();
1136 SBTypeCategory category_sb;
1137 uint32_t prio_category = UINT32_MAX;
1138 for (uint32_t category_id = 0;
1139 category_id < num_categories;
1140 category_id++)
1141 {
1142 category_sb = GetCategoryAtIndex(category_id);
1143 if (category_sb.GetEnabled() == false)
1144 continue;
1145 SBTypeSummary summary_current = category_sb.GetSummaryForType(type_name);
1146 if (summary_current.IsValid() && (summary_chosen.IsValid() == false || (prio_category > category_sb.m_opaque_sp->GetEnabledPosition())))
1147 {
1148 prio_category = category_sb.m_opaque_sp->GetEnabledPosition();
1149 summary_chosen = summary_current;
1150 }
1151 }
1152 return summary_chosen;
1153}
1154
1155SBTypeFilter
1156SBDebugger::GetFilterForType (SBTypeNameSpecifier type_name)
1157{
1158 SBTypeFilter filter_chosen;
1159 uint32_t num_categories = GetNumCategories();
1160 SBTypeCategory category_sb;
1161 uint32_t prio_category = UINT32_MAX;
1162 for (uint32_t category_id = 0;
1163 category_id < num_categories;
1164 category_id++)
1165 {
1166 category_sb = GetCategoryAtIndex(category_id);
1167 if (category_sb.GetEnabled() == false)
1168 continue;
1169 SBTypeFilter filter_current = category_sb.GetFilterForType(type_name);
1170 if (filter_current.IsValid() && (filter_chosen.IsValid() == false || (prio_category > category_sb.m_opaque_sp->GetEnabledPosition())))
1171 {
1172 prio_category = category_sb.m_opaque_sp->GetEnabledPosition();
1173 filter_chosen = filter_current;
1174 }
1175 }
1176 return filter_chosen;
1177}
1178
1179SBTypeSynthetic
1180SBDebugger::GetSyntheticForType (SBTypeNameSpecifier type_name)
1181{
1182 SBTypeSynthetic synth_chosen;
1183 uint32_t num_categories = GetNumCategories();
1184 SBTypeCategory category_sb;
1185 uint32_t prio_category = UINT32_MAX;
1186 for (uint32_t category_id = 0;
1187 category_id < num_categories;
1188 category_id++)
1189 {
1190 category_sb = GetCategoryAtIndex(category_id);
1191 if (category_sb.GetEnabled() == false)
1192 continue;
1193 SBTypeSynthetic synth_current = category_sb.GetSyntheticForType(type_name);
1194 if (synth_current.IsValid() && (synth_chosen.IsValid() == false || (prio_category > category_sb.m_opaque_sp->GetEnabledPosition())))
1195 {
1196 prio_category = category_sb.m_opaque_sp->GetEnabledPosition();
1197 synth_chosen = synth_current;
1198 }
1199 }
1200 return synth_chosen;
1201}
1202