blob: b8190b74d6b3f4de01e396b9c59c030c8c91d128 [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
Greg Clayton538eb822010-11-05 23:17:00 +000088SBDebugger::SBDebugger(const SBDebugger &rhs) :
89 m_opaque_sp (rhs.m_opaque_sp)
90{
91}
92
93SBDebugger &
94SBDebugger::operator = (const SBDebugger &rhs)
95{
96 if (this != &rhs)
97 {
98 m_opaque_sp = rhs.m_opaque_sp;
99 }
100 return *this;
101}
102
Greg Clayton63094e02010-06-23 01:19:29 +0000103SBDebugger::~SBDebugger ()
104{
105}
106
107bool
108SBDebugger::IsValid() const
109{
110 return m_opaque_sp.get() != NULL;
111}
112
113
Chris Lattner24943d22010-06-08 16:52:24 +0000114void
115SBDebugger::SetAsync (bool b)
116{
Greg Clayton63094e02010-06-23 01:19:29 +0000117 if (m_opaque_sp)
118 m_opaque_sp->SetAsyncExecution(b);
Chris Lattner24943d22010-06-08 16:52:24 +0000119}
120
Greg Clayton887aa282010-10-11 01:05:37 +0000121void
122SBDebugger::SkipLLDBInitFiles (bool b)
123{
124 if (m_opaque_sp)
125 m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles (b);
126}
127
Chris Lattner24943d22010-06-08 16:52:24 +0000128// Shouldn't really be settable after initialization as this could cause lots of problems; don't want users
129// trying to switch modes in the middle of a debugging session.
130void
131SBDebugger::SetInputFileHandle (FILE *fh, bool transfer_ownership)
132{
Caroline Tice7826c882010-10-26 03:11:13 +0000133 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
134
135 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000136 log->Printf ("SBDebugger(%p)::SetInputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
137 fh, transfer_ownership);
Caroline Tice7826c882010-10-26 03:11:13 +0000138
Greg Clayton63094e02010-06-23 01:19:29 +0000139 if (m_opaque_sp)
140 m_opaque_sp->SetInputFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000141}
142
143void
144SBDebugger::SetOutputFileHandle (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)
Greg Clayton49ce6822010-10-31 03:01:06 +0000150 log->Printf ("SBDebugger(%p)::SetOutputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
151 fh, transfer_ownership);
Caroline Tice7826c882010-10-26 03:11:13 +0000152
Greg Clayton63094e02010-06-23 01:19:29 +0000153 if (m_opaque_sp)
154 m_opaque_sp->SetOutputFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000155}
156
157void
158SBDebugger::SetErrorFileHandle (FILE *fh, bool transfer_ownership)
159{
Caroline Tice7826c882010-10-26 03:11:13 +0000160 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
161
162
163 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000164 log->Printf ("SBDebugger(%p)::SetErrorFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
165 fh, transfer_ownership);
Caroline Tice7826c882010-10-26 03:11:13 +0000166
Greg Clayton63094e02010-06-23 01:19:29 +0000167 if (m_opaque_sp)
168 m_opaque_sp->SetErrorFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000169}
170
171FILE *
172SBDebugger::GetInputFileHandle ()
173{
Greg Clayton63094e02010-06-23 01:19:29 +0000174 if (m_opaque_sp)
175 return m_opaque_sp->GetInputFileHandle();
176 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000177}
178
179FILE *
180SBDebugger::GetOutputFileHandle ()
181{
Greg Clayton63094e02010-06-23 01:19:29 +0000182 if (m_opaque_sp)
183 return m_opaque_sp->GetOutputFileHandle();
184 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000185}
186
187FILE *
188SBDebugger::GetErrorFileHandle ()
189{
Greg Clayton63094e02010-06-23 01:19:29 +0000190 if (m_opaque_sp)
191 return m_opaque_sp->GetErrorFileHandle();
192 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000193}
194
195SBCommandInterpreter
196SBDebugger::GetCommandInterpreter ()
197{
Caroline Tice7826c882010-10-26 03:11:13 +0000198 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
199
Greg Clayton63094e02010-06-23 01:19:29 +0000200 SBCommandInterpreter sb_interpreter;
201 if (m_opaque_sp)
202 sb_interpreter.reset (&m_opaque_sp->GetCommandInterpreter());
Caroline Tice7826c882010-10-26 03:11:13 +0000203
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000204 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000205 log->Printf ("SBDebugger(%p)::GetCommandInterpreter () => SBCommandInterpreter(%p)",
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000206 m_opaque_sp.get(), sb_interpreter.get());
207
Chris Lattner24943d22010-06-08 16:52:24 +0000208 return sb_interpreter;
209}
210
211void
212SBDebugger::HandleCommand (const char *command)
213{
Greg Clayton63094e02010-06-23 01:19:29 +0000214 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000215 {
Greg Clayton63094e02010-06-23 01:19:29 +0000216 SBCommandInterpreter sb_interpreter(GetCommandInterpreter ());
217 SBCommandReturnObject result;
218
219 sb_interpreter.HandleCommand (command, result, false);
220
221 if (GetErrorFileHandle() != NULL)
222 result.PutError (GetErrorFileHandle());
223 if (GetOutputFileHandle() != NULL)
224 result.PutOutput (GetOutputFileHandle());
225
226 if (m_opaque_sp->GetAsyncExecution() == false)
Chris Lattner24943d22010-06-08 16:52:24 +0000227 {
Greg Clayton63094e02010-06-23 01:19:29 +0000228 SBProcess process(GetCommandInterpreter().GetProcess ());
229 if (process.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000230 {
Greg Clayton63094e02010-06-23 01:19:29 +0000231 EventSP event_sp;
232 Listener &lldb_listener = m_opaque_sp->GetListener();
233 while (lldb_listener.GetNextEventForBroadcaster (process.get(), event_sp))
234 {
235 SBEvent event(event_sp);
236 HandleProcessEvent (process, event, GetOutputFileHandle(), GetErrorFileHandle());
237 }
Chris Lattner24943d22010-06-08 16:52:24 +0000238 }
239 }
240 }
241}
242
243SBListener
244SBDebugger::GetListener ()
245{
Caroline Tice7826c882010-10-26 03:11:13 +0000246 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
247
Greg Clayton63094e02010-06-23 01:19:29 +0000248 SBListener sb_listener;
249 if (m_opaque_sp)
250 sb_listener.reset(&m_opaque_sp->GetListener(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000251
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000252 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000253 log->Printf ("SBDebugger(%p)::GetListener () => SBListener(%p)", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000254 sb_listener.get());
255
Chris Lattner24943d22010-06-08 16:52:24 +0000256 return sb_listener;
257}
258
259void
260SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, FILE *out, FILE *err)
261{
262 const uint32_t event_type = event.GetType();
263 char stdio_buffer[1024];
264 size_t len;
265
266 if (event_type & Process::eBroadcastBitSTDOUT)
267 {
268 while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
269 if (out != NULL)
270 ::fwrite (stdio_buffer, 1, len, out);
271 }
272 else if (event_type & Process::eBroadcastBitSTDERR)
273 {
274 while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
275 if (out != NULL)
276 ::fwrite (stdio_buffer, 1, len, out);
277 }
278 else if (event_type & Process::eBroadcastBitStateChanged)
279 {
280 // Drain any stdout messages.
281 while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
282 if (out != NULL)
283 ::fwrite (stdio_buffer, 1, len, out);
284
285 // Drain any stderr messages.
286 while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
287 if (out != NULL)
288 ::fwrite (stdio_buffer, 1, len, out);
289
290 StateType event_state = SBProcess::GetStateFromEvent (event);
291
292 if (event_state == eStateInvalid)
293 return;
294
295 bool is_stopped = StateIsStoppedState (event_state);
296 if (!is_stopped)
Jim Inghamc8332952010-08-26 21:32:51 +0000297 process.ReportEventState (event, out);
Chris Lattner24943d22010-06-08 16:52:24 +0000298 }
299}
300
301void
Jim Inghamc8332952010-08-26 21:32:51 +0000302SBDebugger::UpdateSelectedThread (SBProcess &process)
Chris Lattner24943d22010-06-08 16:52:24 +0000303{
304 if (process.IsValid())
305 {
Jim Inghamc8332952010-08-26 21:32:51 +0000306 SBThread curr_thread = process.GetSelectedThread ();
Chris Lattner24943d22010-06-08 16:52:24 +0000307 SBThread thread;
308 StopReason curr_thread_stop_reason = eStopReasonInvalid;
309 if (curr_thread.IsValid())
310 {
311 if (curr_thread.GetStopReason() != eStopReasonInvalid)
312 curr_thread_stop_reason = curr_thread.GetStopReason ();
313 }
314
315 if (! curr_thread.IsValid()
316 || curr_thread_stop_reason == eStopReasonInvalid
317 || curr_thread_stop_reason == eStopReasonNone)
318 {
319 // Prefer a thread that has just completed its plan over another thread as current thread.
320 SBThread plan_thread;
321 SBThread other_thread;
322 const size_t num_threads = process.GetNumThreads ();
323 size_t i;
324 for (i = 0; i < num_threads; ++i)
325 {
326 thread = process.GetThreadAtIndex(i);
327 if (thread.GetStopReason () != eStopReasonInvalid)
328 {
329 switch (thread.GetStopReason ())
330 {
331 default:
332 case eStopReasonInvalid:
333 case eStopReasonNone:
334 break;
335
336 case eStopReasonTrace:
337 case eStopReasonBreakpoint:
338 case eStopReasonWatchpoint:
339 case eStopReasonSignal:
340 case eStopReasonException:
341 if (! other_thread.IsValid())
342 other_thread = thread;
343 break;
344 case eStopReasonPlanComplete:
345 if (! plan_thread.IsValid())
346 plan_thread = thread;
347 break;
348 }
349 }
350 }
351 if (plan_thread.IsValid())
Jim Inghamc8332952010-08-26 21:32:51 +0000352 process.SetSelectedThreadByID (plan_thread.GetThreadID());
Chris Lattner24943d22010-06-08 16:52:24 +0000353 else if (other_thread.IsValid())
Jim Inghamc8332952010-08-26 21:32:51 +0000354 process.SetSelectedThreadByID (other_thread.GetThreadID());
Chris Lattner24943d22010-06-08 16:52:24 +0000355 else
356 {
357 if (curr_thread.IsValid())
358 thread = curr_thread;
359 else
360 thread = process.GetThreadAtIndex(0);
361
362 if (thread.IsValid())
Jim Inghamc8332952010-08-26 21:32:51 +0000363 process.SetSelectedThreadByID (thread.GetThreadID());
Chris Lattner24943d22010-06-08 16:52:24 +0000364 }
365 }
366 }
367}
368
Chris Lattner24943d22010-06-08 16:52:24 +0000369SBSourceManager &
370SBDebugger::GetSourceManager ()
371{
372 static SourceManager g_lldb_source_manager;
Greg Clayton538eb822010-11-05 23:17:00 +0000373 static SBSourceManager g_sb_source_manager (&g_lldb_source_manager);
Chris Lattner24943d22010-06-08 16:52:24 +0000374 return g_sb_source_manager;
375}
376
377
378bool
379SBDebugger::GetDefaultArchitecture (char *arch_name, size_t arch_name_len)
380{
381 if (arch_name && arch_name_len)
382 {
Caroline Tice5bc8c972010-09-20 20:44:43 +0000383 ArchSpec default_arch = lldb_private::Target::GetDefaultArchitecture ();
384
Chris Lattner24943d22010-06-08 16:52:24 +0000385 if (default_arch.IsValid())
386 {
387 ::snprintf (arch_name, arch_name_len, "%s", default_arch.AsCString());
388 return true;
389 }
390 }
391 if (arch_name && arch_name_len)
392 arch_name[0] = '\0';
393 return false;
394}
395
396
397bool
398SBDebugger::SetDefaultArchitecture (const char *arch_name)
399{
400 if (arch_name)
401 {
402 ArchSpec arch (arch_name);
403 if (arch.IsValid())
404 {
Caroline Tice5bc8c972010-09-20 20:44:43 +0000405 lldb_private::Target::SetDefaultArchitecture (arch);
Chris Lattner24943d22010-06-08 16:52:24 +0000406 return true;
407 }
408 }
409 return false;
410}
411
412ScriptLanguage
413SBDebugger::GetScriptingLanguage (const char *script_language_name)
414{
415 return Args::StringToScriptLanguage (script_language_name,
416 eScriptLanguageDefault,
417 NULL);
418}
Chris Lattner24943d22010-06-08 16:52:24 +0000419
420const char *
421SBDebugger::GetVersionString ()
422{
423 return lldb_private::GetVersion();
424}
425
426const char *
427SBDebugger::StateAsCString (lldb::StateType state)
428{
429 return lldb_private::StateAsCString (state);
430}
431
432bool
433SBDebugger::StateIsRunningState (lldb::StateType state)
434{
Greg Claytona66ba462010-10-30 04:51:46 +0000435 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
436
437 const bool result = lldb_private::StateIsRunningState (state);
438 if (log)
439 log->Printf ("SBDebugger::StateIsRunningState (state=%s) => %i",
440 lldb_private::StateAsCString (state), result);
441
442 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000443}
444
445bool
446SBDebugger::StateIsStoppedState (lldb::StateType state)
447{
Caroline Tice7826c882010-10-26 03:11:13 +0000448 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
449
Greg Claytona66ba462010-10-30 04:51:46 +0000450 const bool result = lldb_private::StateIsStoppedState (state);
Caroline Tice7826c882010-10-26 03:11:13 +0000451 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000452 log->Printf ("SBDebugger::StateIsStoppedState (state=%s) => %i",
453 lldb_private::StateAsCString (state), result);
Caroline Tice7826c882010-10-26 03:11:13 +0000454
Greg Claytona66ba462010-10-30 04:51:46 +0000455 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000456}
457
458
459SBTarget
460SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename,
461 const char *target_triple)
462{
Greg Clayton63094e02010-06-23 01:19:29 +0000463 SBTarget target;
464 if (m_opaque_sp)
465 {
466 ArchSpec arch;
Greg Clayton537a7a82010-10-20 20:54:39 +0000467 FileSpec file_spec (filename, true);
Greg Clayton63094e02010-06-23 01:19:29 +0000468 arch.SetArchFromTargetTriple(target_triple);
469 TargetSP target_sp;
470 Error error (m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file_spec, arch, NULL, true, target_sp));
471 target.reset (target_sp);
472 }
Greg Claytona66ba462010-10-30 04:51:46 +0000473
474 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
475 if (log)
476 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000477 log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndTargetTriple (filename=\"%s\", triple=%s) => SBTarget(%p)",
Greg Claytona66ba462010-10-30 04:51:46 +0000478 m_opaque_sp.get(), filename, target_triple, target.get());
479 }
480
Chris Lattner24943d22010-06-08 16:52:24 +0000481 return target;
482}
483
484SBTarget
485SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *archname)
486{
Caroline Tice7826c882010-10-26 03:11:13 +0000487 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
488
Greg Clayton63094e02010-06-23 01:19:29 +0000489 SBTarget target;
490 if (m_opaque_sp)
491 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000492 FileSpec file (filename, true);
Caroline Tice5bc8c972010-09-20 20:44:43 +0000493 ArchSpec arch = lldb_private::Target::GetDefaultArchitecture ();
Greg Clayton63094e02010-06-23 01:19:29 +0000494 TargetSP target_sp;
495 Error error;
Chris Lattner24943d22010-06-08 16:52:24 +0000496
Greg Clayton63094e02010-06-23 01:19:29 +0000497 if (archname != NULL)
498 {
499 ArchSpec arch2 (archname);
500 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch2, NULL, true, target_sp);
501 }
502 else
503 {
504 if (!arch.IsValid())
505 arch = LLDB_ARCH_DEFAULT;
506
507 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
508
509 if (error.Fail())
510 {
511 if (arch == LLDB_ARCH_DEFAULT_32BIT)
512 arch = LLDB_ARCH_DEFAULT_64BIT;
513 else
514 arch = LLDB_ARCH_DEFAULT_32BIT;
515
516 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
517 }
518 }
519
520 if (error.Success())
521 {
Jim Inghamc8332952010-08-26 21:32:51 +0000522 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Clayton63094e02010-06-23 01:19:29 +0000523 target.reset(target_sp);
524 }
Chris Lattner24943d22010-06-08 16:52:24 +0000525 }
Caroline Tice7826c882010-10-26 03:11:13 +0000526
527 if (log)
528 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000529 log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndArch (filename=\"%s\", arch=%s) => SBTarget(%p)",
Greg Claytona66ba462010-10-30 04:51:46 +0000530 m_opaque_sp.get(), filename, archname, target.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000531 }
532
Greg Clayton63094e02010-06-23 01:19:29 +0000533 return target;
534}
535
536SBTarget
537SBDebugger::CreateTarget (const char *filename)
538{
539 SBTarget target;
540 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000541 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000542 FileSpec file (filename, true);
Caroline Tice5bc8c972010-09-20 20:44:43 +0000543 ArchSpec arch = lldb_private::Target::GetDefaultArchitecture ();
Greg Clayton63094e02010-06-23 01:19:29 +0000544 TargetSP target_sp;
545 Error error;
546
Chris Lattner24943d22010-06-08 16:52:24 +0000547 if (!arch.IsValid())
548 arch = LLDB_ARCH_DEFAULT;
549
Greg Clayton63094e02010-06-23 01:19:29 +0000550 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000551
552 if (error.Fail())
553 {
554 if (arch == LLDB_ARCH_DEFAULT_32BIT)
555 arch = LLDB_ARCH_DEFAULT_64BIT;
556 else
557 arch = LLDB_ARCH_DEFAULT_32BIT;
558
Greg Clayton63094e02010-06-23 01:19:29 +0000559 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
560 }
561
562 if (error.Success())
563 {
Jim Inghamc8332952010-08-26 21:32:51 +0000564 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Clayton63094e02010-06-23 01:19:29 +0000565 target.reset (target_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000566 }
567 }
Greg Claytona66ba462010-10-30 04:51:46 +0000568 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
569 if (log)
570 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000571 log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)",
Greg Claytona66ba462010-10-30 04:51:46 +0000572 m_opaque_sp.get(), filename, target.get());
573 }
Greg Clayton63094e02010-06-23 01:19:29 +0000574 return target;
Chris Lattner24943d22010-06-08 16:52:24 +0000575}
576
577SBTarget
578SBDebugger::GetTargetAtIndex (uint32_t idx)
579{
Greg Clayton63094e02010-06-23 01:19:29 +0000580 SBTarget sb_target;
581 if (m_opaque_sp)
582 sb_target.reset(m_opaque_sp->GetTargetList().GetTargetAtIndex (idx));
Chris Lattner24943d22010-06-08 16:52:24 +0000583 return sb_target;
584}
585
586SBTarget
587SBDebugger::FindTargetWithProcessID (pid_t pid)
588{
Greg Clayton63094e02010-06-23 01:19:29 +0000589 SBTarget sb_target;
590 if (m_opaque_sp)
591 sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid));
Chris Lattner24943d22010-06-08 16:52:24 +0000592 return sb_target;
593}
594
595SBTarget
596SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name)
597{
Greg Clayton63094e02010-06-23 01:19:29 +0000598 SBTarget sb_target;
599 if (m_opaque_sp && filename && filename[0])
600 {
601 ArchSpec arch;
602 if (arch_name)
603 arch.SetArch(arch_name);
Greg Clayton537a7a82010-10-20 20:54:39 +0000604 TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename, false), arch_name ? &arch : NULL));
Greg Clayton63094e02010-06-23 01:19:29 +0000605 sb_target.reset(target_sp);
606 }
607 return sb_target;
Chris Lattner24943d22010-06-08 16:52:24 +0000608}
609
610SBTarget
611SBDebugger::FindTargetWithLLDBProcess (const lldb::ProcessSP &process_sp)
612{
Greg Clayton63094e02010-06-23 01:19:29 +0000613 SBTarget sb_target;
614 if (m_opaque_sp)
615 sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get()));
Chris Lattner24943d22010-06-08 16:52:24 +0000616 return sb_target;
617}
618
619
620uint32_t
621SBDebugger::GetNumTargets ()
622{
Greg Clayton63094e02010-06-23 01:19:29 +0000623 if (m_opaque_sp)
624 return m_opaque_sp->GetTargetList().GetNumTargets ();
625 return 0;
626}
Chris Lattner24943d22010-06-08 16:52:24 +0000627
628SBTarget
Jim Inghamc8332952010-08-26 21:32:51 +0000629SBDebugger::GetSelectedTarget ()
Chris Lattner24943d22010-06-08 16:52:24 +0000630{
Caroline Tice7826c882010-10-26 03:11:13 +0000631 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
632
Greg Clayton63094e02010-06-23 01:19:29 +0000633 SBTarget sb_target;
634 if (m_opaque_sp)
Jim Inghamc8332952010-08-26 21:32:51 +0000635 sb_target.reset(m_opaque_sp->GetTargetList().GetSelectedTarget ());
Caroline Tice7826c882010-10-26 03:11:13 +0000636
637 if (log)
638 {
639 SBStream sstr;
640 sb_target.GetDescription (sstr, lldb::eDescriptionLevelBrief);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000641 log->Printf ("SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000642 sb_target.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000643 }
644
Chris Lattner24943d22010-06-08 16:52:24 +0000645 return sb_target;
646}
647
648void
649SBDebugger::DispatchInput (void *baton, const void *data, size_t data_len)
650{
Caroline Tice7826c882010-10-26 03:11:13 +0000651 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
652
653 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000654 log->Printf ("SBDebugger(%p)::DispatchInput (baton=%p, data=\"%.*s\", size_t=%zu)", m_opaque_sp.get(),
655 baton, (int) data_len, (const char *) data, data_len);
Caroline Tice7826c882010-10-26 03:11:13 +0000656
Greg Clayton63094e02010-06-23 01:19:29 +0000657 if (m_opaque_sp)
658 m_opaque_sp->DispatchInput ((const char *) data, data_len);
Chris Lattner24943d22010-06-08 16:52:24 +0000659}
660
661void
662SBDebugger::PushInputReader (SBInputReader &reader)
663{
Caroline Tice7826c882010-10-26 03:11:13 +0000664 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
665
666 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000667 log->Printf ("SBDebugger(%p)::PushInputReader (SBInputReader(%p))", m_opaque_sp.get(), &reader);
Caroline Tice7826c882010-10-26 03:11:13 +0000668
Greg Clayton63094e02010-06-23 01:19:29 +0000669 if (m_opaque_sp && reader.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000670 {
671 InputReaderSP reader_sp(*reader);
Greg Clayton63094e02010-06-23 01:19:29 +0000672 m_opaque_sp->PushInputReader (reader_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000673 }
674}
Greg Clayton63094e02010-06-23 01:19:29 +0000675
676void
677SBDebugger::reset (const lldb::DebuggerSP &debugger_sp)
678{
679 m_opaque_sp = debugger_sp;
680}
681
682Debugger *
683SBDebugger::get () const
684{
685 return m_opaque_sp.get();
686}
687
688Debugger &
689SBDebugger::ref () const
690{
691 assert (m_opaque_sp.get());
692 return *m_opaque_sp;
693}
694
695
Caroline Tice558be582010-06-30 16:22:25 +0000696SBDebugger
697SBDebugger::FindDebuggerWithID (int id)
698{
699 SBDebugger sb_debugger;
700 lldb::DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id);
701 if (debugger_sp)
702 sb_debugger.reset (debugger_sp);
703 return sb_debugger;
704}
Jim Ingham74989e82010-08-30 19:44:40 +0000705
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000706const char *
707SBDebugger::GetInstanceName()
708{
709 if (m_opaque_sp)
710 return m_opaque_sp->GetInstanceName().AsCString();
711 else
712 return NULL;
713}
714
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000715SBError
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000716SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000717{
718 lldb::UserSettingsControllerSP root_settings_controller = lldb_private::Debugger::GetSettingsController();
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000719
Caroline Tice1ebef442010-09-27 00:30:10 +0000720 Error err = root_settings_controller->SetVariable (var_name, value, lldb::eVarSetOperationAssign, true,
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000721 debugger_instance_name);
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000722 SBError sb_error;
723 sb_error.SetError (err);
724
725 return sb_error;
726}
727
728lldb::SBStringList
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000729SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000730{
731 SBStringList ret_value;
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000732 lldb::SettableVariableType var_type;
Caroline Tice5bc8c972010-09-20 20:44:43 +0000733 lldb_private:Error err;
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000734
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000735 lldb::UserSettingsControllerSP root_settings_controller = lldb_private::Debugger::GetSettingsController();
736
Caroline Tice5bc8c972010-09-20 20:44:43 +0000737 StringList value = root_settings_controller->GetVariable (var_name, var_type, debugger_instance_name, err);
738
739 if (err.Success())
740 {
741 for (unsigned i = 0; i != value.GetSize(); ++i)
742 ret_value.AppendString (value.GetStringAtIndex(i));
743 }
744 else
745 {
746 ret_value.AppendString (err.AsCString());
747 }
748
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000749
750 return ret_value;
751}
752
Greg Clayton238c0a12010-09-18 01:14:36 +0000753uint32_t
754SBDebugger::GetTerminalWidth () const
755{
756 if (m_opaque_sp)
757 return m_opaque_sp->GetTerminalWidth ();
758 return 0;
759}
760
761void
762SBDebugger::SetTerminalWidth (uint32_t term_width)
763{
764 if (m_opaque_sp)
765 m_opaque_sp->SetTerminalWidth (term_width);
766}
767
768const char *
769SBDebugger::GetPrompt() const
770{
Caroline Tice7826c882010-10-26 03:11:13 +0000771 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
772
773 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000774 log->Printf ("SBDebugger(%p)::GetPrompt () => \"%s\"", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000775 (m_opaque_sp ? m_opaque_sp->GetPrompt() : ""));
Caroline Tice7826c882010-10-26 03:11:13 +0000776
Greg Clayton238c0a12010-09-18 01:14:36 +0000777 if (m_opaque_sp)
778 return m_opaque_sp->GetPrompt ();
779 return 0;
780}
781
782void
783SBDebugger::SetPrompt (const char *prompt)
784{
785 if (m_opaque_sp)
786 m_opaque_sp->SetPrompt (prompt);
787}
788
789
790lldb::ScriptLanguage
791SBDebugger::GetScriptLanguage() const
792{
793 if (m_opaque_sp)
794 return m_opaque_sp->GetScriptLanguage ();
795 return eScriptLanguageNone;
796}
797
798void
799SBDebugger::SetScriptLanguage (lldb::ScriptLanguage script_lang)
800{
801 if (m_opaque_sp)
802 m_opaque_sp->SetScriptLanguage (script_lang);
803}
804
805
806
807
Jim Ingham74989e82010-08-30 19:44:40 +0000808bool
809SBDebugger::SetUseExternalEditor (bool value)
810{
811 if (m_opaque_sp)
812 return m_opaque_sp->SetUseExternalEditor (value);
813 else
814 return false;
815}
816
817bool
Caroline Tice5bc8c972010-09-20 20:44:43 +0000818SBDebugger::GetUseExternalEditor ()
Jim Ingham74989e82010-08-30 19:44:40 +0000819{
820 if (m_opaque_sp)
Caroline Tice5bc8c972010-09-20 20:44:43 +0000821 return m_opaque_sp->GetUseExternalEditor ();
Jim Ingham74989e82010-08-30 19:44:40 +0000822 else
823 return false;
824}
825
Caroline Tice98f930f2010-09-20 05:20:02 +0000826bool
827SBDebugger::GetDescription (SBStream &description)
828{
829 if (m_opaque_sp)
830 {
831 const char *name = m_opaque_sp->GetInstanceName().AsCString();
832 lldb::user_id_t id = m_opaque_sp->GetID();
Greg Clayton49ce6822010-10-31 03:01:06 +0000833 description.Printf ("Debugger (instance: \"%s\", id: %d)", name, id);
Caroline Tice98f930f2010-09-20 05:20:02 +0000834 }
835 else
836 description.Printf ("No value");
837
838 return true;
839}