blob: 9b78220567b6c1bd92d9cb6c111e06abec8cfd8c [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
Greg Claytonc5f728c2010-10-06 22:10:17 +0000122SBProcess
123SBTarget::LaunchProcess
124(
125 char const **argv,
126 char const **envp,
127 const char *tty,
128 uint32_t launch_flags,
Greg Claytond8c62532010-10-07 04:19:01 +0000129 bool stop_at_entry
130)
131{
132 SBError sb_error;
133 return Launch (argv, envp, tty, launch_flags, stop_at_entry, sb_error);
134}
135
136SBProcess
137SBTarget::Launch
138(
139 char const **argv,
140 char const **envp,
141 const char *tty,
142 uint32_t launch_flags,
Greg Claytonc5f728c2010-10-06 22:10:17 +0000143 bool stop_at_entry,
144 SBError &error
145)
146{
Greg Clayton1a3083a2010-10-06 03:53:16 +0000147 SBProcess sb_process;
148 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000149 {
Greg Clayton992ce262010-10-06 18:44:26 +0000150 // DEPRECATED, this will change when CreateProcess is removed...
151 if (m_opaque_sp->GetProcessSP())
152 {
153 sb_process.SetProcess(m_opaque_sp->GetProcessSP());
154 }
155 else
156 {
157 // When launching, we always want to create a new process When
158 // SBTarget::CreateProcess is removed, this will always happen.
159 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
160 }
Greg Clayton1a3083a2010-10-06 03:53:16 +0000161
162 if (sb_process.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000163 {
Greg Claytonc5f728c2010-10-06 22:10:17 +0000164 error.SetError (sb_process->Launch (argv, envp, launch_flags, tty, tty, tty));
Greg Clayton1a3083a2010-10-06 03:53:16 +0000165 if (error.Success())
Chris Lattner24943d22010-06-08 16:52:24 +0000166 {
Sean Callanan451ee7c2010-10-07 22:51:14 +0000167 // We we are stopping at the entry point, we can return now!
168 if (stop_at_entry)
169 return sb_process;
170
Greg Clayton1a3083a2010-10-06 03:53:16 +0000171 // Make sure we are stopped at the entry
172 StateType state = sb_process->WaitForProcessToStop (NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000173 if (state == eStateStopped)
Greg Clayton1a3083a2010-10-06 03:53:16 +0000174 {
175 // resume the process to skip the entry point
Greg Claytonc5f728c2010-10-06 22:10:17 +0000176 error.SetError (sb_process->Resume());
Greg Clayton1a3083a2010-10-06 03:53:16 +0000177 if (error.Success())
178 {
179 // If we are doing synchronous mode, then wait for the
180 // process to stop yet again!
181 if (m_opaque_sp->GetDebugger().GetAsyncExecution () == false)
182 sb_process->WaitForProcessToStop (NULL);
183 }
184 }
Chris Lattner24943d22010-06-08 16:52:24 +0000185 }
186 }
Greg Claytonc5f728c2010-10-06 22:10:17 +0000187 else
188 {
189 error.SetErrorString ("unable to create lldb_private::Process");
190 }
191 }
192 else
193 {
194 error.SetErrorString ("SBTarget is invalid");
Chris Lattner24943d22010-06-08 16:52:24 +0000195 }
Greg Clayton1a3083a2010-10-06 03:53:16 +0000196 return sb_process;
Chris Lattner24943d22010-06-08 16:52:24 +0000197}
198
Greg Claytonc5f728c2010-10-06 22:10:17 +0000199
200lldb::SBProcess
Greg Claytond8c62532010-10-07 04:19:01 +0000201SBTarget::AttachToProcessWithID
Greg Claytonc5f728c2010-10-06 22:10:17 +0000202(
203 lldb::pid_t pid,// The process ID to attach to
204 SBError& error // An error explaining what went wrong if attach fails
205)
206{
207 SBProcess sb_process;
208 if (m_opaque_sp)
209 {
210 // DEPRECATED, this will change when CreateProcess is removed...
211 if (m_opaque_sp->GetProcessSP())
212 {
213 sb_process.SetProcess(m_opaque_sp->GetProcessSP());
214 }
215 else
216 {
217 // When launching, we always want to create a new process When
218 // SBTarget::CreateProcess is removed, this will always happen.
219 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
220 }
221
222 if (sb_process.IsValid())
223 {
224 error.SetError (sb_process->Attach (pid));
225 }
226 else
227 {
228 error.SetErrorString ("unable to create lldb_private::Process");
229 }
230 }
231 else
232 {
233 error.SetErrorString ("SBTarget is invalid");
234 }
235 return sb_process;
236
237}
238
239lldb::SBProcess
Greg Claytond8c62532010-10-07 04:19:01 +0000240SBTarget::AttachToProcessWithName
Greg Claytonc5f728c2010-10-06 22:10:17 +0000241(
242 const char *name, // basename of process to attach to
243 bool wait_for, // if true wait for a new instance of "name" to be launched
244 SBError& error // An error explaining what went wrong if attach fails
245)
246{
247 SBProcess sb_process;
248 if (m_opaque_sp)
249 {
250 // DEPRECATED, this will change when CreateProcess is removed...
251 if (m_opaque_sp->GetProcessSP())
252 {
253 sb_process.SetProcess(m_opaque_sp->GetProcessSP());
254 }
255 else
256 {
257 // When launching, we always want to create a new process When
258 // SBTarget::CreateProcess is removed, this will always happen.
259 sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener()));
260 }
261
262 if (sb_process.IsValid())
263 {
264 error.SetError (sb_process->Attach (name, wait_for));
265 }
266 else
267 {
268 error.SetErrorString ("unable to create lldb_private::Process");
269 }
270 }
271 else
272 {
273 error.SetErrorString ("SBTarget is invalid");
274 }
275 return sb_process;
276
277}
278
Chris Lattner24943d22010-06-08 16:52:24 +0000279SBFileSpec
280SBTarget::GetExecutable ()
281{
282 SBFileSpec exe_file_spec;
Greg Clayton63094e02010-06-23 01:19:29 +0000283 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000284 {
Greg Clayton63094e02010-06-23 01:19:29 +0000285 ModuleSP exe_module_sp (m_opaque_sp->GetExecutableModule ());
Chris Lattner24943d22010-06-08 16:52:24 +0000286 if (exe_module_sp)
287 exe_file_spec.SetFileSpec (exe_module_sp->GetFileSpec());
288 }
289 return exe_file_spec;
290}
291
292
293bool
294SBTarget::DeleteTargetFromList (TargetList *list)
295{
Greg Clayton63094e02010-06-23 01:19:29 +0000296 if (m_opaque_sp)
297 return list->DeleteTarget (m_opaque_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000298 else
299 return false;
300}
301
302bool
Chris Lattner24943d22010-06-08 16:52:24 +0000303SBTarget::operator == (const SBTarget &rhs) const
304{
Greg Clayton63094e02010-06-23 01:19:29 +0000305 return m_opaque_sp.get() == rhs.m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000306}
307
308bool
309SBTarget::operator != (const SBTarget &rhs) const
310{
Greg Clayton63094e02010-06-23 01:19:29 +0000311 return m_opaque_sp.get() != rhs.m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000312}
313
314lldb_private::Target *
Greg Clayton63094e02010-06-23 01:19:29 +0000315SBTarget::operator ->() const
Chris Lattner24943d22010-06-08 16:52:24 +0000316{
Greg Clayton63094e02010-06-23 01:19:29 +0000317 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000318}
Greg Clayton63094e02010-06-23 01:19:29 +0000319
320lldb_private::Target *
321SBTarget::get() const
Chris Lattner24943d22010-06-08 16:52:24 +0000322{
Greg Clayton63094e02010-06-23 01:19:29 +0000323 return m_opaque_sp.get();
324}
325
326void
327SBTarget::reset (const lldb::TargetSP& target_sp)
328{
329 m_opaque_sp = target_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000330}
331
332SBBreakpoint
333SBTarget::BreakpointCreateByLocation (const char *file, uint32_t line)
334{
335 SBBreakpoint sb_bp;
336 if (file != NULL && line != 0)
337 sb_bp = BreakpointCreateByLocation (SBFileSpec (file), line);
338 return sb_bp;
339}
340
341SBBreakpoint
342SBTarget::BreakpointCreateByLocation (const SBFileSpec &sb_file_spec, uint32_t line)
343{
344 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000345 if (m_opaque_sp.get() && line != 0)
346 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, *sb_file_spec, line, true, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000347 return sb_bp;
348}
349
350SBBreakpoint
351SBTarget::BreakpointCreateByName (const char *symbol_name, const char *module_name)
352{
353 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000354 if (m_opaque_sp.get() && symbol_name && symbol_name[0])
Chris Lattner24943d22010-06-08 16:52:24 +0000355 {
356 if (module_name && module_name[0])
357 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000358 FileSpec module_file_spec(module_name, false);
Jim Ingham7ec03bd2010-09-30 21:21:43 +0000359 *sb_bp = m_opaque_sp->CreateBreakpoint (&module_file_spec, symbol_name, eFunctionNameTypeFull | eFunctionNameTypeBase, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000360 }
361 else
362 {
Jim Ingham7ec03bd2010-09-30 21:21:43 +0000363 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, symbol_name, eFunctionNameTypeFull | eFunctionNameTypeBase, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000364 }
365 }
366 return sb_bp;
367}
368
369SBBreakpoint
370SBTarget::BreakpointCreateByRegex (const char *symbol_name_regex, const char *module_name)
371{
372 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000373 if (m_opaque_sp.get() && symbol_name_regex && symbol_name_regex[0])
Chris Lattner24943d22010-06-08 16:52:24 +0000374 {
375 RegularExpression regexp(symbol_name_regex);
376
377 if (module_name && module_name[0])
378 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000379 FileSpec module_file_spec(module_name, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000380
Greg Clayton63094e02010-06-23 01:19:29 +0000381 *sb_bp = m_opaque_sp->CreateBreakpoint (&module_file_spec, regexp, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000382 }
383 else
384 {
Greg Clayton63094e02010-06-23 01:19:29 +0000385 *sb_bp = m_opaque_sp->CreateBreakpoint (NULL, regexp, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000386 }
387 }
388 return sb_bp;
389}
390
391
392
393SBBreakpoint
394SBTarget::BreakpointCreateByAddress (addr_t address)
395{
396 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000397 if (m_opaque_sp.get())
398 *sb_bp = m_opaque_sp->CreateBreakpoint (address, false);
Chris Lattner24943d22010-06-08 16:52:24 +0000399 return sb_bp;
400}
401
Chris Lattner24943d22010-06-08 16:52:24 +0000402SBBreakpoint
403SBTarget::FindBreakpointByID (break_id_t bp_id)
404{
405 SBBreakpoint sb_breakpoint;
Greg Clayton63094e02010-06-23 01:19:29 +0000406 if (m_opaque_sp && bp_id != LLDB_INVALID_BREAK_ID)
407 *sb_breakpoint = m_opaque_sp->GetBreakpointByID (bp_id);
Chris Lattner24943d22010-06-08 16:52:24 +0000408 return sb_breakpoint;
409}
410
Greg Claytonc7f5d5c2010-07-23 23:33:17 +0000411uint32_t
412SBTarget::GetNumBreakpoints () const
413{
414 if (m_opaque_sp)
415 return m_opaque_sp->GetBreakpointList().GetSize();
416 return 0;
417}
418
419SBBreakpoint
420SBTarget::GetBreakpointAtIndex (uint32_t idx) const
421{
422 SBBreakpoint sb_breakpoint;
423 if (m_opaque_sp)
424 *sb_breakpoint = m_opaque_sp->GetBreakpointList().GetBreakpointAtIndex(idx);
425 return sb_breakpoint;
426}
Chris Lattner24943d22010-06-08 16:52:24 +0000427
428bool
429SBTarget::BreakpointDelete (break_id_t bp_id)
430{
Greg Clayton63094e02010-06-23 01:19:29 +0000431 if (m_opaque_sp)
432 return m_opaque_sp->RemoveBreakpointByID (bp_id);
Chris Lattner24943d22010-06-08 16:52:24 +0000433 return false;
434}
435
436bool
437SBTarget::EnableAllBreakpoints ()
438{
Greg Clayton63094e02010-06-23 01:19:29 +0000439 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000440 {
Greg Clayton63094e02010-06-23 01:19:29 +0000441 m_opaque_sp->EnableAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000442 return true;
443 }
444 return false;
445}
446
447bool
448SBTarget::DisableAllBreakpoints ()
449{
Greg Clayton63094e02010-06-23 01:19:29 +0000450 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000451 {
Greg Clayton63094e02010-06-23 01:19:29 +0000452 m_opaque_sp->DisableAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000453 return true;
454 }
455 return false;
456}
457
458bool
459SBTarget::DeleteAllBreakpoints ()
460{
Greg Clayton63094e02010-06-23 01:19:29 +0000461 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000462 {
Greg Clayton63094e02010-06-23 01:19:29 +0000463 m_opaque_sp->RemoveAllBreakpoints ();
Chris Lattner24943d22010-06-08 16:52:24 +0000464 return true;
465 }
466 return false;
467}
468
469
470uint32_t
471SBTarget::GetNumModules () const
472{
Greg Clayton63094e02010-06-23 01:19:29 +0000473 if (m_opaque_sp)
474 return m_opaque_sp->GetImages().GetSize();
Chris Lattner24943d22010-06-08 16:52:24 +0000475 return 0;
476}
477
Greg Clayton43490d12010-07-30 20:12:55 +0000478void
479SBTarget::Clear ()
480{
481 m_opaque_sp.reset();
482}
483
484
Chris Lattner24943d22010-06-08 16:52:24 +0000485SBModule
486SBTarget::FindModule (const SBFileSpec &sb_file_spec)
487{
488 SBModule sb_module;
Greg Clayton63094e02010-06-23 01:19:29 +0000489 if (m_opaque_sp && sb_file_spec.IsValid())
490 sb_module.SetModule (m_opaque_sp->GetImages().FindFirstModuleForFileSpec (*sb_file_spec, NULL));
Chris Lattner24943d22010-06-08 16:52:24 +0000491 return sb_module;
492}
493
494SBModule
495SBTarget::GetModuleAtIndex (uint32_t idx)
496{
497 SBModule sb_module;
Greg Clayton63094e02010-06-23 01:19:29 +0000498 if (m_opaque_sp)
499 sb_module.SetModule(m_opaque_sp->GetImages().GetModuleAtIndex(idx));
Chris Lattner24943d22010-06-08 16:52:24 +0000500 return sb_module;
501}
502
503
504SBBroadcaster
505SBTarget::GetBroadcaster () const
506{
Greg Clayton63094e02010-06-23 01:19:29 +0000507 SBBroadcaster broadcaster(m_opaque_sp.get(), false);
Chris Lattner24943d22010-06-08 16:52:24 +0000508 return broadcaster;
509}
510
511void
Greg Clayton70436352010-06-30 23:03:03 +0000512SBTarget::Disassemble (lldb::addr_t start_addr, lldb::addr_t end_addr, const char *module_name)
Chris Lattner24943d22010-06-08 16:52:24 +0000513{
Greg Clayton70436352010-06-30 23:03:03 +0000514 if (start_addr == LLDB_INVALID_ADDRESS)
Chris Lattner24943d22010-06-08 16:52:24 +0000515 return;
516
Greg Clayton63094e02010-06-23 01:19:29 +0000517 FILE *out = m_opaque_sp->GetDebugger().GetOutputFileHandle();
Chris Lattner24943d22010-06-08 16:52:24 +0000518 if (out == NULL)
519 return;
520
Greg Clayton63094e02010-06-23 01:19:29 +0000521 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000522 {
Greg Clayton70436352010-06-30 23:03:03 +0000523 ModuleSP module_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000524 if (module_name != NULL)
525 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000526 FileSpec module_file_spec (module_name, false);
Greg Clayton70436352010-06-30 23:03:03 +0000527 module_sp = m_opaque_sp->GetImages().FindFirstModuleForFileSpec (module_file_spec, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000528 }
Greg Clayton70436352010-06-30 23:03:03 +0000529
530 AddressRange range;
531
532 // Make sure the process object is alive if we have one (it might be
533 // created but we might not be launched yet).
Greg Claytoneea26402010-09-14 23:36:40 +0000534
Greg Clayton1a3083a2010-10-06 03:53:16 +0000535 Process *sb_process = m_opaque_sp->GetProcessSP().get();
536 if (sb_process && !sb_process->IsAlive())
537 sb_process = NULL;
Greg Clayton70436352010-06-30 23:03:03 +0000538
539 // If we are given a module, then "start_addr" is a file address in
540 // that module.
541 if (module_sp)
542 {
543 if (!module_sp->ResolveFileAddress (start_addr, range.GetBaseAddress()))
544 range.GetBaseAddress().SetOffset(start_addr);
545 }
Greg Claytoneea26402010-09-14 23:36:40 +0000546 else if (m_opaque_sp->GetSectionLoadList().IsEmpty() == false)
Greg Clayton70436352010-06-30 23:03:03 +0000547 {
548 // We don't have a module, se we need to figure out if "start_addr"
549 // resolves to anything in a running process.
Greg Claytoneea26402010-09-14 23:36:40 +0000550 if (!m_opaque_sp->GetSectionLoadList().ResolveLoadAddress (start_addr, range.GetBaseAddress()))
Greg Clayton70436352010-06-30 23:03:03 +0000551 range.GetBaseAddress().SetOffset(start_addr);
552 }
553 else
554 {
555 if (m_opaque_sp->GetImages().ResolveFileAddress (start_addr, range.GetBaseAddress()))
556 range.GetBaseAddress().SetOffset(start_addr);
557 }
Chris Lattner24943d22010-06-08 16:52:24 +0000558
559 // For now, we need a process; the disassembly functions insist. If we don't have one already,
560 // make one.
561
Greg Clayton70436352010-06-30 23:03:03 +0000562 ExecutionContext exe_ctx;
Chris Lattner24943d22010-06-08 16:52:24 +0000563
Greg Clayton1a3083a2010-10-06 03:53:16 +0000564 if (sb_process)
565 sb_process->CalculateExecutionContext(exe_ctx);
Greg Clayton70436352010-06-30 23:03:03 +0000566 else
Greg Claytona830adb2010-10-04 01:05:56 +0000567 m_opaque_sp->CalculateExecutionContext(exe_ctx);
Chris Lattner24943d22010-06-08 16:52:24 +0000568
Greg Clayton70436352010-06-30 23:03:03 +0000569 if (end_addr == LLDB_INVALID_ADDRESS || end_addr < start_addr)
570 range.SetByteSize( DEFAULT_DISASM_BYTE_SIZE);
571 else
572 range.SetByteSize(end_addr - start_addr);
Chris Lattner24943d22010-06-08 16:52:24 +0000573
Greg Clayton70436352010-06-30 23:03:03 +0000574 StreamFile out_stream (out);
Chris Lattner24943d22010-06-08 16:52:24 +0000575
Greg Clayton70436352010-06-30 23:03:03 +0000576 Disassembler::Disassemble (m_opaque_sp->GetDebugger(),
577 m_opaque_sp->GetArchitecture(),
578 exe_ctx,
579 range,
580 3,
581 false,
582 out_stream);
Chris Lattner24943d22010-06-08 16:52:24 +0000583 }
584}
585
586void
587SBTarget::Disassemble (const char *function_name, const char *module_name)
588{
589 if (function_name == NULL)
590 return;
591
Greg Clayton63094e02010-06-23 01:19:29 +0000592 FILE *out = m_opaque_sp->GetDebugger().GetOutputFileHandle();
Chris Lattner24943d22010-06-08 16:52:24 +0000593 if (out == NULL)
594 return;
595
Greg Clayton63094e02010-06-23 01:19:29 +0000596 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000597 {
Greg Clayton70436352010-06-30 23:03:03 +0000598 Disassembler *disassembler = Disassembler::FindPlugin (m_opaque_sp->GetArchitecture());
Chris Lattner24943d22010-06-08 16:52:24 +0000599 if (disassembler == NULL)
600 return;
601
Greg Clayton70436352010-06-30 23:03:03 +0000602 ModuleSP module_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000603 if (module_name != NULL)
Chris Lattner24943d22010-06-08 16:52:24 +0000604 {
Greg Clayton537a7a82010-10-20 20:54:39 +0000605 FileSpec module_file_spec (module_name, false);
Greg Clayton70436352010-06-30 23:03:03 +0000606 module_sp = m_opaque_sp->GetImages().FindFirstModuleForFileSpec (module_file_spec, NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000607 }
Greg Clayton70436352010-06-30 23:03:03 +0000608
609 ExecutionContext exe_ctx;
610
611 // Make sure the process object is alive if we have one (it might be
612 // created but we might not be launched yet).
Greg Clayton1a3083a2010-10-06 03:53:16 +0000613 Process *sb_process = m_opaque_sp->GetProcessSP().get();
614 if (sb_process && !sb_process->IsAlive())
615 sb_process = NULL;
Greg Clayton70436352010-06-30 23:03:03 +0000616
Greg Clayton1a3083a2010-10-06 03:53:16 +0000617 if (sb_process)
618 sb_process->CalculateExecutionContext(exe_ctx);
Greg Clayton70436352010-06-30 23:03:03 +0000619 else
Greg Claytona830adb2010-10-04 01:05:56 +0000620 m_opaque_sp->CalculateExecutionContext(exe_ctx);
Greg Clayton70436352010-06-30 23:03:03 +0000621
622
623 StreamFile out_stream (out);
624
625 Disassembler::Disassemble (m_opaque_sp->GetDebugger(),
626 m_opaque_sp->GetArchitecture(),
627 exe_ctx,
628 ConstString (function_name),
629 module_sp.get(),
630 3,
631 false,
632 out_stream);
Chris Lattner24943d22010-06-08 16:52:24 +0000633 }
634}
Caroline Tice98f930f2010-09-20 05:20:02 +0000635
636bool
637SBTarget::GetDescription (SBStream &description)
638{
639 if (m_opaque_sp)
Caroline Ticee7a566e2010-09-20 16:21:41 +0000640 {
Caroline Ticee49ec182010-09-22 23:01:29 +0000641 description.ref();
Caroline Tice98f930f2010-09-20 05:20:02 +0000642 m_opaque_sp->Dump (description.get());
Caroline Ticee7a566e2010-09-20 16:21:41 +0000643 }
Caroline Tice98f930f2010-09-20 05:20:02 +0000644 else
645 description.Printf ("No value");
646
647 return true;
648}