Author: Pavel Labath Date: 2020-03-06T11:23:41+01:00 New Revision: 92c0cda92847053297ad1f083f13469ff7b43871
URL: https://github.com/llvm/llvm-project/commit/92c0cda92847053297ad1f083f13469ff7b43871 DIFF: https://github.com/llvm/llvm-project/commit/92c0cda92847053297ad1f083f13469ff7b43871.diff LOG: [lldb/Disassembler] Move address resolution into the ParseInstructions function The static Disassembler can be thought of as shorthands for three operations: - fetch an appropriate disassembler instance (FindPluginForTarget) - ask it to dissassemble some bytes (ParseInstructions) - ask it to dump the disassembled instructions (PrintInstructions) The only thing that's standing in the way of this interpretation is that the Disassemble function also does some address resolution before calling ParseInstructions. This patch moves this functionality into ParseInstructions so that it is available to users who call ParseInstructions directly. Added: Modified: lldb/include/lldb/Core/Disassembler.h lldb/source/Core/Disassembler.cpp Removed: ################################################################################ diff --git a/lldb/include/lldb/Core/Disassembler.h b/lldb/include/lldb/Core/Disassembler.h index 5975be096ff7..145bed31a155 100644 --- a/lldb/include/lldb/Core/Disassembler.h +++ b/lldb/include/lldb/Core/Disassembler.h @@ -428,10 +428,10 @@ class Disassembler : public std::enable_shared_from_this<Disassembler>, uint32_t num_mixed_context_lines, uint32_t options, Stream &strm); - size_t ParseInstructions(Target &target, const AddressRange &range, + size_t ParseInstructions(Target &target, AddressRange range, Stream *error_strm_ptr, bool prefer_file_cache); - size_t ParseInstructions(Target &target, const Address &range, + size_t ParseInstructions(Target &target, Address address, uint32_t num_instructions, bool prefer_file_cache); virtual size_t DecodeInstructions(const Address &base_addr, diff --git a/lldb/source/Core/Disassembler.cpp b/lldb/source/Core/Disassembler.cpp index df48469bb316..f5220288c8c1 100644 --- a/lldb/source/Core/Disassembler.cpp +++ b/lldb/source/Core/Disassembler.cpp @@ -104,9 +104,9 @@ DisassemblerSP Disassembler::FindPluginForTarget(const Target &target, return FindPlugin(arch, flavor, plugin_name); } -static void ResolveAddress(Target &target, const Address &addr, - Address &resolved_addr) { +static Address ResolveAddress(Target &target, const Address &addr) { if (!addr.IsSectionOffset()) { + Address resolved_addr; // If we weren't passed in a section offset address range, try and resolve // it to something bool is_resolved = target.GetSectionLoadList().IsEmpty() @@ -117,9 +117,9 @@ static void ResolveAddress(Target &target, const Address &addr, // We weren't able to resolve the address, just treat it as a raw address if (is_resolved && resolved_addr.IsValid()) - return; + return resolved_addr; } - resolved_addr = addr; + return addr; } lldb::DisassemblerSP Disassembler::DisassembleRange( @@ -170,12 +170,12 @@ Disassembler::DisassembleBytes(const ArchSpec &arch, const char *plugin_name, bool Disassembler::Disassemble(Debugger &debugger, const ArchSpec &arch, const char *plugin_name, const char *flavor, const ExecutionContext &exe_ctx, - const AddressRange &disasm_range, + const AddressRange &range, uint32_t num_instructions, bool mixed_source_and_assembly, uint32_t num_mixed_context_lines, uint32_t options, Stream &strm) { - if (!disasm_range.GetByteSize() || !exe_ctx.GetTargetPtr()) + if (!range.GetByteSize() || !exe_ctx.GetTargetPtr()) return false; lldb::DisassemblerSP disasm_sp(Disassembler::FindPluginForTarget( @@ -184,10 +184,6 @@ bool Disassembler::Disassemble(Debugger &debugger, const ArchSpec &arch, if (!disasm_sp) return false; - AddressRange range; - ResolveAddress(exe_ctx.GetTargetRef(), disasm_range.GetBaseAddress(), - range.GetBaseAddress()); - range.SetByteSize(disasm_range.GetByteSize()); const bool prefer_file_cache = false; size_t bytes_disassembled = disasm_sp->ParseInstructions( exe_ctx.GetTargetRef(), range, &strm, prefer_file_cache); @@ -200,14 +196,11 @@ bool Disassembler::Disassemble(Debugger &debugger, const ArchSpec &arch, return true; } -bool Disassembler::Disassemble(Debugger &debugger, const ArchSpec &arch, - const char *plugin_name, const char *flavor, - const ExecutionContext &exe_ctx, - const Address &start_address, - uint32_t num_instructions, - bool mixed_source_and_assembly, - uint32_t num_mixed_context_lines, - uint32_t options, Stream &strm) { +bool Disassembler::Disassemble( + Debugger &debugger, const ArchSpec &arch, const char *plugin_name, + const char *flavor, const ExecutionContext &exe_ctx, const Address &address, + uint32_t num_instructions, bool mixed_source_and_assembly, + uint32_t num_mixed_context_lines, uint32_t options, Stream &strm) { if (num_instructions == 0 || !exe_ctx.GetTargetPtr()) return false; @@ -216,12 +209,9 @@ bool Disassembler::Disassemble(Debugger &debugger, const ArchSpec &arch, if (!disasm_sp) return false; - Address addr; - ResolveAddress(exe_ctx.GetTargetRef(), start_address, addr); - const bool prefer_file_cache = false; size_t bytes_disassembled = disasm_sp->ParseInstructions( - exe_ctx.GetTargetRef(), addr, num_instructions, prefer_file_cache); + exe_ctx.GetTargetRef(), address, num_instructions, prefer_file_cache); if (bytes_disassembled == 0) return false; @@ -1111,14 +1101,15 @@ InstructionList::GetIndexOfInstructionAtLoadAddress(lldb::addr_t load_addr, return GetIndexOfInstructionAtAddress(address); } -size_t Disassembler::ParseInstructions(Target &target, - const AddressRange &range, +size_t Disassembler::ParseInstructions(Target &target, AddressRange range, Stream *error_strm_ptr, bool prefer_file_cache) { const addr_t byte_size = range.GetByteSize(); if (byte_size == 0 || !range.GetBaseAddress().IsValid()) return 0; + range.GetBaseAddress() = ResolveAddress(target, range.GetBaseAddress()); + auto data_sp = std::make_shared<DataBufferHeap>(byte_size, '\0'); Status error; @@ -1144,7 +1135,7 @@ size_t Disassembler::ParseInstructions(Target &target, return 0; } -size_t Disassembler::ParseInstructions(Target &target, const Address &start, +size_t Disassembler::ParseInstructions(Target &target, Address start, uint32_t num_instructions, bool prefer_file_cache) { m_instruction_list.Clear(); @@ -1152,6 +1143,8 @@ size_t Disassembler::ParseInstructions(Target &target, const Address &start, if (num_instructions == 0 || !start.IsValid()) return 0; + start = ResolveAddress(target, start); + // Calculate the max buffer size we will need in order to disassemble const addr_t byte_size = num_instructions * m_arch.GetMaximumOpcodeByteSize(); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits