blob: 0987ff9c92c7d06b3a4a94044618dae2d5c60943 [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{
Caroline Tice7826c882010-10-26 03:11:13 +0000414 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
415
416 if (log)
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000417 log->Printf ("SBDebugger::StateAsCString (state=%d) => '%s'", state,
418 lldb_private::StateAsCString (state));
Caroline Tice7826c882010-10-26 03:11:13 +0000419
Chris Lattner24943d22010-06-08 16:52:24 +0000420 return lldb_private::StateAsCString (state);
421}
422
423bool
424SBDebugger::StateIsRunningState (lldb::StateType state)
425{
426 return lldb_private::StateIsRunningState (state);
427}
428
429bool
430SBDebugger::StateIsStoppedState (lldb::StateType state)
431{
Caroline Tice7826c882010-10-26 03:11:13 +0000432 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
433
434 if (log)
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000435 log->Printf ("SBDebugger::StateIsStoppedState (state=%d) => '%s'", state,
Caroline Tice7826c882010-10-26 03:11:13 +0000436 (lldb_private::StateIsStoppedState (state) ? "true" : "false"));
437
Chris Lattner24943d22010-06-08 16:52:24 +0000438 return lldb_private::StateIsStoppedState (state);
439}
440
441
442SBTarget
443SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename,
444 const char *target_triple)
445{
Greg Clayton63094e02010-06-23 01:19:29 +0000446 SBTarget target;
447 if (m_opaque_sp)
448 {
449 ArchSpec arch;
Greg Clayton537a7a82010-10-20 20:54:39 +0000450 FileSpec file_spec (filename, true);
Greg Clayton63094e02010-06-23 01:19:29 +0000451 arch.SetArchFromTargetTriple(target_triple);
452 TargetSP target_sp;
453 Error error (m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file_spec, arch, NULL, true, target_sp));
454 target.reset (target_sp);
455 }
Chris Lattner24943d22010-06-08 16:52:24 +0000456 return target;
457}
458
459SBTarget
460SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *archname)
461{
Caroline Tice7826c882010-10-26 03:11:13 +0000462 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
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);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000506 log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndArch (filename='%s', arcname='%s') "
507 "=> SBTarget(%p): %s", m_opaque_sp.get(), filename, archname, target.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000508 sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000509 }
510
Greg Clayton63094e02010-06-23 01:19:29 +0000511 return target;
512}
513
514SBTarget
515SBDebugger::CreateTarget (const char *filename)
516{
517 SBTarget target;
518 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000519 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000520 FileSpec file (filename, true);
Caroline Tice5bc8c972010-09-20 20:44:43 +0000521 ArchSpec arch = lldb_private::Target::GetDefaultArchitecture ();
Greg Clayton63094e02010-06-23 01:19:29 +0000522 TargetSP target_sp;
523 Error error;
524
Chris Lattner24943d22010-06-08 16:52:24 +0000525 if (!arch.IsValid())
526 arch = LLDB_ARCH_DEFAULT;
527
Greg Clayton63094e02010-06-23 01:19:29 +0000528 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000529
530 if (error.Fail())
531 {
532 if (arch == LLDB_ARCH_DEFAULT_32BIT)
533 arch = LLDB_ARCH_DEFAULT_64BIT;
534 else
535 arch = LLDB_ARCH_DEFAULT_32BIT;
536
Greg Clayton63094e02010-06-23 01:19:29 +0000537 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
538 }
539
540 if (error.Success())
541 {
Jim Inghamc8332952010-08-26 21:32:51 +0000542 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Clayton63094e02010-06-23 01:19:29 +0000543 target.reset (target_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000544 }
545 }
Greg Clayton63094e02010-06-23 01:19:29 +0000546 return target;
Chris Lattner24943d22010-06-08 16:52:24 +0000547}
548
549SBTarget
550SBDebugger::GetTargetAtIndex (uint32_t idx)
551{
Greg Clayton63094e02010-06-23 01:19:29 +0000552 SBTarget sb_target;
553 if (m_opaque_sp)
554 sb_target.reset(m_opaque_sp->GetTargetList().GetTargetAtIndex (idx));
Chris Lattner24943d22010-06-08 16:52:24 +0000555 return sb_target;
556}
557
558SBTarget
559SBDebugger::FindTargetWithProcessID (pid_t pid)
560{
Greg Clayton63094e02010-06-23 01:19:29 +0000561 SBTarget sb_target;
562 if (m_opaque_sp)
563 sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid));
Chris Lattner24943d22010-06-08 16:52:24 +0000564 return sb_target;
565}
566
567SBTarget
568SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name)
569{
Greg Clayton63094e02010-06-23 01:19:29 +0000570 SBTarget sb_target;
571 if (m_opaque_sp && filename && filename[0])
572 {
573 ArchSpec arch;
574 if (arch_name)
575 arch.SetArch(arch_name);
Greg Clayton537a7a82010-10-20 20:54:39 +0000576 TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename, false), arch_name ? &arch : NULL));
Greg Clayton63094e02010-06-23 01:19:29 +0000577 sb_target.reset(target_sp);
578 }
579 return sb_target;
Chris Lattner24943d22010-06-08 16:52:24 +0000580}
581
582SBTarget
583SBDebugger::FindTargetWithLLDBProcess (const lldb::ProcessSP &process_sp)
584{
Greg Clayton63094e02010-06-23 01:19:29 +0000585 SBTarget sb_target;
586 if (m_opaque_sp)
587 sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get()));
Chris Lattner24943d22010-06-08 16:52:24 +0000588 return sb_target;
589}
590
591
592uint32_t
593SBDebugger::GetNumTargets ()
594{
Greg Clayton63094e02010-06-23 01:19:29 +0000595 if (m_opaque_sp)
596 return m_opaque_sp->GetTargetList().GetNumTargets ();
597 return 0;
598}
Chris Lattner24943d22010-06-08 16:52:24 +0000599
600SBTarget
Jim Inghamc8332952010-08-26 21:32:51 +0000601SBDebugger::GetSelectedTarget ()
Chris Lattner24943d22010-06-08 16:52:24 +0000602{
Caroline Tice7826c882010-10-26 03:11:13 +0000603 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
604
Greg Clayton63094e02010-06-23 01:19:29 +0000605 SBTarget sb_target;
606 if (m_opaque_sp)
Jim Inghamc8332952010-08-26 21:32:51 +0000607 sb_target.reset(m_opaque_sp->GetTargetList().GetSelectedTarget ());
Caroline Tice7826c882010-10-26 03:11:13 +0000608
609 if (log)
610 {
611 SBStream sstr;
612 sb_target.GetDescription (sstr, lldb::eDescriptionLevelBrief);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000613 log->Printf ("SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000614 sb_target.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000615 }
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)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000626 log->Printf ("SBDebugger(%p)::DispatchInput (baton=%p, data='%s', size_t=%d)", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000627 baton, (const char *) data, (uint32_t) data_len);
Caroline Tice7826c882010-10-26 03:11:13 +0000628
Greg Clayton63094e02010-06-23 01:19:29 +0000629 if (m_opaque_sp)
630 m_opaque_sp->DispatchInput ((const char *) data, data_len);
Chris Lattner24943d22010-06-08 16:52:24 +0000631}
632
633void
634SBDebugger::PushInputReader (SBInputReader &reader)
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)::PushInputReader (SBInputReader(%p))", m_opaque_sp.get(), &reader);
Caroline Tice7826c882010-10-26 03:11:13 +0000640
Greg Clayton63094e02010-06-23 01:19:29 +0000641 if (m_opaque_sp && reader.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000642 {
643 InputReaderSP reader_sp(*reader);
Greg Clayton63094e02010-06-23 01:19:29 +0000644 m_opaque_sp->PushInputReader (reader_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000645 }
646}
Greg Clayton63094e02010-06-23 01:19:29 +0000647
648void
649SBDebugger::reset (const lldb::DebuggerSP &debugger_sp)
650{
651 m_opaque_sp = debugger_sp;
652}
653
654Debugger *
655SBDebugger::get () const
656{
657 return m_opaque_sp.get();
658}
659
660Debugger &
661SBDebugger::ref () const
662{
663 assert (m_opaque_sp.get());
664 return *m_opaque_sp;
665}
666
667
Caroline Tice558be582010-06-30 16:22:25 +0000668SBDebugger
669SBDebugger::FindDebuggerWithID (int id)
670{
671 SBDebugger sb_debugger;
672 lldb::DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id);
673 if (debugger_sp)
674 sb_debugger.reset (debugger_sp);
675 return sb_debugger;
676}
Jim Ingham74989e82010-08-30 19:44:40 +0000677
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000678const char *
679SBDebugger::GetInstanceName()
680{
681 if (m_opaque_sp)
682 return m_opaque_sp->GetInstanceName().AsCString();
683 else
684 return NULL;
685}
686
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000687SBError
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000688SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000689{
690 lldb::UserSettingsControllerSP root_settings_controller = lldb_private::Debugger::GetSettingsController();
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000691
Caroline Tice1ebef442010-09-27 00:30:10 +0000692 Error err = root_settings_controller->SetVariable (var_name, value, lldb::eVarSetOperationAssign, true,
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000693 debugger_instance_name);
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000694 SBError sb_error;
695 sb_error.SetError (err);
696
697 return sb_error;
698}
699
700lldb::SBStringList
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000701SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000702{
703 SBStringList ret_value;
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000704 lldb::SettableVariableType var_type;
Caroline Tice5bc8c972010-09-20 20:44:43 +0000705 lldb_private:Error err;
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000706
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000707 lldb::UserSettingsControllerSP root_settings_controller = lldb_private::Debugger::GetSettingsController();
708
Caroline Tice5bc8c972010-09-20 20:44:43 +0000709 StringList value = root_settings_controller->GetVariable (var_name, var_type, debugger_instance_name, err);
710
711 if (err.Success())
712 {
713 for (unsigned i = 0; i != value.GetSize(); ++i)
714 ret_value.AppendString (value.GetStringAtIndex(i));
715 }
716 else
717 {
718 ret_value.AppendString (err.AsCString());
719 }
720
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000721
722 return ret_value;
723}
724
Greg Clayton238c0a12010-09-18 01:14:36 +0000725uint32_t
726SBDebugger::GetTerminalWidth () const
727{
728 if (m_opaque_sp)
729 return m_opaque_sp->GetTerminalWidth ();
730 return 0;
731}
732
733void
734SBDebugger::SetTerminalWidth (uint32_t term_width)
735{
736 if (m_opaque_sp)
737 m_opaque_sp->SetTerminalWidth (term_width);
738}
739
740const char *
741SBDebugger::GetPrompt() const
742{
Caroline Tice7826c882010-10-26 03:11:13 +0000743 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
744
745 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000746 log->Printf ("SBDebugger(%p)::GetPrompt () => '%s'", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000747 (m_opaque_sp ? m_opaque_sp->GetPrompt() : ""));
Caroline Tice7826c882010-10-26 03:11:13 +0000748
Greg Clayton238c0a12010-09-18 01:14:36 +0000749 if (m_opaque_sp)
750 return m_opaque_sp->GetPrompt ();
751 return 0;
752}
753
754void
755SBDebugger::SetPrompt (const char *prompt)
756{
757 if (m_opaque_sp)
758 m_opaque_sp->SetPrompt (prompt);
759}
760
761
762lldb::ScriptLanguage
763SBDebugger::GetScriptLanguage() const
764{
765 if (m_opaque_sp)
766 return m_opaque_sp->GetScriptLanguage ();
767 return eScriptLanguageNone;
768}
769
770void
771SBDebugger::SetScriptLanguage (lldb::ScriptLanguage script_lang)
772{
773 if (m_opaque_sp)
774 m_opaque_sp->SetScriptLanguage (script_lang);
775}
776
777
778
779
Jim Ingham74989e82010-08-30 19:44:40 +0000780bool
781SBDebugger::SetUseExternalEditor (bool value)
782{
783 if (m_opaque_sp)
784 return m_opaque_sp->SetUseExternalEditor (value);
785 else
786 return false;
787}
788
789bool
Caroline Tice5bc8c972010-09-20 20:44:43 +0000790SBDebugger::GetUseExternalEditor ()
Jim Ingham74989e82010-08-30 19:44:40 +0000791{
792 if (m_opaque_sp)
Caroline Tice5bc8c972010-09-20 20:44:43 +0000793 return m_opaque_sp->GetUseExternalEditor ();
Jim Ingham74989e82010-08-30 19:44:40 +0000794 else
795 return false;
796}
797
Caroline Tice98f930f2010-09-20 05:20:02 +0000798bool
799SBDebugger::GetDescription (SBStream &description)
800{
801 if (m_opaque_sp)
802 {
803 const char *name = m_opaque_sp->GetInstanceName().AsCString();
804 lldb::user_id_t id = m_opaque_sp->GetID();
805 description.Printf ("Debugger (instance: '%s', id: %d)", name, id);
806 }
807 else
808 description.Printf ("No value");
809
810 return true;
811}