blob: 49eeab2068692327147a2050bf45764c15c15d55 [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
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +000010// C Includes
11// C++ Includes
12// Other libraries and framework includes
13// Project includes
Eli Friedmanca93cc12010-06-09 07:37:52 +000014#include "lldb/API/SBDebugger.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000015
Greg Claytone0d378b2011-03-24 21:19:54 +000016#include "lldb/lldb-private.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000017
Zachary Turnere6e2bb32015-03-31 21:03:22 +000018#include "lldb/API/SystemInitializerFull.h"
Eli Friedmanca93cc12010-06-09 07:37:52 +000019#include "lldb/API/SBListener.h"
20#include "lldb/API/SBBroadcaster.h"
21#include "lldb/API/SBCommandInterpreter.h"
22#include "lldb/API/SBCommandReturnObject.h"
Greg Clayton2289fa42011-04-30 01:09:13 +000023#include "lldb/API/SBError.h"
Eli Friedmanca93cc12010-06-09 07:37:52 +000024#include "lldb/API/SBEvent.h"
25#include "lldb/API/SBFrame.h"
Caroline Tice3df9a8d2010-09-04 00:03:46 +000026#include "lldb/API/SBProcess.h"
27#include "lldb/API/SBSourceManager.h"
Caroline Ticedde9cff2010-09-20 05:20:02 +000028#include "lldb/API/SBStream.h"
Caroline Tice3df9a8d2010-09-04 00:03:46 +000029#include "lldb/API/SBStringList.h"
30#include "lldb/API/SBTarget.h"
31#include "lldb/API/SBThread.h"
Enrico Granata061858c2012-02-15 02:34:21 +000032#include "lldb/API/SBTypeCategory.h"
33#include "lldb/API/SBTypeFormat.h"
34#include "lldb/API/SBTypeFilter.h"
35#include "lldb/API/SBTypeNameSpecifier.h"
36#include "lldb/API/SBTypeSummary.h"
37#include "lldb/API/SBTypeSynthetic.h"
38
Greg Clayton6eee5aa2010-10-11 01:05:37 +000039#include "lldb/Core/Debugger.h"
40#include "lldb/Core/State.h"
Greg Clayton44d93782014-01-27 23:43:24 +000041#include "lldb/Core/StreamFile.h"
Enrico Granata5548cb52013-01-28 23:47:25 +000042#include "lldb/DataFormatters/DataVisualization.h"
Zachary Turnere6e2bb32015-03-31 21:03:22 +000043#include "lldb/Initialization/SystemLifetimeManager.h"
Greg Clayton6eee5aa2010-10-11 01:05:37 +000044#include "lldb/Interpreter/Args.h"
45#include "lldb/Interpreter/CommandInterpreter.h"
Greg Claytoncac9c5f2011-09-24 00:52:29 +000046#include "lldb/Interpreter/OptionGroupPlatform.h"
Greg Clayton6eee5aa2010-10-11 01:05:37 +000047#include "lldb/Target/Process.h"
48#include "lldb/Target/TargetList.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000049
Enrico Granatad717cc92015-10-20 04:50:09 +000050#include "llvm/ADT/STLExtras.h"
Zachary Turnere6e2bb32015-03-31 21:03:22 +000051#include "llvm/Support/ManagedStatic.h"
Zachary Turner58a559c2014-08-27 20:15:09 +000052#include "llvm/Support/DynamicLibrary.h"
53
Chris Lattner30fdc8d2010-06-08 16:52:24 +000054using namespace lldb;
55using namespace lldb_private;
56
Zachary Turner58a559c2014-08-27 20:15:09 +000057static llvm::sys::DynamicLibrary
Greg Clayton5fb8f792013-12-02 19:35:49 +000058LoadPlugin (const lldb::DebuggerSP &debugger_sp, const FileSpec& spec, Error& error)
59{
Zachary Turner58a559c2014-08-27 20:15:09 +000060 llvm::sys::DynamicLibrary dynlib = llvm::sys::DynamicLibrary::getPermanentLibrary(spec.GetPath().c_str());
61 if (dynlib.isValid())
Greg Clayton5fb8f792013-12-02 19:35:49 +000062 {
63 typedef bool (*LLDBCommandPluginInit) (lldb::SBDebugger& debugger);
64
65 lldb::SBDebugger debugger_sb(debugger_sp);
66 // This calls the bool lldb::PluginInitialize(lldb::SBDebugger debugger) function.
67 // TODO: mangle this differently for your system - on OSX, the first underscore needs to be removed and the second one stays
Zachary Turner58a559c2014-08-27 20:15:09 +000068 LLDBCommandPluginInit init_func = (LLDBCommandPluginInit)dynlib.getAddressOfSymbol("_ZN4lldb16PluginInitializeENS_10SBDebuggerE");
Greg Clayton5fb8f792013-12-02 19:35:49 +000069 if (init_func)
70 {
71 if (init_func(debugger_sb))
Zachary Turner58a559c2014-08-27 20:15:09 +000072 return dynlib;
Greg Clayton5fb8f792013-12-02 19:35:49 +000073 else
74 error.SetErrorString("plug-in refused to load (lldb::PluginInitialize(lldb::SBDebugger) returned false)");
75 }
76 else
77 {
78 error.SetErrorString("plug-in is missing the required initialization: lldb::PluginInitialize(lldb::SBDebugger)");
79 }
80 }
81 else
82 {
83 if (spec.Exists())
84 error.SetErrorString("this file does not represent a loadable dylib");
85 else
86 error.SetErrorString("no such file");
87 }
Zachary Turner58a559c2014-08-27 20:15:09 +000088 return llvm::sys::DynamicLibrary();
Greg Clayton5fb8f792013-12-02 19:35:49 +000089}
90
Zachary Turnere6e2bb32015-03-31 21:03:22 +000091static llvm::ManagedStatic<SystemLifetimeManager> g_debugger_lifetime;
92
Zachary Turnere6e2bb32015-03-31 21:03:22 +000093SBError
94SBInputReader::Initialize(lldb::SBDebugger &sb_debugger,
95 unsigned long (*)(void *, lldb::SBInputReader *, lldb::InputReaderAction, char const *,
96 unsigned long),
97 void *, lldb::InputReaderGranularity, char const *, char const *, bool)
98{
99 return SBError();
100}
101
102void
103SBInputReader::SetIsDone(bool)
104{
105}
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +0000106
Zachary Turnere6e2bb32015-03-31 21:03:22 +0000107bool
108SBInputReader::IsActive() const
109{
110 return false;
111}
112
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +0000113SBDebugger::SBDebugger() = default;
114
115SBDebugger::SBDebugger(const lldb::DebuggerSP &debugger_sp) :
116 m_opaque_sp(debugger_sp)
117{
118}
119
120SBDebugger::SBDebugger(const SBDebugger &rhs) :
121 m_opaque_sp (rhs.m_opaque_sp)
122{
123}
124
125SBDebugger::~SBDebugger() = default;
126
127SBDebugger &
128SBDebugger::operator = (const SBDebugger &rhs)
129{
130 if (this != &rhs)
131 {
132 m_opaque_sp = rhs.m_opaque_sp;
133 }
134 return *this;
135}
136
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000137void
138SBDebugger::Initialize ()
139{
Greg Clayton5160ce52013-03-27 23:08:40 +0000140 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000141
142 if (log)
143 log->Printf ("SBDebugger::Initialize ()");
144
Zachary Turnere6e2bb32015-03-31 21:03:22 +0000145 g_debugger_lifetime->Initialize(llvm::make_unique<SystemInitializerFull>(), LoadPlugin);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000146}
147
148void
149SBDebugger::Terminate ()
150{
Zachary Turnere6e2bb32015-03-31 21:03:22 +0000151 g_debugger_lifetime->Terminate();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000152}
153
Greg Clayton48e42542010-07-30 20:12:55 +0000154void
155SBDebugger::Clear ()
156{
Greg Clayton5160ce52013-03-27 23:08:40 +0000157 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000158
159 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000160 log->Printf ("SBDebugger(%p)::Clear ()",
161 static_cast<void*>(m_opaque_sp.get()));
162
Caroline Tice3d6086f2010-12-20 18:35:50 +0000163 if (m_opaque_sp)
Greg Clayton44d93782014-01-27 23:43:24 +0000164 m_opaque_sp->ClearIOHandlers ();
Caroline Ticeceb6b132010-10-26 03:11:13 +0000165
Greg Clayton48e42542010-07-30 20:12:55 +0000166 m_opaque_sp.reset();
167}
168
Greg Clayton66111032010-06-23 01:19:29 +0000169SBDebugger
170SBDebugger::Create()
171{
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +0000172 return SBDebugger::Create(false, nullptr, nullptr);
Jim Ingham06942692011-08-13 00:22:20 +0000173}
174
175SBDebugger
176SBDebugger::Create(bool source_init_files)
177{
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +0000178 return SBDebugger::Create (source_init_files, nullptr, nullptr);
Jim Ingham228063c2012-02-21 02:23:08 +0000179}
180
181SBDebugger
182SBDebugger::Create(bool source_init_files, lldb::LogOutputCallback callback, void *baton)
183
184{
Greg Clayton5160ce52013-03-27 23:08:40 +0000185 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000186
Greg Clayton66111032010-06-23 01:19:29 +0000187 SBDebugger debugger;
Greg Claytoncb172b12014-05-19 20:42:14 +0000188
189 // Currently we have issues if this function is called simultaneously on two different
190 // threads. The issues mainly revolve around the fact that the lldb_private::FormatManager
191 // uses global collections and having two threads parsing the .lldbinit files can cause
192 // mayhem. So to get around this for now we need to use a mutex to prevent bad things
193 // from happening.
194 static Mutex g_mutex(Mutex::eMutexTypeRecursive);
195 Mutex::Locker locker(g_mutex);
196
Jim Ingham228063c2012-02-21 02:23:08 +0000197 debugger.reset(Debugger::CreateInstance(callback, baton));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000198
199 if (log)
200 {
201 SBStream sstr;
202 debugger.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000203 log->Printf ("SBDebugger::Create () => SBDebugger(%p): %s",
204 static_cast<void*>(debugger.m_opaque_sp.get()),
205 sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000206 }
207
Jim Ingham06942692011-08-13 00:22:20 +0000208 SBCommandInterpreter interp = debugger.GetCommandInterpreter();
209 if (source_init_files)
210 {
211 interp.get()->SkipLLDBInitFiles(false);
212 interp.get()->SkipAppInitFiles (false);
213 SBCommandReturnObject result;
214 interp.SourceInitFileInHomeDirectory(result);
215 }
216 else
217 {
218 interp.get()->SkipLLDBInitFiles(true);
219 interp.get()->SkipAppInitFiles (true);
220 }
Greg Clayton66111032010-06-23 01:19:29 +0000221 return debugger;
222}
223
Caroline Ticee02657b2011-01-22 01:02:07 +0000224void
225SBDebugger::Destroy (SBDebugger &debugger)
226{
Greg Clayton5160ce52013-03-27 23:08:40 +0000227 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000228
Caroline Ticee02657b2011-01-22 01:02:07 +0000229 if (log)
230 {
231 SBStream sstr;
232 debugger.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000233 log->Printf ("SBDebugger::Destroy () => SBDebugger(%p): %s",
234 static_cast<void*>(debugger.m_opaque_sp.get()),
235 sstr.GetData());
Caroline Ticee02657b2011-01-22 01:02:07 +0000236 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000237
Caroline Ticee02657b2011-01-22 01:02:07 +0000238 Debugger::Destroy (debugger.m_opaque_sp);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000239
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +0000240 if (debugger.m_opaque_sp.get() != nullptr)
Caroline Ticee02657b2011-01-22 01:02:07 +0000241 debugger.m_opaque_sp.reset();
242}
243
Greg Claytonf9322412011-12-15 04:38:41 +0000244void
245SBDebugger::MemoryPressureDetected ()
246{
Greg Clayton0cd70862012-04-09 20:22:01 +0000247 // Since this function can be call asynchronously, we allow it to be
248 // non-mandatory. We have seen deadlocks with this function when called
249 // so we need to safeguard against this until we can determine what is
250 // causing the deadlocks.
Greg Clayton5160ce52013-03-27 23:08:40 +0000251 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Inghamaebdf1b2012-06-07 19:08:07 +0000252
Greg Clayton0cd70862012-04-09 20:22:01 +0000253 const bool mandatory = false;
Jim Inghamaebdf1b2012-06-07 19:08:07 +0000254 if (log)
255 {
256 log->Printf ("SBDebugger::MemoryPressureDetected (), mandatory = %d", mandatory);
257 }
258
Greg Clayton0cd70862012-04-09 20:22:01 +0000259 ModuleList::RemoveOrphanSharedModules(mandatory);
Greg Claytonf9322412011-12-15 04:38:41 +0000260}
261
Greg Clayton66111032010-06-23 01:19:29 +0000262bool
263SBDebugger::IsValid() const
264{
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +0000265 return m_opaque_sp.get() != nullptr;
Greg Clayton66111032010-06-23 01:19:29 +0000266}
267
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000268void
269SBDebugger::SetAsync (bool b)
270{
Greg Clayton66111032010-06-23 01:19:29 +0000271 if (m_opaque_sp)
272 m_opaque_sp->SetAsyncExecution(b);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000273}
274
Jim Inghame64f0dc2011-09-13 23:25:31 +0000275bool
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +0000276SBDebugger::GetAsync()
Jim Inghame64f0dc2011-09-13 23:25:31 +0000277{
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +0000278 return (m_opaque_sp ? m_opaque_sp->GetAsyncExecution() : false);
Jim Inghame64f0dc2011-09-13 23:25:31 +0000279}
280
Greg Clayton6eee5aa2010-10-11 01:05:37 +0000281void
282SBDebugger::SkipLLDBInitFiles (bool b)
283{
284 if (m_opaque_sp)
285 m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles (b);
286}
287
Jim Ingham16e0c682011-08-12 23:34:31 +0000288void
289SBDebugger::SkipAppInitFiles (bool b)
290{
291 if (m_opaque_sp)
292 m_opaque_sp->GetCommandInterpreter().SkipAppInitFiles (b);
293}
294
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000295// Shouldn't really be settable after initialization as this could cause lots of problems; don't want users
296// trying to switch modes in the middle of a debugging session.
297void
298SBDebugger::SetInputFileHandle (FILE *fh, bool transfer_ownership)
299{
Greg Clayton5160ce52013-03-27 23:08:40 +0000300 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000301
302 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000303 log->Printf ("SBDebugger(%p)::SetInputFileHandle (fh=%p, transfer_ownership=%i)",
304 static_cast<void*>(m_opaque_sp.get()),
305 static_cast<void*>(fh), transfer_ownership);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000306
Greg Clayton66111032010-06-23 01:19:29 +0000307 if (m_opaque_sp)
308 m_opaque_sp->SetInputFileHandle (fh, transfer_ownership);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000309}
310
311void
312SBDebugger::SetOutputFileHandle (FILE *fh, bool transfer_ownership)
313{
Greg Clayton5160ce52013-03-27 23:08:40 +0000314 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000315
316
317 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000318 log->Printf ("SBDebugger(%p)::SetOutputFileHandle (fh=%p, transfer_ownership=%i)",
319 static_cast<void*>(m_opaque_sp.get()),
320 static_cast<void*>(fh), transfer_ownership);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000321
Greg Clayton66111032010-06-23 01:19:29 +0000322 if (m_opaque_sp)
323 m_opaque_sp->SetOutputFileHandle (fh, transfer_ownership);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000324}
325
326void
327SBDebugger::SetErrorFileHandle (FILE *fh, bool transfer_ownership)
328{
Greg Clayton5160ce52013-03-27 23:08:40 +0000329 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000330
331
332 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000333 log->Printf ("SBDebugger(%p)::SetErrorFileHandle (fh=%p, transfer_ownership=%i)",
334 static_cast<void*>(m_opaque_sp.get()),
335 static_cast<void*>(fh), transfer_ownership);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000336
Greg Clayton66111032010-06-23 01:19:29 +0000337 if (m_opaque_sp)
338 m_opaque_sp->SetErrorFileHandle (fh, transfer_ownership);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000339}
340
341FILE *
342SBDebugger::GetInputFileHandle ()
343{
Greg Clayton66111032010-06-23 01:19:29 +0000344 if (m_opaque_sp)
Greg Clayton44d93782014-01-27 23:43:24 +0000345 {
346 StreamFileSP stream_file_sp (m_opaque_sp->GetInputFile());
347 if (stream_file_sp)
348 return stream_file_sp->GetFile().GetStream();
349 }
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +0000350 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000351}
352
353FILE *
354SBDebugger::GetOutputFileHandle ()
355{
Greg Clayton66111032010-06-23 01:19:29 +0000356 if (m_opaque_sp)
Greg Clayton44d93782014-01-27 23:43:24 +0000357 {
358 StreamFileSP stream_file_sp (m_opaque_sp->GetOutputFile());
359 if (stream_file_sp)
360 return stream_file_sp->GetFile().GetStream();
361 }
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +0000362 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000363}
364
365FILE *
366SBDebugger::GetErrorFileHandle ()
367{
Greg Clayton66111032010-06-23 01:19:29 +0000368 if (m_opaque_sp)
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +0000369 {
370 StreamFileSP stream_file_sp(m_opaque_sp->GetErrorFile());
371 if (stream_file_sp)
372 return stream_file_sp->GetFile().GetStream();
373 }
374 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000375}
376
Jim Inghamc5917d92012-11-30 20:23:19 +0000377void
378SBDebugger::SaveInputTerminalState()
379{
380 if (m_opaque_sp)
381 m_opaque_sp->SaveInputTerminalState();
382}
383
384void
385SBDebugger::RestoreInputTerminalState()
386{
387 if (m_opaque_sp)
388 m_opaque_sp->RestoreInputTerminalState();
389
390}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000391SBCommandInterpreter
392SBDebugger::GetCommandInterpreter ()
393{
Greg Clayton5160ce52013-03-27 23:08:40 +0000394 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000395
Greg Clayton66111032010-06-23 01:19:29 +0000396 SBCommandInterpreter sb_interpreter;
397 if (m_opaque_sp)
398 sb_interpreter.reset (&m_opaque_sp->GetCommandInterpreter());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000399
Caroline Tice750cd172010-10-26 23:49:36 +0000400 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000401 log->Printf ("SBDebugger(%p)::GetCommandInterpreter () => SBCommandInterpreter(%p)",
402 static_cast<void*>(m_opaque_sp.get()),
403 static_cast<void*>(sb_interpreter.get()));
Caroline Tice750cd172010-10-26 23:49:36 +0000404
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000405 return sb_interpreter;
406}
407
408void
409SBDebugger::HandleCommand (const char *command)
410{
Greg Clayton66111032010-06-23 01:19:29 +0000411 if (m_opaque_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000412 {
Greg Claytonaf67cec2010-12-20 20:49:23 +0000413 TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
414 Mutex::Locker api_locker;
415 if (target_sp)
Jim Ingham10ebffa2012-05-04 23:02:50 +0000416 api_locker.Lock(target_sp->GetAPIMutex());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000417
Greg Clayton66111032010-06-23 01:19:29 +0000418 SBCommandInterpreter sb_interpreter(GetCommandInterpreter ());
419 SBCommandReturnObject result;
420
421 sb_interpreter.HandleCommand (command, result, false);
422
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +0000423 if (GetErrorFileHandle() != nullptr)
Greg Clayton66111032010-06-23 01:19:29 +0000424 result.PutError (GetErrorFileHandle());
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +0000425 if (GetOutputFileHandle() != nullptr)
Greg Clayton66111032010-06-23 01:19:29 +0000426 result.PutOutput (GetOutputFileHandle());
427
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +0000428 if (!m_opaque_sp->GetAsyncExecution())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000429 {
Greg Clayton66111032010-06-23 01:19:29 +0000430 SBProcess process(GetCommandInterpreter().GetProcess ());
Greg Claytonb9556ac2012-01-30 07:41:31 +0000431 ProcessSP process_sp (process.GetSP());
432 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000433 {
Greg Clayton66111032010-06-23 01:19:29 +0000434 EventSP event_sp;
435 Listener &lldb_listener = m_opaque_sp->GetListener();
Greg Claytonb9556ac2012-01-30 07:41:31 +0000436 while (lldb_listener.GetNextEventForBroadcaster (process_sp.get(), event_sp))
Greg Clayton66111032010-06-23 01:19:29 +0000437 {
438 SBEvent event(event_sp);
439 HandleProcessEvent (process, event, GetOutputFileHandle(), GetErrorFileHandle());
440 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000441 }
442 }
443 }
444}
445
446SBListener
447SBDebugger::GetListener ()
448{
Greg Clayton5160ce52013-03-27 23:08:40 +0000449 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000450
Greg Clayton66111032010-06-23 01:19:29 +0000451 SBListener sb_listener;
452 if (m_opaque_sp)
453 sb_listener.reset(&m_opaque_sp->GetListener(), false);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000454
Caroline Tice750cd172010-10-26 23:49:36 +0000455 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000456 log->Printf ("SBDebugger(%p)::GetListener () => SBListener(%p)",
457 static_cast<void*>(m_opaque_sp.get()),
458 static_cast<void*>(sb_listener.get()));
Caroline Tice750cd172010-10-26 23:49:36 +0000459
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000460 return sb_listener;
461}
462
463void
464SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, FILE *out, FILE *err)
465{
Greg Claytonaf67cec2010-12-20 20:49:23 +0000466 if (!process.IsValid())
467 return;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000468
Greg Claytonb9556ac2012-01-30 07:41:31 +0000469 TargetSP target_sp (process.GetTarget().GetSP());
470 if (!target_sp)
471 return;
472
Greg Claytonaf67cec2010-12-20 20:49:23 +0000473 const uint32_t event_type = event.GetType();
474 char stdio_buffer[1024];
475 size_t len;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000476
Greg Claytonb9556ac2012-01-30 07:41:31 +0000477 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000478
479 if (event_type & (Process::eBroadcastBitSTDOUT | Process::eBroadcastBitStateChanged))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000480 {
Greg Claytonaf67cec2010-12-20 20:49:23 +0000481 // Drain stdout when we stop just in case we have any bytes
482 while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +0000483 if (out != nullptr)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000484 ::fwrite (stdio_buffer, 1, len, out);
485 }
486
487 if (event_type & (Process::eBroadcastBitSTDERR | Process::eBroadcastBitStateChanged))
488 {
489 // Drain stderr when we stop just in case we have any bytes
490 while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +0000491 if (err != nullptr)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000492 ::fwrite (stdio_buffer, 1, len, err);
493 }
494
495 if (event_type & Process::eBroadcastBitStateChanged)
496 {
497 StateType event_state = SBProcess::GetStateFromEvent (event);
498
499 if (event_state == eStateInvalid)
500 return;
501
502 bool is_stopped = StateIsStoppedState (event_state);
503 if (!is_stopped)
504 process.ReportEventState (event, out);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000505 }
506}
507
Jim Inghame37d6052011-09-13 00:29:56 +0000508SBSourceManager
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000509SBDebugger::GetSourceManager ()
510{
Jim Inghame37d6052011-09-13 00:29:56 +0000511 SBSourceManager sb_source_manager (*this);
512 return sb_source_manager;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000513}
514
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000515bool
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
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000537bool
538SBDebugger::SetDefaultArchitecture (const char *arch_name)
539{
540 if (arch_name)
541 {
Greg Clayton70512312012-05-08 01:45:38 +0000542 ArchSpec arch (arch_name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000543 if (arch.IsValid())
544 {
Greg Clayton431ce672011-04-18 23:15:17 +0000545 Target::SetDefaultArchitecture (arch);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000546 return true;
547 }
548 }
549 return false;
550}
551
552ScriptLanguage
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +0000553SBDebugger::GetScriptingLanguage(const char *script_language_name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000554{
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +0000555 return Args::StringToScriptLanguage(script_language_name,
556 eScriptLanguageDefault,
557 nullptr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000558}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000559
560const char *
561SBDebugger::GetVersionString ()
562{
Virgile Bellob2f1fb22013-08-23 12:44:05 +0000563 return lldb_private::GetVersion();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000564}
565
566const char *
Greg Clayton431ce672011-04-18 23:15:17 +0000567SBDebugger::StateAsCString (StateType state)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000568{
Caroline Ticec2bbb492011-04-25 22:05:51 +0000569 return lldb_private::StateAsCString (state);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000570}
571
572bool
Greg Clayton431ce672011-04-18 23:15:17 +0000573SBDebugger::StateIsRunningState (StateType state)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000574{
Greg Clayton5160ce52013-03-27 23:08:40 +0000575 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000576
Caroline Ticec2bbb492011-04-25 22:05:51 +0000577 const bool result = lldb_private::StateIsRunningState (state);
Greg Clayton48381312010-10-30 04:51:46 +0000578 if (log)
579 log->Printf ("SBDebugger::StateIsRunningState (state=%s) => %i",
Greg Clayton431ce672011-04-18 23:15:17 +0000580 StateAsCString (state), result);
Greg Clayton48381312010-10-30 04:51:46 +0000581
582 return result;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000583}
584
585bool
Greg Clayton431ce672011-04-18 23:15:17 +0000586SBDebugger::StateIsStoppedState (StateType state)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000587{
Greg Clayton5160ce52013-03-27 23:08:40 +0000588 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000589
Greg Clayton2637f822011-11-17 01:23:07 +0000590 const bool result = lldb_private::StateIsStoppedState (state, false);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000591 if (log)
Greg Clayton48381312010-10-30 04:51:46 +0000592 log->Printf ("SBDebugger::StateIsStoppedState (state=%s) => %i",
Greg Clayton431ce672011-04-18 23:15:17 +0000593 StateAsCString (state), result);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000594
Greg Clayton48381312010-10-30 04:51:46 +0000595 return result;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000596}
597
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000598lldb::SBTarget
599SBDebugger::CreateTarget (const char *filename,
600 const char *target_triple,
601 const char *platform_name,
602 bool add_dependent_modules,
603 lldb::SBError& sb_error)
604{
605 SBTarget sb_target;
Greg Claytonb9556ac2012-01-30 07:41:31 +0000606 TargetSP target_sp;
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000607 if (m_opaque_sp)
608 {
609 sb_error.Clear();
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000610 OptionGroupPlatform platform_options (false);
611 platform_options.SetPlatformName (platform_name);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000612
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000613 sb_error.ref() = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp,
Greg Claytona0ca6602012-10-18 16:33:33 +0000614 filename,
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000615 target_triple,
616 add_dependent_modules,
617 &platform_options,
618 target_sp);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000619
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000620 if (sb_error.Success())
Greg Claytonb9556ac2012-01-30 07:41:31 +0000621 sb_target.SetSP (target_sp);
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000622 }
623 else
624 {
Jim Ingham9f521f22015-10-30 21:32:03 +0000625 sb_error.SetErrorString("invalid debugger");
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000626 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000627
Greg Clayton5160ce52013-03-27 23:08:40 +0000628 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000629 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000630 log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\", triple=%s, platform_name=%s, add_dependent_modules=%u, error=%s) => SBTarget(%p)",
631 static_cast<void*>(m_opaque_sp.get()), filename,
632 target_triple, platform_name, add_dependent_modules,
633 sb_error.GetCString(), static_cast<void*>(target_sp.get()));
634
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000635 return sb_target;
636}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000637
638SBTarget
639SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename,
640 const char *target_triple)
641{
Greg Claytonb9556ac2012-01-30 07:41:31 +0000642 SBTarget sb_target;
643 TargetSP target_sp;
Greg Clayton66111032010-06-23 01:19:29 +0000644 if (m_opaque_sp)
645 {
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000646 const bool add_dependent_modules = true;
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +0000647 Error error (m_opaque_sp->GetTargetList().CreateTarget(*m_opaque_sp,
648 filename,
649 target_triple,
650 add_dependent_modules,
651 nullptr,
652 target_sp));
Greg Claytonb9556ac2012-01-30 07:41:31 +0000653 sb_target.SetSP (target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000654 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000655
Greg Clayton5160ce52013-03-27 23:08:40 +0000656 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000657 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000658 log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndTargetTriple (filename=\"%s\", triple=%s) => SBTarget(%p)",
659 static_cast<void*>(m_opaque_sp.get()), filename,
660 target_triple, static_cast<void*>(target_sp.get()));
Greg Clayton48381312010-10-30 04:51:46 +0000661
Greg Claytonb9556ac2012-01-30 07:41:31 +0000662 return sb_target;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000663}
664
665SBTarget
Greg Clayton64195a22011-02-23 00:35:02 +0000666SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *arch_cstr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000667{
Greg Clayton5160ce52013-03-27 23:08:40 +0000668 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000669
Greg Claytonb9556ac2012-01-30 07:41:31 +0000670 SBTarget sb_target;
671 TargetSP target_sp;
Greg Clayton66111032010-06-23 01:19:29 +0000672 if (m_opaque_sp)
673 {
Greg Clayton66111032010-06-23 01:19:29 +0000674 Error error;
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000675 const bool add_dependent_modules = true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000676
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +0000677 error = m_opaque_sp->GetTargetList().CreateTarget(*m_opaque_sp,
678 filename,
679 arch_cstr,
680 add_dependent_modules,
681 nullptr,
682 target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000683
684 if (error.Success())
685 {
Jim Ingham2976d002010-08-26 21:32:51 +0000686 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Claytonb9556ac2012-01-30 07:41:31 +0000687 sb_target.SetSP (target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000688 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000689 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000690
691 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000692 log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndArch (filename=\"%s\", arch=%s) => SBTarget(%p)",
693 static_cast<void*>(m_opaque_sp.get()), filename, arch_cstr,
694 static_cast<void*>(target_sp.get()));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000695
Greg Claytonb9556ac2012-01-30 07:41:31 +0000696 return sb_target;
Greg Clayton66111032010-06-23 01:19:29 +0000697}
698
699SBTarget
700SBDebugger::CreateTarget (const char *filename)
701{
Greg Claytonb9556ac2012-01-30 07:41:31 +0000702 SBTarget sb_target;
703 TargetSP target_sp;
Greg Clayton66111032010-06-23 01:19:29 +0000704 if (m_opaque_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000705 {
Greg Clayton66111032010-06-23 01:19:29 +0000706 Error error;
Greg Claytoncac9c5f2011-09-24 00:52:29 +0000707 const bool add_dependent_modules = true;
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +0000708 error = m_opaque_sp->GetTargetList().CreateTarget(*m_opaque_sp,
709 filename,
710 nullptr,
711 add_dependent_modules,
712 nullptr,
713 target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000714
715 if (error.Success())
716 {
Jim Ingham2976d002010-08-26 21:32:51 +0000717 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Claytonb9556ac2012-01-30 07:41:31 +0000718 sb_target.SetSP (target_sp);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000719 }
720 }
Greg Clayton5160ce52013-03-27 23:08:40 +0000721 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000722 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000723 log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)",
724 static_cast<void*>(m_opaque_sp.get()), filename,
725 static_cast<void*>(target_sp.get()));
Greg Claytonb9556ac2012-01-30 07:41:31 +0000726 return sb_target;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000727}
728
Johnny Chen3794ad92011-06-15 21:24:24 +0000729bool
730SBDebugger::DeleteTarget (lldb::SBTarget &target)
731{
732 bool result = false;
Greg Claytonb9556ac2012-01-30 07:41:31 +0000733 if (m_opaque_sp)
Johnny Chen3794ad92011-06-15 21:24:24 +0000734 {
Greg Claytonb9556ac2012-01-30 07:41:31 +0000735 TargetSP target_sp(target.GetSP());
736 if (target_sp)
737 {
738 // No need to lock, the target list is thread safe
739 result = m_opaque_sp->GetTargetList().DeleteTarget (target_sp);
740 target_sp->Destroy();
741 target.Clear();
Greg Clayton0cd70862012-04-09 20:22:01 +0000742 const bool mandatory = true;
743 ModuleList::RemoveOrphanSharedModules(mandatory);
Greg Claytonb9556ac2012-01-30 07:41:31 +0000744 }
Johnny Chen3794ad92011-06-15 21:24:24 +0000745 }
746
Greg Clayton5160ce52013-03-27 23:08:40 +0000747 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Johnny Chen3794ad92011-06-15 21:24:24 +0000748 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000749 log->Printf ("SBDebugger(%p)::DeleteTarget (SBTarget(%p)) => %i",
750 static_cast<void*>(m_opaque_sp.get()),
751 static_cast<void*>(target.m_opaque_sp.get()), result);
Johnny Chen3794ad92011-06-15 21:24:24 +0000752
753 return result;
754}
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +0000755
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000756SBTarget
757SBDebugger::GetTargetAtIndex (uint32_t idx)
758{
Greg Clayton66111032010-06-23 01:19:29 +0000759 SBTarget sb_target;
760 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000761 {
762 // No need to lock, the target list is thread safe
Greg Claytonb9556ac2012-01-30 07:41:31 +0000763 sb_target.SetSP (m_opaque_sp->GetTargetList().GetTargetAtIndex (idx));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000764 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000765 return sb_target;
766}
767
Jim Ingham8499e1a2012-05-08 23:06:07 +0000768uint32_t
769SBDebugger::GetIndexOfTarget (lldb::SBTarget target)
770{
771
772 lldb::TargetSP target_sp = target.GetSP();
773 if (!target_sp)
774 return UINT32_MAX;
775
776 if (!m_opaque_sp)
777 return UINT32_MAX;
778
779 return m_opaque_sp->GetTargetList().GetIndexOfTarget (target.GetSP());
780}
781
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000782SBTarget
Virgile Bello997f6f72013-09-05 16:53:14 +0000783SBDebugger::FindTargetWithProcessID (lldb::pid_t pid)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000784{
Greg Clayton66111032010-06-23 01:19:29 +0000785 SBTarget sb_target;
786 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000787 {
788 // No need to lock, the target list is thread safe
Greg Claytonb9556ac2012-01-30 07:41:31 +0000789 sb_target.SetSP (m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000790 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000791 return sb_target;
792}
793
794SBTarget
795SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name)
796{
Greg Clayton66111032010-06-23 01:19:29 +0000797 SBTarget sb_target;
798 if (m_opaque_sp && filename && filename[0])
799 {
Greg Claytonaf67cec2010-12-20 20:49:23 +0000800 // No need to lock, the target list is thread safe
Greg Claytoneb0103f2011-04-07 22:46:35 +0000801 ArchSpec arch (arch_name, m_opaque_sp->GetPlatformList().GetSelectedPlatform().get());
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +0000802 TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture(FileSpec(filename, false), arch_name ? &arch : nullptr));
Greg Claytonb9556ac2012-01-30 07:41:31 +0000803 sb_target.SetSP (target_sp);
Greg Clayton66111032010-06-23 01:19:29 +0000804 }
805 return sb_target;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000806}
807
808SBTarget
Greg Clayton431ce672011-04-18 23:15:17 +0000809SBDebugger::FindTargetWithLLDBProcess (const ProcessSP &process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000810{
Greg Clayton66111032010-06-23 01:19:29 +0000811 SBTarget sb_target;
812 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000813 {
814 // No need to lock, the target list is thread safe
Greg Claytonb9556ac2012-01-30 07:41:31 +0000815 sb_target.SetSP (m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get()));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000816 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000817 return sb_target;
818}
819
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000820uint32_t
821SBDebugger::GetNumTargets ()
822{
Greg Clayton66111032010-06-23 01:19:29 +0000823 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000824 {
825 // No need to lock, the target list is thread safe
Greg Clayton66111032010-06-23 01:19:29 +0000826 return m_opaque_sp->GetTargetList().GetNumTargets ();
Greg Claytonaf67cec2010-12-20 20:49:23 +0000827 }
Greg Clayton66111032010-06-23 01:19:29 +0000828 return 0;
829}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000830
831SBTarget
Jim Ingham2976d002010-08-26 21:32:51 +0000832SBDebugger::GetSelectedTarget ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000833{
Greg Clayton5160ce52013-03-27 23:08:40 +0000834 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000835
Greg Clayton66111032010-06-23 01:19:29 +0000836 SBTarget sb_target;
Greg Claytonb9556ac2012-01-30 07:41:31 +0000837 TargetSP target_sp;
Greg Clayton66111032010-06-23 01:19:29 +0000838 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000839 {
840 // No need to lock, the target list is thread safe
Greg Claytonb9556ac2012-01-30 07:41:31 +0000841 target_sp = m_opaque_sp->GetTargetList().GetSelectedTarget ();
842 sb_target.SetSP (target_sp);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000843 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000844
845 if (log)
846 {
847 SBStream sstr;
Greg Clayton431ce672011-04-18 23:15:17 +0000848 sb_target.GetDescription (sstr, eDescriptionLevelBrief);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000849 log->Printf ("SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s",
850 static_cast<void*>(m_opaque_sp.get()),
851 static_cast<void*>(target_sp.get()), sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000852 }
853
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000854 return sb_target;
855}
856
857void
Jim Inghame64f0dc2011-09-13 23:25:31 +0000858SBDebugger::SetSelectedTarget (SBTarget &sb_target)
859{
Greg Clayton5160ce52013-03-27 23:08:40 +0000860 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Inghame64f0dc2011-09-13 23:25:31 +0000861
Greg Claytonb9556ac2012-01-30 07:41:31 +0000862 TargetSP target_sp (sb_target.GetSP());
Jim Inghame64f0dc2011-09-13 23:25:31 +0000863 if (m_opaque_sp)
864 {
Greg Claytonb9556ac2012-01-30 07:41:31 +0000865 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Jim Inghame64f0dc2011-09-13 23:25:31 +0000866 }
867 if (log)
868 {
869 SBStream sstr;
870 sb_target.GetDescription (sstr, eDescriptionLevelBrief);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000871 log->Printf ("SBDebugger(%p)::SetSelectedTarget () => SBTarget(%p): %s",
872 static_cast<void*>(m_opaque_sp.get()),
873 static_cast<void*>(target_sp.get()), sstr.GetData());
Jim Inghame64f0dc2011-09-13 23:25:31 +0000874 }
875}
876
Greg Claytonfbb76342013-11-20 21:07:01 +0000877SBPlatform
878SBDebugger::GetSelectedPlatform()
879{
880 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
881
882 SBPlatform sb_platform;
883 DebuggerSP debugger_sp(m_opaque_sp);
884 if (debugger_sp)
885 {
886 sb_platform.SetSP(debugger_sp->GetPlatformList().GetSelectedPlatform());
887 }
888 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000889 log->Printf ("SBDebugger(%p)::GetSelectedPlatform () => SBPlatform(%p): %s",
890 static_cast<void*>(m_opaque_sp.get()),
891 static_cast<void*>(sb_platform.GetSP().get()),
892 sb_platform.GetName());
Greg Claytonfbb76342013-11-20 21:07:01 +0000893 return sb_platform;
894}
895
896void
897SBDebugger::SetSelectedPlatform(SBPlatform &sb_platform)
898{
899 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000900
Greg Claytonfbb76342013-11-20 21:07:01 +0000901 DebuggerSP debugger_sp(m_opaque_sp);
902 if (debugger_sp)
903 {
904 debugger_sp->GetPlatformList().SetSelectedPlatform(sb_platform.GetSP());
905 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000906
Greg Claytonfbb76342013-11-20 21:07:01 +0000907 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000908 log->Printf ("SBDebugger(%p)::SetSelectedPlatform (SBPlatform(%p) %s)",
909 static_cast<void*>(m_opaque_sp.get()),
910 static_cast<void*>(sb_platform.GetSP().get()),
911 sb_platform.GetName());
Greg Claytonfbb76342013-11-20 21:07:01 +0000912}
913
Jim Inghame64f0dc2011-09-13 23:25:31 +0000914void
Enrico Granatac30a73a2012-09-06 22:02:28 +0000915SBDebugger::DispatchInput (void* baton, const void *data, size_t data_len)
Enrico Granata6b09d422012-09-06 21:58:25 +0000916{
917 DispatchInput (data,data_len);
918}
919
920void
Filipe Cabecinhasc3019992012-08-20 16:21:04 +0000921SBDebugger::DispatchInput (const void *data, size_t data_len)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000922{
Greg Clayton44d93782014-01-27 23:43:24 +0000923// Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
924//
925// if (log)
926// log->Printf ("SBDebugger(%p)::DispatchInput (data=\"%.*s\", size_t=%" PRIu64 ")",
927// m_opaque_sp.get(),
928// (int) data_len,
929// (const char *) data,
930// (uint64_t)data_len);
931//
932// if (m_opaque_sp)
933// m_opaque_sp->DispatchInput ((const char *) data, data_len);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000934}
935
936void
Caroline Ticeefed6132010-11-19 20:47:54 +0000937SBDebugger::DispatchInputInterrupt ()
938{
939 if (m_opaque_sp)
940 m_opaque_sp->DispatchInputInterrupt ();
941}
942
943void
944SBDebugger::DispatchInputEndOfFile ()
945{
946 if (m_opaque_sp)
947 m_opaque_sp->DispatchInputEndOfFile ();
948}
949
950void
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000951SBDebugger::PushInputReader (SBInputReader &reader)
952{
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000953}
Greg Clayton66111032010-06-23 01:19:29 +0000954
955void
Greg Clayton44d93782014-01-27 23:43:24 +0000956SBDebugger::RunCommandInterpreter (bool auto_handle_events,
957 bool spawn_thread)
Caroline Tice969ed3d2011-05-02 20:41:46 +0000958{
Caroline Tice969ed3d2011-05-02 20:41:46 +0000959 if (m_opaque_sp)
Jim Ingham26c7bf92014-10-11 00:38:27 +0000960 {
961 CommandInterpreterRunOptions options;
962
963 m_opaque_sp->GetCommandInterpreter().RunCommandInterpreter(auto_handle_events,
964 spawn_thread,
965 options);
966 }
967}
968
969void
970SBDebugger::RunCommandInterpreter (bool auto_handle_events,
971 bool spawn_thread,
972 SBCommandInterpreterRunOptions &options,
973 int &num_errors,
Jim Inghamffc9f1d2014-10-14 01:20:07 +0000974 bool &quit_requested,
975 bool &stopped_for_crash)
Jim Ingham26c7bf92014-10-11 00:38:27 +0000976
977{
978 if (m_opaque_sp)
979 {
980 CommandInterpreter &interp = m_opaque_sp->GetCommandInterpreter();
981 interp.RunCommandInterpreter(auto_handle_events, spawn_thread, options.ref());
982 num_errors = interp.GetNumErrors();
983 quit_requested = interp.GetQuitRequested();
Jim Inghamffc9f1d2014-10-14 01:20:07 +0000984 stopped_for_crash = interp.GetStoppedForCrash();
Jim Ingham26c7bf92014-10-11 00:38:27 +0000985 }
Caroline Tice969ed3d2011-05-02 20:41:46 +0000986}
987
Sean Callanan3e7e9152015-10-20 00:23:46 +0000988SBError
989SBDebugger::RunREPL (lldb::LanguageType language, const char *repl_options)
990{
991 SBError error;
992 if (m_opaque_sp)
993 error.ref() = m_opaque_sp->RunREPL(language, repl_options);
994 else
995 error.SetErrorString ("invalid debugger");
996 return error;
997}
998
Caroline Tice969ed3d2011-05-02 20:41:46 +0000999void
Greg Clayton431ce672011-04-18 23:15:17 +00001000SBDebugger::reset (const DebuggerSP &debugger_sp)
Greg Clayton66111032010-06-23 01:19:29 +00001001{
1002 m_opaque_sp = debugger_sp;
1003}
1004
1005Debugger *
1006SBDebugger::get () const
1007{
1008 return m_opaque_sp.get();
1009}
1010
1011Debugger &
1012SBDebugger::ref () const
1013{
1014 assert (m_opaque_sp.get());
1015 return *m_opaque_sp;
1016}
1017
Greg Clayton9a377662011-10-01 02:59:24 +00001018const lldb::DebuggerSP &
1019SBDebugger::get_sp () const
1020{
1021 return m_opaque_sp;
1022}
Greg Clayton66111032010-06-23 01:19:29 +00001023
Caroline Ticeebc1bb22010-06-30 16:22:25 +00001024SBDebugger
1025SBDebugger::FindDebuggerWithID (int id)
1026{
Greg Claytonaf67cec2010-12-20 20:49:23 +00001027 // No need to lock, the debugger list is thread safe
Caroline Ticeebc1bb22010-06-30 16:22:25 +00001028 SBDebugger sb_debugger;
Greg Clayton431ce672011-04-18 23:15:17 +00001029 DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id);
Caroline Ticeebc1bb22010-06-30 16:22:25 +00001030 if (debugger_sp)
1031 sb_debugger.reset (debugger_sp);
1032 return sb_debugger;
1033}
Jim Inghame40e4212010-08-30 19:44:40 +00001034
Caroline Ticedd759852010-09-09 17:45:09 +00001035const char *
1036SBDebugger::GetInstanceName()
1037{
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +00001038 return (m_opaque_sp ? m_opaque_sp->GetInstanceName().AsCString() : nullptr);
Caroline Ticedd759852010-09-09 17:45:09 +00001039}
1040
Caroline Tice3df9a8d2010-09-04 00:03:46 +00001041SBError
Caroline Ticedd759852010-09-09 17:45:09 +00001042SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name)
Caroline Tice3df9a8d2010-09-04 00:03:46 +00001043{
Greg Clayton6920b522012-08-22 18:39:03 +00001044 SBError sb_error;
1045 DebuggerSP debugger_sp(Debugger::FindDebuggerWithInstanceName (ConstString(debugger_instance_name)));
1046 Error error;
1047 if (debugger_sp)
1048 {
1049 ExecutionContext exe_ctx (debugger_sp->GetCommandInterpreter().GetExecutionContext());
1050 error = debugger_sp->SetPropertyValue (&exe_ctx,
1051 eVarSetOperationAssign,
1052 var_name,
1053 value);
1054 }
1055 else
1056 {
1057 error.SetErrorStringWithFormat ("invalid debugger instance name '%s'", debugger_instance_name);
1058 }
1059 if (error.Fail())
1060 sb_error.SetError(error);
1061 return sb_error;
Caroline Tice3df9a8d2010-09-04 00:03:46 +00001062}
1063
Greg Clayton431ce672011-04-18 23:15:17 +00001064SBStringList
Caroline Ticedd759852010-09-09 17:45:09 +00001065SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name)
Caroline Tice3df9a8d2010-09-04 00:03:46 +00001066{
1067 SBStringList ret_value;
Greg Clayton6920b522012-08-22 18:39:03 +00001068 DebuggerSP debugger_sp(Debugger::FindDebuggerWithInstanceName (ConstString(debugger_instance_name)));
1069 Error error;
1070 if (debugger_sp)
1071 {
1072 ExecutionContext exe_ctx (debugger_sp->GetCommandInterpreter().GetExecutionContext());
1073 lldb::OptionValueSP value_sp (debugger_sp->GetPropertyValue (&exe_ctx,
1074 var_name,
1075 false,
1076 error));
1077 if (value_sp)
1078 {
1079 StreamString value_strm;
1080 value_sp->DumpValue (&exe_ctx, value_strm, OptionValue::eDumpOptionValue);
1081 const std::string &value_str = value_strm.GetString();
1082 if (!value_str.empty())
1083 {
1084 StringList string_list;
Greg Clayton44d93782014-01-27 23:43:24 +00001085 string_list.SplitIntoLines(value_str);
Greg Clayton6920b522012-08-22 18:39:03 +00001086 return SBStringList(&string_list);
1087 }
1088 }
1089 }
1090 return SBStringList();
Caroline Tice3df9a8d2010-09-04 00:03:46 +00001091}
1092
Greg Claytona7015092010-09-18 01:14:36 +00001093uint32_t
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +00001094SBDebugger::GetTerminalWidth() const
Greg Claytona7015092010-09-18 01:14:36 +00001095{
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +00001096 return (m_opaque_sp ? m_opaque_sp->GetTerminalWidth() : 0);
Greg Claytona7015092010-09-18 01:14:36 +00001097}
1098
1099void
1100SBDebugger::SetTerminalWidth (uint32_t term_width)
1101{
1102 if (m_opaque_sp)
1103 m_opaque_sp->SetTerminalWidth (term_width);
1104}
1105
1106const char *
1107SBDebugger::GetPrompt() const
1108{
Greg Clayton5160ce52013-03-27 23:08:40 +00001109 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001110
Caroline Ticeceb6b132010-10-26 03:11:13 +00001111 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001112 log->Printf ("SBDebugger(%p)::GetPrompt () => \"%s\"",
1113 static_cast<void*>(m_opaque_sp.get()),
Caroline Tice750cd172010-10-26 23:49:36 +00001114 (m_opaque_sp ? m_opaque_sp->GetPrompt() : ""));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001115
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +00001116 return (m_opaque_sp ? m_opaque_sp->GetPrompt() : nullptr);
Greg Claytona7015092010-09-18 01:14:36 +00001117}
1118
1119void
1120SBDebugger::SetPrompt (const char *prompt)
1121{
1122 if (m_opaque_sp)
1123 m_opaque_sp->SetPrompt (prompt);
1124}
Greg Claytona7015092010-09-18 01:14:36 +00001125
Greg Clayton431ce672011-04-18 23:15:17 +00001126ScriptLanguage
Greg Claytona7015092010-09-18 01:14:36 +00001127SBDebugger::GetScriptLanguage() const
1128{
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +00001129 return (m_opaque_sp ? m_opaque_sp->GetScriptLanguage() : eScriptLanguageNone);
Greg Claytona7015092010-09-18 01:14:36 +00001130}
1131
1132void
Greg Clayton431ce672011-04-18 23:15:17 +00001133SBDebugger::SetScriptLanguage (ScriptLanguage script_lang)
Greg Claytona7015092010-09-18 01:14:36 +00001134{
1135 if (m_opaque_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +00001136 {
Greg Claytona7015092010-09-18 01:14:36 +00001137 m_opaque_sp->SetScriptLanguage (script_lang);
Greg Claytonaf67cec2010-12-20 20:49:23 +00001138 }
Greg Claytona7015092010-09-18 01:14:36 +00001139}
1140
Jim Inghame40e4212010-08-30 19:44:40 +00001141bool
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +00001142SBDebugger::SetUseExternalEditor(bool value)
Jim Inghame40e4212010-08-30 19:44:40 +00001143{
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +00001144 return (m_opaque_sp ? m_opaque_sp->SetUseExternalEditor(value) : false);
Jim Inghame40e4212010-08-30 19:44:40 +00001145}
1146
1147bool
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +00001148SBDebugger::GetUseExternalEditor()
Jim Inghame40e4212010-08-30 19:44:40 +00001149{
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +00001150 return (m_opaque_sp ? m_opaque_sp->GetUseExternalEditor() : false);
Jim Inghame40e4212010-08-30 19:44:40 +00001151}
1152
Caroline Ticedde9cff2010-09-20 05:20:02 +00001153bool
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +00001154SBDebugger::SetUseColor(bool value)
Michael Sartainc3ce7f272013-05-23 20:47:45 +00001155{
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +00001156 return (m_opaque_sp ? m_opaque_sp->SetUseColor(value) : false);
Michael Sartainc3ce7f272013-05-23 20:47:45 +00001157}
1158
1159bool
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +00001160SBDebugger::GetUseColor() const
Michael Sartainc3ce7f272013-05-23 20:47:45 +00001161{
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +00001162 return (m_opaque_sp ? m_opaque_sp->GetUseColor() : false);
Michael Sartainc3ce7f272013-05-23 20:47:45 +00001163}
1164
1165bool
Caroline Ticedde9cff2010-09-20 05:20:02 +00001166SBDebugger::GetDescription (SBStream &description)
1167{
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001168 Stream &strm = description.ref();
1169
Caroline Ticedde9cff2010-09-20 05:20:02 +00001170 if (m_opaque_sp)
1171 {
1172 const char *name = m_opaque_sp->GetInstanceName().AsCString();
Greg Clayton431ce672011-04-18 23:15:17 +00001173 user_id_t id = m_opaque_sp->GetID();
Daniel Malead01b2952012-11-29 21:49:15 +00001174 strm.Printf ("Debugger (instance: \"%s\", id: %" PRIu64 ")", name, id);
Caroline Ticedde9cff2010-09-20 05:20:02 +00001175 }
1176 else
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001177 strm.PutCString ("No value");
Caroline Ticedde9cff2010-09-20 05:20:02 +00001178
1179 return true;
1180}
Caroline Ticeefed6132010-11-19 20:47:54 +00001181
Greg Clayton431ce672011-04-18 23:15:17 +00001182user_id_t
Caroline Ticeefed6132010-11-19 20:47:54 +00001183SBDebugger::GetID()
1184{
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +00001185 return (m_opaque_sp ? m_opaque_sp->GetID() : LLDB_INVALID_UID);
Caroline Ticeefed6132010-11-19 20:47:54 +00001186}
Greg Clayton2289fa42011-04-30 01:09:13 +00001187
Greg Clayton2289fa42011-04-30 01:09:13 +00001188SBError
Greg Clayton615eb7e2014-09-19 20:11:50 +00001189SBDebugger::SetCurrentPlatform (const char *platform_name_cstr)
Greg Clayton2289fa42011-04-30 01:09:13 +00001190{
1191 SBError sb_error;
1192 if (m_opaque_sp)
1193 {
Greg Clayton615eb7e2014-09-19 20:11:50 +00001194 if (platform_name_cstr && platform_name_cstr[0])
Greg Clayton2289fa42011-04-30 01:09:13 +00001195 {
Greg Clayton615eb7e2014-09-19 20:11:50 +00001196 ConstString platform_name (platform_name_cstr);
1197 PlatformSP platform_sp (Platform::Find (platform_name));
1198
1199 if (platform_sp)
1200 {
1201 // Already have a platform with this name, just select it
1202 m_opaque_sp->GetPlatformList().SetSelectedPlatform(platform_sp);
1203 }
1204 else
1205 {
1206 // We don't have a platform by this name yet, create one
1207 platform_sp = Platform::Create (platform_name, sb_error.ref());
1208 if (platform_sp)
1209 {
1210 // We created the platform, now append and select it
1211 bool make_selected = true;
1212 m_opaque_sp->GetPlatformList().Append (platform_sp, make_selected);
1213 }
1214 }
Greg Clayton2289fa42011-04-30 01:09:13 +00001215 }
Greg Clayton615eb7e2014-09-19 20:11:50 +00001216 else
1217 {
1218 sb_error.ref().SetErrorString("invalid platform name");
1219 }
1220 }
1221 else
1222 {
1223 sb_error.ref().SetErrorString("invalid debugger");
Greg Clayton2289fa42011-04-30 01:09:13 +00001224 }
1225 return sb_error;
1226}
1227
Greg Claytonfc3f0272011-05-29 04:06:55 +00001228bool
Greg Claytonf3dd93c2011-06-17 03:31:01 +00001229SBDebugger::SetCurrentPlatformSDKRoot (const char *sysroot)
1230{
1231 if (m_opaque_sp)
1232 {
1233 PlatformSP platform_sp (m_opaque_sp->GetPlatformList().GetSelectedPlatform());
1234
1235 if (platform_sp)
1236 {
1237 platform_sp->SetSDKRootDirectory (ConstString (sysroot));
1238 return true;
1239 }
1240 }
1241 return false;
1242}
1243
1244bool
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +00001245SBDebugger::GetCloseInputOnEOF() const
Greg Claytonfc3f0272011-05-29 04:06:55 +00001246{
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +00001247 return (m_opaque_sp ? m_opaque_sp->GetCloseInputOnEOF() : false);
Greg Claytonfc3f0272011-05-29 04:06:55 +00001248}
1249
1250void
1251SBDebugger::SetCloseInputOnEOF (bool b)
1252{
1253 if (m_opaque_sp)
1254 m_opaque_sp->SetCloseInputOnEOF (b);
1255}
Enrico Granata061858c2012-02-15 02:34:21 +00001256
1257SBTypeCategory
1258SBDebugger::GetCategory (const char* category_name)
1259{
1260 if (!category_name || *category_name == 0)
1261 return SBTypeCategory();
1262
1263 TypeCategoryImplSP category_sp;
1264
1265 if (DataVisualization::Categories::GetCategory(ConstString(category_name), category_sp, false))
1266 return SBTypeCategory(category_sp);
1267 else
1268 return SBTypeCategory();
1269}
1270
1271SBTypeCategory
1272SBDebugger::CreateCategory (const char* category_name)
1273{
1274 if (!category_name || *category_name == 0)
1275 return SBTypeCategory();
1276
1277 TypeCategoryImplSP category_sp;
1278
1279 if (DataVisualization::Categories::GetCategory(ConstString(category_name), category_sp, true))
1280 return SBTypeCategory(category_sp);
1281 else
1282 return SBTypeCategory();
1283}
1284
1285bool
1286SBDebugger::DeleteCategory (const char* category_name)
1287{
1288 if (!category_name || *category_name == 0)
1289 return false;
1290
1291 return DataVisualization::Categories::Delete(ConstString(category_name));
1292}
1293
1294uint32_t
1295SBDebugger::GetNumCategories()
1296{
1297 return DataVisualization::Categories::GetCount();
1298}
1299
1300SBTypeCategory
1301SBDebugger::GetCategoryAtIndex (uint32_t index)
1302{
1303 return SBTypeCategory(DataVisualization::Categories::GetCategoryAtIndex(index));
1304}
1305
1306SBTypeCategory
1307SBDebugger::GetDefaultCategory()
1308{
1309 return GetCategory("default");
1310}
1311
1312SBTypeFormat
1313SBDebugger::GetFormatForType (SBTypeNameSpecifier type_name)
1314{
1315 SBTypeCategory default_category_sb = GetDefaultCategory();
1316 if (default_category_sb.GetEnabled())
1317 return default_category_sb.GetFormatForType(type_name);
1318 return SBTypeFormat();
1319}
1320
Jason Molendacf7e2dc2012-02-21 05:33:55 +00001321#ifndef LLDB_DISABLE_PYTHON
Enrico Granata061858c2012-02-15 02:34:21 +00001322SBTypeSummary
1323SBDebugger::GetSummaryForType (SBTypeNameSpecifier type_name)
1324{
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +00001325 if (!type_name.IsValid())
Enrico Granataa777dc22012-05-08 21:49:57 +00001326 return SBTypeSummary();
1327 return SBTypeSummary(DataVisualization::GetSummaryForType(type_name.GetSP()));
Enrico Granata061858c2012-02-15 02:34:21 +00001328}
Jason Molendacf7e2dc2012-02-21 05:33:55 +00001329#endif // LLDB_DISABLE_PYTHON
Enrico Granata061858c2012-02-15 02:34:21 +00001330
1331SBTypeFilter
1332SBDebugger::GetFilterForType (SBTypeNameSpecifier type_name)
1333{
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +00001334 if (!type_name.IsValid())
Enrico Granataa777dc22012-05-08 21:49:57 +00001335 return SBTypeFilter();
1336 return SBTypeFilter(DataVisualization::GetFilterForType(type_name.GetSP()));
Enrico Granata061858c2012-02-15 02:34:21 +00001337}
1338
Jason Molendacf7e2dc2012-02-21 05:33:55 +00001339#ifndef LLDB_DISABLE_PYTHON
Enrico Granata061858c2012-02-15 02:34:21 +00001340SBTypeSynthetic
1341SBDebugger::GetSyntheticForType (SBTypeNameSpecifier type_name)
1342{
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +00001343 if (!type_name.IsValid())
Enrico Granataa777dc22012-05-08 21:49:57 +00001344 return SBTypeSynthetic();
1345 return SBTypeSynthetic(DataVisualization::GetSyntheticForType(type_name.GetSP()));
Enrico Granata061858c2012-02-15 02:34:21 +00001346}
Jason Molendacf7e2dc2012-02-21 05:33:55 +00001347#endif // LLDB_DISABLE_PYTHON
Enrico Granata061858c2012-02-15 02:34:21 +00001348
Jim Ingham228063c2012-02-21 02:23:08 +00001349bool
1350SBDebugger::EnableLog (const char *channel, const char **categories)
1351{
1352 if (m_opaque_sp)
1353 {
1354 uint32_t log_options = LLDB_LOG_OPTION_PREPEND_TIMESTAMP | LLDB_LOG_OPTION_PREPEND_THREAD_NAME;
1355 StreamString errors;
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +00001356 return m_opaque_sp->EnableLog(channel, categories, nullptr, log_options, errors);
Jim Ingham228063c2012-02-21 02:23:08 +00001357 }
1358 else
1359 return false;
1360}
Jim Ingham4f02b222012-02-22 22:49:20 +00001361
1362void
1363SBDebugger::SetLoggingCallback (lldb::LogOutputCallback log_callback, void *baton)
1364{
1365 if (m_opaque_sp)
1366 {
1367 return m_opaque_sp->SetLoggingCallback (log_callback, baton);
1368 }
1369}