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

Sean Callanan scallanan at apple.com
Mon Aug 6 16:42:52 PDT 2012


Author: spyffe
Date: Mon Aug  6 18:42:52 2012
New Revision: 161360

URL: http://llvm.org/viewvc/llvm-project?rev=161360&view=rev
Log:
Improved raw disassembly output for Thumb.

Modified:
    lldb/trunk/include/lldb/Core/Opcode.h
    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=161360&r1=161359&r2=161360&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/Opcode.h (original)
+++ lldb/trunk/include/lldb/Core/Opcode.h Mon Aug  6 18:42:52 2012
@@ -33,6 +33,7 @@
             eTypeInvalid,
             eType8,
             eType16,
+            eType16_2, // a 32-bit Thumb instruction, made up of two words
             eType32,
             eType64,
             eTypeBytes
@@ -86,6 +87,7 @@
             case Opcode::eTypeInvalid:  break;
             case Opcode::eType8:        return m_data.inst8;
             case Opcode::eType16:       break;
+            case Opcode::eType16_2:     break;
             case Opcode::eType32:       break;
             case Opcode::eType64:       break;
             case Opcode::eTypeBytes:    break;
@@ -102,6 +104,7 @@
             case Opcode::eTypeInvalid:  break;
             case Opcode::eType8:        return m_data.inst8;
             case Opcode::eType16:       return m_data.inst16;
+            case Opcode::eType16_2:     break;
             case Opcode::eType32:       break;
             case Opcode::eType64:       break;
             case Opcode::eTypeBytes:    break;
@@ -117,6 +120,7 @@
             case Opcode::eTypeInvalid:  break;
             case Opcode::eType8:        return m_data.inst8;
             case Opcode::eType16:       return m_data.inst16;
+            case Opcode::eType16_2:     // passthrough
             case Opcode::eType32:       return m_data.inst32;
             case Opcode::eType64:       break;
             case Opcode::eTypeBytes:    break;
@@ -132,6 +136,7 @@
             case Opcode::eTypeInvalid:  break;
             case Opcode::eType8:        return m_data.inst8;
             case Opcode::eType16:       return m_data.inst16;
+            case Opcode::eType16_2:     // passthrough
             case Opcode::eType32:       return m_data.inst32;
             case Opcode::eType64:       return m_data.inst64;
             case Opcode::eTypeBytes:    break;
@@ -152,6 +157,13 @@
             m_type = eType16;
             m_data.inst16 = inst;
         }
+        
+        void
+        SetOpcode16_2 (uint32_t inst)
+        {
+            m_type = eType16_2;
+            m_data.inst32 = inst;
+        }
 
         void
         SetOpcode32 (uint32_t inst)
@@ -203,6 +215,7 @@
             case Opcode::eTypeInvalid: break;
             case Opcode::eType8:     return sizeof(m_data.inst8);
             case Opcode::eType16:    return sizeof(m_data.inst16);
+            case Opcode::eType16_2:  // passthrough
             case Opcode::eType32:    return sizeof(m_data.inst32);
             case Opcode::eType64:    return sizeof(m_data.inst64);
             case Opcode::eTypeBytes: return m_data.inst.length;
@@ -227,6 +240,7 @@
                 case Opcode::eTypeInvalid: break;
                 case Opcode::eType8:     return &m_data.inst8;
                 case Opcode::eType16:    return &m_data.inst16;
+                case Opcode::eType16_2:  // passthrough
                 case Opcode::eType32:    return &m_data.inst32;
                 case Opcode::eType64:    return &m_data.inst64;
                 case Opcode::eTypeBytes: return m_data.inst.bytes;

Modified: lldb/trunk/source/Core/Opcode.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Opcode.cpp?rev=161360&r1=161359&r2=161360&view=diff
==============================================================================
--- lldb/trunk/source/Core/Opcode.cpp (original)
+++ lldb/trunk/source/Core/Opcode.cpp Mon Aug  6 18:42:52 2012
@@ -40,7 +40,13 @@
     case Opcode::eType16:
         bytes_written = s->Printf ("0x%4.4x", m_data.inst16); 
         break;
-
+    case Opcode::eType16_2:
+        if (GetDataByteOrder() == eByteOrderLittle)
+            bytes_written = s->Printf ("0x%4.4x%4.4x", m_data.inst32 & 0xffff, m_data.inst32 >> 16);
+        else
+            bytes_written = s->Printf ("0x%2.2x%2.2x%2.2x%2.2x", (m_data.inst32 >> 16) & 0xff, (m_data.inst32 >> 24),
+                                                                 (m_data.inst32 & 0xff), (m_data.inst32 >> 8) & 0xff); 
+        break;
     case Opcode::eType32:
         bytes_written = s->Printf ("0x%8.8x", m_data.inst32); 
         break;
@@ -76,6 +82,7 @@
         case Opcode::eTypeInvalid: break;
         case Opcode::eType8:
         case Opcode::eType16:
+        case Opcode::eType16_2:
         case Opcode::eType32:
         case Opcode::eType64:    return lldb::endian::InlHostByteOrder();
         case Opcode::eTypeBytes:
@@ -99,27 +106,8 @@
                 
             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:
-                {
-                    // The only thing that uses eAddressClassCodeAlternateISA currently
-                    // is Thumb. If this ever changes, we will need to pass in more
-                    // information like an additional "const ArchSpec &arch". For now
-                    // this will do
-                    if (address_class == eAddressClassCodeAlternateISA)
-                    {
-                        // 32 bit thumb instruction, we need to sizzle this a bit
-                        uint8_t buf[4];
-                        buf[0] = m_data.inst.bytes[2];
-                        buf[1] = m_data.inst.bytes[3];
-                        buf[2] = m_data.inst.bytes[0];
-                        buf[3] = m_data.inst.bytes[1];
-                        buffer_sp.reset (new DataBufferHeap (buf, byte_size));
-                        break;
-                    }
-                    buffer_sp.reset (new DataBufferHeap (&m_data.inst32, byte_size));
-                }
-                break;
-
+            case Opcode::eType16_2: // passthrough
+            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;

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=161360&r1=161359&r2=161360&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp (original)
+++ lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp Mon Aug  6 18:42:52 2012
@@ -130,22 +130,23 @@
             {
                 if (machine == llvm::Triple::thumb || is_altnernate_isa)
                 {
-                    uint32_t thumb_opcode = data.GetU16(&data_offset);
+                    uint16_t thumb_opcode = data.GetU16(&data_offset);
                     if ((thumb_opcode & 0xe000) != 0xe000 || ((thumb_opcode & 0x1800u) == 0))
                     {
                         m_opcode.SetOpcode16 (thumb_opcode);
+                        m_is_valid = true;
                     }
                     else
                     {
-                        thumb_opcode <<= 16;
-                        thumb_opcode |= data.GetU16(&data_offset);
-                        m_opcode.SetOpcode32 (thumb_opcode);
+                        data_offset -= 2;
+                        m_opcode.SetOpcode16_2 (data.GetU32(&data_offset));
                         m_is_valid = true;
                     }
                 }
                 else
                 {
                     m_opcode.SetOpcode32 (data.GetU32(&data_offset));
+                    m_is_valid = true;
                 }
             }
             else





More information about the lldb-commits mailing list