blob: cae72479c7bc0913055af74688ac647429d4b07b [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//----------------------------------------------------------------------
53SBTarget::SBTarget ()
54{
55}
56
57SBTarget::SBTarget (const SBTarget& rhs) :
Greg Clayton63094e02010-06-23 01:19:29 +000058 m_opaque_sp (rhs.m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000059{
60}
61
62SBTarget::SBTarget(const TargetSP& target_sp) :
Greg Clayton63094e02010-06-23 01:19:29 +000063 m_opaque_sp (target_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000064{
65}
66
Greg Clayton538eb822010-11-05 23:17:00 +000067const SBTarget&
68SBTarget::operator = (const SBTarget& rhs)
69{
70 if (this != &rhs)
71 m_opaque_sp = rhs.m_opaque_sp;
72 return *this;
73}
74
Chris Lattner24943d22010-06-08 16:52:24 +000075//----------------------------------------------------------------------
76// Destructor
77//----------------------------------------------------------------------
78SBTarget::~SBTarget()
79{
80}
81
82bool
83SBTarget::IsValid () const
84{
Greg Clayton63094e02010-06-23 01:19:29 +000085 return m_opaque_sp.get() != NULL;
Chris Lattner24943d22010-06-08 16:52:24 +000086}
87
88SBProcess
89SBTarget::GetProcess ()
90{
Caroline Tice7826c882010-10-26 03:11:13 +000091
Chris Lattner24943d22010-06-08 16:52:24 +000092 SBProcess sb_process;
Greg Clayton63094e02010-06-23 01:19:29 +000093 if (m_opaque_sp)
94 sb_process.SetProcess (m_opaque_sp->GetProcessSP());
Caroline Tice7826c882010-10-26 03:11:13 +000095
Greg Claytone005f2c2010-11-06 01:53:30 +000096 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +000097 if (log)
98 {
Greg Clayton49ce6822010-10-31 03:01:06 +000099 log->Printf ("SBTarget(%p)::GetProcess () => SBProcess(%p)",
100 m_opaque_sp.get(), sb_process.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000101 }
102
Chris Lattner24943d22010-06-08 16:52:24 +0000103 return sb_process;
104}
105
Greg Clayton63094e02010-06-23 01:19:29 +0000106SBDebugger
107SBTarget::GetDebugger () const
108{
109 SBDebugger debugger;
110 if (m_opaque_sp)
111 debugger.reset (m_opaque_sp->GetDebugger().GetSP());
112 return debugger;
113}
114
Greg Clayton992ce262010-10-06 18:44:26 +0000115
116// DEPRECATED
117SBProcess
118SBTarget::CreateProcess ()
119{
Caroline Tice7826c882010-10-26 03:11:13 +0000120
Greg Clayton992ce262010-10-06 18:44:26 +0000121 SBProcess sb_process;
122
123 if (m_opaque_sp)
124 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
125
Greg Claytone005f2c2010-11-06 01:53:30 +0000126 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000127 if (log)
128 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000129 log->Printf ("SBTarget(%p)::CreateProcess () => SBProcess(%p)",
130 m_opaque_sp.get(), sb_process.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000131 }
132
Greg Clayton992ce262010-10-06 18:44:26 +0000133 return sb_process;
134}
135
136
Greg Claytonc5f728c2010-10-06 22:10:17 +0000137SBProcess
138SBTarget::LaunchProcess
139(
140 char const **argv,
141 char const **envp,
142 const char *tty,
143 uint32_t launch_flags,
Greg Claytond8c62532010-10-07 04:19:01 +0000144 bool stop_at_entry
145)
146{
Greg Claytone005f2c2010-11-06 01:53:30 +0000147 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000148
149 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000150 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 +0000151 m_opaque_sp.get(), argv, envp, tty, launch_flags, stop_at_entry);
Caroline Tice7826c882010-10-26 03:11:13 +0000152
Greg Claytond8c62532010-10-07 04:19:01 +0000153 SBError sb_error;
Caroline Tice7826c882010-10-26 03:11:13 +0000154 SBProcess sb_process = Launch (argv, envp, tty, launch_flags, stop_at_entry, sb_error);
155
Caroline Tice926060e2010-10-29 21:48:37 +0000156 log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +0000157 if (log)
158 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000159 log->Printf ("SBTarget(%p)::LaunchProcess (...) => SBProcess(%p)",
160 m_opaque_sp.get(), sb_process.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000161 }
162
163 return sb_process;
Greg Claytond8c62532010-10-07 04:19:01 +0000164}
165
166SBProcess
167SBTarget::Launch
168(
169 char const **argv,
170 char const **envp,
171 const char *tty,
172 uint32_t launch_flags,
Greg Claytonc5f728c2010-10-06 22:10:17 +0000173 bool stop_at_entry,
174 SBError &error
175)
176{
Greg Claytone005f2c2010-11-06 01:53:30 +0000177 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000178
179 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000180 {
Greg Claytona66ba462010-10-30 04:51:46 +0000181 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 +0000182 m_opaque_sp.get(), argv, envp, tty, launch_flags, stop_at_entry, error.get());
183 }
Greg Clayton1a3083a2010-10-06 03:53:16 +0000184 SBProcess sb_process;
185 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000186 {
Greg Clayton992ce262010-10-06 18:44:26 +0000187 // DEPRECATED, this will change when CreateProcess is removed...
188 if (m_opaque_sp->GetProcessSP())
189 {
190 sb_process.SetProcess(m_opaque_sp->GetProcessSP());
191 }
192 else
193 {
194 // When launching, we always want to create a new process When
195 // SBTarget::CreateProcess is removed, this will always happen.
196 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
197 }
Greg Clayton1a3083a2010-10-06 03:53:16 +0000198
199 if (sb_process.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000200 {
Greg Claytonc5f728c2010-10-06 22:10:17 +0000201 error.SetError (sb_process->Launch (argv, envp, launch_flags, tty, tty, tty));
Greg Clayton1a3083a2010-10-06 03:53:16 +0000202 if (error.Success())
Chris Lattner24943d22010-06-08 16:52:24 +0000203 {
Sean Callanan451ee7c2010-10-07 22:51:14 +0000204 // We we are stopping at the entry point, we can return now!
205 if (stop_at_entry)
206 return sb_process;
207
Greg Clayton1a3083a2010-10-06 03:53:16 +0000208 // Make sure we are stopped at the entry
209 StateType state = sb_process->WaitForProcessToStop (NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000210 if (state == eStateStopped)
Greg Clayton1a3083a2010-10-06 03:53:16 +0000211 {
212 // resume the process to skip the entry point
Greg Claytonc5f728c2010-10-06 22:10:17 +0000213 error.SetError (sb_process->Resume());
Greg Clayton1a3083a2010-10-06 03:53:16 +0000214 if (error.Success())
215 {
216 // If we are doing synchronous mode, then wait for the
217 // process to stop yet again!
218 if (m_opaque_sp->GetDebugger().GetAsyncExecution () == false)
219 sb_process->WaitForProcessToStop (NULL);
220 }
221 }
Chris Lattner24943d22010-06-08 16:52:24 +0000222 }
223 }
Greg Claytonc5f728c2010-10-06 22:10:17 +0000224 else
225 {
226 error.SetErrorString ("unable to create lldb_private::Process");
227 }
228 }
229 else
230 {
231 error.SetErrorString ("SBTarget is invalid");
Chris Lattner24943d22010-06-08 16:52:24 +0000232 }
Caroline Tice7826c882010-10-26 03:11:13 +0000233
Caroline Tice926060e2010-10-29 21:48:37 +0000234 log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +0000235 if (log)
236 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000237 log->Printf ("SBTarget(%p)::Launch (...) => SBProceess(%p)",
238 m_opaque_sp.get(), sb_process.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000239 }
240
Greg Clayton1a3083a2010-10-06 03:53:16 +0000241 return sb_process;
Chris Lattner24943d22010-06-08 16:52:24 +0000242}
243
Greg Claytonc5f728c2010-10-06 22:10:17 +0000244
245lldb::SBProcess
Greg Claytond8c62532010-10-07 04:19:01 +0000246SBTarget::AttachToProcessWithID
Greg Claytonc5f728c2010-10-06 22:10:17 +0000247(
248 lldb::pid_t pid,// The process ID to attach to
249 SBError& error // An error explaining what went wrong if attach fails
250)
251{
252 SBProcess sb_process;
253 if (m_opaque_sp)
254 {
255 // DEPRECATED, this will change when CreateProcess is removed...
256 if (m_opaque_sp->GetProcessSP())
257 {
258 sb_process.SetProcess(m_opaque_sp->GetProcessSP());
259 }
260 else
261 {
262 // When launching, we always want to create a new process When
263 // SBTarget::CreateProcess is removed, this will always happen.
264 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
265 }
266
267 if (sb_process.IsValid())
268 {
269 error.SetError (sb_process->Attach (pid));
270 }
271 else
272 {
273 error.SetErrorString ("unable to create lldb_private::Process");
274 }
275 }
276 else
277 {
278 error.SetErrorString ("SBTarget is invalid");
279 }
280 return sb_process;
281
282}
283
284lldb::SBProcess
Greg Claytond8c62532010-10-07 04:19:01 +0000285SBTarget::AttachToProcessWithName
Greg Claytonc5f728c2010-10-06 22:10:17 +0000286(
287 const char *name, // basename of process to attach to
288 bool wait_for, // if true wait for a new instance of "name" to be launched
289 SBError& error // An error explaining what went wrong if attach fails
290)
291{
292 SBProcess sb_process;
293 if (m_opaque_sp)
294 {
295 // DEPRECATED, this will change when CreateProcess is removed...
296 if (m_opaque_sp->GetProcessSP())
297 {
298 sb_process.SetProcess(m_opaque_sp->GetProcessSP());
299 }
300 else
301 {
302 // When launching, we always want to create a new process When
303 // SBTarget::CreateProcess is removed, this will always happen.
304 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
305 }
306
307 if (sb_process.IsValid())
308 {
309 error.SetError (sb_process->Attach (name, wait_for));
310 }
311 else
312 {
313 error.SetErrorString ("unable to create lldb_private::Process");
314 }
315 }
316 else
317 {
318 error.SetErrorString ("SBTarget is invalid");
319 }
320 return sb_process;
321
322}
323
Chris Lattner24943d22010-06-08 16:52:24 +0000324SBFileSpec
325SBTarget::GetExecutable ()
326{
Caroline Tice7826c882010-10-26 03:11:13 +0000327
Chris Lattner24943d22010-06-08 16:52:24 +0000328 SBFileSpec exe_file_spec;
Greg Clayton63094e02010-06-23 01:19:29 +0000329 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000330 {
Greg Clayton63094e02010-06-23 01:19:29 +0000331 ModuleSP exe_module_sp (m_opaque_sp->GetExecutableModule ());
Chris Lattner24943d22010-06-08 16:52:24 +0000332 if (exe_module_sp)
333 exe_file_spec.SetFileSpec (exe_module_sp->GetFileSpec());
334 }
Caroline Tice7826c882010-10-26 03:11:13 +0000335
Greg Claytone005f2c2010-11-06 01:53:30 +0000336 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000337 if (log)
338 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000339 log->Printf ("SBTarget(%p)::GetExecutable () => SBFileSpec(%p)",
340 m_opaque_sp.get(), exe_file_spec.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000341 }
342
Chris Lattner24943d22010-06-08 16:52:24 +0000343 return exe_file_spec;
344}
345
346
347bool
348SBTarget::DeleteTargetFromList (TargetList *list)
349{
Greg Clayton63094e02010-06-23 01:19:29 +0000350 if (m_opaque_sp)
351 return list->DeleteTarget (m_opaque_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000352 else
353 return false;
354}
355
356bool
Chris Lattner24943d22010-06-08 16:52:24 +0000357SBTarget::operator == (const SBTarget &rhs) const
358{
Greg Clayton63094e02010-06-23 01:19:29 +0000359 return m_opaque_sp.get() == rhs.m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000360}
361
362bool
363SBTarget::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
368lldb_private::Target *
Greg Clayton63094e02010-06-23 01:19:29 +0000369SBTarget::operator ->() const
Chris Lattner24943d22010-06-08 16:52:24 +0000370{
Greg Clayton63094e02010-06-23 01:19:29 +0000371 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000372}
Greg Clayton63094e02010-06-23 01:19:29 +0000373
374lldb_private::Target *
375SBTarget::get() const
Chris Lattner24943d22010-06-08 16:52:24 +0000376{
Greg Clayton63094e02010-06-23 01:19:29 +0000377 return m_opaque_sp.get();
378}
379
380void
381SBTarget::reset (const lldb::TargetSP& target_sp)
382{
383 m_opaque_sp = target_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000384}
385
Greg Claytonea49cc72010-12-12 19:25:26 +0000386bool
387SBTarget::ResolveLoadAddress (lldb::addr_t vm_addr,
388 lldb::SBAddress& addr)
389{
390 if (m_opaque_sp)
391 return m_opaque_sp->GetSectionLoadList().ResolveLoadAddress (vm_addr, *addr);
392
393 addr->Clear();
394 return false;
395}
396
Chris Lattner24943d22010-06-08 16:52:24 +0000397SBBreakpoint
398SBTarget::BreakpointCreateByLocation (const char *file, uint32_t line)
399{
Greg Claytond6d806c2010-11-08 00:28:40 +0000400 return SBBreakpoint(BreakpointCreateByLocation (SBFileSpec (file, false), line));
Chris Lattner24943d22010-06-08 16:52:24 +0000401}
402
403SBBreakpoint
404SBTarget::BreakpointCreateByLocation (const SBFileSpec &sb_file_spec, uint32_t line)
405{
Greg Claytone005f2c2010-11-06 01:53:30 +0000406 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000407
Chris Lattner24943d22010-06-08 16:52:24 +0000408 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000409 if (m_opaque_sp.get() && line != 0)
410 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, *sb_file_spec, line, true, false);
Caroline Tice7826c882010-10-26 03:11:13 +0000411
412 if (log)
413 {
414 SBStream sstr;
415 sb_bp.GetDescription (sstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000416 char path[PATH_MAX];
417 sb_file_spec->GetPath (path, sizeof(path));
418 log->Printf ("SBTarget(%p)::BreakpointCreateByLocation ( %s:%u ) => SBBreakpoint(%p): %s",
Greg Claytona66ba462010-10-30 04:51:46 +0000419 m_opaque_sp.get(),
Greg Clayton49ce6822010-10-31 03:01:06 +0000420 path,
Greg Claytona66ba462010-10-30 04:51:46 +0000421 line,
Greg Clayton49ce6822010-10-31 03:01:06 +0000422 sb_bp.get(),
Caroline Tice7826c882010-10-26 03:11:13 +0000423 sstr.GetData());
424 }
425
Chris Lattner24943d22010-06-08 16:52:24 +0000426 return sb_bp;
427}
428
429SBBreakpoint
430SBTarget::BreakpointCreateByName (const char *symbol_name, const char *module_name)
431{
Greg Claytone005f2c2010-11-06 01:53:30 +0000432 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000433
Chris Lattner24943d22010-06-08 16:52:24 +0000434 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000435 if (m_opaque_sp.get() && symbol_name && symbol_name[0])
Chris Lattner24943d22010-06-08 16:52:24 +0000436 {
437 if (module_name && module_name[0])
438 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000439 FileSpec module_file_spec(module_name, false);
Jim Ingham7ec03bd2010-09-30 21:21:43 +0000440 *sb_bp = m_opaque_sp->CreateBreakpoint (&module_file_spec, symbol_name, eFunctionNameTypeFull | eFunctionNameTypeBase, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000441 }
442 else
443 {
Jim Ingham7ec03bd2010-09-30 21:21:43 +0000444 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, symbol_name, eFunctionNameTypeFull | eFunctionNameTypeBase, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000445 }
446 }
Caroline Tice7826c882010-10-26 03:11:13 +0000447
448 if (log)
449 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000450 log->Printf ("SBTarget(%p)::BreakpointCreateByName (symbol=\"%s\", module=\"%s\") => SBBreakpoint(%p)",
451 m_opaque_sp.get(), symbol_name, module_name, sb_bp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000452 }
453
Chris Lattner24943d22010-06-08 16:52:24 +0000454 return sb_bp;
455}
456
457SBBreakpoint
458SBTarget::BreakpointCreateByRegex (const char *symbol_name_regex, const char *module_name)
459{
Greg Claytone005f2c2010-11-06 01:53:30 +0000460 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000461
Chris Lattner24943d22010-06-08 16:52:24 +0000462 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000463 if (m_opaque_sp.get() && symbol_name_regex && symbol_name_regex[0])
Chris Lattner24943d22010-06-08 16:52:24 +0000464 {
465 RegularExpression regexp(symbol_name_regex);
466
467 if (module_name && module_name[0])
468 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000469 FileSpec module_file_spec(module_name, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000470
Greg Clayton63094e02010-06-23 01:19:29 +0000471 *sb_bp = m_opaque_sp->CreateBreakpoint (&module_file_spec, regexp, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000472 }
473 else
474 {
Greg Clayton63094e02010-06-23 01:19:29 +0000475 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, regexp, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000476 }
477 }
Caroline Tice7826c882010-10-26 03:11:13 +0000478
479 if (log)
480 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000481 log->Printf ("SBTarget(%p)::BreakpointCreateByRegex (symbol_regex=\"%s\", module_name=\"%s\") => SBBreakpoint(%p)",
482 m_opaque_sp.get(), symbol_name_regex, module_name, sb_bp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000483 }
484
Chris Lattner24943d22010-06-08 16:52:24 +0000485 return sb_bp;
486}
487
488
489
490SBBreakpoint
491SBTarget::BreakpointCreateByAddress (addr_t address)
492{
Greg Claytone005f2c2010-11-06 01:53:30 +0000493 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000494
Chris Lattner24943d22010-06-08 16:52:24 +0000495 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000496 if (m_opaque_sp.get())
497 *sb_bp = m_opaque_sp->CreateBreakpoint (address, false);
Caroline Tice7826c882010-10-26 03:11:13 +0000498
499 if (log)
500 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000501 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 +0000502 }
503
Chris Lattner24943d22010-06-08 16:52:24 +0000504 return sb_bp;
505}
506
Chris Lattner24943d22010-06-08 16:52:24 +0000507SBBreakpoint
508SBTarget::FindBreakpointByID (break_id_t bp_id)
509{
Greg Claytone005f2c2010-11-06 01:53:30 +0000510 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000511
Chris Lattner24943d22010-06-08 16:52:24 +0000512 SBBreakpoint sb_breakpoint;
Greg Clayton63094e02010-06-23 01:19:29 +0000513 if (m_opaque_sp && bp_id != LLDB_INVALID_BREAK_ID)
514 *sb_breakpoint = m_opaque_sp->GetBreakpointByID (bp_id);
Caroline Tice7826c882010-10-26 03:11:13 +0000515
516 if (log)
517 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000518 log->Printf ("SBTarget(%p)::FindBreakpointByID (bp_id=%d) => SBBreakpoint(%p)",
519 m_opaque_sp.get(), (uint32_t) bp_id, sb_breakpoint.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000520 }
521
Chris Lattner24943d22010-06-08 16:52:24 +0000522 return sb_breakpoint;
523}
524
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000525uint32_t
526SBTarget::GetNumBreakpoints () const
527{
528 if (m_opaque_sp)
529 return m_opaque_sp->GetBreakpointList().GetSize();
530 return 0;
531}
532
533SBBreakpoint
534SBTarget::GetBreakpointAtIndex (uint32_t idx) const
535{
536 SBBreakpoint sb_breakpoint;
537 if (m_opaque_sp)
538 *sb_breakpoint = m_opaque_sp->GetBreakpointList().GetBreakpointAtIndex(idx);
539 return sb_breakpoint;
540}
Chris Lattner24943d22010-06-08 16:52:24 +0000541
542bool
543SBTarget::BreakpointDelete (break_id_t bp_id)
544{
Greg Claytone005f2c2010-11-06 01:53:30 +0000545 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000546
Caroline Tice7826c882010-10-26 03:11:13 +0000547 bool result = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000548 if (m_opaque_sp)
Caroline Tice7826c882010-10-26 03:11:13 +0000549 result = m_opaque_sp->RemoveBreakpointByID (bp_id);
550
551 if (log)
552 {
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000553 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 +0000554 }
555
556 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000557}
558
559bool
560SBTarget::EnableAllBreakpoints ()
561{
Greg Clayton63094e02010-06-23 01:19:29 +0000562 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000563 {
Greg Clayton63094e02010-06-23 01:19:29 +0000564 m_opaque_sp->EnableAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000565 return true;
566 }
567 return false;
568}
569
570bool
571SBTarget::DisableAllBreakpoints ()
572{
Greg Clayton63094e02010-06-23 01:19:29 +0000573 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000574 {
Greg Clayton63094e02010-06-23 01:19:29 +0000575 m_opaque_sp->DisableAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000576 return true;
577 }
578 return false;
579}
580
581bool
582SBTarget::DeleteAllBreakpoints ()
583{
Greg Clayton63094e02010-06-23 01:19:29 +0000584 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000585 {
Greg Clayton63094e02010-06-23 01:19:29 +0000586 m_opaque_sp->RemoveAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000587 return true;
588 }
589 return false;
590}
591
592
593uint32_t
594SBTarget::GetNumModules () const
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
Caroline Tice7826c882010-10-26 03:11:13 +0000598 uint32_t num = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000599 if (m_opaque_sp)
Caroline Tice7826c882010-10-26 03:11:13 +0000600 num = m_opaque_sp->GetImages().GetSize();
601
602 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000603 log->Printf ("SBTarget(%p)::GetNumModules () => %d", m_opaque_sp.get(), num);
Caroline Tice7826c882010-10-26 03:11:13 +0000604
605 return num;
Chris Lattner24943d22010-06-08 16:52:24 +0000606}
607
Greg Clayton43490d12010-07-30 20:12:55 +0000608void
609SBTarget::Clear ()
610{
Greg Claytone005f2c2010-11-06 01:53:30 +0000611 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000612
613 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000614 log->Printf ("SBTarget(%p)::Clear ()", m_opaque_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000615
Greg Clayton43490d12010-07-30 20:12:55 +0000616 m_opaque_sp.reset();
617}
618
619
Chris Lattner24943d22010-06-08 16:52:24 +0000620SBModule
621SBTarget::FindModule (const SBFileSpec &sb_file_spec)
622{
623 SBModule sb_module;
Greg Clayton63094e02010-06-23 01:19:29 +0000624 if (m_opaque_sp && sb_file_spec.IsValid())
625 sb_module.SetModule (m_opaque_sp->GetImages().FindFirstModuleForFileSpec (*sb_file_spec, NULL));
Chris Lattner24943d22010-06-08 16:52:24 +0000626 return sb_module;
627}
628
629SBModule
630SBTarget::GetModuleAtIndex (uint32_t idx)
631{
Greg Claytone005f2c2010-11-06 01:53:30 +0000632 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000633
Chris Lattner24943d22010-06-08 16:52:24 +0000634 SBModule sb_module;
Greg Clayton63094e02010-06-23 01:19:29 +0000635 if (m_opaque_sp)
636 sb_module.SetModule(m_opaque_sp->GetImages().GetModuleAtIndex(idx));
Caroline Tice7826c882010-10-26 03:11:13 +0000637
638 if (log)
639 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000640 log->Printf ("SBTarget(%p)::GetModuleAtIndex (idx=%d) => SBModule(%p)",
641 m_opaque_sp.get(), idx, sb_module.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000642 }
643
Chris Lattner24943d22010-06-08 16:52:24 +0000644 return sb_module;
645}
646
647
648SBBroadcaster
649SBTarget::GetBroadcaster () const
650{
Greg Claytone005f2c2010-11-06 01:53:30 +0000651 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000652
Greg Clayton63094e02010-06-23 01:19:29 +0000653 SBBroadcaster broadcaster(m_opaque_sp.get(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000654
655 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000656 log->Printf ("SBTarget(%p)::GetBroadcaster () => SBBroadcaster(%p)",
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000657 m_opaque_sp.get(), broadcaster.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000658
Chris Lattner24943d22010-06-08 16:52:24 +0000659 return broadcaster;
660}
661
662void
Greg Clayton70436352010-06-30 23:03:03 +0000663SBTarget::Disassemble (lldb::addr_t start_addr, lldb::addr_t end_addr, const char *module_name)
Chris Lattner24943d22010-06-08 16:52:24 +0000664{
Greg Clayton70436352010-06-30 23:03:03 +0000665 if (start_addr == LLDB_INVALID_ADDRESS)
Chris Lattner24943d22010-06-08 16:52:24 +0000666 return;
667
Greg Clayton63094e02010-06-23 01:19:29 +0000668 FILE *out = m_opaque_sp->GetDebugger().GetOutputFileHandle();
Chris Lattner24943d22010-06-08 16:52:24 +0000669 if (out == NULL)
670 return;
671
Greg Clayton63094e02010-06-23 01:19:29 +0000672 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000673 {
Greg Clayton70436352010-06-30 23:03:03 +0000674 ModuleSP module_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000675 if (module_name != NULL)
676 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000677 FileSpec module_file_spec (module_name, false);
Greg Clayton70436352010-06-30 23:03:03 +0000678 module_sp = m_opaque_sp->GetImages().FindFirstModuleForFileSpec (module_file_spec, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000679 }
Greg Clayton70436352010-06-30 23:03:03 +0000680
681 AddressRange range;
682
683 // Make sure the process object is alive if we have one (it might be
684 // created but we might not be launched yet).
Greg Claytoneea26402010-09-14 23:36:40 +0000685
Greg Clayton1a3083a2010-10-06 03:53:16 +0000686 Process *sb_process = m_opaque_sp->GetProcessSP().get();
687 if (sb_process && !sb_process->IsAlive())
688 sb_process = NULL;
Greg Clayton70436352010-06-30 23:03:03 +0000689
690 // If we are given a module, then "start_addr" is a file address in
691 // that module.
692 if (module_sp)
693 {
694 if (!module_sp->ResolveFileAddress (start_addr, range.GetBaseAddress()))
695 range.GetBaseAddress().SetOffset(start_addr);
696 }
Greg Claytoneea26402010-09-14 23:36:40 +0000697 else if (m_opaque_sp->GetSectionLoadList().IsEmpty() == false)
Greg Clayton70436352010-06-30 23:03:03 +0000698 {
699 // We don't have a module, se we need to figure out if "start_addr"
700 // resolves to anything in a running process.
Greg Claytoneea26402010-09-14 23:36:40 +0000701 if (!m_opaque_sp->GetSectionLoadList().ResolveLoadAddress (start_addr, range.GetBaseAddress()))
Greg Clayton70436352010-06-30 23:03:03 +0000702 range.GetBaseAddress().SetOffset(start_addr);
703 }
704 else
705 {
706 if (m_opaque_sp->GetImages().ResolveFileAddress (start_addr, range.GetBaseAddress()))
707 range.GetBaseAddress().SetOffset(start_addr);
708 }
Chris Lattner24943d22010-06-08 16:52:24 +0000709
710 // For now, we need a process; the disassembly functions insist. If we don't have one already,
711 // make one.
712
Greg Clayton70436352010-06-30 23:03:03 +0000713 ExecutionContext exe_ctx;
Chris Lattner24943d22010-06-08 16:52:24 +0000714
Greg Clayton1a3083a2010-10-06 03:53:16 +0000715 if (sb_process)
716 sb_process->CalculateExecutionContext(exe_ctx);
Greg Clayton70436352010-06-30 23:03:03 +0000717 else
Greg Claytona830adb2010-10-04 01:05:56 +0000718 m_opaque_sp->CalculateExecutionContext(exe_ctx);
Chris Lattner24943d22010-06-08 16:52:24 +0000719
Greg Clayton70436352010-06-30 23:03:03 +0000720 if (end_addr == LLDB_INVALID_ADDRESS || end_addr < start_addr)
721 range.SetByteSize( DEFAULT_DISASM_BYTE_SIZE);
722 else
723 range.SetByteSize(end_addr - start_addr);
Chris Lattner24943d22010-06-08 16:52:24 +0000724
Greg Clayton70436352010-06-30 23:03:03 +0000725 StreamFile out_stream (out);
Chris Lattner24943d22010-06-08 16:52:24 +0000726
Greg Clayton70436352010-06-30 23:03:03 +0000727 Disassembler::Disassemble (m_opaque_sp->GetDebugger(),
728 m_opaque_sp->GetArchitecture(),
729 exe_ctx,
730 range,
731 3,
732 false,
733 out_stream);
Chris Lattner24943d22010-06-08 16:52:24 +0000734 }
735}
736
737void
738SBTarget::Disassemble (const char *function_name, const char *module_name)
739{
740 if (function_name == NULL)
741 return;
742
Greg Clayton63094e02010-06-23 01:19:29 +0000743 FILE *out = m_opaque_sp->GetDebugger().GetOutputFileHandle();
Chris Lattner24943d22010-06-08 16:52:24 +0000744 if (out == NULL)
745 return;
746
Greg Clayton63094e02010-06-23 01:19:29 +0000747 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000748 {
Greg Clayton70436352010-06-30 23:03:03 +0000749 Disassembler *disassembler = Disassembler::FindPlugin (m_opaque_sp->GetArchitecture());
Chris Lattner24943d22010-06-08 16:52:24 +0000750 if (disassembler == NULL)
751 return;
752
Greg Clayton70436352010-06-30 23:03:03 +0000753 ModuleSP module_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000754 if (module_name != NULL)
Chris Lattner24943d22010-06-08 16:52:24 +0000755 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000756 FileSpec module_file_spec (module_name, false);
Greg Clayton70436352010-06-30 23:03:03 +0000757 module_sp = m_opaque_sp->GetImages().FindFirstModuleForFileSpec (module_file_spec, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000758 }
Greg Clayton70436352010-06-30 23:03:03 +0000759
760 ExecutionContext exe_ctx;
761
762 // Make sure the process object is alive if we have one (it might be
763 // created but we might not be launched yet).
Greg Clayton1a3083a2010-10-06 03:53:16 +0000764 Process *sb_process = m_opaque_sp->GetProcessSP().get();
765 if (sb_process && !sb_process->IsAlive())
766 sb_process = NULL;
Greg Clayton70436352010-06-30 23:03:03 +0000767
Greg Clayton1a3083a2010-10-06 03:53:16 +0000768 if (sb_process)
769 sb_process->CalculateExecutionContext(exe_ctx);
Greg Clayton70436352010-06-30 23:03:03 +0000770 else
Greg Claytona830adb2010-10-04 01:05:56 +0000771 m_opaque_sp->CalculateExecutionContext(exe_ctx);
Greg Clayton70436352010-06-30 23:03:03 +0000772
773
774 StreamFile out_stream (out);
775
776 Disassembler::Disassemble (m_opaque_sp->GetDebugger(),
777 m_opaque_sp->GetArchitecture(),
778 exe_ctx,
779 ConstString (function_name),
780 module_sp.get(),
781 3,
782 false,
783 out_stream);
Chris Lattner24943d22010-06-08 16:52:24 +0000784 }
785}
Caroline Tice98f930f2010-09-20 05:20:02 +0000786
787bool
Caroline Tice7826c882010-10-26 03:11:13 +0000788SBTarget::GetDescription (SBStream &description, lldb::DescriptionLevel description_level)
Caroline Tice98f930f2010-09-20 05:20:02 +0000789{
790 if (m_opaque_sp)
Caroline Ticee7a566e2010-09-20 16:21:41 +0000791 {
Caroline Ticee49ec182010-09-22 23:01:29 +0000792 description.ref();
Caroline Tice7826c882010-10-26 03:11:13 +0000793 m_opaque_sp->Dump (description.get(), description_level);
794 }
795 else
796 description.Printf ("No value");
797
798 return true;
799}
800
801bool
802SBTarget::GetDescription (SBStream &description, lldb::DescriptionLevel description_level) const
803{
804 if (m_opaque_sp)
805 {
806 description.ref();
807 m_opaque_sp->Dump (description.get(), description_level);
Caroline Ticee7a566e2010-09-20 16:21:41 +0000808 }
Caroline Tice98f930f2010-09-20 05:20:02 +0000809 else
810 description.Printf ("No value");
811
812 return true;
813}