[Lldb-commits] [lldb] r125418 - in /lldb/trunk/source/Plugins/Instruction/ARM: EmulateInstructionARM.cpp EmulateInstructionARM.h

Johnny Chen johnny.chen at apple.com
Fri Feb 11 16:10:51 PST 2011


Author: johnny
Date: Fri Feb 11 18:10:51 2011
New Revision: 125418

URL: http://llvm.org/viewvc/llvm-project?rev=125418&view=rev
Log:
Add EmulateBXRm() ("Branch and Exchange") to both g_arm_opcodes and g_thumb_opcodes table.

Modified:
    lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp
    lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.h

Modified: lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp?rev=125418&r1=125417&r2=125418&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp (original)
+++ lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp Fri Feb 11 18:10:51 2011
@@ -914,6 +914,8 @@
             target = pc + 4 + imm32;
             context.arg1 = 4 + imm32;  // signed offset
             context.arg2 = eModeThumb; // target instruction set
+            if (m_it_session.InITBlock() && !m_it_session.LastInITBlock())
+                return false;
             break;
             }
         case eEncodingT2:
@@ -931,6 +933,8 @@
             target = Align(pc + 4, 4) + imm32;
             context.arg1 = 4 + imm32; // signed offset
             context.arg2 = eModeARM;  // target instruction set
+            if (m_it_session.InITBlock() && !m_it_session.LastInITBlock())
+                return false;
             break;
             }
         case eEncodingA1:
@@ -990,7 +994,6 @@
         EmulateInstruction::Context context = { EmulateInstruction::eContextAbsoluteBranchRegister, 0, 0, 0};
         const uint32_t pc = ReadRegisterUnsigned(eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC, 0, &success);
         addr_t lr; // next instruction address
-        addr_t target; // target address
         if (!success)
             return false;
         uint32_t Rm; // the register with the target address
@@ -1001,7 +1004,8 @@
             // if m == 15 then UNPREDICTABLE;
             if (Rm == 15)
                 return false;
-            target = ReadRegisterUnsigned (eRegisterKindDWARF, dwarf_r0 + Rm, 0, &success);
+            if (m_it_session.InITBlock() && !m_it_session.LastInITBlock())
+                return false;
             break;
         case eEncodingA1:
             lr = pc + 4; // return address
@@ -1009,11 +1013,13 @@
             // if m == 15 then UNPREDICTABLE;
             if (Rm == 15)
                 return false;
-            target = ReadRegisterUnsigned (eRegisterKindDWARF, dwarf_r0 + Rm, 0, &success);
             break;
         default:
             return false;
         }
+        addr_t target = ReadRegisterUnsigned (eRegisterKindDWARF, dwarf_r0 + Rm, 0, &success);
+        if (!success)
+            return false;
         context.arg0 = eRegisterKindDWARF;
         context.arg1 = dwarf_r0 + Rm;
         if (!WriteRegisterUnsigned (context, eRegisterKindGeneric, LLDB_REGNUM_GENERIC_RA, lr))
@@ -1024,6 +1030,52 @@
     return true;
 }
 
+// Branch and Exchange causes a branch to an address and instruction set specified by a register.
+// BX
+bool
+EmulateInstructionARM::EmulateBXRm (ARMEncoding encoding)
+{
+#if 0
+    // ARM pseudo code...
+    if (ConditionPassed())
+    {
+        EncodingSpecificOperations();
+        BXWritePC(R[m]);
+    }
+#endif
+
+    bool success = false;
+    const uint32_t opcode = OpcodeAsUnsigned (&success);
+    if (!success)
+        return false;
+
+    if (ConditionPassed())
+    {
+        EmulateInstruction::Context context = { EmulateInstruction::eContextAbsoluteBranchRegister, 0, 0, 0};
+        uint32_t Rm; // the register with the target address
+        switch (encoding) {
+        case eEncodingT1:
+            Rm = Bits32(opcode, 6, 3);
+            if (m_it_session.InITBlock() && !m_it_session.LastInITBlock())
+                return false;
+            break;
+        case eEncodingA1:
+            Rm = Bits32(opcode, 3, 0);
+            break;
+        default:
+            return false;
+        }
+        addr_t target = ReadRegisterUnsigned (eRegisterKindDWARF, dwarf_r0 + Rm, 0, &success);
+        if (!success)
+            return false;
+        context.arg0 = eRegisterKindDWARF;
+        context.arg1 = dwarf_r0 + Rm;
+        if (!BXWritePC(context, target))
+            return false;
+    }
+    return true;
+}
+
 // Set r7 to point to some ip offset.
 // SUB (immediate)
 bool
@@ -2681,6 +2733,8 @@
         { 0xfe000000, 0xfa000000, ARMV5_ABOVE,   eEncodingA2, eSize32, &EmulateInstructionARM::EmulateBLXImmediate, "blx <label>"},
         { 0x0f000000, 0x0b000000, ARMvAll,       eEncodingA1, eSize32, &EmulateInstructionARM::EmulateBLXImmediate, "bl <label>"},
         { 0x0ffffff0, 0x012fff30, ARMV5_ABOVE,   eEncodingA1, eSize32, &EmulateInstructionARM::EmulateBLXRm, "blx <Rm>"},
+        // for example, "bx lr"
+        { 0x0ffffff0, 0x012fff10, ARMvAll,       eEncodingA1, eSize32, &EmulateInstructionARM::EmulateBXRm, "bx <Rm>"},
 
         //----------------------------------------------------------------------
         // Load instructions
@@ -2777,6 +2831,8 @@
         // J1 == J2 == 1
         { 0xf800e800, 0xf000e800, ARMV5_ABOVE,   eEncodingT2, eSize32, &EmulateInstructionARM::EmulateBLXImmediate, "blx <label>"},
         { 0xffffff87, 0x00004780, ARMV5_ABOVE,   eEncodingT1, eSize16, &EmulateInstructionARM::EmulateBLXRm, "blx <Rm>"},
+        // for example, "bx lr"
+        { 0xffffff87, 0x00004700, ARMvAll,       eEncodingA1, eSize32, &EmulateInstructionARM::EmulateBXRm, "bx <Rm>"},
         // compare and branch
         { 0xfffff500, 0x0000b100, ARMV6T2_ABOVE, eEncodingT1, eSize16, &EmulateInstructionARM::EmulateCB, "cb{n}z <Rn>, <label>"},
 

Modified: lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.h?rev=125418&r1=125417&r2=125418&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.h (original)
+++ lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.h Fri Feb 11 18:10:51 2011
@@ -244,6 +244,9 @@
     EmulateBLXRm (ARMEncoding encoding);
 
     bool
+    EmulateBXRm (ARMEncoding encoding);
+
+    bool
     EmulateSubR7IPImmediate (ARMEncoding encoding);
 
     bool





More information about the lldb-commits mailing list