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     SymbolContextList sc_list;
103931180e6SGreg Clayton     if (name)
104931180e6SGreg Clayton     {
105931180e6SGreg Clayton         const bool include_symbols = true;
106dda4f7b5SGreg Clayton         if (module)
107dda4f7b5SGreg Clayton         {
108931180e6SGreg Clayton             module->FindFunctions (name,
1096dbd3983SGreg Clayton                                    eFunctionNameTypeBase |
1106dbd3983SGreg Clayton                                    eFunctionNameTypeFull |
1116dbd3983SGreg Clayton                                    eFunctionNameTypeMethod |
1126dbd3983SGreg Clayton                                    eFunctionNameTypeSelector,
113931180e6SGreg Clayton                                    include_symbols,
114dda4f7b5SGreg Clayton                                    true,
115931180e6SGreg Clayton                                    sc_list);
116dda4f7b5SGreg Clayton         }
117931180e6SGreg Clayton         else if (exe_ctx.target)
118dda4f7b5SGreg Clayton         {
119931180e6SGreg Clayton             exe_ctx.target->GetImages().FindFunctions (name,
1206dbd3983SGreg Clayton                                                        eFunctionNameTypeBase |
1216dbd3983SGreg Clayton                                                        eFunctionNameTypeFull |
1226dbd3983SGreg Clayton                                                        eFunctionNameTypeMethod |
1236dbd3983SGreg Clayton                                                        eFunctionNameTypeSelector,
124931180e6SGreg Clayton                                                        include_symbols,
1258ade104aSSean Callanan                                                        false,
126931180e6SGreg Clayton                                                        sc_list);
127dda4f7b5SGreg Clayton         }
128dda4f7b5SGreg Clayton     }
129931180e6SGreg Clayton 
130931180e6SGreg Clayton     if (sc_list.GetSize ())
131931180e6SGreg Clayton     {
132931180e6SGreg Clayton         return Disassemble (debugger,
133931180e6SGreg Clayton                             arch,
134931180e6SGreg Clayton                             exe_ctx,
135931180e6SGreg Clayton                             sc_list,
136931180e6SGreg Clayton                             num_mixed_context_lines,
137931180e6SGreg Clayton                             show_bytes,
138931180e6SGreg Clayton                             strm);
139dda4f7b5SGreg Clayton     }
140dda4f7b5SGreg Clayton     return false;
141dda4f7b5SGreg Clayton }
142dda4f7b5SGreg Clayton 
1431d273166SGreg Clayton 
1441d273166SGreg Clayton lldb::DisassemblerSP
1451d273166SGreg Clayton Disassembler::DisassembleRange
1461d273166SGreg Clayton (
1471d273166SGreg Clayton     const ArchSpec &arch,
1481d273166SGreg Clayton     const ExecutionContext &exe_ctx,
1491d273166SGreg Clayton     const AddressRange &range
1501d273166SGreg Clayton )
1511d273166SGreg Clayton {
1521d273166SGreg Clayton     lldb::DisassemblerSP disasm_sp;
1531d273166SGreg Clayton     if (range.GetByteSize() > 0 && range.GetBaseAddress().IsValid())
1541d273166SGreg Clayton     {
1551d273166SGreg Clayton         disasm_sp.reset (Disassembler::FindPlugin(arch));
1561d273166SGreg Clayton 
1571d273166SGreg Clayton         if (disasm_sp)
1581d273166SGreg Clayton         {
1591d273166SGreg Clayton             DataExtractor data;
1601d273166SGreg Clayton             size_t bytes_disassembled = disasm_sp->ParseInstructions (&exe_ctx, range, data);
1611d273166SGreg Clayton             if (bytes_disassembled == 0)
1621d273166SGreg Clayton                 disasm_sp.reset();
1631d273166SGreg Clayton         }
1641d273166SGreg Clayton     }
1651d273166SGreg Clayton     return disasm_sp;
1661d273166SGreg Clayton }
1671d273166SGreg Clayton 
1681d273166SGreg Clayton 
169dda4f7b5SGreg Clayton bool
170dda4f7b5SGreg Clayton Disassembler::Disassemble
171dda4f7b5SGreg Clayton (
172dda4f7b5SGreg Clayton     Debugger &debugger,
173dda4f7b5SGreg Clayton     const ArchSpec &arch,
174dda4f7b5SGreg Clayton     const ExecutionContext &exe_ctx,
175dda4f7b5SGreg Clayton     const AddressRange &disasm_range,
176dda4f7b5SGreg Clayton     uint32_t num_mixed_context_lines,
177dda4f7b5SGreg Clayton     bool show_bytes,
178dda4f7b5SGreg Clayton     Stream &strm
179dda4f7b5SGreg Clayton )
180dda4f7b5SGreg Clayton {
181dda4f7b5SGreg Clayton     if (disasm_range.GetByteSize())
182dda4f7b5SGreg Clayton     {
1831d273166SGreg Clayton         std::auto_ptr<Disassembler> disasm_ap (Disassembler::FindPlugin(arch));
18430fdc8d8SChris Lattner 
1851d273166SGreg Clayton         if (disasm_ap.get())
18630fdc8d8SChris Lattner         {
187dda4f7b5SGreg Clayton             AddressRange range(disasm_range);
188dda4f7b5SGreg Clayton 
189dda4f7b5SGreg Clayton             Process *process = exe_ctx.process;
190dda4f7b5SGreg Clayton 
191dda4f7b5SGreg Clayton             // If we weren't passed in a section offset address range,
192dda4f7b5SGreg Clayton             // try and resolve it to something
193dda4f7b5SGreg Clayton             if (range.GetBaseAddress().IsSectionOffset() == false)
19430fdc8d8SChris Lattner             {
195f5e56de0SGreg Clayton                 if (exe_ctx.target)
19630fdc8d8SChris Lattner                 {
197f5e56de0SGreg Clayton                     if (exe_ctx.target->GetSectionLoadList().IsEmpty())
19830fdc8d8SChris Lattner                     {
199dda4f7b5SGreg Clayton                         exe_ctx.target->GetImages().ResolveFileAddress (range.GetBaseAddress().GetOffset(), range.GetBaseAddress());
20030fdc8d8SChris Lattner                     }
201f5e56de0SGreg Clayton                     else
202f5e56de0SGreg Clayton                     {
203f5e56de0SGreg Clayton                         exe_ctx.target->GetSectionLoadList().ResolveLoadAddress (range.GetBaseAddress().GetOffset(), range.GetBaseAddress());
20430fdc8d8SChris Lattner                     }
205f5e56de0SGreg Clayton                 }
206f5e56de0SGreg Clayton             }
207dda4f7b5SGreg Clayton 
20830fdc8d8SChris Lattner             DataExtractor data;
2091d273166SGreg Clayton             size_t bytes_disassembled = disasm_ap->ParseInstructions (&exe_ctx, range, data);
21030fdc8d8SChris Lattner             if (bytes_disassembled == 0)
21130fdc8d8SChris Lattner             {
21230fdc8d8SChris Lattner                 return false;
21330fdc8d8SChris Lattner             }
21430fdc8d8SChris Lattner             else
21530fdc8d8SChris Lattner             {
21630fdc8d8SChris Lattner                 // We got some things disassembled...
2171d273166SGreg Clayton                 size_t num_instructions = disasm_ap->GetInstructionList().GetSize();
21830fdc8d8SChris Lattner                 uint32_t offset = 0;
21930fdc8d8SChris Lattner                 SymbolContext sc;
22030fdc8d8SChris Lattner                 SymbolContext prev_sc;
22130fdc8d8SChris Lattner                 AddressRange sc_range;
222dda4f7b5SGreg Clayton                 if (num_mixed_context_lines)
22330fdc8d8SChris Lattner                     strm.IndentMore ();
22430fdc8d8SChris Lattner 
225dda4f7b5SGreg Clayton 
226dda4f7b5SGreg Clayton                 Address addr(range.GetBaseAddress());
227dda4f7b5SGreg Clayton 
228dda4f7b5SGreg Clayton                 // We extract the section to make sure we don't transition out
229dda4f7b5SGreg Clayton                 // of the current section when disassembling
230dda4f7b5SGreg Clayton                 const Section *addr_section = addr.GetSection();
231dda4f7b5SGreg Clayton                 Module *range_module = range.GetBaseAddress().GetModule();
232dda4f7b5SGreg Clayton 
23330fdc8d8SChris Lattner                 for (size_t i=0; i<num_instructions; ++i)
23430fdc8d8SChris Lattner                 {
2351d273166SGreg Clayton                     Instruction *inst = disasm_ap->GetInstructionList().GetInstructionAtIndex (i).get();
23630fdc8d8SChris Lattner                     if (inst)
23730fdc8d8SChris Lattner                     {
238dda4f7b5SGreg Clayton                         addr_t file_addr = addr.GetFileAddress();
239dda4f7b5SGreg Clayton                         if (addr_section == NULL || addr_section->ContainsFileAddress (file_addr) == false)
24030fdc8d8SChris Lattner                         {
241dda4f7b5SGreg Clayton                             if (range_module)
242dda4f7b5SGreg Clayton                                 range_module->ResolveFileAddress (file_addr, addr);
243dda4f7b5SGreg Clayton                             else if (exe_ctx.target)
244dda4f7b5SGreg Clayton                                 exe_ctx.target->GetImages().ResolveFileAddress (file_addr, addr);
245dda4f7b5SGreg Clayton 
246dda4f7b5SGreg Clayton                             addr_section = addr.GetSection();
247dda4f7b5SGreg Clayton                         }
248dda4f7b5SGreg Clayton 
24930fdc8d8SChris Lattner                         prev_sc = sc;
250dda4f7b5SGreg Clayton 
251dda4f7b5SGreg Clayton                         if (addr_section)
25230fdc8d8SChris Lattner                         {
253dda4f7b5SGreg Clayton                             Module *module = addr_section->GetModule();
254dda4f7b5SGreg Clayton                             uint32_t resolved_mask = module->ResolveSymbolContextForAddress(addr, eSymbolContextEverything, sc);
25530fdc8d8SChris Lattner                             if (resolved_mask)
25630fdc8d8SChris Lattner                             {
2573c68757cSGreg Clayton                                 if (!(prev_sc.function == sc.function || prev_sc.symbol == sc.symbol))
258dda4f7b5SGreg Clayton                                 {
259dda4f7b5SGreg Clayton                                     if (prev_sc.function || prev_sc.symbol)
260dda4f7b5SGreg Clayton                                         strm.EOL();
261dda4f7b5SGreg Clayton 
262dda4f7b5SGreg Clayton                                     strm << sc.module_sp->GetFileSpec().GetFilename();
263dda4f7b5SGreg Clayton 
264dda4f7b5SGreg Clayton                                     if (sc.function)
265dda4f7b5SGreg Clayton                                         strm << '`' << sc.function->GetMangled().GetName();
266dda4f7b5SGreg Clayton                                     else if (sc.symbol)
267dda4f7b5SGreg Clayton                                         strm << '`' << sc.symbol->GetMangled().GetName();
268dda4f7b5SGreg Clayton                                     strm << ":\n";
269dda4f7b5SGreg Clayton                                 }
270dda4f7b5SGreg Clayton 
271dda4f7b5SGreg Clayton                                 if (num_mixed_context_lines && !sc_range.ContainsFileAddress (addr))
272dda4f7b5SGreg Clayton                                 {
27330fdc8d8SChris Lattner                                     sc.GetAddressRange (eSymbolContextEverything, sc_range);
274dda4f7b5SGreg Clayton 
27530fdc8d8SChris Lattner                                     if (sc != prev_sc)
27630fdc8d8SChris Lattner                                     {
27730fdc8d8SChris Lattner                                         if (offset != 0)
27830fdc8d8SChris Lattner                                             strm.EOL();
27930fdc8d8SChris Lattner 
2806dbd3983SGreg Clayton                                         sc.DumpStopContext(&strm, process, addr, false, true, false);
2816dbd3983SGreg Clayton                                         strm.EOL();
28230fdc8d8SChris Lattner 
28330fdc8d8SChris Lattner                                         if (sc.comp_unit && sc.line_entry.IsValid())
28430fdc8d8SChris Lattner                                         {
285dda4f7b5SGreg Clayton                                             debugger.GetSourceManager().DisplaySourceLinesWithLineNumbers (sc.line_entry.file,
28630fdc8d8SChris Lattner                                                                                                            sc.line_entry.line,
287dda4f7b5SGreg Clayton                                                                                                            num_mixed_context_lines,
288dda4f7b5SGreg Clayton                                                                                                            num_mixed_context_lines,
289dda4f7b5SGreg Clayton                                                                                                            num_mixed_context_lines ? "->" : "",
29030fdc8d8SChris Lattner                                                                                                            &strm);
29130fdc8d8SChris Lattner                                         }
29230fdc8d8SChris Lattner                                     }
29330fdc8d8SChris Lattner                                 }
29430fdc8d8SChris Lattner                             }
295dda4f7b5SGreg Clayton                             else
296dda4f7b5SGreg Clayton                             {
297dda4f7b5SGreg Clayton                                 sc.Clear();
29830fdc8d8SChris Lattner                             }
29930fdc8d8SChris Lattner                         }
300dda4f7b5SGreg Clayton                         if (num_mixed_context_lines)
30130fdc8d8SChris Lattner                             strm.IndentMore ();
30230fdc8d8SChris Lattner                         strm.Indent();
30330fdc8d8SChris Lattner                         size_t inst_byte_size = inst->GetByteSize();
3041d273166SGreg Clayton                         inst->Dump(&strm, true, show_bytes ? &data : NULL, offset, &exe_ctx, show_bytes);
30530fdc8d8SChris Lattner                         strm.EOL();
30630fdc8d8SChris Lattner                         offset += inst_byte_size;
307dda4f7b5SGreg Clayton 
308dda4f7b5SGreg Clayton                         addr.SetOffset (addr.GetOffset() + inst_byte_size);
309dda4f7b5SGreg Clayton 
310dda4f7b5SGreg Clayton                         if (num_mixed_context_lines)
31130fdc8d8SChris Lattner                             strm.IndentLess ();
31230fdc8d8SChris Lattner                     }
31330fdc8d8SChris Lattner                     else
31430fdc8d8SChris Lattner                     {
31530fdc8d8SChris Lattner                         break;
31630fdc8d8SChris Lattner                     }
31730fdc8d8SChris Lattner                 }
318dda4f7b5SGreg Clayton                 if (num_mixed_context_lines)
31930fdc8d8SChris Lattner                     strm.IndentLess ();
32030fdc8d8SChris Lattner 
32130fdc8d8SChris Lattner             }
32230fdc8d8SChris Lattner         }
32330fdc8d8SChris Lattner         return true;
32430fdc8d8SChris Lattner     }
32530fdc8d8SChris Lattner     return false;
32630fdc8d8SChris Lattner }
32730fdc8d8SChris Lattner 
328dda4f7b5SGreg Clayton 
329dda4f7b5SGreg Clayton bool
330dda4f7b5SGreg Clayton Disassembler::Disassemble
331dda4f7b5SGreg Clayton (
332dda4f7b5SGreg Clayton     Debugger &debugger,
333dda4f7b5SGreg Clayton     const ArchSpec &arch,
334dda4f7b5SGreg Clayton     const ExecutionContext &exe_ctx,
335dda4f7b5SGreg Clayton     uint32_t num_mixed_context_lines,
336dda4f7b5SGreg Clayton     bool show_bytes,
337dda4f7b5SGreg Clayton     Stream &strm
338dda4f7b5SGreg Clayton )
339dda4f7b5SGreg Clayton {
340dda4f7b5SGreg Clayton     AddressRange range;
341dda4f7b5SGreg Clayton     if (exe_ctx.frame)
342dda4f7b5SGreg Clayton     {
343dda4f7b5SGreg Clayton         SymbolContext sc(exe_ctx.frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextSymbol));
344dda4f7b5SGreg Clayton         if (sc.function)
345dda4f7b5SGreg Clayton         {
346dda4f7b5SGreg Clayton             range = sc.function->GetAddressRange();
347dda4f7b5SGreg Clayton         }
348dda4f7b5SGreg Clayton         else if (sc.symbol && sc.symbol->GetAddressRangePtr())
349dda4f7b5SGreg Clayton         {
350dda4f7b5SGreg Clayton             range = *sc.symbol->GetAddressRangePtr();
351dda4f7b5SGreg Clayton         }
352dda4f7b5SGreg Clayton         else
353dda4f7b5SGreg Clayton         {
3549da7bd07SGreg Clayton             range.GetBaseAddress() = exe_ctx.frame->GetFrameCodeAddress();
355dda4f7b5SGreg Clayton         }
356dda4f7b5SGreg Clayton 
357dda4f7b5SGreg Clayton         if (range.GetBaseAddress().IsValid() && range.GetByteSize() == 0)
358dda4f7b5SGreg Clayton             range.SetByteSize (DEFAULT_DISASM_BYTE_SIZE);
359dda4f7b5SGreg Clayton     }
360dda4f7b5SGreg Clayton 
361dda4f7b5SGreg Clayton     return Disassemble(debugger, arch, exe_ctx, range, num_mixed_context_lines, show_bytes, strm);
362dda4f7b5SGreg Clayton }
363dda4f7b5SGreg Clayton 
3641d273166SGreg Clayton Instruction::Instruction(const Address &addr) :
3651d273166SGreg Clayton     m_addr (addr)
36630fdc8d8SChris Lattner {
36730fdc8d8SChris Lattner }
36830fdc8d8SChris Lattner 
3691d273166SGreg Clayton Instruction::~Instruction()
37030fdc8d8SChris Lattner {
37130fdc8d8SChris Lattner }
37230fdc8d8SChris Lattner 
37330fdc8d8SChris Lattner 
3741d273166SGreg Clayton InstructionList::InstructionList() :
37530fdc8d8SChris Lattner     m_instructions()
37630fdc8d8SChris Lattner {
37730fdc8d8SChris Lattner }
37830fdc8d8SChris Lattner 
3791d273166SGreg Clayton InstructionList::~InstructionList()
38030fdc8d8SChris Lattner {
38130fdc8d8SChris Lattner }
38230fdc8d8SChris Lattner 
38330fdc8d8SChris Lattner size_t
3841d273166SGreg Clayton InstructionList::GetSize() const
38530fdc8d8SChris Lattner {
38630fdc8d8SChris Lattner     return m_instructions.size();
38730fdc8d8SChris Lattner }
38830fdc8d8SChris Lattner 
38930fdc8d8SChris Lattner 
3901d273166SGreg Clayton InstructionSP
3911d273166SGreg Clayton InstructionList::GetInstructionAtIndex (uint32_t idx) const
39230fdc8d8SChris Lattner {
3931d273166SGreg Clayton     InstructionSP inst_sp;
39430fdc8d8SChris Lattner     if (idx < m_instructions.size())
3951d273166SGreg Clayton         inst_sp = m_instructions[idx];
3961d273166SGreg Clayton     return inst_sp;
39730fdc8d8SChris Lattner }
39830fdc8d8SChris Lattner 
39930fdc8d8SChris Lattner void
4001d273166SGreg Clayton InstructionList::Clear()
40130fdc8d8SChris Lattner {
40230fdc8d8SChris Lattner   m_instructions.clear();
40330fdc8d8SChris Lattner }
40430fdc8d8SChris Lattner 
40530fdc8d8SChris Lattner void
4061d273166SGreg Clayton InstructionList::Append (lldb::InstructionSP &inst_sp)
40730fdc8d8SChris Lattner {
40830fdc8d8SChris Lattner     if (inst_sp)
40930fdc8d8SChris Lattner         m_instructions.push_back(inst_sp);
41030fdc8d8SChris Lattner }
41130fdc8d8SChris Lattner 
41230fdc8d8SChris Lattner 
41330fdc8d8SChris Lattner size_t
41430fdc8d8SChris Lattner Disassembler::ParseInstructions
41530fdc8d8SChris Lattner (
41630fdc8d8SChris Lattner     const ExecutionContext *exe_ctx,
417dda4f7b5SGreg Clayton     const AddressRange &range,
41830fdc8d8SChris Lattner     DataExtractor& data
41930fdc8d8SChris Lattner )
42030fdc8d8SChris Lattner {
421dda4f7b5SGreg Clayton     Target *target = exe_ctx->target;
422dda4f7b5SGreg Clayton     const addr_t byte_size = range.GetByteSize();
423dda4f7b5SGreg Clayton     if (target == NULL || byte_size == 0 || !range.GetBaseAddress().IsValid())
42430fdc8d8SChris Lattner         return 0;
42530fdc8d8SChris Lattner 
426dda4f7b5SGreg Clayton     DataBufferHeap *heap_buffer = new DataBufferHeap (byte_size, '\0');
427dda4f7b5SGreg Clayton     DataBufferSP data_sp(heap_buffer);
42830fdc8d8SChris Lattner 
42930fdc8d8SChris Lattner     Error error;
430db598230SGreg Clayton     bool prefer_file_cache = true;
431db598230SGreg Clayton     const size_t bytes_read = target->ReadMemory (range.GetBaseAddress(), prefer_file_cache, heap_buffer->GetBytes(), heap_buffer->GetByteSize(), error);
432dda4f7b5SGreg Clayton 
433dda4f7b5SGreg Clayton     if (bytes_read > 0)
43430fdc8d8SChris Lattner     {
435dda4f7b5SGreg Clayton         if (bytes_read != heap_buffer->GetByteSize())
436dda4f7b5SGreg Clayton             heap_buffer->SetByteSize (bytes_read);
437dda4f7b5SGreg Clayton 
43830fdc8d8SChris Lattner         data.SetData(data_sp);
439*514487e8SGreg Clayton         data.SetByteOrder(target->GetArchitecture().GetByteOrder());
440dda4f7b5SGreg Clayton         data.SetAddressByteSize(target->GetArchitecture().GetAddressByteSize());
4411d273166SGreg Clayton         return DecodeInstructions (range.GetBaseAddress(), data, 0, UINT32_MAX);
44230fdc8d8SChris Lattner     }
44330fdc8d8SChris Lattner 
44430fdc8d8SChris Lattner     return 0;
44530fdc8d8SChris Lattner }
44630fdc8d8SChris Lattner 
44730fdc8d8SChris Lattner //----------------------------------------------------------------------
44830fdc8d8SChris Lattner // Disassembler copy constructor
44930fdc8d8SChris Lattner //----------------------------------------------------------------------
45030fdc8d8SChris Lattner Disassembler::Disassembler(const ArchSpec& arch) :
45130fdc8d8SChris Lattner     m_arch (arch),
45230fdc8d8SChris Lattner     m_instruction_list(),
45330fdc8d8SChris Lattner     m_base_addr(LLDB_INVALID_ADDRESS)
45430fdc8d8SChris Lattner {
45530fdc8d8SChris Lattner 
45630fdc8d8SChris Lattner }
45730fdc8d8SChris Lattner 
45830fdc8d8SChris Lattner //----------------------------------------------------------------------
45930fdc8d8SChris Lattner // Destructor
46030fdc8d8SChris Lattner //----------------------------------------------------------------------
46130fdc8d8SChris Lattner Disassembler::~Disassembler()
46230fdc8d8SChris Lattner {
46330fdc8d8SChris Lattner }
46430fdc8d8SChris Lattner 
4651d273166SGreg Clayton InstructionList &
46630fdc8d8SChris Lattner Disassembler::GetInstructionList ()
46730fdc8d8SChris Lattner {
46830fdc8d8SChris Lattner     return m_instruction_list;
46930fdc8d8SChris Lattner }
47030fdc8d8SChris Lattner 
4711d273166SGreg Clayton const InstructionList &
47230fdc8d8SChris Lattner Disassembler::GetInstructionList () const
47330fdc8d8SChris Lattner {
47430fdc8d8SChris Lattner     return m_instruction_list;
47530fdc8d8SChris Lattner }
476