blob: 430700d1896dac5da636a1fbc42e4e1375faa2a9 [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
Caroline Ticec4ed12f2011-01-22 01:02:07 +000086void
87SBDebugger::Destroy (SBDebugger &debugger)
88{
89 LogSP log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
90
91 if (log)
92 {
93 SBStream sstr;
94 debugger.GetDescription (sstr);
95 log->Printf ("SBDebugger::Destroy () => SBDebugger(%p): %s", debugger.m_opaque_sp.get(), sstr.GetData());
96 }
97
98 Debugger::Destroy (debugger.m_opaque_sp);
99
100 if (debugger.m_opaque_sp.get() != NULL)
101 debugger.m_opaque_sp.reset();
102}
103
Greg Clayton63094e02010-06-23 01:19:29 +0000104SBDebugger::SBDebugger () :
105 m_opaque_sp ()
106{
107}
108
Greg Clayton538eb822010-11-05 23:17:00 +0000109SBDebugger::SBDebugger(const SBDebugger &rhs) :
110 m_opaque_sp (rhs.m_opaque_sp)
111{
112}
113
114SBDebugger &
115SBDebugger::operator = (const SBDebugger &rhs)
116{
117 if (this != &rhs)
118 {
119 m_opaque_sp = rhs.m_opaque_sp;
120 }
121 return *this;
122}
123
Greg Clayton63094e02010-06-23 01:19:29 +0000124SBDebugger::~SBDebugger ()
125{
126}
127
128bool
129SBDebugger::IsValid() const
130{
131 return m_opaque_sp.get() != NULL;
132}
133
134
Chris Lattner24943d22010-06-08 16:52:24 +0000135void
136SBDebugger::SetAsync (bool b)
137{
Greg Clayton63094e02010-06-23 01:19:29 +0000138 if (m_opaque_sp)
139 m_opaque_sp->SetAsyncExecution(b);
Chris Lattner24943d22010-06-08 16:52:24 +0000140}
141
Greg Clayton887aa282010-10-11 01:05:37 +0000142void
143SBDebugger::SkipLLDBInitFiles (bool b)
144{
145 if (m_opaque_sp)
146 m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles (b);
147}
148
Chris Lattner24943d22010-06-08 16:52:24 +0000149// Shouldn't really be settable after initialization as this could cause lots of problems; don't want users
150// trying to switch modes in the middle of a debugging session.
151void
152SBDebugger::SetInputFileHandle (FILE *fh, bool transfer_ownership)
153{
Greg Claytone005f2c2010-11-06 01:53:30 +0000154 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000155
156 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000157 log->Printf ("SBDebugger(%p)::SetInputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
158 fh, transfer_ownership);
Caroline Tice7826c882010-10-26 03:11:13 +0000159
Greg Clayton63094e02010-06-23 01:19:29 +0000160 if (m_opaque_sp)
161 m_opaque_sp->SetInputFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000162}
163
164void
165SBDebugger::SetOutputFileHandle (FILE *fh, bool transfer_ownership)
166{
Greg Claytone005f2c2010-11-06 01:53:30 +0000167 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000168
169
170 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000171 log->Printf ("SBDebugger(%p)::SetOutputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
172 fh, transfer_ownership);
Caroline Tice7826c882010-10-26 03:11:13 +0000173
Greg Clayton63094e02010-06-23 01:19:29 +0000174 if (m_opaque_sp)
175 m_opaque_sp->SetOutputFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000176}
177
178void
179SBDebugger::SetErrorFileHandle (FILE *fh, bool transfer_ownership)
180{
Greg Claytone005f2c2010-11-06 01:53:30 +0000181 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000182
183
184 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000185 log->Printf ("SBDebugger(%p)::SetErrorFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
186 fh, transfer_ownership);
Caroline Tice7826c882010-10-26 03:11:13 +0000187
Greg Clayton63094e02010-06-23 01:19:29 +0000188 if (m_opaque_sp)
189 m_opaque_sp->SetErrorFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000190}
191
192FILE *
193SBDebugger::GetInputFileHandle ()
194{
Greg Clayton63094e02010-06-23 01:19:29 +0000195 if (m_opaque_sp)
Greg Clayton58928562011-02-09 01:08:52 +0000196 return m_opaque_sp->GetInputFile().GetStream();
Greg Clayton63094e02010-06-23 01:19:29 +0000197 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000198}
199
200FILE *
201SBDebugger::GetOutputFileHandle ()
202{
Greg Clayton63094e02010-06-23 01:19:29 +0000203 if (m_opaque_sp)
Greg Clayton58928562011-02-09 01:08:52 +0000204 return m_opaque_sp->GetOutputFile().GetStream();
Greg Clayton63094e02010-06-23 01:19:29 +0000205 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000206}
207
208FILE *
209SBDebugger::GetErrorFileHandle ()
210{
Greg Clayton63094e02010-06-23 01:19:29 +0000211 if (m_opaque_sp)
Greg Clayton58928562011-02-09 01:08:52 +0000212 return m_opaque_sp->GetErrorFile().GetStream();
Greg Clayton63094e02010-06-23 01:19:29 +0000213 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000214}
215
216SBCommandInterpreter
217SBDebugger::GetCommandInterpreter ()
218{
Greg Claytone005f2c2010-11-06 01:53:30 +0000219 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000220
Greg Clayton63094e02010-06-23 01:19:29 +0000221 SBCommandInterpreter sb_interpreter;
222 if (m_opaque_sp)
223 sb_interpreter.reset (&m_opaque_sp->GetCommandInterpreter());
Caroline Tice7826c882010-10-26 03:11:13 +0000224
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000225 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000226 log->Printf ("SBDebugger(%p)::GetCommandInterpreter () => SBCommandInterpreter(%p)",
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000227 m_opaque_sp.get(), sb_interpreter.get());
228
Chris Lattner24943d22010-06-08 16:52:24 +0000229 return sb_interpreter;
230}
231
232void
233SBDebugger::HandleCommand (const char *command)
234{
Greg Clayton63094e02010-06-23 01:19:29 +0000235 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000236 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000237 TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
238 Mutex::Locker api_locker;
239 if (target_sp)
240 api_locker.Reset(target_sp->GetAPIMutex().GetMutex());
241
Greg Clayton63094e02010-06-23 01:19:29 +0000242 SBCommandInterpreter sb_interpreter(GetCommandInterpreter ());
243 SBCommandReturnObject result;
244
245 sb_interpreter.HandleCommand (command, result, false);
246
247 if (GetErrorFileHandle() != NULL)
248 result.PutError (GetErrorFileHandle());
249 if (GetOutputFileHandle() != NULL)
250 result.PutOutput (GetOutputFileHandle());
251
252 if (m_opaque_sp->GetAsyncExecution() == false)
Chris Lattner24943d22010-06-08 16:52:24 +0000253 {
Greg Clayton63094e02010-06-23 01:19:29 +0000254 SBProcess process(GetCommandInterpreter().GetProcess ());
255 if (process.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000256 {
Greg Clayton63094e02010-06-23 01:19:29 +0000257 EventSP event_sp;
258 Listener &lldb_listener = m_opaque_sp->GetListener();
259 while (lldb_listener.GetNextEventForBroadcaster (process.get(), event_sp))
260 {
261 SBEvent event(event_sp);
262 HandleProcessEvent (process, event, GetOutputFileHandle(), GetErrorFileHandle());
263 }
Chris Lattner24943d22010-06-08 16:52:24 +0000264 }
265 }
266 }
267}
268
269SBListener
270SBDebugger::GetListener ()
271{
Greg Claytone005f2c2010-11-06 01:53:30 +0000272 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000273
Greg Clayton63094e02010-06-23 01:19:29 +0000274 SBListener sb_listener;
275 if (m_opaque_sp)
276 sb_listener.reset(&m_opaque_sp->GetListener(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000277
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000278 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000279 log->Printf ("SBDebugger(%p)::GetListener () => SBListener(%p)", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000280 sb_listener.get());
281
Chris Lattner24943d22010-06-08 16:52:24 +0000282 return sb_listener;
283}
284
285void
286SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, FILE *out, FILE *err)
287{
Greg Claytonbdcda462010-12-20 20:49:23 +0000288 if (!process.IsValid())
289 return;
Chris Lattner24943d22010-06-08 16:52:24 +0000290
Greg Claytonbdcda462010-12-20 20:49:23 +0000291 const uint32_t event_type = event.GetType();
292 char stdio_buffer[1024];
293 size_t len;
Chris Lattner24943d22010-06-08 16:52:24 +0000294
Greg Claytonbdcda462010-12-20 20:49:23 +0000295 Mutex::Locker api_locker (process.GetTarget()->GetAPIMutex());
296
297 if (event_type & (Process::eBroadcastBitSTDOUT | Process::eBroadcastBitStateChanged))
Chris Lattner24943d22010-06-08 16:52:24 +0000298 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000299 // Drain stdout when we stop just in case we have any bytes
300 while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
301 if (out != NULL)
302 ::fwrite (stdio_buffer, 1, len, out);
303 }
304
305 if (event_type & (Process::eBroadcastBitSTDERR | Process::eBroadcastBitStateChanged))
306 {
307 // Drain stderr when we stop just in case we have any bytes
308 while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
309 if (err != NULL)
310 ::fwrite (stdio_buffer, 1, len, err);
311 }
312
313 if (event_type & Process::eBroadcastBitStateChanged)
314 {
315 StateType event_state = SBProcess::GetStateFromEvent (event);
316
317 if (event_state == eStateInvalid)
318 return;
319
320 bool is_stopped = StateIsStoppedState (event_state);
321 if (!is_stopped)
322 process.ReportEventState (event, out);
Chris Lattner24943d22010-06-08 16:52:24 +0000323 }
324}
325
Chris Lattner24943d22010-06-08 16:52:24 +0000326SBSourceManager &
327SBDebugger::GetSourceManager ()
328{
329 static SourceManager g_lldb_source_manager;
Greg Clayton538eb822010-11-05 23:17:00 +0000330 static SBSourceManager g_sb_source_manager (&g_lldb_source_manager);
Chris Lattner24943d22010-06-08 16:52:24 +0000331 return g_sb_source_manager;
332}
333
334
335bool
336SBDebugger::GetDefaultArchitecture (char *arch_name, size_t arch_name_len)
337{
338 if (arch_name && arch_name_len)
339 {
Caroline Tice5bc8c972010-09-20 20:44:43 +0000340 ArchSpec default_arch = lldb_private::Target::GetDefaultArchitecture ();
341
Chris Lattner24943d22010-06-08 16:52:24 +0000342 if (default_arch.IsValid())
343 {
344 ::snprintf (arch_name, arch_name_len, "%s", default_arch.AsCString());
345 return true;
346 }
347 }
348 if (arch_name && arch_name_len)
349 arch_name[0] = '\0';
350 return false;
351}
352
353
354bool
355SBDebugger::SetDefaultArchitecture (const char *arch_name)
356{
357 if (arch_name)
358 {
359 ArchSpec arch (arch_name);
360 if (arch.IsValid())
361 {
Caroline Tice5bc8c972010-09-20 20:44:43 +0000362 lldb_private::Target::SetDefaultArchitecture (arch);
Chris Lattner24943d22010-06-08 16:52:24 +0000363 return true;
364 }
365 }
366 return false;
367}
368
369ScriptLanguage
370SBDebugger::GetScriptingLanguage (const char *script_language_name)
371{
Greg Claytonbdcda462010-12-20 20:49:23 +0000372
Chris Lattner24943d22010-06-08 16:52:24 +0000373 return Args::StringToScriptLanguage (script_language_name,
374 eScriptLanguageDefault,
375 NULL);
376}
Chris Lattner24943d22010-06-08 16:52:24 +0000377
378const char *
379SBDebugger::GetVersionString ()
380{
381 return lldb_private::GetVersion();
382}
383
384const char *
385SBDebugger::StateAsCString (lldb::StateType state)
386{
387 return lldb_private::StateAsCString (state);
388}
389
390bool
391SBDebugger::StateIsRunningState (lldb::StateType state)
392{
Greg Claytone005f2c2010-11-06 01:53:30 +0000393 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000394
395 const bool result = lldb_private::StateIsRunningState (state);
396 if (log)
397 log->Printf ("SBDebugger::StateIsRunningState (state=%s) => %i",
398 lldb_private::StateAsCString (state), result);
399
400 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000401}
402
403bool
404SBDebugger::StateIsStoppedState (lldb::StateType state)
405{
Greg Claytone005f2c2010-11-06 01:53:30 +0000406 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000407
Greg Claytona66ba462010-10-30 04:51:46 +0000408 const bool result = lldb_private::StateIsStoppedState (state);
Caroline Tice7826c882010-10-26 03:11:13 +0000409 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000410 log->Printf ("SBDebugger::StateIsStoppedState (state=%s) => %i",
411 lldb_private::StateAsCString (state), result);
Caroline Tice7826c882010-10-26 03:11:13 +0000412
Greg Claytona66ba462010-10-30 04:51:46 +0000413 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000414}
415
416
417SBTarget
418SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename,
419 const char *target_triple)
420{
Greg Clayton63094e02010-06-23 01:19:29 +0000421 SBTarget target;
422 if (m_opaque_sp)
423 {
424 ArchSpec arch;
Greg Clayton537a7a82010-10-20 20:54:39 +0000425 FileSpec file_spec (filename, true);
Greg Clayton63094e02010-06-23 01:19:29 +0000426 arch.SetArchFromTargetTriple(target_triple);
427 TargetSP target_sp;
428 Error error (m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file_spec, arch, NULL, true, target_sp));
429 target.reset (target_sp);
430 }
Greg Claytona66ba462010-10-30 04:51:46 +0000431
Greg Claytone005f2c2010-11-06 01:53:30 +0000432 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000433 if (log)
434 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000435 log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndTargetTriple (filename=\"%s\", triple=%s) => SBTarget(%p)",
Greg Claytona66ba462010-10-30 04:51:46 +0000436 m_opaque_sp.get(), filename, target_triple, target.get());
437 }
438
Chris Lattner24943d22010-06-08 16:52:24 +0000439 return target;
440}
441
442SBTarget
443SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *archname)
444{
Greg Claytone005f2c2010-11-06 01:53:30 +0000445 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000446
Greg Clayton63094e02010-06-23 01:19:29 +0000447 SBTarget target;
448 if (m_opaque_sp)
449 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000450 FileSpec file (filename, true);
Caroline Tice5bc8c972010-09-20 20:44:43 +0000451 ArchSpec arch = lldb_private::Target::GetDefaultArchitecture ();
Greg Clayton63094e02010-06-23 01:19:29 +0000452 TargetSP target_sp;
453 Error error;
Chris Lattner24943d22010-06-08 16:52:24 +0000454
Greg Clayton63094e02010-06-23 01:19:29 +0000455 if (archname != NULL)
456 {
457 ArchSpec arch2 (archname);
458 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch2, NULL, true, target_sp);
459 }
460 else
461 {
462 if (!arch.IsValid())
463 arch = LLDB_ARCH_DEFAULT;
464
465 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
466
467 if (error.Fail())
468 {
469 if (arch == LLDB_ARCH_DEFAULT_32BIT)
470 arch = LLDB_ARCH_DEFAULT_64BIT;
471 else
472 arch = LLDB_ARCH_DEFAULT_32BIT;
473
474 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
475 }
476 }
477
478 if (error.Success())
479 {
Jim Inghamc8332952010-08-26 21:32:51 +0000480 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Clayton63094e02010-06-23 01:19:29 +0000481 target.reset(target_sp);
482 }
Chris Lattner24943d22010-06-08 16:52:24 +0000483 }
Caroline Tice7826c882010-10-26 03:11:13 +0000484
485 if (log)
486 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000487 log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndArch (filename=\"%s\", arch=%s) => SBTarget(%p)",
Greg Claytona66ba462010-10-30 04:51:46 +0000488 m_opaque_sp.get(), filename, archname, target.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000489 }
490
Greg Clayton63094e02010-06-23 01:19:29 +0000491 return target;
492}
493
494SBTarget
495SBDebugger::CreateTarget (const char *filename)
496{
497 SBTarget target;
498 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000499 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000500 FileSpec file (filename, true);
Caroline Tice5bc8c972010-09-20 20:44:43 +0000501 ArchSpec arch = lldb_private::Target::GetDefaultArchitecture ();
Greg Clayton63094e02010-06-23 01:19:29 +0000502 TargetSP target_sp;
503 Error error;
504
Chris Lattner24943d22010-06-08 16:52:24 +0000505 if (!arch.IsValid())
506 arch = LLDB_ARCH_DEFAULT;
507
Greg Clayton63094e02010-06-23 01:19:29 +0000508 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000509
510 if (error.Fail())
511 {
512 if (arch == LLDB_ARCH_DEFAULT_32BIT)
513 arch = LLDB_ARCH_DEFAULT_64BIT;
514 else
515 arch = LLDB_ARCH_DEFAULT_32BIT;
516
Greg Clayton63094e02010-06-23 01:19:29 +0000517 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
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);
Chris Lattner24943d22010-06-08 16:52:24 +0000524 }
525 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000526 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000527 if (log)
528 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000529 log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)",
Greg Claytona66ba462010-10-30 04:51:46 +0000530 m_opaque_sp.get(), filename, target.get());
531 }
Greg Clayton63094e02010-06-23 01:19:29 +0000532 return target;
Chris Lattner24943d22010-06-08 16:52:24 +0000533}
534
535SBTarget
536SBDebugger::GetTargetAtIndex (uint32_t idx)
537{
Greg Clayton63094e02010-06-23 01:19:29 +0000538 SBTarget sb_target;
539 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000540 {
541 // No need to lock, the target list is thread safe
Greg Clayton63094e02010-06-23 01:19:29 +0000542 sb_target.reset(m_opaque_sp->GetTargetList().GetTargetAtIndex (idx));
Greg Claytonbdcda462010-12-20 20:49:23 +0000543 }
Chris Lattner24943d22010-06-08 16:52:24 +0000544 return sb_target;
545}
546
547SBTarget
548SBDebugger::FindTargetWithProcessID (pid_t pid)
549{
Greg Clayton63094e02010-06-23 01:19:29 +0000550 SBTarget sb_target;
551 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000552 {
553 // No need to lock, the target list is thread safe
Greg Clayton63094e02010-06-23 01:19:29 +0000554 sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid));
Greg Claytonbdcda462010-12-20 20:49:23 +0000555 }
Chris Lattner24943d22010-06-08 16:52:24 +0000556 return sb_target;
557}
558
559SBTarget
560SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name)
561{
Greg Clayton63094e02010-06-23 01:19:29 +0000562 SBTarget sb_target;
563 if (m_opaque_sp && filename && filename[0])
564 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000565 // No need to lock, the target list is thread safe
Greg Clayton63094e02010-06-23 01:19:29 +0000566 ArchSpec arch;
567 if (arch_name)
568 arch.SetArch(arch_name);
Greg Clayton537a7a82010-10-20 20:54:39 +0000569 TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename, false), arch_name ? &arch : NULL));
Greg Clayton63094e02010-06-23 01:19:29 +0000570 sb_target.reset(target_sp);
571 }
572 return sb_target;
Chris Lattner24943d22010-06-08 16:52:24 +0000573}
574
575SBTarget
576SBDebugger::FindTargetWithLLDBProcess (const lldb::ProcessSP &process_sp)
577{
Greg Clayton63094e02010-06-23 01:19:29 +0000578 SBTarget sb_target;
579 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000580 {
581 // No need to lock, the target list is thread safe
Greg Clayton63094e02010-06-23 01:19:29 +0000582 sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get()));
Greg Claytonbdcda462010-12-20 20:49:23 +0000583 }
Chris Lattner24943d22010-06-08 16:52:24 +0000584 return sb_target;
585}
586
587
588uint32_t
589SBDebugger::GetNumTargets ()
590{
Greg Clayton63094e02010-06-23 01:19:29 +0000591 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000592 {
593 // No need to lock, the target list is thread safe
Greg Clayton63094e02010-06-23 01:19:29 +0000594 return m_opaque_sp->GetTargetList().GetNumTargets ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000595 }
Greg Clayton63094e02010-06-23 01:19:29 +0000596 return 0;
597}
Chris Lattner24943d22010-06-08 16:52:24 +0000598
599SBTarget
Jim Inghamc8332952010-08-26 21:32:51 +0000600SBDebugger::GetSelectedTarget ()
Chris Lattner24943d22010-06-08 16:52:24 +0000601{
Greg Claytone005f2c2010-11-06 01:53:30 +0000602 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000603
Greg Clayton63094e02010-06-23 01:19:29 +0000604 SBTarget sb_target;
605 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000606 {
607 // No need to lock, the target list is thread safe
Jim Inghamc8332952010-08-26 21:32:51 +0000608 sb_target.reset(m_opaque_sp->GetTargetList().GetSelectedTarget ());
Greg Claytonbdcda462010-12-20 20:49:23 +0000609 }
Caroline Tice7826c882010-10-26 03:11:13 +0000610
611 if (log)
612 {
613 SBStream sstr;
614 sb_target.GetDescription (sstr, lldb::eDescriptionLevelBrief);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000615 log->Printf ("SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000616 sb_target.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000617 }
618
Chris Lattner24943d22010-06-08 16:52:24 +0000619 return sb_target;
620}
621
622void
623SBDebugger::DispatchInput (void *baton, const void *data, size_t data_len)
624{
Greg Claytone005f2c2010-11-06 01:53:30 +0000625 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000626
627 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000628 log->Printf ("SBDebugger(%p)::DispatchInput (baton=%p, data=\"%.*s\", size_t=%zu)", m_opaque_sp.get(),
629 baton, (int) data_len, (const char *) data, data_len);
Caroline Tice7826c882010-10-26 03:11:13 +0000630
Greg Clayton63094e02010-06-23 01:19:29 +0000631 if (m_opaque_sp)
632 m_opaque_sp->DispatchInput ((const char *) data, data_len);
Chris Lattner24943d22010-06-08 16:52:24 +0000633}
634
635void
Caroline Ticec4f55fe2010-11-19 20:47:54 +0000636SBDebugger::DispatchInputInterrupt ()
637{
638 if (m_opaque_sp)
639 m_opaque_sp->DispatchInputInterrupt ();
640}
641
642void
643SBDebugger::DispatchInputEndOfFile ()
644{
645 if (m_opaque_sp)
646 m_opaque_sp->DispatchInputEndOfFile ();
647}
648
649void
Chris Lattner24943d22010-06-08 16:52:24 +0000650SBDebugger::PushInputReader (SBInputReader &reader)
651{
Greg Claytone005f2c2010-11-06 01:53:30 +0000652 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000653
654 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000655 log->Printf ("SBDebugger(%p)::PushInputReader (SBInputReader(%p))", m_opaque_sp.get(), &reader);
Caroline Tice7826c882010-10-26 03:11:13 +0000656
Greg Clayton63094e02010-06-23 01:19:29 +0000657 if (m_opaque_sp && reader.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000658 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000659 TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
660 Mutex::Locker api_locker;
661 if (target_sp)
662 api_locker.Reset(target_sp->GetAPIMutex().GetMutex());
Chris Lattner24943d22010-06-08 16:52:24 +0000663 InputReaderSP reader_sp(*reader);
Greg Clayton63094e02010-06-23 01:19:29 +0000664 m_opaque_sp->PushInputReader (reader_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000665 }
666}
Greg Clayton63094e02010-06-23 01:19:29 +0000667
668void
669SBDebugger::reset (const lldb::DebuggerSP &debugger_sp)
670{
671 m_opaque_sp = debugger_sp;
672}
673
674Debugger *
675SBDebugger::get () const
676{
677 return m_opaque_sp.get();
678}
679
680Debugger &
681SBDebugger::ref () const
682{
683 assert (m_opaque_sp.get());
684 return *m_opaque_sp;
685}
686
687
Caroline Tice558be582010-06-30 16:22:25 +0000688SBDebugger
689SBDebugger::FindDebuggerWithID (int id)
690{
Greg Claytonbdcda462010-12-20 20:49:23 +0000691 // No need to lock, the debugger list is thread safe
Caroline Tice558be582010-06-30 16:22:25 +0000692 SBDebugger sb_debugger;
693 lldb::DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id);
694 if (debugger_sp)
695 sb_debugger.reset (debugger_sp);
696 return sb_debugger;
697}
Jim Ingham74989e82010-08-30 19:44:40 +0000698
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000699const char *
700SBDebugger::GetInstanceName()
701{
702 if (m_opaque_sp)
703 return m_opaque_sp->GetInstanceName().AsCString();
704 else
705 return NULL;
706}
707
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000708SBError
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000709SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000710{
711 lldb::UserSettingsControllerSP root_settings_controller = lldb_private::Debugger::GetSettingsController();
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000712
Caroline Tice1ebef442010-09-27 00:30:10 +0000713 Error err = root_settings_controller->SetVariable (var_name, value, lldb::eVarSetOperationAssign, true,
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000714 debugger_instance_name);
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000715 SBError sb_error;
716 sb_error.SetError (err);
717
718 return sb_error;
719}
720
721lldb::SBStringList
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000722SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000723{
724 SBStringList ret_value;
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000725 lldb::SettableVariableType var_type;
Johnny Chenf5e43262010-12-20 20:33:26 +0000726 lldb_private::Error err;
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000727
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000728 lldb::UserSettingsControllerSP root_settings_controller = lldb_private::Debugger::GetSettingsController();
729
Caroline Tice5bc8c972010-09-20 20:44:43 +0000730 StringList value = root_settings_controller->GetVariable (var_name, var_type, debugger_instance_name, err);
731
732 if (err.Success())
733 {
734 for (unsigned i = 0; i != value.GetSize(); ++i)
735 ret_value.AppendString (value.GetStringAtIndex(i));
736 }
737 else
738 {
739 ret_value.AppendString (err.AsCString());
740 }
741
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000742
743 return ret_value;
744}
745
Greg Clayton238c0a12010-09-18 01:14:36 +0000746uint32_t
747SBDebugger::GetTerminalWidth () const
748{
749 if (m_opaque_sp)
750 return m_opaque_sp->GetTerminalWidth ();
751 return 0;
752}
753
754void
755SBDebugger::SetTerminalWidth (uint32_t term_width)
756{
757 if (m_opaque_sp)
758 m_opaque_sp->SetTerminalWidth (term_width);
759}
760
761const char *
762SBDebugger::GetPrompt() const
763{
Greg Claytone005f2c2010-11-06 01:53:30 +0000764 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000765
766 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000767 log->Printf ("SBDebugger(%p)::GetPrompt () => \"%s\"", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000768 (m_opaque_sp ? m_opaque_sp->GetPrompt() : ""));
Caroline Tice7826c882010-10-26 03:11:13 +0000769
Greg Clayton238c0a12010-09-18 01:14:36 +0000770 if (m_opaque_sp)
771 return m_opaque_sp->GetPrompt ();
772 return 0;
773}
774
775void
776SBDebugger::SetPrompt (const char *prompt)
777{
778 if (m_opaque_sp)
779 m_opaque_sp->SetPrompt (prompt);
780}
781
782
783lldb::ScriptLanguage
784SBDebugger::GetScriptLanguage() const
785{
786 if (m_opaque_sp)
787 return m_opaque_sp->GetScriptLanguage ();
788 return eScriptLanguageNone;
789}
790
791void
792SBDebugger::SetScriptLanguage (lldb::ScriptLanguage script_lang)
793{
794 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000795 {
Greg Clayton238c0a12010-09-18 01:14:36 +0000796 m_opaque_sp->SetScriptLanguage (script_lang);
Greg Claytonbdcda462010-12-20 20:49:23 +0000797 }
Greg Clayton238c0a12010-09-18 01:14:36 +0000798}
799
Jim Ingham74989e82010-08-30 19:44:40 +0000800bool
801SBDebugger::SetUseExternalEditor (bool value)
802{
803 if (m_opaque_sp)
804 return m_opaque_sp->SetUseExternalEditor (value);
Greg Claytonbdcda462010-12-20 20:49:23 +0000805 return false;
Jim Ingham74989e82010-08-30 19:44:40 +0000806}
807
808bool
Caroline Tice5bc8c972010-09-20 20:44:43 +0000809SBDebugger::GetUseExternalEditor ()
Jim Ingham74989e82010-08-30 19:44:40 +0000810{
811 if (m_opaque_sp)
Caroline Tice5bc8c972010-09-20 20:44:43 +0000812 return m_opaque_sp->GetUseExternalEditor ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000813 return false;
Jim Ingham74989e82010-08-30 19:44:40 +0000814}
815
Caroline Tice98f930f2010-09-20 05:20:02 +0000816bool
817SBDebugger::GetDescription (SBStream &description)
818{
819 if (m_opaque_sp)
820 {
821 const char *name = m_opaque_sp->GetInstanceName().AsCString();
822 lldb::user_id_t id = m_opaque_sp->GetID();
Greg Clayton49ce6822010-10-31 03:01:06 +0000823 description.Printf ("Debugger (instance: \"%s\", id: %d)", name, id);
Caroline Tice98f930f2010-09-20 05:20:02 +0000824 }
825 else
826 description.Printf ("No value");
827
828 return true;
829}
Caroline Ticec4f55fe2010-11-19 20:47:54 +0000830
831lldb::user_id_t
832SBDebugger::GetID()
833{
834 if (m_opaque_sp)
835 return m_opaque_sp->GetID();
836 return LLDB_INVALID_UID;
837}