blob: a0aa1257571ecad7de61711181d1429de4998806 [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)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +000060 log->Printf ("SBDebugger(%p)::Clear ()", m_opaque_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +000061
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
Greg Clayton63094e02010-06-23 01:19:29 +000070 SBDebugger debugger;
71 debugger.reset(Debugger::CreateInstance());
Caroline Tice7826c882010-10-26 03:11:13 +000072
73 if (log)
74 {
75 SBStream sstr;
76 debugger.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +000077 log->Printf ("SBDebugger::Create () => SBDebugger(%p): %s", debugger.m_opaque_sp.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +000078 }
79
Greg Clayton63094e02010-06-23 01:19:29 +000080 return debugger;
81}
82
Greg Clayton63094e02010-06-23 01:19:29 +000083SBDebugger::SBDebugger () :
84 m_opaque_sp ()
85{
86}
87
88SBDebugger::~SBDebugger ()
89{
90}
91
92bool
93SBDebugger::IsValid() const
94{
95 return m_opaque_sp.get() != NULL;
96}
97
98
Chris Lattner24943d22010-06-08 16:52:24 +000099void
100SBDebugger::SetAsync (bool b)
101{
Greg Clayton63094e02010-06-23 01:19:29 +0000102 if (m_opaque_sp)
103 m_opaque_sp->SetAsyncExecution(b);
Chris Lattner24943d22010-06-08 16:52:24 +0000104}
105
Greg Clayton887aa282010-10-11 01:05:37 +0000106void
107SBDebugger::SkipLLDBInitFiles (bool b)
108{
109 if (m_opaque_sp)
110 m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles (b);
111}
112
Chris Lattner24943d22010-06-08 16:52:24 +0000113// Shouldn't really be settable after initialization as this could cause lots of problems; don't want users
114// trying to switch modes in the middle of a debugging session.
115void
116SBDebugger::SetInputFileHandle (FILE *fh, bool transfer_ownership)
117{
Caroline Tice7826c882010-10-26 03:11:13 +0000118 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
119
120 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000121 log->Printf ("SBDebugger(%p)::SetInputFileHandle (fh=%p, transfer_ownership='%s')", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000122 fh, (transfer_ownership ? "true" : "false"));
Caroline Tice7826c882010-10-26 03:11:13 +0000123
Greg Clayton63094e02010-06-23 01:19:29 +0000124 if (m_opaque_sp)
125 m_opaque_sp->SetInputFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000126}
127
128void
129SBDebugger::SetOutputFileHandle (FILE *fh, bool transfer_ownership)
130{
Caroline Tice7826c882010-10-26 03:11:13 +0000131 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
132
133
134 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000135 log->Printf ("SBDebugger(%p)::SetOutputFileHandle (fh=%p, transfer_ownership='%s')", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000136 fh, (transfer_ownership ? "true" : "false"));
Caroline Tice7826c882010-10-26 03:11:13 +0000137
Greg Clayton63094e02010-06-23 01:19:29 +0000138 if (m_opaque_sp)
139 m_opaque_sp->SetOutputFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000140}
141
142void
143SBDebugger::SetErrorFileHandle (FILE *fh, bool transfer_ownership)
144{
Caroline Tice7826c882010-10-26 03:11:13 +0000145 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
146
147
148 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000149 log->Printf ("SBDebugger(%p)::SetErrorFileHandle (fh=%p, transfer_ownership='%s')", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000150 fh, (transfer_ownership ? "true" : "false"));
Caroline Tice7826c882010-10-26 03:11:13 +0000151
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
Greg Clayton63094e02010-06-23 01:19:29 +0000185 SBCommandInterpreter sb_interpreter;
186 if (m_opaque_sp)
187 sb_interpreter.reset (&m_opaque_sp->GetCommandInterpreter());
Caroline Tice7826c882010-10-26 03:11:13 +0000188
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000189 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000190 log->Printf ("SBDebugger(%p)::GetCommandInterpreter () => SBCommandInterpreter(%p)",
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000191 m_opaque_sp.get(), sb_interpreter.get());
192
Chris Lattner24943d22010-06-08 16:52:24 +0000193 return sb_interpreter;
194}
195
196void
197SBDebugger::HandleCommand (const char *command)
198{
Greg Clayton63094e02010-06-23 01:19:29 +0000199 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000200 {
Greg Clayton63094e02010-06-23 01:19:29 +0000201 SBCommandInterpreter sb_interpreter(GetCommandInterpreter ());
202 SBCommandReturnObject result;
203
204 sb_interpreter.HandleCommand (command, result, false);
205
206 if (GetErrorFileHandle() != NULL)
207 result.PutError (GetErrorFileHandle());
208 if (GetOutputFileHandle() != NULL)
209 result.PutOutput (GetOutputFileHandle());
210
211 if (m_opaque_sp->GetAsyncExecution() == false)
Chris Lattner24943d22010-06-08 16:52:24 +0000212 {
Greg Clayton63094e02010-06-23 01:19:29 +0000213 SBProcess process(GetCommandInterpreter().GetProcess ());
214 if (process.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000215 {
Greg Clayton63094e02010-06-23 01:19:29 +0000216 EventSP event_sp;
217 Listener &lldb_listener = m_opaque_sp->GetListener();
218 while (lldb_listener.GetNextEventForBroadcaster (process.get(), event_sp))
219 {
220 SBEvent event(event_sp);
221 HandleProcessEvent (process, event, GetOutputFileHandle(), GetErrorFileHandle());
222 }
Chris Lattner24943d22010-06-08 16:52:24 +0000223 }
224 }
225 }
226}
227
228SBListener
229SBDebugger::GetListener ()
230{
Caroline Tice7826c882010-10-26 03:11:13 +0000231 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
232
Greg Clayton63094e02010-06-23 01:19:29 +0000233 SBListener sb_listener;
234 if (m_opaque_sp)
235 sb_listener.reset(&m_opaque_sp->GetListener(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000236
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000237 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000238 log->Printf ("SBDebugger(%p)::GetListener () => SBListener(%p)", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000239 sb_listener.get());
240
Chris Lattner24943d22010-06-08 16:52:24 +0000241 return sb_listener;
242}
243
244void
245SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, FILE *out, FILE *err)
246{
247 const uint32_t event_type = event.GetType();
248 char stdio_buffer[1024];
249 size_t len;
250
251 if (event_type & Process::eBroadcastBitSTDOUT)
252 {
253 while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
254 if (out != NULL)
255 ::fwrite (stdio_buffer, 1, len, out);
256 }
257 else if (event_type & Process::eBroadcastBitSTDERR)
258 {
259 while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
260 if (out != NULL)
261 ::fwrite (stdio_buffer, 1, len, out);
262 }
263 else if (event_type & Process::eBroadcastBitStateChanged)
264 {
265 // Drain any stdout messages.
266 while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
267 if (out != NULL)
268 ::fwrite (stdio_buffer, 1, len, out);
269
270 // Drain any stderr messages.
271 while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
272 if (out != NULL)
273 ::fwrite (stdio_buffer, 1, len, out);
274
275 StateType event_state = SBProcess::GetStateFromEvent (event);
276
277 if (event_state == eStateInvalid)
278 return;
279
280 bool is_stopped = StateIsStoppedState (event_state);
281 if (!is_stopped)
Jim Inghamc8332952010-08-26 21:32:51 +0000282 process.ReportEventState (event, out);
Chris Lattner24943d22010-06-08 16:52:24 +0000283 }
284}
285
286void
Jim Inghamc8332952010-08-26 21:32:51 +0000287SBDebugger::UpdateSelectedThread (SBProcess &process)
Chris Lattner24943d22010-06-08 16:52:24 +0000288{
289 if (process.IsValid())
290 {
Jim Inghamc8332952010-08-26 21:32:51 +0000291 SBThread curr_thread = process.GetSelectedThread ();
Chris Lattner24943d22010-06-08 16:52:24 +0000292 SBThread thread;
293 StopReason curr_thread_stop_reason = eStopReasonInvalid;
294 if (curr_thread.IsValid())
295 {
296 if (curr_thread.GetStopReason() != eStopReasonInvalid)
297 curr_thread_stop_reason = curr_thread.GetStopReason ();
298 }
299
300 if (! curr_thread.IsValid()
301 || curr_thread_stop_reason == eStopReasonInvalid
302 || curr_thread_stop_reason == eStopReasonNone)
303 {
304 // Prefer a thread that has just completed its plan over another thread as current thread.
305 SBThread plan_thread;
306 SBThread other_thread;
307 const size_t num_threads = process.GetNumThreads ();
308 size_t i;
309 for (i = 0; i < num_threads; ++i)
310 {
311 thread = process.GetThreadAtIndex(i);
312 if (thread.GetStopReason () != eStopReasonInvalid)
313 {
314 switch (thread.GetStopReason ())
315 {
316 default:
317 case eStopReasonInvalid:
318 case eStopReasonNone:
319 break;
320
321 case eStopReasonTrace:
322 case eStopReasonBreakpoint:
323 case eStopReasonWatchpoint:
324 case eStopReasonSignal:
325 case eStopReasonException:
326 if (! other_thread.IsValid())
327 other_thread = thread;
328 break;
329 case eStopReasonPlanComplete:
330 if (! plan_thread.IsValid())
331 plan_thread = thread;
332 break;
333 }
334 }
335 }
336 if (plan_thread.IsValid())
Jim Inghamc8332952010-08-26 21:32:51 +0000337 process.SetSelectedThreadByID (plan_thread.GetThreadID());
Chris Lattner24943d22010-06-08 16:52:24 +0000338 else if (other_thread.IsValid())
Jim Inghamc8332952010-08-26 21:32:51 +0000339 process.SetSelectedThreadByID (other_thread.GetThreadID());
Chris Lattner24943d22010-06-08 16:52:24 +0000340 else
341 {
342 if (curr_thread.IsValid())
343 thread = curr_thread;
344 else
345 thread = process.GetThreadAtIndex(0);
346
347 if (thread.IsValid())
Jim Inghamc8332952010-08-26 21:32:51 +0000348 process.SetSelectedThreadByID (thread.GetThreadID());
Chris Lattner24943d22010-06-08 16:52:24 +0000349 }
350 }
351 }
352}
353
Chris Lattner24943d22010-06-08 16:52:24 +0000354SBSourceManager &
355SBDebugger::GetSourceManager ()
356{
357 static SourceManager g_lldb_source_manager;
358 static SBSourceManager g_sb_source_manager (g_lldb_source_manager);
359 return g_sb_source_manager;
360}
361
362
363bool
364SBDebugger::GetDefaultArchitecture (char *arch_name, size_t arch_name_len)
365{
366 if (arch_name && arch_name_len)
367 {
Caroline Tice5bc8c972010-09-20 20:44:43 +0000368 ArchSpec default_arch = lldb_private::Target::GetDefaultArchitecture ();
369
Chris Lattner24943d22010-06-08 16:52:24 +0000370 if (default_arch.IsValid())
371 {
372 ::snprintf (arch_name, arch_name_len, "%s", default_arch.AsCString());
373 return true;
374 }
375 }
376 if (arch_name && arch_name_len)
377 arch_name[0] = '\0';
378 return false;
379}
380
381
382bool
383SBDebugger::SetDefaultArchitecture (const char *arch_name)
384{
385 if (arch_name)
386 {
387 ArchSpec arch (arch_name);
388 if (arch.IsValid())
389 {
Caroline Tice5bc8c972010-09-20 20:44:43 +0000390 lldb_private::Target::SetDefaultArchitecture (arch);
Chris Lattner24943d22010-06-08 16:52:24 +0000391 return true;
392 }
393 }
394 return false;
395}
396
397ScriptLanguage
398SBDebugger::GetScriptingLanguage (const char *script_language_name)
399{
400 return Args::StringToScriptLanguage (script_language_name,
401 eScriptLanguageDefault,
402 NULL);
403}
Chris Lattner24943d22010-06-08 16:52:24 +0000404
405const char *
406SBDebugger::GetVersionString ()
407{
408 return lldb_private::GetVersion();
409}
410
411const char *
412SBDebugger::StateAsCString (lldb::StateType state)
413{
414 return lldb_private::StateAsCString (state);
415}
416
417bool
418SBDebugger::StateIsRunningState (lldb::StateType state)
419{
Greg Claytona66ba462010-10-30 04:51:46 +0000420 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
421
422 const bool result = lldb_private::StateIsRunningState (state);
423 if (log)
424 log->Printf ("SBDebugger::StateIsRunningState (state=%s) => %i",
425 lldb_private::StateAsCString (state), result);
426
427 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000428}
429
430bool
431SBDebugger::StateIsStoppedState (lldb::StateType state)
432{
Caroline Tice7826c882010-10-26 03:11:13 +0000433 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
434
Greg Claytona66ba462010-10-30 04:51:46 +0000435 const bool result = lldb_private::StateIsStoppedState (state);
Caroline Tice7826c882010-10-26 03:11:13 +0000436 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000437 log->Printf ("SBDebugger::StateIsStoppedState (state=%s) => %i",
438 lldb_private::StateAsCString (state), result);
Caroline Tice7826c882010-10-26 03:11:13 +0000439
Greg Claytona66ba462010-10-30 04:51:46 +0000440 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000441}
442
443
444SBTarget
445SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename,
446 const char *target_triple)
447{
Greg Clayton63094e02010-06-23 01:19:29 +0000448 SBTarget target;
449 if (m_opaque_sp)
450 {
451 ArchSpec arch;
Greg Clayton537a7a82010-10-20 20:54:39 +0000452 FileSpec file_spec (filename, true);
Greg Clayton63094e02010-06-23 01:19:29 +0000453 arch.SetArchFromTargetTriple(target_triple);
454 TargetSP target_sp;
455 Error error (m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file_spec, arch, NULL, true, target_sp));
456 target.reset (target_sp);
457 }
Greg Claytona66ba462010-10-30 04:51:46 +0000458
459 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
460 if (log)
461 {
462 log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndTargetTriple (filename='%s', tiple = %s) => SBTarget(%p)",
463 m_opaque_sp.get(), filename, target_triple, target.get());
464 }
465
Chris Lattner24943d22010-06-08 16:52:24 +0000466 return target;
467}
468
469SBTarget
470SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *archname)
471{
Caroline Tice7826c882010-10-26 03:11:13 +0000472 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
473
Greg Clayton63094e02010-06-23 01:19:29 +0000474 SBTarget target;
475 if (m_opaque_sp)
476 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000477 FileSpec file (filename, true);
Caroline Tice5bc8c972010-09-20 20:44:43 +0000478 ArchSpec arch = lldb_private::Target::GetDefaultArchitecture ();
Greg Clayton63094e02010-06-23 01:19:29 +0000479 TargetSP target_sp;
480 Error error;
Chris Lattner24943d22010-06-08 16:52:24 +0000481
Greg Clayton63094e02010-06-23 01:19:29 +0000482 if (archname != NULL)
483 {
484 ArchSpec arch2 (archname);
485 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch2, NULL, true, target_sp);
486 }
487 else
488 {
489 if (!arch.IsValid())
490 arch = LLDB_ARCH_DEFAULT;
491
492 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
493
494 if (error.Fail())
495 {
496 if (arch == LLDB_ARCH_DEFAULT_32BIT)
497 arch = LLDB_ARCH_DEFAULT_64BIT;
498 else
499 arch = LLDB_ARCH_DEFAULT_32BIT;
500
501 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
502 }
503 }
504
505 if (error.Success())
506 {
Jim Inghamc8332952010-08-26 21:32:51 +0000507 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Clayton63094e02010-06-23 01:19:29 +0000508 target.reset(target_sp);
509 }
Chris Lattner24943d22010-06-08 16:52:24 +0000510 }
Caroline Tice7826c882010-10-26 03:11:13 +0000511
512 if (log)
513 {
Greg Claytona66ba462010-10-30 04:51:46 +0000514 log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndArch (filename='%s', arch = %s) => SBTarget(%p)",
515 m_opaque_sp.get(), filename, archname, target.get());
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 Claytona66ba462010-10-30 04:51:46 +0000553 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
554 if (log)
555 {
556 log->Printf ("SBDebugger(%p)::CreateTarget (filename='%s') => SBTarget(%p)",
557 m_opaque_sp.get(), filename, target.get());
558 }
Greg Clayton63094e02010-06-23 01:19:29 +0000559 return target;
Chris Lattner24943d22010-06-08 16:52:24 +0000560}
561
562SBTarget
563SBDebugger::GetTargetAtIndex (uint32_t idx)
564{
Greg Clayton63094e02010-06-23 01:19:29 +0000565 SBTarget sb_target;
566 if (m_opaque_sp)
567 sb_target.reset(m_opaque_sp->GetTargetList().GetTargetAtIndex (idx));
Chris Lattner24943d22010-06-08 16:52:24 +0000568 return sb_target;
569}
570
571SBTarget
572SBDebugger::FindTargetWithProcessID (pid_t pid)
573{
Greg Clayton63094e02010-06-23 01:19:29 +0000574 SBTarget sb_target;
575 if (m_opaque_sp)
576 sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid));
Chris Lattner24943d22010-06-08 16:52:24 +0000577 return sb_target;
578}
579
580SBTarget
581SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name)
582{
Greg Clayton63094e02010-06-23 01:19:29 +0000583 SBTarget sb_target;
584 if (m_opaque_sp && filename && filename[0])
585 {
586 ArchSpec arch;
587 if (arch_name)
588 arch.SetArch(arch_name);
Greg Clayton537a7a82010-10-20 20:54:39 +0000589 TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename, false), arch_name ? &arch : NULL));
Greg Clayton63094e02010-06-23 01:19:29 +0000590 sb_target.reset(target_sp);
591 }
592 return sb_target;
Chris Lattner24943d22010-06-08 16:52:24 +0000593}
594
595SBTarget
596SBDebugger::FindTargetWithLLDBProcess (const lldb::ProcessSP &process_sp)
597{
Greg Clayton63094e02010-06-23 01:19:29 +0000598 SBTarget sb_target;
599 if (m_opaque_sp)
600 sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get()));
Chris Lattner24943d22010-06-08 16:52:24 +0000601 return sb_target;
602}
603
604
605uint32_t
606SBDebugger::GetNumTargets ()
607{
Greg Clayton63094e02010-06-23 01:19:29 +0000608 if (m_opaque_sp)
609 return m_opaque_sp->GetTargetList().GetNumTargets ();
610 return 0;
611}
Chris Lattner24943d22010-06-08 16:52:24 +0000612
613SBTarget
Jim Inghamc8332952010-08-26 21:32:51 +0000614SBDebugger::GetSelectedTarget ()
Chris Lattner24943d22010-06-08 16:52:24 +0000615{
Caroline Tice7826c882010-10-26 03:11:13 +0000616 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
617
Greg Clayton63094e02010-06-23 01:19:29 +0000618 SBTarget sb_target;
619 if (m_opaque_sp)
Jim Inghamc8332952010-08-26 21:32:51 +0000620 sb_target.reset(m_opaque_sp->GetTargetList().GetSelectedTarget ());
Caroline Tice7826c882010-10-26 03:11:13 +0000621
622 if (log)
623 {
624 SBStream sstr;
625 sb_target.GetDescription (sstr, lldb::eDescriptionLevelBrief);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000626 log->Printf ("SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000627 sb_target.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000628 }
629
Chris Lattner24943d22010-06-08 16:52:24 +0000630 return sb_target;
631}
632
633void
634SBDebugger::DispatchInput (void *baton, const void *data, size_t data_len)
635{
Caroline Tice7826c882010-10-26 03:11:13 +0000636 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
637
638 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000639 log->Printf ("SBDebugger(%p)::DispatchInput (baton=%p, data='%s', size_t=%d)", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000640 baton, (const char *) data, (uint32_t) data_len);
Caroline Tice7826c882010-10-26 03:11:13 +0000641
Greg Clayton63094e02010-06-23 01:19:29 +0000642 if (m_opaque_sp)
643 m_opaque_sp->DispatchInput ((const char *) data, data_len);
Chris Lattner24943d22010-06-08 16:52:24 +0000644}
645
646void
647SBDebugger::PushInputReader (SBInputReader &reader)
648{
Caroline Tice7826c882010-10-26 03:11:13 +0000649 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
650
651 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000652 log->Printf ("SBDebugger(%p)::PushInputReader (SBInputReader(%p))", m_opaque_sp.get(), &reader);
Caroline Tice7826c882010-10-26 03:11:13 +0000653
Greg Clayton63094e02010-06-23 01:19:29 +0000654 if (m_opaque_sp && reader.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000655 {
656 InputReaderSP reader_sp(*reader);
Greg Clayton63094e02010-06-23 01:19:29 +0000657 m_opaque_sp->PushInputReader (reader_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000658 }
659}
Greg Clayton63094e02010-06-23 01:19:29 +0000660
661void
662SBDebugger::reset (const lldb::DebuggerSP &debugger_sp)
663{
664 m_opaque_sp = debugger_sp;
665}
666
667Debugger *
668SBDebugger::get () const
669{
670 return m_opaque_sp.get();
671}
672
673Debugger &
674SBDebugger::ref () const
675{
676 assert (m_opaque_sp.get());
677 return *m_opaque_sp;
678}
679
680
Caroline Tice558be582010-06-30 16:22:25 +0000681SBDebugger
682SBDebugger::FindDebuggerWithID (int id)
683{
684 SBDebugger sb_debugger;
685 lldb::DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id);
686 if (debugger_sp)
687 sb_debugger.reset (debugger_sp);
688 return sb_debugger;
689}
Jim Ingham74989e82010-08-30 19:44:40 +0000690
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000691const char *
692SBDebugger::GetInstanceName()
693{
694 if (m_opaque_sp)
695 return m_opaque_sp->GetInstanceName().AsCString();
696 else
697 return NULL;
698}
699
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000700SBError
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000701SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000702{
703 lldb::UserSettingsControllerSP root_settings_controller = lldb_private::Debugger::GetSettingsController();
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000704
Caroline Tice1ebef442010-09-27 00:30:10 +0000705 Error err = root_settings_controller->SetVariable (var_name, value, lldb::eVarSetOperationAssign, true,
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000706 debugger_instance_name);
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000707 SBError sb_error;
708 sb_error.SetError (err);
709
710 return sb_error;
711}
712
713lldb::SBStringList
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000714SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000715{
716 SBStringList ret_value;
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000717 lldb::SettableVariableType var_type;
Caroline Tice5bc8c972010-09-20 20:44:43 +0000718 lldb_private:Error err;
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000719
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000720 lldb::UserSettingsControllerSP root_settings_controller = lldb_private::Debugger::GetSettingsController();
721
Caroline Tice5bc8c972010-09-20 20:44:43 +0000722 StringList value = root_settings_controller->GetVariable (var_name, var_type, debugger_instance_name, err);
723
724 if (err.Success())
725 {
726 for (unsigned i = 0; i != value.GetSize(); ++i)
727 ret_value.AppendString (value.GetStringAtIndex(i));
728 }
729 else
730 {
731 ret_value.AppendString (err.AsCString());
732 }
733
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000734
735 return ret_value;
736}
737
Greg Clayton238c0a12010-09-18 01:14:36 +0000738uint32_t
739SBDebugger::GetTerminalWidth () const
740{
741 if (m_opaque_sp)
742 return m_opaque_sp->GetTerminalWidth ();
743 return 0;
744}
745
746void
747SBDebugger::SetTerminalWidth (uint32_t term_width)
748{
749 if (m_opaque_sp)
750 m_opaque_sp->SetTerminalWidth (term_width);
751}
752
753const char *
754SBDebugger::GetPrompt() const
755{
Caroline Tice7826c882010-10-26 03:11:13 +0000756 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
757
758 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000759 log->Printf ("SBDebugger(%p)::GetPrompt () => '%s'", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000760 (m_opaque_sp ? m_opaque_sp->GetPrompt() : ""));
Caroline Tice7826c882010-10-26 03:11:13 +0000761
Greg Clayton238c0a12010-09-18 01:14:36 +0000762 if (m_opaque_sp)
763 return m_opaque_sp->GetPrompt ();
764 return 0;
765}
766
767void
768SBDebugger::SetPrompt (const char *prompt)
769{
770 if (m_opaque_sp)
771 m_opaque_sp->SetPrompt (prompt);
772}
773
774
775lldb::ScriptLanguage
776SBDebugger::GetScriptLanguage() const
777{
778 if (m_opaque_sp)
779 return m_opaque_sp->GetScriptLanguage ();
780 return eScriptLanguageNone;
781}
782
783void
784SBDebugger::SetScriptLanguage (lldb::ScriptLanguage script_lang)
785{
786 if (m_opaque_sp)
787 m_opaque_sp->SetScriptLanguage (script_lang);
788}
789
790
791
792
Jim Ingham74989e82010-08-30 19:44:40 +0000793bool
794SBDebugger::SetUseExternalEditor (bool value)
795{
796 if (m_opaque_sp)
797 return m_opaque_sp->SetUseExternalEditor (value);
798 else
799 return false;
800}
801
802bool
Caroline Tice5bc8c972010-09-20 20:44:43 +0000803SBDebugger::GetUseExternalEditor ()
Jim Ingham74989e82010-08-30 19:44:40 +0000804{
805 if (m_opaque_sp)
Caroline Tice5bc8c972010-09-20 20:44:43 +0000806 return m_opaque_sp->GetUseExternalEditor ();
Jim Ingham74989e82010-08-30 19:44:40 +0000807 else
808 return false;
809}
810
Caroline Tice98f930f2010-09-20 05:20:02 +0000811bool
812SBDebugger::GetDescription (SBStream &description)
813{
814 if (m_opaque_sp)
815 {
816 const char *name = m_opaque_sp->GetInstanceName().AsCString();
817 lldb::user_id_t id = m_opaque_sp->GetID();
818 description.Printf ("Debugger (instance: '%s', id: %d)", name, id);
819 }
820 else
821 description.Printf ("No value");
822
823 return true;
824}