130fdc8d8SChris Lattner //===-- Disassembler.cpp ----------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
330fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
430fdc8d8SChris Lattner //
530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
630fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
730fdc8d8SChris Lattner //
830fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
930fdc8d8SChris Lattner 
1030fdc8d8SChris Lattner #include "lldb/Core/Disassembler.h"
1130fdc8d8SChris Lattner 
1230fdc8d8SChris Lattner // C Includes
1330fdc8d8SChris Lattner // C++ Includes
1430fdc8d8SChris Lattner // Other libraries and framework includes
1530fdc8d8SChris Lattner // Project includes
1630fdc8d8SChris Lattner #include "lldb/lldb-private.h"
1730fdc8d8SChris Lattner #include "lldb/Core/Error.h"
1830fdc8d8SChris Lattner #include "lldb/Core/DataBufferHeap.h"
1930fdc8d8SChris Lattner #include "lldb/Core/DataExtractor.h"
2030fdc8d8SChris Lattner #include "lldb/Core/Debugger.h"
2130fdc8d8SChris Lattner #include "lldb/Core/Module.h"
2230fdc8d8SChris Lattner #include "lldb/Core/PluginManager.h"
2330fdc8d8SChris Lattner #include "lldb/Core/Timer.h"
2430fdc8d8SChris Lattner #include "lldb/Symbol/ObjectFile.h"
2530fdc8d8SChris Lattner #include "lldb/Target/ExecutionContext.h"
2630fdc8d8SChris Lattner #include "lldb/Target/Process.h"
2730fdc8d8SChris Lattner #include "lldb/Target/StackFrame.h"
2830fdc8d8SChris Lattner #include "lldb/Target/Target.h"
2930fdc8d8SChris Lattner 
3030fdc8d8SChris Lattner #define DEFAULT_DISASM_BYTE_SIZE 32
3130fdc8d8SChris Lattner 
3230fdc8d8SChris Lattner using namespace lldb;
3330fdc8d8SChris Lattner using namespace lldb_private;
3430fdc8d8SChris Lattner 
3530fdc8d8SChris Lattner 
3630fdc8d8SChris Lattner Disassembler*
3730fdc8d8SChris Lattner Disassembler::FindPlugin (const ArchSpec &arch)
3830fdc8d8SChris Lattner {
3930fdc8d8SChris Lattner     Timer scoped_timer (__PRETTY_FUNCTION__,
4030fdc8d8SChris Lattner                         "Disassembler::FindPlugin (arch = %s)",
4130fdc8d8SChris Lattner                         arch.AsCString());
4230fdc8d8SChris Lattner 
4330fdc8d8SChris Lattner     std::auto_ptr<Disassembler> disassembler_ap;
4430fdc8d8SChris Lattner     DisassemblerCreateInstance create_callback;
4530fdc8d8SChris Lattner     for (uint32_t idx = 0; (create_callback = PluginManager::GetDisassemblerCreateCallbackAtIndex(idx)) != NULL; ++idx)
4630fdc8d8SChris Lattner     {
4730fdc8d8SChris Lattner         disassembler_ap.reset (create_callback(arch));
4830fdc8d8SChris Lattner 
4930fdc8d8SChris Lattner         if (disassembler_ap.get())
5030fdc8d8SChris Lattner             return disassembler_ap.release();
5130fdc8d8SChris Lattner     }
5230fdc8d8SChris Lattner     return NULL;
5330fdc8d8SChris Lattner }
5430fdc8d8SChris Lattner 
55dda4f7b5SGreg Clayton 
56dda4f7b5SGreg Clayton 
57dda4f7b5SGreg Clayton size_t
58dda4f7b5SGreg Clayton Disassembler::Disassemble
59dda4f7b5SGreg Clayton (
60dda4f7b5SGreg Clayton     Debugger &debugger,
61dda4f7b5SGreg Clayton     const ArchSpec &arch,
62dda4f7b5SGreg Clayton     const ExecutionContext &exe_ctx,
63dda4f7b5SGreg Clayton     SymbolContextList &sc_list,
64dda4f7b5SGreg Clayton     uint32_t num_mixed_context_lines,
65dda4f7b5SGreg Clayton     bool show_bytes,
66dda4f7b5SGreg Clayton     Stream &strm
67dda4f7b5SGreg Clayton )
68dda4f7b5SGreg Clayton {
69dda4f7b5SGreg Clayton     size_t success_count = 0;
70dda4f7b5SGreg Clayton     const size_t count = sc_list.GetSize();
71dda4f7b5SGreg Clayton     SymbolContext sc;
72dda4f7b5SGreg Clayton     AddressRange range;
73dda4f7b5SGreg Clayton     for (size_t i=0; i<count; ++i)
74dda4f7b5SGreg Clayton     {
75dda4f7b5SGreg Clayton         if (sc_list.GetContextAtIndex(i, sc) == false)
76dda4f7b5SGreg Clayton             break;
77dda4f7b5SGreg Clayton         if (sc.GetAddressRange(eSymbolContextFunction | eSymbolContextSymbol, range))
78dda4f7b5SGreg Clayton         {
79dda4f7b5SGreg Clayton             if (Disassemble (debugger, arch, exe_ctx, range, num_mixed_context_lines, show_bytes, strm))
80dda4f7b5SGreg Clayton             {
81dda4f7b5SGreg Clayton                 ++success_count;
82dda4f7b5SGreg Clayton                 strm.EOL();
83dda4f7b5SGreg Clayton             }
84dda4f7b5SGreg Clayton         }
85dda4f7b5SGreg Clayton     }
86dda4f7b5SGreg Clayton     return success_count;
87dda4f7b5SGreg Clayton }
88dda4f7b5SGreg Clayton 
8930fdc8d8SChris Lattner bool
9030fdc8d8SChris Lattner Disassembler::Disassemble
9130fdc8d8SChris Lattner (
926611103cSGreg Clayton     Debugger &debugger,
9330fdc8d8SChris Lattner     const ArchSpec &arch,
9430fdc8d8SChris Lattner     const ExecutionContext &exe_ctx,
95dda4f7b5SGreg Clayton     const ConstString &name,
96dda4f7b5SGreg Clayton     Module *module,
97dda4f7b5SGreg Clayton     uint32_t num_mixed_context_lines,
98dda4f7b5SGreg Clayton     bool show_bytes,
9930fdc8d8SChris Lattner     Stream &strm
10030fdc8d8SChris Lattner )
10130fdc8d8SChris Lattner {
102dda4f7b5SGreg Clayton     if (exe_ctx.target == NULL && name)
103dda4f7b5SGreg Clayton         return false;
104dda4f7b5SGreg Clayton 
105dda4f7b5SGreg Clayton     SymbolContextList sc_list;
106dda4f7b5SGreg Clayton 
107dda4f7b5SGreg Clayton     if (module)
108dda4f7b5SGreg Clayton     {
109dda4f7b5SGreg Clayton         if (!module->FindFunctions (name,
110dda4f7b5SGreg Clayton                                     eFunctionNameTypeBase | eFunctionNameTypeFull | eFunctionNameTypeMethod | eFunctionNameTypeSelector,
111dda4f7b5SGreg Clayton                                     true,
112dda4f7b5SGreg Clayton                                     sc_list))
113dda4f7b5SGreg Clayton             return false;
114dda4f7b5SGreg Clayton     }
115dda4f7b5SGreg Clayton     else
116dda4f7b5SGreg Clayton     {
117dda4f7b5SGreg Clayton         if (exe_ctx.target->GetImages().FindFunctions (name,
118dda4f7b5SGreg Clayton                                                        eFunctionNameTypeBase | eFunctionNameTypeFull | eFunctionNameTypeMethod | eFunctionNameTypeSelector,
119*8ade104aSSean Callanan                                                        false,
120dda4f7b5SGreg Clayton                                                        sc_list))
121dda4f7b5SGreg Clayton         {
122dda4f7b5SGreg Clayton             return Disassemble (debugger, arch, exe_ctx, sc_list, num_mixed_context_lines, show_bytes, strm);
123dda4f7b5SGreg Clayton         }
124dda4f7b5SGreg Clayton         else if (exe_ctx.target->GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list))
125dda4f7b5SGreg Clayton         {
126dda4f7b5SGreg Clayton             return Disassemble (debugger, arch, exe_ctx, sc_list, num_mixed_context_lines, show_bytes, strm);
127dda4f7b5SGreg Clayton         }
128dda4f7b5SGreg Clayton     }
129dda4f7b5SGreg Clayton     return false;
130dda4f7b5SGreg Clayton }
131dda4f7b5SGreg Clayton 
132dda4f7b5SGreg Clayton bool
133dda4f7b5SGreg Clayton Disassembler::Disassemble
134dda4f7b5SGreg Clayton (
135dda4f7b5SGreg Clayton     Debugger &debugger,
136dda4f7b5SGreg Clayton     const ArchSpec &arch,
137dda4f7b5SGreg Clayton     const ExecutionContext &exe_ctx,
138dda4f7b5SGreg Clayton     const AddressRange &disasm_range,
139dda4f7b5SGreg Clayton     uint32_t num_mixed_context_lines,
140dda4f7b5SGreg Clayton     bool show_bytes,
141dda4f7b5SGreg Clayton     Stream &strm
142dda4f7b5SGreg Clayton )
143dda4f7b5SGreg Clayton {
144dda4f7b5SGreg Clayton     if (disasm_range.GetByteSize())
145dda4f7b5SGreg Clayton     {
14630fdc8d8SChris Lattner         Disassembler *disassembler = Disassembler::FindPlugin(arch);
14730fdc8d8SChris Lattner 
14830fdc8d8SChris Lattner         if (disassembler)
14930fdc8d8SChris Lattner         {
150dda4f7b5SGreg Clayton             AddressRange range(disasm_range);
151dda4f7b5SGreg Clayton 
152dda4f7b5SGreg Clayton             Process *process = exe_ctx.process;
153dda4f7b5SGreg Clayton 
154dda4f7b5SGreg Clayton             // If we weren't passed in a section offset address range,
155dda4f7b5SGreg Clayton             // try and resolve it to something
156dda4f7b5SGreg Clayton             if (range.GetBaseAddress().IsSectionOffset() == false)
15730fdc8d8SChris Lattner             {
158dda4f7b5SGreg Clayton                 if (process && process->IsAlive())
15930fdc8d8SChris Lattner                 {
160dda4f7b5SGreg Clayton                     process->ResolveLoadAddress (range.GetBaseAddress().GetOffset(), range.GetBaseAddress());
16130fdc8d8SChris Lattner                 }
162dda4f7b5SGreg Clayton                 else if (exe_ctx.target)
16330fdc8d8SChris Lattner                 {
164dda4f7b5SGreg Clayton                     exe_ctx.target->GetImages().ResolveFileAddress (range.GetBaseAddress().GetOffset(), range.GetBaseAddress());
16530fdc8d8SChris Lattner                 }
16630fdc8d8SChris Lattner             }
16730fdc8d8SChris Lattner 
168dda4f7b5SGreg Clayton 
16930fdc8d8SChris Lattner             DataExtractor data;
170dda4f7b5SGreg Clayton             size_t bytes_disassembled = disassembler->ParseInstructions (&exe_ctx, range, data);
17130fdc8d8SChris Lattner             if (bytes_disassembled == 0)
17230fdc8d8SChris Lattner             {
17330fdc8d8SChris Lattner                 return false;
17430fdc8d8SChris Lattner             }
17530fdc8d8SChris Lattner             else
17630fdc8d8SChris Lattner             {
17730fdc8d8SChris Lattner                 // We got some things disassembled...
17830fdc8d8SChris Lattner                 size_t num_instructions = disassembler->GetInstructionList().GetSize();
17930fdc8d8SChris Lattner                 uint32_t offset = 0;
18030fdc8d8SChris Lattner                 SymbolContext sc;
18130fdc8d8SChris Lattner                 SymbolContext prev_sc;
18230fdc8d8SChris Lattner                 AddressRange sc_range;
183dda4f7b5SGreg Clayton                 if (num_mixed_context_lines)
18430fdc8d8SChris Lattner                     strm.IndentMore ();
18530fdc8d8SChris Lattner 
186dda4f7b5SGreg Clayton 
187dda4f7b5SGreg Clayton                 Address addr(range.GetBaseAddress());
188dda4f7b5SGreg Clayton 
189dda4f7b5SGreg Clayton                 // We extract the section to make sure we don't transition out
190dda4f7b5SGreg Clayton                 // of the current section when disassembling
191dda4f7b5SGreg Clayton                 const Section *addr_section = addr.GetSection();
192dda4f7b5SGreg Clayton                 Module *range_module = range.GetBaseAddress().GetModule();
193dda4f7b5SGreg Clayton 
19430fdc8d8SChris Lattner                 for (size_t i=0; i<num_instructions; ++i)
19530fdc8d8SChris Lattner                 {
19630fdc8d8SChris Lattner                     Disassembler::Instruction *inst = disassembler->GetInstructionList().GetInstructionAtIndex (i);
19730fdc8d8SChris Lattner                     if (inst)
19830fdc8d8SChris Lattner                     {
199dda4f7b5SGreg Clayton                         addr_t file_addr = addr.GetFileAddress();
200dda4f7b5SGreg Clayton                         if (addr_section == NULL || addr_section->ContainsFileAddress (file_addr) == false)
20130fdc8d8SChris Lattner                         {
202dda4f7b5SGreg Clayton                             if (range_module)
203dda4f7b5SGreg Clayton                                 range_module->ResolveFileAddress (file_addr, addr);
204dda4f7b5SGreg Clayton                             else if (exe_ctx.target)
205dda4f7b5SGreg Clayton                                 exe_ctx.target->GetImages().ResolveFileAddress (file_addr, addr);
206dda4f7b5SGreg Clayton 
207dda4f7b5SGreg Clayton                             addr_section = addr.GetSection();
208dda4f7b5SGreg Clayton                         }
209dda4f7b5SGreg Clayton 
21030fdc8d8SChris Lattner                         prev_sc = sc;
211dda4f7b5SGreg Clayton 
212dda4f7b5SGreg Clayton                         if (addr_section)
21330fdc8d8SChris Lattner                         {
214dda4f7b5SGreg Clayton                             Module *module = addr_section->GetModule();
215dda4f7b5SGreg Clayton                             uint32_t resolved_mask = module->ResolveSymbolContextForAddress(addr, eSymbolContextEverything, sc);
21630fdc8d8SChris Lattner                             if (resolved_mask)
21730fdc8d8SChris Lattner                             {
218dda4f7b5SGreg Clayton                                 if (prev_sc.function != sc.function || prev_sc.symbol != sc.symbol)
219dda4f7b5SGreg Clayton                                 {
220dda4f7b5SGreg Clayton                                     if (prev_sc.function || prev_sc.symbol)
221dda4f7b5SGreg Clayton                                         strm.EOL();
222dda4f7b5SGreg Clayton 
223dda4f7b5SGreg Clayton                                     strm << sc.module_sp->GetFileSpec().GetFilename();
224dda4f7b5SGreg Clayton 
225dda4f7b5SGreg Clayton                                     if (sc.function)
226dda4f7b5SGreg Clayton                                         strm << '`' << sc.function->GetMangled().GetName();
227dda4f7b5SGreg Clayton                                     else if (sc.symbol)
228dda4f7b5SGreg Clayton                                         strm << '`' << sc.symbol->GetMangled().GetName();
229dda4f7b5SGreg Clayton                                     strm << ":\n";
230dda4f7b5SGreg Clayton                                 }
231dda4f7b5SGreg Clayton 
232dda4f7b5SGreg Clayton                                 if (num_mixed_context_lines && !sc_range.ContainsFileAddress (addr))
233dda4f7b5SGreg Clayton                                 {
23430fdc8d8SChris Lattner                                     sc.GetAddressRange (eSymbolContextEverything, sc_range);
235dda4f7b5SGreg Clayton 
23630fdc8d8SChris Lattner                                     if (sc != prev_sc)
23730fdc8d8SChris Lattner                                     {
23830fdc8d8SChris Lattner                                         if (offset != 0)
23930fdc8d8SChris Lattner                                             strm.EOL();
24030fdc8d8SChris Lattner 
241dda4f7b5SGreg Clayton                                         sc.DumpStopContext(&strm, process, addr);
24230fdc8d8SChris Lattner 
24330fdc8d8SChris Lattner                                         if (sc.comp_unit && sc.line_entry.IsValid())
24430fdc8d8SChris Lattner                                         {
245dda4f7b5SGreg Clayton                                             debugger.GetSourceManager().DisplaySourceLinesWithLineNumbers (sc.line_entry.file,
24630fdc8d8SChris Lattner                                                                                                            sc.line_entry.line,
247dda4f7b5SGreg Clayton                                                                                                            num_mixed_context_lines,
248dda4f7b5SGreg Clayton                                                                                                            num_mixed_context_lines,
249dda4f7b5SGreg Clayton                                                                                                            num_mixed_context_lines ? "->" : "",
25030fdc8d8SChris Lattner                                                                                                            &strm);
25130fdc8d8SChris Lattner                                         }
25230fdc8d8SChris Lattner                                     }
25330fdc8d8SChris Lattner                                 }
25430fdc8d8SChris Lattner                             }
255dda4f7b5SGreg Clayton                             else
256dda4f7b5SGreg Clayton                             {
257dda4f7b5SGreg Clayton                                 sc.Clear();
25830fdc8d8SChris Lattner                             }
25930fdc8d8SChris Lattner                         }
260dda4f7b5SGreg Clayton                         if (num_mixed_context_lines)
26130fdc8d8SChris Lattner                             strm.IndentMore ();
26230fdc8d8SChris Lattner                         strm.Indent();
26330fdc8d8SChris Lattner                         size_t inst_byte_size = inst->GetByteSize();
264dda4f7b5SGreg Clayton                         inst->Dump(&strm, &addr, show_bytes ? &data : NULL, offset, exe_ctx, show_bytes);
26530fdc8d8SChris Lattner                         strm.EOL();
26630fdc8d8SChris Lattner                         offset += inst_byte_size;
267dda4f7b5SGreg Clayton 
268dda4f7b5SGreg Clayton                         addr.SetOffset (addr.GetOffset() + inst_byte_size);
269dda4f7b5SGreg Clayton 
270dda4f7b5SGreg Clayton                         if (num_mixed_context_lines)
27130fdc8d8SChris Lattner                             strm.IndentLess ();
27230fdc8d8SChris Lattner                     }
27330fdc8d8SChris Lattner                     else
27430fdc8d8SChris Lattner                     {
27530fdc8d8SChris Lattner                         break;
27630fdc8d8SChris Lattner                     }
27730fdc8d8SChris Lattner                 }
278dda4f7b5SGreg Clayton                 if (num_mixed_context_lines)
27930fdc8d8SChris Lattner                     strm.IndentLess ();
28030fdc8d8SChris Lattner 
28130fdc8d8SChris Lattner             }
28230fdc8d8SChris Lattner         }
28330fdc8d8SChris Lattner         return true;
28430fdc8d8SChris Lattner     }
28530fdc8d8SChris Lattner     return false;
28630fdc8d8SChris Lattner }
28730fdc8d8SChris Lattner 
288dda4f7b5SGreg Clayton 
289dda4f7b5SGreg Clayton bool
290dda4f7b5SGreg Clayton Disassembler::Disassemble
291dda4f7b5SGreg Clayton (
292dda4f7b5SGreg Clayton     Debugger &debugger,
293dda4f7b5SGreg Clayton     const ArchSpec &arch,
294dda4f7b5SGreg Clayton     const ExecutionContext &exe_ctx,
295dda4f7b5SGreg Clayton     uint32_t num_mixed_context_lines,
296dda4f7b5SGreg Clayton     bool show_bytes,
297dda4f7b5SGreg Clayton     Stream &strm
298dda4f7b5SGreg Clayton )
299dda4f7b5SGreg Clayton {
300dda4f7b5SGreg Clayton     AddressRange range;
301dda4f7b5SGreg Clayton     if (exe_ctx.frame)
302dda4f7b5SGreg Clayton     {
303dda4f7b5SGreg Clayton         SymbolContext sc(exe_ctx.frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextSymbol));
304dda4f7b5SGreg Clayton         if (sc.function)
305dda4f7b5SGreg Clayton         {
306dda4f7b5SGreg Clayton             range = sc.function->GetAddressRange();
307dda4f7b5SGreg Clayton         }
308dda4f7b5SGreg Clayton         else if (sc.symbol && sc.symbol->GetAddressRangePtr())
309dda4f7b5SGreg Clayton         {
310dda4f7b5SGreg Clayton             range = *sc.symbol->GetAddressRangePtr();
311dda4f7b5SGreg Clayton         }
312dda4f7b5SGreg Clayton         else
313dda4f7b5SGreg Clayton         {
314dda4f7b5SGreg Clayton             range.GetBaseAddress() = exe_ctx.frame->GetPC();
315dda4f7b5SGreg Clayton         }
316dda4f7b5SGreg Clayton 
317dda4f7b5SGreg Clayton         if (range.GetBaseAddress().IsValid() && range.GetByteSize() == 0)
318dda4f7b5SGreg Clayton             range.SetByteSize (DEFAULT_DISASM_BYTE_SIZE);
319dda4f7b5SGreg Clayton     }
320dda4f7b5SGreg Clayton 
321dda4f7b5SGreg Clayton     return Disassemble(debugger, arch, exe_ctx, range, num_mixed_context_lines, show_bytes, strm);
322dda4f7b5SGreg Clayton }
323dda4f7b5SGreg Clayton 
32430fdc8d8SChris Lattner Disassembler::Instruction::Instruction()
32530fdc8d8SChris Lattner {
32630fdc8d8SChris Lattner }
32730fdc8d8SChris Lattner 
32830fdc8d8SChris Lattner Disassembler::Instruction::~Instruction()
32930fdc8d8SChris Lattner {
33030fdc8d8SChris Lattner }
33130fdc8d8SChris Lattner 
33230fdc8d8SChris Lattner 
33330fdc8d8SChris Lattner Disassembler::InstructionList::InstructionList() :
33430fdc8d8SChris Lattner     m_instructions()
33530fdc8d8SChris Lattner {
33630fdc8d8SChris Lattner }
33730fdc8d8SChris Lattner 
33830fdc8d8SChris Lattner Disassembler::InstructionList::~InstructionList()
33930fdc8d8SChris Lattner {
34030fdc8d8SChris Lattner }
34130fdc8d8SChris Lattner 
34230fdc8d8SChris Lattner size_t
34330fdc8d8SChris Lattner Disassembler::InstructionList::GetSize() const
34430fdc8d8SChris Lattner {
34530fdc8d8SChris Lattner     return m_instructions.size();
34630fdc8d8SChris Lattner }
34730fdc8d8SChris Lattner 
34830fdc8d8SChris Lattner 
34930fdc8d8SChris Lattner Disassembler::Instruction *
35030fdc8d8SChris Lattner Disassembler::InstructionList::GetInstructionAtIndex (uint32_t idx)
35130fdc8d8SChris Lattner {
35230fdc8d8SChris Lattner     if (idx < m_instructions.size())
35330fdc8d8SChris Lattner         return m_instructions[idx].get();
35430fdc8d8SChris Lattner     return NULL;
35530fdc8d8SChris Lattner }
35630fdc8d8SChris Lattner 
35730fdc8d8SChris Lattner const Disassembler::Instruction *
35830fdc8d8SChris Lattner Disassembler::InstructionList::GetInstructionAtIndex (uint32_t idx) const
35930fdc8d8SChris Lattner {
36030fdc8d8SChris Lattner     if (idx < m_instructions.size())
36130fdc8d8SChris Lattner         return m_instructions[idx].get();
36230fdc8d8SChris Lattner     return NULL;
36330fdc8d8SChris Lattner }
36430fdc8d8SChris Lattner 
36530fdc8d8SChris Lattner void
36630fdc8d8SChris Lattner Disassembler::InstructionList::Clear()
36730fdc8d8SChris Lattner {
36830fdc8d8SChris Lattner   m_instructions.clear();
36930fdc8d8SChris Lattner }
37030fdc8d8SChris Lattner 
37130fdc8d8SChris Lattner void
37230fdc8d8SChris Lattner Disassembler::InstructionList::AppendInstruction (Instruction::shared_ptr &inst_sp)
37330fdc8d8SChris Lattner {
37430fdc8d8SChris Lattner     if (inst_sp)
37530fdc8d8SChris Lattner         m_instructions.push_back(inst_sp);
37630fdc8d8SChris Lattner }
37730fdc8d8SChris Lattner 
37830fdc8d8SChris Lattner 
37930fdc8d8SChris Lattner size_t
38030fdc8d8SChris Lattner Disassembler::ParseInstructions
38130fdc8d8SChris Lattner (
38230fdc8d8SChris Lattner     const ExecutionContext *exe_ctx,
383dda4f7b5SGreg Clayton     const AddressRange &range,
38430fdc8d8SChris Lattner     DataExtractor& data
38530fdc8d8SChris Lattner )
38630fdc8d8SChris Lattner {
387dda4f7b5SGreg Clayton     Target *target = exe_ctx->target;
38830fdc8d8SChris Lattner 
389dda4f7b5SGreg Clayton     const addr_t byte_size = range.GetByteSize();
390dda4f7b5SGreg Clayton     if (target == NULL || byte_size == 0 || !range.GetBaseAddress().IsValid())
39130fdc8d8SChris Lattner         return 0;
39230fdc8d8SChris Lattner 
393dda4f7b5SGreg Clayton     DataBufferHeap *heap_buffer = new DataBufferHeap (byte_size, '\0');
394dda4f7b5SGreg Clayton     DataBufferSP data_sp(heap_buffer);
39530fdc8d8SChris Lattner 
39630fdc8d8SChris Lattner     Error error;
397dda4f7b5SGreg Clayton     const size_t bytes_read = target->ReadMemory (range.GetBaseAddress(), heap_buffer->GetBytes(), heap_buffer->GetByteSize(), error);
398dda4f7b5SGreg Clayton 
399dda4f7b5SGreg Clayton     if (bytes_read > 0)
40030fdc8d8SChris Lattner     {
401dda4f7b5SGreg Clayton         if (bytes_read != heap_buffer->GetByteSize())
402dda4f7b5SGreg Clayton             heap_buffer->SetByteSize (bytes_read);
403dda4f7b5SGreg Clayton 
40430fdc8d8SChris Lattner         data.SetData(data_sp);
405dda4f7b5SGreg Clayton         if (exe_ctx->process)
406dda4f7b5SGreg Clayton         {
407dda4f7b5SGreg Clayton             data.SetByteOrder(exe_ctx->process->GetByteOrder());
408dda4f7b5SGreg Clayton             data.SetAddressByteSize(exe_ctx->process->GetAddressByteSize());
409dda4f7b5SGreg Clayton         }
410dda4f7b5SGreg Clayton         else
411dda4f7b5SGreg Clayton         {
412dda4f7b5SGreg Clayton             data.SetByteOrder(target->GetArchitecture().GetDefaultEndian());
413dda4f7b5SGreg Clayton             data.SetAddressByteSize(target->GetArchitecture().GetAddressByteSize());
414dda4f7b5SGreg Clayton         }
415dda4f7b5SGreg Clayton         return DecodeInstructions (data, 0, UINT32_MAX);
41630fdc8d8SChris Lattner     }
41730fdc8d8SChris Lattner 
41830fdc8d8SChris Lattner     return 0;
41930fdc8d8SChris Lattner }
42030fdc8d8SChris Lattner 
42130fdc8d8SChris Lattner //----------------------------------------------------------------------
42230fdc8d8SChris Lattner // Disassembler copy constructor
42330fdc8d8SChris Lattner //----------------------------------------------------------------------
42430fdc8d8SChris Lattner Disassembler::Disassembler(const ArchSpec& arch) :
42530fdc8d8SChris Lattner     m_arch (arch),
42630fdc8d8SChris Lattner     m_instruction_list(),
42730fdc8d8SChris Lattner     m_base_addr(LLDB_INVALID_ADDRESS)
42830fdc8d8SChris Lattner {
42930fdc8d8SChris Lattner 
43030fdc8d8SChris Lattner }
43130fdc8d8SChris Lattner 
43230fdc8d8SChris Lattner //----------------------------------------------------------------------
43330fdc8d8SChris Lattner // Destructor
43430fdc8d8SChris Lattner //----------------------------------------------------------------------
43530fdc8d8SChris Lattner Disassembler::~Disassembler()
43630fdc8d8SChris Lattner {
43730fdc8d8SChris Lattner }
43830fdc8d8SChris Lattner 
43930fdc8d8SChris Lattner Disassembler::InstructionList &
44030fdc8d8SChris Lattner Disassembler::GetInstructionList ()
44130fdc8d8SChris Lattner {
44230fdc8d8SChris Lattner     return m_instruction_list;
44330fdc8d8SChris Lattner }
44430fdc8d8SChris Lattner 
44530fdc8d8SChris Lattner const Disassembler::InstructionList &
44630fdc8d8SChris Lattner Disassembler::GetInstructionList () const
44730fdc8d8SChris Lattner {
44830fdc8d8SChris Lattner     return m_instruction_list;
44930fdc8d8SChris Lattner }
450