blob: 7098604b0ef0a7b0c0973f20c9c5149558f0e4d0 [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"
Greg Clayton4ed315f2011-06-21 01:34:41 +000017#include "lldb/API/SBSymbolContextList.h"
Chris Lattner24943d22010-06-08 16:52:24 +000018#include "lldb/Breakpoint/BreakpointID.h"
19#include "lldb/Breakpoint/BreakpointIDList.h"
20#include "lldb/Breakpoint/BreakpointList.h"
21#include "lldb/Breakpoint/BreakpointLocation.h"
22#include "lldb/Core/Address.h"
23#include "lldb/Core/AddressResolver.h"
24#include "lldb/Core/AddressResolverName.h"
Jim Ingham84cdc152010-06-15 19:49:27 +000025#include "lldb/Interpreter/Args.h"
Chris Lattner24943d22010-06-08 16:52:24 +000026#include "lldb/Core/ArchSpec.h"
27#include "lldb/Core/Debugger.h"
28#include "lldb/Core/Disassembler.h"
Greg Clayton5f54ac32011-02-08 05:05:52 +000029#include "lldb/Host/FileSpec.h"
Caroline Tice7826c882010-10-26 03:11:13 +000030#include "lldb/Core/Log.h"
Chris Lattner24943d22010-06-08 16:52:24 +000031#include "lldb/Core/RegularExpression.h"
32#include "lldb/Core/SearchFilter.h"
33#include "lldb/Core/STLUtils.h"
Greg Claytoncd548032011-02-01 01:31:41 +000034#include "lldb/Host/Host.h"
Chris Lattner24943d22010-06-08 16:52:24 +000035#include "lldb/Target/Process.h"
36#include "lldb/Target/Target.h"
37#include "lldb/Target/TargetList.h"
38
39#include "lldb/Interpreter/CommandReturnObject.h"
40#include "../source/Commands/CommandObjectBreakpoint.h"
41
Eli Friedman7a62c8b2010-06-09 07:44:37 +000042#include "lldb/API/SBDebugger.h"
43#include "lldb/API/SBProcess.h"
44#include "lldb/API/SBListener.h"
45#include "lldb/API/SBBreakpoint.h"
Chris Lattner24943d22010-06-08 16:52:24 +000046
47using namespace lldb;
48using namespace lldb_private;
49
50#define DEFAULT_DISASM_BYTE_SIZE 32
51
52//----------------------------------------------------------------------
53// SBTarget constructor
54//----------------------------------------------------------------------
Greg Claytonc3b61d22010-12-15 05:08:08 +000055SBTarget::SBTarget () :
56 m_opaque_sp ()
Chris Lattner24943d22010-06-08 16:52:24 +000057{
58}
59
60SBTarget::SBTarget (const SBTarget& rhs) :
Greg Clayton63094e02010-06-23 01:19:29 +000061 m_opaque_sp (rhs.m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000062{
63}
64
65SBTarget::SBTarget(const TargetSP& target_sp) :
Greg Clayton63094e02010-06-23 01:19:29 +000066 m_opaque_sp (target_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000067{
68}
69
Greg Clayton538eb822010-11-05 23:17:00 +000070const SBTarget&
71SBTarget::operator = (const SBTarget& rhs)
72{
73 if (this != &rhs)
74 m_opaque_sp = rhs.m_opaque_sp;
75 return *this;
76}
77
Chris Lattner24943d22010-06-08 16:52:24 +000078//----------------------------------------------------------------------
79// Destructor
80//----------------------------------------------------------------------
81SBTarget::~SBTarget()
82{
83}
84
85bool
86SBTarget::IsValid () const
87{
Greg Clayton63094e02010-06-23 01:19:29 +000088 return m_opaque_sp.get() != NULL;
Chris Lattner24943d22010-06-08 16:52:24 +000089}
90
91SBProcess
92SBTarget::GetProcess ()
93{
Caroline Tice7826c882010-10-26 03:11:13 +000094
Chris Lattner24943d22010-06-08 16:52:24 +000095 SBProcess sb_process;
Greg Clayton63094e02010-06-23 01:19:29 +000096 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +000097 {
98 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +000099 sb_process.SetProcess (m_opaque_sp->GetProcessSP());
Greg Claytonbdcda462010-12-20 20:49:23 +0000100 }
Caroline Tice7826c882010-10-26 03:11:13 +0000101
Greg Claytone005f2c2010-11-06 01:53:30 +0000102 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000103 if (log)
104 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000105 log->Printf ("SBTarget(%p)::GetProcess () => SBProcess(%p)",
106 m_opaque_sp.get(), sb_process.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000107 }
108
Chris Lattner24943d22010-06-08 16:52:24 +0000109 return sb_process;
110}
111
Greg Clayton63094e02010-06-23 01:19:29 +0000112SBDebugger
113SBTarget::GetDebugger () const
114{
115 SBDebugger debugger;
116 if (m_opaque_sp)
117 debugger.reset (m_opaque_sp->GetDebugger().GetSP());
118 return debugger;
119}
120
Jim Inghamb5871fe2011-03-31 00:01:24 +0000121SBProcess
122SBTarget::LaunchSimple
123(
124 char const **argv,
125 char const **envp,
126 const char *working_directory
127)
128{
129 char *stdin_path = NULL;
130 char *stdout_path = NULL;
131 char *stderr_path = NULL;
132 uint32_t launch_flags = 0;
133 bool stop_at_entry = false;
134 SBError error;
135 SBListener listener = GetDebugger().GetListener();
136 return Launch (listener,
137 argv,
138 envp,
139 stdin_path,
140 stdout_path,
141 stderr_path,
142 working_directory,
143 launch_flags,
144 stop_at_entry,
145 error);
146}
Greg Claytonde915be2011-01-23 05:56:20 +0000147
148SBProcess
149SBTarget::Launch
150(
Greg Clayton271a5db2011-02-03 21:28:34 +0000151 SBListener &listener,
Greg Claytonde915be2011-01-23 05:56:20 +0000152 char const **argv,
153 char const **envp,
154 const char *stdin_path,
155 const char *stdout_path,
156 const char *stderr_path,
157 const char *working_directory,
158 uint32_t launch_flags, // See LaunchFlags
159 bool stop_at_entry,
160 lldb::SBError& error
161)
162{
Greg Claytone005f2c2010-11-06 01:53:30 +0000163 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000164
165 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000166 {
Greg Claytonde915be2011-01-23 05:56:20 +0000167 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))...",
168 m_opaque_sp.get(),
169 argv,
170 envp,
171 stdin_path ? stdin_path : "NULL",
172 stdout_path ? stdout_path : "NULL",
173 stderr_path ? stderr_path : "NULL",
174 working_directory ? working_directory : "NULL",
175 launch_flags,
176 stop_at_entry,
177 error.get());
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000178 }
Greg Clayton1a3083a2010-10-06 03:53:16 +0000179 SBProcess sb_process;
180 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000181 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000182 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton1a3083a2010-10-06 03:53:16 +0000183
Greg Clayton7c330d62011-01-27 01:01:10 +0000184 if (getenv("LLDB_LAUNCH_FLAG_DISABLE_ASLR"))
185 launch_flags |= eLaunchFlagDisableASLR;
186
Greg Clayton180546b2011-04-30 01:09:13 +0000187 StateType state = eStateInvalid;
188 sb_process.SetProcess (m_opaque_sp->GetProcessSP());
189 if (sb_process.IsValid())
Greg Clayton28d5fcc2011-01-27 06:44:37 +0000190 {
Greg Clayton180546b2011-04-30 01:09:13 +0000191 state = sb_process->GetState();
192
193 if (sb_process->IsAlive() && state != eStateConnected)
194 {
195 if (state == eStateAttaching)
196 error.SetErrorString ("process attach is in progress");
197 else
198 error.SetErrorString ("a process is already being debugged");
199 sb_process.Clear();
200 return sb_process;
201 }
Greg Clayton28d5fcc2011-01-27 06:44:37 +0000202 }
203
Greg Clayton180546b2011-04-30 01:09:13 +0000204 if (state == eStateConnected)
205 {
206 // If we are already connected, then we have already specified the
207 // listener, so if a valid listener is supplied, we need to error out
208 // to let the client know.
209 if (listener.IsValid())
210 {
211 error.SetErrorString ("process is connected and already has a listener, pass empty listener");
212 sb_process.Clear();
213 return sb_process;
214 }
215 }
216 else
Greg Claytonc5f728c2010-10-06 22:10:17 +0000217 {
Greg Clayton271a5db2011-02-03 21:28:34 +0000218 if (listener.IsValid())
219 sb_process.SetProcess (m_opaque_sp->CreateProcess (listener.ref()));
220 else
221 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
Greg Clayton180546b2011-04-30 01:09:13 +0000222 }
Greg Clayton7c330d62011-01-27 01:01:10 +0000223
Greg Clayton180546b2011-04-30 01:09:13 +0000224 if (sb_process.IsValid())
225 {
226 if (getenv("LLDB_LAUNCH_FLAG_DISABLE_STDIO"))
227 launch_flags |= eLaunchFlagDisableSTDIO;
228
229 error.SetError (sb_process->Launch (argv, envp, launch_flags, stdin_path, stdout_path, stderr_path, working_directory));
230 if (error.Success())
Greg Clayton7c330d62011-01-27 01:01:10 +0000231 {
Greg Clayton180546b2011-04-30 01:09:13 +0000232 // We we are stopping at the entry point, we can return now!
233 if (stop_at_entry)
234 return sb_process;
Greg Clayton7c330d62011-01-27 01:01:10 +0000235
Greg Clayton180546b2011-04-30 01:09:13 +0000236 // Make sure we are stopped at the entry
237 StateType state = sb_process->WaitForProcessToStop (NULL);
238 if (state == eStateStopped)
Greg Clayton7c330d62011-01-27 01:01:10 +0000239 {
Greg Clayton180546b2011-04-30 01:09:13 +0000240 // resume the process to skip the entry point
241 error.SetError (sb_process->Resume());
242 if (error.Success())
Greg Clayton7c330d62011-01-27 01:01:10 +0000243 {
Greg Clayton180546b2011-04-30 01:09:13 +0000244 // If we are doing synchronous mode, then wait for the
245 // process to stop yet again!
246 if (m_opaque_sp->GetDebugger().GetAsyncExecution () == false)
247 sb_process->WaitForProcessToStop (NULL);
Greg Clayton7c330d62011-01-27 01:01:10 +0000248 }
249 }
250 }
Greg Clayton180546b2011-04-30 01:09:13 +0000251 }
252 else
253 {
254 error.SetErrorString ("unable to create lldb_private::Process");
Greg Claytonc5f728c2010-10-06 22:10:17 +0000255 }
256 }
257 else
258 {
259 error.SetErrorString ("SBTarget is invalid");
Chris Lattner24943d22010-06-08 16:52:24 +0000260 }
Caroline Tice7826c882010-10-26 03:11:13 +0000261
Caroline Tice926060e2010-10-29 21:48:37 +0000262 log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +0000263 if (log)
264 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000265 log->Printf ("SBTarget(%p)::Launch (...) => SBProceess(%p)",
266 m_opaque_sp.get(), sb_process.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000267 }
268
Greg Clayton1a3083a2010-10-06 03:53:16 +0000269 return sb_process;
Chris Lattner24943d22010-06-08 16:52:24 +0000270}
271
Greg Claytonc5f728c2010-10-06 22:10:17 +0000272
273lldb::SBProcess
Greg Claytond8c62532010-10-07 04:19:01 +0000274SBTarget::AttachToProcessWithID
Greg Claytonc5f728c2010-10-06 22:10:17 +0000275(
Greg Clayton271a5db2011-02-03 21:28:34 +0000276 SBListener &listener,
Greg Claytonc5f728c2010-10-06 22:10:17 +0000277 lldb::pid_t pid,// The process ID to attach to
278 SBError& error // An error explaining what went wrong if attach fails
279)
280{
281 SBProcess sb_process;
282 if (m_opaque_sp)
283 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000284 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Claytonde1dd812011-06-24 03:21:43 +0000285
286 StateType state = eStateInvalid;
287 sb_process.SetProcess (m_opaque_sp->GetProcessSP());
288 if (sb_process.IsValid())
289 {
290 state = sb_process->GetState();
291
292 if (sb_process->IsAlive() && state != eStateConnected)
293 {
294 if (state == eStateAttaching)
295 error.SetErrorString ("process attach is in progress");
296 else
297 error.SetErrorString ("a process is already being debugged");
298 sb_process.Clear();
299 return sb_process;
300 }
301 }
302
303 if (state == eStateConnected)
304 {
305 // If we are already connected, then we have already specified the
306 // listener, so if a valid listener is supplied, we need to error out
307 // to let the client know.
308 if (listener.IsValid())
309 {
310 error.SetErrorString ("process is connected and already has a listener, pass empty listener");
311 sb_process.Clear();
312 return sb_process;
313 }
314 }
Greg Clayton271a5db2011-02-03 21:28:34 +0000315 else
Greg Claytonde1dd812011-06-24 03:21:43 +0000316 {
317 if (listener.IsValid())
318 sb_process.SetProcess (m_opaque_sp->CreateProcess (listener.ref()));
319 else
320 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
321 }
Greg Claytonc5f728c2010-10-06 22:10:17 +0000322
323 if (sb_process.IsValid())
324 {
325 error.SetError (sb_process->Attach (pid));
Johnny Chen535960e2011-06-17 00:51:15 +0000326 // If we are doing synchronous mode, then wait for the
327 // process to stop!
328 if (m_opaque_sp->GetDebugger().GetAsyncExecution () == false)
329 sb_process->WaitForProcessToStop (NULL);
Greg Claytonc5f728c2010-10-06 22:10:17 +0000330 }
331 else
332 {
333 error.SetErrorString ("unable to create lldb_private::Process");
334 }
335 }
336 else
337 {
338 error.SetErrorString ("SBTarget is invalid");
339 }
340 return sb_process;
341
342}
343
344lldb::SBProcess
Greg Claytond8c62532010-10-07 04:19:01 +0000345SBTarget::AttachToProcessWithName
Greg Claytonc5f728c2010-10-06 22:10:17 +0000346(
Greg Clayton271a5db2011-02-03 21:28:34 +0000347 SBListener &listener,
Greg Claytonc5f728c2010-10-06 22:10:17 +0000348 const char *name, // basename of process to attach to
349 bool wait_for, // if true wait for a new instance of "name" to be launched
350 SBError& error // An error explaining what went wrong if attach fails
351)
352{
353 SBProcess sb_process;
354 if (m_opaque_sp)
355 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000356 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
357
Greg Claytonde1dd812011-06-24 03:21:43 +0000358 StateType state = eStateInvalid;
359 sb_process.SetProcess (m_opaque_sp->GetProcessSP());
360 if (sb_process.IsValid())
361 {
362 state = sb_process->GetState();
363
364 if (sb_process->IsAlive() && state != eStateConnected)
365 {
366 if (state == eStateAttaching)
367 error.SetErrorString ("process attach is in progress");
368 else
369 error.SetErrorString ("a process is already being debugged");
370 sb_process.Clear();
371 return sb_process;
372 }
373 }
374
375 if (state == eStateConnected)
376 {
377 // If we are already connected, then we have already specified the
378 // listener, so if a valid listener is supplied, we need to error out
379 // to let the client know.
380 if (listener.IsValid())
381 {
382 error.SetErrorString ("process is connected and already has a listener, pass empty listener");
383 sb_process.Clear();
384 return sb_process;
385 }
386 }
Greg Clayton271a5db2011-02-03 21:28:34 +0000387 else
Greg Claytonde1dd812011-06-24 03:21:43 +0000388 {
389 if (listener.IsValid())
390 sb_process.SetProcess (m_opaque_sp->CreateProcess (listener.ref()));
391 else
392 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
393 }
Greg Claytonc5f728c2010-10-06 22:10:17 +0000394
395 if (sb_process.IsValid())
396 {
397 error.SetError (sb_process->Attach (name, wait_for));
Johnny Chen58d02ff2011-06-17 19:21:30 +0000398 // If we are doing synchronous mode, then wait for the
399 // process to stop!
400 if (m_opaque_sp->GetDebugger().GetAsyncExecution () == false)
401 sb_process->WaitForProcessToStop (NULL);
Greg Claytonc5f728c2010-10-06 22:10:17 +0000402 }
403 else
404 {
405 error.SetErrorString ("unable to create lldb_private::Process");
406 }
407 }
408 else
409 {
410 error.SetErrorString ("SBTarget is invalid");
411 }
412 return sb_process;
413
414}
415
James McIlree38093402011-03-04 00:31:13 +0000416lldb::SBProcess
417SBTarget::ConnectRemote
418(
419 SBListener &listener,
420 const char *url,
421 const char *plugin_name,
422 SBError& error
423)
424{
425 SBProcess sb_process;
426 if (m_opaque_sp)
427 {
428 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
429 if (listener.IsValid())
430 sb_process.SetProcess (m_opaque_sp->CreateProcess (listener.ref(), plugin_name));
431 else
432 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener(), plugin_name));
433
434
435 if (sb_process.IsValid())
436 {
437 error.SetError (sb_process->ConnectRemote (url));
438 }
439 else
440 {
441 error.SetErrorString ("unable to create lldb_private::Process");
442 }
443 }
444 else
445 {
446 error.SetErrorString ("SBTarget is invalid");
447 }
448 return sb_process;
449}
450
Chris Lattner24943d22010-06-08 16:52:24 +0000451SBFileSpec
452SBTarget::GetExecutable ()
453{
Caroline Tice7826c882010-10-26 03:11:13 +0000454
Chris Lattner24943d22010-06-08 16:52:24 +0000455 SBFileSpec exe_file_spec;
Greg Clayton63094e02010-06-23 01:19:29 +0000456 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000457 {
Greg Clayton63094e02010-06-23 01:19:29 +0000458 ModuleSP exe_module_sp (m_opaque_sp->GetExecutableModule ());
Chris Lattner24943d22010-06-08 16:52:24 +0000459 if (exe_module_sp)
460 exe_file_spec.SetFileSpec (exe_module_sp->GetFileSpec());
461 }
Caroline Tice7826c882010-10-26 03:11:13 +0000462
Greg Claytone005f2c2010-11-06 01:53:30 +0000463 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000464 if (log)
465 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000466 log->Printf ("SBTarget(%p)::GetExecutable () => SBFileSpec(%p)",
467 m_opaque_sp.get(), exe_file_spec.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000468 }
469
Chris Lattner24943d22010-06-08 16:52:24 +0000470 return exe_file_spec;
471}
472
Chris Lattner24943d22010-06-08 16:52:24 +0000473bool
Chris Lattner24943d22010-06-08 16:52:24 +0000474SBTarget::operator == (const SBTarget &rhs) const
475{
Greg Clayton63094e02010-06-23 01:19:29 +0000476 return m_opaque_sp.get() == rhs.m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000477}
478
479bool
480SBTarget::operator != (const SBTarget &rhs) const
481{
Greg Clayton63094e02010-06-23 01:19:29 +0000482 return m_opaque_sp.get() != rhs.m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000483}
484
485lldb_private::Target *
Greg Clayton63094e02010-06-23 01:19:29 +0000486SBTarget::operator ->() const
Chris Lattner24943d22010-06-08 16:52:24 +0000487{
Greg Clayton63094e02010-06-23 01:19:29 +0000488 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000489}
Greg Clayton63094e02010-06-23 01:19:29 +0000490
491lldb_private::Target *
492SBTarget::get() const
Chris Lattner24943d22010-06-08 16:52:24 +0000493{
Greg Clayton63094e02010-06-23 01:19:29 +0000494 return m_opaque_sp.get();
495}
496
497void
498SBTarget::reset (const lldb::TargetSP& target_sp)
499{
500 m_opaque_sp = target_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000501}
502
Greg Claytonea49cc72010-12-12 19:25:26 +0000503bool
504SBTarget::ResolveLoadAddress (lldb::addr_t vm_addr,
505 lldb::SBAddress& addr)
506{
Johnny Chene657fbc2011-06-29 00:05:40 +0000507 if (m_opaque_sp && addr.IsValid())
Greg Claytonbdcda462010-12-20 20:49:23 +0000508 {
509 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Claytonea49cc72010-12-12 19:25:26 +0000510 return m_opaque_sp->GetSectionLoadList().ResolveLoadAddress (vm_addr, *addr);
Greg Claytonbdcda462010-12-20 20:49:23 +0000511 }
Greg Claytonea49cc72010-12-12 19:25:26 +0000512
Johnny Chene657fbc2011-06-29 00:05:40 +0000513 if (addr.IsValid())
514 addr->Clear();
Greg Claytonea49cc72010-12-12 19:25:26 +0000515 return false;
516}
517
Greg Claytonafb81862011-03-02 21:34:46 +0000518SBSymbolContext
519SBTarget::ResolveSymbolContextForAddress (const SBAddress& addr, uint32_t resolve_scope)
520{
521 SBSymbolContext sc;
Johnny Chene657fbc2011-06-29 00:05:40 +0000522 if (m_opaque_sp && addr.IsValid())
Greg Claytonafb81862011-03-02 21:34:46 +0000523 m_opaque_sp->GetImages().ResolveSymbolContextForAddress (*addr, resolve_scope, sc.ref());
524 return sc;
525}
526
527
Chris Lattner24943d22010-06-08 16:52:24 +0000528SBBreakpoint
529SBTarget::BreakpointCreateByLocation (const char *file, uint32_t line)
530{
Greg Claytond6d806c2010-11-08 00:28:40 +0000531 return SBBreakpoint(BreakpointCreateByLocation (SBFileSpec (file, false), line));
Chris Lattner24943d22010-06-08 16:52:24 +0000532}
533
534SBBreakpoint
535SBTarget::BreakpointCreateByLocation (const SBFileSpec &sb_file_spec, uint32_t line)
536{
Greg Claytone005f2c2010-11-06 01:53:30 +0000537 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000538
Chris Lattner24943d22010-06-08 16:52:24 +0000539 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000540 if (m_opaque_sp.get() && line != 0)
Greg Claytonbdcda462010-12-20 20:49:23 +0000541 {
542 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000543 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, *sb_file_spec, line, true, false);
Greg Claytonbdcda462010-12-20 20:49:23 +0000544 }
Caroline Tice7826c882010-10-26 03:11:13 +0000545
546 if (log)
547 {
548 SBStream sstr;
549 sb_bp.GetDescription (sstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000550 char path[PATH_MAX];
551 sb_file_spec->GetPath (path, sizeof(path));
552 log->Printf ("SBTarget(%p)::BreakpointCreateByLocation ( %s:%u ) => SBBreakpoint(%p): %s",
Greg Claytona66ba462010-10-30 04:51:46 +0000553 m_opaque_sp.get(),
Greg Clayton49ce6822010-10-31 03:01:06 +0000554 path,
Greg Claytona66ba462010-10-30 04:51:46 +0000555 line,
Greg Clayton49ce6822010-10-31 03:01:06 +0000556 sb_bp.get(),
Caroline Tice7826c882010-10-26 03:11:13 +0000557 sstr.GetData());
558 }
559
Chris Lattner24943d22010-06-08 16:52:24 +0000560 return sb_bp;
561}
562
563SBBreakpoint
564SBTarget::BreakpointCreateByName (const char *symbol_name, const char *module_name)
565{
Greg Claytone005f2c2010-11-06 01:53:30 +0000566 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000567
Chris Lattner24943d22010-06-08 16:52:24 +0000568 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000569 if (m_opaque_sp.get() && symbol_name && symbol_name[0])
Chris Lattner24943d22010-06-08 16:52:24 +0000570 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000571 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Chris Lattner24943d22010-06-08 16:52:24 +0000572 if (module_name && module_name[0])
573 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000574 FileSpec module_file_spec(module_name, false);
Jim Ingham7ec03bd2010-09-30 21:21:43 +0000575 *sb_bp = m_opaque_sp->CreateBreakpoint (&module_file_spec, symbol_name, eFunctionNameTypeFull | eFunctionNameTypeBase, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000576 }
577 else
578 {
Jim Ingham7ec03bd2010-09-30 21:21:43 +0000579 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, symbol_name, eFunctionNameTypeFull | eFunctionNameTypeBase, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000580 }
581 }
Caroline Tice7826c882010-10-26 03:11:13 +0000582
583 if (log)
584 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000585 log->Printf ("SBTarget(%p)::BreakpointCreateByName (symbol=\"%s\", module=\"%s\") => SBBreakpoint(%p)",
586 m_opaque_sp.get(), symbol_name, module_name, sb_bp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000587 }
588
Chris Lattner24943d22010-06-08 16:52:24 +0000589 return sb_bp;
590}
591
592SBBreakpoint
593SBTarget::BreakpointCreateByRegex (const char *symbol_name_regex, const char *module_name)
594{
Greg Claytone005f2c2010-11-06 01:53:30 +0000595 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000596
Chris Lattner24943d22010-06-08 16:52:24 +0000597 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000598 if (m_opaque_sp.get() && symbol_name_regex && symbol_name_regex[0])
Chris Lattner24943d22010-06-08 16:52:24 +0000599 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000600 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Chris Lattner24943d22010-06-08 16:52:24 +0000601 RegularExpression regexp(symbol_name_regex);
602
603 if (module_name && module_name[0])
604 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000605 FileSpec module_file_spec(module_name, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000606
Greg Clayton63094e02010-06-23 01:19:29 +0000607 *sb_bp = m_opaque_sp->CreateBreakpoint (&module_file_spec, regexp, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000608 }
609 else
610 {
Greg Clayton63094e02010-06-23 01:19:29 +0000611 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, regexp, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000612 }
613 }
Caroline Tice7826c882010-10-26 03:11:13 +0000614
615 if (log)
616 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000617 log->Printf ("SBTarget(%p)::BreakpointCreateByRegex (symbol_regex=\"%s\", module_name=\"%s\") => SBBreakpoint(%p)",
618 m_opaque_sp.get(), symbol_name_regex, module_name, sb_bp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000619 }
620
Chris Lattner24943d22010-06-08 16:52:24 +0000621 return sb_bp;
622}
623
624
625
626SBBreakpoint
627SBTarget::BreakpointCreateByAddress (addr_t address)
628{
Greg Claytone005f2c2010-11-06 01:53:30 +0000629 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000630
Chris Lattner24943d22010-06-08 16:52:24 +0000631 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000632 if (m_opaque_sp.get())
Greg Claytonbdcda462010-12-20 20:49:23 +0000633 {
634 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000635 *sb_bp = m_opaque_sp->CreateBreakpoint (address, false);
Greg Claytonbdcda462010-12-20 20:49:23 +0000636 }
Caroline Tice7826c882010-10-26 03:11:13 +0000637
638 if (log)
639 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000640 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 +0000641 }
642
Chris Lattner24943d22010-06-08 16:52:24 +0000643 return sb_bp;
644}
645
Chris Lattner24943d22010-06-08 16:52:24 +0000646SBBreakpoint
647SBTarget::FindBreakpointByID (break_id_t bp_id)
648{
Greg Claytone005f2c2010-11-06 01:53:30 +0000649 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000650
Chris Lattner24943d22010-06-08 16:52:24 +0000651 SBBreakpoint sb_breakpoint;
Greg Clayton63094e02010-06-23 01:19:29 +0000652 if (m_opaque_sp && bp_id != LLDB_INVALID_BREAK_ID)
Greg Claytonbdcda462010-12-20 20:49:23 +0000653 {
654 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000655 *sb_breakpoint = m_opaque_sp->GetBreakpointByID (bp_id);
Greg Claytonbdcda462010-12-20 20:49:23 +0000656 }
Caroline Tice7826c882010-10-26 03:11:13 +0000657
658 if (log)
659 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000660 log->Printf ("SBTarget(%p)::FindBreakpointByID (bp_id=%d) => SBBreakpoint(%p)",
661 m_opaque_sp.get(), (uint32_t) bp_id, sb_breakpoint.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000662 }
663
Chris Lattner24943d22010-06-08 16:52:24 +0000664 return sb_breakpoint;
665}
666
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000667uint32_t
668SBTarget::GetNumBreakpoints () const
669{
670 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000671 {
672 // The breakpoint list is thread safe, no need to lock
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000673 return m_opaque_sp->GetBreakpointList().GetSize();
Greg Claytonbdcda462010-12-20 20:49:23 +0000674 }
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000675 return 0;
676}
677
678SBBreakpoint
679SBTarget::GetBreakpointAtIndex (uint32_t idx) const
680{
681 SBBreakpoint sb_breakpoint;
682 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000683 {
684 // The breakpoint list is thread safe, no need to lock
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000685 *sb_breakpoint = m_opaque_sp->GetBreakpointList().GetBreakpointAtIndex(idx);
Greg Claytonbdcda462010-12-20 20:49:23 +0000686 }
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000687 return sb_breakpoint;
688}
Chris Lattner24943d22010-06-08 16:52:24 +0000689
690bool
691SBTarget::BreakpointDelete (break_id_t bp_id)
692{
Greg Claytone005f2c2010-11-06 01:53:30 +0000693 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000694
Caroline Tice7826c882010-10-26 03:11:13 +0000695 bool result = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000696 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000697 {
698 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Caroline Tice7826c882010-10-26 03:11:13 +0000699 result = m_opaque_sp->RemoveBreakpointByID (bp_id);
Greg Claytonbdcda462010-12-20 20:49:23 +0000700 }
Caroline Tice7826c882010-10-26 03:11:13 +0000701
702 if (log)
703 {
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000704 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 +0000705 }
706
707 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000708}
709
710bool
711SBTarget::EnableAllBreakpoints ()
712{
Greg Clayton63094e02010-06-23 01:19:29 +0000713 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000714 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000715 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000716 m_opaque_sp->EnableAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000717 return true;
718 }
719 return false;
720}
721
722bool
723SBTarget::DisableAllBreakpoints ()
724{
Greg Clayton63094e02010-06-23 01:19:29 +0000725 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000726 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000727 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000728 m_opaque_sp->DisableAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000729 return true;
730 }
731 return false;
732}
733
734bool
735SBTarget::DeleteAllBreakpoints ()
736{
Greg Clayton63094e02010-06-23 01:19:29 +0000737 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000738 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000739 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000740 m_opaque_sp->RemoveAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000741 return true;
742 }
743 return false;
744}
745
746
747uint32_t
748SBTarget::GetNumModules () const
749{
Greg Claytone005f2c2010-11-06 01:53:30 +0000750 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000751
Caroline Tice7826c882010-10-26 03:11:13 +0000752 uint32_t num = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000753 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000754 {
755 // The module list is thread safe, no need to lock
756 num = m_opaque_sp->GetImages().GetSize();
757 }
Caroline Tice7826c882010-10-26 03:11:13 +0000758
759 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000760 log->Printf ("SBTarget(%p)::GetNumModules () => %d", m_opaque_sp.get(), num);
Caroline Tice7826c882010-10-26 03:11:13 +0000761
762 return num;
Chris Lattner24943d22010-06-08 16:52:24 +0000763}
764
Greg Clayton43490d12010-07-30 20:12:55 +0000765void
766SBTarget::Clear ()
767{
Greg Claytone005f2c2010-11-06 01:53:30 +0000768 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000769
770 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000771 log->Printf ("SBTarget(%p)::Clear ()", m_opaque_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000772
Greg Clayton43490d12010-07-30 20:12:55 +0000773 m_opaque_sp.reset();
774}
775
776
Chris Lattner24943d22010-06-08 16:52:24 +0000777SBModule
778SBTarget::FindModule (const SBFileSpec &sb_file_spec)
779{
780 SBModule sb_module;
Greg Clayton63094e02010-06-23 01:19:29 +0000781 if (m_opaque_sp && sb_file_spec.IsValid())
Greg Claytonbdcda462010-12-20 20:49:23 +0000782 {
783 // The module list is thread safe, no need to lock
Greg Clayton24bc5d92011-03-30 18:16:51 +0000784 sb_module.SetModule (m_opaque_sp->GetImages().FindFirstModuleForFileSpec (*sb_file_spec, NULL, NULL));
Greg Claytonbdcda462010-12-20 20:49:23 +0000785 }
Chris Lattner24943d22010-06-08 16:52:24 +0000786 return sb_module;
787}
788
789SBModule
790SBTarget::GetModuleAtIndex (uint32_t idx)
791{
Greg Claytone005f2c2010-11-06 01:53:30 +0000792 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000793
Chris Lattner24943d22010-06-08 16:52:24 +0000794 SBModule sb_module;
Greg Clayton63094e02010-06-23 01:19:29 +0000795 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000796 {
797 // The module list is thread safe, no need to lock
Greg Clayton63094e02010-06-23 01:19:29 +0000798 sb_module.SetModule(m_opaque_sp->GetImages().GetModuleAtIndex(idx));
Greg Claytonbdcda462010-12-20 20:49:23 +0000799 }
Caroline Tice7826c882010-10-26 03:11:13 +0000800
801 if (log)
802 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000803 log->Printf ("SBTarget(%p)::GetModuleAtIndex (idx=%d) => SBModule(%p)",
804 m_opaque_sp.get(), idx, sb_module.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000805 }
806
Chris Lattner24943d22010-06-08 16:52:24 +0000807 return sb_module;
808}
809
810
811SBBroadcaster
812SBTarget::GetBroadcaster () const
813{
Greg Claytone005f2c2010-11-06 01:53:30 +0000814 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000815
Greg Clayton63094e02010-06-23 01:19:29 +0000816 SBBroadcaster broadcaster(m_opaque_sp.get(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000817
818 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000819 log->Printf ("SBTarget(%p)::GetBroadcaster () => SBBroadcaster(%p)",
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000820 m_opaque_sp.get(), broadcaster.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000821
Chris Lattner24943d22010-06-08 16:52:24 +0000822 return broadcaster;
823}
824
Caroline Tice98f930f2010-09-20 05:20:02 +0000825
826bool
Caroline Tice7826c882010-10-26 03:11:13 +0000827SBTarget::GetDescription (SBStream &description, lldb::DescriptionLevel description_level)
Caroline Tice98f930f2010-09-20 05:20:02 +0000828{
829 if (m_opaque_sp)
Caroline Ticee7a566e2010-09-20 16:21:41 +0000830 {
Caroline Ticee49ec182010-09-22 23:01:29 +0000831 description.ref();
Caroline Tice7826c882010-10-26 03:11:13 +0000832 m_opaque_sp->Dump (description.get(), description_level);
833 }
834 else
835 description.Printf ("No value");
836
837 return true;
838}
839
840bool
841SBTarget::GetDescription (SBStream &description, lldb::DescriptionLevel description_level) const
842{
843 if (m_opaque_sp)
844 {
845 description.ref();
846 m_opaque_sp->Dump (description.get(), description_level);
Caroline Ticee7a566e2010-09-20 16:21:41 +0000847 }
Caroline Tice98f930f2010-09-20 05:20:02 +0000848 else
849 description.Printf ("No value");
850
851 return true;
852}
Greg Clayton4ed315f2011-06-21 01:34:41 +0000853
854
855uint32_t
856SBTarget::FindFunctions (const char *name,
857 uint32_t name_type_mask,
858 bool append,
859 lldb::SBSymbolContextList& sc_list)
860{
861 if (!append)
862 sc_list.Clear();
863 if (m_opaque_sp)
864 {
865 const bool symbols_ok = true;
866 return m_opaque_sp->GetImages().FindFunctions (ConstString(name),
867 name_type_mask,
868 symbols_ok,
869 append,
870 *sc_list);
871 }
872 return 0;
873}
874