[Lldb-commits] [lldb] 92c0cda - [lldb/Disassembler] Move address resolution into the ParseInstructions function

Pavel Labath via lldb-commits lldb-commits at lists.llvm.org
Fri Mar 6 02:23:55 PST 2020


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();
 


        


More information about the lldb-commits mailing list