blob: 33f9760e10723369acad4353e9ac49b283c84dda [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- SBDebugger.cpp ------------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Eli Friedmand6ec8aa2010-06-09 07:37:52 +000010#include "lldb/API/SBDebugger.h"
Chris Lattner24943d22010-06-08 16:52:24 +000011
Greg Claytonb3448432011-03-24 21:19:54 +000012#include "lldb/lldb-private.h"
Chris Lattner24943d22010-06-08 16:52:24 +000013
Eli Friedmand6ec8aa2010-06-09 07:37:52 +000014#include "lldb/API/SBListener.h"
15#include "lldb/API/SBBroadcaster.h"
16#include "lldb/API/SBCommandInterpreter.h"
17#include "lldb/API/SBCommandReturnObject.h"
Greg Clayton180546b2011-04-30 01:09:13 +000018#include "lldb/API/SBError.h"
Eli Friedmand6ec8aa2010-06-09 07:37:52 +000019#include "lldb/API/SBEvent.h"
20#include "lldb/API/SBFrame.h"
Eli Friedmand6ec8aa2010-06-09 07:37:52 +000021#include "lldb/API/SBInputReader.h"
Caroline Tice6e4c5ce2010-09-04 00:03:46 +000022#include "lldb/API/SBProcess.h"
23#include "lldb/API/SBSourceManager.h"
Caroline Tice98f930f2010-09-20 05:20:02 +000024#include "lldb/API/SBStream.h"
Caroline Tice6e4c5ce2010-09-04 00:03:46 +000025#include "lldb/API/SBStringList.h"
26#include "lldb/API/SBTarget.h"
27#include "lldb/API/SBThread.h"
Greg Clayton887aa282010-10-11 01:05:37 +000028#include "lldb/Core/Debugger.h"
29#include "lldb/Core/State.h"
30#include "lldb/Interpreter/Args.h"
31#include "lldb/Interpreter/CommandInterpreter.h"
32#include "lldb/Target/Process.h"
33#include "lldb/Target/TargetList.h"
Chris Lattner24943d22010-06-08 16:52:24 +000034
35using namespace lldb;
36using namespace lldb_private;
37
38void
39SBDebugger::Initialize ()
40{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +000041 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +000042
43 if (log)
44 log->Printf ("SBDebugger::Initialize ()");
45
Greg Claytone86cbb92011-03-22 01:14:58 +000046 SBCommandInterpreter::InitializeSWIG ();
47
Chris Lattner24943d22010-06-08 16:52:24 +000048 Debugger::Initialize();
49}
50
51void
52SBDebugger::Terminate ()
53{
54 Debugger::Terminate();
55}
56
Greg Clayton43490d12010-07-30 20:12:55 +000057void
58SBDebugger::Clear ()
59{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +000060 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +000061
62 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +000063 log->Printf ("SBDebugger(%p)::Clear ()", m_opaque_sp.get());
Caroline Ticec0446862010-12-20 18:35:50 +000064
65 if (m_opaque_sp)
66 m_opaque_sp->CleanUpInputReaders ();
Caroline Tice7826c882010-10-26 03:11:13 +000067
Greg Clayton43490d12010-07-30 20:12:55 +000068 m_opaque_sp.reset();
69}
70
Greg Clayton63094e02010-06-23 01:19:29 +000071SBDebugger
72SBDebugger::Create()
73{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +000074 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +000075
Greg Clayton63094e02010-06-23 01:19:29 +000076 SBDebugger debugger;
77 debugger.reset(Debugger::CreateInstance());
Caroline Tice7826c882010-10-26 03:11:13 +000078
79 if (log)
80 {
81 SBStream sstr;
82 debugger.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +000083 log->Printf ("SBDebugger::Create () => SBDebugger(%p): %s", debugger.m_opaque_sp.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +000084 }
85
Greg Clayton63094e02010-06-23 01:19:29 +000086 return debugger;
87}
88
Caroline Ticec4ed12f2011-01-22 01:02:07 +000089void
90SBDebugger::Destroy (SBDebugger &debugger)
91{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +000092 LogSP log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticec4ed12f2011-01-22 01:02:07 +000093
94 if (log)
95 {
96 SBStream sstr;
97 debugger.GetDescription (sstr);
98 log->Printf ("SBDebugger::Destroy () => SBDebugger(%p): %s", debugger.m_opaque_sp.get(), sstr.GetData());
99 }
100
101 Debugger::Destroy (debugger.m_opaque_sp);
102
103 if (debugger.m_opaque_sp.get() != NULL)
104 debugger.m_opaque_sp.reset();
105}
106
Greg Clayton63094e02010-06-23 01:19:29 +0000107SBDebugger::SBDebugger () :
108 m_opaque_sp ()
109{
110}
111
Greg Clayton538eb822010-11-05 23:17:00 +0000112SBDebugger::SBDebugger(const SBDebugger &rhs) :
113 m_opaque_sp (rhs.m_opaque_sp)
114{
115}
116
117SBDebugger &
118SBDebugger::operator = (const SBDebugger &rhs)
119{
120 if (this != &rhs)
121 {
122 m_opaque_sp = rhs.m_opaque_sp;
123 }
124 return *this;
125}
126
Greg Clayton63094e02010-06-23 01:19:29 +0000127SBDebugger::~SBDebugger ()
128{
129}
130
131bool
132SBDebugger::IsValid() const
133{
134 return m_opaque_sp.get() != NULL;
135}
136
137
Chris Lattner24943d22010-06-08 16:52:24 +0000138void
139SBDebugger::SetAsync (bool b)
140{
Greg Clayton63094e02010-06-23 01:19:29 +0000141 if (m_opaque_sp)
142 m_opaque_sp->SetAsyncExecution(b);
Chris Lattner24943d22010-06-08 16:52:24 +0000143}
144
Greg Clayton887aa282010-10-11 01:05:37 +0000145void
146SBDebugger::SkipLLDBInitFiles (bool b)
147{
148 if (m_opaque_sp)
149 m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles (b);
150}
151
Chris Lattner24943d22010-06-08 16:52:24 +0000152// Shouldn't really be settable after initialization as this could cause lots of problems; don't want users
153// trying to switch modes in the middle of a debugging session.
154void
155SBDebugger::SetInputFileHandle (FILE *fh, bool transfer_ownership)
156{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000157 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000158
159 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000160 log->Printf ("SBDebugger(%p)::SetInputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
161 fh, transfer_ownership);
Caroline Tice7826c882010-10-26 03:11:13 +0000162
Greg Clayton63094e02010-06-23 01:19:29 +0000163 if (m_opaque_sp)
164 m_opaque_sp->SetInputFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000165}
166
167void
168SBDebugger::SetOutputFileHandle (FILE *fh, bool transfer_ownership)
169{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000170 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000171
172
173 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000174 log->Printf ("SBDebugger(%p)::SetOutputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
175 fh, transfer_ownership);
Caroline Tice7826c882010-10-26 03:11:13 +0000176
Greg Clayton63094e02010-06-23 01:19:29 +0000177 if (m_opaque_sp)
178 m_opaque_sp->SetOutputFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000179}
180
181void
182SBDebugger::SetErrorFileHandle (FILE *fh, bool transfer_ownership)
183{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000184 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000185
186
187 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000188 log->Printf ("SBDebugger(%p)::SetErrorFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
189 fh, transfer_ownership);
Caroline Tice7826c882010-10-26 03:11:13 +0000190
Greg Clayton63094e02010-06-23 01:19:29 +0000191 if (m_opaque_sp)
192 m_opaque_sp->SetErrorFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000193}
194
195FILE *
196SBDebugger::GetInputFileHandle ()
197{
Greg Clayton63094e02010-06-23 01:19:29 +0000198 if (m_opaque_sp)
Greg Clayton58928562011-02-09 01:08:52 +0000199 return m_opaque_sp->GetInputFile().GetStream();
Greg Clayton63094e02010-06-23 01:19:29 +0000200 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000201}
202
203FILE *
204SBDebugger::GetOutputFileHandle ()
205{
Greg Clayton63094e02010-06-23 01:19:29 +0000206 if (m_opaque_sp)
Greg Clayton58928562011-02-09 01:08:52 +0000207 return m_opaque_sp->GetOutputFile().GetStream();
Greg Clayton63094e02010-06-23 01:19:29 +0000208 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000209}
210
211FILE *
212SBDebugger::GetErrorFileHandle ()
213{
Greg Clayton63094e02010-06-23 01:19:29 +0000214 if (m_opaque_sp)
Greg Clayton58928562011-02-09 01:08:52 +0000215 return m_opaque_sp->GetErrorFile().GetStream();
Greg Clayton63094e02010-06-23 01:19:29 +0000216 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000217}
218
219SBCommandInterpreter
220SBDebugger::GetCommandInterpreter ()
221{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000222 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000223
Greg Clayton63094e02010-06-23 01:19:29 +0000224 SBCommandInterpreter sb_interpreter;
225 if (m_opaque_sp)
226 sb_interpreter.reset (&m_opaque_sp->GetCommandInterpreter());
Caroline Tice7826c882010-10-26 03:11:13 +0000227
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000228 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000229 log->Printf ("SBDebugger(%p)::GetCommandInterpreter () => SBCommandInterpreter(%p)",
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000230 m_opaque_sp.get(), sb_interpreter.get());
231
Chris Lattner24943d22010-06-08 16:52:24 +0000232 return sb_interpreter;
233}
234
235void
236SBDebugger::HandleCommand (const char *command)
237{
Greg Clayton63094e02010-06-23 01:19:29 +0000238 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000239 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000240 TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
241 Mutex::Locker api_locker;
242 if (target_sp)
243 api_locker.Reset(target_sp->GetAPIMutex().GetMutex());
244
Greg Clayton63094e02010-06-23 01:19:29 +0000245 SBCommandInterpreter sb_interpreter(GetCommandInterpreter ());
246 SBCommandReturnObject result;
247
248 sb_interpreter.HandleCommand (command, result, false);
249
250 if (GetErrorFileHandle() != NULL)
251 result.PutError (GetErrorFileHandle());
252 if (GetOutputFileHandle() != NULL)
253 result.PutOutput (GetOutputFileHandle());
254
255 if (m_opaque_sp->GetAsyncExecution() == false)
Chris Lattner24943d22010-06-08 16:52:24 +0000256 {
Greg Clayton63094e02010-06-23 01:19:29 +0000257 SBProcess process(GetCommandInterpreter().GetProcess ());
258 if (process.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000259 {
Greg Clayton63094e02010-06-23 01:19:29 +0000260 EventSP event_sp;
261 Listener &lldb_listener = m_opaque_sp->GetListener();
262 while (lldb_listener.GetNextEventForBroadcaster (process.get(), event_sp))
263 {
264 SBEvent event(event_sp);
265 HandleProcessEvent (process, event, GetOutputFileHandle(), GetErrorFileHandle());
266 }
Chris Lattner24943d22010-06-08 16:52:24 +0000267 }
268 }
269 }
270}
271
272SBListener
273SBDebugger::GetListener ()
274{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000275 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000276
Greg Clayton63094e02010-06-23 01:19:29 +0000277 SBListener sb_listener;
278 if (m_opaque_sp)
279 sb_listener.reset(&m_opaque_sp->GetListener(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000280
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000281 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000282 log->Printf ("SBDebugger(%p)::GetListener () => SBListener(%p)", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000283 sb_listener.get());
284
Chris Lattner24943d22010-06-08 16:52:24 +0000285 return sb_listener;
286}
287
288void
289SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, FILE *out, FILE *err)
290{
Greg Claytonbdcda462010-12-20 20:49:23 +0000291 if (!process.IsValid())
292 return;
Chris Lattner24943d22010-06-08 16:52:24 +0000293
Greg Claytonbdcda462010-12-20 20:49:23 +0000294 const uint32_t event_type = event.GetType();
295 char stdio_buffer[1024];
296 size_t len;
Chris Lattner24943d22010-06-08 16:52:24 +0000297
Greg Claytonbdcda462010-12-20 20:49:23 +0000298 Mutex::Locker api_locker (process.GetTarget()->GetAPIMutex());
299
300 if (event_type & (Process::eBroadcastBitSTDOUT | Process::eBroadcastBitStateChanged))
Chris Lattner24943d22010-06-08 16:52:24 +0000301 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000302 // Drain stdout when we stop just in case we have any bytes
303 while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
304 if (out != NULL)
305 ::fwrite (stdio_buffer, 1, len, out);
306 }
307
308 if (event_type & (Process::eBroadcastBitSTDERR | Process::eBroadcastBitStateChanged))
309 {
310 // Drain stderr when we stop just in case we have any bytes
311 while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
312 if (err != NULL)
313 ::fwrite (stdio_buffer, 1, len, err);
314 }
315
316 if (event_type & Process::eBroadcastBitStateChanged)
317 {
318 StateType event_state = SBProcess::GetStateFromEvent (event);
319
320 if (event_state == eStateInvalid)
321 return;
322
323 bool is_stopped = StateIsStoppedState (event_state);
324 if (!is_stopped)
325 process.ReportEventState (event, out);
Chris Lattner24943d22010-06-08 16:52:24 +0000326 }
327}
328
Chris Lattner24943d22010-06-08 16:52:24 +0000329SBSourceManager &
330SBDebugger::GetSourceManager ()
331{
332 static SourceManager g_lldb_source_manager;
Greg Clayton538eb822010-11-05 23:17:00 +0000333 static SBSourceManager g_sb_source_manager (&g_lldb_source_manager);
Chris Lattner24943d22010-06-08 16:52:24 +0000334 return g_sb_source_manager;
335}
336
337
338bool
339SBDebugger::GetDefaultArchitecture (char *arch_name, size_t arch_name_len)
340{
341 if (arch_name && arch_name_len)
342 {
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000343 ArchSpec default_arch = Target::GetDefaultArchitecture ();
Caroline Tice5bc8c972010-09-20 20:44:43 +0000344
Chris Lattner24943d22010-06-08 16:52:24 +0000345 if (default_arch.IsValid())
346 {
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000347 const std::string &triple_str = default_arch.GetTriple().str();
348 if (!triple_str.empty())
349 ::snprintf (arch_name, arch_name_len, "%s", triple_str.c_str());
350 else
351 ::snprintf (arch_name, arch_name_len, "%s", default_arch.GetArchitectureName());
Chris Lattner24943d22010-06-08 16:52:24 +0000352 return true;
353 }
354 }
355 if (arch_name && arch_name_len)
356 arch_name[0] = '\0';
357 return false;
358}
359
360
361bool
362SBDebugger::SetDefaultArchitecture (const char *arch_name)
363{
364 if (arch_name)
365 {
Greg Claytonf15996e2011-04-07 22:46:35 +0000366 ArchSpec arch (arch_name, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000367 if (arch.IsValid())
368 {
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000369 Target::SetDefaultArchitecture (arch);
Chris Lattner24943d22010-06-08 16:52:24 +0000370 return true;
371 }
372 }
373 return false;
374}
375
376ScriptLanguage
377SBDebugger::GetScriptingLanguage (const char *script_language_name)
378{
Greg Claytonbdcda462010-12-20 20:49:23 +0000379
Chris Lattner24943d22010-06-08 16:52:24 +0000380 return Args::StringToScriptLanguage (script_language_name,
381 eScriptLanguageDefault,
382 NULL);
383}
Chris Lattner24943d22010-06-08 16:52:24 +0000384
385const char *
386SBDebugger::GetVersionString ()
387{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000388 return GetVersion();
Chris Lattner24943d22010-06-08 16:52:24 +0000389}
390
391const char *
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000392SBDebugger::StateAsCString (StateType state)
Chris Lattner24943d22010-06-08 16:52:24 +0000393{
Caroline Ticea2cffd32011-04-25 22:05:51 +0000394 return lldb_private::StateAsCString (state);
Chris Lattner24943d22010-06-08 16:52:24 +0000395}
396
397bool
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000398SBDebugger::StateIsRunningState (StateType state)
Chris Lattner24943d22010-06-08 16:52:24 +0000399{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000400 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000401
Caroline Ticea2cffd32011-04-25 22:05:51 +0000402 const bool result = lldb_private::StateIsRunningState (state);
Greg Claytona66ba462010-10-30 04:51:46 +0000403 if (log)
404 log->Printf ("SBDebugger::StateIsRunningState (state=%s) => %i",
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000405 StateAsCString (state), result);
Greg Claytona66ba462010-10-30 04:51:46 +0000406
407 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000408}
409
410bool
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000411SBDebugger::StateIsStoppedState (StateType state)
Chris Lattner24943d22010-06-08 16:52:24 +0000412{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000413 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000414
Caroline Ticea2cffd32011-04-25 22:05:51 +0000415 const bool result = lldb_private::StateIsStoppedState (state);
Caroline Tice7826c882010-10-26 03:11:13 +0000416 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000417 log->Printf ("SBDebugger::StateIsStoppedState (state=%s) => %i",
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000418 StateAsCString (state), result);
Caroline Tice7826c882010-10-26 03:11:13 +0000419
Greg Claytona66ba462010-10-30 04:51:46 +0000420 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000421}
422
423
424SBTarget
425SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename,
426 const char *target_triple)
427{
Greg Clayton63094e02010-06-23 01:19:29 +0000428 SBTarget target;
429 if (m_opaque_sp)
430 {
431 ArchSpec arch;
Greg Clayton537a7a82010-10-20 20:54:39 +0000432 FileSpec file_spec (filename, true);
Greg Claytonf15996e2011-04-07 22:46:35 +0000433 arch.SetTriple (target_triple, m_opaque_sp->GetPlatformList().GetSelectedPlatform().get());
Greg Clayton63094e02010-06-23 01:19:29 +0000434 TargetSP target_sp;
Greg Claytone4b9c1f2011-03-08 22:40:15 +0000435 Error error (m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file_spec, arch, true, target_sp));
Greg Clayton63094e02010-06-23 01:19:29 +0000436 target.reset (target_sp);
437 }
Greg Claytona66ba462010-10-30 04:51:46 +0000438
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000439 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000440 if (log)
441 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000442 log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndTargetTriple (filename=\"%s\", triple=%s) => SBTarget(%p)",
Greg Claytona66ba462010-10-30 04:51:46 +0000443 m_opaque_sp.get(), filename, target_triple, target.get());
444 }
445
Chris Lattner24943d22010-06-08 16:52:24 +0000446 return target;
447}
448
449SBTarget
Greg Clayton940b1032011-02-23 00:35:02 +0000450SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *arch_cstr)
Chris Lattner24943d22010-06-08 16:52:24 +0000451{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000452 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000453
Greg Clayton63094e02010-06-23 01:19:29 +0000454 SBTarget target;
455 if (m_opaque_sp)
456 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000457 FileSpec file (filename, true);
Greg Clayton940b1032011-02-23 00:35:02 +0000458 ArchSpec arch;
Greg Clayton63094e02010-06-23 01:19:29 +0000459 TargetSP target_sp;
460 Error error;
Chris Lattner24943d22010-06-08 16:52:24 +0000461
Greg Clayton940b1032011-02-23 00:35:02 +0000462 if (arch_cstr)
Greg Claytonf15996e2011-04-07 22:46:35 +0000463 arch.SetTriple (arch_cstr, m_opaque_sp->GetPlatformList().GetSelectedPlatform().get());
Greg Clayton940b1032011-02-23 00:35:02 +0000464
Greg Claytone4b9c1f2011-03-08 22:40:15 +0000465 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, true, target_sp);
Greg Clayton63094e02010-06-23 01:19:29 +0000466
467 if (error.Success())
468 {
Jim Inghamc8332952010-08-26 21:32:51 +0000469 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Clayton63094e02010-06-23 01:19:29 +0000470 target.reset(target_sp);
471 }
Chris Lattner24943d22010-06-08 16:52:24 +0000472 }
Caroline Tice7826c882010-10-26 03:11:13 +0000473
474 if (log)
475 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000476 log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndArch (filename=\"%s\", arch=%s) => SBTarget(%p)",
Greg Clayton940b1032011-02-23 00:35:02 +0000477 m_opaque_sp.get(), filename, arch_cstr, target.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000478 }
479
Greg Clayton63094e02010-06-23 01:19:29 +0000480 return target;
481}
482
483SBTarget
484SBDebugger::CreateTarget (const char *filename)
485{
486 SBTarget target;
487 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000488 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000489 FileSpec file (filename, true);
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000490 ArchSpec arch = Target::GetDefaultArchitecture ();
Greg Clayton63094e02010-06-23 01:19:29 +0000491 TargetSP target_sp;
492 Error error;
493
Greg Claytone4b9c1f2011-03-08 22:40:15 +0000494 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, true, target_sp);
Greg Clayton63094e02010-06-23 01:19:29 +0000495
496 if (error.Success())
497 {
Jim Inghamc8332952010-08-26 21:32:51 +0000498 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Clayton63094e02010-06-23 01:19:29 +0000499 target.reset (target_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000500 }
501 }
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000502 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000503 if (log)
504 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000505 log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)",
Greg Claytona66ba462010-10-30 04:51:46 +0000506 m_opaque_sp.get(), filename, target.get());
507 }
Greg Clayton63094e02010-06-23 01:19:29 +0000508 return target;
Chris Lattner24943d22010-06-08 16:52:24 +0000509}
510
511SBTarget
512SBDebugger::GetTargetAtIndex (uint32_t idx)
513{
Greg Clayton63094e02010-06-23 01:19:29 +0000514 SBTarget sb_target;
515 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000516 {
517 // No need to lock, the target list is thread safe
Greg Clayton63094e02010-06-23 01:19:29 +0000518 sb_target.reset(m_opaque_sp->GetTargetList().GetTargetAtIndex (idx));
Greg Claytonbdcda462010-12-20 20:49:23 +0000519 }
Chris Lattner24943d22010-06-08 16:52:24 +0000520 return sb_target;
521}
522
523SBTarget
524SBDebugger::FindTargetWithProcessID (pid_t pid)
525{
Greg Clayton63094e02010-06-23 01:19:29 +0000526 SBTarget sb_target;
527 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000528 {
529 // No need to lock, the target list is thread safe
Greg Clayton63094e02010-06-23 01:19:29 +0000530 sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid));
Greg Claytonbdcda462010-12-20 20:49:23 +0000531 }
Chris Lattner24943d22010-06-08 16:52:24 +0000532 return sb_target;
533}
534
535SBTarget
536SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name)
537{
Greg Clayton63094e02010-06-23 01:19:29 +0000538 SBTarget sb_target;
539 if (m_opaque_sp && filename && filename[0])
540 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000541 // No need to lock, the target list is thread safe
Greg Claytonf15996e2011-04-07 22:46:35 +0000542 ArchSpec arch (arch_name, m_opaque_sp->GetPlatformList().GetSelectedPlatform().get());
Greg Clayton537a7a82010-10-20 20:54:39 +0000543 TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename, false), arch_name ? &arch : NULL));
Greg Clayton63094e02010-06-23 01:19:29 +0000544 sb_target.reset(target_sp);
545 }
546 return sb_target;
Chris Lattner24943d22010-06-08 16:52:24 +0000547}
548
549SBTarget
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000550SBDebugger::FindTargetWithLLDBProcess (const ProcessSP &process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000551{
Greg Clayton63094e02010-06-23 01:19:29 +0000552 SBTarget sb_target;
553 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000554 {
555 // No need to lock, the target list is thread safe
Greg Clayton63094e02010-06-23 01:19:29 +0000556 sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get()));
Greg Claytonbdcda462010-12-20 20:49:23 +0000557 }
Chris Lattner24943d22010-06-08 16:52:24 +0000558 return sb_target;
559}
560
561
562uint32_t
563SBDebugger::GetNumTargets ()
564{
Greg Clayton63094e02010-06-23 01:19:29 +0000565 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000566 {
567 // No need to lock, the target list is thread safe
Greg Clayton63094e02010-06-23 01:19:29 +0000568 return m_opaque_sp->GetTargetList().GetNumTargets ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000569 }
Greg Clayton63094e02010-06-23 01:19:29 +0000570 return 0;
571}
Chris Lattner24943d22010-06-08 16:52:24 +0000572
573SBTarget
Jim Inghamc8332952010-08-26 21:32:51 +0000574SBDebugger::GetSelectedTarget ()
Chris Lattner24943d22010-06-08 16:52:24 +0000575{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000576 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000577
Greg Clayton63094e02010-06-23 01:19:29 +0000578 SBTarget sb_target;
579 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000580 {
581 // No need to lock, the target list is thread safe
Jim Inghamc8332952010-08-26 21:32:51 +0000582 sb_target.reset(m_opaque_sp->GetTargetList().GetSelectedTarget ());
Greg Claytonbdcda462010-12-20 20:49:23 +0000583 }
Caroline Tice7826c882010-10-26 03:11:13 +0000584
585 if (log)
586 {
587 SBStream sstr;
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000588 sb_target.GetDescription (sstr, eDescriptionLevelBrief);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000589 log->Printf ("SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000590 sb_target.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000591 }
592
Chris Lattner24943d22010-06-08 16:52:24 +0000593 return sb_target;
594}
595
596void
597SBDebugger::DispatchInput (void *baton, const void *data, size_t data_len)
598{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000599 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000600
601 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000602 log->Printf ("SBDebugger(%p)::DispatchInput (baton=%p, data=\"%.*s\", size_t=%zu)", m_opaque_sp.get(),
603 baton, (int) data_len, (const char *) data, data_len);
Caroline Tice7826c882010-10-26 03:11:13 +0000604
Greg Clayton63094e02010-06-23 01:19:29 +0000605 if (m_opaque_sp)
606 m_opaque_sp->DispatchInput ((const char *) data, data_len);
Chris Lattner24943d22010-06-08 16:52:24 +0000607}
608
609void
Caroline Ticec4f55fe2010-11-19 20:47:54 +0000610SBDebugger::DispatchInputInterrupt ()
611{
612 if (m_opaque_sp)
613 m_opaque_sp->DispatchInputInterrupt ();
614}
615
616void
617SBDebugger::DispatchInputEndOfFile ()
618{
619 if (m_opaque_sp)
620 m_opaque_sp->DispatchInputEndOfFile ();
621}
Caroline Ticeb38df1e2011-05-09 23:06:58 +0000622
623bool
624SBDebugger::InputReaderIsTopReader (const lldb::SBInputReader &reader)
625{
626 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
627
628 if (log)
629 log->Printf ("SBDebugger(%p)::InputReaderIsTopReader (SBInputReader(%p))", m_opaque_sp.get(), &reader);
630
631 if (m_opaque_sp && reader.IsValid())
632 {
633 InputReaderSP reader_sp (*reader);
634 return m_opaque_sp->InputReaderIsTopReader (reader_sp);
635 }
636
637 return false;
638}
639
Caroline Ticec4f55fe2010-11-19 20:47:54 +0000640
641void
Chris Lattner24943d22010-06-08 16:52:24 +0000642SBDebugger::PushInputReader (SBInputReader &reader)
643{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000644 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000645
646 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000647 log->Printf ("SBDebugger(%p)::PushInputReader (SBInputReader(%p))", m_opaque_sp.get(), &reader);
Caroline Tice7826c882010-10-26 03:11:13 +0000648
Greg Clayton63094e02010-06-23 01:19:29 +0000649 if (m_opaque_sp && reader.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000650 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000651 TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
652 Mutex::Locker api_locker;
653 if (target_sp)
654 api_locker.Reset(target_sp->GetAPIMutex().GetMutex());
Chris Lattner24943d22010-06-08 16:52:24 +0000655 InputReaderSP reader_sp(*reader);
Greg Clayton63094e02010-06-23 01:19:29 +0000656 m_opaque_sp->PushInputReader (reader_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000657 }
658}
Greg Clayton63094e02010-06-23 01:19:29 +0000659
660void
Caroline Tice4a348082011-05-02 20:41:46 +0000661SBDebugger::NotifyTopInputReader (InputReaderAction notification)
662{
663 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
664
665 if (log)
666 log->Printf ("SBDebugger(%p)::NotifyTopInputReader (%d)", m_opaque_sp.get(), notification);
667
668 if (m_opaque_sp)
669 m_opaque_sp->NotifyTopInputReader (notification);
670}
671
672void
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000673SBDebugger::reset (const DebuggerSP &debugger_sp)
Greg Clayton63094e02010-06-23 01:19:29 +0000674{
675 m_opaque_sp = debugger_sp;
676}
677
678Debugger *
679SBDebugger::get () const
680{
681 return m_opaque_sp.get();
682}
683
684Debugger &
685SBDebugger::ref () const
686{
687 assert (m_opaque_sp.get());
688 return *m_opaque_sp;
689}
690
691
Caroline Tice558be582010-06-30 16:22:25 +0000692SBDebugger
693SBDebugger::FindDebuggerWithID (int id)
694{
Greg Claytonbdcda462010-12-20 20:49:23 +0000695 // No need to lock, the debugger list is thread safe
Caroline Tice558be582010-06-30 16:22:25 +0000696 SBDebugger sb_debugger;
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000697 DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id);
Caroline Tice558be582010-06-30 16:22:25 +0000698 if (debugger_sp)
699 sb_debugger.reset (debugger_sp);
700 return sb_debugger;
701}
Jim Ingham74989e82010-08-30 19:44:40 +0000702
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000703const char *
704SBDebugger::GetInstanceName()
705{
706 if (m_opaque_sp)
707 return m_opaque_sp->GetInstanceName().AsCString();
708 else
709 return NULL;
710}
711
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000712SBError
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000713SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000714{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000715 UserSettingsControllerSP root_settings_controller = Debugger::GetSettingsController();
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000716
Greg Claytonb3448432011-03-24 21:19:54 +0000717 Error err = root_settings_controller->SetVariable (var_name,
718 value,
719 eVarSetOperationAssign,
720 true,
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000721 debugger_instance_name);
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000722 SBError sb_error;
723 sb_error.SetError (err);
724
725 return sb_error;
726}
727
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000728SBStringList
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000729SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000730{
731 SBStringList ret_value;
Greg Claytonb3448432011-03-24 21:19:54 +0000732 SettableVariableType var_type;
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000733 Error err;
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000734
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000735 UserSettingsControllerSP root_settings_controller = Debugger::GetSettingsController();
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000736
Caroline Tice5bc8c972010-09-20 20:44:43 +0000737 StringList value = root_settings_controller->GetVariable (var_name, var_type, debugger_instance_name, err);
738
739 if (err.Success())
740 {
741 for (unsigned i = 0; i != value.GetSize(); ++i)
742 ret_value.AppendString (value.GetStringAtIndex(i));
743 }
744 else
745 {
746 ret_value.AppendString (err.AsCString());
747 }
748
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000749
750 return ret_value;
751}
752
Greg Clayton238c0a12010-09-18 01:14:36 +0000753uint32_t
754SBDebugger::GetTerminalWidth () const
755{
756 if (m_opaque_sp)
757 return m_opaque_sp->GetTerminalWidth ();
758 return 0;
759}
760
761void
762SBDebugger::SetTerminalWidth (uint32_t term_width)
763{
764 if (m_opaque_sp)
765 m_opaque_sp->SetTerminalWidth (term_width);
766}
767
768const char *
769SBDebugger::GetPrompt() const
770{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000771 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000772
773 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000774 log->Printf ("SBDebugger(%p)::GetPrompt () => \"%s\"", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000775 (m_opaque_sp ? m_opaque_sp->GetPrompt() : ""));
Caroline Tice7826c882010-10-26 03:11:13 +0000776
Greg Clayton238c0a12010-09-18 01:14:36 +0000777 if (m_opaque_sp)
778 return m_opaque_sp->GetPrompt ();
779 return 0;
780}
781
782void
783SBDebugger::SetPrompt (const char *prompt)
784{
785 if (m_opaque_sp)
786 m_opaque_sp->SetPrompt (prompt);
787}
788
789
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000790ScriptLanguage
Greg Clayton238c0a12010-09-18 01:14:36 +0000791SBDebugger::GetScriptLanguage() const
792{
793 if (m_opaque_sp)
794 return m_opaque_sp->GetScriptLanguage ();
795 return eScriptLanguageNone;
796}
797
798void
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000799SBDebugger::SetScriptLanguage (ScriptLanguage script_lang)
Greg Clayton238c0a12010-09-18 01:14:36 +0000800{
801 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000802 {
Greg Clayton238c0a12010-09-18 01:14:36 +0000803 m_opaque_sp->SetScriptLanguage (script_lang);
Greg Claytonbdcda462010-12-20 20:49:23 +0000804 }
Greg Clayton238c0a12010-09-18 01:14:36 +0000805}
806
Jim Ingham74989e82010-08-30 19:44:40 +0000807bool
808SBDebugger::SetUseExternalEditor (bool value)
809{
810 if (m_opaque_sp)
811 return m_opaque_sp->SetUseExternalEditor (value);
Greg Claytonbdcda462010-12-20 20:49:23 +0000812 return false;
Jim Ingham74989e82010-08-30 19:44:40 +0000813}
814
815bool
Caroline Tice5bc8c972010-09-20 20:44:43 +0000816SBDebugger::GetUseExternalEditor ()
Jim Ingham74989e82010-08-30 19:44:40 +0000817{
818 if (m_opaque_sp)
Caroline Tice5bc8c972010-09-20 20:44:43 +0000819 return m_opaque_sp->GetUseExternalEditor ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000820 return false;
Jim Ingham74989e82010-08-30 19:44:40 +0000821}
822
Caroline Tice98f930f2010-09-20 05:20:02 +0000823bool
824SBDebugger::GetDescription (SBStream &description)
825{
826 if (m_opaque_sp)
827 {
828 const char *name = m_opaque_sp->GetInstanceName().AsCString();
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000829 user_id_t id = m_opaque_sp->GetID();
Greg Clayton49ce6822010-10-31 03:01:06 +0000830 description.Printf ("Debugger (instance: \"%s\", id: %d)", name, id);
Caroline Tice98f930f2010-09-20 05:20:02 +0000831 }
832 else
833 description.Printf ("No value");
834
835 return true;
836}
Caroline Ticec4f55fe2010-11-19 20:47:54 +0000837
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000838user_id_t
Caroline Ticec4f55fe2010-11-19 20:47:54 +0000839SBDebugger::GetID()
840{
841 if (m_opaque_sp)
842 return m_opaque_sp->GetID();
843 return LLDB_INVALID_UID;
844}
Greg Clayton180546b2011-04-30 01:09:13 +0000845
846
847SBError
848SBDebugger::SetCurrentPlatform (const char *platform_name)
849{
850 SBError sb_error;
851 if (m_opaque_sp)
852 {
853 PlatformSP platform_sp (Platform::Create (platform_name, sb_error.ref()));
854
855 if (platform_sp)
856 {
857 bool make_selected = true;
858 m_opaque_sp->GetPlatformList().Append (platform_sp, make_selected);
859 }
860 }
861 return sb_error;
862}
863
Greg Clayton421ca502011-05-29 04:06:55 +0000864bool
865SBDebugger::GetCloseInputOnEOF () const
866{
867 if (m_opaque_sp)
868 return m_opaque_sp->GetCloseInputOnEOF ();
869 return false;
870}
871
872void
873SBDebugger::SetCloseInputOnEOF (bool b)
874{
875 if (m_opaque_sp)
876 m_opaque_sp->SetCloseInputOnEOF (b);
877}