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)",
4164195a2cSGreg Clayton                         arch.GetArchitectureName());
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,
66*b3396b22SSean Callanan     bool raw,
67dda4f7b5SGreg Clayton     Stream &strm
68dda4f7b5SGreg Clayton )
69dda4f7b5SGreg Clayton {
70dda4f7b5SGreg Clayton     size_t success_count = 0;
71dda4f7b5SGreg Clayton     const size_t count = sc_list.GetSize();
72dda4f7b5SGreg Clayton     SymbolContext sc;
73dda4f7b5SGreg Clayton     AddressRange range;
74dda4f7b5SGreg Clayton     for (size_t i=0; i<count; ++i)
75dda4f7b5SGreg Clayton     {
76dda4f7b5SGreg Clayton         if (sc_list.GetContextAtIndex(i, sc) == false)
77dda4f7b5SGreg Clayton             break;
78dda4f7b5SGreg Clayton         if (sc.GetAddressRange(eSymbolContextFunction | eSymbolContextSymbol, range))
79dda4f7b5SGreg Clayton         {
80*b3396b22SSean Callanan             if (Disassemble (debugger, arch, exe_ctx, range, num_mixed_context_lines, show_bytes, raw, strm))
81dda4f7b5SGreg Clayton             {
82dda4f7b5SGreg Clayton                 ++success_count;
83dda4f7b5SGreg Clayton                 strm.EOL();
84dda4f7b5SGreg Clayton             }
85dda4f7b5SGreg Clayton         }
86dda4f7b5SGreg Clayton     }
87dda4f7b5SGreg Clayton     return success_count;
88dda4f7b5SGreg Clayton }
89dda4f7b5SGreg Clayton 
9030fdc8d8SChris Lattner bool
9130fdc8d8SChris Lattner Disassembler::Disassemble
9230fdc8d8SChris Lattner (
936611103cSGreg Clayton     Debugger &debugger,
9430fdc8d8SChris Lattner     const ArchSpec &arch,
9530fdc8d8SChris Lattner     const ExecutionContext &exe_ctx,
96dda4f7b5SGreg Clayton     const ConstString &name,
97dda4f7b5SGreg Clayton     Module *module,
98dda4f7b5SGreg Clayton     uint32_t num_mixed_context_lines,
99dda4f7b5SGreg Clayton     bool show_bytes,
100*b3396b22SSean Callanan     bool raw,
10130fdc8d8SChris Lattner     Stream &strm
10230fdc8d8SChris Lattner )
10330fdc8d8SChris Lattner {
104dda4f7b5SGreg Clayton     SymbolContextList sc_list;
105931180e6SGreg Clayton     if (name)
106931180e6SGreg Clayton     {
107931180e6SGreg Clayton         const bool include_symbols = true;
108dda4f7b5SGreg Clayton         if (module)
109dda4f7b5SGreg Clayton         {
110931180e6SGreg Clayton             module->FindFunctions (name,
1116dbd3983SGreg Clayton                                    eFunctionNameTypeBase |
1126dbd3983SGreg Clayton                                    eFunctionNameTypeFull |
1136dbd3983SGreg Clayton                                    eFunctionNameTypeMethod |
1146dbd3983SGreg Clayton                                    eFunctionNameTypeSelector,
115931180e6SGreg Clayton                                    include_symbols,
116dda4f7b5SGreg Clayton                                    true,
117931180e6SGreg Clayton                                    sc_list);
118dda4f7b5SGreg Clayton         }
119931180e6SGreg Clayton         else if (exe_ctx.target)
120dda4f7b5SGreg Clayton         {
121931180e6SGreg Clayton             exe_ctx.target->GetImages().FindFunctions (name,
1226dbd3983SGreg Clayton                                                        eFunctionNameTypeBase |
1236dbd3983SGreg Clayton                                                        eFunctionNameTypeFull |
1246dbd3983SGreg Clayton                                                        eFunctionNameTypeMethod |
1256dbd3983SGreg Clayton                                                        eFunctionNameTypeSelector,
126931180e6SGreg Clayton                                                        include_symbols,
1278ade104aSSean Callanan                                                        false,
128931180e6SGreg Clayton                                                        sc_list);
129dda4f7b5SGreg Clayton         }
130dda4f7b5SGreg Clayton     }
131931180e6SGreg Clayton 
132931180e6SGreg Clayton     if (sc_list.GetSize ())
133931180e6SGreg Clayton     {
134931180e6SGreg Clayton         return Disassemble (debugger,
135931180e6SGreg Clayton                             arch,
136931180e6SGreg Clayton                             exe_ctx,
137931180e6SGreg Clayton                             sc_list,
138931180e6SGreg Clayton                             num_mixed_context_lines,
139931180e6SGreg Clayton                             show_bytes,
140*b3396b22SSean Callanan                             raw,
141931180e6SGreg Clayton                             strm);
142dda4f7b5SGreg Clayton     }
143dda4f7b5SGreg Clayton     return false;
144dda4f7b5SGreg Clayton }
145dda4f7b5SGreg Clayton 
1461d273166SGreg Clayton 
1471d273166SGreg Clayton lldb::DisassemblerSP
1481d273166SGreg Clayton Disassembler::DisassembleRange
1491d273166SGreg Clayton (
1501d273166SGreg Clayton     const ArchSpec &arch,
1511d273166SGreg Clayton     const ExecutionContext &exe_ctx,
1521d273166SGreg Clayton     const AddressRange &range
1531d273166SGreg Clayton )
1541d273166SGreg Clayton {
1551d273166SGreg Clayton     lldb::DisassemblerSP disasm_sp;
1561d273166SGreg Clayton     if (range.GetByteSize() > 0 && range.GetBaseAddress().IsValid())
1571d273166SGreg Clayton     {
1581d273166SGreg Clayton         disasm_sp.reset (Disassembler::FindPlugin(arch));
1591d273166SGreg Clayton 
1601d273166SGreg Clayton         if (disasm_sp)
1611d273166SGreg Clayton         {
1621d273166SGreg Clayton             DataExtractor data;
1631d273166SGreg Clayton             size_t bytes_disassembled = disasm_sp->ParseInstructions (&exe_ctx, range, data);
1641d273166SGreg Clayton             if (bytes_disassembled == 0)
1651d273166SGreg Clayton                 disasm_sp.reset();
1661d273166SGreg Clayton         }
1671d273166SGreg Clayton     }
1681d273166SGreg Clayton     return disasm_sp;
1691d273166SGreg Clayton }
1701d273166SGreg Clayton 
1711d273166SGreg Clayton 
172dda4f7b5SGreg Clayton bool
173dda4f7b5SGreg Clayton Disassembler::Disassemble
174dda4f7b5SGreg Clayton (
175dda4f7b5SGreg Clayton     Debugger &debugger,
176dda4f7b5SGreg Clayton     const ArchSpec &arch,
177dda4f7b5SGreg Clayton     const ExecutionContext &exe_ctx,
178dda4f7b5SGreg Clayton     const AddressRange &disasm_range,
179dda4f7b5SGreg Clayton     uint32_t num_mixed_context_lines,
180dda4f7b5SGreg Clayton     bool show_bytes,
181*b3396b22SSean Callanan     bool raw,
182dda4f7b5SGreg Clayton     Stream &strm
183dda4f7b5SGreg Clayton )
184dda4f7b5SGreg Clayton {
185dda4f7b5SGreg Clayton     if (disasm_range.GetByteSize())
186dda4f7b5SGreg Clayton     {
1871d273166SGreg Clayton         std::auto_ptr<Disassembler> disasm_ap (Disassembler::FindPlugin(arch));
18830fdc8d8SChris Lattner 
1891d273166SGreg Clayton         if (disasm_ap.get())
19030fdc8d8SChris Lattner         {
191dda4f7b5SGreg Clayton             AddressRange range(disasm_range);
192dda4f7b5SGreg Clayton 
193dda4f7b5SGreg Clayton             Process *process = exe_ctx.process;
194dda4f7b5SGreg Clayton 
195dda4f7b5SGreg Clayton             // If we weren't passed in a section offset address range,
196dda4f7b5SGreg Clayton             // try and resolve it to something
197dda4f7b5SGreg Clayton             if (range.GetBaseAddress().IsSectionOffset() == false)
19830fdc8d8SChris Lattner             {
199f5e56de0SGreg Clayton                 if (exe_ctx.target)
20030fdc8d8SChris Lattner                 {
201f5e56de0SGreg Clayton                     if (exe_ctx.target->GetSectionLoadList().IsEmpty())
20230fdc8d8SChris Lattner                     {
203dda4f7b5SGreg Clayton                         exe_ctx.target->GetImages().ResolveFileAddress (range.GetBaseAddress().GetOffset(), range.GetBaseAddress());
20430fdc8d8SChris Lattner                     }
205f5e56de0SGreg Clayton                     else
206f5e56de0SGreg Clayton                     {
207f5e56de0SGreg Clayton                         exe_ctx.target->GetSectionLoadList().ResolveLoadAddress (range.GetBaseAddress().GetOffset(), range.GetBaseAddress());
20830fdc8d8SChris Lattner                     }
209f5e56de0SGreg Clayton                 }
210f5e56de0SGreg Clayton             }
211dda4f7b5SGreg Clayton 
21230fdc8d8SChris Lattner             DataExtractor data;
2131d273166SGreg Clayton             size_t bytes_disassembled = disasm_ap->ParseInstructions (&exe_ctx, range, data);
21430fdc8d8SChris Lattner             if (bytes_disassembled == 0)
21530fdc8d8SChris Lattner             {
21630fdc8d8SChris Lattner                 return false;
21730fdc8d8SChris Lattner             }
21830fdc8d8SChris Lattner             else
21930fdc8d8SChris Lattner             {
22030fdc8d8SChris Lattner                 // We got some things disassembled...
2211d273166SGreg Clayton                 size_t num_instructions = disasm_ap->GetInstructionList().GetSize();
22230fdc8d8SChris Lattner                 uint32_t offset = 0;
22330fdc8d8SChris Lattner                 SymbolContext sc;
22430fdc8d8SChris Lattner                 SymbolContext prev_sc;
22530fdc8d8SChris Lattner                 AddressRange sc_range;
226dda4f7b5SGreg Clayton                 if (num_mixed_context_lines)
22730fdc8d8SChris Lattner                     strm.IndentMore ();
22830fdc8d8SChris Lattner 
229dda4f7b5SGreg Clayton 
230dda4f7b5SGreg Clayton                 Address addr(range.GetBaseAddress());
231dda4f7b5SGreg Clayton 
232dda4f7b5SGreg Clayton                 // We extract the section to make sure we don't transition out
233dda4f7b5SGreg Clayton                 // of the current section when disassembling
234dda4f7b5SGreg Clayton                 const Section *addr_section = addr.GetSection();
235dda4f7b5SGreg Clayton                 Module *range_module = range.GetBaseAddress().GetModule();
236dda4f7b5SGreg Clayton 
23730fdc8d8SChris Lattner                 for (size_t i=0; i<num_instructions; ++i)
23830fdc8d8SChris Lattner                 {
2391d273166SGreg Clayton                     Instruction *inst = disasm_ap->GetInstructionList().GetInstructionAtIndex (i).get();
24030fdc8d8SChris Lattner                     if (inst)
24130fdc8d8SChris Lattner                     {
242dda4f7b5SGreg Clayton                         addr_t file_addr = addr.GetFileAddress();
243dda4f7b5SGreg Clayton                         if (addr_section == NULL || addr_section->ContainsFileAddress (file_addr) == false)
24430fdc8d8SChris Lattner                         {
245dda4f7b5SGreg Clayton                             if (range_module)
246dda4f7b5SGreg Clayton                                 range_module->ResolveFileAddress (file_addr, addr);
247dda4f7b5SGreg Clayton                             else if (exe_ctx.target)
248dda4f7b5SGreg Clayton                                 exe_ctx.target->GetImages().ResolveFileAddress (file_addr, addr);
249dda4f7b5SGreg Clayton 
250dda4f7b5SGreg Clayton                             addr_section = addr.GetSection();
251dda4f7b5SGreg Clayton                         }
252dda4f7b5SGreg Clayton 
25330fdc8d8SChris Lattner                         prev_sc = sc;
254dda4f7b5SGreg Clayton 
255dda4f7b5SGreg Clayton                         if (addr_section)
25630fdc8d8SChris Lattner                         {
257dda4f7b5SGreg Clayton                             Module *module = addr_section->GetModule();
258dda4f7b5SGreg Clayton                             uint32_t resolved_mask = module->ResolveSymbolContextForAddress(addr, eSymbolContextEverything, sc);
25930fdc8d8SChris Lattner                             if (resolved_mask)
26030fdc8d8SChris Lattner                             {
2613c68757cSGreg Clayton                                 if (!(prev_sc.function == sc.function || prev_sc.symbol == sc.symbol))
262dda4f7b5SGreg Clayton                                 {
263dda4f7b5SGreg Clayton                                     if (prev_sc.function || prev_sc.symbol)
264dda4f7b5SGreg Clayton                                         strm.EOL();
265dda4f7b5SGreg Clayton 
266dda4f7b5SGreg Clayton                                     strm << sc.module_sp->GetFileSpec().GetFilename();
267dda4f7b5SGreg Clayton 
268dda4f7b5SGreg Clayton                                     if (sc.function)
269dda4f7b5SGreg Clayton                                         strm << '`' << sc.function->GetMangled().GetName();
270dda4f7b5SGreg Clayton                                     else if (sc.symbol)
271dda4f7b5SGreg Clayton                                         strm << '`' << sc.symbol->GetMangled().GetName();
272dda4f7b5SGreg Clayton                                     strm << ":\n";
273dda4f7b5SGreg Clayton                                 }
274dda4f7b5SGreg Clayton 
275dda4f7b5SGreg Clayton                                 if (num_mixed_context_lines && !sc_range.ContainsFileAddress (addr))
276dda4f7b5SGreg Clayton                                 {
27730fdc8d8SChris Lattner                                     sc.GetAddressRange (eSymbolContextEverything, sc_range);
278dda4f7b5SGreg Clayton 
27930fdc8d8SChris Lattner                                     if (sc != prev_sc)
28030fdc8d8SChris Lattner                                     {
28130fdc8d8SChris Lattner                                         if (offset != 0)
28230fdc8d8SChris Lattner                                             strm.EOL();
28330fdc8d8SChris Lattner 
2846dbd3983SGreg Clayton                                         sc.DumpStopContext(&strm, process, addr, false, true, false);
2856dbd3983SGreg Clayton                                         strm.EOL();
28630fdc8d8SChris Lattner 
28730fdc8d8SChris Lattner                                         if (sc.comp_unit && sc.line_entry.IsValid())
28830fdc8d8SChris Lattner                                         {
289dda4f7b5SGreg Clayton                                             debugger.GetSourceManager().DisplaySourceLinesWithLineNumbers (sc.line_entry.file,
29030fdc8d8SChris Lattner                                                                                                            sc.line_entry.line,
291dda4f7b5SGreg Clayton                                                                                                            num_mixed_context_lines,
292dda4f7b5SGreg Clayton                                                                                                            num_mixed_context_lines,
293dda4f7b5SGreg Clayton                                                                                                            num_mixed_context_lines ? "->" : "",
29430fdc8d8SChris Lattner                                                                                                            &strm);
29530fdc8d8SChris Lattner                                         }
29630fdc8d8SChris Lattner                                     }
29730fdc8d8SChris Lattner                                 }
29830fdc8d8SChris Lattner                             }
299dda4f7b5SGreg Clayton                             else
300dda4f7b5SGreg Clayton                             {
301dda4f7b5SGreg Clayton                                 sc.Clear();
30230fdc8d8SChris Lattner                             }
30330fdc8d8SChris Lattner                         }
304dda4f7b5SGreg Clayton                         if (num_mixed_context_lines)
30530fdc8d8SChris Lattner                             strm.IndentMore ();
30630fdc8d8SChris Lattner                         strm.Indent();
30730fdc8d8SChris Lattner                         size_t inst_byte_size = inst->GetByteSize();
308*b3396b22SSean Callanan                         inst->Dump(&strm, true, show_bytes ? &data : NULL, offset, &exe_ctx, raw);
30930fdc8d8SChris Lattner                         strm.EOL();
31030fdc8d8SChris Lattner                         offset += inst_byte_size;
311dda4f7b5SGreg Clayton 
312dda4f7b5SGreg Clayton                         addr.SetOffset (addr.GetOffset() + inst_byte_size);
313dda4f7b5SGreg Clayton 
314dda4f7b5SGreg Clayton                         if (num_mixed_context_lines)
31530fdc8d8SChris Lattner                             strm.IndentLess ();
31630fdc8d8SChris Lattner                     }
31730fdc8d8SChris Lattner                     else
31830fdc8d8SChris Lattner                     {
31930fdc8d8SChris Lattner                         break;
32030fdc8d8SChris Lattner                     }
32130fdc8d8SChris Lattner                 }
322dda4f7b5SGreg Clayton                 if (num_mixed_context_lines)
32330fdc8d8SChris Lattner                     strm.IndentLess ();
32430fdc8d8SChris Lattner 
32530fdc8d8SChris Lattner             }
32630fdc8d8SChris Lattner         }
32730fdc8d8SChris Lattner         return true;
32830fdc8d8SChris Lattner     }
32930fdc8d8SChris Lattner     return false;
33030fdc8d8SChris Lattner }
33130fdc8d8SChris Lattner 
332dda4f7b5SGreg Clayton 
333dda4f7b5SGreg Clayton bool
334dda4f7b5SGreg Clayton Disassembler::Disassemble
335dda4f7b5SGreg Clayton (
336dda4f7b5SGreg Clayton     Debugger &debugger,
337dda4f7b5SGreg Clayton     const ArchSpec &arch,
338dda4f7b5SGreg Clayton     const ExecutionContext &exe_ctx,
339dda4f7b5SGreg Clayton     uint32_t num_mixed_context_lines,
340dda4f7b5SGreg Clayton     bool show_bytes,
341*b3396b22SSean Callanan     bool raw,
342dda4f7b5SGreg Clayton     Stream &strm
343dda4f7b5SGreg Clayton )
344dda4f7b5SGreg Clayton {
345dda4f7b5SGreg Clayton     AddressRange range;
346dda4f7b5SGreg Clayton     if (exe_ctx.frame)
347dda4f7b5SGreg Clayton     {
348dda4f7b5SGreg Clayton         SymbolContext sc(exe_ctx.frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextSymbol));
349dda4f7b5SGreg Clayton         if (sc.function)
350dda4f7b5SGreg Clayton         {
351dda4f7b5SGreg Clayton             range = sc.function->GetAddressRange();
352dda4f7b5SGreg Clayton         }
353dda4f7b5SGreg Clayton         else if (sc.symbol && sc.symbol->GetAddressRangePtr())
354dda4f7b5SGreg Clayton         {
355dda4f7b5SGreg Clayton             range = *sc.symbol->GetAddressRangePtr();
356dda4f7b5SGreg Clayton         }
357dda4f7b5SGreg Clayton         else
358dda4f7b5SGreg Clayton         {
3599da7bd07SGreg Clayton             range.GetBaseAddress() = exe_ctx.frame->GetFrameCodeAddress();
360dda4f7b5SGreg Clayton         }
361dda4f7b5SGreg Clayton 
362dda4f7b5SGreg Clayton         if (range.GetBaseAddress().IsValid() && range.GetByteSize() == 0)
363dda4f7b5SGreg Clayton             range.SetByteSize (DEFAULT_DISASM_BYTE_SIZE);
364dda4f7b5SGreg Clayton     }
365dda4f7b5SGreg Clayton 
366*b3396b22SSean Callanan     return Disassemble(debugger, arch, exe_ctx, range, num_mixed_context_lines, show_bytes, raw, strm);
367dda4f7b5SGreg Clayton }
368dda4f7b5SGreg Clayton 
3691d273166SGreg Clayton Instruction::Instruction(const Address &addr) :
3701d273166SGreg Clayton     m_addr (addr)
37130fdc8d8SChris Lattner {
37230fdc8d8SChris Lattner }
37330fdc8d8SChris Lattner 
3741d273166SGreg Clayton Instruction::~Instruction()
37530fdc8d8SChris Lattner {
37630fdc8d8SChris Lattner }
37730fdc8d8SChris Lattner 
37830fdc8d8SChris Lattner 
3791d273166SGreg Clayton InstructionList::InstructionList() :
38030fdc8d8SChris Lattner     m_instructions()
38130fdc8d8SChris Lattner {
38230fdc8d8SChris Lattner }
38330fdc8d8SChris Lattner 
3841d273166SGreg Clayton InstructionList::~InstructionList()
38530fdc8d8SChris Lattner {
38630fdc8d8SChris Lattner }
38730fdc8d8SChris Lattner 
38830fdc8d8SChris Lattner size_t
3891d273166SGreg Clayton InstructionList::GetSize() const
39030fdc8d8SChris Lattner {
39130fdc8d8SChris Lattner     return m_instructions.size();
39230fdc8d8SChris Lattner }
39330fdc8d8SChris Lattner 
39430fdc8d8SChris Lattner 
3951d273166SGreg Clayton InstructionSP
3961d273166SGreg Clayton InstructionList::GetInstructionAtIndex (uint32_t idx) const
39730fdc8d8SChris Lattner {
3981d273166SGreg Clayton     InstructionSP inst_sp;
39930fdc8d8SChris Lattner     if (idx < m_instructions.size())
4001d273166SGreg Clayton         inst_sp = m_instructions[idx];
4011d273166SGreg Clayton     return inst_sp;
40230fdc8d8SChris Lattner }
40330fdc8d8SChris Lattner 
40430fdc8d8SChris Lattner void
4051d273166SGreg Clayton InstructionList::Clear()
40630fdc8d8SChris Lattner {
40730fdc8d8SChris Lattner   m_instructions.clear();
40830fdc8d8SChris Lattner }
40930fdc8d8SChris Lattner 
41030fdc8d8SChris Lattner void
4111d273166SGreg Clayton InstructionList::Append (lldb::InstructionSP &inst_sp)
41230fdc8d8SChris Lattner {
41330fdc8d8SChris Lattner     if (inst_sp)
41430fdc8d8SChris Lattner         m_instructions.push_back(inst_sp);
41530fdc8d8SChris Lattner }
41630fdc8d8SChris Lattner 
41730fdc8d8SChris Lattner 
41830fdc8d8SChris Lattner size_t
41930fdc8d8SChris Lattner Disassembler::ParseInstructions
42030fdc8d8SChris Lattner (
42130fdc8d8SChris Lattner     const ExecutionContext *exe_ctx,
422dda4f7b5SGreg Clayton     const AddressRange &range,
42330fdc8d8SChris Lattner     DataExtractor& data
42430fdc8d8SChris Lattner )
42530fdc8d8SChris Lattner {
426dda4f7b5SGreg Clayton     Target *target = exe_ctx->target;
427dda4f7b5SGreg Clayton     const addr_t byte_size = range.GetByteSize();
428dda4f7b5SGreg Clayton     if (target == NULL || byte_size == 0 || !range.GetBaseAddress().IsValid())
42930fdc8d8SChris Lattner         return 0;
43030fdc8d8SChris Lattner 
431dda4f7b5SGreg Clayton     DataBufferHeap *heap_buffer = new DataBufferHeap (byte_size, '\0');
432dda4f7b5SGreg Clayton     DataBufferSP data_sp(heap_buffer);
43330fdc8d8SChris Lattner 
43430fdc8d8SChris Lattner     Error error;
435db598230SGreg Clayton     bool prefer_file_cache = true;
436db598230SGreg Clayton     const size_t bytes_read = target->ReadMemory (range.GetBaseAddress(), prefer_file_cache, heap_buffer->GetBytes(), heap_buffer->GetByteSize(), error);
437dda4f7b5SGreg Clayton 
438dda4f7b5SGreg Clayton     if (bytes_read > 0)
43930fdc8d8SChris Lattner     {
440dda4f7b5SGreg Clayton         if (bytes_read != heap_buffer->GetByteSize())
441dda4f7b5SGreg Clayton             heap_buffer->SetByteSize (bytes_read);
442dda4f7b5SGreg Clayton 
44330fdc8d8SChris Lattner         data.SetData(data_sp);
444514487e8SGreg Clayton         data.SetByteOrder(target->GetArchitecture().GetByteOrder());
445dda4f7b5SGreg Clayton         data.SetAddressByteSize(target->GetArchitecture().GetAddressByteSize());
4461d273166SGreg Clayton         return DecodeInstructions (range.GetBaseAddress(), data, 0, UINT32_MAX);
44730fdc8d8SChris Lattner     }
44830fdc8d8SChris Lattner 
44930fdc8d8SChris Lattner     return 0;
45030fdc8d8SChris Lattner }
45130fdc8d8SChris Lattner 
45230fdc8d8SChris Lattner //----------------------------------------------------------------------
45330fdc8d8SChris Lattner // Disassembler copy constructor
45430fdc8d8SChris Lattner //----------------------------------------------------------------------
45530fdc8d8SChris Lattner Disassembler::Disassembler(const ArchSpec& arch) :
45630fdc8d8SChris Lattner     m_arch (arch),
45730fdc8d8SChris Lattner     m_instruction_list(),
45830fdc8d8SChris Lattner     m_base_addr(LLDB_INVALID_ADDRESS)
45930fdc8d8SChris Lattner {
46030fdc8d8SChris Lattner 
46130fdc8d8SChris Lattner }
46230fdc8d8SChris Lattner 
46330fdc8d8SChris Lattner //----------------------------------------------------------------------
46430fdc8d8SChris Lattner // Destructor
46530fdc8d8SChris Lattner //----------------------------------------------------------------------
46630fdc8d8SChris Lattner Disassembler::~Disassembler()
46730fdc8d8SChris Lattner {
46830fdc8d8SChris Lattner }
46930fdc8d8SChris Lattner 
4701d273166SGreg Clayton InstructionList &
47130fdc8d8SChris Lattner Disassembler::GetInstructionList ()
47230fdc8d8SChris Lattner {
47330fdc8d8SChris Lattner     return m_instruction_list;
47430fdc8d8SChris Lattner }
47530fdc8d8SChris Lattner 
4761d273166SGreg Clayton const InstructionList &
47730fdc8d8SChris Lattner Disassembler::GetInstructionList () const
47830fdc8d8SChris Lattner {
47930fdc8d8SChris Lattner     return m_instruction_list;
48030fdc8d8SChris Lattner }
481