[Lldb-commits] [lldb] r154535 - in /lldb/trunk: include/lldb/Core/Opcode.h source/API/SBInstruction.cpp source/Core/Opcode.cpp source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp

Greg Clayton gclayton at apple.com
Wed Apr 11 14:13:31 PDT 2012


Author: gclayton
Date: Wed Apr 11 16:13:31 2012
New Revision: 154535

URL: http://llvm.org/viewvc/llvm-project?rev=154535&view=rev
Log:
Cleaned up code that was getting SBData for an SBInstruction.


Modified:
    lldb/trunk/include/lldb/Core/Opcode.h
    lldb/trunk/source/API/SBInstruction.cpp
    lldb/trunk/source/Core/Opcode.cpp
    lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp

Modified: lldb/trunk/include/lldb/Core/Opcode.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/Opcode.h?rev=154535&r1=154534&r2=154535&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/Opcode.h (original)
+++ lldb/trunk/include/lldb/Core/Opcode.h Wed Apr 11 16:13:31 2012
@@ -204,6 +204,9 @@
             }
             return 0;
         }
+        
+        uint32_t
+        GetData (DataExtractor &data) const;
 
 
     protected:

Modified: lldb/trunk/source/API/SBInstruction.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBInstruction.cpp?rev=154535&r1=154534&r2=154535&view=diff
==============================================================================
--- lldb/trunk/source/API/SBInstruction.cpp (original)
+++ lldb/trunk/source/API/SBInstruction.cpp Wed Apr 11 16:13:31 2012
@@ -139,19 +139,9 @@
     lldb::SBData sb_data;
     if (m_opaque_sp)
     {
-        const Opcode &opcode = m_opaque_sp->GetOpcode();
-        const void *opcode_data = opcode.GetOpcodeBytes();
-        const uint32_t opcode_data_size = opcode.GetByteSize();
-        if (opcode_data && opcode_data_size > 0)
+        DataExtractorSP data_extractor_sp (new DataExtractor());
+        if (m_opaque_sp->GetOpcode().GetData (*data_extractor_sp))
         {
-            ByteOrder data_byte_order = opcode.GetDataByteOrder();
-            TargetSP target_sp (target.GetSP());
-            if (data_byte_order == eByteOrderInvalid && target_sp)
-                data_byte_order = target_sp->GetArchitecture().GetByteOrder();
-            DataBufferSP data_buffer_sp (new DataBufferHeap (opcode_data, opcode_data_size));
-            DataExtractorSP data_extractor_sp (new DataExtractor (data_buffer_sp, 
-                                                                  data_byte_order,
-                                                                  target_sp ? target_sp->GetArchitecture().GetAddressByteSize() : sizeof(void*)));
             sb_data.SetOpaque (data_extractor_sp);
         }
     }

Modified: lldb/trunk/source/Core/Opcode.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Opcode.cpp?rev=154535&r1=154534&r2=154535&view=diff
==============================================================================
--- lldb/trunk/source/Core/Opcode.cpp (original)
+++ lldb/trunk/source/Core/Opcode.cpp Wed Apr 11 16:13:31 2012
@@ -13,6 +13,8 @@
 // C++ Includes
 // Other libraries and framework includes
 // Project includes
+#include "lldb/Core/DataBufferHeap.h"
+#include "lldb/Core/DataExtractor.h"
 #include "lldb/Core/Stream.h"
 #include "lldb/Host/Endian.h"
 
@@ -79,3 +81,36 @@
     return eByteOrderInvalid;
 }
 
+uint32_t
+Opcode::GetData (DataExtractor &data) const
+{
+    uint32_t byte_size = GetByteSize ();
+    DataBufferSP buffer_sp;
+    if (byte_size > 0)
+    {
+        switch (m_type)
+        {
+            case Opcode::eTypeInvalid:
+                break;
+                
+            case Opcode::eType8:    buffer_sp.reset (new DataBufferHeap (&m_data.inst8,  byte_size)); break;
+            case Opcode::eType16:   buffer_sp.reset (new DataBufferHeap (&m_data.inst16, byte_size)); break;
+            case Opcode::eType32:   buffer_sp.reset (new DataBufferHeap (&m_data.inst32, byte_size)); break;
+            case Opcode::eType64:   buffer_sp.reset (new DataBufferHeap (&m_data.inst64, byte_size)); break;
+            case Opcode::eTypeBytes:buffer_sp.reset (new DataBufferHeap (GetOpcodeBytes(), byte_size)); break;
+                break;
+        }
+    }
+    
+    if (buffer_sp)
+    {
+        data.SetByteOrder(GetDataByteOrder());
+        data.SetData (buffer_sp);
+        return byte_size;
+    }
+    data.Clear();
+    return 0;
+}
+
+
+

