Author: Pavel Labath Date: 2020-03-03T13:58:56+01:00 New Revision: 1d6fa41f40da5f5a615497eac818623779c46556
URL: https://github.com/llvm/llvm-project/commit/1d6fa41f40da5f5a615497eac818623779c46556 DIFF: https://github.com/llvm/llvm-project/commit/1d6fa41f40da5f5a615497eac818623779c46556.diff LOG: [lldb] Have Disassembler::ParseInstructions take a Target& Instead of a ExecutionContext*. All it needs is the target so it can read the memory. This removes some defensive checks from the function. I've added equivalent checks to the callers in cases where a non-null target pointer was not guaranteed to be available. Added: Modified: lldb/include/lldb/Core/Disassembler.h lldb/source/Core/Disassembler.cpp lldb/source/Plugins/Architecture/Mips/ArchitectureMips.cpp lldb/source/Plugins/Architecture/Mips/ArchitectureMips.h Removed: ################################################################################ diff --git a/lldb/include/lldb/Core/Disassembler.h b/lldb/include/lldb/Core/Disassembler.h index 98f34f3e0cfa..521c8be2bbf8 100644 --- a/lldb/include/lldb/Core/Disassembler.h +++ b/lldb/include/lldb/Core/Disassembler.h @@ -446,13 +446,11 @@ class Disassembler : public std::enable_shared_from_this<Disassembler>, uint32_t num_mixed_context_lines, uint32_t options, Stream &strm); - size_t ParseInstructions(const ExecutionContext *exe_ctx, - const AddressRange &range, Stream *error_strm_ptr, - bool prefer_file_cache); + size_t ParseInstructions(Target &target, const AddressRange &range, + Stream *error_strm_ptr, bool prefer_file_cache); - size_t ParseInstructions(const ExecutionContext *exe_ctx, - const Address &range, uint32_t num_instructions, - bool prefer_file_cache); + size_t ParseInstructions(Target &target, const Address &range, + uint32_t num_instructions, bool prefer_file_cache); virtual size_t DecodeInstructions(const Address &base_addr, const DataExtractor &data, diff --git a/lldb/source/Core/Disassembler.cpp b/lldb/source/Core/Disassembler.cpp index 60247cfdd99e..268e25fb6697 100644 --- a/lldb/source/Core/Disassembler.cpp +++ b/lldb/source/Core/Disassembler.cpp @@ -193,7 +193,7 @@ lldb::DisassemblerSP Disassembler::DisassembleRange( const ArchSpec &arch, const char *plugin_name, const char *flavor, const ExecutionContext &exe_ctx, const AddressRange &range, bool prefer_file_cache) { - if (range.GetByteSize() <= 0) + if (range.GetByteSize() <= 0 || !exe_ctx.GetTargetPtr()) return {}; if (!range.GetBaseAddress().IsValid()) @@ -205,8 +205,8 @@ lldb::DisassemblerSP Disassembler::DisassembleRange( if (!disasm_sp) return {}; - const size_t bytes_disassembled = - disasm_sp->ParseInstructions(&exe_ctx, range, nullptr, prefer_file_cache); + const size_t bytes_disassembled = disasm_sp->ParseInstructions( + exe_ctx.GetTargetRef(), range, nullptr, prefer_file_cache); if (bytes_disassembled == 0) return {}; @@ -243,7 +243,7 @@ bool Disassembler::Disassemble(Debugger &debugger, const ArchSpec &arch, bool mixed_source_and_assembly, uint32_t num_mixed_context_lines, uint32_t options, Stream &strm) { - if (!disasm_range.GetByteSize()) + if (!disasm_range.GetByteSize() || !exe_ctx.GetTargetPtr()) return false; lldb::DisassemblerSP disasm_sp(Disassembler::FindPluginForTarget( @@ -257,8 +257,8 @@ bool Disassembler::Disassemble(Debugger &debugger, const ArchSpec &arch, range.GetBaseAddress()); range.SetByteSize(disasm_range.GetByteSize()); const bool prefer_file_cache = false; - size_t bytes_disassembled = - disasm_sp->ParseInstructions(&exe_ctx, range, &strm, prefer_file_cache); + size_t bytes_disassembled = disasm_sp->ParseInstructions( + exe_ctx.GetTargetRef(), range, &strm, prefer_file_cache); if (bytes_disassembled == 0) return false; @@ -275,7 +275,7 @@ bool Disassembler::Disassemble(Debugger &debugger, const ArchSpec &arch, bool mixed_source_and_assembly, uint32_t num_mixed_context_lines, uint32_t options, Stream &strm) { - if (num_instructions == 0) + if (num_instructions == 0 || !exe_ctx.GetTargetPtr()) return false; lldb::DisassemblerSP disasm_sp(Disassembler::FindPluginForTarget( @@ -288,7 +288,7 @@ bool Disassembler::Disassemble(Debugger &debugger, const ArchSpec &arch, const bool prefer_file_cache = false; size_t bytes_disassembled = disasm_sp->ParseInstructions( - &exe_ctx, addr, num_instructions, prefer_file_cache); + exe_ctx.GetTargetRef(), addr, num_instructions, prefer_file_cache); if (bytes_disassembled == 0) return false; @@ -1182,59 +1182,51 @@ InstructionList::GetIndexOfInstructionAtLoadAddress(lldb::addr_t load_addr, return GetIndexOfInstructionAtAddress(address); } -size_t Disassembler::ParseInstructions(const ExecutionContext *exe_ctx, +size_t Disassembler::ParseInstructions(Target &target, const AddressRange &range, Stream *error_strm_ptr, bool prefer_file_cache) { - if (exe_ctx) { - Target *target = exe_ctx->GetTargetPtr(); - const addr_t byte_size = range.GetByteSize(); - if (target == nullptr || byte_size == 0 || - !range.GetBaseAddress().IsValid()) - return 0; - - auto data_sp = std::make_shared<DataBufferHeap>(byte_size, '\0'); - - Status error; - lldb::addr_t load_addr = LLDB_INVALID_ADDRESS; - const size_t bytes_read = target->ReadMemory( - range.GetBaseAddress(), prefer_file_cache, data_sp->GetBytes(), - data_sp->GetByteSize(), error, &load_addr); - - if (bytes_read > 0) { - if (bytes_read != data_sp->GetByteSize()) - data_sp->SetByteSize(bytes_read); - DataExtractor data(data_sp, m_arch.GetByteOrder(), - m_arch.GetAddressByteSize()); - const bool data_from_file = load_addr == LLDB_INVALID_ADDRESS; - return DecodeInstructions(range.GetBaseAddress(), data, 0, UINT32_MAX, - false, data_from_file); - } else if (error_strm_ptr) { - const char *error_cstr = error.AsCString(); - if (error_cstr) { - error_strm_ptr->Printf("error: %s\n", error_cstr); - } - } + const addr_t byte_size = range.GetByteSize(); + if (byte_size == 0 || !range.GetBaseAddress().IsValid()) + return 0; + + auto data_sp = std::make_shared<DataBufferHeap>(byte_size, '\0'); + + Status error; + lldb::addr_t load_addr = LLDB_INVALID_ADDRESS; + const size_t bytes_read = target.ReadMemory( + range.GetBaseAddress(), prefer_file_cache, data_sp->GetBytes(), + data_sp->GetByteSize(), error, &load_addr); + + if (bytes_read > 0) { + if (bytes_read != data_sp->GetByteSize()) + data_sp->SetByteSize(bytes_read); + DataExtractor data(data_sp, m_arch.GetByteOrder(), + m_arch.GetAddressByteSize()); + const bool data_from_file = load_addr == LLDB_INVALID_ADDRESS; + return DecodeInstructions(range.GetBaseAddress(), data, 0, UINT32_MAX, + false, data_from_file); } else if (error_strm_ptr) { - error_strm_ptr->PutCString("error: invalid execution context\n"); + const char *error_cstr = error.AsCString(); + if (error_cstr) { + error_strm_ptr->Printf("error: %s\n", error_cstr); + } } return 0; } -size_t Disassembler::ParseInstructions(const ExecutionContext *exe_ctx, - const Address &start, +size_t Disassembler::ParseInstructions(Target &target, const Address &start, uint32_t num_instructions, bool prefer_file_cache) { m_instruction_list.Clear(); - if (exe_ctx == nullptr || num_instructions == 0 || !start.IsValid()) + if (num_instructions == 0 || !start.IsValid()) return 0; - Target *target = exe_ctx->GetTargetPtr(); // Calculate the max buffer size we will need in order to disassemble const addr_t byte_size = num_instructions * m_arch.GetMaximumOpcodeByteSize(); - if (target == nullptr || byte_size == 0) + if (byte_size == 0) return 0; DataBufferHeap *heap_buffer = new DataBufferHeap(byte_size, '\0'); @@ -1243,8 +1235,8 @@ size_t Disassembler::ParseInstructions(const ExecutionContext *exe_ctx, Status error; lldb::addr_t load_addr = LLDB_INVALID_ADDRESS; const size_t bytes_read = - target->ReadMemory(start, prefer_file_cache, heap_buffer->GetBytes(), - byte_size, error, &load_addr); + target.ReadMemory(start, prefer_file_cache, heap_buffer->GetBytes(), + byte_size, error, &load_addr); const bool data_from_file = load_addr == LLDB_INVALID_ADDRESS; diff --git a/lldb/source/Plugins/Architecture/Mips/ArchitectureMips.cpp b/lldb/source/Plugins/Architecture/Mips/ArchitectureMips.cpp index f426ac63e4b5..e3d1aa3b11dd 100644 --- a/lldb/source/Plugins/Architecture/Mips/ArchitectureMips.cpp +++ b/lldb/source/Plugins/Architecture/Mips/ArchitectureMips.cpp @@ -120,9 +120,7 @@ lldb::addr_t ArchitectureMips::GetBreakableLoadAddress(lldb::addr_t addr, if (current_offset == 0) return addr; - ExecutionContext ctx; - target.CalculateExecutionContext(ctx); - auto insn = GetInstructionAtAddress(ctx, current_offset, addr); + auto insn = GetInstructionAtAddress(target, current_offset, addr); if (nullptr == insn || !insn->HasDelaySlot()) return addr; @@ -138,8 +136,7 @@ lldb::addr_t ArchitectureMips::GetBreakableLoadAddress(lldb::addr_t addr, } Instruction *ArchitectureMips::GetInstructionAtAddress( - const ExecutionContext &exe_ctx, const Address &resolved_addr, - addr_t symbol_offset) const { + Target &target, const Address &resolved_addr, addr_t symbol_offset) const { auto loop_count = symbol_offset / 2; @@ -174,7 +171,7 @@ Instruction *ArchitectureMips::GetInstructionAtAddress( AddressRange range(addr, i * 2); uint32_t insn_size = 0; - disasm_sp->ParseInstructions(&exe_ctx, range, nullptr, prefer_file_cache); + disasm_sp->ParseInstructions(target, range, nullptr, prefer_file_cache); uint32_t num_insns = disasm_sp->GetInstructionList().GetSize(); if (num_insns) { diff --git a/lldb/source/Plugins/Architecture/Mips/ArchitectureMips.h b/lldb/source/Plugins/Architecture/Mips/ArchitectureMips.h index 40bcc23fd8cd..71ee60184b69 100644 --- a/lldb/source/Plugins/Architecture/Mips/ArchitectureMips.h +++ b/lldb/source/Plugins/Architecture/Mips/ArchitectureMips.h @@ -35,11 +35,10 @@ class ArchitectureMips : public Architecture { AddressClass addr_class) const override; private: - Instruction *GetInstructionAtAddress(const ExecutionContext &exe_ctx, + Instruction *GetInstructionAtAddress(Target &target, const Address &resolved_addr, lldb::addr_t symbol_offset) const; - static std::unique_ptr<Architecture> Create(const ArchSpec &arch); ArchitectureMips(const ArchSpec &arch) : m_arch(arch) {} _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits