blob: d31ad562ddb284ca958db4424088eb41ef25bdfc [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{
Greg Claytona66ba462010-10-30 04:51:46 +000060// Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
61//
62// if (log)
63// {
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{
Greg Claytona66ba462010-10-30 04:51:46 +000074// Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
75//
76// if (log)
77// {
78// SBStream sstr;
79// GetDescription (sstr, lldb::eDescriptionLevelBrief);
80// log->Printf ("SBTarget::SBTarget (target_sp=%p) => SBTarget(%p): %s",
81// target_sp.get(), m_opaque_sp.get(), sstr.GetData());
82// }
Chris Lattner24943d22010-06-08 16:52:24 +000083}
84
Chris Lattner24943d22010-06-08 16:52:24 +000085//----------------------------------------------------------------------
86// Destructor
87//----------------------------------------------------------------------
88SBTarget::~SBTarget()
89{
90}
91
92bool
93SBTarget::IsValid () const
94{
Greg Clayton63094e02010-06-23 01:19:29 +000095 return m_opaque_sp.get() != NULL;
Chris Lattner24943d22010-06-08 16:52:24 +000096}
97
98SBProcess
99SBTarget::GetProcess ()
100{
Caroline Tice7826c882010-10-26 03:11:13 +0000101
Chris Lattner24943d22010-06-08 16:52:24 +0000102 SBProcess sb_process;
Greg Clayton63094e02010-06-23 01:19:29 +0000103 if (m_opaque_sp)
104 sb_process.SetProcess (m_opaque_sp->GetProcessSP());
Caroline Tice7826c882010-10-26 03:11:13 +0000105
Caroline Tice926060e2010-10-29 21:48:37 +0000106 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +0000107 if (log)
108 {
109 SBStream sstr;
110 sb_process.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000111 log->Printf ("SBTarget(%p)::GetProcess () => SBProcess(%p): %s", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000112 sb_process.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000113 }
114
Chris Lattner24943d22010-06-08 16:52:24 +0000115 return sb_process;
116}
117
Greg Clayton63094e02010-06-23 01:19:29 +0000118SBDebugger
119SBTarget::GetDebugger () const
120{
121 SBDebugger debugger;
122 if (m_opaque_sp)
123 debugger.reset (m_opaque_sp->GetDebugger().GetSP());
124 return debugger;
125}
126
Greg Clayton992ce262010-10-06 18:44:26 +0000127
128// DEPRECATED
129SBProcess
130SBTarget::CreateProcess ()
131{
Caroline Tice7826c882010-10-26 03:11:13 +0000132
Greg Clayton992ce262010-10-06 18:44:26 +0000133 SBProcess sb_process;
134
135 if (m_opaque_sp)
136 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
137
Caroline Tice926060e2010-10-29 21:48:37 +0000138 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +0000139 if (log)
140 {
141 SBStream sstr;
142 sb_process.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000143 log->Printf ("SBTarget(%p)::CreateProcess () => SBProcess(%p): %s", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000144 sb_process.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000145 }
146
Greg Clayton992ce262010-10-06 18:44:26 +0000147 return sb_process;
148}
149
150
Greg Claytonc5f728c2010-10-06 22:10:17 +0000151SBProcess
152SBTarget::LaunchProcess
153(
154 char const **argv,
155 char const **envp,
156 const char *tty,
157 uint32_t launch_flags,
Greg Claytond8c62532010-10-07 04:19:01 +0000158 bool stop_at_entry
159)
160{
Caroline Tice7826c882010-10-26 03:11:13 +0000161 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
162
163 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000164 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 +0000165 m_opaque_sp.get(), argv, envp, tty, launch_flags, stop_at_entry);
Caroline Tice7826c882010-10-26 03:11:13 +0000166
Greg Claytond8c62532010-10-07 04:19:01 +0000167 SBError sb_error;
Caroline Tice7826c882010-10-26 03:11:13 +0000168 SBProcess sb_process = Launch (argv, envp, tty, launch_flags, stop_at_entry, sb_error);
169
Caroline Tice926060e2010-10-29 21:48:37 +0000170 log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +0000171 if (log)
172 {
173 SBStream sstr;
174 sb_process.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000175 log->Printf ("SBTarget(%p)::LaunchProcess (...) => SBProcess(%p): %s",
176 m_opaque_sp.get(), sb_process.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000177 }
178
179 return sb_process;
Greg Claytond8c62532010-10-07 04:19:01 +0000180}
181
182SBProcess
183SBTarget::Launch
184(
185 char const **argv,
186 char const **envp,
187 const char *tty,
188 uint32_t launch_flags,
Greg Claytonc5f728c2010-10-06 22:10:17 +0000189 bool stop_at_entry,
190 SBError &error
191)
192{
Caroline Tice7826c882010-10-26 03:11:13 +0000193 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
194
195 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000196 {
Greg Claytona66ba462010-10-30 04:51:46 +0000197 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 +0000198 m_opaque_sp.get(), argv, envp, tty, launch_flags, stop_at_entry, error.get());
199 }
Greg Clayton1a3083a2010-10-06 03:53:16 +0000200 SBProcess sb_process;
201 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000202 {
Greg Clayton992ce262010-10-06 18:44:26 +0000203 // DEPRECATED, this will change when CreateProcess is removed...
204 if (m_opaque_sp->GetProcessSP())
205 {
206 sb_process.SetProcess(m_opaque_sp->GetProcessSP());
207 }
208 else
209 {
210 // When launching, we always want to create a new process When
211 // SBTarget::CreateProcess is removed, this will always happen.
212 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
213 }
Greg Clayton1a3083a2010-10-06 03:53:16 +0000214
215 if (sb_process.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000216 {
Greg Claytonc5f728c2010-10-06 22:10:17 +0000217 error.SetError (sb_process->Launch (argv, envp, launch_flags, tty, tty, tty));
Greg Clayton1a3083a2010-10-06 03:53:16 +0000218 if (error.Success())
Chris Lattner24943d22010-06-08 16:52:24 +0000219 {
Sean Callanan451ee7c2010-10-07 22:51:14 +0000220 // We we are stopping at the entry point, we can return now!
221 if (stop_at_entry)
222 return sb_process;
223
Greg Clayton1a3083a2010-10-06 03:53:16 +0000224 // Make sure we are stopped at the entry
225 StateType state = sb_process->WaitForProcessToStop (NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000226 if (state == eStateStopped)
Greg Clayton1a3083a2010-10-06 03:53:16 +0000227 {
228 // resume the process to skip the entry point
Greg Claytonc5f728c2010-10-06 22:10:17 +0000229 error.SetError (sb_process->Resume());
Greg Clayton1a3083a2010-10-06 03:53:16 +0000230 if (error.Success())
231 {
232 // If we are doing synchronous mode, then wait for the
233 // process to stop yet again!
234 if (m_opaque_sp->GetDebugger().GetAsyncExecution () == false)
235 sb_process->WaitForProcessToStop (NULL);
236 }
237 }
Chris Lattner24943d22010-06-08 16:52:24 +0000238 }
239 }
Greg Claytonc5f728c2010-10-06 22:10:17 +0000240 else
241 {
242 error.SetErrorString ("unable to create lldb_private::Process");
243 }
244 }
245 else
246 {
247 error.SetErrorString ("SBTarget is invalid");
Chris Lattner24943d22010-06-08 16:52:24 +0000248 }
Caroline Tice7826c882010-10-26 03:11:13 +0000249
Caroline Tice926060e2010-10-29 21:48:37 +0000250 log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +0000251 if (log)
252 {
253 SBStream sstr;
254 sb_process.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000255 log->Printf ("SBTarget(%p)::Launch (...) => SBProceess(%p): %s",
256 m_opaque_sp.get(), sb_process.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000257 }
258
Greg Clayton1a3083a2010-10-06 03:53:16 +0000259 return sb_process;
Chris Lattner24943d22010-06-08 16:52:24 +0000260}
261
Greg Claytonc5f728c2010-10-06 22:10:17 +0000262
263lldb::SBProcess
Greg Claytond8c62532010-10-07 04:19:01 +0000264SBTarget::AttachToProcessWithID
Greg Claytonc5f728c2010-10-06 22:10:17 +0000265(
266 lldb::pid_t pid,// The process ID to attach to
267 SBError& error // An error explaining what went wrong if attach fails
268)
269{
270 SBProcess sb_process;
271 if (m_opaque_sp)
272 {
273 // DEPRECATED, this will change when CreateProcess is removed...
274 if (m_opaque_sp->GetProcessSP())
275 {
276 sb_process.SetProcess(m_opaque_sp->GetProcessSP());
277 }
278 else
279 {
280 // When launching, we always want to create a new process When
281 // SBTarget::CreateProcess is removed, this will always happen.
282 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
283 }
284
285 if (sb_process.IsValid())
286 {
287 error.SetError (sb_process->Attach (pid));
288 }
289 else
290 {
291 error.SetErrorString ("unable to create lldb_private::Process");
292 }
293 }
294 else
295 {
296 error.SetErrorString ("SBTarget is invalid");
297 }
298 return sb_process;
299
300}
301
302lldb::SBProcess
Greg Claytond8c62532010-10-07 04:19:01 +0000303SBTarget::AttachToProcessWithName
Greg Claytonc5f728c2010-10-06 22:10:17 +0000304(
305 const char *name, // basename of process to attach to
306 bool wait_for, // if true wait for a new instance of "name" to be launched
307 SBError& error // An error explaining what went wrong if attach fails
308)
309{
310 SBProcess sb_process;
311 if (m_opaque_sp)
312 {
313 // DEPRECATED, this will change when CreateProcess is removed...
314 if (m_opaque_sp->GetProcessSP())
315 {
316 sb_process.SetProcess(m_opaque_sp->GetProcessSP());
317 }
318 else
319 {
320 // When launching, we always want to create a new process When
321 // SBTarget::CreateProcess is removed, this will always happen.
322 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
323 }
324
325 if (sb_process.IsValid())
326 {
327 error.SetError (sb_process->Attach (name, wait_for));
328 }
329 else
330 {
331 error.SetErrorString ("unable to create lldb_private::Process");
332 }
333 }
334 else
335 {
336 error.SetErrorString ("SBTarget is invalid");
337 }
338 return sb_process;
339
340}
341
Chris Lattner24943d22010-06-08 16:52:24 +0000342SBFileSpec
343SBTarget::GetExecutable ()
344{
Caroline Tice7826c882010-10-26 03:11:13 +0000345 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
346
Chris Lattner24943d22010-06-08 16:52:24 +0000347 SBFileSpec exe_file_spec;
Greg Clayton63094e02010-06-23 01:19:29 +0000348 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000349 {
Greg Clayton63094e02010-06-23 01:19:29 +0000350 ModuleSP exe_module_sp (m_opaque_sp->GetExecutableModule ());
Chris Lattner24943d22010-06-08 16:52:24 +0000351 if (exe_module_sp)
352 exe_file_spec.SetFileSpec (exe_module_sp->GetFileSpec());
353 }
Caroline Tice7826c882010-10-26 03:11:13 +0000354
355 if (log)
356 {
357 if (exe_file_spec.Exists())
358 {
359 SBStream sstr;
360 exe_file_spec.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000361 log->Printf ("SBTarget(%p)::GetExecutable () => SBFileSpec(%p): %s", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000362 exe_file_spec.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000363 }
364 else
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000365 log->Printf ("SBTarget(%p)::GetExecutable () => SBFileSpec (%p): Unable to find valid file",
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000366 m_opaque_sp.get(), exe_file_spec.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000367 }
368
Chris Lattner24943d22010-06-08 16:52:24 +0000369 return exe_file_spec;
370}
371
372
373bool
374SBTarget::DeleteTargetFromList (TargetList *list)
375{
Greg Clayton63094e02010-06-23 01:19:29 +0000376 if (m_opaque_sp)
377 return list->DeleteTarget (m_opaque_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000378 else
379 return false;
380}
381
382bool
Chris Lattner24943d22010-06-08 16:52:24 +0000383SBTarget::operator == (const SBTarget &rhs) const
384{
Greg Clayton63094e02010-06-23 01:19:29 +0000385 return m_opaque_sp.get() == rhs.m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000386}
387
388bool
389SBTarget::operator != (const SBTarget &rhs) const
390{
Greg Clayton63094e02010-06-23 01:19:29 +0000391 return m_opaque_sp.get() != rhs.m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000392}
393
394lldb_private::Target *
Greg Clayton63094e02010-06-23 01:19:29 +0000395SBTarget::operator ->() const
Chris Lattner24943d22010-06-08 16:52:24 +0000396{
Greg Clayton63094e02010-06-23 01:19:29 +0000397 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000398}
Greg Clayton63094e02010-06-23 01:19:29 +0000399
400lldb_private::Target *
401SBTarget::get() const
Chris Lattner24943d22010-06-08 16:52:24 +0000402{
Greg Clayton63094e02010-06-23 01:19:29 +0000403 return m_opaque_sp.get();
404}
405
406void
407SBTarget::reset (const lldb::TargetSP& target_sp)
408{
409 m_opaque_sp = target_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000410}
411
412SBBreakpoint
413SBTarget::BreakpointCreateByLocation (const char *file, uint32_t line)
414{
Greg Claytona66ba462010-10-30 04:51:46 +0000415 return SBBreakpoint(BreakpointCreateByLocation (SBFileSpec (file), line));
Chris Lattner24943d22010-06-08 16:52:24 +0000416}
417
418SBBreakpoint
419SBTarget::BreakpointCreateByLocation (const SBFileSpec &sb_file_spec, uint32_t line)
420{
Caroline Tice7826c882010-10-26 03:11:13 +0000421 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
422
Chris Lattner24943d22010-06-08 16:52:24 +0000423 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000424 if (m_opaque_sp.get() && line != 0)
425 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, *sb_file_spec, line, true, false);
Caroline Tice7826c882010-10-26 03:11:13 +0000426
427 if (log)
428 {
429 SBStream sstr;
430 sb_bp.GetDescription (sstr);
Greg Claytona66ba462010-10-30 04:51:46 +0000431 const char *dir = sb_file_spec.GetDirectory();
432 const char *file = sb_file_spec.GetFilename();
433 log->Printf ("SBTarget(%p)::BreakpointCreateByLocation ( %s%s%s:%u ) => SBBreakpoint(%p): %s",
434 m_opaque_sp.get(),
435 dir ? dir : "", dir ? "/" : "", file ? file : "",
436 line,
437 sb_bp.get(),
Caroline Tice7826c882010-10-26 03:11:13 +0000438 sstr.GetData());
439 }
440
Chris Lattner24943d22010-06-08 16:52:24 +0000441 return sb_bp;
442}
443
444SBBreakpoint
445SBTarget::BreakpointCreateByName (const char *symbol_name, const char *module_name)
446{
Caroline Tice7826c882010-10-26 03:11:13 +0000447 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
448
Chris Lattner24943d22010-06-08 16:52:24 +0000449 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000450 if (m_opaque_sp.get() && symbol_name && symbol_name[0])
Chris Lattner24943d22010-06-08 16:52:24 +0000451 {
452 if (module_name && module_name[0])
453 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000454 FileSpec module_file_spec(module_name, false);
Jim Ingham7ec03bd2010-09-30 21:21:43 +0000455 *sb_bp = m_opaque_sp->CreateBreakpoint (&module_file_spec, symbol_name, eFunctionNameTypeFull | eFunctionNameTypeBase, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000456 }
457 else
458 {
Jim Ingham7ec03bd2010-09-30 21:21:43 +0000459 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, symbol_name, eFunctionNameTypeFull | eFunctionNameTypeBase, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000460 }
461 }
Caroline Tice7826c882010-10-26 03:11:13 +0000462
463 if (log)
464 {
465 SBStream sstr;
466 sb_bp.GetDescription (sstr);
Greg Claytona66ba462010-10-30 04:51:46 +0000467 log->Printf ("SBTarget(%p)::BreakpointCreateByName (symbol=\"%s\", module=\"%s\") => "
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000468 "SBBreakpoint(%p): %s", m_opaque_sp.get(), symbol_name, module_name, sb_bp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000469 sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000470 }
471
Chris Lattner24943d22010-06-08 16:52:24 +0000472 return sb_bp;
473}
474
475SBBreakpoint
476SBTarget::BreakpointCreateByRegex (const char *symbol_name_regex, const char *module_name)
477{
Caroline Tice7826c882010-10-26 03:11:13 +0000478 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
479
Chris Lattner24943d22010-06-08 16:52:24 +0000480 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000481 if (m_opaque_sp.get() && symbol_name_regex && symbol_name_regex[0])
Chris Lattner24943d22010-06-08 16:52:24 +0000482 {
483 RegularExpression regexp(symbol_name_regex);
484
485 if (module_name && module_name[0])
486 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000487 FileSpec module_file_spec(module_name, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000488
Greg Clayton63094e02010-06-23 01:19:29 +0000489 *sb_bp = m_opaque_sp->CreateBreakpoint (&module_file_spec, regexp, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000490 }
491 else
492 {
Greg Clayton63094e02010-06-23 01:19:29 +0000493 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, regexp, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000494 }
495 }
Caroline Tice7826c882010-10-26 03:11:13 +0000496
497 if (log)
498 {
499 SBStream sstr;
500 sb_bp.GetDescription (sstr);
Greg Claytona66ba462010-10-30 04:51:46 +0000501 log->Printf ("SBTarget(%p)::BreakpointCreateByRegex (symbol_regex=\"%s\", module_name=\"%s\") "
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000502 "=> SBBreakpoint(%p): %s", m_opaque_sp.get(), symbol_name_regex, module_name,
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000503 sb_bp.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000504 }
505
Chris Lattner24943d22010-06-08 16:52:24 +0000506 return sb_bp;
507}
508
509
510
511SBBreakpoint
512SBTarget::BreakpointCreateByAddress (addr_t address)
513{
Caroline Tice7826c882010-10-26 03:11:13 +0000514 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
515
Chris Lattner24943d22010-06-08 16:52:24 +0000516 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000517 if (m_opaque_sp.get())
518 *sb_bp = m_opaque_sp->CreateBreakpoint (address, false);
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)::BreakpointCreateByAddress (%p, address=%p) => "
525 "SBBreakpoint(%p): %s", m_opaque_sp.get(), address, sb_bp.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000526 }
527
Chris Lattner24943d22010-06-08 16:52:24 +0000528 return sb_bp;
529}
530
Chris Lattner24943d22010-06-08 16:52:24 +0000531SBBreakpoint
532SBTarget::FindBreakpointByID (break_id_t bp_id)
533{
Caroline Tice7826c882010-10-26 03:11:13 +0000534 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
535
Chris Lattner24943d22010-06-08 16:52:24 +0000536 SBBreakpoint sb_breakpoint;
Greg Clayton63094e02010-06-23 01:19:29 +0000537 if (m_opaque_sp && bp_id != LLDB_INVALID_BREAK_ID)
538 *sb_breakpoint = m_opaque_sp->GetBreakpointByID (bp_id);
Caroline Tice7826c882010-10-26 03:11:13 +0000539
540 if (log)
541 {
542 SBStream sstr;
543 sb_breakpoint.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000544 log->Printf ("SBTarget(%p)::FindBreakpointByID (bp_id=%d) => SBBreakpoint(%p): %s",
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000545 m_opaque_sp.get(), (uint32_t) bp_id, sb_breakpoint.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000546 }
547
Chris Lattner24943d22010-06-08 16:52:24 +0000548 return sb_breakpoint;
549}
550
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000551uint32_t
552SBTarget::GetNumBreakpoints () const
553{
554 if (m_opaque_sp)
555 return m_opaque_sp->GetBreakpointList().GetSize();
556 return 0;
557}
558
559SBBreakpoint
560SBTarget::GetBreakpointAtIndex (uint32_t idx) const
561{
562 SBBreakpoint sb_breakpoint;
563 if (m_opaque_sp)
564 *sb_breakpoint = m_opaque_sp->GetBreakpointList().GetBreakpointAtIndex(idx);
565 return sb_breakpoint;
566}
Chris Lattner24943d22010-06-08 16:52:24 +0000567
568bool
569SBTarget::BreakpointDelete (break_id_t bp_id)
570{
Caroline Tice7826c882010-10-26 03:11:13 +0000571 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
572
Caroline Tice7826c882010-10-26 03:11:13 +0000573 bool result = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000574 if (m_opaque_sp)
Caroline Tice7826c882010-10-26 03:11:13 +0000575 result = m_opaque_sp->RemoveBreakpointByID (bp_id);
576
577 if (log)
578 {
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000579 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 +0000580 }
581
582 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000583}
584
585bool
586SBTarget::EnableAllBreakpoints ()
587{
Greg Clayton63094e02010-06-23 01:19:29 +0000588 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000589 {
Greg Clayton63094e02010-06-23 01:19:29 +0000590 m_opaque_sp->EnableAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000591 return true;
592 }
593 return false;
594}
595
596bool
597SBTarget::DisableAllBreakpoints ()
598{
Greg Clayton63094e02010-06-23 01:19:29 +0000599 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000600 {
Greg Clayton63094e02010-06-23 01:19:29 +0000601 m_opaque_sp->DisableAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000602 return true;
603 }
604 return false;
605}
606
607bool
608SBTarget::DeleteAllBreakpoints ()
609{
Greg Clayton63094e02010-06-23 01:19:29 +0000610 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000611 {
Greg Clayton63094e02010-06-23 01:19:29 +0000612 m_opaque_sp->RemoveAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000613 return true;
614 }
615 return false;
616}
617
618
619uint32_t
620SBTarget::GetNumModules () const
621{
Caroline Tice7826c882010-10-26 03:11:13 +0000622 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
623
Caroline Tice7826c882010-10-26 03:11:13 +0000624 uint32_t num = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000625 if (m_opaque_sp)
Caroline Tice7826c882010-10-26 03:11:13 +0000626 num = m_opaque_sp->GetImages().GetSize();
627
628 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000629 log->Printf ("SBTarget(%p)::GetNumModules () => %d", m_opaque_sp.get(), num);
Caroline Tice7826c882010-10-26 03:11:13 +0000630
631 return num;
Chris Lattner24943d22010-06-08 16:52:24 +0000632}
633
Greg Clayton43490d12010-07-30 20:12:55 +0000634void
635SBTarget::Clear ()
636{
Caroline Tice7826c882010-10-26 03:11:13 +0000637 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
638
639 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000640 log->Printf ("SBTarget(%p)::Clear ()", m_opaque_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000641
Greg Clayton43490d12010-07-30 20:12:55 +0000642 m_opaque_sp.reset();
643}
644
645
Chris Lattner24943d22010-06-08 16:52:24 +0000646SBModule
647SBTarget::FindModule (const SBFileSpec &sb_file_spec)
648{
649 SBModule sb_module;
Greg Clayton63094e02010-06-23 01:19:29 +0000650 if (m_opaque_sp && sb_file_spec.IsValid())
651 sb_module.SetModule (m_opaque_sp->GetImages().FindFirstModuleForFileSpec (*sb_file_spec, NULL));
Chris Lattner24943d22010-06-08 16:52:24 +0000652 return sb_module;
653}
654
655SBModule
656SBTarget::GetModuleAtIndex (uint32_t idx)
657{
Caroline Tice7826c882010-10-26 03:11:13 +0000658 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
659
Chris Lattner24943d22010-06-08 16:52:24 +0000660 SBModule sb_module;
Greg Clayton63094e02010-06-23 01:19:29 +0000661 if (m_opaque_sp)
662 sb_module.SetModule(m_opaque_sp->GetImages().GetModuleAtIndex(idx));
Caroline Tice7826c882010-10-26 03:11:13 +0000663
664 if (log)
665 {
666 SBStream sstr;
667 sb_module.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000668 log->Printf ("SBTarget(%p)::GetModuleAtIndex (idx=%d) => SBModule(%p): %s",
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000669 m_opaque_sp.get(), idx, sb_module.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000670 }
671
Chris Lattner24943d22010-06-08 16:52:24 +0000672 return sb_module;
673}
674
675
676SBBroadcaster
677SBTarget::GetBroadcaster () const
678{
Caroline Tice7826c882010-10-26 03:11:13 +0000679 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
680
Greg Clayton63094e02010-06-23 01:19:29 +0000681 SBBroadcaster broadcaster(m_opaque_sp.get(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000682
683 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000684 log->Printf ("SBTarget(%p)::GetBroadcaster () => SBBroadcaster(%p)",
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000685 m_opaque_sp.get(), broadcaster.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000686
Chris Lattner24943d22010-06-08 16:52:24 +0000687 return broadcaster;
688}
689
690void
Greg Clayton70436352010-06-30 23:03:03 +0000691SBTarget::Disassemble (lldb::addr_t start_addr, lldb::addr_t end_addr, const char *module_name)
Chris Lattner24943d22010-06-08 16:52:24 +0000692{
Greg Clayton70436352010-06-30 23:03:03 +0000693 if (start_addr == LLDB_INVALID_ADDRESS)
Chris Lattner24943d22010-06-08 16:52:24 +0000694 return;
695
Greg Clayton63094e02010-06-23 01:19:29 +0000696 FILE *out = m_opaque_sp->GetDebugger().GetOutputFileHandle();
Chris Lattner24943d22010-06-08 16:52:24 +0000697 if (out == NULL)
698 return;
699
Greg Clayton63094e02010-06-23 01:19:29 +0000700 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000701 {
Greg Clayton70436352010-06-30 23:03:03 +0000702 ModuleSP module_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000703 if (module_name != NULL)
704 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000705 FileSpec module_file_spec (module_name, false);
Greg Clayton70436352010-06-30 23:03:03 +0000706 module_sp = m_opaque_sp->GetImages().FindFirstModuleForFileSpec (module_file_spec, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000707 }
Greg Clayton70436352010-06-30 23:03:03 +0000708
709 AddressRange range;
710
711 // Make sure the process object is alive if we have one (it might be
712 // created but we might not be launched yet).
Greg Claytoneea26402010-09-14 23:36:40 +0000713
Greg Clayton1a3083a2010-10-06 03:53:16 +0000714 Process *sb_process = m_opaque_sp->GetProcessSP().get();
715 if (sb_process && !sb_process->IsAlive())
716 sb_process = NULL;
Greg Clayton70436352010-06-30 23:03:03 +0000717
718 // If we are given a module, then "start_addr" is a file address in
719 // that module.
720 if (module_sp)
721 {
722 if (!module_sp->ResolveFileAddress (start_addr, range.GetBaseAddress()))
723 range.GetBaseAddress().SetOffset(start_addr);
724 }
Greg Claytoneea26402010-09-14 23:36:40 +0000725 else if (m_opaque_sp->GetSectionLoadList().IsEmpty() == false)
Greg Clayton70436352010-06-30 23:03:03 +0000726 {
727 // We don't have a module, se we need to figure out if "start_addr"
728 // resolves to anything in a running process.
Greg Claytoneea26402010-09-14 23:36:40 +0000729 if (!m_opaque_sp->GetSectionLoadList().ResolveLoadAddress (start_addr, range.GetBaseAddress()))
Greg Clayton70436352010-06-30 23:03:03 +0000730 range.GetBaseAddress().SetOffset(start_addr);
731 }
732 else
733 {
734 if (m_opaque_sp->GetImages().ResolveFileAddress (start_addr, range.GetBaseAddress()))
735 range.GetBaseAddress().SetOffset(start_addr);
736 }
Chris Lattner24943d22010-06-08 16:52:24 +0000737
738 // For now, we need a process; the disassembly functions insist. If we don't have one already,
739 // make one.
740
Greg Clayton70436352010-06-30 23:03:03 +0000741 ExecutionContext exe_ctx;
Chris Lattner24943d22010-06-08 16:52:24 +0000742
Greg Clayton1a3083a2010-10-06 03:53:16 +0000743 if (sb_process)
744 sb_process->CalculateExecutionContext(exe_ctx);
Greg Clayton70436352010-06-30 23:03:03 +0000745 else
Greg Claytona830adb2010-10-04 01:05:56 +0000746 m_opaque_sp->CalculateExecutionContext(exe_ctx);
Chris Lattner24943d22010-06-08 16:52:24 +0000747
Greg Clayton70436352010-06-30 23:03:03 +0000748 if (end_addr == LLDB_INVALID_ADDRESS || end_addr < start_addr)
749 range.SetByteSize( DEFAULT_DISASM_BYTE_SIZE);
750 else
751 range.SetByteSize(end_addr - start_addr);
Chris Lattner24943d22010-06-08 16:52:24 +0000752
Greg Clayton70436352010-06-30 23:03:03 +0000753 StreamFile out_stream (out);
Chris Lattner24943d22010-06-08 16:52:24 +0000754
Greg Clayton70436352010-06-30 23:03:03 +0000755 Disassembler::Disassemble (m_opaque_sp->GetDebugger(),
756 m_opaque_sp->GetArchitecture(),
757 exe_ctx,
758 range,
759 3,
760 false,
761 out_stream);
Chris Lattner24943d22010-06-08 16:52:24 +0000762 }
763}
764
765void
766SBTarget::Disassemble (const char *function_name, const char *module_name)
767{
768 if (function_name == NULL)
769 return;
770
Greg Clayton63094e02010-06-23 01:19:29 +0000771 FILE *out = m_opaque_sp->GetDebugger().GetOutputFileHandle();
Chris Lattner24943d22010-06-08 16:52:24 +0000772 if (out == NULL)
773 return;
774
Greg Clayton63094e02010-06-23 01:19:29 +0000775 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000776 {
Greg Clayton70436352010-06-30 23:03:03 +0000777 Disassembler *disassembler = Disassembler::FindPlugin (m_opaque_sp->GetArchitecture());
Chris Lattner24943d22010-06-08 16:52:24 +0000778 if (disassembler == NULL)
779 return;
780
Greg Clayton70436352010-06-30 23:03:03 +0000781 ModuleSP module_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000782 if (module_name != NULL)
Chris Lattner24943d22010-06-08 16:52:24 +0000783 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000784 FileSpec module_file_spec (module_name, false);
Greg Clayton70436352010-06-30 23:03:03 +0000785 module_sp = m_opaque_sp->GetImages().FindFirstModuleForFileSpec (module_file_spec, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000786 }
Greg Clayton70436352010-06-30 23:03:03 +0000787
788 ExecutionContext exe_ctx;
789
790 // Make sure the process object is alive if we have one (it might be
791 // created but we might not be launched yet).
Greg Clayton1a3083a2010-10-06 03:53:16 +0000792 Process *sb_process = m_opaque_sp->GetProcessSP().get();
793 if (sb_process && !sb_process->IsAlive())
794 sb_process = NULL;
Greg Clayton70436352010-06-30 23:03:03 +0000795
Greg Clayton1a3083a2010-10-06 03:53:16 +0000796 if (sb_process)
797 sb_process->CalculateExecutionContext(exe_ctx);
Greg Clayton70436352010-06-30 23:03:03 +0000798 else
Greg Claytona830adb2010-10-04 01:05:56 +0000799 m_opaque_sp->CalculateExecutionContext(exe_ctx);
Greg Clayton70436352010-06-30 23:03:03 +0000800
801
802 StreamFile out_stream (out);
803
804 Disassembler::Disassemble (m_opaque_sp->GetDebugger(),
805 m_opaque_sp->GetArchitecture(),
806 exe_ctx,
807 ConstString (function_name),
808 module_sp.get(),
809 3,
810 false,
811 out_stream);
Chris Lattner24943d22010-06-08 16:52:24 +0000812 }
813}
Caroline Tice98f930f2010-09-20 05:20:02 +0000814
815bool
Caroline Tice7826c882010-10-26 03:11:13 +0000816SBTarget::GetDescription (SBStream &description, lldb::DescriptionLevel description_level)
Caroline Tice98f930f2010-09-20 05:20:02 +0000817{
818 if (m_opaque_sp)
Caroline Ticee7a566e2010-09-20 16:21:41 +0000819 {
Caroline Ticee49ec182010-09-22 23:01:29 +0000820 description.ref();
Caroline Tice7826c882010-10-26 03:11:13 +0000821 m_opaque_sp->Dump (description.get(), description_level);
822 }
823 else
824 description.Printf ("No value");
825
826 return true;
827}
828
829bool
830SBTarget::GetDescription (SBStream &description, lldb::DescriptionLevel description_level) const
831{
832 if (m_opaque_sp)
833 {
834 description.ref();
835 m_opaque_sp->Dump (description.get(), description_level);
Caroline Ticee7a566e2010-09-20 16:21:41 +0000836 }
Caroline Tice98f930f2010-09-20 05:20:02 +0000837 else
838 description.Printf ("No value");
839
840 return true;
841}