blob: 2adf7963357e14a37e5044946d79d1af95754e71 [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;
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
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 Clayton63094e02010-06-23 01:19:29 +0000457 else
Greg Clayton940b1032011-02-23 00:35:02 +0000458 arch = lldb_private::Target::GetDefaultArchitecture ();
459
460 if (!arch.IsValid())
461 arch.SetTriple (LLDB_ARCH_DEFAULT);
462
463 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
464
465 if (error.Fail())
Greg Clayton63094e02010-06-23 01:19:29 +0000466 {
Greg Clayton940b1032011-02-23 00:35:02 +0000467 if (strcmp (LLDB_ARCH_DEFAULT, LLDB_ARCH_DEFAULT_32BIT) == 0)
468 arch.SetTriple (LLDB_ARCH_DEFAULT_64BIT);
469 else
470 arch.SetTriple (LLDB_ARCH_DEFAULT_32BIT);
Greg Clayton63094e02010-06-23 01:19:29 +0000471
472 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
Greg Clayton63094e02010-06-23 01:19:29 +0000473 }
474
475 if (error.Success())
476 {
Jim Inghamc8332952010-08-26 21:32:51 +0000477 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Clayton63094e02010-06-23 01:19:29 +0000478 target.reset(target_sp);
479 }
Chris Lattner24943d22010-06-08 16:52:24 +0000480 }
Caroline Tice7826c882010-10-26 03:11:13 +0000481
482 if (log)
483 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000484 log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndArch (filename=\"%s\", arch=%s) => SBTarget(%p)",
Greg Clayton940b1032011-02-23 00:35:02 +0000485 m_opaque_sp.get(), filename, arch_cstr, target.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000486 }
487
Greg Clayton63094e02010-06-23 01:19:29 +0000488 return target;
489}
490
491SBTarget
492SBDebugger::CreateTarget (const char *filename)
493{
494 SBTarget target;
495 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000496 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000497 FileSpec file (filename, true);
Caroline Tice5bc8c972010-09-20 20:44:43 +0000498 ArchSpec arch = lldb_private::Target::GetDefaultArchitecture ();
Greg Clayton63094e02010-06-23 01:19:29 +0000499 TargetSP target_sp;
500 Error error;
501
Chris Lattner24943d22010-06-08 16:52:24 +0000502 if (!arch.IsValid())
Greg Clayton940b1032011-02-23 00:35:02 +0000503 arch.SetTriple (LLDB_ARCH_DEFAULT);
Chris Lattner24943d22010-06-08 16:52:24 +0000504
Greg Clayton63094e02010-06-23 01:19:29 +0000505 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000506
507 if (error.Fail())
508 {
Greg Clayton940b1032011-02-23 00:35:02 +0000509 if (strcmp (LLDB_ARCH_DEFAULT, LLDB_ARCH_DEFAULT_32BIT) == 0)
510 arch.SetTriple (LLDB_ARCH_DEFAULT_64BIT);
Chris Lattner24943d22010-06-08 16:52:24 +0000511 else
Greg Clayton940b1032011-02-23 00:35:02 +0000512 arch.SetTriple (LLDB_ARCH_DEFAULT_32BIT);
Chris Lattner24943d22010-06-08 16:52:24 +0000513
Greg Clayton63094e02010-06-23 01:19:29 +0000514 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
515 }
516
517 if (error.Success())
518 {
Jim Inghamc8332952010-08-26 21:32:51 +0000519 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Clayton63094e02010-06-23 01:19:29 +0000520 target.reset (target_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000521 }
522 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000523 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000524 if (log)
525 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000526 log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)",
Greg Claytona66ba462010-10-30 04:51:46 +0000527 m_opaque_sp.get(), filename, target.get());
528 }
Greg Clayton63094e02010-06-23 01:19:29 +0000529 return target;
Chris Lattner24943d22010-06-08 16:52:24 +0000530}
531
532SBTarget
533SBDebugger::GetTargetAtIndex (uint32_t idx)
534{
Greg Clayton63094e02010-06-23 01:19:29 +0000535 SBTarget sb_target;
536 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000537 {
538 // No need to lock, the target list is thread safe
Greg Clayton63094e02010-06-23 01:19:29 +0000539 sb_target.reset(m_opaque_sp->GetTargetList().GetTargetAtIndex (idx));
Greg Claytonbdcda462010-12-20 20:49:23 +0000540 }
Chris Lattner24943d22010-06-08 16:52:24 +0000541 return sb_target;
542}
543
544SBTarget
545SBDebugger::FindTargetWithProcessID (pid_t pid)
546{
Greg Clayton63094e02010-06-23 01:19:29 +0000547 SBTarget sb_target;
548 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000549 {
550 // No need to lock, the target list is thread safe
Greg Clayton63094e02010-06-23 01:19:29 +0000551 sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid));
Greg Claytonbdcda462010-12-20 20:49:23 +0000552 }
Chris Lattner24943d22010-06-08 16:52:24 +0000553 return sb_target;
554}
555
556SBTarget
557SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name)
558{
Greg Clayton63094e02010-06-23 01:19:29 +0000559 SBTarget sb_target;
560 if (m_opaque_sp && filename && filename[0])
561 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000562 // No need to lock, the target list is thread safe
Greg Clayton940b1032011-02-23 00:35:02 +0000563 ArchSpec arch (arch_name);
Greg Clayton537a7a82010-10-20 20:54:39 +0000564 TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename, false), arch_name ? &arch : NULL));
Greg Clayton63094e02010-06-23 01:19:29 +0000565 sb_target.reset(target_sp);
566 }
567 return sb_target;
Chris Lattner24943d22010-06-08 16:52:24 +0000568}
569
570SBTarget
571SBDebugger::FindTargetWithLLDBProcess (const lldb::ProcessSP &process_sp)
572{
Greg Clayton63094e02010-06-23 01:19:29 +0000573 SBTarget sb_target;
574 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000575 {
576 // No need to lock, the target list is thread safe
Greg Clayton63094e02010-06-23 01:19:29 +0000577 sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get()));
Greg Claytonbdcda462010-12-20 20:49:23 +0000578 }
Chris Lattner24943d22010-06-08 16:52:24 +0000579 return sb_target;
580}
581
582
583uint32_t
584SBDebugger::GetNumTargets ()
585{
Greg Clayton63094e02010-06-23 01:19:29 +0000586 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000587 {
588 // No need to lock, the target list is thread safe
Greg Clayton63094e02010-06-23 01:19:29 +0000589 return m_opaque_sp->GetTargetList().GetNumTargets ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000590 }
Greg Clayton63094e02010-06-23 01:19:29 +0000591 return 0;
592}
Chris Lattner24943d22010-06-08 16:52:24 +0000593
594SBTarget
Jim Inghamc8332952010-08-26 21:32:51 +0000595SBDebugger::GetSelectedTarget ()
Chris Lattner24943d22010-06-08 16:52:24 +0000596{
Greg Claytone005f2c2010-11-06 01:53:30 +0000597 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000598
Greg Clayton63094e02010-06-23 01:19:29 +0000599 SBTarget sb_target;
600 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000601 {
602 // No need to lock, the target list is thread safe
Jim Inghamc8332952010-08-26 21:32:51 +0000603 sb_target.reset(m_opaque_sp->GetTargetList().GetSelectedTarget ());
Greg Claytonbdcda462010-12-20 20:49:23 +0000604 }
Caroline Tice7826c882010-10-26 03:11:13 +0000605
606 if (log)
607 {
608 SBStream sstr;
609 sb_target.GetDescription (sstr, lldb::eDescriptionLevelBrief);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000610 log->Printf ("SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000611 sb_target.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000612 }
613
Chris Lattner24943d22010-06-08 16:52:24 +0000614 return sb_target;
615}
616
617void
618SBDebugger::DispatchInput (void *baton, const void *data, size_t data_len)
619{
Greg Claytone005f2c2010-11-06 01:53:30 +0000620 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000621
622 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000623 log->Printf ("SBDebugger(%p)::DispatchInput (baton=%p, data=\"%.*s\", size_t=%zu)", m_opaque_sp.get(),
624 baton, (int) data_len, (const char *) data, data_len);
Caroline Tice7826c882010-10-26 03:11:13 +0000625
Greg Clayton63094e02010-06-23 01:19:29 +0000626 if (m_opaque_sp)
627 m_opaque_sp->DispatchInput ((const char *) data, data_len);
Chris Lattner24943d22010-06-08 16:52:24 +0000628}
629
630void
Caroline Ticec4f55fe2010-11-19 20:47:54 +0000631SBDebugger::DispatchInputInterrupt ()
632{
633 if (m_opaque_sp)
634 m_opaque_sp->DispatchInputInterrupt ();
635}
636
637void
638SBDebugger::DispatchInputEndOfFile ()
639{
640 if (m_opaque_sp)
641 m_opaque_sp->DispatchInputEndOfFile ();
642}
643
644void
Chris Lattner24943d22010-06-08 16:52:24 +0000645SBDebugger::PushInputReader (SBInputReader &reader)
646{
Greg Claytone005f2c2010-11-06 01:53:30 +0000647 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000648
649 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000650 log->Printf ("SBDebugger(%p)::PushInputReader (SBInputReader(%p))", m_opaque_sp.get(), &reader);
Caroline Tice7826c882010-10-26 03:11:13 +0000651
Greg Clayton63094e02010-06-23 01:19:29 +0000652 if (m_opaque_sp && reader.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000653 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000654 TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
655 Mutex::Locker api_locker;
656 if (target_sp)
657 api_locker.Reset(target_sp->GetAPIMutex().GetMutex());
Chris Lattner24943d22010-06-08 16:52:24 +0000658 InputReaderSP reader_sp(*reader);
Greg Clayton63094e02010-06-23 01:19:29 +0000659 m_opaque_sp->PushInputReader (reader_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000660 }
661}
Greg Clayton63094e02010-06-23 01:19:29 +0000662
663void
664SBDebugger::reset (const lldb::DebuggerSP &debugger_sp)
665{
666 m_opaque_sp = debugger_sp;
667}
668
669Debugger *
670SBDebugger::get () const
671{
672 return m_opaque_sp.get();
673}
674
675Debugger &
676SBDebugger::ref () const
677{
678 assert (m_opaque_sp.get());
679 return *m_opaque_sp;
680}
681
682
Caroline Tice558be582010-06-30 16:22:25 +0000683SBDebugger
684SBDebugger::FindDebuggerWithID (int id)
685{
Greg Claytonbdcda462010-12-20 20:49:23 +0000686 // No need to lock, the debugger list is thread safe
Caroline Tice558be582010-06-30 16:22:25 +0000687 SBDebugger sb_debugger;
688 lldb::DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id);
689 if (debugger_sp)
690 sb_debugger.reset (debugger_sp);
691 return sb_debugger;
692}
Jim Ingham74989e82010-08-30 19:44:40 +0000693
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000694const char *
695SBDebugger::GetInstanceName()
696{
697 if (m_opaque_sp)
698 return m_opaque_sp->GetInstanceName().AsCString();
699 else
700 return NULL;
701}
702
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000703SBError
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000704SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000705{
706 lldb::UserSettingsControllerSP root_settings_controller = lldb_private::Debugger::GetSettingsController();
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000707
Caroline Tice1ebef442010-09-27 00:30:10 +0000708 Error err = root_settings_controller->SetVariable (var_name, value, lldb::eVarSetOperationAssign, true,
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000709 debugger_instance_name);
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000710 SBError sb_error;
711 sb_error.SetError (err);
712
713 return sb_error;
714}
715
716lldb::SBStringList
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000717SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000718{
719 SBStringList ret_value;
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000720 lldb::SettableVariableType var_type;
Johnny Chenf5e43262010-12-20 20:33:26 +0000721 lldb_private::Error err;
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000722
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000723 lldb::UserSettingsControllerSP root_settings_controller = lldb_private::Debugger::GetSettingsController();
724
Caroline Tice5bc8c972010-09-20 20:44:43 +0000725 StringList value = root_settings_controller->GetVariable (var_name, var_type, debugger_instance_name, err);
726
727 if (err.Success())
728 {
729 for (unsigned i = 0; i != value.GetSize(); ++i)
730 ret_value.AppendString (value.GetStringAtIndex(i));
731 }
732 else
733 {
734 ret_value.AppendString (err.AsCString());
735 }
736
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000737
738 return ret_value;
739}
740
Greg Clayton238c0a12010-09-18 01:14:36 +0000741uint32_t
742SBDebugger::GetTerminalWidth () const
743{
744 if (m_opaque_sp)
745 return m_opaque_sp->GetTerminalWidth ();
746 return 0;
747}
748
749void
750SBDebugger::SetTerminalWidth (uint32_t term_width)
751{
752 if (m_opaque_sp)
753 m_opaque_sp->SetTerminalWidth (term_width);
754}
755
756const char *
757SBDebugger::GetPrompt() const
758{
Greg Claytone005f2c2010-11-06 01:53:30 +0000759 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000760
761 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000762 log->Printf ("SBDebugger(%p)::GetPrompt () => \"%s\"", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000763 (m_opaque_sp ? m_opaque_sp->GetPrompt() : ""));
Caroline Tice7826c882010-10-26 03:11:13 +0000764
Greg Clayton238c0a12010-09-18 01:14:36 +0000765 if (m_opaque_sp)
766 return m_opaque_sp->GetPrompt ();
767 return 0;
768}
769
770void
771SBDebugger::SetPrompt (const char *prompt)
772{
773 if (m_opaque_sp)
774 m_opaque_sp->SetPrompt (prompt);
775}
776
777
778lldb::ScriptLanguage
779SBDebugger::GetScriptLanguage() const
780{
781 if (m_opaque_sp)
782 return m_opaque_sp->GetScriptLanguage ();
783 return eScriptLanguageNone;
784}
785
786void
787SBDebugger::SetScriptLanguage (lldb::ScriptLanguage script_lang)
788{
789 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000790 {
Greg Clayton238c0a12010-09-18 01:14:36 +0000791 m_opaque_sp->SetScriptLanguage (script_lang);
Greg Claytonbdcda462010-12-20 20:49:23 +0000792 }
Greg Clayton238c0a12010-09-18 01:14:36 +0000793}
794
Jim Ingham74989e82010-08-30 19:44:40 +0000795bool
796SBDebugger::SetUseExternalEditor (bool value)
797{
798 if (m_opaque_sp)
799 return m_opaque_sp->SetUseExternalEditor (value);
Greg Claytonbdcda462010-12-20 20:49:23 +0000800 return false;
Jim Ingham74989e82010-08-30 19:44:40 +0000801}
802
803bool
Caroline Tice5bc8c972010-09-20 20:44:43 +0000804SBDebugger::GetUseExternalEditor ()
Jim Ingham74989e82010-08-30 19:44:40 +0000805{
806 if (m_opaque_sp)
Caroline Tice5bc8c972010-09-20 20:44:43 +0000807 return m_opaque_sp->GetUseExternalEditor ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000808 return false;
Jim Ingham74989e82010-08-30 19:44:40 +0000809}
810
Caroline Tice98f930f2010-09-20 05:20:02 +0000811bool
812SBDebugger::GetDescription (SBStream &description)
813{
814 if (m_opaque_sp)
815 {
816 const char *name = m_opaque_sp->GetInstanceName().AsCString();
817 lldb::user_id_t id = m_opaque_sp->GetID();
Greg Clayton49ce6822010-10-31 03:01:06 +0000818 description.Printf ("Debugger (instance: \"%s\", id: %d)", name, id);
Caroline Tice98f930f2010-09-20 05:20:02 +0000819 }
820 else
821 description.Printf ("No value");
822
823 return true;
824}
Caroline Ticec4f55fe2010-11-19 20:47:54 +0000825
826lldb::user_id_t
827SBDebugger::GetID()
828{
829 if (m_opaque_sp)
830 return m_opaque_sp->GetID();
831 return LLDB_INVALID_UID;
832}