Modified: lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp?rev=154535&r1=154534&r2=154535&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp (original)
+++ lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp Wed Apr 11 16:13:31 2012
@@ -207,49 +207,64 @@
                          uint32_t offset,
                          size_t inst_size)
     {
-        llvm::Triple::ArchType arch = m_disasm.GetArchitecture().GetMachine();
+        const ArchSpec &arch = m_disasm.GetArchitecture();
+        llvm::Triple::ArchType machine = arch.GetMachine();
         
-        switch (arch)
+        switch (machine)
         {
-        default:
         case llvm::Triple::x86:
         case llvm::Triple::x86_64:
             m_opcode.SetOpcodeBytes(extractor.PeekData(offset, inst_size), inst_size);
-            break;
+            return;
+
         case llvm::Triple::arm:
         case llvm::Triple::thumb:
             switch (inst_size)
             {
                 case 2:
-                    {
-                        m_opcode.SetOpcode16 (extractor.GetU16 (&offset)); 
-                        break;
-                    }
+                    m_opcode.SetOpcode16 (extractor.GetU16 (&offset));
                     break;
                 case 4:
+                    if (machine == llvm::Triple::arm && m_address_class == eAddressClassCodeAlternateISA)
+                    {
+                        // If it is a 32-bit THUMB instruction, we need to swap the upper & lower halves.
+                        uint32_t orig_bytes = extractor.GetU32 (&offset);
+                        uint16_t upper_bits = (orig_bytes >> 16) & ((1u << 16) - 1);
+                        uint16_t lower_bits = orig_bytes & ((1u << 16) - 1);
+                        uint32_t swapped = (lower_bits << 16) | upper_bits;
+                        m_opcode.SetOpcode32 (swapped);
+                    }
+                    else
                     {
-                        if (arch == llvm::Triple::arm && 
-                            m_address_class == eAddressClassCodeAlternateISA)
-                        {
-                            // If it is a 32-bit THUMB instruction, we need to swap the upper & lower halves.
-                            uint32_t orig_bytes = extractor.GetU32 (&offset);
-                            uint16_t upper_bits = (orig_bytes >> 16) & ((1u << 16) - 1);
-                            uint16_t lower_bits = orig_bytes & ((1u << 16) - 1);
-                            uint32_t swapped = (lower_bits << 16) | upper_bits;
-                            m_opcode.SetOpcode32 (swapped);
-                        }
-                        else
-                        {
-                            m_opcode.SetOpcode32 (extractor.GetU32 (&offset));
-                        }
+                        m_opcode.SetOpcode32 (extractor.GetU32 (&offset));
                     }
                     break;
                 default:
                     assert (!"Invalid ARM opcode size");
                     break;
             }
+            return;
+
+        default:
             break;
         }
+        // Handle the default cases here.
+        const uint32_t min_op_byte_size = arch.GetMinimumOpcodeByteSize();
+        const uint32_t max_op_byte_size = arch.GetMaximumOpcodeByteSize();
+        if (min_op_byte_size == max_op_byte_size)
+        {
+            assert (inst_size == min_op_byte_size);
+            switch (inst_size)
+            {
+                case 1: m_opcode.SetOpcode8  (extractor.GetU8  (&offset)); return;
+                case 2: m_opcode.SetOpcode16 (extractor.GetU16 (&offset)); return;
+                case 4: m_opcode.SetOpcode32 (extractor.GetU32 (&offset)); return;
+                case 8: m_opcode.SetOpcode64 (extractor.GetU64 (&offset)); return;
+                default:
+                    break;
+            }
+        }
+        m_opcode.SetOpcodeBytes(extractor.PeekData(offset, inst_size), inst_size);
     }
     
     bool StringRepresentsBranch (const char *data, size_t size)





More information about the lldb-commits mailing list