blob: 32bf989d2292a8ad511c7a2a0c4635327e919c17 [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"
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"
18#include "lldb/API/SBEvent.h"
19#include "lldb/API/SBFrame.h"
Eli Friedmand6ec8aa2010-06-09 07:37:52 +000020#include "lldb/API/SBInputReader.h"
Caroline Tice6e4c5ce2010-09-04 00:03:46 +000021#include "lldb/API/SBProcess.h"
22#include "lldb/API/SBSourceManager.h"
Caroline Tice98f930f2010-09-20 05:20:02 +000023#include "lldb/API/SBStream.h"
Caroline Tice6e4c5ce2010-09-04 00:03:46 +000024#include "lldb/API/SBStringList.h"
25#include "lldb/API/SBTarget.h"
26#include "lldb/API/SBThread.h"
Greg Clayton887aa282010-10-11 01:05:37 +000027#include "lldb/Core/Debugger.h"
28#include "lldb/Core/State.h"
29#include "lldb/Interpreter/Args.h"
30#include "lldb/Interpreter/CommandInterpreter.h"
31#include "lldb/Target/Process.h"
32#include "lldb/Target/TargetList.h"
Chris Lattner24943d22010-06-08 16:52:24 +000033
34using namespace lldb;
35using namespace lldb_private;
36
37void
38SBDebugger::Initialize ()
39{
Caroline Tice7826c882010-10-26 03:11:13 +000040 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
41
42 if (log)
43 log->Printf ("SBDebugger::Initialize ()");
44
Chris Lattner24943d22010-06-08 16:52:24 +000045 Debugger::Initialize();
46}
47
48void
49SBDebugger::Terminate ()
50{
51 Debugger::Terminate();
52}
53
Greg Clayton43490d12010-07-30 20:12:55 +000054void
55SBDebugger::Clear ()
56{
Caroline Tice7826c882010-10-26 03:11:13 +000057 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
58
59 if (log)
60 log->Printf ("SBDebugger::Clear ()");
61
Greg Clayton43490d12010-07-30 20:12:55 +000062 m_opaque_sp.reset();
63}
64
Greg Clayton63094e02010-06-23 01:19:29 +000065SBDebugger
66SBDebugger::Create()
67{
Caroline Tice7826c882010-10-26 03:11:13 +000068 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
69
70 if (log)
71 log->Printf ("SBDebugger::Create ()");
72
Greg Clayton63094e02010-06-23 01:19:29 +000073 SBDebugger debugger;
74 debugger.reset(Debugger::CreateInstance());
Caroline Tice7826c882010-10-26 03:11:13 +000075
76 if (log)
77 {
78 SBStream sstr;
79 debugger.GetDescription (sstr);
80 log->Printf ("SBDebugger::Create ==> %s", sstr.GetData());
81 }
82
Greg Clayton63094e02010-06-23 01:19:29 +000083 return debugger;
84}
85
Greg Clayton63094e02010-06-23 01:19:29 +000086SBDebugger::SBDebugger () :
87 m_opaque_sp ()
88{
89}
90
91SBDebugger::~SBDebugger ()
92{
93}
94
95bool
96SBDebugger::IsValid() const
97{
98 return m_opaque_sp.get() != NULL;
99}
100
101
Chris Lattner24943d22010-06-08 16:52:24 +0000102void
103SBDebugger::SetAsync (bool b)
104{
Greg Clayton63094e02010-06-23 01:19:29 +0000105 if (m_opaque_sp)
106 m_opaque_sp->SetAsyncExecution(b);
Chris Lattner24943d22010-06-08 16:52:24 +0000107}
108
Greg Clayton887aa282010-10-11 01:05:37 +0000109void
110SBDebugger::SkipLLDBInitFiles (bool b)
111{
112 if (m_opaque_sp)
113 m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles (b);
114}
115
Chris Lattner24943d22010-06-08 16:52:24 +0000116// Shouldn't really be settable after initialization as this could cause lots of problems; don't want users
117// trying to switch modes in the middle of a debugging session.
118void
119SBDebugger::SetInputFileHandle (FILE *fh, bool transfer_ownership)
120{
Caroline Tice7826c882010-10-26 03:11:13 +0000121 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
122
123 if (log)
124 log->Printf ("SBDebugger::SetInputFileHandle (%p, %s)", fh, (transfer_ownership ? "true" : "false"));
125
Greg Clayton63094e02010-06-23 01:19:29 +0000126 if (m_opaque_sp)
127 m_opaque_sp->SetInputFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000128}
129
130void
131SBDebugger::SetOutputFileHandle (FILE *fh, bool transfer_ownership)
132{
Caroline Tice7826c882010-10-26 03:11:13 +0000133 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
134
135
136 if (log)
137 log->Printf ("SBDebugger::SetOutputFileHandle (%p, %s)", fh, (transfer_ownership ? "true" : "false"));
138
Greg Clayton63094e02010-06-23 01:19:29 +0000139 if (m_opaque_sp)
140 m_opaque_sp->SetOutputFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000141}
142
143void
144SBDebugger::SetErrorFileHandle (FILE *fh, bool transfer_ownership)
145{
Caroline Tice7826c882010-10-26 03:11:13 +0000146 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
147
148
149 if (log)
150 log->Printf ("SBDebugger::SetErrorFileHandle (%p, %s)", fh, (transfer_ownership ? "true" : "false"));
151
Greg Clayton63094e02010-06-23 01:19:29 +0000152 if (m_opaque_sp)
153 m_opaque_sp->SetErrorFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000154}
155
156FILE *
157SBDebugger::GetInputFileHandle ()
158{
Greg Clayton63094e02010-06-23 01:19:29 +0000159 if (m_opaque_sp)
160 return m_opaque_sp->GetInputFileHandle();
161 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000162}
163
164FILE *
165SBDebugger::GetOutputFileHandle ()
166{
Greg Clayton63094e02010-06-23 01:19:29 +0000167 if (m_opaque_sp)
168 return m_opaque_sp->GetOutputFileHandle();
169 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000170}
171
172FILE *
173SBDebugger::GetErrorFileHandle ()
174{
Greg Clayton63094e02010-06-23 01:19:29 +0000175 if (m_opaque_sp)
176 return m_opaque_sp->GetErrorFileHandle();
177 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000178}
179
180SBCommandInterpreter
181SBDebugger::GetCommandInterpreter ()
182{
Caroline Tice7826c882010-10-26 03:11:13 +0000183 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
184
185 if (log)
186 log->Printf ("SBDebugger::GetCommandInterpreter ()");
187
Greg Clayton63094e02010-06-23 01:19:29 +0000188 SBCommandInterpreter sb_interpreter;
189 if (m_opaque_sp)
190 sb_interpreter.reset (&m_opaque_sp->GetCommandInterpreter());
Caroline Tice7826c882010-10-26 03:11:13 +0000191
Chris Lattner24943d22010-06-08 16:52:24 +0000192 return sb_interpreter;
193}
194
195void
196SBDebugger::HandleCommand (const char *command)
197{
Greg Clayton63094e02010-06-23 01:19:29 +0000198 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000199 {
Greg Clayton63094e02010-06-23 01:19:29 +0000200 SBCommandInterpreter sb_interpreter(GetCommandInterpreter ());
201 SBCommandReturnObject result;
202
203 sb_interpreter.HandleCommand (command, result, false);
204
205 if (GetErrorFileHandle() != NULL)
206 result.PutError (GetErrorFileHandle());
207 if (GetOutputFileHandle() != NULL)
208 result.PutOutput (GetOutputFileHandle());
209
210 if (m_opaque_sp->GetAsyncExecution() == false)
Chris Lattner24943d22010-06-08 16:52:24 +0000211 {
Greg Clayton63094e02010-06-23 01:19:29 +0000212 SBProcess process(GetCommandInterpreter().GetProcess ());
213 if (process.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000214 {
Greg Clayton63094e02010-06-23 01:19:29 +0000215 EventSP event_sp;
216 Listener &lldb_listener = m_opaque_sp->GetListener();
217 while (lldb_listener.GetNextEventForBroadcaster (process.get(), event_sp))
218 {
219 SBEvent event(event_sp);
220 HandleProcessEvent (process, event, GetOutputFileHandle(), GetErrorFileHandle());
221 }
Chris Lattner24943d22010-06-08 16:52:24 +0000222 }
223 }
224 }
225}
226
227SBListener
228SBDebugger::GetListener ()
229{
Caroline Tice7826c882010-10-26 03:11:13 +0000230 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
231
232 if (log)
233 log->Printf ("SBDebugger::GetListener ()");
234
Greg Clayton63094e02010-06-23 01:19:29 +0000235 SBListener sb_listener;
236 if (m_opaque_sp)
237 sb_listener.reset(&m_opaque_sp->GetListener(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000238
Chris Lattner24943d22010-06-08 16:52:24 +0000239 return sb_listener;
240}
241
242void
243SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, FILE *out, FILE *err)
244{
245 const uint32_t event_type = event.GetType();
246 char stdio_buffer[1024];
247 size_t len;
248
249 if (event_type & Process::eBroadcastBitSTDOUT)
250 {
251 while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
252 if (out != NULL)
253 ::fwrite (stdio_buffer, 1, len, out);
254 }
255 else if (event_type & Process::eBroadcastBitSTDERR)
256 {
257 while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
258 if (out != NULL)
259 ::fwrite (stdio_buffer, 1, len, out);
260 }
261 else if (event_type & Process::eBroadcastBitStateChanged)
262 {
263 // Drain any stdout messages.
264 while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
265 if (out != NULL)
266 ::fwrite (stdio_buffer, 1, len, out);
267
268 // Drain any stderr messages.
269 while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
270 if (out != NULL)
271 ::fwrite (stdio_buffer, 1, len, out);
272
273 StateType event_state = SBProcess::GetStateFromEvent (event);
274
275 if (event_state == eStateInvalid)
276 return;
277
278 bool is_stopped = StateIsStoppedState (event_state);
279 if (!is_stopped)
Jim Inghamc8332952010-08-26 21:32:51 +0000280 process.ReportEventState (event, out);
Chris Lattner24943d22010-06-08 16:52:24 +0000281 }
282}
283
284void
Jim Inghamc8332952010-08-26 21:32:51 +0000285SBDebugger::UpdateSelectedThread (SBProcess &process)
Chris Lattner24943d22010-06-08 16:52:24 +0000286{
287 if (process.IsValid())
288 {
Jim Inghamc8332952010-08-26 21:32:51 +0000289 SBThread curr_thread = process.GetSelectedThread ();
Chris Lattner24943d22010-06-08 16:52:24 +0000290 SBThread thread;
291 StopReason curr_thread_stop_reason = eStopReasonInvalid;
292 if (curr_thread.IsValid())
293 {
294 if (curr_thread.GetStopReason() != eStopReasonInvalid)
295 curr_thread_stop_reason = curr_thread.GetStopReason ();
296 }
297
298 if (! curr_thread.IsValid()
299 || curr_thread_stop_reason == eStopReasonInvalid
300 || curr_thread_stop_reason == eStopReasonNone)
301 {
302 // Prefer a thread that has just completed its plan over another thread as current thread.
303 SBThread plan_thread;
304 SBThread other_thread;
305 const size_t num_threads = process.GetNumThreads ();
306 size_t i;
307 for (i = 0; i < num_threads; ++i)
308 {
309 thread = process.GetThreadAtIndex(i);
310 if (thread.GetStopReason () != eStopReasonInvalid)
311 {
312 switch (thread.GetStopReason ())
313 {
314 default:
315 case eStopReasonInvalid:
316 case eStopReasonNone:
317 break;
318
319 case eStopReasonTrace:
320 case eStopReasonBreakpoint:
321 case eStopReasonWatchpoint:
322 case eStopReasonSignal:
323 case eStopReasonException:
324 if (! other_thread.IsValid())
325 other_thread = thread;
326 break;
327 case eStopReasonPlanComplete:
328 if (! plan_thread.IsValid())
329 plan_thread = thread;
330 break;
331 }
332 }
333 }
334 if (plan_thread.IsValid())
Jim Inghamc8332952010-08-26 21:32:51 +0000335 process.SetSelectedThreadByID (plan_thread.GetThreadID());
Chris Lattner24943d22010-06-08 16:52:24 +0000336 else if (other_thread.IsValid())
Jim Inghamc8332952010-08-26 21:32:51 +0000337 process.SetSelectedThreadByID (other_thread.GetThreadID());
Chris Lattner24943d22010-06-08 16:52:24 +0000338 else
339 {
340 if (curr_thread.IsValid())
341 thread = curr_thread;
342 else
343 thread = process.GetThreadAtIndex(0);
344
345 if (thread.IsValid())
Jim Inghamc8332952010-08-26 21:32:51 +0000346 process.SetSelectedThreadByID (thread.GetThreadID());
Chris Lattner24943d22010-06-08 16:52:24 +0000347 }
348 }
349 }
350}
351
Chris Lattner24943d22010-06-08 16:52:24 +0000352SBSourceManager &
353SBDebugger::GetSourceManager ()
354{
355 static SourceManager g_lldb_source_manager;
356 static SBSourceManager g_sb_source_manager (g_lldb_source_manager);
357 return g_sb_source_manager;
358}
359
360
361bool
362SBDebugger::GetDefaultArchitecture (char *arch_name, size_t arch_name_len)
363{
364 if (arch_name && arch_name_len)
365 {
Caroline Tice5bc8c972010-09-20 20:44:43 +0000366 ArchSpec default_arch = lldb_private::Target::GetDefaultArchitecture ();
367
Chris Lattner24943d22010-06-08 16:52:24 +0000368 if (default_arch.IsValid())
369 {
370 ::snprintf (arch_name, arch_name_len, "%s", default_arch.AsCString());
371 return true;
372 }
373 }
374 if (arch_name && arch_name_len)
375 arch_name[0] = '\0';
376 return false;
377}
378
379
380bool
381SBDebugger::SetDefaultArchitecture (const char *arch_name)
382{
383 if (arch_name)
384 {
385 ArchSpec arch (arch_name);
386 if (arch.IsValid())
387 {
Caroline Tice5bc8c972010-09-20 20:44:43 +0000388 lldb_private::Target::SetDefaultArchitecture (arch);
Chris Lattner24943d22010-06-08 16:52:24 +0000389 return true;
390 }
391 }
392 return false;
393}
394
395ScriptLanguage
396SBDebugger::GetScriptingLanguage (const char *script_language_name)
397{
398 return Args::StringToScriptLanguage (script_language_name,
399 eScriptLanguageDefault,
400 NULL);
401}
Chris Lattner24943d22010-06-08 16:52:24 +0000402
403const char *
404SBDebugger::GetVersionString ()
405{
406 return lldb_private::GetVersion();
407}
408
409const char *
410SBDebugger::StateAsCString (lldb::StateType state)
411{
Caroline Tice7826c882010-10-26 03:11:13 +0000412 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
413
414 if (log)
415 log->Printf ("SBDebugger::StateAsCString ==> %s", lldb_private::StateAsCString (state));
416
Chris Lattner24943d22010-06-08 16:52:24 +0000417 return lldb_private::StateAsCString (state);
418}
419
420bool
421SBDebugger::StateIsRunningState (lldb::StateType state)
422{
423 return lldb_private::StateIsRunningState (state);
424}
425
426bool
427SBDebugger::StateIsStoppedState (lldb::StateType state)
428{
Caroline Tice7826c882010-10-26 03:11:13 +0000429 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
430
431 if (log)
432 log->Printf ("SBDebugger::StateIsStoppedState ==> %s",
433 (lldb_private::StateIsStoppedState (state) ? "true" : "false"));
434
Chris Lattner24943d22010-06-08 16:52:24 +0000435 return lldb_private::StateIsStoppedState (state);
436}
437
438
439SBTarget
440SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename,
441 const char *target_triple)
442{
Greg Clayton63094e02010-06-23 01:19:29 +0000443 SBTarget target;
444 if (m_opaque_sp)
445 {
446 ArchSpec arch;
Greg Clayton537a7a82010-10-20 20:54:39 +0000447 FileSpec file_spec (filename, true);
Greg Clayton63094e02010-06-23 01:19:29 +0000448 arch.SetArchFromTargetTriple(target_triple);
449 TargetSP target_sp;
450 Error error (m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file_spec, arch, NULL, true, target_sp));
451 target.reset (target_sp);
452 }
Chris Lattner24943d22010-06-08 16:52:24 +0000453 return target;
454}
455
456SBTarget
457SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *archname)
458{
Caroline Tice7826c882010-10-26 03:11:13 +0000459 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
460
461 if (log)
462 log->Printf ("SBDebugger::CreateTargetWithFileAndArch (%s, %s)", filename, archname);
463
Greg Clayton63094e02010-06-23 01:19:29 +0000464 SBTarget target;
465 if (m_opaque_sp)
466 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000467 FileSpec file (filename, true);
Caroline Tice5bc8c972010-09-20 20:44:43 +0000468 ArchSpec arch = lldb_private::Target::GetDefaultArchitecture ();
Greg Clayton63094e02010-06-23 01:19:29 +0000469 TargetSP target_sp;
470 Error error;
Chris Lattner24943d22010-06-08 16:52:24 +0000471
Greg Clayton63094e02010-06-23 01:19:29 +0000472 if (archname != NULL)
473 {
474 ArchSpec arch2 (archname);
475 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch2, NULL, true, target_sp);
476 }
477 else
478 {
479 if (!arch.IsValid())
480 arch = LLDB_ARCH_DEFAULT;
481
482 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
483
484 if (error.Fail())
485 {
486 if (arch == LLDB_ARCH_DEFAULT_32BIT)
487 arch = LLDB_ARCH_DEFAULT_64BIT;
488 else
489 arch = LLDB_ARCH_DEFAULT_32BIT;
490
491 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
492 }
493 }
494
495 if (error.Success())
496 {
Jim Inghamc8332952010-08-26 21:32:51 +0000497 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Clayton63094e02010-06-23 01:19:29 +0000498 target.reset(target_sp);
499 }
Chris Lattner24943d22010-06-08 16:52:24 +0000500 }
Caroline Tice7826c882010-10-26 03:11:13 +0000501
502 if (log)
503 {
504 SBStream sstr;
505 target.GetDescription (sstr, lldb::eDescriptionLevelFull);
506 log->Printf ("SBDebugger::CreateTargetWithFileAndArch ==> %s", sstr.GetData());
507 }
508
Greg Clayton63094e02010-06-23 01:19:29 +0000509 return target;
510}
511
512SBTarget
513SBDebugger::CreateTarget (const char *filename)
514{
515 SBTarget target;
516 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000517 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000518 FileSpec file (filename, true);
Caroline Tice5bc8c972010-09-20 20:44:43 +0000519 ArchSpec arch = lldb_private::Target::GetDefaultArchitecture ();
Greg Clayton63094e02010-06-23 01:19:29 +0000520 TargetSP target_sp;
521 Error error;
522
Chris Lattner24943d22010-06-08 16:52:24 +0000523 if (!arch.IsValid())
524 arch = LLDB_ARCH_DEFAULT;
525
Greg Clayton63094e02010-06-23 01:19:29 +0000526 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000527
528 if (error.Fail())
529 {
530 if (arch == LLDB_ARCH_DEFAULT_32BIT)
531 arch = LLDB_ARCH_DEFAULT_64BIT;
532 else
533 arch = LLDB_ARCH_DEFAULT_32BIT;
534
Greg Clayton63094e02010-06-23 01:19:29 +0000535 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
536 }
537
538 if (error.Success())
539 {
Jim Inghamc8332952010-08-26 21:32:51 +0000540 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Clayton63094e02010-06-23 01:19:29 +0000541 target.reset (target_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000542 }
543 }
Greg Clayton63094e02010-06-23 01:19:29 +0000544 return target;
Chris Lattner24943d22010-06-08 16:52:24 +0000545}
546
547SBTarget
548SBDebugger::GetTargetAtIndex (uint32_t idx)
549{
Greg Clayton63094e02010-06-23 01:19:29 +0000550 SBTarget sb_target;
551 if (m_opaque_sp)
552 sb_target.reset(m_opaque_sp->GetTargetList().GetTargetAtIndex (idx));
Chris Lattner24943d22010-06-08 16:52:24 +0000553 return sb_target;
554}
555
556SBTarget
557SBDebugger::FindTargetWithProcessID (pid_t pid)
558{
Greg Clayton63094e02010-06-23 01:19:29 +0000559 SBTarget sb_target;
560 if (m_opaque_sp)
561 sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid));
Chris Lattner24943d22010-06-08 16:52:24 +0000562 return sb_target;
563}
564
565SBTarget
566SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name)
567{
Greg Clayton63094e02010-06-23 01:19:29 +0000568 SBTarget sb_target;
569 if (m_opaque_sp && filename && filename[0])
570 {
571 ArchSpec arch;
572 if (arch_name)
573 arch.SetArch(arch_name);
Greg Clayton537a7a82010-10-20 20:54:39 +0000574 TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename, false), arch_name ? &arch : NULL));
Greg Clayton63094e02010-06-23 01:19:29 +0000575 sb_target.reset(target_sp);
576 }
577 return sb_target;
Chris Lattner24943d22010-06-08 16:52:24 +0000578}
579
580SBTarget
581SBDebugger::FindTargetWithLLDBProcess (const lldb::ProcessSP &process_sp)
582{
Greg Clayton63094e02010-06-23 01:19:29 +0000583 SBTarget sb_target;
584 if (m_opaque_sp)
585 sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get()));
Chris Lattner24943d22010-06-08 16:52:24 +0000586 return sb_target;
587}
588
589
590uint32_t
591SBDebugger::GetNumTargets ()
592{
Greg Clayton63094e02010-06-23 01:19:29 +0000593 if (m_opaque_sp)
594 return m_opaque_sp->GetTargetList().GetNumTargets ();
595 return 0;
596}
Chris Lattner24943d22010-06-08 16:52:24 +0000597
598SBTarget
Jim Inghamc8332952010-08-26 21:32:51 +0000599SBDebugger::GetSelectedTarget ()
Chris Lattner24943d22010-06-08 16:52:24 +0000600{
Caroline Tice7826c882010-10-26 03:11:13 +0000601 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
602
603 if (log)
604 log->Printf ("SBDebugger::GetSelectedTarget ()");
605
Greg Clayton63094e02010-06-23 01:19:29 +0000606 SBTarget sb_target;
607 if (m_opaque_sp)
Jim Inghamc8332952010-08-26 21:32:51 +0000608 sb_target.reset(m_opaque_sp->GetTargetList().GetSelectedTarget ());
Caroline Tice7826c882010-10-26 03:11:13 +0000609
610 if (log)
611 {
612 SBStream sstr;
613 sb_target.GetDescription (sstr, lldb::eDescriptionLevelBrief);
614 log->Printf ("SBDebugger::GetSelectedTarget ==> %s", sstr.GetData());
615 }
616
Chris Lattner24943d22010-06-08 16:52:24 +0000617 return sb_target;
618}
619
620void
621SBDebugger::DispatchInput (void *baton, const void *data, size_t data_len)
622{
Caroline Tice7826c882010-10-26 03:11:13 +0000623 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
624
625 if (log)
626 log->Printf ("SBDebugger::DispatchInput (%p, %s, %d)", baton, (const char *) data, (uint32_t) data_len);
627
Greg Clayton63094e02010-06-23 01:19:29 +0000628 if (m_opaque_sp)
629 m_opaque_sp->DispatchInput ((const char *) data, data_len);
Chris Lattner24943d22010-06-08 16:52:24 +0000630}
631
632void
633SBDebugger::PushInputReader (SBInputReader &reader)
634{
Caroline Tice7826c882010-10-26 03:11:13 +0000635 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
636
637 if (log)
638 log->Printf ("SBDebugger::PushInputReader (%p)", &reader);
639
Greg Clayton63094e02010-06-23 01:19:29 +0000640 if (m_opaque_sp && reader.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000641 {
642 InputReaderSP reader_sp(*reader);
Greg Clayton63094e02010-06-23 01:19:29 +0000643 m_opaque_sp->PushInputReader (reader_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000644 }
645}
Greg Clayton63094e02010-06-23 01:19:29 +0000646
647void
648SBDebugger::reset (const lldb::DebuggerSP &debugger_sp)
649{
650 m_opaque_sp = debugger_sp;
651}
652
653Debugger *
654SBDebugger::get () const
655{
656 return m_opaque_sp.get();
657}
658
659Debugger &
660SBDebugger::ref () const
661{
662 assert (m_opaque_sp.get());
663 return *m_opaque_sp;
664}
665
666
Caroline Tice558be582010-06-30 16:22:25 +0000667SBDebugger
668SBDebugger::FindDebuggerWithID (int id)
669{
670 SBDebugger sb_debugger;
671 lldb::DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id);
672 if (debugger_sp)
673 sb_debugger.reset (debugger_sp);
674 return sb_debugger;
675}
Jim Ingham74989e82010-08-30 19:44:40 +0000676
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000677const char *
678SBDebugger::GetInstanceName()
679{
680 if (m_opaque_sp)
681 return m_opaque_sp->GetInstanceName().AsCString();
682 else
683 return NULL;
684}
685
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000686SBError
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000687SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000688{
689 lldb::UserSettingsControllerSP root_settings_controller = lldb_private::Debugger::GetSettingsController();
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000690
Caroline Tice1ebef442010-09-27 00:30:10 +0000691 Error err = root_settings_controller->SetVariable (var_name, value, lldb::eVarSetOperationAssign, true,
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000692 debugger_instance_name);
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000693 SBError sb_error;
694 sb_error.SetError (err);
695
696 return sb_error;
697}
698
699lldb::SBStringList
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000700SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000701{
702 SBStringList ret_value;
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000703 lldb::SettableVariableType var_type;
Caroline Tice5bc8c972010-09-20 20:44:43 +0000704 lldb_private:Error err;
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000705
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000706 lldb::UserSettingsControllerSP root_settings_controller = lldb_private::Debugger::GetSettingsController();
707
Caroline Tice5bc8c972010-09-20 20:44:43 +0000708 StringList value = root_settings_controller->GetVariable (var_name, var_type, debugger_instance_name, err);
709
710 if (err.Success())
711 {
712 for (unsigned i = 0; i != value.GetSize(); ++i)
713 ret_value.AppendString (value.GetStringAtIndex(i));
714 }
715 else
716 {
717 ret_value.AppendString (err.AsCString());
718 }
719
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000720
721 return ret_value;
722}
723
Greg Clayton238c0a12010-09-18 01:14:36 +0000724uint32_t
725SBDebugger::GetTerminalWidth () const
726{
727 if (m_opaque_sp)
728 return m_opaque_sp->GetTerminalWidth ();
729 return 0;
730}
731
732void
733SBDebugger::SetTerminalWidth (uint32_t term_width)
734{
735 if (m_opaque_sp)
736 m_opaque_sp->SetTerminalWidth (term_width);
737}
738
739const char *
740SBDebugger::GetPrompt() const
741{
Caroline Tice7826c882010-10-26 03:11:13 +0000742 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
743
744 if (log)
745 log->Printf ("SBDebugger::GetPrompt ==> '%s'", (m_opaque_sp ? m_opaque_sp->GetPrompt() : ""));
746
Greg Clayton238c0a12010-09-18 01:14:36 +0000747 if (m_opaque_sp)
748 return m_opaque_sp->GetPrompt ();
749 return 0;
750}
751
752void
753SBDebugger::SetPrompt (const char *prompt)
754{
755 if (m_opaque_sp)
756 m_opaque_sp->SetPrompt (prompt);
757}
758
759
760lldb::ScriptLanguage
761SBDebugger::GetScriptLanguage() const
762{
763 if (m_opaque_sp)
764 return m_opaque_sp->GetScriptLanguage ();
765 return eScriptLanguageNone;
766}
767
768void
769SBDebugger::SetScriptLanguage (lldb::ScriptLanguage script_lang)
770{
771 if (m_opaque_sp)
772 m_opaque_sp->SetScriptLanguage (script_lang);
773}
774
775
776
777
Jim Ingham74989e82010-08-30 19:44:40 +0000778bool
779SBDebugger::SetUseExternalEditor (bool value)
780{
781 if (m_opaque_sp)
782 return m_opaque_sp->SetUseExternalEditor (value);
783 else
784 return false;
785}
786
787bool
Caroline Tice5bc8c972010-09-20 20:44:43 +0000788SBDebugger::GetUseExternalEditor ()
Jim Ingham74989e82010-08-30 19:44:40 +0000789{
790 if (m_opaque_sp)
Caroline Tice5bc8c972010-09-20 20:44:43 +0000791 return m_opaque_sp->GetUseExternalEditor ();
Jim Ingham74989e82010-08-30 19:44:40 +0000792 else
793 return false;
794}
795
Caroline Tice98f930f2010-09-20 05:20:02 +0000796bool
797SBDebugger::GetDescription (SBStream &description)
798{
799 if (m_opaque_sp)
800 {
801 const char *name = m_opaque_sp->GetInstanceName().AsCString();
802 lldb::user_id_t id = m_opaque_sp->GetID();
803 description.Printf ("Debugger (instance: '%s', id: %d)", name, id);
804 }
805 else
806 description.Printf ("No value");
807
808 return true;
809}