blob: b23262b00051b2b8cd7a7fe91cb899cd75fc0889 [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 Claytonc5f728c2010-10-06 22:10:17 +0000119SBProcess
120SBTarget::LaunchProcess
121(
122 char const **argv,
123 char const **envp,
124 const char *tty,
125 uint32_t launch_flags,
Greg Claytond8c62532010-10-07 04:19:01 +0000126 bool stop_at_entry
127)
128{
Greg Claytone005f2c2010-11-06 01:53:30 +0000129 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000130
131 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000132 log->Printf ("SBTarget(%p)::LaunchProcess (argv=%p, envp=%p, tty=\"%s\", launch_flags=%d, stop_at_entry=%i)",
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000133 m_opaque_sp.get(), argv, envp, tty, launch_flags, stop_at_entry);
Caroline Tice7826c882010-10-26 03:11:13 +0000134
Greg Claytond8c62532010-10-07 04:19:01 +0000135 SBError sb_error;
Caroline Tice7826c882010-10-26 03:11:13 +0000136 SBProcess sb_process = Launch (argv, envp, tty, launch_flags, stop_at_entry, sb_error);
137
Caroline Tice926060e2010-10-29 21:48:37 +0000138 log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +0000139 if (log)
140 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000141 log->Printf ("SBTarget(%p)::LaunchProcess (...) => SBProcess(%p)",
142 m_opaque_sp.get(), sb_process.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000143 }
144
145 return sb_process;
Greg Claytond8c62532010-10-07 04:19:01 +0000146}
147
148SBProcess
149SBTarget::Launch
150(
151 char const **argv,
152 char const **envp,
153 const char *tty,
154 uint32_t launch_flags,
Greg Claytonc5f728c2010-10-06 22:10:17 +0000155 bool stop_at_entry,
156 SBError &error
157)
158{
Greg Claytone005f2c2010-11-06 01:53:30 +0000159 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000160
161 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000162 {
Greg Claytona66ba462010-10-30 04:51:46 +0000163 log->Printf ("SBTarget(%p)::Launch (argv=%p, envp=%p, tty=\"%s\", launch_flags=%d, stop_at_entry=%i, &error (%p))...",
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000164 m_opaque_sp.get(), argv, envp, tty, launch_flags, stop_at_entry, error.get());
165 }
Greg Clayton1a3083a2010-10-06 03:53:16 +0000166 SBProcess sb_process;
167 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000168 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000169 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
170 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
Greg Clayton1a3083a2010-10-06 03:53:16 +0000171
172 if (sb_process.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000173 {
Greg Claytonc5f728c2010-10-06 22:10:17 +0000174 error.SetError (sb_process->Launch (argv, envp, launch_flags, tty, tty, tty));
Greg Clayton1a3083a2010-10-06 03:53:16 +0000175 if (error.Success())
Chris Lattner24943d22010-06-08 16:52:24 +0000176 {
Sean Callanan451ee7c2010-10-07 22:51:14 +0000177 // We we are stopping at the entry point, we can return now!
178 if (stop_at_entry)
179 return sb_process;
180
Greg Clayton1a3083a2010-10-06 03:53:16 +0000181 // Make sure we are stopped at the entry
182 StateType state = sb_process->WaitForProcessToStop (NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000183 if (state == eStateStopped)
Greg Clayton1a3083a2010-10-06 03:53:16 +0000184 {
185 // resume the process to skip the entry point
Greg Claytonc5f728c2010-10-06 22:10:17 +0000186 error.SetError (sb_process->Resume());
Greg Clayton1a3083a2010-10-06 03:53:16 +0000187 if (error.Success())
188 {
189 // If we are doing synchronous mode, then wait for the
190 // process to stop yet again!
191 if (m_opaque_sp->GetDebugger().GetAsyncExecution () == false)
192 sb_process->WaitForProcessToStop (NULL);
193 }
194 }
Chris Lattner24943d22010-06-08 16:52:24 +0000195 }
196 }
Greg Claytonc5f728c2010-10-06 22:10:17 +0000197 else
198 {
199 error.SetErrorString ("unable to create lldb_private::Process");
200 }
201 }
202 else
203 {
204 error.SetErrorString ("SBTarget is invalid");
Chris Lattner24943d22010-06-08 16:52:24 +0000205 }
Caroline Tice7826c882010-10-26 03:11:13 +0000206
Caroline Tice926060e2010-10-29 21:48:37 +0000207 log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +0000208 if (log)
209 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000210 log->Printf ("SBTarget(%p)::Launch (...) => SBProceess(%p)",
211 m_opaque_sp.get(), sb_process.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000212 }
213
Greg Clayton1a3083a2010-10-06 03:53:16 +0000214 return sb_process;
Chris Lattner24943d22010-06-08 16:52:24 +0000215}
216
Greg Claytonc5f728c2010-10-06 22:10:17 +0000217
218lldb::SBProcess
Greg Claytond8c62532010-10-07 04:19:01 +0000219SBTarget::AttachToProcessWithID
Greg Claytonc5f728c2010-10-06 22:10:17 +0000220(
221 lldb::pid_t pid,// The process ID to attach to
222 SBError& error // An error explaining what went wrong if attach fails
223)
224{
225 SBProcess sb_process;
226 if (m_opaque_sp)
227 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000228 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
229 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
Greg Claytonc5f728c2010-10-06 22:10:17 +0000230
231 if (sb_process.IsValid())
232 {
233 error.SetError (sb_process->Attach (pid));
234 }
235 else
236 {
237 error.SetErrorString ("unable to create lldb_private::Process");
238 }
239 }
240 else
241 {
242 error.SetErrorString ("SBTarget is invalid");
243 }
244 return sb_process;
245
246}
247
248lldb::SBProcess
Greg Claytond8c62532010-10-07 04:19:01 +0000249SBTarget::AttachToProcessWithName
Greg Claytonc5f728c2010-10-06 22:10:17 +0000250(
251 const char *name, // basename of process to attach to
252 bool wait_for, // if true wait for a new instance of "name" to be launched
253 SBError& error // An error explaining what went wrong if attach fails
254)
255{
256 SBProcess sb_process;
257 if (m_opaque_sp)
258 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000259 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
260
261 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
Greg Claytonc5f728c2010-10-06 22:10:17 +0000262
263 if (sb_process.IsValid())
264 {
265 error.SetError (sb_process->Attach (name, wait_for));
266 }
267 else
268 {
269 error.SetErrorString ("unable to create lldb_private::Process");
270 }
271 }
272 else
273 {
274 error.SetErrorString ("SBTarget is invalid");
275 }
276 return sb_process;
277
278}
279
Chris Lattner24943d22010-06-08 16:52:24 +0000280SBFileSpec
281SBTarget::GetExecutable ()
282{
Caroline Tice7826c882010-10-26 03:11:13 +0000283
Chris Lattner24943d22010-06-08 16:52:24 +0000284 SBFileSpec exe_file_spec;
Greg Clayton63094e02010-06-23 01:19:29 +0000285 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000286 {
Greg Clayton63094e02010-06-23 01:19:29 +0000287 ModuleSP exe_module_sp (m_opaque_sp->GetExecutableModule ());
Chris Lattner24943d22010-06-08 16:52:24 +0000288 if (exe_module_sp)
289 exe_file_spec.SetFileSpec (exe_module_sp->GetFileSpec());
290 }
Caroline Tice7826c882010-10-26 03:11:13 +0000291
Greg Claytone005f2c2010-11-06 01:53:30 +0000292 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000293 if (log)
294 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000295 log->Printf ("SBTarget(%p)::GetExecutable () => SBFileSpec(%p)",
296 m_opaque_sp.get(), exe_file_spec.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000297 }
298
Chris Lattner24943d22010-06-08 16:52:24 +0000299 return exe_file_spec;
300}
301
302
303bool
304SBTarget::DeleteTargetFromList (TargetList *list)
305{
Greg Clayton63094e02010-06-23 01:19:29 +0000306 if (m_opaque_sp)
307 return list->DeleteTarget (m_opaque_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000308 else
309 return false;
310}
311
312bool
Chris Lattner24943d22010-06-08 16:52:24 +0000313SBTarget::operator == (const SBTarget &rhs) const
314{
Greg Clayton63094e02010-06-23 01:19:29 +0000315 return m_opaque_sp.get() == rhs.m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000316}
317
318bool
319SBTarget::operator != (const SBTarget &rhs) const
320{
Greg Clayton63094e02010-06-23 01:19:29 +0000321 return m_opaque_sp.get() != rhs.m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000322}
323
324lldb_private::Target *
Greg Clayton63094e02010-06-23 01:19:29 +0000325SBTarget::operator ->() const
Chris Lattner24943d22010-06-08 16:52:24 +0000326{
Greg Clayton63094e02010-06-23 01:19:29 +0000327 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000328}
Greg Clayton63094e02010-06-23 01:19:29 +0000329
330lldb_private::Target *
331SBTarget::get() const
Chris Lattner24943d22010-06-08 16:52:24 +0000332{
Greg Clayton63094e02010-06-23 01:19:29 +0000333 return m_opaque_sp.get();
334}
335
336void
337SBTarget::reset (const lldb::TargetSP& target_sp)
338{
339 m_opaque_sp = target_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000340}
341
Greg Claytonea49cc72010-12-12 19:25:26 +0000342bool
343SBTarget::ResolveLoadAddress (lldb::addr_t vm_addr,
344 lldb::SBAddress& addr)
345{
346 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000347 {
348 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Claytonea49cc72010-12-12 19:25:26 +0000349 return m_opaque_sp->GetSectionLoadList().ResolveLoadAddress (vm_addr, *addr);
Greg Claytonbdcda462010-12-20 20:49:23 +0000350 }
Greg Claytonea49cc72010-12-12 19:25:26 +0000351
352 addr->Clear();
353 return false;
354}
355
Chris Lattner24943d22010-06-08 16:52:24 +0000356SBBreakpoint
357SBTarget::BreakpointCreateByLocation (const char *file, uint32_t line)
358{
Greg Claytond6d806c2010-11-08 00:28:40 +0000359 return SBBreakpoint(BreakpointCreateByLocation (SBFileSpec (file, false), line));
Chris Lattner24943d22010-06-08 16:52:24 +0000360}
361
362SBBreakpoint
363SBTarget::BreakpointCreateByLocation (const SBFileSpec &sb_file_spec, uint32_t line)
364{
Greg Claytone005f2c2010-11-06 01:53:30 +0000365 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000366
Chris Lattner24943d22010-06-08 16:52:24 +0000367 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000368 if (m_opaque_sp.get() && line != 0)
Greg Claytonbdcda462010-12-20 20:49:23 +0000369 {
370 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000371 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, *sb_file_spec, line, true, false);
Greg Claytonbdcda462010-12-20 20:49:23 +0000372 }
Caroline Tice7826c882010-10-26 03:11:13 +0000373
374 if (log)
375 {
376 SBStream sstr;
377 sb_bp.GetDescription (sstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000378 char path[PATH_MAX];
379 sb_file_spec->GetPath (path, sizeof(path));
380 log->Printf ("SBTarget(%p)::BreakpointCreateByLocation ( %s:%u ) => SBBreakpoint(%p): %s",
Greg Claytona66ba462010-10-30 04:51:46 +0000381 m_opaque_sp.get(),
Greg Clayton49ce6822010-10-31 03:01:06 +0000382 path,
Greg Claytona66ba462010-10-30 04:51:46 +0000383 line,
Greg Clayton49ce6822010-10-31 03:01:06 +0000384 sb_bp.get(),
Caroline Tice7826c882010-10-26 03:11:13 +0000385 sstr.GetData());
386 }
387
Chris Lattner24943d22010-06-08 16:52:24 +0000388 return sb_bp;
389}
390
391SBBreakpoint
392SBTarget::BreakpointCreateByName (const char *symbol_name, const char *module_name)
393{
Greg Claytone005f2c2010-11-06 01:53:30 +0000394 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000395
Chris Lattner24943d22010-06-08 16:52:24 +0000396 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000397 if (m_opaque_sp.get() && symbol_name && symbol_name[0])
Chris Lattner24943d22010-06-08 16:52:24 +0000398 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000399 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Chris Lattner24943d22010-06-08 16:52:24 +0000400 if (module_name && module_name[0])
401 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000402 FileSpec module_file_spec(module_name, false);
Jim Ingham7ec03bd2010-09-30 21:21:43 +0000403 *sb_bp = m_opaque_sp->CreateBreakpoint (&module_file_spec, symbol_name, eFunctionNameTypeFull | eFunctionNameTypeBase, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000404 }
405 else
406 {
Jim Ingham7ec03bd2010-09-30 21:21:43 +0000407 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, symbol_name, eFunctionNameTypeFull | eFunctionNameTypeBase, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000408 }
409 }
Caroline Tice7826c882010-10-26 03:11:13 +0000410
411 if (log)
412 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000413 log->Printf ("SBTarget(%p)::BreakpointCreateByName (symbol=\"%s\", module=\"%s\") => SBBreakpoint(%p)",
414 m_opaque_sp.get(), symbol_name, module_name, sb_bp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000415 }
416
Chris Lattner24943d22010-06-08 16:52:24 +0000417 return sb_bp;
418}
419
420SBBreakpoint
421SBTarget::BreakpointCreateByRegex (const char *symbol_name_regex, const char *module_name)
422{
Greg Claytone005f2c2010-11-06 01:53:30 +0000423 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000424
Chris Lattner24943d22010-06-08 16:52:24 +0000425 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000426 if (m_opaque_sp.get() && symbol_name_regex && symbol_name_regex[0])
Chris Lattner24943d22010-06-08 16:52:24 +0000427 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000428 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Chris Lattner24943d22010-06-08 16:52:24 +0000429 RegularExpression regexp(symbol_name_regex);
430
431 if (module_name && module_name[0])
432 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000433 FileSpec module_file_spec(module_name, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000434
Greg Clayton63094e02010-06-23 01:19:29 +0000435 *sb_bp = m_opaque_sp->CreateBreakpoint (&module_file_spec, regexp, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000436 }
437 else
438 {
Greg Clayton63094e02010-06-23 01:19:29 +0000439 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, regexp, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000440 }
441 }
Caroline Tice7826c882010-10-26 03:11:13 +0000442
443 if (log)
444 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000445 log->Printf ("SBTarget(%p)::BreakpointCreateByRegex (symbol_regex=\"%s\", module_name=\"%s\") => SBBreakpoint(%p)",
446 m_opaque_sp.get(), symbol_name_regex, module_name, sb_bp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000447 }
448
Chris Lattner24943d22010-06-08 16:52:24 +0000449 return sb_bp;
450}
451
452
453
454SBBreakpoint
455SBTarget::BreakpointCreateByAddress (addr_t address)
456{
Greg Claytone005f2c2010-11-06 01:53:30 +0000457 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000458
Chris Lattner24943d22010-06-08 16:52:24 +0000459 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000460 if (m_opaque_sp.get())
Greg Claytonbdcda462010-12-20 20:49:23 +0000461 {
462 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000463 *sb_bp = m_opaque_sp->CreateBreakpoint (address, false);
Greg Claytonbdcda462010-12-20 20:49:23 +0000464 }
Caroline Tice7826c882010-10-26 03:11:13 +0000465
466 if (log)
467 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000468 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 +0000469 }
470
Chris Lattner24943d22010-06-08 16:52:24 +0000471 return sb_bp;
472}
473
Chris Lattner24943d22010-06-08 16:52:24 +0000474SBBreakpoint
475SBTarget::FindBreakpointByID (break_id_t bp_id)
476{
Greg Claytone005f2c2010-11-06 01:53:30 +0000477 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000478
Chris Lattner24943d22010-06-08 16:52:24 +0000479 SBBreakpoint sb_breakpoint;
Greg Clayton63094e02010-06-23 01:19:29 +0000480 if (m_opaque_sp && bp_id != LLDB_INVALID_BREAK_ID)
Greg Claytonbdcda462010-12-20 20:49:23 +0000481 {
482 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000483 *sb_breakpoint = m_opaque_sp->GetBreakpointByID (bp_id);
Greg Claytonbdcda462010-12-20 20:49:23 +0000484 }
Caroline Tice7826c882010-10-26 03:11:13 +0000485
486 if (log)
487 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000488 log->Printf ("SBTarget(%p)::FindBreakpointByID (bp_id=%d) => SBBreakpoint(%p)",
489 m_opaque_sp.get(), (uint32_t) bp_id, sb_breakpoint.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000490 }
491
Chris Lattner24943d22010-06-08 16:52:24 +0000492 return sb_breakpoint;
493}
494
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000495uint32_t
496SBTarget::GetNumBreakpoints () const
497{
498 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000499 {
500 // The breakpoint list is thread safe, no need to lock
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000501 return m_opaque_sp->GetBreakpointList().GetSize();
Greg Claytonbdcda462010-12-20 20:49:23 +0000502 }
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000503 return 0;
504}
505
506SBBreakpoint
507SBTarget::GetBreakpointAtIndex (uint32_t idx) const
508{
509 SBBreakpoint sb_breakpoint;
510 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000511 {
512 // The breakpoint list is thread safe, no need to lock
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000513 *sb_breakpoint = m_opaque_sp->GetBreakpointList().GetBreakpointAtIndex(idx);
Greg Claytonbdcda462010-12-20 20:49:23 +0000514 }
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000515 return sb_breakpoint;
516}
Chris Lattner24943d22010-06-08 16:52:24 +0000517
518bool
519SBTarget::BreakpointDelete (break_id_t bp_id)
520{
Greg Claytone005f2c2010-11-06 01:53:30 +0000521 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000522
Caroline Tice7826c882010-10-26 03:11:13 +0000523 bool result = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000524 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000525 {
526 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Caroline Tice7826c882010-10-26 03:11:13 +0000527 result = m_opaque_sp->RemoveBreakpointByID (bp_id);
Greg Claytonbdcda462010-12-20 20:49:23 +0000528 }
Caroline Tice7826c882010-10-26 03:11:13 +0000529
530 if (log)
531 {
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000532 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 +0000533 }
534
535 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000536}
537
538bool
539SBTarget::EnableAllBreakpoints ()
540{
Greg Clayton63094e02010-06-23 01:19:29 +0000541 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000542 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000543 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000544 m_opaque_sp->EnableAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000545 return true;
546 }
547 return false;
548}
549
550bool
551SBTarget::DisableAllBreakpoints ()
552{
Greg Clayton63094e02010-06-23 01:19:29 +0000553 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000554 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000555 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000556 m_opaque_sp->DisableAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000557 return true;
558 }
559 return false;
560}
561
562bool
563SBTarget::DeleteAllBreakpoints ()
564{
Greg Clayton63094e02010-06-23 01:19:29 +0000565 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000566 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000567 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000568 m_opaque_sp->RemoveAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000569 return true;
570 }
571 return false;
572}
573
574
575uint32_t
576SBTarget::GetNumModules () const
577{
Greg Claytone005f2c2010-11-06 01:53:30 +0000578 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000579
Caroline Tice7826c882010-10-26 03:11:13 +0000580 uint32_t num = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000581 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000582 {
583 // The module list is thread safe, no need to lock
584 num = m_opaque_sp->GetImages().GetSize();
585 }
Caroline Tice7826c882010-10-26 03:11:13 +0000586
587 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000588 log->Printf ("SBTarget(%p)::GetNumModules () => %d", m_opaque_sp.get(), num);
Caroline Tice7826c882010-10-26 03:11:13 +0000589
590 return num;
Chris Lattner24943d22010-06-08 16:52:24 +0000591}
592
Greg Clayton43490d12010-07-30 20:12:55 +0000593void
594SBTarget::Clear ()
595{
Greg Claytone005f2c2010-11-06 01:53:30 +0000596 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000597
598 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000599 log->Printf ("SBTarget(%p)::Clear ()", m_opaque_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000600
Greg Clayton43490d12010-07-30 20:12:55 +0000601 m_opaque_sp.reset();
602}
603
604
Chris Lattner24943d22010-06-08 16:52:24 +0000605SBModule
606SBTarget::FindModule (const SBFileSpec &sb_file_spec)
607{
608 SBModule sb_module;
Greg Clayton63094e02010-06-23 01:19:29 +0000609 if (m_opaque_sp && sb_file_spec.IsValid())
Greg Claytonbdcda462010-12-20 20:49:23 +0000610 {
611 // The module list is thread safe, no need to lock
Greg Clayton63094e02010-06-23 01:19:29 +0000612 sb_module.SetModule (m_opaque_sp->GetImages().FindFirstModuleForFileSpec (*sb_file_spec, NULL));
Greg Claytonbdcda462010-12-20 20:49:23 +0000613 }
Chris Lattner24943d22010-06-08 16:52:24 +0000614 return sb_module;
615}
616
617SBModule
618SBTarget::GetModuleAtIndex (uint32_t idx)
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
Chris Lattner24943d22010-06-08 16:52:24 +0000622 SBModule sb_module;
Greg Clayton63094e02010-06-23 01:19:29 +0000623 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000624 {
625 // The module list is thread safe, no need to lock
Greg Clayton63094e02010-06-23 01:19:29 +0000626 sb_module.SetModule(m_opaque_sp->GetImages().GetModuleAtIndex(idx));
Greg Claytonbdcda462010-12-20 20:49:23 +0000627 }
Caroline Tice7826c882010-10-26 03:11:13 +0000628
629 if (log)
630 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000631 log->Printf ("SBTarget(%p)::GetModuleAtIndex (idx=%d) => SBModule(%p)",
632 m_opaque_sp.get(), idx, sb_module.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000633 }
634
Chris Lattner24943d22010-06-08 16:52:24 +0000635 return sb_module;
636}
637
638
639SBBroadcaster
640SBTarget::GetBroadcaster () const
641{
Greg Claytone005f2c2010-11-06 01:53:30 +0000642 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000643
Greg Clayton63094e02010-06-23 01:19:29 +0000644 SBBroadcaster broadcaster(m_opaque_sp.get(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000645
646 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000647 log->Printf ("SBTarget(%p)::GetBroadcaster () => SBBroadcaster(%p)",
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000648 m_opaque_sp.get(), broadcaster.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000649
Chris Lattner24943d22010-06-08 16:52:24 +0000650 return broadcaster;
651}
652
Caroline Tice98f930f2010-09-20 05:20:02 +0000653
654bool
Caroline Tice7826c882010-10-26 03:11:13 +0000655SBTarget::GetDescription (SBStream &description, lldb::DescriptionLevel description_level)
Caroline Tice98f930f2010-09-20 05:20:02 +0000656{
657 if (m_opaque_sp)
Caroline Ticee7a566e2010-09-20 16:21:41 +0000658 {
Caroline Ticee49ec182010-09-22 23:01:29 +0000659 description.ref();
Caroline Tice7826c882010-10-26 03:11:13 +0000660 m_opaque_sp->Dump (description.get(), description_level);
661 }
662 else
663 description.Printf ("No value");
664
665 return true;
666}
667
668bool
669SBTarget::GetDescription (SBStream &description, lldb::DescriptionLevel description_level) const
670{
671 if (m_opaque_sp)
672 {
673 description.ref();
674 m_opaque_sp->Dump (description.get(), description_level);
Caroline Ticee7a566e2010-09-20 16:21:41 +0000675 }
Caroline Tice98f930f2010-09-20 05:20:02 +0000676 else
677 description.Printf ("No value");
678
679 return true;
680}