blob: 256cb1148bdf38d47827783d1a58f22bed6bc8e4 [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
Caroline Tice61ba7ec2010-10-26 23:49:36 +000070 //if (log)
71 // log->Printf ("SBDebugger::Create ()");
Caroline Tice7826c882010-10-26 03:11:13 +000072
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);
Caroline Tice61ba7ec2010-10-26 23:49:36 +000080 log->Printf ("SBDebugger::Create () => SBDebugger (this.sp = %p, '%s')", debugger.m_opaque_sp.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +000081 }
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)
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000124 log->Printf ("SBDebugger::SetInputFileHandle (this.sp=%p, fh=%p, transfer_ownership='%s')", m_opaque_sp.get(),
125 fh, (transfer_ownership ? "true" : "false"));
Caroline Tice7826c882010-10-26 03:11:13 +0000126
Greg Clayton63094e02010-06-23 01:19:29 +0000127 if (m_opaque_sp)
128 m_opaque_sp->SetInputFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000129}
130
131void
132SBDebugger::SetOutputFileHandle (FILE *fh, bool transfer_ownership)
133{
Caroline Tice7826c882010-10-26 03:11:13 +0000134 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
135
136
137 if (log)
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000138 log->Printf ("SBDebugger::SetOutputFileHandle (this.sp=%p, fh=%p, transfer_ownership='%s')", m_opaque_sp.get(),
139 fh, (transfer_ownership ? "true" : "false"));
Caroline Tice7826c882010-10-26 03:11:13 +0000140
Greg Clayton63094e02010-06-23 01:19:29 +0000141 if (m_opaque_sp)
142 m_opaque_sp->SetOutputFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000143}
144
145void
146SBDebugger::SetErrorFileHandle (FILE *fh, bool transfer_ownership)
147{
Caroline Tice7826c882010-10-26 03:11:13 +0000148 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
149
150
151 if (log)
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000152 log->Printf ("SBDebugger::SetErrorFileHandle (this.sp=%p, fh=%p, transfer_ownership='%s')", m_opaque_sp.get(),
153 fh, (transfer_ownership ? "true" : "false"));
Caroline Tice7826c882010-10-26 03:11:13 +0000154
Greg Clayton63094e02010-06-23 01:19:29 +0000155 if (m_opaque_sp)
156 m_opaque_sp->SetErrorFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000157}
158
159FILE *
160SBDebugger::GetInputFileHandle ()
161{
Greg Clayton63094e02010-06-23 01:19:29 +0000162 if (m_opaque_sp)
163 return m_opaque_sp->GetInputFileHandle();
164 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000165}
166
167FILE *
168SBDebugger::GetOutputFileHandle ()
169{
Greg Clayton63094e02010-06-23 01:19:29 +0000170 if (m_opaque_sp)
171 return m_opaque_sp->GetOutputFileHandle();
172 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000173}
174
175FILE *
176SBDebugger::GetErrorFileHandle ()
177{
Greg Clayton63094e02010-06-23 01:19:29 +0000178 if (m_opaque_sp)
179 return m_opaque_sp->GetErrorFileHandle();
180 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000181}
182
183SBCommandInterpreter
184SBDebugger::GetCommandInterpreter ()
185{
Caroline Tice7826c882010-10-26 03:11:13 +0000186 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
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
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000192 if (log)
193 log->Printf ("SBDebugger::GetCommandInterpreter (this.sp=%p) => SBCommandInterpreter (this.obj=%p)",
194 m_opaque_sp.get(), sb_interpreter.get());
195
Chris Lattner24943d22010-06-08 16:52:24 +0000196 return sb_interpreter;
197}
198
199void
200SBDebugger::HandleCommand (const char *command)
201{
Greg Clayton63094e02010-06-23 01:19:29 +0000202 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000203 {
Greg Clayton63094e02010-06-23 01:19:29 +0000204 SBCommandInterpreter sb_interpreter(GetCommandInterpreter ());
205 SBCommandReturnObject result;
206
207 sb_interpreter.HandleCommand (command, result, false);
208
209 if (GetErrorFileHandle() != NULL)
210 result.PutError (GetErrorFileHandle());
211 if (GetOutputFileHandle() != NULL)
212 result.PutOutput (GetOutputFileHandle());
213
214 if (m_opaque_sp->GetAsyncExecution() == false)
Chris Lattner24943d22010-06-08 16:52:24 +0000215 {
Greg Clayton63094e02010-06-23 01:19:29 +0000216 SBProcess process(GetCommandInterpreter().GetProcess ());
217 if (process.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000218 {
Greg Clayton63094e02010-06-23 01:19:29 +0000219 EventSP event_sp;
220 Listener &lldb_listener = m_opaque_sp->GetListener();
221 while (lldb_listener.GetNextEventForBroadcaster (process.get(), event_sp))
222 {
223 SBEvent event(event_sp);
224 HandleProcessEvent (process, event, GetOutputFileHandle(), GetErrorFileHandle());
225 }
Chris Lattner24943d22010-06-08 16:52:24 +0000226 }
227 }
228 }
229}
230
231SBListener
232SBDebugger::GetListener ()
233{
Caroline Tice7826c882010-10-26 03:11:13 +0000234 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
235
Greg Clayton63094e02010-06-23 01:19:29 +0000236 SBListener sb_listener;
237 if (m_opaque_sp)
238 sb_listener.reset(&m_opaque_sp->GetListener(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000239
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000240 if (log)
241 log->Printf ("SBDebugger::GetListener (this.sp=%p) => SBListener (this.obj=%p)", m_opaque_sp.get(),
242 sb_listener.get());
243
Chris Lattner24943d22010-06-08 16:52:24 +0000244 return sb_listener;
245}
246
247void
248SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, FILE *out, FILE *err)
249{
250 const uint32_t event_type = event.GetType();
251 char stdio_buffer[1024];
252 size_t len;
253
254 if (event_type & Process::eBroadcastBitSTDOUT)
255 {
256 while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
257 if (out != NULL)
258 ::fwrite (stdio_buffer, 1, len, out);
259 }
260 else if (event_type & Process::eBroadcastBitSTDERR)
261 {
262 while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
263 if (out != NULL)
264 ::fwrite (stdio_buffer, 1, len, out);
265 }
266 else if (event_type & Process::eBroadcastBitStateChanged)
267 {
268 // Drain any stdout messages.
269 while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
270 if (out != NULL)
271 ::fwrite (stdio_buffer, 1, len, out);
272
273 // Drain any stderr messages.
274 while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
275 if (out != NULL)
276 ::fwrite (stdio_buffer, 1, len, out);
277
278 StateType event_state = SBProcess::GetStateFromEvent (event);
279
280 if (event_state == eStateInvalid)
281 return;
282
283 bool is_stopped = StateIsStoppedState (event_state);
284 if (!is_stopped)
Jim Inghamc8332952010-08-26 21:32:51 +0000285 process.ReportEventState (event, out);
Chris Lattner24943d22010-06-08 16:52:24 +0000286 }
287}
288
289void
Jim Inghamc8332952010-08-26 21:32:51 +0000290SBDebugger::UpdateSelectedThread (SBProcess &process)
Chris Lattner24943d22010-06-08 16:52:24 +0000291{
292 if (process.IsValid())
293 {
Jim Inghamc8332952010-08-26 21:32:51 +0000294 SBThread curr_thread = process.GetSelectedThread ();
Chris Lattner24943d22010-06-08 16:52:24 +0000295 SBThread thread;
296 StopReason curr_thread_stop_reason = eStopReasonInvalid;
297 if (curr_thread.IsValid())
298 {
299 if (curr_thread.GetStopReason() != eStopReasonInvalid)
300 curr_thread_stop_reason = curr_thread.GetStopReason ();
301 }
302
303 if (! curr_thread.IsValid()
304 || curr_thread_stop_reason == eStopReasonInvalid
305 || curr_thread_stop_reason == eStopReasonNone)
306 {
307 // Prefer a thread that has just completed its plan over another thread as current thread.
308 SBThread plan_thread;
309 SBThread other_thread;
310 const size_t num_threads = process.GetNumThreads ();
311 size_t i;
312 for (i = 0; i < num_threads; ++i)
313 {
314 thread = process.GetThreadAtIndex(i);
315 if (thread.GetStopReason () != eStopReasonInvalid)
316 {
317 switch (thread.GetStopReason ())
318 {
319 default:
320 case eStopReasonInvalid:
321 case eStopReasonNone:
322 break;
323
324 case eStopReasonTrace:
325 case eStopReasonBreakpoint:
326 case eStopReasonWatchpoint:
327 case eStopReasonSignal:
328 case eStopReasonException:
329 if (! other_thread.IsValid())
330 other_thread = thread;
331 break;
332 case eStopReasonPlanComplete:
333 if (! plan_thread.IsValid())
334 plan_thread = thread;
335 break;
336 }
337 }
338 }
339 if (plan_thread.IsValid())
Jim Inghamc8332952010-08-26 21:32:51 +0000340 process.SetSelectedThreadByID (plan_thread.GetThreadID());
Chris Lattner24943d22010-06-08 16:52:24 +0000341 else if (other_thread.IsValid())
Jim Inghamc8332952010-08-26 21:32:51 +0000342 process.SetSelectedThreadByID (other_thread.GetThreadID());
Chris Lattner24943d22010-06-08 16:52:24 +0000343 else
344 {
345 if (curr_thread.IsValid())
346 thread = curr_thread;
347 else
348 thread = process.GetThreadAtIndex(0);
349
350 if (thread.IsValid())
Jim Inghamc8332952010-08-26 21:32:51 +0000351 process.SetSelectedThreadByID (thread.GetThreadID());
Chris Lattner24943d22010-06-08 16:52:24 +0000352 }
353 }
354 }
355}
356
Chris Lattner24943d22010-06-08 16:52:24 +0000357SBSourceManager &
358SBDebugger::GetSourceManager ()
359{
360 static SourceManager g_lldb_source_manager;
361 static SBSourceManager g_sb_source_manager (g_lldb_source_manager);
362 return g_sb_source_manager;
363}
364
365
366bool
367SBDebugger::GetDefaultArchitecture (char *arch_name, size_t arch_name_len)
368{
369 if (arch_name && arch_name_len)
370 {
Caroline Tice5bc8c972010-09-20 20:44:43 +0000371 ArchSpec default_arch = lldb_private::Target::GetDefaultArchitecture ();
372
Chris Lattner24943d22010-06-08 16:52:24 +0000373 if (default_arch.IsValid())
374 {
375 ::snprintf (arch_name, arch_name_len, "%s", default_arch.AsCString());
376 return true;
377 }
378 }
379 if (arch_name && arch_name_len)
380 arch_name[0] = '\0';
381 return false;
382}
383
384
385bool
386SBDebugger::SetDefaultArchitecture (const char *arch_name)
387{
388 if (arch_name)
389 {
390 ArchSpec arch (arch_name);
391 if (arch.IsValid())
392 {
Caroline Tice5bc8c972010-09-20 20:44:43 +0000393 lldb_private::Target::SetDefaultArchitecture (arch);
Chris Lattner24943d22010-06-08 16:52:24 +0000394 return true;
395 }
396 }
397 return false;
398}
399
400ScriptLanguage
401SBDebugger::GetScriptingLanguage (const char *script_language_name)
402{
403 return Args::StringToScriptLanguage (script_language_name,
404 eScriptLanguageDefault,
405 NULL);
406}
Chris Lattner24943d22010-06-08 16:52:24 +0000407
408const char *
409SBDebugger::GetVersionString ()
410{
411 return lldb_private::GetVersion();
412}
413
414const char *
415SBDebugger::StateAsCString (lldb::StateType state)
416{
Caroline Tice7826c882010-10-26 03:11:13 +0000417 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
418
419 if (log)
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000420 log->Printf ("SBDebugger::StateAsCString (state=%d) => '%s'", state,
421 lldb_private::StateAsCString (state));
Caroline Tice7826c882010-10-26 03:11:13 +0000422
Chris Lattner24943d22010-06-08 16:52:24 +0000423 return lldb_private::StateAsCString (state);
424}
425
426bool
427SBDebugger::StateIsRunningState (lldb::StateType state)
428{
429 return lldb_private::StateIsRunningState (state);
430}
431
432bool
433SBDebugger::StateIsStoppedState (lldb::StateType state)
434{
Caroline Tice7826c882010-10-26 03:11:13 +0000435 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
436
437 if (log)
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000438 log->Printf ("SBDebugger::StateIsStoppedState (state=%d) => '%s'", state,
Caroline Tice7826c882010-10-26 03:11:13 +0000439 (lldb_private::StateIsStoppedState (state) ? "true" : "false"));
440
Chris Lattner24943d22010-06-08 16:52:24 +0000441 return lldb_private::StateIsStoppedState (state);
442}
443
444
445SBTarget
446SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename,
447 const char *target_triple)
448{
Greg Clayton63094e02010-06-23 01:19:29 +0000449 SBTarget target;
450 if (m_opaque_sp)
451 {
452 ArchSpec arch;
Greg Clayton537a7a82010-10-20 20:54:39 +0000453 FileSpec file_spec (filename, true);
Greg Clayton63094e02010-06-23 01:19:29 +0000454 arch.SetArchFromTargetTriple(target_triple);
455 TargetSP target_sp;
456 Error error (m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file_spec, arch, NULL, true, target_sp));
457 target.reset (target_sp);
458 }
Chris Lattner24943d22010-06-08 16:52:24 +0000459 return target;
460}
461
462SBTarget
463SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *archname)
464{
Caroline Tice7826c882010-10-26 03:11:13 +0000465 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
466
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000467 //if (log)
468 // log->Printf ("SBDebugger::CreateTargetWithFileAndArch (this.sp=%p, filename='%s', arcname='%s')",
469 // m_opaque_sp.get() filename, archname);
Caroline Tice7826c882010-10-26 03:11:13 +0000470
Greg Clayton63094e02010-06-23 01:19:29 +0000471 SBTarget target;
472 if (m_opaque_sp)
473 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000474 FileSpec file (filename, true);
Caroline Tice5bc8c972010-09-20 20:44:43 +0000475 ArchSpec arch = lldb_private::Target::GetDefaultArchitecture ();
Greg Clayton63094e02010-06-23 01:19:29 +0000476 TargetSP target_sp;
477 Error error;
Chris Lattner24943d22010-06-08 16:52:24 +0000478
Greg Clayton63094e02010-06-23 01:19:29 +0000479 if (archname != NULL)
480 {
481 ArchSpec arch2 (archname);
482 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch2, NULL, true, target_sp);
483 }
484 else
485 {
486 if (!arch.IsValid())
487 arch = LLDB_ARCH_DEFAULT;
488
489 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
490
491 if (error.Fail())
492 {
493 if (arch == LLDB_ARCH_DEFAULT_32BIT)
494 arch = LLDB_ARCH_DEFAULT_64BIT;
495 else
496 arch = LLDB_ARCH_DEFAULT_32BIT;
497
498 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
499 }
500 }
501
502 if (error.Success())
503 {
Jim Inghamc8332952010-08-26 21:32:51 +0000504 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Clayton63094e02010-06-23 01:19:29 +0000505 target.reset(target_sp);
506 }
Chris Lattner24943d22010-06-08 16:52:24 +0000507 }
Caroline Tice7826c882010-10-26 03:11:13 +0000508
509 if (log)
510 {
511 SBStream sstr;
512 target.GetDescription (sstr, lldb::eDescriptionLevelFull);
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000513 log->Printf ("SBDebugger::CreateTargetWithFileAndArch (this.sp=%p, filename='%s', arcname='%s') "
514 "=> SBTarget: this.sp=%p, '%s'", m_opaque_sp.get(), filename, archname, target.get(),
515 sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000516 }
517
Greg Clayton63094e02010-06-23 01:19:29 +0000518 return target;
519}
520
521SBTarget
522SBDebugger::CreateTarget (const char *filename)
523{
524 SBTarget target;
525 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000526 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000527 FileSpec file (filename, true);
Caroline Tice5bc8c972010-09-20 20:44:43 +0000528 ArchSpec arch = lldb_private::Target::GetDefaultArchitecture ();
Greg Clayton63094e02010-06-23 01:19:29 +0000529 TargetSP target_sp;
530 Error error;
531
Chris Lattner24943d22010-06-08 16:52:24 +0000532 if (!arch.IsValid())
533 arch = LLDB_ARCH_DEFAULT;
534
Greg Clayton63094e02010-06-23 01:19:29 +0000535 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000536
537 if (error.Fail())
538 {
539 if (arch == LLDB_ARCH_DEFAULT_32BIT)
540 arch = LLDB_ARCH_DEFAULT_64BIT;
541 else
542 arch = LLDB_ARCH_DEFAULT_32BIT;
543
Greg Clayton63094e02010-06-23 01:19:29 +0000544 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
545 }
546
547 if (error.Success())
548 {
Jim Inghamc8332952010-08-26 21:32:51 +0000549 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Clayton63094e02010-06-23 01:19:29 +0000550 target.reset (target_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000551 }
552 }
Greg Clayton63094e02010-06-23 01:19:29 +0000553 return target;
Chris Lattner24943d22010-06-08 16:52:24 +0000554}
555
556SBTarget
557SBDebugger::GetTargetAtIndex (uint32_t idx)
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().GetTargetAtIndex (idx));
Chris Lattner24943d22010-06-08 16:52:24 +0000562 return sb_target;
563}
564
565SBTarget
566SBDebugger::FindTargetWithProcessID (pid_t pid)
567{
Greg Clayton63094e02010-06-23 01:19:29 +0000568 SBTarget sb_target;
569 if (m_opaque_sp)
570 sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid));
Chris Lattner24943d22010-06-08 16:52:24 +0000571 return sb_target;
572}
573
574SBTarget
575SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name)
576{
Greg Clayton63094e02010-06-23 01:19:29 +0000577 SBTarget sb_target;
578 if (m_opaque_sp && filename && filename[0])
579 {
580 ArchSpec arch;
581 if (arch_name)
582 arch.SetArch(arch_name);
Greg Clayton537a7a82010-10-20 20:54:39 +0000583 TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename, false), arch_name ? &arch : NULL));
Greg Clayton63094e02010-06-23 01:19:29 +0000584 sb_target.reset(target_sp);
585 }
586 return sb_target;
Chris Lattner24943d22010-06-08 16:52:24 +0000587}
588
589SBTarget
590SBDebugger::FindTargetWithLLDBProcess (const lldb::ProcessSP &process_sp)
591{
Greg Clayton63094e02010-06-23 01:19:29 +0000592 SBTarget sb_target;
593 if (m_opaque_sp)
594 sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get()));
Chris Lattner24943d22010-06-08 16:52:24 +0000595 return sb_target;
596}
597
598
599uint32_t
600SBDebugger::GetNumTargets ()
601{
Greg Clayton63094e02010-06-23 01:19:29 +0000602 if (m_opaque_sp)
603 return m_opaque_sp->GetTargetList().GetNumTargets ();
604 return 0;
605}
Chris Lattner24943d22010-06-08 16:52:24 +0000606
607SBTarget
Jim Inghamc8332952010-08-26 21:32:51 +0000608SBDebugger::GetSelectedTarget ()
Chris Lattner24943d22010-06-08 16:52:24 +0000609{
Caroline Tice7826c882010-10-26 03:11:13 +0000610 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
611
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000612 //if (log)
613 // log->Printf ("SBDebugger::GetSelectedTarget ()");
Caroline Tice7826c882010-10-26 03:11:13 +0000614
Greg Clayton63094e02010-06-23 01:19:29 +0000615 SBTarget sb_target;
616 if (m_opaque_sp)
Jim Inghamc8332952010-08-26 21:32:51 +0000617 sb_target.reset(m_opaque_sp->GetTargetList().GetSelectedTarget ());
Caroline Tice7826c882010-10-26 03:11:13 +0000618
619 if (log)
620 {
621 SBStream sstr;
622 sb_target.GetDescription (sstr, lldb::eDescriptionLevelBrief);
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000623 log->Printf ("SBDebugger::GetSelectedTarget (this.sp=%p) => SBTarget: this.sp=%p, '%s'", m_opaque_sp.get(),
624 sb_target.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000625 }
626
Chris Lattner24943d22010-06-08 16:52:24 +0000627 return sb_target;
628}
629
630void
631SBDebugger::DispatchInput (void *baton, const void *data, size_t data_len)
632{
Caroline Tice7826c882010-10-26 03:11:13 +0000633 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
634
635 if (log)
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000636 log->Printf ("SBDebugger::DispatchInput (this.sp=%p, baton=%p, data='%s', size_t=%d)", m_opaque_sp.get(),
637 baton, (const char *) data, (uint32_t) data_len);
Caroline Tice7826c882010-10-26 03:11:13 +0000638
Greg Clayton63094e02010-06-23 01:19:29 +0000639 if (m_opaque_sp)
640 m_opaque_sp->DispatchInput ((const char *) data, data_len);
Chris Lattner24943d22010-06-08 16:52:24 +0000641}
642
643void
644SBDebugger::PushInputReader (SBInputReader &reader)
645{
Caroline Tice7826c882010-10-26 03:11:13 +0000646 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
647
648 if (log)
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000649 log->Printf ("SBDebugger::PushInputReader (this.sp=%p, reader=%p)", m_opaque_sp.get(), &reader);
Caroline Tice7826c882010-10-26 03:11:13 +0000650
Greg Clayton63094e02010-06-23 01:19:29 +0000651 if (m_opaque_sp && reader.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000652 {
653 InputReaderSP reader_sp(*reader);
Greg Clayton63094e02010-06-23 01:19:29 +0000654 m_opaque_sp->PushInputReader (reader_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000655 }
656}
Greg Clayton63094e02010-06-23 01:19:29 +0000657
658void
659SBDebugger::reset (const lldb::DebuggerSP &debugger_sp)
660{
661 m_opaque_sp = debugger_sp;
662}
663
664Debugger *
665SBDebugger::get () const
666{
667 return m_opaque_sp.get();
668}
669
670Debugger &
671SBDebugger::ref () const
672{
673 assert (m_opaque_sp.get());
674 return *m_opaque_sp;
675}
676
677
Caroline Tice558be582010-06-30 16:22:25 +0000678SBDebugger
679SBDebugger::FindDebuggerWithID (int id)
680{
681 SBDebugger sb_debugger;
682 lldb::DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id);
683 if (debugger_sp)
684 sb_debugger.reset (debugger_sp);
685 return sb_debugger;
686}
Jim Ingham74989e82010-08-30 19:44:40 +0000687
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000688const char *
689SBDebugger::GetInstanceName()
690{
691 if (m_opaque_sp)
692 return m_opaque_sp->GetInstanceName().AsCString();
693 else
694 return NULL;
695}
696
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000697SBError
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000698SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000699{
700 lldb::UserSettingsControllerSP root_settings_controller = lldb_private::Debugger::GetSettingsController();
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000701
Caroline Tice1ebef442010-09-27 00:30:10 +0000702 Error err = root_settings_controller->SetVariable (var_name, value, lldb::eVarSetOperationAssign, true,
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000703 debugger_instance_name);
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000704 SBError sb_error;
705 sb_error.SetError (err);
706
707 return sb_error;
708}
709
710lldb::SBStringList
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000711SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000712{
713 SBStringList ret_value;
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000714 lldb::SettableVariableType var_type;
Caroline Tice5bc8c972010-09-20 20:44:43 +0000715 lldb_private:Error err;
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000716
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000717 lldb::UserSettingsControllerSP root_settings_controller = lldb_private::Debugger::GetSettingsController();
718
Caroline Tice5bc8c972010-09-20 20:44:43 +0000719 StringList value = root_settings_controller->GetVariable (var_name, var_type, debugger_instance_name, err);
720
721 if (err.Success())
722 {
723 for (unsigned i = 0; i != value.GetSize(); ++i)
724 ret_value.AppendString (value.GetStringAtIndex(i));
725 }
726 else
727 {
728 ret_value.AppendString (err.AsCString());
729 }
730
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000731
732 return ret_value;
733}
734
Greg Clayton238c0a12010-09-18 01:14:36 +0000735uint32_t
736SBDebugger::GetTerminalWidth () const
737{
738 if (m_opaque_sp)
739 return m_opaque_sp->GetTerminalWidth ();
740 return 0;
741}
742
743void
744SBDebugger::SetTerminalWidth (uint32_t term_width)
745{
746 if (m_opaque_sp)
747 m_opaque_sp->SetTerminalWidth (term_width);
748}
749
750const char *
751SBDebugger::GetPrompt() const
752{
Caroline Tice7826c882010-10-26 03:11:13 +0000753 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
754
755 if (log)
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000756 log->Printf ("SBDebugger::GetPrompt (this.sp=%p) => '%s'", m_opaque_sp.get(),
757 (m_opaque_sp ? m_opaque_sp->GetPrompt() : ""));
Caroline Tice7826c882010-10-26 03:11:13 +0000758
Greg Clayton238c0a12010-09-18 01:14:36 +0000759 if (m_opaque_sp)
760 return m_opaque_sp->GetPrompt ();
761 return 0;
762}
763
764void
765SBDebugger::SetPrompt (const char *prompt)
766{
767 if (m_opaque_sp)
768 m_opaque_sp->SetPrompt (prompt);
769}
770
771
772lldb::ScriptLanguage
773SBDebugger::GetScriptLanguage() const
774{
775 if (m_opaque_sp)
776 return m_opaque_sp->GetScriptLanguage ();
777 return eScriptLanguageNone;
778}
779
780void
781SBDebugger::SetScriptLanguage (lldb::ScriptLanguage script_lang)
782{
783 if (m_opaque_sp)
784 m_opaque_sp->SetScriptLanguage (script_lang);
785}
786
787
788
789
Jim Ingham74989e82010-08-30 19:44:40 +0000790bool
791SBDebugger::SetUseExternalEditor (bool value)
792{
793 if (m_opaque_sp)
794 return m_opaque_sp->SetUseExternalEditor (value);
795 else
796 return false;
797}
798
799bool
Caroline Tice5bc8c972010-09-20 20:44:43 +0000800SBDebugger::GetUseExternalEditor ()
Jim Ingham74989e82010-08-30 19:44:40 +0000801{
802 if (m_opaque_sp)
Caroline Tice5bc8c972010-09-20 20:44:43 +0000803 return m_opaque_sp->GetUseExternalEditor ();
Jim Ingham74989e82010-08-30 19:44:40 +0000804 else
805 return false;
806}
807
Caroline Tice98f930f2010-09-20 05:20:02 +0000808bool
809SBDebugger::GetDescription (SBStream &description)
810{
811 if (m_opaque_sp)
812 {
813 const char *name = m_opaque_sp->GetInstanceName().AsCString();
814 lldb::user_id_t id = m_opaque_sp->GetID();
815 description.Printf ("Debugger (instance: '%s', id: %d)", name, id);
816 }
817 else
818 description.Printf ("No value");
819
820 return true;
821}