blob: 7b5b6e382993c1e41f59aea3be5e58dc74da3a69 [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;
Jim Ingham228063c2012-02-21 02:23:08 +0000162 debugger.reset(Debugger::CreateInstance(callback, baton));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000163
164 if (log)
165 {
166 SBStream sstr;
167 debugger.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000168 log->Printf ("SBDebugger::Create () => SBDebugger(%p): %s",
169 static_cast<void*>(debugger.m_opaque_sp.get()),
170 sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000171 }
172
Jim Ingham06942692011-08-13 00:22:20 +0000173 SBCommandInterpreter interp = debugger.GetCommandInterpreter();
174 if (source_init_files)
175 {
176 interp.get()->SkipLLDBInitFiles(false);
177 interp.get()->SkipAppInitFiles (false);
178 SBCommandReturnObject result;
179 interp.SourceInitFileInHomeDirectory(result);
180 }
181 else
182 {
183 interp.get()->SkipLLDBInitFiles(true);
184 interp.get()->SkipAppInitFiles (true);
185 }
Greg Clayton66111032010-06-23 01:19:29 +0000186 return debugger;
187}
188
Caroline Ticee02657b2011-01-22 01:02:07 +0000189void
190SBDebugger::Destroy (SBDebugger &debugger)
191{
Greg Clayton5160ce52013-03-27 23:08:40 +0000192 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000193
Caroline Ticee02657b2011-01-22 01:02:07 +0000194 if (log)
195 {
196 SBStream sstr;
197 debugger.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000198 log->Printf ("SBDebugger::Destroy () => SBDebugger(%p): %s",
199 static_cast<void*>(debugger.m_opaque_sp.get()),
200 sstr.GetData());
Caroline Ticee02657b2011-01-22 01:02:07 +0000201 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000202
Caroline Ticee02657b2011-01-22 01:02:07 +0000203 Debugger::Destroy (debugger.m_opaque_sp);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000204
Caroline Ticee02657b2011-01-22 01:02:07 +0000205 if (debugger.m_opaque_sp.get() != NULL)
206 debugger.m_opaque_sp.reset();
207}
208
Greg Claytonf9322412011-12-15 04:38:41 +0000209void
210SBDebugger::MemoryPressureDetected ()
211{
Greg Clayton0cd70862012-04-09 20:22:01 +0000212 // Since this function can be call asynchronously, we allow it to be
213 // non-mandatory. We have seen deadlocks with this function when called
214 // so we need to safeguard against this until we can determine what is
215 // causing the deadlocks.
Greg Clayton5160ce52013-03-27 23:08:40 +0000216 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Inghamaebdf1b2012-06-07 19:08:07 +0000217
Greg Clayton0cd70862012-04-09 20:22:01 +0000218 const bool mandatory = false;
Jim Inghamaebdf1b2012-06-07 19:08:07 +0000219 if (log)
220 {
221 log->Printf ("SBDebugger::MemoryPressureDetected (), mandatory = %d", mandatory);
222 }
223
Greg Clayton0cd70862012-04-09 20:22:01 +0000224 ModuleList::RemoveOrphanSharedModules(mandatory);
Greg Claytonf9322412011-12-15 04:38:41 +0000225}
226
Greg Clayton66111032010-06-23 01:19:29 +0000227SBDebugger::SBDebugger () :
228 m_opaque_sp ()
229{
230}
231
Enrico Granata274fd6e2011-08-19 23:56:34 +0000232SBDebugger::SBDebugger(const lldb::DebuggerSP &debugger_sp) :
233 m_opaque_sp(debugger_sp)
234{
235}
236
Greg Claytonefabb122010-11-05 23:17:00 +0000237SBDebugger::SBDebugger(const SBDebugger &rhs) :
238 m_opaque_sp (rhs.m_opaque_sp)
239{
240}
241
242SBDebugger &
243SBDebugger::operator = (const SBDebugger &rhs)
244{
245 if (this != &rhs)
246 {
247 m_opaque_sp = rhs.m_opaque_sp;
248 }
249 return *this;
250}
251
Greg Clayton66111032010-06-23 01:19:29 +0000252SBDebugger::~SBDebugger ()
253{
254}
255
256bool
257SBDebugger::IsValid() const
258{
259 return m_opaque_sp.get() != NULL;
260}
261
262
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000263void
264SBDebugger::SetAsync (bool b)
265{
Greg Clayton66111032010-06-23 01:19:29 +0000266 if (m_opaque_sp)
267 m_opaque_sp->SetAsyncExecution(b);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000268}
269
Jim Inghame64f0dc2011-09-13 23:25:31 +0000270bool
271SBDebugger::GetAsync ()
272{
273 if (m_opaque_sp)
274 return m_opaque_sp->GetAsyncExecution();
275 else
276 return false;
277}
278
Greg Clayton6eee5aa2010-10-11 01:05:37 +0000279void
280SBDebugger::SkipLLDBInitFiles (bool b)
281{
282 if (m_opaque_sp)
283 m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles (b);
284}
285
Jim Ingham16e0c682011-08-12 23:34:31 +0000286void
287SBDebugger::SkipAppInitFiles (bool b)
288{
289 if (m_opaque_sp)
290 m_opaque_sp->GetCommandInterpreter().SkipAppInitFiles (b);
291}
292
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000293// Shouldn't really be settable after initialization as this could cause lots of problems; don't want users
294// trying to switch modes in the middle of a debugging session.
295void
296SBDebugger::SetInputFileHandle (FILE *fh, bool transfer_ownership)
297{
Greg Clayton5160ce52013-03-27 23:08:40 +0000298 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000299
300 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000301 log->Printf ("SBDebugger(%p)::SetInputFileHandle (fh=%p, transfer_ownership=%i)",
302 static_cast<void*>(m_opaque_sp.get()),
303 static_cast<void*>(fh), transfer_ownership);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000304
Greg Clayton66111032010-06-23 01:19:29 +0000305 if (m_opaque_sp)
306 m_opaque_sp->SetInputFileHandle (fh, transfer_ownership);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000307}
308
309void
310SBDebugger::SetOutputFileHandle (FILE *fh, bool transfer_ownership)
311{
Greg Clayton5160ce52013-03-27 23:08:40 +0000312 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000313
314
315 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000316 log->Printf ("SBDebugger(%p)::SetOutputFileHandle (fh=%p, transfer_ownership=%i)",
317 static_cast<void*>(m_opaque_sp.get()),
318 static_cast<void*>(fh), transfer_ownership);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000319
Greg Clayton66111032010-06-23 01:19:29 +0000320 if (m_opaque_sp)
321 m_opaque_sp->SetOutputFileHandle (fh, transfer_ownership);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000322}
323
324void
325SBDebugger::SetErrorFileHandle (FILE *fh, bool transfer_ownership)
326{
Greg Clayton5160ce52013-03-27 23:08:40 +0000327 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000328
329
330 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000331 log->Printf ("SBDebugger(%p)::SetErrorFileHandle (fh=%p, transfer_ownership=%i)",
332 static_cast<void*>(m_opaque_sp.get()),
333 static_cast<void*>(fh), transfer_ownership);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000334
Greg Clayton66111032010-06-23 01:19:29 +0000335 if (m_opaque_sp)
336 m_opaque_sp->SetErrorFileHandle (fh, transfer_ownership);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000337}
338
339FILE *
340SBDebugger::GetInputFileHandle ()
341{
Greg Clayton66111032010-06-23 01:19:29 +0000342 if (m_opaque_sp)
Greg Clayton44d93782014-01-27 23:43:24 +0000343 {
344 StreamFileSP stream_file_sp (m_opaque_sp->GetInputFile());
345 if (stream_file_sp)
346 return stream_file_sp->GetFile().GetStream();
347 }
Greg Clayton66111032010-06-23 01:19:29 +0000348 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000349}
350
351FILE *
352SBDebugger::GetOutputFileHandle ()
353{
Greg Clayton66111032010-06-23 01:19:29 +0000354 if (m_opaque_sp)
Greg Clayton44d93782014-01-27 23:43:24 +0000355 {
356 StreamFileSP stream_file_sp (m_opaque_sp->GetOutputFile());
357 if (stream_file_sp)
358 return stream_file_sp->GetFile().GetStream();
359 }
Greg Clayton66111032010-06-23 01:19:29 +0000360 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000361}
362
363FILE *
364SBDebugger::GetErrorFileHandle ()
365{
Greg Clayton66111032010-06-23 01:19:29 +0000366 if (m_opaque_sp)
Greg Clayton44d93782014-01-27 23:43:24 +0000367 if (m_opaque_sp)
368 {
369 StreamFileSP stream_file_sp (m_opaque_sp->GetErrorFile());
370 if (stream_file_sp)
371 return stream_file_sp->GetFile().GetStream();
372 }
Greg Clayton66111032010-06-23 01:19:29 +0000373 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000374}
375
Jim Inghamc5917d92012-11-30 20:23:19 +0000376void
377SBDebugger::SaveInputTerminalState()
378{
379 if (m_opaque_sp)
380 m_opaque_sp->SaveInputTerminalState();
381}
382
383void
384SBDebugger::RestoreInputTerminalState()
385{
386 if (m_opaque_sp)
387 m_opaque_sp->RestoreInputTerminalState();
388
389}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000390SBCommandInterpreter
391SBDebugger::GetCommandInterpreter ()
392{
Greg Clayton5160ce52013-03-27 23:08:40 +0000393 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000394
Greg Clayton66111032010-06-23 01:19:29 +0000395 SBCommandInterpreter sb_interpreter;
396 if (m_opaque_sp)
397 sb_interpreter.reset (&m_opaque_sp->GetCommandInterpreter());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000398
Caroline Tice750cd172010-10-26 23:49:36 +0000399 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000400 log->Printf ("SBDebugger(%p)::GetCommandInterpreter () => SBCommandInterpreter(%p)",
401 static_cast<void*>(m_opaque_sp.get()),
402 static_cast<void*>(sb_interpreter.get()));
Caroline Tice750cd172010-10-26 23:49:36 +0000403
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000404 return sb_interpreter;
405}
406
407void
408SBDebugger::HandleCommand (const char *command)
409{
Greg Clayton66111032010-06-23 01:19:29 +0000410 if (m_opaque_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000411 {
Greg Claytonaf67cec2010-12-20 20:49:23 +0000412 TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
413 Mutex::Locker api_locker;
414 if (target_sp)
Jim Ingham10ebffa2012-05-04 23:02:50 +0000415 api_locker.Lock(target_sp->GetAPIMutex());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000416
Greg Clayton66111032010-06-23 01:19:29 +0000417 SBCommandInterpreter sb_interpreter(GetCommandInterpreter ());
418 SBCommandReturnObject result;
419
420 sb_interpreter.HandleCommand (command, result, false);
421
422 if (GetErrorFileHandle() != NULL)
423 result.PutError (GetErrorFileHandle());
424 if (GetOutputFileHandle() != NULL)
425 result.PutOutput (GetOutputFileHandle());
426
427 if (m_opaque_sp->GetAsyncExecution() == false)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000428 {
Greg Clayton66111032010-06-23 01:19:29 +0000429 SBProcess process(GetCommandInterpreter().GetProcess ());
Greg Claytonb9556ac2012-01-30 07:41:31 +0000430 ProcessSP process_sp (process.GetSP());
431 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000432 {
Greg Clayton66111032010-06-23 01:19:29 +0000433 EventSP event_sp;
434 Listener &lldb_listener = m_opaque_sp->GetListener();
Greg Claytonb9556ac2012-01-30 07:41:31 +0000435 while (lldb_listener.GetNextEventForBroadcaster (process_sp.get(), event_sp))
Greg Clayton66111032010-06-23 01:19:29 +0000436 {
437 SBEvent event(event_sp);
438 HandleProcessEvent (process, event, GetOutputFileHandle(), GetErrorFileHandle());
439 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000440 }
441 }
442 }
443}
444
445SBListener
446SBDebugger::GetListener ()
447{
Greg Clayton5160ce52013-03-27 23:08:40 +0000448 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000449
Greg Clayton66111032010-06-23 01:19:29 +0000450 SBListener sb_listener;
451 if (m_opaque_sp)
452 sb_listener.reset(&m_opaque_sp->GetListener(), false);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000453
Caroline Tice750cd172010-10-26 23:49:36 +0000454 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000455 log->Printf ("SBDebugger(%p)::GetListener () => SBListener(%p)",
456 static_cast<void*>(m_opaque_sp.get()),
457 static_cast<void*>(sb_listener.get()));
Caroline Tice750cd172010-10-26 23:49:36 +0000458
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000459 return sb_listener;
460}
461
462void
463SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, FILE *out, FILE *err)
464{
Greg Claytonaf67cec2010-12-20 20:49:23 +0000465 if (!process.IsValid())
466 return;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000467
Greg Claytonb9556ac2012-01-30 07:41:31 +0000468 TargetSP target_sp (process.GetTarget().GetSP());
469 if (!target_sp)
470 return;
471
Greg Claytonaf67cec2010-12-20 20:49:23 +0000472 const uint32_t event_type = event.GetType();
473 char stdio_buffer[1024];
474 size_t len;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000475
Greg Claytonb9556ac2012-01-30 07:41:31 +0000476 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000477
478 if (event_type & (Process::eBroadcastBitSTDOUT | Process::eBroadcastBitStateChanged))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000479 {
Greg Claytonaf67cec2010-12-20 20:49:23 +0000480 // Drain stdout when we stop just in case we have any bytes
481 while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
482 if (out != NULL)
483 ::fwrite (stdio_buffer, 1, len, out);
484 }
485
486 if (event_type & (Process::eBroadcastBitSTDERR | Process::eBroadcastBitStateChanged))
487 {
488 // Drain stderr when we stop just in case we have any bytes
489 while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
490 if (err != NULL)
491 ::fwrite (stdio_buffer, 1, len, err);
492 }
493
494 if (event_type & Process::eBroadcastBitStateChanged)
495 {
496 StateType event_state = SBProcess::GetStateFromEvent (event);
497
498 if (event_state == eStateInvalid)
499 return;
500
501 bool is_stopped = StateIsStoppedState (event_state);
502 if (!is_stopped)
503 process.ReportEventState (event, out);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000504 }
505}
506
Jim Inghame37d6052011-09-13 00:29:56 +0000507SBSourceManager
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000508SBDebugger::GetSourceManager ()
509{
Jim Inghame37d6052011-09-13 00:29:56 +0000510 SBSourceManager sb_source_manager (*this);
511 return sb_source_manager;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000512}
513
514
515bool
516SBDebugger::GetDefaultArchitecture (char *arch_name, size_t arch_name_len)
517{
518 if (arch_name && arch_name_len)
519 {
Greg Clayton431ce672011-04-18 23:15:17 +0000520 ArchSpec default_arch = Target::GetDefaultArchitecture ();
Caroline Ticedaccaa92010-09-20 20:44:43 +0000521
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000522 if (default_arch.IsValid())
523 {
Greg Clayton431ce672011-04-18 23:15:17 +0000524 const std::string &triple_str = default_arch.GetTriple().str();
525 if (!triple_str.empty())
526 ::snprintf (arch_name, arch_name_len, "%s", triple_str.c_str());
527 else
528 ::snprintf (arch_name, arch_name_len, "%s", default_arch.GetArchitectureName());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000529 return true;
530 }
531 }
532 if (arch_name && arch_name_len)
533 arch_name[0] = '\0';
534 return false;
535}
536
537
538bool
539SBDebugger::SetDefaultArchitecture (const char *arch_name)
540{
541 if (arch_name)
542 {
Greg Clayton70512312012-05-08 01:45:38 +0000543 ArchSpec arch (arch_name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000544 if (arch.IsValid())
545 {
Greg Clayton431ce672011-04-18 23:15:17 +0000546 Target::SetDefaultArchitecture (arch);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000547 return true;
548 }
549 }
550 return false;
551}
552
553ScriptLanguage
554SBDebugger::GetScriptingLanguage (const char *script_language_name)
555{
Greg Claytonaf67cec2010-12-20 20:49:23 +0000556
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000557 return Args::StringToScriptLanguage (script_language_name,
558 eScriptLanguageDefault,
559 NULL);
560}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000561
562const char *
563SBDebugger::GetVersionString ()
564{
Virgile Bellob2f1fb22013-08-23 12:44:05 +0000565 return lldb_private::GetVersion();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000566}
567
568const char *
Greg Clayton431ce672011-04-18 23:15:17 +0000569SBDebugger::StateAsCString (StateType state)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000570{
Caroline Ticec2bbb492011-04-25 22:05:51 +0000571 return lldb_private::StateAsCString (state);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000572}
573
574bool
Greg Clayton431ce672011-04-18 23:15:17 +0000575SBDebugger::StateIsRunningState (StateType state)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000576{
Greg Clayton5160ce52013-03-27 23:08:40 +0000577 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000578
Caroline Ticec2bbb492011-04-25 22:05:51 +0000579 const bool result = lldb_private::StateIsRunningState (state);
Greg Clayton48381312010-10-30 04:51:46 +0000580 if (log)
581 log->Printf ("SBDebugger::StateIsRunningState (state=%s) => %i",
Greg Clayton431ce672011-04-18 23:15:17 +0000582 StateAsCString (state), result);
Greg Clayton48381312010-10-30 04:51:46 +0000583
584 return result;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000585}
586
587bool
Greg Clayton431ce672011-04-18 23:15:17 +0000588SBDebugger::StateIsStoppedState (StateType state)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000589{
Greg Clayton5160ce52013-03-27 23:08:40 +0000590 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000591
Greg Clayton2637f822011-11-17 01:23:07 +0000592 const bool result = lldb_private::StateIsStoppedState (state, false);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000593 if (log)
Greg Clayton48381312010-10-30 04:51:46 +0000594 log->Printf ("SBDebugger::StateIsStoppedState (state=%s) => %i",
Greg Clayton431ce672011-04-18 23:15:17 +0000595 StateAsCString (state), result);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000596
Greg Clayton48381312010-10-30 04:51:46 +0000597 return result;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000598}
599
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000600lldb::SBTarget
601SBDebugger::CreateTarget (const char *filename,
602 const char *target_triple,
603 const char *platform_name,
604 bool add_dependent_modules,
605 lldb::SBError& sb_error)
606{
607 SBTarget sb_target;
Greg Claytonb9556ac2012-01-30 07:41:31 +0000608 TargetSP target_sp;
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000609 if (m_opaque_sp)
610 {
611 sb_error.Clear();
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000612 OptionGroupPlatform platform_options (false);
613 platform_options.SetPlatformName (platform_name);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000614
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000615 sb_error.ref() = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
Greg Claytona0ca6602012-10-18 16:33:33 +0000616 filename,
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000617 target_triple,
618 add_dependent_modules,
619 &platform_options,
620 target_sp);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000621
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000622 if (sb_error.Success())
Greg Claytonb9556ac2012-01-30 07:41:31 +0000623 sb_target.SetSP (target_sp);
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000624 }
625 else
626 {
627 sb_error.SetErrorString("invalid target");
628 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000629
Greg Clayton5160ce52013-03-27 23:08:40 +0000630 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000631 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000632 log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\", triple=%s, platform_name=%s, add_dependent_modules=%u, error=%s) => SBTarget(%p)",
633 static_cast<void*>(m_opaque_sp.get()), filename,
634 target_triple, platform_name, add_dependent_modules,
635 sb_error.GetCString(), static_cast<void*>(target_sp.get()));
636
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000637 return sb_target;
638}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000639
640SBTarget
641SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename,
642 const char *target_triple)
643{
Greg Claytonb9556ac2012-01-30 07:41:31 +0000644 SBTarget sb_target;
645 TargetSP target_sp;
Greg Clayton66111032010-06-23 01:19:29 +0000646 if (m_opaque_sp)
647 {
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000648 const bool add_dependent_modules = true;
649 Error error (m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
Greg Claytona0ca6602012-10-18 16:33:33 +0000650 filename,
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000651 target_triple,
652 add_dependent_modules,
653 NULL,
654 target_sp));
Greg Claytonb9556ac2012-01-30 07:41:31 +0000655 sb_target.SetSP (target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000656 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000657
Greg Clayton5160ce52013-03-27 23:08:40 +0000658 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000659 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000660 log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndTargetTriple (filename=\"%s\", triple=%s) => SBTarget(%p)",
661 static_cast<void*>(m_opaque_sp.get()), filename,
662 target_triple, static_cast<void*>(target_sp.get()));
Greg Clayton48381312010-10-30 04:51:46 +0000663
Greg Claytonb9556ac2012-01-30 07:41:31 +0000664 return sb_target;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000665}
666
667SBTarget
Greg Clayton64195a22011-02-23 00:35:02 +0000668SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *arch_cstr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000669{
Greg Clayton5160ce52013-03-27 23:08:40 +0000670 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000671
Greg Claytonb9556ac2012-01-30 07:41:31 +0000672 SBTarget sb_target;
673 TargetSP target_sp;
Greg Clayton66111032010-06-23 01:19:29 +0000674 if (m_opaque_sp)
675 {
Greg Clayton66111032010-06-23 01:19:29 +0000676 Error error;
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000677 const bool add_dependent_modules = true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000678
Greg Claytona0ca6602012-10-18 16:33:33 +0000679 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
680 filename,
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000681 arch_cstr,
682 add_dependent_modules,
683 NULL,
684 target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000685
686 if (error.Success())
687 {
Jim Ingham2976d002010-08-26 21:32:51 +0000688 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Claytonb9556ac2012-01-30 07:41:31 +0000689 sb_target.SetSP (target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000690 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000691 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000692
693 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000694 log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndArch (filename=\"%s\", arch=%s) => SBTarget(%p)",
695 static_cast<void*>(m_opaque_sp.get()), filename, arch_cstr,
696 static_cast<void*>(target_sp.get()));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000697
Greg Claytonb9556ac2012-01-30 07:41:31 +0000698 return sb_target;
Greg Clayton66111032010-06-23 01:19:29 +0000699}
700
701SBTarget
702SBDebugger::CreateTarget (const char *filename)
703{
Greg Claytonb9556ac2012-01-30 07:41:31 +0000704 SBTarget sb_target;
705 TargetSP target_sp;
Greg Clayton66111032010-06-23 01:19:29 +0000706 if (m_opaque_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000707 {
Greg Clayton431ce672011-04-18 23:15:17 +0000708 ArchSpec arch = Target::GetDefaultArchitecture ();
Greg Clayton66111032010-06-23 01:19:29 +0000709 Error error;
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000710 const bool add_dependent_modules = true;
Greg Clayton66111032010-06-23 01:19:29 +0000711
Greg Claytonb3a40ba2012-03-20 18:34:04 +0000712 PlatformSP platform_sp(m_opaque_sp->GetPlatformList().GetSelectedPlatform());
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000713 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
Greg Claytona0ca6602012-10-18 16:33:33 +0000714 filename,
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000715 arch,
716 add_dependent_modules,
Greg Claytonb3a40ba2012-03-20 18:34:04 +0000717 platform_sp,
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000718 target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000719
720 if (error.Success())
721 {
Jim Ingham2976d002010-08-26 21:32:51 +0000722 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Claytonb9556ac2012-01-30 07:41:31 +0000723 sb_target.SetSP (target_sp);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000724 }
725 }
Greg Clayton5160ce52013-03-27 23:08:40 +0000726 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000727 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000728 log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)",
729 static_cast<void*>(m_opaque_sp.get()), filename,
730 static_cast<void*>(target_sp.get()));
Greg Claytonb9556ac2012-01-30 07:41:31 +0000731 return sb_target;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000732}
733
Johnny Chen3794ad92011-06-15 21:24:24 +0000734bool
735SBDebugger::DeleteTarget (lldb::SBTarget &target)
736{
737 bool result = false;
Greg Claytonb9556ac2012-01-30 07:41:31 +0000738 if (m_opaque_sp)
Johnny Chen3794ad92011-06-15 21:24:24 +0000739 {
Greg Claytonb9556ac2012-01-30 07:41:31 +0000740 TargetSP target_sp(target.GetSP());
741 if (target_sp)
742 {
743 // No need to lock, the target list is thread safe
744 result = m_opaque_sp->GetTargetList().DeleteTarget (target_sp);
745 target_sp->Destroy();
746 target.Clear();
Greg Clayton0cd70862012-04-09 20:22:01 +0000747 const bool mandatory = true;
748 ModuleList::RemoveOrphanSharedModules(mandatory);
Greg Claytonb9556ac2012-01-30 07:41:31 +0000749 }
Johnny Chen3794ad92011-06-15 21:24:24 +0000750 }
751
Greg Clayton5160ce52013-03-27 23:08:40 +0000752 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Johnny Chen3794ad92011-06-15 21:24:24 +0000753 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000754 log->Printf ("SBDebugger(%p)::DeleteTarget (SBTarget(%p)) => %i",
755 static_cast<void*>(m_opaque_sp.get()),
756 static_cast<void*>(target.m_opaque_sp.get()), result);
Johnny Chen3794ad92011-06-15 21:24:24 +0000757
758 return result;
759}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000760SBTarget
761SBDebugger::GetTargetAtIndex (uint32_t idx)
762{
Greg Clayton66111032010-06-23 01:19:29 +0000763 SBTarget sb_target;
764 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000765 {
766 // No need to lock, the target list is thread safe
Greg Claytonb9556ac2012-01-30 07:41:31 +0000767 sb_target.SetSP (m_opaque_sp->GetTargetList().GetTargetAtIndex (idx));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000768 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000769 return sb_target;
770}
771
Jim Ingham8499e1a2012-05-08 23:06:07 +0000772uint32_t
773SBDebugger::GetIndexOfTarget (lldb::SBTarget target)
774{
775
776 lldb::TargetSP target_sp = target.GetSP();
777 if (!target_sp)
778 return UINT32_MAX;
779
780 if (!m_opaque_sp)
781 return UINT32_MAX;
782
783 return m_opaque_sp->GetTargetList().GetIndexOfTarget (target.GetSP());
784}
785
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000786SBTarget
Virgile Bello997f6f72013-09-05 16:53:14 +0000787SBDebugger::FindTargetWithProcessID (lldb::pid_t pid)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000788{
Greg Clayton66111032010-06-23 01:19:29 +0000789 SBTarget sb_target;
790 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000791 {
792 // No need to lock, the target list is thread safe
Greg Claytonb9556ac2012-01-30 07:41:31 +0000793 sb_target.SetSP (m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000794 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000795 return sb_target;
796}
797
798SBTarget
799SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name)
800{
Greg Clayton66111032010-06-23 01:19:29 +0000801 SBTarget sb_target;
802 if (m_opaque_sp && filename && filename[0])
803 {
Greg Claytonaf67cec2010-12-20 20:49:23 +0000804 // No need to lock, the target list is thread safe
Greg Claytoneb0103f2011-04-07 22:46:35 +0000805 ArchSpec arch (arch_name, m_opaque_sp->GetPlatformList().GetSelectedPlatform().get());
Greg Clayton274060b2010-10-20 20:54:39 +0000806 TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename, false), arch_name ? &arch : NULL));
Greg Claytonb9556ac2012-01-30 07:41:31 +0000807 sb_target.SetSP (target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000808 }
809 return sb_target;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000810}
811
812SBTarget
Greg Clayton431ce672011-04-18 23:15:17 +0000813SBDebugger::FindTargetWithLLDBProcess (const ProcessSP &process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000814{
Greg Clayton66111032010-06-23 01:19:29 +0000815 SBTarget sb_target;
816 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000817 {
818 // No need to lock, the target list is thread safe
Greg Claytonb9556ac2012-01-30 07:41:31 +0000819 sb_target.SetSP (m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get()));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000820 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000821 return sb_target;
822}
823
824
825uint32_t
826SBDebugger::GetNumTargets ()
827{
Greg Clayton66111032010-06-23 01:19:29 +0000828 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000829 {
830 // No need to lock, the target list is thread safe
Greg Clayton66111032010-06-23 01:19:29 +0000831 return m_opaque_sp->GetTargetList().GetNumTargets ();
Greg Claytonaf67cec2010-12-20 20:49:23 +0000832 }
Greg Clayton66111032010-06-23 01:19:29 +0000833 return 0;
834}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000835
836SBTarget
Jim Ingham2976d002010-08-26 21:32:51 +0000837SBDebugger::GetSelectedTarget ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000838{
Greg Clayton5160ce52013-03-27 23:08:40 +0000839 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000840
Greg Clayton66111032010-06-23 01:19:29 +0000841 SBTarget sb_target;
Greg Claytonb9556ac2012-01-30 07:41:31 +0000842 TargetSP target_sp;
Greg Clayton66111032010-06-23 01:19:29 +0000843 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000844 {
845 // No need to lock, the target list is thread safe
Greg Claytonb9556ac2012-01-30 07:41:31 +0000846 target_sp = m_opaque_sp->GetTargetList().GetSelectedTarget ();
847 sb_target.SetSP (target_sp);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000848 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000849
850 if (log)
851 {
852 SBStream sstr;
Greg Clayton431ce672011-04-18 23:15:17 +0000853 sb_target.GetDescription (sstr, eDescriptionLevelBrief);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000854 log->Printf ("SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s",
855 static_cast<void*>(m_opaque_sp.get()),
856 static_cast<void*>(target_sp.get()), sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000857 }
858
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000859 return sb_target;
860}
861
862void
Jim Inghame64f0dc2011-09-13 23:25:31 +0000863SBDebugger::SetSelectedTarget (SBTarget &sb_target)
864{
Greg Clayton5160ce52013-03-27 23:08:40 +0000865 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Inghame64f0dc2011-09-13 23:25:31 +0000866
Greg Claytonb9556ac2012-01-30 07:41:31 +0000867 TargetSP target_sp (sb_target.GetSP());
Jim Inghame64f0dc2011-09-13 23:25:31 +0000868 if (m_opaque_sp)
869 {
Greg Claytonb9556ac2012-01-30 07:41:31 +0000870 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Jim Inghame64f0dc2011-09-13 23:25:31 +0000871 }
872 if (log)
873 {
874 SBStream sstr;
875 sb_target.GetDescription (sstr, eDescriptionLevelBrief);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000876 log->Printf ("SBDebugger(%p)::SetSelectedTarget () => SBTarget(%p): %s",
877 static_cast<void*>(m_opaque_sp.get()),
878 static_cast<void*>(target_sp.get()), sstr.GetData());
Jim Inghame64f0dc2011-09-13 23:25:31 +0000879 }
880}
881
Greg Claytonfbb76342013-11-20 21:07:01 +0000882SBPlatform
883SBDebugger::GetSelectedPlatform()
884{
885 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
886
887 SBPlatform sb_platform;
888 DebuggerSP debugger_sp(m_opaque_sp);
889 if (debugger_sp)
890 {
891 sb_platform.SetSP(debugger_sp->GetPlatformList().GetSelectedPlatform());
892 }
893 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000894 log->Printf ("SBDebugger(%p)::GetSelectedPlatform () => SBPlatform(%p): %s",
895 static_cast<void*>(m_opaque_sp.get()),
896 static_cast<void*>(sb_platform.GetSP().get()),
897 sb_platform.GetName());
Greg Claytonfbb76342013-11-20 21:07:01 +0000898 return sb_platform;
899}
900
901void
902SBDebugger::SetSelectedPlatform(SBPlatform &sb_platform)
903{
904 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000905
Greg Claytonfbb76342013-11-20 21:07:01 +0000906 DebuggerSP debugger_sp(m_opaque_sp);
907 if (debugger_sp)
908 {
909 debugger_sp->GetPlatformList().SetSelectedPlatform(sb_platform.GetSP());
910 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000911
Greg Claytonfbb76342013-11-20 21:07:01 +0000912 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000913 log->Printf ("SBDebugger(%p)::SetSelectedPlatform (SBPlatform(%p) %s)",
914 static_cast<void*>(m_opaque_sp.get()),
915 static_cast<void*>(sb_platform.GetSP().get()),
916 sb_platform.GetName());
Greg Claytonfbb76342013-11-20 21:07:01 +0000917}
918
Jim Inghame64f0dc2011-09-13 23:25:31 +0000919void
Enrico Granatac30a73a2012-09-06 22:02:28 +0000920SBDebugger::DispatchInput (void* baton, const void *data, size_t data_len)
Enrico Granata6b09d422012-09-06 21:58:25 +0000921{
922 DispatchInput (data,data_len);
923}
924
925void
Filipe Cabecinhasc3019992012-08-20 16:21:04 +0000926SBDebugger::DispatchInput (const void *data, size_t data_len)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000927{
Greg Clayton44d93782014-01-27 23:43:24 +0000928// Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
929//
930// if (log)
931// log->Printf ("SBDebugger(%p)::DispatchInput (data=\"%.*s\", size_t=%" PRIu64 ")",
932// m_opaque_sp.get(),
933// (int) data_len,
934// (const char *) data,
935// (uint64_t)data_len);
936//
937// if (m_opaque_sp)
938// m_opaque_sp->DispatchInput ((const char *) data, data_len);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000939}
940
941void
Caroline Ticeefed6132010-11-19 20:47:54 +0000942SBDebugger::DispatchInputInterrupt ()
943{
944 if (m_opaque_sp)
945 m_opaque_sp->DispatchInputInterrupt ();
946}
947
948void
949SBDebugger::DispatchInputEndOfFile ()
950{
951 if (m_opaque_sp)
952 m_opaque_sp->DispatchInputEndOfFile ();
953}
954
955void
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000956SBDebugger::PushInputReader (SBInputReader &reader)
957{
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000958}
Greg Clayton66111032010-06-23 01:19:29 +0000959
960void
Greg Clayton44d93782014-01-27 23:43:24 +0000961SBDebugger::RunCommandInterpreter (bool auto_handle_events,
962 bool spawn_thread)
Caroline Tice969ed3d2011-05-02 20:41:46 +0000963{
Caroline Tice969ed3d2011-05-02 20:41:46 +0000964 if (m_opaque_sp)
Greg Clayton44d93782014-01-27 23:43:24 +0000965 m_opaque_sp->GetCommandInterpreter().RunCommandInterpreter(auto_handle_events, spawn_thread);
Caroline Tice969ed3d2011-05-02 20:41:46 +0000966}
967
968void
Greg Clayton431ce672011-04-18 23:15:17 +0000969SBDebugger::reset (const DebuggerSP &debugger_sp)
Greg Clayton66111032010-06-23 01:19:29 +0000970{
971 m_opaque_sp = debugger_sp;
972}
973
974Debugger *
975SBDebugger::get () const
976{
977 return m_opaque_sp.get();
978}
979
980Debugger &
981SBDebugger::ref () const
982{
983 assert (m_opaque_sp.get());
984 return *m_opaque_sp;
985}
986
Greg Clayton9a377662011-10-01 02:59:24 +0000987const lldb::DebuggerSP &
988SBDebugger::get_sp () const
989{
990 return m_opaque_sp;
991}
Greg Clayton66111032010-06-23 01:19:29 +0000992
Caroline Ticeebc1bb22010-06-30 16:22:25 +0000993SBDebugger
994SBDebugger::FindDebuggerWithID (int id)
995{
Greg Claytonaf67cec2010-12-20 20:49:23 +0000996 // No need to lock, the debugger list is thread safe
Caroline Ticeebc1bb22010-06-30 16:22:25 +0000997 SBDebugger sb_debugger;
Greg Clayton431ce672011-04-18 23:15:17 +0000998 DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id);
Caroline Ticeebc1bb22010-06-30 16:22:25 +0000999 if (debugger_sp)
1000 sb_debugger.reset (debugger_sp);
1001 return sb_debugger;
1002}
Jim Inghame40e4212010-08-30 19:44:40 +00001003
Caroline Ticedd759852010-09-09 17:45:09 +00001004const char *
1005SBDebugger::GetInstanceName()
1006{
Greg Clayton6920b522012-08-22 18:39:03 +00001007 if (m_opaque_sp)
1008 return m_opaque_sp->GetInstanceName().AsCString();
1009 else
Caroline Ticedd759852010-09-09 17:45:09 +00001010 return NULL;
1011}
1012
Caroline Tice3df9a8d2010-09-04 00:03:46 +00001013SBError
Caroline Ticedd759852010-09-09 17:45:09 +00001014SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name)
Caroline Tice3df9a8d2010-09-04 00:03:46 +00001015{
Greg Clayton6920b522012-08-22 18:39:03 +00001016 SBError sb_error;
1017 DebuggerSP debugger_sp(Debugger::FindDebuggerWithInstanceName (ConstString(debugger_instance_name)));
1018 Error error;
1019 if (debugger_sp)
1020 {
1021 ExecutionContext exe_ctx (debugger_sp->GetCommandInterpreter().GetExecutionContext());
1022 error = debugger_sp->SetPropertyValue (&exe_ctx,
1023 eVarSetOperationAssign,
1024 var_name,
1025 value);
1026 }
1027 else
1028 {
1029 error.SetErrorStringWithFormat ("invalid debugger instance name '%s'", debugger_instance_name);
1030 }
1031 if (error.Fail())
1032 sb_error.SetError(error);
1033 return sb_error;
Caroline Tice3df9a8d2010-09-04 00:03:46 +00001034}
1035
Greg Clayton431ce672011-04-18 23:15:17 +00001036SBStringList
Caroline Ticedd759852010-09-09 17:45:09 +00001037SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name)
Caroline Tice3df9a8d2010-09-04 00:03:46 +00001038{
1039 SBStringList ret_value;
Greg Clayton6920b522012-08-22 18:39:03 +00001040 DebuggerSP debugger_sp(Debugger::FindDebuggerWithInstanceName (ConstString(debugger_instance_name)));
1041 Error error;
1042 if (debugger_sp)
1043 {
1044 ExecutionContext exe_ctx (debugger_sp->GetCommandInterpreter().GetExecutionContext());
1045 lldb::OptionValueSP value_sp (debugger_sp->GetPropertyValue (&exe_ctx,
1046 var_name,
1047 false,
1048 error));
1049 if (value_sp)
1050 {
1051 StreamString value_strm;
1052 value_sp->DumpValue (&exe_ctx, value_strm, OptionValue::eDumpOptionValue);
1053 const std::string &value_str = value_strm.GetString();
1054 if (!value_str.empty())
1055 {
1056 StringList string_list;
Greg Clayton44d93782014-01-27 23:43:24 +00001057 string_list.SplitIntoLines(value_str);
Greg Clayton6920b522012-08-22 18:39:03 +00001058 return SBStringList(&string_list);
1059 }
1060 }
1061 }
1062 return SBStringList();
Caroline Tice3df9a8d2010-09-04 00:03:46 +00001063}
1064
Greg Claytona7015092010-09-18 01:14:36 +00001065uint32_t
1066SBDebugger::GetTerminalWidth () const
1067{
1068 if (m_opaque_sp)
1069 return m_opaque_sp->GetTerminalWidth ();
1070 return 0;
1071}
1072
1073void
1074SBDebugger::SetTerminalWidth (uint32_t term_width)
1075{
1076 if (m_opaque_sp)
1077 m_opaque_sp->SetTerminalWidth (term_width);
1078}
1079
1080const char *
1081SBDebugger::GetPrompt() const
1082{
Greg Clayton5160ce52013-03-27 23:08:40 +00001083 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001084
Caroline Ticeceb6b132010-10-26 03:11:13 +00001085 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001086 log->Printf ("SBDebugger(%p)::GetPrompt () => \"%s\"",
1087 static_cast<void*>(m_opaque_sp.get()),
Caroline Tice750cd172010-10-26 23:49:36 +00001088 (m_opaque_sp ? m_opaque_sp->GetPrompt() : ""));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001089
Greg Claytona7015092010-09-18 01:14:36 +00001090 if (m_opaque_sp)
1091 return m_opaque_sp->GetPrompt ();
1092 return 0;
1093}
1094
1095void
1096SBDebugger::SetPrompt (const char *prompt)
1097{
1098 if (m_opaque_sp)
1099 m_opaque_sp->SetPrompt (prompt);
1100}
1101
1102
Greg Clayton431ce672011-04-18 23:15:17 +00001103ScriptLanguage
Greg Claytona7015092010-09-18 01:14:36 +00001104SBDebugger::GetScriptLanguage() const
1105{
1106 if (m_opaque_sp)
1107 return m_opaque_sp->GetScriptLanguage ();
1108 return eScriptLanguageNone;
1109}
1110
1111void
Greg Clayton431ce672011-04-18 23:15:17 +00001112SBDebugger::SetScriptLanguage (ScriptLanguage script_lang)
Greg Claytona7015092010-09-18 01:14:36 +00001113{
1114 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +00001115 {
Greg Claytona7015092010-09-18 01:14:36 +00001116 m_opaque_sp->SetScriptLanguage (script_lang);
Greg Claytonaf67cec2010-12-20 20:49:23 +00001117 }
Greg Claytona7015092010-09-18 01:14:36 +00001118}
1119
Jim Inghame40e4212010-08-30 19:44:40 +00001120bool
1121SBDebugger::SetUseExternalEditor (bool value)
1122{
1123 if (m_opaque_sp)
1124 return m_opaque_sp->SetUseExternalEditor (value);
Greg Claytonaf67cec2010-12-20 20:49:23 +00001125 return false;
Jim Inghame40e4212010-08-30 19:44:40 +00001126}
1127
1128bool
Caroline Ticedaccaa92010-09-20 20:44:43 +00001129SBDebugger::GetUseExternalEditor ()
Jim Inghame40e4212010-08-30 19:44:40 +00001130{
1131 if (m_opaque_sp)
Caroline Ticedaccaa92010-09-20 20:44:43 +00001132 return m_opaque_sp->GetUseExternalEditor ();
Greg Claytonaf67cec2010-12-20 20:49:23 +00001133 return false;
Jim Inghame40e4212010-08-30 19:44:40 +00001134}
1135
Caroline Ticedde9cff2010-09-20 05:20:02 +00001136bool
Michael Sartainc3ce7f272013-05-23 20:47:45 +00001137SBDebugger::SetUseColor (bool value)
1138{
1139 if (m_opaque_sp)
1140 return m_opaque_sp->SetUseColor (value);
1141 return false;
1142}
1143
1144bool
1145SBDebugger::GetUseColor () const
1146{
1147 if (m_opaque_sp)
1148 return m_opaque_sp->GetUseColor ();
1149 return false;
1150}
1151
1152bool
Caroline Ticedde9cff2010-09-20 05:20:02 +00001153SBDebugger::GetDescription (SBStream &description)
1154{
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001155 Stream &strm = description.ref();
1156
Caroline Ticedde9cff2010-09-20 05:20:02 +00001157 if (m_opaque_sp)
1158 {
1159 const char *name = m_opaque_sp->GetInstanceName().AsCString();
Greg Clayton431ce672011-04-18 23:15:17 +00001160 user_id_t id = m_opaque_sp->GetID();
Daniel Malead01b2952012-11-29 21:49:15 +00001161 strm.Printf ("Debugger (instance: \"%s\", id: %" PRIu64 ")", name, id);
Caroline Ticedde9cff2010-09-20 05:20:02 +00001162 }
1163 else
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001164 strm.PutCString ("No value");
Caroline Ticedde9cff2010-09-20 05:20:02 +00001165
1166 return true;
1167}
Caroline Ticeefed6132010-11-19 20:47:54 +00001168
Greg Clayton431ce672011-04-18 23:15:17 +00001169user_id_t
Caroline Ticeefed6132010-11-19 20:47:54 +00001170SBDebugger::GetID()
1171{
1172 if (m_opaque_sp)
1173 return m_opaque_sp->GetID();
1174 return LLDB_INVALID_UID;
1175}
Greg Clayton2289fa42011-04-30 01:09:13 +00001176
1177
1178SBError
1179SBDebugger::SetCurrentPlatform (const char *platform_name)
1180{
1181 SBError sb_error;
1182 if (m_opaque_sp)
1183 {
1184 PlatformSP platform_sp (Platform::Create (platform_name, sb_error.ref()));
1185
1186 if (platform_sp)
1187 {
1188 bool make_selected = true;
1189 m_opaque_sp->GetPlatformList().Append (platform_sp, make_selected);
1190 }
1191 }
1192 return sb_error;
1193}
1194
Greg Claytonfc3f0272011-05-29 04:06:55 +00001195bool
Greg Claytonf3dd93c2011-06-17 03:31:01 +00001196SBDebugger::SetCurrentPlatformSDKRoot (const char *sysroot)
1197{
1198 if (m_opaque_sp)
1199 {
1200 PlatformSP platform_sp (m_opaque_sp->GetPlatformList().GetSelectedPlatform());
1201
1202 if (platform_sp)
1203 {
1204 platform_sp->SetSDKRootDirectory (ConstString (sysroot));
1205 return true;
1206 }
1207 }
1208 return false;
1209}
1210
1211bool
Greg Claytonfc3f0272011-05-29 04:06:55 +00001212SBDebugger::GetCloseInputOnEOF () const
1213{
1214 if (m_opaque_sp)
1215 return m_opaque_sp->GetCloseInputOnEOF ();
1216 return false;
1217}
1218
1219void
1220SBDebugger::SetCloseInputOnEOF (bool b)
1221{
1222 if (m_opaque_sp)
1223 m_opaque_sp->SetCloseInputOnEOF (b);
1224}
Enrico Granata061858c2012-02-15 02:34:21 +00001225
1226SBTypeCategory
1227SBDebugger::GetCategory (const char* category_name)
1228{
1229 if (!category_name || *category_name == 0)
1230 return SBTypeCategory();
1231
1232 TypeCategoryImplSP category_sp;
1233
1234 if (DataVisualization::Categories::GetCategory(ConstString(category_name), category_sp, false))
1235 return SBTypeCategory(category_sp);
1236 else
1237 return SBTypeCategory();
1238}
1239
1240SBTypeCategory
1241SBDebugger::CreateCategory (const char* category_name)
1242{
1243 if (!category_name || *category_name == 0)
1244 return SBTypeCategory();
1245
1246 TypeCategoryImplSP category_sp;
1247
1248 if (DataVisualization::Categories::GetCategory(ConstString(category_name), category_sp, true))
1249 return SBTypeCategory(category_sp);
1250 else
1251 return SBTypeCategory();
1252}
1253
1254bool
1255SBDebugger::DeleteCategory (const char* category_name)
1256{
1257 if (!category_name || *category_name == 0)
1258 return false;
1259
1260 return DataVisualization::Categories::Delete(ConstString(category_name));
1261}
1262
1263uint32_t
1264SBDebugger::GetNumCategories()
1265{
1266 return DataVisualization::Categories::GetCount();
1267}
1268
1269SBTypeCategory
1270SBDebugger::GetCategoryAtIndex (uint32_t index)
1271{
1272 return SBTypeCategory(DataVisualization::Categories::GetCategoryAtIndex(index));
1273}
1274
1275SBTypeCategory
1276SBDebugger::GetDefaultCategory()
1277{
1278 return GetCategory("default");
1279}
1280
1281SBTypeFormat
1282SBDebugger::GetFormatForType (SBTypeNameSpecifier type_name)
1283{
1284 SBTypeCategory default_category_sb = GetDefaultCategory();
1285 if (default_category_sb.GetEnabled())
1286 return default_category_sb.GetFormatForType(type_name);
1287 return SBTypeFormat();
1288}
1289
Jason Molendacf7e2dc2012-02-21 05:33:55 +00001290#ifndef LLDB_DISABLE_PYTHON
Enrico Granata061858c2012-02-15 02:34:21 +00001291SBTypeSummary
1292SBDebugger::GetSummaryForType (SBTypeNameSpecifier type_name)
1293{
Enrico Granataa777dc22012-05-08 21:49:57 +00001294 if (type_name.IsValid() == false)
1295 return SBTypeSummary();
1296 return SBTypeSummary(DataVisualization::GetSummaryForType(type_name.GetSP()));
Enrico Granata061858c2012-02-15 02:34:21 +00001297}
Jason Molendacf7e2dc2012-02-21 05:33:55 +00001298#endif // LLDB_DISABLE_PYTHON
Enrico Granata061858c2012-02-15 02:34:21 +00001299
1300SBTypeFilter
1301SBDebugger::GetFilterForType (SBTypeNameSpecifier type_name)
1302{
Enrico Granataa777dc22012-05-08 21:49:57 +00001303 if (type_name.IsValid() == false)
1304 return SBTypeFilter();
1305 return SBTypeFilter(DataVisualization::GetFilterForType(type_name.GetSP()));
Enrico Granata061858c2012-02-15 02:34:21 +00001306}
1307
Jason Molendacf7e2dc2012-02-21 05:33:55 +00001308#ifndef LLDB_DISABLE_PYTHON
Enrico Granata061858c2012-02-15 02:34:21 +00001309SBTypeSynthetic
1310SBDebugger::GetSyntheticForType (SBTypeNameSpecifier type_name)
1311{
Enrico Granataa777dc22012-05-08 21:49:57 +00001312 if (type_name.IsValid() == false)
1313 return SBTypeSynthetic();
1314 return SBTypeSynthetic(DataVisualization::GetSyntheticForType(type_name.GetSP()));
Enrico Granata061858c2012-02-15 02:34:21 +00001315}
Jason Molendacf7e2dc2012-02-21 05:33:55 +00001316#endif // LLDB_DISABLE_PYTHON
Enrico Granata061858c2012-02-15 02:34:21 +00001317
Jim Ingham228063c2012-02-21 02:23:08 +00001318bool
1319SBDebugger::EnableLog (const char *channel, const char **categories)
1320{
1321 if (m_opaque_sp)
1322 {
1323 uint32_t log_options = LLDB_LOG_OPTION_PREPEND_TIMESTAMP | LLDB_LOG_OPTION_PREPEND_THREAD_NAME;
1324 StreamString errors;
1325 return m_opaque_sp->EnableLog (channel, categories, NULL, log_options, errors);
1326
1327 }
1328 else
1329 return false;
1330}
Jim Ingham4f02b222012-02-22 22:49:20 +00001331
1332void
1333SBDebugger::SetLoggingCallback (lldb::LogOutputCallback log_callback, void *baton)
1334{
1335 if (m_opaque_sp)
1336 {
1337 return m_opaque_sp->SetLoggingCallback (log_callback, baton);
1338 }
1339}
1340
1341