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, 1106dbd3983SGreg Clayton eFunctionNameTypeBase | 1116dbd3983SGreg Clayton eFunctionNameTypeFull | 1126dbd3983SGreg Clayton eFunctionNameTypeMethod | 1136dbd3983SGreg 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, 1216dbd3983SGreg Clayton eFunctionNameTypeBase | 1226dbd3983SGreg Clayton eFunctionNameTypeFull | 1236dbd3983SGreg Clayton eFunctionNameTypeMethod | 1246dbd3983SGreg 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 1381d273166SGreg Clayton 1391d273166SGreg Clayton lldb::DisassemblerSP 1401d273166SGreg Clayton Disassembler::DisassembleRange 1411d273166SGreg Clayton ( 1421d273166SGreg Clayton const ArchSpec &arch, 1431d273166SGreg Clayton const ExecutionContext &exe_ctx, 1441d273166SGreg Clayton const AddressRange &range 1451d273166SGreg Clayton ) 1461d273166SGreg Clayton { 1471d273166SGreg Clayton lldb::DisassemblerSP disasm_sp; 1481d273166SGreg Clayton if (range.GetByteSize() > 0 && range.GetBaseAddress().IsValid()) 1491d273166SGreg Clayton { 1501d273166SGreg Clayton disasm_sp.reset (Disassembler::FindPlugin(arch)); 1511d273166SGreg Clayton 1521d273166SGreg Clayton if (disasm_sp) 1531d273166SGreg Clayton { 1541d273166SGreg Clayton DataExtractor data; 1551d273166SGreg Clayton size_t bytes_disassembled = disasm_sp->ParseInstructions (&exe_ctx, range, data); 1561d273166SGreg Clayton if (bytes_disassembled == 0) 1571d273166SGreg Clayton disasm_sp.reset(); 1581d273166SGreg Clayton } 1591d273166SGreg Clayton } 1601d273166SGreg Clayton return disasm_sp; 1611d273166SGreg Clayton } 1621d273166SGreg Clayton 1631d273166SGreg Clayton 164dda4f7b5SGreg Clayton bool 165dda4f7b5SGreg Clayton Disassembler::Disassemble 166dda4f7b5SGreg Clayton ( 167dda4f7b5SGreg Clayton Debugger &debugger, 168dda4f7b5SGreg Clayton const ArchSpec &arch, 169dda4f7b5SGreg Clayton const ExecutionContext &exe_ctx, 170dda4f7b5SGreg Clayton const AddressRange &disasm_range, 171dda4f7b5SGreg Clayton uint32_t num_mixed_context_lines, 172dda4f7b5SGreg Clayton bool show_bytes, 173dda4f7b5SGreg Clayton Stream &strm 174dda4f7b5SGreg Clayton ) 175dda4f7b5SGreg Clayton { 176dda4f7b5SGreg Clayton if (disasm_range.GetByteSize()) 177dda4f7b5SGreg Clayton { 1781d273166SGreg Clayton std::auto_ptr<Disassembler> disasm_ap (Disassembler::FindPlugin(arch)); 17930fdc8d8SChris Lattner 1801d273166SGreg Clayton if (disasm_ap.get()) 18130fdc8d8SChris Lattner { 182dda4f7b5SGreg Clayton AddressRange range(disasm_range); 183dda4f7b5SGreg Clayton 184dda4f7b5SGreg Clayton Process *process = exe_ctx.process; 185dda4f7b5SGreg Clayton 186dda4f7b5SGreg Clayton // If we weren't passed in a section offset address range, 187dda4f7b5SGreg Clayton // try and resolve it to something 188dda4f7b5SGreg Clayton if (range.GetBaseAddress().IsSectionOffset() == false) 18930fdc8d8SChris Lattner { 190f5e56de0SGreg Clayton if (exe_ctx.target) 19130fdc8d8SChris Lattner { 192f5e56de0SGreg Clayton if (exe_ctx.target->GetSectionLoadList().IsEmpty()) 19330fdc8d8SChris Lattner { 194dda4f7b5SGreg Clayton exe_ctx.target->GetImages().ResolveFileAddress (range.GetBaseAddress().GetOffset(), range.GetBaseAddress()); 19530fdc8d8SChris Lattner } 196f5e56de0SGreg Clayton else 197f5e56de0SGreg Clayton { 198f5e56de0SGreg Clayton exe_ctx.target->GetSectionLoadList().ResolveLoadAddress (range.GetBaseAddress().GetOffset(), range.GetBaseAddress()); 19930fdc8d8SChris Lattner } 200f5e56de0SGreg Clayton } 201f5e56de0SGreg Clayton } 202dda4f7b5SGreg Clayton 20330fdc8d8SChris Lattner DataExtractor data; 2041d273166SGreg Clayton size_t bytes_disassembled = disasm_ap->ParseInstructions (&exe_ctx, range, data); 20530fdc8d8SChris Lattner if (bytes_disassembled == 0) 20630fdc8d8SChris Lattner { 20730fdc8d8SChris Lattner return false; 20830fdc8d8SChris Lattner } 20930fdc8d8SChris Lattner else 21030fdc8d8SChris Lattner { 21130fdc8d8SChris Lattner // We got some things disassembled... 2121d273166SGreg Clayton size_t num_instructions = disasm_ap->GetInstructionList().GetSize(); 21330fdc8d8SChris Lattner uint32_t offset = 0; 21430fdc8d8SChris Lattner SymbolContext sc; 21530fdc8d8SChris Lattner SymbolContext prev_sc; 21630fdc8d8SChris Lattner AddressRange sc_range; 217dda4f7b5SGreg Clayton if (num_mixed_context_lines) 21830fdc8d8SChris Lattner strm.IndentMore (); 21930fdc8d8SChris Lattner 220dda4f7b5SGreg Clayton 221dda4f7b5SGreg Clayton Address addr(range.GetBaseAddress()); 222dda4f7b5SGreg Clayton 223dda4f7b5SGreg Clayton // We extract the section to make sure we don't transition out 224dda4f7b5SGreg Clayton // of the current section when disassembling 225dda4f7b5SGreg Clayton const Section *addr_section = addr.GetSection(); 226dda4f7b5SGreg Clayton Module *range_module = range.GetBaseAddress().GetModule(); 227dda4f7b5SGreg Clayton 22830fdc8d8SChris Lattner for (size_t i=0; i<num_instructions; ++i) 22930fdc8d8SChris Lattner { 2301d273166SGreg Clayton Instruction *inst = disasm_ap->GetInstructionList().GetInstructionAtIndex (i).get(); 23130fdc8d8SChris Lattner if (inst) 23230fdc8d8SChris Lattner { 233dda4f7b5SGreg Clayton addr_t file_addr = addr.GetFileAddress(); 234dda4f7b5SGreg Clayton if (addr_section == NULL || addr_section->ContainsFileAddress (file_addr) == false) 23530fdc8d8SChris Lattner { 236dda4f7b5SGreg Clayton if (range_module) 237dda4f7b5SGreg Clayton range_module->ResolveFileAddress (file_addr, addr); 238dda4f7b5SGreg Clayton else if (exe_ctx.target) 239dda4f7b5SGreg Clayton exe_ctx.target->GetImages().ResolveFileAddress (file_addr, addr); 240dda4f7b5SGreg Clayton 241dda4f7b5SGreg Clayton addr_section = addr.GetSection(); 242dda4f7b5SGreg Clayton } 243dda4f7b5SGreg Clayton 24430fdc8d8SChris Lattner prev_sc = sc; 245dda4f7b5SGreg Clayton 246dda4f7b5SGreg Clayton if (addr_section) 24730fdc8d8SChris Lattner { 248dda4f7b5SGreg Clayton Module *module = addr_section->GetModule(); 249dda4f7b5SGreg Clayton uint32_t resolved_mask = module->ResolveSymbolContextForAddress(addr, eSymbolContextEverything, sc); 25030fdc8d8SChris Lattner if (resolved_mask) 25130fdc8d8SChris Lattner { 2523c68757cSGreg Clayton if (!(prev_sc.function == sc.function || prev_sc.symbol == sc.symbol)) 253dda4f7b5SGreg Clayton { 254dda4f7b5SGreg Clayton if (prev_sc.function || prev_sc.symbol) 255dda4f7b5SGreg Clayton strm.EOL(); 256dda4f7b5SGreg Clayton 257dda4f7b5SGreg Clayton strm << sc.module_sp->GetFileSpec().GetFilename(); 258dda4f7b5SGreg Clayton 259dda4f7b5SGreg Clayton if (sc.function) 260dda4f7b5SGreg Clayton strm << '`' << sc.function->GetMangled().GetName(); 261dda4f7b5SGreg Clayton else if (sc.symbol) 262dda4f7b5SGreg Clayton strm << '`' << sc.symbol->GetMangled().GetName(); 263dda4f7b5SGreg Clayton strm << ":\n"; 264dda4f7b5SGreg Clayton } 265dda4f7b5SGreg Clayton 266dda4f7b5SGreg Clayton if (num_mixed_context_lines && !sc_range.ContainsFileAddress (addr)) 267dda4f7b5SGreg Clayton { 26830fdc8d8SChris Lattner sc.GetAddressRange (eSymbolContextEverything, sc_range); 269dda4f7b5SGreg Clayton 27030fdc8d8SChris Lattner if (sc != prev_sc) 27130fdc8d8SChris Lattner { 27230fdc8d8SChris Lattner if (offset != 0) 27330fdc8d8SChris Lattner strm.EOL(); 27430fdc8d8SChris Lattner 2756dbd3983SGreg Clayton sc.DumpStopContext(&strm, process, addr, false, true, false); 2766dbd3983SGreg Clayton strm.EOL(); 27730fdc8d8SChris Lattner 27830fdc8d8SChris Lattner if (sc.comp_unit && sc.line_entry.IsValid()) 27930fdc8d8SChris Lattner { 280dda4f7b5SGreg Clayton debugger.GetSourceManager().DisplaySourceLinesWithLineNumbers (sc.line_entry.file, 28130fdc8d8SChris Lattner sc.line_entry.line, 282dda4f7b5SGreg Clayton num_mixed_context_lines, 283dda4f7b5SGreg Clayton num_mixed_context_lines, 284dda4f7b5SGreg Clayton num_mixed_context_lines ? "->" : "", 28530fdc8d8SChris Lattner &strm); 28630fdc8d8SChris Lattner } 28730fdc8d8SChris Lattner } 28830fdc8d8SChris Lattner } 28930fdc8d8SChris Lattner } 290dda4f7b5SGreg Clayton else 291dda4f7b5SGreg Clayton { 292dda4f7b5SGreg Clayton sc.Clear(); 29330fdc8d8SChris Lattner } 29430fdc8d8SChris Lattner } 295dda4f7b5SGreg Clayton if (num_mixed_context_lines) 29630fdc8d8SChris Lattner strm.IndentMore (); 29730fdc8d8SChris Lattner strm.Indent(); 29830fdc8d8SChris Lattner size_t inst_byte_size = inst->GetByteSize(); 2991d273166SGreg Clayton inst->Dump(&strm, true, show_bytes ? &data : NULL, offset, &exe_ctx, show_bytes); 30030fdc8d8SChris Lattner strm.EOL(); 30130fdc8d8SChris Lattner offset += inst_byte_size; 302dda4f7b5SGreg Clayton 303dda4f7b5SGreg Clayton addr.SetOffset (addr.GetOffset() + inst_byte_size); 304dda4f7b5SGreg Clayton 305dda4f7b5SGreg Clayton if (num_mixed_context_lines) 30630fdc8d8SChris Lattner strm.IndentLess (); 30730fdc8d8SChris Lattner } 30830fdc8d8SChris Lattner else 30930fdc8d8SChris Lattner { 31030fdc8d8SChris Lattner break; 31130fdc8d8SChris Lattner } 31230fdc8d8SChris Lattner } 313dda4f7b5SGreg Clayton if (num_mixed_context_lines) 31430fdc8d8SChris Lattner strm.IndentLess (); 31530fdc8d8SChris Lattner 31630fdc8d8SChris Lattner } 31730fdc8d8SChris Lattner } 31830fdc8d8SChris Lattner return true; 31930fdc8d8SChris Lattner } 32030fdc8d8SChris Lattner return false; 32130fdc8d8SChris Lattner } 32230fdc8d8SChris Lattner 323dda4f7b5SGreg Clayton 324dda4f7b5SGreg Clayton bool 325dda4f7b5SGreg Clayton Disassembler::Disassemble 326dda4f7b5SGreg Clayton ( 327dda4f7b5SGreg Clayton Debugger &debugger, 328dda4f7b5SGreg Clayton const ArchSpec &arch, 329dda4f7b5SGreg Clayton const ExecutionContext &exe_ctx, 330dda4f7b5SGreg Clayton uint32_t num_mixed_context_lines, 331dda4f7b5SGreg Clayton bool show_bytes, 332dda4f7b5SGreg Clayton Stream &strm 333dda4f7b5SGreg Clayton ) 334dda4f7b5SGreg Clayton { 335dda4f7b5SGreg Clayton AddressRange range; 336dda4f7b5SGreg Clayton if (exe_ctx.frame) 337dda4f7b5SGreg Clayton { 338dda4f7b5SGreg Clayton SymbolContext sc(exe_ctx.frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextSymbol)); 339dda4f7b5SGreg Clayton if (sc.function) 340dda4f7b5SGreg Clayton { 341dda4f7b5SGreg Clayton range = sc.function->GetAddressRange(); 342dda4f7b5SGreg Clayton } 343dda4f7b5SGreg Clayton else if (sc.symbol && sc.symbol->GetAddressRangePtr()) 344dda4f7b5SGreg Clayton { 345dda4f7b5SGreg Clayton range = *sc.symbol->GetAddressRangePtr(); 346dda4f7b5SGreg Clayton } 347dda4f7b5SGreg Clayton else 348dda4f7b5SGreg Clayton { 3499da7bd07SGreg Clayton range.GetBaseAddress() = exe_ctx.frame->GetFrameCodeAddress(); 350dda4f7b5SGreg Clayton } 351dda4f7b5SGreg Clayton 352dda4f7b5SGreg Clayton if (range.GetBaseAddress().IsValid() && range.GetByteSize() == 0) 353dda4f7b5SGreg Clayton range.SetByteSize (DEFAULT_DISASM_BYTE_SIZE); 354dda4f7b5SGreg Clayton } 355dda4f7b5SGreg Clayton 356dda4f7b5SGreg Clayton return Disassemble(debugger, arch, exe_ctx, range, num_mixed_context_lines, show_bytes, strm); 357dda4f7b5SGreg Clayton } 358dda4f7b5SGreg Clayton 3591d273166SGreg Clayton Instruction::Instruction(const Address &addr) : 3601d273166SGreg Clayton m_addr (addr) 36130fdc8d8SChris Lattner { 36230fdc8d8SChris Lattner } 36330fdc8d8SChris Lattner 3641d273166SGreg Clayton Instruction::~Instruction() 36530fdc8d8SChris Lattner { 36630fdc8d8SChris Lattner } 36730fdc8d8SChris Lattner 36830fdc8d8SChris Lattner 3691d273166SGreg Clayton InstructionList::InstructionList() : 37030fdc8d8SChris Lattner m_instructions() 37130fdc8d8SChris Lattner { 37230fdc8d8SChris Lattner } 37330fdc8d8SChris Lattner 3741d273166SGreg Clayton InstructionList::~InstructionList() 37530fdc8d8SChris Lattner { 37630fdc8d8SChris Lattner } 37730fdc8d8SChris Lattner 37830fdc8d8SChris Lattner size_t 3791d273166SGreg Clayton InstructionList::GetSize() const 38030fdc8d8SChris Lattner { 38130fdc8d8SChris Lattner return m_instructions.size(); 38230fdc8d8SChris Lattner } 38330fdc8d8SChris Lattner 38430fdc8d8SChris Lattner 3851d273166SGreg Clayton InstructionSP 3861d273166SGreg Clayton InstructionList::GetInstructionAtIndex (uint32_t idx) const 38730fdc8d8SChris Lattner { 3881d273166SGreg Clayton InstructionSP inst_sp; 38930fdc8d8SChris Lattner if (idx < m_instructions.size()) 3901d273166SGreg Clayton inst_sp = m_instructions[idx]; 3911d273166SGreg Clayton return inst_sp; 39230fdc8d8SChris Lattner } 39330fdc8d8SChris Lattner 39430fdc8d8SChris Lattner void 3951d273166SGreg Clayton InstructionList::Clear() 39630fdc8d8SChris Lattner { 39730fdc8d8SChris Lattner m_instructions.clear(); 39830fdc8d8SChris Lattner } 39930fdc8d8SChris Lattner 40030fdc8d8SChris Lattner void 4011d273166SGreg Clayton InstructionList::Append (lldb::InstructionSP &inst_sp) 40230fdc8d8SChris Lattner { 40330fdc8d8SChris Lattner if (inst_sp) 40430fdc8d8SChris Lattner m_instructions.push_back(inst_sp); 40530fdc8d8SChris Lattner } 40630fdc8d8SChris Lattner 40730fdc8d8SChris Lattner 40830fdc8d8SChris Lattner size_t 40930fdc8d8SChris Lattner Disassembler::ParseInstructions 41030fdc8d8SChris Lattner ( 41130fdc8d8SChris Lattner const ExecutionContext *exe_ctx, 412dda4f7b5SGreg Clayton const AddressRange &range, 41330fdc8d8SChris Lattner DataExtractor& data 41430fdc8d8SChris Lattner ) 41530fdc8d8SChris Lattner { 416dda4f7b5SGreg Clayton Target *target = exe_ctx->target; 417dda4f7b5SGreg Clayton const addr_t byte_size = range.GetByteSize(); 418dda4f7b5SGreg Clayton if (target == NULL || byte_size == 0 || !range.GetBaseAddress().IsValid()) 41930fdc8d8SChris Lattner return 0; 42030fdc8d8SChris Lattner 421dda4f7b5SGreg Clayton DataBufferHeap *heap_buffer = new DataBufferHeap (byte_size, '\0'); 422dda4f7b5SGreg Clayton DataBufferSP data_sp(heap_buffer); 42330fdc8d8SChris Lattner 42430fdc8d8SChris Lattner Error error; 425*db598230SGreg Clayton bool prefer_file_cache = true; 426*db598230SGreg Clayton const size_t bytes_read = target->ReadMemory (range.GetBaseAddress(), prefer_file_cache, heap_buffer->GetBytes(), heap_buffer->GetByteSize(), error); 427dda4f7b5SGreg Clayton 428dda4f7b5SGreg Clayton if (bytes_read > 0) 42930fdc8d8SChris Lattner { 430dda4f7b5SGreg Clayton if (bytes_read != heap_buffer->GetByteSize()) 431dda4f7b5SGreg Clayton heap_buffer->SetByteSize (bytes_read); 432dda4f7b5SGreg Clayton 43330fdc8d8SChris Lattner data.SetData(data_sp); 434dda4f7b5SGreg Clayton if (exe_ctx->process) 435dda4f7b5SGreg Clayton { 436dda4f7b5SGreg Clayton data.SetByteOrder(exe_ctx->process->GetByteOrder()); 437dda4f7b5SGreg Clayton data.SetAddressByteSize(exe_ctx->process->GetAddressByteSize()); 438dda4f7b5SGreg Clayton } 439dda4f7b5SGreg Clayton else 440dda4f7b5SGreg Clayton { 441dda4f7b5SGreg Clayton data.SetByteOrder(target->GetArchitecture().GetDefaultEndian()); 442dda4f7b5SGreg Clayton data.SetAddressByteSize(target->GetArchitecture().GetAddressByteSize()); 443dda4f7b5SGreg Clayton } 4441d273166SGreg Clayton return DecodeInstructions (range.GetBaseAddress(), data, 0, UINT32_MAX); 44530fdc8d8SChris Lattner } 44630fdc8d8SChris Lattner 44730fdc8d8SChris Lattner return 0; 44830fdc8d8SChris Lattner } 44930fdc8d8SChris Lattner 45030fdc8d8SChris Lattner //---------------------------------------------------------------------- 45130fdc8d8SChris Lattner // Disassembler copy constructor 45230fdc8d8SChris Lattner //---------------------------------------------------------------------- 45330fdc8d8SChris Lattner Disassembler::Disassembler(const ArchSpec& arch) : 45430fdc8d8SChris Lattner m_arch (arch), 45530fdc8d8SChris Lattner m_instruction_list(), 45630fdc8d8SChris Lattner m_base_addr(LLDB_INVALID_ADDRESS) 45730fdc8d8SChris Lattner { 45830fdc8d8SChris Lattner 45930fdc8d8SChris Lattner } 46030fdc8d8SChris Lattner 46130fdc8d8SChris Lattner //---------------------------------------------------------------------- 46230fdc8d8SChris Lattner // Destructor 46330fdc8d8SChris Lattner //---------------------------------------------------------------------- 46430fdc8d8SChris Lattner Disassembler::~Disassembler() 46530fdc8d8SChris Lattner { 46630fdc8d8SChris Lattner } 46730fdc8d8SChris Lattner 4681d273166SGreg Clayton InstructionList & 46930fdc8d8SChris Lattner Disassembler::GetInstructionList () 47030fdc8d8SChris Lattner { 47130fdc8d8SChris Lattner return m_instruction_list; 47230fdc8d8SChris Lattner } 47330fdc8d8SChris Lattner 4741d273166SGreg Clayton const InstructionList & 47530fdc8d8SChris Lattner Disassembler::GetInstructionList () const 47630fdc8d8SChris Lattner { 47730fdc8d8SChris Lattner return m_instruction_list; 47830fdc8d8SChris Lattner } 479