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