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, 110dda4f7b5SGreg Clayton eFunctionNameTypeBase | eFunctionNameTypeFull | eFunctionNameTypeMethod | eFunctionNameTypeSelector, 111dda4f7b5SGreg Clayton true, 112dda4f7b5SGreg Clayton sc_list)) 113dda4f7b5SGreg Clayton return false; 114dda4f7b5SGreg Clayton } 115dda4f7b5SGreg Clayton else 116dda4f7b5SGreg Clayton { 117dda4f7b5SGreg Clayton if (exe_ctx.target->GetImages().FindFunctions (name, 118dda4f7b5SGreg Clayton eFunctionNameTypeBase | eFunctionNameTypeFull | eFunctionNameTypeMethod | eFunctionNameTypeSelector, 119*8ade104aSSean Callanan false, 120dda4f7b5SGreg Clayton sc_list)) 121dda4f7b5SGreg Clayton { 122dda4f7b5SGreg Clayton return Disassemble (debugger, arch, exe_ctx, sc_list, num_mixed_context_lines, show_bytes, strm); 123dda4f7b5SGreg Clayton } 124dda4f7b5SGreg Clayton else if (exe_ctx.target->GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list)) 125dda4f7b5SGreg Clayton { 126dda4f7b5SGreg Clayton return Disassemble (debugger, arch, exe_ctx, sc_list, num_mixed_context_lines, show_bytes, strm); 127dda4f7b5SGreg Clayton } 128dda4f7b5SGreg Clayton } 129dda4f7b5SGreg Clayton return false; 130dda4f7b5SGreg Clayton } 131dda4f7b5SGreg Clayton 132dda4f7b5SGreg Clayton bool 133dda4f7b5SGreg Clayton Disassembler::Disassemble 134dda4f7b5SGreg Clayton ( 135dda4f7b5SGreg Clayton Debugger &debugger, 136dda4f7b5SGreg Clayton const ArchSpec &arch, 137dda4f7b5SGreg Clayton const ExecutionContext &exe_ctx, 138dda4f7b5SGreg Clayton const AddressRange &disasm_range, 139dda4f7b5SGreg Clayton uint32_t num_mixed_context_lines, 140dda4f7b5SGreg Clayton bool show_bytes, 141dda4f7b5SGreg Clayton Stream &strm 142dda4f7b5SGreg Clayton ) 143dda4f7b5SGreg Clayton { 144dda4f7b5SGreg Clayton if (disasm_range.GetByteSize()) 145dda4f7b5SGreg Clayton { 14630fdc8d8SChris Lattner Disassembler *disassembler = Disassembler::FindPlugin(arch); 14730fdc8d8SChris Lattner 14830fdc8d8SChris Lattner if (disassembler) 14930fdc8d8SChris Lattner { 150dda4f7b5SGreg Clayton AddressRange range(disasm_range); 151dda4f7b5SGreg Clayton 152dda4f7b5SGreg Clayton Process *process = exe_ctx.process; 153dda4f7b5SGreg Clayton 154dda4f7b5SGreg Clayton // If we weren't passed in a section offset address range, 155dda4f7b5SGreg Clayton // try and resolve it to something 156dda4f7b5SGreg Clayton if (range.GetBaseAddress().IsSectionOffset() == false) 15730fdc8d8SChris Lattner { 158dda4f7b5SGreg Clayton if (process && process->IsAlive()) 15930fdc8d8SChris Lattner { 160dda4f7b5SGreg Clayton process->ResolveLoadAddress (range.GetBaseAddress().GetOffset(), range.GetBaseAddress()); 16130fdc8d8SChris Lattner } 162dda4f7b5SGreg Clayton else if (exe_ctx.target) 16330fdc8d8SChris Lattner { 164dda4f7b5SGreg Clayton exe_ctx.target->GetImages().ResolveFileAddress (range.GetBaseAddress().GetOffset(), range.GetBaseAddress()); 16530fdc8d8SChris Lattner } 16630fdc8d8SChris Lattner } 16730fdc8d8SChris Lattner 168dda4f7b5SGreg Clayton 16930fdc8d8SChris Lattner DataExtractor data; 170dda4f7b5SGreg Clayton size_t bytes_disassembled = disassembler->ParseInstructions (&exe_ctx, range, data); 17130fdc8d8SChris Lattner if (bytes_disassembled == 0) 17230fdc8d8SChris Lattner { 17330fdc8d8SChris Lattner return false; 17430fdc8d8SChris Lattner } 17530fdc8d8SChris Lattner else 17630fdc8d8SChris Lattner { 17730fdc8d8SChris Lattner // We got some things disassembled... 17830fdc8d8SChris Lattner size_t num_instructions = disassembler->GetInstructionList().GetSize(); 17930fdc8d8SChris Lattner uint32_t offset = 0; 18030fdc8d8SChris Lattner SymbolContext sc; 18130fdc8d8SChris Lattner SymbolContext prev_sc; 18230fdc8d8SChris Lattner AddressRange sc_range; 183dda4f7b5SGreg Clayton if (num_mixed_context_lines) 18430fdc8d8SChris Lattner strm.IndentMore (); 18530fdc8d8SChris Lattner 186dda4f7b5SGreg Clayton 187dda4f7b5SGreg Clayton Address addr(range.GetBaseAddress()); 188dda4f7b5SGreg Clayton 189dda4f7b5SGreg Clayton // We extract the section to make sure we don't transition out 190dda4f7b5SGreg Clayton // of the current section when disassembling 191dda4f7b5SGreg Clayton const Section *addr_section = addr.GetSection(); 192dda4f7b5SGreg Clayton Module *range_module = range.GetBaseAddress().GetModule(); 193dda4f7b5SGreg Clayton 19430fdc8d8SChris Lattner for (size_t i=0; i<num_instructions; ++i) 19530fdc8d8SChris Lattner { 19630fdc8d8SChris Lattner Disassembler::Instruction *inst = disassembler->GetInstructionList().GetInstructionAtIndex (i); 19730fdc8d8SChris Lattner if (inst) 19830fdc8d8SChris Lattner { 199dda4f7b5SGreg Clayton addr_t file_addr = addr.GetFileAddress(); 200dda4f7b5SGreg Clayton if (addr_section == NULL || addr_section->ContainsFileAddress (file_addr) == false) 20130fdc8d8SChris Lattner { 202dda4f7b5SGreg Clayton if (range_module) 203dda4f7b5SGreg Clayton range_module->ResolveFileAddress (file_addr, addr); 204dda4f7b5SGreg Clayton else if (exe_ctx.target) 205dda4f7b5SGreg Clayton exe_ctx.target->GetImages().ResolveFileAddress (file_addr, addr); 206dda4f7b5SGreg Clayton 207dda4f7b5SGreg Clayton addr_section = addr.GetSection(); 208dda4f7b5SGreg Clayton } 209dda4f7b5SGreg Clayton 21030fdc8d8SChris Lattner prev_sc = sc; 211dda4f7b5SGreg Clayton 212dda4f7b5SGreg Clayton if (addr_section) 21330fdc8d8SChris Lattner { 214dda4f7b5SGreg Clayton Module *module = addr_section->GetModule(); 215dda4f7b5SGreg Clayton uint32_t resolved_mask = module->ResolveSymbolContextForAddress(addr, eSymbolContextEverything, sc); 21630fdc8d8SChris Lattner if (resolved_mask) 21730fdc8d8SChris Lattner { 218dda4f7b5SGreg Clayton if (prev_sc.function != sc.function || prev_sc.symbol != sc.symbol) 219dda4f7b5SGreg Clayton { 220dda4f7b5SGreg Clayton if (prev_sc.function || prev_sc.symbol) 221dda4f7b5SGreg Clayton strm.EOL(); 222dda4f7b5SGreg Clayton 223dda4f7b5SGreg Clayton strm << sc.module_sp->GetFileSpec().GetFilename(); 224dda4f7b5SGreg Clayton 225dda4f7b5SGreg Clayton if (sc.function) 226dda4f7b5SGreg Clayton strm << '`' << sc.function->GetMangled().GetName(); 227dda4f7b5SGreg Clayton else if (sc.symbol) 228dda4f7b5SGreg Clayton strm << '`' << sc.symbol->GetMangled().GetName(); 229dda4f7b5SGreg Clayton strm << ":\n"; 230dda4f7b5SGreg Clayton } 231dda4f7b5SGreg Clayton 232dda4f7b5SGreg Clayton if (num_mixed_context_lines && !sc_range.ContainsFileAddress (addr)) 233dda4f7b5SGreg Clayton { 23430fdc8d8SChris Lattner sc.GetAddressRange (eSymbolContextEverything, sc_range); 235dda4f7b5SGreg Clayton 23630fdc8d8SChris Lattner if (sc != prev_sc) 23730fdc8d8SChris Lattner { 23830fdc8d8SChris Lattner if (offset != 0) 23930fdc8d8SChris Lattner strm.EOL(); 24030fdc8d8SChris Lattner 241dda4f7b5SGreg Clayton sc.DumpStopContext(&strm, process, addr); 24230fdc8d8SChris Lattner 24330fdc8d8SChris Lattner if (sc.comp_unit && sc.line_entry.IsValid()) 24430fdc8d8SChris Lattner { 245dda4f7b5SGreg Clayton debugger.GetSourceManager().DisplaySourceLinesWithLineNumbers (sc.line_entry.file, 24630fdc8d8SChris Lattner sc.line_entry.line, 247dda4f7b5SGreg Clayton num_mixed_context_lines, 248dda4f7b5SGreg Clayton num_mixed_context_lines, 249dda4f7b5SGreg Clayton num_mixed_context_lines ? "->" : "", 25030fdc8d8SChris Lattner &strm); 25130fdc8d8SChris Lattner } 25230fdc8d8SChris Lattner } 25330fdc8d8SChris Lattner } 25430fdc8d8SChris Lattner } 255dda4f7b5SGreg Clayton else 256dda4f7b5SGreg Clayton { 257dda4f7b5SGreg Clayton sc.Clear(); 25830fdc8d8SChris Lattner } 25930fdc8d8SChris Lattner } 260dda4f7b5SGreg Clayton if (num_mixed_context_lines) 26130fdc8d8SChris Lattner strm.IndentMore (); 26230fdc8d8SChris Lattner strm.Indent(); 26330fdc8d8SChris Lattner size_t inst_byte_size = inst->GetByteSize(); 264dda4f7b5SGreg Clayton inst->Dump(&strm, &addr, show_bytes ? &data : NULL, offset, exe_ctx, show_bytes); 26530fdc8d8SChris Lattner strm.EOL(); 26630fdc8d8SChris Lattner offset += inst_byte_size; 267dda4f7b5SGreg Clayton 268dda4f7b5SGreg Clayton addr.SetOffset (addr.GetOffset() + inst_byte_size); 269dda4f7b5SGreg Clayton 270dda4f7b5SGreg Clayton if (num_mixed_context_lines) 27130fdc8d8SChris Lattner strm.IndentLess (); 27230fdc8d8SChris Lattner } 27330fdc8d8SChris Lattner else 27430fdc8d8SChris Lattner { 27530fdc8d8SChris Lattner break; 27630fdc8d8SChris Lattner } 27730fdc8d8SChris Lattner } 278dda4f7b5SGreg Clayton if (num_mixed_context_lines) 27930fdc8d8SChris Lattner strm.IndentLess (); 28030fdc8d8SChris Lattner 28130fdc8d8SChris Lattner } 28230fdc8d8SChris Lattner } 28330fdc8d8SChris Lattner return true; 28430fdc8d8SChris Lattner } 28530fdc8d8SChris Lattner return false; 28630fdc8d8SChris Lattner } 28730fdc8d8SChris Lattner 288dda4f7b5SGreg Clayton 289dda4f7b5SGreg Clayton bool 290dda4f7b5SGreg Clayton Disassembler::Disassemble 291dda4f7b5SGreg Clayton ( 292dda4f7b5SGreg Clayton Debugger &debugger, 293dda4f7b5SGreg Clayton const ArchSpec &arch, 294dda4f7b5SGreg Clayton const ExecutionContext &exe_ctx, 295dda4f7b5SGreg Clayton uint32_t num_mixed_context_lines, 296dda4f7b5SGreg Clayton bool show_bytes, 297dda4f7b5SGreg Clayton Stream &strm 298dda4f7b5SGreg Clayton ) 299dda4f7b5SGreg Clayton { 300dda4f7b5SGreg Clayton AddressRange range; 301dda4f7b5SGreg Clayton if (exe_ctx.frame) 302dda4f7b5SGreg Clayton { 303dda4f7b5SGreg Clayton SymbolContext sc(exe_ctx.frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextSymbol)); 304dda4f7b5SGreg Clayton if (sc.function) 305dda4f7b5SGreg Clayton { 306dda4f7b5SGreg Clayton range = sc.function->GetAddressRange(); 307dda4f7b5SGreg Clayton } 308dda4f7b5SGreg Clayton else if (sc.symbol && sc.symbol->GetAddressRangePtr()) 309dda4f7b5SGreg Clayton { 310dda4f7b5SGreg Clayton range = *sc.symbol->GetAddressRangePtr(); 311dda4f7b5SGreg Clayton } 312dda4f7b5SGreg Clayton else 313dda4f7b5SGreg Clayton { 314dda4f7b5SGreg Clayton range.GetBaseAddress() = exe_ctx.frame->GetPC(); 315dda4f7b5SGreg Clayton } 316dda4f7b5SGreg Clayton 317dda4f7b5SGreg Clayton if (range.GetBaseAddress().IsValid() && range.GetByteSize() == 0) 318dda4f7b5SGreg Clayton range.SetByteSize (DEFAULT_DISASM_BYTE_SIZE); 319dda4f7b5SGreg Clayton } 320dda4f7b5SGreg Clayton 321dda4f7b5SGreg Clayton return Disassemble(debugger, arch, exe_ctx, range, num_mixed_context_lines, show_bytes, strm); 322dda4f7b5SGreg Clayton } 323dda4f7b5SGreg Clayton 32430fdc8d8SChris Lattner Disassembler::Instruction::Instruction() 32530fdc8d8SChris Lattner { 32630fdc8d8SChris Lattner } 32730fdc8d8SChris Lattner 32830fdc8d8SChris Lattner Disassembler::Instruction::~Instruction() 32930fdc8d8SChris Lattner { 33030fdc8d8SChris Lattner } 33130fdc8d8SChris Lattner 33230fdc8d8SChris Lattner 33330fdc8d8SChris Lattner Disassembler::InstructionList::InstructionList() : 33430fdc8d8SChris Lattner m_instructions() 33530fdc8d8SChris Lattner { 33630fdc8d8SChris Lattner } 33730fdc8d8SChris Lattner 33830fdc8d8SChris Lattner Disassembler::InstructionList::~InstructionList() 33930fdc8d8SChris Lattner { 34030fdc8d8SChris Lattner } 34130fdc8d8SChris Lattner 34230fdc8d8SChris Lattner size_t 34330fdc8d8SChris Lattner Disassembler::InstructionList::GetSize() const 34430fdc8d8SChris Lattner { 34530fdc8d8SChris Lattner return m_instructions.size(); 34630fdc8d8SChris Lattner } 34730fdc8d8SChris Lattner 34830fdc8d8SChris Lattner 34930fdc8d8SChris Lattner Disassembler::Instruction * 35030fdc8d8SChris Lattner Disassembler::InstructionList::GetInstructionAtIndex (uint32_t idx) 35130fdc8d8SChris Lattner { 35230fdc8d8SChris Lattner if (idx < m_instructions.size()) 35330fdc8d8SChris Lattner return m_instructions[idx].get(); 35430fdc8d8SChris Lattner return NULL; 35530fdc8d8SChris Lattner } 35630fdc8d8SChris Lattner 35730fdc8d8SChris Lattner const Disassembler::Instruction * 35830fdc8d8SChris Lattner Disassembler::InstructionList::GetInstructionAtIndex (uint32_t idx) const 35930fdc8d8SChris Lattner { 36030fdc8d8SChris Lattner if (idx < m_instructions.size()) 36130fdc8d8SChris Lattner return m_instructions[idx].get(); 36230fdc8d8SChris Lattner return NULL; 36330fdc8d8SChris Lattner } 36430fdc8d8SChris Lattner 36530fdc8d8SChris Lattner void 36630fdc8d8SChris Lattner Disassembler::InstructionList::Clear() 36730fdc8d8SChris Lattner { 36830fdc8d8SChris Lattner m_instructions.clear(); 36930fdc8d8SChris Lattner } 37030fdc8d8SChris Lattner 37130fdc8d8SChris Lattner void 37230fdc8d8SChris Lattner Disassembler::InstructionList::AppendInstruction (Instruction::shared_ptr &inst_sp) 37330fdc8d8SChris Lattner { 37430fdc8d8SChris Lattner if (inst_sp) 37530fdc8d8SChris Lattner m_instructions.push_back(inst_sp); 37630fdc8d8SChris Lattner } 37730fdc8d8SChris Lattner 37830fdc8d8SChris Lattner 37930fdc8d8SChris Lattner size_t 38030fdc8d8SChris Lattner Disassembler::ParseInstructions 38130fdc8d8SChris Lattner ( 38230fdc8d8SChris Lattner const ExecutionContext *exe_ctx, 383dda4f7b5SGreg Clayton const AddressRange &range, 38430fdc8d8SChris Lattner DataExtractor& data 38530fdc8d8SChris Lattner ) 38630fdc8d8SChris Lattner { 387dda4f7b5SGreg Clayton Target *target = exe_ctx->target; 38830fdc8d8SChris Lattner 389dda4f7b5SGreg Clayton const addr_t byte_size = range.GetByteSize(); 390dda4f7b5SGreg Clayton if (target == NULL || byte_size == 0 || !range.GetBaseAddress().IsValid()) 39130fdc8d8SChris Lattner return 0; 39230fdc8d8SChris Lattner 393dda4f7b5SGreg Clayton DataBufferHeap *heap_buffer = new DataBufferHeap (byte_size, '\0'); 394dda4f7b5SGreg Clayton DataBufferSP data_sp(heap_buffer); 39530fdc8d8SChris Lattner 39630fdc8d8SChris Lattner Error error; 397dda4f7b5SGreg Clayton const size_t bytes_read = target->ReadMemory (range.GetBaseAddress(), heap_buffer->GetBytes(), heap_buffer->GetByteSize(), error); 398dda4f7b5SGreg Clayton 399dda4f7b5SGreg Clayton if (bytes_read > 0) 40030fdc8d8SChris Lattner { 401dda4f7b5SGreg Clayton if (bytes_read != heap_buffer->GetByteSize()) 402dda4f7b5SGreg Clayton heap_buffer->SetByteSize (bytes_read); 403dda4f7b5SGreg Clayton 40430fdc8d8SChris Lattner data.SetData(data_sp); 405dda4f7b5SGreg Clayton if (exe_ctx->process) 406dda4f7b5SGreg Clayton { 407dda4f7b5SGreg Clayton data.SetByteOrder(exe_ctx->process->GetByteOrder()); 408dda4f7b5SGreg Clayton data.SetAddressByteSize(exe_ctx->process->GetAddressByteSize()); 409dda4f7b5SGreg Clayton } 410dda4f7b5SGreg Clayton else 411dda4f7b5SGreg Clayton { 412dda4f7b5SGreg Clayton data.SetByteOrder(target->GetArchitecture().GetDefaultEndian()); 413dda4f7b5SGreg Clayton data.SetAddressByteSize(target->GetArchitecture().GetAddressByteSize()); 414dda4f7b5SGreg Clayton } 415dda4f7b5SGreg Clayton return DecodeInstructions (data, 0, UINT32_MAX); 41630fdc8d8SChris Lattner } 41730fdc8d8SChris Lattner 41830fdc8d8SChris Lattner return 0; 41930fdc8d8SChris Lattner } 42030fdc8d8SChris Lattner 42130fdc8d8SChris Lattner //---------------------------------------------------------------------- 42230fdc8d8SChris Lattner // Disassembler copy constructor 42330fdc8d8SChris Lattner //---------------------------------------------------------------------- 42430fdc8d8SChris Lattner Disassembler::Disassembler(const ArchSpec& arch) : 42530fdc8d8SChris Lattner m_arch (arch), 42630fdc8d8SChris Lattner m_instruction_list(), 42730fdc8d8SChris Lattner m_base_addr(LLDB_INVALID_ADDRESS) 42830fdc8d8SChris Lattner { 42930fdc8d8SChris Lattner 43030fdc8d8SChris Lattner } 43130fdc8d8SChris Lattner 43230fdc8d8SChris Lattner //---------------------------------------------------------------------- 43330fdc8d8SChris Lattner // Destructor 43430fdc8d8SChris Lattner //---------------------------------------------------------------------- 43530fdc8d8SChris Lattner Disassembler::~Disassembler() 43630fdc8d8SChris Lattner { 43730fdc8d8SChris Lattner } 43830fdc8d8SChris Lattner 43930fdc8d8SChris Lattner Disassembler::InstructionList & 44030fdc8d8SChris Lattner Disassembler::GetInstructionList () 44130fdc8d8SChris Lattner { 44230fdc8d8SChris Lattner return m_instruction_list; 44330fdc8d8SChris Lattner } 44430fdc8d8SChris Lattner 44530fdc8d8SChris Lattner const Disassembler::InstructionList & 44630fdc8d8SChris Lattner Disassembler::GetInstructionList () const 44730fdc8d8SChris Lattner { 44830fdc8d8SChris Lattner return m_instruction_list; 44930fdc8d8SChris Lattner } 450