blob: 03333d940eb412aca2edcd28cccff3007247db98 [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- SBTarget.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 Friedman7a62c8b2010-06-09 07:44:37 +000010#include "lldb/API/SBTarget.h"
Chris Lattner24943d22010-06-08 16:52:24 +000011
Greg Claytonb3448432011-03-24 21:19:54 +000012#include "lldb/lldb-public.h"
Chris Lattner24943d22010-06-08 16:52:24 +000013
14#include "lldb/API/SBFileSpec.h"
15#include "lldb/API/SBModule.h"
Caroline Tice98f930f2010-09-20 05:20:02 +000016#include "lldb/API/SBStream.h"
Chris Lattner24943d22010-06-08 16:52:24 +000017#include "lldb/Breakpoint/BreakpointID.h"
18#include "lldb/Breakpoint/BreakpointIDList.h"
19#include "lldb/Breakpoint/BreakpointList.h"
20#include "lldb/Breakpoint/BreakpointLocation.h"
21#include "lldb/Core/Address.h"
22#include "lldb/Core/AddressResolver.h"
23#include "lldb/Core/AddressResolverName.h"
Jim Ingham84cdc152010-06-15 19:49:27 +000024#include "lldb/Interpreter/Args.h"
Chris Lattner24943d22010-06-08 16:52:24 +000025#include "lldb/Core/ArchSpec.h"
26#include "lldb/Core/Debugger.h"
27#include "lldb/Core/Disassembler.h"
Greg Clayton5f54ac32011-02-08 05:05:52 +000028#include "lldb/Host/FileSpec.h"
Caroline Tice7826c882010-10-26 03:11:13 +000029#include "lldb/Core/Log.h"
Chris Lattner24943d22010-06-08 16:52:24 +000030#include "lldb/Core/RegularExpression.h"
31#include "lldb/Core/SearchFilter.h"
32#include "lldb/Core/STLUtils.h"
Greg Claytoncd548032011-02-01 01:31:41 +000033#include "lldb/Host/Host.h"
Chris Lattner24943d22010-06-08 16:52:24 +000034#include "lldb/Target/Process.h"
35#include "lldb/Target/Target.h"
36#include "lldb/Target/TargetList.h"
37
38#include "lldb/Interpreter/CommandReturnObject.h"
39#include "../source/Commands/CommandObjectBreakpoint.h"
40
Eli Friedman7a62c8b2010-06-09 07:44:37 +000041#include "lldb/API/SBDebugger.h"
42#include "lldb/API/SBProcess.h"
43#include "lldb/API/SBListener.h"
44#include "lldb/API/SBBreakpoint.h"
Chris Lattner24943d22010-06-08 16:52:24 +000045
46using namespace lldb;
47using namespace lldb_private;
48
49#define DEFAULT_DISASM_BYTE_SIZE 32
50
51//----------------------------------------------------------------------
52// SBTarget constructor
53//----------------------------------------------------------------------
Greg Claytonc3b61d22010-12-15 05:08:08 +000054SBTarget::SBTarget () :
55 m_opaque_sp ()
Chris Lattner24943d22010-06-08 16:52:24 +000056{
57}
58
59SBTarget::SBTarget (const SBTarget& rhs) :
Greg Clayton63094e02010-06-23 01:19:29 +000060 m_opaque_sp (rhs.m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000061{
62}
63
64SBTarget::SBTarget(const TargetSP& target_sp) :
Greg Clayton63094e02010-06-23 01:19:29 +000065 m_opaque_sp (target_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000066{
67}
68
Greg Clayton538eb822010-11-05 23:17:00 +000069const SBTarget&
70SBTarget::operator = (const SBTarget& rhs)
71{
72 if (this != &rhs)
73 m_opaque_sp = rhs.m_opaque_sp;
74 return *this;
75}
76
Chris Lattner24943d22010-06-08 16:52:24 +000077//----------------------------------------------------------------------
78// Destructor
79//----------------------------------------------------------------------
80SBTarget::~SBTarget()
81{
82}
83
84bool
85SBTarget::IsValid () const
86{
Greg Clayton63094e02010-06-23 01:19:29 +000087 return m_opaque_sp.get() != NULL;
Chris Lattner24943d22010-06-08 16:52:24 +000088}
89
90SBProcess
91SBTarget::GetProcess ()
92{
Caroline Tice7826c882010-10-26 03:11:13 +000093
Chris Lattner24943d22010-06-08 16:52:24 +000094 SBProcess sb_process;
Greg Clayton63094e02010-06-23 01:19:29 +000095 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +000096 {
97 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +000098 sb_process.SetProcess (m_opaque_sp->GetProcessSP());
Greg Claytonbdcda462010-12-20 20:49:23 +000099 }
Caroline Tice7826c882010-10-26 03:11:13 +0000100
Greg Claytone005f2c2010-11-06 01:53:30 +0000101 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000102 if (log)
103 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000104 log->Printf ("SBTarget(%p)::GetProcess () => SBProcess(%p)",
105 m_opaque_sp.get(), sb_process.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000106 }
107
Chris Lattner24943d22010-06-08 16:52:24 +0000108 return sb_process;
109}
110
Greg Clayton63094e02010-06-23 01:19:29 +0000111SBDebugger
112SBTarget::GetDebugger () const
113{
114 SBDebugger debugger;
115 if (m_opaque_sp)
116 debugger.reset (m_opaque_sp->GetDebugger().GetSP());
117 return debugger;
118}
119
Jim Inghamb5871fe2011-03-31 00:01:24 +0000120SBProcess
121SBTarget::LaunchSimple
122(
123 char const **argv,
124 char const **envp,
125 const char *working_directory
126)
127{
128 char *stdin_path = NULL;
129 char *stdout_path = NULL;
130 char *stderr_path = NULL;
131 uint32_t launch_flags = 0;
132 bool stop_at_entry = false;
133 SBError error;
134 SBListener listener = GetDebugger().GetListener();
135 return Launch (listener,
136 argv,
137 envp,
138 stdin_path,
139 stdout_path,
140 stderr_path,
141 working_directory,
142 launch_flags,
143 stop_at_entry,
144 error);
145}
Greg Claytonde915be2011-01-23 05:56:20 +0000146
147SBProcess
148SBTarget::Launch
149(
Greg Clayton271a5db2011-02-03 21:28:34 +0000150 SBListener &listener,
Greg Claytonde915be2011-01-23 05:56:20 +0000151 char const **argv,
152 char const **envp,
153 const char *stdin_path,
154 const char *stdout_path,
155 const char *stderr_path,
156 const char *working_directory,
157 uint32_t launch_flags, // See LaunchFlags
158 bool stop_at_entry,
159 lldb::SBError& error
160)
161{
Greg Claytone005f2c2010-11-06 01:53:30 +0000162 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000163
164 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000165 {
Greg Claytonde915be2011-01-23 05:56:20 +0000166 log->Printf ("SBTarget(%p)::Launch (argv=%p, envp=%p, stdin=%s, stdout=%s, stderr=%s, working-dir=%s, launch_flags=0x%x, stop_at_entry=%i, &error (%p))...",
167 m_opaque_sp.get(),
168 argv,
169 envp,
170 stdin_path ? stdin_path : "NULL",
171 stdout_path ? stdout_path : "NULL",
172 stderr_path ? stderr_path : "NULL",
173 working_directory ? working_directory : "NULL",
174 launch_flags,
175 stop_at_entry,
176 error.get());
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000177 }
Greg Clayton1a3083a2010-10-06 03:53:16 +0000178 SBProcess sb_process;
179 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000180 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000181 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton1a3083a2010-10-06 03:53:16 +0000182
Greg Clayton7c330d62011-01-27 01:01:10 +0000183 if (getenv("LLDB_LAUNCH_FLAG_DISABLE_ASLR"))
184 launch_flags |= eLaunchFlagDisableASLR;
185
Greg Clayton180546b2011-04-30 01:09:13 +0000186 StateType state = eStateInvalid;
187 sb_process.SetProcess (m_opaque_sp->GetProcessSP());
188 if (sb_process.IsValid())
Greg Clayton28d5fcc2011-01-27 06:44:37 +0000189 {
Greg Clayton180546b2011-04-30 01:09:13 +0000190 state = sb_process->GetState();
191
192 if (sb_process->IsAlive() && state != eStateConnected)
193 {
194 if (state == eStateAttaching)
195 error.SetErrorString ("process attach is in progress");
196 else
197 error.SetErrorString ("a process is already being debugged");
198 sb_process.Clear();
199 return sb_process;
200 }
Greg Clayton28d5fcc2011-01-27 06:44:37 +0000201 }
202
Greg Clayton180546b2011-04-30 01:09:13 +0000203 if (state == eStateConnected)
204 {
205 // If we are already connected, then we have already specified the
206 // listener, so if a valid listener is supplied, we need to error out
207 // to let the client know.
208 if (listener.IsValid())
209 {
210 error.SetErrorString ("process is connected and already has a listener, pass empty listener");
211 sb_process.Clear();
212 return sb_process;
213 }
214 }
215 else
Greg Claytonc5f728c2010-10-06 22:10:17 +0000216 {
Greg Clayton271a5db2011-02-03 21:28:34 +0000217 if (listener.IsValid())
218 sb_process.SetProcess (m_opaque_sp->CreateProcess (listener.ref()));
219 else
220 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
Greg Clayton180546b2011-04-30 01:09:13 +0000221 }
Greg Clayton7c330d62011-01-27 01:01:10 +0000222
Greg Clayton180546b2011-04-30 01:09:13 +0000223 if (sb_process.IsValid())
224 {
225 if (getenv("LLDB_LAUNCH_FLAG_DISABLE_STDIO"))
226 launch_flags |= eLaunchFlagDisableSTDIO;
227
228 error.SetError (sb_process->Launch (argv, envp, launch_flags, stdin_path, stdout_path, stderr_path, working_directory));
229 if (error.Success())
Greg Clayton7c330d62011-01-27 01:01:10 +0000230 {
Greg Clayton180546b2011-04-30 01:09:13 +0000231 // We we are stopping at the entry point, we can return now!
232 if (stop_at_entry)
233 return sb_process;
Greg Clayton7c330d62011-01-27 01:01:10 +0000234
Greg Clayton180546b2011-04-30 01:09:13 +0000235 // Make sure we are stopped at the entry
236 StateType state = sb_process->WaitForProcessToStop (NULL);
237 if (state == eStateStopped)
Greg Clayton7c330d62011-01-27 01:01:10 +0000238 {
Greg Clayton180546b2011-04-30 01:09:13 +0000239 // resume the process to skip the entry point
240 error.SetError (sb_process->Resume());
241 if (error.Success())
Greg Clayton7c330d62011-01-27 01:01:10 +0000242 {
Greg Clayton180546b2011-04-30 01:09:13 +0000243 // If we are doing synchronous mode, then wait for the
244 // process to stop yet again!
245 if (m_opaque_sp->GetDebugger().GetAsyncExecution () == false)
246 sb_process->WaitForProcessToStop (NULL);
Greg Clayton7c330d62011-01-27 01:01:10 +0000247 }
248 }
249 }
Greg Clayton180546b2011-04-30 01:09:13 +0000250 }
251 else
252 {
253 error.SetErrorString ("unable to create lldb_private::Process");
Greg Claytonc5f728c2010-10-06 22:10:17 +0000254 }
255 }
256 else
257 {
258 error.SetErrorString ("SBTarget is invalid");
Chris Lattner24943d22010-06-08 16:52:24 +0000259 }
Caroline Tice7826c882010-10-26 03:11:13 +0000260
Caroline Tice926060e2010-10-29 21:48:37 +0000261 log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +0000262 if (log)
263 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000264 log->Printf ("SBTarget(%p)::Launch (...) => SBProceess(%p)",
265 m_opaque_sp.get(), sb_process.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000266 }
267
Greg Clayton1a3083a2010-10-06 03:53:16 +0000268 return sb_process;
Chris Lattner24943d22010-06-08 16:52:24 +0000269}
270
Greg Claytonc5f728c2010-10-06 22:10:17 +0000271
272lldb::SBProcess
Greg Claytond8c62532010-10-07 04:19:01 +0000273SBTarget::AttachToProcessWithID
Greg Claytonc5f728c2010-10-06 22:10:17 +0000274(
Greg Clayton271a5db2011-02-03 21:28:34 +0000275 SBListener &listener,
Greg Claytonc5f728c2010-10-06 22:10:17 +0000276 lldb::pid_t pid,// The process ID to attach to
277 SBError& error // An error explaining what went wrong if attach fails
278)
279{
280 SBProcess sb_process;
281 if (m_opaque_sp)
282 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000283 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton271a5db2011-02-03 21:28:34 +0000284 if (listener.IsValid())
285 sb_process.SetProcess (m_opaque_sp->CreateProcess (listener.ref()));
286 else
287 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
288
Greg Claytonc5f728c2010-10-06 22:10:17 +0000289
290 if (sb_process.IsValid())
291 {
292 error.SetError (sb_process->Attach (pid));
Johnny Chen535960e2011-06-17 00:51:15 +0000293 // If we are doing synchronous mode, then wait for the
294 // process to stop!
295 if (m_opaque_sp->GetDebugger().GetAsyncExecution () == false)
296 sb_process->WaitForProcessToStop (NULL);
Greg Claytonc5f728c2010-10-06 22:10:17 +0000297 }
298 else
299 {
300 error.SetErrorString ("unable to create lldb_private::Process");
301 }
302 }
303 else
304 {
305 error.SetErrorString ("SBTarget is invalid");
306 }
307 return sb_process;
308
309}
310
311lldb::SBProcess
Greg Claytond8c62532010-10-07 04:19:01 +0000312SBTarget::AttachToProcessWithName
Greg Claytonc5f728c2010-10-06 22:10:17 +0000313(
Greg Clayton271a5db2011-02-03 21:28:34 +0000314 SBListener &listener,
Greg Claytonc5f728c2010-10-06 22:10:17 +0000315 const char *name, // basename of process to attach to
316 bool wait_for, // if true wait for a new instance of "name" to be launched
317 SBError& error // An error explaining what went wrong if attach fails
318)
319{
320 SBProcess sb_process;
321 if (m_opaque_sp)
322 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000323 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
324
Greg Clayton271a5db2011-02-03 21:28:34 +0000325 if (listener.IsValid())
326 sb_process.SetProcess (m_opaque_sp->CreateProcess (listener.ref()));
327 else
328 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
Greg Claytonc5f728c2010-10-06 22:10:17 +0000329
330 if (sb_process.IsValid())
331 {
332 error.SetError (sb_process->Attach (name, wait_for));
Johnny Chen58d02ff2011-06-17 19:21:30 +0000333 // If we are doing synchronous mode, then wait for the
334 // process to stop!
335 if (m_opaque_sp->GetDebugger().GetAsyncExecution () == false)
336 sb_process->WaitForProcessToStop (NULL);
Greg Claytonc5f728c2010-10-06 22:10:17 +0000337 }
338 else
339 {
340 error.SetErrorString ("unable to create lldb_private::Process");
341 }
342 }
343 else
344 {
345 error.SetErrorString ("SBTarget is invalid");
346 }
347 return sb_process;
348
349}
350
James McIlree38093402011-03-04 00:31:13 +0000351lldb::SBProcess
352SBTarget::ConnectRemote
353(
354 SBListener &listener,
355 const char *url,
356 const char *plugin_name,
357 SBError& error
358)
359{
360 SBProcess sb_process;
361 if (m_opaque_sp)
362 {
363 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
364 if (listener.IsValid())
365 sb_process.SetProcess (m_opaque_sp->CreateProcess (listener.ref(), plugin_name));
366 else
367 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener(), plugin_name));
368
369
370 if (sb_process.IsValid())
371 {
372 error.SetError (sb_process->ConnectRemote (url));
373 }
374 else
375 {
376 error.SetErrorString ("unable to create lldb_private::Process");
377 }
378 }
379 else
380 {
381 error.SetErrorString ("SBTarget is invalid");
382 }
383 return sb_process;
384}
385
Chris Lattner24943d22010-06-08 16:52:24 +0000386SBFileSpec
387SBTarget::GetExecutable ()
388{
Caroline Tice7826c882010-10-26 03:11:13 +0000389
Chris Lattner24943d22010-06-08 16:52:24 +0000390 SBFileSpec exe_file_spec;
Greg Clayton63094e02010-06-23 01:19:29 +0000391 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000392 {
Greg Clayton63094e02010-06-23 01:19:29 +0000393 ModuleSP exe_module_sp (m_opaque_sp->GetExecutableModule ());
Chris Lattner24943d22010-06-08 16:52:24 +0000394 if (exe_module_sp)
395 exe_file_spec.SetFileSpec (exe_module_sp->GetFileSpec());
396 }
Caroline Tice7826c882010-10-26 03:11:13 +0000397
Greg Claytone005f2c2010-11-06 01:53:30 +0000398 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000399 if (log)
400 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000401 log->Printf ("SBTarget(%p)::GetExecutable () => SBFileSpec(%p)",
402 m_opaque_sp.get(), exe_file_spec.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000403 }
404
Chris Lattner24943d22010-06-08 16:52:24 +0000405 return exe_file_spec;
406}
407
Chris Lattner24943d22010-06-08 16:52:24 +0000408bool
Chris Lattner24943d22010-06-08 16:52:24 +0000409SBTarget::operator == (const SBTarget &rhs) const
410{
Greg Clayton63094e02010-06-23 01:19:29 +0000411 return m_opaque_sp.get() == rhs.m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000412}
413
414bool
415SBTarget::operator != (const SBTarget &rhs) const
416{
Greg Clayton63094e02010-06-23 01:19:29 +0000417 return m_opaque_sp.get() != rhs.m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000418}
419
420lldb_private::Target *
Greg Clayton63094e02010-06-23 01:19:29 +0000421SBTarget::operator ->() const
Chris Lattner24943d22010-06-08 16:52:24 +0000422{
Greg Clayton63094e02010-06-23 01:19:29 +0000423 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000424}
Greg Clayton63094e02010-06-23 01:19:29 +0000425
426lldb_private::Target *
427SBTarget::get() const
Chris Lattner24943d22010-06-08 16:52:24 +0000428{
Greg Clayton63094e02010-06-23 01:19:29 +0000429 return m_opaque_sp.get();
430}
431
432void
433SBTarget::reset (const lldb::TargetSP& target_sp)
434{
435 m_opaque_sp = target_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000436}
437
Greg Claytonea49cc72010-12-12 19:25:26 +0000438bool
439SBTarget::ResolveLoadAddress (lldb::addr_t vm_addr,
440 lldb::SBAddress& addr)
441{
442 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000443 {
444 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Claytonea49cc72010-12-12 19:25:26 +0000445 return m_opaque_sp->GetSectionLoadList().ResolveLoadAddress (vm_addr, *addr);
Greg Claytonbdcda462010-12-20 20:49:23 +0000446 }
Greg Claytonea49cc72010-12-12 19:25:26 +0000447
448 addr->Clear();
449 return false;
450}
451
Greg Claytonafb81862011-03-02 21:34:46 +0000452SBSymbolContext
453SBTarget::ResolveSymbolContextForAddress (const SBAddress& addr, uint32_t resolve_scope)
454{
455 SBSymbolContext sc;
456 if (m_opaque_sp)
457 m_opaque_sp->GetImages().ResolveSymbolContextForAddress (*addr, resolve_scope, sc.ref());
458 return sc;
459}
460
461
Chris Lattner24943d22010-06-08 16:52:24 +0000462SBBreakpoint
463SBTarget::BreakpointCreateByLocation (const char *file, uint32_t line)
464{
Greg Claytond6d806c2010-11-08 00:28:40 +0000465 return SBBreakpoint(BreakpointCreateByLocation (SBFileSpec (file, false), line));
Chris Lattner24943d22010-06-08 16:52:24 +0000466}
467
468SBBreakpoint
469SBTarget::BreakpointCreateByLocation (const SBFileSpec &sb_file_spec, uint32_t line)
470{
Greg Claytone005f2c2010-11-06 01:53:30 +0000471 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000472
Chris Lattner24943d22010-06-08 16:52:24 +0000473 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000474 if (m_opaque_sp.get() && line != 0)
Greg Claytonbdcda462010-12-20 20:49:23 +0000475 {
476 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000477 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, *sb_file_spec, line, true, false);
Greg Claytonbdcda462010-12-20 20:49:23 +0000478 }
Caroline Tice7826c882010-10-26 03:11:13 +0000479
480 if (log)
481 {
482 SBStream sstr;
483 sb_bp.GetDescription (sstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000484 char path[PATH_MAX];
485 sb_file_spec->GetPath (path, sizeof(path));
486 log->Printf ("SBTarget(%p)::BreakpointCreateByLocation ( %s:%u ) => SBBreakpoint(%p): %s",
Greg Claytona66ba462010-10-30 04:51:46 +0000487 m_opaque_sp.get(),
Greg Clayton49ce6822010-10-31 03:01:06 +0000488 path,
Greg Claytona66ba462010-10-30 04:51:46 +0000489 line,
Greg Clayton49ce6822010-10-31 03:01:06 +0000490 sb_bp.get(),
Caroline Tice7826c882010-10-26 03:11:13 +0000491 sstr.GetData());
492 }
493
Chris Lattner24943d22010-06-08 16:52:24 +0000494 return sb_bp;
495}
496
497SBBreakpoint
498SBTarget::BreakpointCreateByName (const char *symbol_name, const char *module_name)
499{
Greg Claytone005f2c2010-11-06 01:53:30 +0000500 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000501
Chris Lattner24943d22010-06-08 16:52:24 +0000502 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000503 if (m_opaque_sp.get() && symbol_name && symbol_name[0])
Chris Lattner24943d22010-06-08 16:52:24 +0000504 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000505 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Chris Lattner24943d22010-06-08 16:52:24 +0000506 if (module_name && module_name[0])
507 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000508 FileSpec module_file_spec(module_name, false);
Jim Ingham7ec03bd2010-09-30 21:21:43 +0000509 *sb_bp = m_opaque_sp->CreateBreakpoint (&module_file_spec, symbol_name, eFunctionNameTypeFull | eFunctionNameTypeBase, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000510 }
511 else
512 {
Jim Ingham7ec03bd2010-09-30 21:21:43 +0000513 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, symbol_name, eFunctionNameTypeFull | eFunctionNameTypeBase, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000514 }
515 }
Caroline Tice7826c882010-10-26 03:11:13 +0000516
517 if (log)
518 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000519 log->Printf ("SBTarget(%p)::BreakpointCreateByName (symbol=\"%s\", module=\"%s\") => SBBreakpoint(%p)",
520 m_opaque_sp.get(), symbol_name, module_name, sb_bp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000521 }
522
Chris Lattner24943d22010-06-08 16:52:24 +0000523 return sb_bp;
524}
525
526SBBreakpoint
527SBTarget::BreakpointCreateByRegex (const char *symbol_name_regex, const char *module_name)
528{
Greg Claytone005f2c2010-11-06 01:53:30 +0000529 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000530
Chris Lattner24943d22010-06-08 16:52:24 +0000531 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000532 if (m_opaque_sp.get() && symbol_name_regex && symbol_name_regex[0])
Chris Lattner24943d22010-06-08 16:52:24 +0000533 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000534 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Chris Lattner24943d22010-06-08 16:52:24 +0000535 RegularExpression regexp(symbol_name_regex);
536
537 if (module_name && module_name[0])
538 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000539 FileSpec module_file_spec(module_name, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000540
Greg Clayton63094e02010-06-23 01:19:29 +0000541 *sb_bp = m_opaque_sp->CreateBreakpoint (&module_file_spec, regexp, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000542 }
543 else
544 {
Greg Clayton63094e02010-06-23 01:19:29 +0000545 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, regexp, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000546 }
547 }
Caroline Tice7826c882010-10-26 03:11:13 +0000548
549 if (log)
550 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000551 log->Printf ("SBTarget(%p)::BreakpointCreateByRegex (symbol_regex=\"%s\", module_name=\"%s\") => SBBreakpoint(%p)",
552 m_opaque_sp.get(), symbol_name_regex, module_name, sb_bp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000553 }
554
Chris Lattner24943d22010-06-08 16:52:24 +0000555 return sb_bp;
556}
557
558
559
560SBBreakpoint
561SBTarget::BreakpointCreateByAddress (addr_t address)
562{
Greg Claytone005f2c2010-11-06 01:53:30 +0000563 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000564
Chris Lattner24943d22010-06-08 16:52:24 +0000565 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000566 if (m_opaque_sp.get())
Greg Claytonbdcda462010-12-20 20:49:23 +0000567 {
568 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000569 *sb_bp = m_opaque_sp->CreateBreakpoint (address, false);
Greg Claytonbdcda462010-12-20 20:49:23 +0000570 }
Caroline Tice7826c882010-10-26 03:11:13 +0000571
572 if (log)
573 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000574 log->Printf ("SBTarget(%p)::BreakpointCreateByAddress (%p, address=%p) => SBBreakpoint(%p)", m_opaque_sp.get(), address, sb_bp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000575 }
576
Chris Lattner24943d22010-06-08 16:52:24 +0000577 return sb_bp;
578}
579
Chris Lattner24943d22010-06-08 16:52:24 +0000580SBBreakpoint
581SBTarget::FindBreakpointByID (break_id_t bp_id)
582{
Greg Claytone005f2c2010-11-06 01:53:30 +0000583 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000584
Chris Lattner24943d22010-06-08 16:52:24 +0000585 SBBreakpoint sb_breakpoint;
Greg Clayton63094e02010-06-23 01:19:29 +0000586 if (m_opaque_sp && bp_id != LLDB_INVALID_BREAK_ID)
Greg Claytonbdcda462010-12-20 20:49:23 +0000587 {
588 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000589 *sb_breakpoint = m_opaque_sp->GetBreakpointByID (bp_id);
Greg Claytonbdcda462010-12-20 20:49:23 +0000590 }
Caroline Tice7826c882010-10-26 03:11:13 +0000591
592 if (log)
593 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000594 log->Printf ("SBTarget(%p)::FindBreakpointByID (bp_id=%d) => SBBreakpoint(%p)",
595 m_opaque_sp.get(), (uint32_t) bp_id, sb_breakpoint.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000596 }
597
Chris Lattner24943d22010-06-08 16:52:24 +0000598 return sb_breakpoint;
599}
600
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000601uint32_t
602SBTarget::GetNumBreakpoints () const
603{
604 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000605 {
606 // The breakpoint list is thread safe, no need to lock
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000607 return m_opaque_sp->GetBreakpointList().GetSize();
Greg Claytonbdcda462010-12-20 20:49:23 +0000608 }
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000609 return 0;
610}
611
612SBBreakpoint
613SBTarget::GetBreakpointAtIndex (uint32_t idx) const
614{
615 SBBreakpoint sb_breakpoint;
616 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000617 {
618 // The breakpoint list is thread safe, no need to lock
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000619 *sb_breakpoint = m_opaque_sp->GetBreakpointList().GetBreakpointAtIndex(idx);
Greg Claytonbdcda462010-12-20 20:49:23 +0000620 }
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000621 return sb_breakpoint;
622}
Chris Lattner24943d22010-06-08 16:52:24 +0000623
624bool
625SBTarget::BreakpointDelete (break_id_t bp_id)
626{
Greg Claytone005f2c2010-11-06 01:53:30 +0000627 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000628
Caroline Tice7826c882010-10-26 03:11:13 +0000629 bool result = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000630 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000631 {
632 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Caroline Tice7826c882010-10-26 03:11:13 +0000633 result = m_opaque_sp->RemoveBreakpointByID (bp_id);
Greg Claytonbdcda462010-12-20 20:49:23 +0000634 }
Caroline Tice7826c882010-10-26 03:11:13 +0000635
636 if (log)
637 {
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000638 log->Printf ("SBTarget(%p)::BreakpointDelete (bp_id=%d) => %i", m_opaque_sp.get(), (uint32_t) bp_id, result);
Caroline Tice7826c882010-10-26 03:11:13 +0000639 }
640
641 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000642}
643
644bool
645SBTarget::EnableAllBreakpoints ()
646{
Greg Clayton63094e02010-06-23 01:19:29 +0000647 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000648 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000649 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000650 m_opaque_sp->EnableAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000651 return true;
652 }
653 return false;
654}
655
656bool
657SBTarget::DisableAllBreakpoints ()
658{
Greg Clayton63094e02010-06-23 01:19:29 +0000659 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000660 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000661 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000662 m_opaque_sp->DisableAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000663 return true;
664 }
665 return false;
666}
667
668bool
669SBTarget::DeleteAllBreakpoints ()
670{
Greg Clayton63094e02010-06-23 01:19:29 +0000671 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000672 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000673 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000674 m_opaque_sp->RemoveAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000675 return true;
676 }
677 return false;
678}
679
680
681uint32_t
682SBTarget::GetNumModules () const
683{
Greg Claytone005f2c2010-11-06 01:53:30 +0000684 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000685
Caroline Tice7826c882010-10-26 03:11:13 +0000686 uint32_t num = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000687 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000688 {
689 // The module list is thread safe, no need to lock
690 num = m_opaque_sp->GetImages().GetSize();
691 }
Caroline Tice7826c882010-10-26 03:11:13 +0000692
693 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000694 log->Printf ("SBTarget(%p)::GetNumModules () => %d", m_opaque_sp.get(), num);
Caroline Tice7826c882010-10-26 03:11:13 +0000695
696 return num;
Chris Lattner24943d22010-06-08 16:52:24 +0000697}
698
Greg Clayton43490d12010-07-30 20:12:55 +0000699void
700SBTarget::Clear ()
701{
Greg Claytone005f2c2010-11-06 01:53:30 +0000702 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000703
704 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000705 log->Printf ("SBTarget(%p)::Clear ()", m_opaque_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000706
Greg Clayton43490d12010-07-30 20:12:55 +0000707 m_opaque_sp.reset();
708}
709
710
Chris Lattner24943d22010-06-08 16:52:24 +0000711SBModule
712SBTarget::FindModule (const SBFileSpec &sb_file_spec)
713{
714 SBModule sb_module;
Greg Clayton63094e02010-06-23 01:19:29 +0000715 if (m_opaque_sp && sb_file_spec.IsValid())
Greg Claytonbdcda462010-12-20 20:49:23 +0000716 {
717 // The module list is thread safe, no need to lock
Greg Clayton24bc5d92011-03-30 18:16:51 +0000718 sb_module.SetModule (m_opaque_sp->GetImages().FindFirstModuleForFileSpec (*sb_file_spec, NULL, NULL));
Greg Claytonbdcda462010-12-20 20:49:23 +0000719 }
Chris Lattner24943d22010-06-08 16:52:24 +0000720 return sb_module;
721}
722
723SBModule
724SBTarget::GetModuleAtIndex (uint32_t idx)
725{
Greg Claytone005f2c2010-11-06 01:53:30 +0000726 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000727
Chris Lattner24943d22010-06-08 16:52:24 +0000728 SBModule sb_module;
Greg Clayton63094e02010-06-23 01:19:29 +0000729 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000730 {
731 // The module list is thread safe, no need to lock
Greg Clayton63094e02010-06-23 01:19:29 +0000732 sb_module.SetModule(m_opaque_sp->GetImages().GetModuleAtIndex(idx));
Greg Claytonbdcda462010-12-20 20:49:23 +0000733 }
Caroline Tice7826c882010-10-26 03:11:13 +0000734
735 if (log)
736 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000737 log->Printf ("SBTarget(%p)::GetModuleAtIndex (idx=%d) => SBModule(%p)",
738 m_opaque_sp.get(), idx, sb_module.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000739 }
740
Chris Lattner24943d22010-06-08 16:52:24 +0000741 return sb_module;
742}
743
744
745SBBroadcaster
746SBTarget::GetBroadcaster () const
747{
Greg Claytone005f2c2010-11-06 01:53:30 +0000748 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000749
Greg Clayton63094e02010-06-23 01:19:29 +0000750 SBBroadcaster broadcaster(m_opaque_sp.get(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000751
752 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000753 log->Printf ("SBTarget(%p)::GetBroadcaster () => SBBroadcaster(%p)",
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000754 m_opaque_sp.get(), broadcaster.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000755
Chris Lattner24943d22010-06-08 16:52:24 +0000756 return broadcaster;
757}
758
Caroline Tice98f930f2010-09-20 05:20:02 +0000759
760bool
Caroline Tice7826c882010-10-26 03:11:13 +0000761SBTarget::GetDescription (SBStream &description, lldb::DescriptionLevel description_level)
Caroline Tice98f930f2010-09-20 05:20:02 +0000762{
763 if (m_opaque_sp)
Caroline Ticee7a566e2010-09-20 16:21:41 +0000764 {
Caroline Ticee49ec182010-09-22 23:01:29 +0000765 description.ref();
Caroline Tice7826c882010-10-26 03:11:13 +0000766 m_opaque_sp->Dump (description.get(), description_level);
767 }
768 else
769 description.Printf ("No value");
770
771 return true;
772}
773
774bool
775SBTarget::GetDescription (SBStream &description, lldb::DescriptionLevel description_level) const
776{
777 if (m_opaque_sp)
778 {
779 description.ref();
780 m_opaque_sp->Dump (description.get(), description_level);
Caroline Ticee7a566e2010-09-20 16:21:41 +0000781 }
Caroline Tice98f930f2010-09-20 05:20:02 +0000782 else
783 description.Printf ("No value");
784
785 return true;
786}