blob: 860dae7aa92177c01683d651e63df57ae6d3c6e3 [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"
29#include "lldb/Core/RegularExpression.h"
30#include "lldb/Core/SearchFilter.h"
31#include "lldb/Core/STLUtils.h"
32#include "lldb/Target/Process.h"
33#include "lldb/Target/Target.h"
34#include "lldb/Target/TargetList.h"
35
36#include "lldb/Interpreter/CommandReturnObject.h"
37#include "../source/Commands/CommandObjectBreakpoint.h"
38
Eli Friedman7a62c8b2010-06-09 07:44:37 +000039#include "lldb/API/SBDebugger.h"
40#include "lldb/API/SBProcess.h"
41#include "lldb/API/SBListener.h"
42#include "lldb/API/SBBreakpoint.h"
Chris Lattner24943d22010-06-08 16:52:24 +000043
44using namespace lldb;
45using namespace lldb_private;
46
47#define DEFAULT_DISASM_BYTE_SIZE 32
48
49//----------------------------------------------------------------------
50// SBTarget constructor
51//----------------------------------------------------------------------
52SBTarget::SBTarget ()
53{
54}
55
56SBTarget::SBTarget (const SBTarget& rhs) :
Greg Clayton63094e02010-06-23 01:19:29 +000057 m_opaque_sp (rhs.m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000058{
59}
60
61SBTarget::SBTarget(const TargetSP& target_sp) :
Greg Clayton63094e02010-06-23 01:19:29 +000062 m_opaque_sp (target_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000063{
64}
65
66const SBTarget&
67SBTarget::Assign (const SBTarget& rhs)
68{
69 if (this != &rhs)
70 {
Greg Clayton63094e02010-06-23 01:19:29 +000071 m_opaque_sp = rhs.m_opaque_sp;
Chris Lattner24943d22010-06-08 16:52:24 +000072 }
73 return *this;
74}
75
76
77//----------------------------------------------------------------------
78// Destructor
79//----------------------------------------------------------------------
80SBTarget::~SBTarget()
81{
82}
83
84bool
85SBTarget::IsValid () const
86{
Greg Clayton63094e02010-06-23 01:19:29 +000087 return m_opaque_sp.get() != NULL;
Chris Lattner24943d22010-06-08 16:52:24 +000088}
89
90SBProcess
91SBTarget::GetProcess ()
92{
93 SBProcess sb_process;
Greg Clayton63094e02010-06-23 01:19:29 +000094 if (m_opaque_sp)
95 sb_process.SetProcess (m_opaque_sp->GetProcessSP());
Chris Lattner24943d22010-06-08 16:52:24 +000096 return sb_process;
97}
98
Greg Clayton63094e02010-06-23 01:19:29 +000099SBDebugger
100SBTarget::GetDebugger () const
101{
102 SBDebugger debugger;
103 if (m_opaque_sp)
104 debugger.reset (m_opaque_sp->GetDebugger().GetSP());
105 return debugger;
106}
107
Greg Clayton992ce262010-10-06 18:44:26 +0000108
109// DEPRECATED
110SBProcess
111SBTarget::CreateProcess ()
112{
113 SBProcess sb_process;
114
115 if (m_opaque_sp)
116 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
117
118 return sb_process;
119}
120
121
Johnny Chene47649c2010-10-07 02:04:14 +0000122// SBProcess
123// SBTarget::LaunchProcess
124// (
125// char const **argv,
126// char const **envp,
127// const char *tty,
128// uint32_t launch_flags,
129// bool stop_at_entry
130// )
131// {
132// SBError sb_error;
133// return LaunchProcess (argv, envp, tty, launch_flags, stop_at_entry, sb_error);
134// }
Greg Claytonc5f728c2010-10-06 22:10:17 +0000135
136
137SBProcess
138SBTarget::LaunchProcess
139(
140 char const **argv,
141 char const **envp,
142 const char *tty,
143 uint32_t launch_flags,
144 bool stop_at_entry,
145 SBError &error
146)
147{
Greg Clayton1a3083a2010-10-06 03:53:16 +0000148 SBProcess sb_process;
149 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000150 {
Greg Clayton992ce262010-10-06 18:44:26 +0000151 // DEPRECATED, this will change when CreateProcess is removed...
152 if (m_opaque_sp->GetProcessSP())
153 {
154 sb_process.SetProcess(m_opaque_sp->GetProcessSP());
155 }
156 else
157 {
158 // When launching, we always want to create a new process When
159 // SBTarget::CreateProcess is removed, this will always happen.
160 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
161 }
Greg Clayton1a3083a2010-10-06 03:53:16 +0000162
163 if (sb_process.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000164 {
Greg Claytonc5f728c2010-10-06 22:10:17 +0000165 error.SetError (sb_process->Launch (argv, envp, launch_flags, tty, tty, tty));
Greg Clayton1a3083a2010-10-06 03:53:16 +0000166 if (error.Success())
Chris Lattner24943d22010-06-08 16:52:24 +0000167 {
Greg Clayton1a3083a2010-10-06 03:53:16 +0000168 // We we are stopping at the entry point, we can return now!
169 if (stop_at_entry)
170 return sb_process;
171
172 // Make sure we are stopped at the entry
173 StateType state = sb_process->WaitForProcessToStop (NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000174 if (state == eStateStopped)
Greg Clayton1a3083a2010-10-06 03:53:16 +0000175 {
176 // resume the process to skip the entry point
Greg Claytonc5f728c2010-10-06 22:10:17 +0000177 error.SetError (sb_process->Resume());
Greg Clayton1a3083a2010-10-06 03:53:16 +0000178 if (error.Success())
179 {
180 // If we are doing synchronous mode, then wait for the
181 // process to stop yet again!
182 if (m_opaque_sp->GetDebugger().GetAsyncExecution () == false)
183 sb_process->WaitForProcessToStop (NULL);
184 }
185 }
Chris Lattner24943d22010-06-08 16:52:24 +0000186 }
187 }
Greg Claytonc5f728c2010-10-06 22:10:17 +0000188 else
189 {
190 error.SetErrorString ("unable to create lldb_private::Process");
191 }
192 }
193 else
194 {
195 error.SetErrorString ("SBTarget is invalid");
Chris Lattner24943d22010-06-08 16:52:24 +0000196 }
Greg Clayton1a3083a2010-10-06 03:53:16 +0000197 return sb_process;
Chris Lattner24943d22010-06-08 16:52:24 +0000198}
199
Greg Claytonc5f728c2010-10-06 22:10:17 +0000200
201lldb::SBProcess
202SBTarget::AttachToProcess
203(
204 lldb::pid_t pid,// The process ID to attach to
205 SBError& error // An error explaining what went wrong if attach fails
206)
207{
208 SBProcess sb_process;
209 if (m_opaque_sp)
210 {
211 // DEPRECATED, this will change when CreateProcess is removed...
212 if (m_opaque_sp->GetProcessSP())
213 {
214 sb_process.SetProcess(m_opaque_sp->GetProcessSP());
215 }
216 else
217 {
218 // When launching, we always want to create a new process When
219 // SBTarget::CreateProcess is removed, this will always happen.
220 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
221 }
222
223 if (sb_process.IsValid())
224 {
225 error.SetError (sb_process->Attach (pid));
226 }
227 else
228 {
229 error.SetErrorString ("unable to create lldb_private::Process");
230 }
231 }
232 else
233 {
234 error.SetErrorString ("SBTarget is invalid");
235 }
236 return sb_process;
237
238}
239
240lldb::SBProcess
241SBTarget::AttachToProcess
242(
243 const char *name, // basename of process to attach to
244 bool wait_for, // if true wait for a new instance of "name" to be launched
245 SBError& error // An error explaining what went wrong if attach fails
246)
247{
248 SBProcess sb_process;
249 if (m_opaque_sp)
250 {
251 // DEPRECATED, this will change when CreateProcess is removed...
252 if (m_opaque_sp->GetProcessSP())
253 {
254 sb_process.SetProcess(m_opaque_sp->GetProcessSP());
255 }
256 else
257 {
258 // When launching, we always want to create a new process When
259 // SBTarget::CreateProcess is removed, this will always happen.
260 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
261 }
262
263 if (sb_process.IsValid())
264 {
265 error.SetError (sb_process->Attach (name, wait_for));
266 }
267 else
268 {
269 error.SetErrorString ("unable to create lldb_private::Process");
270 }
271 }
272 else
273 {
274 error.SetErrorString ("SBTarget is invalid");
275 }
276 return sb_process;
277
278}
279
Chris Lattner24943d22010-06-08 16:52:24 +0000280SBFileSpec
281SBTarget::GetExecutable ()
282{
283 SBFileSpec exe_file_spec;
Greg Clayton63094e02010-06-23 01:19:29 +0000284 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000285 {
Greg Clayton63094e02010-06-23 01:19:29 +0000286 ModuleSP exe_module_sp (m_opaque_sp->GetExecutableModule ());
Chris Lattner24943d22010-06-08 16:52:24 +0000287 if (exe_module_sp)
288 exe_file_spec.SetFileSpec (exe_module_sp->GetFileSpec());
289 }
290 return exe_file_spec;
291}
292
293
294bool
295SBTarget::DeleteTargetFromList (TargetList *list)
296{
Greg Clayton63094e02010-06-23 01:19:29 +0000297 if (m_opaque_sp)
298 return list->DeleteTarget (m_opaque_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000299 else
300 return false;
301}
302
303bool
Chris Lattner24943d22010-06-08 16:52:24 +0000304SBTarget::operator == (const SBTarget &rhs) const
305{
Greg Clayton63094e02010-06-23 01:19:29 +0000306 return m_opaque_sp.get() == rhs.m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000307}
308
309bool
310SBTarget::operator != (const SBTarget &rhs) const
311{
Greg Clayton63094e02010-06-23 01:19:29 +0000312 return m_opaque_sp.get() != rhs.m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000313}
314
315lldb_private::Target *
Greg Clayton63094e02010-06-23 01:19:29 +0000316SBTarget::operator ->() const
Chris Lattner24943d22010-06-08 16:52:24 +0000317{
Greg Clayton63094e02010-06-23 01:19:29 +0000318 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000319}
Greg Clayton63094e02010-06-23 01:19:29 +0000320
321lldb_private::Target *
322SBTarget::get() const
Chris Lattner24943d22010-06-08 16:52:24 +0000323{
Greg Clayton63094e02010-06-23 01:19:29 +0000324 return m_opaque_sp.get();
325}
326
327void
328SBTarget::reset (const lldb::TargetSP& target_sp)
329{
330 m_opaque_sp = target_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000331}
332
333SBBreakpoint
334SBTarget::BreakpointCreateByLocation (const char *file, uint32_t line)
335{
336 SBBreakpoint sb_bp;
337 if (file != NULL && line != 0)
338 sb_bp = BreakpointCreateByLocation (SBFileSpec (file), line);
339 return sb_bp;
340}
341
342SBBreakpoint
343SBTarget::BreakpointCreateByLocation (const SBFileSpec &sb_file_spec, uint32_t line)
344{
345 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000346 if (m_opaque_sp.get() && line != 0)
347 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, *sb_file_spec, line, true, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000348 return sb_bp;
349}
350
351SBBreakpoint
352SBTarget::BreakpointCreateByName (const char *symbol_name, const char *module_name)
353{
354 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000355 if (m_opaque_sp.get() && symbol_name && symbol_name[0])
Chris Lattner24943d22010-06-08 16:52:24 +0000356 {
357 if (module_name && module_name[0])
358 {
359 FileSpec module_file_spec(module_name);
Jim Ingham7ec03bd2010-09-30 21:21:43 +0000360 *sb_bp = m_opaque_sp->CreateBreakpoint (&module_file_spec, symbol_name, eFunctionNameTypeFull | eFunctionNameTypeBase, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000361 }
362 else
363 {
Jim Ingham7ec03bd2010-09-30 21:21:43 +0000364 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, symbol_name, eFunctionNameTypeFull | eFunctionNameTypeBase, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000365 }
366 }
367 return sb_bp;
368}
369
370SBBreakpoint
371SBTarget::BreakpointCreateByRegex (const char *symbol_name_regex, const char *module_name)
372{
373 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000374 if (m_opaque_sp.get() && symbol_name_regex && symbol_name_regex[0])
Chris Lattner24943d22010-06-08 16:52:24 +0000375 {
376 RegularExpression regexp(symbol_name_regex);
377
378 if (module_name && module_name[0])
379 {
380 FileSpec module_file_spec(module_name);
381
Greg Clayton63094e02010-06-23 01:19:29 +0000382 *sb_bp = m_opaque_sp->CreateBreakpoint (&module_file_spec, regexp, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000383 }
384 else
385 {
Greg Clayton63094e02010-06-23 01:19:29 +0000386 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, regexp, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000387 }
388 }
389 return sb_bp;
390}
391
392
393
394SBBreakpoint
395SBTarget::BreakpointCreateByAddress (addr_t address)
396{
397 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000398 if (m_opaque_sp.get())
399 *sb_bp = m_opaque_sp->CreateBreakpoint (address, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000400 return sb_bp;
401}
402
Chris Lattner24943d22010-06-08 16:52:24 +0000403SBBreakpoint
404SBTarget::FindBreakpointByID (break_id_t bp_id)
405{
406 SBBreakpoint sb_breakpoint;
Greg Clayton63094e02010-06-23 01:19:29 +0000407 if (m_opaque_sp && bp_id != LLDB_INVALID_BREAK_ID)
408 *sb_breakpoint = m_opaque_sp->GetBreakpointByID (bp_id);
Chris Lattner24943d22010-06-08 16:52:24 +0000409 return sb_breakpoint;
410}
411
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000412uint32_t
413SBTarget::GetNumBreakpoints () const
414{
415 if (m_opaque_sp)
416 return m_opaque_sp->GetBreakpointList().GetSize();
417 return 0;
418}
419
420SBBreakpoint
421SBTarget::GetBreakpointAtIndex (uint32_t idx) const
422{
423 SBBreakpoint sb_breakpoint;
424 if (m_opaque_sp)
425 *sb_breakpoint = m_opaque_sp->GetBreakpointList().GetBreakpointAtIndex(idx);
426 return sb_breakpoint;
427}
Chris Lattner24943d22010-06-08 16:52:24 +0000428
429bool
430SBTarget::BreakpointDelete (break_id_t bp_id)
431{
Greg Clayton63094e02010-06-23 01:19:29 +0000432 if (m_opaque_sp)
433 return m_opaque_sp->RemoveBreakpointByID (bp_id);
Chris Lattner24943d22010-06-08 16:52:24 +0000434 return false;
435}
436
437bool
438SBTarget::EnableAllBreakpoints ()
439{
Greg Clayton63094e02010-06-23 01:19:29 +0000440 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000441 {
Greg Clayton63094e02010-06-23 01:19:29 +0000442 m_opaque_sp->EnableAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000443 return true;
444 }
445 return false;
446}
447
448bool
449SBTarget::DisableAllBreakpoints ()
450{
Greg Clayton63094e02010-06-23 01:19:29 +0000451 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000452 {
Greg Clayton63094e02010-06-23 01:19:29 +0000453 m_opaque_sp->DisableAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000454 return true;
455 }
456 return false;
457}
458
459bool
460SBTarget::DeleteAllBreakpoints ()
461{
Greg Clayton63094e02010-06-23 01:19:29 +0000462 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000463 {
Greg Clayton63094e02010-06-23 01:19:29 +0000464 m_opaque_sp->RemoveAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000465 return true;
466 }
467 return false;
468}
469
470
471uint32_t
472SBTarget::GetNumModules () const
473{
Greg Clayton63094e02010-06-23 01:19:29 +0000474 if (m_opaque_sp)
475 return m_opaque_sp->GetImages().GetSize();
Chris Lattner24943d22010-06-08 16:52:24 +0000476 return 0;
477}
478
Greg Clayton43490d12010-07-30 20:12:55 +0000479void
480SBTarget::Clear ()
481{
482 m_opaque_sp.reset();
483}
484
485
Chris Lattner24943d22010-06-08 16:52:24 +0000486SBModule
487SBTarget::FindModule (const SBFileSpec &sb_file_spec)
488{
489 SBModule sb_module;
Greg Clayton63094e02010-06-23 01:19:29 +0000490 if (m_opaque_sp && sb_file_spec.IsValid())
491 sb_module.SetModule (m_opaque_sp->GetImages().FindFirstModuleForFileSpec (*sb_file_spec, NULL));
Chris Lattner24943d22010-06-08 16:52:24 +0000492 return sb_module;
493}
494
495SBModule
496SBTarget::GetModuleAtIndex (uint32_t idx)
497{
498 SBModule sb_module;
Greg Clayton63094e02010-06-23 01:19:29 +0000499 if (m_opaque_sp)
500 sb_module.SetModule(m_opaque_sp->GetImages().GetModuleAtIndex(idx));
Chris Lattner24943d22010-06-08 16:52:24 +0000501 return sb_module;
502}
503
504
505SBBroadcaster
506SBTarget::GetBroadcaster () const
507{
Greg Clayton63094e02010-06-23 01:19:29 +0000508 SBBroadcaster broadcaster(m_opaque_sp.get(), false);
Chris Lattner24943d22010-06-08 16:52:24 +0000509 return broadcaster;
510}
511
512void
Greg Clayton70436352010-06-30 23:03:03 +0000513SBTarget::Disassemble (lldb::addr_t start_addr, lldb::addr_t end_addr, const char *module_name)
Chris Lattner24943d22010-06-08 16:52:24 +0000514{
Greg Clayton70436352010-06-30 23:03:03 +0000515 if (start_addr == LLDB_INVALID_ADDRESS)
Chris Lattner24943d22010-06-08 16:52:24 +0000516 return;
517
Greg Clayton63094e02010-06-23 01:19:29 +0000518 FILE *out = m_opaque_sp->GetDebugger().GetOutputFileHandle();
Chris Lattner24943d22010-06-08 16:52:24 +0000519 if (out == NULL)
520 return;
521
Greg Clayton63094e02010-06-23 01:19:29 +0000522 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000523 {
Greg Clayton70436352010-06-30 23:03:03 +0000524 ModuleSP module_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000525 if (module_name != NULL)
526 {
Greg Clayton70436352010-06-30 23:03:03 +0000527 FileSpec module_file_spec (module_name);
528 module_sp = m_opaque_sp->GetImages().FindFirstModuleForFileSpec (module_file_spec, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000529 }
Greg Clayton70436352010-06-30 23:03:03 +0000530
531 AddressRange range;
532
533 // Make sure the process object is alive if we have one (it might be
534 // created but we might not be launched yet).
Greg Claytoneea26402010-09-14 23:36:40 +0000535
Greg Clayton1a3083a2010-10-06 03:53:16 +0000536 Process *sb_process = m_opaque_sp->GetProcessSP().get();
537 if (sb_process && !sb_process->IsAlive())
538 sb_process = NULL;
Greg Clayton70436352010-06-30 23:03:03 +0000539
540 // If we are given a module, then "start_addr" is a file address in
541 // that module.
542 if (module_sp)
543 {
544 if (!module_sp->ResolveFileAddress (start_addr, range.GetBaseAddress()))
545 range.GetBaseAddress().SetOffset(start_addr);
546 }
Greg Claytoneea26402010-09-14 23:36:40 +0000547 else if (m_opaque_sp->GetSectionLoadList().IsEmpty() == false)
Greg Clayton70436352010-06-30 23:03:03 +0000548 {
549 // We don't have a module, se we need to figure out if "start_addr"
550 // resolves to anything in a running process.
Greg Claytoneea26402010-09-14 23:36:40 +0000551 if (!m_opaque_sp->GetSectionLoadList().ResolveLoadAddress (start_addr, range.GetBaseAddress()))
Greg Clayton70436352010-06-30 23:03:03 +0000552 range.GetBaseAddress().SetOffset(start_addr);
553 }
554 else
555 {
556 if (m_opaque_sp->GetImages().ResolveFileAddress (start_addr, range.GetBaseAddress()))
557 range.GetBaseAddress().SetOffset(start_addr);
558 }
Chris Lattner24943d22010-06-08 16:52:24 +0000559
560 // For now, we need a process; the disassembly functions insist. If we don't have one already,
561 // make one.
562
Greg Clayton70436352010-06-30 23:03:03 +0000563 ExecutionContext exe_ctx;
Chris Lattner24943d22010-06-08 16:52:24 +0000564
Greg Clayton1a3083a2010-10-06 03:53:16 +0000565 if (sb_process)
566 sb_process->CalculateExecutionContext(exe_ctx);
Greg Clayton70436352010-06-30 23:03:03 +0000567 else
Greg Claytona830adb2010-10-04 01:05:56 +0000568 m_opaque_sp->CalculateExecutionContext(exe_ctx);
Chris Lattner24943d22010-06-08 16:52:24 +0000569
Greg Clayton70436352010-06-30 23:03:03 +0000570 if (end_addr == LLDB_INVALID_ADDRESS || end_addr < start_addr)
571 range.SetByteSize( DEFAULT_DISASM_BYTE_SIZE);
572 else
573 range.SetByteSize(end_addr - start_addr);
Chris Lattner24943d22010-06-08 16:52:24 +0000574
Greg Clayton70436352010-06-30 23:03:03 +0000575 StreamFile out_stream (out);
Chris Lattner24943d22010-06-08 16:52:24 +0000576
Greg Clayton70436352010-06-30 23:03:03 +0000577 Disassembler::Disassemble (m_opaque_sp->GetDebugger(),
578 m_opaque_sp->GetArchitecture(),
579 exe_ctx,
580 range,
581 3,
582 false,
583 out_stream);
Chris Lattner24943d22010-06-08 16:52:24 +0000584 }
585}
586
587void
588SBTarget::Disassemble (const char *function_name, const char *module_name)
589{
590 if (function_name == NULL)
591 return;
592
Greg Clayton63094e02010-06-23 01:19:29 +0000593 FILE *out = m_opaque_sp->GetDebugger().GetOutputFileHandle();
Chris Lattner24943d22010-06-08 16:52:24 +0000594 if (out == NULL)
595 return;
596
Greg Clayton63094e02010-06-23 01:19:29 +0000597 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000598 {
Greg Clayton70436352010-06-30 23:03:03 +0000599 Disassembler *disassembler = Disassembler::FindPlugin (m_opaque_sp->GetArchitecture());
Chris Lattner24943d22010-06-08 16:52:24 +0000600 if (disassembler == NULL)
601 return;
602
Greg Clayton70436352010-06-30 23:03:03 +0000603 ModuleSP module_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000604 if (module_name != NULL)
Chris Lattner24943d22010-06-08 16:52:24 +0000605 {
Greg Clayton70436352010-06-30 23:03:03 +0000606 FileSpec module_file_spec (module_name);
607 module_sp = m_opaque_sp->GetImages().FindFirstModuleForFileSpec (module_file_spec, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000608 }
Greg Clayton70436352010-06-30 23:03:03 +0000609
610 ExecutionContext exe_ctx;
611
612 // Make sure the process object is alive if we have one (it might be
613 // created but we might not be launched yet).
Greg Clayton1a3083a2010-10-06 03:53:16 +0000614 Process *sb_process = m_opaque_sp->GetProcessSP().get();
615 if (sb_process && !sb_process->IsAlive())
616 sb_process = NULL;
Greg Clayton70436352010-06-30 23:03:03 +0000617
Greg Clayton1a3083a2010-10-06 03:53:16 +0000618 if (sb_process)
619 sb_process->CalculateExecutionContext(exe_ctx);
Greg Clayton70436352010-06-30 23:03:03 +0000620 else
Greg Claytona830adb2010-10-04 01:05:56 +0000621 m_opaque_sp->CalculateExecutionContext(exe_ctx);
Greg Clayton70436352010-06-30 23:03:03 +0000622
623
624 StreamFile out_stream (out);
625
626 Disassembler::Disassemble (m_opaque_sp->GetDebugger(),
627 m_opaque_sp->GetArchitecture(),
628 exe_ctx,
629 ConstString (function_name),
630 module_sp.get(),
631 3,
632 false,
633 out_stream);
Chris Lattner24943d22010-06-08 16:52:24 +0000634 }
635}
Caroline Tice98f930f2010-09-20 05:20:02 +0000636
637bool
638SBTarget::GetDescription (SBStream &description)
639{
640 if (m_opaque_sp)
Caroline Ticee7a566e2010-09-20 16:21:41 +0000641 {
Caroline Ticee49ec182010-09-22 23:01:29 +0000642 description.ref();
Caroline Tice98f930f2010-09-20 05:20:02 +0000643 m_opaque_sp->Dump (description.get());
Caroline Ticee7a566e2010-09-20 16:21:41 +0000644 }
Caroline Tice98f930f2010-09-20 05:20:02 +0000645 else
646 description.Printf ("No value");
647
648 return true;
649}