blob: 7358a3869462f0ccf031c1654dba791b596e70c0 [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
12#include "lldb/lldb-include.h"
13
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
Greg Claytonde915be2011-01-23 05:56:20 +0000120
121SBProcess
122SBTarget::Launch
123(
Greg Clayton271a5db2011-02-03 21:28:34 +0000124 SBListener &listener,
Greg Claytonde915be2011-01-23 05:56:20 +0000125 char const **argv,
126 char const **envp,
127 const char *stdin_path,
128 const char *stdout_path,
129 const char *stderr_path,
130 const char *working_directory,
131 uint32_t launch_flags, // See LaunchFlags
132 bool stop_at_entry,
133 lldb::SBError& error
134)
135{
Greg Claytone005f2c2010-11-06 01:53:30 +0000136 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000137
138 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000139 {
Greg Claytonde915be2011-01-23 05:56:20 +0000140 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))...",
141 m_opaque_sp.get(),
142 argv,
143 envp,
144 stdin_path ? stdin_path : "NULL",
145 stdout_path ? stdout_path : "NULL",
146 stderr_path ? stderr_path : "NULL",
147 working_directory ? working_directory : "NULL",
148 launch_flags,
149 stop_at_entry,
150 error.get());
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000151 }
Greg Clayton1a3083a2010-10-06 03:53:16 +0000152 SBProcess sb_process;
153 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000154 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000155 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton1a3083a2010-10-06 03:53:16 +0000156
Greg Clayton7c330d62011-01-27 01:01:10 +0000157 if (getenv("LLDB_LAUNCH_FLAG_DISABLE_ASLR"))
158 launch_flags |= eLaunchFlagDisableASLR;
159
Greg Clayton28d5fcc2011-01-27 06:44:37 +0000160 static const char *g_launch_tty = NULL;
161 static bool g_got_launch_tty = false;
162 if (!g_got_launch_tty)
163 {
164 // Get the LLDB_LAUNCH_FLAG_LAUNCH_IN_TTY only once
165 g_got_launch_tty = true;
166 g_launch_tty = ::getenv ("LLDB_LAUNCH_FLAG_LAUNCH_IN_TTY");
167 if (g_launch_tty)
168 {
169 // LLDB_LAUNCH_FLAG_LAUNCH_IN_TTY is a path to a terminal to reuse
170 // if the first character is '/', else it is a boolean value.
171 if (g_launch_tty[0] != '/')
172 {
173 if (Args::StringToBoolean(g_launch_tty, false, NULL))
174 g_launch_tty = "";
175 else
176 g_launch_tty = NULL;
177 }
178 }
179 }
180
181 if ((launch_flags & eLaunchFlagLaunchInTTY) || g_launch_tty)
Chris Lattner24943d22010-06-08 16:52:24 +0000182 {
Greg Clayton7c330d62011-01-27 01:01:10 +0000183 ArchSpec arch (m_opaque_sp->GetArchitecture ());
184
185 Module *exe_module = m_opaque_sp->GetExecutableModule().get();
186 if (exe_module)
Chris Lattner24943d22010-06-08 16:52:24 +0000187 {
Greg Clayton7c330d62011-01-27 01:01:10 +0000188 char exec_file_path[PATH_MAX];
189 exe_module->GetFileSpec().GetPath(exec_file_path, sizeof(exec_file_path));
190 if (exe_module->GetFileSpec().Exists())
Greg Clayton1a3083a2010-10-06 03:53:16 +0000191 {
Greg Clayton7c330d62011-01-27 01:01:10 +0000192 // Make a new argument vector
193 std::vector<const char *> exec_path_plus_argv;
194 // Append the resolved executable path
195 exec_path_plus_argv.push_back (exec_file_path);
196
197 // Push all args if there are any
198 if (argv)
Greg Clayton1a3083a2010-10-06 03:53:16 +0000199 {
Greg Clayton7c330d62011-01-27 01:01:10 +0000200 for (int i = 0; argv[i]; ++i)
201 exec_path_plus_argv.push_back(argv[i]);
202 }
203
204 // Push a NULL to terminate the args.
205 exec_path_plus_argv.push_back(NULL);
206
207
Greg Clayton28d5fcc2011-01-27 06:44:37 +0000208 const char *tty_name = NULL;
209 if (g_launch_tty && g_launch_tty[0] == '/')
210 tty_name = g_launch_tty;
211
212 lldb::pid_t pid = Host::LaunchInNewTerminal (tty_name,
213 &exec_path_plus_argv[0],
214 envp,
215 working_directory,
216 &arch,
217 true,
218 launch_flags & eLaunchFlagDisableASLR);
219
Greg Clayton7c330d62011-01-27 01:01:10 +0000220 if (pid != LLDB_INVALID_PROCESS_ID)
221 {
Greg Clayton271a5db2011-02-03 21:28:34 +0000222 sb_process = AttachToProcessWithID(listener, pid, error);
Greg Clayton7c330d62011-01-27 01:01:10 +0000223 }
224 else
225 {
226 error.SetErrorStringWithFormat("failed to launch process in terminal");
Greg Clayton1a3083a2010-10-06 03:53:16 +0000227 }
228 }
Greg Clayton7c330d62011-01-27 01:01:10 +0000229 else
230 {
231 error.SetErrorStringWithFormat("executable doesn't exist: \"%s\"", exec_file_path);
232 }
233 }
234 else
235 {
236 error.SetErrorStringWithFormat("invalid executable");
Chris Lattner24943d22010-06-08 16:52:24 +0000237 }
238 }
Greg Claytonc5f728c2010-10-06 22:10:17 +0000239 else
240 {
Greg Clayton271a5db2011-02-03 21:28:34 +0000241 if (listener.IsValid())
242 sb_process.SetProcess (m_opaque_sp->CreateProcess (listener.ref()));
243 else
244 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
Greg Clayton7c330d62011-01-27 01:01:10 +0000245
246 if (sb_process.IsValid())
247 {
248
249 if (getenv("LLDB_LAUNCH_FLAG_DISABLE_STDIO"))
250 launch_flags |= eLaunchFlagDisableSTDIO;
251
252
253 error.SetError (sb_process->Launch (argv, envp, launch_flags, stdin_path, stdout_path, stderr_path, working_directory));
254 if (error.Success())
255 {
256 // We we are stopping at the entry point, we can return now!
257 if (stop_at_entry)
258 return sb_process;
259
260 // Make sure we are stopped at the entry
261 StateType state = sb_process->WaitForProcessToStop (NULL);
262 if (state == eStateStopped)
263 {
264 // resume the process to skip the entry point
265 error.SetError (sb_process->Resume());
266 if (error.Success())
267 {
268 // If we are doing synchronous mode, then wait for the
269 // process to stop yet again!
270 if (m_opaque_sp->GetDebugger().GetAsyncExecution () == false)
271 sb_process->WaitForProcessToStop (NULL);
272 }
273 }
274 }
275 }
276 else
277 {
278 error.SetErrorString ("unable to create lldb_private::Process");
279 }
Greg Claytonc5f728c2010-10-06 22:10:17 +0000280 }
281 }
282 else
283 {
284 error.SetErrorString ("SBTarget is invalid");
Chris Lattner24943d22010-06-08 16:52:24 +0000285 }
Caroline Tice7826c882010-10-26 03:11:13 +0000286
Caroline Tice926060e2010-10-29 21:48:37 +0000287 log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +0000288 if (log)
289 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000290 log->Printf ("SBTarget(%p)::Launch (...) => SBProceess(%p)",
291 m_opaque_sp.get(), sb_process.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000292 }
293
Greg Clayton1a3083a2010-10-06 03:53:16 +0000294 return sb_process;
Chris Lattner24943d22010-06-08 16:52:24 +0000295}
296
Greg Claytonc5f728c2010-10-06 22:10:17 +0000297
298lldb::SBProcess
Greg Claytond8c62532010-10-07 04:19:01 +0000299SBTarget::AttachToProcessWithID
Greg Claytonc5f728c2010-10-06 22:10:17 +0000300(
Greg Clayton271a5db2011-02-03 21:28:34 +0000301 SBListener &listener,
Greg Claytonc5f728c2010-10-06 22:10:17 +0000302 lldb::pid_t pid,// The process ID to attach to
303 SBError& error // An error explaining what went wrong if attach fails
304)
305{
306 SBProcess sb_process;
307 if (m_opaque_sp)
308 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000309 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton271a5db2011-02-03 21:28:34 +0000310 if (listener.IsValid())
311 sb_process.SetProcess (m_opaque_sp->CreateProcess (listener.ref()));
312 else
313 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
314
Greg Claytonc5f728c2010-10-06 22:10:17 +0000315
316 if (sb_process.IsValid())
317 {
318 error.SetError (sb_process->Attach (pid));
319 }
320 else
321 {
322 error.SetErrorString ("unable to create lldb_private::Process");
323 }
324 }
325 else
326 {
327 error.SetErrorString ("SBTarget is invalid");
328 }
329 return sb_process;
330
331}
332
333lldb::SBProcess
Greg Claytond8c62532010-10-07 04:19:01 +0000334SBTarget::AttachToProcessWithName
Greg Claytonc5f728c2010-10-06 22:10:17 +0000335(
Greg Clayton271a5db2011-02-03 21:28:34 +0000336 SBListener &listener,
Greg Claytonc5f728c2010-10-06 22:10:17 +0000337 const char *name, // basename of process to attach to
338 bool wait_for, // if true wait for a new instance of "name" to be launched
339 SBError& error // An error explaining what went wrong if attach fails
340)
341{
342 SBProcess sb_process;
343 if (m_opaque_sp)
344 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000345 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
346
Greg Clayton271a5db2011-02-03 21:28:34 +0000347 if (listener.IsValid())
348 sb_process.SetProcess (m_opaque_sp->CreateProcess (listener.ref()));
349 else
350 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
Greg Claytonc5f728c2010-10-06 22:10:17 +0000351
352 if (sb_process.IsValid())
353 {
354 error.SetError (sb_process->Attach (name, wait_for));
355 }
356 else
357 {
358 error.SetErrorString ("unable to create lldb_private::Process");
359 }
360 }
361 else
362 {
363 error.SetErrorString ("SBTarget is invalid");
364 }
365 return sb_process;
366
367}
368
Chris Lattner24943d22010-06-08 16:52:24 +0000369SBFileSpec
370SBTarget::GetExecutable ()
371{
Caroline Tice7826c882010-10-26 03:11:13 +0000372
Chris Lattner24943d22010-06-08 16:52:24 +0000373 SBFileSpec exe_file_spec;
Greg Clayton63094e02010-06-23 01:19:29 +0000374 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000375 {
Greg Clayton63094e02010-06-23 01:19:29 +0000376 ModuleSP exe_module_sp (m_opaque_sp->GetExecutableModule ());
Chris Lattner24943d22010-06-08 16:52:24 +0000377 if (exe_module_sp)
378 exe_file_spec.SetFileSpec (exe_module_sp->GetFileSpec());
379 }
Caroline Tice7826c882010-10-26 03:11:13 +0000380
Greg Claytone005f2c2010-11-06 01:53:30 +0000381 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000382 if (log)
383 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000384 log->Printf ("SBTarget(%p)::GetExecutable () => SBFileSpec(%p)",
385 m_opaque_sp.get(), exe_file_spec.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000386 }
387
Chris Lattner24943d22010-06-08 16:52:24 +0000388 return exe_file_spec;
389}
390
391
392bool
393SBTarget::DeleteTargetFromList (TargetList *list)
394{
Greg Clayton63094e02010-06-23 01:19:29 +0000395 if (m_opaque_sp)
396 return list->DeleteTarget (m_opaque_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000397 else
398 return false;
399}
400
401bool
Chris Lattner24943d22010-06-08 16:52:24 +0000402SBTarget::operator == (const SBTarget &rhs) const
403{
Greg Clayton63094e02010-06-23 01:19:29 +0000404 return m_opaque_sp.get() == rhs.m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000405}
406
407bool
408SBTarget::operator != (const SBTarget &rhs) const
409{
Greg Clayton63094e02010-06-23 01:19:29 +0000410 return m_opaque_sp.get() != rhs.m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000411}
412
413lldb_private::Target *
Greg Clayton63094e02010-06-23 01:19:29 +0000414SBTarget::operator ->() const
Chris Lattner24943d22010-06-08 16:52:24 +0000415{
Greg Clayton63094e02010-06-23 01:19:29 +0000416 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000417}
Greg Clayton63094e02010-06-23 01:19:29 +0000418
419lldb_private::Target *
420SBTarget::get() const
Chris Lattner24943d22010-06-08 16:52:24 +0000421{
Greg Clayton63094e02010-06-23 01:19:29 +0000422 return m_opaque_sp.get();
423}
424
425void
426SBTarget::reset (const lldb::TargetSP& target_sp)
427{
428 m_opaque_sp = target_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000429}
430
Greg Claytonea49cc72010-12-12 19:25:26 +0000431bool
432SBTarget::ResolveLoadAddress (lldb::addr_t vm_addr,
433 lldb::SBAddress& addr)
434{
435 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000436 {
437 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Claytonea49cc72010-12-12 19:25:26 +0000438 return m_opaque_sp->GetSectionLoadList().ResolveLoadAddress (vm_addr, *addr);
Greg Claytonbdcda462010-12-20 20:49:23 +0000439 }
Greg Claytonea49cc72010-12-12 19:25:26 +0000440
441 addr->Clear();
442 return false;
443}
444
Greg Claytonafb81862011-03-02 21:34:46 +0000445SBSymbolContext
446SBTarget::ResolveSymbolContextForAddress (const SBAddress& addr, uint32_t resolve_scope)
447{
448 SBSymbolContext sc;
449 if (m_opaque_sp)
450 m_opaque_sp->GetImages().ResolveSymbolContextForAddress (*addr, resolve_scope, sc.ref());
451 return sc;
452}
453
454
Chris Lattner24943d22010-06-08 16:52:24 +0000455SBBreakpoint
456SBTarget::BreakpointCreateByLocation (const char *file, uint32_t line)
457{
Greg Claytond6d806c2010-11-08 00:28:40 +0000458 return SBBreakpoint(BreakpointCreateByLocation (SBFileSpec (file, false), line));
Chris Lattner24943d22010-06-08 16:52:24 +0000459}
460
461SBBreakpoint
462SBTarget::BreakpointCreateByLocation (const SBFileSpec &sb_file_spec, uint32_t line)
463{
Greg Claytone005f2c2010-11-06 01:53:30 +0000464 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000465
Chris Lattner24943d22010-06-08 16:52:24 +0000466 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000467 if (m_opaque_sp.get() && line != 0)
Greg Claytonbdcda462010-12-20 20:49:23 +0000468 {
469 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000470 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, *sb_file_spec, line, true, false);
Greg Claytonbdcda462010-12-20 20:49:23 +0000471 }
Caroline Tice7826c882010-10-26 03:11:13 +0000472
473 if (log)
474 {
475 SBStream sstr;
476 sb_bp.GetDescription (sstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000477 char path[PATH_MAX];
478 sb_file_spec->GetPath (path, sizeof(path));
479 log->Printf ("SBTarget(%p)::BreakpointCreateByLocation ( %s:%u ) => SBBreakpoint(%p): %s",
Greg Claytona66ba462010-10-30 04:51:46 +0000480 m_opaque_sp.get(),
Greg Clayton49ce6822010-10-31 03:01:06 +0000481 path,
Greg Claytona66ba462010-10-30 04:51:46 +0000482 line,
Greg Clayton49ce6822010-10-31 03:01:06 +0000483 sb_bp.get(),
Caroline Tice7826c882010-10-26 03:11:13 +0000484 sstr.GetData());
485 }
486
Chris Lattner24943d22010-06-08 16:52:24 +0000487 return sb_bp;
488}
489
490SBBreakpoint
491SBTarget::BreakpointCreateByName (const char *symbol_name, const char *module_name)
492{
Greg Claytone005f2c2010-11-06 01:53:30 +0000493 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000494
Chris Lattner24943d22010-06-08 16:52:24 +0000495 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000496 if (m_opaque_sp.get() && symbol_name && symbol_name[0])
Chris Lattner24943d22010-06-08 16:52:24 +0000497 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000498 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Chris Lattner24943d22010-06-08 16:52:24 +0000499 if (module_name && module_name[0])
500 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000501 FileSpec module_file_spec(module_name, false);
Jim Ingham7ec03bd2010-09-30 21:21:43 +0000502 *sb_bp = m_opaque_sp->CreateBreakpoint (&module_file_spec, symbol_name, eFunctionNameTypeFull | eFunctionNameTypeBase, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000503 }
504 else
505 {
Jim Ingham7ec03bd2010-09-30 21:21:43 +0000506 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, symbol_name, eFunctionNameTypeFull | eFunctionNameTypeBase, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000507 }
508 }
Caroline Tice7826c882010-10-26 03:11:13 +0000509
510 if (log)
511 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000512 log->Printf ("SBTarget(%p)::BreakpointCreateByName (symbol=\"%s\", module=\"%s\") => SBBreakpoint(%p)",
513 m_opaque_sp.get(), symbol_name, module_name, sb_bp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000514 }
515
Chris Lattner24943d22010-06-08 16:52:24 +0000516 return sb_bp;
517}
518
519SBBreakpoint
520SBTarget::BreakpointCreateByRegex (const char *symbol_name_regex, const char *module_name)
521{
Greg Claytone005f2c2010-11-06 01:53:30 +0000522 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000523
Chris Lattner24943d22010-06-08 16:52:24 +0000524 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000525 if (m_opaque_sp.get() && symbol_name_regex && symbol_name_regex[0])
Chris Lattner24943d22010-06-08 16:52:24 +0000526 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000527 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Chris Lattner24943d22010-06-08 16:52:24 +0000528 RegularExpression regexp(symbol_name_regex);
529
530 if (module_name && module_name[0])
531 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000532 FileSpec module_file_spec(module_name, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000533
Greg Clayton63094e02010-06-23 01:19:29 +0000534 *sb_bp = m_opaque_sp->CreateBreakpoint (&module_file_spec, regexp, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000535 }
536 else
537 {
Greg Clayton63094e02010-06-23 01:19:29 +0000538 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, regexp, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000539 }
540 }
Caroline Tice7826c882010-10-26 03:11:13 +0000541
542 if (log)
543 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000544 log->Printf ("SBTarget(%p)::BreakpointCreateByRegex (symbol_regex=\"%s\", module_name=\"%s\") => SBBreakpoint(%p)",
545 m_opaque_sp.get(), symbol_name_regex, module_name, sb_bp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000546 }
547
Chris Lattner24943d22010-06-08 16:52:24 +0000548 return sb_bp;
549}
550
551
552
553SBBreakpoint
554SBTarget::BreakpointCreateByAddress (addr_t address)
555{
Greg Claytone005f2c2010-11-06 01:53:30 +0000556 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000557
Chris Lattner24943d22010-06-08 16:52:24 +0000558 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000559 if (m_opaque_sp.get())
Greg Claytonbdcda462010-12-20 20:49:23 +0000560 {
561 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000562 *sb_bp = m_opaque_sp->CreateBreakpoint (address, false);
Greg Claytonbdcda462010-12-20 20:49:23 +0000563 }
Caroline Tice7826c882010-10-26 03:11:13 +0000564
565 if (log)
566 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000567 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 +0000568 }
569
Chris Lattner24943d22010-06-08 16:52:24 +0000570 return sb_bp;
571}
572
Chris Lattner24943d22010-06-08 16:52:24 +0000573SBBreakpoint
574SBTarget::FindBreakpointByID (break_id_t bp_id)
575{
Greg Claytone005f2c2010-11-06 01:53:30 +0000576 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000577
Chris Lattner24943d22010-06-08 16:52:24 +0000578 SBBreakpoint sb_breakpoint;
Greg Clayton63094e02010-06-23 01:19:29 +0000579 if (m_opaque_sp && bp_id != LLDB_INVALID_BREAK_ID)
Greg Claytonbdcda462010-12-20 20:49:23 +0000580 {
581 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000582 *sb_breakpoint = m_opaque_sp->GetBreakpointByID (bp_id);
Greg Claytonbdcda462010-12-20 20:49:23 +0000583 }
Caroline Tice7826c882010-10-26 03:11:13 +0000584
585 if (log)
586 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000587 log->Printf ("SBTarget(%p)::FindBreakpointByID (bp_id=%d) => SBBreakpoint(%p)",
588 m_opaque_sp.get(), (uint32_t) bp_id, sb_breakpoint.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000589 }
590
Chris Lattner24943d22010-06-08 16:52:24 +0000591 return sb_breakpoint;
592}
593
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000594uint32_t
595SBTarget::GetNumBreakpoints () const
596{
597 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000598 {
599 // The breakpoint list is thread safe, no need to lock
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000600 return m_opaque_sp->GetBreakpointList().GetSize();
Greg Claytonbdcda462010-12-20 20:49:23 +0000601 }
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000602 return 0;
603}
604
605SBBreakpoint
606SBTarget::GetBreakpointAtIndex (uint32_t idx) const
607{
608 SBBreakpoint sb_breakpoint;
609 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000610 {
611 // The breakpoint list is thread safe, no need to lock
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000612 *sb_breakpoint = m_opaque_sp->GetBreakpointList().GetBreakpointAtIndex(idx);
Greg Claytonbdcda462010-12-20 20:49:23 +0000613 }
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000614 return sb_breakpoint;
615}
Chris Lattner24943d22010-06-08 16:52:24 +0000616
617bool
618SBTarget::BreakpointDelete (break_id_t bp_id)
619{
Greg Claytone005f2c2010-11-06 01:53:30 +0000620 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000621
Caroline Tice7826c882010-10-26 03:11:13 +0000622 bool result = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000623 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000624 {
625 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Caroline Tice7826c882010-10-26 03:11:13 +0000626 result = m_opaque_sp->RemoveBreakpointByID (bp_id);
Greg Claytonbdcda462010-12-20 20:49:23 +0000627 }
Caroline Tice7826c882010-10-26 03:11:13 +0000628
629 if (log)
630 {
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000631 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 +0000632 }
633
634 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000635}
636
637bool
638SBTarget::EnableAllBreakpoints ()
639{
Greg Clayton63094e02010-06-23 01:19:29 +0000640 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000641 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000642 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000643 m_opaque_sp->EnableAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000644 return true;
645 }
646 return false;
647}
648
649bool
650SBTarget::DisableAllBreakpoints ()
651{
Greg Clayton63094e02010-06-23 01:19:29 +0000652 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000653 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000654 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000655 m_opaque_sp->DisableAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000656 return true;
657 }
658 return false;
659}
660
661bool
662SBTarget::DeleteAllBreakpoints ()
663{
Greg Clayton63094e02010-06-23 01:19:29 +0000664 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000665 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000666 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000667 m_opaque_sp->RemoveAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000668 return true;
669 }
670 return false;
671}
672
673
674uint32_t
675SBTarget::GetNumModules () const
676{
Greg Claytone005f2c2010-11-06 01:53:30 +0000677 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000678
Caroline Tice7826c882010-10-26 03:11:13 +0000679 uint32_t num = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000680 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000681 {
682 // The module list is thread safe, no need to lock
683 num = m_opaque_sp->GetImages().GetSize();
684 }
Caroline Tice7826c882010-10-26 03:11:13 +0000685
686 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000687 log->Printf ("SBTarget(%p)::GetNumModules () => %d", m_opaque_sp.get(), num);
Caroline Tice7826c882010-10-26 03:11:13 +0000688
689 return num;
Chris Lattner24943d22010-06-08 16:52:24 +0000690}
691
Greg Clayton43490d12010-07-30 20:12:55 +0000692void
693SBTarget::Clear ()
694{
Greg Claytone005f2c2010-11-06 01:53:30 +0000695 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000696
697 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000698 log->Printf ("SBTarget(%p)::Clear ()", m_opaque_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000699
Greg Clayton43490d12010-07-30 20:12:55 +0000700 m_opaque_sp.reset();
701}
702
703
Chris Lattner24943d22010-06-08 16:52:24 +0000704SBModule
705SBTarget::FindModule (const SBFileSpec &sb_file_spec)
706{
707 SBModule sb_module;
Greg Clayton63094e02010-06-23 01:19:29 +0000708 if (m_opaque_sp && sb_file_spec.IsValid())
Greg Claytonbdcda462010-12-20 20:49:23 +0000709 {
710 // The module list is thread safe, no need to lock
Greg Clayton63094e02010-06-23 01:19:29 +0000711 sb_module.SetModule (m_opaque_sp->GetImages().FindFirstModuleForFileSpec (*sb_file_spec, NULL));
Greg Claytonbdcda462010-12-20 20:49:23 +0000712 }
Chris Lattner24943d22010-06-08 16:52:24 +0000713 return sb_module;
714}
715
716SBModule
717SBTarget::GetModuleAtIndex (uint32_t idx)
718{
Greg Claytone005f2c2010-11-06 01:53:30 +0000719 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000720
Chris Lattner24943d22010-06-08 16:52:24 +0000721 SBModule sb_module;
Greg Clayton63094e02010-06-23 01:19:29 +0000722 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000723 {
724 // The module list is thread safe, no need to lock
Greg Clayton63094e02010-06-23 01:19:29 +0000725 sb_module.SetModule(m_opaque_sp->GetImages().GetModuleAtIndex(idx));
Greg Claytonbdcda462010-12-20 20:49:23 +0000726 }
Caroline Tice7826c882010-10-26 03:11:13 +0000727
728 if (log)
729 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000730 log->Printf ("SBTarget(%p)::GetModuleAtIndex (idx=%d) => SBModule(%p)",
731 m_opaque_sp.get(), idx, sb_module.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000732 }
733
Chris Lattner24943d22010-06-08 16:52:24 +0000734 return sb_module;
735}
736
737
738SBBroadcaster
739SBTarget::GetBroadcaster () const
740{
Greg Claytone005f2c2010-11-06 01:53:30 +0000741 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000742
Greg Clayton63094e02010-06-23 01:19:29 +0000743 SBBroadcaster broadcaster(m_opaque_sp.get(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000744
745 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000746 log->Printf ("SBTarget(%p)::GetBroadcaster () => SBBroadcaster(%p)",
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000747 m_opaque_sp.get(), broadcaster.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000748
Chris Lattner24943d22010-06-08 16:52:24 +0000749 return broadcaster;
750}
751
Caroline Tice98f930f2010-09-20 05:20:02 +0000752
753bool
Caroline Tice7826c882010-10-26 03:11:13 +0000754SBTarget::GetDescription (SBStream &description, lldb::DescriptionLevel description_level)
Caroline Tice98f930f2010-09-20 05:20:02 +0000755{
756 if (m_opaque_sp)
Caroline Ticee7a566e2010-09-20 16:21:41 +0000757 {
Caroline Ticee49ec182010-09-22 23:01:29 +0000758 description.ref();
Caroline Tice7826c882010-10-26 03:11:13 +0000759 m_opaque_sp->Dump (description.get(), description_level);
760 }
761 else
762 description.Printf ("No value");
763
764 return true;
765}
766
767bool
768SBTarget::GetDescription (SBStream &description, lldb::DescriptionLevel description_level) const
769{
770 if (m_opaque_sp)
771 {
772 description.ref();
773 m_opaque_sp->Dump (description.get(), description_level);
Caroline Ticee7a566e2010-09-20 16:21:41 +0000774 }
Caroline Tice98f930f2010-09-20 05:20:02 +0000775 else
776 description.Printf ("No value");
777
778 return true;
779}