blob: c08173f8b7ab0d73d288658419cfa8edf13929ad [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"
18#include "lldb/API/SBEvent.h"
19#include "lldb/API/SBFrame.h"
Eli Friedmand6ec8aa2010-06-09 07:37:52 +000020#include "lldb/API/SBInputReader.h"
Caroline Tice6e4c5ce2010-09-04 00:03:46 +000021#include "lldb/API/SBProcess.h"
22#include "lldb/API/SBSourceManager.h"
Caroline Tice98f930f2010-09-20 05:20:02 +000023#include "lldb/API/SBStream.h"
Caroline Tice6e4c5ce2010-09-04 00:03:46 +000024#include "lldb/API/SBStringList.h"
25#include "lldb/API/SBTarget.h"
26#include "lldb/API/SBThread.h"
Greg Clayton887aa282010-10-11 01:05:37 +000027#include "lldb/Core/Debugger.h"
28#include "lldb/Core/State.h"
29#include "lldb/Interpreter/Args.h"
30#include "lldb/Interpreter/CommandInterpreter.h"
31#include "lldb/Target/Process.h"
32#include "lldb/Target/TargetList.h"
Chris Lattner24943d22010-06-08 16:52:24 +000033
34using namespace lldb;
35using namespace lldb_private;
36
37void
38SBDebugger::Initialize ()
39{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +000040 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +000041
42 if (log)
43 log->Printf ("SBDebugger::Initialize ()");
44
Greg Claytone86cbb92011-03-22 01:14:58 +000045 SBCommandInterpreter::InitializeSWIG ();
46
Chris Lattner24943d22010-06-08 16:52:24 +000047 Debugger::Initialize();
48}
49
50void
51SBDebugger::Terminate ()
52{
53 Debugger::Terminate();
54}
55
Greg Clayton43490d12010-07-30 20:12:55 +000056void
57SBDebugger::Clear ()
58{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +000059 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +000060
61 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +000062 log->Printf ("SBDebugger(%p)::Clear ()", m_opaque_sp.get());
Caroline Ticec0446862010-12-20 18:35:50 +000063
64 if (m_opaque_sp)
65 m_opaque_sp->CleanUpInputReaders ();
Caroline Tice7826c882010-10-26 03:11:13 +000066
Greg Clayton43490d12010-07-30 20:12:55 +000067 m_opaque_sp.reset();
68}
69
Greg Clayton63094e02010-06-23 01:19:29 +000070SBDebugger
71SBDebugger::Create()
72{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +000073 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +000074
Greg Clayton63094e02010-06-23 01:19:29 +000075 SBDebugger debugger;
76 debugger.reset(Debugger::CreateInstance());
Caroline Tice7826c882010-10-26 03:11:13 +000077
78 if (log)
79 {
80 SBStream sstr;
81 debugger.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +000082 log->Printf ("SBDebugger::Create () => SBDebugger(%p): %s", debugger.m_opaque_sp.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +000083 }
84
Greg Clayton63094e02010-06-23 01:19:29 +000085 return debugger;
86}
87
Caroline Ticec4ed12f2011-01-22 01:02:07 +000088void
89SBDebugger::Destroy (SBDebugger &debugger)
90{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +000091 LogSP log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticec4ed12f2011-01-22 01:02:07 +000092
93 if (log)
94 {
95 SBStream sstr;
96 debugger.GetDescription (sstr);
97 log->Printf ("SBDebugger::Destroy () => SBDebugger(%p): %s", debugger.m_opaque_sp.get(), sstr.GetData());
98 }
99
100 Debugger::Destroy (debugger.m_opaque_sp);
101
102 if (debugger.m_opaque_sp.get() != NULL)
103 debugger.m_opaque_sp.reset();
104}
105
Greg Clayton63094e02010-06-23 01:19:29 +0000106SBDebugger::SBDebugger () :
107 m_opaque_sp ()
108{
109}
110
Greg Clayton538eb822010-11-05 23:17:00 +0000111SBDebugger::SBDebugger(const SBDebugger &rhs) :
112 m_opaque_sp (rhs.m_opaque_sp)
113{
114}
115
116SBDebugger &
117SBDebugger::operator = (const SBDebugger &rhs)
118{
119 if (this != &rhs)
120 {
121 m_opaque_sp = rhs.m_opaque_sp;
122 }
123 return *this;
124}
125
Greg Clayton63094e02010-06-23 01:19:29 +0000126SBDebugger::~SBDebugger ()
127{
128}
129
130bool
131SBDebugger::IsValid() const
132{
133 return m_opaque_sp.get() != NULL;
134}
135
136
Chris Lattner24943d22010-06-08 16:52:24 +0000137void
138SBDebugger::SetAsync (bool b)
139{
Greg Clayton63094e02010-06-23 01:19:29 +0000140 if (m_opaque_sp)
141 m_opaque_sp->SetAsyncExecution(b);
Chris Lattner24943d22010-06-08 16:52:24 +0000142}
143
Greg Clayton887aa282010-10-11 01:05:37 +0000144void
145SBDebugger::SkipLLDBInitFiles (bool b)
146{
147 if (m_opaque_sp)
148 m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles (b);
149}
150
Chris Lattner24943d22010-06-08 16:52:24 +0000151// Shouldn't really be settable after initialization as this could cause lots of problems; don't want users
152// trying to switch modes in the middle of a debugging session.
153void
154SBDebugger::SetInputFileHandle (FILE *fh, bool transfer_ownership)
155{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000156 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000157
158 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000159 log->Printf ("SBDebugger(%p)::SetInputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
160 fh, transfer_ownership);
Caroline Tice7826c882010-10-26 03:11:13 +0000161
Greg Clayton63094e02010-06-23 01:19:29 +0000162 if (m_opaque_sp)
163 m_opaque_sp->SetInputFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000164}
165
166void
167SBDebugger::SetOutputFileHandle (FILE *fh, bool transfer_ownership)
168{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000169 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000170
171
172 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000173 log->Printf ("SBDebugger(%p)::SetOutputFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
174 fh, transfer_ownership);
Caroline Tice7826c882010-10-26 03:11:13 +0000175
Greg Clayton63094e02010-06-23 01:19:29 +0000176 if (m_opaque_sp)
177 m_opaque_sp->SetOutputFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000178}
179
180void
181SBDebugger::SetErrorFileHandle (FILE *fh, bool transfer_ownership)
182{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000183 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000184
185
186 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000187 log->Printf ("SBDebugger(%p)::SetErrorFileHandle (fh=%p, transfer_ownership=%i)", m_opaque_sp.get(),
188 fh, transfer_ownership);
Caroline Tice7826c882010-10-26 03:11:13 +0000189
Greg Clayton63094e02010-06-23 01:19:29 +0000190 if (m_opaque_sp)
191 m_opaque_sp->SetErrorFileHandle (fh, transfer_ownership);
Chris Lattner24943d22010-06-08 16:52:24 +0000192}
193
194FILE *
195SBDebugger::GetInputFileHandle ()
196{
Greg Clayton63094e02010-06-23 01:19:29 +0000197 if (m_opaque_sp)
Greg Clayton58928562011-02-09 01:08:52 +0000198 return m_opaque_sp->GetInputFile().GetStream();
Greg Clayton63094e02010-06-23 01:19:29 +0000199 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000200}
201
202FILE *
203SBDebugger::GetOutputFileHandle ()
204{
Greg Clayton63094e02010-06-23 01:19:29 +0000205 if (m_opaque_sp)
Greg Clayton58928562011-02-09 01:08:52 +0000206 return m_opaque_sp->GetOutputFile().GetStream();
Greg Clayton63094e02010-06-23 01:19:29 +0000207 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000208}
209
210FILE *
211SBDebugger::GetErrorFileHandle ()
212{
Greg Clayton63094e02010-06-23 01:19:29 +0000213 if (m_opaque_sp)
Greg Clayton58928562011-02-09 01:08:52 +0000214 return m_opaque_sp->GetErrorFile().GetStream();
Greg Clayton63094e02010-06-23 01:19:29 +0000215 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000216}
217
218SBCommandInterpreter
219SBDebugger::GetCommandInterpreter ()
220{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000221 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000222
Greg Clayton63094e02010-06-23 01:19:29 +0000223 SBCommandInterpreter sb_interpreter;
224 if (m_opaque_sp)
225 sb_interpreter.reset (&m_opaque_sp->GetCommandInterpreter());
Caroline Tice7826c882010-10-26 03:11:13 +0000226
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000227 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000228 log->Printf ("SBDebugger(%p)::GetCommandInterpreter () => SBCommandInterpreter(%p)",
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000229 m_opaque_sp.get(), sb_interpreter.get());
230
Chris Lattner24943d22010-06-08 16:52:24 +0000231 return sb_interpreter;
232}
233
234void
235SBDebugger::HandleCommand (const char *command)
236{
Greg Clayton63094e02010-06-23 01:19:29 +0000237 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000238 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000239 TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
240 Mutex::Locker api_locker;
241 if (target_sp)
242 api_locker.Reset(target_sp->GetAPIMutex().GetMutex());
243
Greg Clayton63094e02010-06-23 01:19:29 +0000244 SBCommandInterpreter sb_interpreter(GetCommandInterpreter ());
245 SBCommandReturnObject result;
246
247 sb_interpreter.HandleCommand (command, result, false);
248
249 if (GetErrorFileHandle() != NULL)
250 result.PutError (GetErrorFileHandle());
251 if (GetOutputFileHandle() != NULL)
252 result.PutOutput (GetOutputFileHandle());
253
254 if (m_opaque_sp->GetAsyncExecution() == false)
Chris Lattner24943d22010-06-08 16:52:24 +0000255 {
Greg Clayton63094e02010-06-23 01:19:29 +0000256 SBProcess process(GetCommandInterpreter().GetProcess ());
257 if (process.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000258 {
Greg Clayton63094e02010-06-23 01:19:29 +0000259 EventSP event_sp;
260 Listener &lldb_listener = m_opaque_sp->GetListener();
261 while (lldb_listener.GetNextEventForBroadcaster (process.get(), event_sp))
262 {
263 SBEvent event(event_sp);
264 HandleProcessEvent (process, event, GetOutputFileHandle(), GetErrorFileHandle());
265 }
Chris Lattner24943d22010-06-08 16:52:24 +0000266 }
267 }
268 }
269}
270
271SBListener
272SBDebugger::GetListener ()
273{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000274 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000275
Greg Clayton63094e02010-06-23 01:19:29 +0000276 SBListener sb_listener;
277 if (m_opaque_sp)
278 sb_listener.reset(&m_opaque_sp->GetListener(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000279
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000280 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000281 log->Printf ("SBDebugger(%p)::GetListener () => SBListener(%p)", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000282 sb_listener.get());
283
Chris Lattner24943d22010-06-08 16:52:24 +0000284 return sb_listener;
285}
286
287void
288SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, FILE *out, FILE *err)
289{
Greg Claytonbdcda462010-12-20 20:49:23 +0000290 if (!process.IsValid())
291 return;
Chris Lattner24943d22010-06-08 16:52:24 +0000292
Greg Claytonbdcda462010-12-20 20:49:23 +0000293 const uint32_t event_type = event.GetType();
294 char stdio_buffer[1024];
295 size_t len;
Chris Lattner24943d22010-06-08 16:52:24 +0000296
Greg Claytonbdcda462010-12-20 20:49:23 +0000297 Mutex::Locker api_locker (process.GetTarget()->GetAPIMutex());
298
299 if (event_type & (Process::eBroadcastBitSTDOUT | Process::eBroadcastBitStateChanged))
Chris Lattner24943d22010-06-08 16:52:24 +0000300 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000301 // Drain stdout when we stop just in case we have any bytes
302 while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
303 if (out != NULL)
304 ::fwrite (stdio_buffer, 1, len, out);
305 }
306
307 if (event_type & (Process::eBroadcastBitSTDERR | Process::eBroadcastBitStateChanged))
308 {
309 // Drain stderr when we stop just in case we have any bytes
310 while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
311 if (err != NULL)
312 ::fwrite (stdio_buffer, 1, len, err);
313 }
314
315 if (event_type & Process::eBroadcastBitStateChanged)
316 {
317 StateType event_state = SBProcess::GetStateFromEvent (event);
318
319 if (event_state == eStateInvalid)
320 return;
321
322 bool is_stopped = StateIsStoppedState (event_state);
323 if (!is_stopped)
324 process.ReportEventState (event, out);
Chris Lattner24943d22010-06-08 16:52:24 +0000325 }
326}
327
Chris Lattner24943d22010-06-08 16:52:24 +0000328SBSourceManager &
329SBDebugger::GetSourceManager ()
330{
331 static SourceManager g_lldb_source_manager;
Greg Clayton538eb822010-11-05 23:17:00 +0000332 static SBSourceManager g_sb_source_manager (&g_lldb_source_manager);
Chris Lattner24943d22010-06-08 16:52:24 +0000333 return g_sb_source_manager;
334}
335
336
337bool
338SBDebugger::GetDefaultArchitecture (char *arch_name, size_t arch_name_len)
339{
340 if (arch_name && arch_name_len)
341 {
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000342 ArchSpec default_arch = Target::GetDefaultArchitecture ();
Caroline Tice5bc8c972010-09-20 20:44:43 +0000343
Chris Lattner24943d22010-06-08 16:52:24 +0000344 if (default_arch.IsValid())
345 {
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000346 const std::string &triple_str = default_arch.GetTriple().str();
347 if (!triple_str.empty())
348 ::snprintf (arch_name, arch_name_len, "%s", triple_str.c_str());
349 else
350 ::snprintf (arch_name, arch_name_len, "%s", default_arch.GetArchitectureName());
Chris Lattner24943d22010-06-08 16:52:24 +0000351 return true;
352 }
353 }
354 if (arch_name && arch_name_len)
355 arch_name[0] = '\0';
356 return false;
357}
358
359
360bool
361SBDebugger::SetDefaultArchitecture (const char *arch_name)
362{
363 if (arch_name)
364 {
Greg Claytonf15996e2011-04-07 22:46:35 +0000365 ArchSpec arch (arch_name, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000366 if (arch.IsValid())
367 {
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000368 Target::SetDefaultArchitecture (arch);
Chris Lattner24943d22010-06-08 16:52:24 +0000369 return true;
370 }
371 }
372 return false;
373}
374
375ScriptLanguage
376SBDebugger::GetScriptingLanguage (const char *script_language_name)
377{
Greg Claytonbdcda462010-12-20 20:49:23 +0000378
Chris Lattner24943d22010-06-08 16:52:24 +0000379 return Args::StringToScriptLanguage (script_language_name,
380 eScriptLanguageDefault,
381 NULL);
382}
Chris Lattner24943d22010-06-08 16:52:24 +0000383
384const char *
385SBDebugger::GetVersionString ()
386{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000387 return GetVersion();
Chris Lattner24943d22010-06-08 16:52:24 +0000388}
389
390const char *
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000391SBDebugger::StateAsCString (StateType state)
Chris Lattner24943d22010-06-08 16:52:24 +0000392{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000393 return StateAsCString (state);
Chris Lattner24943d22010-06-08 16:52:24 +0000394}
395
396bool
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000397SBDebugger::StateIsRunningState (StateType state)
Chris Lattner24943d22010-06-08 16:52:24 +0000398{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000399 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000400
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000401 const bool result = StateIsRunningState (state);
Greg Claytona66ba462010-10-30 04:51:46 +0000402 if (log)
403 log->Printf ("SBDebugger::StateIsRunningState (state=%s) => %i",
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000404 StateAsCString (state), result);
Greg Claytona66ba462010-10-30 04:51:46 +0000405
406 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000407}
408
409bool
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000410SBDebugger::StateIsStoppedState (StateType state)
Chris Lattner24943d22010-06-08 16:52:24 +0000411{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000412 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000413
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000414 const bool result = StateIsStoppedState (state);
Caroline Tice7826c882010-10-26 03:11:13 +0000415 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000416 log->Printf ("SBDebugger::StateIsStoppedState (state=%s) => %i",
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000417 StateAsCString (state), result);
Caroline Tice7826c882010-10-26 03:11:13 +0000418
Greg Claytona66ba462010-10-30 04:51:46 +0000419 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000420}
421
422
423SBTarget
424SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename,
425 const char *target_triple)
426{
Greg Clayton63094e02010-06-23 01:19:29 +0000427 SBTarget target;
428 if (m_opaque_sp)
429 {
430 ArchSpec arch;
Greg Clayton537a7a82010-10-20 20:54:39 +0000431 FileSpec file_spec (filename, true);
Greg Claytonf15996e2011-04-07 22:46:35 +0000432 arch.SetTriple (target_triple, m_opaque_sp->GetPlatformList().GetSelectedPlatform().get());
Greg Clayton63094e02010-06-23 01:19:29 +0000433 TargetSP target_sp;
Greg Claytone4b9c1f2011-03-08 22:40:15 +0000434 Error error (m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file_spec, arch, true, target_sp));
Greg Clayton63094e02010-06-23 01:19:29 +0000435 target.reset (target_sp);
436 }
Greg Claytona66ba462010-10-30 04:51:46 +0000437
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000438 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000439 if (log)
440 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000441 log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndTargetTriple (filename=\"%s\", triple=%s) => SBTarget(%p)",
Greg Claytona66ba462010-10-30 04:51:46 +0000442 m_opaque_sp.get(), filename, target_triple, target.get());
443 }
444
Chris Lattner24943d22010-06-08 16:52:24 +0000445 return target;
446}
447
448SBTarget
Greg Clayton940b1032011-02-23 00:35:02 +0000449SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *arch_cstr)
Chris Lattner24943d22010-06-08 16:52:24 +0000450{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000451 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000452
Greg Clayton63094e02010-06-23 01:19:29 +0000453 SBTarget target;
454 if (m_opaque_sp)
455 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000456 FileSpec file (filename, true);
Greg Clayton940b1032011-02-23 00:35:02 +0000457 ArchSpec arch;
Greg Clayton63094e02010-06-23 01:19:29 +0000458 TargetSP target_sp;
459 Error error;
Chris Lattner24943d22010-06-08 16:52:24 +0000460
Greg Clayton940b1032011-02-23 00:35:02 +0000461 if (arch_cstr)
Greg Claytonf15996e2011-04-07 22:46:35 +0000462 arch.SetTriple (arch_cstr, m_opaque_sp->GetPlatformList().GetSelectedPlatform().get());
Greg Clayton940b1032011-02-23 00:35:02 +0000463
Greg Claytone4b9c1f2011-03-08 22:40:15 +0000464 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, true, target_sp);
Greg Clayton63094e02010-06-23 01:19:29 +0000465
466 if (error.Success())
467 {
Jim Inghamc8332952010-08-26 21:32:51 +0000468 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Clayton63094e02010-06-23 01:19:29 +0000469 target.reset(target_sp);
470 }
Chris Lattner24943d22010-06-08 16:52:24 +0000471 }
Caroline Tice7826c882010-10-26 03:11:13 +0000472
473 if (log)
474 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000475 log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndArch (filename=\"%s\", arch=%s) => SBTarget(%p)",
Greg Clayton940b1032011-02-23 00:35:02 +0000476 m_opaque_sp.get(), filename, arch_cstr, target.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000477 }
478
Greg Clayton63094e02010-06-23 01:19:29 +0000479 return target;
480}
481
482SBTarget
483SBDebugger::CreateTarget (const char *filename)
484{
485 SBTarget target;
486 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000487 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000488 FileSpec file (filename, true);
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000489 ArchSpec arch = Target::GetDefaultArchitecture ();
Greg Clayton63094e02010-06-23 01:19:29 +0000490 TargetSP target_sp;
491 Error error;
492
Greg Claytone4b9c1f2011-03-08 22:40:15 +0000493 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, true, target_sp);
Greg Clayton63094e02010-06-23 01:19:29 +0000494
495 if (error.Success())
496 {
Jim Inghamc8332952010-08-26 21:32:51 +0000497 m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
Greg Clayton63094e02010-06-23 01:19:29 +0000498 target.reset (target_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000499 }
500 }
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000501 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000502 if (log)
503 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000504 log->Printf ("SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)",
Greg Claytona66ba462010-10-30 04:51:46 +0000505 m_opaque_sp.get(), filename, target.get());
506 }
Greg Clayton63094e02010-06-23 01:19:29 +0000507 return target;
Chris Lattner24943d22010-06-08 16:52:24 +0000508}
509
510SBTarget
511SBDebugger::GetTargetAtIndex (uint32_t idx)
512{
Greg Clayton63094e02010-06-23 01:19:29 +0000513 SBTarget sb_target;
514 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000515 {
516 // No need to lock, the target list is thread safe
Greg Clayton63094e02010-06-23 01:19:29 +0000517 sb_target.reset(m_opaque_sp->GetTargetList().GetTargetAtIndex (idx));
Greg Claytonbdcda462010-12-20 20:49:23 +0000518 }
Chris Lattner24943d22010-06-08 16:52:24 +0000519 return sb_target;
520}
521
522SBTarget
523SBDebugger::FindTargetWithProcessID (pid_t pid)
524{
Greg Clayton63094e02010-06-23 01:19:29 +0000525 SBTarget sb_target;
526 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000527 {
528 // No need to lock, the target list is thread safe
Greg Clayton63094e02010-06-23 01:19:29 +0000529 sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid));
Greg Claytonbdcda462010-12-20 20:49:23 +0000530 }
Chris Lattner24943d22010-06-08 16:52:24 +0000531 return sb_target;
532}
533
534SBTarget
535SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name)
536{
Greg Clayton63094e02010-06-23 01:19:29 +0000537 SBTarget sb_target;
538 if (m_opaque_sp && filename && filename[0])
539 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000540 // No need to lock, the target list is thread safe
Greg Claytonf15996e2011-04-07 22:46:35 +0000541 ArchSpec arch (arch_name, m_opaque_sp->GetPlatformList().GetSelectedPlatform().get());
Greg Clayton537a7a82010-10-20 20:54:39 +0000542 TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename, false), arch_name ? &arch : NULL));
Greg Clayton63094e02010-06-23 01:19:29 +0000543 sb_target.reset(target_sp);
544 }
545 return sb_target;
Chris Lattner24943d22010-06-08 16:52:24 +0000546}
547
548SBTarget
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000549SBDebugger::FindTargetWithLLDBProcess (const ProcessSP &process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000550{
Greg Clayton63094e02010-06-23 01:19:29 +0000551 SBTarget sb_target;
552 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000553 {
554 // No need to lock, the target list is thread safe
Greg Clayton63094e02010-06-23 01:19:29 +0000555 sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get()));
Greg Claytonbdcda462010-12-20 20:49:23 +0000556 }
Chris Lattner24943d22010-06-08 16:52:24 +0000557 return sb_target;
558}
559
560
561uint32_t
562SBDebugger::GetNumTargets ()
563{
Greg Clayton63094e02010-06-23 01:19:29 +0000564 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000565 {
566 // No need to lock, the target list is thread safe
Greg Clayton63094e02010-06-23 01:19:29 +0000567 return m_opaque_sp->GetTargetList().GetNumTargets ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000568 }
Greg Clayton63094e02010-06-23 01:19:29 +0000569 return 0;
570}
Chris Lattner24943d22010-06-08 16:52:24 +0000571
572SBTarget
Jim Inghamc8332952010-08-26 21:32:51 +0000573SBDebugger::GetSelectedTarget ()
Chris Lattner24943d22010-06-08 16:52:24 +0000574{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000575 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000576
Greg Clayton63094e02010-06-23 01:19:29 +0000577 SBTarget sb_target;
578 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000579 {
580 // No need to lock, the target list is thread safe
Jim Inghamc8332952010-08-26 21:32:51 +0000581 sb_target.reset(m_opaque_sp->GetTargetList().GetSelectedTarget ());
Greg Claytonbdcda462010-12-20 20:49:23 +0000582 }
Caroline Tice7826c882010-10-26 03:11:13 +0000583
584 if (log)
585 {
586 SBStream sstr;
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000587 sb_target.GetDescription (sstr, eDescriptionLevelBrief);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000588 log->Printf ("SBDebugger(%p)::GetSelectedTarget () => SBTarget(%p): %s", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000589 sb_target.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000590 }
591
Chris Lattner24943d22010-06-08 16:52:24 +0000592 return sb_target;
593}
594
595void
596SBDebugger::DispatchInput (void *baton, const void *data, size_t data_len)
597{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000598 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000599
600 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000601 log->Printf ("SBDebugger(%p)::DispatchInput (baton=%p, data=\"%.*s\", size_t=%zu)", m_opaque_sp.get(),
602 baton, (int) data_len, (const char *) data, data_len);
Caroline Tice7826c882010-10-26 03:11:13 +0000603
Greg Clayton63094e02010-06-23 01:19:29 +0000604 if (m_opaque_sp)
605 m_opaque_sp->DispatchInput ((const char *) data, data_len);
Chris Lattner24943d22010-06-08 16:52:24 +0000606}
607
608void
Caroline Ticec4f55fe2010-11-19 20:47:54 +0000609SBDebugger::DispatchInputInterrupt ()
610{
611 if (m_opaque_sp)
612 m_opaque_sp->DispatchInputInterrupt ();
613}
614
615void
616SBDebugger::DispatchInputEndOfFile ()
617{
618 if (m_opaque_sp)
619 m_opaque_sp->DispatchInputEndOfFile ();
620}
621
622void
Chris Lattner24943d22010-06-08 16:52:24 +0000623SBDebugger::PushInputReader (SBInputReader &reader)
624{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000625 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000626
627 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000628 log->Printf ("SBDebugger(%p)::PushInputReader (SBInputReader(%p))", m_opaque_sp.get(), &reader);
Caroline Tice7826c882010-10-26 03:11:13 +0000629
Greg Clayton63094e02010-06-23 01:19:29 +0000630 if (m_opaque_sp && reader.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000631 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000632 TargetSP target_sp (m_opaque_sp->GetSelectedTarget());
633 Mutex::Locker api_locker;
634 if (target_sp)
635 api_locker.Reset(target_sp->GetAPIMutex().GetMutex());
Chris Lattner24943d22010-06-08 16:52:24 +0000636 InputReaderSP reader_sp(*reader);
Greg Clayton63094e02010-06-23 01:19:29 +0000637 m_opaque_sp->PushInputReader (reader_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000638 }
639}
Greg Clayton63094e02010-06-23 01:19:29 +0000640
641void
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000642SBDebugger::reset (const DebuggerSP &debugger_sp)
Greg Clayton63094e02010-06-23 01:19:29 +0000643{
644 m_opaque_sp = debugger_sp;
645}
646
647Debugger *
648SBDebugger::get () const
649{
650 return m_opaque_sp.get();
651}
652
653Debugger &
654SBDebugger::ref () const
655{
656 assert (m_opaque_sp.get());
657 return *m_opaque_sp;
658}
659
660
Caroline Tice558be582010-06-30 16:22:25 +0000661SBDebugger
662SBDebugger::FindDebuggerWithID (int id)
663{
Greg Claytonbdcda462010-12-20 20:49:23 +0000664 // No need to lock, the debugger list is thread safe
Caroline Tice558be582010-06-30 16:22:25 +0000665 SBDebugger sb_debugger;
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000666 DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id);
Caroline Tice558be582010-06-30 16:22:25 +0000667 if (debugger_sp)
668 sb_debugger.reset (debugger_sp);
669 return sb_debugger;
670}
Jim Ingham74989e82010-08-30 19:44:40 +0000671
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000672const char *
673SBDebugger::GetInstanceName()
674{
675 if (m_opaque_sp)
676 return m_opaque_sp->GetInstanceName().AsCString();
677 else
678 return NULL;
679}
680
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000681SBError
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000682SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000683{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000684 UserSettingsControllerSP root_settings_controller = Debugger::GetSettingsController();
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000685
Greg Claytonb3448432011-03-24 21:19:54 +0000686 Error err = root_settings_controller->SetVariable (var_name,
687 value,
688 eVarSetOperationAssign,
689 true,
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000690 debugger_instance_name);
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000691 SBError sb_error;
692 sb_error.SetError (err);
693
694 return sb_error;
695}
696
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000697SBStringList
Caroline Ticeb8314fe2010-09-09 17:45:09 +0000698SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name)
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000699{
700 SBStringList ret_value;
Greg Claytonb3448432011-03-24 21:19:54 +0000701 SettableVariableType var_type;
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000702 Error err;
Caroline Tice1d2aefd2010-09-09 06:25:08 +0000703
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000704 UserSettingsControllerSP root_settings_controller = Debugger::GetSettingsController();
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000705
Caroline Tice5bc8c972010-09-20 20:44:43 +0000706 StringList value = root_settings_controller->GetVariable (var_name, var_type, debugger_instance_name, err);
707
708 if (err.Success())
709 {
710 for (unsigned i = 0; i != value.GetSize(); ++i)
711 ret_value.AppendString (value.GetStringAtIndex(i));
712 }
713 else
714 {
715 ret_value.AppendString (err.AsCString());
716 }
717
Caroline Tice6e4c5ce2010-09-04 00:03:46 +0000718
719 return ret_value;
720}
721
Greg Clayton238c0a12010-09-18 01:14:36 +0000722uint32_t
723SBDebugger::GetTerminalWidth () const
724{
725 if (m_opaque_sp)
726 return m_opaque_sp->GetTerminalWidth ();
727 return 0;
728}
729
730void
731SBDebugger::SetTerminalWidth (uint32_t term_width)
732{
733 if (m_opaque_sp)
734 m_opaque_sp->SetTerminalWidth (term_width);
735}
736
737const char *
738SBDebugger::GetPrompt() const
739{
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000740 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000741
742 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000743 log->Printf ("SBDebugger(%p)::GetPrompt () => \"%s\"", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000744 (m_opaque_sp ? m_opaque_sp->GetPrompt() : ""));
Caroline Tice7826c882010-10-26 03:11:13 +0000745
Greg Clayton238c0a12010-09-18 01:14:36 +0000746 if (m_opaque_sp)
747 return m_opaque_sp->GetPrompt ();
748 return 0;
749}
750
751void
752SBDebugger::SetPrompt (const char *prompt)
753{
754 if (m_opaque_sp)
755 m_opaque_sp->SetPrompt (prompt);
756}
757
758
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000759ScriptLanguage
Greg Clayton238c0a12010-09-18 01:14:36 +0000760SBDebugger::GetScriptLanguage() const
761{
762 if (m_opaque_sp)
763 return m_opaque_sp->GetScriptLanguage ();
764 return eScriptLanguageNone;
765}
766
767void
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000768SBDebugger::SetScriptLanguage (ScriptLanguage script_lang)
Greg Clayton238c0a12010-09-18 01:14:36 +0000769{
770 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000771 {
Greg Clayton238c0a12010-09-18 01:14:36 +0000772 m_opaque_sp->SetScriptLanguage (script_lang);
Greg Claytonbdcda462010-12-20 20:49:23 +0000773 }
Greg Clayton238c0a12010-09-18 01:14:36 +0000774}
775
Jim Ingham74989e82010-08-30 19:44:40 +0000776bool
777SBDebugger::SetUseExternalEditor (bool value)
778{
779 if (m_opaque_sp)
780 return m_opaque_sp->SetUseExternalEditor (value);
Greg Claytonbdcda462010-12-20 20:49:23 +0000781 return false;
Jim Ingham74989e82010-08-30 19:44:40 +0000782}
783
784bool
Caroline Tice5bc8c972010-09-20 20:44:43 +0000785SBDebugger::GetUseExternalEditor ()
Jim Ingham74989e82010-08-30 19:44:40 +0000786{
787 if (m_opaque_sp)
Caroline Tice5bc8c972010-09-20 20:44:43 +0000788 return m_opaque_sp->GetUseExternalEditor ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000789 return false;
Jim Ingham74989e82010-08-30 19:44:40 +0000790}
791
Caroline Tice98f930f2010-09-20 05:20:02 +0000792bool
793SBDebugger::GetDescription (SBStream &description)
794{
795 if (m_opaque_sp)
796 {
797 const char *name = m_opaque_sp->GetInstanceName().AsCString();
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000798 user_id_t id = m_opaque_sp->GetID();
Greg Clayton49ce6822010-10-31 03:01:06 +0000799 description.Printf ("Debugger (instance: \"%s\", id: %d)", name, id);
Caroline Tice98f930f2010-09-20 05:20:02 +0000800 }
801 else
802 description.Printf ("No value");
803
804 return true;
805}
Caroline Ticec4f55fe2010-11-19 20:47:54 +0000806
Greg Clayton9ce9c3c2011-04-18 23:15:17 +0000807user_id_t
Caroline Ticec4f55fe2010-11-19 20:47:54 +0000808SBDebugger::GetID()
809{
810 if (m_opaque_sp)
811 return m_opaque_sp->GetID();
812 return LLDB_INVALID_UID;
813}