blob: 72aef3fd2fe0a118d2de89572dec20261c5c1e27 [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- SBTarget.cpp --------------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Eli Friedman7a62c8b2010-06-09 07:44:37 +000010#include "lldb/API/SBTarget.h"
Chris Lattner24943d22010-06-08 16:52:24 +000011
12#include "lldb/lldb-include.h"
13
14#include "lldb/API/SBFileSpec.h"
15#include "lldb/API/SBModule.h"
Caroline Tice98f930f2010-09-20 05:20:02 +000016#include "lldb/API/SBStream.h"
Chris Lattner24943d22010-06-08 16:52:24 +000017#include "lldb/Breakpoint/BreakpointID.h"
18#include "lldb/Breakpoint/BreakpointIDList.h"
19#include "lldb/Breakpoint/BreakpointList.h"
20#include "lldb/Breakpoint/BreakpointLocation.h"
21#include "lldb/Core/Address.h"
22#include "lldb/Core/AddressResolver.h"
23#include "lldb/Core/AddressResolverName.h"
Jim Ingham84cdc152010-06-15 19:49:27 +000024#include "lldb/Interpreter/Args.h"
Chris Lattner24943d22010-06-08 16:52:24 +000025#include "lldb/Core/ArchSpec.h"
26#include "lldb/Core/Debugger.h"
27#include "lldb/Core/Disassembler.h"
28#include "lldb/Core/FileSpec.h"
Caroline Tice7826c882010-10-26 03:11:13 +000029#include "lldb/Core/Log.h"
Chris Lattner24943d22010-06-08 16:52:24 +000030#include "lldb/Core/RegularExpression.h"
31#include "lldb/Core/SearchFilter.h"
32#include "lldb/Core/STLUtils.h"
33#include "lldb/Target/Process.h"
34#include "lldb/Target/Target.h"
35#include "lldb/Target/TargetList.h"
36
37#include "lldb/Interpreter/CommandReturnObject.h"
38#include "../source/Commands/CommandObjectBreakpoint.h"
39
Eli Friedman7a62c8b2010-06-09 07:44:37 +000040#include "lldb/API/SBDebugger.h"
41#include "lldb/API/SBProcess.h"
42#include "lldb/API/SBListener.h"
43#include "lldb/API/SBBreakpoint.h"
Chris Lattner24943d22010-06-08 16:52:24 +000044
45using namespace lldb;
46using namespace lldb_private;
47
48#define DEFAULT_DISASM_BYTE_SIZE 32
49
50//----------------------------------------------------------------------
51// SBTarget constructor
52//----------------------------------------------------------------------
53SBTarget::SBTarget ()
54{
55}
56
57SBTarget::SBTarget (const SBTarget& rhs) :
Greg Clayton63094e02010-06-23 01:19:29 +000058 m_opaque_sp (rhs.m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000059{
60}
61
62SBTarget::SBTarget(const TargetSP& target_sp) :
Greg Clayton63094e02010-06-23 01:19:29 +000063 m_opaque_sp (target_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000064{
65}
66
Chris Lattner24943d22010-06-08 16:52:24 +000067//----------------------------------------------------------------------
68// Destructor
69//----------------------------------------------------------------------
70SBTarget::~SBTarget()
71{
72}
73
74bool
75SBTarget::IsValid () const
76{
Greg Clayton63094e02010-06-23 01:19:29 +000077 return m_opaque_sp.get() != NULL;
Chris Lattner24943d22010-06-08 16:52:24 +000078}
79
80SBProcess
81SBTarget::GetProcess ()
82{
Caroline Tice7826c882010-10-26 03:11:13 +000083
Chris Lattner24943d22010-06-08 16:52:24 +000084 SBProcess sb_process;
Greg Clayton63094e02010-06-23 01:19:29 +000085 if (m_opaque_sp)
86 sb_process.SetProcess (m_opaque_sp->GetProcessSP());
Caroline Tice7826c882010-10-26 03:11:13 +000087
Caroline Tice926060e2010-10-29 21:48:37 +000088 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +000089 if (log)
90 {
Greg Clayton49ce6822010-10-31 03:01:06 +000091 log->Printf ("SBTarget(%p)::GetProcess () => SBProcess(%p)",
92 m_opaque_sp.get(), sb_process.get());
Caroline Tice7826c882010-10-26 03:11:13 +000093 }
94
Chris Lattner24943d22010-06-08 16:52:24 +000095 return sb_process;
96}
97
Greg Clayton63094e02010-06-23 01:19:29 +000098SBDebugger
99SBTarget::GetDebugger () const
100{
101 SBDebugger debugger;
102 if (m_opaque_sp)
103 debugger.reset (m_opaque_sp->GetDebugger().GetSP());
104 return debugger;
105}
106
Greg Clayton992ce262010-10-06 18:44:26 +0000107
108// DEPRECATED
109SBProcess
110SBTarget::CreateProcess ()
111{
Caroline Tice7826c882010-10-26 03:11:13 +0000112
Greg Clayton992ce262010-10-06 18:44:26 +0000113 SBProcess sb_process;
114
115 if (m_opaque_sp)
116 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
117
Caroline Tice926060e2010-10-29 21:48:37 +0000118 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +0000119 if (log)
120 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000121 log->Printf ("SBTarget(%p)::CreateProcess () => SBProcess(%p)",
122 m_opaque_sp.get(), sb_process.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000123 }
124
Greg Clayton992ce262010-10-06 18:44:26 +0000125 return sb_process;
126}
127
128
Greg Claytonc5f728c2010-10-06 22:10:17 +0000129SBProcess
130SBTarget::LaunchProcess
131(
132 char const **argv,
133 char const **envp,
134 const char *tty,
135 uint32_t launch_flags,
Greg Claytond8c62532010-10-07 04:19:01 +0000136 bool stop_at_entry
137)
138{
Caroline Tice7826c882010-10-26 03:11:13 +0000139 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
140
141 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000142 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 +0000143 m_opaque_sp.get(), argv, envp, tty, launch_flags, stop_at_entry);
Caroline Tice7826c882010-10-26 03:11:13 +0000144
Greg Claytond8c62532010-10-07 04:19:01 +0000145 SBError sb_error;
Caroline Tice7826c882010-10-26 03:11:13 +0000146 SBProcess sb_process = Launch (argv, envp, tty, launch_flags, stop_at_entry, sb_error);
147
Caroline Tice926060e2010-10-29 21:48:37 +0000148 log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +0000149 if (log)
150 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000151 log->Printf ("SBTarget(%p)::LaunchProcess (...) => SBProcess(%p)",
152 m_opaque_sp.get(), sb_process.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000153 }
154
155 return sb_process;
Greg Claytond8c62532010-10-07 04:19:01 +0000156}
157
158SBProcess
159SBTarget::Launch
160(
161 char const **argv,
162 char const **envp,
163 const char *tty,
164 uint32_t launch_flags,
Greg Claytonc5f728c2010-10-06 22:10:17 +0000165 bool stop_at_entry,
166 SBError &error
167)
168{
Caroline Tice7826c882010-10-26 03:11:13 +0000169 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
170
171 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000172 {
Greg Claytona66ba462010-10-30 04:51:46 +0000173 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 +0000174 m_opaque_sp.get(), argv, envp, tty, launch_flags, stop_at_entry, error.get());
175 }
Greg Clayton1a3083a2010-10-06 03:53:16 +0000176 SBProcess sb_process;
177 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000178 {
Greg Clayton992ce262010-10-06 18:44:26 +0000179 // DEPRECATED, this will change when CreateProcess is removed...
180 if (m_opaque_sp->GetProcessSP())
181 {
182 sb_process.SetProcess(m_opaque_sp->GetProcessSP());
183 }
184 else
185 {
186 // When launching, we always want to create a new process When
187 // SBTarget::CreateProcess is removed, this will always happen.
188 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
189 }
Greg Clayton1a3083a2010-10-06 03:53:16 +0000190
191 if (sb_process.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000192 {
Greg Claytonc5f728c2010-10-06 22:10:17 +0000193 error.SetError (sb_process->Launch (argv, envp, launch_flags, tty, tty, tty));
Greg Clayton1a3083a2010-10-06 03:53:16 +0000194 if (error.Success())
Chris Lattner24943d22010-06-08 16:52:24 +0000195 {
Sean Callanan451ee7c2010-10-07 22:51:14 +0000196 // We we are stopping at the entry point, we can return now!
197 if (stop_at_entry)
198 return sb_process;
199
Greg Clayton1a3083a2010-10-06 03:53:16 +0000200 // Make sure we are stopped at the entry
201 StateType state = sb_process->WaitForProcessToStop (NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000202 if (state == eStateStopped)
Greg Clayton1a3083a2010-10-06 03:53:16 +0000203 {
204 // resume the process to skip the entry point
Greg Claytonc5f728c2010-10-06 22:10:17 +0000205 error.SetError (sb_process->Resume());
Greg Clayton1a3083a2010-10-06 03:53:16 +0000206 if (error.Success())
207 {
208 // If we are doing synchronous mode, then wait for the
209 // process to stop yet again!
210 if (m_opaque_sp->GetDebugger().GetAsyncExecution () == false)
211 sb_process->WaitForProcessToStop (NULL);
212 }
213 }
Chris Lattner24943d22010-06-08 16:52:24 +0000214 }
215 }
Greg Claytonc5f728c2010-10-06 22:10:17 +0000216 else
217 {
218 error.SetErrorString ("unable to create lldb_private::Process");
219 }
220 }
221 else
222 {
223 error.SetErrorString ("SBTarget is invalid");
Chris Lattner24943d22010-06-08 16:52:24 +0000224 }
Caroline Tice7826c882010-10-26 03:11:13 +0000225
Caroline Tice926060e2010-10-29 21:48:37 +0000226 log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +0000227 if (log)
228 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000229 log->Printf ("SBTarget(%p)::Launch (...) => SBProceess(%p)",
230 m_opaque_sp.get(), sb_process.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000231 }
232
Greg Clayton1a3083a2010-10-06 03:53:16 +0000233 return sb_process;
Chris Lattner24943d22010-06-08 16:52:24 +0000234}
235
Greg Claytonc5f728c2010-10-06 22:10:17 +0000236
237lldb::SBProcess
Greg Claytond8c62532010-10-07 04:19:01 +0000238SBTarget::AttachToProcessWithID
Greg Claytonc5f728c2010-10-06 22:10:17 +0000239(
240 lldb::pid_t pid,// The process ID to attach to
241 SBError& error // An error explaining what went wrong if attach fails
242)
243{
244 SBProcess sb_process;
245 if (m_opaque_sp)
246 {
247 // DEPRECATED, this will change when CreateProcess is removed...
248 if (m_opaque_sp->GetProcessSP())
249 {
250 sb_process.SetProcess(m_opaque_sp->GetProcessSP());
251 }
252 else
253 {
254 // When launching, we always want to create a new process When
255 // SBTarget::CreateProcess is removed, this will always happen.
256 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
257 }
258
259 if (sb_process.IsValid())
260 {
261 error.SetError (sb_process->Attach (pid));
262 }
263 else
264 {
265 error.SetErrorString ("unable to create lldb_private::Process");
266 }
267 }
268 else
269 {
270 error.SetErrorString ("SBTarget is invalid");
271 }
272 return sb_process;
273
274}
275
276lldb::SBProcess
Greg Claytond8c62532010-10-07 04:19:01 +0000277SBTarget::AttachToProcessWithName
Greg Claytonc5f728c2010-10-06 22:10:17 +0000278(
279 const char *name, // basename of process to attach to
280 bool wait_for, // if true wait for a new instance of "name" to be launched
281 SBError& error // An error explaining what went wrong if attach fails
282)
283{
284 SBProcess sb_process;
285 if (m_opaque_sp)
286 {
287 // DEPRECATED, this will change when CreateProcess is removed...
288 if (m_opaque_sp->GetProcessSP())
289 {
290 sb_process.SetProcess(m_opaque_sp->GetProcessSP());
291 }
292 else
293 {
294 // When launching, we always want to create a new process When
295 // SBTarget::CreateProcess is removed, this will always happen.
296 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
297 }
298
299 if (sb_process.IsValid())
300 {
301 error.SetError (sb_process->Attach (name, wait_for));
302 }
303 else
304 {
305 error.SetErrorString ("unable to create lldb_private::Process");
306 }
307 }
308 else
309 {
310 error.SetErrorString ("SBTarget is invalid");
311 }
312 return sb_process;
313
314}
315
Chris Lattner24943d22010-06-08 16:52:24 +0000316SBFileSpec
317SBTarget::GetExecutable ()
318{
Caroline Tice7826c882010-10-26 03:11:13 +0000319
Chris Lattner24943d22010-06-08 16:52:24 +0000320 SBFileSpec exe_file_spec;
Greg Clayton63094e02010-06-23 01:19:29 +0000321 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000322 {
Greg Clayton63094e02010-06-23 01:19:29 +0000323 ModuleSP exe_module_sp (m_opaque_sp->GetExecutableModule ());
Chris Lattner24943d22010-06-08 16:52:24 +0000324 if (exe_module_sp)
325 exe_file_spec.SetFileSpec (exe_module_sp->GetFileSpec());
326 }
Caroline Tice7826c882010-10-26 03:11:13 +0000327
Greg Clayton49ce6822010-10-31 03:01:06 +0000328 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +0000329 if (log)
330 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000331 log->Printf ("SBTarget(%p)::GetExecutable () => SBFileSpec(%p)",
332 m_opaque_sp.get(), exe_file_spec.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000333 }
334
Chris Lattner24943d22010-06-08 16:52:24 +0000335 return exe_file_spec;
336}
337
338
339bool
340SBTarget::DeleteTargetFromList (TargetList *list)
341{
Greg Clayton63094e02010-06-23 01:19:29 +0000342 if (m_opaque_sp)
343 return list->DeleteTarget (m_opaque_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000344 else
345 return false;
346}
347
348bool
Chris Lattner24943d22010-06-08 16:52:24 +0000349SBTarget::operator == (const SBTarget &rhs) const
350{
Greg Clayton63094e02010-06-23 01:19:29 +0000351 return m_opaque_sp.get() == rhs.m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000352}
353
354bool
355SBTarget::operator != (const SBTarget &rhs) const
356{
Greg Clayton63094e02010-06-23 01:19:29 +0000357 return m_opaque_sp.get() != rhs.m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000358}
359
360lldb_private::Target *
Greg Clayton63094e02010-06-23 01:19:29 +0000361SBTarget::operator ->() const
Chris Lattner24943d22010-06-08 16:52:24 +0000362{
Greg Clayton63094e02010-06-23 01:19:29 +0000363 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000364}
Greg Clayton63094e02010-06-23 01:19:29 +0000365
366lldb_private::Target *
367SBTarget::get() const
Chris Lattner24943d22010-06-08 16:52:24 +0000368{
Greg Clayton63094e02010-06-23 01:19:29 +0000369 return m_opaque_sp.get();
370}
371
372void
373SBTarget::reset (const lldb::TargetSP& target_sp)
374{
375 m_opaque_sp = target_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000376}
377
378SBBreakpoint
379SBTarget::BreakpointCreateByLocation (const char *file, uint32_t line)
380{
Greg Claytona66ba462010-10-30 04:51:46 +0000381 return SBBreakpoint(BreakpointCreateByLocation (SBFileSpec (file), line));
Chris Lattner24943d22010-06-08 16:52:24 +0000382}
383
384SBBreakpoint
385SBTarget::BreakpointCreateByLocation (const SBFileSpec &sb_file_spec, uint32_t line)
386{
Caroline Tice7826c882010-10-26 03:11:13 +0000387 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
388
Chris Lattner24943d22010-06-08 16:52:24 +0000389 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000390 if (m_opaque_sp.get() && line != 0)
391 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, *sb_file_spec, line, true, false);
Caroline Tice7826c882010-10-26 03:11:13 +0000392
393 if (log)
394 {
395 SBStream sstr;
396 sb_bp.GetDescription (sstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000397 char path[PATH_MAX];
398 sb_file_spec->GetPath (path, sizeof(path));
399 log->Printf ("SBTarget(%p)::BreakpointCreateByLocation ( %s:%u ) => SBBreakpoint(%p): %s",
Greg Claytona66ba462010-10-30 04:51:46 +0000400 m_opaque_sp.get(),
Greg Clayton49ce6822010-10-31 03:01:06 +0000401 path,
Greg Claytona66ba462010-10-30 04:51:46 +0000402 line,
Greg Clayton49ce6822010-10-31 03:01:06 +0000403 sb_bp.get(),
Caroline Tice7826c882010-10-26 03:11:13 +0000404 sstr.GetData());
405 }
406
Chris Lattner24943d22010-06-08 16:52:24 +0000407 return sb_bp;
408}
409
410SBBreakpoint
411SBTarget::BreakpointCreateByName (const char *symbol_name, const char *module_name)
412{
Caroline Tice7826c882010-10-26 03:11:13 +0000413 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
414
Chris Lattner24943d22010-06-08 16:52:24 +0000415 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000416 if (m_opaque_sp.get() && symbol_name && symbol_name[0])
Chris Lattner24943d22010-06-08 16:52:24 +0000417 {
418 if (module_name && module_name[0])
419 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000420 FileSpec module_file_spec(module_name, false);
Jim Ingham7ec03bd2010-09-30 21:21:43 +0000421 *sb_bp = m_opaque_sp->CreateBreakpoint (&module_file_spec, symbol_name, eFunctionNameTypeFull | eFunctionNameTypeBase, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000422 }
423 else
424 {
Jim Ingham7ec03bd2010-09-30 21:21:43 +0000425 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, symbol_name, eFunctionNameTypeFull | eFunctionNameTypeBase, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000426 }
427 }
Caroline Tice7826c882010-10-26 03:11:13 +0000428
429 if (log)
430 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000431 log->Printf ("SBTarget(%p)::BreakpointCreateByName (symbol=\"%s\", module=\"%s\") => SBBreakpoint(%p)",
432 m_opaque_sp.get(), symbol_name, module_name, sb_bp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000433 }
434
Chris Lattner24943d22010-06-08 16:52:24 +0000435 return sb_bp;
436}
437
438SBBreakpoint
439SBTarget::BreakpointCreateByRegex (const char *symbol_name_regex, const char *module_name)
440{
Caroline Tice7826c882010-10-26 03:11:13 +0000441 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
442
Chris Lattner24943d22010-06-08 16:52:24 +0000443 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000444 if (m_opaque_sp.get() && symbol_name_regex && symbol_name_regex[0])
Chris Lattner24943d22010-06-08 16:52:24 +0000445 {
446 RegularExpression regexp(symbol_name_regex);
447
448 if (module_name && module_name[0])
449 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000450 FileSpec module_file_spec(module_name, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000451
Greg Clayton63094e02010-06-23 01:19:29 +0000452 *sb_bp = m_opaque_sp->CreateBreakpoint (&module_file_spec, regexp, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000453 }
454 else
455 {
Greg Clayton63094e02010-06-23 01:19:29 +0000456 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, regexp, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000457 }
458 }
Caroline Tice7826c882010-10-26 03:11:13 +0000459
460 if (log)
461 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000462 log->Printf ("SBTarget(%p)::BreakpointCreateByRegex (symbol_regex=\"%s\", module_name=\"%s\") => SBBreakpoint(%p)",
463 m_opaque_sp.get(), symbol_name_regex, module_name, sb_bp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000464 }
465
Chris Lattner24943d22010-06-08 16:52:24 +0000466 return sb_bp;
467}
468
469
470
471SBBreakpoint
472SBTarget::BreakpointCreateByAddress (addr_t address)
473{
Caroline Tice7826c882010-10-26 03:11:13 +0000474 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
475
Chris Lattner24943d22010-06-08 16:52:24 +0000476 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000477 if (m_opaque_sp.get())
478 *sb_bp = m_opaque_sp->CreateBreakpoint (address, false);
Caroline Tice7826c882010-10-26 03:11:13 +0000479
480 if (log)
481 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000482 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 +0000483 }
484
Chris Lattner24943d22010-06-08 16:52:24 +0000485 return sb_bp;
486}
487
Chris Lattner24943d22010-06-08 16:52:24 +0000488SBBreakpoint
489SBTarget::FindBreakpointByID (break_id_t bp_id)
490{
Caroline Tice7826c882010-10-26 03:11:13 +0000491 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
492
Chris Lattner24943d22010-06-08 16:52:24 +0000493 SBBreakpoint sb_breakpoint;
Greg Clayton63094e02010-06-23 01:19:29 +0000494 if (m_opaque_sp && bp_id != LLDB_INVALID_BREAK_ID)
495 *sb_breakpoint = m_opaque_sp->GetBreakpointByID (bp_id);
Caroline Tice7826c882010-10-26 03:11:13 +0000496
497 if (log)
498 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000499 log->Printf ("SBTarget(%p)::FindBreakpointByID (bp_id=%d) => SBBreakpoint(%p)",
500 m_opaque_sp.get(), (uint32_t) bp_id, sb_breakpoint.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000501 }
502
Chris Lattner24943d22010-06-08 16:52:24 +0000503 return sb_breakpoint;
504}
505
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000506uint32_t
507SBTarget::GetNumBreakpoints () const
508{
509 if (m_opaque_sp)
510 return m_opaque_sp->GetBreakpointList().GetSize();
511 return 0;
512}
513
514SBBreakpoint
515SBTarget::GetBreakpointAtIndex (uint32_t idx) const
516{
517 SBBreakpoint sb_breakpoint;
518 if (m_opaque_sp)
519 *sb_breakpoint = m_opaque_sp->GetBreakpointList().GetBreakpointAtIndex(idx);
520 return sb_breakpoint;
521}
Chris Lattner24943d22010-06-08 16:52:24 +0000522
523bool
524SBTarget::BreakpointDelete (break_id_t bp_id)
525{
Caroline Tice7826c882010-10-26 03:11:13 +0000526 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
527
Caroline Tice7826c882010-10-26 03:11:13 +0000528 bool result = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000529 if (m_opaque_sp)
Caroline Tice7826c882010-10-26 03:11:13 +0000530 result = m_opaque_sp->RemoveBreakpointByID (bp_id);
531
532 if (log)
533 {
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000534 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 +0000535 }
536
537 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000538}
539
540bool
541SBTarget::EnableAllBreakpoints ()
542{
Greg Clayton63094e02010-06-23 01:19:29 +0000543 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000544 {
Greg Clayton63094e02010-06-23 01:19:29 +0000545 m_opaque_sp->EnableAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000546 return true;
547 }
548 return false;
549}
550
551bool
552SBTarget::DisableAllBreakpoints ()
553{
Greg Clayton63094e02010-06-23 01:19:29 +0000554 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000555 {
Greg Clayton63094e02010-06-23 01:19:29 +0000556 m_opaque_sp->DisableAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000557 return true;
558 }
559 return false;
560}
561
562bool
563SBTarget::DeleteAllBreakpoints ()
564{
Greg Clayton63094e02010-06-23 01:19:29 +0000565 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000566 {
Greg Clayton63094e02010-06-23 01:19:29 +0000567 m_opaque_sp->RemoveAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000568 return true;
569 }
570 return false;
571}
572
573
574uint32_t
575SBTarget::GetNumModules () const
576{
Caroline Tice7826c882010-10-26 03:11:13 +0000577 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
578
Caroline Tice7826c882010-10-26 03:11:13 +0000579 uint32_t num = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000580 if (m_opaque_sp)
Caroline Tice7826c882010-10-26 03:11:13 +0000581 num = m_opaque_sp->GetImages().GetSize();
582
583 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000584 log->Printf ("SBTarget(%p)::GetNumModules () => %d", m_opaque_sp.get(), num);
Caroline Tice7826c882010-10-26 03:11:13 +0000585
586 return num;
Chris Lattner24943d22010-06-08 16:52:24 +0000587}
588
Greg Clayton43490d12010-07-30 20:12:55 +0000589void
590SBTarget::Clear ()
591{
Caroline Tice7826c882010-10-26 03:11:13 +0000592 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
593
594 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000595 log->Printf ("SBTarget(%p)::Clear ()", m_opaque_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000596
Greg Clayton43490d12010-07-30 20:12:55 +0000597 m_opaque_sp.reset();
598}
599
600
Chris Lattner24943d22010-06-08 16:52:24 +0000601SBModule
602SBTarget::FindModule (const SBFileSpec &sb_file_spec)
603{
604 SBModule sb_module;
Greg Clayton63094e02010-06-23 01:19:29 +0000605 if (m_opaque_sp && sb_file_spec.IsValid())
606 sb_module.SetModule (m_opaque_sp->GetImages().FindFirstModuleForFileSpec (*sb_file_spec, NULL));
Chris Lattner24943d22010-06-08 16:52:24 +0000607 return sb_module;
608}
609
610SBModule
611SBTarget::GetModuleAtIndex (uint32_t idx)
612{
Caroline Tice7826c882010-10-26 03:11:13 +0000613 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
614
Chris Lattner24943d22010-06-08 16:52:24 +0000615 SBModule sb_module;
Greg Clayton63094e02010-06-23 01:19:29 +0000616 if (m_opaque_sp)
617 sb_module.SetModule(m_opaque_sp->GetImages().GetModuleAtIndex(idx));
Caroline Tice7826c882010-10-26 03:11:13 +0000618
619 if (log)
620 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000621 log->Printf ("SBTarget(%p)::GetModuleAtIndex (idx=%d) => SBModule(%p)",
622 m_opaque_sp.get(), idx, sb_module.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000623 }
624
Chris Lattner24943d22010-06-08 16:52:24 +0000625 return sb_module;
626}
627
628
629SBBroadcaster
630SBTarget::GetBroadcaster () const
631{
Caroline Tice7826c882010-10-26 03:11:13 +0000632 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
633
Greg Clayton63094e02010-06-23 01:19:29 +0000634 SBBroadcaster broadcaster(m_opaque_sp.get(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000635
636 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000637 log->Printf ("SBTarget(%p)::GetBroadcaster () => SBBroadcaster(%p)",
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000638 m_opaque_sp.get(), broadcaster.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000639
Chris Lattner24943d22010-06-08 16:52:24 +0000640 return broadcaster;
641}
642
643void
Greg Clayton70436352010-06-30 23:03:03 +0000644SBTarget::Disassemble (lldb::addr_t start_addr, lldb::addr_t end_addr, const char *module_name)
Chris Lattner24943d22010-06-08 16:52:24 +0000645{
Greg Clayton70436352010-06-30 23:03:03 +0000646 if (start_addr == LLDB_INVALID_ADDRESS)
Chris Lattner24943d22010-06-08 16:52:24 +0000647 return;
648
Greg Clayton63094e02010-06-23 01:19:29 +0000649 FILE *out = m_opaque_sp->GetDebugger().GetOutputFileHandle();
Chris Lattner24943d22010-06-08 16:52:24 +0000650 if (out == NULL)
651 return;
652
Greg Clayton63094e02010-06-23 01:19:29 +0000653 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000654 {
Greg Clayton70436352010-06-30 23:03:03 +0000655 ModuleSP module_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000656 if (module_name != NULL)
657 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000658 FileSpec module_file_spec (module_name, false);
Greg Clayton70436352010-06-30 23:03:03 +0000659 module_sp = m_opaque_sp->GetImages().FindFirstModuleForFileSpec (module_file_spec, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000660 }
Greg Clayton70436352010-06-30 23:03:03 +0000661
662 AddressRange range;
663
664 // Make sure the process object is alive if we have one (it might be
665 // created but we might not be launched yet).
Greg Claytoneea26402010-09-14 23:36:40 +0000666
Greg Clayton1a3083a2010-10-06 03:53:16 +0000667 Process *sb_process = m_opaque_sp->GetProcessSP().get();
668 if (sb_process && !sb_process->IsAlive())
669 sb_process = NULL;
Greg Clayton70436352010-06-30 23:03:03 +0000670
671 // If we are given a module, then "start_addr" is a file address in
672 // that module.
673 if (module_sp)
674 {
675 if (!module_sp->ResolveFileAddress (start_addr, range.GetBaseAddress()))
676 range.GetBaseAddress().SetOffset(start_addr);
677 }
Greg Claytoneea26402010-09-14 23:36:40 +0000678 else if (m_opaque_sp->GetSectionLoadList().IsEmpty() == false)
Greg Clayton70436352010-06-30 23:03:03 +0000679 {
680 // We don't have a module, se we need to figure out if "start_addr"
681 // resolves to anything in a running process.
Greg Claytoneea26402010-09-14 23:36:40 +0000682 if (!m_opaque_sp->GetSectionLoadList().ResolveLoadAddress (start_addr, range.GetBaseAddress()))
Greg Clayton70436352010-06-30 23:03:03 +0000683 range.GetBaseAddress().SetOffset(start_addr);
684 }
685 else
686 {
687 if (m_opaque_sp->GetImages().ResolveFileAddress (start_addr, range.GetBaseAddress()))
688 range.GetBaseAddress().SetOffset(start_addr);
689 }
Chris Lattner24943d22010-06-08 16:52:24 +0000690
691 // For now, we need a process; the disassembly functions insist. If we don't have one already,
692 // make one.
693
Greg Clayton70436352010-06-30 23:03:03 +0000694 ExecutionContext exe_ctx;
Chris Lattner24943d22010-06-08 16:52:24 +0000695
Greg Clayton1a3083a2010-10-06 03:53:16 +0000696 if (sb_process)
697 sb_process->CalculateExecutionContext(exe_ctx);
Greg Clayton70436352010-06-30 23:03:03 +0000698 else
Greg Claytona830adb2010-10-04 01:05:56 +0000699 m_opaque_sp->CalculateExecutionContext(exe_ctx);
Chris Lattner24943d22010-06-08 16:52:24 +0000700
Greg Clayton70436352010-06-30 23:03:03 +0000701 if (end_addr == LLDB_INVALID_ADDRESS || end_addr < start_addr)
702 range.SetByteSize( DEFAULT_DISASM_BYTE_SIZE);
703 else
704 range.SetByteSize(end_addr - start_addr);
Chris Lattner24943d22010-06-08 16:52:24 +0000705
Greg Clayton70436352010-06-30 23:03:03 +0000706 StreamFile out_stream (out);
Chris Lattner24943d22010-06-08 16:52:24 +0000707
Greg Clayton70436352010-06-30 23:03:03 +0000708 Disassembler::Disassemble (m_opaque_sp->GetDebugger(),
709 m_opaque_sp->GetArchitecture(),
710 exe_ctx,
711 range,
712 3,
713 false,
714 out_stream);
Chris Lattner24943d22010-06-08 16:52:24 +0000715 }
716}
717
718void
719SBTarget::Disassemble (const char *function_name, const char *module_name)
720{
721 if (function_name == NULL)
722 return;
723
Greg Clayton63094e02010-06-23 01:19:29 +0000724 FILE *out = m_opaque_sp->GetDebugger().GetOutputFileHandle();
Chris Lattner24943d22010-06-08 16:52:24 +0000725 if (out == NULL)
726 return;
727
Greg Clayton63094e02010-06-23 01:19:29 +0000728 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000729 {
Greg Clayton70436352010-06-30 23:03:03 +0000730 Disassembler *disassembler = Disassembler::FindPlugin (m_opaque_sp->GetArchitecture());
Chris Lattner24943d22010-06-08 16:52:24 +0000731 if (disassembler == NULL)
732 return;
733
Greg Clayton70436352010-06-30 23:03:03 +0000734 ModuleSP module_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000735 if (module_name != NULL)
Chris Lattner24943d22010-06-08 16:52:24 +0000736 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000737 FileSpec module_file_spec (module_name, false);
Greg Clayton70436352010-06-30 23:03:03 +0000738 module_sp = m_opaque_sp->GetImages().FindFirstModuleForFileSpec (module_file_spec, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000739 }
Greg Clayton70436352010-06-30 23:03:03 +0000740
741 ExecutionContext exe_ctx;
742
743 // Make sure the process object is alive if we have one (it might be
744 // created but we might not be launched yet).
Greg Clayton1a3083a2010-10-06 03:53:16 +0000745 Process *sb_process = m_opaque_sp->GetProcessSP().get();
746 if (sb_process && !sb_process->IsAlive())
747 sb_process = NULL;
Greg Clayton70436352010-06-30 23:03:03 +0000748
Greg Clayton1a3083a2010-10-06 03:53:16 +0000749 if (sb_process)
750 sb_process->CalculateExecutionContext(exe_ctx);
Greg Clayton70436352010-06-30 23:03:03 +0000751 else
Greg Claytona830adb2010-10-04 01:05:56 +0000752 m_opaque_sp->CalculateExecutionContext(exe_ctx);
Greg Clayton70436352010-06-30 23:03:03 +0000753
754
755 StreamFile out_stream (out);
756
757 Disassembler::Disassemble (m_opaque_sp->GetDebugger(),
758 m_opaque_sp->GetArchitecture(),
759 exe_ctx,
760 ConstString (function_name),
761 module_sp.get(),
762 3,
763 false,
764 out_stream);
Chris Lattner24943d22010-06-08 16:52:24 +0000765 }
766}
Caroline Tice98f930f2010-09-20 05:20:02 +0000767
768bool
Caroline Tice7826c882010-10-26 03:11:13 +0000769SBTarget::GetDescription (SBStream &description, lldb::DescriptionLevel description_level)
Caroline Tice98f930f2010-09-20 05:20:02 +0000770{
771 if (m_opaque_sp)
Caroline Ticee7a566e2010-09-20 16:21:41 +0000772 {
Caroline Ticee49ec182010-09-22 23:01:29 +0000773 description.ref();
Caroline Tice7826c882010-10-26 03:11:13 +0000774 m_opaque_sp->Dump (description.get(), description_level);
775 }
776 else
777 description.Printf ("No value");
778
779 return true;
780}
781
782bool
783SBTarget::GetDescription (SBStream &description, lldb::DescriptionLevel description_level) const
784{
785 if (m_opaque_sp)
786 {
787 description.ref();
788 m_opaque_sp->Dump (description.get(), description_level);
Caroline Ticee7a566e2010-09-20 16:21:41 +0000789 }
Caroline Tice98f930f2010-09-20 05:20:02 +0000790 else
791 description.Printf ("No value");
792
793 return true;
794}