blob: 820327b12a9c74fcfb8c3ecd546d6c53651305eb [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"
28#include "lldb/Core/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"
33#include "lldb/Target/Process.h"
34#include "lldb/Target/Target.h"
35#include "lldb/Target/TargetList.h"
36
37#include "lldb/Interpreter/CommandReturnObject.h"
38#include "../source/Commands/CommandObjectBreakpoint.h"
39
Eli Friedman7a62c8b2010-06-09 07:44:37 +000040#include "lldb/API/SBDebugger.h"
41#include "lldb/API/SBProcess.h"
42#include "lldb/API/SBListener.h"
43#include "lldb/API/SBBreakpoint.h"
Chris Lattner24943d22010-06-08 16:52:24 +000044
45using namespace lldb;
46using namespace lldb_private;
47
48#define DEFAULT_DISASM_BYTE_SIZE 32
49
50//----------------------------------------------------------------------
51// SBTarget constructor
52//----------------------------------------------------------------------
Greg Claytonc3b61d22010-12-15 05:08:08 +000053SBTarget::SBTarget () :
54 m_opaque_sp ()
Chris Lattner24943d22010-06-08 16:52:24 +000055{
56}
57
58SBTarget::SBTarget (const SBTarget& rhs) :
Greg Clayton63094e02010-06-23 01:19:29 +000059 m_opaque_sp (rhs.m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000060{
61}
62
63SBTarget::SBTarget(const TargetSP& target_sp) :
Greg Clayton63094e02010-06-23 01:19:29 +000064 m_opaque_sp (target_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000065{
66}
67
Greg Clayton538eb822010-11-05 23:17:00 +000068const SBTarget&
69SBTarget::operator = (const SBTarget& rhs)
70{
71 if (this != &rhs)
72 m_opaque_sp = rhs.m_opaque_sp;
73 return *this;
74}
75
Chris Lattner24943d22010-06-08 16:52:24 +000076//----------------------------------------------------------------------
77// Destructor
78//----------------------------------------------------------------------
79SBTarget::~SBTarget()
80{
81}
82
83bool
84SBTarget::IsValid () const
85{
Greg Clayton63094e02010-06-23 01:19:29 +000086 return m_opaque_sp.get() != NULL;
Chris Lattner24943d22010-06-08 16:52:24 +000087}
88
89SBProcess
90SBTarget::GetProcess ()
91{
Caroline Tice7826c882010-10-26 03:11:13 +000092
Chris Lattner24943d22010-06-08 16:52:24 +000093 SBProcess sb_process;
Greg Clayton63094e02010-06-23 01:19:29 +000094 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +000095 {
96 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +000097 sb_process.SetProcess (m_opaque_sp->GetProcessSP());
Greg Claytonbdcda462010-12-20 20:49:23 +000098 }
Caroline Tice7826c882010-10-26 03:11:13 +000099
Greg Claytone005f2c2010-11-06 01:53:30 +0000100 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000101 if (log)
102 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000103 log->Printf ("SBTarget(%p)::GetProcess () => SBProcess(%p)",
104 m_opaque_sp.get(), sb_process.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000105 }
106
Chris Lattner24943d22010-06-08 16:52:24 +0000107 return sb_process;
108}
109
Greg Clayton63094e02010-06-23 01:19:29 +0000110SBDebugger
111SBTarget::GetDebugger () const
112{
113 SBDebugger debugger;
114 if (m_opaque_sp)
115 debugger.reset (m_opaque_sp->GetDebugger().GetSP());
116 return debugger;
117}
118
Greg Claytonde915be2011-01-23 05:56:20 +0000119
120SBProcess
121SBTarget::Launch
122(
123 char const **argv,
124 char const **envp,
125 const char *stdin_path,
126 const char *stdout_path,
127 const char *stderr_path,
128 const char *working_directory,
129 uint32_t launch_flags, // See LaunchFlags
130 bool stop_at_entry,
131 lldb::SBError& error
132)
133{
Greg Claytone005f2c2010-11-06 01:53:30 +0000134 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000135
136 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000137 {
Greg Claytonde915be2011-01-23 05:56:20 +0000138 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))...",
139 m_opaque_sp.get(),
140 argv,
141 envp,
142 stdin_path ? stdin_path : "NULL",
143 stdout_path ? stdout_path : "NULL",
144 stderr_path ? stderr_path : "NULL",
145 working_directory ? working_directory : "NULL",
146 launch_flags,
147 stop_at_entry,
148 error.get());
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000149 }
Greg Clayton1a3083a2010-10-06 03:53:16 +0000150 SBProcess sb_process;
151 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000152 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000153 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton1a3083a2010-10-06 03:53:16 +0000154
Greg Clayton7c330d62011-01-27 01:01:10 +0000155 if (getenv("LLDB_LAUNCH_FLAG_DISABLE_ASLR"))
156 launch_flags |= eLaunchFlagDisableASLR;
157
158 if ((launch_flags & eLaunchFlagLaunchInTTY) || getenv("LLDB_LAUNCH_FLAG_LAUNCH_IN_TTY"))
Chris Lattner24943d22010-06-08 16:52:24 +0000159 {
Greg Clayton7c330d62011-01-27 01:01:10 +0000160 ArchSpec arch (m_opaque_sp->GetArchitecture ());
161
162 Module *exe_module = m_opaque_sp->GetExecutableModule().get();
163 if (exe_module)
Chris Lattner24943d22010-06-08 16:52:24 +0000164 {
Greg Clayton7c330d62011-01-27 01:01:10 +0000165 char exec_file_path[PATH_MAX];
166 exe_module->GetFileSpec().GetPath(exec_file_path, sizeof(exec_file_path));
167 if (exe_module->GetFileSpec().Exists())
Greg Clayton1a3083a2010-10-06 03:53:16 +0000168 {
Greg Clayton7c330d62011-01-27 01:01:10 +0000169 // Make a new argument vector
170 std::vector<const char *> exec_path_plus_argv;
171 // Append the resolved executable path
172 exec_path_plus_argv.push_back (exec_file_path);
173
174 // Push all args if there are any
175 if (argv)
Greg Clayton1a3083a2010-10-06 03:53:16 +0000176 {
Greg Clayton7c330d62011-01-27 01:01:10 +0000177 for (int i = 0; argv[i]; ++i)
178 exec_path_plus_argv.push_back(argv[i]);
179 }
180
181 // Push a NULL to terminate the args.
182 exec_path_plus_argv.push_back(NULL);
183
184
185 lldb::pid_t pid = Host::LaunchInNewTerminal (NULL,
186 &exec_path_plus_argv[0],
187 envp,
188 working_directory,
189 &arch,
190 true,
191 launch_flags & eLaunchFlagDisableASLR);
192
193 if (pid != LLDB_INVALID_PROCESS_ID)
194 {
195 sb_process = AttachToProcessWithID(pid, error);
196 }
197 else
198 {
199 error.SetErrorStringWithFormat("failed to launch process in terminal");
Greg Clayton1a3083a2010-10-06 03:53:16 +0000200 }
201 }
Greg Clayton7c330d62011-01-27 01:01:10 +0000202 else
203 {
204 error.SetErrorStringWithFormat("executable doesn't exist: \"%s\"", exec_file_path);
205 }
206 }
207 else
208 {
209 error.SetErrorStringWithFormat("invalid executable");
Chris Lattner24943d22010-06-08 16:52:24 +0000210 }
211 }
Greg Claytonc5f728c2010-10-06 22:10:17 +0000212 else
213 {
Greg Clayton7c330d62011-01-27 01:01:10 +0000214 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
215
216 if (sb_process.IsValid())
217 {
218
219 if (getenv("LLDB_LAUNCH_FLAG_DISABLE_STDIO"))
220 launch_flags |= eLaunchFlagDisableSTDIO;
221
222
223 error.SetError (sb_process->Launch (argv, envp, launch_flags, stdin_path, stdout_path, stderr_path, working_directory));
224 if (error.Success())
225 {
226 // We we are stopping at the entry point, we can return now!
227 if (stop_at_entry)
228 return sb_process;
229
230 // Make sure we are stopped at the entry
231 StateType state = sb_process->WaitForProcessToStop (NULL);
232 if (state == eStateStopped)
233 {
234 // resume the process to skip the entry point
235 error.SetError (sb_process->Resume());
236 if (error.Success())
237 {
238 // If we are doing synchronous mode, then wait for the
239 // process to stop yet again!
240 if (m_opaque_sp->GetDebugger().GetAsyncExecution () == false)
241 sb_process->WaitForProcessToStop (NULL);
242 }
243 }
244 }
245 }
246 else
247 {
248 error.SetErrorString ("unable to create lldb_private::Process");
249 }
Greg Claytonc5f728c2010-10-06 22:10:17 +0000250 }
251 }
252 else
253 {
254 error.SetErrorString ("SBTarget is invalid");
Chris Lattner24943d22010-06-08 16:52:24 +0000255 }
Caroline Tice7826c882010-10-26 03:11:13 +0000256
Caroline Tice926060e2010-10-29 21:48:37 +0000257 log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +0000258 if (log)
259 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000260 log->Printf ("SBTarget(%p)::Launch (...) => SBProceess(%p)",
261 m_opaque_sp.get(), sb_process.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000262 }
263
Greg Clayton1a3083a2010-10-06 03:53:16 +0000264 return sb_process;
Chris Lattner24943d22010-06-08 16:52:24 +0000265}
266
Greg Claytonc5f728c2010-10-06 22:10:17 +0000267
268lldb::SBProcess
Greg Claytond8c62532010-10-07 04:19:01 +0000269SBTarget::AttachToProcessWithID
Greg Claytonc5f728c2010-10-06 22:10:17 +0000270(
271 lldb::pid_t pid,// The process ID to attach to
272 SBError& error // An error explaining what went wrong if attach fails
273)
274{
275 SBProcess sb_process;
276 if (m_opaque_sp)
277 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000278 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
279 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
Greg Claytonc5f728c2010-10-06 22:10:17 +0000280
281 if (sb_process.IsValid())
282 {
283 error.SetError (sb_process->Attach (pid));
284 }
285 else
286 {
287 error.SetErrorString ("unable to create lldb_private::Process");
288 }
289 }
290 else
291 {
292 error.SetErrorString ("SBTarget is invalid");
293 }
294 return sb_process;
295
296}
297
298lldb::SBProcess
Greg Claytond8c62532010-10-07 04:19:01 +0000299SBTarget::AttachToProcessWithName
Greg Claytonc5f728c2010-10-06 22:10:17 +0000300(
301 const char *name, // basename of process to attach to
302 bool wait_for, // if true wait for a new instance of "name" to be launched
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());
310
311 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
Greg Claytonc5f728c2010-10-06 22:10:17 +0000312
313 if (sb_process.IsValid())
314 {
315 error.SetError (sb_process->Attach (name, wait_for));
316 }
317 else
318 {
319 error.SetErrorString ("unable to create lldb_private::Process");
320 }
321 }
322 else
323 {
324 error.SetErrorString ("SBTarget is invalid");
325 }
326 return sb_process;
327
328}
329
Chris Lattner24943d22010-06-08 16:52:24 +0000330SBFileSpec
331SBTarget::GetExecutable ()
332{
Caroline Tice7826c882010-10-26 03:11:13 +0000333
Chris Lattner24943d22010-06-08 16:52:24 +0000334 SBFileSpec exe_file_spec;
Greg Clayton63094e02010-06-23 01:19:29 +0000335 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000336 {
Greg Clayton63094e02010-06-23 01:19:29 +0000337 ModuleSP exe_module_sp (m_opaque_sp->GetExecutableModule ());
Chris Lattner24943d22010-06-08 16:52:24 +0000338 if (exe_module_sp)
339 exe_file_spec.SetFileSpec (exe_module_sp->GetFileSpec());
340 }
Caroline Tice7826c882010-10-26 03:11:13 +0000341
Greg Claytone005f2c2010-11-06 01:53:30 +0000342 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000343 if (log)
344 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000345 log->Printf ("SBTarget(%p)::GetExecutable () => SBFileSpec(%p)",
346 m_opaque_sp.get(), exe_file_spec.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000347 }
348
Chris Lattner24943d22010-06-08 16:52:24 +0000349 return exe_file_spec;
350}
351
352
353bool
354SBTarget::DeleteTargetFromList (TargetList *list)
355{
Greg Clayton63094e02010-06-23 01:19:29 +0000356 if (m_opaque_sp)
357 return list->DeleteTarget (m_opaque_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000358 else
359 return false;
360}
361
362bool
Chris Lattner24943d22010-06-08 16:52:24 +0000363SBTarget::operator == (const SBTarget &rhs) const
364{
Greg Clayton63094e02010-06-23 01:19:29 +0000365 return m_opaque_sp.get() == rhs.m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000366}
367
368bool
369SBTarget::operator != (const SBTarget &rhs) const
370{
Greg Clayton63094e02010-06-23 01:19:29 +0000371 return m_opaque_sp.get() != rhs.m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000372}
373
374lldb_private::Target *
Greg Clayton63094e02010-06-23 01:19:29 +0000375SBTarget::operator ->() const
Chris Lattner24943d22010-06-08 16:52:24 +0000376{
Greg Clayton63094e02010-06-23 01:19:29 +0000377 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000378}
Greg Clayton63094e02010-06-23 01:19:29 +0000379
380lldb_private::Target *
381SBTarget::get() const
Chris Lattner24943d22010-06-08 16:52:24 +0000382{
Greg Clayton63094e02010-06-23 01:19:29 +0000383 return m_opaque_sp.get();
384}
385
386void
387SBTarget::reset (const lldb::TargetSP& target_sp)
388{
389 m_opaque_sp = target_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000390}
391
Greg Claytonea49cc72010-12-12 19:25:26 +0000392bool
393SBTarget::ResolveLoadAddress (lldb::addr_t vm_addr,
394 lldb::SBAddress& addr)
395{
396 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000397 {
398 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Claytonea49cc72010-12-12 19:25:26 +0000399 return m_opaque_sp->GetSectionLoadList().ResolveLoadAddress (vm_addr, *addr);
Greg Claytonbdcda462010-12-20 20:49:23 +0000400 }
Greg Claytonea49cc72010-12-12 19:25:26 +0000401
402 addr->Clear();
403 return false;
404}
405
Chris Lattner24943d22010-06-08 16:52:24 +0000406SBBreakpoint
407SBTarget::BreakpointCreateByLocation (const char *file, uint32_t line)
408{
Greg Claytond6d806c2010-11-08 00:28:40 +0000409 return SBBreakpoint(BreakpointCreateByLocation (SBFileSpec (file, false), line));
Chris Lattner24943d22010-06-08 16:52:24 +0000410}
411
412SBBreakpoint
413SBTarget::BreakpointCreateByLocation (const SBFileSpec &sb_file_spec, uint32_t line)
414{
Greg Claytone005f2c2010-11-06 01:53:30 +0000415 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000416
Chris Lattner24943d22010-06-08 16:52:24 +0000417 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000418 if (m_opaque_sp.get() && line != 0)
Greg Claytonbdcda462010-12-20 20:49:23 +0000419 {
420 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000421 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, *sb_file_spec, line, true, false);
Greg Claytonbdcda462010-12-20 20:49:23 +0000422 }
Caroline Tice7826c882010-10-26 03:11:13 +0000423
424 if (log)
425 {
426 SBStream sstr;
427 sb_bp.GetDescription (sstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000428 char path[PATH_MAX];
429 sb_file_spec->GetPath (path, sizeof(path));
430 log->Printf ("SBTarget(%p)::BreakpointCreateByLocation ( %s:%u ) => SBBreakpoint(%p): %s",
Greg Claytona66ba462010-10-30 04:51:46 +0000431 m_opaque_sp.get(),
Greg Clayton49ce6822010-10-31 03:01:06 +0000432 path,
Greg Claytona66ba462010-10-30 04:51:46 +0000433 line,
Greg Clayton49ce6822010-10-31 03:01:06 +0000434 sb_bp.get(),
Caroline Tice7826c882010-10-26 03:11:13 +0000435 sstr.GetData());
436 }
437
Chris Lattner24943d22010-06-08 16:52:24 +0000438 return sb_bp;
439}
440
441SBBreakpoint
442SBTarget::BreakpointCreateByName (const char *symbol_name, const char *module_name)
443{
Greg Claytone005f2c2010-11-06 01:53:30 +0000444 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000445
Chris Lattner24943d22010-06-08 16:52:24 +0000446 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000447 if (m_opaque_sp.get() && symbol_name && symbol_name[0])
Chris Lattner24943d22010-06-08 16:52:24 +0000448 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000449 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Chris Lattner24943d22010-06-08 16:52:24 +0000450 if (module_name && module_name[0])
451 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000452 FileSpec module_file_spec(module_name, false);
Jim Ingham7ec03bd2010-09-30 21:21:43 +0000453 *sb_bp = m_opaque_sp->CreateBreakpoint (&module_file_spec, symbol_name, eFunctionNameTypeFull | eFunctionNameTypeBase, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000454 }
455 else
456 {
Jim Ingham7ec03bd2010-09-30 21:21:43 +0000457 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, symbol_name, eFunctionNameTypeFull | eFunctionNameTypeBase, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000458 }
459 }
Caroline Tice7826c882010-10-26 03:11:13 +0000460
461 if (log)
462 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000463 log->Printf ("SBTarget(%p)::BreakpointCreateByName (symbol=\"%s\", module=\"%s\") => SBBreakpoint(%p)",
464 m_opaque_sp.get(), symbol_name, module_name, sb_bp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000465 }
466
Chris Lattner24943d22010-06-08 16:52:24 +0000467 return sb_bp;
468}
469
470SBBreakpoint
471SBTarget::BreakpointCreateByRegex (const char *symbol_name_regex, const char *module_name)
472{
Greg Claytone005f2c2010-11-06 01:53:30 +0000473 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000474
Chris Lattner24943d22010-06-08 16:52:24 +0000475 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000476 if (m_opaque_sp.get() && symbol_name_regex && symbol_name_regex[0])
Chris Lattner24943d22010-06-08 16:52:24 +0000477 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000478 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Chris Lattner24943d22010-06-08 16:52:24 +0000479 RegularExpression regexp(symbol_name_regex);
480
481 if (module_name && module_name[0])
482 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000483 FileSpec module_file_spec(module_name, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000484
Greg Clayton63094e02010-06-23 01:19:29 +0000485 *sb_bp = m_opaque_sp->CreateBreakpoint (&module_file_spec, regexp, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000486 }
487 else
488 {
Greg Clayton63094e02010-06-23 01:19:29 +0000489 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, regexp, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000490 }
491 }
Caroline Tice7826c882010-10-26 03:11:13 +0000492
493 if (log)
494 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000495 log->Printf ("SBTarget(%p)::BreakpointCreateByRegex (symbol_regex=\"%s\", module_name=\"%s\") => SBBreakpoint(%p)",
496 m_opaque_sp.get(), symbol_name_regex, module_name, sb_bp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000497 }
498
Chris Lattner24943d22010-06-08 16:52:24 +0000499 return sb_bp;
500}
501
502
503
504SBBreakpoint
505SBTarget::BreakpointCreateByAddress (addr_t address)
506{
Greg Claytone005f2c2010-11-06 01:53:30 +0000507 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000508
Chris Lattner24943d22010-06-08 16:52:24 +0000509 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000510 if (m_opaque_sp.get())
Greg Claytonbdcda462010-12-20 20:49:23 +0000511 {
512 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000513 *sb_bp = m_opaque_sp->CreateBreakpoint (address, false);
Greg Claytonbdcda462010-12-20 20:49:23 +0000514 }
Caroline Tice7826c882010-10-26 03:11:13 +0000515
516 if (log)
517 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000518 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 +0000519 }
520
Chris Lattner24943d22010-06-08 16:52:24 +0000521 return sb_bp;
522}
523
Chris Lattner24943d22010-06-08 16:52:24 +0000524SBBreakpoint
525SBTarget::FindBreakpointByID (break_id_t bp_id)
526{
Greg Claytone005f2c2010-11-06 01:53:30 +0000527 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000528
Chris Lattner24943d22010-06-08 16:52:24 +0000529 SBBreakpoint sb_breakpoint;
Greg Clayton63094e02010-06-23 01:19:29 +0000530 if (m_opaque_sp && bp_id != LLDB_INVALID_BREAK_ID)
Greg Claytonbdcda462010-12-20 20:49:23 +0000531 {
532 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000533 *sb_breakpoint = m_opaque_sp->GetBreakpointByID (bp_id);
Greg Claytonbdcda462010-12-20 20:49:23 +0000534 }
Caroline Tice7826c882010-10-26 03:11:13 +0000535
536 if (log)
537 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000538 log->Printf ("SBTarget(%p)::FindBreakpointByID (bp_id=%d) => SBBreakpoint(%p)",
539 m_opaque_sp.get(), (uint32_t) bp_id, sb_breakpoint.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000540 }
541
Chris Lattner24943d22010-06-08 16:52:24 +0000542 return sb_breakpoint;
543}
544
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000545uint32_t
546SBTarget::GetNumBreakpoints () const
547{
548 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000549 {
550 // The breakpoint list is thread safe, no need to lock
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000551 return m_opaque_sp->GetBreakpointList().GetSize();
Greg Claytonbdcda462010-12-20 20:49:23 +0000552 }
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000553 return 0;
554}
555
556SBBreakpoint
557SBTarget::GetBreakpointAtIndex (uint32_t idx) const
558{
559 SBBreakpoint sb_breakpoint;
560 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000561 {
562 // The breakpoint list is thread safe, no need to lock
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000563 *sb_breakpoint = m_opaque_sp->GetBreakpointList().GetBreakpointAtIndex(idx);
Greg Claytonbdcda462010-12-20 20:49:23 +0000564 }
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000565 return sb_breakpoint;
566}
Chris Lattner24943d22010-06-08 16:52:24 +0000567
568bool
569SBTarget::BreakpointDelete (break_id_t bp_id)
570{
Greg Claytone005f2c2010-11-06 01:53:30 +0000571 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000572
Caroline Tice7826c882010-10-26 03:11:13 +0000573 bool result = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000574 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000575 {
576 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Caroline Tice7826c882010-10-26 03:11:13 +0000577 result = m_opaque_sp->RemoveBreakpointByID (bp_id);
Greg Claytonbdcda462010-12-20 20:49:23 +0000578 }
Caroline Tice7826c882010-10-26 03:11:13 +0000579
580 if (log)
581 {
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000582 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 +0000583 }
584
585 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000586}
587
588bool
589SBTarget::EnableAllBreakpoints ()
590{
Greg Clayton63094e02010-06-23 01:19:29 +0000591 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000592 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000593 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000594 m_opaque_sp->EnableAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000595 return true;
596 }
597 return false;
598}
599
600bool
601SBTarget::DisableAllBreakpoints ()
602{
Greg Clayton63094e02010-06-23 01:19:29 +0000603 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000604 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000605 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000606 m_opaque_sp->DisableAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000607 return true;
608 }
609 return false;
610}
611
612bool
613SBTarget::DeleteAllBreakpoints ()
614{
Greg Clayton63094e02010-06-23 01:19:29 +0000615 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000616 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000617 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000618 m_opaque_sp->RemoveAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000619 return true;
620 }
621 return false;
622}
623
624
625uint32_t
626SBTarget::GetNumModules () const
627{
Greg Claytone005f2c2010-11-06 01:53:30 +0000628 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000629
Caroline Tice7826c882010-10-26 03:11:13 +0000630 uint32_t num = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000631 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000632 {
633 // The module list is thread safe, no need to lock
634 num = m_opaque_sp->GetImages().GetSize();
635 }
Caroline Tice7826c882010-10-26 03:11:13 +0000636
637 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000638 log->Printf ("SBTarget(%p)::GetNumModules () => %d", m_opaque_sp.get(), num);
Caroline Tice7826c882010-10-26 03:11:13 +0000639
640 return num;
Chris Lattner24943d22010-06-08 16:52:24 +0000641}
642
Greg Clayton43490d12010-07-30 20:12:55 +0000643void
644SBTarget::Clear ()
645{
Greg Claytone005f2c2010-11-06 01:53:30 +0000646 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000647
648 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000649 log->Printf ("SBTarget(%p)::Clear ()", m_opaque_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000650
Greg Clayton43490d12010-07-30 20:12:55 +0000651 m_opaque_sp.reset();
652}
653
654
Chris Lattner24943d22010-06-08 16:52:24 +0000655SBModule
656SBTarget::FindModule (const SBFileSpec &sb_file_spec)
657{
658 SBModule sb_module;
Greg Clayton63094e02010-06-23 01:19:29 +0000659 if (m_opaque_sp && sb_file_spec.IsValid())
Greg Claytonbdcda462010-12-20 20:49:23 +0000660 {
661 // The module list is thread safe, no need to lock
Greg Clayton63094e02010-06-23 01:19:29 +0000662 sb_module.SetModule (m_opaque_sp->GetImages().FindFirstModuleForFileSpec (*sb_file_spec, NULL));
Greg Claytonbdcda462010-12-20 20:49:23 +0000663 }
Chris Lattner24943d22010-06-08 16:52:24 +0000664 return sb_module;
665}
666
667SBModule
668SBTarget::GetModuleAtIndex (uint32_t idx)
669{
Greg Claytone005f2c2010-11-06 01:53:30 +0000670 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000671
Chris Lattner24943d22010-06-08 16:52:24 +0000672 SBModule sb_module;
Greg Clayton63094e02010-06-23 01:19:29 +0000673 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000674 {
675 // The module list is thread safe, no need to lock
Greg Clayton63094e02010-06-23 01:19:29 +0000676 sb_module.SetModule(m_opaque_sp->GetImages().GetModuleAtIndex(idx));
Greg Claytonbdcda462010-12-20 20:49:23 +0000677 }
Caroline Tice7826c882010-10-26 03:11:13 +0000678
679 if (log)
680 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000681 log->Printf ("SBTarget(%p)::GetModuleAtIndex (idx=%d) => SBModule(%p)",
682 m_opaque_sp.get(), idx, sb_module.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000683 }
684
Chris Lattner24943d22010-06-08 16:52:24 +0000685 return sb_module;
686}
687
688
689SBBroadcaster
690SBTarget::GetBroadcaster () const
691{
Greg Claytone005f2c2010-11-06 01:53:30 +0000692 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000693
Greg Clayton63094e02010-06-23 01:19:29 +0000694 SBBroadcaster broadcaster(m_opaque_sp.get(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000695
696 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000697 log->Printf ("SBTarget(%p)::GetBroadcaster () => SBBroadcaster(%p)",
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000698 m_opaque_sp.get(), broadcaster.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000699
Chris Lattner24943d22010-06-08 16:52:24 +0000700 return broadcaster;
701}
702
Caroline Tice98f930f2010-09-20 05:20:02 +0000703
704bool
Caroline Tice7826c882010-10-26 03:11:13 +0000705SBTarget::GetDescription (SBStream &description, lldb::DescriptionLevel description_level)
Caroline Tice98f930f2010-09-20 05:20:02 +0000706{
707 if (m_opaque_sp)
Caroline Ticee7a566e2010-09-20 16:21:41 +0000708 {
Caroline Ticee49ec182010-09-22 23:01:29 +0000709 description.ref();
Caroline Tice7826c882010-10-26 03:11:13 +0000710 m_opaque_sp->Dump (description.get(), description_level);
711 }
712 else
713 description.Printf ("No value");
714
715 return true;
716}
717
718bool
719SBTarget::GetDescription (SBStream &description, lldb::DescriptionLevel description_level) const
720{
721 if (m_opaque_sp)
722 {
723 description.ref();
724 m_opaque_sp->Dump (description.get(), description_level);
Caroline Ticee7a566e2010-09-20 16:21:41 +0000725 }
Caroline Tice98f930f2010-09-20 05:20:02 +0000726 else
727 description.Printf ("No value");
728
729 return true;
730}