blob: fbb1083f8ea12b467672aaab7f3ded599902d893 [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{
Caroline Tice7826c882010-10-26 03:11:13 +000055 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE);
56
57 if (log)
58 log->Printf ("SBTarget::SBTarget () ==> this = %p", this);
Chris Lattner24943d22010-06-08 16:52:24 +000059}
60
61SBTarget::SBTarget (const SBTarget& rhs) :
Greg Clayton63094e02010-06-23 01:19:29 +000062 m_opaque_sp (rhs.m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000063{
Caroline Tice7826c882010-10-26 03:11:13 +000064 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE);
65
66 if (log)
67 log->Printf ("SBTarget::SBTarget (const SBTarget &rhs) rhs.m_opaque_sp.get() = %p ==> this = %p",
68 rhs.m_opaque_sp.get(), this);
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 Tice7826c882010-10-26 03:11:13 +000074 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE);
75
76 if (log)
77 log->Printf ("SBTarget::SBTarget (const TargetSP &target_sp) target_sp.get() = %p ==> this = %p",
78 target_sp.get(), this);
Chris Lattner24943d22010-06-08 16:52:24 +000079}
80
81const SBTarget&
82SBTarget::Assign (const SBTarget& rhs)
83{
Caroline Tice7826c882010-10-26 03:11:13 +000084 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
85
86 if (log)
87 log->Printf ("SBTarget::Assign (const SBTarget &rhs) rhs = %p", &rhs);
88
Chris Lattner24943d22010-06-08 16:52:24 +000089 if (this != &rhs)
90 {
Greg Clayton63094e02010-06-23 01:19:29 +000091 m_opaque_sp = rhs.m_opaque_sp;
Chris Lattner24943d22010-06-08 16:52:24 +000092 }
Caroline Tice7826c882010-10-26 03:11:13 +000093
94 if (log)
95 log->Printf ("SBTarget::Assign ==> SBTarget (this = %p, m_opaque_sp.get() = %p)", this, m_opaque_sp.get());
96
Chris Lattner24943d22010-06-08 16:52:24 +000097 return *this;
98}
99
100
101//----------------------------------------------------------------------
102// Destructor
103//----------------------------------------------------------------------
104SBTarget::~SBTarget()
105{
106}
107
108bool
109SBTarget::IsValid () const
110{
Greg Clayton63094e02010-06-23 01:19:29 +0000111 return m_opaque_sp.get() != NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000112}
113
114SBProcess
115SBTarget::GetProcess ()
116{
Caroline Tice7826c882010-10-26 03:11:13 +0000117 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
118
119 if (log)
120 log->Printf ("SBTarget::GetProcess ()");
121
Chris Lattner24943d22010-06-08 16:52:24 +0000122 SBProcess sb_process;
Greg Clayton63094e02010-06-23 01:19:29 +0000123 if (m_opaque_sp)
124 sb_process.SetProcess (m_opaque_sp->GetProcessSP());
Caroline Tice7826c882010-10-26 03:11:13 +0000125
126 if (log)
127 {
128 SBStream sstr;
129 sb_process.GetDescription (sstr);
130 log->Printf ("SBTarget::GetProcess ==> SBProcess (this = %p, '%s')", &sb_process, sstr.GetData());
131 }
132
Chris Lattner24943d22010-06-08 16:52:24 +0000133 return sb_process;
134}
135
Greg Clayton63094e02010-06-23 01:19:29 +0000136SBDebugger
137SBTarget::GetDebugger () const
138{
139 SBDebugger debugger;
140 if (m_opaque_sp)
141 debugger.reset (m_opaque_sp->GetDebugger().GetSP());
142 return debugger;
143}
144
Greg Clayton992ce262010-10-06 18:44:26 +0000145
146// DEPRECATED
147SBProcess
148SBTarget::CreateProcess ()
149{
Caroline Tice7826c882010-10-26 03:11:13 +0000150 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
151
152 if (log)
153 log->Printf ("SBTarget::CreateProcess ()");
154
Greg Clayton992ce262010-10-06 18:44:26 +0000155 SBProcess sb_process;
156
157 if (m_opaque_sp)
158 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
159
Caroline Tice7826c882010-10-26 03:11:13 +0000160 if (log)
161 {
162 SBStream sstr;
163 sb_process.GetDescription (sstr);
164 log->Printf ("SBTarget::CreateProcess ==> SBProcess (this = %p, '%s')", &sb_process, sstr.GetData());
165 }
166
Greg Clayton992ce262010-10-06 18:44:26 +0000167 return sb_process;
168}
169
170
Greg Claytonc5f728c2010-10-06 22:10:17 +0000171SBProcess
172SBTarget::LaunchProcess
173(
174 char const **argv,
175 char const **envp,
176 const char *tty,
177 uint32_t launch_flags,
Greg Claytond8c62532010-10-07 04:19:01 +0000178 bool stop_at_entry
179)
180{
Caroline Tice7826c882010-10-26 03:11:13 +0000181 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
182
183 if (log)
184 {
185 log->Printf ("SBTarget::LaunchProcess (char const **argv, char const **envp, const char *tty, "
186 "uint32_t launch_flags, bool stop_at_entry)");
187
188 if (!argv)
189 log->Printf ("argv: NULL");
190 else
191 {
192 for (int i = 0; argv[i]; ++i)
193 log->Printf (" %s", argv[i]);
194 }
195
196 if (!envp)
197 log->Printf ("envp: NULL");
198 else
199 {
200 for (int i = 0; envp[i]; ++i)
201 log->Printf (" %s", envp[i]);
202 }
203
204 log->Printf (" tty = %s, launch_flags = %d, stop_at_entry = %s", tty, launch_flags, (stop_at_entry ?
205 "true" :
206 "false"));
207 }
208
Greg Claytond8c62532010-10-07 04:19:01 +0000209 SBError sb_error;
Caroline Tice7826c882010-10-26 03:11:13 +0000210 SBProcess sb_process = Launch (argv, envp, tty, launch_flags, stop_at_entry, sb_error);
211
212 if (log)
213 {
214 SBStream sstr;
215 sb_process.GetDescription (sstr);
216 log->Printf ("SBTarget::LaunchProcess ==> SBProcess (this = %p, '%s')", this, sstr.GetData());
217 }
218
219 return sb_process;
Greg Claytond8c62532010-10-07 04:19:01 +0000220}
221
222SBProcess
223SBTarget::Launch
224(
225 char const **argv,
226 char const **envp,
227 const char *tty,
228 uint32_t launch_flags,
Greg Claytonc5f728c2010-10-06 22:10:17 +0000229 bool stop_at_entry,
230 SBError &error
231)
232{
Caroline Tice7826c882010-10-26 03:11:13 +0000233 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
234
235 if (log)
236 {
237 log->Printf ("SBTarget::Launch (char const **argv, char const **envp, const char *tty, uint32_t launch_flag,"
238 "bool stop_at_entry, SBError error)");
239 if (!argv)
240 log->Printf ("argv: NULL");
241 else
242 {
243 for (int i = 0; argv[i]; ++i)
244 log->Printf (" %s", argv[i]);
245 }
246
247 if (!envp)
248 log->Printf ("envp: NULL");
249 else
250 {
251 for (int i = 0; envp[i]; ++i)
252 log->Printf (" %s", envp[i]);
253 }
254
255 log->Printf (" tty = %s, launch_flags = %d, stop_at_entry = %s, error (this = %p)", tty, launch_flags,
256 (stop_at_entry ? "true" : "false"), &error);
257 }
258
Greg Clayton1a3083a2010-10-06 03:53:16 +0000259 SBProcess sb_process;
260 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000261 {
Greg Clayton992ce262010-10-06 18:44:26 +0000262 // DEPRECATED, this will change when CreateProcess is removed...
263 if (m_opaque_sp->GetProcessSP())
264 {
265 sb_process.SetProcess(m_opaque_sp->GetProcessSP());
266 }
267 else
268 {
269 // When launching, we always want to create a new process When
270 // SBTarget::CreateProcess is removed, this will always happen.
271 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
272 }
Greg Clayton1a3083a2010-10-06 03:53:16 +0000273
274 if (sb_process.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000275 {
Greg Claytonc5f728c2010-10-06 22:10:17 +0000276 error.SetError (sb_process->Launch (argv, envp, launch_flags, tty, tty, tty));
Greg Clayton1a3083a2010-10-06 03:53:16 +0000277 if (error.Success())
Chris Lattner24943d22010-06-08 16:52:24 +0000278 {
Sean Callanan451ee7c2010-10-07 22:51:14 +0000279 // We we are stopping at the entry point, we can return now!
280 if (stop_at_entry)
281 return sb_process;
282
Greg Clayton1a3083a2010-10-06 03:53:16 +0000283 // Make sure we are stopped at the entry
284 StateType state = sb_process->WaitForProcessToStop (NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000285 if (state == eStateStopped)
Greg Clayton1a3083a2010-10-06 03:53:16 +0000286 {
287 // resume the process to skip the entry point
Greg Claytonc5f728c2010-10-06 22:10:17 +0000288 error.SetError (sb_process->Resume());
Greg Clayton1a3083a2010-10-06 03:53:16 +0000289 if (error.Success())
290 {
291 // If we are doing synchronous mode, then wait for the
292 // process to stop yet again!
293 if (m_opaque_sp->GetDebugger().GetAsyncExecution () == false)
294 sb_process->WaitForProcessToStop (NULL);
295 }
296 }
Chris Lattner24943d22010-06-08 16:52:24 +0000297 }
298 }
Greg Claytonc5f728c2010-10-06 22:10:17 +0000299 else
300 {
301 error.SetErrorString ("unable to create lldb_private::Process");
302 }
303 }
304 else
305 {
306 error.SetErrorString ("SBTarget is invalid");
Chris Lattner24943d22010-06-08 16:52:24 +0000307 }
Caroline Tice7826c882010-10-26 03:11:13 +0000308
309 if (log)
310 {
311 SBStream sstr;
312 sb_process.GetDescription (sstr);
313 log->Printf ("SBTarget::Launch ==> SBProceess (this = %p, '%s')", &sb_process, sstr.GetData());
314 }
315
Greg Clayton1a3083a2010-10-06 03:53:16 +0000316 return sb_process;
Chris Lattner24943d22010-06-08 16:52:24 +0000317}
318
Greg Claytonc5f728c2010-10-06 22:10:17 +0000319
320lldb::SBProcess
Greg Claytond8c62532010-10-07 04:19:01 +0000321SBTarget::AttachToProcessWithID
Greg Claytonc5f728c2010-10-06 22:10:17 +0000322(
323 lldb::pid_t pid,// The process ID to attach to
324 SBError& error // An error explaining what went wrong if attach fails
325)
326{
327 SBProcess sb_process;
328 if (m_opaque_sp)
329 {
330 // DEPRECATED, this will change when CreateProcess is removed...
331 if (m_opaque_sp->GetProcessSP())
332 {
333 sb_process.SetProcess(m_opaque_sp->GetProcessSP());
334 }
335 else
336 {
337 // When launching, we always want to create a new process When
338 // SBTarget::CreateProcess is removed, this will always happen.
339 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
340 }
341
342 if (sb_process.IsValid())
343 {
344 error.SetError (sb_process->Attach (pid));
345 }
346 else
347 {
348 error.SetErrorString ("unable to create lldb_private::Process");
349 }
350 }
351 else
352 {
353 error.SetErrorString ("SBTarget is invalid");
354 }
355 return sb_process;
356
357}
358
359lldb::SBProcess
Greg Claytond8c62532010-10-07 04:19:01 +0000360SBTarget::AttachToProcessWithName
Greg Claytonc5f728c2010-10-06 22:10:17 +0000361(
362 const char *name, // basename of process to attach to
363 bool wait_for, // if true wait for a new instance of "name" to be launched
364 SBError& error // An error explaining what went wrong if attach fails
365)
366{
367 SBProcess sb_process;
368 if (m_opaque_sp)
369 {
370 // DEPRECATED, this will change when CreateProcess is removed...
371 if (m_opaque_sp->GetProcessSP())
372 {
373 sb_process.SetProcess(m_opaque_sp->GetProcessSP());
374 }
375 else
376 {
377 // When launching, we always want to create a new process When
378 // SBTarget::CreateProcess is removed, this will always happen.
379 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
380 }
381
382 if (sb_process.IsValid())
383 {
384 error.SetError (sb_process->Attach (name, wait_for));
385 }
386 else
387 {
388 error.SetErrorString ("unable to create lldb_private::Process");
389 }
390 }
391 else
392 {
393 error.SetErrorString ("SBTarget is invalid");
394 }
395 return sb_process;
396
397}
398
Chris Lattner24943d22010-06-08 16:52:24 +0000399SBFileSpec
400SBTarget::GetExecutable ()
401{
Caroline Tice7826c882010-10-26 03:11:13 +0000402 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
403
404 if (log)
405 log->Printf ("SBTarget::GetExecutable ()");
406
Chris Lattner24943d22010-06-08 16:52:24 +0000407 SBFileSpec exe_file_spec;
Greg Clayton63094e02010-06-23 01:19:29 +0000408 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000409 {
Greg Clayton63094e02010-06-23 01:19:29 +0000410 ModuleSP exe_module_sp (m_opaque_sp->GetExecutableModule ());
Chris Lattner24943d22010-06-08 16:52:24 +0000411 if (exe_module_sp)
412 exe_file_spec.SetFileSpec (exe_module_sp->GetFileSpec());
413 }
Caroline Tice7826c882010-10-26 03:11:13 +0000414
415 if (log)
416 {
417 if (exe_file_spec.Exists())
418 {
419 SBStream sstr;
420 exe_file_spec.GetDescription (sstr);
421 log->Printf ("SBTarget::GetExecutable ==> SBFileSpec (this = %p, '%s')", &exe_file_spec, sstr.GetData());
422 }
423 else
424 log->Printf ("SBTarget::GetExecutable ==> SBFileSpec (this = %p, 'Unable to find valid file')",
425 &exe_file_spec);
426 }
427
Chris Lattner24943d22010-06-08 16:52:24 +0000428 return exe_file_spec;
429}
430
431
432bool
433SBTarget::DeleteTargetFromList (TargetList *list)
434{
Greg Clayton63094e02010-06-23 01:19:29 +0000435 if (m_opaque_sp)
436 return list->DeleteTarget (m_opaque_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000437 else
438 return false;
439}
440
441bool
Chris Lattner24943d22010-06-08 16:52:24 +0000442SBTarget::operator == (const SBTarget &rhs) const
443{
Greg Clayton63094e02010-06-23 01:19:29 +0000444 return m_opaque_sp.get() == rhs.m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000445}
446
447bool
448SBTarget::operator != (const SBTarget &rhs) const
449{
Greg Clayton63094e02010-06-23 01:19:29 +0000450 return m_opaque_sp.get() != rhs.m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000451}
452
453lldb_private::Target *
Greg Clayton63094e02010-06-23 01:19:29 +0000454SBTarget::operator ->() const
Chris Lattner24943d22010-06-08 16:52:24 +0000455{
Greg Clayton63094e02010-06-23 01:19:29 +0000456 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000457}
Greg Clayton63094e02010-06-23 01:19:29 +0000458
459lldb_private::Target *
460SBTarget::get() const
Chris Lattner24943d22010-06-08 16:52:24 +0000461{
Greg Clayton63094e02010-06-23 01:19:29 +0000462 return m_opaque_sp.get();
463}
464
465void
466SBTarget::reset (const lldb::TargetSP& target_sp)
467{
468 m_opaque_sp = target_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000469}
470
471SBBreakpoint
472SBTarget::BreakpointCreateByLocation (const char *file, uint32_t line)
473{
Caroline Tice7826c882010-10-26 03:11:13 +0000474 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
475
476 if (log)
477 log->Printf ("SBTarget::BreakpointCreateByLocation (const char *file, uint32_t line) file = '%s', line = %d",
478 file, line);
479
Chris Lattner24943d22010-06-08 16:52:24 +0000480 SBBreakpoint sb_bp;
481 if (file != NULL && line != 0)
482 sb_bp = BreakpointCreateByLocation (SBFileSpec (file), line);
Caroline Tice7826c882010-10-26 03:11:13 +0000483
484 if (log)
485 {
486 SBStream sstr;
487 sb_bp.GetDescription (sstr);
488 log->Printf("SBTarget::BreakpointCreateByLocation ==> SBBreakpoint (this = %p, '%s')", &sb_bp, sstr.GetData());
489 }
490
Chris Lattner24943d22010-06-08 16:52:24 +0000491 return sb_bp;
492}
493
494SBBreakpoint
495SBTarget::BreakpointCreateByLocation (const SBFileSpec &sb_file_spec, uint32_t line)
496{
Caroline Tice7826c882010-10-26 03:11:13 +0000497 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
498
499 if (log)
500 log->Printf ("SBTarget::BreakpointCreateByLocation (const SBFileSpec &sb_file_spec, uint32_t line) "
501 "sb_file_spec (%p), line = %d)", &sb_file_spec, line);
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() && line != 0)
505 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, *sb_file_spec, line, true, false);
Caroline Tice7826c882010-10-26 03:11:13 +0000506
507 if (log)
508 {
509 SBStream sstr;
510 sb_bp.GetDescription (sstr);
511 log->Printf ("SBTarget::BreakpointCreateByLocation ==> SBBreakpoint (this = %p, '%s')", &sb_bp,
512 sstr.GetData());
513 }
514
Chris Lattner24943d22010-06-08 16:52:24 +0000515 return sb_bp;
516}
517
518SBBreakpoint
519SBTarget::BreakpointCreateByName (const char *symbol_name, const char *module_name)
520{
Caroline Tice7826c882010-10-26 03:11:13 +0000521 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
522
523 if (log)
524 log->Printf ("SBTarget::BreakpointCreateByName (const char *symbol_name, const char *module_name) "
525 "symbol_name = %s, module_name = %s)", symbol_name, module_name);
526
Chris Lattner24943d22010-06-08 16:52:24 +0000527 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000528 if (m_opaque_sp.get() && symbol_name && symbol_name[0])
Chris Lattner24943d22010-06-08 16:52:24 +0000529 {
530 if (module_name && module_name[0])
531 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000532 FileSpec module_file_spec(module_name, false);
Jim Ingham7ec03bd2010-09-30 21:21:43 +0000533 *sb_bp = m_opaque_sp->CreateBreakpoint (&module_file_spec, symbol_name, eFunctionNameTypeFull | eFunctionNameTypeBase, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000534 }
535 else
536 {
Jim Ingham7ec03bd2010-09-30 21:21:43 +0000537 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, symbol_name, eFunctionNameTypeFull | eFunctionNameTypeBase, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000538 }
539 }
Caroline Tice7826c882010-10-26 03:11:13 +0000540
541 if (log)
542 {
543 SBStream sstr;
544 sb_bp.GetDescription (sstr);
545 log->Printf ("SBTarget::BreakpointCreateByName ==> SBBreakpoint (this = %p, '%s')", &sb_bp, sstr.GetData());
546 }
547
Chris Lattner24943d22010-06-08 16:52:24 +0000548 return sb_bp;
549}
550
551SBBreakpoint
552SBTarget::BreakpointCreateByRegex (const char *symbol_name_regex, const char *module_name)
553{
Caroline Tice7826c882010-10-26 03:11:13 +0000554 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
555
556 if (log)
557 log->Printf ("SBTarget::BreakpointCreateByRegex (const char *symbol_name_regex, const char *module_name) "
558 "symbol_name_regex = %s, module_name = %s)", symbol_name_regex, module_name);
559
Chris Lattner24943d22010-06-08 16:52:24 +0000560 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000561 if (m_opaque_sp.get() && symbol_name_regex && symbol_name_regex[0])
Chris Lattner24943d22010-06-08 16:52:24 +0000562 {
563 RegularExpression regexp(symbol_name_regex);
564
565 if (module_name && module_name[0])
566 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000567 FileSpec module_file_spec(module_name, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000568
Greg Clayton63094e02010-06-23 01:19:29 +0000569 *sb_bp = m_opaque_sp->CreateBreakpoint (&module_file_spec, regexp, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000570 }
571 else
572 {
Greg Clayton63094e02010-06-23 01:19:29 +0000573 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, regexp, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000574 }
575 }
Caroline Tice7826c882010-10-26 03:11:13 +0000576
577 if (log)
578 {
579 SBStream sstr;
580 sb_bp.GetDescription (sstr);
581 log->Printf ("SBTarget::BreakpointCreateByRegex ==> SBBreakpoint (this = %p, '%s')", &sb_bp, sstr.GetData());
582 }
583
Chris Lattner24943d22010-06-08 16:52:24 +0000584 return sb_bp;
585}
586
587
588
589SBBreakpoint
590SBTarget::BreakpointCreateByAddress (addr_t address)
591{
Caroline Tice7826c882010-10-26 03:11:13 +0000592 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
593
594 if (log)
595 log->Printf ("SBTarget::BreakpointCreateByAddress (addr_t address) address = %p", address);
596
Chris Lattner24943d22010-06-08 16:52:24 +0000597 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000598 if (m_opaque_sp.get())
599 *sb_bp = m_opaque_sp->CreateBreakpoint (address, false);
Caroline Tice7826c882010-10-26 03:11:13 +0000600
601 if (log)
602 {
603 SBStream sstr;
604 sb_bp.GetDescription (sstr);
605 log->Printf ("SBTarget::BreakpointCreateByAddress ==> SBBreakpoint (this = %p, '%s')", &sb_bp, sstr.GetData());
606 }
607
Chris Lattner24943d22010-06-08 16:52:24 +0000608 return sb_bp;
609}
610
Chris Lattner24943d22010-06-08 16:52:24 +0000611SBBreakpoint
612SBTarget::FindBreakpointByID (break_id_t bp_id)
613{
Caroline Tice7826c882010-10-26 03:11:13 +0000614 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
615
616 if (log)
617 log->Printf ("SBTarget::FindBreakpointByID (break_id_t bp_id) bp_id = %d", bp_id);
618
Chris Lattner24943d22010-06-08 16:52:24 +0000619 SBBreakpoint sb_breakpoint;
Greg Clayton63094e02010-06-23 01:19:29 +0000620 if (m_opaque_sp && bp_id != LLDB_INVALID_BREAK_ID)
621 *sb_breakpoint = m_opaque_sp->GetBreakpointByID (bp_id);
Caroline Tice7826c882010-10-26 03:11:13 +0000622
623 if (log)
624 {
625 SBStream sstr;
626 sb_breakpoint.GetDescription (sstr);
627 log->Printf ("SBTarget::FindBreakpointByID ==> SBBreakpoint (this = %p, '%s'", &bp_id, sstr.GetData());
628 }
629
Chris Lattner24943d22010-06-08 16:52:24 +0000630 return sb_breakpoint;
631}
632
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000633uint32_t
634SBTarget::GetNumBreakpoints () const
635{
636 if (m_opaque_sp)
637 return m_opaque_sp->GetBreakpointList().GetSize();
638 return 0;
639}
640
641SBBreakpoint
642SBTarget::GetBreakpointAtIndex (uint32_t idx) const
643{
644 SBBreakpoint sb_breakpoint;
645 if (m_opaque_sp)
646 *sb_breakpoint = m_opaque_sp->GetBreakpointList().GetBreakpointAtIndex(idx);
647 return sb_breakpoint;
648}
Chris Lattner24943d22010-06-08 16:52:24 +0000649
650bool
651SBTarget::BreakpointDelete (break_id_t bp_id)
652{
Caroline Tice7826c882010-10-26 03:11:13 +0000653 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
654
655 if (log)
656 log->Printf ("SBTarget::BreakpointDelete (break_id_t bp_id) bp_id = %d", bp_id);
657
658 bool result = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000659 if (m_opaque_sp)
Caroline Tice7826c882010-10-26 03:11:13 +0000660 result = m_opaque_sp->RemoveBreakpointByID (bp_id);
661
662 if (log)
663 {
664 if (result)
665 log->Printf ("SBTarget::BreakpointDelete ==> true");
666 else
667 log->Printf ("SBTarget::BreakpointDelete ==> false");
668 }
669
670 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000671}
672
673bool
674SBTarget::EnableAllBreakpoints ()
675{
Greg Clayton63094e02010-06-23 01:19:29 +0000676 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000677 {
Greg Clayton63094e02010-06-23 01:19:29 +0000678 m_opaque_sp->EnableAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000679 return true;
680 }
681 return false;
682}
683
684bool
685SBTarget::DisableAllBreakpoints ()
686{
Greg Clayton63094e02010-06-23 01:19:29 +0000687 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000688 {
Greg Clayton63094e02010-06-23 01:19:29 +0000689 m_opaque_sp->DisableAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000690 return true;
691 }
692 return false;
693}
694
695bool
696SBTarget::DeleteAllBreakpoints ()
697{
Greg Clayton63094e02010-06-23 01:19:29 +0000698 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000699 {
Greg Clayton63094e02010-06-23 01:19:29 +0000700 m_opaque_sp->RemoveAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000701 return true;
702 }
703 return false;
704}
705
706
707uint32_t
708SBTarget::GetNumModules () const
709{
Caroline Tice7826c882010-10-26 03:11:13 +0000710 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
711
712 if (log)
713 log->Printf ("SBTarget::GetNumModules ()");
714
715 uint32_t num = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000716 if (m_opaque_sp)
Caroline Tice7826c882010-10-26 03:11:13 +0000717 num = m_opaque_sp->GetImages().GetSize();
718
719 if (log)
720 log->Printf ("SBTarget::GetNumModules ==> %d", num);
721
722 return num;
Chris Lattner24943d22010-06-08 16:52:24 +0000723}
724
Greg Clayton43490d12010-07-30 20:12:55 +0000725void
726SBTarget::Clear ()
727{
Caroline Tice7826c882010-10-26 03:11:13 +0000728 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
729
730 if (log)
731 log->Printf ("SBTarget::Clear ()");
732
Greg Clayton43490d12010-07-30 20:12:55 +0000733 m_opaque_sp.reset();
734}
735
736
Chris Lattner24943d22010-06-08 16:52:24 +0000737SBModule
738SBTarget::FindModule (const SBFileSpec &sb_file_spec)
739{
740 SBModule sb_module;
Greg Clayton63094e02010-06-23 01:19:29 +0000741 if (m_opaque_sp && sb_file_spec.IsValid())
742 sb_module.SetModule (m_opaque_sp->GetImages().FindFirstModuleForFileSpec (*sb_file_spec, NULL));
Chris Lattner24943d22010-06-08 16:52:24 +0000743 return sb_module;
744}
745
746SBModule
747SBTarget::GetModuleAtIndex (uint32_t idx)
748{
Caroline Tice7826c882010-10-26 03:11:13 +0000749 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
750
751 if (log)
752 log->Printf ("SBTarget::GetModuleAtIndex (uint32_t idx) idx = %d", idx);
753
Chris Lattner24943d22010-06-08 16:52:24 +0000754 SBModule sb_module;
Greg Clayton63094e02010-06-23 01:19:29 +0000755 if (m_opaque_sp)
756 sb_module.SetModule(m_opaque_sp->GetImages().GetModuleAtIndex(idx));
Caroline Tice7826c882010-10-26 03:11:13 +0000757
758 if (log)
759 {
760 SBStream sstr;
761 sb_module.GetDescription (sstr);
762 log->Printf ("SBTarget::GetModuleAtIndex ==> SBModule: this = %p, %s", &sb_module, sstr.GetData());
763 }
764
Chris Lattner24943d22010-06-08 16:52:24 +0000765 return sb_module;
766}
767
768
769SBBroadcaster
770SBTarget::GetBroadcaster () const
771{
Caroline Tice7826c882010-10-26 03:11:13 +0000772 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
773
774 if (log)
775 log->Printf ("SBTarget::GetBroadcaster ()");
776
Greg Clayton63094e02010-06-23 01:19:29 +0000777 SBBroadcaster broadcaster(m_opaque_sp.get(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000778
779 if (log)
780 log->Printf ("SBTarget::GetBroadcaster ==> SBBroadcaster (this = %p)", &broadcaster);
781
Chris Lattner24943d22010-06-08 16:52:24 +0000782 return broadcaster;
783}
784
785void
Greg Clayton70436352010-06-30 23:03:03 +0000786SBTarget::Disassemble (lldb::addr_t start_addr, lldb::addr_t end_addr, const char *module_name)
Chris Lattner24943d22010-06-08 16:52:24 +0000787{
Greg Clayton70436352010-06-30 23:03:03 +0000788 if (start_addr == LLDB_INVALID_ADDRESS)
Chris Lattner24943d22010-06-08 16:52:24 +0000789 return;
790
Greg Clayton63094e02010-06-23 01:19:29 +0000791 FILE *out = m_opaque_sp->GetDebugger().GetOutputFileHandle();
Chris Lattner24943d22010-06-08 16:52:24 +0000792 if (out == NULL)
793 return;
794
Greg Clayton63094e02010-06-23 01:19:29 +0000795 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000796 {
Greg Clayton70436352010-06-30 23:03:03 +0000797 ModuleSP module_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000798 if (module_name != NULL)
799 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000800 FileSpec module_file_spec (module_name, false);
Greg Clayton70436352010-06-30 23:03:03 +0000801 module_sp = m_opaque_sp->GetImages().FindFirstModuleForFileSpec (module_file_spec, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000802 }
Greg Clayton70436352010-06-30 23:03:03 +0000803
804 AddressRange range;
805
806 // Make sure the process object is alive if we have one (it might be
807 // created but we might not be launched yet).
Greg Claytoneea26402010-09-14 23:36:40 +0000808
Greg Clayton1a3083a2010-10-06 03:53:16 +0000809 Process *sb_process = m_opaque_sp->GetProcessSP().get();
810 if (sb_process && !sb_process->IsAlive())
811 sb_process = NULL;
Greg Clayton70436352010-06-30 23:03:03 +0000812
813 // If we are given a module, then "start_addr" is a file address in
814 // that module.
815 if (module_sp)
816 {
817 if (!module_sp->ResolveFileAddress (start_addr, range.GetBaseAddress()))
818 range.GetBaseAddress().SetOffset(start_addr);
819 }
Greg Claytoneea26402010-09-14 23:36:40 +0000820 else if (m_opaque_sp->GetSectionLoadList().IsEmpty() == false)
Greg Clayton70436352010-06-30 23:03:03 +0000821 {
822 // We don't have a module, se we need to figure out if "start_addr"
823 // resolves to anything in a running process.
Greg Claytoneea26402010-09-14 23:36:40 +0000824 if (!m_opaque_sp->GetSectionLoadList().ResolveLoadAddress (start_addr, range.GetBaseAddress()))
Greg Clayton70436352010-06-30 23:03:03 +0000825 range.GetBaseAddress().SetOffset(start_addr);
826 }
827 else
828 {
829 if (m_opaque_sp->GetImages().ResolveFileAddress (start_addr, range.GetBaseAddress()))
830 range.GetBaseAddress().SetOffset(start_addr);
831 }
Chris Lattner24943d22010-06-08 16:52:24 +0000832
833 // For now, we need a process; the disassembly functions insist. If we don't have one already,
834 // make one.
835
Greg Clayton70436352010-06-30 23:03:03 +0000836 ExecutionContext exe_ctx;
Chris Lattner24943d22010-06-08 16:52:24 +0000837
Greg Clayton1a3083a2010-10-06 03:53:16 +0000838 if (sb_process)
839 sb_process->CalculateExecutionContext(exe_ctx);
Greg Clayton70436352010-06-30 23:03:03 +0000840 else
Greg Claytona830adb2010-10-04 01:05:56 +0000841 m_opaque_sp->CalculateExecutionContext(exe_ctx);
Chris Lattner24943d22010-06-08 16:52:24 +0000842
Greg Clayton70436352010-06-30 23:03:03 +0000843 if (end_addr == LLDB_INVALID_ADDRESS || end_addr < start_addr)
844 range.SetByteSize( DEFAULT_DISASM_BYTE_SIZE);
845 else
846 range.SetByteSize(end_addr - start_addr);
Chris Lattner24943d22010-06-08 16:52:24 +0000847
Greg Clayton70436352010-06-30 23:03:03 +0000848 StreamFile out_stream (out);
Chris Lattner24943d22010-06-08 16:52:24 +0000849
Greg Clayton70436352010-06-30 23:03:03 +0000850 Disassembler::Disassemble (m_opaque_sp->GetDebugger(),
851 m_opaque_sp->GetArchitecture(),
852 exe_ctx,
853 range,
854 3,
855 false,
856 out_stream);
Chris Lattner24943d22010-06-08 16:52:24 +0000857 }
858}
859
860void
861SBTarget::Disassemble (const char *function_name, const char *module_name)
862{
863 if (function_name == NULL)
864 return;
865
Greg Clayton63094e02010-06-23 01:19:29 +0000866 FILE *out = m_opaque_sp->GetDebugger().GetOutputFileHandle();
Chris Lattner24943d22010-06-08 16:52:24 +0000867 if (out == NULL)
868 return;
869
Greg Clayton63094e02010-06-23 01:19:29 +0000870 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000871 {
Greg Clayton70436352010-06-30 23:03:03 +0000872 Disassembler *disassembler = Disassembler::FindPlugin (m_opaque_sp->GetArchitecture());
Chris Lattner24943d22010-06-08 16:52:24 +0000873 if (disassembler == NULL)
874 return;
875
Greg Clayton70436352010-06-30 23:03:03 +0000876 ModuleSP module_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000877 if (module_name != NULL)
Chris Lattner24943d22010-06-08 16:52:24 +0000878 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000879 FileSpec module_file_spec (module_name, false);
Greg Clayton70436352010-06-30 23:03:03 +0000880 module_sp = m_opaque_sp->GetImages().FindFirstModuleForFileSpec (module_file_spec, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000881 }
Greg Clayton70436352010-06-30 23:03:03 +0000882
883 ExecutionContext exe_ctx;
884
885 // Make sure the process object is alive if we have one (it might be
886 // created but we might not be launched yet).
Greg Clayton1a3083a2010-10-06 03:53:16 +0000887 Process *sb_process = m_opaque_sp->GetProcessSP().get();
888 if (sb_process && !sb_process->IsAlive())
889 sb_process = NULL;
Greg Clayton70436352010-06-30 23:03:03 +0000890
Greg Clayton1a3083a2010-10-06 03:53:16 +0000891 if (sb_process)
892 sb_process->CalculateExecutionContext(exe_ctx);
Greg Clayton70436352010-06-30 23:03:03 +0000893 else
Greg Claytona830adb2010-10-04 01:05:56 +0000894 m_opaque_sp->CalculateExecutionContext(exe_ctx);
Greg Clayton70436352010-06-30 23:03:03 +0000895
896
897 StreamFile out_stream (out);
898
899 Disassembler::Disassemble (m_opaque_sp->GetDebugger(),
900 m_opaque_sp->GetArchitecture(),
901 exe_ctx,
902 ConstString (function_name),
903 module_sp.get(),
904 3,
905 false,
906 out_stream);
Chris Lattner24943d22010-06-08 16:52:24 +0000907 }
908}
Caroline Tice98f930f2010-09-20 05:20:02 +0000909
910bool
Caroline Tice7826c882010-10-26 03:11:13 +0000911SBTarget::GetDescription (SBStream &description, lldb::DescriptionLevel description_level)
Caroline Tice98f930f2010-09-20 05:20:02 +0000912{
913 if (m_opaque_sp)
Caroline Ticee7a566e2010-09-20 16:21:41 +0000914 {
Caroline Ticee49ec182010-09-22 23:01:29 +0000915 description.ref();
Caroline Tice7826c882010-10-26 03:11:13 +0000916 m_opaque_sp->Dump (description.get(), description_level);
917 }
918 else
919 description.Printf ("No value");
920
921 return true;
922}
923
924bool
925SBTarget::GetDescription (SBStream &description, lldb::DescriptionLevel description_level) const
926{
927 if (m_opaque_sp)
928 {
929 description.ref();
930 m_opaque_sp->Dump (description.get(), description_level);
Caroline Ticee7a566e2010-09-20 16:21:41 +0000931 }
Caroline Tice98f930f2010-09-20 05:20:02 +0000932 else
933 description.Printf ("No value");
934
935 return true;
936}