blob: 81658d5ab597b19a34e8700a633cc6c1709f0daa [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
12#include "lldb/lldb-include.h"
Jim Ingham84cdc152010-06-15 19:49:27 +000013#include "lldb/Interpreter/Args.h"
Chris Lattner24943d22010-06-08 16:52:24 +000014#include "lldb/Core/Debugger.h"
15#include "lldb/Core/State.h"
16#include "lldb/Target/Process.h"
17#include "lldb/Target/TargetList.h"
18
Eli Friedmand6ec8aa2010-06-09 07:37:52 +000019#include "lldb/API/SBListener.h"
20#include "lldb/API/SBBroadcaster.h"
21#include "lldb/API/SBCommandInterpreter.h"
22#include "lldb/API/SBCommandReturnObject.h"
23#include "lldb/API/SBEvent.h"
24#include "lldb/API/SBFrame.h"
Eli Friedmand6ec8aa2010-06-09 07:37:52 +000025#include "lldb/API/SBInputReader.h"
Caroline Tice6e4c5ce2010-09-04 00:03:46 +000026#include "lldb/API/SBProcess.h"
27#include "lldb/API/SBSourceManager.h"
Caroline Tice98f930f2010-09-20 05:20:02 +000028#include "lldb/API/SBStream.h"
Caroline Tice6e4c5ce2010-09-04 00:03:46 +000029#include "lldb/API/SBStringList.h"
30#include "lldb/API/SBTarget.h"
31#include "lldb/API/SBThread.h"
Chris Lattner24943d22010-06-08 16:52:24 +000032
33using namespace lldb;
34using namespace lldb_private;
35
36void
37SBDebugger::Initialize ()
38{
39 Debugger::Initialize();
40}
41
42void
43SBDebugger::Terminate ()
44{
45 Debugger::Terminate();
46}
47
Greg Clayton43490d12010-07-30 20:12:55 +000048void
49SBDebugger::Clear ()
50{
51 m_opaque_sp.reset();
52}
53
Greg Clayton63094e02010-06-23 01:19:29 +000054SBDebugger
55SBDebugger::Create()
56{
57 SBDebugger debugger;
58 debugger.reset(Debugger::CreateInstance());
59 return debugger;
60}
61
Greg Clayton63094e02010-06-23 01:19:29 +000062SBDebugger::SBDebugger () :
63 m_opaque_sp ()
64{
65}
66
67SBDebugger::~SBDebugger ()
68{
69}
70
71bool
72SBDebugger::IsValid() const
73{
74 return m_opaque_sp.get() != NULL;
75}
76
77
Chris Lattner24943d22010-06-08 16:52:24 +000078void
79SBDebugger::SetAsync (bool b)
80{
Greg Clayton63094e02010-06-23 01:19:29 +000081 if (m_opaque_sp)
82 m_opaque_sp->SetAsyncExecution(b);
Chris Lattner24943d22010-06-08 16:52:24 +000083}
84
Chris Lattner24943d22010-06-08 16:52:24 +000085// Shouldn't really be settable after initialization as this could cause lots of problems; don't want users
86// trying to switch modes in the middle of a debugging session.
87void
88SBDebugger::SetInputFileHandle (FILE *fh, bool transfer_ownership)
89{
Greg Clayton63094e02010-06-23 01:19:29 +000090 if (m_opaque_sp)
91 m_opaque_sp->SetInputFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +000092}
93
94void
95SBDebugger::SetOutputFileHandle (FILE *fh, bool transfer_ownership)
96{
Greg Clayton63094e02010-06-23 01:19:29 +000097 if (m_opaque_sp)
98 m_opaque_sp->SetOutputFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +000099}
100
101void
102SBDebugger::SetErrorFileHandle (FILE *fh, bool transfer_ownership)
103{
Greg Clayton63094e02010-06-23 01:19:29 +0000104 if (m_opaque_sp)
105 m_opaque_sp->SetErrorFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000106}
107
108FILE *
109SBDebugger::GetInputFileHandle ()
110{
Greg Clayton63094e02010-06-23 01:19:29 +0000111 if (m_opaque_sp)
112 return m_opaque_sp->GetInputFileHandle();
113 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000114}
115
116FILE *
117SBDebugger::GetOutputFileHandle ()
118{
Greg Clayton63094e02010-06-23 01:19:29 +0000119 if (m_opaque_sp)
120 return m_opaque_sp->GetOutputFileHandle();
121 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000122}
123
124FILE *
125SBDebugger::GetErrorFileHandle ()
126{
Greg Clayton63094e02010-06-23 01:19:29 +0000127 if (m_opaque_sp)
128 return m_opaque_sp->GetErrorFileHandle();
129 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000130}
131
132SBCommandInterpreter
133SBDebugger::GetCommandInterpreter ()
134{
Greg Clayton63094e02010-06-23 01:19:29 +0000135 SBCommandInterpreter sb_interpreter;
136 if (m_opaque_sp)
137 sb_interpreter.reset (&m_opaque_sp->GetCommandInterpreter());
Chris Lattner24943d22010-06-08 16:52:24 +0000138 return sb_interpreter;
139}
140
141void
142SBDebugger::HandleCommand (const char *command)
143{
Greg Clayton63094e02010-06-23 01:19:29 +0000144 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000145 {
Greg Clayton63094e02010-06-23 01:19:29 +0000146 SBCommandInterpreter sb_interpreter(GetCommandInterpreter ());
147 SBCommandReturnObject result;
148
149 sb_interpreter.HandleCommand (command, result, false);
150
151 if (GetErrorFileHandle() != NULL)
152 result.PutError (GetErrorFileHandle());
153 if (GetOutputFileHandle() != NULL)
154 result.PutOutput (GetOutputFileHandle());
155
156 if (m_opaque_sp->GetAsyncExecution() == false)
Chris Lattner24943d22010-06-08 16:52:24 +0000157 {
Greg Clayton63094e02010-06-23 01:19:29 +0000158 SBProcess process(GetCommandInterpreter().GetProcess ());
159 if (process.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000160 {
Greg Clayton63094e02010-06-23 01:19:29 +0000161 EventSP event_sp;
162 Listener &lldb_listener = m_opaque_sp->GetListener();
163 while (lldb_listener.GetNextEventForBroadcaster (process.get(), event_sp))
164 {
165 SBEvent event(event_sp);
166 HandleProcessEvent (process, event, GetOutputFileHandle(), GetErrorFileHandle());
167 }
Chris Lattner24943d22010-06-08 16:52:24 +0000168 }
169 }
170 }
171}
172
173SBListener
174SBDebugger::GetListener ()
175{
Greg Clayton63094e02010-06-23 01:19:29 +0000176 SBListener sb_listener;
177 if (m_opaque_sp)
178 sb_listener.reset(&m_opaque_sp->GetListener(), false);
Chris Lattner24943d22010-06-08 16:52:24 +0000179 return sb_listener;
180}
181
182void
183SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, FILE *out, FILE *err)
184{
185 const uint32_t event_type = event.GetType();
186 char stdio_buffer[1024];
187 size_t len;
188
189 if (event_type & Process::eBroadcastBitSTDOUT)
190 {
191 while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
192 if (out != NULL)
193 ::fwrite (stdio_buffer, 1, len, out);
194 }
195 else if (event_type & Process::eBroadcastBitSTDERR)
196 {
197 while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
198 if (out != NULL)
199 ::fwrite (stdio_buffer, 1, len, out);
200 }
201 else if (event_type & Process::eBroadcastBitStateChanged)
202 {
203 // Drain any stdout messages.
204 while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
205 if (out != NULL)
206 ::fwrite (stdio_buffer, 1, len, out);
207
208 // Drain any stderr messages.
209 while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
210 if (out != NULL)
211 ::fwrite (stdio_buffer, 1, len, out);
212
213 StateType event_state = SBProcess::GetStateFromEvent (event);
214
215 if (event_state == eStateInvalid)
216 return;
217
218 bool is_stopped = StateIsStoppedState (event_state);
219 if (!is_stopped)
Jim Inghamc8332952010-08-26 21:32:51 +0000220 process.ReportEventState (event, out);
Chris Lattner24943d22010-06-08 16:52:24 +0000221 }
222}
223
224void
Jim Inghamc8332952010-08-26 21:32:51 +0000225SBDebugger::UpdateSelectedThread (SBProcess &process)
Chris Lattner24943d22010-06-08 16:52:24 +0000226{
227 if (process.IsValid())
228 {
Jim Inghamc8332952010-08-26 21:32:51 +0000229 SBThread curr_thread = process.GetSelectedThread ();
Chris Lattner24943d22010-06-08 16:52:24 +0000230 SBThread thread;
231 StopReason curr_thread_stop_reason = eStopReasonInvalid;
232 if (curr_thread.IsValid())
233 {
234 if (curr_thread.GetStopReason() != eStopReasonInvalid)
235 curr_thread_stop_reason = curr_thread.GetStopReason ();
236 }
237
238 if (! curr_thread.IsValid()
239 || curr_thread_stop_reason == eStopReasonInvalid
240 || curr_thread_stop_reason == eStopReasonNone)
241 {
242 // Prefer a thread that has just completed its plan over another thread as current thread.
243 SBThread plan_thread;
244 SBThread other_thread;
245 const size_t num_threads = process.GetNumThreads ();
246 size_t i;
247 for (i = 0; i < num_threads; ++i)
248 {
249 thread = process.GetThreadAtIndex(i);
250 if (thread.GetStopReason () != eStopReasonInvalid)
251 {
252 switch (thread.GetStopReason ())
253 {
254 default:
255 case eStopReasonInvalid:
256 case eStopReasonNone:
257 break;
258
259 case eStopReasonTrace:
260 case eStopReasonBreakpoint:
261 case eStopReasonWatchpoint:
262 case eStopReasonSignal:
263 case eStopReasonException:
264 if (! other_thread.IsValid())
265 other_thread = thread;
266 break;
267 case eStopReasonPlanComplete:
268 if (! plan_thread.IsValid())
269 plan_thread = thread;
270 break;
271 }
272 }
273 }
274 if (plan_thread.IsValid())
Jim Inghamc8332952010-08-26 21:32:51 +0000275 process.SetSelectedThreadByID (plan_thread.GetThreadID());
Chris Lattner24943d22010-06-08 16:52:24 +0000276 else if (other_thread.IsValid())
Jim Inghamc8332952010-08-26 21:32:51 +0000277 process.SetSelectedThreadByID (other_thread.GetThreadID());
Chris Lattner24943d22010-06-08 16:52:24 +0000278 else
279 {
280 if (curr_thread.IsValid())
281 thread = curr_thread;
282 else
283 thread = process.GetThreadAtIndex(0);
284
285 if (thread.IsValid())
Jim Inghamc8332952010-08-26 21:32:51 +0000286 process.SetSelectedThreadByID (thread.GetThreadID());
Chris Lattner24943d22010-06-08 16:52:24 +0000287 }
288 }
289 }
290}
291
Chris Lattner24943d22010-06-08 16:52:24 +0000292SBSourceManager &
293SBDebugger::GetSourceManager ()
294{
295 static SourceManager g_lldb_source_manager;
296 static SBSourceManager g_sb_source_manager (g_lldb_source_manager);
297 return g_sb_source_manager;
298}
299
300
301bool
302SBDebugger::GetDefaultArchitecture (char *arch_name, size_t arch_name_len)
303{
304 if (arch_name && arch_name_len)
305 {
Caroline Tice5bc8c972010-09-20 20:44:43 +0000306 ArchSpec default_arch = lldb_private::Target::GetDefaultArchitecture ();
307
Chris Lattner24943d22010-06-08 16:52:24 +0000308 if (default_arch.IsValid())
309 {
310 ::snprintf (arch_name, arch_name_len, "%s", default_arch.AsCString());
311 return true;
312 }
313 }
314 if (arch_name && arch_name_len)
315 arch_name[0] = '\0';
316 return false;
317}
318
319
320bool
321SBDebugger::SetDefaultArchitecture (const char *arch_name)
322{
323 if (arch_name)
324 {
325 ArchSpec arch (arch_name);
326 if (arch.IsValid())
327 {
Caroline Tice5bc8c972010-09-20 20:44:43 +0000328 lldb_private::Target::SetDefaultArchitecture (arch);
Chris Lattner24943d22010-06-08 16:52:24 +0000329 return true;
330 }
331 }
332 return false;
333}
334
335ScriptLanguage
336SBDebugger::GetScriptingLanguage (const char *script_language_name)
337{
338 return Args::StringToScriptLanguage (script_language_name,
339 eScriptLanguageDefault,
340 NULL);
341}
Chris Lattner24943d22010-06-08 16:52:24 +0000342
343const char *
344SBDebugger::GetVersionString ()
345{
346 return lldb_private::GetVersion();
347}
348
349const char *
350SBDebugger::StateAsCString (lldb::StateType state)
351{
352 return lldb_private::StateAsCString (state);
353}
354
355bool
356SBDebugger::StateIsRunningState (lldb::StateType state)
357{
358 return lldb_private::StateIsRunningState (state);
359}
360
361bool
362SBDebugger::StateIsStoppedState (lldb::StateType state)
363{
364 return lldb_private::StateIsStoppedState (state);
365}
366
367
368SBTarget
369SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename,
370 const char *target_triple)
371{
Greg Clayton63094e02010-06-23 01:19:29 +0000372 SBTarget target;
373 if (m_opaque_sp)
374 {
375 ArchSpec arch;
376 FileSpec file_spec (filename);
377 arch.SetArchFromTargetTriple(target_triple);
378 TargetSP target_sp;
379 Error error (m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file_spec, arch, NULL, true, target_sp));
380 target.reset (target_sp);
381 }
Chris Lattner24943d22010-06-08 16:52:24 +0000382 return target;
383}
384
385SBTarget
386SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *archname)
387{
Greg Clayton63094e02010-06-23 01:19:29 +0000388 SBTarget target;
389 if (m_opaque_sp)
390 {
391 FileSpec file (filename);
Caroline Tice5bc8c972010-09-20 20:44:43 +0000392 ArchSpec arch = lldb_private::Target::GetDefaultArchitecture ();
Greg Clayton63094e02010-06-23 01:19:29 +0000393 TargetSP target_sp;
394 Error error;
Chris Lattner24943d22010-06-08 16:52:24 +0000395
Greg Clayton63094e02010-06-23 01:19:29 +0000396 if (archname != NULL)
397 {
398 ArchSpec arch2 (archname);
399 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch2, NULL, true, target_sp);
400 }
401 else
402 {
403 if (!arch.IsValid())
404 arch = LLDB_ARCH_DEFAULT;
405
406 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
407
408 if (error.Fail())
409 {
410 if (arch == LLDB_ARCH_DEFAULT_32BIT)
411 arch = LLDB_ARCH_DEFAULT_64BIT;
412 else
413 arch = LLDB_ARCH_DEFAULT_32BIT;
414
415 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
416 }
417 }
418
419 if (error.Success())
420 {
Jim Inghamc8332952010-08-26 21:32:51 +0000421 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Clayton63094e02010-06-23 01:19:29 +0000422 target.reset(target_sp);
423 }
Chris Lattner24943d22010-06-08 16:52:24 +0000424 }
Greg Clayton63094e02010-06-23 01:19:29 +0000425 return target;
426}
427
428SBTarget
429SBDebugger::CreateTarget (const char *filename)
430{
431 SBTarget target;
432 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000433 {
Greg Clayton63094e02010-06-23 01:19:29 +0000434 FileSpec file (filename);
Caroline Tice5bc8c972010-09-20 20:44:43 +0000435 ArchSpec arch = lldb_private::Target::GetDefaultArchitecture ();
Greg Clayton63094e02010-06-23 01:19:29 +0000436 TargetSP target_sp;
437 Error error;
438
Chris Lattner24943d22010-06-08 16:52:24 +0000439 if (!arch.IsValid())
440 arch = LLDB_ARCH_DEFAULT;
441
Greg Clayton63094e02010-06-23 01:19:29 +0000442 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000443
444 if (error.Fail())
445 {
446 if (arch == LLDB_ARCH_DEFAULT_32BIT)
447 arch = LLDB_ARCH_DEFAULT_64BIT;
448 else
449 arch = LLDB_ARCH_DEFAULT_32BIT;
450
Greg Clayton63094e02010-06-23 01:19:29 +0000451 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
452 }
453
454 if (error.Success())
455 {
Jim Inghamc8332952010-08-26 21:32:51 +0000456 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Clayton63094e02010-06-23 01:19:29 +0000457 target.reset (target_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000458 }
459 }
Greg Clayton63094e02010-06-23 01:19:29 +0000460 return target;
Chris Lattner24943d22010-06-08 16:52:24 +0000461}
462
463SBTarget
464SBDebugger::GetTargetAtIndex (uint32_t idx)
465{
Greg Clayton63094e02010-06-23 01:19:29 +0000466 SBTarget sb_target;
467 if (m_opaque_sp)
468 sb_target.reset(m_opaque_sp->GetTargetList().GetTargetAtIndex (idx));
Chris Lattner24943d22010-06-08 16:52:24 +0000469 return sb_target;
470}
471
472SBTarget
473SBDebugger::FindTargetWithProcessID (pid_t pid)
474{
Greg Clayton63094e02010-06-23 01:19:29 +0000475 SBTarget sb_target;
476 if (m_opaque_sp)
477 sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid));
Chris Lattner24943d22010-06-08 16:52:24 +0000478 return sb_target;
479}
480
481SBTarget
482SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name)
483{
Greg Clayton63094e02010-06-23 01:19:29 +0000484 SBTarget sb_target;
485 if (m_opaque_sp && filename && filename[0])
486 {
487 ArchSpec arch;
488 if (arch_name)
489 arch.SetArch(arch_name);
490 TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename), arch_name ? &arch : NULL));
491 sb_target.reset(target_sp);
492 }
493 return sb_target;
Chris Lattner24943d22010-06-08 16:52:24 +0000494}
495
496SBTarget
497SBDebugger::FindTargetWithLLDBProcess (const lldb::ProcessSP &process_sp)
498{
Greg Clayton63094e02010-06-23 01:19:29 +0000499 SBTarget sb_target;
500 if (m_opaque_sp)
501 sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get()));
Chris Lattner24943d22010-06-08 16:52:24 +0000502 return sb_target;
503}
504
505
506uint32_t
507SBDebugger::GetNumTargets ()
508{
Greg Clayton63094e02010-06-23 01:19:29 +0000509 if (m_opaque_sp)
510 return m_opaque_sp->GetTargetList().GetNumTargets ();
511 return 0;
512}
Chris Lattner24943d22010-06-08 16:52:24 +0000513
514SBTarget
Jim Inghamc8332952010-08-26 21:32:51 +0000515SBDebugger::GetSelectedTarget ()
Chris Lattner24943d22010-06-08 16:52:24 +0000516{
Greg Clayton63094e02010-06-23 01:19:29 +0000517 SBTarget sb_target;
518 if (m_opaque_sp)
Jim Inghamc8332952010-08-26 21:32:51 +0000519 sb_target.reset(m_opaque_sp->GetTargetList().GetSelectedTarget ());
Chris Lattner24943d22010-06-08 16:52:24 +0000520 return sb_target;
521}
522
523void
524SBDebugger::DispatchInput (void *baton, const void *data, size_t data_len)
525{
Greg Clayton63094e02010-06-23 01:19:29 +0000526 if (m_opaque_sp)
527 m_opaque_sp->DispatchInput ((const char *) data, data_len);
Chris Lattner24943d22010-06-08 16:52:24 +0000528}
529
530void
531SBDebugger::PushInputReader (SBInputReader &reader)
532{
Greg Clayton63094e02010-06-23 01:19:29 +0000533 if (m_opaque_sp && reader.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000534 {
535 InputReaderSP reader_sp(*reader);
Greg Clayton63094e02010-06-23 01:19:29 +0000536 m_opaque_sp->PushInputReader (reader_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000537 }
538}
Greg Clayton63094e02010-06-23 01:19:29 +0000539
540void
541SBDebugger::reset (const lldb::DebuggerSP &debugger_sp)
542{
543 m_opaque_sp = debugger_sp;
544}
545
546Debugger *
547SBDebugger::get () const
548{
549 return m_opaque_sp.get();
550}
551
552Debugger &
553SBDebugger::ref () const
554{
555 assert (m_opaque_sp.get());
556 return *m_opaque_sp;
557}
558
559
Caroline Tice558be582010-06-30 16:22:25 +0000560SBDebugger
561SBDebugger::FindDebuggerWithID (int id)
562{
563 SBDebugger sb_debugger;
564 lldb::DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id);
565 if (debugger_sp)
566 sb_debugger.reset (debugger_sp);
567 return sb_debugger;
568}
Jim Ingham74989e82010-08-30 19:44:40 +0000569
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000570const char *
571SBDebugger::GetInstanceName()
572{
573 if (m_opaque_sp)
574 return m_opaque_sp->GetInstanceName().AsCString();
575 else
576 return NULL;
577}
578
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000579SBError
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000580SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000581{
582 lldb::UserSettingsControllerSP root_settings_controller = lldb_private::Debugger::GetSettingsController();
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000583
584 Error err = root_settings_controller->SetVariable (var_name, value, lldb::eVarSetOperationAssign, false,
585 debugger_instance_name);
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000586 SBError sb_error;
587 sb_error.SetError (err);
588
589 return sb_error;
590}
591
592lldb::SBStringList
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000593SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000594{
595 SBStringList ret_value;
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000596 lldb::SettableVariableType var_type;
Caroline Tice5bc8c972010-09-20 20:44:43 +0000597 lldb_private:Error err;
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000598
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000599 lldb::UserSettingsControllerSP root_settings_controller = lldb_private::Debugger::GetSettingsController();
600
Caroline Tice5bc8c972010-09-20 20:44:43 +0000601 StringList value = root_settings_controller->GetVariable (var_name, var_type, debugger_instance_name, err);
602
603 if (err.Success())
604 {
605 for (unsigned i = 0; i != value.GetSize(); ++i)
606 ret_value.AppendString (value.GetStringAtIndex(i));
607 }
608 else
609 {
610 ret_value.AppendString (err.AsCString());
611 }
612
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000613
614 return ret_value;
615}
616
Greg Clayton238c0a12010-09-18 01:14:36 +0000617uint32_t
618SBDebugger::GetTerminalWidth () const
619{
620 if (m_opaque_sp)
621 return m_opaque_sp->GetTerminalWidth ();
622 return 0;
623}
624
625void
626SBDebugger::SetTerminalWidth (uint32_t term_width)
627{
628 if (m_opaque_sp)
629 m_opaque_sp->SetTerminalWidth (term_width);
630}
631
632const char *
633SBDebugger::GetPrompt() const
634{
635 if (m_opaque_sp)
636 return m_opaque_sp->GetPrompt ();
637 return 0;
638}
639
640void
641SBDebugger::SetPrompt (const char *prompt)
642{
643 if (m_opaque_sp)
644 m_opaque_sp->SetPrompt (prompt);
645}
646
647
648lldb::ScriptLanguage
649SBDebugger::GetScriptLanguage() const
650{
651 if (m_opaque_sp)
652 return m_opaque_sp->GetScriptLanguage ();
653 return eScriptLanguageNone;
654}
655
656void
657SBDebugger::SetScriptLanguage (lldb::ScriptLanguage script_lang)
658{
659 if (m_opaque_sp)
660 m_opaque_sp->SetScriptLanguage (script_lang);
661}
662
663
664
665
Jim Ingham74989e82010-08-30 19:44:40 +0000666bool
667SBDebugger::SetUseExternalEditor (bool value)
668{
669 if (m_opaque_sp)
670 return m_opaque_sp->SetUseExternalEditor (value);
671 else
672 return false;
673}
674
675bool
Caroline Tice5bc8c972010-09-20 20:44:43 +0000676SBDebugger::GetUseExternalEditor ()
Jim Ingham74989e82010-08-30 19:44:40 +0000677{
678 if (m_opaque_sp)
Caroline Tice5bc8c972010-09-20 20:44:43 +0000679 return m_opaque_sp->GetUseExternalEditor ();
Jim Ingham74989e82010-08-30 19:44:40 +0000680 else
681 return false;
682}
683
Caroline Tice98f930f2010-09-20 05:20:02 +0000684bool
685SBDebugger::GetDescription (SBStream &description)
686{
687 if (m_opaque_sp)
688 {
689 const char *name = m_opaque_sp->GetInstanceName().AsCString();
690 lldb::user_id_t id = m_opaque_sp->GetID();
691 description.Printf ("Debugger (instance: '%s', id: %d)", name, id);
692 }
693 else
694 description.Printf ("No value");
695
696 return true;
697}