blob: 13d227700bdd8f9c483f1b01cf46260db5420c0d [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());
154 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
Greg Clayton1a3083a2010-10-06 03:53:16 +0000155
156 if (sb_process.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000157 {
Greg Claytonde915be2011-01-23 05:56:20 +0000158 error.SetError (sb_process->Launch (argv, envp, launch_flags, stdin_path, stdout_path, stderr_path, working_directory));
Greg Clayton1a3083a2010-10-06 03:53:16 +0000159 if (error.Success())
Chris Lattner24943d22010-06-08 16:52:24 +0000160 {
Sean Callanan451ee7c2010-10-07 22:51:14 +0000161 // We we are stopping at the entry point, we can return now!
162 if (stop_at_entry)
163 return sb_process;
164
Greg Clayton1a3083a2010-10-06 03:53:16 +0000165 // Make sure we are stopped at the entry
166 StateType state = sb_process->WaitForProcessToStop (NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000167 if (state == eStateStopped)
Greg Clayton1a3083a2010-10-06 03:53:16 +0000168 {
169 // resume the process to skip the entry point
Greg Claytonc5f728c2010-10-06 22:10:17 +0000170 error.SetError (sb_process->Resume());
Greg Clayton1a3083a2010-10-06 03:53:16 +0000171 if (error.Success())
172 {
173 // If we are doing synchronous mode, then wait for the
174 // process to stop yet again!
175 if (m_opaque_sp->GetDebugger().GetAsyncExecution () == false)
176 sb_process->WaitForProcessToStop (NULL);
177 }
178 }
Chris Lattner24943d22010-06-08 16:52:24 +0000179 }
180 }
Greg Claytonc5f728c2010-10-06 22:10:17 +0000181 else
182 {
183 error.SetErrorString ("unable to create lldb_private::Process");
184 }
185 }
186 else
187 {
188 error.SetErrorString ("SBTarget is invalid");
Chris Lattner24943d22010-06-08 16:52:24 +0000189 }
Caroline Tice7826c882010-10-26 03:11:13 +0000190
Caroline Tice926060e2010-10-29 21:48:37 +0000191 log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +0000192 if (log)
193 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000194 log->Printf ("SBTarget(%p)::Launch (...) => SBProceess(%p)",
195 m_opaque_sp.get(), sb_process.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000196 }
197
Greg Clayton1a3083a2010-10-06 03:53:16 +0000198 return sb_process;
Chris Lattner24943d22010-06-08 16:52:24 +0000199}
200
Greg Claytonc5f728c2010-10-06 22:10:17 +0000201
202lldb::SBProcess
Greg Claytond8c62532010-10-07 04:19:01 +0000203SBTarget::AttachToProcessWithID
Greg Claytonc5f728c2010-10-06 22:10:17 +0000204(
205 lldb::pid_t pid,// The process ID to attach to
206 SBError& error // An error explaining what went wrong if attach fails
207)
208{
209 SBProcess sb_process;
210 if (m_opaque_sp)
211 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000212 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
213 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
Greg Claytonc5f728c2010-10-06 22:10:17 +0000214
215 if (sb_process.IsValid())
216 {
217 error.SetError (sb_process->Attach (pid));
218 }
219 else
220 {
221 error.SetErrorString ("unable to create lldb_private::Process");
222 }
223 }
224 else
225 {
226 error.SetErrorString ("SBTarget is invalid");
227 }
228 return sb_process;
229
230}
231
232lldb::SBProcess
Greg Claytond8c62532010-10-07 04:19:01 +0000233SBTarget::AttachToProcessWithName
Greg Claytonc5f728c2010-10-06 22:10:17 +0000234(
235 const char *name, // basename of process to attach to
236 bool wait_for, // if true wait for a new instance of "name" to be launched
237 SBError& error // An error explaining what went wrong if attach fails
238)
239{
240 SBProcess sb_process;
241 if (m_opaque_sp)
242 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000243 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
244
245 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
Greg Claytonc5f728c2010-10-06 22:10:17 +0000246
247 if (sb_process.IsValid())
248 {
249 error.SetError (sb_process->Attach (name, wait_for));
250 }
251 else
252 {
253 error.SetErrorString ("unable to create lldb_private::Process");
254 }
255 }
256 else
257 {
258 error.SetErrorString ("SBTarget is invalid");
259 }
260 return sb_process;
261
262}
263
Chris Lattner24943d22010-06-08 16:52:24 +0000264SBFileSpec
265SBTarget::GetExecutable ()
266{
Caroline Tice7826c882010-10-26 03:11:13 +0000267
Chris Lattner24943d22010-06-08 16:52:24 +0000268 SBFileSpec exe_file_spec;
Greg Clayton63094e02010-06-23 01:19:29 +0000269 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000270 {
Greg Clayton63094e02010-06-23 01:19:29 +0000271 ModuleSP exe_module_sp (m_opaque_sp->GetExecutableModule ());
Chris Lattner24943d22010-06-08 16:52:24 +0000272 if (exe_module_sp)
273 exe_file_spec.SetFileSpec (exe_module_sp->GetFileSpec());
274 }
Caroline Tice7826c882010-10-26 03:11:13 +0000275
Greg Claytone005f2c2010-11-06 01:53:30 +0000276 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000277 if (log)
278 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000279 log->Printf ("SBTarget(%p)::GetExecutable () => SBFileSpec(%p)",
280 m_opaque_sp.get(), exe_file_spec.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000281 }
282
Chris Lattner24943d22010-06-08 16:52:24 +0000283 return exe_file_spec;
284}
285
286
287bool
288SBTarget::DeleteTargetFromList (TargetList *list)
289{
Greg Clayton63094e02010-06-23 01:19:29 +0000290 if (m_opaque_sp)
291 return list->DeleteTarget (m_opaque_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000292 else
293 return false;
294}
295
296bool
Chris Lattner24943d22010-06-08 16:52:24 +0000297SBTarget::operator == (const SBTarget &rhs) const
298{
Greg Clayton63094e02010-06-23 01:19:29 +0000299 return m_opaque_sp.get() == rhs.m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000300}
301
302bool
303SBTarget::operator != (const SBTarget &rhs) const
304{
Greg Clayton63094e02010-06-23 01:19:29 +0000305 return m_opaque_sp.get() != rhs.m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000306}
307
308lldb_private::Target *
Greg Clayton63094e02010-06-23 01:19:29 +0000309SBTarget::operator ->() const
Chris Lattner24943d22010-06-08 16:52:24 +0000310{
Greg Clayton63094e02010-06-23 01:19:29 +0000311 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000312}
Greg Clayton63094e02010-06-23 01:19:29 +0000313
314lldb_private::Target *
315SBTarget::get() const
Chris Lattner24943d22010-06-08 16:52:24 +0000316{
Greg Clayton63094e02010-06-23 01:19:29 +0000317 return m_opaque_sp.get();
318}
319
320void
321SBTarget::reset (const lldb::TargetSP& target_sp)
322{
323 m_opaque_sp = target_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000324}
325
Greg Claytonea49cc72010-12-12 19:25:26 +0000326bool
327SBTarget::ResolveLoadAddress (lldb::addr_t vm_addr,
328 lldb::SBAddress& addr)
329{
330 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000331 {
332 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Claytonea49cc72010-12-12 19:25:26 +0000333 return m_opaque_sp->GetSectionLoadList().ResolveLoadAddress (vm_addr, *addr);
Greg Claytonbdcda462010-12-20 20:49:23 +0000334 }
Greg Claytonea49cc72010-12-12 19:25:26 +0000335
336 addr->Clear();
337 return false;
338}
339
Chris Lattner24943d22010-06-08 16:52:24 +0000340SBBreakpoint
341SBTarget::BreakpointCreateByLocation (const char *file, uint32_t line)
342{
Greg Claytond6d806c2010-11-08 00:28:40 +0000343 return SBBreakpoint(BreakpointCreateByLocation (SBFileSpec (file, false), line));
Chris Lattner24943d22010-06-08 16:52:24 +0000344}
345
346SBBreakpoint
347SBTarget::BreakpointCreateByLocation (const SBFileSpec &sb_file_spec, uint32_t line)
348{
Greg Claytone005f2c2010-11-06 01:53:30 +0000349 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000350
Chris Lattner24943d22010-06-08 16:52:24 +0000351 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000352 if (m_opaque_sp.get() && line != 0)
Greg Claytonbdcda462010-12-20 20:49:23 +0000353 {
354 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000355 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, *sb_file_spec, line, true, false);
Greg Claytonbdcda462010-12-20 20:49:23 +0000356 }
Caroline Tice7826c882010-10-26 03:11:13 +0000357
358 if (log)
359 {
360 SBStream sstr;
361 sb_bp.GetDescription (sstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000362 char path[PATH_MAX];
363 sb_file_spec->GetPath (path, sizeof(path));
364 log->Printf ("SBTarget(%p)::BreakpointCreateByLocation ( %s:%u ) => SBBreakpoint(%p): %s",
Greg Claytona66ba462010-10-30 04:51:46 +0000365 m_opaque_sp.get(),
Greg Clayton49ce6822010-10-31 03:01:06 +0000366 path,
Greg Claytona66ba462010-10-30 04:51:46 +0000367 line,
Greg Clayton49ce6822010-10-31 03:01:06 +0000368 sb_bp.get(),
Caroline Tice7826c882010-10-26 03:11:13 +0000369 sstr.GetData());
370 }
371
Chris Lattner24943d22010-06-08 16:52:24 +0000372 return sb_bp;
373}
374
375SBBreakpoint
376SBTarget::BreakpointCreateByName (const char *symbol_name, const char *module_name)
377{
Greg Claytone005f2c2010-11-06 01:53:30 +0000378 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000379
Chris Lattner24943d22010-06-08 16:52:24 +0000380 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000381 if (m_opaque_sp.get() && symbol_name && symbol_name[0])
Chris Lattner24943d22010-06-08 16:52:24 +0000382 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000383 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Chris Lattner24943d22010-06-08 16:52:24 +0000384 if (module_name && module_name[0])
385 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000386 FileSpec module_file_spec(module_name, false);
Jim Ingham7ec03bd2010-09-30 21:21:43 +0000387 *sb_bp = m_opaque_sp->CreateBreakpoint (&module_file_spec, symbol_name, eFunctionNameTypeFull | eFunctionNameTypeBase, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000388 }
389 else
390 {
Jim Ingham7ec03bd2010-09-30 21:21:43 +0000391 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, symbol_name, eFunctionNameTypeFull | eFunctionNameTypeBase, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000392 }
393 }
Caroline Tice7826c882010-10-26 03:11:13 +0000394
395 if (log)
396 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000397 log->Printf ("SBTarget(%p)::BreakpointCreateByName (symbol=\"%s\", module=\"%s\") => SBBreakpoint(%p)",
398 m_opaque_sp.get(), symbol_name, module_name, sb_bp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000399 }
400
Chris Lattner24943d22010-06-08 16:52:24 +0000401 return sb_bp;
402}
403
404SBBreakpoint
405SBTarget::BreakpointCreateByRegex (const char *symbol_name_regex, const char *module_name)
406{
Greg Claytone005f2c2010-11-06 01:53:30 +0000407 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000408
Chris Lattner24943d22010-06-08 16:52:24 +0000409 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000410 if (m_opaque_sp.get() && symbol_name_regex && symbol_name_regex[0])
Chris Lattner24943d22010-06-08 16:52:24 +0000411 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000412 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Chris Lattner24943d22010-06-08 16:52:24 +0000413 RegularExpression regexp(symbol_name_regex);
414
415 if (module_name && module_name[0])
416 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000417 FileSpec module_file_spec(module_name, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000418
Greg Clayton63094e02010-06-23 01:19:29 +0000419 *sb_bp = m_opaque_sp->CreateBreakpoint (&module_file_spec, regexp, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000420 }
421 else
422 {
Greg Clayton63094e02010-06-23 01:19:29 +0000423 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, regexp, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000424 }
425 }
Caroline Tice7826c882010-10-26 03:11:13 +0000426
427 if (log)
428 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000429 log->Printf ("SBTarget(%p)::BreakpointCreateByRegex (symbol_regex=\"%s\", module_name=\"%s\") => SBBreakpoint(%p)",
430 m_opaque_sp.get(), symbol_name_regex, module_name, sb_bp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000431 }
432
Chris Lattner24943d22010-06-08 16:52:24 +0000433 return sb_bp;
434}
435
436
437
438SBBreakpoint
439SBTarget::BreakpointCreateByAddress (addr_t address)
440{
Greg Claytone005f2c2010-11-06 01:53:30 +0000441 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000442
Chris Lattner24943d22010-06-08 16:52:24 +0000443 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000444 if (m_opaque_sp.get())
Greg Claytonbdcda462010-12-20 20:49:23 +0000445 {
446 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000447 *sb_bp = m_opaque_sp->CreateBreakpoint (address, false);
Greg Claytonbdcda462010-12-20 20:49:23 +0000448 }
Caroline Tice7826c882010-10-26 03:11:13 +0000449
450 if (log)
451 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000452 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 +0000453 }
454
Chris Lattner24943d22010-06-08 16:52:24 +0000455 return sb_bp;
456}
457
Chris Lattner24943d22010-06-08 16:52:24 +0000458SBBreakpoint
459SBTarget::FindBreakpointByID (break_id_t bp_id)
460{
Greg Claytone005f2c2010-11-06 01:53:30 +0000461 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000462
Chris Lattner24943d22010-06-08 16:52:24 +0000463 SBBreakpoint sb_breakpoint;
Greg Clayton63094e02010-06-23 01:19:29 +0000464 if (m_opaque_sp && bp_id != LLDB_INVALID_BREAK_ID)
Greg Claytonbdcda462010-12-20 20:49:23 +0000465 {
466 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000467 *sb_breakpoint = m_opaque_sp->GetBreakpointByID (bp_id);
Greg Claytonbdcda462010-12-20 20:49:23 +0000468 }
Caroline Tice7826c882010-10-26 03:11:13 +0000469
470 if (log)
471 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000472 log->Printf ("SBTarget(%p)::FindBreakpointByID (bp_id=%d) => SBBreakpoint(%p)",
473 m_opaque_sp.get(), (uint32_t) bp_id, sb_breakpoint.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000474 }
475
Chris Lattner24943d22010-06-08 16:52:24 +0000476 return sb_breakpoint;
477}
478
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000479uint32_t
480SBTarget::GetNumBreakpoints () const
481{
482 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000483 {
484 // The breakpoint list is thread safe, no need to lock
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000485 return m_opaque_sp->GetBreakpointList().GetSize();
Greg Claytonbdcda462010-12-20 20:49:23 +0000486 }
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000487 return 0;
488}
489
490SBBreakpoint
491SBTarget::GetBreakpointAtIndex (uint32_t idx) const
492{
493 SBBreakpoint sb_breakpoint;
494 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000495 {
496 // The breakpoint list is thread safe, no need to lock
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000497 *sb_breakpoint = m_opaque_sp->GetBreakpointList().GetBreakpointAtIndex(idx);
Greg Claytonbdcda462010-12-20 20:49:23 +0000498 }
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000499 return sb_breakpoint;
500}
Chris Lattner24943d22010-06-08 16:52:24 +0000501
502bool
503SBTarget::BreakpointDelete (break_id_t bp_id)
504{
Greg Claytone005f2c2010-11-06 01:53:30 +0000505 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000506
Caroline Tice7826c882010-10-26 03:11:13 +0000507 bool result = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000508 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000509 {
510 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Caroline Tice7826c882010-10-26 03:11:13 +0000511 result = m_opaque_sp->RemoveBreakpointByID (bp_id);
Greg Claytonbdcda462010-12-20 20:49:23 +0000512 }
Caroline Tice7826c882010-10-26 03:11:13 +0000513
514 if (log)
515 {
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000516 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 +0000517 }
518
519 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000520}
521
522bool
523SBTarget::EnableAllBreakpoints ()
524{
Greg Clayton63094e02010-06-23 01:19:29 +0000525 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000526 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000527 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000528 m_opaque_sp->EnableAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000529 return true;
530 }
531 return false;
532}
533
534bool
535SBTarget::DisableAllBreakpoints ()
536{
Greg Clayton63094e02010-06-23 01:19:29 +0000537 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000538 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000539 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000540 m_opaque_sp->DisableAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000541 return true;
542 }
543 return false;
544}
545
546bool
547SBTarget::DeleteAllBreakpoints ()
548{
Greg Clayton63094e02010-06-23 01:19:29 +0000549 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000550 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000551 Mutex::Locker api_locker (m_opaque_sp->GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000552 m_opaque_sp->RemoveAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000553 return true;
554 }
555 return false;
556}
557
558
559uint32_t
560SBTarget::GetNumModules () const
561{
Greg Claytone005f2c2010-11-06 01:53:30 +0000562 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000563
Caroline Tice7826c882010-10-26 03:11:13 +0000564 uint32_t num = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000565 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000566 {
567 // The module list is thread safe, no need to lock
568 num = m_opaque_sp->GetImages().GetSize();
569 }
Caroline Tice7826c882010-10-26 03:11:13 +0000570
571 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000572 log->Printf ("SBTarget(%p)::GetNumModules () => %d", m_opaque_sp.get(), num);
Caroline Tice7826c882010-10-26 03:11:13 +0000573
574 return num;
Chris Lattner24943d22010-06-08 16:52:24 +0000575}
576
Greg Clayton43490d12010-07-30 20:12:55 +0000577void
578SBTarget::Clear ()
579{
Greg Claytone005f2c2010-11-06 01:53:30 +0000580 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000581
582 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000583 log->Printf ("SBTarget(%p)::Clear ()", m_opaque_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000584
Greg Clayton43490d12010-07-30 20:12:55 +0000585 m_opaque_sp.reset();
586}
587
588
Chris Lattner24943d22010-06-08 16:52:24 +0000589SBModule
590SBTarget::FindModule (const SBFileSpec &sb_file_spec)
591{
592 SBModule sb_module;
Greg Clayton63094e02010-06-23 01:19:29 +0000593 if (m_opaque_sp && sb_file_spec.IsValid())
Greg Claytonbdcda462010-12-20 20:49:23 +0000594 {
595 // The module list is thread safe, no need to lock
Greg Clayton63094e02010-06-23 01:19:29 +0000596 sb_module.SetModule (m_opaque_sp->GetImages().FindFirstModuleForFileSpec (*sb_file_spec, NULL));
Greg Claytonbdcda462010-12-20 20:49:23 +0000597 }
Chris Lattner24943d22010-06-08 16:52:24 +0000598 return sb_module;
599}
600
601SBModule
602SBTarget::GetModuleAtIndex (uint32_t idx)
603{
Greg Claytone005f2c2010-11-06 01:53:30 +0000604 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000605
Chris Lattner24943d22010-06-08 16:52:24 +0000606 SBModule sb_module;
Greg Clayton63094e02010-06-23 01:19:29 +0000607 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000608 {
609 // The module list is thread safe, no need to lock
Greg Clayton63094e02010-06-23 01:19:29 +0000610 sb_module.SetModule(m_opaque_sp->GetImages().GetModuleAtIndex(idx));
Greg Claytonbdcda462010-12-20 20:49:23 +0000611 }
Caroline Tice7826c882010-10-26 03:11:13 +0000612
613 if (log)
614 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000615 log->Printf ("SBTarget(%p)::GetModuleAtIndex (idx=%d) => SBModule(%p)",
616 m_opaque_sp.get(), idx, sb_module.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000617 }
618
Chris Lattner24943d22010-06-08 16:52:24 +0000619 return sb_module;
620}
621
622
623SBBroadcaster
624SBTarget::GetBroadcaster () const
625{
Greg Claytone005f2c2010-11-06 01:53:30 +0000626 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000627
Greg Clayton63094e02010-06-23 01:19:29 +0000628 SBBroadcaster broadcaster(m_opaque_sp.get(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000629
630 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000631 log->Printf ("SBTarget(%p)::GetBroadcaster () => SBBroadcaster(%p)",
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000632 m_opaque_sp.get(), broadcaster.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000633
Chris Lattner24943d22010-06-08 16:52:24 +0000634 return broadcaster;
635}
636
Caroline Tice98f930f2010-09-20 05:20:02 +0000637
638bool
Caroline Tice7826c882010-10-26 03:11:13 +0000639SBTarget::GetDescription (SBStream &description, lldb::DescriptionLevel description_level)
Caroline Tice98f930f2010-09-20 05:20:02 +0000640{
641 if (m_opaque_sp)
Caroline Ticee7a566e2010-09-20 16:21:41 +0000642 {
Caroline Ticee49ec182010-09-22 23:01:29 +0000643 description.ref();
Caroline Tice7826c882010-10-26 03:11:13 +0000644 m_opaque_sp->Dump (description.get(), description_level);
645 }
646 else
647 description.Printf ("No value");
648
649 return true;
650}
651
652bool
653SBTarget::GetDescription (SBStream &description, lldb::DescriptionLevel description_level) const
654{
655 if (m_opaque_sp)
656 {
657 description.ref();
658 m_opaque_sp->Dump (description.get(), description_level);
Caroline Ticee7a566e2010-09-20 16:21:41 +0000659 }
Caroline Tice98f930f2010-09-20 05:20:02 +0000660 else
661 description.Printf ("No value");
662
663 return true;
664}