blob: db0b03b02092dd0b8c631fea7845af9c7596cc83 [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
Chris Lattner24943d22010-06-08 16:52:24 +0000445SBBreakpoint
446SBTarget::BreakpointCreateByLocation (const char *file, uint32_t line)
447{
Greg Claytond6d806c2010-11-08 00:28:40 +0000448 return SBBreakpoint(BreakpointCreateByLocation (SBFileSpec (file, false), line));
Chris Lattner24943d22010-06-08 16:52:24 +0000449}
450
451SBBreakpoint
452SBTarget::BreakpointCreateByLocation (const SBFileSpec &sb_file_spec, uint32_t line)
453{
Greg Claytone005f2c2010-11-06 01:53:30 +0000454 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000455
Chris Lattner24943d22010-06-08 16:52:24 +0000456 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000457 if (m_opaque_sp.get() && line != 0)
Greg Claytonbdcda462010-12-20 20:49:23 +0000458 {
459 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000460 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, *sb_file_spec, line, true, false);
Greg Claytonbdcda462010-12-20 20:49:23 +0000461 }
Caroline Tice7826c882010-10-26 03:11:13 +0000462
463 if (log)
464 {
465 SBStream sstr;
466 sb_bp.GetDescription (sstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000467 char path[PATH_MAX];
468 sb_file_spec->GetPath (path, sizeof(path));
469 log->Printf ("SBTarget(%p)::BreakpointCreateByLocation ( %s:%u ) => SBBreakpoint(%p): %s",
Greg Claytona66ba462010-10-30 04:51:46 +0000470 m_opaque_sp.get(),
Greg Clayton49ce6822010-10-31 03:01:06 +0000471 path,
Greg Claytona66ba462010-10-30 04:51:46 +0000472 line,
Greg Clayton49ce6822010-10-31 03:01:06 +0000473 sb_bp.get(),
Caroline Tice7826c882010-10-26 03:11:13 +0000474 sstr.GetData());
475 }
476
Chris Lattner24943d22010-06-08 16:52:24 +0000477 return sb_bp;
478}
479
480SBBreakpoint
481SBTarget::BreakpointCreateByName (const char *symbol_name, const char *module_name)
482{
Greg Claytone005f2c2010-11-06 01:53:30 +0000483 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000484
Chris Lattner24943d22010-06-08 16:52:24 +0000485 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000486 if (m_opaque_sp.get() && symbol_name && symbol_name[0])
Chris Lattner24943d22010-06-08 16:52:24 +0000487 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000488 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Chris Lattner24943d22010-06-08 16:52:24 +0000489 if (module_name && module_name[0])
490 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000491 FileSpec module_file_spec(module_name, false);
Jim Ingham7ec03bd2010-09-30 21:21:43 +0000492 *sb_bp = m_opaque_sp->CreateBreakpoint (&module_file_spec, symbol_name, eFunctionNameTypeFull | eFunctionNameTypeBase, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000493 }
494 else
495 {
Jim Ingham7ec03bd2010-09-30 21:21:43 +0000496 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, symbol_name, eFunctionNameTypeFull | eFunctionNameTypeBase, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000497 }
498 }
Caroline Tice7826c882010-10-26 03:11:13 +0000499
500 if (log)
501 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000502 log->Printf ("SBTarget(%p)::BreakpointCreateByName (symbol=\"%s\", module=\"%s\") => SBBreakpoint(%p)",
503 m_opaque_sp.get(), symbol_name, module_name, sb_bp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000504 }
505
Chris Lattner24943d22010-06-08 16:52:24 +0000506 return sb_bp;
507}
508
509SBBreakpoint
510SBTarget::BreakpointCreateByRegex (const char *symbol_name_regex, const char *module_name)
511{
Greg Claytone005f2c2010-11-06 01:53:30 +0000512 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000513
Chris Lattner24943d22010-06-08 16:52:24 +0000514 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000515 if (m_opaque_sp.get() && symbol_name_regex && symbol_name_regex[0])
Chris Lattner24943d22010-06-08 16:52:24 +0000516 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000517 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Chris Lattner24943d22010-06-08 16:52:24 +0000518 RegularExpression regexp(symbol_name_regex);
519
520 if (module_name && module_name[0])
521 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000522 FileSpec module_file_spec(module_name, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000523
Greg Clayton63094e02010-06-23 01:19:29 +0000524 *sb_bp = m_opaque_sp->CreateBreakpoint (&module_file_spec, regexp, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000525 }
526 else
527 {
Greg Clayton63094e02010-06-23 01:19:29 +0000528 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, regexp, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000529 }
530 }
Caroline Tice7826c882010-10-26 03:11:13 +0000531
532 if (log)
533 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000534 log->Printf ("SBTarget(%p)::BreakpointCreateByRegex (symbol_regex=\"%s\", module_name=\"%s\") => SBBreakpoint(%p)",
535 m_opaque_sp.get(), symbol_name_regex, module_name, sb_bp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000536 }
537
Chris Lattner24943d22010-06-08 16:52:24 +0000538 return sb_bp;
539}
540
541
542
543SBBreakpoint
544SBTarget::BreakpointCreateByAddress (addr_t address)
545{
Greg Claytone005f2c2010-11-06 01:53:30 +0000546 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000547
Chris Lattner24943d22010-06-08 16:52:24 +0000548 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000549 if (m_opaque_sp.get())
Greg Claytonbdcda462010-12-20 20:49:23 +0000550 {
551 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000552 *sb_bp = m_opaque_sp->CreateBreakpoint (address, false);
Greg Claytonbdcda462010-12-20 20:49:23 +0000553 }
Caroline Tice7826c882010-10-26 03:11:13 +0000554
555 if (log)
556 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000557 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 +0000558 }
559
Chris Lattner24943d22010-06-08 16:52:24 +0000560 return sb_bp;
561}
562
Chris Lattner24943d22010-06-08 16:52:24 +0000563SBBreakpoint
564SBTarget::FindBreakpointByID (break_id_t bp_id)
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_breakpoint;
Greg Clayton63094e02010-06-23 01:19:29 +0000569 if (m_opaque_sp && bp_id != LLDB_INVALID_BREAK_ID)
Greg Claytonbdcda462010-12-20 20:49:23 +0000570 {
571 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000572 *sb_breakpoint = m_opaque_sp->GetBreakpointByID (bp_id);
Greg Claytonbdcda462010-12-20 20:49:23 +0000573 }
Caroline Tice7826c882010-10-26 03:11:13 +0000574
575 if (log)
576 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000577 log->Printf ("SBTarget(%p)::FindBreakpointByID (bp_id=%d) => SBBreakpoint(%p)",
578 m_opaque_sp.get(), (uint32_t) bp_id, sb_breakpoint.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000579 }
580
Chris Lattner24943d22010-06-08 16:52:24 +0000581 return sb_breakpoint;
582}
583
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000584uint32_t
585SBTarget::GetNumBreakpoints () const
586{
587 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000588 {
589 // The breakpoint list is thread safe, no need to lock
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000590 return m_opaque_sp->GetBreakpointList().GetSize();
Greg Claytonbdcda462010-12-20 20:49:23 +0000591 }
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000592 return 0;
593}
594
595SBBreakpoint
596SBTarget::GetBreakpointAtIndex (uint32_t idx) const
597{
598 SBBreakpoint sb_breakpoint;
599 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000600 {
601 // The breakpoint list is thread safe, no need to lock
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000602 *sb_breakpoint = m_opaque_sp->GetBreakpointList().GetBreakpointAtIndex(idx);
Greg Claytonbdcda462010-12-20 20:49:23 +0000603 }
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000604 return sb_breakpoint;
605}
Chris Lattner24943d22010-06-08 16:52:24 +0000606
607bool
608SBTarget::BreakpointDelete (break_id_t bp_id)
609{
Greg Claytone005f2c2010-11-06 01:53:30 +0000610 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000611
Caroline Tice7826c882010-10-26 03:11:13 +0000612 bool result = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000613 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000614 {
615 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Caroline Tice7826c882010-10-26 03:11:13 +0000616 result = m_opaque_sp->RemoveBreakpointByID (bp_id);
Greg Claytonbdcda462010-12-20 20:49:23 +0000617 }
Caroline Tice7826c882010-10-26 03:11:13 +0000618
619 if (log)
620 {
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000621 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 +0000622 }
623
624 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000625}
626
627bool
628SBTarget::EnableAllBreakpoints ()
629{
Greg Clayton63094e02010-06-23 01:19:29 +0000630 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000631 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000632 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000633 m_opaque_sp->EnableAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000634 return true;
635 }
636 return false;
637}
638
639bool
640SBTarget::DisableAllBreakpoints ()
641{
Greg Clayton63094e02010-06-23 01:19:29 +0000642 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000643 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000644 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000645 m_opaque_sp->DisableAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000646 return true;
647 }
648 return false;
649}
650
651bool
652SBTarget::DeleteAllBreakpoints ()
653{
Greg Clayton63094e02010-06-23 01:19:29 +0000654 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000655 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000656 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000657 m_opaque_sp->RemoveAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000658 return true;
659 }
660 return false;
661}
662
663
664uint32_t
665SBTarget::GetNumModules () const
666{
Greg Claytone005f2c2010-11-06 01:53:30 +0000667 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000668
Caroline Tice7826c882010-10-26 03:11:13 +0000669 uint32_t num = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000670 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000671 {
672 // The module list is thread safe, no need to lock
673 num = m_opaque_sp->GetImages().GetSize();
674 }
Caroline Tice7826c882010-10-26 03:11:13 +0000675
676 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000677 log->Printf ("SBTarget(%p)::GetNumModules () => %d", m_opaque_sp.get(), num);
Caroline Tice7826c882010-10-26 03:11:13 +0000678
679 return num;
Chris Lattner24943d22010-06-08 16:52:24 +0000680}
681
Greg Clayton43490d12010-07-30 20:12:55 +0000682void
683SBTarget::Clear ()
684{
Greg Claytone005f2c2010-11-06 01:53:30 +0000685 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000686
687 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000688 log->Printf ("SBTarget(%p)::Clear ()", m_opaque_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000689
Greg Clayton43490d12010-07-30 20:12:55 +0000690 m_opaque_sp.reset();
691}
692
693
Chris Lattner24943d22010-06-08 16:52:24 +0000694SBModule
695SBTarget::FindModule (const SBFileSpec &sb_file_spec)
696{
697 SBModule sb_module;
Greg Clayton63094e02010-06-23 01:19:29 +0000698 if (m_opaque_sp && sb_file_spec.IsValid())
Greg Claytonbdcda462010-12-20 20:49:23 +0000699 {
700 // The module list is thread safe, no need to lock
Greg Clayton63094e02010-06-23 01:19:29 +0000701 sb_module.SetModule (m_opaque_sp->GetImages().FindFirstModuleForFileSpec (*sb_file_spec, NULL));
Greg Claytonbdcda462010-12-20 20:49:23 +0000702 }
Chris Lattner24943d22010-06-08 16:52:24 +0000703 return sb_module;
704}
705
706SBModule
707SBTarget::GetModuleAtIndex (uint32_t idx)
708{
Greg Claytone005f2c2010-11-06 01:53:30 +0000709 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000710
Chris Lattner24943d22010-06-08 16:52:24 +0000711 SBModule sb_module;
Greg Clayton63094e02010-06-23 01:19:29 +0000712 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000713 {
714 // The module list is thread safe, no need to lock
Greg Clayton63094e02010-06-23 01:19:29 +0000715 sb_module.SetModule(m_opaque_sp->GetImages().GetModuleAtIndex(idx));
Greg Claytonbdcda462010-12-20 20:49:23 +0000716 }
Caroline Tice7826c882010-10-26 03:11:13 +0000717
718 if (log)
719 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000720 log->Printf ("SBTarget(%p)::GetModuleAtIndex (idx=%d) => SBModule(%p)",
721 m_opaque_sp.get(), idx, sb_module.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000722 }
723
Chris Lattner24943d22010-06-08 16:52:24 +0000724 return sb_module;
725}
726
727
728SBBroadcaster
729SBTarget::GetBroadcaster () const
730{
Greg Claytone005f2c2010-11-06 01:53:30 +0000731 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000732
Greg Clayton63094e02010-06-23 01:19:29 +0000733 SBBroadcaster broadcaster(m_opaque_sp.get(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000734
735 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000736 log->Printf ("SBTarget(%p)::GetBroadcaster () => SBBroadcaster(%p)",
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000737 m_opaque_sp.get(), broadcaster.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000738
Chris Lattner24943d22010-06-08 16:52:24 +0000739 return broadcaster;
740}
741
Caroline Tice98f930f2010-09-20 05:20:02 +0000742
743bool
Caroline Tice7826c882010-10-26 03:11:13 +0000744SBTarget::GetDescription (SBStream &description, lldb::DescriptionLevel description_level)
Caroline Tice98f930f2010-09-20 05:20:02 +0000745{
746 if (m_opaque_sp)
Caroline Ticee7a566e2010-09-20 16:21:41 +0000747 {
Caroline Ticee49ec182010-09-22 23:01:29 +0000748 description.ref();
Caroline Tice7826c882010-10-26 03:11:13 +0000749 m_opaque_sp->Dump (description.get(), description_level);
750 }
751 else
752 description.Printf ("No value");
753
754 return true;
755}
756
757bool
758SBTarget::GetDescription (SBStream &description, lldb::DescriptionLevel description_level) const
759{
760 if (m_opaque_sp)
761 {
762 description.ref();
763 m_opaque_sp->Dump (description.get(), description_level);
Caroline Ticee7a566e2010-09-20 16:21:41 +0000764 }
Caroline Tice98f930f2010-09-20 05:20:02 +0000765 else
766 description.Printf ("No value");
767
768 return true;
769}