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,
110*6dbd3983SGreg Clayton                                     eFunctionNameTypeBase |
111*6dbd3983SGreg Clayton                                     eFunctionNameTypeFull |
112*6dbd3983SGreg Clayton                                     eFunctionNameTypeMethod |
113*6dbd3983SGreg Clayton                                     eFunctionNameTypeSelector,
114dda4f7b5SGreg Clayton                                     true,
115dda4f7b5SGreg Clayton                                     sc_list))
116dda4f7b5SGreg Clayton             return false;
117dda4f7b5SGreg Clayton     }
118dda4f7b5SGreg Clayton     else
119dda4f7b5SGreg Clayton     {
120dda4f7b5SGreg Clayton         if (exe_ctx.target->GetImages().FindFunctions (name,
121*6dbd3983SGreg Clayton                                                        eFunctionNameTypeBase |
122*6dbd3983SGreg Clayton                                                        eFunctionNameTypeFull |
123*6dbd3983SGreg Clayton                                                        eFunctionNameTypeMethod |
124*6dbd3983SGreg Clayton                                                        eFunctionNameTypeSelector,
1258ade104aSSean Callanan                                                        false,
126dda4f7b5SGreg Clayton                                                        sc_list))
127dda4f7b5SGreg Clayton         {
128dda4f7b5SGreg Clayton             return Disassemble (debugger, arch, exe_ctx, sc_list, num_mixed_context_lines, show_bytes, strm);
129dda4f7b5SGreg Clayton         }
130dda4f7b5SGreg Clayton         else if (exe_ctx.target->GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list))
131dda4f7b5SGreg Clayton         {
132dda4f7b5SGreg Clayton             return Disassemble (debugger, arch, exe_ctx, sc_list, num_mixed_context_lines, show_bytes, strm);
133dda4f7b5SGreg Clayton         }
134dda4f7b5SGreg Clayton     }
135dda4f7b5SGreg Clayton     return false;
136dda4f7b5SGreg Clayton }
137dda4f7b5SGreg Clayton 
138dda4f7b5SGreg Clayton bool
139dda4f7b5SGreg Clayton Disassembler::Disassemble
140dda4f7b5SGreg Clayton (
141dda4f7b5SGreg Clayton     Debugger &debugger,
142dda4f7b5SGreg Clayton     const ArchSpec &arch,
143dda4f7b5SGreg Clayton     const ExecutionContext &exe_ctx,
144dda4f7b5SGreg Clayton     const AddressRange &disasm_range,
145dda4f7b5SGreg Clayton     uint32_t num_mixed_context_lines,
146dda4f7b5SGreg Clayton     bool show_bytes,
147dda4f7b5SGreg Clayton     Stream &strm
148dda4f7b5SGreg Clayton )
149dda4f7b5SGreg Clayton {
150dda4f7b5SGreg Clayton     if (disasm_range.GetByteSize())
151dda4f7b5SGreg Clayton     {
15230fdc8d8SChris Lattner         Disassembler *disassembler = Disassembler::FindPlugin(arch);
15330fdc8d8SChris Lattner 
15430fdc8d8SChris Lattner         if (disassembler)
15530fdc8d8SChris Lattner         {
156dda4f7b5SGreg Clayton             AddressRange range(disasm_range);
157dda4f7b5SGreg Clayton 
158dda4f7b5SGreg Clayton             Process *process = exe_ctx.process;
159dda4f7b5SGreg Clayton 
160dda4f7b5SGreg Clayton             // If we weren't passed in a section offset address range,
161dda4f7b5SGreg Clayton             // try and resolve it to something
162dda4f7b5SGreg Clayton             if (range.GetBaseAddress().IsSectionOffset() == false)
16330fdc8d8SChris Lattner             {
164f5e56de0SGreg Clayton                 if (exe_ctx.target)
16530fdc8d8SChris Lattner                 {
166f5e56de0SGreg Clayton                     if (exe_ctx.target->GetSectionLoadList().IsEmpty())
16730fdc8d8SChris Lattner                     {
168dda4f7b5SGreg Clayton                         exe_ctx.target->GetImages().ResolveFileAddress (range.GetBaseAddress().GetOffset(), range.GetBaseAddress());
16930fdc8d8SChris Lattner                     }
170f5e56de0SGreg Clayton                     else
171f5e56de0SGreg Clayton                     {
172f5e56de0SGreg Clayton                         exe_ctx.target->GetSectionLoadList().ResolveLoadAddress (range.GetBaseAddress().GetOffset(), range.GetBaseAddress());
17330fdc8d8SChris Lattner                     }
174f5e56de0SGreg Clayton                 }
175f5e56de0SGreg Clayton             }
176dda4f7b5SGreg Clayton 
17730fdc8d8SChris Lattner             DataExtractor data;
178dda4f7b5SGreg Clayton             size_t bytes_disassembled = disassembler->ParseInstructions (&exe_ctx, range, data);
17930fdc8d8SChris Lattner             if (bytes_disassembled == 0)
18030fdc8d8SChris Lattner             {
18130fdc8d8SChris Lattner                 return false;
18230fdc8d8SChris Lattner             }
18330fdc8d8SChris Lattner             else
18430fdc8d8SChris Lattner             {
18530fdc8d8SChris Lattner                 // We got some things disassembled...
18630fdc8d8SChris Lattner                 size_t num_instructions = disassembler->GetInstructionList().GetSize();
18730fdc8d8SChris Lattner                 uint32_t offset = 0;
18830fdc8d8SChris Lattner                 SymbolContext sc;
18930fdc8d8SChris Lattner                 SymbolContext prev_sc;
19030fdc8d8SChris Lattner                 AddressRange sc_range;
191dda4f7b5SGreg Clayton                 if (num_mixed_context_lines)
19230fdc8d8SChris Lattner                     strm.IndentMore ();
19330fdc8d8SChris Lattner 
194dda4f7b5SGreg Clayton 
195dda4f7b5SGreg Clayton                 Address addr(range.GetBaseAddress());
196dda4f7b5SGreg Clayton 
197dda4f7b5SGreg Clayton                 // We extract the section to make sure we don't transition out
198dda4f7b5SGreg Clayton                 // of the current section when disassembling
199dda4f7b5SGreg Clayton                 const Section *addr_section = addr.GetSection();
200dda4f7b5SGreg Clayton                 Module *range_module = range.GetBaseAddress().GetModule();
201dda4f7b5SGreg Clayton 
20230fdc8d8SChris Lattner                 for (size_t i=0; i<num_instructions; ++i)
20330fdc8d8SChris Lattner                 {
20430fdc8d8SChris Lattner                     Disassembler::Instruction *inst = disassembler->GetInstructionList().GetInstructionAtIndex (i);
20530fdc8d8SChris Lattner                     if (inst)
20630fdc8d8SChris Lattner                     {
207dda4f7b5SGreg Clayton                         addr_t file_addr = addr.GetFileAddress();
208dda4f7b5SGreg Clayton                         if (addr_section == NULL || addr_section->ContainsFileAddress (file_addr) == false)
20930fdc8d8SChris Lattner                         {
210dda4f7b5SGreg Clayton                             if (range_module)
211dda4f7b5SGreg Clayton                                 range_module->ResolveFileAddress (file_addr, addr);
212dda4f7b5SGreg Clayton                             else if (exe_ctx.target)
213dda4f7b5SGreg Clayton                                 exe_ctx.target->GetImages().ResolveFileAddress (file_addr, addr);
214dda4f7b5SGreg Clayton 
215dda4f7b5SGreg Clayton                             addr_section = addr.GetSection();
216dda4f7b5SGreg Clayton                         }
217dda4f7b5SGreg Clayton 
21830fdc8d8SChris Lattner                         prev_sc = sc;
219dda4f7b5SGreg Clayton 
220dda4f7b5SGreg Clayton                         if (addr_section)
22130fdc8d8SChris Lattner                         {
222dda4f7b5SGreg Clayton                             Module *module = addr_section->GetModule();
223dda4f7b5SGreg Clayton                             uint32_t resolved_mask = module->ResolveSymbolContextForAddress(addr, eSymbolContextEverything, sc);
22430fdc8d8SChris Lattner                             if (resolved_mask)
22530fdc8d8SChris Lattner                             {
2263c68757cSGreg Clayton                                 if (!(prev_sc.function == sc.function || prev_sc.symbol == sc.symbol))
227dda4f7b5SGreg Clayton                                 {
228dda4f7b5SGreg Clayton                                     if (prev_sc.function || prev_sc.symbol)
229dda4f7b5SGreg Clayton                                         strm.EOL();
230dda4f7b5SGreg Clayton 
231dda4f7b5SGreg Clayton                                     strm << sc.module_sp->GetFileSpec().GetFilename();
232dda4f7b5SGreg Clayton 
233dda4f7b5SGreg Clayton                                     if (sc.function)
234dda4f7b5SGreg Clayton                                         strm << '`' << sc.function->GetMangled().GetName();
235dda4f7b5SGreg Clayton                                     else if (sc.symbol)
236dda4f7b5SGreg Clayton                                         strm << '`' << sc.symbol->GetMangled().GetName();
237dda4f7b5SGreg Clayton                                     strm << ":\n";
238dda4f7b5SGreg Clayton                                 }
239dda4f7b5SGreg Clayton 
240dda4f7b5SGreg Clayton                                 if (num_mixed_context_lines && !sc_range.ContainsFileAddress (addr))
241dda4f7b5SGreg Clayton                                 {
24230fdc8d8SChris Lattner                                     sc.GetAddressRange (eSymbolContextEverything, sc_range);
243dda4f7b5SGreg Clayton 
24430fdc8d8SChris Lattner                                     if (sc != prev_sc)
24530fdc8d8SChris Lattner                                     {
24630fdc8d8SChris Lattner                                         if (offset != 0)
24730fdc8d8SChris Lattner                                             strm.EOL();
24830fdc8d8SChris Lattner 
249*6dbd3983SGreg Clayton                                         sc.DumpStopContext(&strm, process, addr, false, true, false);
250*6dbd3983SGreg Clayton                                         strm.EOL();
25130fdc8d8SChris Lattner 
25230fdc8d8SChris Lattner                                         if (sc.comp_unit && sc.line_entry.IsValid())
25330fdc8d8SChris Lattner                                         {
254dda4f7b5SGreg Clayton                                             debugger.GetSourceManager().DisplaySourceLinesWithLineNumbers (sc.line_entry.file,
25530fdc8d8SChris Lattner                                                                                                            sc.line_entry.line,
256dda4f7b5SGreg Clayton                                                                                                            num_mixed_context_lines,
257dda4f7b5SGreg Clayton                                                                                                            num_mixed_context_lines,
258dda4f7b5SGreg Clayton                                                                                                            num_mixed_context_lines ? "->" : "",
25930fdc8d8SChris Lattner                                                                                                            &strm);
26030fdc8d8SChris Lattner                                         }
26130fdc8d8SChris Lattner                                     }
26230fdc8d8SChris Lattner                                 }
26330fdc8d8SChris Lattner                             }
264dda4f7b5SGreg Clayton                             else
265dda4f7b5SGreg Clayton                             {
266dda4f7b5SGreg Clayton                                 sc.Clear();
26730fdc8d8SChris Lattner                             }
26830fdc8d8SChris Lattner                         }
269dda4f7b5SGreg Clayton                         if (num_mixed_context_lines)
27030fdc8d8SChris Lattner                             strm.IndentMore ();
27130fdc8d8SChris Lattner                         strm.Indent();
27230fdc8d8SChris Lattner                         size_t inst_byte_size = inst->GetByteSize();
273dda4f7b5SGreg Clayton                         inst->Dump(&strm, &addr, show_bytes ? &data : NULL, offset, exe_ctx, show_bytes);
27430fdc8d8SChris Lattner                         strm.EOL();
27530fdc8d8SChris Lattner                         offset += inst_byte_size;
276dda4f7b5SGreg Clayton 
277dda4f7b5SGreg Clayton                         addr.SetOffset (addr.GetOffset() + inst_byte_size);
278dda4f7b5SGreg Clayton 
279dda4f7b5SGreg Clayton                         if (num_mixed_context_lines)
28030fdc8d8SChris Lattner                             strm.IndentLess ();
28130fdc8d8SChris Lattner                     }
28230fdc8d8SChris Lattner                     else
28330fdc8d8SChris Lattner                     {
28430fdc8d8SChris Lattner                         break;
28530fdc8d8SChris Lattner                     }
28630fdc8d8SChris Lattner                 }
287dda4f7b5SGreg Clayton                 if (num_mixed_context_lines)
28830fdc8d8SChris Lattner                     strm.IndentLess ();
28930fdc8d8SChris Lattner 
29030fdc8d8SChris Lattner             }
29130fdc8d8SChris Lattner         }
29230fdc8d8SChris Lattner         return true;
29330fdc8d8SChris Lattner     }
29430fdc8d8SChris Lattner     return false;
29530fdc8d8SChris Lattner }
29630fdc8d8SChris Lattner 
297dda4f7b5SGreg Clayton 
298dda4f7b5SGreg Clayton bool
299dda4f7b5SGreg Clayton Disassembler::Disassemble
300dda4f7b5SGreg Clayton (
301dda4f7b5SGreg Clayton     Debugger &debugger,
302dda4f7b5SGreg Clayton     const ArchSpec &arch,
303dda4f7b5SGreg Clayton     const ExecutionContext &exe_ctx,
304dda4f7b5SGreg Clayton     uint32_t num_mixed_context_lines,
305dda4f7b5SGreg Clayton     bool show_bytes,
306dda4f7b5SGreg Clayton     Stream &strm
307dda4f7b5SGreg Clayton )
308dda4f7b5SGreg Clayton {
309dda4f7b5SGreg Clayton     AddressRange range;
310dda4f7b5SGreg Clayton     if (exe_ctx.frame)
311dda4f7b5SGreg Clayton     {
312dda4f7b5SGreg Clayton         SymbolContext sc(exe_ctx.frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextSymbol));
313dda4f7b5SGreg Clayton         if (sc.function)
314dda4f7b5SGreg Clayton         {
315dda4f7b5SGreg Clayton             range = sc.function->GetAddressRange();
316dda4f7b5SGreg Clayton         }
317dda4f7b5SGreg Clayton         else if (sc.symbol && sc.symbol->GetAddressRangePtr())
318dda4f7b5SGreg Clayton         {
319dda4f7b5SGreg Clayton             range = *sc.symbol->GetAddressRangePtr();
320dda4f7b5SGreg Clayton         }
321dda4f7b5SGreg Clayton         else
322dda4f7b5SGreg Clayton         {
3239da7bd07SGreg Clayton             range.GetBaseAddress() = exe_ctx.frame->GetFrameCodeAddress();
324dda4f7b5SGreg Clayton         }
325dda4f7b5SGreg Clayton 
326dda4f7b5SGreg Clayton         if (range.GetBaseAddress().IsValid() && range.GetByteSize() == 0)
327dda4f7b5SGreg Clayton             range.SetByteSize (DEFAULT_DISASM_BYTE_SIZE);
328dda4f7b5SGreg Clayton     }
329dda4f7b5SGreg Clayton 
330dda4f7b5SGreg Clayton     return Disassemble(debugger, arch, exe_ctx, range, num_mixed_context_lines, show_bytes, strm);
331dda4f7b5SGreg Clayton }
332dda4f7b5SGreg Clayton 
33330fdc8d8SChris Lattner Disassembler::Instruction::Instruction()
33430fdc8d8SChris Lattner {
33530fdc8d8SChris Lattner }
33630fdc8d8SChris Lattner 
33730fdc8d8SChris Lattner Disassembler::Instruction::~Instruction()
33830fdc8d8SChris Lattner {
33930fdc8d8SChris Lattner }
34030fdc8d8SChris Lattner 
34130fdc8d8SChris Lattner 
34230fdc8d8SChris Lattner Disassembler::InstructionList::InstructionList() :
34330fdc8d8SChris Lattner     m_instructions()
34430fdc8d8SChris Lattner {
34530fdc8d8SChris Lattner }
34630fdc8d8SChris Lattner 
34730fdc8d8SChris Lattner Disassembler::InstructionList::~InstructionList()
34830fdc8d8SChris Lattner {
34930fdc8d8SChris Lattner }
35030fdc8d8SChris Lattner 
35130fdc8d8SChris Lattner size_t
35230fdc8d8SChris Lattner Disassembler::InstructionList::GetSize() const
35330fdc8d8SChris Lattner {
35430fdc8d8SChris Lattner     return m_instructions.size();
35530fdc8d8SChris Lattner }
35630fdc8d8SChris Lattner 
35730fdc8d8SChris Lattner 
35830fdc8d8SChris Lattner Disassembler::Instruction *
35930fdc8d8SChris Lattner Disassembler::InstructionList::GetInstructionAtIndex (uint32_t idx)
36030fdc8d8SChris Lattner {
36130fdc8d8SChris Lattner     if (idx < m_instructions.size())
36230fdc8d8SChris Lattner         return m_instructions[idx].get();
36330fdc8d8SChris Lattner     return NULL;
36430fdc8d8SChris Lattner }
36530fdc8d8SChris Lattner 
36630fdc8d8SChris Lattner const Disassembler::Instruction *
36730fdc8d8SChris Lattner Disassembler::InstructionList::GetInstructionAtIndex (uint32_t idx) const
36830fdc8d8SChris Lattner {
36930fdc8d8SChris Lattner     if (idx < m_instructions.size())
37030fdc8d8SChris Lattner         return m_instructions[idx].get();
37130fdc8d8SChris Lattner     return NULL;
37230fdc8d8SChris Lattner }
37330fdc8d8SChris Lattner 
37430fdc8d8SChris Lattner void
37530fdc8d8SChris Lattner Disassembler::InstructionList::Clear()
37630fdc8d8SChris Lattner {
37730fdc8d8SChris Lattner   m_instructions.clear();
37830fdc8d8SChris Lattner }
37930fdc8d8SChris Lattner 
38030fdc8d8SChris Lattner void
38130fdc8d8SChris Lattner Disassembler::InstructionList::AppendInstruction (Instruction::shared_ptr &inst_sp)
38230fdc8d8SChris Lattner {
38330fdc8d8SChris Lattner     if (inst_sp)
38430fdc8d8SChris Lattner         m_instructions.push_back(inst_sp);
38530fdc8d8SChris Lattner }
38630fdc8d8SChris Lattner 
38730fdc8d8SChris Lattner 
38830fdc8d8SChris Lattner size_t
38930fdc8d8SChris Lattner Disassembler::ParseInstructions
39030fdc8d8SChris Lattner (
39130fdc8d8SChris Lattner     const ExecutionContext *exe_ctx,
392dda4f7b5SGreg Clayton     const AddressRange &range,
39330fdc8d8SChris Lattner     DataExtractor& data
39430fdc8d8SChris Lattner )
39530fdc8d8SChris Lattner {
396dda4f7b5SGreg Clayton     Target *target = exe_ctx->target;
39730fdc8d8SChris Lattner 
398dda4f7b5SGreg Clayton     const addr_t byte_size = range.GetByteSize();
399dda4f7b5SGreg Clayton     if (target == NULL || byte_size == 0 || !range.GetBaseAddress().IsValid())
40030fdc8d8SChris Lattner         return 0;
40130fdc8d8SChris Lattner 
402dda4f7b5SGreg Clayton     DataBufferHeap *heap_buffer = new DataBufferHeap (byte_size, '\0');
403dda4f7b5SGreg Clayton     DataBufferSP data_sp(heap_buffer);
40430fdc8d8SChris Lattner 
40530fdc8d8SChris Lattner     Error error;
406dda4f7b5SGreg Clayton     const size_t bytes_read = target->ReadMemory (range.GetBaseAddress(), heap_buffer->GetBytes(), heap_buffer->GetByteSize(), error);
407dda4f7b5SGreg Clayton 
408dda4f7b5SGreg Clayton     if (bytes_read > 0)
40930fdc8d8SChris Lattner     {
410dda4f7b5SGreg Clayton         if (bytes_read != heap_buffer->GetByteSize())
411dda4f7b5SGreg Clayton             heap_buffer->SetByteSize (bytes_read);
412dda4f7b5SGreg Clayton 
41330fdc8d8SChris Lattner         data.SetData(data_sp);
414dda4f7b5SGreg Clayton         if (exe_ctx->process)
415dda4f7b5SGreg Clayton         {
416dda4f7b5SGreg Clayton             data.SetByteOrder(exe_ctx->process->GetByteOrder());
417dda4f7b5SGreg Clayton             data.SetAddressByteSize(exe_ctx->process->GetAddressByteSize());
418dda4f7b5SGreg Clayton         }
419dda4f7b5SGreg Clayton         else
420dda4f7b5SGreg Clayton         {
421dda4f7b5SGreg Clayton             data.SetByteOrder(target->GetArchitecture().GetDefaultEndian());
422dda4f7b5SGreg Clayton             data.SetAddressByteSize(target->GetArchitecture().GetAddressByteSize());
423dda4f7b5SGreg Clayton         }
424dda4f7b5SGreg Clayton         return DecodeInstructions (data, 0, UINT32_MAX);
42530fdc8d8SChris Lattner     }
42630fdc8d8SChris Lattner 
42730fdc8d8SChris Lattner     return 0;
42830fdc8d8SChris Lattner }
42930fdc8d8SChris Lattner 
43030fdc8d8SChris Lattner //----------------------------------------------------------------------
43130fdc8d8SChris Lattner // Disassembler copy constructor
43230fdc8d8SChris Lattner //----------------------------------------------------------------------
43330fdc8d8SChris Lattner Disassembler::Disassembler(const ArchSpec& arch) :
43430fdc8d8SChris Lattner     m_arch (arch),
43530fdc8d8SChris Lattner     m_instruction_list(),
43630fdc8d8SChris Lattner     m_base_addr(LLDB_INVALID_ADDRESS)
43730fdc8d8SChris Lattner {
43830fdc8d8SChris Lattner 
43930fdc8d8SChris Lattner }
44030fdc8d8SChris Lattner 
44130fdc8d8SChris Lattner //----------------------------------------------------------------------
44230fdc8d8SChris Lattner // Destructor
44330fdc8d8SChris Lattner //----------------------------------------------------------------------
44430fdc8d8SChris Lattner Disassembler::~Disassembler()
44530fdc8d8SChris Lattner {
44630fdc8d8SChris Lattner }
44730fdc8d8SChris Lattner 
44830fdc8d8SChris Lattner Disassembler::InstructionList &
44930fdc8d8SChris Lattner Disassembler::GetInstructionList ()
45030fdc8d8SChris Lattner {
45130fdc8d8SChris Lattner     return m_instruction_list;
45230fdc8d8SChris Lattner }
45330fdc8d8SChris Lattner 
45430fdc8d8SChris Lattner const Disassembler::InstructionList &
45530fdc8d8SChris Lattner Disassembler::GetInstructionList () const
45630fdc8d8SChris Lattner {
45730fdc8d8SChris Lattner     return m_instruction_list;
45830fdc8d8SChris Lattner }
459