blob: f871524dd064e5a2ef29dd6e87f5229ddd01c114 [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 {
Greg Clayton940b1032011-02-23 00:35:02 +0000344 ::snprintf (arch_name, arch_name_len, "%s", default_arch.GetArchitectureName());
Chris Lattner24943d22010-06-08 16:52:24 +0000345 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 Clayton940b1032011-02-23 00:35:02 +0000426 arch.SetTriple (target_triple);
Greg Clayton63094e02010-06-23 01:19:29 +0000427 TargetSP target_sp;
Greg Claytone4b9c1f2011-03-08 22:40:15 +0000428 Error error (m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file_spec, arch, true, target_sp));
Greg Clayton63094e02010-06-23 01:19:29 +0000429 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
Greg Clayton940b1032011-02-23 00:35:02 +0000443SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *arch_cstr)
Chris Lattner24943d22010-06-08 16:52:24 +0000444{
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);
Greg Clayton940b1032011-02-23 00:35:02 +0000451 ArchSpec arch;
Greg Clayton63094e02010-06-23 01:19:29 +0000452 TargetSP target_sp;
453 Error error;
Chris Lattner24943d22010-06-08 16:52:24 +0000454
Greg Clayton940b1032011-02-23 00:35:02 +0000455 if (arch_cstr)
456 arch.SetTriple (arch_cstr);
Greg Clayton940b1032011-02-23 00:35:02 +0000457
Greg Claytone4b9c1f2011-03-08 22:40:15 +0000458 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, true, target_sp);
Greg Clayton63094e02010-06-23 01:19:29 +0000459
460 if (error.Success())
461 {
Jim Inghamc8332952010-08-26 21:32:51 +0000462 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Clayton63094e02010-06-23 01:19:29 +0000463 target.reset(target_sp);
464 }
Chris Lattner24943d22010-06-08 16:52:24 +0000465 }
Caroline Tice7826c882010-10-26 03:11:13 +0000466
467 if (log)
468 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000469 log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndArch (filename=\"%s\", arch=%s) => SBTarget(%p)",
Greg Clayton940b1032011-02-23 00:35:02 +0000470 m_opaque_sp.get(), filename, arch_cstr, target.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000471 }
472
Greg Clayton63094e02010-06-23 01:19:29 +0000473 return target;
474}
475
476SBTarget
477SBDebugger::CreateTarget (const char *filename)
478{
479 SBTarget target;
480 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000481 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000482 FileSpec file (filename, true);
Caroline Tice5bc8c972010-09-20 20:44:43 +0000483 ArchSpec arch = lldb_private::Target::GetDefaultArchitecture ();
Greg Clayton63094e02010-06-23 01:19:29 +0000484 TargetSP target_sp;
485 Error error;
486
Greg Claytone4b9c1f2011-03-08 22:40:15 +0000487 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, true, target_sp);
Greg Clayton63094e02010-06-23 01:19:29 +0000488
489 if (error.Success())
490 {
Jim Inghamc8332952010-08-26 21:32:51 +0000491 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Clayton63094e02010-06-23 01:19:29 +0000492 target.reset (target_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000493 }
494 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000495 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000496 if (log)
497 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000498 log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)",
Greg Claytona66ba462010-10-30 04:51:46 +0000499 m_opaque_sp.get(), filename, target.get());
500 }
Greg Clayton63094e02010-06-23 01:19:29 +0000501 return target;
Chris Lattner24943d22010-06-08 16:52:24 +0000502}
503
504SBTarget
505SBDebugger::GetTargetAtIndex (uint32_t idx)
506{
Greg Clayton63094e02010-06-23 01:19:29 +0000507 SBTarget sb_target;
508 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000509 {
510 // No need to lock, the target list is thread safe
Greg Clayton63094e02010-06-23 01:19:29 +0000511 sb_target.reset(m_opaque_sp->GetTargetList().GetTargetAtIndex (idx));
Greg Claytonbdcda462010-12-20 20:49:23 +0000512 }
Chris Lattner24943d22010-06-08 16:52:24 +0000513 return sb_target;
514}
515
516SBTarget
517SBDebugger::FindTargetWithProcessID (pid_t pid)
518{
Greg Clayton63094e02010-06-23 01:19:29 +0000519 SBTarget sb_target;
520 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000521 {
522 // No need to lock, the target list is thread safe
Greg Clayton63094e02010-06-23 01:19:29 +0000523 sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid));
Greg Claytonbdcda462010-12-20 20:49:23 +0000524 }
Chris Lattner24943d22010-06-08 16:52:24 +0000525 return sb_target;
526}
527
528SBTarget
529SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name)
530{
Greg Clayton63094e02010-06-23 01:19:29 +0000531 SBTarget sb_target;
532 if (m_opaque_sp && filename && filename[0])
533 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000534 // No need to lock, the target list is thread safe
Greg Clayton940b1032011-02-23 00:35:02 +0000535 ArchSpec arch (arch_name);
Greg Clayton537a7a82010-10-20 20:54:39 +0000536 TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename, false), arch_name ? &arch : NULL));
Greg Clayton63094e02010-06-23 01:19:29 +0000537 sb_target.reset(target_sp);
538 }
539 return sb_target;
Chris Lattner24943d22010-06-08 16:52:24 +0000540}
541
542SBTarget
543SBDebugger::FindTargetWithLLDBProcess (const lldb::ProcessSP &process_sp)
544{
Greg Clayton63094e02010-06-23 01:19:29 +0000545 SBTarget sb_target;
546 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000547 {
548 // No need to lock, the target list is thread safe
Greg Clayton63094e02010-06-23 01:19:29 +0000549 sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get()));
Greg Claytonbdcda462010-12-20 20:49:23 +0000550 }
Chris Lattner24943d22010-06-08 16:52:24 +0000551 return sb_target;
552}
553
554
555uint32_t
556SBDebugger::GetNumTargets ()
557{
Greg Clayton63094e02010-06-23 01:19:29 +0000558 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000559 {
560 // No need to lock, the target list is thread safe
Greg Clayton63094e02010-06-23 01:19:29 +0000561 return m_opaque_sp->GetTargetList().GetNumTargets ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000562 }
Greg Clayton63094e02010-06-23 01:19:29 +0000563 return 0;
564}
Chris Lattner24943d22010-06-08 16:52:24 +0000565
566SBTarget
Jim Inghamc8332952010-08-26 21:32:51 +0000567SBDebugger::GetSelectedTarget ()
Chris Lattner24943d22010-06-08 16:52:24 +0000568{
Greg Claytone005f2c2010-11-06 01:53:30 +0000569 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000570
Greg Clayton63094e02010-06-23 01:19:29 +0000571 SBTarget sb_target;
572 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000573 {
574 // No need to lock, the target list is thread safe
Jim Inghamc8332952010-08-26 21:32:51 +0000575 sb_target.reset(m_opaque_sp->GetTargetList().GetSelectedTarget ());
Greg Claytonbdcda462010-12-20 20:49:23 +0000576 }
Caroline Tice7826c882010-10-26 03:11:13 +0000577
578 if (log)
579 {
580 SBStream sstr;
581 sb_target.GetDescription (sstr, lldb::eDescriptionLevelBrief);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000582 log->Printf ("SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000583 sb_target.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000584 }
585
Chris Lattner24943d22010-06-08 16:52:24 +0000586 return sb_target;
587}
588
589void
590SBDebugger::DispatchInput (void *baton, const void *data, size_t data_len)
591{
Greg Claytone005f2c2010-11-06 01:53:30 +0000592 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000593
594 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000595 log->Printf ("SBDebugger(%p)::DispatchInput (baton=%p, data=\"%.*s\", size_t=%zu)", m_opaque_sp.get(),
596 baton, (int) data_len, (const char *) data, data_len);
Caroline Tice7826c882010-10-26 03:11:13 +0000597
Greg Clayton63094e02010-06-23 01:19:29 +0000598 if (m_opaque_sp)
599 m_opaque_sp->DispatchInput ((const char *) data, data_len);
Chris Lattner24943d22010-06-08 16:52:24 +0000600}
601
602void
Caroline Ticec4f55fe2010-11-19 20:47:54 +0000603SBDebugger::DispatchInputInterrupt ()
604{
605 if (m_opaque_sp)
606 m_opaque_sp->DispatchInputInterrupt ();
607}
608
609void
610SBDebugger::DispatchInputEndOfFile ()
611{
612 if (m_opaque_sp)
613 m_opaque_sp->DispatchInputEndOfFile ();
614}
615
616void
Chris Lattner24943d22010-06-08 16:52:24 +0000617SBDebugger::PushInputReader (SBInputReader &reader)
618{
Greg Claytone005f2c2010-11-06 01:53:30 +0000619 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000620
621 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000622 log->Printf ("SBDebugger(%p)::PushInputReader (SBInputReader(%p))", m_opaque_sp.get(), &reader);
Caroline Tice7826c882010-10-26 03:11:13 +0000623
Greg Clayton63094e02010-06-23 01:19:29 +0000624 if (m_opaque_sp && reader.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000625 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000626 TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
627 Mutex::Locker api_locker;
628 if (target_sp)
629 api_locker.Reset(target_sp->GetAPIMutex().GetMutex());
Chris Lattner24943d22010-06-08 16:52:24 +0000630 InputReaderSP reader_sp(*reader);
Greg Clayton63094e02010-06-23 01:19:29 +0000631 m_opaque_sp->PushInputReader (reader_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000632 }
633}
Greg Clayton63094e02010-06-23 01:19:29 +0000634
635void
636SBDebugger::reset (const lldb::DebuggerSP &debugger_sp)
637{
638 m_opaque_sp = debugger_sp;
639}
640
641Debugger *
642SBDebugger::get () const
643{
644 return m_opaque_sp.get();
645}
646
647Debugger &
648SBDebugger::ref () const
649{
650 assert (m_opaque_sp.get());
651 return *m_opaque_sp;
652}
653
654
Caroline Tice558be582010-06-30 16:22:25 +0000655SBDebugger
656SBDebugger::FindDebuggerWithID (int id)
657{
Greg Claytonbdcda462010-12-20 20:49:23 +0000658 // No need to lock, the debugger list is thread safe
Caroline Tice558be582010-06-30 16:22:25 +0000659 SBDebugger sb_debugger;
660 lldb::DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id);
661 if (debugger_sp)
662 sb_debugger.reset (debugger_sp);
663 return sb_debugger;
664}
Jim Ingham74989e82010-08-30 19:44:40 +0000665
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000666const char *
667SBDebugger::GetInstanceName()
668{
669 if (m_opaque_sp)
670 return m_opaque_sp->GetInstanceName().AsCString();
671 else
672 return NULL;
673}
674
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000675SBError
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000676SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000677{
678 lldb::UserSettingsControllerSP root_settings_controller = lldb_private::Debugger::GetSettingsController();
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000679
Caroline Tice1ebef442010-09-27 00:30:10 +0000680 Error err = root_settings_controller->SetVariable (var_name, value, lldb::eVarSetOperationAssign, true,
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000681 debugger_instance_name);
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000682 SBError sb_error;
683 sb_error.SetError (err);
684
685 return sb_error;
686}
687
688lldb::SBStringList
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000689SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000690{
691 SBStringList ret_value;
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000692 lldb::SettableVariableType var_type;
Johnny Chenf5e43262010-12-20 20:33:26 +0000693 lldb_private::Error err;
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000694
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000695 lldb::UserSettingsControllerSP root_settings_controller = lldb_private::Debugger::GetSettingsController();
696
Caroline Tice5bc8c972010-09-20 20:44:43 +0000697 StringList value = root_settings_controller->GetVariable (var_name, var_type, debugger_instance_name, err);
698
699 if (err.Success())
700 {
701 for (unsigned i = 0; i != value.GetSize(); ++i)
702 ret_value.AppendString (value.GetStringAtIndex(i));
703 }
704 else
705 {
706 ret_value.AppendString (err.AsCString());
707 }
708
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000709
710 return ret_value;
711}
712
Greg Clayton238c0a12010-09-18 01:14:36 +0000713uint32_t
714SBDebugger::GetTerminalWidth () const
715{
716 if (m_opaque_sp)
717 return m_opaque_sp->GetTerminalWidth ();
718 return 0;
719}
720
721void
722SBDebugger::SetTerminalWidth (uint32_t term_width)
723{
724 if (m_opaque_sp)
725 m_opaque_sp->SetTerminalWidth (term_width);
726}
727
728const char *
729SBDebugger::GetPrompt() const
730{
Greg Claytone005f2c2010-11-06 01:53:30 +0000731 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000732
733 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000734 log->Printf ("SBDebugger(%p)::GetPrompt () => \"%s\"", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000735 (m_opaque_sp ? m_opaque_sp->GetPrompt() : ""));
Caroline Tice7826c882010-10-26 03:11:13 +0000736
Greg Clayton238c0a12010-09-18 01:14:36 +0000737 if (m_opaque_sp)
738 return m_opaque_sp->GetPrompt ();
739 return 0;
740}
741
742void
743SBDebugger::SetPrompt (const char *prompt)
744{
745 if (m_opaque_sp)
746 m_opaque_sp->SetPrompt (prompt);
747}
748
749
750lldb::ScriptLanguage
751SBDebugger::GetScriptLanguage() const
752{
753 if (m_opaque_sp)
754 return m_opaque_sp->GetScriptLanguage ();
755 return eScriptLanguageNone;
756}
757
758void
759SBDebugger::SetScriptLanguage (lldb::ScriptLanguage script_lang)
760{
761 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000762 {
Greg Clayton238c0a12010-09-18 01:14:36 +0000763 m_opaque_sp->SetScriptLanguage (script_lang);
Greg Claytonbdcda462010-12-20 20:49:23 +0000764 }
Greg Clayton238c0a12010-09-18 01:14:36 +0000765}
766
Jim Ingham74989e82010-08-30 19:44:40 +0000767bool
768SBDebugger::SetUseExternalEditor (bool value)
769{
770 if (m_opaque_sp)
771 return m_opaque_sp->SetUseExternalEditor (value);
Greg Claytonbdcda462010-12-20 20:49:23 +0000772 return false;
Jim Ingham74989e82010-08-30 19:44:40 +0000773}
774
775bool
Caroline Tice5bc8c972010-09-20 20:44:43 +0000776SBDebugger::GetUseExternalEditor ()
Jim Ingham74989e82010-08-30 19:44:40 +0000777{
778 if (m_opaque_sp)
Caroline Tice5bc8c972010-09-20 20:44:43 +0000779 return m_opaque_sp->GetUseExternalEditor ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000780 return false;
Jim Ingham74989e82010-08-30 19:44:40 +0000781}
782
Caroline Tice98f930f2010-09-20 05:20:02 +0000783bool
784SBDebugger::GetDescription (SBStream &description)
785{
786 if (m_opaque_sp)
787 {
788 const char *name = m_opaque_sp->GetInstanceName().AsCString();
789 lldb::user_id_t id = m_opaque_sp->GetID();
Greg Clayton49ce6822010-10-31 03:01:06 +0000790 description.Printf ("Debugger (instance: \"%s\", id: %d)", name, id);
Caroline Tice98f930f2010-09-20 05:20:02 +0000791 }
792 else
793 description.Printf ("No value");
794
795 return true;
796}
Caroline Ticec4f55fe2010-11-19 20:47:54 +0000797
798lldb::user_id_t
799SBDebugger::GetID()
800{
801 if (m_opaque_sp)
802 return m_opaque_sp->GetID();
803 return LLDB_INVALID_UID;
804}