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