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,
1198ade104aSSean 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             {
158*f5e56de0SGreg Clayton                 if (exe_ctx.target)
15930fdc8d8SChris Lattner                 {
160*f5e56de0SGreg Clayton                     if (exe_ctx.target->GetSectionLoadList().IsEmpty())
16130fdc8d8SChris Lattner                     {
162dda4f7b5SGreg Clayton                         exe_ctx.target->GetImages().ResolveFileAddress (range.GetBaseAddress().GetOffset(), range.GetBaseAddress());
16330fdc8d8SChris Lattner                     }
164*f5e56de0SGreg Clayton                     else
165*f5e56de0SGreg Clayton                     {
166*f5e56de0SGreg Clayton                         exe_ctx.target->GetSectionLoadList().ResolveLoadAddress (range.GetBaseAddress().GetOffset(), range.GetBaseAddress());
16730fdc8d8SChris Lattner                     }
168*f5e56de0SGreg Clayton                 }
169*f5e56de0SGreg Clayton             }
170dda4f7b5SGreg Clayton 
17130fdc8d8SChris Lattner             DataExtractor data;
172dda4f7b5SGreg Clayton             size_t bytes_disassembled = disassembler->ParseInstructions (&exe_ctx, range, data);
17330fdc8d8SChris Lattner             if (bytes_disassembled == 0)
17430fdc8d8SChris Lattner             {
17530fdc8d8SChris Lattner                 return false;
17630fdc8d8SChris Lattner             }
17730fdc8d8SChris Lattner             else
17830fdc8d8SChris Lattner             {
17930fdc8d8SChris Lattner                 // We got some things disassembled...
18030fdc8d8SChris Lattner                 size_t num_instructions = disassembler->GetInstructionList().GetSize();
18130fdc8d8SChris Lattner                 uint32_t offset = 0;
18230fdc8d8SChris Lattner                 SymbolContext sc;
18330fdc8d8SChris Lattner                 SymbolContext prev_sc;
18430fdc8d8SChris Lattner                 AddressRange sc_range;
185dda4f7b5SGreg Clayton                 if (num_mixed_context_lines)
18630fdc8d8SChris Lattner                     strm.IndentMore ();
18730fdc8d8SChris Lattner 
188dda4f7b5SGreg Clayton 
189dda4f7b5SGreg Clayton                 Address addr(range.GetBaseAddress());
190dda4f7b5SGreg Clayton 
191dda4f7b5SGreg Clayton                 // We extract the section to make sure we don't transition out
192dda4f7b5SGreg Clayton                 // of the current section when disassembling
193dda4f7b5SGreg Clayton                 const Section *addr_section = addr.GetSection();
194dda4f7b5SGreg Clayton                 Module *range_module = range.GetBaseAddress().GetModule();
195dda4f7b5SGreg Clayton 
19630fdc8d8SChris Lattner                 for (size_t i=0; i<num_instructions; ++i)
19730fdc8d8SChris Lattner                 {
19830fdc8d8SChris Lattner                     Disassembler::Instruction *inst = disassembler->GetInstructionList().GetInstructionAtIndex (i);
19930fdc8d8SChris Lattner                     if (inst)
20030fdc8d8SChris Lattner                     {
201dda4f7b5SGreg Clayton                         addr_t file_addr = addr.GetFileAddress();
202dda4f7b5SGreg Clayton                         if (addr_section == NULL || addr_section->ContainsFileAddress (file_addr) == false)
20330fdc8d8SChris Lattner                         {
204dda4f7b5SGreg Clayton                             if (range_module)
205dda4f7b5SGreg Clayton                                 range_module->ResolveFileAddress (file_addr, addr);
206dda4f7b5SGreg Clayton                             else if (exe_ctx.target)
207dda4f7b5SGreg Clayton                                 exe_ctx.target->GetImages().ResolveFileAddress (file_addr, addr);
208dda4f7b5SGreg Clayton 
209dda4f7b5SGreg Clayton                             addr_section = addr.GetSection();
210dda4f7b5SGreg Clayton                         }
211dda4f7b5SGreg Clayton 
21230fdc8d8SChris Lattner                         prev_sc = sc;
213dda4f7b5SGreg Clayton 
214dda4f7b5SGreg Clayton                         if (addr_section)
21530fdc8d8SChris Lattner                         {
216dda4f7b5SGreg Clayton                             Module *module = addr_section->GetModule();
217dda4f7b5SGreg Clayton                             uint32_t resolved_mask = module->ResolveSymbolContextForAddress(addr, eSymbolContextEverything, sc);
21830fdc8d8SChris Lattner                             if (resolved_mask)
21930fdc8d8SChris Lattner                             {
2203c68757cSGreg Clayton                                 if (!(prev_sc.function == sc.function || prev_sc.symbol == sc.symbol))
221dda4f7b5SGreg Clayton                                 {
222dda4f7b5SGreg Clayton                                     if (prev_sc.function || prev_sc.symbol)
223dda4f7b5SGreg Clayton                                         strm.EOL();
224dda4f7b5SGreg Clayton 
225dda4f7b5SGreg Clayton                                     strm << sc.module_sp->GetFileSpec().GetFilename();
226dda4f7b5SGreg Clayton 
227dda4f7b5SGreg Clayton                                     if (sc.function)
228dda4f7b5SGreg Clayton                                         strm << '`' << sc.function->GetMangled().GetName();
229dda4f7b5SGreg Clayton                                     else if (sc.symbol)
230dda4f7b5SGreg Clayton                                         strm << '`' << sc.symbol->GetMangled().GetName();
231dda4f7b5SGreg Clayton                                     strm << ":\n";
232dda4f7b5SGreg Clayton                                 }
233dda4f7b5SGreg Clayton 
234dda4f7b5SGreg Clayton                                 if (num_mixed_context_lines && !sc_range.ContainsFileAddress (addr))
235dda4f7b5SGreg Clayton                                 {
23630fdc8d8SChris Lattner                                     sc.GetAddressRange (eSymbolContextEverything, sc_range);
237dda4f7b5SGreg Clayton 
23830fdc8d8SChris Lattner                                     if (sc != prev_sc)
23930fdc8d8SChris Lattner                                     {
24030fdc8d8SChris Lattner                                         if (offset != 0)
24130fdc8d8SChris Lattner                                             strm.EOL();
24230fdc8d8SChris Lattner 
2436dadd508SGreg Clayton                                         sc.DumpStopContext(&strm, process, addr, true, true, false);
24430fdc8d8SChris Lattner 
24530fdc8d8SChris Lattner                                         if (sc.comp_unit && sc.line_entry.IsValid())
24630fdc8d8SChris Lattner                                         {
247dda4f7b5SGreg Clayton                                             debugger.GetSourceManager().DisplaySourceLinesWithLineNumbers (sc.line_entry.file,
24830fdc8d8SChris Lattner                                                                                                            sc.line_entry.line,
249dda4f7b5SGreg Clayton                                                                                                            num_mixed_context_lines,
250dda4f7b5SGreg Clayton                                                                                                            num_mixed_context_lines,
251dda4f7b5SGreg Clayton                                                                                                            num_mixed_context_lines ? "->" : "",
25230fdc8d8SChris Lattner                                                                                                            &strm);
25330fdc8d8SChris Lattner                                         }
25430fdc8d8SChris Lattner                                     }
25530fdc8d8SChris Lattner                                 }
25630fdc8d8SChris Lattner                             }
257dda4f7b5SGreg Clayton                             else
258dda4f7b5SGreg Clayton                             {
259dda4f7b5SGreg Clayton                                 sc.Clear();
26030fdc8d8SChris Lattner                             }
26130fdc8d8SChris Lattner                         }
262dda4f7b5SGreg Clayton                         if (num_mixed_context_lines)
26330fdc8d8SChris Lattner                             strm.IndentMore ();
26430fdc8d8SChris Lattner                         strm.Indent();
26530fdc8d8SChris Lattner                         size_t inst_byte_size = inst->GetByteSize();
266dda4f7b5SGreg Clayton                         inst->Dump(&strm, &addr, show_bytes ? &data : NULL, offset, exe_ctx, show_bytes);
26730fdc8d8SChris Lattner                         strm.EOL();
26830fdc8d8SChris Lattner                         offset += inst_byte_size;
269dda4f7b5SGreg Clayton 
270dda4f7b5SGreg Clayton                         addr.SetOffset (addr.GetOffset() + inst_byte_size);
271dda4f7b5SGreg Clayton 
272dda4f7b5SGreg Clayton                         if (num_mixed_context_lines)
27330fdc8d8SChris Lattner                             strm.IndentLess ();
27430fdc8d8SChris Lattner                     }
27530fdc8d8SChris Lattner                     else
27630fdc8d8SChris Lattner                     {
27730fdc8d8SChris Lattner                         break;
27830fdc8d8SChris Lattner                     }
27930fdc8d8SChris Lattner                 }
280dda4f7b5SGreg Clayton                 if (num_mixed_context_lines)
28130fdc8d8SChris Lattner                     strm.IndentLess ();
28230fdc8d8SChris Lattner 
28330fdc8d8SChris Lattner             }
28430fdc8d8SChris Lattner         }
28530fdc8d8SChris Lattner         return true;
28630fdc8d8SChris Lattner     }
28730fdc8d8SChris Lattner     return false;
28830fdc8d8SChris Lattner }
28930fdc8d8SChris Lattner 
290dda4f7b5SGreg Clayton 
291dda4f7b5SGreg Clayton bool
292dda4f7b5SGreg Clayton Disassembler::Disassemble
293dda4f7b5SGreg Clayton (
294dda4f7b5SGreg Clayton     Debugger &debugger,
295dda4f7b5SGreg Clayton     const ArchSpec &arch,
296dda4f7b5SGreg Clayton     const ExecutionContext &exe_ctx,
297dda4f7b5SGreg Clayton     uint32_t num_mixed_context_lines,
298dda4f7b5SGreg Clayton     bool show_bytes,
299dda4f7b5SGreg Clayton     Stream &strm
300dda4f7b5SGreg Clayton )
301dda4f7b5SGreg Clayton {
302dda4f7b5SGreg Clayton     AddressRange range;
303dda4f7b5SGreg Clayton     if (exe_ctx.frame)
304dda4f7b5SGreg Clayton     {
305dda4f7b5SGreg Clayton         SymbolContext sc(exe_ctx.frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextSymbol));
306dda4f7b5SGreg Clayton         if (sc.function)
307dda4f7b5SGreg Clayton         {
308dda4f7b5SGreg Clayton             range = sc.function->GetAddressRange();
309dda4f7b5SGreg Clayton         }
310dda4f7b5SGreg Clayton         else if (sc.symbol && sc.symbol->GetAddressRangePtr())
311dda4f7b5SGreg Clayton         {
312dda4f7b5SGreg Clayton             range = *sc.symbol->GetAddressRangePtr();
313dda4f7b5SGreg Clayton         }
314dda4f7b5SGreg Clayton         else
315dda4f7b5SGreg Clayton         {
3169da7bd07SGreg Clayton             range.GetBaseAddress() = exe_ctx.frame->GetFrameCodeAddress();
317dda4f7b5SGreg Clayton         }
318dda4f7b5SGreg Clayton 
319dda4f7b5SGreg Clayton         if (range.GetBaseAddress().IsValid() && range.GetByteSize() == 0)
320dda4f7b5SGreg Clayton             range.SetByteSize (DEFAULT_DISASM_BYTE_SIZE);
321dda4f7b5SGreg Clayton     }
322dda4f7b5SGreg Clayton 
323dda4f7b5SGreg Clayton     return Disassemble(debugger, arch, exe_ctx, range, num_mixed_context_lines, show_bytes, strm);
324dda4f7b5SGreg Clayton }
325dda4f7b5SGreg Clayton 
32630fdc8d8SChris Lattner Disassembler::Instruction::Instruction()
32730fdc8d8SChris Lattner {
32830fdc8d8SChris Lattner }
32930fdc8d8SChris Lattner 
33030fdc8d8SChris Lattner Disassembler::Instruction::~Instruction()
33130fdc8d8SChris Lattner {
33230fdc8d8SChris Lattner }
33330fdc8d8SChris Lattner 
33430fdc8d8SChris Lattner 
33530fdc8d8SChris Lattner Disassembler::InstructionList::InstructionList() :
33630fdc8d8SChris Lattner     m_instructions()
33730fdc8d8SChris Lattner {
33830fdc8d8SChris Lattner }
33930fdc8d8SChris Lattner 
34030fdc8d8SChris Lattner Disassembler::InstructionList::~InstructionList()
34130fdc8d8SChris Lattner {
34230fdc8d8SChris Lattner }
34330fdc8d8SChris Lattner 
34430fdc8d8SChris Lattner size_t
34530fdc8d8SChris Lattner Disassembler::InstructionList::GetSize() const
34630fdc8d8SChris Lattner {
34730fdc8d8SChris Lattner     return m_instructions.size();
34830fdc8d8SChris Lattner }
34930fdc8d8SChris Lattner 
35030fdc8d8SChris Lattner 
35130fdc8d8SChris Lattner Disassembler::Instruction *
35230fdc8d8SChris Lattner Disassembler::InstructionList::GetInstructionAtIndex (uint32_t idx)
35330fdc8d8SChris Lattner {
35430fdc8d8SChris Lattner     if (idx < m_instructions.size())
35530fdc8d8SChris Lattner         return m_instructions[idx].get();
35630fdc8d8SChris Lattner     return NULL;
35730fdc8d8SChris Lattner }
35830fdc8d8SChris Lattner 
35930fdc8d8SChris Lattner const Disassembler::Instruction *
36030fdc8d8SChris Lattner Disassembler::InstructionList::GetInstructionAtIndex (uint32_t idx) const
36130fdc8d8SChris Lattner {
36230fdc8d8SChris Lattner     if (idx < m_instructions.size())
36330fdc8d8SChris Lattner         return m_instructions[idx].get();
36430fdc8d8SChris Lattner     return NULL;
36530fdc8d8SChris Lattner }
36630fdc8d8SChris Lattner 
36730fdc8d8SChris Lattner void
36830fdc8d8SChris Lattner Disassembler::InstructionList::Clear()
36930fdc8d8SChris Lattner {
37030fdc8d8SChris Lattner   m_instructions.clear();
37130fdc8d8SChris Lattner }
37230fdc8d8SChris Lattner 
37330fdc8d8SChris Lattner void
37430fdc8d8SChris Lattner Disassembler::InstructionList::AppendInstruction (Instruction::shared_ptr &inst_sp)
37530fdc8d8SChris Lattner {
37630fdc8d8SChris Lattner     if (inst_sp)
37730fdc8d8SChris Lattner         m_instructions.push_back(inst_sp);
37830fdc8d8SChris Lattner }
37930fdc8d8SChris Lattner 
38030fdc8d8SChris Lattner 
38130fdc8d8SChris Lattner size_t
38230fdc8d8SChris Lattner Disassembler::ParseInstructions
38330fdc8d8SChris Lattner (
38430fdc8d8SChris Lattner     const ExecutionContext *exe_ctx,
385dda4f7b5SGreg Clayton     const AddressRange &range,
38630fdc8d8SChris Lattner     DataExtractor& data
38730fdc8d8SChris Lattner )
38830fdc8d8SChris Lattner {
389dda4f7b5SGreg Clayton     Target *target = exe_ctx->target;
39030fdc8d8SChris Lattner 
391dda4f7b5SGreg Clayton     const addr_t byte_size = range.GetByteSize();
392dda4f7b5SGreg Clayton     if (target == NULL || byte_size == 0 || !range.GetBaseAddress().IsValid())
39330fdc8d8SChris Lattner         return 0;
39430fdc8d8SChris Lattner 
395dda4f7b5SGreg Clayton     DataBufferHeap *heap_buffer = new DataBufferHeap (byte_size, '\0');
396dda4f7b5SGreg Clayton     DataBufferSP data_sp(heap_buffer);
39730fdc8d8SChris Lattner 
39830fdc8d8SChris Lattner     Error error;
399dda4f7b5SGreg Clayton     const size_t bytes_read = target->ReadMemory (range.GetBaseAddress(), heap_buffer->GetBytes(), heap_buffer->GetByteSize(), error);
400dda4f7b5SGreg Clayton 
401dda4f7b5SGreg Clayton     if (bytes_read > 0)
40230fdc8d8SChris Lattner     {
403dda4f7b5SGreg Clayton         if (bytes_read != heap_buffer->GetByteSize())
404dda4f7b5SGreg Clayton             heap_buffer->SetByteSize (bytes_read);
405dda4f7b5SGreg Clayton 
40630fdc8d8SChris Lattner         data.SetData(data_sp);
407dda4f7b5SGreg Clayton         if (exe_ctx->process)
408dda4f7b5SGreg Clayton         {
409dda4f7b5SGreg Clayton             data.SetByteOrder(exe_ctx->process->GetByteOrder());
410dda4f7b5SGreg Clayton             data.SetAddressByteSize(exe_ctx->process->GetAddressByteSize());
411dda4f7b5SGreg Clayton         }
412dda4f7b5SGreg Clayton         else
413dda4f7b5SGreg Clayton         {
414dda4f7b5SGreg Clayton             data.SetByteOrder(target->GetArchitecture().GetDefaultEndian());
415dda4f7b5SGreg Clayton             data.SetAddressByteSize(target->GetArchitecture().GetAddressByteSize());
416dda4f7b5SGreg Clayton         }
417dda4f7b5SGreg Clayton         return DecodeInstructions (data, 0, UINT32_MAX);
41830fdc8d8SChris Lattner     }
41930fdc8d8SChris Lattner 
42030fdc8d8SChris Lattner     return 0;
42130fdc8d8SChris Lattner }
42230fdc8d8SChris Lattner 
42330fdc8d8SChris Lattner //----------------------------------------------------------------------
42430fdc8d8SChris Lattner // Disassembler copy constructor
42530fdc8d8SChris Lattner //----------------------------------------------------------------------
42630fdc8d8SChris Lattner Disassembler::Disassembler(const ArchSpec& arch) :
42730fdc8d8SChris Lattner     m_arch (arch),
42830fdc8d8SChris Lattner     m_instruction_list(),
42930fdc8d8SChris Lattner     m_base_addr(LLDB_INVALID_ADDRESS)
43030fdc8d8SChris Lattner {
43130fdc8d8SChris Lattner 
43230fdc8d8SChris Lattner }
43330fdc8d8SChris Lattner 
43430fdc8d8SChris Lattner //----------------------------------------------------------------------
43530fdc8d8SChris Lattner // Destructor
43630fdc8d8SChris Lattner //----------------------------------------------------------------------
43730fdc8d8SChris Lattner Disassembler::~Disassembler()
43830fdc8d8SChris Lattner {
43930fdc8d8SChris Lattner }
44030fdc8d8SChris Lattner 
44130fdc8d8SChris Lattner Disassembler::InstructionList &
44230fdc8d8SChris Lattner Disassembler::GetInstructionList ()
44330fdc8d8SChris Lattner {
44430fdc8d8SChris Lattner     return m_instruction_list;
44530fdc8d8SChris Lattner }
44630fdc8d8SChris Lattner 
44730fdc8d8SChris Lattner const Disassembler::InstructionList &
44830fdc8d8SChris Lattner Disassembler::GetInstructionList () const
44930fdc8d8SChris Lattner {
45030fdc8d8SChris Lattner     return m_instruction_list;
45130fdc8d8SChris Lattner }
452