blob: 2777741ee5eeae415f4bd9110bef6b7e893ea701 [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{
Greg Claytone005f2c2010-11-06 01:53:30 +000040 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +000041
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{
Greg Claytone005f2c2010-11-06 01:53:30 +000057 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +000058
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{
Greg Claytone005f2c2010-11-06 01:53:30 +000068 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +000069
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{
Greg Claytone005f2c2010-11-06 01:53:30 +0000133 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000134
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{
Greg Claytone005f2c2010-11-06 01:53:30 +0000146 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000147
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{
Greg Claytone005f2c2010-11-06 01:53:30 +0000160 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000161
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{
Greg Claytone005f2c2010-11-06 01:53:30 +0000198 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000199
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{
Greg Claytone005f2c2010-11-06 01:53:30 +0000246 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000247
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 Claytone005f2c2010-11-06 01:53:30 +0000435 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000436
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{
Greg Claytone005f2c2010-11-06 01:53:30 +0000448 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000449
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
Greg Claytone005f2c2010-11-06 01:53:30 +0000474 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000475 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{
Greg Claytone005f2c2010-11-06 01:53:30 +0000487 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000488
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 Claytone005f2c2010-11-06 01:53:30 +0000568 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000569 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{
Greg Claytone005f2c2010-11-06 01:53:30 +0000631 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000632
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{
Greg Claytone005f2c2010-11-06 01:53:30 +0000651 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000652
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
Caroline Ticec4f55fe2010-11-19 20:47:54 +0000662SBDebugger::DispatchInputInterrupt ()
663{
664 if (m_opaque_sp)
665 m_opaque_sp->DispatchInputInterrupt ();
666}
667
668void
669SBDebugger::DispatchInputEndOfFile ()
670{
671 if (m_opaque_sp)
672 m_opaque_sp->DispatchInputEndOfFile ();
673}
674
675void
Chris Lattner24943d22010-06-08 16:52:24 +0000676SBDebugger::PushInputReader (SBInputReader &reader)
677{
Greg Claytone005f2c2010-11-06 01:53:30 +0000678 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000679
680 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000681 log->Printf ("SBDebugger(%p)::PushInputReader (SBInputReader(%p))", m_opaque_sp.get(), &reader);
Caroline Tice7826c882010-10-26 03:11:13 +0000682
Greg Clayton63094e02010-06-23 01:19:29 +0000683 if (m_opaque_sp && reader.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000684 {
685 InputReaderSP reader_sp(*reader);
Greg Clayton63094e02010-06-23 01:19:29 +0000686 m_opaque_sp->PushInputReader (reader_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000687 }
688}
Greg Clayton63094e02010-06-23 01:19:29 +0000689
690void
691SBDebugger::reset (const lldb::DebuggerSP &debugger_sp)
692{
693 m_opaque_sp = debugger_sp;
694}
695
696Debugger *
697SBDebugger::get () const
698{
699 return m_opaque_sp.get();
700}
701
702Debugger &
703SBDebugger::ref () const
704{
705 assert (m_opaque_sp.get());
706 return *m_opaque_sp;
707}
708
709
Caroline Tice558be582010-06-30 16:22:25 +0000710SBDebugger
711SBDebugger::FindDebuggerWithID (int id)
712{
713 SBDebugger sb_debugger;
714 lldb::DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id);
715 if (debugger_sp)
716 sb_debugger.reset (debugger_sp);
717 return sb_debugger;
718}
Jim Ingham74989e82010-08-30 19:44:40 +0000719
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000720const char *
721SBDebugger::GetInstanceName()
722{
723 if (m_opaque_sp)
724 return m_opaque_sp->GetInstanceName().AsCString();
725 else
726 return NULL;
727}
728
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000729SBError
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000730SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000731{
732 lldb::UserSettingsControllerSP root_settings_controller = lldb_private::Debugger::GetSettingsController();
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000733
Caroline Tice1ebef442010-09-27 00:30:10 +0000734 Error err = root_settings_controller->SetVariable (var_name, value, lldb::eVarSetOperationAssign, true,
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000735 debugger_instance_name);
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000736 SBError sb_error;
737 sb_error.SetError (err);
738
739 return sb_error;
740}
741
742lldb::SBStringList
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000743SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000744{
745 SBStringList ret_value;
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000746 lldb::SettableVariableType var_type;
Caroline Tice5bc8c972010-09-20 20:44:43 +0000747 lldb_private:Error err;
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000748
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000749 lldb::UserSettingsControllerSP root_settings_controller = lldb_private::Debugger::GetSettingsController();
750
Caroline Tice5bc8c972010-09-20 20:44:43 +0000751 StringList value = root_settings_controller->GetVariable (var_name, var_type, debugger_instance_name, err);
752
753 if (err.Success())
754 {
755 for (unsigned i = 0; i != value.GetSize(); ++i)
756 ret_value.AppendString (value.GetStringAtIndex(i));
757 }
758 else
759 {
760 ret_value.AppendString (err.AsCString());
761 }
762
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000763
764 return ret_value;
765}
766
Greg Clayton238c0a12010-09-18 01:14:36 +0000767uint32_t
768SBDebugger::GetTerminalWidth () const
769{
770 if (m_opaque_sp)
771 return m_opaque_sp->GetTerminalWidth ();
772 return 0;
773}
774
775void
776SBDebugger::SetTerminalWidth (uint32_t term_width)
777{
778 if (m_opaque_sp)
779 m_opaque_sp->SetTerminalWidth (term_width);
780}
781
782const char *
783SBDebugger::GetPrompt() const
784{
Greg Claytone005f2c2010-11-06 01:53:30 +0000785 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000786
787 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000788 log->Printf ("SBDebugger(%p)::GetPrompt () => \"%s\"", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000789 (m_opaque_sp ? m_opaque_sp->GetPrompt() : ""));
Caroline Tice7826c882010-10-26 03:11:13 +0000790
Greg Clayton238c0a12010-09-18 01:14:36 +0000791 if (m_opaque_sp)
792 return m_opaque_sp->GetPrompt ();
793 return 0;
794}
795
796void
797SBDebugger::SetPrompt (const char *prompt)
798{
799 if (m_opaque_sp)
800 m_opaque_sp->SetPrompt (prompt);
801}
802
803
804lldb::ScriptLanguage
805SBDebugger::GetScriptLanguage() const
806{
807 if (m_opaque_sp)
808 return m_opaque_sp->GetScriptLanguage ();
809 return eScriptLanguageNone;
810}
811
812void
813SBDebugger::SetScriptLanguage (lldb::ScriptLanguage script_lang)
814{
815 if (m_opaque_sp)
816 m_opaque_sp->SetScriptLanguage (script_lang);
817}
818
819
820
821
Jim Ingham74989e82010-08-30 19:44:40 +0000822bool
823SBDebugger::SetUseExternalEditor (bool value)
824{
825 if (m_opaque_sp)
826 return m_opaque_sp->SetUseExternalEditor (value);
827 else
828 return false;
829}
830
831bool
Caroline Tice5bc8c972010-09-20 20:44:43 +0000832SBDebugger::GetUseExternalEditor ()
Jim Ingham74989e82010-08-30 19:44:40 +0000833{
834 if (m_opaque_sp)
Caroline Tice5bc8c972010-09-20 20:44:43 +0000835 return m_opaque_sp->GetUseExternalEditor ();
Jim Ingham74989e82010-08-30 19:44:40 +0000836 else
837 return false;
838}
839
Caroline Tice98f930f2010-09-20 05:20:02 +0000840bool
841SBDebugger::GetDescription (SBStream &description)
842{
843 if (m_opaque_sp)
844 {
845 const char *name = m_opaque_sp->GetInstanceName().AsCString();
846 lldb::user_id_t id = m_opaque_sp->GetID();
Greg Clayton49ce6822010-10-31 03:01:06 +0000847 description.Printf ("Debugger (instance: \"%s\", id: %d)", name, id);
Caroline Tice98f930f2010-09-20 05:20:02 +0000848 }
849 else
850 description.Printf ("No value");
851
852 return true;
853}
Caroline Ticec4f55fe2010-11-19 20:47:54 +0000854
855lldb::user_id_t
856SBDebugger::GetID()
857{
858 if (m_opaque_sp)
859 return m_opaque_sp->GetID();
860 return LLDB_INVALID_UID;
861}