blob: 24c78f4294bf304f002f6985d9cb1d7437f1a9ba [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{
Caroline Tice61ba7ec2010-10-26 23:49:36 +000060 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +000061
62 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +000063 {
64 SBStream sstr;
65 GetDescription (sstr, lldb::eDescriptionLevelBrief);
66 log->Printf ("SBTarget::SBTarget (rhs.sp=%p) => SBTarget(%p): %s",
67 rhs.m_opaque_sp.get(), m_opaque_sp.get(), sstr.GetData());
68 }
Chris Lattner24943d22010-06-08 16:52:24 +000069}
70
71SBTarget::SBTarget(const TargetSP& target_sp) :
Greg Clayton63094e02010-06-23 01:19:29 +000072 m_opaque_sp (target_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000073{
Caroline Tice61ba7ec2010-10-26 23:49:36 +000074 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +000075
76 if (log)
Caroline Tice61ba7ec2010-10-26 23:49:36 +000077 {
78 SBStream sstr;
79 GetDescription (sstr, lldb::eDescriptionLevelBrief);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +000080 log->Printf ("SBTarget::SBTarget (target_sp=%p) => SBTarget(%p): '%s'",
Caroline Tice61ba7ec2010-10-26 23:49:36 +000081 target_sp.get(), m_opaque_sp.get(), sstr.GetData());
82 }
Chris Lattner24943d22010-06-08 16:52:24 +000083}
84
85const SBTarget&
86SBTarget::Assign (const SBTarget& rhs)
87{
Caroline Tice7826c882010-10-26 03:11:13 +000088 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
89
90 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +000091 log->Printf ("SBTarget(%p)::Assign (rhs.sp=%p)", m_opaque_sp.get(), rhs.m_opaque_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +000092
Chris Lattner24943d22010-06-08 16:52:24 +000093 if (this != &rhs)
94 {
Greg Clayton63094e02010-06-23 01:19:29 +000095 m_opaque_sp = rhs.m_opaque_sp;
Chris Lattner24943d22010-06-08 16:52:24 +000096 }
Caroline Tice7826c882010-10-26 03:11:13 +000097
Chris Lattner24943d22010-06-08 16:52:24 +000098 return *this;
99}
100
101
102//----------------------------------------------------------------------
103// Destructor
104//----------------------------------------------------------------------
105SBTarget::~SBTarget()
106{
107}
108
109bool
110SBTarget::IsValid () const
111{
Greg Clayton63094e02010-06-23 01:19:29 +0000112 return m_opaque_sp.get() != NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000113}
114
115SBProcess
116SBTarget::GetProcess ()
117{
Caroline Tice7826c882010-10-26 03:11:13 +0000118 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
119
Chris Lattner24943d22010-06-08 16:52:24 +0000120 SBProcess sb_process;
Greg Clayton63094e02010-06-23 01:19:29 +0000121 if (m_opaque_sp)
122 sb_process.SetProcess (m_opaque_sp->GetProcessSP());
Caroline Tice7826c882010-10-26 03:11:13 +0000123
124 if (log)
125 {
126 SBStream sstr;
127 sb_process.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000128 log->Printf ("SBTarget(%p)::GetProcess () => SBProcess(%p): %s", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000129 sb_process.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000130 }
131
Chris Lattner24943d22010-06-08 16:52:24 +0000132 return sb_process;
133}
134
Greg Clayton63094e02010-06-23 01:19:29 +0000135SBDebugger
136SBTarget::GetDebugger () const
137{
138 SBDebugger debugger;
139 if (m_opaque_sp)
140 debugger.reset (m_opaque_sp->GetDebugger().GetSP());
141 return debugger;
142}
143
Greg Clayton992ce262010-10-06 18:44:26 +0000144
145// DEPRECATED
146SBProcess
147SBTarget::CreateProcess ()
148{
Caroline Tice7826c882010-10-26 03:11:13 +0000149 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
150
Greg Clayton992ce262010-10-06 18:44:26 +0000151 SBProcess sb_process;
152
153 if (m_opaque_sp)
154 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
155
Caroline Tice7826c882010-10-26 03:11:13 +0000156 if (log)
157 {
158 SBStream sstr;
159 sb_process.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000160 log->Printf ("SBTarget(%p)::CreateProcess () => SBProcess(%p): %s", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000161 sb_process.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000162 }
163
Greg Clayton992ce262010-10-06 18:44:26 +0000164 return sb_process;
165}
166
167
Greg Claytonc5f728c2010-10-06 22:10:17 +0000168SBProcess
169SBTarget::LaunchProcess
170(
171 char const **argv,
172 char const **envp,
173 const char *tty,
174 uint32_t launch_flags,
Greg Claytond8c62532010-10-07 04:19:01 +0000175 bool stop_at_entry
176)
177{
Caroline Tice7826c882010-10-26 03:11:13 +0000178 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
179
180 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000181 log->Printf ("SBTarget(%p)::LaunchProcess (argv=%p, envp=%p, tty='%s', launch_flags=%d, stop_at_entry=%i)",
182 m_opaque_sp.get(), argv, envp, tty, launch_flags, stop_at_entry);
Caroline Tice7826c882010-10-26 03:11:13 +0000183
Greg Claytond8c62532010-10-07 04:19:01 +0000184 SBError sb_error;
Caroline Tice7826c882010-10-26 03:11:13 +0000185 SBProcess sb_process = Launch (argv, envp, tty, launch_flags, stop_at_entry, sb_error);
186
187 if (log)
188 {
189 SBStream sstr;
190 sb_process.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000191 log->Printf ("SBTarget(%p)::LaunchProcess (...) => SBProcess(%p): %s",
192 m_opaque_sp.get(), sb_process.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000193 }
194
195 return sb_process;
Greg Claytond8c62532010-10-07 04:19:01 +0000196}
197
198SBProcess
199SBTarget::Launch
200(
201 char const **argv,
202 char const **envp,
203 const char *tty,
204 uint32_t launch_flags,
Greg Claytonc5f728c2010-10-06 22:10:17 +0000205 bool stop_at_entry,
206 SBError &error
207)
208{
Caroline Tice7826c882010-10-26 03:11:13 +0000209 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
210
211 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000212 {
213 log->Printf ("SBTarget(%p)::Launch (argv=%p, envp=%p, tty='%s', launch_flags=%d, stop_at_entry=%i, &error (%p))...",
214 m_opaque_sp.get(), argv, envp, tty, launch_flags, stop_at_entry, error.get());
215 }
Greg Clayton1a3083a2010-10-06 03:53:16 +0000216 SBProcess sb_process;
217 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000218 {
Greg Clayton992ce262010-10-06 18:44:26 +0000219 // DEPRECATED, this will change when CreateProcess is removed...
220 if (m_opaque_sp->GetProcessSP())
221 {
222 sb_process.SetProcess(m_opaque_sp->GetProcessSP());
223 }
224 else
225 {
226 // When launching, we always want to create a new process When
227 // SBTarget::CreateProcess is removed, this will always happen.
228 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
229 }
Greg Clayton1a3083a2010-10-06 03:53:16 +0000230
231 if (sb_process.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000232 {
Greg Claytonc5f728c2010-10-06 22:10:17 +0000233 error.SetError (sb_process->Launch (argv, envp, launch_flags, tty, tty, tty));
Greg Clayton1a3083a2010-10-06 03:53:16 +0000234 if (error.Success())
Chris Lattner24943d22010-06-08 16:52:24 +0000235 {
Sean Callanan451ee7c2010-10-07 22:51:14 +0000236 // We we are stopping at the entry point, we can return now!
237 if (stop_at_entry)
238 return sb_process;
239
Greg Clayton1a3083a2010-10-06 03:53:16 +0000240 // Make sure we are stopped at the entry
241 StateType state = sb_process->WaitForProcessToStop (NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000242 if (state == eStateStopped)
Greg Clayton1a3083a2010-10-06 03:53:16 +0000243 {
244 // resume the process to skip the entry point
Greg Claytonc5f728c2010-10-06 22:10:17 +0000245 error.SetError (sb_process->Resume());
Greg Clayton1a3083a2010-10-06 03:53:16 +0000246 if (error.Success())
247 {
248 // If we are doing synchronous mode, then wait for the
249 // process to stop yet again!
250 if (m_opaque_sp->GetDebugger().GetAsyncExecution () == false)
251 sb_process->WaitForProcessToStop (NULL);
252 }
253 }
Chris Lattner24943d22010-06-08 16:52:24 +0000254 }
255 }
Greg Claytonc5f728c2010-10-06 22:10:17 +0000256 else
257 {
258 error.SetErrorString ("unable to create lldb_private::Process");
259 }
260 }
261 else
262 {
263 error.SetErrorString ("SBTarget is invalid");
Chris Lattner24943d22010-06-08 16:52:24 +0000264 }
Caroline Tice7826c882010-10-26 03:11:13 +0000265
266 if (log)
267 {
268 SBStream sstr;
269 sb_process.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000270 log->Printf ("SBTarget(%p)::Launch (...) => SBProceess(%p): %s",
271 m_opaque_sp.get(), sb_process.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000272 }
273
Greg Clayton1a3083a2010-10-06 03:53:16 +0000274 return sb_process;
Chris Lattner24943d22010-06-08 16:52:24 +0000275}
276
Greg Claytonc5f728c2010-10-06 22:10:17 +0000277
278lldb::SBProcess
Greg Claytond8c62532010-10-07 04:19:01 +0000279SBTarget::AttachToProcessWithID
Greg Claytonc5f728c2010-10-06 22:10:17 +0000280(
281 lldb::pid_t pid,// The process ID to attach to
282 SBError& error // An error explaining what went wrong if attach fails
283)
284{
285 SBProcess sb_process;
286 if (m_opaque_sp)
287 {
288 // DEPRECATED, this will change when CreateProcess is removed...
289 if (m_opaque_sp->GetProcessSP())
290 {
291 sb_process.SetProcess(m_opaque_sp->GetProcessSP());
292 }
293 else
294 {
295 // When launching, we always want to create a new process When
296 // SBTarget::CreateProcess is removed, this will always happen.
297 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
298 }
299
300 if (sb_process.IsValid())
301 {
302 error.SetError (sb_process->Attach (pid));
303 }
304 else
305 {
306 error.SetErrorString ("unable to create lldb_private::Process");
307 }
308 }
309 else
310 {
311 error.SetErrorString ("SBTarget is invalid");
312 }
313 return sb_process;
314
315}
316
317lldb::SBProcess
Greg Claytond8c62532010-10-07 04:19:01 +0000318SBTarget::AttachToProcessWithName
Greg Claytonc5f728c2010-10-06 22:10:17 +0000319(
320 const char *name, // basename of process to attach to
321 bool wait_for, // if true wait for a new instance of "name" to be launched
322 SBError& error // An error explaining what went wrong if attach fails
323)
324{
325 SBProcess sb_process;
326 if (m_opaque_sp)
327 {
328 // DEPRECATED, this will change when CreateProcess is removed...
329 if (m_opaque_sp->GetProcessSP())
330 {
331 sb_process.SetProcess(m_opaque_sp->GetProcessSP());
332 }
333 else
334 {
335 // When launching, we always want to create a new process When
336 // SBTarget::CreateProcess is removed, this will always happen.
337 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
338 }
339
340 if (sb_process.IsValid())
341 {
342 error.SetError (sb_process->Attach (name, wait_for));
343 }
344 else
345 {
346 error.SetErrorString ("unable to create lldb_private::Process");
347 }
348 }
349 else
350 {
351 error.SetErrorString ("SBTarget is invalid");
352 }
353 return sb_process;
354
355}
356
Chris Lattner24943d22010-06-08 16:52:24 +0000357SBFileSpec
358SBTarget::GetExecutable ()
359{
Caroline Tice7826c882010-10-26 03:11:13 +0000360 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
361
Chris Lattner24943d22010-06-08 16:52:24 +0000362 SBFileSpec exe_file_spec;
Greg Clayton63094e02010-06-23 01:19:29 +0000363 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000364 {
Greg Clayton63094e02010-06-23 01:19:29 +0000365 ModuleSP exe_module_sp (m_opaque_sp->GetExecutableModule ());
Chris Lattner24943d22010-06-08 16:52:24 +0000366 if (exe_module_sp)
367 exe_file_spec.SetFileSpec (exe_module_sp->GetFileSpec());
368 }
Caroline Tice7826c882010-10-26 03:11:13 +0000369
370 if (log)
371 {
372 if (exe_file_spec.Exists())
373 {
374 SBStream sstr;
375 exe_file_spec.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000376 log->Printf ("SBTarget(%p)::GetExecutable () => SBFileSpec(%p): %s", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000377 exe_file_spec.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000378 }
379 else
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000380 log->Printf ("SBTarget(%p)::GetExecutable () => SBFileSpec (%p): Unable to find valid file",
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000381 m_opaque_sp.get(), exe_file_spec.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000382 }
383
Chris Lattner24943d22010-06-08 16:52:24 +0000384 return exe_file_spec;
385}
386
387
388bool
389SBTarget::DeleteTargetFromList (TargetList *list)
390{
Greg Clayton63094e02010-06-23 01:19:29 +0000391 if (m_opaque_sp)
392 return list->DeleteTarget (m_opaque_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000393 else
394 return false;
395}
396
397bool
Chris Lattner24943d22010-06-08 16:52:24 +0000398SBTarget::operator == (const SBTarget &rhs) const
399{
Greg Clayton63094e02010-06-23 01:19:29 +0000400 return m_opaque_sp.get() == rhs.m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000401}
402
403bool
404SBTarget::operator != (const SBTarget &rhs) const
405{
Greg Clayton63094e02010-06-23 01:19:29 +0000406 return m_opaque_sp.get() != rhs.m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000407}
408
409lldb_private::Target *
Greg Clayton63094e02010-06-23 01:19:29 +0000410SBTarget::operator ->() const
Chris Lattner24943d22010-06-08 16:52:24 +0000411{
Greg Clayton63094e02010-06-23 01:19:29 +0000412 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000413}
Greg Clayton63094e02010-06-23 01:19:29 +0000414
415lldb_private::Target *
416SBTarget::get() const
Chris Lattner24943d22010-06-08 16:52:24 +0000417{
Greg Clayton63094e02010-06-23 01:19:29 +0000418 return m_opaque_sp.get();
419}
420
421void
422SBTarget::reset (const lldb::TargetSP& target_sp)
423{
424 m_opaque_sp = target_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000425}
426
427SBBreakpoint
428SBTarget::BreakpointCreateByLocation (const char *file, uint32_t line)
429{
Caroline Tice7826c882010-10-26 03:11:13 +0000430 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
431
Chris Lattner24943d22010-06-08 16:52:24 +0000432 SBBreakpoint sb_bp;
433 if (file != NULL && line != 0)
434 sb_bp = BreakpointCreateByLocation (SBFileSpec (file), line);
Caroline Tice7826c882010-10-26 03:11:13 +0000435
436 if (log)
437 {
438 SBStream sstr;
439 sb_bp.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000440 log->Printf("SBTarget(%p)::BreakpointCreateByLocation (file='%s', line=%d) => SBBreakpoint(%p): %s", m_opaque_sp.get(), file, line, sb_bp.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000441 }
442
Chris Lattner24943d22010-06-08 16:52:24 +0000443 return sb_bp;
444}
445
446SBBreakpoint
447SBTarget::BreakpointCreateByLocation (const SBFileSpec &sb_file_spec, uint32_t line)
448{
Caroline Tice7826c882010-10-26 03:11:13 +0000449 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
450
Chris Lattner24943d22010-06-08 16:52:24 +0000451 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000452 if (m_opaque_sp.get() && line != 0)
453 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, *sb_file_spec, line, true, false);
Caroline Tice7826c882010-10-26 03:11:13 +0000454
455 if (log)
456 {
457 SBStream sstr;
458 sb_bp.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000459 log->Printf ("SBTarget(%p)::BreakpointCreateByLocation (sb_file_spec.ap=%p, line=%d) => "
460 "SBBreakpoint(%p): %s", m_opaque_sp.get(), sb_file_spec.get(), line, sb_bp.get(),
Caroline Tice7826c882010-10-26 03:11:13 +0000461 sstr.GetData());
462 }
463
Chris Lattner24943d22010-06-08 16:52:24 +0000464 return sb_bp;
465}
466
467SBBreakpoint
468SBTarget::BreakpointCreateByName (const char *symbol_name, const char *module_name)
469{
Caroline Tice7826c882010-10-26 03:11:13 +0000470 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
471
Chris Lattner24943d22010-06-08 16:52:24 +0000472 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000473 if (m_opaque_sp.get() && symbol_name && symbol_name[0])
Chris Lattner24943d22010-06-08 16:52:24 +0000474 {
475 if (module_name && module_name[0])
476 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000477 FileSpec module_file_spec(module_name, false);
Jim Ingham7ec03bd2010-09-30 21:21:43 +0000478 *sb_bp = m_opaque_sp->CreateBreakpoint (&module_file_spec, symbol_name, eFunctionNameTypeFull | eFunctionNameTypeBase, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000479 }
480 else
481 {
Jim Ingham7ec03bd2010-09-30 21:21:43 +0000482 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, symbol_name, eFunctionNameTypeFull | eFunctionNameTypeBase, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000483 }
484 }
Caroline Tice7826c882010-10-26 03:11:13 +0000485
486 if (log)
487 {
488 SBStream sstr;
489 sb_bp.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000490 log->Printf ("SBTarget(%p)::BreakpointCreateByName (symbol_name='%s', module_name='%s') => "
491 "SBBreakpoint(%p): %s", m_opaque_sp.get(), symbol_name, module_name, sb_bp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000492 sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000493 }
494
Chris Lattner24943d22010-06-08 16:52:24 +0000495 return sb_bp;
496}
497
498SBBreakpoint
499SBTarget::BreakpointCreateByRegex (const char *symbol_name_regex, const char *module_name)
500{
Caroline Tice7826c882010-10-26 03:11:13 +0000501 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
502
Chris Lattner24943d22010-06-08 16:52:24 +0000503 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000504 if (m_opaque_sp.get() && symbol_name_regex && symbol_name_regex[0])
Chris Lattner24943d22010-06-08 16:52:24 +0000505 {
506 RegularExpression regexp(symbol_name_regex);
507
508 if (module_name && module_name[0])
509 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000510 FileSpec module_file_spec(module_name, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000511
Greg Clayton63094e02010-06-23 01:19:29 +0000512 *sb_bp = m_opaque_sp->CreateBreakpoint (&module_file_spec, regexp, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000513 }
514 else
515 {
Greg Clayton63094e02010-06-23 01:19:29 +0000516 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, regexp, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000517 }
518 }
Caroline Tice7826c882010-10-26 03:11:13 +0000519
520 if (log)
521 {
522 SBStream sstr;
523 sb_bp.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000524 log->Printf ("SBTarget(%p)::BreakpointCreateByRegex (symbol_name_regex='%s', module_name='%s') "
525 "=> SBBreakpoint(%p): %s", m_opaque_sp.get(), symbol_name_regex, module_name,
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000526 sb_bp.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000527 }
528
Chris Lattner24943d22010-06-08 16:52:24 +0000529 return sb_bp;
530}
531
532
533
534SBBreakpoint
535SBTarget::BreakpointCreateByAddress (addr_t address)
536{
Caroline Tice7826c882010-10-26 03:11:13 +0000537 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
538
Chris Lattner24943d22010-06-08 16:52:24 +0000539 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000540 if (m_opaque_sp.get())
541 *sb_bp = m_opaque_sp->CreateBreakpoint (address, false);
Caroline Tice7826c882010-10-26 03:11:13 +0000542
543 if (log)
544 {
545 SBStream sstr;
546 sb_bp.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000547 log->Printf ("SBTarget(%p)::BreakpointCreateByAddress (%p, address=%p) => "
548 "SBBreakpoint(%p): %s", m_opaque_sp.get(), address, sb_bp.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000549 }
550
Chris Lattner24943d22010-06-08 16:52:24 +0000551 return sb_bp;
552}
553
Chris Lattner24943d22010-06-08 16:52:24 +0000554SBBreakpoint
555SBTarget::FindBreakpointByID (break_id_t bp_id)
556{
Caroline Tice7826c882010-10-26 03:11:13 +0000557 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
558
Chris Lattner24943d22010-06-08 16:52:24 +0000559 SBBreakpoint sb_breakpoint;
Greg Clayton63094e02010-06-23 01:19:29 +0000560 if (m_opaque_sp && bp_id != LLDB_INVALID_BREAK_ID)
561 *sb_breakpoint = m_opaque_sp->GetBreakpointByID (bp_id);
Caroline Tice7826c882010-10-26 03:11:13 +0000562
563 if (log)
564 {
565 SBStream sstr;
566 sb_breakpoint.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000567 log->Printf ("SBTarget(%p)::FindBreakpointByID (bp_id=%d) => SBBreakpoint(%p): %s",
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000568 m_opaque_sp.get(), (uint32_t) bp_id, sb_breakpoint.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000569 }
570
Chris Lattner24943d22010-06-08 16:52:24 +0000571 return sb_breakpoint;
572}
573
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000574uint32_t
575SBTarget::GetNumBreakpoints () const
576{
577 if (m_opaque_sp)
578 return m_opaque_sp->GetBreakpointList().GetSize();
579 return 0;
580}
581
582SBBreakpoint
583SBTarget::GetBreakpointAtIndex (uint32_t idx) const
584{
585 SBBreakpoint sb_breakpoint;
586 if (m_opaque_sp)
587 *sb_breakpoint = m_opaque_sp->GetBreakpointList().GetBreakpointAtIndex(idx);
588 return sb_breakpoint;
589}
Chris Lattner24943d22010-06-08 16:52:24 +0000590
591bool
592SBTarget::BreakpointDelete (break_id_t bp_id)
593{
Caroline Tice7826c882010-10-26 03:11:13 +0000594 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
595
Caroline Tice7826c882010-10-26 03:11:13 +0000596 bool result = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000597 if (m_opaque_sp)
Caroline Tice7826c882010-10-26 03:11:13 +0000598 result = m_opaque_sp->RemoveBreakpointByID (bp_id);
599
600 if (log)
601 {
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000602 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 +0000603 }
604
605 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000606}
607
608bool
609SBTarget::EnableAllBreakpoints ()
610{
Greg Clayton63094e02010-06-23 01:19:29 +0000611 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000612 {
Greg Clayton63094e02010-06-23 01:19:29 +0000613 m_opaque_sp->EnableAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000614 return true;
615 }
616 return false;
617}
618
619bool
620SBTarget::DisableAllBreakpoints ()
621{
Greg Clayton63094e02010-06-23 01:19:29 +0000622 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000623 {
Greg Clayton63094e02010-06-23 01:19:29 +0000624 m_opaque_sp->DisableAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000625 return true;
626 }
627 return false;
628}
629
630bool
631SBTarget::DeleteAllBreakpoints ()
632{
Greg Clayton63094e02010-06-23 01:19:29 +0000633 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000634 {
Greg Clayton63094e02010-06-23 01:19:29 +0000635 m_opaque_sp->RemoveAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000636 return true;
637 }
638 return false;
639}
640
641
642uint32_t
643SBTarget::GetNumModules () const
644{
Caroline Tice7826c882010-10-26 03:11:13 +0000645 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
646
Caroline Tice7826c882010-10-26 03:11:13 +0000647 uint32_t num = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000648 if (m_opaque_sp)
Caroline Tice7826c882010-10-26 03:11:13 +0000649 num = m_opaque_sp->GetImages().GetSize();
650
651 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000652 log->Printf ("SBTarget(%p)::GetNumModules () => %d", m_opaque_sp.get(), num);
Caroline Tice7826c882010-10-26 03:11:13 +0000653
654 return num;
Chris Lattner24943d22010-06-08 16:52:24 +0000655}
656
Greg Clayton43490d12010-07-30 20:12:55 +0000657void
658SBTarget::Clear ()
659{
Caroline Tice7826c882010-10-26 03:11:13 +0000660 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
661
662 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000663 log->Printf ("SBTarget(%p)::Clear ()", m_opaque_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000664
Greg Clayton43490d12010-07-30 20:12:55 +0000665 m_opaque_sp.reset();
666}
667
668
Chris Lattner24943d22010-06-08 16:52:24 +0000669SBModule
670SBTarget::FindModule (const SBFileSpec &sb_file_spec)
671{
672 SBModule sb_module;
Greg Clayton63094e02010-06-23 01:19:29 +0000673 if (m_opaque_sp && sb_file_spec.IsValid())
674 sb_module.SetModule (m_opaque_sp->GetImages().FindFirstModuleForFileSpec (*sb_file_spec, NULL));
Chris Lattner24943d22010-06-08 16:52:24 +0000675 return sb_module;
676}
677
678SBModule
679SBTarget::GetModuleAtIndex (uint32_t idx)
680{
Caroline Tice7826c882010-10-26 03:11:13 +0000681 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
682
Chris Lattner24943d22010-06-08 16:52:24 +0000683 SBModule sb_module;
Greg Clayton63094e02010-06-23 01:19:29 +0000684 if (m_opaque_sp)
685 sb_module.SetModule(m_opaque_sp->GetImages().GetModuleAtIndex(idx));
Caroline Tice7826c882010-10-26 03:11:13 +0000686
687 if (log)
688 {
689 SBStream sstr;
690 sb_module.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000691 log->Printf ("SBTarget(%p)::GetModuleAtIndex (idx=%d) => SBModule(%p): %s",
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000692 m_opaque_sp.get(), idx, sb_module.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000693 }
694
Chris Lattner24943d22010-06-08 16:52:24 +0000695 return sb_module;
696}
697
698
699SBBroadcaster
700SBTarget::GetBroadcaster () const
701{
Caroline Tice7826c882010-10-26 03:11:13 +0000702 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
703
Greg Clayton63094e02010-06-23 01:19:29 +0000704 SBBroadcaster broadcaster(m_opaque_sp.get(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000705
706 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000707 log->Printf ("SBTarget(%p)::GetBroadcaster () => SBBroadcaster(%p)",
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000708 m_opaque_sp.get(), broadcaster.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000709
Chris Lattner24943d22010-06-08 16:52:24 +0000710 return broadcaster;
711}
712
713void
Greg Clayton70436352010-06-30 23:03:03 +0000714SBTarget::Disassemble (lldb::addr_t start_addr, lldb::addr_t end_addr, const char *module_name)
Chris Lattner24943d22010-06-08 16:52:24 +0000715{
Greg Clayton70436352010-06-30 23:03:03 +0000716 if (start_addr == LLDB_INVALID_ADDRESS)
Chris Lattner24943d22010-06-08 16:52:24 +0000717 return;
718
Greg Clayton63094e02010-06-23 01:19:29 +0000719 FILE *out = m_opaque_sp->GetDebugger().GetOutputFileHandle();
Chris Lattner24943d22010-06-08 16:52:24 +0000720 if (out == NULL)
721 return;
722
Greg Clayton63094e02010-06-23 01:19:29 +0000723 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000724 {
Greg Clayton70436352010-06-30 23:03:03 +0000725 ModuleSP module_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000726 if (module_name != NULL)
727 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000728 FileSpec module_file_spec (module_name, false);
Greg Clayton70436352010-06-30 23:03:03 +0000729 module_sp = m_opaque_sp->GetImages().FindFirstModuleForFileSpec (module_file_spec, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000730 }
Greg Clayton70436352010-06-30 23:03:03 +0000731
732 AddressRange range;
733
734 // Make sure the process object is alive if we have one (it might be
735 // created but we might not be launched yet).
Greg Claytoneea26402010-09-14 23:36:40 +0000736
Greg Clayton1a3083a2010-10-06 03:53:16 +0000737 Process *sb_process = m_opaque_sp->GetProcessSP().get();
738 if (sb_process && !sb_process->IsAlive())
739 sb_process = NULL;
Greg Clayton70436352010-06-30 23:03:03 +0000740
741 // If we are given a module, then "start_addr" is a file address in
742 // that module.
743 if (module_sp)
744 {
745 if (!module_sp->ResolveFileAddress (start_addr, range.GetBaseAddress()))
746 range.GetBaseAddress().SetOffset(start_addr);
747 }
Greg Claytoneea26402010-09-14 23:36:40 +0000748 else if (m_opaque_sp->GetSectionLoadList().IsEmpty() == false)
Greg Clayton70436352010-06-30 23:03:03 +0000749 {
750 // We don't have a module, se we need to figure out if "start_addr"
751 // resolves to anything in a running process.
Greg Claytoneea26402010-09-14 23:36:40 +0000752 if (!m_opaque_sp->GetSectionLoadList().ResolveLoadAddress (start_addr, range.GetBaseAddress()))
Greg Clayton70436352010-06-30 23:03:03 +0000753 range.GetBaseAddress().SetOffset(start_addr);
754 }
755 else
756 {
757 if (m_opaque_sp->GetImages().ResolveFileAddress (start_addr, range.GetBaseAddress()))
758 range.GetBaseAddress().SetOffset(start_addr);
759 }
Chris Lattner24943d22010-06-08 16:52:24 +0000760
761 // For now, we need a process; the disassembly functions insist. If we don't have one already,
762 // make one.
763
Greg Clayton70436352010-06-30 23:03:03 +0000764 ExecutionContext exe_ctx;
Chris Lattner24943d22010-06-08 16:52:24 +0000765
Greg Clayton1a3083a2010-10-06 03:53:16 +0000766 if (sb_process)
767 sb_process->CalculateExecutionContext(exe_ctx);
Greg Clayton70436352010-06-30 23:03:03 +0000768 else
Greg Claytona830adb2010-10-04 01:05:56 +0000769 m_opaque_sp->CalculateExecutionContext(exe_ctx);
Chris Lattner24943d22010-06-08 16:52:24 +0000770
Greg Clayton70436352010-06-30 23:03:03 +0000771 if (end_addr == LLDB_INVALID_ADDRESS || end_addr < start_addr)
772 range.SetByteSize( DEFAULT_DISASM_BYTE_SIZE);
773 else
774 range.SetByteSize(end_addr - start_addr);
Chris Lattner24943d22010-06-08 16:52:24 +0000775
Greg Clayton70436352010-06-30 23:03:03 +0000776 StreamFile out_stream (out);
Chris Lattner24943d22010-06-08 16:52:24 +0000777
Greg Clayton70436352010-06-30 23:03:03 +0000778 Disassembler::Disassemble (m_opaque_sp->GetDebugger(),
779 m_opaque_sp->GetArchitecture(),
780 exe_ctx,
781 range,
782 3,
783 false,
784 out_stream);
Chris Lattner24943d22010-06-08 16:52:24 +0000785 }
786}
787
788void
789SBTarget::Disassemble (const char *function_name, const char *module_name)
790{
791 if (function_name == NULL)
792 return;
793
Greg Clayton63094e02010-06-23 01:19:29 +0000794 FILE *out = m_opaque_sp->GetDebugger().GetOutputFileHandle();
Chris Lattner24943d22010-06-08 16:52:24 +0000795 if (out == NULL)
796 return;
797
Greg Clayton63094e02010-06-23 01:19:29 +0000798 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000799 {
Greg Clayton70436352010-06-30 23:03:03 +0000800 Disassembler *disassembler = Disassembler::FindPlugin (m_opaque_sp->GetArchitecture());
Chris Lattner24943d22010-06-08 16:52:24 +0000801 if (disassembler == NULL)
802 return;
803
Greg Clayton70436352010-06-30 23:03:03 +0000804 ModuleSP module_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000805 if (module_name != NULL)
Chris Lattner24943d22010-06-08 16:52:24 +0000806 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000807 FileSpec module_file_spec (module_name, false);
Greg Clayton70436352010-06-30 23:03:03 +0000808 module_sp = m_opaque_sp->GetImages().FindFirstModuleForFileSpec (module_file_spec, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000809 }
Greg Clayton70436352010-06-30 23:03:03 +0000810
811 ExecutionContext exe_ctx;
812
813 // Make sure the process object is alive if we have one (it might be
814 // created but we might not be launched yet).
Greg Clayton1a3083a2010-10-06 03:53:16 +0000815 Process *sb_process = m_opaque_sp->GetProcessSP().get();
816 if (sb_process && !sb_process->IsAlive())
817 sb_process = NULL;
Greg Clayton70436352010-06-30 23:03:03 +0000818
Greg Clayton1a3083a2010-10-06 03:53:16 +0000819 if (sb_process)
820 sb_process->CalculateExecutionContext(exe_ctx);
Greg Clayton70436352010-06-30 23:03:03 +0000821 else
Greg Claytona830adb2010-10-04 01:05:56 +0000822 m_opaque_sp->CalculateExecutionContext(exe_ctx);
Greg Clayton70436352010-06-30 23:03:03 +0000823
824
825 StreamFile out_stream (out);
826
827 Disassembler::Disassemble (m_opaque_sp->GetDebugger(),
828 m_opaque_sp->GetArchitecture(),
829 exe_ctx,
830 ConstString (function_name),
831 module_sp.get(),
832 3,
833 false,
834 out_stream);
Chris Lattner24943d22010-06-08 16:52:24 +0000835 }
836}
Caroline Tice98f930f2010-09-20 05:20:02 +0000837
838bool
Caroline Tice7826c882010-10-26 03:11:13 +0000839SBTarget::GetDescription (SBStream &description, lldb::DescriptionLevel description_level)
Caroline Tice98f930f2010-09-20 05:20:02 +0000840{
841 if (m_opaque_sp)
Caroline Ticee7a566e2010-09-20 16:21:41 +0000842 {
Caroline Ticee49ec182010-09-22 23:01:29 +0000843 description.ref();
Caroline Tice7826c882010-10-26 03:11:13 +0000844 m_opaque_sp->Dump (description.get(), description_level);
845 }
846 else
847 description.Printf ("No value");
848
849 return true;
850}
851
852bool
853SBTarget::GetDescription (SBStream &description, lldb::DescriptionLevel description_level) const
854{
855 if (m_opaque_sp)
856 {
857 description.ref();
858 m_opaque_sp->Dump (description.get(), description_level);
Caroline Ticee7a566e2010-09-20 16:21:41 +0000859 }
Caroline Tice98f930f2010-09-20 05:20:02 +0000860 else
861 description.Printf ("No value");
862
863 return true;
864}