blob: eea2ba29051106e067fcb6990a0b114ac91c7345 [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- SBDebugger.cpp ------------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Eli Friedmand6ec8aa2010-06-09 07:37:52 +000010#include "lldb/API/SBDebugger.h"
Chris Lattner24943d22010-06-08 16:52:24 +000011
12#include "lldb/lldb-include.h"
Chris Lattner24943d22010-06-08 16:52:24 +000013
Eli Friedmand6ec8aa2010-06-09 07:37:52 +000014#include "lldb/API/SBListener.h"
15#include "lldb/API/SBBroadcaster.h"
16#include "lldb/API/SBCommandInterpreter.h"
17#include "lldb/API/SBCommandReturnObject.h"
18#include "lldb/API/SBEvent.h"
19#include "lldb/API/SBFrame.h"
Eli Friedmand6ec8aa2010-06-09 07:37:52 +000020#include "lldb/API/SBInputReader.h"
Caroline Tice6e4c5ce2010-09-04 00:03:46 +000021#include "lldb/API/SBProcess.h"
22#include "lldb/API/SBSourceManager.h"
Caroline Tice98f930f2010-09-20 05:20:02 +000023#include "lldb/API/SBStream.h"
Caroline Tice6e4c5ce2010-09-04 00:03:46 +000024#include "lldb/API/SBStringList.h"
25#include "lldb/API/SBTarget.h"
26#include "lldb/API/SBThread.h"
Greg Clayton887aa282010-10-11 01:05:37 +000027#include "lldb/Core/Debugger.h"
28#include "lldb/Core/State.h"
29#include "lldb/Interpreter/Args.h"
30#include "lldb/Interpreter/CommandInterpreter.h"
31#include "lldb/Target/Process.h"
32#include "lldb/Target/TargetList.h"
Chris Lattner24943d22010-06-08 16:52:24 +000033
34using namespace lldb;
35using namespace lldb_private;
36
37void
38SBDebugger::Initialize ()
39{
Greg Claytone005f2c2010-11-06 01:53:30 +000040 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +000041
42 if (log)
43 log->Printf ("SBDebugger::Initialize ()");
44
Chris Lattner24943d22010-06-08 16:52:24 +000045 Debugger::Initialize();
46}
47
48void
49SBDebugger::Terminate ()
50{
51 Debugger::Terminate();
52}
53
Greg Clayton43490d12010-07-30 20:12:55 +000054void
55SBDebugger::Clear ()
56{
Greg Claytone005f2c2010-11-06 01:53:30 +000057 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +000058
59 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +000060 log->Printf ("SBDebugger(%p)::Clear ()", m_opaque_sp.get());
Caroline Ticec0446862010-12-20 18:35:50 +000061
62 if (m_opaque_sp)
63 m_opaque_sp->CleanUpInputReaders ();
Caroline Tice7826c882010-10-26 03:11:13 +000064
Greg Clayton43490d12010-07-30 20:12:55 +000065 m_opaque_sp.reset();
66}
67
Greg Clayton63094e02010-06-23 01:19:29 +000068SBDebugger
69SBDebugger::Create()
70{
Greg Claytone005f2c2010-11-06 01:53:30 +000071 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +000072
Greg Clayton63094e02010-06-23 01:19:29 +000073 SBDebugger debugger;
74 debugger.reset(Debugger::CreateInstance());
Caroline Tice7826c882010-10-26 03:11:13 +000075
76 if (log)
77 {
78 SBStream sstr;
79 debugger.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +000080 log->Printf ("SBDebugger::Create () => SBDebugger(%p): %s", debugger.m_opaque_sp.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +000081 }
82
Greg Clayton63094e02010-06-23 01:19:29 +000083 return debugger;
84}
85
Greg Clayton63094e02010-06-23 01:19:29 +000086SBDebugger::SBDebugger () :
87 m_opaque_sp ()
88{
89}
90
Greg Clayton538eb822010-11-05 23:17:00 +000091SBDebugger::SBDebugger(const SBDebugger &rhs) :
92 m_opaque_sp (rhs.m_opaque_sp)
93{
94}
95
96SBDebugger &
97SBDebugger::operator = (const SBDebugger &rhs)
98{
99 if (this != &rhs)
100 {
101 m_opaque_sp = rhs.m_opaque_sp;
102 }
103 return *this;
104}
105
Greg Clayton63094e02010-06-23 01:19:29 +0000106SBDebugger::~SBDebugger ()
107{
108}
109
110bool
111SBDebugger::IsValid() const
112{
113 return m_opaque_sp.get() != NULL;
114}
115
116
Chris Lattner24943d22010-06-08 16:52:24 +0000117void
118SBDebugger::SetAsync (bool b)
119{
Greg Clayton63094e02010-06-23 01:19:29 +0000120 if (m_opaque_sp)
121 m_opaque_sp->SetAsyncExecution(b);
Chris Lattner24943d22010-06-08 16:52:24 +0000122}
123
Greg Clayton887aa282010-10-11 01:05:37 +0000124void
125SBDebugger::SkipLLDBInitFiles (bool b)
126{
127 if (m_opaque_sp)
128 m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles (b);
129}
130
Chris Lattner24943d22010-06-08 16:52:24 +0000131// Shouldn't really be settable after initialization as this could cause lots of problems; don't want users
132// trying to switch modes in the middle of a debugging session.
133void
134SBDebugger::SetInputFileHandle (FILE *fh, bool transfer_ownership)
135{
Greg Claytone005f2c2010-11-06 01:53:30 +0000136 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000137
138 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000139 log->Printf ("SBDebugger(%p)::SetInputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
140 fh, transfer_ownership);
Caroline Tice7826c882010-10-26 03:11:13 +0000141
Greg Clayton63094e02010-06-23 01:19:29 +0000142 if (m_opaque_sp)
143 m_opaque_sp->SetInputFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000144}
145
146void
147SBDebugger::SetOutputFileHandle (FILE *fh, bool transfer_ownership)
148{
Greg Claytone005f2c2010-11-06 01:53:30 +0000149 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000150
151
152 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000153 log->Printf ("SBDebugger(%p)::SetOutputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
154 fh, transfer_ownership);
Caroline Tice7826c882010-10-26 03:11:13 +0000155
Greg Clayton63094e02010-06-23 01:19:29 +0000156 if (m_opaque_sp)
157 m_opaque_sp->SetOutputFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000158}
159
160void
161SBDebugger::SetErrorFileHandle (FILE *fh, bool transfer_ownership)
162{
Greg Claytone005f2c2010-11-06 01:53:30 +0000163 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000164
165
166 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000167 log->Printf ("SBDebugger(%p)::SetErrorFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
168 fh, transfer_ownership);
Caroline Tice7826c882010-10-26 03:11:13 +0000169
Greg Clayton63094e02010-06-23 01:19:29 +0000170 if (m_opaque_sp)
171 m_opaque_sp->SetErrorFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000172}
173
174FILE *
175SBDebugger::GetInputFileHandle ()
176{
Greg Clayton63094e02010-06-23 01:19:29 +0000177 if (m_opaque_sp)
178 return m_opaque_sp->GetInputFileHandle();
179 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000180}
181
182FILE *
183SBDebugger::GetOutputFileHandle ()
184{
Greg Clayton63094e02010-06-23 01:19:29 +0000185 if (m_opaque_sp)
186 return m_opaque_sp->GetOutputFileHandle();
187 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000188}
189
190FILE *
191SBDebugger::GetErrorFileHandle ()
192{
Greg Clayton63094e02010-06-23 01:19:29 +0000193 if (m_opaque_sp)
194 return m_opaque_sp->GetErrorFileHandle();
195 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000196}
197
198SBCommandInterpreter
199SBDebugger::GetCommandInterpreter ()
200{
Greg Claytone005f2c2010-11-06 01:53:30 +0000201 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000202
Greg Clayton63094e02010-06-23 01:19:29 +0000203 SBCommandInterpreter sb_interpreter;
204 if (m_opaque_sp)
205 sb_interpreter.reset (&m_opaque_sp->GetCommandInterpreter());
Caroline Tice7826c882010-10-26 03:11:13 +0000206
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000207 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000208 log->Printf ("SBDebugger(%p)::GetCommandInterpreter () => SBCommandInterpreter(%p)",
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000209 m_opaque_sp.get(), sb_interpreter.get());
210
Chris Lattner24943d22010-06-08 16:52:24 +0000211 return sb_interpreter;
212}
213
214void
215SBDebugger::HandleCommand (const char *command)
216{
Greg Clayton63094e02010-06-23 01:19:29 +0000217 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000218 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000219 TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
220 Mutex::Locker api_locker;
221 if (target_sp)
222 api_locker.Reset(target_sp->GetAPIMutex().GetMutex());
223
Greg Clayton63094e02010-06-23 01:19:29 +0000224 SBCommandInterpreter sb_interpreter(GetCommandInterpreter ());
225 SBCommandReturnObject result;
226
227 sb_interpreter.HandleCommand (command, result, false);
228
229 if (GetErrorFileHandle() != NULL)
230 result.PutError (GetErrorFileHandle());
231 if (GetOutputFileHandle() != NULL)
232 result.PutOutput (GetOutputFileHandle());
233
234 if (m_opaque_sp->GetAsyncExecution() == false)
Chris Lattner24943d22010-06-08 16:52:24 +0000235 {
Greg Clayton63094e02010-06-23 01:19:29 +0000236 SBProcess process(GetCommandInterpreter().GetProcess ());
237 if (process.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000238 {
Greg Clayton63094e02010-06-23 01:19:29 +0000239 EventSP event_sp;
240 Listener &lldb_listener = m_opaque_sp->GetListener();
241 while (lldb_listener.GetNextEventForBroadcaster (process.get(), event_sp))
242 {
243 SBEvent event(event_sp);
244 HandleProcessEvent (process, event, GetOutputFileHandle(), GetErrorFileHandle());
245 }
Chris Lattner24943d22010-06-08 16:52:24 +0000246 }
247 }
248 }
249}
250
251SBListener
252SBDebugger::GetListener ()
253{
Greg Claytone005f2c2010-11-06 01:53:30 +0000254 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000255
Greg Clayton63094e02010-06-23 01:19:29 +0000256 SBListener sb_listener;
257 if (m_opaque_sp)
258 sb_listener.reset(&m_opaque_sp->GetListener(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000259
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000260 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000261 log->Printf ("SBDebugger(%p)::GetListener () => SBListener(%p)", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000262 sb_listener.get());
263
Chris Lattner24943d22010-06-08 16:52:24 +0000264 return sb_listener;
265}
266
267void
268SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, FILE *out, FILE *err)
269{
Greg Claytonbdcda462010-12-20 20:49:23 +0000270 if (!process.IsValid())
271 return;
Chris Lattner24943d22010-06-08 16:52:24 +0000272
Greg Claytonbdcda462010-12-20 20:49:23 +0000273 const uint32_t event_type = event.GetType();
274 char stdio_buffer[1024];
275 size_t len;
Chris Lattner24943d22010-06-08 16:52:24 +0000276
Greg Claytonbdcda462010-12-20 20:49:23 +0000277 Mutex::Locker api_locker (process.GetTarget()->GetAPIMutex());
278
279 if (event_type & (Process::eBroadcastBitSTDOUT | Process::eBroadcastBitStateChanged))
Chris Lattner24943d22010-06-08 16:52:24 +0000280 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000281 // Drain stdout when we stop just in case we have any bytes
282 while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
283 if (out != NULL)
284 ::fwrite (stdio_buffer, 1, len, out);
285 }
286
287 if (event_type & (Process::eBroadcastBitSTDERR | Process::eBroadcastBitStateChanged))
288 {
289 // Drain stderr when we stop just in case we have any bytes
290 while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
291 if (err != NULL)
292 ::fwrite (stdio_buffer, 1, len, err);
293 }
294
295 if (event_type & Process::eBroadcastBitStateChanged)
296 {
297 StateType event_state = SBProcess::GetStateFromEvent (event);
298
299 if (event_state == eStateInvalid)
300 return;
301
302 bool is_stopped = StateIsStoppedState (event_state);
303 if (!is_stopped)
304 process.ReportEventState (event, out);
Chris Lattner24943d22010-06-08 16:52:24 +0000305 }
306}
307
Chris Lattner24943d22010-06-08 16:52:24 +0000308SBSourceManager &
309SBDebugger::GetSourceManager ()
310{
311 static SourceManager g_lldb_source_manager;
Greg Clayton538eb822010-11-05 23:17:00 +0000312 static SBSourceManager g_sb_source_manager (&g_lldb_source_manager);
Chris Lattner24943d22010-06-08 16:52:24 +0000313 return g_sb_source_manager;
314}
315
316
317bool
318SBDebugger::GetDefaultArchitecture (char *arch_name, size_t arch_name_len)
319{
320 if (arch_name && arch_name_len)
321 {
Caroline Tice5bc8c972010-09-20 20:44:43 +0000322 ArchSpec default_arch = lldb_private::Target::GetDefaultArchitecture ();
323
Chris Lattner24943d22010-06-08 16:52:24 +0000324 if (default_arch.IsValid())
325 {
326 ::snprintf (arch_name, arch_name_len, "%s", default_arch.AsCString());
327 return true;
328 }
329 }
330 if (arch_name && arch_name_len)
331 arch_name[0] = '\0';
332 return false;
333}
334
335
336bool
337SBDebugger::SetDefaultArchitecture (const char *arch_name)
338{
339 if (arch_name)
340 {
341 ArchSpec arch (arch_name);
342 if (arch.IsValid())
343 {
Caroline Tice5bc8c972010-09-20 20:44:43 +0000344 lldb_private::Target::SetDefaultArchitecture (arch);
Chris Lattner24943d22010-06-08 16:52:24 +0000345 return true;
346 }
347 }
348 return false;
349}
350
351ScriptLanguage
352SBDebugger::GetScriptingLanguage (const char *script_language_name)
353{
Greg Claytonbdcda462010-12-20 20:49:23 +0000354
Chris Lattner24943d22010-06-08 16:52:24 +0000355 return Args::StringToScriptLanguage (script_language_name,
356 eScriptLanguageDefault,
357 NULL);
358}
Chris Lattner24943d22010-06-08 16:52:24 +0000359
360const char *
361SBDebugger::GetVersionString ()
362{
363 return lldb_private::GetVersion();
364}
365
366const char *
367SBDebugger::StateAsCString (lldb::StateType state)
368{
369 return lldb_private::StateAsCString (state);
370}
371
372bool
373SBDebugger::StateIsRunningState (lldb::StateType state)
374{
Greg Claytone005f2c2010-11-06 01:53:30 +0000375 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000376
377 const bool result = lldb_private::StateIsRunningState (state);
378 if (log)
379 log->Printf ("SBDebugger::StateIsRunningState (state=%s) => %i",
380 lldb_private::StateAsCString (state), result);
381
382 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000383}
384
385bool
386SBDebugger::StateIsStoppedState (lldb::StateType state)
387{
Greg Claytone005f2c2010-11-06 01:53:30 +0000388 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000389
Greg Claytona66ba462010-10-30 04:51:46 +0000390 const bool result = lldb_private::StateIsStoppedState (state);
Caroline Tice7826c882010-10-26 03:11:13 +0000391 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000392 log->Printf ("SBDebugger::StateIsStoppedState (state=%s) => %i",
393 lldb_private::StateAsCString (state), result);
Caroline Tice7826c882010-10-26 03:11:13 +0000394
Greg Claytona66ba462010-10-30 04:51:46 +0000395 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000396}
397
398
399SBTarget
400SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename,
401 const char *target_triple)
402{
Greg Clayton63094e02010-06-23 01:19:29 +0000403 SBTarget target;
404 if (m_opaque_sp)
405 {
406 ArchSpec arch;
Greg Clayton537a7a82010-10-20 20:54:39 +0000407 FileSpec file_spec (filename, true);
Greg Clayton63094e02010-06-23 01:19:29 +0000408 arch.SetArchFromTargetTriple(target_triple);
409 TargetSP target_sp;
410 Error error (m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file_spec, arch, NULL, true, target_sp));
411 target.reset (target_sp);
412 }
Greg Claytona66ba462010-10-30 04:51:46 +0000413
Greg Claytone005f2c2010-11-06 01:53:30 +0000414 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000415 if (log)
416 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000417 log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndTargetTriple (filename=\"%s\", triple=%s) => SBTarget(%p)",
Greg Claytona66ba462010-10-30 04:51:46 +0000418 m_opaque_sp.get(), filename, target_triple, target.get());
419 }
420
Chris Lattner24943d22010-06-08 16:52:24 +0000421 return target;
422}
423
424SBTarget
425SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *archname)
426{
Greg Claytone005f2c2010-11-06 01:53:30 +0000427 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000428
Greg Clayton63094e02010-06-23 01:19:29 +0000429 SBTarget target;
430 if (m_opaque_sp)
431 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000432 FileSpec file (filename, true);
Caroline Tice5bc8c972010-09-20 20:44:43 +0000433 ArchSpec arch = lldb_private::Target::GetDefaultArchitecture ();
Greg Clayton63094e02010-06-23 01:19:29 +0000434 TargetSP target_sp;
435 Error error;
Chris Lattner24943d22010-06-08 16:52:24 +0000436
Greg Clayton63094e02010-06-23 01:19:29 +0000437 if (archname != NULL)
438 {
439 ArchSpec arch2 (archname);
440 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch2, NULL, true, target_sp);
441 }
442 else
443 {
444 if (!arch.IsValid())
445 arch = LLDB_ARCH_DEFAULT;
446
447 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
448
449 if (error.Fail())
450 {
451 if (arch == LLDB_ARCH_DEFAULT_32BIT)
452 arch = LLDB_ARCH_DEFAULT_64BIT;
453 else
454 arch = LLDB_ARCH_DEFAULT_32BIT;
455
456 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
457 }
458 }
459
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 Claytona66ba462010-10-30 04:51:46 +0000470 m_opaque_sp.get(), filename, archname, 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
Chris Lattner24943d22010-06-08 16:52:24 +0000487 if (!arch.IsValid())
488 arch = LLDB_ARCH_DEFAULT;
489
Greg Clayton63094e02010-06-23 01:19:29 +0000490 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000491
492 if (error.Fail())
493 {
494 if (arch == LLDB_ARCH_DEFAULT_32BIT)
495 arch = LLDB_ARCH_DEFAULT_64BIT;
496 else
497 arch = LLDB_ARCH_DEFAULT_32BIT;
498
Greg Clayton63094e02010-06-23 01:19:29 +0000499 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
500 }
501
502 if (error.Success())
503 {
Jim Inghamc8332952010-08-26 21:32:51 +0000504 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Clayton63094e02010-06-23 01:19:29 +0000505 target.reset (target_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000506 }
507 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000508 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000509 if (log)
510 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000511 log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)",
Greg Claytona66ba462010-10-30 04:51:46 +0000512 m_opaque_sp.get(), filename, target.get());
513 }
Greg Clayton63094e02010-06-23 01:19:29 +0000514 return target;
Chris Lattner24943d22010-06-08 16:52:24 +0000515}
516
517SBTarget
518SBDebugger::GetTargetAtIndex (uint32_t idx)
519{
Greg Clayton63094e02010-06-23 01:19:29 +0000520 SBTarget sb_target;
521 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000522 {
523 // No need to lock, the target list is thread safe
Greg Clayton63094e02010-06-23 01:19:29 +0000524 sb_target.reset(m_opaque_sp->GetTargetList().GetTargetAtIndex (idx));
Greg Claytonbdcda462010-12-20 20:49:23 +0000525 }
Chris Lattner24943d22010-06-08 16:52:24 +0000526 return sb_target;
527}
528
529SBTarget
530SBDebugger::FindTargetWithProcessID (pid_t pid)
531{
Greg Clayton63094e02010-06-23 01:19:29 +0000532 SBTarget sb_target;
533 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000534 {
535 // No need to lock, the target list is thread safe
Greg Clayton63094e02010-06-23 01:19:29 +0000536 sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid));
Greg Claytonbdcda462010-12-20 20:49:23 +0000537 }
Chris Lattner24943d22010-06-08 16:52:24 +0000538 return sb_target;
539}
540
541SBTarget
542SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name)
543{
Greg Clayton63094e02010-06-23 01:19:29 +0000544 SBTarget sb_target;
545 if (m_opaque_sp && filename && filename[0])
546 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000547 // No need to lock, the target list is thread safe
Greg Clayton63094e02010-06-23 01:19:29 +0000548 ArchSpec arch;
549 if (arch_name)
550 arch.SetArch(arch_name);
Greg Clayton537a7a82010-10-20 20:54:39 +0000551 TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename, false), arch_name ? &arch : NULL));
Greg Clayton63094e02010-06-23 01:19:29 +0000552 sb_target.reset(target_sp);
553 }
554 return sb_target;
Chris Lattner24943d22010-06-08 16:52:24 +0000555}
556
557SBTarget
558SBDebugger::FindTargetWithLLDBProcess (const lldb::ProcessSP &process_sp)
559{
Greg Clayton63094e02010-06-23 01:19:29 +0000560 SBTarget sb_target;
561 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000562 {
563 // No need to lock, the target list is thread safe
Greg Clayton63094e02010-06-23 01:19:29 +0000564 sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get()));
Greg Claytonbdcda462010-12-20 20:49:23 +0000565 }
Chris Lattner24943d22010-06-08 16:52:24 +0000566 return sb_target;
567}
568
569
570uint32_t
571SBDebugger::GetNumTargets ()
572{
Greg Clayton63094e02010-06-23 01:19:29 +0000573 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000574 {
575 // No need to lock, the target list is thread safe
Greg Clayton63094e02010-06-23 01:19:29 +0000576 return m_opaque_sp->GetTargetList().GetNumTargets ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000577 }
Greg Clayton63094e02010-06-23 01:19:29 +0000578 return 0;
579}
Chris Lattner24943d22010-06-08 16:52:24 +0000580
581SBTarget
Jim Inghamc8332952010-08-26 21:32:51 +0000582SBDebugger::GetSelectedTarget ()
Chris Lattner24943d22010-06-08 16:52:24 +0000583{
Greg Claytone005f2c2010-11-06 01:53:30 +0000584 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000585
Greg Clayton63094e02010-06-23 01:19:29 +0000586 SBTarget sb_target;
587 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000588 {
589 // No need to lock, the target list is thread safe
Jim Inghamc8332952010-08-26 21:32:51 +0000590 sb_target.reset(m_opaque_sp->GetTargetList().GetSelectedTarget ());
Greg Claytonbdcda462010-12-20 20:49:23 +0000591 }
Caroline Tice7826c882010-10-26 03:11:13 +0000592
593 if (log)
594 {
595 SBStream sstr;
596 sb_target.GetDescription (sstr, lldb::eDescriptionLevelBrief);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000597 log->Printf ("SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000598 sb_target.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000599 }
600
Chris Lattner24943d22010-06-08 16:52:24 +0000601 return sb_target;
602}
603
604void
605SBDebugger::DispatchInput (void *baton, const void *data, size_t data_len)
606{
Greg Claytone005f2c2010-11-06 01:53:30 +0000607 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000608
609 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000610 log->Printf ("SBDebugger(%p)::DispatchInput (baton=%p, data=\"%.*s\", size_t=%zu)", m_opaque_sp.get(),
611 baton, (int) data_len, (const char *) data, data_len);
Caroline Tice7826c882010-10-26 03:11:13 +0000612
Greg Clayton63094e02010-06-23 01:19:29 +0000613 if (m_opaque_sp)
614 m_opaque_sp->DispatchInput ((const char *) data, data_len);
Chris Lattner24943d22010-06-08 16:52:24 +0000615}
616
617void
Caroline Ticec4f55fe2010-11-19 20:47:54 +0000618SBDebugger::DispatchInputInterrupt ()
619{
620 if (m_opaque_sp)
621 m_opaque_sp->DispatchInputInterrupt ();
622}
623
624void
625SBDebugger::DispatchInputEndOfFile ()
626{
627 if (m_opaque_sp)
628 m_opaque_sp->DispatchInputEndOfFile ();
629}
630
631void
Chris Lattner24943d22010-06-08 16:52:24 +0000632SBDebugger::PushInputReader (SBInputReader &reader)
633{
Greg Claytone005f2c2010-11-06 01:53:30 +0000634 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000635
636 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000637 log->Printf ("SBDebugger(%p)::PushInputReader (SBInputReader(%p))", m_opaque_sp.get(), &reader);
Caroline Tice7826c882010-10-26 03:11:13 +0000638
Greg Clayton63094e02010-06-23 01:19:29 +0000639 if (m_opaque_sp && reader.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000640 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000641 TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
642 Mutex::Locker api_locker;
643 if (target_sp)
644 api_locker.Reset(target_sp->GetAPIMutex().GetMutex());
Chris Lattner24943d22010-06-08 16:52:24 +0000645 InputReaderSP reader_sp(*reader);
Greg Clayton63094e02010-06-23 01:19:29 +0000646 m_opaque_sp->PushInputReader (reader_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000647 }
648}
Greg Clayton63094e02010-06-23 01:19:29 +0000649
650void
651SBDebugger::reset (const lldb::DebuggerSP &debugger_sp)
652{
653 m_opaque_sp = debugger_sp;
654}
655
656Debugger *
657SBDebugger::get () const
658{
659 return m_opaque_sp.get();
660}
661
662Debugger &
663SBDebugger::ref () const
664{
665 assert (m_opaque_sp.get());
666 return *m_opaque_sp;
667}
668
669
Caroline Tice558be582010-06-30 16:22:25 +0000670SBDebugger
671SBDebugger::FindDebuggerWithID (int id)
672{
Greg Claytonbdcda462010-12-20 20:49:23 +0000673 // No need to lock, the debugger list is thread safe
Caroline Tice558be582010-06-30 16:22:25 +0000674 SBDebugger sb_debugger;
675 lldb::DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id);
676 if (debugger_sp)
677 sb_debugger.reset (debugger_sp);
678 return sb_debugger;
679}
Jim Ingham74989e82010-08-30 19:44:40 +0000680
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000681const char *
682SBDebugger::GetInstanceName()
683{
684 if (m_opaque_sp)
685 return m_opaque_sp->GetInstanceName().AsCString();
686 else
687 return NULL;
688}
689
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000690SBError
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000691SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000692{
693 lldb::UserSettingsControllerSP root_settings_controller = lldb_private::Debugger::GetSettingsController();
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000694
Caroline Tice1ebef442010-09-27 00:30:10 +0000695 Error err = root_settings_controller->SetVariable (var_name, value, lldb::eVarSetOperationAssign, true,
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000696 debugger_instance_name);
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000697 SBError sb_error;
698 sb_error.SetError (err);
699
700 return sb_error;
701}
702
703lldb::SBStringList
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000704SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000705{
706 SBStringList ret_value;
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000707 lldb::SettableVariableType var_type;
Johnny Chenf5e43262010-12-20 20:33:26 +0000708 lldb_private::Error err;
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000709
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000710 lldb::UserSettingsControllerSP root_settings_controller = lldb_private::Debugger::GetSettingsController();
711
Caroline Tice5bc8c972010-09-20 20:44:43 +0000712 StringList value = root_settings_controller->GetVariable (var_name, var_type, debugger_instance_name, err);
713
714 if (err.Success())
715 {
716 for (unsigned i = 0; i != value.GetSize(); ++i)
717 ret_value.AppendString (value.GetStringAtIndex(i));
718 }
719 else
720 {
721 ret_value.AppendString (err.AsCString());
722 }
723
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000724
725 return ret_value;
726}
727
Greg Clayton238c0a12010-09-18 01:14:36 +0000728uint32_t
729SBDebugger::GetTerminalWidth () const
730{
731 if (m_opaque_sp)
732 return m_opaque_sp->GetTerminalWidth ();
733 return 0;
734}
735
736void
737SBDebugger::SetTerminalWidth (uint32_t term_width)
738{
739 if (m_opaque_sp)
740 m_opaque_sp->SetTerminalWidth (term_width);
741}
742
743const char *
744SBDebugger::GetPrompt() const
745{
Greg Claytone005f2c2010-11-06 01:53:30 +0000746 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000747
748 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000749 log->Printf ("SBDebugger(%p)::GetPrompt () => \"%s\"", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000750 (m_opaque_sp ? m_opaque_sp->GetPrompt() : ""));
Caroline Tice7826c882010-10-26 03:11:13 +0000751
Greg Clayton238c0a12010-09-18 01:14:36 +0000752 if (m_opaque_sp)
753 return m_opaque_sp->GetPrompt ();
754 return 0;
755}
756
757void
758SBDebugger::SetPrompt (const char *prompt)
759{
760 if (m_opaque_sp)
761 m_opaque_sp->SetPrompt (prompt);
762}
763
764
765lldb::ScriptLanguage
766SBDebugger::GetScriptLanguage() const
767{
768 if (m_opaque_sp)
769 return m_opaque_sp->GetScriptLanguage ();
770 return eScriptLanguageNone;
771}
772
773void
774SBDebugger::SetScriptLanguage (lldb::ScriptLanguage script_lang)
775{
776 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000777 {
Greg Clayton238c0a12010-09-18 01:14:36 +0000778 m_opaque_sp->SetScriptLanguage (script_lang);
Greg Claytonbdcda462010-12-20 20:49:23 +0000779 }
Greg Clayton238c0a12010-09-18 01:14:36 +0000780}
781
Jim Ingham74989e82010-08-30 19:44:40 +0000782bool
783SBDebugger::SetUseExternalEditor (bool value)
784{
785 if (m_opaque_sp)
786 return m_opaque_sp->SetUseExternalEditor (value);
Greg Claytonbdcda462010-12-20 20:49:23 +0000787 return false;
Jim Ingham74989e82010-08-30 19:44:40 +0000788}
789
790bool
Caroline Tice5bc8c972010-09-20 20:44:43 +0000791SBDebugger::GetUseExternalEditor ()
Jim Ingham74989e82010-08-30 19:44:40 +0000792{
793 if (m_opaque_sp)
Caroline Tice5bc8c972010-09-20 20:44:43 +0000794 return m_opaque_sp->GetUseExternalEditor ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000795 return false;
Jim Ingham74989e82010-08-30 19:44:40 +0000796}
797
Caroline Tice98f930f2010-09-20 05:20:02 +0000798bool
799SBDebugger::GetDescription (SBStream &description)
800{
801 if (m_opaque_sp)
802 {
803 const char *name = m_opaque_sp->GetInstanceName().AsCString();
804 lldb::user_id_t id = m_opaque_sp->GetID();
Greg Clayton49ce6822010-10-31 03:01:06 +0000805 description.Printf ("Debugger (instance: \"%s\", id: %d)", name, id);
Caroline Tice98f930f2010-09-20 05:20:02 +0000806 }
807 else
808 description.Printf ("No value");
809
810 return true;
811}
Caroline Ticec4f55fe2010-11-19 20:47:54 +0000812
813lldb::user_id_t
814SBDebugger::GetID()
815{
816 if (m_opaque_sp)
817 return m_opaque_sp->GetID();
818 return LLDB_INVALID_UID;
819}