blob: 20d62b4f809ead86b69055f7cd77ae4c85e4296f [file] [log] [blame]
Chris Lattner30fdc8d2010-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
Daniel Malea93a64302012-12-05 00:20:57 +000010#include "lldb/lldb-python.h"
11
Eli Friedmanca93cc12010-06-09 07:37:52 +000012#include "lldb/API/SBDebugger.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000013
Greg Claytone0d378b2011-03-24 21:19:54 +000014#include "lldb/lldb-private.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000015
Eli Friedmanca93cc12010-06-09 07:37:52 +000016#include "lldb/API/SBListener.h"
17#include "lldb/API/SBBroadcaster.h"
18#include "lldb/API/SBCommandInterpreter.h"
19#include "lldb/API/SBCommandReturnObject.h"
Greg Clayton2289fa42011-04-30 01:09:13 +000020#include "lldb/API/SBError.h"
Eli Friedmanca93cc12010-06-09 07:37:52 +000021#include "lldb/API/SBEvent.h"
22#include "lldb/API/SBFrame.h"
Caroline Tice3df9a8d2010-09-04 00:03:46 +000023#include "lldb/API/SBProcess.h"
24#include "lldb/API/SBSourceManager.h"
Caroline Ticedde9cff2010-09-20 05:20:02 +000025#include "lldb/API/SBStream.h"
Caroline Tice3df9a8d2010-09-04 00:03:46 +000026#include "lldb/API/SBStringList.h"
27#include "lldb/API/SBTarget.h"
28#include "lldb/API/SBThread.h"
Enrico Granata061858c2012-02-15 02:34:21 +000029#include "lldb/API/SBTypeCategory.h"
30#include "lldb/API/SBTypeFormat.h"
31#include "lldb/API/SBTypeFilter.h"
32#include "lldb/API/SBTypeNameSpecifier.h"
33#include "lldb/API/SBTypeSummary.h"
34#include "lldb/API/SBTypeSynthetic.h"
35
36
Greg Clayton6eee5aa2010-10-11 01:05:37 +000037#include "lldb/Core/Debugger.h"
38#include "lldb/Core/State.h"
Greg Clayton44d93782014-01-27 23:43:24 +000039#include "lldb/Core/StreamFile.h"
Enrico Granata5548cb52013-01-28 23:47:25 +000040#include "lldb/DataFormatters/DataVisualization.h"
Greg Clayton5fb8f792013-12-02 19:35:49 +000041#include "lldb/Host/DynamicLibrary.h"
Greg Clayton6eee5aa2010-10-11 01:05:37 +000042#include "lldb/Interpreter/Args.h"
43#include "lldb/Interpreter/CommandInterpreter.h"
Greg Claytoncac9c5f2011-09-24 00:52:29 +000044#include "lldb/Interpreter/OptionGroupPlatform.h"
Greg Clayton6eee5aa2010-10-11 01:05:37 +000045#include "lldb/Target/Process.h"
46#include "lldb/Target/TargetList.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000047
48using namespace lldb;
49using namespace lldb_private;
50
Greg Clayton5fb8f792013-12-02 19:35:49 +000051
Greg Clayton44d93782014-01-27 23:43:24 +000052SBInputReader::SBInputReader()
53{
54}
55SBInputReader::~SBInputReader()
56{
57}
58
59SBError
60SBInputReader::Initialize(lldb::SBDebugger& sb_debugger, unsigned long (*)(void*, lldb::SBInputReader*, lldb::InputReaderAction, char const*, unsigned long), void*, lldb::InputReaderGranularity, char const*, char const*, bool)
61{
62 return SBError();
63}
64
65void
66SBInputReader::SetIsDone(bool)
67{
68}
69bool
70SBInputReader::IsActive() const
71{
72 return false;
73}
74
Greg Clayton5fb8f792013-12-02 19:35:49 +000075static lldb::DynamicLibrarySP
76LoadPlugin (const lldb::DebuggerSP &debugger_sp, const FileSpec& spec, Error& error)
77{
78 lldb::DynamicLibrarySP dynlib_sp(new lldb_private::DynamicLibrary(spec));
79 if (dynlib_sp && dynlib_sp->IsValid())
80 {
81 typedef bool (*LLDBCommandPluginInit) (lldb::SBDebugger& debugger);
82
83 lldb::SBDebugger debugger_sb(debugger_sp);
84 // This calls the bool lldb::PluginInitialize(lldb::SBDebugger debugger) function.
85 // TODO: mangle this differently for your system - on OSX, the first underscore needs to be removed and the second one stays
86 LLDBCommandPluginInit init_func = dynlib_sp->GetSymbol<LLDBCommandPluginInit>("_ZN4lldb16PluginInitializeENS_10SBDebuggerE");
87 if (init_func)
88 {
89 if (init_func(debugger_sb))
90 return dynlib_sp;
91 else
92 error.SetErrorString("plug-in refused to load (lldb::PluginInitialize(lldb::SBDebugger) returned false)");
93 }
94 else
95 {
96 error.SetErrorString("plug-in is missing the required initialization: lldb::PluginInitialize(lldb::SBDebugger)");
97 }
98 }
99 else
100 {
101 if (spec.Exists())
102 error.SetErrorString("this file does not represent a loadable dylib");
103 else
104 error.SetErrorString("no such file");
105 }
106 return lldb::DynamicLibrarySP();
107}
108
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000109void
110SBDebugger::Initialize ()
111{
Greg Clayton5160ce52013-03-27 23:08:40 +0000112 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000113
114 if (log)
115 log->Printf ("SBDebugger::Initialize ()");
116
Greg Claytonfc36f7912011-03-22 01:14:58 +0000117 SBCommandInterpreter::InitializeSWIG ();
118
Greg Clayton5fb8f792013-12-02 19:35:49 +0000119 Debugger::Initialize(LoadPlugin);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000120}
121
122void
123SBDebugger::Terminate ()
124{
125 Debugger::Terminate();
126}
127
Greg Clayton48e42542010-07-30 20:12:55 +0000128void
129SBDebugger::Clear ()
130{
Greg Clayton5160ce52013-03-27 23:08:40 +0000131 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000132
133 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000134 log->Printf ("SBDebugger(%p)::Clear ()",
135 static_cast<void*>(m_opaque_sp.get()));
136
Caroline Tice3d6086f2010-12-20 18:35:50 +0000137 if (m_opaque_sp)
Greg Clayton44d93782014-01-27 23:43:24 +0000138 m_opaque_sp->ClearIOHandlers ();
Caroline Ticeceb6b132010-10-26 03:11:13 +0000139
Greg Clayton48e42542010-07-30 20:12:55 +0000140 m_opaque_sp.reset();
141}
142
Greg Clayton66111032010-06-23 01:19:29 +0000143SBDebugger
144SBDebugger::Create()
145{
Jim Ingham228063c2012-02-21 02:23:08 +0000146 return SBDebugger::Create(false, NULL, NULL);
Jim Ingham06942692011-08-13 00:22:20 +0000147}
148
149SBDebugger
150SBDebugger::Create(bool source_init_files)
151{
Jim Ingham228063c2012-02-21 02:23:08 +0000152 return SBDebugger::Create (source_init_files, NULL, NULL);
153}
154
155SBDebugger
156SBDebugger::Create(bool source_init_files, lldb::LogOutputCallback callback, void *baton)
157
158{
Greg Clayton5160ce52013-03-27 23:08:40 +0000159 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000160
Greg Clayton66111032010-06-23 01:19:29 +0000161 SBDebugger debugger;
Greg Claytoncb172b12014-05-19 20:42:14 +0000162
163 // Currently we have issues if this function is called simultaneously on two different
164 // threads. The issues mainly revolve around the fact that the lldb_private::FormatManager
165 // uses global collections and having two threads parsing the .lldbinit files can cause
166 // mayhem. So to get around this for now we need to use a mutex to prevent bad things
167 // from happening.
168 static Mutex g_mutex(Mutex::eMutexTypeRecursive);
169 Mutex::Locker locker(g_mutex);
170
Jim Ingham228063c2012-02-21 02:23:08 +0000171 debugger.reset(Debugger::CreateInstance(callback, baton));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000172
173 if (log)
174 {
175 SBStream sstr;
176 debugger.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000177 log->Printf ("SBDebugger::Create () => SBDebugger(%p): %s",
178 static_cast<void*>(debugger.m_opaque_sp.get()),
179 sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000180 }
181
Jim Ingham06942692011-08-13 00:22:20 +0000182 SBCommandInterpreter interp = debugger.GetCommandInterpreter();
183 if (source_init_files)
184 {
185 interp.get()->SkipLLDBInitFiles(false);
186 interp.get()->SkipAppInitFiles (false);
187 SBCommandReturnObject result;
188 interp.SourceInitFileInHomeDirectory(result);
189 }
190 else
191 {
192 interp.get()->SkipLLDBInitFiles(true);
193 interp.get()->SkipAppInitFiles (true);
194 }
Greg Clayton66111032010-06-23 01:19:29 +0000195 return debugger;
196}
197
Caroline Ticee02657b2011-01-22 01:02:07 +0000198void
199SBDebugger::Destroy (SBDebugger &debugger)
200{
Greg Clayton5160ce52013-03-27 23:08:40 +0000201 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000202
Caroline Ticee02657b2011-01-22 01:02:07 +0000203 if (log)
204 {
205 SBStream sstr;
206 debugger.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000207 log->Printf ("SBDebugger::Destroy () => SBDebugger(%p): %s",
208 static_cast<void*>(debugger.m_opaque_sp.get()),
209 sstr.GetData());
Caroline Ticee02657b2011-01-22 01:02:07 +0000210 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000211
Caroline Ticee02657b2011-01-22 01:02:07 +0000212 Debugger::Destroy (debugger.m_opaque_sp);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000213
Caroline Ticee02657b2011-01-22 01:02:07 +0000214 if (debugger.m_opaque_sp.get() != NULL)
215 debugger.m_opaque_sp.reset();
216}
217
Greg Claytonf9322412011-12-15 04:38:41 +0000218void
219SBDebugger::MemoryPressureDetected ()
220{
Greg Clayton0cd70862012-04-09 20:22:01 +0000221 // Since this function can be call asynchronously, we allow it to be
222 // non-mandatory. We have seen deadlocks with this function when called
223 // so we need to safeguard against this until we can determine what is
224 // causing the deadlocks.
Greg Clayton5160ce52013-03-27 23:08:40 +0000225 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Inghamaebdf1b2012-06-07 19:08:07 +0000226
Greg Clayton0cd70862012-04-09 20:22:01 +0000227 const bool mandatory = false;
Jim Inghamaebdf1b2012-06-07 19:08:07 +0000228 if (log)
229 {
230 log->Printf ("SBDebugger::MemoryPressureDetected (), mandatory = %d", mandatory);
231 }
232
Greg Clayton0cd70862012-04-09 20:22:01 +0000233 ModuleList::RemoveOrphanSharedModules(mandatory);
Greg Claytonf9322412011-12-15 04:38:41 +0000234}
235
Greg Clayton66111032010-06-23 01:19:29 +0000236SBDebugger::SBDebugger () :
237 m_opaque_sp ()
238{
239}
240
Enrico Granata274fd6e2011-08-19 23:56:34 +0000241SBDebugger::SBDebugger(const lldb::DebuggerSP &debugger_sp) :
242 m_opaque_sp(debugger_sp)
243{
244}
245
Greg Claytonefabb122010-11-05 23:17:00 +0000246SBDebugger::SBDebugger(const SBDebugger &rhs) :
247 m_opaque_sp (rhs.m_opaque_sp)
248{
249}
250
251SBDebugger &
252SBDebugger::operator = (const SBDebugger &rhs)
253{
254 if (this != &rhs)
255 {
256 m_opaque_sp = rhs.m_opaque_sp;
257 }
258 return *this;
259}
260
Greg Clayton66111032010-06-23 01:19:29 +0000261SBDebugger::~SBDebugger ()
262{
263}
264
265bool
266SBDebugger::IsValid() const
267{
268 return m_opaque_sp.get() != NULL;
269}
270
271
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000272void
273SBDebugger::SetAsync (bool b)
274{
Greg Clayton66111032010-06-23 01:19:29 +0000275 if (m_opaque_sp)
276 m_opaque_sp->SetAsyncExecution(b);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000277}
278
Jim Inghame64f0dc2011-09-13 23:25:31 +0000279bool
280SBDebugger::GetAsync ()
281{
282 if (m_opaque_sp)
283 return m_opaque_sp->GetAsyncExecution();
284 else
285 return false;
286}
287
Greg Clayton6eee5aa2010-10-11 01:05:37 +0000288void
289SBDebugger::SkipLLDBInitFiles (bool b)
290{
291 if (m_opaque_sp)
292 m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles (b);
293}
294
Jim Ingham16e0c682011-08-12 23:34:31 +0000295void
296SBDebugger::SkipAppInitFiles (bool b)
297{
298 if (m_opaque_sp)
299 m_opaque_sp->GetCommandInterpreter().SkipAppInitFiles (b);
300}
301
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000302// Shouldn't really be settable after initialization as this could cause lots of problems; don't want users
303// trying to switch modes in the middle of a debugging session.
304void
305SBDebugger::SetInputFileHandle (FILE *fh, bool transfer_ownership)
306{
Greg Clayton5160ce52013-03-27 23:08:40 +0000307 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000308
309 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000310 log->Printf ("SBDebugger(%p)::SetInputFileHandle (fh=%p, transfer_ownership=%i)",
311 static_cast<void*>(m_opaque_sp.get()),
312 static_cast<void*>(fh), transfer_ownership);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000313
Greg Clayton66111032010-06-23 01:19:29 +0000314 if (m_opaque_sp)
315 m_opaque_sp->SetInputFileHandle (fh, transfer_ownership);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000316}
317
318void
319SBDebugger::SetOutputFileHandle (FILE *fh, bool transfer_ownership)
320{
Greg Clayton5160ce52013-03-27 23:08:40 +0000321 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000322
323
324 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000325 log->Printf ("SBDebugger(%p)::SetOutputFileHandle (fh=%p, transfer_ownership=%i)",
326 static_cast<void*>(m_opaque_sp.get()),
327 static_cast<void*>(fh), transfer_ownership);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000328
Greg Clayton66111032010-06-23 01:19:29 +0000329 if (m_opaque_sp)
330 m_opaque_sp->SetOutputFileHandle (fh, transfer_ownership);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000331}
332
333void
334SBDebugger::SetErrorFileHandle (FILE *fh, bool transfer_ownership)
335{
Greg Clayton5160ce52013-03-27 23:08:40 +0000336 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000337
338
339 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000340 log->Printf ("SBDebugger(%p)::SetErrorFileHandle (fh=%p, transfer_ownership=%i)",
341 static_cast<void*>(m_opaque_sp.get()),
342 static_cast<void*>(fh), transfer_ownership);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000343
Greg Clayton66111032010-06-23 01:19:29 +0000344 if (m_opaque_sp)
345 m_opaque_sp->SetErrorFileHandle (fh, transfer_ownership);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000346}
347
348FILE *
349SBDebugger::GetInputFileHandle ()
350{
Greg Clayton66111032010-06-23 01:19:29 +0000351 if (m_opaque_sp)
Greg Clayton44d93782014-01-27 23:43:24 +0000352 {
353 StreamFileSP stream_file_sp (m_opaque_sp->GetInputFile());
354 if (stream_file_sp)
355 return stream_file_sp->GetFile().GetStream();
356 }
Greg Clayton66111032010-06-23 01:19:29 +0000357 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000358}
359
360FILE *
361SBDebugger::GetOutputFileHandle ()
362{
Greg Clayton66111032010-06-23 01:19:29 +0000363 if (m_opaque_sp)
Greg Clayton44d93782014-01-27 23:43:24 +0000364 {
365 StreamFileSP stream_file_sp (m_opaque_sp->GetOutputFile());
366 if (stream_file_sp)
367 return stream_file_sp->GetFile().GetStream();
368 }
Greg Clayton66111032010-06-23 01:19:29 +0000369 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000370}
371
372FILE *
373SBDebugger::GetErrorFileHandle ()
374{
Greg Clayton66111032010-06-23 01:19:29 +0000375 if (m_opaque_sp)
Greg Clayton44d93782014-01-27 23:43:24 +0000376 if (m_opaque_sp)
377 {
378 StreamFileSP stream_file_sp (m_opaque_sp->GetErrorFile());
379 if (stream_file_sp)
380 return stream_file_sp->GetFile().GetStream();
381 }
Greg Clayton66111032010-06-23 01:19:29 +0000382 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000383}
384
Jim Inghamc5917d92012-11-30 20:23:19 +0000385void
386SBDebugger::SaveInputTerminalState()
387{
388 if (m_opaque_sp)
389 m_opaque_sp->SaveInputTerminalState();
390}
391
392void
393SBDebugger::RestoreInputTerminalState()
394{
395 if (m_opaque_sp)
396 m_opaque_sp->RestoreInputTerminalState();
397
398}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000399SBCommandInterpreter
400SBDebugger::GetCommandInterpreter ()
401{
Greg Clayton5160ce52013-03-27 23:08:40 +0000402 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000403
Greg Clayton66111032010-06-23 01:19:29 +0000404 SBCommandInterpreter sb_interpreter;
405 if (m_opaque_sp)
406 sb_interpreter.reset (&m_opaque_sp->GetCommandInterpreter());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000407
Caroline Tice750cd172010-10-26 23:49:36 +0000408 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000409 log->Printf ("SBDebugger(%p)::GetCommandInterpreter () => SBCommandInterpreter(%p)",
410 static_cast<void*>(m_opaque_sp.get()),
411 static_cast<void*>(sb_interpreter.get()));
Caroline Tice750cd172010-10-26 23:49:36 +0000412
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000413 return sb_interpreter;
414}
415
416void
417SBDebugger::HandleCommand (const char *command)
418{
Greg Clayton66111032010-06-23 01:19:29 +0000419 if (m_opaque_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000420 {
Greg Claytonaf67cec2010-12-20 20:49:23 +0000421 TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
422 Mutex::Locker api_locker;
423 if (target_sp)
Jim Ingham10ebffa2012-05-04 23:02:50 +0000424 api_locker.Lock(target_sp->GetAPIMutex());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000425
Greg Clayton66111032010-06-23 01:19:29 +0000426 SBCommandInterpreter sb_interpreter(GetCommandInterpreter ());
427 SBCommandReturnObject result;
428
429 sb_interpreter.HandleCommand (command, result, false);
430
431 if (GetErrorFileHandle() != NULL)
432 result.PutError (GetErrorFileHandle());
433 if (GetOutputFileHandle() != NULL)
434 result.PutOutput (GetOutputFileHandle());
435
436 if (m_opaque_sp->GetAsyncExecution() == false)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000437 {
Greg Clayton66111032010-06-23 01:19:29 +0000438 SBProcess process(GetCommandInterpreter().GetProcess ());
Greg Claytonb9556ac2012-01-30 07:41:31 +0000439 ProcessSP process_sp (process.GetSP());
440 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000441 {
Greg Clayton66111032010-06-23 01:19:29 +0000442 EventSP event_sp;
443 Listener &lldb_listener = m_opaque_sp->GetListener();
Greg Claytonb9556ac2012-01-30 07:41:31 +0000444 while (lldb_listener.GetNextEventForBroadcaster (process_sp.get(), event_sp))
Greg Clayton66111032010-06-23 01:19:29 +0000445 {
446 SBEvent event(event_sp);
447 HandleProcessEvent (process, event, GetOutputFileHandle(), GetErrorFileHandle());
448 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000449 }
450 }
451 }
452}
453
454SBListener
455SBDebugger::GetListener ()
456{
Greg Clayton5160ce52013-03-27 23:08:40 +0000457 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000458
Greg Clayton66111032010-06-23 01:19:29 +0000459 SBListener sb_listener;
460 if (m_opaque_sp)
461 sb_listener.reset(&m_opaque_sp->GetListener(), false);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000462
Caroline Tice750cd172010-10-26 23:49:36 +0000463 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000464 log->Printf ("SBDebugger(%p)::GetListener () => SBListener(%p)",
465 static_cast<void*>(m_opaque_sp.get()),
466 static_cast<void*>(sb_listener.get()));
Caroline Tice750cd172010-10-26 23:49:36 +0000467
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000468 return sb_listener;
469}
470
471void
472SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, FILE *out, FILE *err)
473{
Greg Claytonaf67cec2010-12-20 20:49:23 +0000474 if (!process.IsValid())
475 return;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000476
Greg Claytonb9556ac2012-01-30 07:41:31 +0000477 TargetSP target_sp (process.GetTarget().GetSP());
478 if (!target_sp)
479 return;
480
Greg Claytonaf67cec2010-12-20 20:49:23 +0000481 const uint32_t event_type = event.GetType();
482 char stdio_buffer[1024];
483 size_t len;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000484
Greg Claytonb9556ac2012-01-30 07:41:31 +0000485 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000486
487 if (event_type & (Process::eBroadcastBitSTDOUT | Process::eBroadcastBitStateChanged))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000488 {
Greg Claytonaf67cec2010-12-20 20:49:23 +0000489 // Drain stdout when we stop just in case we have any bytes
490 while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
491 if (out != NULL)
492 ::fwrite (stdio_buffer, 1, len, out);
493 }
494
495 if (event_type & (Process::eBroadcastBitSTDERR | Process::eBroadcastBitStateChanged))
496 {
497 // Drain stderr when we stop just in case we have any bytes
498 while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
499 if (err != NULL)
500 ::fwrite (stdio_buffer, 1, len, err);
501 }
502
503 if (event_type & Process::eBroadcastBitStateChanged)
504 {
505 StateType event_state = SBProcess::GetStateFromEvent (event);
506
507 if (event_state == eStateInvalid)
508 return;
509
510 bool is_stopped = StateIsStoppedState (event_state);
511 if (!is_stopped)
512 process.ReportEventState (event, out);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000513 }
514}
515
Jim Inghame37d6052011-09-13 00:29:56 +0000516SBSourceManager
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000517SBDebugger::GetSourceManager ()
518{
Jim Inghame37d6052011-09-13 00:29:56 +0000519 SBSourceManager sb_source_manager (*this);
520 return sb_source_manager;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000521}
522
523
524bool
525SBDebugger::GetDefaultArchitecture (char *arch_name, size_t arch_name_len)
526{
527 if (arch_name && arch_name_len)
528 {
Greg Clayton431ce672011-04-18 23:15:17 +0000529 ArchSpec default_arch = Target::GetDefaultArchitecture ();
Caroline Ticedaccaa92010-09-20 20:44:43 +0000530
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000531 if (default_arch.IsValid())
532 {
Greg Clayton431ce672011-04-18 23:15:17 +0000533 const std::string &triple_str = default_arch.GetTriple().str();
534 if (!triple_str.empty())
535 ::snprintf (arch_name, arch_name_len, "%s", triple_str.c_str());
536 else
537 ::snprintf (arch_name, arch_name_len, "%s", default_arch.GetArchitectureName());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000538 return true;
539 }
540 }
541 if (arch_name && arch_name_len)
542 arch_name[0] = '\0';
543 return false;
544}
545
546
547bool
548SBDebugger::SetDefaultArchitecture (const char *arch_name)
549{
550 if (arch_name)
551 {
Greg Clayton70512312012-05-08 01:45:38 +0000552 ArchSpec arch (arch_name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000553 if (arch.IsValid())
554 {
Greg Clayton431ce672011-04-18 23:15:17 +0000555 Target::SetDefaultArchitecture (arch);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000556 return true;
557 }
558 }
559 return false;
560}
561
562ScriptLanguage
563SBDebugger::GetScriptingLanguage (const char *script_language_name)
564{
Greg Claytonaf67cec2010-12-20 20:49:23 +0000565
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000566 return Args::StringToScriptLanguage (script_language_name,
567 eScriptLanguageDefault,
568 NULL);
569}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000570
571const char *
572SBDebugger::GetVersionString ()
573{
Virgile Bellob2f1fb22013-08-23 12:44:05 +0000574 return lldb_private::GetVersion();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000575}
576
577const char *
Greg Clayton431ce672011-04-18 23:15:17 +0000578SBDebugger::StateAsCString (StateType state)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000579{
Caroline Ticec2bbb492011-04-25 22:05:51 +0000580 return lldb_private::StateAsCString (state);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000581}
582
583bool
Greg Clayton431ce672011-04-18 23:15:17 +0000584SBDebugger::StateIsRunningState (StateType state)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000585{
Greg Clayton5160ce52013-03-27 23:08:40 +0000586 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000587
Caroline Ticec2bbb492011-04-25 22:05:51 +0000588 const bool result = lldb_private::StateIsRunningState (state);
Greg Clayton48381312010-10-30 04:51:46 +0000589 if (log)
590 log->Printf ("SBDebugger::StateIsRunningState (state=%s) => %i",
Greg Clayton431ce672011-04-18 23:15:17 +0000591 StateAsCString (state), result);
Greg Clayton48381312010-10-30 04:51:46 +0000592
593 return result;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000594}
595
596bool
Greg Clayton431ce672011-04-18 23:15:17 +0000597SBDebugger::StateIsStoppedState (StateType state)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000598{
Greg Clayton5160ce52013-03-27 23:08:40 +0000599 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000600
Greg Clayton2637f822011-11-17 01:23:07 +0000601 const bool result = lldb_private::StateIsStoppedState (state, false);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000602 if (log)
Greg Clayton48381312010-10-30 04:51:46 +0000603 log->Printf ("SBDebugger::StateIsStoppedState (state=%s) => %i",
Greg Clayton431ce672011-04-18 23:15:17 +0000604 StateAsCString (state), result);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000605
Greg Clayton48381312010-10-30 04:51:46 +0000606 return result;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000607}
608
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000609lldb::SBTarget
610SBDebugger::CreateTarget (const char *filename,
611 const char *target_triple,
612 const char *platform_name,
613 bool add_dependent_modules,
614 lldb::SBError& sb_error)
615{
616 SBTarget sb_target;
Greg Claytonb9556ac2012-01-30 07:41:31 +0000617 TargetSP target_sp;
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000618 if (m_opaque_sp)
619 {
620 sb_error.Clear();
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000621 OptionGroupPlatform platform_options (false);
622 platform_options.SetPlatformName (platform_name);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000623
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000624 sb_error.ref() = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
Greg Claytona0ca6602012-10-18 16:33:33 +0000625 filename,
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000626 target_triple,
627 add_dependent_modules,
628 &platform_options,
629 target_sp);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000630
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000631 if (sb_error.Success())
Greg Claytonb9556ac2012-01-30 07:41:31 +0000632 sb_target.SetSP (target_sp);
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000633 }
634 else
635 {
636 sb_error.SetErrorString("invalid target");
637 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000638
Greg Clayton5160ce52013-03-27 23:08:40 +0000639 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000640 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000641 log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\", triple=%s, platform_name=%s, add_dependent_modules=%u, error=%s) => SBTarget(%p)",
642 static_cast<void*>(m_opaque_sp.get()), filename,
643 target_triple, platform_name, add_dependent_modules,
644 sb_error.GetCString(), static_cast<void*>(target_sp.get()));
645
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000646 return sb_target;
647}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000648
649SBTarget
650SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename,
651 const char *target_triple)
652{
Greg Claytonb9556ac2012-01-30 07:41:31 +0000653 SBTarget sb_target;
654 TargetSP target_sp;
Greg Clayton66111032010-06-23 01:19:29 +0000655 if (m_opaque_sp)
656 {
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000657 const bool add_dependent_modules = true;
658 Error error (m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
Greg Claytona0ca6602012-10-18 16:33:33 +0000659 filename,
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000660 target_triple,
661 add_dependent_modules,
662 NULL,
663 target_sp));
Greg Claytonb9556ac2012-01-30 07:41:31 +0000664 sb_target.SetSP (target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000665 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000666
Greg Clayton5160ce52013-03-27 23:08:40 +0000667 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000668 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000669 log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndTargetTriple (filename=\"%s\", triple=%s) => SBTarget(%p)",
670 static_cast<void*>(m_opaque_sp.get()), filename,
671 target_triple, static_cast<void*>(target_sp.get()));
Greg Clayton48381312010-10-30 04:51:46 +0000672
Greg Claytonb9556ac2012-01-30 07:41:31 +0000673 return sb_target;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000674}
675
676SBTarget
Greg Clayton64195a22011-02-23 00:35:02 +0000677SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *arch_cstr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000678{
Greg Clayton5160ce52013-03-27 23:08:40 +0000679 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000680
Greg Claytonb9556ac2012-01-30 07:41:31 +0000681 SBTarget sb_target;
682 TargetSP target_sp;
Greg Clayton66111032010-06-23 01:19:29 +0000683 if (m_opaque_sp)
684 {
Greg Clayton66111032010-06-23 01:19:29 +0000685 Error error;
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000686 const bool add_dependent_modules = true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000687
Greg Claytona0ca6602012-10-18 16:33:33 +0000688 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
689 filename,
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000690 arch_cstr,
691 add_dependent_modules,
692 NULL,
693 target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000694
695 if (error.Success())
696 {
Jim Ingham2976d002010-08-26 21:32:51 +0000697 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Claytonb9556ac2012-01-30 07:41:31 +0000698 sb_target.SetSP (target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000699 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000700 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000701
702 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000703 log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndArch (filename=\"%s\", arch=%s) => SBTarget(%p)",
704 static_cast<void*>(m_opaque_sp.get()), filename, arch_cstr,
705 static_cast<void*>(target_sp.get()));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000706
Greg Claytonb9556ac2012-01-30 07:41:31 +0000707 return sb_target;
Greg Clayton66111032010-06-23 01:19:29 +0000708}
709
710SBTarget
711SBDebugger::CreateTarget (const char *filename)
712{
Greg Claytonb9556ac2012-01-30 07:41:31 +0000713 SBTarget sb_target;
714 TargetSP target_sp;
Greg Clayton66111032010-06-23 01:19:29 +0000715 if (m_opaque_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000716 {
Greg Clayton431ce672011-04-18 23:15:17 +0000717 ArchSpec arch = Target::GetDefaultArchitecture ();
Greg Clayton66111032010-06-23 01:19:29 +0000718 Error error;
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000719 const bool add_dependent_modules = true;
Greg Clayton66111032010-06-23 01:19:29 +0000720
Greg Claytonb3a40ba2012-03-20 18:34:04 +0000721 PlatformSP platform_sp(m_opaque_sp->GetPlatformList().GetSelectedPlatform());
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000722 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
Greg Claytona0ca6602012-10-18 16:33:33 +0000723 filename,
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000724 arch,
725 add_dependent_modules,
Greg Claytonb3a40ba2012-03-20 18:34:04 +0000726 platform_sp,
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000727 target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000728
729 if (error.Success())
730 {
Jim Ingham2976d002010-08-26 21:32:51 +0000731 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Claytonb9556ac2012-01-30 07:41:31 +0000732 sb_target.SetSP (target_sp);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000733 }
734 }
Greg Clayton5160ce52013-03-27 23:08:40 +0000735 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000736 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000737 log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)",
738 static_cast<void*>(m_opaque_sp.get()), filename,
739 static_cast<void*>(target_sp.get()));
Greg Claytonb9556ac2012-01-30 07:41:31 +0000740 return sb_target;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000741}
742
Johnny Chen3794ad92011-06-15 21:24:24 +0000743bool
744SBDebugger::DeleteTarget (lldb::SBTarget &target)
745{
746 bool result = false;
Greg Claytonb9556ac2012-01-30 07:41:31 +0000747 if (m_opaque_sp)
Johnny Chen3794ad92011-06-15 21:24:24 +0000748 {
Greg Claytonb9556ac2012-01-30 07:41:31 +0000749 TargetSP target_sp(target.GetSP());
750 if (target_sp)
751 {
752 // No need to lock, the target list is thread safe
753 result = m_opaque_sp->GetTargetList().DeleteTarget (target_sp);
754 target_sp->Destroy();
755 target.Clear();
Greg Clayton0cd70862012-04-09 20:22:01 +0000756 const bool mandatory = true;
757 ModuleList::RemoveOrphanSharedModules(mandatory);
Greg Claytonb9556ac2012-01-30 07:41:31 +0000758 }
Johnny Chen3794ad92011-06-15 21:24:24 +0000759 }
760
Greg Clayton5160ce52013-03-27 23:08:40 +0000761 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Johnny Chen3794ad92011-06-15 21:24:24 +0000762 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000763 log->Printf ("SBDebugger(%p)::DeleteTarget (SBTarget(%p)) => %i",
764 static_cast<void*>(m_opaque_sp.get()),
765 static_cast<void*>(target.m_opaque_sp.get()), result);
Johnny Chen3794ad92011-06-15 21:24:24 +0000766
767 return result;
768}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000769SBTarget
770SBDebugger::GetTargetAtIndex (uint32_t idx)
771{
Greg Clayton66111032010-06-23 01:19:29 +0000772 SBTarget sb_target;
773 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000774 {
775 // No need to lock, the target list is thread safe
Greg Claytonb9556ac2012-01-30 07:41:31 +0000776 sb_target.SetSP (m_opaque_sp->GetTargetList().GetTargetAtIndex (idx));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000777 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000778 return sb_target;
779}
780
Jim Ingham8499e1a2012-05-08 23:06:07 +0000781uint32_t
782SBDebugger::GetIndexOfTarget (lldb::SBTarget target)
783{
784
785 lldb::TargetSP target_sp = target.GetSP();
786 if (!target_sp)
787 return UINT32_MAX;
788
789 if (!m_opaque_sp)
790 return UINT32_MAX;
791
792 return m_opaque_sp->GetTargetList().GetIndexOfTarget (target.GetSP());
793}
794
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000795SBTarget
Virgile Bello997f6f72013-09-05 16:53:14 +0000796SBDebugger::FindTargetWithProcessID (lldb::pid_t pid)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000797{
Greg Clayton66111032010-06-23 01:19:29 +0000798 SBTarget sb_target;
799 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000800 {
801 // No need to lock, the target list is thread safe
Greg Claytonb9556ac2012-01-30 07:41:31 +0000802 sb_target.SetSP (m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000803 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000804 return sb_target;
805}
806
807SBTarget
808SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name)
809{
Greg Clayton66111032010-06-23 01:19:29 +0000810 SBTarget sb_target;
811 if (m_opaque_sp && filename && filename[0])
812 {
Greg Claytonaf67cec2010-12-20 20:49:23 +0000813 // No need to lock, the target list is thread safe
Greg Claytoneb0103f2011-04-07 22:46:35 +0000814 ArchSpec arch (arch_name, m_opaque_sp->GetPlatformList().GetSelectedPlatform().get());
Greg Clayton274060b2010-10-20 20:54:39 +0000815 TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename, false), arch_name ? &arch : NULL));
Greg Claytonb9556ac2012-01-30 07:41:31 +0000816 sb_target.SetSP (target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000817 }
818 return sb_target;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000819}
820
821SBTarget
Greg Clayton431ce672011-04-18 23:15:17 +0000822SBDebugger::FindTargetWithLLDBProcess (const ProcessSP &process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000823{
Greg Clayton66111032010-06-23 01:19:29 +0000824 SBTarget sb_target;
825 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000826 {
827 // No need to lock, the target list is thread safe
Greg Claytonb9556ac2012-01-30 07:41:31 +0000828 sb_target.SetSP (m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get()));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000829 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000830 return sb_target;
831}
832
833
834uint32_t
835SBDebugger::GetNumTargets ()
836{
Greg Clayton66111032010-06-23 01:19:29 +0000837 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000838 {
839 // No need to lock, the target list is thread safe
Greg Clayton66111032010-06-23 01:19:29 +0000840 return m_opaque_sp->GetTargetList().GetNumTargets ();
Greg Claytonaf67cec2010-12-20 20:49:23 +0000841 }
Greg Clayton66111032010-06-23 01:19:29 +0000842 return 0;
843}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000844
845SBTarget
Jim Ingham2976d002010-08-26 21:32:51 +0000846SBDebugger::GetSelectedTarget ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000847{
Greg Clayton5160ce52013-03-27 23:08:40 +0000848 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000849
Greg Clayton66111032010-06-23 01:19:29 +0000850 SBTarget sb_target;
Greg Claytonb9556ac2012-01-30 07:41:31 +0000851 TargetSP target_sp;
Greg Clayton66111032010-06-23 01:19:29 +0000852 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000853 {
854 // No need to lock, the target list is thread safe
Greg Claytonb9556ac2012-01-30 07:41:31 +0000855 target_sp = m_opaque_sp->GetTargetList().GetSelectedTarget ();
856 sb_target.SetSP (target_sp);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000857 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000858
859 if (log)
860 {
861 SBStream sstr;
Greg Clayton431ce672011-04-18 23:15:17 +0000862 sb_target.GetDescription (sstr, eDescriptionLevelBrief);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000863 log->Printf ("SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s",
864 static_cast<void*>(m_opaque_sp.get()),
865 static_cast<void*>(target_sp.get()), sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000866 }
867
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000868 return sb_target;
869}
870
871void
Jim Inghame64f0dc2011-09-13 23:25:31 +0000872SBDebugger::SetSelectedTarget (SBTarget &sb_target)
873{
Greg Clayton5160ce52013-03-27 23:08:40 +0000874 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Inghame64f0dc2011-09-13 23:25:31 +0000875
Greg Claytonb9556ac2012-01-30 07:41:31 +0000876 TargetSP target_sp (sb_target.GetSP());
Jim Inghame64f0dc2011-09-13 23:25:31 +0000877 if (m_opaque_sp)
878 {
Greg Claytonb9556ac2012-01-30 07:41:31 +0000879 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Jim Inghame64f0dc2011-09-13 23:25:31 +0000880 }
881 if (log)
882 {
883 SBStream sstr;
884 sb_target.GetDescription (sstr, eDescriptionLevelBrief);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000885 log->Printf ("SBDebugger(%p)::SetSelectedTarget () => SBTarget(%p): %s",
886 static_cast<void*>(m_opaque_sp.get()),
887 static_cast<void*>(target_sp.get()), sstr.GetData());
Jim Inghame64f0dc2011-09-13 23:25:31 +0000888 }
889}
890
Greg Claytonfbb76342013-11-20 21:07:01 +0000891SBPlatform
892SBDebugger::GetSelectedPlatform()
893{
894 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
895
896 SBPlatform sb_platform;
897 DebuggerSP debugger_sp(m_opaque_sp);
898 if (debugger_sp)
899 {
900 sb_platform.SetSP(debugger_sp->GetPlatformList().GetSelectedPlatform());
901 }
902 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000903 log->Printf ("SBDebugger(%p)::GetSelectedPlatform () => SBPlatform(%p): %s",
904 static_cast<void*>(m_opaque_sp.get()),
905 static_cast<void*>(sb_platform.GetSP().get()),
906 sb_platform.GetName());
Greg Claytonfbb76342013-11-20 21:07:01 +0000907 return sb_platform;
908}
909
910void
911SBDebugger::SetSelectedPlatform(SBPlatform &sb_platform)
912{
913 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000914
Greg Claytonfbb76342013-11-20 21:07:01 +0000915 DebuggerSP debugger_sp(m_opaque_sp);
916 if (debugger_sp)
917 {
918 debugger_sp->GetPlatformList().SetSelectedPlatform(sb_platform.GetSP());
919 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000920
Greg Claytonfbb76342013-11-20 21:07:01 +0000921 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000922 log->Printf ("SBDebugger(%p)::SetSelectedPlatform (SBPlatform(%p) %s)",
923 static_cast<void*>(m_opaque_sp.get()),
924 static_cast<void*>(sb_platform.GetSP().get()),
925 sb_platform.GetName());
Greg Claytonfbb76342013-11-20 21:07:01 +0000926}
927
Jim Inghame64f0dc2011-09-13 23:25:31 +0000928void
Enrico Granatac30a73a2012-09-06 22:02:28 +0000929SBDebugger::DispatchInput (void* baton, const void *data, size_t data_len)
Enrico Granata6b09d422012-09-06 21:58:25 +0000930{
931 DispatchInput (data,data_len);
932}
933
934void
Filipe Cabecinhasc3019992012-08-20 16:21:04 +0000935SBDebugger::DispatchInput (const void *data, size_t data_len)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000936{
Greg Clayton44d93782014-01-27 23:43:24 +0000937// Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
938//
939// if (log)
940// log->Printf ("SBDebugger(%p)::DispatchInput (data=\"%.*s\", size_t=%" PRIu64 ")",
941// m_opaque_sp.get(),
942// (int) data_len,
943// (const char *) data,
944// (uint64_t)data_len);
945//
946// if (m_opaque_sp)
947// m_opaque_sp->DispatchInput ((const char *) data, data_len);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000948}
949
950void
Caroline Ticeefed6132010-11-19 20:47:54 +0000951SBDebugger::DispatchInputInterrupt ()
952{
953 if (m_opaque_sp)
954 m_opaque_sp->DispatchInputInterrupt ();
955}
956
957void
958SBDebugger::DispatchInputEndOfFile ()
959{
960 if (m_opaque_sp)
961 m_opaque_sp->DispatchInputEndOfFile ();
962}
963
964void
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000965SBDebugger::PushInputReader (SBInputReader &reader)
966{
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000967}
Greg Clayton66111032010-06-23 01:19:29 +0000968
969void
Greg Clayton44d93782014-01-27 23:43:24 +0000970SBDebugger::RunCommandInterpreter (bool auto_handle_events,
971 bool spawn_thread)
Caroline Tice969ed3d2011-05-02 20:41:46 +0000972{
Caroline Tice969ed3d2011-05-02 20:41:46 +0000973 if (m_opaque_sp)
Greg Clayton44d93782014-01-27 23:43:24 +0000974 m_opaque_sp->GetCommandInterpreter().RunCommandInterpreter(auto_handle_events, spawn_thread);
Caroline Tice969ed3d2011-05-02 20:41:46 +0000975}
976
977void
Greg Clayton431ce672011-04-18 23:15:17 +0000978SBDebugger::reset (const DebuggerSP &debugger_sp)
Greg Clayton66111032010-06-23 01:19:29 +0000979{
980 m_opaque_sp = debugger_sp;
981}
982
983Debugger *
984SBDebugger::get () const
985{
986 return m_opaque_sp.get();
987}
988
989Debugger &
990SBDebugger::ref () const
991{
992 assert (m_opaque_sp.get());
993 return *m_opaque_sp;
994}
995
Greg Clayton9a377662011-10-01 02:59:24 +0000996const lldb::DebuggerSP &
997SBDebugger::get_sp () const
998{
999 return m_opaque_sp;
1000}
Greg Clayton66111032010-06-23 01:19:29 +00001001
Caroline Ticeebc1bb22010-06-30 16:22:25 +00001002SBDebugger
1003SBDebugger::FindDebuggerWithID (int id)
1004{
Greg Claytonaf67cec2010-12-20 20:49:23 +00001005 // No need to lock, the debugger list is thread safe
Caroline Ticeebc1bb22010-06-30 16:22:25 +00001006 SBDebugger sb_debugger;
Greg Clayton431ce672011-04-18 23:15:17 +00001007 DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id);
Caroline Ticeebc1bb22010-06-30 16:22:25 +00001008 if (debugger_sp)
1009 sb_debugger.reset (debugger_sp);
1010 return sb_debugger;
1011}
Jim Inghame40e4212010-08-30 19:44:40 +00001012
Caroline Ticedd759852010-09-09 17:45:09 +00001013const char *
1014SBDebugger::GetInstanceName()
1015{
Greg Clayton6920b522012-08-22 18:39:03 +00001016 if (m_opaque_sp)
1017 return m_opaque_sp->GetInstanceName().AsCString();
1018 else
Caroline Ticedd759852010-09-09 17:45:09 +00001019 return NULL;
1020}
1021
Caroline Tice3df9a8d2010-09-04 00:03:46 +00001022SBError
Caroline Ticedd759852010-09-09 17:45:09 +00001023SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name)
Caroline Tice3df9a8d2010-09-04 00:03:46 +00001024{
Greg Clayton6920b522012-08-22 18:39:03 +00001025 SBError sb_error;
1026 DebuggerSP debugger_sp(Debugger::FindDebuggerWithInstanceName (ConstString(debugger_instance_name)));
1027 Error error;
1028 if (debugger_sp)
1029 {
1030 ExecutionContext exe_ctx (debugger_sp->GetCommandInterpreter().GetExecutionContext());
1031 error = debugger_sp->SetPropertyValue (&exe_ctx,
1032 eVarSetOperationAssign,
1033 var_name,
1034 value);
1035 }
1036 else
1037 {
1038 error.SetErrorStringWithFormat ("invalid debugger instance name '%s'", debugger_instance_name);
1039 }
1040 if (error.Fail())
1041 sb_error.SetError(error);
1042 return sb_error;
Caroline Tice3df9a8d2010-09-04 00:03:46 +00001043}
1044
Greg Clayton431ce672011-04-18 23:15:17 +00001045SBStringList
Caroline Ticedd759852010-09-09 17:45:09 +00001046SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name)
Caroline Tice3df9a8d2010-09-04 00:03:46 +00001047{
1048 SBStringList ret_value;
Greg Clayton6920b522012-08-22 18:39:03 +00001049 DebuggerSP debugger_sp(Debugger::FindDebuggerWithInstanceName (ConstString(debugger_instance_name)));
1050 Error error;
1051 if (debugger_sp)
1052 {
1053 ExecutionContext exe_ctx (debugger_sp->GetCommandInterpreter().GetExecutionContext());
1054 lldb::OptionValueSP value_sp (debugger_sp->GetPropertyValue (&exe_ctx,
1055 var_name,
1056 false,
1057 error));
1058 if (value_sp)
1059 {
1060 StreamString value_strm;
1061 value_sp->DumpValue (&exe_ctx, value_strm, OptionValue::eDumpOptionValue);
1062 const std::string &value_str = value_strm.GetString();
1063 if (!value_str.empty())
1064 {
1065 StringList string_list;
Greg Clayton44d93782014-01-27 23:43:24 +00001066 string_list.SplitIntoLines(value_str);
Greg Clayton6920b522012-08-22 18:39:03 +00001067 return SBStringList(&string_list);
1068 }
1069 }
1070 }
1071 return SBStringList();
Caroline Tice3df9a8d2010-09-04 00:03:46 +00001072}
1073
Greg Claytona7015092010-09-18 01:14:36 +00001074uint32_t
1075SBDebugger::GetTerminalWidth () const
1076{
1077 if (m_opaque_sp)
1078 return m_opaque_sp->GetTerminalWidth ();
1079 return 0;
1080}
1081
1082void
1083SBDebugger::SetTerminalWidth (uint32_t term_width)
1084{
1085 if (m_opaque_sp)
1086 m_opaque_sp->SetTerminalWidth (term_width);
1087}
1088
1089const char *
1090SBDebugger::GetPrompt() const
1091{
Greg Clayton5160ce52013-03-27 23:08:40 +00001092 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001093
Caroline Ticeceb6b132010-10-26 03:11:13 +00001094 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001095 log->Printf ("SBDebugger(%p)::GetPrompt () => \"%s\"",
1096 static_cast<void*>(m_opaque_sp.get()),
Caroline Tice750cd172010-10-26 23:49:36 +00001097 (m_opaque_sp ? m_opaque_sp->GetPrompt() : ""));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001098
Greg Claytona7015092010-09-18 01:14:36 +00001099 if (m_opaque_sp)
1100 return m_opaque_sp->GetPrompt ();
1101 return 0;
1102}
1103
1104void
1105SBDebugger::SetPrompt (const char *prompt)
1106{
1107 if (m_opaque_sp)
1108 m_opaque_sp->SetPrompt (prompt);
1109}
1110
1111
Greg Clayton431ce672011-04-18 23:15:17 +00001112ScriptLanguage
Greg Claytona7015092010-09-18 01:14:36 +00001113SBDebugger::GetScriptLanguage() const
1114{
1115 if (m_opaque_sp)
1116 return m_opaque_sp->GetScriptLanguage ();
1117 return eScriptLanguageNone;
1118}
1119
1120void
Greg Clayton431ce672011-04-18 23:15:17 +00001121SBDebugger::SetScriptLanguage (ScriptLanguage script_lang)
Greg Claytona7015092010-09-18 01:14:36 +00001122{
1123 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +00001124 {
Greg Claytona7015092010-09-18 01:14:36 +00001125 m_opaque_sp->SetScriptLanguage (script_lang);
Greg Claytonaf67cec2010-12-20 20:49:23 +00001126 }
Greg Claytona7015092010-09-18 01:14:36 +00001127}
1128
Jim Inghame40e4212010-08-30 19:44:40 +00001129bool
1130SBDebugger::SetUseExternalEditor (bool value)
1131{
1132 if (m_opaque_sp)
1133 return m_opaque_sp->SetUseExternalEditor (value);
Greg Claytonaf67cec2010-12-20 20:49:23 +00001134 return false;
Jim Inghame40e4212010-08-30 19:44:40 +00001135}
1136
1137bool
Caroline Ticedaccaa92010-09-20 20:44:43 +00001138SBDebugger::GetUseExternalEditor ()
Jim Inghame40e4212010-08-30 19:44:40 +00001139{
1140 if (m_opaque_sp)
Caroline Ticedaccaa92010-09-20 20:44:43 +00001141 return m_opaque_sp->GetUseExternalEditor ();
Greg Claytonaf67cec2010-12-20 20:49:23 +00001142 return false;
Jim Inghame40e4212010-08-30 19:44:40 +00001143}
1144
Caroline Ticedde9cff2010-09-20 05:20:02 +00001145bool
Michael Sartainc3ce7f272013-05-23 20:47:45 +00001146SBDebugger::SetUseColor (bool value)
1147{
1148 if (m_opaque_sp)
1149 return m_opaque_sp->SetUseColor (value);
1150 return false;
1151}
1152
1153bool
1154SBDebugger::GetUseColor () const
1155{
1156 if (m_opaque_sp)
1157 return m_opaque_sp->GetUseColor ();
1158 return false;
1159}
1160
1161bool
Caroline Ticedde9cff2010-09-20 05:20:02 +00001162SBDebugger::GetDescription (SBStream &description)
1163{
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001164 Stream &strm = description.ref();
1165
Caroline Ticedde9cff2010-09-20 05:20:02 +00001166 if (m_opaque_sp)
1167 {
1168 const char *name = m_opaque_sp->GetInstanceName().AsCString();
Greg Clayton431ce672011-04-18 23:15:17 +00001169 user_id_t id = m_opaque_sp->GetID();
Daniel Malead01b2952012-11-29 21:49:15 +00001170 strm.Printf ("Debugger (instance: \"%s\", id: %" PRIu64 ")", name, id);
Caroline Ticedde9cff2010-09-20 05:20:02 +00001171 }
1172 else
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001173 strm.PutCString ("No value");
Caroline Ticedde9cff2010-09-20 05:20:02 +00001174
1175 return true;
1176}
Caroline Ticeefed6132010-11-19 20:47:54 +00001177
Greg Clayton431ce672011-04-18 23:15:17 +00001178user_id_t
Caroline Ticeefed6132010-11-19 20:47:54 +00001179SBDebugger::GetID()
1180{
1181 if (m_opaque_sp)
1182 return m_opaque_sp->GetID();
1183 return LLDB_INVALID_UID;
1184}
Greg Clayton2289fa42011-04-30 01:09:13 +00001185
1186
1187SBError
1188SBDebugger::SetCurrentPlatform (const char *platform_name)
1189{
1190 SBError sb_error;
1191 if (m_opaque_sp)
1192 {
1193 PlatformSP platform_sp (Platform::Create (platform_name, sb_error.ref()));
1194
1195 if (platform_sp)
1196 {
1197 bool make_selected = true;
1198 m_opaque_sp->GetPlatformList().Append (platform_sp, make_selected);
1199 }
1200 }
1201 return sb_error;
1202}
1203
Greg Claytonfc3f0272011-05-29 04:06:55 +00001204bool
Greg Claytonf3dd93c2011-06-17 03:31:01 +00001205SBDebugger::SetCurrentPlatformSDKRoot (const char *sysroot)
1206{
1207 if (m_opaque_sp)
1208 {
1209 PlatformSP platform_sp (m_opaque_sp->GetPlatformList().GetSelectedPlatform());
1210
1211 if (platform_sp)
1212 {
1213 platform_sp->SetSDKRootDirectory (ConstString (sysroot));
1214 return true;
1215 }
1216 }
1217 return false;
1218}
1219
1220bool
Greg Claytonfc3f0272011-05-29 04:06:55 +00001221SBDebugger::GetCloseInputOnEOF () const
1222{
1223 if (m_opaque_sp)
1224 return m_opaque_sp->GetCloseInputOnEOF ();
1225 return false;
1226}
1227
1228void
1229SBDebugger::SetCloseInputOnEOF (bool b)
1230{
1231 if (m_opaque_sp)
1232 m_opaque_sp->SetCloseInputOnEOF (b);
1233}
Enrico Granata061858c2012-02-15 02:34:21 +00001234
1235SBTypeCategory
1236SBDebugger::GetCategory (const char* category_name)
1237{
1238 if (!category_name || *category_name == 0)
1239 return SBTypeCategory();
1240
1241 TypeCategoryImplSP category_sp;
1242
1243 if (DataVisualization::Categories::GetCategory(ConstString(category_name), category_sp, false))
1244 return SBTypeCategory(category_sp);
1245 else
1246 return SBTypeCategory();
1247}
1248
1249SBTypeCategory
1250SBDebugger::CreateCategory (const char* category_name)
1251{
1252 if (!category_name || *category_name == 0)
1253 return SBTypeCategory();
1254
1255 TypeCategoryImplSP category_sp;
1256
1257 if (DataVisualization::Categories::GetCategory(ConstString(category_name), category_sp, true))
1258 return SBTypeCategory(category_sp);
1259 else
1260 return SBTypeCategory();
1261}
1262
1263bool
1264SBDebugger::DeleteCategory (const char* category_name)
1265{
1266 if (!category_name || *category_name == 0)
1267 return false;
1268
1269 return DataVisualization::Categories::Delete(ConstString(category_name));
1270}
1271
1272uint32_t
1273SBDebugger::GetNumCategories()
1274{
1275 return DataVisualization::Categories::GetCount();
1276}
1277
1278SBTypeCategory
1279SBDebugger::GetCategoryAtIndex (uint32_t index)
1280{
1281 return SBTypeCategory(DataVisualization::Categories::GetCategoryAtIndex(index));
1282}
1283
1284SBTypeCategory
1285SBDebugger::GetDefaultCategory()
1286{
1287 return GetCategory("default");
1288}
1289
1290SBTypeFormat
1291SBDebugger::GetFormatForType (SBTypeNameSpecifier type_name)
1292{
1293 SBTypeCategory default_category_sb = GetDefaultCategory();
1294 if (default_category_sb.GetEnabled())
1295 return default_category_sb.GetFormatForType(type_name);
1296 return SBTypeFormat();
1297}
1298
Jason Molendacf7e2dc2012-02-21 05:33:55 +00001299#ifndef LLDB_DISABLE_PYTHON
Enrico Granata061858c2012-02-15 02:34:21 +00001300SBTypeSummary
1301SBDebugger::GetSummaryForType (SBTypeNameSpecifier type_name)
1302{
Enrico Granataa777dc22012-05-08 21:49:57 +00001303 if (type_name.IsValid() == false)
1304 return SBTypeSummary();
1305 return SBTypeSummary(DataVisualization::GetSummaryForType(type_name.GetSP()));
Enrico Granata061858c2012-02-15 02:34:21 +00001306}
Jason Molendacf7e2dc2012-02-21 05:33:55 +00001307#endif // LLDB_DISABLE_PYTHON
Enrico Granata061858c2012-02-15 02:34:21 +00001308
1309SBTypeFilter
1310SBDebugger::GetFilterForType (SBTypeNameSpecifier type_name)
1311{
Enrico Granataa777dc22012-05-08 21:49:57 +00001312 if (type_name.IsValid() == false)
1313 return SBTypeFilter();
1314 return SBTypeFilter(DataVisualization::GetFilterForType(type_name.GetSP()));
Enrico Granata061858c2012-02-15 02:34:21 +00001315}
1316
Jason Molendacf7e2dc2012-02-21 05:33:55 +00001317#ifndef LLDB_DISABLE_PYTHON
Enrico Granata061858c2012-02-15 02:34:21 +00001318SBTypeSynthetic
1319SBDebugger::GetSyntheticForType (SBTypeNameSpecifier type_name)
1320{
Enrico Granataa777dc22012-05-08 21:49:57 +00001321 if (type_name.IsValid() == false)
1322 return SBTypeSynthetic();
1323 return SBTypeSynthetic(DataVisualization::GetSyntheticForType(type_name.GetSP()));
Enrico Granata061858c2012-02-15 02:34:21 +00001324}
Jason Molendacf7e2dc2012-02-21 05:33:55 +00001325#endif // LLDB_DISABLE_PYTHON
Enrico Granata061858c2012-02-15 02:34:21 +00001326
Jim Ingham228063c2012-02-21 02:23:08 +00001327bool
1328SBDebugger::EnableLog (const char *channel, const char **categories)
1329{
1330 if (m_opaque_sp)
1331 {
1332 uint32_t log_options = LLDB_LOG_OPTION_PREPEND_TIMESTAMP | LLDB_LOG_OPTION_PREPEND_THREAD_NAME;
1333 StreamString errors;
1334 return m_opaque_sp->EnableLog (channel, categories, NULL, log_options, errors);
1335
1336 }
1337 else
1338 return false;
1339}
Jim Ingham4f02b222012-02-22 22:49:20 +00001340
1341void
1342SBDebugger::SetLoggingCallback (lldb::LogOutputCallback log_callback, void *baton)
1343{
1344 if (m_opaque_sp)
1345 {
1346 return m_opaque_sp->SetLoggingCallback (log_callback, baton);
1347 }
1348}
1349
1350