blob: 039c0ecdd511267d92d2cfae9e5d588618343102 [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)
95 sb_process.SetProcess (m_opaque_sp->GetProcessSP());
Caroline Tice7826c882010-10-26 03:11:13 +000096
Greg Claytone005f2c2010-11-06 01:53:30 +000097 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +000098 if (log)
99 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000100 log->Printf ("SBTarget(%p)::GetProcess () => SBProcess(%p)",
101 m_opaque_sp.get(), sb_process.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000102 }
103
Chris Lattner24943d22010-06-08 16:52:24 +0000104 return sb_process;
105}
106
Greg Clayton63094e02010-06-23 01:19:29 +0000107SBDebugger
108SBTarget::GetDebugger () const
109{
110 SBDebugger debugger;
111 if (m_opaque_sp)
112 debugger.reset (m_opaque_sp->GetDebugger().GetSP());
113 return debugger;
114}
115
Greg Clayton992ce262010-10-06 18:44:26 +0000116
117// DEPRECATED
118SBProcess
119SBTarget::CreateProcess ()
120{
Caroline Tice7826c882010-10-26 03:11:13 +0000121
Greg Clayton992ce262010-10-06 18:44:26 +0000122 SBProcess sb_process;
123
124 if (m_opaque_sp)
125 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
126
Greg Claytone005f2c2010-11-06 01:53:30 +0000127 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000128 if (log)
129 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000130 log->Printf ("SBTarget(%p)::CreateProcess () => SBProcess(%p)",
131 m_opaque_sp.get(), sb_process.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000132 }
133
Greg Clayton992ce262010-10-06 18:44:26 +0000134 return sb_process;
135}
136
137
Greg Claytonc5f728c2010-10-06 22:10:17 +0000138SBProcess
139SBTarget::LaunchProcess
140(
141 char const **argv,
142 char const **envp,
143 const char *tty,
144 uint32_t launch_flags,
Greg Claytond8c62532010-10-07 04:19:01 +0000145 bool stop_at_entry
146)
147{
Greg Claytone005f2c2010-11-06 01:53:30 +0000148 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000149
150 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000151 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 +0000152 m_opaque_sp.get(), argv, envp, tty, launch_flags, stop_at_entry);
Caroline Tice7826c882010-10-26 03:11:13 +0000153
Greg Claytond8c62532010-10-07 04:19:01 +0000154 SBError sb_error;
Caroline Tice7826c882010-10-26 03:11:13 +0000155 SBProcess sb_process = Launch (argv, envp, tty, launch_flags, stop_at_entry, sb_error);
156
Caroline Tice926060e2010-10-29 21:48:37 +0000157 log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +0000158 if (log)
159 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000160 log->Printf ("SBTarget(%p)::LaunchProcess (...) => SBProcess(%p)",
161 m_opaque_sp.get(), sb_process.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000162 }
163
164 return sb_process;
Greg Claytond8c62532010-10-07 04:19:01 +0000165}
166
167SBProcess
168SBTarget::Launch
169(
170 char const **argv,
171 char const **envp,
172 const char *tty,
173 uint32_t launch_flags,
Greg Claytonc5f728c2010-10-06 22:10:17 +0000174 bool stop_at_entry,
175 SBError &error
176)
177{
Greg Claytone005f2c2010-11-06 01:53:30 +0000178 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000179
180 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000181 {
Greg Claytona66ba462010-10-30 04:51:46 +0000182 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 +0000183 m_opaque_sp.get(), argv, envp, tty, launch_flags, stop_at_entry, error.get());
184 }
Greg Clayton1a3083a2010-10-06 03:53:16 +0000185 SBProcess sb_process;
186 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000187 {
Greg Clayton992ce262010-10-06 18:44:26 +0000188 // DEPRECATED, this will change when CreateProcess is removed...
189 if (m_opaque_sp->GetProcessSP())
190 {
191 sb_process.SetProcess(m_opaque_sp->GetProcessSP());
192 }
193 else
194 {
195 // When launching, we always want to create a new process When
196 // SBTarget::CreateProcess is removed, this will always happen.
197 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
198 }
Greg Clayton1a3083a2010-10-06 03:53:16 +0000199
200 if (sb_process.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000201 {
Greg Claytonc5f728c2010-10-06 22:10:17 +0000202 error.SetError (sb_process->Launch (argv, envp, launch_flags, tty, tty, tty));
Greg Clayton1a3083a2010-10-06 03:53:16 +0000203 if (error.Success())
Chris Lattner24943d22010-06-08 16:52:24 +0000204 {
Sean Callanan451ee7c2010-10-07 22:51:14 +0000205 // We we are stopping at the entry point, we can return now!
206 if (stop_at_entry)
207 return sb_process;
208
Greg Clayton1a3083a2010-10-06 03:53:16 +0000209 // Make sure we are stopped at the entry
210 StateType state = sb_process->WaitForProcessToStop (NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000211 if (state == eStateStopped)
Greg Clayton1a3083a2010-10-06 03:53:16 +0000212 {
213 // resume the process to skip the entry point
Greg Claytonc5f728c2010-10-06 22:10:17 +0000214 error.SetError (sb_process->Resume());
Greg Clayton1a3083a2010-10-06 03:53:16 +0000215 if (error.Success())
216 {
217 // If we are doing synchronous mode, then wait for the
218 // process to stop yet again!
219 if (m_opaque_sp->GetDebugger().GetAsyncExecution () == false)
220 sb_process->WaitForProcessToStop (NULL);
221 }
222 }
Chris Lattner24943d22010-06-08 16:52:24 +0000223 }
224 }
Greg Claytonc5f728c2010-10-06 22:10:17 +0000225 else
226 {
227 error.SetErrorString ("unable to create lldb_private::Process");
228 }
229 }
230 else
231 {
232 error.SetErrorString ("SBTarget is invalid");
Chris Lattner24943d22010-06-08 16:52:24 +0000233 }
Caroline Tice7826c882010-10-26 03:11:13 +0000234
Caroline Tice926060e2010-10-29 21:48:37 +0000235 log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +0000236 if (log)
237 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000238 log->Printf ("SBTarget(%p)::Launch (...) => SBProceess(%p)",
239 m_opaque_sp.get(), sb_process.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000240 }
241
Greg Clayton1a3083a2010-10-06 03:53:16 +0000242 return sb_process;
Chris Lattner24943d22010-06-08 16:52:24 +0000243}
244
Greg Claytonc5f728c2010-10-06 22:10:17 +0000245
246lldb::SBProcess
Greg Claytond8c62532010-10-07 04:19:01 +0000247SBTarget::AttachToProcessWithID
Greg Claytonc5f728c2010-10-06 22:10:17 +0000248(
249 lldb::pid_t pid,// The process ID to attach to
250 SBError& error // An error explaining what went wrong if attach fails
251)
252{
253 SBProcess sb_process;
254 if (m_opaque_sp)
255 {
256 // DEPRECATED, this will change when CreateProcess is removed...
257 if (m_opaque_sp->GetProcessSP())
258 {
259 sb_process.SetProcess(m_opaque_sp->GetProcessSP());
260 }
261 else
262 {
263 // When launching, we always want to create a new process When
264 // SBTarget::CreateProcess is removed, this will always happen.
265 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
266 }
267
268 if (sb_process.IsValid())
269 {
270 error.SetError (sb_process->Attach (pid));
271 }
272 else
273 {
274 error.SetErrorString ("unable to create lldb_private::Process");
275 }
276 }
277 else
278 {
279 error.SetErrorString ("SBTarget is invalid");
280 }
281 return sb_process;
282
283}
284
285lldb::SBProcess
Greg Claytond8c62532010-10-07 04:19:01 +0000286SBTarget::AttachToProcessWithName
Greg Claytonc5f728c2010-10-06 22:10:17 +0000287(
288 const char *name, // basename of process to attach to
289 bool wait_for, // if true wait for a new instance of "name" to be launched
290 SBError& error // An error explaining what went wrong if attach fails
291)
292{
293 SBProcess sb_process;
294 if (m_opaque_sp)
295 {
296 // DEPRECATED, this will change when CreateProcess is removed...
297 if (m_opaque_sp->GetProcessSP())
298 {
299 sb_process.SetProcess(m_opaque_sp->GetProcessSP());
300 }
301 else
302 {
303 // When launching, we always want to create a new process When
304 // SBTarget::CreateProcess is removed, this will always happen.
305 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
306 }
307
308 if (sb_process.IsValid())
309 {
310 error.SetError (sb_process->Attach (name, wait_for));
311 }
312 else
313 {
314 error.SetErrorString ("unable to create lldb_private::Process");
315 }
316 }
317 else
318 {
319 error.SetErrorString ("SBTarget is invalid");
320 }
321 return sb_process;
322
323}
324
Chris Lattner24943d22010-06-08 16:52:24 +0000325SBFileSpec
326SBTarget::GetExecutable ()
327{
Caroline Tice7826c882010-10-26 03:11:13 +0000328
Chris Lattner24943d22010-06-08 16:52:24 +0000329 SBFileSpec exe_file_spec;
Greg Clayton63094e02010-06-23 01:19:29 +0000330 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000331 {
Greg Clayton63094e02010-06-23 01:19:29 +0000332 ModuleSP exe_module_sp (m_opaque_sp->GetExecutableModule ());
Chris Lattner24943d22010-06-08 16:52:24 +0000333 if (exe_module_sp)
334 exe_file_spec.SetFileSpec (exe_module_sp->GetFileSpec());
335 }
Caroline Tice7826c882010-10-26 03:11:13 +0000336
Greg Claytone005f2c2010-11-06 01:53:30 +0000337 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000338 if (log)
339 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000340 log->Printf ("SBTarget(%p)::GetExecutable () => SBFileSpec(%p)",
341 m_opaque_sp.get(), exe_file_spec.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000342 }
343
Chris Lattner24943d22010-06-08 16:52:24 +0000344 return exe_file_spec;
345}
346
347
348bool
349SBTarget::DeleteTargetFromList (TargetList *list)
350{
Greg Clayton63094e02010-06-23 01:19:29 +0000351 if (m_opaque_sp)
352 return list->DeleteTarget (m_opaque_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000353 else
354 return false;
355}
356
357bool
Chris Lattner24943d22010-06-08 16:52:24 +0000358SBTarget::operator == (const SBTarget &rhs) const
359{
Greg Clayton63094e02010-06-23 01:19:29 +0000360 return m_opaque_sp.get() == rhs.m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000361}
362
363bool
364SBTarget::operator != (const SBTarget &rhs) const
365{
Greg Clayton63094e02010-06-23 01:19:29 +0000366 return m_opaque_sp.get() != rhs.m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000367}
368
369lldb_private::Target *
Greg Clayton63094e02010-06-23 01:19:29 +0000370SBTarget::operator ->() const
Chris Lattner24943d22010-06-08 16:52:24 +0000371{
Greg Clayton63094e02010-06-23 01:19:29 +0000372 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000373}
Greg Clayton63094e02010-06-23 01:19:29 +0000374
375lldb_private::Target *
376SBTarget::get() const
Chris Lattner24943d22010-06-08 16:52:24 +0000377{
Greg Clayton63094e02010-06-23 01:19:29 +0000378 return m_opaque_sp.get();
379}
380
381void
382SBTarget::reset (const lldb::TargetSP& target_sp)
383{
384 m_opaque_sp = target_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000385}
386
Greg Claytonea49cc72010-12-12 19:25:26 +0000387bool
388SBTarget::ResolveLoadAddress (lldb::addr_t vm_addr,
389 lldb::SBAddress& addr)
390{
391 if (m_opaque_sp)
392 return m_opaque_sp->GetSectionLoadList().ResolveLoadAddress (vm_addr, *addr);
393
394 addr->Clear();
395 return false;
396}
397
Chris Lattner24943d22010-06-08 16:52:24 +0000398SBBreakpoint
399SBTarget::BreakpointCreateByLocation (const char *file, uint32_t line)
400{
Greg Claytond6d806c2010-11-08 00:28:40 +0000401 return SBBreakpoint(BreakpointCreateByLocation (SBFileSpec (file, false), line));
Chris Lattner24943d22010-06-08 16:52:24 +0000402}
403
404SBBreakpoint
405SBTarget::BreakpointCreateByLocation (const SBFileSpec &sb_file_spec, uint32_t line)
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() && line != 0)
411 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, *sb_file_spec, line, true, false);
Caroline Tice7826c882010-10-26 03:11:13 +0000412
413 if (log)
414 {
415 SBStream sstr;
416 sb_bp.GetDescription (sstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000417 char path[PATH_MAX];
418 sb_file_spec->GetPath (path, sizeof(path));
419 log->Printf ("SBTarget(%p)::BreakpointCreateByLocation ( %s:%u ) => SBBreakpoint(%p): %s",
Greg Claytona66ba462010-10-30 04:51:46 +0000420 m_opaque_sp.get(),
Greg Clayton49ce6822010-10-31 03:01:06 +0000421 path,
Greg Claytona66ba462010-10-30 04:51:46 +0000422 line,
Greg Clayton49ce6822010-10-31 03:01:06 +0000423 sb_bp.get(),
Caroline Tice7826c882010-10-26 03:11:13 +0000424 sstr.GetData());
425 }
426
Chris Lattner24943d22010-06-08 16:52:24 +0000427 return sb_bp;
428}
429
430SBBreakpoint
431SBTarget::BreakpointCreateByName (const char *symbol_name, const char *module_name)
432{
Greg Claytone005f2c2010-11-06 01:53:30 +0000433 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000434
Chris Lattner24943d22010-06-08 16:52:24 +0000435 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000436 if (m_opaque_sp.get() && symbol_name && symbol_name[0])
Chris Lattner24943d22010-06-08 16:52:24 +0000437 {
438 if (module_name && module_name[0])
439 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000440 FileSpec module_file_spec(module_name, false);
Jim Ingham7ec03bd2010-09-30 21:21:43 +0000441 *sb_bp = m_opaque_sp->CreateBreakpoint (&module_file_spec, symbol_name, eFunctionNameTypeFull | eFunctionNameTypeBase, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000442 }
443 else
444 {
Jim Ingham7ec03bd2010-09-30 21:21:43 +0000445 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, symbol_name, eFunctionNameTypeFull | eFunctionNameTypeBase, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000446 }
447 }
Caroline Tice7826c882010-10-26 03:11:13 +0000448
449 if (log)
450 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000451 log->Printf ("SBTarget(%p)::BreakpointCreateByName (symbol=\"%s\", module=\"%s\") => SBBreakpoint(%p)",
452 m_opaque_sp.get(), symbol_name, module_name, 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
458SBBreakpoint
459SBTarget::BreakpointCreateByRegex (const char *symbol_name_regex, const char *module_name)
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_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000464 if (m_opaque_sp.get() && symbol_name_regex && symbol_name_regex[0])
Chris Lattner24943d22010-06-08 16:52:24 +0000465 {
466 RegularExpression regexp(symbol_name_regex);
467
468 if (module_name && module_name[0])
469 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000470 FileSpec module_file_spec(module_name, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000471
Greg Clayton63094e02010-06-23 01:19:29 +0000472 *sb_bp = m_opaque_sp->CreateBreakpoint (&module_file_spec, regexp, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000473 }
474 else
475 {
Greg Clayton63094e02010-06-23 01:19:29 +0000476 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, regexp, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000477 }
478 }
Caroline Tice7826c882010-10-26 03:11:13 +0000479
480 if (log)
481 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000482 log->Printf ("SBTarget(%p)::BreakpointCreateByRegex (symbol_regex=\"%s\", module_name=\"%s\") => SBBreakpoint(%p)",
483 m_opaque_sp.get(), symbol_name_regex, module_name, sb_bp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000484 }
485
Chris Lattner24943d22010-06-08 16:52:24 +0000486 return sb_bp;
487}
488
489
490
491SBBreakpoint
492SBTarget::BreakpointCreateByAddress (addr_t address)
493{
Greg Claytone005f2c2010-11-06 01:53:30 +0000494 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000495
Chris Lattner24943d22010-06-08 16:52:24 +0000496 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000497 if (m_opaque_sp.get())
498 *sb_bp = m_opaque_sp->CreateBreakpoint (address, false);
Caroline Tice7826c882010-10-26 03:11:13 +0000499
500 if (log)
501 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000502 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 +0000503 }
504
Chris Lattner24943d22010-06-08 16:52:24 +0000505 return sb_bp;
506}
507
Chris Lattner24943d22010-06-08 16:52:24 +0000508SBBreakpoint
509SBTarget::FindBreakpointByID (break_id_t bp_id)
510{
Greg Claytone005f2c2010-11-06 01:53:30 +0000511 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000512
Chris Lattner24943d22010-06-08 16:52:24 +0000513 SBBreakpoint sb_breakpoint;
Greg Clayton63094e02010-06-23 01:19:29 +0000514 if (m_opaque_sp && bp_id != LLDB_INVALID_BREAK_ID)
515 *sb_breakpoint = m_opaque_sp->GetBreakpointByID (bp_id);
Caroline Tice7826c882010-10-26 03:11:13 +0000516
517 if (log)
518 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000519 log->Printf ("SBTarget(%p)::FindBreakpointByID (bp_id=%d) => SBBreakpoint(%p)",
520 m_opaque_sp.get(), (uint32_t) bp_id, sb_breakpoint.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000521 }
522
Chris Lattner24943d22010-06-08 16:52:24 +0000523 return sb_breakpoint;
524}
525
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000526uint32_t
527SBTarget::GetNumBreakpoints () const
528{
529 if (m_opaque_sp)
530 return m_opaque_sp->GetBreakpointList().GetSize();
531 return 0;
532}
533
534SBBreakpoint
535SBTarget::GetBreakpointAtIndex (uint32_t idx) const
536{
537 SBBreakpoint sb_breakpoint;
538 if (m_opaque_sp)
539 *sb_breakpoint = m_opaque_sp->GetBreakpointList().GetBreakpointAtIndex(idx);
540 return sb_breakpoint;
541}
Chris Lattner24943d22010-06-08 16:52:24 +0000542
543bool
544SBTarget::BreakpointDelete (break_id_t bp_id)
545{
Greg Claytone005f2c2010-11-06 01:53:30 +0000546 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000547
Caroline Tice7826c882010-10-26 03:11:13 +0000548 bool result = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000549 if (m_opaque_sp)
Caroline Tice7826c882010-10-26 03:11:13 +0000550 result = m_opaque_sp->RemoveBreakpointByID (bp_id);
551
552 if (log)
553 {
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000554 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 +0000555 }
556
557 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000558}
559
560bool
561SBTarget::EnableAllBreakpoints ()
562{
Greg Clayton63094e02010-06-23 01:19:29 +0000563 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000564 {
Greg Clayton63094e02010-06-23 01:19:29 +0000565 m_opaque_sp->EnableAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000566 return true;
567 }
568 return false;
569}
570
571bool
572SBTarget::DisableAllBreakpoints ()
573{
Greg Clayton63094e02010-06-23 01:19:29 +0000574 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000575 {
Greg Clayton63094e02010-06-23 01:19:29 +0000576 m_opaque_sp->DisableAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000577 return true;
578 }
579 return false;
580}
581
582bool
583SBTarget::DeleteAllBreakpoints ()
584{
Greg Clayton63094e02010-06-23 01:19:29 +0000585 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000586 {
Greg Clayton63094e02010-06-23 01:19:29 +0000587 m_opaque_sp->RemoveAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000588 return true;
589 }
590 return false;
591}
592
593
594uint32_t
595SBTarget::GetNumModules () const
596{
Greg Claytone005f2c2010-11-06 01:53:30 +0000597 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000598
Caroline Tice7826c882010-10-26 03:11:13 +0000599 uint32_t num = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000600 if (m_opaque_sp)
Caroline Tice7826c882010-10-26 03:11:13 +0000601 num = m_opaque_sp->GetImages().GetSize();
602
603 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000604 log->Printf ("SBTarget(%p)::GetNumModules () => %d", m_opaque_sp.get(), num);
Caroline Tice7826c882010-10-26 03:11:13 +0000605
606 return num;
Chris Lattner24943d22010-06-08 16:52:24 +0000607}
608
Greg Clayton43490d12010-07-30 20:12:55 +0000609void
610SBTarget::Clear ()
611{
Greg Claytone005f2c2010-11-06 01:53:30 +0000612 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000613
614 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000615 log->Printf ("SBTarget(%p)::Clear ()", m_opaque_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000616
Greg Clayton43490d12010-07-30 20:12:55 +0000617 m_opaque_sp.reset();
618}
619
620
Chris Lattner24943d22010-06-08 16:52:24 +0000621SBModule
622SBTarget::FindModule (const SBFileSpec &sb_file_spec)
623{
624 SBModule sb_module;
Greg Clayton63094e02010-06-23 01:19:29 +0000625 if (m_opaque_sp && sb_file_spec.IsValid())
626 sb_module.SetModule (m_opaque_sp->GetImages().FindFirstModuleForFileSpec (*sb_file_spec, NULL));
Chris Lattner24943d22010-06-08 16:52:24 +0000627 return sb_module;
628}
629
630SBModule
631SBTarget::GetModuleAtIndex (uint32_t idx)
632{
Greg Claytone005f2c2010-11-06 01:53:30 +0000633 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000634
Chris Lattner24943d22010-06-08 16:52:24 +0000635 SBModule sb_module;
Greg Clayton63094e02010-06-23 01:19:29 +0000636 if (m_opaque_sp)
637 sb_module.SetModule(m_opaque_sp->GetImages().GetModuleAtIndex(idx));
Caroline Tice7826c882010-10-26 03:11:13 +0000638
639 if (log)
640 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000641 log->Printf ("SBTarget(%p)::GetModuleAtIndex (idx=%d) => SBModule(%p)",
642 m_opaque_sp.get(), idx, sb_module.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000643 }
644
Chris Lattner24943d22010-06-08 16:52:24 +0000645 return sb_module;
646}
647
648
649SBBroadcaster
650SBTarget::GetBroadcaster () const
651{
Greg Claytone005f2c2010-11-06 01:53:30 +0000652 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000653
Greg Clayton63094e02010-06-23 01:19:29 +0000654 SBBroadcaster broadcaster(m_opaque_sp.get(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000655
656 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000657 log->Printf ("SBTarget(%p)::GetBroadcaster () => SBBroadcaster(%p)",
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000658 m_opaque_sp.get(), broadcaster.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000659
Chris Lattner24943d22010-06-08 16:52:24 +0000660 return broadcaster;
661}
662
663void
Greg Clayton70436352010-06-30 23:03:03 +0000664SBTarget::Disassemble (lldb::addr_t start_addr, lldb::addr_t end_addr, const char *module_name)
Chris Lattner24943d22010-06-08 16:52:24 +0000665{
Greg Clayton70436352010-06-30 23:03:03 +0000666 if (start_addr == LLDB_INVALID_ADDRESS)
Chris Lattner24943d22010-06-08 16:52:24 +0000667 return;
668
Greg Clayton63094e02010-06-23 01:19:29 +0000669 FILE *out = m_opaque_sp->GetDebugger().GetOutputFileHandle();
Chris Lattner24943d22010-06-08 16:52:24 +0000670 if (out == NULL)
671 return;
672
Greg Clayton63094e02010-06-23 01:19:29 +0000673 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000674 {
Greg Clayton70436352010-06-30 23:03:03 +0000675 ModuleSP module_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000676 if (module_name != NULL)
677 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000678 FileSpec module_file_spec (module_name, false);
Greg Clayton70436352010-06-30 23:03:03 +0000679 module_sp = m_opaque_sp->GetImages().FindFirstModuleForFileSpec (module_file_spec, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000680 }
Greg Clayton70436352010-06-30 23:03:03 +0000681
682 AddressRange range;
683
684 // Make sure the process object is alive if we have one (it might be
685 // created but we might not be launched yet).
Greg Claytoneea26402010-09-14 23:36:40 +0000686
Greg Clayton1a3083a2010-10-06 03:53:16 +0000687 Process *sb_process = m_opaque_sp->GetProcessSP().get();
688 if (sb_process && !sb_process->IsAlive())
689 sb_process = NULL;
Greg Clayton70436352010-06-30 23:03:03 +0000690
691 // If we are given a module, then "start_addr" is a file address in
692 // that module.
693 if (module_sp)
694 {
695 if (!module_sp->ResolveFileAddress (start_addr, range.GetBaseAddress()))
696 range.GetBaseAddress().SetOffset(start_addr);
697 }
Greg Claytoneea26402010-09-14 23:36:40 +0000698 else if (m_opaque_sp->GetSectionLoadList().IsEmpty() == false)
Greg Clayton70436352010-06-30 23:03:03 +0000699 {
700 // We don't have a module, se we need to figure out if "start_addr"
701 // resolves to anything in a running process.
Greg Claytoneea26402010-09-14 23:36:40 +0000702 if (!m_opaque_sp->GetSectionLoadList().ResolveLoadAddress (start_addr, range.GetBaseAddress()))
Greg Clayton70436352010-06-30 23:03:03 +0000703 range.GetBaseAddress().SetOffset(start_addr);
704 }
705 else
706 {
707 if (m_opaque_sp->GetImages().ResolveFileAddress (start_addr, range.GetBaseAddress()))
708 range.GetBaseAddress().SetOffset(start_addr);
709 }
Chris Lattner24943d22010-06-08 16:52:24 +0000710
711 // For now, we need a process; the disassembly functions insist. If we don't have one already,
712 // make one.
713
Greg Clayton70436352010-06-30 23:03:03 +0000714 ExecutionContext exe_ctx;
Chris Lattner24943d22010-06-08 16:52:24 +0000715
Greg Clayton1a3083a2010-10-06 03:53:16 +0000716 if (sb_process)
717 sb_process->CalculateExecutionContext(exe_ctx);
Greg Clayton70436352010-06-30 23:03:03 +0000718 else
Greg Claytona830adb2010-10-04 01:05:56 +0000719 m_opaque_sp->CalculateExecutionContext(exe_ctx);
Chris Lattner24943d22010-06-08 16:52:24 +0000720
Greg Clayton70436352010-06-30 23:03:03 +0000721 if (end_addr == LLDB_INVALID_ADDRESS || end_addr < start_addr)
722 range.SetByteSize( DEFAULT_DISASM_BYTE_SIZE);
723 else
724 range.SetByteSize(end_addr - start_addr);
Chris Lattner24943d22010-06-08 16:52:24 +0000725
Greg Clayton70436352010-06-30 23:03:03 +0000726 StreamFile out_stream (out);
Chris Lattner24943d22010-06-08 16:52:24 +0000727
Greg Clayton70436352010-06-30 23:03:03 +0000728 Disassembler::Disassemble (m_opaque_sp->GetDebugger(),
729 m_opaque_sp->GetArchitecture(),
730 exe_ctx,
731 range,
732 3,
733 false,
734 out_stream);
Chris Lattner24943d22010-06-08 16:52:24 +0000735 }
736}
737
738void
739SBTarget::Disassemble (const char *function_name, const char *module_name)
740{
741 if (function_name == NULL)
742 return;
743
Greg Clayton63094e02010-06-23 01:19:29 +0000744 FILE *out = m_opaque_sp->GetDebugger().GetOutputFileHandle();
Chris Lattner24943d22010-06-08 16:52:24 +0000745 if (out == NULL)
746 return;
747
Greg Clayton63094e02010-06-23 01:19:29 +0000748 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000749 {
Greg Clayton70436352010-06-30 23:03:03 +0000750 Disassembler *disassembler = Disassembler::FindPlugin (m_opaque_sp->GetArchitecture());
Chris Lattner24943d22010-06-08 16:52:24 +0000751 if (disassembler == NULL)
752 return;
753
Greg Clayton70436352010-06-30 23:03:03 +0000754 ModuleSP module_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000755 if (module_name != NULL)
Chris Lattner24943d22010-06-08 16:52:24 +0000756 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000757 FileSpec module_file_spec (module_name, false);
Greg Clayton70436352010-06-30 23:03:03 +0000758 module_sp = m_opaque_sp->GetImages().FindFirstModuleForFileSpec (module_file_spec, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000759 }
Greg Clayton70436352010-06-30 23:03:03 +0000760
761 ExecutionContext exe_ctx;
762
763 // Make sure the process object is alive if we have one (it might be
764 // created but we might not be launched yet).
Greg Clayton1a3083a2010-10-06 03:53:16 +0000765 Process *sb_process = m_opaque_sp->GetProcessSP().get();
766 if (sb_process && !sb_process->IsAlive())
767 sb_process = NULL;
Greg Clayton70436352010-06-30 23:03:03 +0000768
Greg Clayton1a3083a2010-10-06 03:53:16 +0000769 if (sb_process)
770 sb_process->CalculateExecutionContext(exe_ctx);
Greg Clayton70436352010-06-30 23:03:03 +0000771 else
Greg Claytona830adb2010-10-04 01:05:56 +0000772 m_opaque_sp->CalculateExecutionContext(exe_ctx);
Greg Clayton70436352010-06-30 23:03:03 +0000773
774
775 StreamFile out_stream (out);
776
777 Disassembler::Disassemble (m_opaque_sp->GetDebugger(),
778 m_opaque_sp->GetArchitecture(),
779 exe_ctx,
780 ConstString (function_name),
781 module_sp.get(),
782 3,
783 false,
784 out_stream);
Chris Lattner24943d22010-06-08 16:52:24 +0000785 }
786}
Caroline Tice98f930f2010-09-20 05:20:02 +0000787
788bool
Caroline Tice7826c882010-10-26 03:11:13 +0000789SBTarget::GetDescription (SBStream &description, lldb::DescriptionLevel description_level)
Caroline Tice98f930f2010-09-20 05:20:02 +0000790{
791 if (m_opaque_sp)
Caroline Ticee7a566e2010-09-20 16:21:41 +0000792 {
Caroline Ticee49ec182010-09-22 23:01:29 +0000793 description.ref();
Caroline Tice7826c882010-10-26 03:11:13 +0000794 m_opaque_sp->Dump (description.get(), description_level);
795 }
796 else
797 description.Printf ("No value");
798
799 return true;
800}
801
802bool
803SBTarget::GetDescription (SBStream &description, lldb::DescriptionLevel description_level) const
804{
805 if (m_opaque_sp)
806 {
807 description.ref();
808 m_opaque_sp->Dump (description.get(), description_level);
Caroline Ticee7a566e2010-09-20 16:21:41 +0000809 }
Caroline Tice98f930f2010-09-20 05:20:02 +0000810 else
811 description.Printf ("No value");
812
813 return true;
814}