blob: a2d836f9934230ac14766f1f8eb292cbfe39d524 [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 Ticec0446862010-12-20 18:35:50 +000061
62 if (m_opaque_sp)
63 m_opaque_sp->CleanUpInputReaders ();
Caroline Tice7826c882010-10-26 03:11:13 +000064
Greg Clayton43490d12010-07-30 20:12:55 +000065 m_opaque_sp.reset();
66}
67
Greg Clayton63094e02010-06-23 01:19:29 +000068SBDebugger
69SBDebugger::Create()
70{
Greg Claytone005f2c2010-11-06 01:53:30 +000071 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +000072
Greg Clayton63094e02010-06-23 01:19:29 +000073 SBDebugger debugger;
74 debugger.reset(Debugger::CreateInstance());
Caroline Tice7826c882010-10-26 03:11:13 +000075
76 if (log)
77 {
78 SBStream sstr;
79 debugger.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +000080 log->Printf ("SBDebugger::Create () => SBDebugger(%p): %s", debugger.m_opaque_sp.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +000081 }
82
Greg Clayton63094e02010-06-23 01:19:29 +000083 return debugger;
84}
85
Greg Clayton63094e02010-06-23 01:19:29 +000086SBDebugger::SBDebugger () :
87 m_opaque_sp ()
88{
89}
90
Greg Clayton538eb822010-11-05 23:17:00 +000091SBDebugger::SBDebugger(const SBDebugger &rhs) :
92 m_opaque_sp (rhs.m_opaque_sp)
93{
94}
95
96SBDebugger &
97SBDebugger::operator = (const SBDebugger &rhs)
98{
99 if (this != &rhs)
100 {
101 m_opaque_sp = rhs.m_opaque_sp;
102 }
103 return *this;
104}
105
Greg Clayton63094e02010-06-23 01:19:29 +0000106SBDebugger::~SBDebugger ()
107{
108}
109
110bool
111SBDebugger::IsValid() const
112{
113 return m_opaque_sp.get() != NULL;
114}
115
116
Chris Lattner24943d22010-06-08 16:52:24 +0000117void
118SBDebugger::SetAsync (bool b)
119{
Greg Clayton63094e02010-06-23 01:19:29 +0000120 if (m_opaque_sp)
121 m_opaque_sp->SetAsyncExecution(b);
Chris Lattner24943d22010-06-08 16:52:24 +0000122}
123
Greg Clayton887aa282010-10-11 01:05:37 +0000124void
125SBDebugger::SkipLLDBInitFiles (bool b)
126{
127 if (m_opaque_sp)
128 m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles (b);
129}
130
Chris Lattner24943d22010-06-08 16:52:24 +0000131// Shouldn't really be settable after initialization as this could cause lots of problems; don't want users
132// trying to switch modes in the middle of a debugging session.
133void
134SBDebugger::SetInputFileHandle (FILE *fh, bool transfer_ownership)
135{
Greg Claytone005f2c2010-11-06 01:53:30 +0000136 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000137
138 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000139 log->Printf ("SBDebugger(%p)::SetInputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
140 fh, transfer_ownership);
Caroline Tice7826c882010-10-26 03:11:13 +0000141
Greg Clayton63094e02010-06-23 01:19:29 +0000142 if (m_opaque_sp)
143 m_opaque_sp->SetInputFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000144}
145
146void
147SBDebugger::SetOutputFileHandle (FILE *fh, bool transfer_ownership)
148{
Greg Claytone005f2c2010-11-06 01:53:30 +0000149 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000150
151
152 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000153 log->Printf ("SBDebugger(%p)::SetOutputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
154 fh, transfer_ownership);
Caroline Tice7826c882010-10-26 03:11:13 +0000155
Greg Clayton63094e02010-06-23 01:19:29 +0000156 if (m_opaque_sp)
157 m_opaque_sp->SetOutputFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000158}
159
160void
161SBDebugger::SetErrorFileHandle (FILE *fh, bool transfer_ownership)
162{
Greg Claytone005f2c2010-11-06 01:53:30 +0000163 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000164
165
166 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000167 log->Printf ("SBDebugger(%p)::SetErrorFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
168 fh, transfer_ownership);
Caroline Tice7826c882010-10-26 03:11:13 +0000169
Greg Clayton63094e02010-06-23 01:19:29 +0000170 if (m_opaque_sp)
171 m_opaque_sp->SetErrorFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000172}
173
174FILE *
175SBDebugger::GetInputFileHandle ()
176{
Greg Clayton63094e02010-06-23 01:19:29 +0000177 if (m_opaque_sp)
178 return m_opaque_sp->GetInputFileHandle();
179 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000180}
181
182FILE *
183SBDebugger::GetOutputFileHandle ()
184{
Greg Clayton63094e02010-06-23 01:19:29 +0000185 if (m_opaque_sp)
186 return m_opaque_sp->GetOutputFileHandle();
187 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000188}
189
190FILE *
191SBDebugger::GetErrorFileHandle ()
192{
Greg Clayton63094e02010-06-23 01:19:29 +0000193 if (m_opaque_sp)
194 return m_opaque_sp->GetErrorFileHandle();
195 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000196}
197
198SBCommandInterpreter
199SBDebugger::GetCommandInterpreter ()
200{
Greg Claytone005f2c2010-11-06 01:53:30 +0000201 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000202
Greg Clayton63094e02010-06-23 01:19:29 +0000203 SBCommandInterpreter sb_interpreter;
204 if (m_opaque_sp)
205 sb_interpreter.reset (&m_opaque_sp->GetCommandInterpreter());
Caroline Tice7826c882010-10-26 03:11:13 +0000206
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000207 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000208 log->Printf ("SBDebugger(%p)::GetCommandInterpreter () => SBCommandInterpreter(%p)",
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000209 m_opaque_sp.get(), sb_interpreter.get());
210
Chris Lattner24943d22010-06-08 16:52:24 +0000211 return sb_interpreter;
212}
213
214void
215SBDebugger::HandleCommand (const char *command)
216{
Greg Clayton63094e02010-06-23 01:19:29 +0000217 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000218 {
Greg Clayton63094e02010-06-23 01:19:29 +0000219 SBCommandInterpreter sb_interpreter(GetCommandInterpreter ());
220 SBCommandReturnObject result;
221
222 sb_interpreter.HandleCommand (command, result, false);
223
224 if (GetErrorFileHandle() != NULL)
225 result.PutError (GetErrorFileHandle());
226 if (GetOutputFileHandle() != NULL)
227 result.PutOutput (GetOutputFileHandle());
228
229 if (m_opaque_sp->GetAsyncExecution() == false)
Chris Lattner24943d22010-06-08 16:52:24 +0000230 {
Greg Clayton63094e02010-06-23 01:19:29 +0000231 SBProcess process(GetCommandInterpreter().GetProcess ());
232 if (process.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000233 {
Greg Clayton63094e02010-06-23 01:19:29 +0000234 EventSP event_sp;
235 Listener &lldb_listener = m_opaque_sp->GetListener();
236 while (lldb_listener.GetNextEventForBroadcaster (process.get(), event_sp))
237 {
238 SBEvent event(event_sp);
239 HandleProcessEvent (process, event, GetOutputFileHandle(), GetErrorFileHandle());
240 }
Chris Lattner24943d22010-06-08 16:52:24 +0000241 }
242 }
243 }
244}
245
246SBListener
247SBDebugger::GetListener ()
248{
Greg Claytone005f2c2010-11-06 01:53:30 +0000249 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000250
Greg Clayton63094e02010-06-23 01:19:29 +0000251 SBListener sb_listener;
252 if (m_opaque_sp)
253 sb_listener.reset(&m_opaque_sp->GetListener(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000254
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000255 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000256 log->Printf ("SBDebugger(%p)::GetListener () => SBListener(%p)", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000257 sb_listener.get());
258
Chris Lattner24943d22010-06-08 16:52:24 +0000259 return sb_listener;
260}
261
262void
263SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, FILE *out, FILE *err)
264{
265 const uint32_t event_type = event.GetType();
266 char stdio_buffer[1024];
267 size_t len;
268
269 if (event_type & Process::eBroadcastBitSTDOUT)
270 {
271 while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
272 if (out != NULL)
273 ::fwrite (stdio_buffer, 1, len, out);
274 }
275 else if (event_type & Process::eBroadcastBitSTDERR)
276 {
277 while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
278 if (out != NULL)
279 ::fwrite (stdio_buffer, 1, len, out);
280 }
281 else if (event_type & Process::eBroadcastBitStateChanged)
282 {
283 // Drain any stdout messages.
284 while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
285 if (out != NULL)
286 ::fwrite (stdio_buffer, 1, len, out);
287
288 // Drain any stderr messages.
289 while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
290 if (out != NULL)
291 ::fwrite (stdio_buffer, 1, len, out);
292
293 StateType event_state = SBProcess::GetStateFromEvent (event);
294
295 if (event_state == eStateInvalid)
296 return;
297
298 bool is_stopped = StateIsStoppedState (event_state);
299 if (!is_stopped)
Jim Inghamc8332952010-08-26 21:32:51 +0000300 process.ReportEventState (event, out);
Chris Lattner24943d22010-06-08 16:52:24 +0000301 }
302}
303
304void
Jim Inghamc8332952010-08-26 21:32:51 +0000305SBDebugger::UpdateSelectedThread (SBProcess &process)
Chris Lattner24943d22010-06-08 16:52:24 +0000306{
307 if (process.IsValid())
308 {
Jim Inghamc8332952010-08-26 21:32:51 +0000309 SBThread curr_thread = process.GetSelectedThread ();
Chris Lattner24943d22010-06-08 16:52:24 +0000310 SBThread thread;
311 StopReason curr_thread_stop_reason = eStopReasonInvalid;
312 if (curr_thread.IsValid())
313 {
314 if (curr_thread.GetStopReason() != eStopReasonInvalid)
315 curr_thread_stop_reason = curr_thread.GetStopReason ();
316 }
317
318 if (! curr_thread.IsValid()
319 || curr_thread_stop_reason == eStopReasonInvalid
320 || curr_thread_stop_reason == eStopReasonNone)
321 {
322 // Prefer a thread that has just completed its plan over another thread as current thread.
323 SBThread plan_thread;
324 SBThread other_thread;
325 const size_t num_threads = process.GetNumThreads ();
326 size_t i;
327 for (i = 0; i < num_threads; ++i)
328 {
329 thread = process.GetThreadAtIndex(i);
330 if (thread.GetStopReason () != eStopReasonInvalid)
331 {
332 switch (thread.GetStopReason ())
333 {
334 default:
335 case eStopReasonInvalid:
336 case eStopReasonNone:
337 break;
338
339 case eStopReasonTrace:
340 case eStopReasonBreakpoint:
341 case eStopReasonWatchpoint:
342 case eStopReasonSignal:
343 case eStopReasonException:
344 if (! other_thread.IsValid())
345 other_thread = thread;
346 break;
347 case eStopReasonPlanComplete:
348 if (! plan_thread.IsValid())
349 plan_thread = thread;
350 break;
351 }
352 }
353 }
354 if (plan_thread.IsValid())
Jim Inghamc8332952010-08-26 21:32:51 +0000355 process.SetSelectedThreadByID (plan_thread.GetThreadID());
Chris Lattner24943d22010-06-08 16:52:24 +0000356 else if (other_thread.IsValid())
Jim Inghamc8332952010-08-26 21:32:51 +0000357 process.SetSelectedThreadByID (other_thread.GetThreadID());
Chris Lattner24943d22010-06-08 16:52:24 +0000358 else
359 {
360 if (curr_thread.IsValid())
361 thread = curr_thread;
362 else
363 thread = process.GetThreadAtIndex(0);
364
365 if (thread.IsValid())
Jim Inghamc8332952010-08-26 21:32:51 +0000366 process.SetSelectedThreadByID (thread.GetThreadID());
Chris Lattner24943d22010-06-08 16:52:24 +0000367 }
368 }
369 }
370}
371
Chris Lattner24943d22010-06-08 16:52:24 +0000372SBSourceManager &
373SBDebugger::GetSourceManager ()
374{
375 static SourceManager g_lldb_source_manager;
Greg Clayton538eb822010-11-05 23:17:00 +0000376 static SBSourceManager g_sb_source_manager (&g_lldb_source_manager);
Chris Lattner24943d22010-06-08 16:52:24 +0000377 return g_sb_source_manager;
378}
379
380
381bool
382SBDebugger::GetDefaultArchitecture (char *arch_name, size_t arch_name_len)
383{
384 if (arch_name && arch_name_len)
385 {
Caroline Tice5bc8c972010-09-20 20:44:43 +0000386 ArchSpec default_arch = lldb_private::Target::GetDefaultArchitecture ();
387
Chris Lattner24943d22010-06-08 16:52:24 +0000388 if (default_arch.IsValid())
389 {
390 ::snprintf (arch_name, arch_name_len, "%s", default_arch.AsCString());
391 return true;
392 }
393 }
394 if (arch_name && arch_name_len)
395 arch_name[0] = '\0';
396 return false;
397}
398
399
400bool
401SBDebugger::SetDefaultArchitecture (const char *arch_name)
402{
403 if (arch_name)
404 {
405 ArchSpec arch (arch_name);
406 if (arch.IsValid())
407 {
Caroline Tice5bc8c972010-09-20 20:44:43 +0000408 lldb_private::Target::SetDefaultArchitecture (arch);
Chris Lattner24943d22010-06-08 16:52:24 +0000409 return true;
410 }
411 }
412 return false;
413}
414
415ScriptLanguage
416SBDebugger::GetScriptingLanguage (const char *script_language_name)
417{
418 return Args::StringToScriptLanguage (script_language_name,
419 eScriptLanguageDefault,
420 NULL);
421}
Chris Lattner24943d22010-06-08 16:52:24 +0000422
423const char *
424SBDebugger::GetVersionString ()
425{
426 return lldb_private::GetVersion();
427}
428
429const char *
430SBDebugger::StateAsCString (lldb::StateType state)
431{
432 return lldb_private::StateAsCString (state);
433}
434
435bool
436SBDebugger::StateIsRunningState (lldb::StateType state)
437{
Greg Claytone005f2c2010-11-06 01:53:30 +0000438 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000439
440 const bool result = lldb_private::StateIsRunningState (state);
441 if (log)
442 log->Printf ("SBDebugger::StateIsRunningState (state=%s) => %i",
443 lldb_private::StateAsCString (state), result);
444
445 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000446}
447
448bool
449SBDebugger::StateIsStoppedState (lldb::StateType state)
450{
Greg Claytone005f2c2010-11-06 01:53:30 +0000451 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000452
Greg Claytona66ba462010-10-30 04:51:46 +0000453 const bool result = lldb_private::StateIsStoppedState (state);
Caroline Tice7826c882010-10-26 03:11:13 +0000454 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000455 log->Printf ("SBDebugger::StateIsStoppedState (state=%s) => %i",
456 lldb_private::StateAsCString (state), result);
Caroline Tice7826c882010-10-26 03:11:13 +0000457
Greg Claytona66ba462010-10-30 04:51:46 +0000458 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000459}
460
461
462SBTarget
463SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename,
464 const char *target_triple)
465{
Greg Clayton63094e02010-06-23 01:19:29 +0000466 SBTarget target;
467 if (m_opaque_sp)
468 {
469 ArchSpec arch;
Greg Clayton537a7a82010-10-20 20:54:39 +0000470 FileSpec file_spec (filename, true);
Greg Clayton63094e02010-06-23 01:19:29 +0000471 arch.SetArchFromTargetTriple(target_triple);
472 TargetSP target_sp;
473 Error error (m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file_spec, arch, NULL, true, target_sp));
474 target.reset (target_sp);
475 }
Greg Claytona66ba462010-10-30 04:51:46 +0000476
Greg Claytone005f2c2010-11-06 01:53:30 +0000477 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000478 if (log)
479 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000480 log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndTargetTriple (filename=\"%s\", triple=%s) => SBTarget(%p)",
Greg Claytona66ba462010-10-30 04:51:46 +0000481 m_opaque_sp.get(), filename, target_triple, target.get());
482 }
483
Chris Lattner24943d22010-06-08 16:52:24 +0000484 return target;
485}
486
487SBTarget
488SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *archname)
489{
Greg Claytone005f2c2010-11-06 01:53:30 +0000490 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000491
Greg Clayton63094e02010-06-23 01:19:29 +0000492 SBTarget target;
493 if (m_opaque_sp)
494 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000495 FileSpec file (filename, true);
Caroline Tice5bc8c972010-09-20 20:44:43 +0000496 ArchSpec arch = lldb_private::Target::GetDefaultArchitecture ();
Greg Clayton63094e02010-06-23 01:19:29 +0000497 TargetSP target_sp;
498 Error error;
Chris Lattner24943d22010-06-08 16:52:24 +0000499
Greg Clayton63094e02010-06-23 01:19:29 +0000500 if (archname != NULL)
501 {
502 ArchSpec arch2 (archname);
503 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch2, NULL, true, target_sp);
504 }
505 else
506 {
507 if (!arch.IsValid())
508 arch = LLDB_ARCH_DEFAULT;
509
510 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
511
512 if (error.Fail())
513 {
514 if (arch == LLDB_ARCH_DEFAULT_32BIT)
515 arch = LLDB_ARCH_DEFAULT_64BIT;
516 else
517 arch = LLDB_ARCH_DEFAULT_32BIT;
518
519 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
520 }
521 }
522
523 if (error.Success())
524 {
Jim Inghamc8332952010-08-26 21:32:51 +0000525 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Clayton63094e02010-06-23 01:19:29 +0000526 target.reset(target_sp);
527 }
Chris Lattner24943d22010-06-08 16:52:24 +0000528 }
Caroline Tice7826c882010-10-26 03:11:13 +0000529
530 if (log)
531 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000532 log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndArch (filename=\"%s\", arch=%s) => SBTarget(%p)",
Greg Claytona66ba462010-10-30 04:51:46 +0000533 m_opaque_sp.get(), filename, archname, target.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000534 }
535
Greg Clayton63094e02010-06-23 01:19:29 +0000536 return target;
537}
538
539SBTarget
540SBDebugger::CreateTarget (const char *filename)
541{
542 SBTarget target;
543 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000544 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000545 FileSpec file (filename, true);
Caroline Tice5bc8c972010-09-20 20:44:43 +0000546 ArchSpec arch = lldb_private::Target::GetDefaultArchitecture ();
Greg Clayton63094e02010-06-23 01:19:29 +0000547 TargetSP target_sp;
548 Error error;
549
Chris Lattner24943d22010-06-08 16:52:24 +0000550 if (!arch.IsValid())
551 arch = LLDB_ARCH_DEFAULT;
552
Greg Clayton63094e02010-06-23 01:19:29 +0000553 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000554
555 if (error.Fail())
556 {
557 if (arch == LLDB_ARCH_DEFAULT_32BIT)
558 arch = LLDB_ARCH_DEFAULT_64BIT;
559 else
560 arch = LLDB_ARCH_DEFAULT_32BIT;
561
Greg Clayton63094e02010-06-23 01:19:29 +0000562 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
563 }
564
565 if (error.Success())
566 {
Jim Inghamc8332952010-08-26 21:32:51 +0000567 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Clayton63094e02010-06-23 01:19:29 +0000568 target.reset (target_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000569 }
570 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000571 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000572 if (log)
573 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000574 log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)",
Greg Claytona66ba462010-10-30 04:51:46 +0000575 m_opaque_sp.get(), filename, target.get());
576 }
Greg Clayton63094e02010-06-23 01:19:29 +0000577 return target;
Chris Lattner24943d22010-06-08 16:52:24 +0000578}
579
580SBTarget
581SBDebugger::GetTargetAtIndex (uint32_t idx)
582{
Greg Clayton63094e02010-06-23 01:19:29 +0000583 SBTarget sb_target;
584 if (m_opaque_sp)
585 sb_target.reset(m_opaque_sp->GetTargetList().GetTargetAtIndex (idx));
Chris Lattner24943d22010-06-08 16:52:24 +0000586 return sb_target;
587}
588
589SBTarget
590SBDebugger::FindTargetWithProcessID (pid_t pid)
591{
Greg Clayton63094e02010-06-23 01:19:29 +0000592 SBTarget sb_target;
593 if (m_opaque_sp)
594 sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid));
Chris Lattner24943d22010-06-08 16:52:24 +0000595 return sb_target;
596}
597
598SBTarget
599SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name)
600{
Greg Clayton63094e02010-06-23 01:19:29 +0000601 SBTarget sb_target;
602 if (m_opaque_sp && filename && filename[0])
603 {
604 ArchSpec arch;
605 if (arch_name)
606 arch.SetArch(arch_name);
Greg Clayton537a7a82010-10-20 20:54:39 +0000607 TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename, false), arch_name ? &arch : NULL));
Greg Clayton63094e02010-06-23 01:19:29 +0000608 sb_target.reset(target_sp);
609 }
610 return sb_target;
Chris Lattner24943d22010-06-08 16:52:24 +0000611}
612
613SBTarget
614SBDebugger::FindTargetWithLLDBProcess (const lldb::ProcessSP &process_sp)
615{
Greg Clayton63094e02010-06-23 01:19:29 +0000616 SBTarget sb_target;
617 if (m_opaque_sp)
618 sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get()));
Chris Lattner24943d22010-06-08 16:52:24 +0000619 return sb_target;
620}
621
622
623uint32_t
624SBDebugger::GetNumTargets ()
625{
Greg Clayton63094e02010-06-23 01:19:29 +0000626 if (m_opaque_sp)
627 return m_opaque_sp->GetTargetList().GetNumTargets ();
628 return 0;
629}
Chris Lattner24943d22010-06-08 16:52:24 +0000630
631SBTarget
Jim Inghamc8332952010-08-26 21:32:51 +0000632SBDebugger::GetSelectedTarget ()
Chris Lattner24943d22010-06-08 16:52:24 +0000633{
Greg Claytone005f2c2010-11-06 01:53:30 +0000634 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000635
Greg Clayton63094e02010-06-23 01:19:29 +0000636 SBTarget sb_target;
637 if (m_opaque_sp)
Jim Inghamc8332952010-08-26 21:32:51 +0000638 sb_target.reset(m_opaque_sp->GetTargetList().GetSelectedTarget ());
Caroline Tice7826c882010-10-26 03:11:13 +0000639
640 if (log)
641 {
642 SBStream sstr;
643 sb_target.GetDescription (sstr, lldb::eDescriptionLevelBrief);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000644 log->Printf ("SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000645 sb_target.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000646 }
647
Chris Lattner24943d22010-06-08 16:52:24 +0000648 return sb_target;
649}
650
651void
652SBDebugger::DispatchInput (void *baton, const void *data, size_t data_len)
653{
Greg Claytone005f2c2010-11-06 01:53:30 +0000654 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000655
656 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000657 log->Printf ("SBDebugger(%p)::DispatchInput (baton=%p, data=\"%.*s\", size_t=%zu)", m_opaque_sp.get(),
658 baton, (int) data_len, (const char *) data, data_len);
Caroline Tice7826c882010-10-26 03:11:13 +0000659
Greg Clayton63094e02010-06-23 01:19:29 +0000660 if (m_opaque_sp)
661 m_opaque_sp->DispatchInput ((const char *) data, data_len);
Chris Lattner24943d22010-06-08 16:52:24 +0000662}
663
664void
Caroline Ticec4f55fe2010-11-19 20:47:54 +0000665SBDebugger::DispatchInputInterrupt ()
666{
667 if (m_opaque_sp)
668 m_opaque_sp->DispatchInputInterrupt ();
669}
670
671void
672SBDebugger::DispatchInputEndOfFile ()
673{
674 if (m_opaque_sp)
675 m_opaque_sp->DispatchInputEndOfFile ();
676}
677
678void
Chris Lattner24943d22010-06-08 16:52:24 +0000679SBDebugger::PushInputReader (SBInputReader &reader)
680{
Greg Claytone005f2c2010-11-06 01:53:30 +0000681 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000682
683 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000684 log->Printf ("SBDebugger(%p)::PushInputReader (SBInputReader(%p))", m_opaque_sp.get(), &reader);
Caroline Tice7826c882010-10-26 03:11:13 +0000685
Greg Clayton63094e02010-06-23 01:19:29 +0000686 if (m_opaque_sp && reader.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000687 {
688 InputReaderSP reader_sp(*reader);
Greg Clayton63094e02010-06-23 01:19:29 +0000689 m_opaque_sp->PushInputReader (reader_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000690 }
691}
Greg Clayton63094e02010-06-23 01:19:29 +0000692
693void
694SBDebugger::reset (const lldb::DebuggerSP &debugger_sp)
695{
696 m_opaque_sp = debugger_sp;
697}
698
699Debugger *
700SBDebugger::get () const
701{
702 return m_opaque_sp.get();
703}
704
705Debugger &
706SBDebugger::ref () const
707{
708 assert (m_opaque_sp.get());
709 return *m_opaque_sp;
710}
711
712
Caroline Tice558be582010-06-30 16:22:25 +0000713SBDebugger
714SBDebugger::FindDebuggerWithID (int id)
715{
716 SBDebugger sb_debugger;
717 lldb::DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id);
718 if (debugger_sp)
719 sb_debugger.reset (debugger_sp);
720 return sb_debugger;
721}
Jim Ingham74989e82010-08-30 19:44:40 +0000722
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000723const char *
724SBDebugger::GetInstanceName()
725{
726 if (m_opaque_sp)
727 return m_opaque_sp->GetInstanceName().AsCString();
728 else
729 return NULL;
730}
731
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000732SBError
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000733SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000734{
735 lldb::UserSettingsControllerSP root_settings_controller = lldb_private::Debugger::GetSettingsController();
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000736
Caroline Tice1ebef442010-09-27 00:30:10 +0000737 Error err = root_settings_controller->SetVariable (var_name, value, lldb::eVarSetOperationAssign, true,
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000738 debugger_instance_name);
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000739 SBError sb_error;
740 sb_error.SetError (err);
741
742 return sb_error;
743}
744
745lldb::SBStringList
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000746SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000747{
748 SBStringList ret_value;
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000749 lldb::SettableVariableType var_type;
Johnny Chenf5e43262010-12-20 20:33:26 +0000750 lldb_private::Error err;
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000751
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000752 lldb::UserSettingsControllerSP root_settings_controller = lldb_private::Debugger::GetSettingsController();
753
Caroline Tice5bc8c972010-09-20 20:44:43 +0000754 StringList value = root_settings_controller->GetVariable (var_name, var_type, debugger_instance_name, err);
755
756 if (err.Success())
757 {
758 for (unsigned i = 0; i != value.GetSize(); ++i)
759 ret_value.AppendString (value.GetStringAtIndex(i));
760 }
761 else
762 {
763 ret_value.AppendString (err.AsCString());
764 }
765
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000766
767 return ret_value;
768}
769
Greg Clayton238c0a12010-09-18 01:14:36 +0000770uint32_t
771SBDebugger::GetTerminalWidth () const
772{
773 if (m_opaque_sp)
774 return m_opaque_sp->GetTerminalWidth ();
775 return 0;
776}
777
778void
779SBDebugger::SetTerminalWidth (uint32_t term_width)
780{
781 if (m_opaque_sp)
782 m_opaque_sp->SetTerminalWidth (term_width);
783}
784
785const char *
786SBDebugger::GetPrompt() const
787{
Greg Claytone005f2c2010-11-06 01:53:30 +0000788 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000789
790 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000791 log->Printf ("SBDebugger(%p)::GetPrompt () => \"%s\"", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000792 (m_opaque_sp ? m_opaque_sp->GetPrompt() : ""));
Caroline Tice7826c882010-10-26 03:11:13 +0000793
Greg Clayton238c0a12010-09-18 01:14:36 +0000794 if (m_opaque_sp)
795 return m_opaque_sp->GetPrompt ();
796 return 0;
797}
798
799void
800SBDebugger::SetPrompt (const char *prompt)
801{
802 if (m_opaque_sp)
803 m_opaque_sp->SetPrompt (prompt);
804}
805
806
807lldb::ScriptLanguage
808SBDebugger::GetScriptLanguage() const
809{
810 if (m_opaque_sp)
811 return m_opaque_sp->GetScriptLanguage ();
812 return eScriptLanguageNone;
813}
814
815void
816SBDebugger::SetScriptLanguage (lldb::ScriptLanguage script_lang)
817{
818 if (m_opaque_sp)
819 m_opaque_sp->SetScriptLanguage (script_lang);
820}
821
822
823
824
Jim Ingham74989e82010-08-30 19:44:40 +0000825bool
826SBDebugger::SetUseExternalEditor (bool value)
827{
828 if (m_opaque_sp)
829 return m_opaque_sp->SetUseExternalEditor (value);
830 else
831 return false;
832}
833
834bool
Caroline Tice5bc8c972010-09-20 20:44:43 +0000835SBDebugger::GetUseExternalEditor ()
Jim Ingham74989e82010-08-30 19:44:40 +0000836{
837 if (m_opaque_sp)
Caroline Tice5bc8c972010-09-20 20:44:43 +0000838 return m_opaque_sp->GetUseExternalEditor ();
Jim Ingham74989e82010-08-30 19:44:40 +0000839 else
840 return false;
841}
842
Caroline Tice98f930f2010-09-20 05:20:02 +0000843bool
844SBDebugger::GetDescription (SBStream &description)
845{
846 if (m_opaque_sp)
847 {
848 const char *name = m_opaque_sp->GetInstanceName().AsCString();
849 lldb::user_id_t id = m_opaque_sp->GetID();
Greg Clayton49ce6822010-10-31 03:01:06 +0000850 description.Printf ("Debugger (instance: \"%s\", id: %d)", name, id);
Caroline Tice98f930f2010-09-20 05:20:02 +0000851 }
852 else
853 description.Printf ("No value");
854
855 return true;
856}
Caroline Ticec4f55fe2010-11-19 20:47:54 +0000857
858lldb::user_id_t
859SBDebugger::GetID()
860{
861 if (m_opaque_sp)
862 return m_opaque_sp->GetID();
863 return LLDB_INVALID_UID;
864}